[
  {
    "path": "CLAUDE.md",
    "content": "# CLAUDE.md — svaba working notes\n\nThis file captures conventions, file landmarks, and open investigations for the\nsvaba SV/indel caller project so future sessions can pick up quickly. Update it\nas understanding changes — it's the crash-safety net, not the README.\n\n## Project at a glance\n\nsvaba is a structural variant (SV) and indel caller that uses local assembly +\nread realignment to call variants from short-read BAMs. The canonical use case\nis tumor/normal somatic calling, but it also supports germline and multi-sample\nmodes.\n\nTop-level layout:\n\n- `src/svaba/` — main C++ sources. Entry point is `run_svaba.cpp`; assembly,\n  realignment, breakpoint scoring, VCF output, and postprocess all live here.\n  File-naming convention is **PascalCase** — e.g. `SvabaOptions.cpp`,\n  `SvabaOutputWriter.h`. A few intentional exceptions: `refilter.cpp/h`,\n  `run_svaba.cpp`, `svaba.cpp`, `threadpool.h`, `tovcf.cpp`, `vcf.cpp/h`.\n- `src/SGA/` — String Graph Assembler sources (vendored).\n- `SeqLib/` — vendored htslib/bwa/fermi-lite wrapper used for BAM I/O,\n  alignment, and assembly primitives. See \"Build system\" for how its flags\n  get set.\n- `bin/`, `build/` — build artifacts; don't edit by hand.\n- `R/`, `viewer/`, `tracks/` — downstream analysis/visualization helpers.\n- `tests/`, `example_data/` — test fixtures.\n- `scripts/` — post-processing and utility shell helpers, all kept here\n  (not at the repo root): `svaba_postprocess.sh`, `combine_blacklists.sh`,\n  `extract_discordants.sh`, `filter_contig_supporting_reads.sh`,\n  `r2c_for_contig.sh`, `sort_bps.sh`, `svaba_cloud.sh`. Profiling\n  helpers (`memprof*.sh`) live under `opt/` (the user's ad-hoc tooling\n  dir).\n- `somlod_maxlod_analysis.html` — deep-dive writeup of the somatic log-odds\n  scoring model. See \"Statistical model\" below.\n\nScripts that used to live here and are gone, in case you're looking for them:\n`sort_output.sh` and `sort_and_deduplicate_bps.sh` were subsumed into the\nunified `svaba_postprocess.sh`.\n\n## Build system\n\n`cmake -B build && cmake --build build` defaults to `CMAKE_BUILD_TYPE =\nRelWithDebInfo`, which gives you **`-O2 -g -DNDEBUG -fno-omit-frame-pointer`**\nfor the svaba/SeqLib/SGA C++ code. Not O0, not O3.\n\nCritical gotcha: **the `-O2` is hardcoded across all of the vendored\nsubmodules**, and CMake's build-type doesn't reach them:\n\n- `SeqLib/bwa/Makefile`: `CFLAGS = -g -Wall -Wno-unused-function -O2`\n  (hardcoded; doesn't read the parent CMake). Makes `libbwa.a`, owner of ~38%\n  of wall-time in real runs.\n- `SeqLib/fermi-lite/Makefile`: `CFLAGS = -g -Wall -O2 -Wno-unused-function`\n  (same story). Makes `libfml.a`, ~27% of wall-time.\n- `SeqLib/CMakeLists.txt:10` does `set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -O2\")`\n  — appends `-O2` to whatever you passed, and because later `-O` wins on\n  gcc/clang, this silently defeats any top-level attempt to set `-O3` via\n  `CMAKE_CXX_FLAGS` unless you pass it via `CMAKE_CXX_FLAGS_<CONFIG>` (which\n  is appended after, and therefore wins).\n- htslib is external; whoever built yours picked its flags.\n\nTo push the submodules to `-O3 -mcpu=native` (the single biggest free-perf\nknob on Apple Silicon — 65% of compute is at -O2 generic right now):\n\n```bash\nmake -C SeqLib/bwa        clean\nmake -C SeqLib/fermi-lite clean\nmake -C SeqLib/bwa        -j CFLAGS=\"-g -O3 -mcpu=native -fno-omit-frame-pointer -Wall -Wno-unused-function\"\nmake -C SeqLib/fermi-lite -j CFLAGS=\"-g -O3 -mcpu=native -fno-omit-frame-pointer -Wall -Wno-unused-function\"\ncd build && make -j\n```\n\nSanity-check: `make VERBOSE=1 2>&1 | grep -oE -- \"-O[0-9sg]\" | sort | uniq -c`.\n\n## Statistical model — the files that matter\n\nFor anything related to how variants are scored (LOD, somatic vs germline,\nerror model), the two files to read first are:\n\n- `src/svaba/SvabaModels.cpp` / `.h` — self-contained statistical primitives.\n  - `LogLikelihood(d, a, f, e_fwd, e_rev)` (~lines 11-63) is the per-sample\n    two-state error model: `p_ref = (1-f)(1-e_fwd) + f*e_rev` and\n    `p_alt = f(1-e_rev) + (1-f)*e_fwd`. Returns log10 likelihood of observing\n    `a` alt reads out of `d`. This is the primitive every higher-level score\n    is built from.\n  - `SomaticLOD(...)` (~lines 70-83) — public wrapper; forwards to the\n    split-error implementation.\n  - `SomaticLOD_withSplitErrors(...)` (~lines 86-189) — the active somatic\n    model. Enumerates sub-hypotheses: `SOM_true`, `SOM_art`, `GERM_het`,\n    `GERM_hom`, `GERM_art`, `GERM_shared`. Returns\n    `log10( P(somatic) / P(any non-somatic) )`.\n  - Line ~79: `const double eN_fwd = std::min(e_art_fwd, 0.005);` — hard cap\n    on the normal-sample forward error rate. This cap is important: it means\n    even in regions where the artifact model infers a high error rate, the\n    normal sample is assumed to be clean. That's the knob you'd relax if you\n    want somlod to be \"artifact-aware\" on the normal side.\n  - Lines ~138-147: `GERM_shared` free-MLE branch. This is the sub-hypothesis\n    that fits a single pooled allele fraction across tumor+normal. It exists\n    to catch LOH (loss of heterozygosity) germline events where tumor VAF can\n    be much higher than 0.5 while normal is still ~0.5. It is also the main\n    reason `somlod` asymptotes slowly as tumor alt-support grows (see below).\n\n- `src/svaba/BreakPoint.cpp` / `.h` — per-breakpoint scoring glue. Points of\n  interest:\n  - `BreakPoint::score_somatic()` at ~line 975 is the entry point that sets\n    `LO_s` (the somatic LOD). Calls\n    `SvabaModels::SomaticLOD(scaled_alt_n, a_cov_n, scaled_alt_t, a_cov_t, error_fwd, error_rev)`\n    around lines 1028-1031.\n  - `SampleInfo::modelSelection()` (~lines 1562-1674) computes the per-sample\n    `LO = ll_alt - ll_err` at line ~1610. These are unnormalized log10\n    likelihoods — absolute value is not meaningful, the difference is.\n  - `max_lod` is computed at lines ~198-200 and ~1196-1198 as the max of\n    `al.LO` across samples. This is the \"is this artifact or not\" score; it\n    does grow with additional supporting reads because it compares a variant\n    hypothesis to a pure-error hypothesis with no germline branch.\n  - Lines ~1072-1073: the current INDEL somatic gate only tests `somlod` —\n    it does not use `maxlod` as a co-gate. This is one of the levers in the\n    proposed fixes.\n\n## The somlod / maxlod investigation (still open)\n\n**Problem statement.** Users observe that `maxlod` grows with tumor alt\nsupport, but `somlod` barely moves once tumor alt-support gets high. For a\nclean normal (`aN=0` or `aN=1`) you'd naively expect `somlod` to also keep\nclimbing as tumor evidence accumulates, but it asymptotes around ~9 for\n`dN ≈ 30`.\n\n**Diagnosis.**\n- There is a real statistical ceiling on somlod roughly equal to\n  `dN · log10(1/(1-fT_hat))`. With 30 normal reads you can only ever rule out\n  a shared germline hypothesis so hard — it's a finite amount of evidence.\n- The `GERM_shared` free-MLE branch makes `somlod` *approach* that ceiling\n  slowly at sub-clonal tumor VAFs: when the MLE of a pooled AF lands in a\n  germline-plausible band, it provides a strong non-somatic explanation that\n  the somatic hypothesis has to beat.\n- You cannot simply delete `GERM_shared` because doing so makes LOH germline\n  cases (e.g. `aN=15/dN=30, aT=285/dT=300`) return `somlod ≈ +36`, a false\n  positive. Verified numerically while writing the analysis.\n- The `eN_fwd ≤ 0.005` cap means that in truly high-artifact regions, the\n  model refuses to \"forgive\" 2-3 alt reads in the normal as artifacts, which\n  is both good (prevents somatic false positives where normal is contaminated\n  by real signal) and limiting (prevents somatic calls where the artifact\n  model really does explain the normal reads).\n\n**Proposed fixes (see `somlod_maxlod_analysis.html` for the full writeup).**\n- Fix 1 — disjunction gate on `GERM_shared`: only let the free-MLE pooled\n  branch influence somlod when `shared_is_germline_plausible || normal_evidence > 1.0`,\n  where `normal_evidence = LL_N(dN, aN, f_n_mle) - LL_N(dN, aN, 0)`. This is\n  error-rate aware and is the fix I'd land first.\n- Fix 2 — loosen `eN_fwd` cap in known high-artifact regions.\n- Fix 3 — BIC penalty on the free-MLE branch (1 free parameter costs\n  ~`0.5 log10(dN+dT)` nats ≈ bits of evidence).\n- Fix 4 — joint `maxlod` + `somlod` gate for INDELs (require both above\n  threshold), since `maxlod` moves freely with tumor depth.\n- Fix 5 — debug dump of sub-hypothesis LLs when `somlod` is within some\n  epsilon of the gate, to make future failures diagnosable.\n\n**Related fix landed already (SvABA2.0 v3 split-coverage gate):** the\nold `both_split && homlen > 0` / `one_split && homlen == 0` branching\nin `BreakPoint::splitCoverage` was removed. A read is now credited as\na split-supporter iff (a) its r2c alignment scores strictly higher\nthan its native alignment (`r2c_score > native_score`, no percentage\nmargin — see `src/svaba/SvabaOptions.h`), and (b) it spans at least\none breakend on the contig. Long junction homology → r2c and native\ntie → read doesn't credit either sample, which is the correct\nconservative behavior (rather than the old \"homology=0 one_split is\nfine, homology>0 you need both_split\" which nuked normal support\nspecifically when homology was long, biasing toward somatic calls).\nThe repeat_seq-length padding on the buffers is also gone — same\nrationale, subsumed by the comparative score gate. See the user-\nfacing bp-id (v3 schema) work for how to trace a specific read's\ncurrent support attribution end-to-end.\n\n**v3.1 fix — remove T_R2C_MIN_MARGIN (set to 0):**\nthe 10% `T_R2C_MIN_MARGIN` was killing all tumor alt-supporting reads\nfor small indels. A 1bp deletion on a 150bp read gives r2c=150 vs\nnative=143, a 4.9% improvement — mathematically impossible to clear\nthe 10% threshold. Traced via the `SVABA_TRACE_CONTIG` system on\ncontig `c_fermi_chr2_215869501_215894501_13C` (CIGAR `392M1D530M`):\nevery tumor read hit TP8 with r2c=150 vs threshold=157.3 → SKIP →\n0 split support → LOWLOD → hasMinimal fail → variant dropped.\n\nFix: set `T_R2C_MIN_MARGIN` to 0.0 in `SvabaOptions.h` — same as\nnormal, strict greater-than only. Any percentage margin is inherently\nread-length-dependent: a 1bp del gives 4.9% improvement on 150bp\nreads but only 2.9% on 250bp reads, so any fixed percentage either\nblocks long reads or is too loose for short reads. There's no\npercentage that works across all read lengths.\n\nThe margin was belt-and-suspenders on top of the LOD model. In the\njunction-homology case it was designed for: if both tumor and normal\ncredit borderline reads equally (r2c barely > native by 1-2 points),\nthe downstream LOD model sees similar split support in both samples →\nlow somlod → correctly not called somatic. Normal already used\nmargin=0, so the asymmetry was the only thing preventing normal from\ncrediting those reads — and it wasn't, because N_R2C_MIN_MARGIN was\nalways 0. The somatic/germline distinction is the LOD model's job.\n\n**Important correctness notes (earned the hard way):**\n- Don't propose `aN >= 2` style hard count gates without an error-rate\n  adjustment. In a high-artifact region, 2-3 normal alt reads can be\n  genuine artifacts, and gating on raw counts overcalls the case away. Always\n  reason about `normal_evidence` (LL delta against `f=0`) instead of raw `aN`.\n- A LL ratio reported by `LogLikelihood` is log10. Multiplying by ~3.32 gives\n  bits. Per-read surprise is `(LL_alt - LL_ref) / d`. Absolute LL values have\n  no meaning — always compare two hypotheses at the same data.\n- The ~9 ceiling at `dN=30` is a real statistical bound; no reformulation of\n  the somatic test can push above it. `GERM_shared` changes the *slope* of\n  approach, not the asymptote.\n\n## Postprocess pipeline\n\nEverything post-`svaba run` is orchestrated by `scripts/svaba_postprocess.sh`.\nIt's the unified replacement for the old `sort_output.sh` +\n`sort_and_deduplicate_bps.sh` pair, which no longer exist.\n\nFive steps per invocation, all idempotent (missing inputs log a one-liner and\ncontinue):\n\n1. **Merge per-thread BAMs** — `${ID}.thread*.${suffix}.bam` → `${ID}.${suffix}.bam`\n   for `discordant` / `weird` / `corrected`. Single-file inputs are moved;\n   no-file inputs silently skipped.\n2. **`svaba postprocess`** — the C++ subcommand in `src/svaba/SvabaPostprocess.cpp`.\n   For each suffix (`weird`, `corrected`, `discordant`, `contigs`):\n   - `samtools sort -@ per_job_threads -m MEM` (shell out — htslib doesn't\n     expose its sort as a library call). **Auto-skipped** when the BAM\n     already declares `@HD SO:coordinate` — `isCoordinateSorted()`\n     inspects the header via `readHeaderOnly()` and logs\n     \"already coordinate-sorted; skipping sort\" so reruns are a no-op.\n   - Native streaming dedup (only for `weird`/`corrected`/`discordant`):\n     reads BAM via SeqLib::BamReader, collapses exact (qname, flag)\n     duplicates at each locus, and **unions their `bi:Z` / `bz:Z` comma-token\n     lists** so alt-supporting-contig evidence isn't lost when the same read\n     got emitted by two overlapping assembly windows. Key function:\n     `mergeCommaTokens` — boundary-aware union, mirrors\n     `SvabaOutputWriter::stamp_tag`.\n     Both the reader and writer have the htslib BGZF thread pool enabled\n     via a new `SeqLib::BamReader::SetThreads(int)` /\n     `SeqLib::BamWriter::SetThreads(int)` API that calls\n     `hts_set_threads(fp, n)`. `streamDedup` accepts a `threads` parameter\n     (wired from the full postprocess budget, not the per-suffix slice —\n     see two-phase note below) and applies it on both sides.\n     Without this pool, BGZF decompress + compress is single-threaded\n     and dominates wall time (40 GB BAM → ~2 hours). With `-t 4..8`\n     this typically drops to 25–40 min, a 3–5× speedup.\n\n     **Buckets-clear gotcha** (landed alongside the thread-pool fix):\n     the per-locus `idx_by_key` is a `std::unordered_map<std::string,\n     size_t>`. `unordered_map::clear()` is **O(bucket_count)** — it\n     memsets the entire bucket array even when size is 0, and\n     `bucket_count` only grows, never shrinks. One pileup locus\n     (centromere / simple repeat / HLA) inflates buckets to 100k+\n     for the rest of the BAM, and every subsequent locus transition\n     (hundreds of millions of them) pays that memset. Pre-fix perf\n     showed 95% of main-thread CPU going to\n     `__memset_evex_unaligned_erms` called from `unordered_map::clear`.\n     `flushLocus` now swaps with a fresh small map when\n     `bucket_count() > 256`, paying the inflated-map destructor cost\n     ONCE per pileup exit rather than once per locus. Lesson: never\n     trust `unordered_map::clear()` in a transient reuse pattern where\n     the map briefly inflates.\n\n     **Two-phase driver.** `svaba postprocess` runs in two phases so the\n     thread budget lands where it actually helps:\n\n       Phase 1 (PARALLEL): samtools sort across all active suffixes\n         concurrently, each worker with `o.threads / n_active` threads.\n         Sort is disk+CPU bound and scales linearly across files.\n       Phase 2 (SERIAL): dedup + reheader + index, one BAM at a time,\n         each with the full `o.threads` as its BGZF pool. Serial here\n         is deliberate — running dedup in parallel across suffixes\n         would oversubscribe (each BAM needs its own read+write BGZF\n         pool), and BGZF parallelism has diminishing returns so\n         `4 workers × 2 threads` is worse wall-clock than\n         `1 worker × 8 threads` iterated four times.\n\n     **Idempotency.** Every phase has its own auto-skip so rerunning\n     the pipeline on an already-finished BAM is essentially instant:\n\n     - Phase 1 sort: `isCoordinateSorted()` inspects `@HD SO:coordinate`\n       and bypasses the sort when already done.\n     - Phase 2 dedup: `hasSvabaPostprocessPg()` scans the @PG chain for\n       any `svaba_postprocess` (or uniquified `.1`, `.2` variants); if\n       present, dedup AND the subsequent reheader step are both skipped\n       (only the `.bai` is rebuilt, which is cheap and covers the\n       missing-index case). The first successful `streamDedup` stamps\n       the PG line, so a second `svaba_postprocess.sh` run on the same\n       outputs no-ops almost entirely.\n     - The shell-layer merge step (`scripts/svaba_postprocess.sh` step 1)\n       is already a no-op when per-thread `.thread*.bam` files aren't\n       present (nothing to merge), so all three steps compose naturally.\n   - **@PG stamp**: writes an `@PG ID:svaba_postprocess PN:svaba VN:<ver> CL:<argv> PP:<prev chain tail>`\n     line into the output header. For dedup-eligible suffixes this is free\n     (done in the writer during dedup); for `contigs` (no dedup) it's done\n     via `samtools reheader`. ID is auto-uniquified if `svaba postprocess`\n     has been run before on the same BAM.\n   - **BAI index** via `sam_index_build(fn, 0)` directly from htslib — one\n     less subprocess.\n   - Intermediate filenames use a `.postprocess.*.tmp.bam` suffix and are\n     renamed over on success / unlinked on failure. End state per suffix is\n     exactly `${ID}.${suffix}.bam(.bai)`; no `.sorted` / `.deduped` flotsam.\n3. **Sort + dedup + PASS-filter `bps.txt.gz`** — external-memory sort via\n   GNU sort (`gsort` on macOS from homebrew coreutils). Sort keys:\n   `chr1(V), pos1(n), strand1, chr2(V), pos2(n), strand2, maxlod(gr)` —\n   maxlod descending so the \"best SV per junction\" survives the dedup.\n   Produces three files: `.bps.sorted.txt.gz`, `.bps.sorted.dedup.txt.gz`\n   (one row per unique breakpoint pair), `.bps.sorted.dedup.pass.txt.gz`\n   (col 32 == \"PASS\" only).\n   - Column positions hard-coded: `col 30 = cname (contig_and_region)`,\n     `col 32 = confidence`, `col 38 = maxlod`. These come from\n     `BreakPoint::toFileString` — change there and the script breaks.\n4. **Filter `r2c.txt.gz` to PASS contigs (+ PASS-somatic subset)** —\n   resolves PASS cnames from `bps.txt.gz` (col 32 == \"PASS\") and the\n   PASS-somatic subset (also col 37, `somlod`, >= 1) in one pass. Then\n   one pass over `r2c.txt.gz` writes two outputs via awk pipe-to-command\n   (gzip compressors run in parallel as child processes):\n     - `${ID}.r2c.pass.txt.gz`           (all PASS)\n     - `${ID}.r2c.pass.somatic.txt.gz`   (PASS ∩ somlod >= 1)\n   Both are cname-keyed; contig and read rows survive together since\n   they share col 2. Either is suitable for `bps_explorer.html`'s\n   alignments sub-panel; the somatic subset is the lighter load when\n   you only care about the tumor-specific calls.\n5. **Optional split-by-source** — `--split-by-source` (or env\n   `SPLIT_BY_SOURCE=1`) demuxes the deduped BAMs by the first 4 chars of\n   each QNAME into `${ID}.${suffix}.${prefix}.bam`.\n\nCLI: `scripts/svaba_postprocess.sh -t THREADS -m MEM [other flags] <ID>`. Flags:\n`-t/--threads`, `-m/--mem`, `--sort-buffer`, `--split-by-source`,\n`--input-dir`, `--output-dir`, `--svaba`, `--keep-tmp`, `--skip-bam`,\n`--skip-dedup`, `--skip-bps`, `--skip-r2c`, `--skip-split`, `-h/--help`.\n`--skip-dedup` maps to `--sort-only` on the C++ CLI: keeps sort + @PG +\nindex but skips the dedup pass. Combined with the C++'s auto-skip of\nsort when the BAM header already declares `@HD SO:coordinate`\n(`isCoordinateSorted()` in `SvabaPostprocess.cpp`), a rerun on\nalready-postprocessed files is effectively instant — useful for\nrefreshing just the index or PG stamp. Env fallbacks for\nbackward compat: `THREADS`, `MEM`, `BUFFER_SIZE`, `SVABA`, `SAM`,\n`INPUT_DIR`, `OUTPUT_DIR`, `SPLIT_BY_SOURCE`, `KEEP_TMP`.\n\nGotcha: `zcat` on macOS is BSD zcat (looks for `.Z`), not GNU. This script\nuses `gzip -dc` everywhere for portability — if you add a new decompression\nstep, do the same or it'll fail on Mac.\n\n## `svaba tovcf` subcommand\n\nStandalone converter: pre-deduplicated `bps.txt.gz` → two VCFv4.5 files\n(`${id}.sv.vcf.gz` + `${id}.indel.vcf.gz`). Lives in `src/svaba/tovcf.cpp`;\ndispatch wired into `src/svaba/svaba.cpp`. Runs the VCFFile parser with\n`skip_dedup=true` because the postprocess pipeline has already sorted\nand deduplicated the bps.txt.gz upstream — the internal interval-tree\ndedup would just be wasted work and can spuriously dup things via its\nSV-pileup blacklist.\n\nDesign calls made (see `docs/vcf-design-decisions.md` if created; for\nnow this is the reference):\n\n- **VCF spec:** declares `##fileformat=VCFv4.5` (latest formal spec,\n  Oct 2024). Backwards-compatible at the record level with anything\n  that accepts 4.2+.\n- **File structure:** one SV VCF + one indel VCF per sample-set. Every\n  record (somatic + germline) goes into both files; somatic rows carry\n  the `SOMATIC` flag INFO so `bcftools view -f .,PASS -i 'INFO/SOMATIC'`\n  peels them off cleanly. Replaces the older 4-file split\n  (sv.somatic / sv.germline / indel.somatic / indel.germline).\n- **SV representation:** intrachrom events with unambiguous orientation\n  become single-record symbolic alleles — `+/+` or `-/-` → `<DEL>`,\n  `-/+` → `<DUP>`, `+/-` → `<INV>`. Inter-chrom and anything else falls\n  through to paired BND records with mate-bracket notation. Override\n  with `--always-bnd` to force BND for every SV (useful if downstream\n  tooling gets confused by symbolic alleles). Classification lives in\n  `classify_symbolic_kind()` in `vcf.cpp`.\n- **EVENT grouping:** both BND records of a pair get `EVENT=<bp_id>`\n  (taken from col 52 of bps.txt.gz, the v3 per-BP identifier). This\n  uses the same namespace as `r2c.txt.gz`'s `split_bps`/`disc_bps` and\n  the BAM `bi:Z` tag, so a user can follow a single variant across all\n  svaba outputs with one key.\n- **QUAL column:** defaults to `.` (missing). QUAL was historically the\n  Phred of `Σ per-sample LO`, which is strongly correlated with\n  `INFO/MAXLOD` but can mislead users into filtering on QUAL when they\n  should be filtering on SOMLOD / MAXLOD / FILTER. `.` is VCF-spec-valid\n  missing and makes downstream tools fall through to the INFO fields\n  where the canonical scores live. Override with `--qual maxlod`\n  (writes `round(10 * maxlod)` capped at 99) or `--qual sum` (legacy).\n- **SVCLAIM:** per VCF 4.5. `J` for pure assembly-only SVs, `DJ` for\n  ASDIS (both assembly + discordant evidence), `D` for discordant-only.\n  svaba is junction-native so most calls end up `J` or `DJ`.\n\nFlag surface:\n```\nsvaba tovcf -i BPS.txt.gz -b BAM -a ID [options]\n  --sv-out FILE           override SV path (default ${ID}.sv.vcf.gz)\n  --indel-out FILE        override indel path (default ${ID}.indel.vcf.gz)\n  --plain                 write plain .vcf (no bgzip)\n  --always-bnd            force BND for every SV\n  --qual MODE             missing (default) | maxlod | sum\n  --include-nonpass       include FILTER != PASS records\n  --dedup                 re-run legacy interval-tree dedup\n  -v / --verbose\n  -h / --help\n```\n\nGotcha: the BAM is required only for the chromosome name/length table\n(used by contig `##contig` lines in the VCF header and by the\nBreakPoint parser to turn chrom-name strings into chr IDs). No reads are\nactually read from it — any BAM that shares the reference is fine.\n\nNot-yet-done on this subcommand: bgzip-proper (current `--plain=false`\noutput is plain gzip, which bcftools accepts but tabix doesn't index\ncorrectly). For now, pipe through `bcftools sort -Oz` + `tabix -p vcf`\nafter. If this becomes painful, revisit with htslib's `hts_open` +\n`vcf_write` path instead of ogzstream.\n\n## BreakPoint IDs (v3 schema)\n\nEvery BP gets a unique stable identifier of the form `bpTTTNNNNNNNN`\nwhere `TTT` is the 3-digit zero-padded worker thread ID and\n`NNNNNNNN` is an 8-digit zero-padded per-thread running counter.\nGeneration is lock-free: the counter lives on `svabaThreadUnit` (see\n`next_bp_id()` in `src/svaba/SvabaThreadUnit.h`). Assignment happens\nexactly once per BP in `SvabaRegionProcessor::process()` right before\nthe pointer is pushed into `unit.m_bps`. Because `AlignedContig`\nholds BPs via `shared_ptr`, the id mutation is immediately visible\nthrough every reference (global, multi-map, indel breaks).\n\nThe id lands as the 52nd core column of `bps.txt.gz` (right after\n`flipped`, before per-sample blocks — this is the v3 schema; v2 had\n51 cols, LEGACY had 41). It's also carried into `r2c.txt.gz` (see\nnext section) so a read's support attribution is unambiguously\nlinked to the exact BP row in bps.txt, eliminating the old \"which BP\non this contig did this read actually support?\" puzzle.\n\n`svaba_bps_cols` (from `scripts/svaba_local_function.sh`) documents\nthe full layout; column 52 is the bp_id field.\n\n**BAM aux tags `bi:Z` / `bz:Z` (v3).** The two aux tags svaba stamps\non weird/discordant/corrected BAM outputs now live in *different*\nidentifier namespaces — choose the right one for the join you want:\n\n- `bi:Z` — comma-joined list of **bp_ids** this read supports as\n  ALT. Matches the per-BP resolution of `r2c.txt.gz`'s `split_bps`\n  / `disc_bps` columns and `bps.txt.gz`'s col 52. Pre-v3 this\n  carried cnames (contig-level), which couldn't disambiguate a\n  contig that hosted multiple BPs (global + multi + indel). To pull\n  every ALT-supporting read for a specific variant row:\n  `samtools view corrected.bam | grep bi:Z:bp00100000042`. The tag\n  is populated in `SvabaRegionProcessor::process` at the BP\n  finalization loop (`tag_with_bp_id` lambda), mirrored into\n  `svabaThreadUnit::alt_bp_ids_by_name` for the corrected-BAM\n  restamp path in `SvabaOutputWriter::writeUnit`.\n- `bz:Z` — comma-joined list of **cnames** this read r2c-aligned\n  to. Stays cname-keyed because \"which contigs did this read align\n  to\" is a contig-level concept. Populated inside the r2c loop in\n  `SvabaRegionProcessor` alongside `svabaRead::AddR2C(...)`,\n  mirrored into `svabaThreadUnit::all_cnames_by_name`. Superset of\n  `bi:Z` in the sense that every ALT-supporter r2c-aligned to its\n  contig, but uses a different key namespace, so join back to\n  bps.txt by col 30 (cname) here vs col 52 (bp_id) for `bi:Z`.\n\n`scripts/r2c_for_contig.sh` defaults to `bz:Z` to pull all r2c'd\nreads for a contig; set `TAG=bi` and pass a bp_id instead of a\ncname if you want the ALT-supporter subset for a specific variant.\n\n## r2c TSV format (re-plot-able alignments)\n\n`${ID}.r2c.txt.gz` is the structured, re-plot-able alignment dump. It\nreplaces the old pre-rendered `${ID}.alignments.txt.gz` ASCII output,\nwhich has been removed entirely — anything that lived implicitly in the\nASCII art (fragment orientation, leading/trailing soft-clip bases, etc.)\nis now available as an explicit field in the TSV, and\n`viewer/r2c_explorer.html` re-plots it in-browser on demand.\n\n**Per-thread emission + postprocess merge.** Each svaba worker writes its\nown `${ID}.thread${N}.r2c.txt.gz` during the run (stream lives in\n`svabaThreadUnit::r2c_out_`; opened in the ctor, closed in the dtor,\ngated on `opts.dump_alignments`). The write happens in\n`SvabaOutputWriter::writeUnit` **before** `writeMutex_` is acquired —\neach thread's gzip stream is independent, so deflate runs in parallel\nacross all workers. The first worker (threadId == 1; the worker pool in\n`threadpool.h` numbers threads 1..N, so there is no thread 0) writes the\ncolumn-header line on open; other threads start with data.\n`scripts/svaba_postprocess.sh` step 1 merges the per-thread files via\n`cat`: gzip is concatenation-safe per RFC 1952, and the postprocess step\nnumerically sorts `.threadN.r2c.txt.gz` so thread 1 is first in the cat,\nwhich means the merged file has exactly one header at the top. This is\nthe same architectural pattern as the per-thread BAM writers; for the\nrationale, see \"Perf notes\" — in short, a mutex-shared gzip stream\nserializes `deflate()` across all threads, losing ~15/16 of compression\nparallelism at `-p 16`.\n\nGotcha: the header-writing branch is keyed to `threadId == 1` in\n`SvabaThreadUnit::svabaThreadUnit`. Older revisions checked\n`threadId == 0`; that never fired because the pool hands out 1..N,\nwhich silently produced headerless `r2c.txt.gz` files. If you ever\nchange the worker-numbering base, that line must change with it.\n\nSchema (documented by `AlignedContig::r2cTsvHeader()` in\n`src/svaba/AlignedContig.cpp`) — 21 tab-separated columns, record-type\ndiscriminated:\n\n```\nrecord_type  contig_name  contig_len  contig_seq  frags  bps  n_reads\n             # contig-only fields above — NA on read rows\n\n             read_id  read_chrom  read_pos  read_flag  r2c_cigar  r2c_start\n             r2c_rc  r2c_nm  support  split_bps  disc_bps  r2c_score\n             native_score  read_seq\n             # read-only fields — NA on the contig row\n```\n\n`split_bps` / `disc_bps` are comma-joined `bp_id` lists — the unambiguous\nper-BP attribution of each read. The categorical `support` field\n(`split` / `disc` / `both` / `none`) is derived from these (whichever is\nnon-NA) and kept for grep-friendliness. The `bps` field on the contig\nrow also carries each BP's id as the 2nd subfield so viewers can join\nback without a second file. On older r2c files without these columns\n(pre-v3 emitter) the viewer falls back to the categorical support only.\n\nOne `contig` row per variant-bearing contig, followed by one `read` row per\nr2c-aligned read. `contig_name` is the shared join key (same value as\nbps.txt's col-30 `cname`), so grouping reads back to their contig is O(n).\n\nFormat details:\n- `frags`: `|`-separated per fragment; within a frag, `:`-separated\n  `chr:pos:strand:cigar:mapq:cpos_break1:cpos_break2:gpos_break1:gpos_break2:flipped`.\n- `bps`: `|`-separated; within a bp, `:`-separated\n  `kind:chr1:pos1:strand1:chr2:pos2:strand2:span:insertion`. `kind ∈ {global, multi, indel}`.\n  Insertion is `.` when absent so the field count stays fixed at 9.\n- All cell values are TSV-escaped (tab/CR/LF → space) via `r2cEscape`.\n- Per-sample support classification (`split`/`disc`/`both`/`none`) and the\n  scores are computed **identically** to the ASCII emitter — same\n  `r2c_score > native_score` gate, same `corrected_native_cig` precedence,\n  same `split_supporters`/`disc_supporters` sets. The two emitters share\n  enough code to prevent drift.\n\n## Blacklist-aware region pruning\n\n`run_svaba.cpp` drops any queued region that is 100% covered by the\nblacklist BEFORE the region is sent to a worker thread. Lives right after\n`loader.countJobs(regionsToRun)`, before `sc.total_regions_to_process` is\nset. Rule: for each `r` in `regionsToRun`, if\n`sc.blacklist.FindOverlapWidth(r, true) >= r.Width()`, drop it.\n\nThis was a measured win. Previously each fully-blacklisted chunk (e.g. a\n25 kb window on a decoy/alt/random contig) paid the full pipeline cost:\n`QueryRegion` on the ref, `walker->SetRegion` + `readBam` (which\ndecompresses every BGZF block overlapping the region, parses each\nbam1_t, allocates an `svabaRead`) — only to have `sc.blacklist.CountOverlaps`\ndrop every read at `SvabaBamWalker.cpp:181-182`. Now those regions never\nhit a thread.\n\nSafe because `sc.blacklist` has had `MergeOverlappingIntervals()` +\n`CreateTreeMap()` called, so `FindOverlapWidth` can't double-count and\nwrongly drop a partially-callable region.\n\nThe per-read and per-BP blacklist checks at `SvabaRegionProcessor.cpp:74,\n818` still run for regions that **partially** overlap — this prune only\nshort-circuits the 100%-covered case.\n\nPruned regions don't get a `runtime.txt` row. That's intentional and\nactually makes the runtime file cleaner (only regions that did work).\n\n## Options surface\n\n`src/svaba/SvabaOptions.h`:\n\n- `dump_weird_reads` is **compile-time-only** (`static constexpr bool`).\n  Flip the literal in the header and rebuild to enable; there is\n  deliberately no CLI path. Because it's `static constexpr false` by\n  default, the compiler dead-code-eliminates every\n  `if (sc.opts.dump_weird_reads) { ... }` branch at -O2+.\n- `dump_discordant_reads`, `dump_corrected_reads`, and `dump_alignments`\n  default **false** and are all enabled together by the single\n  `--dump-reads` runtime flag (switch-case 1800 in `SvabaOptions.cpp`).\n  They control, respectively:\n    - `${ID}.discordant.bam`\n    - `${ID}.corrected.bam`\n    - `${ID}.r2c.txt.gz` (per-thread; merged by the postprocess step)\n  The fields are kept separate so individual callsites can key off\n  their own concern (e.g. `svabaThreadUnit` gates `r2c_out_` opening\n  on `dump_alignments` only), but there's no runtime path to toggle\n  them individually — all three flip as a unit under `--dump-reads`.\n- Without `--dump-reads`, svaba produces the lean output set only:\n  `bps.txt.gz`, VCFs, `contigs.bam`, `runtime.txt`, `discordant.txt.gz`\n  (cluster-level, tiny). No per-thread `r2c.txt.gz`, no `corrected.bam`,\n  no `discordant.bam`. This is the production default because the gated\n  outputs can run to tens of gigabytes on deep samples.\n- **`alignments.txt.gz` is gone.** The pre-rendered ASCII viewer output\n  was replaced in full by `r2c.txt.gz` (same information, not\n  pre-formatted). `AlignedContig::printToAlignmentsFile` and\n  `BreakPoint::printDeletionMarksForAlignmentsFile` were removed; the\n  surviving `AlignmentFragment::printToAlignmentsFile` is kept only\n  because one `std::cerr` debug print in `BreakPoint.cpp` still calls\n  it. `viewer/alignments_viewer.html` still exists and still works on\n  old `.alignments.txt.gz` files from previous runs, but new runs don't\n  produce that file — use the r2c sub-panel in `viewer/bps_explorer.html`\n  instead.\n\n## Viewer suite (`viewer/`)\n\nEntry point is `viewer/index.html`, a card grid pointing at the\nsub-viewers. All client-side, no server required.\n\n- **`bps_explorer.html`** — primary viewer. Sortable table of bps rows,\n  numeric filters (somlod/maxlod/qual/span/etc.), chip filters (counts\n  are live — they reflect the current filter, not the full dataset),\n  per-sample detail panel, small histograms for somlod/maxlod/span,\n  IGV-navigation links in the IGV1/IGV2 columns (fires\n  `fetch('http://localhost:60151/goto?locus=…', {mode:'no-cors'})`;\n  requires IGV running with port 60151 enabled). r2c re-plot sub-panel\n  was removed — that capability now lives in the standalone\n  `r2c_explorer.html` below.\n- **`r2c_explorer.html`** — standalone re-plotter for the structured\n  r2c TSV (emitted by `svaba run --dump-reads`, or filtered to\n  PASS / PASS-somatic by `scripts/svaba_postprocess.sh`). Upload an\n  `.r2c.txt.gz` / `.r2c.pass.txt.gz` / `.r2c.pass.somatic.txt.gz`,\n  type or pick a contig name in the search box (browser `<datalist>`\n  autocomplete, capped at 5000 entries), and get the alignment plot\n  rendered in-browser: 10bp ruler, contig sequence, per-BWA-fragment\n  summaries with `>/<` orientation rendering, per-breakpoint summary\n  rows, and per-read gap-expanded CIGAR rendering with lowercase\n  leading/trailing soft-clip bases placed at `start - lead_clip_len`\n  (exact mirror of the old `AlignedContig::printToAlignmentsFile`).\n  Prev/Next/Random navigation, imperfect-only and per-support-kind\n  toggles, click-to-hide source-prefix legend. Load-once, explore\n  many contigs — no need to load a bps.txt.gz first.\n- **`alignments_viewer.html`** — legacy ASCII-plot viewer for\n  `alignments.txt.gz` outputs produced by svaba runs *before* the r2c\n  migration. New runs no longer produce `alignments.txt.gz`;\n  `r2c_explorer.html` is the replacement. Kept in the tree so historical\n  outputs still render.\n- **`runtime_explorer.html`** — explorer for `runtime.txt` (the per-region\n  timing TSV produced by `svabaTimer::logRuntime`, schema in\n  `SvabaUtils.cpp`). Sortable table, region-range filter,\n  runtime/contigs/discordant filters, IGV-click on the region column,\n  prominent runtime histogram (defaults to log10 because runtime\n  distributions are always long-tailed — see \"Perf notes\"). 17-column\n  schema hardcoded from `SvabaUtils.cpp::svabaTimer::header`.\n- **`comparison.html`** — side-by-side of two bps runs.\n- **`bps_viewer.html`** — legacy light-theme viewer, uses external\n  `app.js` + `styles.css`.\n\n## tracks/ and blacklists\n\n`tracks/hg38.combined_blacklist.bed` is the one to feed `svaba run\n--blacklist`. It's a **regeneratable artifact** — produced by\n`scripts/combine_blacklists.sh` from the component files in the same dir. Don't\nhand-edit it; edit a component file and re-run the script.\n\nComponents (as of last pass):\n- `hg38.blacklist.sorted.bed` — ENCODE-style high-signal regions.\n- `hg38.high_runtime.bed` — regions empirically slow to assemble.\n- `hg38.manual.blacklist.bed` — ad-hoc bad-list, curated.\n- `hg38.nonstd_chr.blacklist.bed` — full-contig entries for every\n  chrUn/*_decoy/*_alt/*_random/chrEBV/HLA-* contig in the reference,\n  generated from `tracks/chr` (a GRCh38 fasta-header dump).\n- `hg38.rmsk.simple_repeat.bed` — UCSC RepeatMasker simple-repeat\n  regions.\n\n`scripts/combine_blacklists.sh` has three modes: plain concat (default),\n`--merge` (sort + `bedtools merge` with distinct-label aggregation), and\n`--clip GENOME` (clip interval ends to real contig length, because some\ninput BEDs use oversize-end sentinels like `end=250000000` that would\notherwise inflate covered-bp totals into the trillions — ask me how I\nknow). Preferred invocation for refreshing the combined blacklist:\n\n```bash\n./scripts/combine_blacklists.sh --merge --clip tracks/chr \\\n  -o tracks/hg38.combined_blacklist.bed \\\n  tracks/hg38.blacklist.sorted.bed \\\n  tracks/hg38.high_runtime.bed \\\n  tracks/hg38.manual.blacklist.bed \\\n  tracks/hg38.nonstd_chr.blacklist.bed \\\n  tracks/hg38.rmsk.simple_repeat.bed\n```\n\n## Perf notes (empirical, from profiling the HLA region on M3 Ultra)\n\nFrom a `sample`-based CPU profile with `-p 16`:\n\n- **96% of worker time is inside `SvabaRegionProcessor::process`**.\n  Four buckets soak it up:\n  - BWA alignment: **~38%** (`mem_align1_core`, `mem_chain`, seed lookups\n    `bwt_sa`/`bwt_occ*`, `ksw_extend2`)\n  - Fermi-lite assembly: **~27%** (`fml_assemble`, `fml_fmi2mag*`,\n    `rld_rank2a`, `unitig_unidir`)\n  - BFC error correction: **~17%** (`SeqLib::BFC::ErrorCorrect/Train`,\n    `kmer_correct`, `bfc_*`). User-controllable via the ec flags.\n  - BAM walking: **~9%** (`svabaBamWalker::readBam`)\n- **IPC ≈ 3.0** on Apple Silicon P-cores (theoretical max ~8, typical\n  real workloads 1.2–2.5). The code is already running near the silicon's\n  sustained envelope; algorithmic rewrites have diminishing returns.\n- **Voluntary context switches ≈ 42 across a 56s run** — i.e. essentially\n  zero. Which means **there is no allocator contention, no mutex\n  contention, no I/O blocking** to fix. jemalloc/mimalloc on macOS **lost\n  to libmalloc by 5-10×** in an A/B test (DYLD interposition overhead +\n  Apple's nanomalloc fast path for small allocs). Save the allocator swap\n  for the Linux production box — on Linux it's often a 10–20% win; on\n  macOS don't bother.\n- **BWA and fermi-lite default to `n_threads = 1` internally**\n  (`mem_opt_init` at `bwamem.c:100`, `fml_opt_init` at `bfc.c:21`) and\n  svaba never mutates them. `kt_for` samples in the profile are the same\n  worker thread running inline, not spawned threads. So svaba's `-p N`\n  is 1:1 with worker threads; there's no multiplicative thread fan-out.\n\nThread-count guidance on this 20 P-core + 8 E-core box:\n- `-p 20` is the default sweet spot. One worker per P-core; E-cores absorb\n  macOS background work, jemalloc bg thread, etc.\n- `-p 26` or `-p 28` is possible but the extra threads land on E-cores\n  and become tail latency (E-core is ~50% the speed of a P-core). Usually\n  a wash or slight loss vs `-p 20`.\n- Load imbalance is the main remaining utilization gap. On a 3 Mb test\n  region, utilization was ~63%; on a 10 Mb region it climbed to ~78%; on\n  full chromosome / WGS expect 85–90%. Tail regions (HLA, centromere,\n  high-coverage weird spots) dominate wall clock.\n\nBuild flag recommendation for production runs (see \"Build system\"):\n`-O3 -mcpu=native` on bwa + fermi-lite + (via `CMAKE_CXX_FLAGS_RELWITHDEBINFO`)\nthe svaba C++. Measured 5–15% wall-time gain expected on top of the default\nRelWithDebInfo build.\n\n## Cloud scatter-gather (`scripts/svaba_cloud.sh`)\n\n`svaba_cloud.sh` parallelizes a WGS run across multiple GCP VMs — one\nper chromosome partition — sharing a single read-only persistent disk.\nEach VM runs `svaba run -k <partition>` independently; outputs go to a\nGCS bucket; an optional `--merge` step concatenates the per-partition\n`bps.txt.gz` files and runs `svaba_postprocess.sh`.\n\nArchitecture rationale: svaba's bottleneck is BWA FM-index random\nlookups, which are latency-bound and NUMA-hostile. Multi-socket servers\nwaste half their threads on cross-socket access. Small single-socket VMs\n(e.g. `c3d-highcpu-30`, AMD Genoa, ~128 MB L3, no NUMA) give each\nworker full-speed local memory. Horizontal scaling across VMs beats\nvertical scaling to more threads on a big box.\n\nOn dual-socket Xeon servers (measured on 2×20-core Xeon @ 2.8 GHz),\njemalloc is the single biggest optimization — 37% wall-time reduction at\n38 threads by eliminating glibc arena lock contention. NUMA pinning\n(`numactl --cpunodebind --membind`) is second-order at ≤40 threads on\na 2-socket box but matters more on 4-socket or at higher thread counts.\n\nDisk I/O is ~9% of wall time (sequential BAM streaming). NVMe is\nunnecessary; standard persistent disk or even gcsfuse over a GCS bucket\nis fine.\n\nInterchromosomal SVs: both breakends get assembled independently by\nwhichever partition contains the discordant read pileup. The merge +\ndedup step in `svaba_postprocess.sh` pairs them. No calls are lost.\n\n## Conventions\n\n- **File naming**: `src/svaba/Svaba*.{cpp,h}` for the svaba-specific files\n  (PascalCase, first letter capitalized). Intentional lowercase / snake_case\n  exceptions live at the top of `src/svaba/` (`refilter`, `run_svaba`,\n  `svaba`, `threadpool`, `tovcf`, `vcf`). Don't introduce new lowercase-first\n  names; if you rename something on a case-insensitive filesystem (macOS),\n  do it via `git rm --cached <lower> && git add <Upper>` or git's `core.ignorecase`\n  will hide the rename from the index.\n- **C++ style**: snake_case methods inside ClassName, 2-space indent,\n  header/impl split. Don't introduce new formatting unless asked.\n- **Statistical code lives in `SvabaModels.*`**; breakpoint glue lives in\n  `BreakPoint.*`. Keep statistical primitives in the models file, not\n  inlined into BreakPoint.\n- **LL/LOD values in this codebase are always log10**, not natural log.\n- **`aN, dN, aT, dT`** = alt count / depth in normal and tumor; **`f`** =\n  allele fraction; **`e_fwd`/`e_rev`** = forward/reverse error rates from\n  the artifact model. These names are used consistently in the analysis\n  HTML too.\n- **Option codes** in `SvabaOptions.cpp::longOpts`: 1001-1099 = mode,\n  1100s = assembly, 1200s = EC, 1300s = discordant, 1400s = filter,\n  1500 = chunking, 1600s = bwa-mem tuning, 1700s = output/DBs, 1800 =\n  dump-reads. Keep the ranges coherent when adding new options.\n\n## Mate-region lookup pipeline\n\nWhen svaba encounters discordant reads (insert size too large or wrong\norientation), it collects their mate loci and considers doing a secondary\n\"mate-region\" assembly to catch the other breakend of an SV.\n\n**Six gates** a mate candidate must pass (in order):\n\n1. **Primary MAPQ** (`minMateMAPQ`, default -1 = no gate): the discordant\n   read itself must have MAPQ ≥ this. Set to e.g. 10 to skip\n   multi-mapped primaries.\n2. **Chromosome ID** (`maxMateChrID`, default 23): mate must land on\n   chr ≤ this ID (0-indexed: 0=chr1 .. 22=chrX, 23=chrY). Skips\n   chrM/alt/decoy in human. Set to -1 (via `--non-human`) to disable\n   entirely for non-human genomes.\n3. **Blacklist**: mate locus checked against `sc.blacklist`.\n4. **Min count** (`mateRegionMinCount`, default 2): merged region must\n   have ≥ N supporting reads to survive the BamWalker filter.\n5. **Somatic mateLookupMin** (default 3, `MATE_LOOKUP_MIN`): in\n   `SvabaRegionProcessor`, only look up regions with ≥ this many\n   somatic-only reads.\n6. **Max regions** (6): cap at 6 mate regions per assembly window.\n\nAll constants live in `SvabaOptions.h` as `inline constexpr` with\nruntime overrides in the `SvabaOptions` class:\n\n```\n--min-mate-mapq N     (default -1, no gate)\n--max-mate-chr  N     (default 23, through chrY; set -1 for no limit)\n--mate-min-count N    (default 2)\n--non-human           (sets maxMateChrID = -1, removes human assumptions)\n```\n\nCode: `SvabaBamWalker.cpp::calculateMateRegions()`.\n\n## Compile-time read & contig tracing\n\nTwo zero-cost compile-time trace systems for debugging why a specific\nread was or wasn't credited / a contig was or wasn't called:\n\n**`SVABA_TRACE_READ`** — traces a single read (by QNAME) through the\nentire pipeline: BamWalker intake → BFC correction → r2c alignment →\nnative realignment → splitCoverage scoring → output tagging.\n\n```bash\ncmake .. -DCMAKE_CXX_FLAGS='-DSVABA_TRACE_READ=\"\\\"LH00306:129:227V5CLT4:6:1204:38807:7191\\\"\"'\n```\n\nTrace points (19 total across 3 files):\n- `SvabaBamWalker.cpp`: initial read filter decisions (existing)\n- `SvabaRegionProcessor.cpp`: BFC correction result, r2c alignment\n  per-contig, native realignment reuse/done/miss, bi:Z tagging\n- `BreakPoint.cpp`: splitCoverage entry, TP8 r2c-vs-native comparison,\n  TP9 del/ins near break, TP10 span check, TP11 del covers,\n  CREDITED/NOT CREDITED final decision\n\n**`SVABA_TRACE_CONTIG`** — traces a single contig through assembly,\nalignment, and scoring:\n\n```bash\ncmake .. -DCMAKE_CXX_FLAGS='-DSVABA_TRACE_CONTIG=\"\\\"c_fermi_chr2_215869501_215894501_13C\\\"\"'\n```\n\nBoth can be combined. Both are `#ifdef`-guarded so they compile to\nnothing when not defined. See `src/svaba/SvabaDebug.h` for the macro\ndefinitions and `README.md` for full recipes.\n\n## Useful jump points\n\n- Somatic LOD calc: `src/svaba/SvabaModels.cpp:86`\n- Per-sample LO: `src/svaba/BreakPoint.cpp:1610`\n- Somatic LOD entry: `src/svaba/BreakPoint.cpp:975`\n- INDEL somatic gate: `src/svaba/BreakPoint.cpp:1072`\n- Region-queue blacklist prune: `src/svaba/run_svaba.cpp` (right after\n  `loader.countJobs(regionsToRun)`)\n- Per-read blacklist filter: `src/svaba/SvabaBamWalker.cpp:181-182`\n- r2c TSV emitter: `src/svaba/AlignedContig.cpp::printToR2CTsv` +\n  `::r2cTsvHeader`\n- Postprocess (C++): `src/svaba/SvabaPostprocess.cpp`\n- Postprocess (shell orchestration): `scripts/svaba_postprocess.sh`\n- `svaba tovcf` driver: `src/svaba/tovcf.cpp::runToVCF`\n- VCF engine (parse + dedup + emit): `src/svaba/vcf.cpp` + `vcf.h`\n- Symbolic SV classifier: `vcf.cpp::classify_symbolic_kind`\n- Single-file VCF writers: `vcf.cpp::writeSvsSingleFile` + `writeIndelsSingleFile`\n- Blacklist combiner: `scripts/combine_blacklists.sh`\n- Runtime-file schema: `src/svaba/SvabaUtils.cpp::svabaTimer::header`\n- Options parsing: `src/svaba/SvabaOptions.cpp::SvabaOptions::parse`\n- Analysis writeup (somlod/maxlod): `somlod_maxlod_analysis.html`\n- Mate-region lookup: `src/svaba/SvabaBamWalker.cpp::calculateMateRegions`\n- Mate-region constants: `src/svaba/SvabaOptions.h` (lines 126-141)\n- Read trace macro: `src/svaba/SvabaDebug.h`\n- Read trace (BFC/r2c/native): `src/svaba/SvabaRegionProcessor.cpp`\n- Read trace (splitCoverage): `src/svaba/BreakPoint.cpp`\n- Debugging recipes: `README.md` (in svaba_opt root)\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.10)\n\n# Set the C++ standard required for the project\nproject(svaba) # LANGUAGES CXX)\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\nset(CMAKE_CXX_EXTENSIONS OFF)\n\nif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n    set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING\n        \"Default build type\" FORCE)\nendif()\nadd_compile_options(-fno-omit-frame-pointer)\n\nadd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/SeqLib)\n\n# Include directories for headers\ninclude_directories(\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    ${CMAKE_CURRENT_SOURCE_DIR}/SeqLib\n    ${CMAKE_CURRENT_SOURCE_DIR}/SeqLib/bwa\n    ${CMAKE_CURRENT_SOURCE_DIR}/SeqLib/fermi-lite    \n)\n\n# Look for htslib on the system\nfind_package(htslib QUIET)\n\n# Find required system level type libraries\nfind_package(Threads REQUIRED)  \nfind_package(ZLIB REQUIRED)\n\n## LZMA\nfind_path(LZMA_INCLUDE_DIR NAMES lzma.h)\nfind_library(LZMA_LIBRARY NAMES lzma)\n\nif(NOT LZMA_INCLUDE_DIR OR NOT LZMA_LIBRARY)\n  message(FATAL_ERROR \"LZMA library or headers not found!\")\nendif()\n\n## BZip2\nfind_package(BZip2 REQUIRED)\n\n## HTSLIB\n#\n# Detection order:\n#   1. find_package(htslib) — works only if htslib ships a\n#      htslibConfig.cmake (rare outside conda/vcpkg installs).\n#   2. pkg-config — system-installed htslib typically provides a\n#      htslib.pc, so `pkg-config --libs htslib` works.\n#   3. find_path/find_library for htslib/hts.h and libhts on the\n#      default system paths (/usr/include, /usr/local/include,\n#      /opt/homebrew/include, etc.).\n#   4. Explicit -DHTSLIB_DIR=/path/to/htslib for non-standard installs.\n#\n# The first three paths auto-detect a system install, so a vanilla\n# `cmake .. && make` works when htslib is installed system-wide. Only\n# fall back to HTSLIB_DIR when all auto-detections fail, matching the\n# pattern used here for ZLIB / BZip2 (also auto-detected).\nset(SVABA_HTSLIB_FOUND FALSE)\nset(SVABA_HTSLIB_LIBRARIES \"\")\n\nif (htslib_FOUND)\n    message(STATUS \"htslib: found via find_package()\")\n    set(SVABA_HTSLIB_FOUND TRUE)\n    set(SVABA_HTSLIB_LIBRARIES hts)\nendif()\n\nif (NOT SVABA_HTSLIB_FOUND)\n    find_package(PkgConfig QUIET)\n    if (PkgConfig_FOUND)\n        pkg_check_modules(HTSLIB_PC QUIET htslib)\n        if (HTSLIB_PC_FOUND)\n            message(STATUS \"htslib: found via pkg-config (version ${HTSLIB_PC_VERSION})\")\n            include_directories(${HTSLIB_PC_INCLUDE_DIRS})\n            link_directories(${HTSLIB_PC_LIBRARY_DIRS})\n            set(SVABA_HTSLIB_FOUND TRUE)\n            set(SVABA_HTSLIB_LIBRARIES ${HTSLIB_PC_LIBRARIES})\n        endif()\n    endif()\nendif()\n\nif (NOT SVABA_HTSLIB_FOUND)\n    find_path(HTSLIB_INCLUDE_DIR NAMES htslib/hts.h\n              DOC \"Directory containing htslib/hts.h\")\n    find_library(HTSLIB_LIBRARY NAMES hts\n                 DOC \"Path to the hts library\")\n    if (HTSLIB_INCLUDE_DIR AND HTSLIB_LIBRARY)\n        message(STATUS \"htslib: found headers at ${HTSLIB_INCLUDE_DIR}, lib at ${HTSLIB_LIBRARY}\")\n        include_directories(${HTSLIB_INCLUDE_DIR})\n        set(SVABA_HTSLIB_FOUND TRUE)\n        set(SVABA_HTSLIB_LIBRARIES ${HTSLIB_LIBRARY})\n    endif()\nendif()\n\nif (NOT SVABA_HTSLIB_FOUND)\n    set(HTSLIB_DIR \"\" CACHE PATH \"Path to HTSLib root directory\")\n    if (HTSLIB_DIR)\n        message(STATUS \"htslib: using explicit HTSLIB_DIR=${HTSLIB_DIR}\")\n        include_directories(${HTSLIB_DIR}/include)\n        link_directories(${HTSLIB_DIR}/lib)\n        set(SVABA_HTSLIB_FOUND TRUE)\n        set(SVABA_HTSLIB_LIBRARIES hts)\n    else()\n        message(FATAL_ERROR\n            \"htslib not found. Install htslib system-wide (e.g. \"\n            \"`brew install htslib` or `apt install libhts-dev`) so \"\n            \"pkg-config / find_library locate it automatically, \"\n            \"or pass -DHTSLIB_DIR=/path/to/htslib to point at a \"\n            \"manual build.\")\n    endif()\nendif()\n\n# Find all source files\nset(SOURCES\nsrc/svaba/run_svaba.cpp\nsrc/svaba/SvabaOutputWriter.cpp\nsrc/svaba/BreakPoint.cpp\nsrc/svaba/ContigAlignmentScore.cpp\nsrc/svaba/AlignedContig.cpp\nsrc/svaba/AlignmentFragment.cpp\nsrc/svaba/DiscordantCluster.cpp\nsrc/svaba/DBSnpFilter.cpp\nsrc/svaba/SvabaUtils.cpp\nsrc/svaba/svaba.cpp\nsrc/svaba/SvabaAssemblerEngine.cpp\nsrc/svaba/tovcf.cpp\nsrc/svaba/test_svaba.cpp\nsrc/svaba/vcf.cpp\nsrc/svaba/DiscordantRealigner.cpp\nsrc/svaba/SvabaOverlapAlgorithm.cpp\nsrc/svaba/SvabaASQG.cpp\nsrc/svaba/SvabaAssemble.cpp\nsrc/svaba/KmerFilter.cpp\nsrc/svaba/SvabaThreadUnit.cpp\nsrc/svaba/SvabaRegionProcessor.cpp\nsrc/svaba/SvabaBamWalker.cpp\nsrc/svaba/refilter.cpp\nsrc/svaba/SvabaPostprocess.cpp\nsrc/svaba/LearnBamParams.cpp\nsrc/svaba/STCoverage.cpp\nsrc/svaba/SvabaModels.cpp\n##src/svaba/Histogram.cpp\n##src/svaba/BamStats.cpp\nsrc/svaba/SvabaRead.cpp\nsrc/svaba/SvabaOptions.cpp\nsrc/svaba/SvabaLogger.cpp\nsrc/svaba/SvabaFileLoader.cpp\n\nsrc/SGA/SuffixTools/STCommon.cpp\nsrc/SGA/SuffixTools/Occurrence.cpp\nsrc/SGA/SuffixTools/SuffixArray.cpp\nsrc/SGA/SuffixTools/SuffixCompare.cpp\nsrc/SGA/SuffixTools/InverseSuffixArray.cpp\nsrc/SGA/SuffixTools/SACAInducedCopying.cpp\nsrc/SGA/SuffixTools/BWTAlgorithms.cpp\nsrc/SGA/SuffixTools/BWTReader.cpp\nsrc/SGA/SuffixTools/BWTWriter.cpp\nsrc/SGA/SuffixTools/SAReader.cpp\nsrc/SGA/SuffixTools/SAWriter.cpp\nsrc/SGA/SuffixTools/SBWT.cpp\nsrc/SGA/SuffixTools/RLBWT.cpp\nsrc/SGA/SuffixTools/BWTWriterBinary.cpp\nsrc/SGA/SuffixTools/BWTReaderBinary.cpp\nsrc/SGA/SuffixTools/BWTWriterAscii.cpp\nsrc/SGA/SuffixTools/BWTReaderAscii.cpp\nsrc/SGA/SuffixTools/BWTIntervalCache.cpp\nsrc/SGA/SuffixTools/SampledSuffixArray.cpp\n\nsrc/SGA/Algorithm/OverlapAlgorithm.cpp\nsrc/SGA/Algorithm/DPAlignment.cpp\nsrc/SGA/Algorithm/SearchSeed.cpp\nsrc/SGA/Algorithm/OverlapBlock.cpp\nsrc/SGA/Algorithm/SearchHistory.cpp\nsrc/SGA/Algorithm/OverlapTools.cpp\n\nsrc/SGA/Bigraph/Bigraph.cpp\nsrc/SGA/Bigraph/Vertex.cpp\nsrc/SGA/Bigraph/Edge.cpp\nsrc/SGA/Bigraph/EdgeDesc.cpp\n\nsrc/SGA/SGA/OverlapCommon.cpp\n\nsrc/SGA/SQG/SQG.cpp\nsrc/SGA/SQG/ASQG.cpp\n\nsrc/SGA/StringGraph/SGUtil.cpp\nsrc/SGA/StringGraph/SGAlgorithms.cpp\nsrc/SGA/StringGraph/SGVisitors.cpp\nsrc/SGA/StringGraph/CompleteOverlapSet.cpp\nsrc/SGA/StringGraph/RemovalAlgorithm.cpp\nsrc/SGA/StringGraph/SGSearch.cpp\nsrc/SGA/StringGraph/SGWalk.cpp\n\nsrc/SGA/Util/Util.cpp\nsrc/SGA/Util/stdaln.c\nsrc/SGA/Util/Alphabet.cpp\nsrc/SGA/Util/Contig.cpp\nsrc/SGA/Util/ReadTable.cpp\nsrc/SGA/Util/ReadInfoTable.cpp\nsrc/SGA/Util/SeqReader.cpp\nsrc/SGA/Util/DNAString.cpp\nsrc/SGA/Util/Match.cpp\nsrc/SGA/Util/Pileup.cpp\nsrc/SGA/Util/Interval.cpp\nsrc/SGA/Util/SeqCoord.cpp\nsrc/SGA/Util/QualityVector.cpp\nsrc/SGA/Util/Quality.cpp\nsrc/SGA/Util/PrimerScreen.cpp\nsrc/SGA/Util/CorrectionThresholds.cpp\nsrc/SGA/Util/ClusterReader.cpp\nsrc/SGA/Util/QualityTable.cpp\nsrc/SGA/Util/gzstream.C\nsrc/SGA/Util/BitChar.cpp\nsrc/SGA/Util/MultiOverlap.cpp\n)\n\ninclude_directories(\n    ${CMAKE_CURRENT_BINARY_DIR}\n    src/SGA/Algorithm\n    src/SGA/StringGraph\n    src/SGA/SGA\n    src/SGA/SuffixTools\n    src/SGA/Util\n    src/SGA/SQG\n    src/SGA/Bigraph\n    src/svaba\n    src/SGA\n)\n\n# ---------------------------------------------------------------------------\n# Optional compile-time contig tracing (SvabaDebug.h).\n#\n#   cmake .. -DSVABA_TRACE_CONTIG=\"c_fermi_chr2_215869501_215894501_11C\"\n#\n# Prints detailed stderr trace for every decision point that contig\n# touches. Pass -DSVABA_TRACE_ALL=ON to trace ALL contigs (very noisy).\n# ---------------------------------------------------------------------------\nset(SVABA_TRACE_CONTIG \"\" CACHE STRING \"Contig name to trace (empty=off)\")\noption(SVABA_TRACE_ALL \"Trace ALL contigs (very noisy)\" OFF)\nset(SVABA_TRACE_READ \"\" CACHE STRING \"Read QNAME to trace (empty=off)\")\noption(SVABA_TRACE_ALL_READS \"Trace ALL reads (extremely noisy)\" OFF)\n\n# Generate the executable\nadd_executable(svaba ${SOURCES})\n\nif (NOT \"${SVABA_TRACE_CONTIG}\" STREQUAL \"\")\n    message(STATUS \"svaba: tracing contig '${SVABA_TRACE_CONTIG}'\")\n    target_compile_definitions(svaba PRIVATE\n        SVABA_TRACE_CONTIG=\"${SVABA_TRACE_CONTIG}\")\nendif()\nif (SVABA_TRACE_ALL)\n    message(STATUS \"svaba: tracing ALL contigs (noisy!)\")\n    target_compile_definitions(svaba PRIVATE SVABA_TRACE_ALL=1)\nendif()\nif (NOT \"${SVABA_TRACE_READ}\" STREQUAL \"\")\n    message(STATUS \"svaba: tracing read '${SVABA_TRACE_READ}'\")\n    target_compile_definitions(svaba PRIVATE\n        SVABA_TRACE_READ=\"${SVABA_TRACE_READ}\")\nendif()\nif (SVABA_TRACE_ALL_READS)\n    message(STATUS \"svaba: tracing ALL reads (extremely noisy!)\")\n    target_compile_definitions(svaba PRIVATE SVABA_TRACE_ALL_READS=1)\nendif()\n\n# If the submodules already have Makefiles, you can use custom commands to invoke make\n# in those directories.\nadd_custom_target(\n    COMMAND make\n    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n)\n\n# ---------------------------------------------------------------------------\n# Optional jemalloc support.\n#\n# On Linux with high thread counts (-p 16+), jemalloc eliminates glibc\n# arena-lock contention that can cost 30-40% wall time. Link it at\n# compile time so no LD_PRELOAD is needed at runtime.\n#\n#   cmake .. -DUSE_JEMALLOC=ON      # link jemalloc (recommended on Linux)\n#   cmake .. -DUSE_JEMALLOC=OFF     # use system malloc (default)\n#\n# macOS users should NOT enable this — Apple's libmalloc with its\n# nanomalloc fast path outperforms jemalloc on this workload.\n# ---------------------------------------------------------------------------\noption(USE_JEMALLOC \"Link against jemalloc for reduced allocator contention\" OFF)\nset(JEMALLOC_LIBRARIES \"\")\nif (USE_JEMALLOC)\n    find_library(JEMALLOC_LIB NAMES jemalloc\n                 PATHS /usr/lib/x86_64-linux-gnu /usr/lib /usr/local/lib\n                 DOC \"Path to libjemalloc\")\n    if (JEMALLOC_LIB)\n        message(STATUS \"jemalloc: found at ${JEMALLOC_LIB}\")\n        set(JEMALLOC_LIBRARIES ${JEMALLOC_LIB})\n    else()\n        message(FATAL_ERROR\n            \"USE_JEMALLOC=ON but libjemalloc not found. \"\n            \"Install it (apt install libjemalloc-dev) or set \"\n            \"-DJEMALLOC_LIB=/path/to/libjemalloc.so\")\n    endif()\nendif()\n\n# Linking\ntarget_link_libraries(svaba\n    seqlib\n    ${CMAKE_CURRENT_SOURCE_DIR}/SeqLib/bwa/libbwa.a\n    ${CMAKE_CURRENT_SOURCE_DIR}/SeqLib/fermi-lite/libfml.a\n    Threads::Threads\n    ${SVABA_HTSLIB_LIBRARIES}\n    ZLIB::ZLIB\n    ${CURL_LIBRARY}\n    ${LZMA_LIBRARY}\n    BZip2::BZip2\n    ${JEMALLOC_LIBRARIES}\n)\n\n# ---------------------------------------------------------------------------\n# Install support.\n#\n# `make install` (equivalent: `cmake --install build`) copies the svaba\n# binary to ${CMAKE_INSTALL_PREFIX}/bin. GNUInstallDirs sets the usual\n# distro-friendly defaults for BINDIR / LIBDIR / etc., so this follows\n# standard Unix conventions.\n#\n# Default CMAKE_INSTALL_PREFIX is /usr/local (may need sudo). To stage\n# into a non-system location, pass -DCMAKE_INSTALL_PREFIX=/some/path at\n# cmake time, or use `cmake --install build --prefix /some/path` at\n# install time. To drop the binary into this repo's `bin/` directory:\n#   cmake --install build --prefix ${CMAKE_SOURCE_DIR}\n# ---------------------------------------------------------------------------\ninclude(GNUInstallDirs)\ninstall(TARGETS svaba\n        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})\ninstall(PROGRAMS ${CMAKE_SOURCE_DIR}/scripts/svaba_postprocess.sh\n        DESTINATION ${CMAKE_INSTALL_BINDIR})\n"
  },
  {
    "path": "Dockerfile",
    "content": "# Start with an Ubuntu image\nFROM ubuntu:20.04\n\n# Avoid prompts with tzdata (timezones)\nENV DEBIAN_FRONTEND=noninteractive\n\n# Install dependencies for htslib and svaba\nRUN apt update && apt install -y \\\n    autoconf \\\n    automake \\\n    make \\\n    gcc \\\n    g++ \\\n    git \\\n    perl \\\n    zlib1g-dev \\\n    libbz2-dev \\\n    liblzma-dev \\\n    libcurl4-gnutls-dev \\\n    libssl-dev \\\n    cmake \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Clone and install htslib\nWORKDIR /opt\nRUN git clone --recursive https://github.com/samtools/htslib.git && \\\n    cd htslib && \\\n    autoheader && \\\n    autoconf && \\\n    ./configure && \\\n    make && \\\n    make install\n\n# Ensure shared libraries are noticed\nRUN ldconfig\n\n# Clone svaba\nWORKDIR /opt\nRUN git clone --recursive https://github.com/walaj/svaba.git && cd svaba && mkdir build\n\n# Compile svaba with htslib\nWORKDIR /opt/svaba/build\nRUN cmake .. \\\n    -DHTSLIB_DIR=/usr/local && \\\n    make\n\n# Add svaba to system PATH\nENV PATH=\"/opt/svaba/build:${PATH}\"\n\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "R/archive_non_functional/create-databases.R",
    "content": "####################\n## load CCDS and name table\nccds <- fread(\"/xchip/gistic/Jeremiah/tracks/ccdsGene.hg19.txt\")\n\n## load and format name table (CCDS to gene name conversion)\nnm   <- fread(\"/xchip/gistic/Jeremiah/tracks/name_conversion.tsv\") \nsetnames(nm, colnames(nm), gsub(\" \",\"_\",colnames(nm)))\napp_sym <- rep(nm$Approved_Symbol, times=nm[, length(strsplit(CCDS_IDs, \",\")[[1]]), by=HGNC_ID]$V1)\nnmm <- data.table(ccds=gsub(\" \", \"\", unlist(strsplit(nm$CCDS_IDs,\",\"))), gene=app_sym)\nsetkey(nmm, ccds)\n\n## merge names with CCDS\nccds[, ccds := gsub(\"(.*?)\\\\..*\", \"\\\\1\", name)]\nsetkey(ccds, ccds)\nccds <- nmm[ccds]\n\n## switch frames 1 and 2, so that 2 refers to 2/3 of codon, 1 to 1/3\n## eg. ++***+++***+++ starts with 2/3 of codon in its sense dir, so frame is 2\nccds$exonFrames <- gsub(\"1\",\"A\", ccds$exonFrames)\nccds$exonFrames <- gsub(\"2\",\"1\", ccds$exonFrames)\nccds$exonFrames <- gsub(\"A\",\"2\", ccds$exonFrames)\n\n## dedupe on gene, taking the largest one\nccds[, negc := -exonCount]\nsetkey(ccds, gene, negc)\nccds <- ccds[!duplicated(gene)]\nccds[, negc := NULL]\n\n## create exon intron track\nccds[, exon_start    := min(as.numeric(strsplit(exonStarts, \",\")[[1]])), by=c(\"name\", \"chrom\", \"txStart\")]\nccds[, exon_end      := max(as.numeric(strsplit(exonEnds,  \",\")[[1]])), by=c(\"name\", \"chrom\", \"txStart\")]\nccds[, intron_ends   := { ll <- as.numeric(strsplit(exonStarts, \",\")[[1]]);   paste(ll[seq(2, length(ll), length.out=ifelse(length(ll) > 1,   length(ll)-1, 0))], collapse=\",\")} , by=c(\"name\", \"chrom\", \"txStart\")]\nccds[, intron_starts := { ll <- as.numeric(strsplit(exonEnds, \",\")[[1]]);   paste(ll[seq(1, length(ll)-1, length.out=ifelse(length(ll) > 1, length(ll)-1, 0))], collapse=\",\")} , by=c(\"name\", \"chrom\", \"txStart\")]\nccds[, intron_frame  := {\n  ll <- as.numeric(strsplit(exonFrames, \",\")[[1]])\n  if (length(ll) == 1) ## no exons\n    \"\"\n  else if (strand == '+') ## in sense dir, give frame to exon after\n    paste(ll[seq(2, length(ll))], collapse=\",\")\n  else ## exons ordered in + direction, so sense exon after intron is actually the one BEFORE intron for this ordering\n    paste(ll[seq(1, length(ll)-1)], collapse=\",\")\n} , by=c(\"name\", \"chrom\", \"txStart\")]\nintrEnds   <- as.numeric(unlist(strsplit(ccds$intron_ends, \",\")))\nintrStarts <- as.numeric(unlist(strsplit(ccds$intron_starts, \",\")))\nintrFrame  <- as.numeric(unlist(strsplit(ccds$intron_frame, \",\")))\nintrName   <- rep(ccds$name, times=as.numeric(ccds$exonCount)- 1)\nintrChr    <- gsub(\"chr\", \"\", rep(ccds$chrom, times=as.numeric(ccds$exonCount)-1))\nintrNums   <- as.numeric(ccds[, { s <- seq(length.out=ifelse(as.numeric(exonCount)==1, 0, as.numeric(exonCount)-1)); if (strand == '+') { s } else { rev(s) } }, by=c(\"name\",\"chrom\",\"txStart\")]$V1)\nexonNums   <- as.numeric(ccds[, { s <- seq(as.numeric(exonCount)); if (strand=='+') { s } else { rev(s) }}, by=c(\"name\",\"chrom\",\"txStart\")]$V1)\nintrGene   <- rep(ccds$gene, times=as.numeric(ccds$exonCount)-1)\nexonGene   <- rep(ccds$gene, times=as.numeric(ccds$exonCount))\nccdsGene   <- as.numeric(ccds[, seq(as.numeric(exonCount)), by=c(\"name\",\"chrom\",\"txStart\")]$V1)\n\nccds[, exon_end  := max(as.numeric(strsplit(exonEnds, \",\")[[1]])), by=c(\"name\", \"chrom\", \"txStart\")]\nexonFrames <- as.numeric(unlist(strsplit(ccds$exonFrames, \",\")))\nexonStarts <- as.numeric(unlist(strsplit(ccds$exonStarts, \",\"))) \nexonEnds   <- as.numeric(unlist(strsplit(ccds$exonEnds, \",\")))\nccdsName   <- rep(ccds$name, times=as.numeric(ccds$exonCount))\nexonStrand <- rep(ccds$strand, times=as.numeric(ccds$exonCount))\n#exonStarts[exonStrand == '+'] <- exonStarts[exonStrand == '+'] + 1 ## off by one?\nexonStarts <- exonStarts + 1 ## off by one?\n#exonEnds[exonStrand == '-'] <- exonEnds[exonStrand == '-'] + 1 ## off by one?\nintrStrand <- rep(ccds$strand, times=as.numeric(ccds$exonCount)-1)\nccdschrom  <- gsub(\"chr\",\"\",rep(ccds$chrom, times=as.numeric(ccds$exonCount)))\n\ngr.exons <-   sort(gr.fix(GRanges(ccdschrom, IRanges(exonStarts, exonEnds), strand=exonStrand, name=ccdsName, num=exonNums, frame=exonFrames, gene=exonGene), si))\ngr.introns <- sort(gr.fix(GRanges(intrChr, IRanges(intrStarts, intrEnds), strand=intrStrand, name=intrName, num=intrNums, frame=intrFrame, gene=intrGene), si))\n\n\n#### genes\ngr.genes = sort(gr.fix(gr.nochr(with(fread(\"/xchip/gistic/Jeremiah/tracks/genes.hg19.ucsc.txt\", sep=\"\\t\"), GRanges(chr, IRanges(beg, end), gene=symbol))), si))\ngr.genes <- gr.genes[!grepl(\"^ULK|^NBPF|^MIR|^LOC|^OR|^SNO|^FAM|^ZNF|^SMN|^NF1P2|^POTEB|^RNF|^RGPD5|^RGPD2|^SNAR|^NBPF\", gr.genes$gene) & width(gr.genes) < 3e6]\ngr.genes$gene <- as.character(gr.genes$gene)\ngg <- grbind(gr.exons, gr.introns)\n#gg <- gr.val(gg, gr.genes, 'gene', sep=\"_\")\n#gg$gene[nchar(gg$gene) > 50] <- \"MANYGENES\"\n\n## get complement\ngg <- gr.stripstrand(gr.fix(gg, si))\ngg$gene <- as.character(gg$gene)\ngene.comp <- setdiff(gr.stripstrand(si2gr(si)), gg) + 1\nfo <- gr2dt(gr.findoverlaps(gene.comp, gg))\nfo <- fo[query.id %in% as.numeric(names(table(fo$query.id)[table(fo$query.id) == 2]))] ## now each intergenic region has front/back overlap\nfo[, right := gg$gene[subject.id[2]], by=query.id]\nfo[, left  := gg$gene[subject.id[1]], by=query.id]\ngene.comp$left <- gene.comp$right <- \"\"\ngene.comp$left[fo$query.id] <- fo$left\ngene.comp$right[fo$query.id] <- fo$right\ngene.comp <- gene.comp - 1\n\n## tubio\nff <- fread(\"/xchip/gistic/Jeremiah/tracks/master_db_29062016_ranges.txt\")\nsetnames(ff, c(\"V1\",\"V2\",\"V3\",\"V4\",\"V5\",\"V6\"), c(\"seqnames\",\"start\",\"end\",\"dir\",\"type\",\"sample\"))\nff$strand <- ifelse(ff$dir == \"plus\",\"+\",\"-\")\ngr.tub <- dt2gr(ff)\n"
  },
  {
    "path": "R/archive_non_functional/gen_quals.R",
    "content": "require(data.table)\n\nf <- fread(\"grep -v ^# /broad/broadsv/NA12878/GCAT/gcat_illumina_150x/snowman/v115/v115.snowman.indel.vcf\", sep='\\t')\nhdr <- fread(\"grep ^# /broad/broadsv/NA12878/GCAT/gcat_illumina_150x/snowman/v115/v115.snowman.indel.vcf\", sep=\"\\t\", header=FALSE)\n\n## rescale the quality score\nf[, SL := gsub(\".*?:.*?:.*?:.*?:.*?:.*?:.*?:.*?:.*?:(.*?)\",\"\\\\1\", V10)]\nf[, V6 := SL]\n\np <- c(hdr$V1, f[, paste(V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,sep=\"\\t\")])\nwriteLines(p, \"/broad/hptmp/jwala/test.vcf\")\n"
  },
  {
    "path": "R/archive_non_functional/svaba-annotate.R",
    "content": "#!/usr/bin/env Rscript\n\nlibrary(optparse)\n\noption_list = list(\n  make_option(c(\"-i\", \"--input\"),  type = \"character\", default = NULL,  help = \"Input VCF file\"),\n  make_option(c(\"-s\", \"--style\"),  type = \"character\", default = \"ncbi\", help = \"[nbci] for 1,2,...X, or [ucsc] for chr1, chr2, ...chrX\"),\n  make_option(c(\"-g\", \"--genome\"),  type = \"character\", default = NULL, help = \"genome build (hg19 or hg38)\"),\n  make_option(c(\"-b\", \"--db\"),  type = \"character\", default = \"refseq\", help = \"[refseq] gene database to use (must be refseq or gencode)\"),\n  make_option(c(\"-o\", \"--output\"), type = \"character\", default = \"no_id\",  help = \"Output annotation name\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\nif (is.null(opt$input))\n  stop(print_help(parseobj))\n\nif (!tolower(opt$style) %in% c(\"ncbi\",\"ucsc\"))\n  stop(\"Must specify style as ncbi or ucsc\")\n\nif (!tolower(opt$genome) %in% c(\"hg38\",\"hg19\"))\n  stop(\"Must specify --genome as hg19 or hg38\")\n\nwrite(\"...loading required packages\\n\", stderr())\nlibrary(roverlaps) ## can find at https://github.com/walaj/roverlaps\n##library(plyr)\nlibrary(RMySQL)\nlibrary(data.table)\n\n## setup the connect to UCSC\nwrite(\"...downloading annotation tracks from UCSC\\n\", stderr())\nassembly <- opt$genome\nmychannel <- dbConnect(MySQL(), user=\"genome\", host=\"genome-mysql.cse.ucsc.edu\")\nquery <- function(...) dbGetQuery(mychannel, ...)\n\nif (tolower(opt$db) == tolower(\"refseq\")) {\n  ## download the exons and their gene names from RefSeq (UCSC track)\n  ## - reminder that refseq ids can be interpreted:\n  ##                 https://www.ncbi.nlm.nih.gov/books/NBK50679/#RefSeqFAQ.what_is_the_difference_between\n  ## - (from above): Accession numbers that begin with the prefix XM_ (mRNA), XR_ (non-coding RNA), and XP_ (protein)\n  ##                 are model RefSeqs produced either by NCBIs genome annotation pipeline or copied from\n  ##                 computationally annotated submissions to the INSDC.NCBI\n  ##                 ...subsequently curated RefSeq records (with NM_, NR_, or NP_ accession prefixes)\n  genes <- suppressWarnings(data.table::as.data.table(query(paste0(\"SELECT name, name2, chrom, txStart, txEnd, strand, exonStarts, exonEnds, exonCount, exonFrames FROM \", assembly, \".refGene\"))))\n  genes[, prefix := gsub(\"([A-Z]+)_.*\",\"\\\\1\", name)]\n  genes[, longest := { a=rep(FALSE, .N); a[which.max(txEnd - txStart)] <- TRUE; a }, by=name2]\n  genes[, numTranscriptAnnotations := .N, by=name2]\n  genes <- genes[txEnd - txStart >= 100] ## only genes longer than 100 bp\n  genes <- genes[genes$longest] ## just take the longest transcriopt\n  write('...defaulting to annotating only the longest transcript')\n  genes[, longest := NULL]\n\n  setnames(genes, c(\"name2\",\"name\"), c(\"geneSymbol\",\"id\"))\n\n} else if (tolower(opt$db) == \"gencode\") {\n\n  ## if want to use GENCODE instead, need to get table to convert GENCODE ids to gene names\n  genes <- suppressWarnings(data.table::as.data.table(query(paste0(\"SELECT name, chrom, txStart, txEnd, strand, exonStarts, exonEnds, exonCount FROM \", assembly, \".knownGene\"))))\n  codes <- suppressWarnings(data.table::as.data.table(query(paste0(\"SELECT kgID, mRNA, geneSymbol, spID, refSeq FROM \", assembly, \".kgXref\"))))\n\n  ## merge the gene ids to gene names\n  setnames(genes, c(\"name\"), c(\"kgID\"))\n  setkey(genes, kgID)\n  setkey(codes, kgID)\n  genes <- codes[genes]\n  stopifnot(!any(duplicated(genes$kgID)))\n  genes[, geneSymbol := toupper(geneSymbol)]\n\n  setnames(genes, \"kgID\", \"id\")\n} else {\n  stop(\"db option must be either GENCODE or RefSeq\")\n}\n\nwrite(\"...parsing downloaded annotation data\\n\", stderr())\n\n## convert to key'ed format\nsetnames(genes, c(\"chrom\", \"txStart\",\"txEnd\"), c(\"seqnames\",\"start\",\"end\"))\nif (tolower(opt$style) == \"ncbi\")\n  genes[, seqnames := gsub(\"^chr\", \"\", seqnames)]\n\n## make the exons structure\nstarts <- strsplit(genes[, exonStarts], \",\")\nends   <- strsplit(genes[, exonEnds], \",\")\nframes   <- strsplit(genes[, exonFrames], \",\")\nstopifnot(sum(sapply(starts, length)) == sum(sapply(ends, length)))\nstopifnot(sum(sapply(starts, length)) == sum(sapply(frames, length)))\nstopifnot(sum(sapply(starts, length)) == sum(genes$exonCount))\nexons <- data.table(id = genes[, rep(id, exonCount)],\n                    geneSymbol = genes[, rep(geneSymbol, exonCount)],\n                    exonCount = genes[, rep(exonCount, exonCount)],\n                    seqnames = genes[, rep(seqnames, exonCount)],\n                    frames = as.numeric(unlist(frames)),\n                    start = as.numeric(unlist(starts)),\n                    end = as.numeric(unlist(ends)),\n                    strand = genes[, rep(strand, exonCount)])\nexons[, exonNum := ifelse(strand==\"+\", seq(.N), rev(seq(.N))), by=id]\n\n## make an introns track\n## for the frames, define the intron from as the one of the previous exon, respecting strand\n## EEEEiiiiiiiEEEEiiiiiiiiEEEEEiiiiiEEE <<< intron frame is frame of RIGHT exon (iiiiEEEE)\n## EEEEiiiiiiiEEEEiiiiiiiiEEEEEiiiiiEEE >>> intron from is frame of LEFT exon (EEEEiii)\nends   <- exons[exonCount > 1, start[seq(2, .N)], by=id]\nstarts <- exons[exonCount > 1, end[seq(1, .N-1)], by=id]\nif (\"exonFrames\" %in% colnames(genes)) {\n  frames <- exons[exonCount > 1, {\n    if (strand[1]==\"+\")\n      frames[seq(1,.N-1)]\n    else\n      frames[seq(2,.N)]\n  }, by=id]\n  stopifnot(nrow(ends) == nrow(frames))\n}\nstopifnot(nrow(ends) == nrow(starts))\nstopifnot(all(ends$id == starts$id))\nstopifnot(min(as.numeric(names(table(exons[exonCount>1, exonCount])))) > 1)\n\nif (\"exonFrames\" %in% colnames(genes)) {\n  introns <- data.table(id=ends$id, start=starts$V1, end=ends$V1, frame=frames$V1)\n} else {\n  introns <- data.table(id=ends$id, start=starts$V1, end=ends$V1)\n}\nshort <- exons[!duplicated(id), .(id, geneSymbol, seqnames, strand, exonCount)]\nsetkey(introns, id)\nsetkey(short, id)\nintrons <- short[introns]\nintrons[, intronCount := exonCount - 1]\nintrons[, exonCount := NULL]\nintrons[, intronNum := ifelse(strand == \"+\", seq(.N), rev(seq(.N))), by=id]\n\n## make the inter-genic trackk\n#ro <- roverlaps(genes, genes)\n#ro[,max(end), by=query.id]$V1\n#setkey(genes, seqnames, start)\n#starts <- genes[,end[seq(2,.N)], by=seqnames]$V1\n#ends   <- genes[,start[seq(1,.N-1)], by=seqnames]$V1\n\n## read in file\nwrite(\"...reading VCF file\\n\", stderr())\nif (grepl(\"gz$\", opt$input)) {\n  print(paste(\"gunzip -c\", opt$input, \"| grep -v ^#\"))\n  vcf <- data.table::fread(cmd=paste(\"gunzip -c\", opt$input, \"| grep -v ^#\"), sep=\"\\t\")\n} else {\n  vcf <- data.table::fread(cmd=paste(\"grep -v ^#\", opt$input), sep=\"\\t\")\n}\n\nsetnames(vcf, paste0(\"V\", seq(9)), c(\"seqnames\",\"start\",\"id\",\"ref\",\"alt\",\"qual\",\"filter\",\"info\",\"geno\"))\n\n## bail early if nothing found\nif (nrow(vcf) == 0) {\n  write(\"No rearrangements found\\n\", stderr())\n  quit(status=0)\n} else {\n  write(paste(\"Found\", nrow(vcf), \"rearrangements\\n\"), stderr())\n}\n\n## grl.ix is unique ID for each rearrangement\n## grl.iix is either 1 or 2 (for each side of the rearrangement)\nvcf[, grl.ix  := gsub(\"([0-9]+):[0-9]\",\"\\\\1\",id)]\nvcf[, grl.iix := as.numeric(gsub(\"[0-9]+:([0-9])\",\"\\\\1\",id))]\n\n## set the strand info for BND format\nvcf[grepl(\"SVTYPE=BND\", info), strand := ifelse(grepl(\"^\\\\[\", alt) | grepl(\"^\\\\]\", alt), '-', '+')]\nvcf[, inv := strand[1] == strand[2], by=grl.ix]\nvcf[, altstrand := rev(strand), by=grl.ix]\nvcf[, altpos := as.integer(gsub(\".*?:([0-9]+).*\", \"\\\\1\", alt))]\nvcf[, altchr := gsub(\".*?(\\\\[|\\\\])(.*?):([0-9]+).*\", \"\\\\2\", alt)]\nvcf[, span := ifelse(seqnames==altchr, abs(start - altpos), -1)]\n\n## annotate with gene overlaps\nro <- roverlaps::roverlaps(vcf, genes)\nro[, geneSymbol := genes$geneSymbol[subject.id]]\nro[, geneSymbol := paste(unique(geneSymbol), collapse=\"_\"), by=query.id]\nro[, geneTranscriptCount := genes$numTranscriptAnnotations[subject.id]]\nro[, geneStrand := genes$strand[subject.id]]\nvcf[ro$query.id, geneSymbol := ro$geneSymbol]\nvcf[ro$query.id, geneStrand := ro$geneStrand]\nvcf[, geneSymbolAlt := geneSymbol[rev(grl.iix)], by=grl.ix]\nvcf[, geneStrandAlt := geneStrand[rev(grl.iix)], by=grl.ix]\nvcf[ro$query.id, geneTranscriptCount := ro$geneTranscriptCount]\n\n## annotate with genes within 20kb\nPAD <- 20e3\ngenes20 <- data.table::copy(genes)\ngenes20[, start := start - PAD/2]\ngenes20[, end   := end + PAD/2]\n\nro <- roverlaps::roverlaps(vcf, genes20)\nro[, geneSymbol20kb := genes$geneSymbol[subject.id]]\nro[, geneSymbol20kb := paste(unique(geneSymbol20kb), collapse=\"_\"), by=query.id]\nvcf[ro$query.id, geneSymbol20kb := ro$geneSymbol20kb]\nvcf[, geneSymbol20kbAlt := geneSymbol20kb[rev(grl.iix)], by=grl.ix]\n\n## overlap introns\nro <- roverlaps::roverlaps(vcf, introns)\nro[, intronNum  := introns$intronNum[subject.id]]\nro[, intronGene := introns$geneSymbol[subject.id]]\nro[, intronStart := ifelse(introns$strand[subject.id] == \"+\", introns$start[subject.id], introns$end[subject.id])]\nro[, intronGene := paste(unique(intronGene), collapse=\"_\"), by=query.id]\nvcf[ro$query.id, intronGene := ro$intronGene]\nvcf[ro$query.id, intronNum := ro$intronNum]\nvcf[ro$query.id, intronStart := ro$intronStart]\nvcf[, intronGeneAlt := intronGene[rev(grl.iix)], by=grl.ix]\nvcf[, intronNumAlt := intronNum[rev(grl.iix)], by=grl.ix]\nvcf[, intronBpsIn  := abs(intronStart - start)]\nif (\"frame\" %in% colnames(introns)) {\n  ro[, cdsFrame := introns$frame[subject.id]]\n  vcf[ro$query.id, cdsFrame  := ro$cdsFrame]\n}\nvcf[!is.na(intronNum), bk_msg := paste(intronBpsIn, \"bp_into_intron\", intronNum, \"of\", intronGene, sep=\"_\")]\n\n## overlap exons\nro <- roverlaps(vcf, exons)\nro[, exonNum  := exons$exonNum[subject.id]]\nro[, exonGene := exons$geneSymbol[subject.id]]\nro[, exonStart := ifelse(exons$strand[subject.id] == \"+\", exons$start[subject.id], exons$end[subject.id])]\nro[, exonGene := paste(unique(exonGene), collapse=\"_\"), by=query.id]\nvcf[ro$query.id, exonGene := ro$exonGene]\nvcf[ro$query.id, exonNum := ro$exonNum]\nvcf[ro$query.id, exonStart := ro$exonStart]\nvcf[, exonGeneAlt := exonGene[rev(grl.iix)], by=grl.ix]\nvcf[, exonNumAlt := exonNum[rev(grl.iix)], by=grl.ix]\nvcf[, exonBpsIn  := abs(exonStart - start)]\nvcf[!is.na(exonNum), bk_msg := paste(exonBpsIn, \"bp_into_exon\", exonNum, \"of\", exonGene, sep=\"_\")]\n\n## annotate fusions\nvcf[, fusion := {\n  f <- sum(grepl(\"intron|exon\", bk_msg)) == 2 && (geneSymbol[1] != geneSymbol[2]);\n  if (is.na(f)) { FALSE } else { f }\n} , by = grl.ix]\nvcf[, sense  :=\n      all(geneStrand != \"\") &&\n      ((geneStrand[1] == geneStrand[2] && strand[1] != strand[2]) || (strand[1] != strand[2] && geneStrand[1] == geneStrand[2])),\n    by = grl.ix]\n\n## DECIDE WHICH PIECE IS \"first\" in the fusion gene (where Tx starts)\n## RAR_STRAND        GENE_STRAND\n## ++ or --          must be +- or -+. Starts on +\n## +- or --          msut be -- or ++. Starts on side where gstrand == rarstrand\nif (any(vcf$fusion)) {\nvcf[vcf$fusion, gorder := {\n\n  mk <- c(NA,NA)\n  ## inversion\n  if (strand[1] == strand[2]) {\n    if (geneStrand[1] == '+')\n      mk <- c(2,1)\n    else\n      mk <- c(1,2)\n  }\n\n  ## non type\n  if (geneStrand[1] == geneStrand[1])\n    mk <- c(1,2)\n  else\n    mk <- c(2,1)\n\n  mk\n\n}, by=grl.ix]\n} else {\n  vcf[, gorder := 1] ##dummy\n}\n\n## decide if in frame\nif (\"cdsFrame\" %in% colnames(vcf)) {\n  vcf[, in_frame := {\n    f = (cdsFrame[gorder[2]] - cdsFrame[gorder[1]]);\n    xbases <- 0; ##xbases <- nchar(INSERTION[1]) - nchar(HOMSEQ[1]);\n\n    if (is.na(f[1]))\n      FALSE\n    else if (all(grepl('intron', bk_msg)) && sense[1]) ## intron to intron\n      f == 0\n    else\n      f + xbases %% 3 == 0\n  }, by=grl.ix]\n\n  ## make the fusion messages\n  vcf[, in_frame_fusion := in_frame && fusion && sense, by=grl.ix]\n  vcf[vcf$in_frame_fusion, msg := paste(\"In-frame sense fusion from:\", bk_msg[gorder[1]], \"to\", bk_msg[gorder[2]]), by=grl.ix]\n  vcf[!vcf$in_frame_fusion & vcf$fusion & vcf$sense, msg := paste(\"Out-of-frame sense fusion between:\", bk_msg[1], \"and\", bk_msg[2]), by=grl.ix]\n  vcf[!vcf$sense, msg := paste(\"Anti-sense fusion between:\", bk_msg[1], \"and\", bk_msg[2]), by=grl.ix]\n}\n\nvcf[, c(\"fusion\",\"gorder\") := NULL]\n\n## writing to stdout\nwrite.table(vcf[,.(seqnames, start, start, altchr, altpos, altpos, strand, altstrand, id, ref, alt, qual, filter, info, grl.ix, grl.iix, span, geneSymbol, geneStrand, geneSymbol20kb, intronGene, intronNum, bk_msg, exonGene, exonNum, in_frame, in_frame_fusion, msg)],\n            row.names=FALSE, col.names=TRUE, quote=FALSE, sep=\"\\t\", file=stdout())\n\n## ##llr$bk_msg[!grepl(\"intron|exon\", llr$bk_msg)] <- \"\"\n## write(\"...annotating intergenic\")\n## fo <- gr.findoverlaps(llr, gene.comp)\n## if (nrow(fo)) {\n##   fo[, left  := gene.comp$left[subject.id],  by=query.id]\n##   fo[, right := gene.comp$right[subject.id], by=query.id]\n##   fo[, right_start  := end(gene.comp)[subject.id], by=subject.id]\n##   fo[, left_end := start(gene.comp)[subject.id], by=subject.id]\n##   fo[, left_dist  := start - left_end, by=query.id]\n##   fo[, right_dist := right_start - end, by=query.id]\n##   fo[, mmm := paste(left_dist, \"bp to right of\", left, \"and\", right_dist, \"bp to left of\", right)]\n##   llr$msg[!nchar(llr$msg)] <- \"\"\n##   llr$bk_msg[fo$query.id] <- ifelse(!nchar(llr$bk_msg[fo$query.id]), fo$mmm, llr$bk_msg[fo$query.id])\n## }\n\n## ############## make the circos plot\n## write(\"...making Circos plot\")\n## library(RCircos)\n## data(UCSC.HG19.Human.CytoBandIdeogram);\n## chr.exclude <- NULL;\n## cyto.info <- UCSC.HG19.Human.CytoBandIdeogram;\n## tracks.inside <- 10;\n## tracks.outside <- 0;\n## RCircos.Set.Core.Components(cyto.info, chr.exclude, tracks.inside, tracks.outside);\n\n## ## get the gene label dat\n## #genes <- genes[width(genes) < 2e6]\n## #fo1 <- gr.findoverlaps(gr1+10e3, genes)\n## #fo2 <- gr.findoverlaps(gr2+10e3, genes)\n\n## ## annoying bug with seqinfo clash on 'c'\n## #if (length(fo1) && length(fo2)) {\n## #  fo <- c(fo1,fo2)\n## #} else if (length(fo1)) {\n## #  fo <- fo1\n## #} else {\n## #  fo <- fo2\n## #}\n\n## write(\"...constructing Circos plot\")\n\n## ## set the gene labels\n## gene.dat <- data.frame(Chromsome=c(dt.bks$chr1, dt.bks$chr2), chromStart=c(dt.bks$pos1, dt.bks$pos2),\n##                        chromEnd=c(dt.bks$pos1,dt.bks$pos2), Gene=as.character(c(dt.bks$gene1, dt.bks$gene2)),\n##                        stringsAsFactors=FALSE)\n## if (nrow(gene.dat))\n##   gene.dat <- gene.dat[nchar(gene.dat$Gene) > 0,]\n## if (nrow(gene.dat))\n##   gene.dat <- gene.dat[!duplicated(gene.dat$Gene),]\n\n## links = data.frame()\n## if (length(bks))\n##   links = with(dt.bks, data.frame(Chromosome=chr1, chromStart=pos1, chromEnd=pos1, Chromsome.1=chr2, chromStart.1=pos2, chromEnd.1=pos2))\n\n## ## plot the PDF\n## pdf(file=paste0(opt$output,\".pdf\"), height=opt$height, width=opt$width, compress=TRUE);\n## RCircos.Set.Plot.Area();\n## RCircos.Chromosome.Ideogram.Plot();\n## if (opt$genes != 0 && nrow(gene.dat) > 0) {\n##   track.num <- 1\n##   RCircos.Gene.Connector.Plot(gene.dat, track.num, \"in\");\n##   track.num <- 2;\n##   name.col <- 4;\n##   RCircos.Gene.Name.Plot(gene.dat, name.col, track.num, \"in\");\n## }\n## if (nrow(links) > 0) {\n##   track.num = 1\n##   RCircos.Link.Plot(links, track.num, by.chromosome=TRUE) ## by.chromosome is for color\n## }\n## dev.off()\n"
  },
  {
    "path": "R/archive_non_functional/svaba-asqg2pdf.R",
    "content": "#!/usr/bin/env Rscript\n\nlibrary(optparse)\n\noption_list = list(\n    make_option(c(\"-i\", \"--input\"),  type = \"character\", default = NULL,  help = \"Input asqg file from snowman run --write-asqg or sga\"),\n    make_option(c(\"-c\", \"--inputcc\"),  type = \"character\", default = NULL,  help = \"Input cc file from snowman run --write-asqg or sga\"),  \n    make_option(c(\"-o\", \"--output\"), type = \"character\", default = \"graph.pdf\",  help = \"Output pdf to write the graph\"),\n    make_option(c(\"-d\", \"--height\"), type = \"numeric\", default = 20,  help = \"Height\"),\n    make_option(c(\"-w\", \"--width\"), type = \"numeric\", default = 20,  help = \"Width\"),\n    make_option(c(\"-m\", \"--mincount\"), type = \"numeric\", default = 1,  help = \"Remove nodes with fewer than m components\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\nif (is.null(opt$input))\n  stop(print_help(parseobj))\n\nrequire(igraph)\nrequire(data.table)\n#opt$input =\"/xchip/gistic/Jeremiah/Projects/SnowmanPaper/Benchmark/150830/tmp.graph.after.asqg\"\n\nvert.file = paste(opt$input, \"vert\", sep=\".\")\n##reads.file = file.path(dir, 'plots', 'readsForR_som.txt')\n##reads <- import.snowman.reads(reads.file)\n\n#cont = 'c_8:43487254-43492254_11'\n##cont = 'c_8:43487254-43492254_0'\n##this_reads <- reads$rname[as.character(seqnames(reads)) %in% cont]\n\n## read the edges\nln= readLines(opt$input, n = 1000)\nnskip = sum(grepl('^VT|^HT',  ln))\ntab.e <- read.delim(opt$input, skip=nskip, strings=FALSE, header=FALSE, sep=\" \")\ntab.e$V1 <- substring(tab.e$V1, 4)\ncolnames(tab.e) <- c('seq1', 'seq2', 'overlap_start1', 'overlap_end1', 'len1',\n                   'overlap_start2', 'overlap_end2', 'len2', 'orientation', 'numdiff')\nedges <- data.frame(from=tab.e$seq1, to=tab.e$seq2)\n\n## read the verts\ncmd = paste(\"grep\", '\"VT\"', opt$input, \">\", vert.file)\nsystem(cmd)\ntab <- read.delim(vert.file, skip=0, strings=FALSE, header=FALSE, sep=\"\\t\")\nif (ncol(tab) == 4) {\n  colnames(tab) <- c(\"V\", \"rname\", 'seq', 'ss')\n} else if (ncol(tab) == 3) {\n  colnames(tab) <- c(\"V\", \"rname\", 'seq')\n}\nverts <- data.frame(verts=unique(c(as.character(tab$rname), as.character(edges$to), as.character(edges$from))))\n\ng <- graph.data.frame(edges, directed=FALSE, vertices=verts)\n\n## vert lengths\nvert.lens <- structure(nchar(tab$seq), names=tab$rname)\n\n## open the cc file\nif (file.info(opt$inputcc)$size > 0) {\n  cc <- fread(opt$inputcc)\n  cc$col <- sample(colors(), length(unique(cc$V2)))[match(cc$V2, unique(cc$V2))]\n  setkey(cc, col)\n  \n  V(g)$color = \"black\"\n  for (x in cc$col) {\n    V(g)$color[verts$verts %in% cc[x]$V1] <- x\n  }\n}\n\n## format the verts\nV(g)$names = paste(as.character(verts$verts), \"len:\", vert.lens[as.character(verts$verts)])\n\n##V(g)$color[V(g)$names %in% this_reads] <- 'red'\n\n## format the edges\nE(g)$lab <- tab.e$overlap_end2 - tab.e$overlap_start2\n\n## cluster\nV(g)$community <- membership(cl<-clusters(g))\ngood_communities <- which(cl$csize >= opt$mincount)\ng <- delete.vertices(g, V(g)[!community %in% good_communities])\n\npdf(opt$output, height=opt$height, width=opt$width)\nplot(g, vertex.color=V(g)$color, vertex.label=V(g)$names, edge.label=E(g)$lab, vertex.size=2)\ndev.off()\n\n"
  },
  {
    "path": "R/archive_non_functional/svaba-bam-qcplot.R",
    "content": "#!/usr/bin/env Rscript\n\nlibrary(optparse)\n\noption_list = list(\n    make_option(c(\"-i\", \"--input\"),  type = \"character\", default = \"qcreport.txt\",  help = \"Input txt file from a snowman preprocess qcreport.txt\"),\n    make_option(c(\"-o\", \"--output\"), type = \"character\", default = \"qcreport.pdf\",  help = \"Output pdf to generate\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\nif (is.null(opt$input))\n  stop(print_help(parseobj))\n\nif (!file.exists(opt$input)) {\n  print(print_help(parseobj))\n  stop(paste(\"Input file does not exist\", opt$input, \". Must supply path to valid qcreport.txt file (generated from snowman preprocess or snowman run\"))\n}\n\nprint(opt)\n\nrequire(ggplot2)\nrequire(reshape2)\nrequire(gridExtra)\n\n## read the table\ncon  <- file(opt$input, open = \"r\")\n\ndf.mapq <- df.nm <- df.isize <- df.as <- df.xp <- df.len <- df.phred <- df.clip <- data.frame()\nrg <- list()\n\nwhile (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {\n\n  ## found a new one\n  if (grepl(\"READGROUP\", line)) {\n    thisrg = gsub(\"READGROUP:BI:(.*)\", \"\\\\1\", line)\n    rg[[thisrg]] <- data.frame(readgroup = thisrg)\n  } else if (grepl(\"total\", line)) {\n    rg[[thisrg]]$total = as.numeric(gsub(\"total,([0-9]+)\", \"\\\\1\", line))\n  } else if (grepl(\"unmap\", line)) {\n    rg[[thisrg]]$unmap = as.numeric(gsub(\"unmap,([0-9]+)\", \"\\\\1\", line))\n  } else if (grepl(\"qcfail\", line)) {\n    rg[[thisrg]]$qcfail = as.numeric(gsub(\"qcfail,([0-9]+)\", \"\\\\1\", line))\n  } else if (grepl(\"duplicate\", line)) {\n    rg[[thisrg]]$duplicate = as.numeric(gsub(\"duplicate,([0-9]+)\", \"\\\\1\", line))\n  } else if (grepl(\"supplementary\", line)) {\n    rg[[thisrg]]$supp = as.numeric(gsub(\"supplementary,([0-9]+)\", \"\\\\1\", line))    \n  } else if (grepl(\"mapq\", line)) {\n    df.mapq <- rbind(df.mapq, as.numeric(strsplit(gsub(\"mapq,([0-9]+)\", \"\\\\1\", line), \",\")[[1]]))\n  } else if (grepl(\"nm\", line)) {\n    df.nm <- rbind(df.nm, as.numeric(strsplit(gsub(\"nm,([0-9]+)\", \"\\\\1\", line), \",\")[[1]]))\n  } else if (grepl(\"isize\", line)) {\n    df.isize <- rbind(df.isize, as.numeric(strsplit(gsub(\"isize,([0-9]+)\", \"\\\\1\", line), \",\")[[1]]))\n  } else if (grepl(\"as\", line)) {\n    df.as <- rbind(df.as, as.numeric(strsplit(gsub(\"as,([0-9]+)\", \"\\\\1\", line), \",\")[[1]]))\n  } else if (grepl(\"xp\", line)) {\n    df.xp <- rbind(df.xp, as.numeric(strsplit(gsub(\"xp,([0-9]+)\", \"\\\\1\", line), \",\")[[1]]))\n  } else if (grepl(\"clip\", line)) {\n    df.clip <- rbind(df.clip, as.numeric(strsplit(gsub(\"clip,([0-9]+)\", \"\\\\1\", line), \",\")[[1]]))\n  } else if (grepl(\"len\", line)) {\n    df.len <- rbind(df.len, as.numeric(strsplit(gsub(\"len,([0-9]+)\", \"\\\\1\", line), \",\")[[1]]))\n  } else if (grepl(\"phred\", line)) {\n    df.phred <- rbind(df.phred, as.numeric(strsplit(gsub(\"phred,([0-9]+)\", \"\\\\1\", line), \",\")[[1]]))\n  } else {\n    stop(paste(\"Failed to read file at line:\", line))\n  }\n  \n}\n\nclose(con)\n\ncolnames(df.mapq) <- seq(from=0,to=60)\ncolnames(df.nm) <- seq(from=0,to=ncol(df.nm)-1)\ncolnames(df.isize) <- seq(from=0,to=ncol(df.isize)-1)\ncolnames(df.xp) <- seq(from=0, to=ncol(df.xp)-1)\ncolnames(df.as) <- seq(from=0, to=ncol(df.as)-1)\ncolnames(df.len) <- seq(from=0, to=ncol(df.len)-1)\ncolnames(df.phred) <- seq(from=0, to=ncol(df.phred)-1)\ncolnames(df.clip) <- seq(from=0, to=ncol(df.clip)-1)\nreadg <- sapply(rg, function(x) x$readgroup)\n\ndf.mapq$readgroup  <- readg\ndf.nm$readgroup    <- readg\ndf.isize$readgroup <- readg\ndf.xp$readgroup    <- readg\ndf.as$readgroup    <- readg\ndf.phred$readgroup <- readg\ndf.len$readgroup   <- readg\ndf.clip$readgroup  <- readg\n\ng.mapq  <- ggplot(df.mapq.m  <- melt(df.mapq, id='readgroup'),  aes(x=as.numeric(variable), y=pmax(log(value,10),0), group=readgroup, color=readgroup)) + geom_line() + theme_bw() + scale_x_continuous(limits=c(30,61))    + ylab('Reads') + xlab('Mapping Quality') + scale_y_continuous(breaks=seq(0,8), labels=parse(text=paste('10', seq(0,8), sep='^'))) + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9))\ng.nm    <- ggplot(df.nm.m    <- melt(df.nm, id='readgroup'),    aes(x=as.numeric(variable), y=pmax(log(value,10),0), group=readgroup, color=readgroup)) + geom_line() + theme_bw() + scale_x_continuous(limits=c(0,50))     + ylab('Reads') + xlab('NM Tag') + scale_y_continuous(breaks=seq(0,8), labels=parse(text=paste('10', seq(0,8), sep='^'))) + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9))\ng.isize <- ggplot(df.isize.m <- melt(df.isize, id='readgroup'), aes(x=as.numeric(variable), y=pmax(log(value,10),0), group=readgroup, color=readgroup)) + geom_line() + theme_bw() + scale_x_continuous(limits=c(10,2001))  + ylab('Reads') + xlab('InsertSize') + scale_y_continuous(breaks=seq(0,8), labels=parse(text=paste('10', seq(0,8), sep='^'))) + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9))\ng.xp    <- ggplot(df.xp.m    <- melt(df.xp, id='readgroup'),    aes(x=as.numeric(variable), y=pmax(log(value,10),0), group=readgroup, color=readgroup)) + geom_line() + theme_bw() + scale_x_continuous(limits=c(0,100))    + ylab('Reads') + xlab('XP Tag') + scale_y_continuous(breaks=seq(0,8), labels=parse(text=paste('10', seq(0,8), sep='^'))) + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9))\ng.as    <- ggplot(df.as.m    <- melt(df.as, id='readgroup'),    aes(x=as.numeric(variable), y=pmax(log(value,10),0), group=readgroup, color=readgroup)) + geom_line() + theme_bw() + scale_x_continuous(limits=c(0,100))    + ylab('Reads') + xlab('AS Tag') + scale_y_continuous(breaks=seq(0,8), labels=parse(text=paste('10', seq(0,8), sep='^'))) + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9))\ng.len   <- ggplot(df.len.m   <- melt(df.len, id='readgroup'),   aes(x=as.numeric(variable), y=pmax(log(value,10),0), group=readgroup, color=readgroup)) + geom_line() + theme_bw() + scale_x_continuous(limits=c(20,102))   + ylab('Reads') + xlab('Read Length') + scale_y_continuous(breaks=seq(0,8), labels=parse(text=paste('10', seq(0,8), sep='^'))) + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9))\ng.clip  <- ggplot(df.clip.m  <- melt(df.clip, id='readgroup'),  aes(x=as.numeric(variable), y=pmax(log(value,10),0), group=readgroup, color=readgroup)) + geom_line() + theme_bw() + scale_x_continuous(limits=c(0,85))     + ylab('Reads') + xlab('Clipped bases') + scale_y_continuous(breaks=seq(0,8), labels=parse(text=paste('10', seq(0,8), sep='^'))) + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9))\ng.phred <- ggplot(df.phred.m <- melt(df.phred, id='readgroup'), aes(x=as.numeric(variable), y=pmax(log(value,10),0), group=readgroup, color=readgroup)) + geom_line() + theme_bw() + scale_x_continuous(limits=c(0,43))     + ylab('Reads') + xlab('Mean read Phred quality') + scale_y_continuous(breaks=seq(0,8), labels=parse(text=paste('10', seq(0,8), sep='^'))) + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9))\n\ndf.isize.m$variable <- as.numeric(as.character(df.isize.m$variable))\ndf.disco <- df.isize.m[df.isize.m$variable > 0 & df.isize.m$variable < 800, ]\ng.isize <- ggplot(df.disco, aes(x=variable, y=value, color=readgroup)) + geom_line() + theme_bw() + ylab('Reads') + xlab('Insert Size') + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9))\n\n## get percentages\n# disc, proper\ndf.disc.pie <- data.frame(rbind(rowSums(df.isize[, (800+1):(2000+1)]), rowSums(df.isize[, 1:800])), class=c(\"\\\"Discordant\\\" (I > 800)\", \"\\\"Proper\\\"(I < 800)\"))\ncolnames(df.disc.pie) <- c(as.character(levels(readg)), \"Class\")\ndf.disc.pie.m <- melt(df.disc.pie, id='Class')\ng.disc.pie <- ggplot(df.disc.pie.m, aes(x=factor(1), y=value, fill=Class)) + geom_bar(stat='identity', position=\"fill\") + facet_wrap( ~ variable) + coord_polar(theta=\"y\") + xlab(\"\") + ylab(\"\")  + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9), legend.position=\"bottom\")\n\ndf.clip.pie <- data.frame(rbind(rowSums(df.clip[, 6:102]), rowSums(df.clip[, 1:5])), class=c(\"\\\"Clipped\\\" (clip >= 5)\", \"\\\"Matched\\\"(clip < 5)\"))\ncolnames(df.clip.pie) <- c(as.character(levels(readg)), \"Class\")\ndf.clip.pie.m <- melt(df.clip.pie, id='Class')\ng.clip.pie <- ggplot(df.clip.pie.m, aes(x=factor(1), y=value, fill=Class)) + geom_bar(stat='identity', position=\"fill\") + facet_wrap( ~ variable) + coord_polar(theta=\"y\") + xlab(\"\") + ylab(\"\")  + theme(legend.text = element_text(size=6), legend.title = element_text(size=6), text = element_text(size=9), legend.position=\"bottom\")\n\npdf(opt$output, width=22, height=12)\nprint(grid.arrange(g.mapq, g.nm, g.isize, g.len, g.clip, g.phred, g.disc.pie, g.clip.pie, ncol=3))\ndev.off()\n\n"
  },
  {
    "path": "R/archive_non_functional/svaba-benchmark.R",
    "content": "#!/use/bin/env/ Rscript\n\nrequire(ggplot2)\nrequire(data.table)\n\n.libPaths = c(\"/xchip/gistic/Jeremiah/R\", \"/broad/software/free/Linux/redhat_6_x86_64/pkgs/r_3.1.1-bioconductor-3.0/lib64/R/library\")\n\nlibrary(optparse)\n\nAVAIL_MODES <- c(\"realign-test\")\n\noption_list = list(\n  make_option(c(\"-i\", \"--input\"),  type = \"character\", default = NULL,  help = \"Input SV VCF file\"),\n  make_option(c(\"-o\", \"--output\"), type = \"character\", default = \"no_id\",  help = \"Output annotation name\"),\n  make_option(c(\"-m\", \"--mode\"), type = \"character\", default = \"realign-test\",  help = \"Benchmarking mode to analyze\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\nif (is.null(opt$input))\n  stop(print_help(parseobj))\n\n\nif (!opt$mode %in% AVAIL_MODES)\n  stop(paste(\"Mode\", opt$mode, \"must be one of\", paste(AVAIL_MODES, collapse=\", \")))\n\n.format_flag_df <- function(dfh2) {\n  dfh2 <- data.table(dfh[dfh$del_size == \"0\" & dfh$snv_rate == \"0\" & dfh$ins_size != \"0\", ])\n  dfh2$index = seq(nrow(dfh2))\n  dfh2[, total := sum(c(wrong_align, too_align, no_align, correct)), by=index]\n  dfh2 = data.frame(dfh2)\n  dfh2[, c(\"no_align\", \"wrong_align\", \"too_align\",\"correct\")] = sweep(dfh2[, c('no_align', 'wrong_align', 'too_align', 'correct')], 1, dfh2$total, \"/\")\n  dfh2 <- melt(dfh2, id.vars=c(\"width\",\"ins_size\", \"del_size\", \"snv_rate\", \"total\", \"index\"))\n  return (dfh2)\n}\n\n\n\nif (opt$mode == \"realign-test\") {\n\n  ff <- fread(opt$input, header=TRUE)\n\n  df <- data.frame();\n  dfh <- data.frame();\n  for (j in unique(ff$width)) {\n    for (k in unique(ff$snv_rate)) {\n      for (d in unique(ff$del_size)) {\n        for (ii in unique(ff$ins_size)) {\n          #ii = ifelse(d == 0, 0, ii) ## if del is zero, then make ins zero too, since just want to evaluate zeros\n          #d  = ifelse(ii == 0, 0, d) ## if ins is zero, then make del zero too, since we just want to evaulate zeros\n          if (ii == 0 || d == 0) {\n            ix  <- ff$width == j & ff$snv_rate == k & ff$ins_size == d & ff$del_size == ii\n            if (sum(ix)) {\n              cf <- ecdf(ff$num_align[ix])\n              s <- seq(0,max(ff$num_align))\n              df <- rbind(df, data.frame(num_align=s, cdf=cf(s), width=as.character(j), snv_rate=as.character(k), del_size = as.character(d), ins_size=as.character(ii), one.x = 0, one.y = cf(1)))\n\n              dfh <- rbind(dfh, data.frame(no_align=sum(ix & ff$num_align == 0),\n                                           wrong_align=sum(ix & ff$correct_hit_num == -1 & ff$num_align == 1),\n                                           too_align=sum(ix & ff$num_align > 1),\n                                           correct=sum(ix & ff$correct_hit_num == 0),\n                                           width=as.character(j),\n                                           del_size = as.character(d),\n                                           ins_size = as.character(ii),\n                                           snv_rate = as.character(k)))\n            }\n          }\n        }\n      }\n    }\n  }\n\n  ## SNV ONLY\n  df2 <- df[df$ins_size == \"0\" & df$del_size == \"0\", ]\n  g <- ggplot(data=df2) + geom_line(aes(x=num_align, y=cdf, color=width)) + geom_point(aes(x=one.x, y=one.y, color=width)) +  theme_bw() + xlab(\"Number of alignments\") + ylab(\"CDF\") + facet_wrap(~ snv_rate, nrow=1) + scale_y_continuous(limits=c(min(df2$one.y)-0.1,1), breaks=seq(0,1,by=0.05)) + labs(color=\"Sequence Length\")\n  pdf(\"~/public_html/realign_test_snv_cigcheck.pdf\", width=7, height=2)\n  print(g)\n  dev.off()\n\n  ## DEL ONLY\n  df2 <- df[df$ins_size == \"0\" & df$snv_rate == \"0\", ]\n  g <- ggplot(data=df2) + geom_line(aes(x=num_align, y=cdf, color=width)) + geom_point(aes(x=one.x, y=one.y, color=width)) +  theme_bw() + xlab(\"Number of alignments\") + ylab(\"CDF\") + facet_wrap(~ del_size, nrow=1) + scale_y_continuous(limits=c(min(df2$one.y)-0.1,1), breaks=seq(0,1,by=0.2)) + labs(color=\"Sequence Length\")\n  pdf(\"~/public_html/realign_test_del_cigcheck.pdf\", width=7, height=2)\n  print(g)\n  dev.off()\n\n  ## INS ONLY\n  df2 <- df[df$del_size == \"0\" & df$snv_rate == \"0\" & df$ins_size != \"0\", ]\n  g <- ggplot(data=df2) + geom_line(aes(x=num_align, y=cdf, color=width)) + geom_point(aes(x=one.x, y=one.y, color=width)) +  theme_bw() + xlab(\"Number of alignments\") + ylab(\"CDF\") + facet_wrap(~ ins_size, nrow=1) + scale_y_continuous(limits=c(min(df2$one.y)-0.1,1), breaks=seq(0,1,by=0.2)) + labs(color=\"Sequence Length\")\n  pdf(\"~/public_html/realign_test_ins_cigcheck.pdf\", width=7, height=2); print(g); dev.off()\n  dfh2 <- .format_flag_df(df2)\n  g2 <- ggplot(data=dfh2,aes(x=factor(width),y=value,fill=factor(variable))) + geom_bar(position=\"stack\", stat='identity') + facet_wrap(~ ins_size, nrow=1) + scale_fill_manual(values=c(\"no_align\"=\"black\", \"wrong_align\"=\"red\", \"too_align\"=\"purple\",\"correct\"=\"dark green\"), labels=c(\"Unmapped\", \"Incorrect alignment\", \"> 1 alignment\", \"Accurate\"), name=\"Alignment\") + scale_y_continuous(breaks=seq(0,1,by=0.25), labels=c(\"0\", \"25\", \"50\", \"75\", \"100\"), name=\"Percentage\") + xlab(\"Sequence Length\")\n  pdf(\"~/public_html/realign_ins_flag.pdf\", width=7, height=2); print(g2); dev.off()\n \n  #g <- ggplot(data=ff) + geom_histogram(aes(x=num_aligns)) + scale_y_log10(limits=c(1, 10)) + theme_bw()\n\n  pdf(\"~/public_html/realign_test.pdf\", width=7, height=7)\n  print(g)\n  dev.off()\n}\n\n\nif (FALSE) {\n\nsnow <- ra_breaks(\"/xchip/gistic/Jeremiah/Projects/SnowmanPaper/Benchmark/snow2/chr1.broad-snowman.DATECODE.somatic.sv.vcf\")\n\nsimd <- fread(\"/xchip/gistic/Jeremiah/Projects/SnowmanPaper/Benchmark/connections.tsv\")\ngr.sim <- with(simd, GRanges(c(V1,V1)+1, IRanges(c(V2,V4), width=1), strand=ifelse(c(V3, V5)=='+', '+', '-'), id=rep(seq(nrow(simd)),each=2)))\ngrl.sim <- split(gr.sim, gr.sim$id)\n\nra.overlaps(snow, grl.sim, pad=10, ignore.strand=TRUE)\n\n## read it\ndt <- fread(\"/xchip/gistic/Jeremiah/Projects/SnowmanPaper/150805benchmark.csv\") \ndt [, mean_cc := mean(contig_coverage), by=c('kmer_corr', 'coverage', 'error_rate')]\ndt [, se_cc := sd(contig_coverage), by=c('kmer_corr', 'coverage', 'error_rate')]\nsetkey(dt, kmer_corr, coverage, error_rate)\ndt <- unique(dt)\n\ndt <- readRDS(\"/xchip/gistic/Jeremiah/tracks/100map.dt.rds\")\n\n## relabel names\nen <- c(\"0\"=\"Error Rate: 0\", \"0.001\"=\"Error Rate: 1e-3\", \"0.005\"=\"Error Rate 5e-3\",\n        \"0.01\"=\"Error Rate: 0.01\", \"0.03\"=\"Error Rate: 0.03\", \"0.05\"=\"Error Rate: 0.05\", \"0.1\"=\"Error Rate: 0.1\")\n.labeller <- function(variable,value){\n    return(en[value])\n  }\n\n## plot it\ndf = data.frame(dt)\ndf$error_rate = as.character(df$error_rate)\ndf$kmer_corr = factor(df$kmer_corr, levels=c(0,1))\ng <- ggplot(df) + geom_line(aes(x=coverage, y=mean_cc, color=kmer_corr), size=1) +\n  geom_errorbar(aes(x=coverage,ymin=mean_cc-se_cc, ymax=mean_cc+se_cc, color=kmer_corr), width=1) +\n  theme_bw() + xlab(\"Coverage\") + ylab(\"Percent Re-assembled\") +\n  scale_x_continuous(breaks=seq(0,40,by=5)) + facet_grid(error_rate ~ ., labeller=.labeller) +\n  coord_cartesian(ylim=c(0,1.3)) +\n  scale_y_continuous(breaks=seq(0,1,by=0.25))\npdf(\"~/public_html/plot.pdf\", width=6, height=12); print(g); dev.off()\n\n\n}\n"
  },
  {
    "path": "R/archive_non_functional/svaba-bps-to-maflite.R",
    "content": "#!/usr/bin/env Rscript\n\nlibrary(optparse)\nsuppressMessages(suppressWarnings(require(VariantAnnotation, quietly=TRUE)))\n\noption_list = list(\n    make_option(c(\"-i\", \"--input\"),  type = \"character\", default = NULL,  help = \"Input bps.txt.gz file\"),\n    make_option(c(\"-o\", \"--output\"), type = \"character\", default = \"graph.pdf\",  help = \"Output MAFLITE\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\nif (is.null(opt$input))\n  stop(print_help(parseobj))\n\nv <- readVcf(opt$input, \"hg19\")\ninf <- info(v)\ngr <- rowData(v)\n\n## remove non indel lines\ngr <- gr[inf$EVDNC==\"INDEL\",]\ninf <- inf[inf$EVDNC==\"INDEL\",]\n\n## remove unnecesry columns\n#tab <- data.frame(chr=as.character(seqnames(gr)), startr=start(gr), endr=end(gr), ref=gr$REF, alt=gr$ALT)\ntab <- data.frame(chr=as.character(seqnames(gr)), startr=start(gr), end=end(gr), ref=as.character(gr$REF), alt=as.character(gr$ALT), stringsAsFactors=FALSE)\ndel = sapply(tab$ref, nchar)  > sapply(tab$alt, nchar)\nins = sapply(tab$ref, nchar)  < sapply(tab$alt, nchar)\n\ntab$alt[ins] <- inf$INSERTION[ins]\ntab$ref[del] <- sapply(tab$ref[del], function(x) substr(x, 2, nchar(x)))\n\ntab$alt[del] = \"-\"\ntab$ref[ins] = \"-\"\n\ntab <- cbind(tab, inf[, c(\"SCTG\", \"SPAN\", \"MAPQ\", \"TSPLIT\", \"NSPLIT\")])\nwriteLines(tab, opt$output)\n"
  },
  {
    "path": "R/archive_non_functional/svaba-circos.R",
    "content": "#!/usr/bin/env Rscript\n\n## set the right library paths\n.libPaths = c(\"/xchip/gistic/Jeremiah/R\", \"/broad/software/free/Linux/redhat_6_x86_64/pkgs/r_3.1.1-bioconductor-3.0/lib64/R/library\")\n\nrequire(data.table)\nra_breaks <-\nfunction(rafile, keep.features = T, seqlengths = hg_seqlengths(), chr.convert = T, snowman = FALSE,  breakpointer = FALSE, seqlevels = NULL,\n    get.loose = FALSE ## if TRUE will return a list with fields $junctions and $loose.ends\n  )\n  {\n      if (is.character(rafile))\n          {\n              if (grepl('(vcf$)|(vcf.gz$)', rafile))\n                  {\n                      library(VariantAnnotation)\n                      vcf = readVcf(rafile, Seqinfo(seqnames = names(seqlengths), seqlengths = seqlengths))\n                      if (!('SVTYPE' %in% names(info(vcf)))) {\n                        warning('Vcf not in proper format.  Is this a rearrangement vcf?')\n                          return(GRangesList());\n                        }\n                      \n                      vgr = rowData(vcf) ## parse BND format\n\n                      ## no events\n                      if (length(vgr) == 0)\n                        return (GRangesList())\n\n                      ## fix mateids if not included\n                      if (!\"MATEID\"%in%colnames(mcols(vgr))) {\n                        nm <- vgr$MATEID <- names(vgr)\n                        ix <- grepl(\"1$\",nm)\n                        vgr$MATEID[ix] = gsub(\"(.*?)(1)$\", \"\\\\12\", nm[ix])\n                        vgr$MATEID[!ix] = gsub(\"(.*?)(2)$\", \"\\\\11\", nm[!ix])\n                        vgr$SVTYPE=\"BND\"\n                      }\n                      \n                      if (!any(c(\"MATEID\", \"SVTYPE\") %in% colnames(mcols(vgr))))\n                        stop(\"MATEID or SVTYPE not included. Required\")\n                      vgr$mateid = info(vcf)$MATEID\n                      vgr$svtype = info(vcf)$SVTYPE\n\n                      if (!is.null(info(vcf)$SCTG))\n                          vgr$SCTG = info(vcf)$SCTG\n                      \n                      if (sum(vgr$svtype == 'BND')==0)\n                          stop('Vcf not in proper format.  Will only process rearrangements in BND format')\n\n                      if (!all(vgr$svtype == 'BND'))\n                          warning(sprintf('%s rows of vcf do not have svtype BND, ignoring these'), sum(vgr$svtype != 'BND'))\n\n                      bix = which(vgr$svtype == \"BND\")\n                      vgr = vgr[bix]\n                      vgr$first = !grepl('^(\\\\]|\\\\[)', vgr$ALT) ## ? is this row the \"first breakend\" in the ALT string (i.e. does the ALT string not begin with a bracket)\n                      vgr$right = grepl('\\\\[', vgr$ALT) ## ? are the (sharp ends) of the brackets facing right or left\n                      vgr$coord = as.character(paste(seqnames(vgr), ':', start(vgr), sep = ''))\n                      vgr$mcoord = as.character(gsub('.*(\\\\[|\\\\])(.*\\\\:.*)(\\\\[|\\\\]).*', '\\\\2', vgr$ALT))\n                      vgr$mcoord = gsub('chr', '', vgr$mcoord)\n\n                      if (all(is.na(vgr$mateid)))\n                          if (!is.null(names(vgr)) & !any(duplicated(names(vgr))))\n                              {\n                                  warning('MATEID tag missing, guessing BND partner by parsing names of vgr')\n                                  vgr$mateid = paste(gsub('::\\\\d$', '', names(vgr)), (sapply(strsplit(names(vgr), '\\\\:\\\\:'), function(x) as.numeric(x[length(x)])))%%2 + 1, sep = '::')\n                              }\n                          else if (!is.null(vgr$SCTG))\n                              {\n                                  warning('MATEID tag missing, guessing BND partner from coordinates and SCTG')\n                                  require(igraph)\n                                  ucoord = unique(c(vgr$coord, vgr$mcoord))\n                                  vgr$mateid = paste(vgr$SCTG, vgr$mcoord, sep = '_')\n\n                                  if (any(duplicated(vgr$mateid)))\n                                      {\n                                          warning('DOUBLE WARNING! inferred mateids not unique, check VCF')\n                                          bix = bix[!duplicated(vgr$mateid)]\n                                          vgr = vgr[!duplicated(vgr$mateid)]\n                                      }\n                              }\n                          else\n                              stop('MATEID tag missing')\n\n                      vgr$mix = as.numeric(match(vgr$mateid, names(vgr)))\n\n                      pix = which(!is.na(vgr$mix))\n\n                      vgr.pair = vgr[pix]\n\n                      if (length(vgr.pair)==0)\n                          stop('No mates found despite nonzero number of BND rows in VCF')\n                      vgr.pair$mix = match(vgr.pair$mix, pix)\n                      vix = which(1:length(vgr.pair)<vgr.pair$mix )\n                      vgr.pair1 = vgr.pair[vix]\n                      vgr.pair2 = vgr.pair[vgr.pair1$mix]\n\n                      ## now need to reorient pairs so that the breakend strands are pointing away from the breakpoint\n                      \n                      ## if \"first\" and \"right\" then we set this entry \"-\" and the second entry \"+\"\n                      tmpix = vgr.pair1$first & vgr.pair1$right\n                      if (any(tmpix))\n                          {\n                              strand(vgr.pair1)[tmpix] = '-'\n                              strand(vgr.pair2)[tmpix] = '+'\n                          }\n\n                      ## if \"first\" and \"left\" then \"-\", \"-\"\n                      tmpix = vgr.pair1$first & !vgr.pair1$right\n                      if (any(tmpix))\n                          {\n                              strand(vgr.pair1)[tmpix] = '-'\n                              strand(vgr.pair2)[tmpix] = '-'\n                          }\n\n                      ## if \"second\" and \"left\" then \"+\", \"-\"\n                      tmpix = !vgr.pair1$first & !vgr.pair1$right\n                      if (any(tmpix))\n                          {\n                              strand(vgr.pair1)[tmpix] = '+'\n                              strand(vgr.pair2)[tmpix] = '-'\n                          }\n\n                      ## if \"second\" and \"right\" then \"+\", \"+\"\n                      tmpix = !vgr.pair1$first & vgr.pair1$right\n                      if (any(tmpix))\n                          {\n                              strand(vgr.pair1)[tmpix] = '+'\n                              strand(vgr.pair2)[tmpix] = '+'\n                          }\n\n                      pos1 = as.logical(strand(vgr.pair1)=='+') ## positive strand junctions shift left by one (ie so that they refer to the base preceding the break for these junctions\n                      if (any(pos1))\n                          {\n                              start(vgr.pair1)[pos1] = start(vgr.pair1)[pos1]-1\n                              end(vgr.pair1)[pos1] = end(vgr.pair1)[pos1]-1\n                          }\n\n                      pos2 = as.logical(strand(vgr.pair2)=='+') ## positive strand junctions shift left by one (ie so that they refer to the base preceding the break for these junctions\n                      if (any(pos2))\n                          {\n                              start(vgr.pair2)[pos2] = start(vgr.pair2)[pos2]-1\n                              end(vgr.pair2)[pos2] = end(vgr.pair2)[pos2]-1\n                          }\n                      ra = grl.pivot(GRangesList(vgr.pair1[, c()], vgr.pair2[, c()]))\n\n                      this.inf = info(vcf)[bix[pix[vix]], ]\n\n                      if (is.null(this.inf$POS))\n                          this.inf = cbind(data.frame(POS = ''), this.inf)\n                      if (is.null(this.inf$CHROM))\n                          this.inf = cbind(data.frame(CHROM = ''), this.inf)\n\n                      if (is.null(this.inf$MATL))\n                          this.inf = cbind(data.frame(MALT = ''), this.inf)\n                      \n                      this.inf$CHROM = seqnames(vgr.pair1)\n                      this.inf$POS = start(vgr.pair1)\n                      this.inf$MATECHROM = seqnames(vgr.pair2)\n                      this.inf$MATEPOS = start(vgr.pair2)\n                      this.inf$MALT = vgr.pair2$ALT\n                      \n                      values(ra) = cbind(fixed(vcf)[bix[pix[vix]],], this.inf)\n                      \n                      if (is.null(values(ra)$TIER))\n                          values(ra)$tier = ifelse(values(ra)$FILTER == \"PASS\", 2, 3) ## baseline tiering of PASS vs non PASS variants\n                      else\n                          values(ra)$tier = values(ra)$TIER\n\n                      if (!get.loose)\n                          return(ra)\n                      else\n                          {\n                              npix = is.na(vgr$mix)\n                              vgr.loose = vgr[npix, c()] ## these are possible \"loose ends\" that we will add to the segmentation\n                              values(vgr.loose) = cbind(fixed(vcf)[bix[npix], ], info(vcf)[bix[npix], ])\n\n                              return(list(junctions = ra, loose.ends = vgr.loose))\n                          }\n                  }\n              else\n                  rafile = read.delim(rafile)\n          }\n            \n     if (is.data.table(rafile))\n         rafile = as.data.frame(rafile)\n\n    if (nrow(rafile)==0)\n        {\n            out = GRangesList()\n            values(out) = rafile\n            return(out)\n        }\n  \n    if (snowman) ## flip breaks so that they are pointing away from junction\n      {\n        rafile$str1 = ifelse(rafile$strand1 == '+', '-', '+')\n        rafile$str2 = ifelse(rafile$strand2 == '+', '-', '+')\n      }\n      \n    if (!is.null(seqlevels)) ## convert seqlevels from notation in tab delim file to actual\n      {\n        rafile$chr1 = seqlevels[rafile$chr1]\n        rafile$chr2 = seqlevels[rafile$chr2]        \n      }\n\n     \n    if (is.null(rafile$str1))\n      rafile$str1 = rafile$strand1\n\n    if (is.null(rafile$str2))\n      rafile$str2 = rafile$strand2\n     if (!is.null(rafile$pos1) & !is.null(rafile$pos2))\n         {\n             if (breakpointer)\n                 {\n                     rafile$pos1 = rafile$T_BPpos1\n                     rafile$pos2 = rafile$T_BPpos2\n                 }\n             \n             if (!is.numeric(rafile$pos1))\n                 rafile$pos1 = as.numeric(rafile$pos1)\n\n             if (!is.numeric(rafile$pos2))\n                 rafile$pos2 = as.numeric(rafile$pos2)\n\n             ## clean the parenthesis from the string\n\n             rafile$str1 <- gsub('[()]', '', rafile$str1)\n             rafile$str2 <- gsub('[()]', '', rafile$str2)\n\n             if (is.character(rafile$str1) | is.factor(rafile$str1))\n                 rafile$str1 = gsub('0', '-', gsub('1', '+', rafile$str1))\n             \n             if (is.character(rafile$str2) | is.factor(rafile$str2))\n                 rafile$str2 = gsub('0', '-', gsub('1', '+', rafile$str2))\n             \n             if (is.numeric(rafile$str1))\n                 rafile$str1 = ifelse(rafile$str1>0, '+', '-')\n\n             if (is.numeric(rafile$str2))\n                 rafile$str2 = ifelse(rafile$str2>0, '+', '-')\n             \n             rafile$rowid = 1:nrow(rafile)\n\n             bad.ix = is.na(rafile$chr1) | is.na(rafile$chr2) | is.na(rafile$pos1) | is.na(rafile$pos2) | is.na(rafile$str1) | is.na(rafile$str2) | rafile$str1 == '*'| rafile$str2 == '*' | rafile$pos1<0 | rafile$pos2<0\n             \n             rafile = rafile[which(!bad.ix), ]\n             \n             if (nrow(rafile)==0)\n                 return(GRanges())\n             \n             seg = rbind(data.frame(chr = rafile$chr1, pos1 = rafile$pos1, pos2 = rafile$pos1, strand = rafile$str1, ra.index = rafile$rowid, ra.which = 1, stringsAsFactors = F),\n                 data.frame(chr = rafile$chr2, pos1 = rafile$pos2, pos2 = rafile$pos2, strand = rafile$str2, ra.index = rafile$rowid, ra.which = 2, stringsAsFactors = F))\n\n             if (chr.convert)\n                 seg$chr = gsub('25', 'M', gsub('24', 'Y', gsub('23', 'X', seg$chr)))\n             \n             out = seg2gr(seg, seqlengths = seqlengths)[, c('ra.index', 'ra.which')];\n             out = split(out, out$ra.index)\n         }\n     else if (!is.null(rafile$start1) & !is.null(rafile$start2) & !is.null(rafile$end1) & !is.null(rafile$end2))\n         {\n             ra1 = gr.flip(GRanges(rafile$chr1, IRanges(rafile$start1, rafile$end1), strand = rafile$str1))\n             ra2 = gr.flip(GRanges(rafile$chr2, IRanges(rafile$start2, rafile$end2), strand = rafile$str2))\n             out = grl.pivot(GRangesList(ra1, ra2))             \n         }\n     \n     \n     if (keep.features)\n         values(out) = rafile[, ]\n\n     return(out)\n }\n\ngrl.pivot <-\n  function(x)\n  {\n    if (length(x) == 0)\n      return(GRangesList(GRanges(seqlengths = seqlengths(x)), GRanges(seqlengths = seqlengths(x))))\n    return(split(unlist(x), rep(1:length(x[[1]]), length(x))))\n  }\n\n\nread_hg <-\nfunction(hg19 = T, fft = F)\n  {\n    if (fft)\n      return(readRDS(REFGENE.FILE.HG19.FFT))\n    else\n      {\n        require(BSgenome)\n        if (hg19)\n          library(BSgenome.Hsapiens.UCSC.hg19)\n        else\n          library(BSgenome.Hsapiens.UCSC.hg18)\n      }\n    return(Hsapiens)\n  }\n\nhg_seqlengths <-\nfunction(hg19 = T, chr = F, include.junk = F)\n  {\n    require(BSgenome)\n    hg = read_hg(hg19)\n\n    sl = seqlengths(hg)\n\n    if (!include.junk)\n      sl = sl[c(paste('chr', 1:22, sep = ''), 'chrX', 'chrY', 'chrM')]\n    \n    if (!chr)\n      names(sl) = gsub('chr', '', names(sl))\n\n    return(sl)          \n  }\n\ngrl.unlist <-\nfunction(grl)\n  {\n    if (length(grl) == 0) ## JEREMIAH\n      return(GRanges())\n#      return(grl) \n    names(grl) = NULL\n\n    as.df = as.data.frame(grl)\n    \n    el = as.df$element\n    if (is.null(el))\n        el = as.df$group\n       \n    out = unlist(grl)\n    out$grl.ix = el\n    tmp = rle(el)\n    out$grl.iix = unlist(sapply(tmp$lengths, function(x) 1:x))\n    values(out) = cbind(values(grl)[out$grl.ix, , drop = FALSE], values(out))\n    return(out)\n  }\n\ngrdt <-\nfunction(x)\n {\n      require(data.table)\n\n      ## new approach just directly instantiating data table\n      cmd = 'data.table(';\n      if (is(x, 'GRanges'))\n          {\n              was.gr = TRUE\n              f = c('seqnames', 'start', 'end', 'strand', 'width')\n              f2 = c('as.character(seqnames', 'c(start', 'c(end', 'as.character(strand', 'as.numeric(width')\n              cmd = paste(cmd, paste(f, '=', f2, '(x))', sep = '', collapse = ','), sep = '')\n              value.f = names(values(x))              \n          }\n      else          \n          {\n              was.gr = FALSE\n              value.f = names(x)\n          }\n      \n      if (length(value.f)>0)\n          {\n              if (was.gr)\n                  cmd = paste(cmd, ',', sep = '')\n              class.f = sapply(value.f, function(f) eval(parse(text=sprintf(\"class(x$'%s')\", f))))\n\n              .StringSetListAsList = function(x) ### why do I need to do this, bioconductor peeps??\n                  {\n                      tmp1 = as.character(unlist(x))\n                      tmp2 = rep(1:length(x), elementLengths(x))\n                      return(split(tmp1, tmp2))                          \n                  }\n\n              ## take care of annoying S4 / DataFrame / data.frame (wish-they-were-non-)issues\n              as.statement = ifelse(grepl('Integer', class.f), 'as.integer',\n                  ifelse(grepl('Character', class.f), 'as.character',\n                         ifelse(grepl('StringSetList', class.f), '.StringSetListAsList',\n                                ifelse(grepl('StringSet$', class.f), 'as.character',\n                                       ifelse(grepl('List', class.f), 'as.list',\n                                              ifelse(grepl('List', class.f), 'as.list', 'c'))))))\n              cmd = paste(cmd, paste(value.f, '=', as.statement, \"(x$'\", value.f, \"')\", sep = '', collapse = ','), sep = '')\n          }\n\n      cmd = paste(cmd, ')', sep = '')\n      return(eval(parse(text =cmd)))\n  }\n\ngr.findoverlaps <-\nfunction(query, subject, ignore.strand = T, first = F,\n    qcol = NULL, ## any query meta data columns to add to result\n    scol = NULL, ## any subject meta data columns to add to resultx\n    max.chunk = 1e13,\n    foverlaps = ifelse(is.na(as.logical(Sys.getenv('GRFO_FOVERLAPS'))), TRUE, as.logical(Sys.getenv('GRFO_FOVERLAPS'))) & exists('foverlaps'),\n    pintersect = NA,\n    verbose = F,\n    type = 'any', \n    by = NULL, \n    mc.cores = 1,\n    return.type = 'same',\n    ...)\n  {\n\n     if (type != 'any')\n         {\n             foverlaps = FALSE\n             pintersect = FALSE\n         }\n      \n  if (nchar(foverlaps)==0)\n      foverlaps = TRUE\n\n  if (is.na(foverlaps))\n      foverlaps = TRUE\n  \n  isdt <- any(class(query) == 'data.table' )\n  if (return.type == 'same')\n    return.type <- ifelse(isdt, 'data.table', 'GRanges')\n  \n  if (!((inherits(subject, 'GRanges') | inherits(subject, 'data.table')) & (inherits(query, 'GRanges') | inherits(query, 'data.table'))))\n      stop('both subject and query have to be GRanges or data.table')\n  \n  if (is.na(pintersect))\n    if (isdt)\n      pintersect <- length(unique(query$seqnames)) > 50 & length(unique(subject$seqnames)) > 50\n    else\n      pintersect <- seqlevels(query) > 50 && seqlevels(subject) > 50\n  if (is.na(pintersect))\n    pintersect <- FALSE\n\n  \n  if (!is.null(qcol))\n      if (!all(qcol %in% names(values(query))))\n          stop('Some qcol are not present in meta data of query')\n\n  if (!is.null(scol))\n      if (!all(scol %in% names(values(subject))))\n          stop('Some scol are not present in meta data of subject')\n          \n  if (!is.null(by))\n    if (!(by %in% names(values(query)) & by %in% names(values(subject))))\n      stop('\"by\" field must be meta data column of both query and subject')\n    \n    if ((as.numeric(length(query)) * as.numeric(length(subject))) > max.chunk)\n      {\n        if (verbose) \n          cat('Overflow .. computing overlaps in chunks.  Adjust max.chunk parameter to gr.findoverlaps to avoid chunked computation\\n')\n        chunk.size = floor(sqrt(max.chunk));\n        ix1 = c(seq(1, length(query), chunk.size), length(query)+1)\n        ix2 = c(seq(1, length(subject), chunk.size), length(subject)+1)\n        ij = cbind(rep(1:(length(ix1)-1), length(ix2)-1), rep(1:(length(ix2)-1), each = length(ix1)-1))\n        if (verbose)\n          print(paste('Number of chunks:', nrow(ij)))\n\n        out = do.call('c', mclapply(1:nrow(ij),\n            function(x)\n                        {\n                          if (verbose)\n                            cat(sprintf('chunk i = %s-%s (%s), j = %s-%s (%s)\\n', ix1[ij[x,1]], ix1[ij[x,1]+1]-1, length(query),\n                                        ix2[ij[x,2]], (ix2[ij[x,2]+1]-1), length(subject)))\n                          i.chunk = ix1[ij[x,1]]:(ix1[ij[x,1]+1]-1)\n                          j.chunk = ix2[ij[x,2]]:(ix2[ij[x,2]+1]-1)\n                          out = gr.findoverlaps(query[i.chunk], subject[j.chunk],  ignore.strand = ignore.strand, first = first, pintersect=pintersect, by = by, qcol = qcol, verbose = verbose, foverlaps = foverlaps, scol = scol, type = type, ...)\n                          out$query.id = i.chunk[out$query.id]\n                          out$subject.id = j.chunk[out$subject.id]\n                          return(out)\n                        }, mc.cores=mc.cores))\n\n        convert = FALSE\n        if ((return.type == 'same' & is(query, 'data.table')) | return.type == 'data.table')\n            out = grdt(out)\n        return(out)            \n      }\n\n  if (foverlaps)\n      {\n          if (verbose)\n              print('overlaps by data.table::foverlaps')\n          if (ignore.strand)\n              by = c(by, 'seqnames',  'start', 'end')\n          else\n              by = c(by, 'seqnames', 'strand', 'start', 'end')\n\n          if (!is.data.table(query))\n              {\n                  names(query) = NULL\n                  querydt = grdt(query[, setdiff(by, c('seqnames', 'start', 'end', 'strand'))])\n              }\n          else\n              {\n                  if (!all(by %in% names(query)))\n                      stop(paste('the following columns are missing from query:',\n                                 paste(by, collapse = ',')))\n                      \n                  querydt = query[, by, with = FALSE]\n              }\n          \n          if (!is.data.table(subject))\n              {\n                  names(subject) = NULL\n                  subjectdt = grdt(subject[, setdiff(by, c('seqnames', 'start', 'end', 'strand'))])\n              }\n          else\n              {\n                  if (!all(by %in% names(subject)))\n                      stop(paste('the following columns are missing from subejct:',\n                                 paste(by, collapse = ',')))\n                  subjectdt = subject[, by, with = FALSE]\n              }\n          \n          \n          ix1 = querydt$query.id = 1:nrow(querydt)\n          ix2 = subjectdt$subject.id = 1:nrow(subjectdt)\n\n          querydt = querydt[start<=end, ]\n          subjectdt = subjectdt[start<=end, ]\n          \n          querydt = querydt[, c('query.id', by), with = F]\n          subjectdt = subjectdt[, c('subject.id', by), with = F]\n          setkeyv(querydt, by)\n          setkeyv(subjectdt, by)\n\n         \n          h.df = foverlaps(querydt, subjectdt, by.x = by, by.y = by, mult = 'all', type = 'any', verbose = verbose)\n          h.df = h.df[!is.na(subject.id) & !is.na(query.id), ]\n          h.df[, start := pmax(start, i.start)]\n          h.df[, end := pmin(end, i.end)]\n\n          if (verbose)\n              cat(sprintf('Generated %s overlaps\\n', nrow(h.df)))          \n      }\n  else\n      {\n\n          if (isdt) {\n              sn1 <- query$seqnames\n              sn2 <- subject$seqnames\n          } else {\n              sn1 = as.character(seqnames(query))\n              sn2 = as.character(seqnames(subject))\n          }\n          if (is.null(by))\n              {\n                  ix1 = which(sn1 %in% sn2)\n                  ix2 = which(sn2 %in% sn1)\n              }\n          else\n              {\n                  by1 = values(query)[, by]\n                  by2 = values(subject)[, by]\n                  ix1 = which(sn1 %in% sn2 & by1 %in% by2)\n                  ix2 = which(sn2 %in% sn1 & by2 %in% by1)\n                  by1 = by1[ix1]\n                  by2 = by2[ix2]\n              }\n          \n          query.ix = query[ix1]\n          subject.ix = subject[ix2]\n          sn1 = sn1[ix1]\n          sn2 = sn2[ix2]\n          \n          \n          if (pintersect)\n              {\n                  if (verbose)\n                      print('overlaps by pintersect')\n                  require(data.table)\n                  if (length(sn1)>0 & length(sn2)>0)\n                      {\n\n                          if (is.null(by))\n                              {\n                                  dt1 <- data.table(i=seq_along(sn1), sn=sn1, key=\"sn\")\n                                  dt2 <- data.table(j=seq_along(sn2), sn=sn2, key=\"sn\")                \n                                  ij <- merge(dt1, dt2, by = 'sn', allow.cartesian=TRUE)\n                              }\n                          else\n                              {\n                                  dt1 <- data.table(i=seq_along(sn1), sn=sn1, by = by1, key=c(\"sn\", \"by\"))\n                                  dt2 <- data.table(j=seq_along(sn2), sn=sn2, by = by2, key=c(\"sn\", \"by\"))\n                                  ij <- merge(dt1, dt2, by = c('sn', 'by'), allow.cartesian=TRUE)\n                              }\n\n                          if (ignore.strand && isdt)\n                              subject$strand <- '*'\n                          else if (ignore.strand)\n                              strand(subject) = '*'\n\n                          qr <- query.ix[ij$i]\n                          sb <- subject.ix[ij$j]\n                          if (!isdt) {\n                              seqlengths(qr) <- rep(NA, length(seqlengths(qr)))\n                              seqlengths(sb) <- rep(NA, length(seqlengths(sb)))\n                          }\n                          \n                          if (!isdt && any(as.character(seqnames(qr)) != as.character(seqnames(sb))))\n                              warning('gr.findoverlaps: violated pintersect assumption')\n\n                          ## changed to ranges(qr) etc rather than just GRanges call. Major problem if too many seqlevels\n                          if (isdt) {\n                              rqr <- IRanges(start=qr$start, end=qr$end)\n                              rsb <- IRanges(start=sb$start, end=sb$end)              \n                          } else {\n                              rqr <- ranges(qr)\n                              rsb <- ranges(sb)              \n                          }\n                          tmp <- pintersect(rqr, rsb, resolve.empty = 'start.x', ...)\n                          names(tmp) = NULL\n                          non.empty = which(width(tmp)!=0)\n                          h.df = as.data.frame(tmp[non.empty])\n                          if (isdt)\n                              h.df$seqnames <- qr$seqnames[non.empty]\n                          else\n                              h.df$seqnames <- as.character(seqnames(qr))[non.empty]\n                          h.df$query.id = ij$i[non.empty]\n                          h.df$subject.id = ij$j[non.empty]\n                      }\n                  else\n                      h.df = data.frame()\n              }\n          else\n              {\n                  if (verbose)\n                      print('overlaps by findOverlaps')\n                  if (isdt) {\n                      rqr <- IRanges(start=query.ix$start, end=query.ix$end)\n                      rsb <- IRanges(start=subject.ix$start, end=subject.ix$end)              \n                  } else {\n                      rqr <- ranges(query.ix)\n                      rsb <- ranges(subject.ix)              \n                  }\n\n                  h <- findOverlaps(rqr, rsb, type = type)\n                  r <- ranges(h, rqr, rsb)   \n                  h.df <- data.frame(start = start(r), end = end(r), query.id = queryHits(h), subject.id = subjectHits(h), stringsAsFactors = F);\n                                        #        sn.query = as.character(seqnames(query))[h.df$query.id]        \n                                        #        sn.subject = as.character(seqnames(subject))[h.df$subject.id]\n                  sn.query <- sn1[h.df$query.id]\n                  sn.subject <- sn2[h.df$subject.id]\n\n                  if (is.null(by))\n                      keep.ix <- sn.query == sn.subject\n                  else\n                      {\n                          by.query <- by1[h.df$query.id]\n                          by.subject <- by2[h.df$subject.id]\n                          keep.ix <- sn.query == sn.subject & by.query == by.subject\n                      }\n                  \n                  h.df <- h.df[keep.ix, ]\n                  h.df$seqnames <- sn.query[keep.ix];\n              }\n\n          if (!ignore.strand)\n              {\n                  h.df$strand <- str.query <- as.character(strand(query)[ix1[h.df$query.id]])\n                  str.subject <- as.character(strand(subject)[ix2[h.df$subject.id]])\n                  h.df <- h.df[which(str.query == str.subject | str.query == '*' | str.subject == '*'),]            \n              }\n          else if (nrow(h.df)>0)\n              h.df$strand = '*'\n      }\n    \n    if (first)\n      h.df = h.df[!duplicated(h.df$query.id), ]\n\n     if (return.type=='GRanges') \n       if (nrow(h.df)>0)           \n           {\n               if (('strand' %in% names(h.df)))\n                   out.gr = GRanges(h.df$seqnames, IRanges(h.df$start, h.df$end),\n                       query.id = ix1[h.df$query.id], subject.id = ix2[h.df$subject.id], strand = h.df$strand, seqlengths = seqlengths(query))\n               else\n                   out.gr = GRanges(h.df$seqnames, IRanges(h.df$start, h.df$end),\n                       query.id = ix1[h.df$query.id], subject.id = ix2[h.df$subject.id], seqlengths = seqlengths(query))\n                   \n               if (!is.null(qcol))\n                   values(out.gr) = cbind(values(out.gr), values(query)[out.gr$query.id, qcol, drop = FALSE])\n\n               if (!is.null(scol))\n                   values(out.gr) = cbind(values(out.gr), values(subject)[out.gr$subject.id, scol, drop = FALSE])               \n\n               return(out.gr)\n           }\n       else\n         return(GRanges(seqlengths = seqlengths(query)))\n     else \n         if (nrow(h.df)>0) {\n             \n             if (!is.data.table(h.df))\n                 h.df = as.data.table(h.df)\n             h.df$query.id <- ix1[h.df$query.id]\n             h.df$subject.id <- ix2[h.df$subject.id]\n\n             if (!is.null(qcol))\n                 h.df = cbind(h.df, as.data.table(as.data.frame(values(query))[h.df$query.id, qcol, drop = FALSE]))\n             \n             if (!is.null(scol))\n                 h.df = cbind(h.df, as.data.table(as.data.frame(values(subject))[h.df$subject.id, scol, drop = FALSE]))\n             \n             if ('i.start' %in% colnames(h.df))\n                 h.df[, i.start := NULL]\n                          \n             if ('i.end' %in% colnames(h.df))\n                 h.df[, i.end := NULL]\n             \n             return(h.df)\n       } else {\n         return(data.table())\n       }\n   }\n\n\nlibrary(optparse)\n\noption_list = list(\n    make_option(c(\"-i\", \"--input\"),  type = \"character\", default = NULL,  help = \"Input SV VCF file\"),\n    make_option(c(\"-o\", \"--output\"), type = \"character\", default = \"circos\",  help = \"Output basename of pdf to write the graph\"),\n    make_option(c(\"-g\", \"--genes\"), type = \"logical\", default = TRUE,  help = \"Add genes to the plot?\"),\n    make_option(c(\"-H\", \"--height\"), type = \"numeric\", default = 10,  help = \"Height\"),\n    make_option(c(\"-W\", \"--width\"), type = \"numeric\", default = 10,  help = \"Width\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\nif (is.null(opt$input))\n  stop(print_help(parseobj))\n\nbks <- ra_breaks(opt$input)\n\n## filter out discorant only\nbks <- bks[-which(mcols(bks)$EVDNC == \"DSCRD\")]\n\nrequire(RCircos)\ndata(UCSC.HG19.Human.CytoBandIdeogram);\nchr.exclude <- NULL;\ncyto.info <- UCSC.HG19.Human.CytoBandIdeogram;\ntracks.inside <- 10;\ntracks.outside <- 0;\nRCircos.Set.Core.Components(cyto.info, chr.exclude, tracks.inside, tracks.outside);\n\nb <- grl.unlist(bks)\n\n## get the gene label dat\nbasedir <- '/xchip/gistic/Jeremiah/tracks'  \ngenes <- readRDS(file.path(basedir, 'gr.allgenes.rds'))\ngenes <- genes[width(genes) < 2e6]\nfo <- gr.findoverlaps(b+10e3, genes)\nfo <- fo[!duplicated(fo$subject.id)]\n\ngene.dat = data.frame(Chromosome = seqnames(genes[fo$subject.id]), chromStart=start(genes[fo$subject.id]),\n  chromEnd=end(genes[fo$subject.id]), Gene=genes$gene[fo$subject.id])\nprint(gene.dat)\n\ngename.col <- 4;\nside <- \"in\";\ntrack.num <- 1;\n\n\nx1 = b$grl.iix==1\nx2 = b$grl.iix==2\nlinks = data.frame(Chromosome=seqnames(b[x1]), chromStart=start(b[x1]), chromEnd=end(b[x1]), Chromosome.1=seqnames(b[x2]), chromStart.1=start(b[x2]), chromeEnd.1=end(b[x2]))\n\n## plot the PDF\npdf(file=paste0(opt$output,\".pdf\"), height=opt$height, width=opt$width, compress=TRUE);\nRCircos.Set.Plot.Area();\nRCircos.Chromosome.Ideogram.Plot();\nif (opt$genes && nrow(gene.dat) > 0) {\n  RCircos.Gene.Connector.Plot(gene.dat, track.num, side);\n  track.num <- 2;\n  name.col <- 4;\n  RCircos.Gene.Name.Plot(gene.dat, name.col,track.num, side);\n}\nif (nrow(links) > 0)\n  RCircos.Link.Plot(links, track.num, by.chromosome=TRUE) ## by.chromosome is for color\ndev.off()\n"
  },
  {
    "path": "R/archive_non_functional/svaba-create-pon.R",
    "content": "#!/usr/bin/env Rscript\n\nlibrary(optparse)\n\noption_list = list(\n    make_option(c(\"-i\", \"--input\"),  type = \"character\", default = \"qcreport.txt\",  help = \"Input file containing paths to germline \"),\n    make_option(c(\"-o\", \"--output\"), type = \"character\", default = \"qcreport.pdf\",  help = \"Output panel of normals file\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\nif (is.null(opt$input))\n  stop(print_help(parseobj))\n\nif (!file.exists(opt$input)) {\n  print(print_help(parseobj))\n  stop(paste(\"Input file does not exist\", opt$input, \". Must supply path to valid qcreport.txt file (generated from snowman preprocess or snowman run\"))\n}\n\nprint(opt)\n\n## default\nopt$input = '/home/unix/jwala/lung_wgs_pon_list.txt'\nopt$output = \"/home/unix/jwala/lung_wgs_pon.txt\"\n\n##\nopt$vcf_files = read.delim(opt$input, stringsAsFactors=FALSE)[,1]\ndt.all <- mclapply(opt$vcf_files, function(x) {\n  print(x)\n  if (!file.exists(x)) {\n    warning(\"File does not exist\")\n    return (-1)\n  }\n  ab <- read_vcf(x)\n  ab$file = x\n  return(gr2dt(ab))\n}, mc.cores=15)\n\ndt <- rbindlist(dt.all)\n\n## need to add indel tye, also svss\n"
  },
  {
    "path": "R/archive_non_functional/svaba-event-plot.R",
    "content": "#!/usr/bin/env Rscript\n\n## source all the required packages\nsource.all <- function() {\n\n  githome <- Sys.getenv('GIT_HOME')\n  if (!nchar(githome))\n    githome <- '/xchip/gistic/Jeremiah/GIT'\n\n  suppressMessages(suppressWarnings(require(ff, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(VariantAnnotation, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(rtracklayer, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(data.table, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(plyr, quietly=TRUE)))\n  print('...sourced 5 packages')\n  suppressMessages(suppressWarnings(require(ggplot2, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(reshape2, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(GenomicRanges, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(popbio, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(BSgenome.Hsapiens.UCSC.hg19, quietly=TRUE)))\n  print('...sourced 10 packages')\n  suppressMessages(suppressWarnings(require(bitops, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(seqinr, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(Rsamtools, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(ff, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(multicore, quietly=TRUE)))\n  print('...sourced 15 packages')\n  suppressMessages(suppressWarnings(require(Biostrings, quietly=TRUE)))  \n  suppressMessages(suppressWarnings(require(rtracklayer, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(lattice, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(RColorBrewer, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(Matrix, quietly=TRUE)))\n  print('...sourced 20 packages')\n  \n  source(file.path(githome, \"grUtils\", \"grUtils.R\"))\n  source(file.path(githome, \"trackData\", \"trackData.R\"))\n  source(file.path(githome, \"marcin\", \"R\", \"functions.R\"))\n  source(file.path(githome, \"marcin\", \"R\", \"db.R\"))\n  source(file.path(githome, \"isva\", \"TaigaSig\", \"sigUtils.R\"))\n  print('...sourced grUtils.R, trackData.R, marcin/functions.R, marcin/db.R, sigUtils.R')\n}\n\nsource.all()\n\n##################\n## PARSE OPTIONS\n##################\nlibrary(optparse)\n\noption_list = list(\n    make_option(c(\"-f\", \"--FHworkspace\"),  type = \"character\", default = NULL,            help = \"Firehose workspace to retrieve data from\"),\n    make_option(c(\"-o\", \"--outdir\"),  type = \"character\", default = getwd(),         help = \"Firehose workspace to retrieve data from\"),\n    make_option(c(\"-p\", \"--FHpairset\"),    type = \"character\", default = NULL,            help = \"Firehose pairset to retreive data from\"),\n    make_option(c(\"-a\", \"--FHannotation\"), type = \"character\", default = NULL,            help = \"Firehose annoation to retreive data from\"),\n    make_option(c(\"-c\", \"--cores\"), type = \"numeric\", default = 1,            help = \"Number of cores to use\"),\n    make_option(c(\"-v\", \"--VCFlist\"),      type = \"character\", default = \"/home/unix/jwala/test.vcflist.txt\",            help = \"File containing a list of VCFs\"))\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\n### test data\nopt$outdir = '/xchip/gistic/Jeremiah/tmp_sig'\ndir.create(opt$outdir, showWarnings=FALSE)\nopt$VCFlist = '/xchip/gistic/Jeremiah/Projects/Significance/Sanger578/list.txt'\n\nsetwd(opt$outdir)\n\n###################\n###################\n"
  },
  {
    "path": "R/archive_non_functional/svaba-histogram.R",
    "content": "#!/usr/bin/env Rscript\n\n## set the right library paths\n.libPaths = c(\"/xchip/gistic/Jeremiah/R\", \"/broad/software/free/Linux/redhat_6_x86_64/pkgs/r_3.1.1-bioconductor-3.0/lib64/R/library\")\n\nfile.dir <-\nfunction(paths)\n  {\n    return(gsub('(^|(.*\\\\/))?([^\\\\/]*)$', '\\\\2', paths))\n  }\n\nrequire(data.table)\nsuppressMessages(suppressWarnings(require(GenomicRanges, quietly = TRUE)))\nsuppressMessages(suppressWarnings(require(gplots, quietly = TRUE)))\n\nra_breaks <-\nfunction(rafile, keep.features = T, seqlengths = hg_seqlengths(), chr.convert = T, snowman = FALSE,  breakpointer = FALSE, seqlevels = NULL,\n    get.loose = FALSE ## if TRUE will return a list with fields $junctions and $loose.ends\n  )\n  {\n      if (is.character(rafile))\n          {\n              if (grepl('(vcf$)|(vcf.gz$)', rafile))\n                  {\n                      library(VariantAnnotation)\n                      vcf = readVcf(rafile, Seqinfo(seqnames = names(seqlengths), seqlengths = seqlengths))\n                      if (!('SVTYPE' %in% names(info(vcf)))) {\n                        warning('Vcf not in proper format.  Is this a rearrangement vcf?')\n                          return(GRangesList());\n                        }\n                      \n                      vgr = rowData(vcf) ## parse BND format\n\n                      ## no events\n                      if (length(vgr) == 0)\n                        return (GRangesList())\n\n                      ## fix mateids if not included\n                      if (!\"MATEID\"%in%colnames(mcols(vgr))) {\n                        nm <- vgr$MATEID <- names(vgr)\n                        ix <- grepl(\"1$\",nm)\n                        vgr$MATEID[ix] = gsub(\"(.*?)(1)$\", \"\\\\12\", nm[ix])\n                        vgr$MATEID[!ix] = gsub(\"(.*?)(2)$\", \"\\\\11\", nm[!ix])\n                        vgr$SVTYPE=\"BND\"\n                      }\n                      \n                      if (!any(c(\"MATEID\", \"SVTYPE\") %in% colnames(mcols(vgr))))\n                        stop(\"MATEID or SVTYPE not included. Required\")\n                      vgr$mateid = info(vcf)$MATEID\n                      vgr$svtype = info(vcf)$SVTYPE\n\n                      if (!is.null(info(vcf)$SCTG))\n                          vgr$SCTG = info(vcf)$SCTG\n                      \n                      if (sum(vgr$svtype == 'BND')==0)\n                          stop('Vcf not in proper format.  Will only process rearrangements in BND format')\n\n                      if (!all(vgr$svtype == 'BND'))\n                          warning(sprintf('%s rows of vcf do not have svtype BND, ignoring these'), sum(vgr$svtype != 'BND'))\n\n                      bix = which(vgr$svtype == \"BND\")\n                      vgr = vgr[bix]\n                      vgr$first = !grepl('^(\\\\]|\\\\[)', vgr$ALT) ## ? is this row the \"first breakend\" in the ALT string (i.e. does the ALT string not begin with a bracket)\n                      vgr$right = grepl('\\\\[', vgr$ALT) ## ? are the (sharp ends) of the brackets facing right or left\n                      vgr$coord = as.character(paste(seqnames(vgr), ':', start(vgr), sep = ''))\n                      vgr$mcoord = as.character(gsub('.*(\\\\[|\\\\])(.*\\\\:.*)(\\\\[|\\\\]).*', '\\\\2', vgr$ALT))\n                      vgr$mcoord = gsub('chr', '', vgr$mcoord)\n\n                      if (all(is.na(vgr$mateid)))\n                          if (!is.null(names(vgr)) & !any(duplicated(names(vgr))))\n                              {\n                                  warning('MATEID tag missing, guessing BND partner by parsing names of vgr')\n                                  vgr$mateid = paste(gsub('::\\\\d$', '', names(vgr)), (sapply(strsplit(names(vgr), '\\\\:\\\\:'), function(x) as.numeric(x[length(x)])))%%2 + 1, sep = '::')\n                              }\n                          else if (!is.null(vgr$SCTG))\n                              {\n                                  warning('MATEID tag missing, guessing BND partner from coordinates and SCTG')\n                                  require(igraph)\n                                  ucoord = unique(c(vgr$coord, vgr$mcoord))\n                                  vgr$mateid = paste(vgr$SCTG, vgr$mcoord, sep = '_')\n\n                                  if (any(duplicated(vgr$mateid)))\n                                      {\n                                          warning('DOUBLE WARNING! inferred mateids not unique, check VCF')\n                                          bix = bix[!duplicated(vgr$mateid)]\n                                          vgr = vgr[!duplicated(vgr$mateid)]\n                                      }\n                              }\n                          else\n                              stop('MATEID tag missing')\n\n                      vgr$mix = as.numeric(match(vgr$mateid, names(vgr)))\n\n                      pix = which(!is.na(vgr$mix))\n\n                      vgr.pair = vgr[pix]\n\n                      if (length(vgr.pair)==0)\n                          stop('No mates found despite nonzero number of BND rows in VCF')\n                      vgr.pair$mix = match(vgr.pair$mix, pix)\n                      vix = which(1:length(vgr.pair)<vgr.pair$mix )\n                      vgr.pair1 = vgr.pair[vix]\n                      vgr.pair2 = vgr.pair[vgr.pair1$mix]\n\n                      ## now need to reorient pairs so that the breakend strands are pointing away from the breakpoint\n                      \n                      ## if \"first\" and \"right\" then we set this entry \"-\" and the second entry \"+\"\n                      tmpix = vgr.pair1$first & vgr.pair1$right\n                      if (any(tmpix))\n                          {\n                              strand(vgr.pair1)[tmpix] = '-'\n                              strand(vgr.pair2)[tmpix] = '+'\n                          }\n\n                      ## if \"first\" and \"left\" then \"-\", \"-\"\n                      tmpix = vgr.pair1$first & !vgr.pair1$right\n                      if (any(tmpix))\n                          {\n                              strand(vgr.pair1)[tmpix] = '-'\n                              strand(vgr.pair2)[tmpix] = '-'\n                          }\n\n                      ## if \"second\" and \"left\" then \"+\", \"-\"\n                      tmpix = !vgr.pair1$first & !vgr.pair1$right\n                      if (any(tmpix))\n                          {\n                              strand(vgr.pair1)[tmpix] = '+'\n                              strand(vgr.pair2)[tmpix] = '-'\n                          }\n\n                      ## if \"second\" and \"right\" then \"+\", \"+\"\n                      tmpix = !vgr.pair1$first & vgr.pair1$right\n                      if (any(tmpix))\n                          {\n                              strand(vgr.pair1)[tmpix] = '+'\n                              strand(vgr.pair2)[tmpix] = '+'\n                          }\n\n                      pos1 = as.logical(strand(vgr.pair1)=='+') ## positive strand junctions shift left by one (ie so that they refer to the base preceding the break for these junctions\n                      if (any(pos1))\n                          {\n                              start(vgr.pair1)[pos1] = start(vgr.pair1)[pos1]-1\n                              end(vgr.pair1)[pos1] = end(vgr.pair1)[pos1]-1\n                          }\n\n                      pos2 = as.logical(strand(vgr.pair2)=='+') ## positive strand junctions shift left by one (ie so that they refer to the base preceding the break for these junctions\n                      if (any(pos2))\n                          {\n                              start(vgr.pair2)[pos2] = start(vgr.pair2)[pos2]-1\n                              end(vgr.pair2)[pos2] = end(vgr.pair2)[pos2]-1\n                          }\n                      ra = grl.pivot(GRangesList(vgr.pair1[, c()], vgr.pair2[, c()]))\n\n                      this.inf = info(vcf)[bix[pix[vix]], ]\n\n                      if (is.null(this.inf$POS))\n                          this.inf = cbind(data.frame(POS = ''), this.inf)\n                      if (is.null(this.inf$CHROM))\n                          this.inf = cbind(data.frame(CHROM = ''), this.inf)\n\n                      if (is.null(this.inf$MATL))\n                          this.inf = cbind(data.frame(MALT = ''), this.inf)\n                      \n                      this.inf$CHROM = seqnames(vgr.pair1)\n                      this.inf$POS = start(vgr.pair1)\n                      this.inf$MATECHROM = seqnames(vgr.pair2)\n                      this.inf$MATEPOS = start(vgr.pair2)\n                      this.inf$MALT = vgr.pair2$ALT\n                      \n                      values(ra) = cbind(fixed(vcf)[bix[pix[vix]],], this.inf)\n                      \n                      if (is.null(values(ra)$TIER))\n                          values(ra)$tier = ifelse(values(ra)$FILTER == \"PASS\", 2, 3) ## baseline tiering of PASS vs non PASS variants\n                      else\n                          values(ra)$tier = values(ra)$TIER\n\n                      if (!get.loose)\n                          return(ra)\n                      else\n                          {\n                              npix = is.na(vgr$mix)\n                              vgr.loose = vgr[npix, c()] ## these are possible \"loose ends\" that we will add to the segmentation\n                              values(vgr.loose) = cbind(fixed(vcf)[bix[npix], ], info(vcf)[bix[npix], ])\n\n                              return(list(junctions = ra, loose.ends = vgr.loose))\n                          }\n                  }\n              else\n                  rafile = read.delim(rafile)\n          }\n            \n     if (is.data.table(rafile))\n         rafile = as.data.frame(rafile)\n\n    if (nrow(rafile)==0)\n        {\n            out = GRangesList()\n            values(out) = rafile\n            return(out)\n        }\n  \n    if (snowman) ## flip breaks so that they are pointing away from junction\n      {\n        rafile$str1 = ifelse(rafile$strand1 == '+', '-', '+')\n        rafile$str2 = ifelse(rafile$strand2 == '+', '-', '+')\n      }\n      \n    if (!is.null(seqlevels)) ## convert seqlevels from notation in tab delim file to actual\n      {\n        rafile$chr1 = seqlevels[rafile$chr1]\n        rafile$chr2 = seqlevels[rafile$chr2]        \n      }\n\n     \n    if (is.null(rafile$str1))\n      rafile$str1 = rafile$strand1\n\n    if (is.null(rafile$str2))\n      rafile$str2 = rafile$strand2\n     if (!is.null(rafile$pos1) & !is.null(rafile$pos2))\n         {\n             if (breakpointer)\n                 {\n                     rafile$pos1 = rafile$T_BPpos1\n                     rafile$pos2 = rafile$T_BPpos2\n                 }\n             \n             if (!is.numeric(rafile$pos1))\n                 rafile$pos1 = as.numeric(rafile$pos1)\n\n             if (!is.numeric(rafile$pos2))\n                 rafile$pos2 = as.numeric(rafile$pos2)\n\n             ## clean the parenthesis from the string\n\n             rafile$str1 <- gsub('[()]', '', rafile$str1)\n             rafile$str2 <- gsub('[()]', '', rafile$str2)\n\n             if (is.character(rafile$str1) | is.factor(rafile$str1))\n                 rafile$str1 = gsub('0', '-', gsub('1', '+', rafile$str1))\n             \n             if (is.character(rafile$str2) | is.factor(rafile$str2))\n                 rafile$str2 = gsub('0', '-', gsub('1', '+', rafile$str2))\n             \n             if (is.numeric(rafile$str1))\n                 rafile$str1 = ifelse(rafile$str1>0, '+', '-')\n\n             if (is.numeric(rafile$str2))\n                 rafile$str2 = ifelse(rafile$str2>0, '+', '-')\n             \n             rafile$rowid = 1:nrow(rafile)\n\n             bad.ix = is.na(rafile$chr1) | is.na(rafile$chr2) | is.na(rafile$pos1) | is.na(rafile$pos2) | is.na(rafile$str1) | is.na(rafile$str2) | rafile$str1 == '*'| rafile$str2 == '*' | rafile$pos1<0 | rafile$pos2<0\n             \n             rafile = rafile[which(!bad.ix), ]\n             \n             if (nrow(rafile)==0)\n                 return(GRanges())\n             \n             seg = rbind(data.frame(chr = rafile$chr1, pos1 = rafile$pos1, pos2 = rafile$pos1, strand = rafile$str1, ra.index = rafile$rowid, ra.which = 1, stringsAsFactors = F),\n                 data.frame(chr = rafile$chr2, pos1 = rafile$pos2, pos2 = rafile$pos2, strand = rafile$str2, ra.index = rafile$rowid, ra.which = 2, stringsAsFactors = F))\n\n             if (chr.convert)\n                 seg$chr = gsub('25', 'M', gsub('24', 'Y', gsub('23', 'X', seg$chr)))\n             \n             out = seg2gr(seg, seqlengths = seqlengths)[, c('ra.index', 'ra.which')];\n             out = split(out, out$ra.index)\n         }\n     else if (!is.null(rafile$start1) & !is.null(rafile$start2) & !is.null(rafile$end1) & !is.null(rafile$end2))\n         {\n             ra1 = gr.flip(GRanges(rafile$chr1, IRanges(rafile$start1, rafile$end1), strand = rafile$str1))\n             ra2 = gr.flip(GRanges(rafile$chr2, IRanges(rafile$start2, rafile$end2), strand = rafile$str2))\n             out = grl.pivot(GRangesList(ra1, ra2))             \n         }\n     \n     \n     if (keep.features)\n         values(out) = rafile[, ]\n\n     return(out)\n }\n\ngrl.pivot <-\n  function(x)\n  {\n    if (length(x) == 0)\n      return(GRangesList(GRanges(seqlengths = seqlengths(x)), GRanges(seqlengths = seqlengths(x))))\n    return(split(unlist(x), rep(1:length(x[[1]]), length(x))))\n  }\n\n\nread_hg <-\nfunction(hg19 = T, fft = F)\n  {\n    if (fft)\n      return(readRDS(REFGENE.FILE.HG19.FFT))\n    else\n      {\n        require(BSgenome)\n        if (hg19)\n          library(BSgenome.Hsapiens.UCSC.hg19)\n        else\n          library(BSgenome.Hsapiens.UCSC.hg18)\n      }\n    return(Hsapiens)\n  }\n\nhg_seqlengths <-\nfunction(hg19 = T, chr = F, include.junk = F)\n  {\n    require(BSgenome)\n    hg = read_hg(hg19)\n\n    sl = seqlengths(hg)\n\n    if (!include.junk)\n      sl = sl[c(paste('chr', 1:22, sep = ''), 'chrX', 'chrY', 'chrM')]\n    \n    if (!chr)\n      names(sl) = gsub('chr', '', names(sl))\n\n    return(sl)          \n  }\n\ngrl.unlist <-\nfunction(grl)\n  {\n    if (length(grl) == 0) ## JEREMIAH\n      return(GRanges())\n#      return(grl) \n    names(grl) = NULL\n\n    as.df = as.data.frame(grl)\n    \n    el = as.df$element\n    if (is.null(el))\n        el = as.df$group\n       \n    out = unlist(grl)\n    out$grl.ix = el\n    tmp = rle(el)\n    out$grl.iix = unlist(sapply(tmp$lengths, function(x) 1:x))\n    values(out) = cbind(values(grl)[out$grl.ix, , drop = FALSE], values(out))\n    return(out)\n  }\n\ngrdt <-\nfunction(x)\n {\n      require(data.table)\n\n      ## new approach just directly instantiating data table\n      cmd = 'data.table(';\n      if (is(x, 'GRanges'))\n          {\n              was.gr = TRUE\n              f = c('seqnames', 'start', 'end', 'strand', 'width')\n              f2 = c('as.character(seqnames', 'c(start', 'c(end', 'as.character(strand', 'as.numeric(width')\n              cmd = paste(cmd, paste(f, '=', f2, '(x))', sep = '', collapse = ','), sep = '')\n              value.f = names(values(x))              \n          }\n      else          \n          {\n              was.gr = FALSE\n              value.f = names(x)\n          }\n      \n      if (length(value.f)>0)\n          {\n              if (was.gr)\n                  cmd = paste(cmd, ',', sep = '')\n              class.f = sapply(value.f, function(f) eval(parse(text=sprintf(\"class(x$'%s')\", f))))\n\n              .StringSetListAsList = function(x) ### why do I need to do this, bioconductor peeps??\n                  {\n                      tmp1 = as.character(unlist(x))\n                      tmp2 = rep(1:length(x), elementLengths(x))\n                      return(split(tmp1, tmp2))                          \n                  }\n\n              ## take care of annoying S4 / DataFrame / data.frame (wish-they-were-non-)issues\n              as.statement = ifelse(grepl('Integer', class.f), 'as.integer',\n                  ifelse(grepl('Character', class.f), 'as.character',\n                         ifelse(grepl('StringSetList', class.f), '.StringSetListAsList',\n                                ifelse(grepl('StringSet$', class.f), 'as.character',\n                                       ifelse(grepl('List', class.f), 'as.list',\n                                              ifelse(grepl('List', class.f), 'as.list', 'c'))))))\n              cmd = paste(cmd, paste(value.f, '=', as.statement, \"(x$'\", value.f, \"')\", sep = '', collapse = ','), sep = '')\n          }\n\n      cmd = paste(cmd, ')', sep = '')\n      return(eval(parse(text =cmd)))\n  }\n\ngr.findoverlaps <-\nfunction(query, subject, ignore.strand = T, first = F,\n    qcol = NULL, ## any query meta data columns to add to result\n    scol = NULL, ## any subject meta data columns to add to resultx\n    max.chunk = 1e13,\n    foverlaps = ifelse(is.na(as.logical(Sys.getenv('GRFO_FOVERLAPS'))), TRUE, as.logical(Sys.getenv('GRFO_FOVERLAPS'))) & exists('foverlaps'),\n    pintersect = NA,\n    verbose = F,\n    type = 'any', \n    by = NULL, \n    mc.cores = 1,\n    return.type = 'same',\n    ...)\n  {\n\n     if (type != 'any')\n         {\n             foverlaps = FALSE\n             pintersect = FALSE\n         }\n      \n  if (nchar(foverlaps)==0)\n      foverlaps = TRUE\n\n  if (is.na(foverlaps))\n      foverlaps = TRUE\n  \n  isdt <- any(class(query) == 'data.table' )\n  if (return.type == 'same')\n    return.type <- ifelse(isdt, 'data.table', 'GRanges')\n  \n  if (!((inherits(subject, 'GRanges') | inherits(subject, 'data.table')) & (inherits(query, 'GRanges') | inherits(query, 'data.table'))))\n      stop('both subject and query have to be GRanges or data.table')\n  \n  if (is.na(pintersect))\n    if (isdt)\n      pintersect <- length(unique(query$seqnames)) > 50 & length(unique(subject$seqnames)) > 50\n    else\n      pintersect <- seqlevels(query) > 50 && seqlevels(subject) > 50\n  if (is.na(pintersect))\n    pintersect <- FALSE\n\n  \n  if (!is.null(qcol))\n      if (!all(qcol %in% names(values(query))))\n          stop('Some qcol are not present in meta data of query')\n\n  if (!is.null(scol))\n      if (!all(scol %in% names(values(subject))))\n          stop('Some scol are not present in meta data of subject')\n          \n  if (!is.null(by))\n    if (!(by %in% names(values(query)) & by %in% names(values(subject))))\n      stop('\"by\" field must be meta data column of both query and subject')\n    \n    if ((as.numeric(length(query)) * as.numeric(length(subject))) > max.chunk)\n      {\n        if (verbose) \n          cat('Overflow .. computing overlaps in chunks.  Adjust max.chunk parameter to gr.findoverlaps to avoid chunked computation\\n')\n        chunk.size = floor(sqrt(max.chunk));\n        ix1 = c(seq(1, length(query), chunk.size), length(query)+1)\n        ix2 = c(seq(1, length(subject), chunk.size), length(subject)+1)\n        ij = cbind(rep(1:(length(ix1)-1), length(ix2)-1), rep(1:(length(ix2)-1), each = length(ix1)-1))\n        if (verbose)\n          print(paste('Number of chunks:', nrow(ij)))\n\n        out = do.call('c', mclapply(1:nrow(ij),\n            function(x)\n                        {\n                          if (verbose)\n                            cat(sprintf('chunk i = %s-%s (%s), j = %s-%s (%s)\\n', ix1[ij[x,1]], ix1[ij[x,1]+1]-1, length(query),\n                                        ix2[ij[x,2]], (ix2[ij[x,2]+1]-1), length(subject)))\n                          i.chunk = ix1[ij[x,1]]:(ix1[ij[x,1]+1]-1)\n                          j.chunk = ix2[ij[x,2]]:(ix2[ij[x,2]+1]-1)\n                          out = gr.findoverlaps(query[i.chunk], subject[j.chunk],  ignore.strand = ignore.strand, first = first, pintersect=pintersect, by = by, qcol = qcol, verbose = verbose, foverlaps = foverlaps, scol = scol, type = type, ...)\n                          out$query.id = i.chunk[out$query.id]\n                          out$subject.id = j.chunk[out$subject.id]\n                          return(out)\n                        }, mc.cores=mc.cores))\n\n        convert = FALSE\n        if ((return.type == 'same' & is(query, 'data.table')) | return.type == 'data.table')\n            out = grdt(out)\n        return(out)            \n      }\n\n  if (foverlaps)\n      {\n          if (verbose)\n              print('overlaps by data.table::foverlaps')\n          if (ignore.strand)\n              by = c(by, 'seqnames',  'start', 'end')\n          else\n              by = c(by, 'seqnames', 'strand', 'start', 'end')\n\n          if (!is.data.table(query))\n              {\n                  names(query) = NULL\n                  querydt = grdt(query[, setdiff(by, c('seqnames', 'start', 'end', 'strand'))])\n              }\n          else\n              {\n                  if (!all(by %in% names(query)))\n                      stop(paste('the following columns are missing from query:',\n                                 paste(by, collapse = ',')))\n                      \n                  querydt = query[, by, with = FALSE]\n              }\n          \n          if (!is.data.table(subject))\n              {\n                  names(subject) = NULL\n                  subjectdt = grdt(subject[, setdiff(by, c('seqnames', 'start', 'end', 'strand'))])\n              }\n          else\n              {\n                  if (!all(by %in% names(subject)))\n                      stop(paste('the following columns are missing from subejct:',\n                                 paste(by, collapse = ',')))\n                  subjectdt = subject[, by, with = FALSE]\n              }\n          \n          \n          ix1 = querydt$query.id = 1:nrow(querydt)\n          ix2 = subjectdt$subject.id = 1:nrow(subjectdt)\n\n          querydt = querydt[start<=end, ]\n          subjectdt = subjectdt[start<=end, ]\n          \n          querydt = querydt[, c('query.id', by), with = F]\n          subjectdt = subjectdt[, c('subject.id', by), with = F]\n          setkeyv(querydt, by)\n          setkeyv(subjectdt, by)\n\n         \n          h.df = foverlaps(querydt, subjectdt, by.x = by, by.y = by, mult = 'all', type = 'any', verbose = verbose)\n          h.df = h.df[!is.na(subject.id) & !is.na(query.id), ]\n          h.df[, start := pmax(start, i.start)]\n          h.df[, end := pmin(end, i.end)]\n\n          if (verbose)\n              cat(sprintf('Generated %s overlaps\\n', nrow(h.df)))          \n      }\n  else\n      {\n\n          if (isdt) {\n              sn1 <- query$seqnames\n              sn2 <- subject$seqnames\n          } else {\n              sn1 = as.character(seqnames(query))\n              sn2 = as.character(seqnames(subject))\n          }\n          if (is.null(by))\n              {\n                  ix1 = which(sn1 %in% sn2)\n                  ix2 = which(sn2 %in% sn1)\n              }\n          else\n              {\n                  by1 = values(query)[, by]\n                  by2 = values(subject)[, by]\n                  ix1 = which(sn1 %in% sn2 & by1 %in% by2)\n                  ix2 = which(sn2 %in% sn1 & by2 %in% by1)\n                  by1 = by1[ix1]\n                  by2 = by2[ix2]\n              }\n          \n          query.ix = query[ix1]\n          subject.ix = subject[ix2]\n          sn1 = sn1[ix1]\n          sn2 = sn2[ix2]\n          \n          \n          if (pintersect)\n              {\n                  if (verbose)\n                      print('overlaps by pintersect')\n                  require(data.table)\n                  if (length(sn1)>0 & length(sn2)>0)\n                      {\n\n                          if (is.null(by))\n                              {\n                                  dt1 <- data.table(i=seq_along(sn1), sn=sn1, key=\"sn\")\n                                  dt2 <- data.table(j=seq_along(sn2), sn=sn2, key=\"sn\")                \n                                  ij <- merge(dt1, dt2, by = 'sn', allow.cartesian=TRUE)\n                              }\n                          else\n                              {\n                                  dt1 <- data.table(i=seq_along(sn1), sn=sn1, by = by1, key=c(\"sn\", \"by\"))\n                                  dt2 <- data.table(j=seq_along(sn2), sn=sn2, by = by2, key=c(\"sn\", \"by\"))\n                                  ij <- merge(dt1, dt2, by = c('sn', 'by'), allow.cartesian=TRUE)\n                              }\n\n                          if (ignore.strand && isdt)\n                              subject$strand <- '*'\n                          else if (ignore.strand)\n                              strand(subject) = '*'\n\n                          qr <- query.ix[ij$i]\n                          sb <- subject.ix[ij$j]\n                          if (!isdt) {\n                              seqlengths(qr) <- rep(NA, length(seqlengths(qr)))\n                              seqlengths(sb) <- rep(NA, length(seqlengths(sb)))\n                          }\n                          \n                          if (!isdt && any(as.character(seqnames(qr)) != as.character(seqnames(sb))))\n                              warning('gr.findoverlaps: violated pintersect assumption')\n\n                          ## changed to ranges(qr) etc rather than just GRanges call. Major problem if too many seqlevels\n                          if (isdt) {\n                              rqr <- IRanges(start=qr$start, end=qr$end)\n                              rsb <- IRanges(start=sb$start, end=sb$end)              \n                          } else {\n                              rqr <- ranges(qr)\n                              rsb <- ranges(sb)              \n                          }\n                          tmp <- pintersect(rqr, rsb, resolve.empty = 'start.x', ...)\n                          names(tmp) = NULL\n                          non.empty = which(width(tmp)!=0)\n                          h.df = as.data.frame(tmp[non.empty])\n                          if (isdt)\n                              h.df$seqnames <- qr$seqnames[non.empty]\n                          else\n                              h.df$seqnames <- as.character(seqnames(qr))[non.empty]\n                          h.df$query.id = ij$i[non.empty]\n                          h.df$subject.id = ij$j[non.empty]\n                      }\n                  else\n                      h.df = data.frame()\n              }\n          else\n              {\n                  if (verbose)\n                      print('overlaps by findOverlaps')\n                  if (isdt) {\n                      rqr <- IRanges(start=query.ix$start, end=query.ix$end)\n                      rsb <- IRanges(start=subject.ix$start, end=subject.ix$end)              \n                  } else {\n                      rqr <- ranges(query.ix)\n                      rsb <- ranges(subject.ix)              \n                  }\n\n                  h <- findOverlaps(rqr, rsb, type = type)\n                  r <- ranges(h, rqr, rsb)   \n                  h.df <- data.frame(start = start(r), end = end(r), query.id = queryHits(h), subject.id = subjectHits(h), stringsAsFactors = F);\n                                        #        sn.query = as.character(seqnames(query))[h.df$query.id]        \n                                        #        sn.subject = as.character(seqnames(subject))[h.df$subject.id]\n                  sn.query <- sn1[h.df$query.id]\n                  sn.subject <- sn2[h.df$subject.id]\n\n                  if (is.null(by))\n                      keep.ix <- sn.query == sn.subject\n                  else\n                      {\n                          by.query <- by1[h.df$query.id]\n                          by.subject <- by2[h.df$subject.id]\n                          keep.ix <- sn.query == sn.subject & by.query == by.subject\n                      }\n                  \n                  h.df <- h.df[keep.ix, ]\n                  h.df$seqnames <- sn.query[keep.ix];\n              }\n\n          if (!ignore.strand)\n              {\n                  h.df$strand <- str.query <- as.character(strand(query)[ix1[h.df$query.id]])\n                  str.subject <- as.character(strand(subject)[ix2[h.df$subject.id]])\n                  h.df <- h.df[which(str.query == str.subject | str.query == '*' | str.subject == '*'),]            \n              }\n          else if (nrow(h.df)>0)\n              h.df$strand = '*'\n      }\n    \n    if (first)\n      h.df = h.df[!duplicated(h.df$query.id), ]\n\n     if (return.type=='GRanges') \n       if (nrow(h.df)>0)           \n           {\n               if (('strand' %in% names(h.df)))\n                   out.gr = GRanges(h.df$seqnames, IRanges(h.df$start, h.df$end),\n                       query.id = ix1[h.df$query.id], subject.id = ix2[h.df$subject.id], strand = h.df$strand, seqlengths = seqlengths(query))\n               else\n                   out.gr = GRanges(h.df$seqnames, IRanges(h.df$start, h.df$end),\n                       query.id = ix1[h.df$query.id], subject.id = ix2[h.df$subject.id], seqlengths = seqlengths(query))\n                   \n               if (!is.null(qcol))\n                   values(out.gr) = cbind(values(out.gr), values(query)[out.gr$query.id, qcol, drop = FALSE])\n\n               if (!is.null(scol))\n                   values(out.gr) = cbind(values(out.gr), values(subject)[out.gr$subject.id, scol, drop = FALSE])               \n\n               return(out.gr)\n           }\n       else\n         return(GRanges(seqlengths = seqlengths(query)))\n     else \n         if (nrow(h.df)>0) {\n             \n             if (!is.data.table(h.df))\n                 h.df = as.data.table(h.df)\n             h.df$query.id <- ix1[h.df$query.id]\n             h.df$subject.id <- ix2[h.df$subject.id]\n\n             if (!is.null(qcol))\n                 h.df = cbind(h.df, as.data.table(as.data.frame(values(query))[h.df$query.id, qcol, drop = FALSE]))\n             \n             if (!is.null(scol))\n                 h.df = cbind(h.df, as.data.table(as.data.frame(values(subject))[h.df$subject.id, scol, drop = FALSE]))\n             \n             if ('i.start' %in% colnames(h.df))\n                 h.df[, i.start := NULL]\n                          \n             if ('i.end' %in% colnames(h.df))\n                 h.df[, i.end := NULL]\n             \n             return(h.df)\n       } else {\n         return(data.table())\n       }\n   }\n\nwrite.htab <-\n  function(tab, file = NULL,\n  title = NULL, # text to be written in bold above the table  \n  footer = NULL, # text to be writen in bold below the table\n  highlight = NULL,  #vector of row indices of the table to highlight\n  row.names = TRUE,  # includes row labels\n  col.names = TRUE, # includes col labels\n  high.color = 'yellow', # highlight color to use \n  row.colors = c('lightgray', 'white'), # alternating colors to shade data rows  \n  header.colors = c('#4A4A4A', 'white'), # two element vector specifying background and text colors for header row, respectively,\n  data.size = 15, # font size in px for data, title, and footer\n  title.size = 15, footer.size = 20, header.size = round(1.1*data.size))\n  {    \n    require(hwriter)\n    require(gplots)\n    \n    if (!is.data.frame(tab))\n      tab = as.data.frame(tab)\n\n    if (is.null(rownames(tab)))\n      row.names = F;\n\n    if (!is.null(file))\n      {\n        #if (!grepl('(^~)|(^\\\\/)', file))\n        #  file = paste('~/public_html/', file, sep = '')\n      }\n    else\n      file = DEFAULT.HTAB.FILE    \n\n    for (nm in names(tab))\n        tab[[nm]] = as.character(tab[[nm]])\n    tab[is.na(tab)] = '';\n    tab = tab[1:nrow(tab), , drop = FALSE];  #not sure why this is necessary, but deflects occasional weird R bug\n\n    if (any(lix <<- sapply(names(tab), function(x) is.list(tab[, x]))))\n      for (i in which(lix))\n        tab[, i] = sapply(tab[, i], function(x) paste(x, collapse = ','))\n    \n    dir.create(dirname(normalizePath(file.dir(file))), recursive=T, showWarnings = F)\n    p = openPage(file, link.css = 'hwriter.css')\n    if (!is.null(title))\n      hwrite(title, p, style = sprintf('font-weight:bold; font-size:%spx; margin-top;50px', title.size), center = TRUE, div = TRUE, br = TRUE);\n\n    row.bgcolor = as.list(as.character(col2hex(row.colors)[(1:nrow(tab))%%length(row.colors)+1]));\n    names(row.bgcolor) = rownames(tab)\n    if (!is.null(highlight))\n      row.bgcolor[rownames(tab[highlight,, drop = FALSE])] = list(col2hex(high.color));\n\n    row.bgcolor = c(col2hex(header.colors[1]), row.bgcolor)\n\n#    if (row.names)\n      col.bgcolor = col2hex(header.colors[1])\n    \n    col.style = sprintf('font-weight:bold; font-size:%spx; color:%s; text-align:center', header.size, col2hex(header.colors[2]));\n    \n    row.style = rep(sprintf('font-size:%spx; text-align:center', data.size), nrow(tab))\n    names(row.style) = rownames(tab)\n    row.style = c(list(sprintf('font-weight:bold; font-size:%spx; color:%s; text-align:center', header.size, col2hex(header.colors[2]))), row.style)\n    \n    hwrite(tab, p, row.style = row.style, col.style = col.style, col.bgcolor = col.bgcolor, row.names = row.names, col.names = col.names,\n           row.bgcolor = row.bgcolor, table.frame = 'void', table.style = 'margin-left: 30px; margin-top: 30px', br = TRUE)\n    if (!is.null(footer))\n      hwrite(footer, p, style = sprintf('font-weight:bold; text-align:center; font-size:%spx; margin-top;50px', footer.size), center = TRUE, div = TRUE);\n    closePage(p)\n  }\n\ngr2dt <-\nfunction(gr, basic=FALSE) {\n  if (any(class(gr)=='data.table'))\n    return(gr)\n  out <- with(gr, data.table(seqnames=as.character(seqnames(gr)),\n                            start=start(gr), end=end(gr), strand=as.character(strand(gr))))\n  if (!basic && ncol(mcols(gr)))\n    out <- cbind(out, as.data.frame(mcols(gr)))\n  return(out)\n}\nlibrary(optparse)\n\noption_list = list(\n  make_option(c(\"-i\", \"--input\"),  type = \"character\", default = NULL,  help = \"Input SV VCF file\"),\n  make_option(c(\"-o\", \"--output\"), type = \"character\", default = \"no_id\",  help = \"Output annotation name\"),\n  make_option(c(\"-t\", \"--splitsupport\"), type = \"numeric\", default = 4,  help = \"Minimum number of tumor supporting reads for ASSMB\"),\n  make_option(c(\"-d\", \"--discsupport\"), type = \"numeric\", default = 10,  help = \"Minimum number of tumor support discordant for DSCRD\"),\n  make_option(c(\"-g\", \"--genes\"), type = \"logical\", default = TRUE,  help = \"Add genes to the plot?\"),\n  make_option(c(\"-H\", \"--height\"), type = \"numeric\", default = 10,  help = \"Height\"),\n  make_option(c(\"-W\", \"--width\"), type = \"numeric\", default = 10,  help = \"Width\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\nif (is.null(opt$input))\n  stop(print_help(parseobj))\n\nrequire(GenomicRanges)\n\nargs <- commandArgs(trailingOnly = TRUE)\nfiles <- args\n\n#files <- c(ind$snowman_somatic_vcf,ind$snowman_somatic_indel_vcf)[!grepl(\"DATECODE\",c(ind$snowman_somatic_vcf,ind$snowman_somatic_indel_vcf))]\nfiles <- c(ind$snowman_somatic_vcf,ind$snowman_somatic_indel_vcf)\n\n## load the SV files\nsnow.sv <- lapply(files, function(x) {\n  if (grepl(\"sv.vcf$\",x)) {\n    print(paste(basename(x), \":\", match(x, files),\"of\",length(files)))\n    if (file.exists(x)) {\n      y=ra_breaks(x)\n      mcols(y)$file = basename(x)\n      return(y)\n    } else {\n      return (GRangesList())\n    }\n  }\n  return(GRangesList())\n})\nsnow.sv <- do.call('c', snow.sv)\nmcols(snow.sv)$analysis_id = gsub(\"(.*?).snowman.somatic.sv.vcf\",'\\\\1',mcols(snow.sv)$file)\n\n## load the indel files\nsnow.indel <- lapply(files, function(x) {\n  if (grepl(\"indel.vcf$\",x)) {\n    print(paste(basename(x), \":\", match(x, files),\"of\",length(files)))\n    if (file.exists(x)) {\n      browser()\n      y=rowData(readVcf(x, \"hg19\"))\n      mcols(y)$file = basename(x)\n      return(y)\n    } else {\n      print(paste(\"File does not exist:\",x))\n      return (GRanges())\n    }\n  }\n  return (GRanges())\n})\n\nevents <- do.call('grbind',c(lapply(snow.sv, function(x) {y=unlist(x); y$span = mcols(x)$SPAN; return (y) }), snow.indel[sapply(snow.indel, length) > 0]))\nevents$span[is.na(events$span)] = 0\nevents$span <- pmax(width(events), events$span)\n\nspans <- c(unlist(lapply(snow.sv, function(x) mcols(x)$SPAN)), unlist(lapply(snow.indel, function(x) if (length(x))width(x))))\n\nspans <- events$span\ndf <- data.frame(x=log10(spans[spans > 5]))\nppdf(print(ggplot() + geom_histogram(data=df, aes(x=x), binwidth=0.1) + theme_bw() + xlab(\"Distance (bp)\") + ylab(\"Num Events\") + scale_x_continuous(breaks=1:8, label=parse(text=paste(\"10\", 1:8,sep=\"^\")))), width=10, height=6)\n"
  },
  {
    "path": "R/archive_non_functional/svaba-nozzle.R",
    "content": "#!/usr/bin/env Rscript\n\n####\n# load the libraries\n###\n.nozzleLibraries <- function() {\n\n  print('...loading libraries')\n  RLIBDIR = '/xchip/gistic/Jeremiah/R/x86_64-unknown-linux-gnu-library/3.1/'\n  GIT.HOME = '/xchip/gistic/Jeremiah/GIT/'\n  ISVA.HOME = paste(Sys.getenv('GIT_HOME'),  '/isva/', sep = \"\");\n  .libPaths(c(.libPaths(), RLIBDIR))\n  suppressMessages(suppressWarnings(require(methods, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(optparse, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(data.table, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(Rsamtools, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(Matrix, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(bitops, quietly=TRUE)))\n    suppressMessages(suppressWarnings(require(GenomicAlignments, quietly=TRUE)))\n    \n  #source(file.path(GIT.HOME,\"isva\", \"sigUtils.R\"))\n  #source(file.path(GIT.HOME,\"isva\", \"sigUtils.R\"))\n  source(file.path(GIT.HOME,\"dev/gChain/\", \"gChain.R\"))\n  ##source(file.path(GIT.HOME,\"grUtilts\", \"grUtils.R\"))\n  source(file.path(GIT.HOME,\"dev/gTrack/gTrack/R/\", \"gTrack.R\"))  \n  suppressMessages(suppressWarnings(require(Rsamtools, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(RColorBrewer, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(Nozzle.R1, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(BSgenome.Hsapiens.UCSC.hg19, quietly=TRUE)))\n  #source('/home/unix/jwala/GIT/isva/grUtils.R')\n  #source('/home/unix/jwala/GIT/isva/trackData.R')\n\n}\n\n###\n# get the base filename\n###\nfile.name = function(paths) \n  return(gsub('(^|(.*\\\\/))?([^\\\\/]*)', '\\\\3', paths))\n\n###\n# load the breakpoint files\n###\n.loadBreakpoints <- function(opt) {\n\n  ## test\n  #fp <- file.path(\"/xchip/gistic/Jeremiah/Projects/SnowmanWithIndel_140218\",\"bps.txt.gz\")\n  #tab = read.table(gzfile(fp), header=T, sep='\\t', stringsAsFactors=FALSE)\n  #tab$reads = \"\"\n\n  gr <- GRanges(c(tab$chr1, tab$chr2), IRanges(c(tab$pos1,tab$pos2), width=1)) #, strand=ifelse(c(tab$strand1, tab$strand2)=='+', 1,-1))\n  strand(gr) = c(tab$strand1, tab$strand2)\n  grl <- split(gr, tab$contig)\n\n  ## debug\n  tabr = table(tab$contig)\n  grl = grl[names(grl) %in% names(tabr[tabr==1])]\n  mcols(grl) = tab[tab$contig %in% names(tabr[tabr==1]), ]\n\n  return(list(som=grl, ger=GRangesList()))\n  \n  ## load the breakpoints\n  #breakpoints.somatic.file = file.path(opt$indir, 'breakpoints', 'breakpoints.somatic.txt')\n  #print(paste('Loading the breakpoints:', breakpoints.somatic.file))\n  #grl.sno <- sig.load.snow(breakpoints.somatic.file)[[1]]\n  \n  #breakpoints.germline.file = file.path(opt$indir, 'breakpoints', 'breakpoints.germline.txt')\n  #print(paste('Loading the breakpoints:', breakpoints.germline.file))\n  #grl.sno.g <- sig.load.snow(breakpoints.germline.file)[[1]]\n  #return(list(som=grl.sno, ger=grl.sno.g))\n}\n\n###\n#\n###\n.initializeReport <- function(r) {\n\n  intro.str = \"Somatic Analysis -- SnowmanSV (Somatic/germline structural variation detction by string graph assembly, Wala et al in prep) is a tool for detecting germline and somatic structural variations (SVs) using whole genome sequencing (WGS) data. The engine of Snowman is a modified version of String Graph Assembler (SGA) [Simpson & Durbin, Genome Research 2012]. Snowman peforms a rolling tiled assembly across the genome in slightly overlapping 5kb windows. For efficiency, only reads which are clipped, unmapped or discordant are used in the assembly. These assembled contigs are then aligned to the genome with BWA-MEM [Heng Li, 2013], and are scored based on their alignment properties and the number of supporting sequencing reads. The final result is a list of junctions and their read support.\"\n  if (opt$germline)\n    intro.str = \"Germline Analysis -- SnowmanSV (Somatic/germline structural variation detction by string graph assembly, Wala et al in prep) is a tool for detecting germline and somatic structural variations (SVs) using whole genome sequencing (WGS) data. The engine of Snowman is a modified version of String Graph Assembler (SGA) [Simpson & Durbin, Genome Research 2012]. Snowman peforms a rolling tiled assembly across the genome in slightly overlapping 5kb windows. For efficiency, only reads which are clipped, unmapped or discordant are used in the assembly. These assembled contigs are then aligned to the genome with BWA-MEM [Heng Li, 2013], and are scored based on their alignment properties and the number of supporting sequencing reads. The final result is a list of junctions and their read support.\"\n  files.str = \"Snowman produces a series of output files, which are useful for visualizing and understanding the junctions. Two core bam files are produced at the end of 'snowman run' -- r2c_clean.bam and all_bwa.bam. r2c_clean.bam is a BAM containing only reads with mappings to assembled contigs. Reads which do not assemble into contigs are discarded. Each read is in its originally aligned position, and is given a CN tag (contig) and AL tag (alignment-on-contig). all_bwa.bam is an alignment of all of the contigs to the human reference genome. r2c_final.bam and contigs_final.bam are trimmed versions of these which contain only high-confidence read-to-contig mappings, and only contigs which support either a germline or somatic event. In the 'breakpoints' folder, there are VCFs and txt files providing the breakpoints, both somatic and germline. The 'alignments' folder contains ASCII plots of the contigs and their read support. The 'plots' folder is for internal use (required to make nozzle output).\"\n  \n  r <- setReportSubTitle(r, \"Jeremiah Wala\")\n  r <- addToIntroduction(r, newParagraph(intro.str))\n  r <- addToIntroduction(r, newParagraph(files.str))\n  \n  #r <- addToSummary(r, newParagraph(intro.str))\n  return (r)\n}\n\n###\n#\n###\n.overviewFigure <- function(grl.sno, opt, r) {\n\n  print('...making the overview trackData figure')\n\n  grsno = grl.sno$som\n  suffix = 'somatic'\n  if (opt$germline) {\n    grsno = grl.sno$ger\n    suffix = 'germline'\n  }\n\n  td <- trackData()\n  td$xaxis.newline=FALSE\n  td$xaxis.chronly=TRUE\n  td$xaxis.nticks = 0\n  overview.fig = file.path(opt$outdir, paste('breakpoint_overview_', suffix, '.png', sep=''));\n  png(overview.fig, width=6000, height=800)\n  display(td, links=grsno, windows=gr.all())\n  suppressMessages(dev.off())\n  fig = newFigure(file.name(overview.fig), fileHighRes = file.name(overview.fig), exportId = \"FIGURE_1\", \"Track view of entire JaBbA graph, with unincorporated rearrangements removed.   Segments are assigned a copy number and plotted on the y axis.  Reference edges are shown in very light gray.  Red edges represent aberrant junctions and their weight corresponds to their inferred copy number. Loose ends are shown as dangling dotted blue edges.  The bottom track shows genome-wide normalized coverage\")\n  r = addToResults(r, fig)\n  return (r)\n  \n}\n\n###\n#\n###\n.makeCircos <- function(grl.sno, opt, r) {\n\n  if (!opt$germline) {\n    \n    ## add the somatic circos figure\n    circos.fig <- file.path(opt$outdir, 'circos_somatic.png')\n    circos.conf <- file.path(opt$outdir, 'circos_somatic.conf')\n    circos.svg <- file.path(opt$outdir, 'circos_somatic.svg')\n    gr2circos(opt$outdir, ra=grl.sno$som)\n    system(paste('cd', opt$outdir, '; /home/unix/marcin/Software/circos/circos-0.62-1/bin/circos'))\n    system(paste('mv', file.path(opt$outdir, 'circos.png'), circos.fig))\n    system(paste('mv', file.path(opt$outdir, 'circos.svg'), circos.svg))\n    system(paste('mv', file.path(opt$outdir, 'circos.conf'), circos.conf))\n    fig = newFigure(file.name(circos.fig), fileHigRes=file.name(circos.fig), exportId = \"FIGURE_2\", \"Somatic events\")\n    r = addToResults(r, fig)\n    \n  } else {\n\n    ## add the germline circos figure\n    circos.conf <- file.path(opt$outdir, 'circos_germline.conf')\n    circos.svg <- file.path(opt$outdir, 'circos_germline.svg')\n    circos.fig <- file.path(opt$outdir, 'circos_germline.png')\n    gr2circos(opt$outdir, ra=grl.sno$ger)\n    system(paste('cd', opt$outdir, '; /home/unix/marcin/Software/circos/circos-0.62-1/bin/circos'))\n    system(paste('mv', file.path(opt$outdir, 'circos.png'), circos.fig))\n    system(paste('mv', file.path(opt$outdir, 'circos.svg'), circos.svg))\n    system(paste('mv', file.path(opt$outdir, 'circos.conf'), circos.conf))\n    fig = newFigure(file.name(circos.fig), fileHigRes=file.name(circos.fig), exportId = \"FIGURE_2\", \"Germline events\")\n    r = addToResults(r, fig)\n  }\n  \n  return(r)\n  \n}\n\n###\n#\n###\n.getContigs <- function(opt) {\n  \n  ## read in the contigs\n  snow.contigs <- file.path(opt$indir, 'contigs.bam')\n  if (!file.exists(snow.contigs))\n    snow.contigs <- file.path(opt$indir, 'all_bwa.bam')\n  if (!file.exists(snow.contigs))\n    stop('Cannot find contigs bam file')\n  print(paste('...importing contigs from:', snow.contigs))\n  gr.contigs <- import.snowman.contigs(snow.contigs, paste(snow.contigs, \"bai\", sep='.')) \n\n  uniq = unique(mcols(grl.sno$som)$contig)\n  if (opt$germline)\n    uniq = unique(mcols(grl.sno$ger)$cname)\n  gr.contigs <- gr.contigs[gr.contigs$qname %in% uniq] ## keep only contigs in somatic breaks\n  suppressWarnings(gr.contigs <- gr.contigs[order(nchar(gr.contigs$seq), decreasing=TRUE)]) ## put longest seqs in front, to deal with potential hard clipping\n  \n  ix <- !is.na(gr.contigs$cigar)\n  gr.contigs <- gr.contigs[ix]\n  return(gr.contigs)\n  \n}\n\n###\n#\n###\n.getReads <- function(opt) {\n  \n  ## read in the reads\n  #snow.reads <- file.path(opt$indir, 'plots/readsForR_som.txt')\n  #if (opt$germline)\n  #    snow.reads <- file.path(opt$indir, 'plots/readsForR_ger.txt')\n  #if (!file.exists(snow.reads))\n  #  stop(paste('Cannot find', snow.reads))\n  #print(paste('`...importing reads from:', snow.reads))\n  #gr.reads   <- import.snowman.reads(snow.reads)\n\n  bam = file.path(opt$indir, \"r2c_clean.bam\")\n  bami = file.path(opt$indir, \"r2c_clean.bam.bai\")\n  gr.reads = read.bam(bam, bami=bami, tag=c(\"AL\", \"SW\", \"CN\", \"SR\", \"TS\"), pairs.grl=FALSE)\n  #gr.reads$tn = substring(gr.reads$rname, 1,1)\n  #gr.reads$rqname = gsub(\"[a-z]+[0-9]+_?(.*)\", \"\\\\1\", gr.reads$rname)\n  #gr.reads$rheader = gsub(\"[^_]+($)\", \"\\\\1\", gr.reads$rname)\n  #gr.reads$rqname = substring(gr.reads$rname, nchar(gr.reads$rheader)+1, nchar(gr.reads$rname))\n  #gr.reads$flag = as.numeric(gsub(\"[a-z]+([0-9]+)_?(.*)\", \"\\\\1\", gr.reads$rheader))\n  gr.reads <- gr.reads[!is.na(gr.reads$AL) & !is.na(gr.reads$CN) & !is.na(gr.reads$SR)]\n  al <- unlist(strsplit(gr.reads$AL, \"x\"))\n  cn <- unlist(strsplit(gr.reads$CN, \"x\"))\n  len <- sapply(strsplit(gr.reads$AL, \"x\"), length)\n  seq <- rep(gr.reads$TS, len)\n  seq[is.na(seq)] = gr.reads$seq[is.na(seq)]\n\n  #ix = !is.na(as.integer(al)) ##debug\n  grr <- GRanges(seqnames=cn, IRanges(as.integer(al), width=nchar(seq)), seq=seq)\n  grr$cigar = paste(nchar(seq), \"M\", sep=\"\")\n  grr$rname = rep(gr.reads$qname, len)\n  \n  return(grr)\n}\n\n###\n#\n###\n\n.getTrackData <- function(cgc, r2g, gr.contigs.this, gr.reads.this) {\n\n  ## subet them\n  cgc_t <- gSubset(cgc, xnames=unique(gr.contigs.this$qname))\n  r2g_t <- gSubset(r2g, xnames=gr.reads.this$rname)\n  if (length(links(r2g_t)$x)  == 0 || length(links(cgc_t)$x) == 0)\n    return (trackData())\n\n  umap <- gr.reads.this$rname[bitAnd(gr.reads.this$flag, 4) != 0]\n  \n  ix = !duplicated(gr.contigs.this$qname)\n  cseq.set <- DNAStringSet(gr.contigs.this$seq[ix])\n  names(cseq.set) <- gr.contigs.this$qname[ix]\n  ix <- !duplicated(gr.reads.this$rname)\n  rseq.set <- DNAStringSet(gr.reads.this$seq[ix])\n  names(rseq.set) <- gr.reads.this$rname[ix]\n  \n  grl.contig.seq <- seq2grl(cseq.set) ## max because of hard clipping issue\n  grs.contig <- lift(cgc_t, grl.contig.seq)\n  td.c2g <- do.call('trackData', c(list(data=grs.contig, track.name='Contig', labels.suppress=TRUE)))\n  \n  grs.reads <- seq2grl(rseq.set, sn=names(rseq.set))\n  reads2genome <- lift(r2g_t, grs.reads, pintersect=TRUE)\n  r2g.umap <- reads2genome[ names(reads2genome) %in% umap]\n  r2g.map  <- reads2genome[!names(reads2genome) %in% umap]\n  td.r2g.u <- do.call('trackData', c(list(data=r2g.umap, track.name='UMap', labels.suppress=TRUE)))\n  td.r2g.m <- do.call('trackData', c(list(data=r2g.map, track.name='Map', labels.suppress=TRUE)))\n  td.r2g <- c(td.r2g.u, td.r2g.m)\n  \n   ## lift the contig onto the genome\n  gr.cdum <- GRanges(names(cseq.set),IRanges(1,width(cseq.set)),strand='+')\n  suppressWarnings(rr <- lift(cgc_t, gr.cdum))\n  rr$mapq <- values(cgc)$mapq[rr$link.id]\n  rr$col[!is.na(rr$mapq)] <- alpha('darkred', rr$mapq[!is.na(rr$mapq)]/60)\n  rr$col[ is.na(rr$mapq)] <- 'yellow'\n  rr$border <- 'black'\n  rr.split <- split(rr, rr$query.id)\n  names(rr.split) = names(cseq.set)\n  \n  ## make contig mapq track data\n  td.c <- do.call('trackData', c(list(data=rr.split, labels.suppress=TRUE, draw.paths=TRUE)))\n  \n  td.r2g$height = 10\n  td.c2g$height = 1\n  td.c$height = 1\n  \n  tds <- c(td.r2g, td.c2g, td.c)\n  tds$xaxis.nticks=2\n  tds$xaxis.newline=FALSE\n  tds$xaxis.cex = 2.0\n  tds$xaxis.unit = 1;\n  tds$xaxis.suffix = \"\"\n  return(tds)\n  \n}\n\n.getN50 <- function(opt, r) {\n\n  ## load the contigs\n  print('...reading contig fasta')\n  contigs.file = file.path(opt$indir, 'all_contigs_bootstrap.fa')\n  if (!file.exists(contigs.file)) {\n    print(paste(\"Contigs file for estimating N50 does not exist:\", contigs.file))\n    return (r)\n  }\n    \n  awk.cmd = paste(\"awk 'NR % 2 == 0 {print length}'\", contigs.file)\n  ab <- as.numeric(read.table(pipe(awk.cmd),header=FALSE)$V1)\n  n50 <- Biostrings::N50(ab)\n\n  ymax = max(table(cut(log(ab,10),breaks=seq(0,4,by=0.01))))\n  lab = seq(from=2, to=3.5, by=0.1)\n  p <- ggplot() + geom_histogram(data=data.frame(len=ab), aes(x=log(len,10)), binwidth=0.01, color='black', fill=NA) +\n    geom_line(data=data.frame(x=rep(log(n50,10),2), y=c(0, ymax)), aes(x=x, y=y), color='red') +\n    geom_text(data=data.frame(x=0.1 + log(n50,10), y=ymax), aes(x=x, y=y, label=paste(\"N50: \", n50, 'bp', sep='')), color='red') +\n    theme_bw() + xlab('Contig length') + ylab('Count') + scale_x_continuous(breaks=lab, labels=parse(text=paste('10', lab, sep='^')))\n\n  png(file.path(opt$outdir, 'N50hist.png'), width=800, height=400)\n  print(p)\n  dev.off()\n\n  fig = newFigure('N50hist.png', fileHigRes='N50hist.png', exporId=\"FIGURE_1000\",\n    paste(\"Distribution of lengths of assembled contigs. The N50 is\", n50))\n  r = addToResults(r, fig)\n  return (r)\n  \n}\n\n.getTrackDataAlign <- function(cgc, r2g, gr.contigs.this, gr.reads.this) {\n\n  cgc_t <- gSubset(cgc, xnames=unique(gr.contigs.this$qname))\n  r2g_t <- gSubset(r2g, xnames=gr.reads.this$rname)\n  if (length(links(r2g_t)$x)  == 0 || length(links(cgc_t)$x) == 0)\n    return (trackData())\n\n  gr.reads.this$col <- 'gray'\n  gr.reads.this$border <- 'black'\n  \n  ## isolate discordant read pairs\n  tab <- table(gr.reads.this$rname)\n  gr.reads.this$col[gr.reads.this$rname %in% names(tab[tab==2])] <- 'blue'\n\n  ## isolate the unmapped reads\n  gr.reads.this$border[bitAnd(gr.reads.this$flag, 4) != 0] <- 'red'\n\n  ## make the new reads struct\n  grr <- GRanges(gr.reads.this$rname, IRanges(1, nchar(gr.reads.this$seq)))\n  grr$col <- gr.reads.this$col\n  grr$border <- gr.reads.this$border\n  grr$rname <- gr.reads.this$rname\n\n  grl.grr <- split(grr, grr$rname)\n  reads2genome <- lift(r2g_t, grl.grr)\n  \n  tdo <- trackData(reads2genome, labels.suppress=TRUE)\n  return(tdo)\n}\n\n#####################################\n########### RUN NOZZLE ##############\n#####################################\n\n## load the libraries\n.nozzleLibraries()\n\noption_list = list(\n  make_option(c(\"-i\", \"--indir\"), type = \"character\", default = './', help = \"Path to breakpoints file breakpoints.somatic.text in Snowman output directory, or root Snowman output directory\"),\n  make_option(c(\"-g\", \"--germline\"), type = \"character\", default = 'false', help = \"Set this flag to true to output germline snowman results instead of somatic. Default: false\"),\n  make_option(c(\"-m\", \"--maxpngs\"), type = \"integer\", default = 1e8, help = \"Maximum PNGS to produce per report subheading\"),\n  make_option(c(\"-c\", \"--cores\"), type = \"integer\", default = 1, help = \"Number of cores to use\"),\n  make_option(c(\"-o\", \"--outdir\"), type = \"character\", default = './', help = \"Directory to dump output into\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\n## make the output directory\nif (!grepl(\"nozzle\", opt$outdir)) \n  opt$outdir = file.path(opt$outdir, 'nozzle')\ndir.create(opt$outdir, showWarnings=FALSE)\n\nopt$germline = grepl(\"t|T\", opt$germline)\n\n## load the breakpoints\ngrl.sno = .loadBreakpoints(opt)\n\n##debug\ngrl.sno$ger = grl.sno$som\n# Phase 1: create report elements\nr <- newReport( \"SnowmanSV -- Structural variation detection by genome-wide local assembly\" )\nr <- .initializeReport(r)\n\n## add the overview figure\nr <- .overviewFigure(grl.sno, opt, r)\n\n## add the contig N50 figure\n#r <- .getN50(opt, r)\n\n## make the circos figures\nr <- .makeCircos(grl.sno, opt, r)\n\n## grab the contigs and reads\ngr.contigs <- .getContigs(opt)\ngr.reads   <- .getReads(opt)\ngr.reads <- gr.reads[as.logical(seqnames(gr.reads) %in% gr.contigs$qname)]\ngr.contigs <- gr.contigs[gr.contigs$qname %in% unique(as.character(seqnames(gr.reads)))]\n\n## make the trackData\nsuppressWarnings(cgc <- cgChain(gr.contigs, sn=gr.contigs$qname))\nsuppressWarnings(pac <- cgChain(gr.reads, sn=gr.reads$rname))\nsuppressWarnings(r2g <- gMultiply(cgc, pac, pintersect=TRUE))\n\nsuppressWarnings(tdr <- track.refgene())\n\n## loop through and run\nnams <- unique(gr.contigs$qname)\nsuffix = 'somatic'\nsn <- as.character(seqnames(gr.reads))\nif (opt$germline)\n  suffix = 'germline'\n\ngrl_this = grl.sno$som\nif (opt$germline)\n  grl_this = grl.sno$ger\n\nout <- mclapply(seq_along(nams), function(x) {\n\n  print(paste(\"Working on contig: \", x, \"of\", length(nams)))\n  outfile.png = file.path(opt$outdir, paste(\"contig_\", x, '_', suffix, '.png', sep=''))\n  outfile.pdf = file.path(opt$outdir, paste(\"contig_\", x, '_', suffix, '.pdf', sep=''))\n\n  gr.contigs.this <- gr.contigs[gr.contigs$qname == nams[x]]\n  gr.reads.this <- gr.reads[sn == nams[x]]\n\n  ## get the sequences track data\n  tds <- suppressWarnings(.getTrackData(cgc, r2g, gr.contigs.this, gr.reads.this))\n  tds <- c(tds, tdr)\n\n  ## get the alignment track data\n  tda <- suppressWarnings(.getTrackDataAlign(cgc, r2g, gr.contigs.this, gr.reads.this))\n  \n  ## set the window\n  win <- streduce(gr.contigs.this)\n  \n  ## make the sequences plot\n  png(outfile.png, width=1500, height=600)\n  display(c(tda, tds), windows=win, links=grl_this, cex.ylabel=1)\n  dev.off()\n\n  pdf(outfile.pdf, width=15, height=10)\n  display(c(tda, tds), windows=win, links=grl_this, cex.ylabel=1)\n  dev.off()\n\n  \n  ## make the alignment plot  \n  mc <- mcols(grl_this)\n  mc <- mc[mc$cname == nams[x],] \n  \n  ## add the figure to the plot\n   expid = sprintf(\"BREAKPOINT_FIGURE_%s\", x)\n  break1 = paste(mc$chr1, \":\", mc$pos1, \"(\", mc$strand1, \"){MAPQ: \", mc$mapq1, \"}\", sep=\"\")\n  break2 = paste(mc$chr2, \":\", mc$pos2, \"(\", mc$strand2, \"){MAPQ: \", mc$mapq2, \"}\", sep=\"\")\n  lead = sprintf(\"Breakpoint plot of junction %s. From the top down: The red arrows at the top give the orientation of the junction, with the arrowhead pointing towards the joined DNA (away from the junction). The contig is then shown below, colored with respect to MAPQ, with white = MAPQ 0 and dark red = MAPQ 60. The contig sequence is also shown. The individual reads supporting this contig are displayed as mapped to the genome *through* their mapping to the contig. The reads were identified as potentially supporting this contig within 'snowman run', and were more thouroughly Smith-Waterman realigned in 'snowman gather'. Reads with > 6 bases on both sides of the junction are 'split' reads.\", x)\n  caption = paste(lead, \"Breakpoint plot of junction\", x, \"[ Name:\", mc$cname, \"] -- [ Somatic breakpoint junction:\", x, \"] -- [ Tumor Split Reads:\", mc$tsplit, \"] -- [ Normal Split Reads:\",\n    mc$nsplit, \"] -- [ Break1:\", break1, \"] -- [ Break2:\", break2, \"] -- [ Span:\", mc$span,\n    \"] -- [ Homology:\", mc$homology, \"] -- [ Insertion:\", mc$insertion, \"] -- [ Num Times Break Found:\", mc$num.dups+1, \"] -- [ Number of Alignments:\",\n    mc$num.parts, \"]\")\n  \n  fig = newFigure(file.name(outfile.png), fileHigRes=file.name(outfile.png), exportId = expid, caption)\n  return(fig);\n    \n}, mc.cores=opt$cores)\n\nfor (i in seq_along(out))\n  r = addToResults(r, out[[i]])\n\n# Phase 3: render report to file\nprint('...done with report sending to file')\noutpath <- file.path(opt$outdir, paste(\"snowman_report\", suffix, sep='_'))\nwriteReport(r, filename=outpath); # w/o extension\n\n## test\nif (FALSE) {\n  gr.reads$tn = substring(gr.reads$rname, 1,1)\n  gr.reads$rqname = gsub(\"[a-z]+[0-9]+_?(.*)\", \"\\\\1\", gr.reads$rname)\n  gr.reads$rheader = gsub(\"[^_]+($)\", \"\\\\1\", gr.reads$rname)\n  gr.reads$rqname = substring(gr.reads$rname, nchar(gr.reads$rheader)+1, nchar(gr.reads$rname))\n  gr.reads$flag = as.numeric(gsub(\"[a-z]+([0-9]+)_?(.*)\", \"\\\\1\", gr.reads$rheader))\n  gr.reads.per <- split(gr.reads, seqnames(gr.reads))\n\n  ## grab the discordant reads\n  gr.test = gr.reads.per[[1]]\n  tab = table(gr.test$rqname)\n  gr.test.disc = gr.test[gr.test$rqname %in% names(tab[tab==2])]\n  grl.test.disc = GRangesList()\n  if (length(gr.test.disc))\n    grl.test.disc = split(gr.test.disc, gr.test.disc$rqname)\n}\n"
  },
  {
    "path": "R/archive_non_functional/svaba-sig.R",
    "content": "#!/usr/bin/env Rscript\n\nlibrary(optparse)\nrequire(VariantAnnotation)\n\noption_list = list(\n    make_option(c(\"-i\", \"--input\"),        type = \"character\", default = \"qcreport.txt\",  help = \"Input txt file from a snowman preprocess qcreport.txt\"),\n    make_option(c(\"-o\", \"--output\"),       type = \"character\", default = \"qcreport.pdf\",  help = \"Output pdf to generate\"),\n    make_option(c(\"-f\", \"--FHworkspace\"),  type = \"character\", default = NULL,            help = \"Firehose workspace to retrieve data from\"),\n    make_option(c(\"-p\", \"--FHpairset\"),    type = \"character\", default = NULL,            help = \"Firehose pairset to retreive data from\"),\n    make_option(c(\"-a\", \"--FHannotation\"), type = \"character\", default = NULL,            help = \"Firehose annoation to retreive data from\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\nfhsum = sum(c(!is.null(opt$FHworkspace), !is.null(opt$FHpairset), !is.null(opt$FHannotation)))\nGETFH = fhsum == 3\nif (fhsum %in% c(1,2))\n  print(print_help(parseobj))\n  stop(\"If importing from FH, must specify fully the FHworkspace, FHpairset and FHannotation\")\n}\n\nif (is.null(opt$input))\n  stop(print_help(parseobj))\n\nif (!file.exists(opt$input)) {\n  print(print_help(parseobj))\n  stop(paste(\"Input file does not exist\", opt$input, \". Must supply path to valid qcreport.txt file (generated from snowman preprocess or snowman run\"))\n}\n\nsource('/home/unix/jwala/GIT/isva/Taiga/R/sourceall.R')\n\n########################\n## some functions\n########################\nsource.all <- function() {\n\n  suppressMessages(suppressWarnings(require(ff, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(VariantAnnotation, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(rtracklayer, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(data.table, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(plyr, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(ggplot2, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(reshape2, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(GenomicRanges, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(popbio, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(BSgenome.Hsapiens.UCSC.hg19, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(bitops, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(seqinr, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(Rsamtools, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(ff, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(multicore, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(Biostrings, quietly=TRUE)))  \n  suppressMessages(suppressWarnings(require(rtracklayer, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(lattice, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(RColorBrewer, quietly=TRUE)))\n  suppressMessages(suppressWarnings(require(Matrix, quietly=TRUE)))\n\n}\n\nround.n <- function(x, n) n * round(x / n)\n\nlm_eqn = function(m){\n    eq <- substitute(italic(y) == a + b %.% italic(x)*\",\"~~italic(r)^2~\"=\"~r2,\n                              list(a = format(coef(m)[1], digits = 2),\n                                                 b = format(coef(m)[2], digits = 2),\n                                                r2 = format(summary(m)$r.squared, digits = 3)))\n    as.character(as.expression(eq));\n}\n\n## power.law.plot\npower.law.plot <- function(pspan, plotname) {\n  print(paste('...making power-law plot for', plotname))\n  ex <- ecdf(pspan[pspan > 0])\n  #grid <- c(seq(0,10000,5), seq(10000,10^7,100))\n  df = data.frame(pspan = pspan, cdf = ex(pspan), pspan.log = log(pspan,10), cdf.log = log(ex(pspan), 10))\n  df <- df[df$cdf.log > -1000,] ## get rid of -Inf\n  lm.s <- lm(df$cdf.log ~ df$pspan.log)\n  lm.eq = lm_eqn(lm.s)\n\n  yb = c(0.01,0.02,0.03,0.04,0.05,0.10,0.2, 0.3, 0.4,0.5,0.75,1)\n\n  pdf(file.path(opt$outdir, plotname), width=5,height=5)\n  print(g <- ggplot() + geom_point(data=df, aes(x=pspan.log, y=cdf.log), size=1, color=\"blue\") +\n    geom_smooth(data=df, aes(x=pspan.log, y=cdf.log), method=\"lm\",se=F) +\n        geom_text(aes(x=4.5,y=log(0.01,10), label=lm.eq), label=lm.eq, parse=T) +\n    theme_bw() + ylab(\"CDF\") + xlab(\"Span (bp)\") +\n    scale_y_continuous(breaks=log(yb,10), labels=format(yb,digits=2), limits=c(log(yb[1],10), 0)) +\n    scale_x_continuous(breaks=seq(0,7), labels=parse(text=paste('10', seq(0,7), sep='^'))))\n  dev.off()\n}\n\n\n##################################\n################ load from data ##\n##################################\nif (GETFH) {\n  ind <- fiss_get(opt$FHpairset, wkspace=opt$FHworkspace, type='pair')\n  vcf <- ind[, opt$FHannotation]\n} else {\n\n}\n\nprint('...loading VCF files')\ntoload = file.exists(vcf)\ncols = sample(colors(), sum(toload))\nra <- lapply(vcf[toload], function(x) {\n  ab = ra_breaks(x)\n  mcols(ab)$individual = basename(x)\n  mcols(ab)$border = mcols(ab)$col = cols[match(x, vcf)]\n  return (ab)\n})\n\n## place in data table form\nra.bound = do.call('grlbind', ra)\nra.ul <- grl.unlist(ra.bound)\nra.dt <- gr2dt(ra.ul)\n\n## get the spans\nspan = ra.dt[, abs(end[1]-end[2]) * (seqnames[1] == seqnames[2]), by=grl.ix]$V1\nmcols(ra.bound)$span = span\nmcols(ra.bound)$span[mcols(ra.bound)$span == 0] = NA\n\n## set the logical for methods\ns  = mcols(ra.bound)$CALLER == \"S\"\nd  = mcols(ra.bound)$CALLER == \"D\"\nds = mcols(ra.bound)$CALLER == \"DS\"\n\n############################\n## make the overlap pie chart\n############################\ncols = c(ovlp.hue, dran.hue, snow.hue)\nlevs = c(\"Both\", \"dRanger\", \"SnowmanSV\")\ndf <- data.frame(Caller=c(\"SnowmanSV\", \"dRanger\", \"Both\"), counts=c(sum(s, na.rm=T), sum(d, na.rm=T), sum(ds, na.rm=T)), stringsAsFactors=FALSE)\ng <- ggplot(df, aes(x=factor(1), y=counts, fill=Caller)) + geom_bar(stat='identity', position=\"fill\") + coord_polar(theta=\"y\") + xlab(\"\") + ylab(\"\") +\n  scale_fill_manual(values=cols, breaks=levs)\npdf(file.path(opt$outdir, \"caller_overlap_pie.pdf\")); print(g); dev.off()\n\n############################\n## make the 1/L distribution\n############################\npower.law.plot(span, \"power_law_DS.pdf\")\npower.law.plot(span[which(s)], \"power_law_S.pdf\")\npower.law.plot(span[which(d)], \"power_law_D.pdf\")\n\n###############################################\n## check if anything overlaps with cancer genes\n###############################################\ncgc.genes <- track.load('cgc')\nfo <- gr.findoverlaps(ra.ul, gr.pad(cgc.genes, 5e4))\ntab <- table(fo$subject.id)\ngene.nums = as.numeric(names(tab))\nnames(tab) <- cgc.genes$gene[gene.nums]\ntab.lenscale = tab / width(cgc.genes[gene.nums])\n\n## generate PDFs for all of these\ntd.rg.cgc = track.refgene(genes = cgc.genes$gene, height=3)\nord = order(tab.lenscale, decreasing=T)\ndir.create(file.path(opt$outdir, \"CGCgenes\"), showWarnings=FALSE)\n\ndum <- sapply(seq_along(ord), function(x) \n{\n  gene = names(tab.lenscale[ord[x]])\n  ## find the partners\n  gene.window = gr.pad(cgc.genes[cgc.genes$gene == gene], 5e4)\n  rar.hits = ra.bound[ceiling(gr.findoverlaps(ra.ul, gene.window)$query.id/2)]\n  windows <- streduce(grbind(gr.pad(streduce(rar.hits), 5e4), gene.window))\n  nindiv = length(unique(mcols(rar.hits)$individual))\n                                      \n  print(paste(\"plotting CGC gene\", gene))\n  pdf(file.path(opt$outdir, \"CGCgenes\", paste(\"rank_\",sprintf(\"%04d\",x),\"_\",names(tab.lenscale[ord[x]]), \"_NIndiv_\", nindiv, \".pdf\", sep=\"\")))\n  #pdf(file.path(opt$outdir, \"ROS1_special.pdf\"))  \n  td.rg.cgc$xaxis.newline = T\n  td.rg.cgc$xaxis.cex = 0.5\n  td.rg.cgc$xaxis.cex.label = 0.5\n  td.rg.cgc$xaxis.nticks = 2\n  display(td.rg.cgc, links=rar.hits, window=windows)\n  dev.off()\n})\n\n##############################\n## matrix plot\n##############################\ngrt  = gr.tile(gr.all(), w=10e6)\nmat <- sig.tri.matrix(ra.bound, grt, log=TRUE)\ntd.mat  <- do.call('trackData', c(allopts, list(grt, mdata=mat, triangle=TRUE,\n                  cmap.min=min(mat), cmap.max=max(mat)+0.1, track.name='Triangle',\n                  height=25, sep.lwd=0.5, m.bg.col='white',\n                  track.name='Breakpoint-pair Heatmap', islog=TRUE, xaxis.nticks=0,\n                  xaxis.prefix=\"\", xaxis.chronly=TRUE)))\npdf(file.path(opt$outdir, \"overview_matrix.pdf\"), width=12, height=12)\ndisplay(td.mat, windows=streduce(gr.all()))\ndev.off()\n\n## per chrom\ngrt  = gr.tile(gr.all(), w=10e6)\nmat <- sig.tri.matrix(ra.bound, grt, log=TRUE)\ntd.mat  <- do.call('trackData', c(allopts, list(grt, mdata=mat, triangle=TRUE,\n                  cmap.min=min(mat)+0.1, cmap.max=max(mat)+0.1, track.name='Triangle',\n                  height=25, sep.lwd=0.5, m.bg.col='white',\n                  track.name='Breakpoint-pair Heatmap', islog=TRUE, xaxis.nticks=0,\n                  xaxis.prefix=\"\", xaxis.chronly=TRUE)))\ndum <- lapply(seq(23), function(x) {\n  print(paste(\"plotting for chr\", x))\n  pdf(file.path(opt$outdir, paste(\"chr\",x,\"_matrix.pdf\",sep=\"\")), width=12, height=12)\n  display(td.mat, windows=streduce(gr.all()[x]))\n  dev.off()\n})\n\n\n################################################\n## Start the significance testing ##\n################################################\n## load data for 1e6 binned mapping\ndload <- sig.load.bins('1e6')\ngrt <- dload$grt\nmat.background = sig.2d.map.background(dt2gr(grt), nomap=FALSE)\n\nfo <- sig.bin.counts(ra.bound, dt2gr(grt)) ## place events into bins\nfo[, sample.counts := nrow(.SD), by='sample'] ## get total number of binned-events per sample\nsetkey(fo, sample) ## sort by sample count\nM <- structure(as.numeric(fo$sample.counts[!duplicated(fo)]), names=fo$sample[!duplicated(fo)]) ## M is number mutations per sample\nM <- M[order(names(M))]\nexclude <- names(M[M < 1]) ## drop really weak samples\nM <- M[!names(M) %in% exclude]\nra.bound <- ra.bound[!mcols(ra.bound)$individual %in% exclude]\n\n## normalize background probablity matrix by total intra/inter chrom rate\nempirical.background.prob <- sig.generate.normalized.matrices(ra.bound, dload$mat, M, single.mat=TRUE)\n## get the total vector of background F-scores\nsystem.time(f.back <- sig.2d.permute(empirical.background.prob, M, num.permute = 1000, method='1d'))\nf.back2 <- f.back[f.back > 0]\n## plot the distribution of f scores\nf.back2 <- f.back[f.back > 0]\npdf(file.path(opt$outdir, \"fscore_distribution.pdf\"), height=3.5, width=10)\nhist(f.back2, col='black', breaks=300, xlab='F-score', ylab='Count', main='F-score distribution under NULL')\ndev.off()\n\n## get a trackData for the bin probabilities\n#all.bin.probs <- colSums(do.call('rbind', lapply(all.mats, colSums))) / length(all.mats)\nall.bin.probs <- colSums(empirical.background.prob)\ngrt$binprobs <- all.bin.probs\ngrt$col <- grt$border <- chr_colors[as.character(seqnames(dt2gr(grt)))]\ngrt$binprobs <- -log(grt$binprobs, 10)\ntd.binprob <- trackData(dt2gr(grt), y.field='binprobs', xaxis.newline=FALSE, xaxis.chronly=TRUE, track.name='-Log(Bin Background Probability)',\n                        y0=3.3, y1=3.9, circles=TRUE, lwd.border=0.5, xaxis.nticks = 0, xaxis.prefix=\"\")\npdf(file.path(opt$outdir, \"td_bin_background_probabiltiies.pdf\"), width=10)\ndisplay(td.binprob, windows=gr.all())\ndev.off()\n\n## get the actual f-score\nf.real <- sig.fscore(grl, dt2gr(grt), empirical.background.prob)\n\n## get the p and q values\npq = sig.fscore2pval(f.back, f.real)\ngrt$pval <- pq$pval\ngrt$qval <- pq$qval\n\n## make the qq-plot\npdf(file.path(opt$outdir, \"qqplot.pdf\"), width=5, height=5)\nqq_pval(grt$pval)\ndev.off()\n\ngrt$n.log10.q <- -log(grt$qval, 10)\ngrt$col <- grt$border <- chr_colors[as.character(seqnames(dt2gr(grt)))]\ntd.sig <- trackData(dt2gr(grt), y.field='n.log10.q', circles=TRUE, track.name='-log10(Q-value)', lwd.border=0.5, xaxis.chronly=T, y0=0, xaxis.prefix=\"\", xaxis.nticks=0)\nppdf(display(td.sig, windows=gr.all()))\n\ntd.refgenes <- track.refgene()\ndir.create(file.path(opt$outdir, \"topsighits\"), showWarnings=FALSE)\n### plot all the hits above -log10(q) = 1\nwhich.hits <- which(grt$n.log10.q) > 1\ndum <- lapply(seq_along(which.hits), function(x)\n{\n\n  y = which.hits[x]\n  window = dt2gr(grt)[y]\n  genes <- unique(gr.genes$gene[gr.findoverlaps(gr.genes, window)$query.id])\n  genes.string <- paste(genes, collapse = \" \")\n  print(paste(\"Plotting top significance bin\", x, \"of\", sum(grt$n.log10.q > 1), \"which is region\", grt$seqnames[y],\":\", grt$start[y], \"-\", grt$end[y], \"which contains genes\", genes.string))\n  \n  rar.hits <- ra.bound[ceiling(gr.findoverlaps(ra.ul, window)$query.id/2)]\n  disp.window <- streduce(grbind(gr.pad(streduce(rar.hits),5e4),window))\n\n  pdf(file.path(opt$outdir, \"topsighits\", paste(\"hit_\", x, \"q_\",sprintf(\"%04f\",grt$n.log10.q[y]),\".pdf\", sep=\"\")))\n  td.rg.cgc$xaxis.newline = T\n  td.rg.cgc$xaxis.cex = 0.5\n  td.rg.cgc$xaxis.cex.label = 0.5\n  td.rg.cgc$xaxis.nticks = 2\n  td.rg.cgc$cex.tick = 0.5\n  td.rg.cgc$track.name = \"Cancer Genes\"\n  td.refgenes$track.name = \"All Genes\"\n  display(c(td.rg.cgc, td.refgenes), links=rar.hits, window=disp.window)\n  dev.off()\n  hitnum = hitnum + 1\n})\n"
  },
  {
    "path": "R/archive_non_functional/svaba-vcf-to-maflite.R",
    "content": "#!/usr/bin/env Rscript\n\nsuppressMessages(suppressWarnings(require(optparse, quietly=TRUE)))\n\noption_list = list(\n    make_option(c(\"-i\", \"--input\"),  type = \"character\", default = NULL,  help = \"Input bps.txt.gz file\"),\n    make_option(c(\"-o\", \"--output\"), type = \"character\", default = \"vars.lite.maf\",  help = \"Output MAFLITE\")\n)\n\nparseobj = OptionParser(option_list=option_list)\nopt = parse_args(parseobj)\n\nif (is.null(opt$input))\n  stop(print_help(parseobj))\n\nprint('...loading VariantAnnotation package')\nsuppressMessages(suppressWarnings(require(VariantAnnotation, quietly=TRUE)))\n\nprint('...reading VCF')\nv <- readVcf(opt$input, \"hg19\")\ninf <- info(v)\ngr <- rowData(v)\n\n## remove non indel lines\ngr <- gr[inf$EVDNC==\"INDEL\",]\ninf <- inf[inf$EVDNC==\"INDEL\",]\n\n## remove unnecesry columns\n#tab <- data.frame(chr=as.character(seqnames(gr)), startr=start(gr), endr=end(gr), ref=gr$REF, alt=gr$ALT)\ntab <- data.frame(chr=as.character(seqnames(gr)), startr=start(gr), end=end(gr), ref=as.character(gr$REF), alt=as.character(gr$ALT), stringsAsFactors=FALSE)\ndel = sapply(tab$ref, nchar)  > sapply(tab$alt, nchar)\nins = sapply(tab$ref, nchar)  < sapply(tab$alt, nchar)\n\ntab$alt[ins] <- inf$INSERTION[ins]\ntab$ref[del] <- sapply(tab$ref[del], function(x) substr(x, 2, nchar(x)))\n\ntab$alt[del] = \"-\"\ntab$ref[ins] = \"-\"\n\ntab <- cbind(tab, inf[, c(\"SCTG\", \"SPAN\", \"MAPQ\", \"TSPLIT\", \"NSPLIT\")])\nwrite.table(tab, file=opt$output, quote=FALSE, sep=\"\\t\", row.names=FALSE, col.names = FALSE)\n\n\n## oncotate it\nif (grepl(\"oncotator\", Sys.getenv(\"PATH\"))) {\n  cmd = paste(\"oncotator\", opt$output, \"vars.maf\", \"hg19\")\n  print(\"Oncotate this MAF lite with the following command:\")\n  print(cmd)\n}\n  \n"
  },
  {
    "path": "README.md",
    "content": "## *SvABA* — Structural variation and indel analysis by assembly\n\nSvABA (formerly *Snowman*) is an SV and indel caller for short-read BAMs.\nIt performs genome-wide local assembly with a vendored SGA, realigns\ncontigs with BWA-MEM, and scores variants by reassembled read support.\nTumor/normal, trios, and single-sample modes are supported; variants\nare emitted as VCF plus a verbose tab-delimited companion\n(`bps.txt.gz`) that carries the full per-sample evidence.\n\n**License:** [GNU GPLv3](./LICENSE). Uses the [SeqLib][seqlib] API for\nBAM I/O, BWA-MEM alignment, interval trees, and the assembly front-end.\n\n## Install\n\nCMake is required; htslib is an external dependency (no bundled\ncopy). If htslib is installed system-wide, svaba auto-detects it\nvia pkg-config or the default include/lib search paths:\n\n```bash\ngit clone --recursive https://github.com/walaj/svaba\ncd svaba && mkdir build && cd build\ncmake .. && make -j\n```\n\nFor a non-standard htslib install location, point at it explicitly:\n\n```bash\ncmake .. -DHTSLIB_DIR=/path/to/htslib-1.xx\nmake -j\n```\n\nTo link jemalloc at compile time (recommended on Linux for `-p 16+`\nruns — eliminates allocator contention, no `LD_PRELOAD` needed):\n\n```bash\ncmake .. -DUSE_JEMALLOC=ON\nmake -j\n```\n\nThe binary lands at `build/svaba`. To install it system-wide (or\ninto this repo's `bin/`), use CMake's install target — the default\nprefix is `/usr/local` and needs sudo, or override it with\n`-DCMAKE_INSTALL_PREFIX`:\n\n```bash\nmake install                                           # /usr/local/bin/svaba\ncmake --install build --prefix $(pwd)/..               # repo-local bin/svaba\n```\n\nBuild type defaults to `RelWithDebInfo` (`-O2 -g -DNDEBUG`). The\nvendored `SeqLib/bwa` and `SeqLib/fermi-lite` hardcode `-O2` in their\nMakefiles; see `CLAUDE.md` for how to push them to `-O3 -mcpu=native`\n(typically a 5–15% wall-time win).\n\n### Assembler selection\n\nBy default svaba assembles contigs with **fermi-lite** (ropebwt2-based,\nthe faster path). The vendored SGA (String Graph Assembler) is still\nfully supported but off by default — switch it on at compile time by\npassing `-DSVABA_ASSEMBLER_FERMI=0` to CMake:\n\n```bash\ncmake .. -DSVABA_ASSEMBLER_FERMI=0\nmake -j\n```\n\nThe choice is a single compile-time symbol in\n`src/svaba/SvabaAssemblerConfig.h`; you can also flip it by editing that\nfile directly and rebuilding. Runtime logs report the active\nassembler under `svaba::kAssemblerName`, so you can always confirm\nwhich engine a build was compiled with.\n\n### jemalloc (Linux, high thread count)\n\nOn Linux, running svaba with **jemalloc** as the allocator typically\nwins 10–20 % wall-time at `-p 16+` (large WGS, tumor/normal). svaba's\nper-thread assembly loop generates heavy malloc/free traffic and\nglibc's default allocator serializes on its arena locks under that\ncontention pattern; jemalloc's thread-local arenas sidestep the\nproblem. The repo ships a drop-in wrapper at `./svaba_jemalloc` that\n`LD_PRELOAD`s the system `libjemalloc.so.2` and then exec's svaba:\n\n```bash\n# one-liner replacement for `svaba run ...`:\n./svaba_jemalloc run -t tumor.bam -n normal.bam -G ref.fa -a my_run -p 16 \\\n                     --blacklist tracks/hg38.combined_blacklist.bed\n```\n\nInstall jemalloc first (`apt install libjemalloc2`, `yum install\njemalloc`, `dnf install jemalloc`). The wrapper auto-detects the\nlibrary under the standard distro paths; if yours is elsewhere, set\n`JEMALLOC_LIB=/path/to/libjemalloc.so.2`. If the svaba binary isn't on\nyour `$PATH`, set `SVABA=/path/to/svaba`.\n\nFor very high concurrency (`-p 24+`), also pass jemalloc's own tuning\nknobs via `MALLOC_CONF`:\n\n```bash\nMALLOC_CONF=background_thread:true,narenas:24,dirty_decay_ms:10000 \\\n    ./svaba_jemalloc run -p 24 ...\n```\n\n`narenas` should match or modestly exceed the thread count;\n`background_thread:true` asks jemalloc to reclaim dirty pages on a\nbackground thread instead of in the hot path.\n\n**macOS users should not use jemalloc.** Apple's native libmalloc\n(with its nanomalloc fast path for small allocations) and the\nDYLD_INSERT_LIBRARIES mechanism combine to run 5–10× slower than\nsystem malloc on this exact workload in our A/B tests. The wrapper\nrefuses to run on Darwin for that reason. Stick with the system\nallocator on macOS.\n\n## Quick start\n\nThree steps. Run the caller, merge + dedup + index the per-thread\noutputs, then convert the deduped `bps.txt.gz` to VCF. The bundled\ncombined blacklist is strongly recommended — it keeps svaba out of\nwell-known pileup / high-complexity regions that would otherwise\ndominate wall-clock time with no real calls to show for it. See\n`tracks/README.md` for customizing or extending the blacklist.\n\n```bash\n# 1. Call: tumor/normal on chr22 with 4 threads, bundled blacklist\nsvaba run -t tumor.bam -n normal.bam -G ref.fa -a my_run -p 4 \\\n          -k chr22 \\\n          --blacklist tracks/hg38.combined_blacklist.bed\n\n# 2. Post-process: merge per-thread BAMs, sort+dedup+index,\n#    sort+dedup bps.txt.gz, filter r2c to PASS.\nscripts/svaba_postprocess.sh -t 8 -m 4G my_run\n\n# 3. Convert the deduped bps.txt.gz to VCFv4.5 (SV + indel)\nsvaba tovcf -i my_run.bps.sorted.dedup.txt.gz -b tumor.bam -a my_run\n```\n\nA single-sample call drops `-n`. Any number of cases/controls can be\njointly assembled; prefix on the sample ID drives case/control routing\n(`t*` = case, `n*` = control).\n\n## Subcommands\n\nSvABA is a multi-tool binary. `svaba help` lists everything. The main\nones:\n\n`svaba run` performs the whole assembly + variant-calling pipeline.\nTakes a BAM (or many) plus a reference, a blacklist, and an output ID.\nEmits `bps.txt.gz`, per-sample VCFs, `contigs.bam`, `runtime.txt`, and\n(with `--dump-reads`) per-thread `*.discordant.bam`,\n`*.corrected.bam`, `*.weird.bam`, and `*.r2c.txt.gz`.\n\n`svaba postprocess` sorts, deduplicates, @PG-stamps, and indexes the\nper-thread BAMs and the `bps.txt.gz` emitted by `svaba run`. Typically\ninvoked via `scripts/svaba_postprocess.sh` which also merges per-thread\nfiles and builds the PASS / PASS-somatic r2c subsets.\n\n`svaba tovcf` converts a deduplicated `bps.txt.gz` into VCFv4.5 output\n(one SV VCF, one indel VCF; somatic distinguished by the `SOMATIC`\nINFO flag). Clean intrachrom events emit as symbolic `<DEL>`/`<DUP>`/\n`<INV>`; everything else stays paired BND. Input is assumed already\nsorted/deduped by `svaba_postprocess.sh` — use `--dedup` to opt back\ninto the legacy internal dedup.\n\nThe `SOMATIC` flag is stamped when a record's somatic LOD\n(`INFO/SOMLOD`) meets or exceeds a configurable cutoff; the default\nis **1.0**, which is a reasonable \"confident somatic\" gate and keeps\nmarginal calls out of the somatic set. Tune it with `--somlod`:\n\n```bash\nsvaba tovcf -i deduped.bps.txt.gz -b tumor.bam -a my_run            # default somlod >= 1\nsvaba tovcf ... --somlod 2.0                                         # stricter: only strong somatic calls\nsvaba tovcf ... --somlod 0.0                                         # permissive: flag anything with LO_s >= 0\n```\n\nThe raw score is always written to `INFO/SOMLOD` regardless of the\ncutoff, so downstream `bcftools view -i 'INFO/SOMLOD >= 3'` still\nworks if you want to re-threshold after the fact without regenerating\nthe VCF.\n\n`svaba refilter` re-runs the LOD cutoffs / PASS logic on an existing\n`bps.txt.gz` with new thresholds, regenerating VCFs without rerunning\nassembly. Use it when you want to tune sensitivity/specificity after\nthe fact.\n\n## Output files\n\n`${ID}.bps.txt.gz` is the primary output — one row per breakpoint,\nwith a v3 schema of 52 core columns + per-sample blocks (see\n`BreakPoint::header` for column names). The 52nd column is a unique\n`bp_id` of the form `bpTTTNNNNNNNN` that joins back to the BAM aux\ntags and the VCF `EVENT=` field. `${ID}.contigs.bam` holds every\nassembled contig, `${ID}.runtime.txt` holds per-region timing, and\n`${ID}.log` carries the run log.\n\nThe VCF files (`${ID}.sv.vcf.gz`, `${ID}.indel.vcf.gz`) declare\n`VCFv4.5`, use symbolic alleles where unambiguous, and carry the\ncanonical scoring in INFO: `MAXLOD` (variant-vs-error, per-sample\nmax), `SOMLOD` (somatic LLR), `SOMATIC` (flag), and `SVCLAIM`\n(evidence class). VCF `QUAL` defaults to `.` — filter on `FILTER=PASS`\nor the two LOD fields, not QUAL. See `CLAUDE.md` for the full scoring\nmodel.\n\nOpt-in outputs (gated behind `--dump-reads`): `${ID}.r2c.txt.gz` is a\nstructured, re-plottable dump of every contig + its r2c-aligned reads;\n`${ID}.corrected.bam` / `${ID}.weird.bam` / `${ID}.discordant.bam`\ncarry per-read evidence streams. These can run to tens of GB on deep\nsamples, so they're off by default.\n\n## Post-processing pipeline\n\n`svaba run` emits per-thread, unsorted BAMs and a raw per-thread\n`r2c.txt.gz`. Merge + sort + dedup + filter them with one command:\n\n```bash\nscripts/svaba_postprocess.sh -t 8 -m 4G my_run\n```\n\nFive idempotent steps: merge per-thread BAMs and r2c files, run\n`svaba postprocess` (sort + stream-dedup + @PG-stamp + index), sort\nand dedup `bps.txt.gz` with PASS filter, emit PASS / PASS-somatic\nsubsets of `r2c.txt.gz`, and (optional) demux the BAMs by source\nprefix. See `CLAUDE.md` for the full flag surface.\n\n## Viewers\n\nAll-HTML, no server, drop files in from `file://`. Entry point:\n`viewer/index.html`. The primary viewer is `bps_explorer.html` —\nsortable `bps.txt.gz` table with chip filters, per-sample detail\npanel, log10 histograms for somlod/maxlod/span, and click-to-IGV\nnavigation. `r2c_explorer.html` re-plots the structured r2c TSV in\nbrowser (contig ruler, fragment rows, indel `||` marker rows with\nlabels, per-read gap-expanded CIGAR, bp_id filter dropdown).\n`runtime_explorer.html` visualizes `runtime.txt`; `comparison.html`\ndoes side-by-side diffs of two runs.\n\n`viewer/alignments_viewer.html` still renders the legacy\n`alignments.txt.gz` ASCII output, but new runs don't produce that\nfile — `r2c_explorer.html` is the replacement.\n\n## Blacklists\n\n`tracks/hg38.combined_blacklist.bed` is the ready-made blacklist;\nfeed it to `svaba run --blacklist`. It is a regeneratable union of\ncomponent BED files in `tracks/` (ENCODE, high-runtime regions, manual\ncurations, simple repeats, non-standard contigs, and a\nlow-mappability blacklist derived from paired mosdepth runs). See\n`tracks/README.md` for the recipe.\n\n## Debugging recipes\n\n### Trace a specific read through the entire pipeline\n\nCompile with `-DSVABA_TRACE_READ` to get per-decision-point stderr output\nfor a single read (by QNAME) from BAM ingestion through to output tagging.\nZero runtime cost when not compiled in (all trace macros compile to no-ops).\n\n```bash\ncmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo \\\n      -DCMAKE_CXX_FLAGS='-DSVABA_TRACE_READ=\"\\\"LH00306:129:227V5CLT4:6:1204:38807:7191\\\"\"'\ncmake --build build -j$(nproc)\n\n# Run on just the region containing the read (faster iteration)\nsvaba run -t tumor.bam -n normal.bam -G ref.fa -p 4 \\\n    -k chr2:215000000-216000000 --dump-reads -a trace_run 2> read_trace.log\n\ngrep READ_TRACE read_trace.log\n```\n\nThe trace covers every gate the read hits:\n\n| Stage | Log prefix | What it tells you |\n|-------|-----------|-------------------|\n| BAM read & filter | (various, from SvabaBamWalker) | Dup/QC/blacklist gates, rule_pass, NM salvage, adapter filter, quality trim, buffer admission |\n| BFC error correction | `BFC corrected:` | Whether BFC changed the sequence and by how much |\n| R2C alignment | `R2C SKIP:` / `R2C HIT:` | Perfect-ref-match skip, or which contigs the read aligned to (AS score, CIGAR) |\n| Native realignment | `NATIVE_REALIGN:` | Whether the corrected seq was re-aligned to ref or reused the BAM CIGAR |\n| Split coverage scoring | `SPLIT_COV enter` | Entry into per-BP scoring with r2c coords and breakpoint positions |\n| R2C vs native gate | `SPLIT_COV TP8` | The critical score comparison: r2c_score, native_score, both CIGARs, NM values |\n| Indel-at-break check | `SPLIT_COV TP9` | Whether an r2c CIGAR indel lands at the breakpoint |\n| Span check | `SPLIT_COV TP10` | Whether the read spans the breakpoint(s), with exact coord bounds |\n| DEL-covers-break | `SPLIT_COV TP11` | Whether an r2c deletion masks the breakpoint |\n| Final verdict | `SPLIT_COV CREDITED` / `NOT CREDITED` / `SKIPPED` | Did this read count as a variant supporter? |\n| Output tagging | `OUTPUT TAG bi:Z` | BP id stamped on the read, confidence, somatic status |\n\nExample trace (abridged) for a read supporting a somatic 1bp deletion:\n\n```\n[READ_TRACE:SvabaBamWalker.cpp:203] read=LH00306:129:... flag=163 mapq=60 pos=chr2:215869800 ...\n[READ_TRACE:SvabaBamWalker.cpp:236] PASS mr.isValid rule_pass=1\n[READ_TRACE:SvabaBamWalker.cpp:340] ADDED to read buffer (n=847)\n[READ_TRACE:SvabaRegionProcessor.cpp:377] BFC corrected: changed=NO ...\n[READ_TRACE:SvabaRegionProcessor.cpp:808] R2C HIT: contig=c_fermi_chr2_... AS=150 rc=0 CIGAR=75M1D74M\n[READ_TRACE:SvabaRegionProcessor.cpp:978] NATIVE_REALIGN: reusing BAM CIGAR (seq unchanged by BFC)\n[READ_TRACE:BreakPoint.cpp:379] SPLIT_COV enter contig=c_fermi_chr2_... r2c_start=340 r2c_end=489 ...\n[READ_TRACE:BreakPoint.cpp:476] SPLIT_COV TP8 PASS r2c>native r2c_score=150 native_score=143 ...\n[READ_TRACE:BreakPoint.cpp:601] SPLIT_COV TP10 span check issplit1=1 issplit2=1 one_split=1\n[READ_TRACE:BreakPoint.cpp:697] SPLIT_COV CREDITED as variant supporter sample=t000 tumor=1\n[READ_TRACE:SvabaRegionProcessor.cpp:1346] OUTPUT TAG bi:Z bp_id=bp00100000042 confidence=PASS somatic=1\n```\n\n### Trace a specific contig\n\n```bash\ncmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo \\\n      -DCMAKE_CXX_FLAGS='-DSVABA_TRACE_CONTIG=\"\\\"c_fermi_chr2_215869501_215894501_13C\\\"\"'\ncmake --build build -j$(nproc)\n```\n\nShows assembly filtering (TP1–TP5), variant identification (TP6),\nper-read split-coverage scoring (TP8–TP11), breakpoint confidence\n(TP13–TP16, TP23).\n\n### Trace both a read AND a contig simultaneously\n\n```bash\ncmake -B build \\\n      -DCMAKE_CXX_FLAGS='-DSVABA_TRACE_READ=\"\\\"LH00306:129:227V5CLT4:6:1204:38807:7191\\\"\" \\\n                          -DSVABA_TRACE_CONTIG=\"\\\"c_fermi_chr2_215869501_215894501_13C\\\"\"'\ncmake --build build -j$(nproc)\n```\n\nIndependent prefixes (`[READ_TRACE:...]` vs `[TRACE:...]`) — grep for either.\n\n### Trace ALL reads or ALL contigs (very noisy)\n\n```bash\ncmake ... -DCMAKE_CXX_FLAGS='-DSVABA_TRACE_ALL_READS=1'   # every read\ncmake ... -DCMAKE_CXX_FLAGS='-DSVABA_TRACE_ALL=1'          # every contig\n```\n\nBest combined with a small `-k` region.\n\n### Finding a read's QNAME to trace\n\n```bash\n# From bps.txt.gz — get contig name (col 30) and bp_id (col 52)\nzcat results.bps.txt.gz | awk -F'\\t' '$1==\"chr2\" && $2 > 215869000 && $2 < 215870000'\n\n# From the corrected BAM — reads tagged with a specific bp_id\nsamtools view results.corrected.bam chr2:215869000-215870000 | grep \"bi:Z:.*bp00100000042\"\n\n# From the r2c TSV — all reads for a contig\nzcat results.r2c.txt.gz | awk -F'\\t' '$2 == \"c_fermi_chr2_215869501_215894501_13C\" && $1 == \"read\"' | cut -f8\n```\n\n### Restrict assembly to reads containing a specific kmer\n\n```bash\ncmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo \\\n      -DCMAKE_CXX_FLAGS='-DSVABA_KMER_RESTRICT=\"\\\"CCATGCAGAGTGTTGAAGAAAAGGC\\\"\"'\ncmake --build build -j$(nproc)\n```\n\nAfter BFC error correction, only reads whose corrected sequence\ncontains the specified kmer (or its reverse complement) survive.\nAll other reads get `to_assemble = false` — they won't enter fermi\nassembly, r2c alignment, corrected.bam, or scoring. The log prints\nkept/dropped counts per region.\n\nUse case: you see a suspicious contig and want to know whether\nassembly still produces it when restricted to reads from a particular\nlocus. Pick a 25-mer unique to that locus, compile with\n`SVABA_KMER_RESTRICT`, and run on the same region:\n\n```bash\nsvaba run -t tumor.bam -n normal.bam -G ref.fa -k chr11:5000000-5100000 \\\n          -a kmer_test --dump-reads -p 1\n```\n\nIf the chimeric contig still assembles, the kmer-carrying reads are\nsufficient to produce it. If it disappears, reads from elsewhere\nwere required.\n\nCan be combined with read/contig tracing:\n\n```bash\ncmake -B build \\\n      -DCMAKE_CXX_FLAGS='-DSVABA_KMER_RESTRICT=\"\\\"CCATGCAGAGTGTTGAAGAAAAGGC\\\"\" \\\n                          -DSVABA_TRACE_CONTIG=\"\\\"c_fermi_chr11_5000001_5100001_3C\\\"\"'\n```\n\n### Disable the r2c-vs-native gate (for debugging only)\n\n```bash\ncmake ... -DCMAKE_CXX_FLAGS='-DSVABA_R2C_NATIVE_GATE=0'\n```\n\nRestores old behavior where any r2c-spanning read credits as variant supporter.\nWill reintroduce false-positive somatic calls from homology-trap reads.\n\n---\n\n## Alt-contig demotion\n\nBWA-MEM sometimes places a contig fragment on an alt contig (e.g.\n`chr11_JH159136v1_alt`) when chr11 proper has an equally good\nalignment. If the alt later gets blacklisted, the real breakpoint\nis lost.\n\nsvaba now requests secondary alignments for contigs and runs a\npost-alignment step (`preferStandardChromosomes`): for each\nprimary/supplementary fragment on a non-standard chromosome\n(ChrID > `maxMateChrID`, default 23), it looks for a secondary\nalignment on a standard chromosome that:\n\n- Covers ≥ 80% of the same query range (reciprocal overlap)\n- Has AS ≥ 95% of the non-standard alignment's AS\n\nIf found, the standard-chr alignment is promoted (gets the\nprimary/supplementary flag) and the non-standard one is demoted\nto secondary. The contig trace (`SVABA_TRACE_CONTIG`) logs each\nswap with both chromosome IDs and alignment scores.\n\nThis is controlled by `--max-mate-chr` (same constant used for\nmate-region lookup). `--non-human` sets it to -1, which disables\nalt-demotion entirely (no chromosome is \"non-standard\").\n\n---\n\n## Recipes\n\nGermline-only. Raise the mate-lookup threshold so only larger\ndiscordant clusters trigger a cross-region lookup — more conservative\nand usually appropriate for a single-sample germline run where we\ndon't have a built-in control to guard against mapping artifacts\n(a tumor would typically see smaller, subclonal clusters we want\nto chase down). Add `--single-end` to disable mate lookups entirely\nif you want to be even more conservative:\n\n```bash\nsvaba run -t germline.bam -p 8 --mate-min 6 -a germline_run \\\n          -G ref.fa \\\n          --blacklist tracks/hg38.combined_blacklist.bed\n```\n\nTargeted assembly over a list of regions (BED, chr, or IGV-style\nstring):\n\n```bash\nsvaba run -t sample.bam -k targets.bed -a exome_cap -G ref.fa\nsvaba run -t sample.bam -k chr17:7,541,145-7,621,399 -a TP53 -G ref.fa\n```\n\nDump all per-read evidence (large output, only for debugging a\nspecific call):\n\n```bash\nsvaba run -t sample.bam -G ref.fa -a debug_run --dump-reads\nscripts/svaba_postprocess.sh -t 8 -m 4G debug_run\n```\n\nNon-human genome (e.g. mouse, zebrafish, _C. elegans_). By default\nsvaba assumes a human reference: mate-region lookups skip chromosomes\npast chrY (ChrID > 23), and insert-size learning samples only the\nprimary assembly (chr1–chrY). `--non-human` removes these gates so\nevery contig in the reference is treated equally:\n\n```bash\nsvaba run -t mouse.bam -G mm39.fa -a mouse_run --non-human -p 16\n```\n\nThe flag sets `maxMateChrID = -1` internally. You can also fine-tune\nindividually: `--max-mate-chr 19` (mouse has 19 autosomes + X + Y =\nChrIDs 0–20 in a typical reference), `--min-mate-mapq 10` (require\nMAPQ ≥ 10 on the primary read before chasing its mate).\n\nSnapshot where a long-running job currently is:\n\n```bash\ntail my_run.log\n```\n\n## Further reading\n\n`CLAUDE.md` at the repo root is the crash-safety-net doc — conventions,\nfile landmarks, build-system quirks (the `-O2` hardcoding in\nsubmodules), the somatic LOD model, the postprocess pipeline details,\nperformance notes, and open investigations. Always update `CLAUDE.md`\nwhen you change something non-obvious.\n\n`scripts/svaba_local_function.sh` is a sourceable bash helper library\nwith `svaba_*` utilities for grepping contigs, following a bp_id\nthrough the output set, opening locations in IGV, etc. Source it from\nyour shell rc file to use.\n\n## Issues and contact\n\nPlease file bug reports, feature requests, and questions on the GitHub\nissues tracker: https://github.com/walaj/svaba/issues.\n\n## Attributions\n\nSvABA is developed by Jeremiah Wala in the Rameen Berkoukhim lab at\nDana-Farber Cancer Institute, in collaboration with the Cancer Genome\nAnalysis team at the Broad Institute. Particular thanks to Cheng-Zhong\nZhang (HMS DBMI) and Marcin Imielinski (Weill Cornell / NYGC).\n\nAdditional thanks to Jared Simpson for SGA, Heng Li for htslib and\nBWA, and the SeqLib contributors.\n\nThe SvABA 2.0 release and its documentation were built with the\nassistance of OpenAI Codex and Anthropic Claude, with extensive\nhuman-in-the-loop review, testing, and decision-making throughout.\n\n[seqlib]: https://github.com/walaj/SeqLib\n"
  },
  {
    "path": "docs/README.md",
    "content": "# SvABA BPS Viewer\n\nThis folder contains a standalone static viewer for SvABA `bps.txt` and `bps.txt.gz` files.\n\n## Files\n\n- `index.html`: app shell\n- `styles.css`: layout and visual styling\n- `app.js`: parser, filters, table, and detail pane\n- `svaba/am.bps.txt.gz`: bundled example file already present in this repo\n\n## Usage\n\nYou can open `index.html` directly and use the file picker for local files.\n\nIf you want the bundled example button to work, serve this folder over HTTP:\n\n```bash\ncd /Users/jeremiahwala/git/svaba/viewer\npython3 -m http.server 8000\n```\n\nThen open [http://localhost:8000](http://localhost:8000).\n\n## Current filter set\n\nThe UI supports:\n\n- free-text search across locus, contig, alleles, confidence, DBSNP, and sample fields\n- numeric filtering for `somlod`, `maxlod`, `qual`, split support, ALT support, and discordant support\n- button filters for derived event type, raw evidence (`type`), confidence (`conf`), and somatic state\n- export of the currently filtered rows as TSV\n\n## Notes\n\n- The raw header contains duplicate `alt` names. In the viewer these are treated as `alt_allele` and `alt_count`.\n- The raw `type` column is evidence (`INDEL`, `ASDIS`, `DSCRD`, `ASSMB`). The viewer also derives a separate event class to make filtering more usable.\n"
  },
  {
    "path": "docs/alignments_viewer.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>svaba alignments viewer</title>\n<style>\n  :root {\n    --bg: #0e1116;\n    --panel: #161b22;\n    --panel-2: #1c2230;\n    --fg: #e6edf3;\n    --muted: #8b949e;\n    --border: #30363d;\n    --accent: #58a6ff;\n    --accent-2: #3fb950;\n    --warn: #f0883e;\n    --danger: #f85149;\n    --header-bg: #1f2a3a;\n    --variant-bg: #2d1b1b;\n    --contig-bg: #16321a;\n    --marker-bg: #2a1f3a;\n  }\n  * { box-sizing: border-box; }\n  html, body { margin: 0; padding: 0; background: var(--bg); color: var(--fg);\n    font-family: ui-sans-serif, -apple-system, \"Segoe UI\", Roboto, sans-serif; height: 100%; }\n  body { display: flex; flex-direction: column; overflow: hidden; }\n\n  header.toolbar {\n    flex: 0 0 auto;\n    padding: 8px 14px;\n    background: var(--panel);\n    border-bottom: 1px solid var(--border);\n    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;\n  }\n  header.toolbar h1 {\n    margin: 0 8px 0 0; font-size: 14px; font-weight: 600; color: var(--accent);\n    letter-spacing: 0.02em;\n  }\n  .group {\n    display: inline-flex; align-items: center; gap: 6px;\n    padding: 2px 8px; border: 1px solid var(--border);\n    border-radius: 6px; background: var(--panel-2);\n  }\n  .group .label { color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; }\n  .group .filename { font-family: ui-monospace, Menlo, Consolas, monospace;\n    font-size: 12px; color: var(--fg); max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n  .group .filename.empty { color: var(--muted); font-style: italic; }\n\n  label.btn, button, input[type=\"search\"], input[type=\"text\"] {\n    background: var(--panel-2); color: var(--fg);\n    border: 1px solid var(--border); border-radius: 6px;\n    padding: 5px 10px; font-size: 12px; cursor: pointer;\n    font-family: inherit;\n  }\n  button:hover, label.btn:hover { border-color: var(--accent); }\n  input[type=\"file\"] { display: none; }\n  input[type=\"search\"], input[type=\"text\"] {\n    cursor: text;\n    font-family: ui-monospace, Menlo, Consolas, monospace;\n  }\n  input[type=\"search\"] { min-width: 260px; }\n  button.primary { background: var(--accent); color: #fff; border-color: var(--accent); font-weight: 600; }\n  button.primary:hover { filter: brightness(1.1); }\n  button.danger { color: var(--danger); }\n  button:disabled { opacity: 0.4; cursor: not-allowed; }\n\n  .spacer { flex: 1; }\n\n  #status {\n    flex: 0 0 auto;\n    padding: 4px 14px;\n    background: var(--panel);\n    border-bottom: 1px solid var(--border);\n    color: var(--muted);\n    font-size: 12px;\n    font-family: ui-monospace, Menlo, Consolas, monospace;\n    display: none;\n  }\n  #status.show { display: block; }\n  #status.err { color: var(--danger); }\n  #status.ok  { color: var(--accent-2); }\n\n  /* split layout */\n  main.split {\n    flex: 1 1 auto;\n    display: flex; flex-direction: column;\n    min-height: 0;\n  }\n  section.pane {\n    min-height: 0; min-width: 0;\n    display: flex; flex-direction: column;\n    background: var(--bg);\n    border-bottom: 1px solid var(--border);\n  }\n  section.pane:last-child { border-bottom: none; }\n  section.pane > .pane-header {\n    flex: 0 0 auto;\n    padding: 4px 10px;\n    background: var(--panel);\n    border-bottom: 1px solid var(--border);\n    font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em;\n    color: var(--muted); display: flex; align-items: center; gap: 8px;\n  }\n  section.pane > .pane-body {\n    flex: 1 1 auto;\n    overflow: auto;   /* hor + vert scroll, no wrap */\n    min-height: 0;\n  }\n  #bpsPane { flex: 0 0 35%; }\n  #alnPane { flex: 1 1 auto; }\n\n  .divider {\n    flex: 0 0 5px;\n    background: var(--border);\n    cursor: row-resize;\n  }\n  .divider:hover { background: var(--accent); }\n\n  .empty {\n    height: 100%;\n    display: flex; align-items: center; justify-content: center;\n    color: var(--muted);\n    font-size: 13px;\n    padding: 24px;\n    text-align: center;\n  }\n  .empty code { background: var(--panel-2); padding: 1px 6px; border-radius: 3px; }\n\n  pre.alignments {\n    margin: 0;\n    padding: 6px 12px;\n    /* SvABA2.0: pin a strict fixed-width font and disable every variable-\n       width feature so that lowercase-clip bases line up perfectly with\n       the uppercase matched bases above/below them. ui-monospace can map\n       to fonts with kerning/ligatures/contextual alternates enabled\n       (Cascadia, JetBrains Mono, Menlo with custom prefs) which subtly\n       offset lowercase columns. The font-feature-settings + variant\n       ligatures disables prevent that. Courier New is the last-resort\n       fallback because it's the most reliably monospaced font on every\n       platform. */\n    font-family: \"SF Mono\", \"Menlo\", \"Consolas\", \"DejaVu Sans Mono\",\n                 \"Liberation Mono\", \"Courier New\", monospace;\n    font-variant-ligatures: none;\n    font-feature-settings: \"liga\" 0, \"calt\" 0, \"dlig\" 0, \"clig\" 0, \"hlig\" 0, \"kern\" 0;\n    font-kerning: none;\n    letter-spacing: 0;\n    font-size: 12px;\n    line-height: 1.25;\n    white-space: pre;\n    color: var(--fg);\n    width: max-content;\n    min-width: 100%;\n  }\n  pre.alignments .row {\n    display: block;\n    padding: 0 4px;\n    border-radius: 2px;\n  }\n  pre.alignments .row.hidden { display: none; }\n\n  .row.r-indel  { background: var(--variant-bg); color: #ffb4a8; font-weight: 600; }\n  .row.r-cigar  { background: var(--header-bg); color: #c9d1d9; }\n  .row.r-marker { background: var(--marker-bg); color: #d2a8ff; }\n  .row.r-contig { background: var(--contig-bg); color: #9eea9e; font-weight: 600; }\n  .row.r-other  { color: var(--muted); }\n\n  /* bps table */\n  .bps-table {\n    font-family: ui-monospace, Menlo, Consolas, monospace;\n    font-size: 11px;\n    border-collapse: collapse;\n    width: max-content;\n    min-width: 100%;\n  }\n  .bps-table thead th {\n    position: sticky; top: 0; z-index: 2;\n    background: var(--panel); color: var(--muted);\n    text-align: left; padding: 4px 8px;\n    border-bottom: 1px solid var(--border);\n    font-weight: 600; text-transform: lowercase;\n    white-space: nowrap;\n  }\n  .bps-table tbody td {\n    padding: 2px 8px; border-bottom: 1px solid rgba(48,54,61,0.4);\n    white-space: nowrap;\n  }\n  .bps-table tbody tr { cursor: default; }\n  .bps-table tbody tr:hover { background: #1f2937; }\n  .bps-table tbody tr.selected { background: #1e3a5f; }\n  .bps-table tbody td { user-select: text; -webkit-user-select: text; }\n  .bps-table td.c-contig {\n    cursor: pointer;\n    text-decoration: underline dotted;\n    text-underline-offset: 2px;\n  }\n  .bps-table td.c-contig:hover { color: #fff; background: #1e3a5f; }\n  .bps-table td.c-load {\n    cursor: pointer;\n    color: var(--accent);\n    text-align: center;\n    width: 1.5em;\n    font-weight: 700;\n    user-select: none;\n  }\n  .bps-table td.c-load:hover { background: #1e3a5f; color: #fff; }\n  .bps-table tbody tr.pass td.c-conf { color: var(--accent-2); font-weight: 600; }\n  .bps-table tbody tr td.c-contig { color: var(--accent); }\n  .bps-table tbody tr td.c-somlod,\n  .bps-table tbody tr td.c-maxlod { text-align: right; }\n  .bps-table th.sample-col,\n  .bps-table td.sample-col {\n    background: rgba(88, 166, 255, 0.06);\n    border-left: 1px solid rgba(88,166,255,0.18);\n  }\n  .bps-table td.sample-col { color: #c9d1d9; }\n  .bps-table thead th.sample-col { color: var(--accent); }\n\n  /* Genotype FORMAT key panel above the bps table */\n  .format-key {\n    padding: 6px 10px;\n    background: var(--panel);\n    border-bottom: 1px solid var(--border);\n    font-size: 11px;\n    color: var(--muted);\n    display: flex; flex-direction: column; gap: 3px;\n    position: sticky; top: 0; z-index: 3;\n  }\n  .format-key .fk-title { color: var(--fg); font-weight: 600; font-size: 11px;\n    text-transform: uppercase; letter-spacing: 0.04em; }\n  .format-key .fk-row { display: flex; align-items: center; gap: 8px;\n    font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 12px; color: var(--fg); }\n  .format-key .fk-tag {\n    display: inline-block; padding: 0 6px; border-radius: 3px;\n    font-family: ui-sans-serif, sans-serif; font-size: 10px;\n    font-weight: 700; letter-spacing: 0.05em;\n  }\n  .format-key .fk-tag.fk-sv    { background: #1f3a5f; color: #79c0ff; }\n  .format-key .fk-tag.fk-indel { background: #3a1f5f; color: #d2a8ff; }\n  .format-key code { background: transparent; color: inherit; }\n  .format-key .fk-defs {\n    display: flex; flex-wrap: wrap; gap: 4px 12px;\n    margin-top: 2px; font-family: ui-sans-serif, sans-serif;\n  }\n  .format-key .fk-def code {\n    background: var(--panel-2); padding: 0 4px; border-radius: 3px;\n    color: var(--accent-2); font-family: ui-monospace, Menlo, Consolas, monospace;\n    margin-right: 3px;\n  }\n\n  .legend {\n    padding: 4px 10px;\n    background: var(--panel);\n    border-bottom: 1px solid var(--border);\n    display: flex; gap: 8px; flex-wrap: wrap; align-items: center;\n    font-size: 11px; color: var(--muted);\n  }\n  .legend .swatch {\n    display: inline-flex; align-items: center; gap: 4px;\n    padding: 1px 6px; border-radius: 3px;\n    font-family: ui-monospace, Menlo, Consolas, monospace;\n    color: #fff; font-size: 11px; cursor: pointer;\n  }\n\n  #progress { display: none; }\n  #progress.show { display: inline-block; }\n\n  .hint { color: var(--muted); font-size: 11px; }\n</style>\n</head>\n<body>\n\n<header class=\"toolbar\">\n  <h1>svaba alignments viewer</h1>\n\n  <span class=\"group\" title=\"bps.txt or bps.txt.gz — used to look up contig by breakpoint position\">\n    <span class=\"label\">bps</span>\n    <label class=\"btn\" for=\"bpsFile\">choose</label>\n    <input id=\"bpsFile\" type=\"file\" accept=\".txt,.gz,.tsv,*\">\n    <span id=\"bpsFileName\" class=\"filename empty\">(not set)</span>\n  </span>\n\n  <span class=\"group\" title=\"alignments.txt or alignments.txt.gz\">\n    <span class=\"label\">aln</span>\n    <label class=\"btn\" for=\"alnFile\">choose</label>\n    <input id=\"alnFile\" type=\"file\" accept=\".txt,.gz,*\">\n    <span id=\"alnFileName\" class=\"filename empty\">(not set)</span>\n  </span>\n\n  <input id=\"query\" type=\"search\" placeholder=\"c_chr12_...  |  chr12:86677754  |  chr12:86677500-86677800\">\n  <button id=\"searchBtn\" class=\"primary\">Find</button>\n  <button id=\"cancelBtn\" disabled>Cancel</button>\n\n  <span class=\"spacer\"></span>\n\n  <span id=\"progress\" class=\"hint\"></span>\n  <button id=\"pasteBtn\" title=\"Paste a pre-grep'd alignment block directly\">Paste block</button>\n</header>\n\n<div id=\"status\"></div>\n\n<main class=\"split\">\n  <section id=\"bpsPane\" class=\"pane\">\n    <div class=\"pane-header\">\n      <span>bps matches</span>\n      <span id=\"bpsStats\" class=\"hint\"></span>\n      <span class=\"spacer\"></span>\n      <span class=\"hint\">click a row to load its contig</span>\n    </div>\n    <div class=\"pane-body\" id=\"bpsBody\">\n      <div class=\"empty\">\n        No bps results yet. Set the <code>bps</code> file and enter a breakpoint\n        (<code>chr:pos</code> or <code>chr:pos1-pos2</code>) or a contig name.\n      </div>\n    </div>\n  </section>\n\n  <div class=\"divider\" id=\"divider\" title=\"drag to resize\"></div>\n\n  <section id=\"alnPane\" class=\"pane\">\n    <div class=\"pane-header\">\n      <span>alignments</span>\n      <span id=\"alnStats\" class=\"hint\"></span>\n      <span class=\"spacer\"></span>\n      <span class=\"hint\">\n        <label title=\"Hide reads whose r2c CIGAR contains an I or D (i.e. show only perfect-match reads)\"><input id=\"perfectOnly\" type=\"checkbox\"> perfect matches only (no I/D)</label>\n        <span style=\"display:inline-block; width:1px; height:14px; background:var(--border); margin:0 8px; vertical-align:middle\"></span>\n        <span style=\"color:var(--muted); margin-right:4px\">support:</span>\n        <label title=\"Show reads tagged 'support: split' on the r2c line\"><input id=\"filtSplit\" type=\"checkbox\" checked> split</label>\n        <label title=\"Show reads tagged 'support: disc' on the r2c line\"><input id=\"filtDisc\" type=\"checkbox\" checked> disc</label>\n        <label title=\"Show reads tagged 'support: both' on the r2c line\"><input id=\"filtBoth\" type=\"checkbox\" checked> both</label>\n        <label title=\"Show reads tagged 'support: none' on the r2c line\"><input id=\"filtNone\" type=\"checkbox\" checked> none</label>\n      </span>\n    </div>\n    <div id=\"legend\" class=\"legend\" style=\"display:none\"></div>\n    <div class=\"pane-body\" id=\"alnBody\">\n      <div class=\"empty\">\n        No alignments loaded. Pick a contig above or drop/paste a block.\n      </div>\n    </div>\n  </section>\n</main>\n\n<script>\n\"use strict\";\n\n// =========================================================================\n// File state\n// =========================================================================\nlet bpsFile = null;\nlet alnFile = null;\nlet bpsHeader = null;   // array of column names (from first '#...' line)\n\n// Column indices for known bps columns (0-based). These are assigned after\n// parsing the header.\nconst BPS_COLS = {\n  chr1: 0, pos1: 1, strand1: 2,\n  chr2: 3, pos2: 4, strand2: 5,\n  conf: 31, type: 32, somlod: 36, maxlod: 37,\n  contig: 29\n};\n\n// =========================================================================\n// Streaming helpers\n// =========================================================================\n\n// Return a ReadableStream<Uint8Array> that decompresses the file if .gz.\nfunction openFileStream(file) {\n  const raw = file.stream();\n  if (file.name.endsWith(\".gz\") && typeof DecompressionStream !== \"undefined\") {\n    return raw.pipeThrough(new DecompressionStream(\"gzip\"));\n  }\n  return raw;\n}\n\n// Stream a file line-by-line. `onLine` may return false to stop early.\n// Returns { lines, bytes, aborted }.\nasync function streamLines(file, onLine, signal) {\n  const reader = openFileStream(file).pipeThrough(new TextDecoderStream()).getReader();\n  let buf = \"\";\n  let lines = 0, bytes = 0;\n  let aborted = false;\n  try {\n    while (true) {\n      if (signal && signal.aborted) { aborted = true; break; }\n      const { value, done } = await reader.read();\n      if (done) break;\n      bytes += value.length;\n      buf += value;\n      let i, start = 0;\n      while ((i = buf.indexOf(\"\\n\", start)) !== -1) {\n        const line = buf.slice(start, i);\n        lines++;\n        const ret = onLine(line, lines, bytes);\n        if (ret === false) { aborted = true; start = buf.length; break; }\n        start = i + 1;\n      }\n      buf = buf.slice(start);\n    }\n    if (!aborted && buf.length > 0) {\n      lines++;\n      onLine(buf, lines, bytes);\n    }\n  } finally {\n    try { reader.cancel(); } catch(_) {}\n  }\n  return { lines, bytes, aborted };\n}\n\n// =========================================================================\n// bps column-index resolution\n//\n// bps.txt starts with a header like '#chr1  pos1  strand1 ...'. We look up\n// the column indices we care about by header name so we don't depend on the\n// exact order, but we fall back to the canonical order documented in\n// CLAUDE.md if the header is missing.\n// =========================================================================\nfunction resolveBpsColumns(headerLine) {\n  if (!headerLine || headerLine[0] !== \"#\") return false;\n  const cols = headerLine.replace(/^#/, \"\").split(\"\\t\");\n  bpsHeader = cols;\n  const idx = (name) => cols.indexOf(name);\n  const map = {\n    chr1:   idx(\"chr1\"),\n    pos1:   idx(\"pos1\"),\n    strand1:idx(\"strand1\"),\n    chr2:   idx(\"chr2\"),\n    pos2:   idx(\"pos2\"),\n    strand2:idx(\"strand2\"),\n    conf:   idx(\"confidence\") !== -1 ? idx(\"confidence\") : idx(\"conf\"),\n    type:   idx(\"type\") !== -1 ? idx(\"type\") : idx(\"svtype\"),\n    somlod: idx(\"somlod\") !== -1 ? idx(\"somlod\") : idx(\"somatic_lod\"),\n    maxlod: idx(\"maxlod\") !== -1 ? idx(\"maxlod\") : idx(\"max_lod\"),\n    // contig column name is 'contig_and_region' in newer outputs\n    contig: idx(\"contig_and_region\") !== -1 ? idx(\"contig_and_region\") : idx(\"contig\"),\n  };\n  for (const k of Object.keys(map)) if (map[k] !== -1) BPS_COLS[k] = map[k];\n  return true;\n}\n\n// =========================================================================\n// Query parsing\n//\n// Accepted forms:\n//   contig name:  c_chr12_86656501_86681501_54C\n//   bp position:  chr12:86677754              (exact, on either end)\n//   bp range:     chr12:86677500-86677800     (either end within range)\n//   bp pair:      chr12:86677500..chr12:86677800  (explicit pair; order-insensitive)\n// =========================================================================\nfunction parseQuery(q) {\n  q = q.trim();\n  if (!q) return null;\n  if (/^c_/.test(q)) return { kind: \"contig\", contig: q };\n\n  // pair: chrA:posA..chrB:posB\n  const pair = q.match(/^(\\S+):(\\d+)\\.\\.(\\S+):(\\d+)$/);\n  if (pair) {\n    return { kind: \"pair\",\n      a: { chr: pair[1], pos: +pair[2] },\n      b: { chr: pair[3], pos: +pair[4] } };\n  }\n\n  // range: chr:pos1-pos2\n  const range = q.match(/^(\\S+):(\\d+)-(\\d+)$/);\n  if (range) {\n    return { kind: \"range\", chr: range[1], lo: +range[2], hi: +range[3] };\n  }\n\n  // point: chr:pos  (with optional tolerance ±N via chr:pos~tol)\n  const point = q.match(/^(\\S+):(\\d+)(?:~(\\d+))?$/);\n  if (point) {\n    return { kind: \"point\", chr: point[1], pos: +point[2], tol: +(point[3] || 0) };\n  }\n\n  return { kind: \"contig\", contig: q };  // fall back: assume contig id\n}\n\n// =========================================================================\n// BPS search\n// =========================================================================\nasync function searchBps(file, query, signal) {\n  const matches = [];\n  let sawHeader = false;\n\n  await streamLines(file, (line, lineno, bytes) => {\n    if (!line) return;\n    if (line[0] === \"#\") {\n      if (!sawHeader) { resolveBpsColumns(line); sawHeader = true; }\n      return;\n    }\n    const cols = line.split(\"\\t\");\n    const chr1 = cols[BPS_COLS.chr1];\n    const pos1 = +cols[BPS_COLS.pos1];\n    const chr2 = cols[BPS_COLS.chr2];\n    const pos2 = +cols[BPS_COLS.pos2];\n\n    let hit = false;\n    if (query.kind === \"contig\") {\n      const contig = cols[BPS_COLS.contig] || \"\";\n      hit = contig.includes(query.contig) || line.includes(query.contig);\n    } else if (query.kind === \"point\") {\n      const t = query.tol;\n      hit = (chr1 === query.chr && Math.abs(pos1 - query.pos) <= t) ||\n            (chr2 === query.chr && Math.abs(pos2 - query.pos) <= t);\n    } else if (query.kind === \"range\") {\n      hit = (chr1 === query.chr && pos1 >= query.lo && pos1 <= query.hi) ||\n            (chr2 === query.chr && pos2 >= query.lo && pos2 <= query.hi);\n    } else if (query.kind === \"pair\") {\n      const a = query.a, b = query.b;\n      const matchA = (chr1 === a.chr && pos1 === a.pos) && (chr2 === b.chr && pos2 === b.pos);\n      const matchB = (chr1 === b.chr && pos1 === b.pos) && (chr2 === a.chr && pos2 === a.pos);\n      hit = matchA || matchB;\n    }\n    if (hit) matches.push({ cols, line });\n    // throttle progress updates\n    if (lineno % 50000 === 0) updateProgress(`bps: scanned ${lineno.toLocaleString()} rows…`);\n  }, signal);\n\n  return matches;\n}\n\n// =========================================================================\n// Alignments extraction\n//\n// Contig blocks are contiguous: every non-blank line within the block mentions\n// the contig id. We scan linearly, accumulate matching lines, and (since the\n// block is contiguous) early-exit once we've seen N consecutive non-matching\n// lines after first match.\n// =========================================================================\nasync function extractAlnBlocks(file, contigIds, signal) {\n  // We may want to collect blocks for multiple contigs in one pass.\n  const targets = new Set(contigIds);\n  const perContig = new Map();  // contigId -> string[] of lines\n  const blanksAfterLast = new Map(); // for early-exit bookkeeping\n  const sawAny = new Set();\n  let exitableCount = 0;        // number of contigs that have been \"closed\"\n\n  await streamLines(file, (line, lineno, bytes) => {\n    if (targets.size === 0) return false;\n\n    let matchedThisLine = false;\n    for (const cid of targets) {\n      if (line.indexOf(cid) !== -1) {\n        matchedThisLine = true;\n        if (!perContig.has(cid)) perContig.set(cid, []);\n        perContig.get(cid).push(line);\n        sawAny.add(cid);\n        blanksAfterLast.set(cid, 0);\n      }\n    }\n    if (!matchedThisLine) {\n      // Increment \"since last hit\" for each contig we've seen, and when it\n      // exceeds the tolerance, close that contig (stop accumulating further).\n      for (const cid of [...targets]) {\n        if (sawAny.has(cid)) {\n          blanksAfterLast.set(cid, (blanksAfterLast.get(cid) || 0) + 1);\n          // alignments sections are contiguous; a gap of 4+ non-matching\n          // lines is a clear signal we've left this contig's block.\n          if (blanksAfterLast.get(cid) > 4) {\n            targets.delete(cid);\n          }\n        }\n      }\n    }\n    if (lineno % 100000 === 0) {\n      updateProgress(`aln: scanned ${lineno.toLocaleString()} lines, ${perContig.size}/${contigIds.length} contigs found…`);\n    }\n  }, signal);\n\n  return perContig;\n}\n\n// =========================================================================\n// Rendering — bps table\n// =========================================================================\nconst bpsBody = document.getElementById(\"bpsBody\");\nconst alnBody = document.getElementById(\"alnBody\");\nconst bpsStats = document.getElementById(\"bpsStats\");\nconst alnStats = document.getElementById(\"alnStats\");\nconst legendEl = document.getElementById(\"legend\");\n\n// =========================================================================\n// Per-sample FORMAT strings, lifted from src/svaba/vcf.cpp:\n//   const std::string kSvFormat    = \"GT:AD:DP:SR:DR:GQ:PL:LO:LO_n\";\n//   const std::string kIndelFormat = \"GT:AD:DP:SR:CR:GQ:PL:LO:LO_n\";\n// =========================================================================\nconst SV_FORMAT    = \"GT:AD:DP:SR:DR:GQ:PL:LO:LO_n\";\nconst INDEL_FORMAT = \"GT:AD:DP:SR:CR:GQ:PL:LO:LO_n\";\nconst FORMAT_KEY = {\n  GT:    \"Genotype\",\n  AD:    \"Allele depth (alt-supporting reads)\",\n  DP:    \"Total read depth\",\n  SR:    \"Split-read alt support\",\n  DR:    \"Discordant read pair alt support (SVs)\",\n  CR:    \"Cigar-derived alt support (indels)\",\n  GQ:    \"Genotype quality (phred)\",\n  PL:    \"Phred-scaled likelihoods (0/0,0/1,1/1)\",\n  LO:    \"Per-sample LOD (variant vs error)\",\n  LO_n:  \"Per-sample normalized LOD\",\n};\nfunction formatForType(type) {\n  return (type === \"INDEL\") ? INDEL_FORMAT : SV_FORMAT;\n}\n\n// Heuristic: a column is a per-sample (genotype) column iff its header looks\n// like \"n001_...\" / \"t001_...\" or it contains a path / .bam.\nfunction isSampleHeader(h) {\n  if (!h) return false;\n  if (/^[a-z]\\d{3}[_.-]/.test(h)) return true;\n  if (/\\.bam$/i.test(h)) return true;\n  if (/[\\\\/]/.test(h)) return true;     // contains a path separator\n  return false;\n}\n\nfunction renderBpsTable(matches, query) {\n  bpsBody.innerHTML = \"\";\n  if (!matches.length) {\n    const e = document.createElement(\"div\");\n    e.className = \"empty\";\n    e.textContent = \"No bps rows matched that query.\";\n    bpsBody.appendChild(e);\n    bpsStats.textContent = \"0 matches\";\n    return;\n  }\n\n  // Use the bps header if we have it; otherwise generate column names from\n  // the widest matched row.\n  const ncols = Math.max(\n    bpsHeader ? bpsHeader.length : 0,\n    ...matches.map(m => m.cols.length)\n  );\n  const headers = [];\n  for (let i = 0; i < ncols; i++) {\n    headers.push((bpsHeader && bpsHeader[i]) || `col${i+1}`);\n  }\n  const sampleColIdx = new Set(headers.map((h, i) => isSampleHeader(h) ? i : -1).filter(i => i >= 0));\n\n  // ---- format key panel for the genotype columns -----------------------\n  if (sampleColIdx.size > 0) {\n    const key = document.createElement(\"div\");\n    key.className = \"format-key\";\n    key.innerHTML =\n      `<div class=\"fk-title\">Per-sample column FORMAT</div>` +\n      `<div class=\"fk-row\"><span class=\"fk-tag fk-sv\">SV</span> ` +\n        `<code>${SV_FORMAT}</code></div>` +\n      `<div class=\"fk-row\"><span class=\"fk-tag fk-indel\">INDEL</span> ` +\n        `<code>${INDEL_FORMAT}</code></div>` +\n      `<div class=\"fk-defs\">` +\n        Object.entries(FORMAT_KEY).map(([k,v]) =>\n          `<span class=\"fk-def\"><code>${k}</code>=${v}</span>`).join(\"\") +\n      `</div>`;\n    bpsBody.appendChild(key);\n  }\n\n  // ---- table -----------------------------------------------------------\n  const table = document.createElement(\"table\");\n  table.className = \"bps-table full\";\n  const thead = document.createElement(\"thead\");\n  const trh = document.createElement(\"tr\");\n  // leading \"load\" column header\n  {\n    const th = document.createElement(\"th\");\n    th.textContent = \"\";\n    th.title = \"Click → to load alignments\";\n    trh.appendChild(th);\n  }\n  for (let i = 0; i < ncols; i++) {\n    const th = document.createElement(\"th\");\n    th.textContent = headers[i];\n    if (sampleColIdx.has(i)) th.classList.add(\"sample-col\");\n    if (i === BPS_COLS.contig) th.classList.add(\"contig-col\");\n    if (i === BPS_COLS.conf)   th.classList.add(\"conf-col\");\n    if (i === BPS_COLS.somlod || i === BPS_COLS.maxlod) th.classList.add(\"lod-col\");\n    trh.appendChild(th);\n  }\n  thead.appendChild(trh);\n  table.appendChild(thead);\n\n  const tbody = document.createElement(\"tbody\");\n  function loadFromRow(tr, contigVal) {\n    if (!contigVal) return;\n    tbody.querySelectorAll(\"tr.selected\").forEach(r => r.classList.remove(\"selected\"));\n    tr.classList.add(\"selected\");\n    loadAlignmentsForContig(contigVal);\n  }\n\n  for (const m of matches) {\n    const tr = document.createElement(\"tr\");\n    const confVal  = m.cols[BPS_COLS.conf] || \"\";\n    const typeVal  = (m.cols[BPS_COLS.type !== undefined ? BPS_COLS.type : 32] || \"\").trim();\n    const fmtForRow = formatForType(typeVal);\n    const fmtParts  = fmtForRow.split(\":\");\n    if (confVal === \"PASS\") tr.classList.add(\"pass\");\n    const contigVal = m.cols[BPS_COLS.contig] || \"\";\n    tr.dataset.contig = contigVal;\n\n    // leading load cell (the only thing wired to fire the alignments scan)\n    const tdLoad = document.createElement(\"td\");\n    tdLoad.className = \"c-load\";\n    tdLoad.textContent = \"▶\";\n    tdLoad.title = `Load alignments for ${contigVal}`;\n    tdLoad.addEventListener(\"click\", (ev) => {\n      ev.stopPropagation();\n      loadFromRow(tr, contigVal);\n    });\n    tr.appendChild(tdLoad);\n\n    for (let i = 0; i < ncols; i++) {\n      const td = document.createElement(\"td\");\n      const v = m.cols[i] ?? \"\";\n      td.textContent = v;\n      if (sampleColIdx.has(i)) {\n        td.classList.add(\"sample-col\");\n        const parts = v.split(\":\");\n        const tip = parts.map((p, k) => {\n          const key = fmtParts[k] || `f${k+1}`;\n          const desc = FORMAT_KEY[key] || \"\";\n          return `${key}=${p}${desc?\"  (\"+desc+\")\":\"\"}`;\n        }).join(\"\\n\");\n        td.title = `FORMAT (${typeVal||\"?\"}): ${fmtForRow}\\n\\n${tip}`;\n      }\n      if (i === BPS_COLS.contig) {\n        td.classList.add(\"c-contig\");\n        td.title = `Click to load alignments for ${contigVal}\\n(double-click to select the contig name for copy)`;\n        td.addEventListener(\"click\", (ev) => {\n          // Allow text selection: if the user has actively selected text,\n          // don't navigate.\n          const sel = window.getSelection();\n          if (sel && sel.toString().length > 0 &&\n              td.contains(sel.anchorNode)) return;\n          ev.stopPropagation();\n          loadFromRow(tr, contigVal);\n        });\n      }\n      if (i === BPS_COLS.conf)    td.classList.add(\"c-conf\");\n      if (i === BPS_COLS.somlod)  td.classList.add(\"c-somlod\");\n      if (i === BPS_COLS.maxlod)  td.classList.add(\"c-maxlod\");\n      tr.appendChild(td);\n    }\n    tbody.appendChild(tr);\n  }\n  table.appendChild(tbody);\n  bpsBody.appendChild(table);\n  bpsStats.textContent =\n    `${matches.length} match${matches.length===1?\"\":\"es\"} · ${ncols} columns`;\n}\n\n// =========================================================================\n// Rendering — alignments\n// =========================================================================\nconst PALETTE = [\n  \"#1f6feb\",\"#a371f7\",\"#3fb950\",\"#f0883e\",\"#db61a2\",\"#56d4dd\",\n  \"#d29922\",\"#ff7b72\",\"#7ee787\",\"#79c0ff\",\"#bc8cff\",\"#ffa657\",\n];\nconst prefixColor = new Map();\nlet prefixCounter = 0;\nfunction colorFor(p) {\n  if (!p) return null;\n  if (!prefixColor.has(p)) {\n    prefixColor.set(p, PALETTE[prefixCounter % PALETTE.length]);\n    prefixCounter++;\n  }\n  return prefixColor.get(p);\n}\n\nconst RE_INDEL  = /^Indel:\\s/;\nconst RE_CIGAR  = /^[>I<]{8,}\\s/;\nconst RE_MARKER = /^\\s*\\|+\\s+\\S/;\nconst RE_CONTIG = /^[ACGTN-]{20,}\\s+c_/;\nconst RE_PREFIX = /\\b([a-z]\\d{3})_/;\n\nfunction classify(line) {\n  if (line.length === 0)     return { kind: \"blank\" };\n  if (RE_INDEL.test(line))   return { kind: \"indel\" };\n  if (RE_CIGAR.test(line))   return { kind: \"cigar\" };\n  if (RE_MARKER.test(line))  return { kind: \"marker\" };\n  if (RE_CONTIG.test(line))  return { kind: \"contig\" };\n  const m = line.match(RE_PREFIX);\n  return { kind: \"read\", prefix: m ? m[1] : null };\n}\n\nlet alnRows = [];  // { el, kind, prefix, text }\n\nfunction renderAlnLines(lines) {\n  alnBody.innerHTML = \"\";\n  prefixColor.clear();\n  prefixCounter = 0;\n  alnRows = [];\n\n  if (!lines || lines.length === 0) {\n    const e = document.createElement(\"div\");\n    e.className = \"empty\";\n    e.textContent = \"No alignments block for that contig.\";\n    alnBody.appendChild(e);\n    alnStats.textContent = \"\";\n    legendEl.style.display = \"none\";\n    return;\n  }\n\n  // Pre-assign colors in file order\n  for (const ln of lines) {\n    const c = classify(ln);\n    if (c.kind === \"read\" && c.prefix) colorFor(c.prefix);\n  }\n\n  const pre = document.createElement(\"pre\");\n  pre.className = \"alignments\";\n\n  const perPrefix = new Map();\n  let nReads = 0;\n  for (const ln of lines) {\n    const c = classify(ln);\n    const span = document.createElement(\"span\");\n    span.className = \"row r-\" + (c.kind === \"read\" ? \"other\" : c.kind);\n    if (c.kind === \"read\") {\n      nReads++;\n      if (c.prefix) {\n        const col = colorFor(c.prefix);\n        span.style.background = col + \"33\";\n        span.style.borderLeft = \"3px solid \" + col;\n        span.style.paddingLeft = \"3px\";\n        span.dataset.prefix = c.prefix;\n        perPrefix.set(c.prefix, (perPrefix.get(c.prefix) || 0) + 1);\n      } else {\n        span.style.borderLeft = \"3px solid #555\";\n        span.style.paddingLeft = \"3px\";\n      }\n    }\n    span.dataset.kind = c.kind;\n    span.textContent = ln === \"\" ? \" \" : ln;\n    span.appendChild(document.createTextNode(\"\\n\"));\n    pre.appendChild(span);\n    alnRows.push({ el: span, kind: c.kind, prefix: c.prefix || null, text: ln });\n  }\n  alnBody.appendChild(pre);\n\n  renderLegend(perPrefix);\n  alnStats.textContent = `${lines.length} rows · ${nReads} reads · ${perPrefix.size} sources`;\n  applyAlnFilter();\n}\n\nfunction renderLegend(perPrefix) {\n  legendEl.innerHTML = \"\";\n  if (perPrefix.size === 0) { legendEl.style.display = \"none\"; return; }\n  legendEl.style.display = \"\";\n  const label = document.createElement(\"span\");\n  label.textContent = \"source:\";\n  legendEl.appendChild(label);\n  const prefixes = [...perPrefix.keys()].sort();\n  for (const p of prefixes) {\n    const sw = document.createElement(\"span\");\n    sw.className = \"swatch\";\n    sw.style.background = colorFor(p);\n    sw.textContent = `${p} (${perPrefix.get(p)})`;\n    sw.dataset.prefix = p;\n    sw.dataset.on = \"1\";\n    sw.addEventListener(\"click\", () => {\n      const on = sw.dataset.on === \"1\";\n      sw.dataset.on = on ? \"0\" : \"1\";\n      sw.style.opacity = on ? \"0.35\" : \"1\";\n      applyAlnFilter();\n    });\n    legendEl.appendChild(sw);\n  }\n}\n\n// A read row is \"imperfect\" if the r2c CIGAR string contains I or D operators.\n// Format on a read line is e.g.  ' r2c CIGAR: 24M1D15M7I1M7D103M, c_chr...'\n// We extract the CIGAR token and look for I/D ops only there (so the letter D\n// inside a contig name or read name doesn't false-positive).\nconst RE_R2C_CIGAR = /\\br2c CIGAR:\\s*([0-9MIDNSHP=X]+)/;\nfunction readIsImperfect(line) {\n  const m = line.match(RE_R2C_CIGAR);\n  if (!m) return false;        // no CIGAR -> can't tell, leave visible\n  return /[ID]/.test(m[1]);\n}\n\n// Parse the 'support: <kind>' token emitted by AlignedContig::printToAlignmentsFile\n// for each read line. Returns one of \"split\" | \"disc\" | \"both\" | \"none\" | null.\n// Older alignments.txt files predate the tag; for those we return null and\n// the support filter falls open (kept visible regardless of toggle state).\nconst RE_SUPPORT = /\\bsupport:\\s*(split|disc|both|none)\\b/;\nfunction readSupportKind(line) {\n  const m = line.match(RE_SUPPORT);\n  return m ? m[1] : null;\n}\n\nfunction applyAlnFilter() {\n  const perfectOnly = document.getElementById(\"perfectOnly\").checked;\n  const showSplit = document.getElementById(\"filtSplit\").checked;\n  const showDisc  = document.getElementById(\"filtDisc\").checked;\n  const showBoth  = document.getElementById(\"filtBoth\").checked;\n  const showNone  = document.getElementById(\"filtNone\").checked;\n  const off = new Set();\n  legendEl.querySelectorAll(\".swatch\").forEach(sw => {\n    if (sw.dataset.on === \"0\") off.add(sw.dataset.prefix);\n  });\n  let shown = 0;\n  for (const r of alnRows) {\n    let visible = true;\n    if (r.prefix && off.has(r.prefix)) visible = false;\n    if (visible && perfectOnly && r.kind === \"read\" && readIsImperfect(r.text)) visible = false;\n    if (visible && r.kind === \"read\") {\n      // memoize support kind on the row so we don't re-regex on every toggle\n      if (r.support === undefined) r.support = readSupportKind(r.text);\n      if (r.support === \"split\" && !showSplit) visible = false;\n      else if (r.support === \"disc\" && !showDisc)  visible = false;\n      else if (r.support === \"both\" && !showBoth)  visible = false;\n      else if (r.support === \"none\" && !showNone)  visible = false;\n      // r.support === null (older file with no tag) is left visible\n    }\n    r.el.classList.toggle(\"hidden\", !visible);\n    if (visible) shown++;\n  }\n}\n\n// =========================================================================\n// Controllers\n// =========================================================================\nlet currentAbort = null;\n\nfunction setStatus(msg, cls) {\n  const el = document.getElementById(\"status\");\n  el.className = cls ? (\"show \" + cls) : (msg ? \"show\" : \"\");\n  el.textContent = msg || \"\";\n}\nfunction updateProgress(msg) {\n  const el = document.getElementById(\"progress\");\n  el.textContent = msg;\n  el.classList.add(\"show\");\n}\nfunction clearProgress() {\n  document.getElementById(\"progress\").classList.remove(\"show\");\n}\n\nasync function loadAlignmentsForContig(contigId) {\n  if (!alnFile) { setStatus(\"Set the alignments file first.\", \"err\"); return; }\n  if (!contigId) { setStatus(\"Empty contig id.\", \"err\"); return; }\n  setStatus(`Scanning alignments for ${contigId}…`);\n  currentAbort = new AbortController();\n  document.getElementById(\"cancelBtn\").disabled = false;\n  try {\n    const t0 = performance.now();\n    const perContig = await extractAlnBlocks(alnFile, [contigId], currentAbort.signal);\n    const dt = ((performance.now() - t0)/1000).toFixed(1);\n    clearProgress();\n    const lines = perContig.get(contigId) || [];\n    renderAlnLines(lines);\n    if (lines.length === 0) setStatus(`No alignments found for ${contigId} (${dt}s).`, \"err\");\n    else setStatus(`${contigId}: ${lines.length} lines (${dt}s)`, \"ok\");\n  } catch (e) {\n    setStatus(\"Error: \" + e.message, \"err\");\n  } finally {\n    document.getElementById(\"cancelBtn\").disabled = true;\n    currentAbort = null;\n  }\n}\n\nasync function runQuery() {\n  const raw = document.getElementById(\"query\").value;\n  const q = parseQuery(raw);\n  if (!q) { setStatus(\"Empty query.\", \"err\"); return; }\n\n  // Contig query: skip bps, jump straight to alignments\n  if (q.kind === \"contig\") {\n    // still search bps if available, useful for context\n    if (bpsFile) {\n      setStatus(`Looking up ${q.contig} in bps…`);\n      currentAbort = new AbortController();\n      document.getElementById(\"cancelBtn\").disabled = false;\n      try {\n        const m = await searchBps(bpsFile, q, currentAbort.signal);\n        renderBpsTable(m, q);\n      } catch (e) {\n        setStatus(\"bps error: \" + e.message, \"err\");\n      } finally {\n        document.getElementById(\"cancelBtn\").disabled = true;\n        currentAbort = null;\n        clearProgress();\n      }\n    }\n    await loadAlignmentsForContig(q.contig);\n    return;\n  }\n\n  // Position query: bps first (mandatory)\n  if (!bpsFile) {\n    setStatus(\"Set the bps file to query by position.\", \"err\");\n    return;\n  }\n  setStatus(`Scanning bps for ${raw}…`);\n  currentAbort = new AbortController();\n  document.getElementById(\"cancelBtn\").disabled = false;\n  try {\n    const t0 = performance.now();\n    const matches = await searchBps(bpsFile, q, currentAbort.signal);\n    const dt = ((performance.now() - t0)/1000).toFixed(1);\n    clearProgress();\n    renderBpsTable(matches, q);\n    if (matches.length === 0) {\n      setStatus(`No bps matches for ${raw} (${dt}s).`, \"err\");\n      renderAlnLines([]);\n      return;\n    }\n    setStatus(`${matches.length} bps matches (${dt}s). Auto-loading first contig.`, \"ok\");\n    // Auto-select first row; user can click another to switch\n    const firstContig = matches[0].cols[BPS_COLS.contig];\n    if (firstContig && alnFile) {\n      const firstRow = bpsBody.querySelector(\"tbody tr\");\n      if (firstRow) firstRow.classList.add(\"selected\");\n      await loadAlignmentsForContig(firstContig);\n    } else if (!alnFile) {\n      setStatus(`${matches.length} bps matches — set the alignments file to load reads.`, \"ok\");\n    }\n  } catch (e) {\n    setStatus(\"bps error: \" + e.message, \"err\");\n  } finally {\n    document.getElementById(\"cancelBtn\").disabled = true;\n    currentAbort = null;\n  }\n}\n\n// =========================================================================\n// Wiring\n// =========================================================================\ndocument.getElementById(\"bpsFile\").addEventListener(\"change\", (e) => {\n  const f = e.target.files && e.target.files[0];\n  if (!f) return;\n  bpsFile = f;\n  const el = document.getElementById(\"bpsFileName\");\n  el.textContent = f.name + ` (${fmtBytes(f.size)})`;\n  el.classList.remove(\"empty\");\n});\ndocument.getElementById(\"alnFile\").addEventListener(\"change\", (e) => {\n  const f = e.target.files && e.target.files[0];\n  if (!f) return;\n  alnFile = f;\n  const el = document.getElementById(\"alnFileName\");\n  el.textContent = f.name + ` (${fmtBytes(f.size)})`;\n  el.classList.remove(\"empty\");\n});\ndocument.getElementById(\"searchBtn\").addEventListener(\"click\", runQuery);\ndocument.getElementById(\"query\").addEventListener(\"keydown\", (e) => {\n  if (e.key === \"Enter\") runQuery();\n});\ndocument.getElementById(\"cancelBtn\").addEventListener(\"click\", () => {\n  if (currentAbort) { currentAbort.abort(); setStatus(\"Cancelled.\", \"err\"); }\n});\ndocument.getElementById(\"perfectOnly\").addEventListener(\"change\", applyAlnFilter);\nfor (const id of [\"filtSplit\", \"filtDisc\", \"filtBoth\", \"filtNone\"]) {\n  document.getElementById(id).addEventListener(\"change\", applyAlnFilter);\n}\n\ndocument.getElementById(\"pasteBtn\").addEventListener(\"click\", async () => {\n  let t = \"\";\n  try {\n    if (navigator.clipboard && navigator.clipboard.readText) t = await navigator.clipboard.readText();\n  } catch (_) {}\n  if (!t) t = window.prompt(\"Paste an alignment block:\");\n  if (t) renderAlnLines(t.split(/\\r?\\n/));\n});\n\n// Drag-and-drop: route .gz/.txt to the correct slot based on name\nwindow.addEventListener(\"dragover\", (e) => e.preventDefault());\nwindow.addEventListener(\"drop\", (e) => {\n  e.preventDefault();\n  const files = e.dataTransfer && e.dataTransfer.files;\n  if (!files) return;\n  for (const f of files) {\n    if (/bps/.test(f.name))         { bpsFile = f; document.getElementById(\"bpsFileName\").textContent = f.name + ` (${fmtBytes(f.size)})`; document.getElementById(\"bpsFileName\").classList.remove(\"empty\"); }\n    else if (/align/.test(f.name))  { alnFile = f; document.getElementById(\"alnFileName\").textContent = f.name + ` (${fmtBytes(f.size)})`; document.getElementById(\"alnFileName\").classList.remove(\"empty\"); }\n    else {\n      // Unknown: if it looks like raw text, render it as a block\n      f.text().then(t => renderAlnLines(t.split(/\\r?\\n/)));\n    }\n  }\n});\n\n// Draggable divider between bps and alignments panes\n(function wireDivider() {\n  const div = document.getElementById(\"divider\");\n  const top = document.getElementById(\"bpsPane\");\n  let dragging = false;\n  div.addEventListener(\"mousedown\", (e) => { dragging = true; document.body.style.cursor = \"row-resize\"; e.preventDefault(); });\n  window.addEventListener(\"mousemove\", (e) => {\n    if (!dragging) return;\n    const main = document.querySelector(\"main.split\");\n    const r = main.getBoundingClientRect();\n    const y = Math.max(80, Math.min(r.height - 80, e.clientY - r.top));\n    top.style.flex = `0 0 ${y}px`;\n  });\n  window.addEventListener(\"mouseup\", () => { dragging = false; document.body.style.cursor = \"\"; });\n})();\n\nfunction fmtBytes(n) {\n  if (n < 1024) return n + \" B\";\n  if (n < 1024*1024) return (n/1024).toFixed(1) + \" KB\";\n  if (n < 1024*1024*1024) return (n/1024/1024).toFixed(1) + \" MB\";\n  return (n/1024/1024/1024).toFixed(2) + \" GB\";\n}\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/app.js",
    "content": "(function () {\n  \"use strict\";\n\n  const BASE_COLUMNS = [\n    \"chr1\",\n    \"pos1\",\n    \"strand1\",\n    \"chr2\",\n    \"pos2\",\n    \"strand2\",\n    \"ref\",\n    \"alt_allele\",\n    \"span\",\n    \"split\",\n    \"alt_count\",\n    \"cov\",\n    \"cigar\",\n    \"cigar_near\",\n    \"dmq1\",\n    \"dmq2\",\n    \"dcn\",\n    \"dct\",\n    \"mapq1\",\n    \"mapq2\",\n    \"nm1\",\n    \"nm2\",\n    \"as1\",\n    \"as2\",\n    \"sub1\",\n    \"sub2\",\n    \"homol\",\n    \"insert\",\n    \"repeat\",\n    \"contig_and_region\",\n    \"naln\",\n    \"conf\",\n    \"evidence\",\n    \"qual\",\n    \"secondary\",\n    \"somatic\",\n    \"somlod\",\n    \"maxlod\",\n    \"dbsnp\"\n  ];\n\n  const NUMERIC_FIELDS = new Set([\n    \"pos1\",\n    \"pos2\",\n    \"span\",\n    \"split\",\n    \"alt_count\",\n    \"cov\",\n    \"cigar\",\n    \"cigar_near\",\n    \"dmq1\",\n    \"dmq2\",\n    \"dcn\",\n    \"dct\",\n    \"mapq1\",\n    \"mapq2\",\n    \"nm1\",\n    \"nm2\",\n    \"as1\",\n    \"as2\",\n    \"sub1\",\n    \"sub2\",\n    \"naln\",\n    \"qual\",\n    \"secondary\",\n    \"somlod\",\n    \"maxlod\"\n  ]);\n\n  const SORT_DEFAULTS = {\n    key: \"maxlod\",\n    direction: \"desc\"\n  };\n\n  const state = {\n    fileName: \"\",\n    originalHeader: [],\n    sampleHeaders: [],\n    rows: [],\n    filteredRows: [],\n    selectedId: null,\n    page: 1,\n    pageSize: 100,\n    sort: { ...SORT_DEFAULTS },\n    filters: {\n      search: \"\",\n      somlodMin: null,\n      somlodMax: null,\n      maxlodMin: null,\n      maxlodMax: null,\n      qualMin: null,\n      splitMin: null,\n      altMin: null,\n      discordantMin: null,\n      dbsnp: \"all\",\n      eventTypes: new Set(),\n      evidence: new Set(),\n      confidence: new Set(),\n      somatic: new Set()\n    }\n  };\n\n  const els = {\n    fileInput: document.getElementById(\"file-input\"),\n    loadExample: document.getElementById(\"load-example\"),\n    exportButton: document.getElementById(\"export-button\"),\n    resetFilters: document.getElementById(\"reset-filters\"),\n    searchInput: document.getElementById(\"search-input\"),\n    somlodMin: document.getElementById(\"somlod-min\"),\n    somlodMax: document.getElementById(\"somlod-max\"),\n    maxlodMin: document.getElementById(\"maxlod-min\"),\n    maxlodMax: document.getElementById(\"maxlod-max\"),\n    qualMin: document.getElementById(\"qual-min\"),\n    splitMin: document.getElementById(\"split-min\"),\n    altMin: document.getElementById(\"alt-min\"),\n    discordantMin: document.getElementById(\"discordant-min\"),\n    dbsnpFilter: document.getElementById(\"dbsnp-filter\"),\n    pageSize: document.getElementById(\"page-size\"),\n    tableBody: document.getElementById(\"table-body\"),\n    detailContent: document.getElementById(\"detail-content\"),\n    statusText: document.getElementById(\"status-text\"),\n    resultsTitle: document.getElementById(\"results-title\"),\n    resultsSummary: document.getElementById(\"results-summary\"),\n    prevPage: document.getElementById(\"prev-page\"),\n    nextPage: document.getElementById(\"next-page\"),\n    pageSummary: document.getElementById(\"page-summary\"),\n    statTotal: document.getElementById(\"stat-total\"),\n    statShown: document.getElementById(\"stat-shown\"),\n    statPass: document.getElementById(\"stat-pass\"),\n    statTopEvidence: document.getElementById(\"stat-top-evidence\"),\n    eventTypeChips: document.getElementById(\"event-type-chips\"),\n    evidenceChips: document.getElementById(\"evidence-chips\"),\n    confidenceChips: document.getElementById(\"confidence-chips\"),\n    somaticChips: document.getElementById(\"somatic-chips\")\n  };\n\n  document.querySelectorAll(\".sort-button\").forEach((button) => {\n    button.addEventListener(\"click\", () => {\n      const key = button.dataset.sort;\n      if (state.sort.key === key) {\n        state.sort.direction = state.sort.direction === \"asc\" ? \"desc\" : \"asc\";\n      } else {\n        state.sort.key = key;\n        state.sort.direction = key === \"locus\" || key === \"eventType\" || key === \"conf\" || key === \"evidence\" || key === \"contig_and_region\" ? \"asc\" : \"desc\";\n      }\n      render();\n    });\n  });\n\n  document.querySelectorAll(\".preset-button\").forEach((button) => {\n    button.addEventListener(\"click\", () => {\n      const target = document.getElementById(button.dataset.target);\n      target.value = button.dataset.value;\n      syncFilterState();\n      render();\n    });\n  });\n\n  els.fileInput.addEventListener(\"change\", async (event) => {\n    const file = event.target.files && event.target.files[0];\n    if (!file) {\n      return;\n    }\n    await loadFromBlob(file, file.name);\n  });\n\n  els.loadExample.addEventListener(\"click\", async () => {\n    await loadBundledExample();\n  });\n\n  els.exportButton.addEventListener(\"click\", () => {\n    exportFilteredRows();\n  });\n\n  els.resetFilters.addEventListener(\"click\", () => {\n    resetFilters();\n    render();\n  });\n\n  els.prevPage.addEventListener(\"click\", () => {\n    if (state.page > 1) {\n      state.page -= 1;\n      renderTable();\n    }\n  });\n\n  els.nextPage.addEventListener(\"click\", () => {\n    const totalPages = Math.max(1, Math.ceil(state.filteredRows.length / state.pageSize));\n    if (state.page < totalPages) {\n      state.page += 1;\n      renderTable();\n    }\n  });\n\n  [\n    \"searchInput\",\n    \"somlodMin\",\n    \"somlodMax\",\n    \"maxlodMin\",\n    \"maxlodMax\",\n    \"qualMin\",\n    \"splitMin\",\n    \"altMin\",\n    \"discordantMin\",\n    \"dbsnpFilter\",\n    \"pageSize\"\n  ].forEach((key) => {\n    els[key].addEventListener(\"input\", () => {\n      syncFilterState();\n      render();\n    });\n    els[key].addEventListener(\"change\", () => {\n      syncFilterState();\n      render();\n    });\n  });\n\n  resetFilters();\n  render();\n\n  function resetFilters() {\n    state.pageSize = 100;\n    state.filters.search = \"\";\n    state.filters.somlodMin = null;\n    state.filters.somlodMax = null;\n    state.filters.maxlodMin = null;\n    state.filters.maxlodMax = null;\n    state.filters.qualMin = null;\n    state.filters.splitMin = null;\n    state.filters.altMin = null;\n    state.filters.discordantMin = null;\n    state.filters.dbsnp = \"all\";\n    state.filters.eventTypes = new Set();\n    state.filters.evidence = new Set();\n    state.filters.confidence = new Set();\n    state.filters.somatic = new Set();\n    state.page = 1;\n\n    els.searchInput.value = \"\";\n    els.somlodMin.value = \"\";\n    els.somlodMax.value = \"\";\n    els.maxlodMin.value = \"\";\n    els.maxlodMax.value = \"\";\n    els.qualMin.value = \"\";\n    els.splitMin.value = \"\";\n    els.altMin.value = \"\";\n    els.discordantMin.value = \"\";\n    els.dbsnpFilter.value = \"all\";\n    els.pageSize.value = String(state.pageSize);\n  }\n\n  function syncFilterState() {\n    state.filters.search = els.searchInput.value.trim().toLowerCase();\n    state.filters.somlodMin = parseNullableNumber(els.somlodMin.value);\n    state.filters.somlodMax = parseNullableNumber(els.somlodMax.value);\n    state.filters.maxlodMin = parseNullableNumber(els.maxlodMin.value);\n    state.filters.maxlodMax = parseNullableNumber(els.maxlodMax.value);\n    state.filters.qualMin = parseNullableNumber(els.qualMin.value);\n    state.filters.splitMin = parseNullableNumber(els.splitMin.value);\n    state.filters.altMin = parseNullableNumber(els.altMin.value);\n    state.filters.discordantMin = parseNullableNumber(els.discordantMin.value);\n    state.filters.dbsnp = els.dbsnpFilter.value;\n    state.pageSize = Number(els.pageSize.value) || 100;\n    state.page = 1;\n  }\n\n  async function loadBundledExample() {\n    setStatus(\"Loading bundled example from ./svaba/am.bps.txt.gz ...\");\n    try {\n      const response = await fetch(\"./svaba/am.bps.txt.gz\");\n      if (!response.ok) {\n        throw new Error(\"Could not fetch ./svaba/am.bps.txt.gz\");\n      }\n      const text = await readResponseText(response, \"am.bps.txt.gz\");\n      ingestText(text, \"svaba/am.bps.txt.gz\");\n    } catch (error) {\n      setStatus(\n        \"Bundled example load failed. If you opened index.html directly as a file, use the file picker or serve viewer/ over HTTP.\"\n      );\n      console.error(error);\n    }\n  }\n\n  async function loadFromBlob(blob, fileName) {\n    setStatus(\"Reading \" + fileName + \" ...\");\n    try {\n      const text = await readBlobText(blob, fileName);\n      ingestText(text, fileName);\n    } catch (error) {\n      setStatus(\"Could not read \" + fileName + \". \" + error.message);\n      console.error(error);\n    } finally {\n      els.fileInput.value = \"\";\n    }\n  }\n\n  async function readBlobText(blob, fileName) {\n    if (fileName.endsWith(\".gz\")) {\n      if (typeof DecompressionStream === \"undefined\") {\n        throw new Error(\"This browser does not support gzip decompression. Use a plain .txt file here.\");\n      }\n      const stream = blob.stream().pipeThrough(new DecompressionStream(\"gzip\"));\n      return await new Response(stream).text();\n    }\n    return await blob.text();\n  }\n\n  async function readResponseText(response, fileName) {\n    if (fileName.endsWith(\".gz\")) {\n      if (typeof DecompressionStream === \"undefined\") {\n        throw new Error(\"This browser does not support gzip decompression.\");\n      }\n      const stream = response.body.pipeThrough(new DecompressionStream(\"gzip\"));\n      return await new Response(stream).text();\n    }\n    return await response.text();\n  }\n\n  function ingestText(text, fileName) {\n    const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\").filter((line) => line.length > 0);\n    if (lines.length < 2) {\n      throw new Error(\"Expected a header and at least one row.\");\n    }\n\n    const originalHeader = lines[0].split(\"\\t\");\n    if (originalHeader.length < BASE_COLUMNS.length) {\n      throw new Error(\"Unexpected header width: \" + originalHeader.length);\n    }\n\n    const sampleHeaders = originalHeader.slice(BASE_COLUMNS.length);\n    const rows = [];\n\n    for (let index = 1; index < lines.length; index += 1) {\n      const line = lines[index];\n      const cells = line.split(\"\\t\");\n      if (cells.length !== originalHeader.length) {\n        continue;\n      }\n      rows.push(makeRow(index, cells, sampleHeaders));\n    }\n\n    state.fileName = fileName;\n    state.originalHeader = originalHeader;\n    state.sampleHeaders = sampleHeaders;\n    state.rows = rows;\n    resetFilters();\n    state.selectedId = rows.length ? rows[0].id : null;\n    state.page = 1;\n    state.sort = { ...SORT_DEFAULTS };\n\n    render();\n    setStatus(\"Loaded \" + rows.length.toLocaleString() + \" calls from \" + fileName + \".\");\n  }\n\n  function makeRow(index, cells, sampleHeaders) {\n    const row = { id: index, originalCells: cells };\n\n    BASE_COLUMNS.forEach((field, fieldIndex) => {\n      const value = cells[fieldIndex];\n      row[field] = NUMERIC_FIELDS.has(field) ? parseMaybeNumber(value) : value;\n    });\n\n    row.chr1 = stripLeadingHash(row.chr1);\n    row.locus = row.chr1 + \":\" + row.pos1 + \" -> \" + row.chr2 + \":\" + row.pos2;\n    row.sampleInfo = sampleHeaders.map((header, offset) => parseSampleField(header, cells[BASE_COLUMNS.length + offset], row.evidence));\n    row.eventType = deriveEventType(row);\n    row.spanAbs = row.span === null || row.span === -1 ? Infinity : Math.abs(row.span);\n    row.supportPeak = Math.max(\n      zeroIfNull(row.split),\n      zeroIfNull(row.alt_count),\n      zeroIfNull(row.cigar),\n      zeroIfNull(row.dcn),\n      zeroIfNull(row.dct)\n    );\n    row.hasDbsnp = Boolean(row.dbsnp && row.dbsnp !== \"x\");\n    row.searchText = [\n      row.locus,\n      row.eventType,\n      row.evidence,\n      row.conf,\n      row.ref,\n      row.alt_allele,\n      row.contig_and_region,\n      row.insert,\n      row.repeat,\n      row.homol,\n      row.dbsnp,\n      row.somatic\n    ]\n      .concat(row.sampleInfo.map((sample) => sample.label + \" \" + sample.raw))\n      .join(\" \")\n      .toLowerCase();\n    return row;\n  }\n\n  function deriveEventType(row) {\n    if (row.evidence === \"INDEL\") {\n      const refLength = (row.ref || \"\").length;\n      const altLength = (row.alt_allele || \"\").length;\n      if (altLength > refLength) {\n        return \"Insertion\";\n      }\n      if (altLength < refLength) {\n        return \"Deletion\";\n      }\n      return \"Substitution\";\n    }\n\n    if (row.chr1 !== row.chr2) {\n      return \"Translocation\";\n    }\n\n    if (row.strand1 === row.strand2) {\n      return \"Inversion\";\n    }\n\n    if (row.strand1 === \"-\" && row.strand2 === \"+\") {\n      return \"Duplication-like\";\n    }\n\n    if (row.strand1 === \"+\" && row.strand2 === \"-\") {\n      return \"Deletion-like\";\n    }\n\n    return \"Rearrangement\";\n  }\n\n  function parseSampleField(header, raw, evidence) {\n    const label = header.split(\"_\")[0];\n    const parts = raw.split(\":\");\n    const isIndel = evidence === \"INDEL\";\n    return {\n      label,\n      header,\n      raw,\n      genotype: parts[0] || \"\",\n      altSupport: parseMaybeNumber(parts[1]),\n      depth: parseMaybeNumber(parts[2]),\n      splitSupport: parseMaybeNumber(parts[3]),\n      pairedSupport: parseMaybeNumber(parts[4]),\n      supportLabel: isIndel ? \"cigar\" : \"discordant\",\n      gq: parseMaybeNumber(parts[5]),\n      pl: parts[6] || \"\",\n      lod: parseMaybeNumber(parts[7]),\n      lodNormal: parseMaybeNumber(parts[8])\n    };\n  }\n\n  function rebuildChipGroups() {\n    renderChipList(els.eventTypeChips, countBy(state.rows, \"eventType\"), \"eventTypes\");\n    renderChipList(els.evidenceChips, countBy(state.rows, \"evidence\"), \"evidence\");\n    renderChipList(els.confidenceChips, countBy(state.rows, \"conf\"), \"confidence\");\n    renderChipList(els.somaticChips, countBy(state.rows, \"somatic\"), \"somatic\");\n  }\n\n  function renderChipList(container, counts, filterKey) {\n    const entries = Array.from(counts.entries()).sort((left, right) => {\n      if (right[1] !== left[1]) {\n        return right[1] - left[1];\n      }\n      return left[0].localeCompare(right[0]);\n    });\n\n    if (!entries.length) {\n      container.innerHTML = '<span class=\"mini-note\">Load a file to populate this filter.</span>';\n      return;\n    }\n\n    container.innerHTML = \"\";\n    entries.forEach(([value, count]) => {\n      const button = document.createElement(\"button\");\n      button.type = \"button\";\n      button.className = \"chip\";\n      button.textContent = value + \" (\" + count.toLocaleString() + \")\";\n      if (state.filters[filterKey].has(value)) {\n        button.classList.add(\"active\");\n      }\n      button.addEventListener(\"click\", () => {\n        toggleSetValue(state.filters[filterKey], value);\n        state.page = 1;\n        render();\n      });\n      container.appendChild(button);\n    });\n  }\n\n  function render() {\n    state.filteredRows = applyFilters(state.rows);\n    sortRows(state.filteredRows);\n    reconcileSelection();\n    updateSummary();\n    renderTable();\n    renderDetail();\n    rebuildChipGroups();\n  }\n\n  function applyFilters(rows) {\n    return rows.filter((row) => {\n      if (state.filters.search && !row.searchText.includes(state.filters.search)) {\n        return false;\n      }\n      if (!passesNumericRange(row.somlod, state.filters.somlodMin, state.filters.somlodMax)) {\n        return false;\n      }\n      if (!passesNumericRange(row.maxlod, state.filters.maxlodMin, state.filters.maxlodMax)) {\n        return false;\n      }\n      if (!passesNumericMinimum(row.qual, state.filters.qualMin)) {\n        return false;\n      }\n      if (!passesNumericMinimum(row.split, state.filters.splitMin)) {\n        return false;\n      }\n      if (!passesNumericMinimum(row.alt_count, state.filters.altMin)) {\n        return false;\n      }\n      if (!passesNumericMinimum(Math.max(zeroIfNull(row.dcn), zeroIfNull(row.dct)), state.filters.discordantMin)) {\n        return false;\n      }\n      if (state.filters.dbsnp === \"present\" && !row.hasDbsnp) {\n        return false;\n      }\n      if (state.filters.dbsnp === \"absent\" && row.hasDbsnp) {\n        return false;\n      }\n      if (state.filters.eventTypes.size && !state.filters.eventTypes.has(row.eventType)) {\n        return false;\n      }\n      if (state.filters.evidence.size && !state.filters.evidence.has(row.evidence)) {\n        return false;\n      }\n      if (state.filters.confidence.size && !state.filters.confidence.has(row.conf)) {\n        return false;\n      }\n      if (state.filters.somatic.size && !state.filters.somatic.has(row.somatic)) {\n        return false;\n      }\n      return true;\n    });\n  }\n\n  function sortRows(rows) {\n    const direction = state.sort.direction === \"asc\" ? 1 : -1;\n    const key = state.sort.key;\n    rows.sort((left, right) => {\n      const leftValue = sortableValue(left, key);\n      const rightValue = sortableValue(right, key);\n\n      if (typeof leftValue === \"number\" || typeof rightValue === \"number\") {\n        const leftNumber = normalizeSortNumber(leftValue);\n        const rightNumber = normalizeSortNumber(rightValue);\n        if (leftNumber !== rightNumber) {\n          return (leftNumber - rightNumber) * direction;\n        }\n      } else {\n        const compare = String(leftValue).localeCompare(String(rightValue));\n        if (compare !== 0) {\n          return compare * direction;\n        }\n      }\n      return left.id - right.id;\n    });\n  }\n\n  function sortableValue(row, key) {\n    if (key === \"locus\") {\n      return row.locus;\n    }\n    if (key === \"spanAbs\") {\n      return row.spanAbs;\n    }\n    return row[key];\n  }\n\n  function updateSummary() {\n    const totalRows = state.rows.length;\n    const shownRows = state.filteredRows.length;\n    const passCount = state.filteredRows.filter((row) => row.conf === \"PASS\").length;\n    const topEvidence = topCountValue(state.filteredRows, \"evidence\");\n    const selected = findSelectedRow();\n\n    els.statTotal.textContent = totalRows.toLocaleString();\n    els.statShown.textContent = shownRows.toLocaleString();\n    els.statPass.textContent = passCount.toLocaleString();\n    els.statTopEvidence.textContent = topEvidence || \"-\";\n    els.resultsTitle.textContent = totalRows\n      ? state.fileName + \" (\" + totalRows.toLocaleString() + \" calls)\"\n      : \"No variants loaded\";\n    els.resultsSummary.textContent = totalRows\n      ? shownRows.toLocaleString() + \" rows after filters. Sorted by \" + state.sort.key + \" (\" + state.sort.direction + \").\"\n      : \"Load a file to start browsing calls.\";\n    els.exportButton.disabled = shownRows === 0;\n    if (selected && !state.filteredRows.length) {\n      state.selectedId = null;\n    }\n  }\n\n  function renderTable() {\n    const totalPages = Math.max(1, Math.ceil(state.filteredRows.length / state.pageSize));\n    if (state.page > totalPages) {\n      state.page = totalPages;\n    }\n\n    const start = (state.page - 1) * state.pageSize;\n    const end = start + state.pageSize;\n    const rows = state.filteredRows.slice(start, end);\n\n    if (!rows.length) {\n      els.tableBody.innerHTML =\n        '<tr><td colspan=\"10\" class=\"empty-table\">No rows match the current filter set.</td></tr>';\n    } else {\n      const html = rows\n        .map((row) => {\n          const isSelected = row.id === state.selectedId ? \" selected\" : \"\";\n          const spanLabel = row.span === -1 ? \"interchrom\" : formatNumber(row.span);\n          const support = [\n            \"split \" + formatNumber(row.split),\n            \"alt \" + formatNumber(row.alt_count),\n            \"disc \" + formatNumber(Math.max(zeroIfNull(row.dcn), zeroIfNull(row.dct)))\n          ].join(\" / \");\n          return (\n            '<tr class=\"' +\n            isSelected.trim() +\n            '\" data-row-id=\"' +\n            row.id +\n            '\">' +\n            '<td><div class=\"locus-cell\"><strong>' +\n            escapeHtml(row.locus) +\n            '</strong><span>' +\n            escapeHtml(row.ref + \" -> \" + row.alt_allele) +\n            \"</span></div></td>\" +\n            \"<td>\" +\n            escapeHtml(row.eventType) +\n            \"</td>\" +\n            \"<td><span class=\\\"badge\\\">\" +\n            escapeHtml(row.evidence) +\n            \"</span></td>\" +\n            \"<td>\" +\n            escapeHtml(row.conf) +\n            \"</td>\" +\n            \"<td>\" +\n            formatNumber(row.qual) +\n            \"</td>\" +\n            \"<td>\" +\n            formatNumber(row.somlod) +\n            \"</td>\" +\n            \"<td>\" +\n            formatNumber(row.maxlod) +\n            \"</td>\" +\n            \"<td>\" +\n            escapeHtml(support) +\n            \"</td>\" +\n            \"<td>\" +\n            escapeHtml(spanLabel) +\n            \"</td>\" +\n            \"<td>\" +\n            escapeHtml(row.contig_and_region) +\n            \"</td>\" +\n            \"</tr>\"\n          );\n        })\n        .join(\"\");\n      els.tableBody.innerHTML = html;\n\n      els.tableBody.querySelectorAll(\"tr[data-row-id]\").forEach((rowElement) => {\n        rowElement.addEventListener(\"click\", () => {\n          state.selectedId = Number(rowElement.dataset.rowId);\n          renderTable();\n          renderDetail();\n        });\n      });\n    }\n\n    els.prevPage.disabled = state.page <= 1 || !state.filteredRows.length;\n    els.nextPage.disabled = state.page >= totalPages || !state.filteredRows.length;\n    els.pageSummary.textContent = \"Page \" + state.page + \" of \" + totalPages;\n  }\n\n  function renderDetail() {\n    const row = findSelectedRow();\n    if (!row) {\n      els.detailContent.className = \"detail-content detail-empty\";\n      els.detailContent.textContent =\n        \"Select a row to inspect the raw breakpoint call, support metrics, and sample-level values.\";\n      return;\n    }\n\n    const confidenceClass = row.conf === \"PASS\" ? \"pass\" : row.conf === \"LOWLOD\" || row.conf === \"LOWMAPQ\" ? \"warn\" : \"low\";\n    const sampleCards = row.sampleInfo\n      .map((sample) => {\n        return (\n          '<article class=\"sample-card\">' +\n          \"<strong>\" +\n          escapeHtml(sample.label) +\n          \"</strong>\" +\n          '<div class=\"mini-note\">' +\n          escapeHtml(sample.header) +\n          \"</div>\" +\n          \"<dl>\" +\n          detailPair(\"GT\", sample.genotype) +\n          detailPair(\"AD\", formatNumber(sample.altSupport)) +\n          detailPair(\"DP\", formatNumber(sample.depth)) +\n          detailPair(\"SR\", formatNumber(sample.splitSupport)) +\n          detailPair(sample.supportLabel, formatNumber(sample.pairedSupport)) +\n          detailPair(\"GQ\", formatNumber(sample.gq)) +\n          detailPair(\"LO\", formatNumber(sample.lod)) +\n          detailPair(\"LO_n\", formatNumber(sample.lodNormal)) +\n          \"</dl>\" +\n          \"</article>\"\n        );\n      })\n      .join(\"\");\n\n    els.detailContent.className = \"detail-content\";\n    els.detailContent.innerHTML =\n      '<div class=\"detail-header\">' +\n      \"<h3>\" +\n      escapeHtml(row.locus) +\n      \"</h3>\" +\n      '<p class=\"detail-subtitle\">' +\n      escapeHtml(row.eventType + \" / \" + row.evidence + \" / \" + row.conf) +\n      \"</p>\" +\n      '<div class=\"detail-tags\">' +\n      '<span class=\"tag ' +\n      confidenceClass +\n      '\">' +\n      escapeHtml(\"conf \" + row.conf) +\n      \"</span>\" +\n      '<span class=\"tag\">' +\n      escapeHtml(\"somatic \" + row.somatic) +\n      \"</span>\" +\n      '<span class=\"tag\">' +\n      escapeHtml(\"somlod \" + formatNumber(row.somlod)) +\n      \"</span>\" +\n      '<span class=\"tag\">' +\n      escapeHtml(\"maxlod \" + formatNumber(row.maxlod)) +\n      \"</span>\" +\n      \"</div>\" +\n      \"</div>\" +\n      '<div class=\"detail-grid\">' +\n      detailCard(\"Reference\", row.ref) +\n      detailCard(\"Alternate\", row.alt_allele) +\n      detailCard(\"Breakends\", row.chr1 + \":\" + row.pos1 + \" \" + row.strand1 + \" -> \" + row.chr2 + \":\" + row.pos2 + \" \" + row.strand2) +\n      detailCard(\"Support\", \"split \" + formatNumber(row.split) + \", alt \" + formatNumber(row.alt_count) + \", cigar \" + formatNumber(row.cigar) + \", dcn \" + formatNumber(row.dcn) + \", dct \" + formatNumber(row.dct)) +\n      detailCard(\"Mapping and alignment\", \"mapq \" + formatNumber(row.mapq1) + \"/\" + formatNumber(row.mapq2) + \", AS \" + formatNumber(row.as1) + \"/\" + formatNumber(row.as2) + \", NM \" + formatNumber(row.nm1) + \"/\" + formatNumber(row.nm2)) +\n      detailCard(\"Context\", \"homol \" + presentOrX(row.homol) + \", insert \" + presentOrX(row.insert) + \", repeat \" + presentOrX(row.repeat)) +\n      detailCard(\"Contig\", row.contig_and_region) +\n      detailCard(\"Flags\", \"qual \" + formatNumber(row.qual) + \", secondary \" + formatNumber(row.secondary) + \", span \" + (row.span === -1 ? \"interchrom\" : formatNumber(row.span)) + \", dbsnp \" + presentOrX(row.dbsnp)) +\n      \"</div>\" +\n      '<h4 class=\"section-title\">Per-sample fields</h4>' +\n      '<div class=\"sample-grid\">' +\n      sampleCards +\n      \"</div>\" +\n      '<h4 class=\"section-title\">Raw row</h4>' +\n      '<pre class=\"raw-block\">' +\n      escapeHtml(state.originalHeader.join(\"\\t\")) +\n      \"\\n\" +\n      escapeHtml(row.originalCells.join(\"\\t\")) +\n      \"</pre>\";\n  }\n\n  function detailCard(label, value) {\n    return \"<div><dt>\" + escapeHtml(label) + \"</dt><dd>\" + escapeHtml(value) + \"</dd></div>\";\n  }\n\n  function detailPair(label, value) {\n    return \"<dt>\" + escapeHtml(label) + \"</dt><dd>\" + escapeHtml(value) + \"</dd>\";\n  }\n\n  function reconcileSelection() {\n    const selectedStillVisible = state.filteredRows.some((row) => row.id === state.selectedId);\n    if (!selectedStillVisible) {\n      state.selectedId = state.filteredRows.length ? state.filteredRows[0].id : null;\n    }\n  }\n\n  function findSelectedRow() {\n    return state.filteredRows.find((row) => row.id === state.selectedId) || state.rows.find((row) => row.id === state.selectedId) || null;\n  }\n\n  function exportFilteredRows() {\n    if (!state.filteredRows.length) {\n      return;\n    }\n    const lines = [state.originalHeader.join(\"\\t\")].concat(state.filteredRows.map((row) => row.originalCells.join(\"\\t\")));\n    const blob = new Blob([lines.join(\"\\n\")], { type: \"text/tab-separated-values;charset=utf-8\" });\n    const url = URL.createObjectURL(blob);\n    const anchor = document.createElement(\"a\");\n    const baseName = state.fileName.replace(/\\.gz$/i, \"\").replace(/\\.txt$/i, \"\");\n    anchor.href = url;\n    anchor.download = baseName + \".filtered.tsv\";\n    anchor.click();\n    URL.revokeObjectURL(url);\n  }\n\n  function countBy(rows, key) {\n    const map = new Map();\n    rows.forEach((row) => {\n      const value = row[key];\n      map.set(value, (map.get(value) || 0) + 1);\n    });\n    return map;\n  }\n\n  function topCountValue(rows, key) {\n    const counts = countBy(rows, key);\n    let bestValue = \"\";\n    let bestCount = -1;\n    counts.forEach((count, value) => {\n      if (count > bestCount) {\n        bestCount = count;\n        bestValue = value;\n      }\n    });\n    return bestValue;\n  }\n\n  function toggleSetValue(set, value) {\n    if (set.has(value)) {\n      set.delete(value);\n    } else {\n      set.add(value);\n    }\n  }\n\n  function setStatus(message) {\n    els.statusText.textContent = message;\n  }\n\n  function passesNumericRange(value, min, max) {\n    if (min === null && max === null) {\n      return true;\n    }\n    if (value === null || !Number.isFinite(value)) {\n      return false;\n    }\n    if (min !== null && value < min) {\n      return false;\n    }\n    if (max !== null && value > max) {\n      return false;\n    }\n    return true;\n  }\n\n  function passesNumericMinimum(value, min) {\n    if (min === null) {\n      return true;\n    }\n    if (value === null || !Number.isFinite(value)) {\n      return false;\n    }\n    return value >= min;\n  }\n\n  function parseNullableNumber(raw) {\n    if (raw === \"\" || raw === null || raw === undefined) {\n      return null;\n    }\n    const value = Number(raw);\n    return Number.isFinite(value) ? value : null;\n  }\n\n  function parseMaybeNumber(raw) {\n    if (raw === \"\" || raw === \"NA\" || raw === \"x\" || raw === \"NOTSET\") {\n      return null;\n    }\n    const value = Number(raw);\n    return Number.isFinite(value) ? value : null;\n  }\n\n  function formatNumber(value) {\n    if (value === null || value === undefined || value === Infinity) {\n      return \"-\";\n    }\n    if (!Number.isFinite(value)) {\n      return String(value);\n    }\n    return Math.abs(value) >= 100 || Number.isInteger(value)\n      ? value.toLocaleString()\n      : value.toFixed(3).replace(/\\.?0+$/, \"\");\n  }\n\n  function presentOrX(value) {\n    return value && value !== \"x\" ? value : \"x\";\n  }\n\n  function normalizeSortNumber(value) {\n    if (value === Infinity) {\n      return Number.MAX_SAFE_INTEGER;\n    }\n    if (value === null || value === undefined || Number.isNaN(value)) {\n      return -Number.MAX_SAFE_INTEGER;\n    }\n    return Number(value);\n  }\n\n  function zeroIfNull(value) {\n    return value === null || value === undefined ? 0 : value;\n  }\n\n  function stripLeadingHash(value) {\n    return typeof value === \"string\" ? value.replace(/^#/, \"\") : value;\n  }\n\n  function escapeHtml(value) {\n    return String(value)\n      .replace(/&/g, \"&amp;\")\n      .replace(/</g, \"&lt;\")\n      .replace(/>/g, \"&gt;\")\n      .replace(/\"/g, \"&quot;\")\n      .replace(/'/g, \"&#39;\");\n  }\n})();\n"
  },
  {
    "path": "docs/bps_explorer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>SvABA BPS Explorer</title>\n<style>\n:root {\n  --bg: #0f1117; --surface: #1a1d27; --surface2: #252833;\n  --border: #2e3140; --text: #e1e4ed; --text2: #8b8fa3;\n  --accent: #6c8cff; --green: #4ade80; --red: #f87171; --amber: #fbbf24;\n  --blue: #60a5fa; --purple: #a855f7;\n}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:'SF Mono','Fira Code','Consolas',monospace;background:var(--bg);color:var(--text);min-height:100vh;font-size:12px}\n.header{display:flex;align-items:center;justify-content:space-between;padding:.6rem 1rem;border-bottom:1px solid var(--border);background:var(--surface)}\n.header h1{font-size:1rem;font-weight:600} .header h1 span{color:var(--accent)}\n.header .meta{font-size:.75rem;color:var(--text2)}\n.container{padding:.6rem 1rem}\n\n/* Upload */\n.upload-row{display:flex;gap:.8rem;align-items:center;padding:.6rem 1rem;background:var(--surface);border-bottom:1px solid var(--border)}\n.upload-box{background:var(--surface2);border:2px dashed var(--border);border-radius:6px;padding:.6rem 1rem;cursor:pointer;transition:border-color .2s;font-size:.78rem;color:var(--text2);flex:1;text-align:center;max-width:400px}\n.upload-box:hover,.upload-box.over{border-color:var(--accent)}\n.upload-box.loaded{border-color:var(--green);border-style:solid}\n.upload-box input{display:none}\n.upload-box .fn{color:var(--green);font-size:.72rem;margin-top:.2rem;word-break:break-all}\n.btn{background:var(--accent);color:#fff;border:none;border-radius:5px;padding:.35rem .8rem;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit}\n.btn:hover{opacity:.9} .btn:disabled{opacity:.4;cursor:not-allowed}\n.btn-ghost{background:transparent;border:1px solid var(--border);color:var(--text2)}\n.btn-ghost:hover{border-color:var(--accent);color:var(--text)}\n\n/* Controls */\n.controls{display:flex;flex-wrap:wrap;gap:.5rem .8rem;padding:.5rem 1rem;background:var(--surface);border-bottom:1px solid var(--border);align-items:end}\n.ctrl{display:flex;flex-direction:column;gap:.2rem}\n.ctrl label{font-size:.65rem;color:var(--text2);text-transform:uppercase;letter-spacing:.05em}\n.ctrl input,.ctrl select{background:var(--surface2);border:1px solid var(--border);border-radius:4px;padding:.3rem .5rem;font-family:inherit;font-size:.78rem;color:var(--text);width:auto}\n.ctrl input[type=number]{width:70px} .ctrl input[type=search]{width:180px} .ctrl input[type=text]{width:200px}\n.ctrl select{min-width:60px}\n.ctrl input:focus,.ctrl select:focus{outline:none;border-color:var(--accent)}\n.chips{display:flex;gap:.3rem;flex-wrap:wrap;align-items:center}\n.chip{padding:.2rem .5rem;border-radius:4px;border:1px solid var(--border);font-size:.7rem;cursor:pointer;color:var(--text2);background:var(--surface2);transition:all .15s}\n.chip:hover{border-color:var(--accent);color:var(--text)}\n.chip.on{background:rgba(108,140,255,.15);border-color:var(--accent);color:var(--accent)}\n.chip.empty{opacity:.35}\n.preset{padding:.15rem .4rem;border-radius:3px;border:1px solid var(--border);font-size:.65rem;cursor:pointer;color:var(--text2);background:transparent}\n.preset:hover{border-color:var(--accent);color:var(--accent)}\n\n/* Stats bar */\n.stats-bar{display:flex;gap:1.2rem;padding:.4rem 1rem;background:var(--surface);border-bottom:1px solid var(--border);font-size:.75rem;color:var(--text2)}\n.stats-bar .sv{color:var(--accent);font-weight:600}\n\n/* Charts */\n.charts-row{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.5rem 1rem;background:var(--bg)}\n.chart-card{background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:.4rem .5rem;min-height:140px}\n.chart-card .ct{font-size:.65rem;color:var(--text2);text-transform:uppercase;letter-spacing:.04em;margin-bottom:.3rem;display:flex;align-items:center;justify-content:space-between;gap:.3rem}\n.chart-card canvas{width:100%;height:120px;display:block}\n.log-tog{background:transparent;border:1px solid var(--border);color:var(--text2);font-size:.6rem;padding:1px 5px;border-radius:3px;cursor:pointer;font-family:inherit;text-transform:none;letter-spacing:0;line-height:1.1}\n.log-tog:hover{border-color:var(--accent);color:var(--text)}\n.log-tog.on{background:rgba(108,140,255,.15);border-color:var(--accent);color:var(--accent)}\n\n/* Table */\n.table-wrap{overflow:auto;background:var(--surface);border:1px solid var(--border);border-radius:6px;margin:.5rem 1rem;flex:1}\ntable{width:100%;border-collapse:collapse;white-space:nowrap;table-layout:auto}\nth{background:var(--surface2);color:var(--text2);text-align:left;padding:.25rem .4rem;position:sticky;top:0;cursor:pointer;user-select:none;z-index:1;font-size:.72rem;text-transform:uppercase;letter-spacing:.03em}\nth:hover{color:var(--accent)}\nth .sa{font-size:.6em;margin-left:.15rem;opacity:.5}\ntd{padding:.25rem .4rem;border-top:1px solid rgba(46,49,64,.5);font-size:.75rem;user-select:text;-webkit-user-select:text}\ntr:hover td{background:var(--surface2)}\ntr.sel td{background:#1e3a5f !important}\ntr{cursor:pointer}\ntd.num{text-align:right;font-variant-numeric:tabular-nums}\n/* Per-column width/wrap rules. `nowrap` is the table default; we only loosen\n   where it makes sense (ref/alt soft-wrap at ~10ch, contig soft-wrap). */\ntd.w-loc,th.w-loc{max-width:14ch}\ntd.w-strand,th.w-strand{width:2.6ch;padding-left:.3rem;padding-right:.3rem;text-align:center}\ntd.w-strand{font-weight:600}\ntd.w-tiny,th.w-tiny{max-width:8ch;overflow:hidden;text-overflow:ellipsis}\ntd.w-num,th.w-num{max-width:7ch}\ntd.w-seq,th.w-seq{max-width:10ch;white-space:normal;word-break:break-all;font-family:'SF Mono','Consolas',monospace;line-height:1.1}\ntd.w-wrap,th.w-wrap{max-width:22ch;white-space:normal;word-break:break-all;line-height:1.1}\n/* Genes column — comma-joined gene symbols from the user-uploaded GTF;\n   soft-wrap so multi-gene hits don't blow the row height out. */\ntd.w-genes,th.w-genes{max-width:16ch;white-space:normal;word-break:break-word;line-height:1.15;color:var(--green)}\n/* Samples column — shows the full per-sample FORMAT value\n   (GT:AD:DP:SR:DR:GQ:PL:LO:LO_n), one sample per line, monospace so the\n   colon-separated fields stack column-wise visually. white-space:pre\n   preserves the embedded \\n that mkRow puts between samples. */\ntd.w-gt,th.w-gt{max-width:46ch;white-space:pre;line-height:1.25;font-size:.7rem}\ntd.strand-plus{color:var(--green)}\ntd.strand-minus{color:var(--red)}\n::selection{background:#3b5bdb;color:#fff}\na.igv-link{color:var(--accent);text-decoration:none;cursor:pointer}\na.igv-link:hover{text-decoration:underline}\na.igv-link.ok{color:var(--green)}\na.igv-link.err{color:var(--red)}\ntd.pass{color:var(--green)} td.lowlod{color:var(--amber)} td.nopass{color:var(--red)}\n/* GT column cells are click-to-open-legend */\ntd.gt-cell{cursor:help}\ntd.gt-cell:hover{background:rgba(108,140,255,.12)}\nth.w-gt{cursor:help}\n/* GT legend popover — shared, floating, dismissed on outside click */\n#gt-legend{position:fixed;z-index:50;display:none;background:var(--surface);border:1px solid var(--accent);border-radius:6px;box-shadow:0 6px 20px rgba(0,0,0,.5);padding:.6rem .8rem;font-size:.72rem;color:var(--text);max-width:460px;line-height:1.45}\n#gt-legend.on{display:block}\n#gt-legend h4{font-size:.72rem;color:var(--accent);margin-bottom:.3rem;text-transform:uppercase;letter-spacing:.04em}\n#gt-legend .row{display:flex;gap:.4rem;margin:.15rem 0}\n#gt-legend .k{color:var(--accent);font-weight:600;min-width:4.5ch;font-family:inherit}\n#gt-legend .v{color:var(--text2)}\n#gt-legend hr{border:none;border-top:1px solid var(--border);margin:.4rem 0}\n#gt-legend .close{float:right;cursor:pointer;color:var(--text2);font-size:.9rem;line-height:1;margin-left:.4rem}\n#gt-legend .close:hover{color:var(--red)}\n.pagination{display:flex;align-items:center;justify-content:space-between;padding:.35rem 1rem;font-size:.75rem;color:var(--text2);background:var(--surface);border-top:1px solid var(--border)}\n.pagination .pg-btns{display:flex;gap:.3rem}\n\n/* Detail panel */\n.detail-panel{margin:.5rem 1rem;background:var(--surface);border:1px solid var(--border);border-radius:6px;overflow:hidden}\n.dp-header{background:var(--surface2);padding:.4rem .8rem;font-size:.72rem;color:var(--text2);text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--border);display:flex;justify-content:space-between}\n.dp-header strong{color:var(--text);text-transform:none;letter-spacing:0}\n.dp-body{max-height:350px;overflow:auto}\n.dp-empty{padding:.8rem;text-align:center;color:var(--text2);font-size:.78rem}\n.kv{width:100%;border-collapse:collapse;font-size:.72rem}\n.kv td{padding:2px 8px;border-bottom:1px solid rgba(46,49,64,.4);vertical-align:top}\n.kv .k{width:160px;color:var(--text2);background:rgba(0,0,0,.15);white-space:nowrap;font-weight:600}\n.kv .v{color:var(--text);word-break:break-all;white-space:pre-wrap}\n.kv tr.samp .k{color:var(--accent);background:rgba(88,166,255,.06);border-left:2px solid rgba(88,166,255,.3)}\n.kv tr.samp .v{background:rgba(88,166,255,.03)}\n.kv tr:hover td{background:#1f2937}\n\n.format-key{padding:4px 8px;background:var(--surface2);border-bottom:1px solid var(--border);font-size:.68rem;color:var(--text2)}\n.format-key code{color:var(--accent)}\n\n/* r2c re-plot sub-panel removed — use the standalone viewer/r2c_explorer.html\n   instead. It loads an r2c TSV on its own and lets you search for any\n   contig by name, with the same rendering logic that used to live here. */\n\n@media(max-width:1100px){.charts-row{grid-template-columns:repeat(3,1fr)}}\n@media(max-width:700px){.charts-row{grid-template-columns:1fr}.controls{flex-direction:column;align-items:stretch}}\n</style>\n</head>\n<body>\n\n<div class=\"header\">\n  <h1><span>SvABA</span> BPS Explorer</h1>\n  <div class=\"meta\" id=\"file-meta\">No file loaded</div>\n</div>\n\n<div class=\"upload-row\">\n  <div class=\"upload-box\" id=\"drop-zone\" onclick=\"document.getElementById('file-input').click()\">\n    Drop or click &mdash; <code>.bps.txt</code> / <code>.bps.txt.gz</code>\n    <div class=\"fn\" id=\"file-name\" style=\"display:none\"></div>\n    <input type=\"file\" id=\"file-input\" accept=\".txt,.gz,.tsv,text/plain,application/gzip\">\n  </div>\n  <div class=\"upload-box\" id=\"gtf-zone\" onclick=\"document.getElementById('gtf-input').click()\"\n       title=\"Optional: upload a BED or GTF of gene annotations. BED (recommended): 4+ column BED with gene name in col 4. GTF: GENCODE-style with exon features. When loaded, each variant row gets a Genes column.\">\n    Drop or click &mdash; <code>.bed</code> / <code>.bed.gz</code> / <code>.gtf</code> / <code>.gtf.gz</code> <em>(optional, gene annotation)</em>\n    <div class=\"fn\" id=\"gtf-name\" style=\"display:none\"></div>\n    <input type=\"file\" id=\"gtf-input\" accept=\".bed,.gtf,.gz,text/plain,application/gzip\">\n  </div>\n  <button class=\"btn-ghost btn\" id=\"export-btn\" disabled>Export TSV</button>\n</div>\n\n<div class=\"controls\" id=\"controls\" style=\"display:none\">\n  <div class=\"ctrl\"><label>Search</label><input id=\"f-search\" type=\"search\" placeholder=\"text / contig / gene\"></div>\n  <div class=\"ctrl\"><label>Region</label><input id=\"f-region\" type=\"text\" placeholder=\"chr7:55M-56M\"></div>\n  <div class=\"ctrl\"><label>Somlod &ge;</label>\n    <div style=\"display:flex;gap:.2rem;align-items:center\">\n      <input id=\"f-somlod-min\" type=\"number\" step=\"0.1\" placeholder=\"-\">\n      <span style=\"color:var(--text2)\">to</span>\n      <input id=\"f-somlod-max\" type=\"number\" step=\"0.1\" placeholder=\"-\">\n      <div style=\"display:flex;gap:.15rem\">\n        <button class=\"preset\" data-t=\"f-somlod-min\" data-v=\"0\">0</button>\n        <button class=\"preset\" data-t=\"f-somlod-min\" data-v=\"3\">3</button>\n        <button class=\"preset\" data-t=\"f-somlod-min\" data-v=\"6\">6</button>\n        <button class=\"preset\" data-t=\"f-somlod-min\" data-v=\"10\">10</button>\n      </div>\n    </div>\n  </div>\n  <div class=\"ctrl\"><label>Maxlod &ge;</label>\n    <div style=\"display:flex;gap:.2rem;align-items:center\">\n      <input id=\"f-maxlod-min\" type=\"number\" step=\"0.1\" placeholder=\"-\">\n      <span style=\"color:var(--text2)\">to</span>\n      <input id=\"f-maxlod-max\" type=\"number\" step=\"0.1\" placeholder=\"-\">\n    </div>\n  </div>\n  <div class=\"ctrl\"><label>Qual &ge;</label><input id=\"f-qual-min\" type=\"number\" step=\"1\" placeholder=\"-\"></div>\n  <div class=\"ctrl\"><label>Split &ge;</label><input id=\"f-split-min\" type=\"number\" step=\"1\" placeholder=\"-\"></div>\n  <div class=\"ctrl\"><label>Alt &ge;</label><input id=\"f-alt-min\" type=\"number\" step=\"1\" placeholder=\"-\"></div>\n  <div class=\"ctrl\"><label>Span range</label>\n    <div style=\"display:flex;gap:.2rem;align-items:center\">\n      <input id=\"f-span-min\" type=\"number\" step=\"1\" placeholder=\"min\">\n      <span style=\"color:var(--text2)\">&ndash;</span>\n      <input id=\"f-span-max\" type=\"number\" step=\"1\" placeholder=\"max\">\n    </div>\n  </div>\n  <div class=\"ctrl\"><label>Chr</label>\n    <button class=\"chip\" id=\"f-std-chr\" title=\"Hide variants on non-standard chromosomes (chrUn, *_random, *_alt, decoy, etc.)\">Standard only</button>\n  </div>\n  <div class=\"ctrl\"><label>Rows/pg</label>\n    <select id=\"f-page-size\"><option value=\"50\">50</option><option value=\"100\" selected>100</option><option value=\"250\">250</option><option value=\"500\">500</option><option value=\"1000\">1k</option></select>\n  </div>\n  <button class=\"btn-ghost btn\" id=\"reset-btn\" style=\"margin-left:auto\">Reset</button>\n</div>\n\n<div id=\"chip-bar\" class=\"controls\" style=\"display:none\"></div>\n\n<div class=\"stats-bar\" id=\"stats-bar\" style=\"display:none\">\n  <span>Rows: <span class=\"sv\" id=\"s-total\">0</span></span>\n  <span>Shown: <span class=\"sv\" id=\"s-shown\">0</span></span>\n  <span>PASS: <span class=\"sv\" id=\"s-pass\">0</span></span>\n  <span>Somatic: <span class=\"sv\" id=\"s-somatic\">0</span></span>\n  <span>Germline: <span class=\"sv\" id=\"s-germline\">0</span></span>\n  <span>INDEL: <span class=\"sv\" id=\"s-indel\">0</span></span>\n  <span>SV: <span class=\"sv\" id=\"s-sv\">0</span></span>\n</div>\n\n<div class=\"charts-row\" id=\"charts-row\" style=\"display:none\">\n  <div class=\"chart-card\"><div class=\"ct\"><span>Somlod</span><button class=\"log-tog\" data-chart=\"somlod\" title=\"Toggle symmetric log10 x-axis\">log10</button></div><canvas id=\"c-somlod\"></canvas></div>\n  <div class=\"chart-card\"><div class=\"ct\"><span>Maxlod</span><button class=\"log-tog\" data-chart=\"maxlod\" title=\"Toggle symmetric log10 x-axis\">log10</button></div><canvas id=\"c-maxlod\"></canvas></div>\n  <div class=\"chart-card\"><div class=\"ct\"><span>Span (log10)</span></div><canvas id=\"c-span\"></canvas></div>\n</div>\n\n<div class=\"table-wrap\" id=\"table-wrap\" style=\"display:none;max-height:calc(100vh - 380px)\">\n  <table><thead><tr id=\"thead\"></tr></thead><tbody id=\"tbody\"></tbody></table>\n</div>\n<div class=\"pagination\" id=\"pagination\" style=\"display:none\">\n  <span id=\"pg-info\">-</span>\n  <div class=\"pg-btns\">\n    <button class=\"btn-ghost btn\" id=\"pg-first\">&laquo;</button>\n    <button class=\"btn-ghost btn\" id=\"pg-prev\">&lsaquo; Prev</button>\n    <button class=\"btn-ghost btn\" id=\"pg-next\">Next &rsaquo;</button>\n    <button class=\"btn-ghost btn\" id=\"pg-last\">&raquo;</button>\n  </div>\n</div>\n\n<div class=\"detail-panel\" id=\"detail-panel\" style=\"display:none\">\n  <div class=\"dp-header\">\n    <span>Selected row detail</span>\n    <strong id=\"dp-locus\">-</strong>\n  </div>\n  <div class=\"format-key\">FORMAT (per-sample): <code>GT:AD:DP:SR:DR:GQ:PL:LO:LO_n</code> &mdash; SV uses DR=disc, INDEL uses DR=cigar. For per-read alignment re-plots, use the standalone <code>r2c_explorer.html</code>.</div>\n  <div class=\"dp-body\" id=\"dp-body\"><div class=\"dp-empty\">Click a table row</div></div>\n</div>\n\n<div id=\"gt-legend\" role=\"dialog\" aria-label=\"Genotype and FORMAT field legend\">\n  <span class=\"close\" id=\"gt-legend-close\" title=\"Close\">&times;</span>\n  <h4>Genotype (GT)</h4>\n  <div class=\"row\"><span class=\"k\">0/0</span><span class=\"v\">homozygous reference (no alt allele)</span></div>\n  <div class=\"row\"><span class=\"k\">0/1</span><span class=\"v\">heterozygous (one alt allele)</span></div>\n  <div class=\"row\"><span class=\"k\">1/1</span><span class=\"v\">homozygous alt (both alleles are alt)</span></div>\n  <div class=\"row\"><span class=\"k\">./.</span><span class=\"v\">no call / insufficient coverage</span></div>\n  <hr>\n  <h4>Per-sample FORMAT fields <code style=\"color:var(--accent);font-size:.68rem\">GT:AD:DP:SR:DR:GQ:PL:LO:LO_n</code></h4>\n  <div class=\"row\"><span class=\"k\">AD</span><span class=\"v\">allelic depth (# reads supporting the alt allele)</span></div>\n  <div class=\"row\"><span class=\"k\">DP</span><span class=\"v\">total read depth at this site</span></div>\n  <div class=\"row\"><span class=\"k\">SR</span><span class=\"v\">split-read support (reads spanning the breakpoint)</span></div>\n  <div class=\"row\"><span class=\"k\">DR</span><span class=\"v\">discordant-pair support for SVs; CIGAR-indel support for INDELs</span></div>\n  <div class=\"row\"><span class=\"k\">GQ</span><span class=\"v\">genotype quality (Phred)</span></div>\n  <div class=\"row\"><span class=\"k\">PL</span><span class=\"v\">Phred-scaled genotype likelihoods (0/0, 0/1, 1/1)</span></div>\n  <div class=\"row\"><span class=\"k\">LO</span><span class=\"v\">log-odds variant vs. error at this sample (see CLAUDE.md)</span></div>\n  <div class=\"row\"><span class=\"k\">LO_n</span><span class=\"v\">log-odds variant vs. error, normal-model only</span></div>\n  <hr>\n  <div class=\"row\"><span class=\"k\" style=\"color:var(--text2)\">Tip</span><span class=\"v\">Click outside this box or press <kbd style=\"background:var(--surface2);padding:1px 5px;border-radius:3px;border:1px solid var(--border)\">Esc</kbd> to dismiss</span></div>\n</div>\n\n<script>\n(function(){\n\"use strict\";\n\n/* === Column defs === */\nconst LEGACY=[\n  \"chr1\",\"pos1\",\"strand1\",\"chr2\",\"pos2\",\"strand2\",\"ref\",\"alt_allele\",\n  \"span\",\"split\",\"alt_count\",\"cov\",\"cigar\",\"cigar_near\",\n  \"dmq1\",\"dmq2\",\"dcn\",\"dct\",\"mapq1\",\"mapq2\",\"nm1\",\"nm2\",\"as1\",\"as2\",\"sub1\",\"sub2\",\n  \"homol\",\"insert\",\"repeat\",\"contig_and_region\",\"naln\",\"conf\",\"evidence\",\"qual\",\"secondary\",\n  \"somatic\",\"somlod\",\"maxlod\",\"dbsnp\",\"contig_conf1\",\"contig_conf2\"];\nconst V2=[\"cpos1\",\"cpos2\",\"lmatch\",\"rmatch\",\"scov1\",\"scov2\",\"local1\",\"local2\",\"ctglen\",\"flipped\"];\n// SvABA2.0 v3: +1 trailing core column. bp_id is a thread-unique BP\n// identifier of the form \"bpTTTNNNNNNNN\" (see BreakPoint::id in\n// src/svaba/BreakPoint.h). Used to cross-reference to the r2c file's\n// split_bps / disc_bps columns.\nconst V3=[\"bp_id\"];\nconst NUM=new Set([\"pos1\",\"pos2\",\"span\",\"split\",\"alt_count\",\"cov\",\"cigar\",\"cigar_near\",\"dmq1\",\"dmq2\",\"dcn\",\"dct\",\"mapq1\",\"mapq2\",\"nm1\",\"nm2\",\"as1\",\"as2\",\"sub1\",\"sub2\",\"naln\",\"qual\",\"secondary\",\"somlod\",\"maxlod\",\"cpos1\",\"cpos2\",\"lmatch\",\"rmatch\",\"scov1\",\"scov2\",\"ctglen\"]);\n\nconst TCOLS=[\n  // bp_id pinned to the leftmost column — it's the primary join key back\n  // to r2c.txt.gz / the bi:Z BAM tag, so keeping it in a fixed, easy-to-\n  // find position matters more than adjacency to other variant metadata.\n  {k:\"bp_id\",l:\"bp_id\",w:\"tiny\"},\n  {k:\"igvPos1\",l:\"IGV1\",w:\"loc\"},{k:\"strand1\",l:\"S1\",w:\"strand\"},\n  {k:\"igvPos2\",l:\"IGV2\",w:\"loc\"},{k:\"strand2\",l:\"S2\",w:\"strand\"},\n  // span sits next to the pos2/strand2 pair since it's a property of\n  // the chr1:pos1 → chr2:pos2 interval; easier to scan the \"where\"\n  // columns all at once before moving on to quality/support metrics.\n  {k:\"span\",l:\"Span\",n:1,w:\"num\"},\n  // Genes column — populated only when the user has loaded a GTF.\n  // Shows the comma-joined union of any gene whose EXON(S) overlap\n  // pos1 OR pos2. Stays adjacent to the locus block so the biological\n  // context is visually anchored to where the breakpoint is.\n  {k:\"genes\",l:\"Genes\",w:\"genes\"},\n  {k:\"eventType\",l:\"Type\",w:\"tiny\"},{k:\"evidence\",l:\"Evid\",w:\"tiny\"},{k:\"conf\",l:\"Conf\",w:\"tiny\"},\n  {k:\"qual\",l:\"Qual\",n:1,w:\"num\"},{k:\"somlod\",l:\"Somlod\",n:1,w:\"num\"},{k:\"maxlod\",l:\"Maxlod\",n:1,w:\"num\"},\n  {k:\"gtSummary\",l:\"Samples \\u24d8\",w:\"gt\",help:true},\n  {k:\"split\",l:\"Split\",n:1,w:\"num\"},{k:\"alt_count\",l:\"Alt\",n:1,w:\"num\"},{k:\"cigar\",l:\"Cigar\",n:1,w:\"num\"},\n  {k:\"dcn\",l:\"DCn\",n:1,w:\"num\"},{k:\"dct\",l:\"DCt\",n:1,w:\"num\"},{k:\"cov\",l:\"Cov\",n:1,w:\"num\"},\n  {k:\"somatic\",l:\"Somatic\",w:\"tiny\"},\n  {k:\"ref\",l:\"Ref\",w:\"seq\"},{k:\"alt_allele\",l:\"Alt\",w:\"seq\"},\n  {k:\"mapq1\",l:\"MQ1\",n:1,w:\"num\"},{k:\"mapq2\",l:\"MQ2\",n:1,w:\"num\"},\n  {k:\"dbsnp\",l:\"Dbsnp\",w:\"tiny\"},\n  {k:\"contig_and_region\",l:\"Contig\",w:\"wrap\"}\n];\n\n/* === State === */\nconst S={fn:\"\",hdr:[],sampHdr:[],coreCnt:0,rows:[],filt:[],selId:null,\n  pg:1,pgSz:100,sort:{k:\"maxlod\",d:\"desc\"},\n  logScale:{somlod:false,maxlod:false},\n  f:{search:\"\",region:null,somlodMin:null,somlodMax:null,maxlodMin:null,maxlodMax:null,\n     qualMin:null,splitMin:null,altMin:null,spanMin:null,spanMax:null,stdChrOnly:false,\n     eventTypes:new Set(),evidence:new Set(),confidence:new Set(),somatic:new Set()}};\n\n/* === DOM === */\nconst $=id=>document.getElementById(id);\n\n/* === Init table header === */\nTCOLS.forEach(c=>{\n  const th=document.createElement(\"th\"); th.dataset.k=c.k;\n  if(c.w) th.classList.add(\"w-\"+c.w);\n  if(c.help) th.classList.add(\"gt-head\");\n  th.innerHTML=esc(c.l)+'<span class=\"sa\"></span>';\n  th.onclick=e=>{\n    // GT header: clicking opens the legend instead of sorting.\n    if(c.help){e.stopPropagation();showGtLegend(th);return}\n    toggleSort(c.k);render();\n  };\n  $(\"thead\").appendChild(th);\n});\n\n/* === Events === */\n$(\"file-input\").onchange=e=>{const f=e.target.files[0];if(f)loadBlob(f,f.name)};\n[\"dragenter\",\"dragover\"].forEach(e=>$(\"drop-zone\").addEventListener(e,ev=>{ev.preventDefault();$(\"drop-zone\").classList.add(\"over\")}));\n[\"dragleave\",\"drop\"].forEach(e=>$(\"drop-zone\").addEventListener(e,ev=>{ev.preventDefault();$(\"drop-zone\").classList.remove(\"over\")}));\n$(\"drop-zone\").addEventListener(\"drop\",e=>{const f=e.dataTransfer.files[0];if(f)loadBlob(f,f.name)});\n\n// GTF upload box — optional; enables the Genes column once a GTF is\n// loaded. Mirrors the bps drop-zone wiring so the UX is identical.\n$(\"gtf-input\").onchange=e=>{const f=e.target.files[0];if(f)loadGtfBlob(f,f.name)};\n[\"dragenter\",\"dragover\"].forEach(e=>$(\"gtf-zone\").addEventListener(e,ev=>{ev.preventDefault();$(\"gtf-zone\").classList.add(\"over\")}));\n[\"dragleave\",\"drop\"].forEach(e=>$(\"gtf-zone\").addEventListener(e,ev=>{ev.preventDefault();$(\"gtf-zone\").classList.remove(\"over\")}));\n$(\"gtf-zone\").addEventListener(\"drop\",e=>{const f=e.dataTransfer.files[0];if(f)loadGtfBlob(f,f.name)});\n\n$(\"export-btn\").onclick=exportTSV;\n$(\"reset-btn\").onclick=()=>{resetF();render()};\n$(\"pg-prev\").onclick=()=>{if(S.pg>1){S.pg--;rTable()}};\n$(\"pg-next\").onclick=()=>{if(S.pg<tPages()){S.pg++;rTable()}};\n$(\"pg-first\").onclick=()=>{S.pg=1;rTable()};\n$(\"pg-last\").onclick=()=>{S.pg=tPages();rTable()};\ndocument.querySelectorAll(\".preset\").forEach(b=>{\n  b.onclick=()=>{$(b.dataset.t).value=b.dataset.v;syncF();render()};\n});\n[\"f-search\",\"f-region\",\"f-somlod-min\",\"f-somlod-max\",\"f-maxlod-min\",\"f-maxlod-max\",\n \"f-qual-min\",\"f-split-min\",\"f-alt-min\",\"f-span-min\",\"f-span-max\",\"f-page-size\"\n].forEach(id=>{\n  $(id).addEventListener(\"input\",()=>{syncF();render()});\n});\n$(\"f-std-chr\").onclick=()=>{\n  S.f.stdChrOnly=!S.f.stdChrOnly;\n  $(\"f-std-chr\").classList.toggle(\"on\",S.f.stdChrOnly);\n  S.pg=1;render();\n};\ndocument.querySelectorAll(\".log-tog\").forEach(b=>{\n  b.onclick=()=>{\n    const c=b.dataset.chart;\n    S.logScale[c]=!S.logScale[c];\n    b.classList.toggle(\"on\",S.logScale[c]);\n    rCharts();\n  };\n});\n\n/* === GT legend popover === */\nfunction showGtLegend(anchorEl){\n  const leg=$(\"gt-legend\");\n  leg.classList.add(\"on\");\n  // Position below the anchor, clamped to viewport so it never clips.\n  const r=anchorEl.getBoundingClientRect();\n  const vw=window.innerWidth,vh=window.innerHeight;\n  // Measure after display; offscreen-measure via opacity:0 trick isn't needed\n  // because we set display:block first.\n  const lw=leg.offsetWidth,lh=leg.offsetHeight;\n  let x=r.left, y=r.bottom+4;\n  if(x+lw>vw-8) x=Math.max(8,vw-lw-8);\n  if(y+lh>vh-8) y=Math.max(8,r.top-lh-4);\n  leg.style.left=x+\"px\";\n  leg.style.top=y+\"px\";\n}\nfunction hideGtLegend(){$(\"gt-legend\").classList.remove(\"on\")}\n$(\"gt-legend-close\").onclick=e=>{e.stopPropagation();hideGtLegend()};\ndocument.addEventListener(\"click\",e=>{\n  const leg=$(\"gt-legend\");\n  if(!leg.classList.contains(\"on\"))return;\n  if(e.target.closest(\"#gt-legend\"))return;\n  if(e.target.closest(\".gt-cell\")||e.target.closest(\".gt-head\"))return;\n  hideGtLegend();\n});\ndocument.addEventListener(\"keydown\",e=>{if(e.key===\"Escape\")hideGtLegend()});\n\n/* === File load === */\nasync function loadBlob(blob,name){\n  $(\"file-meta\").textContent=\"Loading \"+name+\"...\";\n  try{\n    let text;\n    if(name.endsWith(\".gz\")){\n      if(typeof DecompressionStream===\"undefined\") throw new Error(\"Browser lacks DecompressionStream\");\n      text=await new Response(blob.stream().pipeThrough(new DecompressionStream(\"gzip\"))).text();\n    } else text=await blob.text();\n    ingest(text,name);\n  }catch(e){$(\"file-meta\").textContent=\"Error: \"+e.message;console.error(e)}\n  $(\"file-input\").value=\"\";\n}\n\n/* === Gene annotation load (BED or GTF) =================================\n *\n * User uploads a BED / BED.gz or GTF / GTF.gz; we build a per-chromosome\n * sorted index of {start, end, gene_name}. For BED we take cols 1-3 as\n * the interval and col 4 as the gene name (0-based BED coords converted\n * to 1-based internally). For GTF we parse EXON features only and pull\n * gene_name from the attributes column.\n *\n * When the bps file is (re)loaded or the annotation changes, every row\n * gets annotated with the comma-joined union of gene names whose intervals\n * overlap pos1 OR pos2.\n *\n * Index shape per chrom (normalized via normC, i.e. \"chr1\" and \"1\"\n * collapse to the same key):\n *   { starts:[], ends:[], genes:[], maxEnd:[] }\n * where maxEnd[i] is the running max of ends[0..i], enabling a bounded\n * walk-back during lookup: once maxEnd[j] < pos we can stop — no\n * earlier interval can still contain pos.\n *\n * Lookup: binary-search starts for largest index with start<=pos, then\n * walk back checking end>=pos; bail when maxEnd falls below pos.\n *\n * BED is recommended over GTF — it's 10-50x smaller and parses in\n * milliseconds. A typical GENCODE genes.bed is ~2 MB vs ~1.5 GB for the\n * full GTF.\n */\nconst GTF = {\n  byChr: new Map(),     // normC(chrom) -> {starts,ends,genes,maxEnd}\n  nExons: 0,\n  loaded: false,\n  fn: \"\"\n};\n\nasync function loadGtfBlob(blob, name) {\n  $(\"gtf-name\").style.display = \"\";\n  $(\"gtf-name\").textContent = \"Loading \" + name + \"...\";\n  try {\n    let text;\n    if (name.endsWith(\".gz\")) {\n      if (typeof DecompressionStream === \"undefined\") throw new Error(\"Browser lacks DecompressionStream\");\n      text = await new Response(blob.stream().pipeThrough(new DecompressionStream(\"gzip\"))).text();\n    } else text = await blob.text();\n\n    // Auto-detect format by filename (strip .gz first)\n    const base = name.replace(/\\.gz$/i, \"\").toLowerCase();\n    if (base.endsWith(\".bed\")) parseBed(text, name);\n    else parseGtf(text, name);\n\n    annotateAllRowsWithGenes();\n    render();\n  } catch (e) {\n    $(\"gtf-name\").textContent = \"Error: \" + e.message;\n    console.error(e);\n  }\n  $(\"gtf-input\").value = \"\";\n}\n\nfunction parseBed(text, name) {\n  const t0 = performance.now();\n  const buckets = new Map();\n  const geneIntern = new Map();\n  let nRegions = 0;\n\n  const lines = text.split(\"\\n\");\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i];\n    if (!line || line.charCodeAt(0) === 35 /* # */) continue;\n    // skip browser/track header lines\n    if (line.startsWith(\"browser \") || line.startsWith(\"track \")) continue;\n    const tabs = line.split(\"\\t\");\n    if (tabs.length < 4) continue;  // need at least chr, start, end, name\n\n    const chr = normC(tabs[0]);\n    const s = +tabs[1] + 1;  // BED is 0-based half-open → convert to 1-based\n    const e = +tabs[2];      // end is already the 1-based inclusive position\n    if (!isFinite(s) || !isFinite(e)) continue;\n\n    let gene = tabs[3].trim();\n    if (!gene) continue;\n    const cached = geneIntern.get(gene);\n    if (cached) gene = cached; else geneIntern.set(gene, gene);\n\n    let buf = buckets.get(chr);\n    if (!buf) { buf = []; buckets.set(chr, buf); }\n    buf.push([s, e, gene]);\n    nRegions++;\n  }\n\n  // Sort per-chrom by start, then flatten into parallel arrays + maxEnd.\n  const byChr = new Map();\n  for (const [chr, buf] of buckets) {\n    buf.sort((a, b) => a[0] - b[0]);\n    const n = buf.length;\n    const starts = new Int32Array(n);\n    const ends   = new Int32Array(n);\n    const genes  = new Array(n);\n    const maxEnd = new Int32Array(n);\n    let running = 0;\n    for (let i = 0; i < n; i++) {\n      starts[i] = buf[i][0];\n      ends[i]   = buf[i][1];\n      genes[i]  = buf[i][2];\n      if (buf[i][1] > running) running = buf[i][1];\n      maxEnd[i] = running;\n    }\n    byChr.set(chr, { starts, ends, genes, maxEnd });\n  }\n\n  GTF.byChr  = byChr;\n  GTF.nExons = nRegions;\n  GTF.loaded = nRegions > 0;\n  GTF.fn     = name;\n\n  const ms = (performance.now() - t0).toFixed(0);\n  $(\"gtf-zone\").classList.add(\"loaded\");\n  $(\"gtf-name\").textContent =\n    name + \" — \" + nRegions.toLocaleString() + \" regions across \" +\n    byChr.size + \" chromosomes (parsed in \" + ms + \"ms)\";\n}\n\nfunction parseGtf(text, name) {\n  const t0 = performance.now();\n\n  // Accumulate into per-chrom temp buckets of [start, end, gene] triples,\n  // then sort + split into parallel arrays at the end. gene-name strings\n  // are de-duplicated via a Map so each unique symbol lives once in memory.\n  const buckets = new Map();   // chrom_key -> [[s,e,gene], ...]\n  const geneIntern = new Map();\n\n  const nameRe  = /gene_name \"([^\"]+)\"/;\n  const idRe    = /gene_id \"([^\"]+)\"/;\n\n  let nLines = 0, nExons = 0;\n  // Split on \\n; tolerate \\r\\n. split() here works fine for multi-hundred-MB\n  // strings as long as the browser had enough heap to hold the uncompressed\n  // GTF in the first place (GENCODE basic ≈ 1.5 GB is the real constraint,\n  // not this split).\n  const lines = text.split(\"\\n\");\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i];\n    nLines++;\n    if (!line || line.charCodeAt(0) === 35 /* # */) continue;\n    const tabs = line.split(\"\\t\");\n    if (tabs.length < 9) continue;\n    if (tabs[2] !== \"exon\") continue;\n\n    const chr = normC(tabs[0]);\n    const s = +tabs[3];\n    const e = +tabs[4];\n    if (!isFinite(s) || !isFinite(e)) continue;\n\n    const attrs = tabs[8];\n    let m = nameRe.exec(attrs);\n    if (!m) m = idRe.exec(attrs);   // fall back to gene_id when gene_name absent\n    if (!m) continue;\n    let gene = m[1];\n    const cached = geneIntern.get(gene);\n    if (cached) gene = cached; else geneIntern.set(gene, gene);\n\n    let buf = buckets.get(chr);\n    if (!buf) { buf = []; buckets.set(chr, buf); }\n    buf.push([s, e, gene]);\n    nExons++;\n  }\n\n  // Sort per-chrom by start, then flatten into parallel arrays + maxEnd.\n  const byChr = new Map();\n  for (const [chr, buf] of buckets) {\n    buf.sort((a, b) => a[0] - b[0]);\n    const n = buf.length;\n    const starts = new Int32Array(n);\n    const ends   = new Int32Array(n);\n    const genes  = new Array(n);\n    const maxEnd = new Int32Array(n);\n    let running = 0;\n    for (let i = 0; i < n; i++) {\n      starts[i] = buf[i][0];\n      ends[i]   = buf[i][1];\n      genes[i]  = buf[i][2];\n      if (buf[i][1] > running) running = buf[i][1];\n      maxEnd[i] = running;\n    }\n    byChr.set(chr, { starts, ends, genes, maxEnd });\n  }\n\n  GTF.byChr  = byChr;\n  GTF.nExons = nExons;\n  GTF.loaded = nExons > 0;\n  GTF.fn     = name;\n\n  const ms = (performance.now() - t0).toFixed(0);\n  $(\"gtf-zone\").classList.add(\"loaded\");\n  $(\"gtf-name\").textContent =\n    name + \" — \" + nExons.toLocaleString() + \" exons across \" +\n    byChr.size + \" chromosomes (parsed in \" + ms + \"ms)\";\n}\n\n// Binary search: largest index i such that arr[i] <= target, or -1.\nfunction _upperBoundLE(arr, target) {\n  let lo = 0, hi = arr.length - 1, ret = -1;\n  while (lo <= hi) {\n    const mid = (lo + hi) >> 1;\n    if (arr[mid] <= target) { ret = mid; lo = mid + 1; }\n    else                     { hi = mid - 1; }\n  }\n  return ret;\n}\n\n// Find all genes whose EXONS overlap a given 1-based position. Returns\n// a Set of strings (possibly empty). Cheap: O(log n + k) where k is the\n// number of exons at the locus (typically 0..3).\nfunction genesAtPos(chr, pos) {\n  const out = new Set();\n  if (!GTF.loaded || chr == null || pos == null || !isFinite(+pos)) return out;\n  const idx = GTF.byChr.get(normC(chr));\n  if (!idx) return out;\n  const { starts, ends, genes, maxEnd } = idx;\n  const p = +pos;\n  const hi = _upperBoundLE(starts, p);\n  if (hi < 0) return out;\n  for (let i = hi; i >= 0; i--) {\n    if (ends[i] >= p) out.add(genes[i]);\n    if (maxEnd[i] < p) break;   // no earlier exon can still reach p\n  }\n  return out;\n}\n\n// Stamp `r.genes` onto every loaded bps row with the comma-joined union\n// of genes at pos1 and pos2. Called after GTF load and after bps load\n// (if a GTF was already loaded). Empty string when the GTF isn't loaded\n// yet so the column renders blank until there's data to show.\nfunction annotateAllRowsWithGenes() {\n  if (!S.rows || !S.rows.length) return;\n  for (const r of S.rows) {\n    const set = new Set();\n    if (GTF.loaded) {\n      for (const g of genesAtPos(r.chr1, r.pos1)) set.add(g);\n      for (const g of genesAtPos(r.chr2, r.pos2)) set.add(g);\n    }\n    r.genes = set.size ? Array.from(set).sort().join(\", \") : \"\";\n    // Keep search corpus in sync so users can grep by gene name.\n    if (r._st && r.genes) r._st = r._st.concat([r.genes]);\n  }\n}\n\nfunction ingest(text,name){\n  const t0=performance.now();\n  const lines=text.replace(/\\r\\n?/g,\"\\n\").split(\"\\n\").filter(l=>l);\n  if(lines.length<2)throw new Error(\"Need header + rows\");\n  const hdr=lines[0].split(\"\\t\");\n\n  // detect core col count. Three possible shapes:\n  //   LEGACY (41 cols)\n  //   V2     (51 cols = LEGACY + 10 refilter cols)\n  //   V3     (52 cols = V2 + bp_id)\n  // We snap `cc` down to the largest known shape that fits. Anything\n  // between two known sizes is treated as the smaller one (safer —\n  // extra unnamed columns just get ignored in the detail panel).\n  let cc=hdr.length;\n  for(let i=34;i<hdr.length;i++){if(/^[tn]\\d+_/.test(hdr[i])){cc=i;break}}\n  const LEG_N = LEGACY.length;              // 41\n  const V2_N  = LEG_N + V2.length;          // 51\n  const V3_N  = V2_N  + V3.length;          // 52\n  let coreCols;\n  if      (cc >= V3_N) { cc = V3_N; coreCols = LEGACY.concat(V2).concat(V3); }\n  else if (cc >= V2_N) { cc = V2_N; coreCols = LEGACY.concat(V2); }\n  else                 { cc = LEG_N; coreCols = LEGACY; }\n  const isV2 = cc >= V2_N;   // kept for any downstream code that still reads it\n  const sampHdr=hdr.slice(cc);\n\n  const rows=[];\n  for(let i=1;i<lines.length;i++){\n    const c=lines[i].split(\"\\t\");\n    if(c.length!==hdr.length)continue;\n    rows.push(mkRow(rows.length,c,coreCols,sampHdr,cc));\n  }\n\n  S.fn=name;S.hdr=hdr;S.sampHdr=sampHdr;S.coreCnt=cc;S.rows=rows;\n  resetF();S.selId=rows.length?rows[0].id:null;S.sort={k:\"maxlod\",d:\"desc\"};\n\n  [\"controls\",\"chip-bar\",\"stats-bar\",\"charts-row\",\"table-wrap\",\"pagination\",\"detail-panel\"].forEach(id=>{$(id).style.display=\"\"});\n  $(\"drop-zone\").classList.add(\"loaded\");\n  $(\"file-name\").style.display=\"\";$(\"file-name\").textContent=name;\n  const ms=(performance.now()-t0).toFixed(0);\n  $(\"file-meta\").textContent=name+\" \\u2014 \"+rows.length.toLocaleString()+\" rows, \"+\n    (isV2?51:41)+\" core cols, \"+sampHdr.length+\" samples \\u2014 parsed in \"+ms+\"ms\";\n  // If the user has already loaded a GTF, annotate every row we just\n  // parsed so the Genes column renders populated on first view.\n  annotateAllRowsWithGenes();\n  render();\n}\n\nfunction mkRow(id,cells,coreCols,sampHdr,cc){\n  const r={id,_c:cells};\n  coreCols.forEach((f,i)=>{r[f]=NUM.has(f)?mNum(cells[i]):cells[i]});\n  r.chr1=stripH(r.chr1);r.chr2=stripH(r.chr2);\n  r.eventType=evType(r);\n  r.spanAbs=(r.span==null||r.span===-1)?Infinity:Math.abs(r.span);\n  r.igvPos1=igvLoc(r.chr1,r.pos1);\n  r.igvPos2=igvLoc(r.chr2,r.pos2);\n  r.samp=sampHdr.map((h,j)=>parseSamp(h,cells[cc+j],r.evidence));\n  // Full per-sample FORMAT-value dump for the \"Samples\" column. One line\n  // per sample, prefixed with the sample-label's first char (e.g. \"t\" or\n  // \"n\" for a typical tumor/normal run). The payload is the raw colon-\n  // separated value verbatim from the bps.txt row, i.e.\n  //   GT:AD:DP:SR:DR:GQ:PL:LO:LO_n\n  // — so the cell holds the complete per-BAM state for each sample,\n  // not just the genotype. Newlines are preserved by the cell's CSS\n  // (white-space:pre on .w-gt) so colon-separated fields stack\n  // visually. Click the cell to open the GT + FORMAT legend popover.\n  r.gtSummary=r.samp.map(s=>{\n    const pref=(s.lbl||\"?\").charAt(0)||\"?\";\n    const body=(s.raw&&s.raw.length)?s.raw:(s.gt||\"./.\");\n    return pref+\": \"+body;\n  }).join(\"\\n\");\n  r._st=[r.chr1,r.pos1,r.chr2,r.pos2,r.eventType,r.evidence,r.conf,r.ref,r.alt_allele,\n    r.contig_and_region,r.insert,r.repeat,r.homol,r.dbsnp,r.somatic]\n    .concat(r.samp.map(s=>s.lbl+\" \"+s.raw)).join(\" \").toLowerCase();\n  return r;\n}\n\nfunction evType(r){\n  if(r.evidence===\"INDEL\"){const rl=(r.ref||\"\").length,al=(r.alt_allele||\"\").length;return al>rl?\"Ins\":al<rl?\"Del\":\"Sub\"}\n  if(r.chr1!==r.chr2)return \"TRA\";\n  if(r.strand1===r.strand2)return \"INV\";\n  if(r.strand1===\"-\"&&r.strand2===\"+\")return \"DUP\";\n  if(r.strand1===\"+\"&&r.strand2===\"-\")return \"DEL\";\n  return \"BND\";\n}\n\nfunction parseSamp(h,raw,ev){\n  const lbl=h.split(\"_\")[0],p=(raw||\"\").split(\":\");\n  return{lbl,hdr:h,raw,gt:p[0]||\"\",ad:mNum(p[1]),dp:mNum(p[2]),sr:mNum(p[3]),\n    dr:mNum(p[4]),drLbl:ev===\"INDEL\"?\"cigar\":\"disc\",gq:mNum(p[5]),pl:p[6]||\"\",lo:mNum(p[7]),lo_n:mNum(p[8])};\n}\n\n/* === Filters === */\nfunction resetF(){\n  S.f={search:\"\",region:null,somlodMin:null,somlodMax:null,maxlodMin:null,maxlodMax:null,\n    qualMin:null,splitMin:null,altMin:null,spanMin:null,spanMax:null,stdChrOnly:false,\n    eventTypes:new Set(),evidence:new Set(),confidence:new Set(),somatic:new Set()};\n  S.pg=1;S.pgSz=100;\n  [\"f-search\",\"f-region\",\"f-somlod-min\",\"f-somlod-max\",\"f-maxlod-min\",\"f-maxlod-max\",\n   \"f-qual-min\",\"f-split-min\",\"f-alt-min\",\"f-span-min\",\"f-span-max\"].forEach(id=>{$(id).value=\"\"});\n  $(\"f-page-size\").value=\"100\";\n  const sc=$(\"f-std-chr\");if(sc)sc.classList.remove(\"on\");\n}\n\nfunction syncF(){\n  S.f.search=$(\"f-search\").value.trim().toLowerCase();\n  S.f.region=parseReg($(\"f-region\").value.trim());\n  S.f.somlodMin=nNum($(\"f-somlod-min\").value);S.f.somlodMax=nNum($(\"f-somlod-max\").value);\n  S.f.maxlodMin=nNum($(\"f-maxlod-min\").value);S.f.maxlodMax=nNum($(\"f-maxlod-max\").value);\n  S.f.qualMin=nNum($(\"f-qual-min\").value);S.f.splitMin=nNum($(\"f-split-min\").value);\n  S.f.altMin=nNum($(\"f-alt-min\").value);\n  S.f.spanMin=nNum($(\"f-span-min\").value);S.f.spanMax=nNum($(\"f-span-max\").value);\n  S.pgSz=Number($(\"f-page-size\").value)||100;S.pg=1;\n}\n\nfunction parseReg(s){\n  if(!s)return null;\n  const m=s.replace(/,/g,\"\").replace(/[Mm]/g,e=>e==='M'||e==='m'?'000000':'').match(/^(chr)?(\\w+?)(?::(\\d+)(?:-(\\d+))?)?$/i);\n  if(!m)return null;\n  return{chr:m[2],start:m[3]?+m[3]:null,end:m[4]?+m[4]:null};\n}\n\nfunction regMatch(r,reg){\n  if(!reg)return true;\n  const rc=normC(reg.chr);\n  const test=(c,p)=>{if(normC(c)!==rc)return false;if(reg.start!=null&&p<reg.start)return false;if(reg.end!=null&&p>reg.end)return false;return true};\n  return test(r.chr1,r.pos1)||test(r.chr2,r.pos2);\n}\n\nfunction doFilter(){\n  const f=S.f;\n  S.filt=S.rows.filter(r=>{\n    if(f.search&&!r._st.includes(f.search))return false;\n    if(f.region&&!regMatch(r,f.region))return false;\n    if(f.stdChrOnly&&(!isStdChr(r.chr1)||!isStdChr(r.chr2)))return false;\n    if(!nRng(r.somlod,f.somlodMin,f.somlodMax))return false;\n    if(!nRng(r.maxlod,f.maxlodMin,f.maxlodMax))return false;\n    if(!nMin(r.qual,f.qualMin))return false;\n    if(!nMin(r.split,f.splitMin))return false;\n    if(!nMin(r.alt_count,f.altMin))return false;\n    // span filter: only applies to finite spans; interchrom always passes unless spanMax set\n    if(f.spanMin!=null||f.spanMax!=null){\n      if(r.spanAbs===Infinity){if(f.spanMax!=null)return false}\n      else{if(f.spanMin!=null&&r.spanAbs<f.spanMin)return false;if(f.spanMax!=null&&r.spanAbs>f.spanMax)return false}\n    }\n    if(f.eventTypes.size&&!f.eventTypes.has(r.eventType))return false;\n    if(f.evidence.size&&!f.evidence.has(r.evidence))return false;\n    if(f.confidence.size&&!f.confidence.has(r.conf))return false;\n    if(f.somatic.size&&!f.somatic.has(r.somatic))return false;\n    return true;\n  });\n}\n\n/* === Sort === */\nfunction toggleSort(k){if(S.sort.k===k)S.sort.d=S.sort.d===\"asc\"?\"desc\":\"asc\";else{S.sort.k=k;S.sort.d=NUM.has(k)?\"desc\":\"asc\"}}\nfunction doSort(){\n  const d=S.sort.d===\"asc\"?1:-1,k=S.sort.k;\n  S.filt.sort((a,b)=>{\n    let av=a[k],bv=b[k];\n    if(typeof av===\"number\"||typeof bv===\"number\"){av=sn(av);bv=sn(bv);if(av!==bv)return(av-bv)*d}\n    else{const c=String(av||\"\").localeCompare(String(bv||\"\"));if(c)return c*d}\n    return a.id-b.id;\n  });\n}\n\n/* === Render === */\nfunction render(){\n  doFilter();doSort();\n  if(!S.filt.some(r=>r.id===S.selId))S.selId=S.filt.length?S.filt[0].id:null;\n  rStats();rChips();rTable();rDetail();rCharts();\n  // sort arrows\n  document.querySelectorAll(\"#thead th\").forEach(th=>{\n    const a=th.querySelector(\".sa\");\n    a.textContent=th.dataset.k===S.sort.k?(S.sort.d===\"asc\"?\"\\u25B2\":\"\\u25BC\"):\"\";\n  });\n}\n\nfunction tPages(){return Math.max(1,Math.ceil(S.filt.length/S.pgSz))}\n\nfunction rStats(){\n  $(\"s-total\").textContent=S.rows.length.toLocaleString();\n  $(\"s-shown\").textContent=S.filt.length.toLocaleString();\n  $(\"s-pass\").textContent=S.filt.filter(r=>r.conf===\"PASS\").length.toLocaleString();\n  $(\"s-somatic\").textContent=S.filt.filter(r=>r.somatic===\"SOMATIC\").length.toLocaleString();\n  $(\"s-germline\").textContent=S.filt.filter(r=>r.somatic===\"GERMLINE\").length.toLocaleString();\n  $(\"s-indel\").textContent=S.filt.filter(r=>r.evidence===\"INDEL\").length.toLocaleString();\n  $(\"s-sv\").textContent=S.filt.filter(r=>r.evidence!==\"INDEL\").length.toLocaleString();\n  $(\"export-btn\").disabled=!S.filt.length;\n}\n\n/* === Chips === */\n// Chip rendering: the full set of possible values comes from S.rows so the\n// user can toggle ON a filter for a value that's currently invisible; the\n// COUNT shown on each chip reflects S.filt (the post-filter view) so the\n// numbers stay live as other filters change. A value that currently has\n// 0 matches is still shown, just dimmed, so it remains clickable.\nfunction rChips(){\n  const bar=$(\"chip-bar\");bar.innerHTML=\"\";\n  [{k:\"eventTypes\",f:\"eventType\",l:\"Type\"},{k:\"evidence\",f:\"evidence\",l:\"Evidence\"},\n   {k:\"confidence\",f:\"conf\",l:\"Conf\"},{k:\"somatic\",f:\"somatic\",l:\"Somatic\"}].forEach(g=>{\n    const universe=cntBy(S.rows,g.f);if(!universe.size)return;\n    const filteredCnts=cntBy(S.filt,g.f);\n    const wrap=document.createElement(\"div\");wrap.className=\"ctrl\";\n    wrap.innerHTML='<label>'+esc(g.l)+'</label>';\n    const chips=document.createElement(\"div\");chips.className=\"chips\";\n    // Sort by filtered count desc, then by universe count desc as tiebreaker\n    // so empty-but-possible chips sink to the end but stay in a stable order.\n    Array.from(universe.entries()).sort((a,b)=>{\n      const fa=filteredCnts.get(a[0])||0, fb=filteredCnts.get(b[0])||0;\n      return fb-fa || b[1]-a[1];\n    }).forEach(([v,total])=>{\n      const n=filteredCnts.get(v)||0;\n      const c=document.createElement(\"button\");\n      c.className=\"chip\"+(S.f[g.k].has(v)?\" on\":\"\")+(n===0?\" empty\":\"\");\n      c.textContent=v+\" (\"+n.toLocaleString()+\")\";\n      c.title=n.toLocaleString()+\" of \"+total.toLocaleString()+\" rows match this filter\";\n      c.onclick=()=>{togSet(S.f[g.k],v);S.pg=1;render()};\n      chips.appendChild(c);\n    });\n    wrap.appendChild(chips);bar.appendChild(wrap);\n  });\n}\n\n/* === Table === */\nfunction rTable(){\n  const tp=tPages();if(S.pg>tp)S.pg=tp;\n  const s=(S.pg-1)*S.pgSz,e=s+S.pgSz,page=S.filt.slice(s,e);\n  if(!page.length){$(\"tbody\").innerHTML='<tr><td colspan=\"'+TCOLS.length+'\" style=\"padding:1rem;text-align:center;color:var(--text2)\">No rows match</td></tr>'}\n  else{\n    const h=[];\n    for(const r of page){\n      h.push('<tr data-id=\"'+r.id+'\"'+(r.id===S.selId?' class=\"sel\"':'')+'>');\n      for(const c of TCOLS){\n        let v=r[c.k],cls=c.n?\"num\":\"\";\n        if(c.w) cls+=(cls?\" \":\"\")+\"w-\"+c.w;\n        if(c.k===\"conf\")cls+=\" \"+(v===\"PASS\"?\"pass\":v===\"LOWLOD\"||v===\"LOWMAPQ\"?\"lowlod\":\"nopass\");\n        if(c.k===\"strand1\"||c.k===\"strand2\"){\n          cls+=\" \"+(v===\"+\"?\"strand-plus\":v===\"-\"?\"strand-minus\":\"\");\n          h.push('<td class=\"'+cls+'\">'+esc(v||\"-\")+'</td>');\n          continue;\n        }\n        if(c.k===\"gtSummary\"){\n          const title=\"Click for genotype and FORMAT field explanations\";\n          h.push('<td class=\"'+cls+' gt-cell\" title=\"'+esc(title)+'\">'+esc(v||\"\")+'</td>');\n          continue;\n        }\n        if(c.k===\"igvPos1\"||c.k===\"igvPos2\"){\n          if(v)h.push('<td class=\"'+cls+'\"><a class=\"igv-link\" href=\"#\" data-locus=\"'+esc(v)+'\" title=\"Click to navigate IGV (requires IGV running on port 60151)\">'+esc(v)+'</a></td>');\n          else h.push('<td class=\"'+cls+'\">-</td>');\n          continue;\n        }\n        if(c.k===\"span\")v=r.span===-1?\"inter\":fN(v);\n        else if(typeof v===\"number\")v=fN(v);\n        h.push('<td class=\"'+cls+'\" title=\"'+esc(v||\"\")+'\">'+esc(v)+'</td>');\n      }\n      h.push('</tr>');\n    }\n    $(\"tbody\").innerHTML=h.join(\"\");\n    $(\"tbody\").querySelectorAll(\"tr[data-id]\").forEach(tr=>{\n      tr.addEventListener(\"mousedown\",e=>{tr._mdx=e.clientX;tr._mdy=e.clientY});\n      tr.onclick=e=>{\n        // don't steal the click if this was a drag-select gesture or user has a non-empty selection\n        const dx=e.clientX-(tr._mdx||e.clientX),dy=e.clientY-(tr._mdy||e.clientY);\n        if(Math.hypot(dx,dy)>4)return;\n        const sel=window.getSelection&&window.getSelection();\n        if(sel&&sel.toString().length>0)return;\n        // allow clicking the IGV link without selecting the row\n        if(e.target&&e.target.closest&&e.target.closest(\"a.igv-link\"))return;\n        // GT cell: open legend popover, don't select the row\n        const gt=e.target&&e.target.closest&&e.target.closest(\"td.gt-cell\");\n        if(gt){e.stopPropagation();showGtLegend(gt);return}\n        S.selId=+tr.dataset.id;rTable();rDetail();\n      };\n    });\n    $(\"tbody\").querySelectorAll(\"a.igv-link\").forEach(a=>{\n      a.addEventListener(\"click\",e=>{\n        e.preventDefault();e.stopPropagation();\n        igvGoto(a.dataset.locus,a);\n      });\n    });\n  }\n  $(\"pg-info\").textContent=\"Page \"+S.pg+\"/\"+tp+\" (\"+S.filt.length.toLocaleString()+\" rows)\";\n  $(\"pg-prev\").disabled=S.pg<=1;$(\"pg-first\").disabled=S.pg<=1;\n  $(\"pg-next\").disabled=S.pg>=tp;$(\"pg-last\").disabled=S.pg>=tp;\n}\n\n/* === Detail === */\nfunction rDetail(){\n  const r=S.filt.find(x=>x.id===S.selId)||S.rows.find(x=>x.id===S.selId);\n  if(!r){$(\"dp-body\").innerHTML='<div class=\"dp-empty\">Click a row</div>';$(\"dp-locus\").textContent=\"-\";return}\n  $(\"dp-locus\").textContent=r.chr1+\":\"+r.pos1+\" \"+r.strand1+\" \\u2192 \"+r.chr2+\":\"+r.pos2+\" \"+r.strand2+\" | \"+r.eventType+\" | \"+r.evidence+\" | \"+r.conf;\n\n  // Same three-shape snap-down the parser uses; keeps the detail panel\n  // in sync with what the parser actually stored.\n  const _LEG=LEGACY.length, _V2=_LEG+V2.length, _V3=_V2+V3.length;\n  const allCols = S.coreCnt >= _V3 ? LEGACY.concat(V2).concat(V3)\n                : S.coreCnt >= _V2 ? LEGACY.concat(V2)\n                :                    LEGACY;\n  let h='<table class=\"kv\">';\n  allCols.forEach((col,i)=>{\n    h+='<tr><td class=\"k\">'+esc(col)+'</td><td class=\"v\">'+esc(r._c[i])+'</td></tr>';\n  });\n  // sample cols\n  r.samp.forEach(s=>{\n    h+='<tr class=\"samp\"><td class=\"k\">'+esc(s.lbl)+' <span style=\"font-weight:400;font-size:.6rem\">'+esc(s.hdr)+'</span></td>';\n    h+='<td class=\"v\">GT='+esc(s.gt)+' AD='+fN(s.ad)+' DP='+fN(s.dp)+' SR='+fN(s.sr)+' '+s.drLbl+'='+fN(s.dr)+' GQ='+fN(s.gq)+' LO='+fN(s.lo)+' LO_n='+fN(s.lo_n)+'</td></tr>';\n  });\n  h+='</table>';\n  $(\"dp-body\").innerHTML=h;\n}\n\n/* === Charts === */\nfunction rCharts(){\n  const som=S.filt.map(r=>r.somlod).filter(v=>v!=null&&isFinite(v));\n  const mx=S.filt.map(r=>r.maxlod).filter(v=>v!=null&&isFinite(v));\n  hist(\"c-somlod\",S.logScale.somlod?som.map(symlog):som,\"#6c8cff\",S.logScale.somlod);\n  hist(\"c-maxlod\",S.logScale.maxlod?mx.map(symlog):mx,\"#4ade80\",S.logScale.maxlod);\n  hist(\"c-span\",S.filt.map(r=>r.spanAbs).filter(v=>v!=null&&isFinite(v)&&v>0).map(v=>Math.log10(v)),\"#a855f7\");\n  // Note: Type/Confidence/Chr charts were removed — their info is covered\n  // by the live chip filter bar (which now also shows filter-aware counts)\n  // and by the stats bar. bars() / chrCnt() are kept in the source for\n  // potential future reuse.\n}\n\nfunction hist(id,vals,color,isLog){\n  const cv=$(id),ctx=cv.getContext(\"2d\"),dpr=devicePixelRatio||1;\n  const w=cv.clientWidth,h=cv.clientHeight;cv.width=w*dpr;cv.height=h*dpr;\n  ctx.setTransform(dpr,0,0,dpr,0,0);ctx.clearRect(0,0,w,h);\n  if(!vals.length){ctx.fillStyle=\"#555\";ctx.font=\"10px monospace\";ctx.fillText(\"no data\",w/2-18,h/2);return}\n  const nb=Math.min(40,Math.max(8,Math.ceil(Math.sqrt(vals.length))));\n  const mn=Math.min(...vals),mx=Math.max(...vals),rng=mx-mn||1,bw=rng/nb;\n  const bins=new Array(nb).fill(0);\n  for(const v of vals){let i=Math.floor((v-mn)/bw);if(i>=nb)i=nb-1;bins[i]++}\n  const mxB=Math.max(...bins);\n  const p={l:32,r:4,t:4,b:18},pw=w-p.l-p.r,ph=h-p.t-p.b;\n  ctx.fillStyle=color;ctx.globalAlpha=.7;\n  const bW=pw/nb;\n  for(let i=0;i<nb;i++){const bh=mxB>0?(bins[i]/mxB)*ph:0;ctx.fillRect(p.l+i*bW,p.t+ph-bh,Math.max(bW-.5,1),bh)}\n  ctx.globalAlpha=1;ctx.strokeStyle=\"#444\";ctx.lineWidth=.5;\n  ctx.beginPath();ctx.moveTo(p.l,p.t);ctx.lineTo(p.l,p.t+ph);ctx.lineTo(p.l+pw,p.t+ph);ctx.stroke();\n  ctx.fillStyle=\"#777\";ctx.font=\"9px monospace\";ctx.textAlign=\"center\";\n  for(let i=0;i<=3;i++){\n    const tv=mn+rng*i/3;\n    ctx.fillText(isLog?fmtSymlog(tv):tv.toFixed(1),p.l+pw*i/3,h-2);\n  }\n  if(isLog){ctx.textAlign=\"left\";ctx.fillStyle=\"#6c8cff\";ctx.fillText(\"symlog10\",p.l+2,p.t+9)}\n  ctx.fillStyle=\"#777\";ctx.textAlign=\"right\";\n  for(let i=0;i<=2;i++)ctx.fillText(Math.round(mxB*i/2).toLocaleString(),p.l-2,p.t+ph-ph*i/2+3);\n}\n\nfunction bars(id,counts,color){\n  const cv=$(id),ctx=cv.getContext(\"2d\"),dpr=devicePixelRatio||1;\n  const w=cv.clientWidth,h=cv.clientHeight;cv.width=w*dpr;cv.height=h*dpr;\n  ctx.setTransform(dpr,0,0,dpr,0,0);ctx.clearRect(0,0,w,h);\n  const ent=Array.from(counts.entries()).sort((a,b)=>b[1]-a[1]);\n  if(!ent.length){ctx.fillStyle=\"#555\";ctx.font=\"10px monospace\";ctx.fillText(\"no data\",w/2-18,h/2);return}\n  const mx=ent[0][1],p={l:4,r:4,t:2,b:2},pw=w-p.l-p.r,ph=h-p.t-p.b;\n  const bH=Math.min(16,(ph-ent.length*2)/ent.length);\n  const tot=ent.length*(bH+2);const sy=p.t+Math.max(0,(ph-tot)/2);\n  ent.forEach(([lbl,n],i)=>{\n    const y=sy+i*(bH+2),bw=mx>0?(n/mx)*(pw-80):0;\n    ctx.fillStyle=color;ctx.globalAlpha=.65;ctx.fillRect(p.l+65,y,bw,bH);ctx.globalAlpha=1;\n    ctx.fillStyle=\"#aaa\";ctx.font=\"9px monospace\";ctx.textAlign=\"right\";\n    ctx.fillText(lbl.length>9?lbl.slice(0,8)+\"\\u2026\":lbl,p.l+62,y+bH-3);\n    ctx.textAlign=\"left\";ctx.fillStyle=\"#777\";ctx.fillText(n.toLocaleString(),p.l+65+bw+3,y+bH-3);\n  });\n}\n\nfunction chrCnt(rows){\n  const m=new Map(),ord=[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"X\",\"Y\"];\n  rows.forEach(r=>{const c=normC(r.chr1);m.set(c,(m.get(c)||0)+1)});\n  const s=new Map();ord.forEach(c=>{if(m.has(c))s.set(c,m.get(c))});\n  m.forEach((v,k)=>{if(!ord.includes(k))s.set(k,v)});return s;\n}\n\n/* === Export === */\nfunction exportTSV(){\n  if(!S.filt.length)return;\n  const lines=[S.hdr.join(\"\\t\")].concat(S.filt.map(r=>r._c.join(\"\\t\")));\n  const blob=new Blob([lines.join(\"\\n\")],{type:\"text/tab-separated-values\"});\n  const u=URL.createObjectURL(blob),a=document.createElement(\"a\");\n  a.href=u;a.download=S.fn.replace(/\\.gz$/i,\"\").replace(/\\.txt$/i,\"\")+\".filtered.tsv\";\n  a.click();URL.revokeObjectURL(u);\n}\n\n/* === Util === */\nfunction mNum(s){if(!s||s===\"NA\"||s===\"x\"||s===\"NOTSET\")return null;const v=+s;return isFinite(v)?v:null}\nfunction nNum(s){if(s===\"\"||s==null)return null;const v=+s;return isFinite(v)?v:null}\nfunction symlog(v){return Math.sign(v)*Math.log10(1+Math.abs(v))}\nfunction fmtSymlog(t){const v=Math.sign(t)*(Math.pow(10,Math.abs(t))-1);if(Math.abs(v)>=100)return v.toFixed(0);if(Math.abs(v)>=10)return v.toFixed(1);return v.toFixed(2)}\nfunction isStdChr(c){return /^([1-9]|1[0-9]|2[0-2]|x|y|m|mt)$/i.test(normC(c))}\nfunction igvLoc(chr,pos){\n  if(chr==null||chr===\"\"||pos==null||pos===\"\"||!isFinite(+pos))return \"\";\n  let c=String(chr).replace(/^#/,\"\");\n  if(!/^chr/i.test(c))c=\"chr\"+c;\n  return c+\":\"+pos;\n}\nfunction igvGoto(locus,anchor){\n  if(!locus)return;\n  const url=\"http://localhost:60151/goto?locus=\"+encodeURIComponent(locus);\n  // IGV's port is CORS-less; use no-cors so the request fires even though we can't read the response.\n  fetch(url,{mode:\"no-cors\",cache:\"no-store\"})\n    .then(()=>{if(anchor){anchor.classList.remove(\"err\");anchor.classList.add(\"ok\");setTimeout(()=>anchor.classList.remove(\"ok\"),600)}})\n    .catch(()=>{if(anchor){anchor.classList.add(\"err\");setTimeout(()=>anchor.classList.remove(\"err\"),1500)}});\n}\nfunction nRng(v,mn,mx){if(mn==null&&mx==null)return true;if(v==null||!isFinite(v))return false;if(mn!=null&&v<mn)return false;if(mx!=null&&v>mx)return false;return true}\nfunction nMin(v,mn){if(mn==null)return true;if(v==null||!isFinite(v))return false;return v>=mn}\nfunction sn(v){if(v===Infinity)return 9e15;if(v==null||Number.isNaN(v))return-9e15;return+v}\nfunction fN(v){if(v==null||v===Infinity)return\"-\";if(!isFinite(v))return String(v);return Math.abs(v)>=100||Number.isInteger(v)?v.toLocaleString():v.toFixed(3).replace(/\\.?0+$/,\"\")}\nfunction stripH(s){return typeof s===\"string\"?s.replace(/^#/,\"\"):s}\nfunction normC(s){return typeof s===\"string\"?s.replace(/^chr/i,\"\").toLowerCase():\"\"}\nfunction cntBy(rows,k){const m=new Map();rows.forEach(r=>{const v=r[k];m.set(v,(m.get(v)||0)+1)});return m}\nfunction togSet(set,v){set.has(v)?set.delete(v):set.add(v)}\nfunction esc(v){return String(v==null?\"\":v).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\")}\n\n})();\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/bps_viewer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>SvABA BPS Viewer</title>\n    <link rel=\"stylesheet\" href=\"./styles.css\">\n  </head>\n  <body>\n    <div class=\"background-glow background-glow-a\"></div>\n    <div class=\"background-glow background-glow-b\"></div>\n\n    <main class=\"page\">\n      <header class=\"hero panel reveal\">\n        <div class=\"hero-copy\">\n          <p class=\"eyebrow\">SvABA raw call explorer</p>\n          <h1>Inspect <code>bps.txt</code> and <code>bps.txt.gz</code> calls in the browser.</h1>\n          <p class=\"hero-text\">\n            Load a breakpoint table, filter it by LOD, confidence, event type, and evidence,\n            then drill into per-sample support without leaving the file.\n          </p>\n\n          <div class=\"hero-actions\">\n            <label class=\"button button-primary file-picker\">\n              <input id=\"file-input\" type=\"file\" accept=\".txt,.gz,.bps,.bps.txt,.bps.txt.gz,text/plain,application/gzip\">\n              Open BPS file\n            </label>\n            <button id=\"load-example\" class=\"button button-secondary\" type=\"button\">Load bundled example</button>\n            <button id=\"export-button\" class=\"button button-ghost\" type=\"button\" disabled>Export filtered TSV</button>\n          </div>\n\n          <p id=\"status-text\" class=\"status\">\n            No file loaded yet. Use the file picker or the bundled example in <code>viewer/svaba/am.bps.txt.gz</code>.\n          </p>\n        </div>\n\n        <div class=\"hero-stats\" id=\"hero-stats\">\n          <article class=\"stat-card\">\n            <span class=\"stat-label\">Rows</span>\n            <strong class=\"stat-value\" id=\"stat-total\">0</strong>\n          </article>\n          <article class=\"stat-card\">\n            <span class=\"stat-label\">Shown</span>\n            <strong class=\"stat-value\" id=\"stat-shown\">0</strong>\n          </article>\n          <article class=\"stat-card\">\n            <span class=\"stat-label\">PASS</span>\n            <strong class=\"stat-value\" id=\"stat-pass\">0</strong>\n          </article>\n          <article class=\"stat-card\">\n            <span class=\"stat-label\">Evidence</span>\n            <strong class=\"stat-value\" id=\"stat-top-evidence\">-</strong>\n          </article>\n        </div>\n      </header>\n\n      <section class=\"panel filters reveal\">\n        <div class=\"panel-heading\">\n          <div>\n            <p class=\"eyebrow\">Filters</p>\n            <h2>Slice by score, event class, and support</h2>\n          </div>\n          <button id=\"reset-filters\" class=\"button button-ghost button-small\" type=\"button\">Reset filters</button>\n        </div>\n\n        <div class=\"filter-grid\">\n          <label class=\"field\">\n            <span class=\"field-label\">Free text</span>\n            <input id=\"search-input\" type=\"search\" placeholder=\"chr1, contig, dbsnp id, ref/alt, confidence...\">\n          </label>\n\n          <label class=\"field\">\n            <span class=\"field-label\">Min somlod</span>\n            <input id=\"somlod-min\" type=\"number\" step=\"0.1\" placeholder=\"any\">\n          </label>\n\n          <label class=\"field\">\n            <span class=\"field-label\">Max somlod</span>\n            <input id=\"somlod-max\" type=\"number\" step=\"0.1\" placeholder=\"any\">\n          </label>\n\n          <label class=\"field\">\n            <span class=\"field-label\">Min maxlod</span>\n            <input id=\"maxlod-min\" type=\"number\" step=\"0.1\" placeholder=\"any\">\n          </label>\n\n          <label class=\"field\">\n            <span class=\"field-label\">Max maxlod</span>\n            <input id=\"maxlod-max\" type=\"number\" step=\"0.1\" placeholder=\"any\">\n          </label>\n\n          <label class=\"field\">\n            <span class=\"field-label\">Min qual</span>\n            <input id=\"qual-min\" type=\"number\" step=\"1\" placeholder=\"any\">\n          </label>\n\n          <label class=\"field\">\n            <span class=\"field-label\">Min split support</span>\n            <input id=\"split-min\" type=\"number\" step=\"1\" min=\"0\" placeholder=\"any\">\n          </label>\n\n          <label class=\"field\">\n            <span class=\"field-label\">Min ALT support</span>\n            <input id=\"alt-min\" type=\"number\" step=\"1\" min=\"0\" placeholder=\"any\">\n          </label>\n\n          <label class=\"field\">\n            <span class=\"field-label\">Min discordant support</span>\n            <input id=\"discordant-min\" type=\"number\" step=\"1\" min=\"0\" placeholder=\"any\">\n          </label>\n\n          <label class=\"field select-field\">\n            <span class=\"field-label\">DBSNP</span>\n            <select id=\"dbsnp-filter\">\n              <option value=\"all\">All calls</option>\n              <option value=\"present\">DBSNP only</option>\n              <option value=\"absent\">No DBSNP hit</option>\n            </select>\n          </label>\n\n          <label class=\"field select-field\">\n            <span class=\"field-label\">Rows per page</span>\n            <select id=\"page-size\">\n              <option value=\"50\">50</option>\n              <option value=\"100\" selected>100</option>\n              <option value=\"250\">250</option>\n              <option value=\"500\">500</option>\n            </select>\n          </label>\n        </div>\n\n        <div class=\"preset-row\">\n          <div class=\"preset-group\">\n            <span class=\"preset-label\">somlod presets</span>\n            <button class=\"chip preset-button\" type=\"button\" data-target=\"somlod-min\" data-value=\"0\">>= 0</button>\n            <button class=\"chip preset-button\" type=\"button\" data-target=\"somlod-min\" data-value=\"3\">>= 3</button>\n            <button class=\"chip preset-button\" type=\"button\" data-target=\"somlod-min\" data-value=\"6\">>= 6</button>\n            <button class=\"chip preset-button\" type=\"button\" data-target=\"somlod-min\" data-value=\"10\">>= 10</button>\n          </div>\n          <div class=\"preset-group\">\n            <span class=\"preset-label\">maxlod presets</span>\n            <button class=\"chip preset-button\" type=\"button\" data-target=\"maxlod-min\" data-value=\"0\">>= 0</button>\n            <button class=\"chip preset-button\" type=\"button\" data-target=\"maxlod-min\" data-value=\"3\">>= 3</button>\n            <button class=\"chip preset-button\" type=\"button\" data-target=\"maxlod-min\" data-value=\"6\">>= 6</button>\n            <button class=\"chip preset-button\" type=\"button\" data-target=\"maxlod-min\" data-value=\"10\">>= 10</button>\n          </div>\n        </div>\n\n        <div class=\"chip-section\">\n          <div class=\"chip-block\">\n            <div class=\"chip-heading\">\n              <span class=\"eyebrow\">Variant type</span>\n              <strong>Derived event class</strong>\n            </div>\n            <div id=\"event-type-chips\" class=\"chip-list\"></div>\n          </div>\n\n          <div class=\"chip-block\">\n            <div class=\"chip-heading\">\n              <span class=\"eyebrow\">Evidence</span>\n              <strong>Raw <code>type</code> field</strong>\n            </div>\n            <div id=\"evidence-chips\" class=\"chip-list\"></div>\n          </div>\n\n          <div class=\"chip-block\">\n            <div class=\"chip-heading\">\n              <span class=\"eyebrow\">Confidence</span>\n              <strong>Raw <code>conf</code> field</strong>\n            </div>\n            <div id=\"confidence-chips\" class=\"chip-list\"></div>\n          </div>\n\n          <div class=\"chip-block\">\n            <div class=\"chip-heading\">\n              <span class=\"eyebrow\">Somatic state</span>\n              <strong>Raw <code>somatic</code> field</strong>\n            </div>\n            <div id=\"somatic-chips\" class=\"chip-list\"></div>\n          </div>\n        </div>\n      </section>\n\n      <section class=\"workspace reveal\">\n        <div class=\"panel table-panel\">\n          <div class=\"panel-heading\">\n            <div>\n              <p class=\"eyebrow\">Calls</p>\n              <h2 id=\"results-title\">No variants loaded</h2>\n            </div>\n            <div class=\"table-meta\">\n              <span id=\"results-summary\">Load a file to start browsing calls.</span>\n            </div>\n          </div>\n\n          <div class=\"table-shell\">\n            <table>\n              <thead>\n                <tr>\n                  <th><button class=\"sort-button\" data-sort=\"locus\" type=\"button\">Locus</button></th>\n                  <th><button class=\"sort-button\" data-sort=\"eventType\" type=\"button\">Type</button></th>\n                  <th><button class=\"sort-button\" data-sort=\"evidence\" type=\"button\">Evidence</button></th>\n                  <th><button class=\"sort-button\" data-sort=\"conf\" type=\"button\">Confidence</button></th>\n                  <th><button class=\"sort-button\" data-sort=\"qual\" type=\"button\">Qual</button></th>\n                  <th><button class=\"sort-button\" data-sort=\"somlod\" type=\"button\">Somlod</button></th>\n                  <th><button class=\"sort-button\" data-sort=\"maxlod\" type=\"button\">Maxlod</button></th>\n                  <th><button class=\"sort-button\" data-sort=\"supportPeak\" type=\"button\">Peak support</button></th>\n                  <th><button class=\"sort-button\" data-sort=\"spanAbs\" type=\"button\">Span</button></th>\n                  <th><button class=\"sort-button\" data-sort=\"contig_and_region\" type=\"button\">Contig</button></th>\n                </tr>\n              </thead>\n              <tbody id=\"table-body\">\n                <tr>\n                  <td colspan=\"10\" class=\"empty-table\">\n                    No data yet. Load a <code>bps.txt</code> or <code>bps.txt.gz</code> file.\n                  </td>\n                </tr>\n              </tbody>\n            </table>\n          </div>\n\n          <div class=\"pagination\">\n            <button id=\"prev-page\" class=\"button button-ghost button-small\" type=\"button\" disabled>Previous</button>\n            <span id=\"page-summary\">Page 0 of 0</span>\n            <button id=\"next-page\" class=\"button button-ghost button-small\" type=\"button\" disabled>Next</button>\n          </div>\n        </div>\n\n        <aside class=\"panel detail-panel\">\n          <div class=\"panel-heading\">\n            <div>\n              <p class=\"eyebrow\">Selected call</p>\n              <h2>Variant detail</h2>\n            </div>\n          </div>\n          <div id=\"detail-content\" class=\"detail-content detail-empty\">\n            Select a row to inspect the raw breakpoint call, support metrics, and sample-level values.\n          </div>\n        </aside>\n      </section>\n    </main>\n\n    <script src=\"./app.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/comparison.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>SvABA BPS Comparison</title>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/pako/2.1.0/pako.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js\"></script>\n<style>\n  :root {\n    --bg: #0f1117; --surface: #1a1d27; --surface2: #252833;\n    --border: #2e3140; --text: #e1e4ed; --text2: #8b8fa3;\n    --accent: #6c8cff; --green: #4ade80; --red: #f87171; --amber: #fbbf24;\n    --blue: #60a5fa; --purple: #a855f7;\n  }\n  * { box-sizing: border-box; margin: 0; padding: 0; }\n  body { font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace; background: var(--bg); color: var(--text); min-height: 100vh; }\n  h1 { font-size: 1.3rem; font-weight: 600; padding: 1.2rem 1.5rem; border-bottom: 1px solid var(--border); }\n  h1 span { color: var(--accent); }\n  .container { max-width: 1500px; margin: 0 auto; padding: 1.5rem; }\n\n  /* Upload */\n  .upload-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; margin-bottom: 1.5rem; }\n  .upload-box {\n    background: var(--surface); border: 2px dashed var(--border); border-radius: 8px;\n    padding: 1.2rem; text-align: center; cursor: pointer; transition: border-color 0.2s;\n  }\n  .upload-box:hover, .upload-box.dragover { border-color: var(--accent); }\n  .upload-box.loaded { border-color: var(--green); border-style: solid; }\n  .upload-box label { display: block; font-size: 0.8rem; color: var(--text2); margin-bottom: 0.5rem; text-transform: uppercase; letter-spacing: 0.05em; }\n  .upload-box .filename { font-size: 0.85rem; color: var(--green); margin-top: 0.4rem; word-break: break-all; }\n  .upload-box .count { font-size: 0.75rem; color: var(--text2); margin-top: 0.2rem; }\n  .upload-box input[type=\"file\"] { display: none; }\n  .upload-box .icon { font-size: 1.5rem; margin-bottom: 0.3rem; }\n  .hidden { display: none !important; }\n\n  /* Controls */\n  .controls {\n    background: var(--surface); border: 1px solid var(--border); border-radius: 8px;\n    padding: 1rem 1.2rem; margin-bottom: 1.5rem;\n    display: flex; flex-wrap: wrap; gap: 1.5rem; align-items: center;\n  }\n  .control-group label { font-size: 0.75rem; color: var(--text2); text-transform: uppercase; letter-spacing: 0.05em; display: block; margin-bottom: 0.4rem; }\n  .checkboxes { display: flex; gap: 0.6rem; flex-wrap: wrap; }\n  .cb { display: flex; align-items: center; gap: 0.3rem; font-size: 0.82rem; cursor: pointer; }\n  .cb input { accent-color: var(--accent); }\n  .slider-row { display: flex; align-items: center; gap: 0.5rem; }\n  .slider-row input[type=\"range\"] { width: 130px; accent-color: var(--accent); }\n  .slider-val { font-size: 0.82rem; color: var(--accent); min-width: 3.5rem; }\n  button.run {\n    background: var(--accent); color: #fff; border: none; border-radius: 6px;\n    padding: 0.5rem 1.2rem; font-size: 0.85rem; font-weight: 600; cursor: pointer;\n    font-family: inherit; margin-left: auto;\n  }\n  button.run:hover { opacity: 0.9; }\n  button.run:disabled { opacity: 0.4; cursor: not-allowed; }\n\n  /* Stats */\n  .stats-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin-bottom: 1.5rem; }\n  .stat-card {\n    background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 1rem 1.2rem; text-align: center;\n  }\n  .stat-card .val { font-size: 2rem; font-weight: 700; }\n  .stat-card .lbl { font-size: 0.75rem; color: var(--text2); text-transform: uppercase; margin-top: 0.3rem; }\n  .stat-card.agree .val { color: var(--green); }\n  .stat-card.a-only .val { color: var(--blue); }\n  .stat-card.b-only .val { color: var(--purple); }\n\n  /* Charts */\n  .charts-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; margin-bottom: 1.5rem; }\n  .chart-box {\n    background: var(--surface); border: 1px solid var(--border); border-radius: 8px;\n    padding: 1rem; min-height: 300px;\n  }\n  .chart-box h3 { font-size: 0.8rem; color: var(--text2); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.6rem; }\n  .chart-box canvas { width: 100% !important; }\n  .chart-box.wide { grid-column: 1 / -1; }\n\n  /* Table */\n  .detail-section { margin-top: 1.5rem; }\n  .detail-section h3 { font-size: 0.85rem; color: var(--text2); text-transform: uppercase; margin-bottom: 0.6rem; }\n  .tabs { display: flex; gap: 0.5rem; margin-bottom: 0.8rem; flex-wrap: wrap; }\n  .tab {\n    background: var(--surface2); border: 1px solid var(--border); border-radius: 6px;\n    padding: 0.3rem 0.8rem; font-size: 0.78rem; cursor: pointer; font-family: inherit; color: var(--text2);\n  }\n  .tab.active { background: var(--accent); color: #fff; border-color: var(--accent); }\n  .table-wrap { max-height: 500px; overflow: auto; background: var(--surface); border: 1px solid var(--border); border-radius: 8px; }\n  table { width: 100%; border-collapse: collapse; font-size: 0.68rem; white-space: nowrap; }\n  th {\n    background: var(--surface2); color: var(--text2); text-align: left; padding: 0.28rem 0.4rem;\n    position: sticky; top: 0; cursor: pointer; user-select: none; z-index: 1;\n    font-weight: 600;\n  }\n  th:hover { color: var(--accent); }\n  th .sort-arrow { font-size: 0.56rem; margin-left: 0.2rem; }\n  td { padding: 0.24rem 0.4rem; border-top: 1px solid var(--border); overflow: hidden; text-overflow: ellipsis; }\n  tr.agree-row td:first-child { border-left: 3px solid var(--green); }\n  tr.a-only-row td:first-child { border-left: 3px solid var(--blue); }\n  tr.b-only-row td:first-child { border-left: 3px solid var(--purple); }\n  tr:hover td { background: var(--surface2); }\n\n  /* Column width classes — match bps_explorer's sizing so columns\n     stay tight and we can fit A+B sample blocks on one row.        */\n  td.w-loc,    th.w-loc    { max-width: 14ch; }\n  td.w-strand, th.w-strand { max-width: 2ch; text-align: center; }\n  td.w-tiny,   th.w-tiny   { max-width: 6ch; }\n  td.w-num,    th.w-num    { max-width: 6ch; text-align: right; font-variant-numeric: tabular-nums; }\n  td.w-wrap,   th.w-wrap   { max-width: 18ch; overflow: hidden; text-overflow: ellipsis; }\n  td.w-gt,     th.w-gt     { max-width: 40ch; white-space: pre; font-family: ui-monospace, Menlo, Consolas, monospace; }\n\n  /* IGV click-out links — same interaction model as bps_explorer. */\n  a.igv-link        { color: var(--accent); text-decoration: none; cursor: pointer; }\n  a.igv-link:hover  { text-decoration: underline; }\n  a.igv-link.ok     { color: var(--green); }\n  a.igv-link.err    { color: var(--red); }\n\n  /* Placeholder / Progress */\n  .placeholder { text-align: center; padding: 4rem 2rem; color: var(--text2); }\n  .placeholder .big { font-size: 2rem; margin-bottom: 0.5rem; }\n  .progress-overlay {\n    position: fixed; inset: 0; background: rgba(15,17,23,0.85);\n    display: flex; align-items: center; justify-content: center; z-index: 100;\n  }\n  .progress-box {\n    background: var(--surface); border: 1px solid var(--border); border-radius: 10px;\n    padding: 2rem 3rem; text-align: center; min-width: 320px;\n  }\n  .progress-box .msg { font-size: 0.9rem; margin-bottom: 1rem; }\n  .progress-bar-outer { height: 6px; background: var(--surface2); border-radius: 3px; overflow: hidden; }\n  .progress-bar-inner { height: 100%; background: var(--accent); transition: width 0.2s; width: 0%; }\n\n  /* Search */\n  .search-row { display: flex; gap: 0.8rem; align-items: center; margin-bottom: 0.8rem; }\n  .search-row input {\n    background: var(--surface2); border: 1px solid var(--border); border-radius: 6px;\n    padding: 0.4rem 0.8rem; font-family: inherit; font-size: 0.8rem; color: var(--text); width: 250px;\n  }\n  .search-row input::placeholder { color: var(--text2); }\n  .search-row .result-count { font-size: 0.75rem; color: var(--text2); }\n\n  /* Row selection */\n  table tbody tr { cursor: pointer; }\n  tr.selected td { background: #1e3a5f !important; }\n\n  /* ========================================================================\n     Full-row detail panel — shows every bps.txt column for the selected row.\n     Mirrors the alignments_viewer.html \"bps-table\" / \"format-key\" styling\n     with sample-column highlighting + FORMAT tooltip.\n     ====================================================================== */\n  .detail-panel {\n    margin-top: 1rem;\n    background: var(--surface);\n    border: 1px solid var(--border);\n    border-radius: 8px;\n    overflow: hidden;\n  }\n  .detail-panel-header {\n    background: var(--surface2);\n    padding: 0.6rem 1rem;\n    font-size: 0.8rem;\n    color: var(--text2);\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    border-bottom: 1px solid var(--border);\n  }\n  .detail-panel-header strong { color: var(--text); font-weight: 600; text-transform: none; letter-spacing: 0; }\n  .detail-panel-header .subtitle { color: var(--text2); font-size: 0.75rem; }\n  .detail-panel-body { max-height: 520px; overflow: auto; }\n  .detail-panel .empty {\n    padding: 1.2rem; text-align: center; color: var(--text2); font-size: 0.82rem;\n  }\n\n  /* FORMAT key panel — replicates alignments_viewer.html */\n  .format-key {\n    padding: 6px 10px;\n    background: var(--surface2);\n    border-bottom: 1px solid var(--border);\n    font-size: 11px;\n    color: var(--text2);\n    display: flex; flex-direction: column; gap: 3px;\n    position: sticky; top: 0; z-index: 3;\n  }\n  .format-key .fk-title {\n    color: var(--text); font-weight: 600; font-size: 11px;\n    text-transform: uppercase; letter-spacing: 0.04em;\n  }\n  .format-key .fk-row {\n    display: flex; align-items: center; gap: 8px;\n    font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 12px; color: var(--text);\n  }\n  .format-key .fk-tag {\n    display: inline-block; padding: 0 6px; border-radius: 3px;\n    font-family: ui-sans-serif, sans-serif; font-size: 10px;\n    font-weight: 700; letter-spacing: 0.05em;\n  }\n  .format-key .fk-tag.fk-sv    { background: #1f3a5f; color: #79c0ff; }\n  .format-key .fk-tag.fk-indel { background: #3a1f5f; color: #d2a8ff; }\n  .format-key code { background: transparent; color: inherit; }\n  .format-key .fk-defs {\n    display: flex; flex-wrap: wrap; gap: 4px 12px;\n    margin-top: 2px; font-family: ui-sans-serif, sans-serif;\n  }\n  .format-key .fk-def code {\n    background: transparent; color: var(--accent);\n    font-family: ui-monospace, Menlo, Consolas, monospace;\n  }\n\n  /* vertical \"key / value\" layout for the raw row */\n  .detail-kv {\n    font-family: ui-monospace, Menlo, Consolas, monospace;\n    font-size: 11.5px;\n    width: 100%;\n    border-collapse: collapse;\n  }\n  .detail-kv td {\n    padding: 3px 10px;\n    border-bottom: 1px solid rgba(48,54,61,0.5);\n    white-space: pre-wrap;\n    word-break: break-all;\n    vertical-align: top;\n  }\n  .detail-kv td.kv-key {\n    width: 180px;\n    color: var(--text2);\n    text-transform: lowercase;\n    background: rgba(0,0,0,0.15);\n    white-space: nowrap;\n    font-weight: 600;\n  }\n  .detail-kv td.kv-val { color: var(--text); }\n  .detail-kv tr.sample-row td.kv-key {\n    color: var(--accent);\n    background: rgba(88, 166, 255, 0.08);\n    border-left: 2px solid rgba(88,166,255,0.35);\n  }\n  .detail-kv tr.sample-row td.kv-val {\n    background: rgba(88, 166, 255, 0.04);\n    color: #c9d1d9;\n  }\n  .detail-kv tr:hover td { background: #1f2937; }\n  .detail-kv tr.sample-row:hover td { background: #1b2b44; }\n  .detail-kv .side-label {\n    display: inline-block;\n    font-size: 9.5px;\n    padding: 0 5px;\n    margin-right: 4px;\n    border-radius: 3px;\n    letter-spacing: 0.05em;\n    font-weight: 700;\n    vertical-align: middle;\n  }\n  .detail-kv .side-a { background: #1e3a5f; color: #60a5fa; }\n  .detail-kv .side-b { background: #3a1f5f; color: #a855f7; }\n  .detail-kv td.kv-val-a { border-right: 1px dashed var(--border); }\n  .detail-kv td.kv-val.diff { color: var(--amber); }\n  .detail-kv td.kv-val-a.diff, .detail-kv td.kv-val-b.diff { background: rgba(251, 191, 36, 0.08); }\n</style>\n</head>\n<body>\n\n<h1><span>SvABA</span> BPS Comparison</h1>\n\n<div class=\"container\">\n  <!-- File uploads -->\n  <div class=\"upload-grid\">\n    <div class=\"upload-box\" id=\"oldBox\" onclick=\"document.getElementById('oldFile').click()\">\n      <div class=\"icon\">&#128196;</div>\n      <label>New A (.tsv / .txt / .gz)</label>\n      <div>Drop or click to load</div>\n      <div class=\"filename hidden\" id=\"oldName\"></div>\n      <div class=\"count hidden\" id=\"oldCount\"></div>\n      <input type=\"file\" id=\"oldFile\">\n    </div>\n    <div class=\"upload-box\" id=\"newBox\" onclick=\"document.getElementById('newFile').click()\">\n      <div class=\"icon\">&#128196;</div>\n      <label>New B (.tsv / .txt / .gz)</label>\n      <div>Drop or click to load</div>\n      <div class=\"filename hidden\" id=\"newName\"></div>\n      <div class=\"count hidden\" id=\"newCount\"></div>\n      <input type=\"file\" id=\"newFile\">\n    </div>\n  </div>\n\n  <!-- Controls -->\n  <div class=\"controls\">\n    <div class=\"control-group\">\n      <label>Type (A)</label>\n      <div class=\"checkboxes\" id=\"evidenceChecks\"></div>\n    </div>\n    <div class=\"control-group\">\n      <label>Confidence (A)</label>\n      <div class=\"checkboxes\" id=\"confChecksOld\"></div>\n    </div>\n    <div class=\"control-group\">\n      <label>Somatic LOD &ge; (A)</label>\n      <div class=\"slider-row\">\n        <input type=\"range\" id=\"somlodOldSlider\" min=\"-50\" max=\"100\" step=\"1\" value=\"0\">\n        <span class=\"slider-val\" id=\"somlodOldVal\">0</span>\n      </div>\n    </div>\n    <div class=\"control-group\">\n      <label>Max LOD &ge; (A)</label>\n      <div class=\"slider-row\">\n        <input type=\"range\" id=\"maxlodOldSlider\" min=\"-50\" max=\"100\" step=\"1\" value=\"-50\">\n        <span class=\"slider-val\" id=\"maxlodOldVal\">-50</span>\n      </div>\n    </div>\n    <div class=\"control-group\">\n      <label>Type (B)</label>\n      <div class=\"checkboxes\" id=\"typeChecks\"></div>\n    </div>\n    <div class=\"control-group\">\n      <label>Confidence (B)</label>\n      <div class=\"checkboxes\" id=\"confChecksNew\"></div>\n    </div>\n    <div class=\"control-group\">\n      <label>Somatic LOD &ge; (B)</label>\n      <div class=\"slider-row\">\n        <input type=\"range\" id=\"somlodNewSlider\" min=\"-50\" max=\"100\" step=\"1\" value=\"0\">\n        <span class=\"slider-val\" id=\"somlodNewVal\">0</span>\n      </div>\n    </div>\n    <div class=\"control-group\">\n      <label>Max LOD &ge; (B)</label>\n      <div class=\"slider-row\">\n        <input type=\"range\" id=\"maxlodNewSlider\" min=\"-50\" max=\"100\" step=\"1\" value=\"-50\">\n        <span class=\"slider-val\" id=\"maxlodNewVal\">-50</span>\n      </div>\n    </div>\n    <div class=\"control-group\">\n      <label>Tolerance (bp)</label>\n      <div class=\"slider-row\">\n        <input type=\"range\" id=\"toleranceSlider\" min=\"1\" max=\"500\" step=\"1\" value=\"10\">\n        <span class=\"slider-val\" id=\"toleranceVal\">10</span>\n      </div>\n    </div>\n    <button class=\"run\" id=\"runBtn\" disabled>Compare</button>\n  </div>\n\n  <!-- Placeholder -->\n  <div id=\"placeholder\" class=\"placeholder\">\n    <div class=\"big\">&#8593;</div>\n    <div>Load two bps files (any format), then click Compare</div>\n  </div>\n\n  <!-- Results -->\n  <div id=\"results\" class=\"hidden\">\n    <div class=\"stats-row\">\n      <div class=\"stat-card agree\"><div class=\"val\" id=\"agreeCount\">0</div><div class=\"lbl\">Agree (both found)</div></div>\n      <div class=\"stat-card a-only\"><div class=\"val\" id=\"oldOnlyCount\">0</div><div class=\"lbl\">A only</div></div>\n      <div class=\"stat-card b-only\"><div class=\"val\" id=\"newOnlyCount\">0</div><div class=\"lbl\">B only</div></div>\n    </div>\n    <div class=\"charts-grid\">\n      <div class=\"chart-box\"><h3>Agreement Breakdown</h3><canvas id=\"chartPie\"></canvas></div>\n      <div class=\"chart-box\"><h3>By Type</h3><canvas id=\"chartByType\"></canvas></div>\n      <div class=\"chart-box\"><h3>By Span Size (log-scale)</h3><canvas id=\"chartBySize\"></canvas></div>\n      <div class=\"chart-box\"><h3>By Confidence</h3><canvas id=\"chartByConf\"></canvas></div>\n    </div>\n    <div class=\"detail-section\">\n      <h3>Event Details</h3>\n      <div class=\"tabs\" id=\"detailTabs\"></div>\n      <div class=\"search-row\">\n        <input type=\"text\" id=\"searchInput\" placeholder=\"Filter by chr, position, type...\">\n        <span class=\"result-count\" id=\"resultCount\"></span>\n      </div>\n      <div class=\"table-wrap\" id=\"detailTable\"></div>\n\n      <!-- Full-row detail panel (click a row above) -->\n      <div class=\"detail-panel\" id=\"rowDetailPanel\">\n        <div class=\"detail-panel-header\">\n          <span><strong>Row detail</strong> <span class=\"subtitle\">— every field from bps.txt.gz</span></span>\n          <span class=\"subtitle\" id=\"rowDetailSubtitle\">click any row above</span>\n        </div>\n        <div class=\"detail-panel-body\" id=\"rowDetailBody\">\n          <div class=\"empty\">Click a row in the table above to see every column from <code>bps.txt.gz</code> for that record.</div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n<!-- Progress -->\n<div class=\"progress-overlay hidden\" id=\"progressOverlay\">\n  <div class=\"progress-box\">\n    <div class=\"msg\" id=\"progressMsg\">Loading...</div>\n    <div class=\"progress-bar-outer\"><div class=\"progress-bar-inner\" id=\"progressBar\"></div></div>\n  </div>\n</div>\n\n<script>\n// ── Data ──\nlet oldCalls = [];\nlet newCalls = [];\nlet oldHeader = [];           // bps.txt header columns, side A\nlet newHeader = [];           // bps.txt header columns, side B\nlet oldSamplePrefixes = [];   // [t001, n001, ...] for side A\nlet newSamplePrefixes = [];   // [t001, n001, ...] for side B\nlet currentTableData = [];\nlet currentSortCol = -1;\nlet currentSortAsc = true;\n\n// ── File I/O ──\nfunction setupUpload(boxId, inputId, nameId, countId, parser) {\n  const box = document.getElementById(boxId);\n  const input = document.getElementById(inputId);\n  const handler = (file) => {\n    if (!file) return;\n    document.getElementById(nameId).textContent = file.name;\n    document.getElementById(nameId).classList.remove('hidden');\n    readFile(file).then(text => {\n      const result = parser(text);\n      // Surface the detected header format (old/new, ±v2) so the user can\n      // see what was inferred for each side independently. Lets mixed-\n      // format compares (e.g. old vs new) still be verified at a glance.\n      const fmt = result.format ? '  ·  ' + result.format + ' format' : '';\n      document.getElementById(countId).textContent = result.count + ' records' + fmt;\n      document.getElementById(countId).classList.remove('hidden');\n      box.classList.add('loaded');\n      updateRunBtn();\n    });\n  };\n  input.addEventListener('change', e => handler(e.target.files[0]));\n  box.addEventListener('dragover', e => { e.preventDefault(); box.classList.add('dragover'); });\n  box.addEventListener('dragleave', () => box.classList.remove('dragover'));\n  box.addEventListener('drop', e => { e.preventDefault(); box.classList.remove('dragover'); handler(e.dataTransfer.files[0]); });\n}\n\nasync function readFile(file) {\n  showProgress('Reading ' + file.name + '...');\n  const buf = await file.arrayBuffer();\n  const u8 = new Uint8Array(buf.slice(0, 2));\n  let text;\n  if (u8[0] === 0x1f && u8[1] === 0x8b) {\n    setProgress(30, 'Decompressing...');\n    text = pako.inflate(new Uint8Array(buf), { to: 'string' });\n  } else {\n    text = new TextDecoder().decode(buf);\n  }\n  setProgress(80, 'Parsing...');\n  hideProgress();\n  return text;\n}\n\nfunction showProgress(msg) { document.getElementById('progressOverlay').classList.remove('hidden'); document.getElementById('progressMsg').textContent = msg; setProgress(10); }\nfunction setProgress(pct, msg) { document.getElementById('progressBar').style.width = pct + '%'; if (msg) document.getElementById('progressMsg').textContent = msg; }\nfunction hideProgress() { document.getElementById('progressOverlay').classList.add('hidden'); }\n\n// ── Parsers ──\nconst CANONICAL_CHROMS = new Set([\n  'chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10',\n  'chr11','chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19','chr20',\n  'chr21','chr22','chrX',\n  '1','2','3','4','5','6','7','8','9','10',\n  '11','12','13','14','15','16','17','18','19','20',\n  '21','22','X'\n]);\n\n// Breakpoint-pair ordering is a matter of convention: the same junction can\n// be written (chrA,posA,chrB,posB) or (chrB,posB,chrA,posA). Normalize each\n// call at ingest so downstream dedup/matching is orientation-invariant.\n// Canonical rule: lower chrom first (natural numeric order where possible),\n// ties broken by lower pos. `chrCmp` matches chromosomes in a human-sensible\n// way: chr1 < chr2 < ... < chr10 < ... < chr22 < chrX (rather than string\n// order where chr10 < chr2).\nfunction chrNum(c) {\n  const s = String(c).replace(/^chr/, '');\n  if (s === 'X')  return 23;\n  if (s === 'Y')  return 24;\n  if (s === 'M' || s === 'MT') return 25;\n  const n = parseInt(s, 10);\n  return Number.isNaN(n) ? 1000 : n;\n}\nfunction chrCmp(a, b) {\n  const na = chrNum(a), nb = chrNum(b);\n  if (na !== nb) return na - nb;\n  return a < b ? -1 : (a > b ? 1 : 0);\n}\nfunction canonicalize(c) {\n  // Attach _cchr1/_cpos1/_cchr2/_cpos2 in canonical (lower-first) order.\n  // Display fields (chr1, pos1, strand1, ...) and _cols are left untouched.\n  const cmp = chrCmp(c.chr1, c.chr2);\n  const flip = (cmp > 0) || (cmp === 0 && c.pos1 > c.pos2);\n  if (flip) {\n    c._cchr1 = c.chr2; c._cpos1 = c.pos2;\n    c._cchr2 = c.chr1; c._cpos2 = c.pos1;\n  } else {\n    c._cchr1 = c.chr1; c._cpos1 = c.pos1;\n    c._cchr2 = c.chr2; c._cpos2 = c.pos2;\n  }\n}\n\n// ── Unified bps.txt parser ─────────────────────────────────────────────────\n//\n// svaba's bps.txt.gz header has evolved over time and now comes in two\n// main shapes that this viewer needs to support BOTH sides of a\n// comparison with, independently:\n//\n//   - OLD (pre-refactor / LEGACY): col 33 named \"evidence\", col 35 named\n//     \"secondary\". The \"contig\" column is named \"contig_and_region\".\n//     May or may not include the 10 post-SvABA2.0 columns (cpos1..flipped).\n//\n//   - NEW (current / post-refactor): col 33 renamed to \"type\", col 35 to\n//     \"2ndary\". \"contig_and_region\" unchanged. The 51-col v2 body (with\n//     cpos1..flipped) is always present.\n//\n// Everything downstream of parsing is name-driven (chart axes, filters,\n// dedup, detail rendering), so we can normalize both shapes into the\n// same in-memory record layout by looking up semantic fields via a list\n// of alias names and populating the record's canonical keys. Both sides\n// of a compare can be loaded from either format independently — two OLDs,\n// two NEWs, or one of each — and the downstream diff works on the\n// canonical (chr1,pos1,chr2,pos2) keys plus the normalized type/conf/\n// maxlod/etc fields.\n// =========================================================================\n// IGV click-out helpers (shared with bps_explorer.html). IGV listens on\n// http://localhost:60151; fetch with no-cors so the request fires and we\n// can ignore the response.\n// =========================================================================\nfunction igvLoc(chr, pos) {\n  if (chr == null || chr === \"\" || pos == null || pos === \"\" || !isFinite(+pos)) return \"\";\n  let c = String(chr).replace(/^#/, \"\");\n  if (!/^chr/i.test(c)) c = \"chr\" + c;\n  return c + \":\" + pos;\n}\nfunction igvGoto(locus, anchor) {\n  if (!locus) return;\n  const url = \"http://localhost:60151/goto?locus=\" + encodeURIComponent(locus);\n  fetch(url, { mode: \"no-cors\", cache: \"no-store\" })\n    .then(() => {\n      if (anchor) {\n        anchor.classList.remove(\"err\");\n        anchor.classList.add(\"ok\");\n        setTimeout(() => anchor.classList.remove(\"ok\"), 600);\n      }\n    })\n    .catch(() => {\n      if (anchor) {\n        anchor.classList.add(\"err\");\n        setTimeout(() => anchor.classList.remove(\"err\"), 1500);\n      }\n    });\n}\n\n// Find where the per-sample columns start in a bps.txt header. The\n// convention (matching refilter.cpp / tovcf.cpp) is: scan from col 34\n// onward for the first header whose first char is 't' or 'n' — those\n// are sample prefixes. Returns -1 if not found.\nfunction detectSampleStart(hdr) {\n  for (let i = 34; i < hdr.length; i++) {\n    const h = hdr[i];\n    if (h && (h[0] === 't' || h[0] === 'n')) return i;\n  }\n  return -1;\n}\n\n// Pull the prefix out of a sample header token like \"t001_/path/to.bam\"\n// into just \"t001\". If there's no underscore, the whole token is the prefix.\nfunction _samplePrefix(tok) {\n  const us = tok.indexOf('_');\n  return us >= 0 ? tok.substring(0, us) : tok;\n}\n\nfunction parseBpsRows(text, sideLetter) {\n  const lines = text.trim().split('\\n');\n  const hdr = lines[0].replace(/^#/, '').split('\\t');\n\n  // Column-index with alias fallbacks. Returns the first header index that\n  // matches any of the provided names, else -1.\n  const cia = (...names) => {\n    for (const n of names) {\n      const i = hdr.indexOf(n);\n      if (i >= 0) return i;\n    }\n    return -1;\n  };\n\n  // Detect format from signature columns. \"type\" vs \"evidence\" is the\n  // most reliable tell (they're the field that was renamed). cpos1 tells\n  // us whether we're in the 51-col v2 body or the older 41-col shape.\n  const hasType     = hdr.indexOf('type')     >= 0;\n  const hasEvidence = hdr.indexOf('evidence') >= 0;\n  const hasV2       = hdr.indexOf('cpos1')    >= 0;\n  let format;\n  if      (hasType     && hasV2) format = 'new+v2';\n  else if (hasType)               format = 'new';\n  else if (hasEvidence && hasV2) format = 'old+v2';\n  else if (hasEvidence)           format = 'old';\n  else                            format = 'unknown';\n\n  const iType   = cia('type', 'evidence');\n  const iConf   = cia('conf', 'confidence');\n  const iSomlod = cia('somlod', 'som_lod', 'somatic_lod');\n  const iMaxLod = cia('maxlod', 'max_lod', 'lod_max', 'tlod');\n  const iQual   = cia('qual', 'quality');\n  const iSpan   = cia('span');\n  // LEGACY uses \"contig_and_region\"; some older/experimental dumps used\n  // \"contig\" / \"cname\" / \"contig_id\". Try all.\n  const iContig = cia('contig_and_region', 'contig', 'cname', 'contig_id');\n\n  // Locate the per-sample block (t001/n001/...) and cache the sample\n  // prefixes. Each data row's _cols[sampleStart..] maps 1:1 to these.\n  const sampleStart    = detectSampleStart(hdr);\n  const samplePrefixes = sampleStart >= 0\n      ? hdr.slice(sampleStart).map(_samplePrefix)\n      : [];\n\n  const records = [];\n  for (let i = 1; i < lines.length; i++) {\n    const cols = lines[i].split('\\t');\n    if (cols.length < 10) continue;\n    if (!CANONICAL_CHROMS.has(cols[0]) || !CANONICAL_CHROMS.has(cols[3])) continue;\n    // Positional for the 6 identifier columns — these are stable across\n    // OLD and NEW schemas; both start with chr1/pos1/strand1/chr2/pos2/\n    // strand2 in that fixed order.\n    // Per-sample FORMAT strings, indexed by prefix (t001/n001/...).\n    // Empty object when this dump has no samples or the header didn't\n    // expose a sample block.\n    const samples = {};\n    if (sampleStart >= 0) {\n      for (let s = 0; s < samplePrefixes.length; s++) {\n        samples[samplePrefixes[s]] = cols[sampleStart + s] || '';\n      }\n    }\n\n    const rec = {\n      chr1: cols[0], pos1: parseInt(cols[1]), strand1: cols[2],\n      chr2: cols[3], pos2: parseInt(cols[4]), strand2: cols[5],\n      // Pre-computed IGV locus strings for the table renderer. Empty\n      // when chr/pos is missing or non-numeric.\n      igvPos1: igvLoc(cols[0], cols[1]),\n      igvPos2: igvLoc(cols[3], cols[4]),\n      // Canonical normalized fields. Populate BOTH the new-style name\n      // (\"type\", \"conf\") and the old aliases (\"evidence\", \"confidence\")\n      // from the same source column so any downstream code that read\n      // the old-style alias still works after this change.\n      type:       iType   >= 0 ? cols[iType]              : '',\n      evidence:   iType   >= 0 ? cols[iType]              : '',\n      conf:       iConf   >= 0 ? cols[iConf]              : '',\n      confidence: iConf   >= 0 ? cols[iConf]              : '',\n      somlod:     iSomlod >= 0 ? parseFloat(cols[iSomlod]) : 0,\n      maxlod:     iMaxLod >= 0 ? parseFloat(cols[iMaxLod]) : 0,\n      contig:     iContig >= 0 ? cols[iContig]            : '',\n      qual:       iQual   >= 0 ? parseInt(cols[iQual])    : 0,\n      span:       iSpan   >= 0 ? parseInt(cols[iSpan])    : 0,\n      samples,              // prefix -> \"GT:AD:DP:...\" colon-joined cell\n      _cols: cols,          // full raw bps.txt row for detail rendering\n      _side: sideLetter,\n    };\n    records.push(rec);\n    canonicalize(rec);\n  }\n\n  return { records, header: hdr, format, samplePrefixes };\n}\n\nfunction parseOld(text) {\n  const r = parseBpsRows(text, 'A');\n  oldCalls          = r.records;\n  oldHeader         = r.header;\n  oldSamplePrefixes = r.samplePrefixes || [];\n  updateDynamicChecks(oldCalls, 'type', 'evidenceChecks', true);\n  updateDynamicChecks(oldCalls, 'conf', 'confChecksOld',  false);\n  return { count: oldCalls.length, format: r.format };\n}\n\nfunction parseNew(text) {\n  const r = parseBpsRows(text, 'B');\n  newCalls          = r.records;\n  newHeader         = r.header;\n  newSamplePrefixes = r.samplePrefixes || [];\n  updateDynamicChecks(newCalls, 'type', 'typeChecks',    true);\n  updateDynamicChecks(newCalls, 'conf', 'confChecksNew', false);\n  return { count: newCalls.length, format: r.format };\n}\n\nfunction updateDynamicChecks(records, field, containerId, allChecked) {\n  const vals = new Set(records.map(r => r[field] || '').filter(Boolean));\n  const el = document.getElementById(containerId);\n  el.innerHTML = '';\n  const passLike = new Set(['PASS']);\n  for (const v of [...vals].sort()) {\n    const checked = allChecked || passLike.has(v) ? 'checked' : '';\n    const lbl = document.createElement('label');\n    lbl.className = 'cb';\n    lbl.innerHTML = `<input type=\"checkbox\" value=\"${v}\" ${checked}> ${v}`;\n    el.appendChild(lbl);\n  }\n}\n\nfunction updateRunBtn() {\n  document.getElementById('runBtn').disabled = !(oldCalls.length > 0 && newCalls.length > 0);\n}\n\nsetupUpload('oldBox', 'oldFile', 'oldName', 'oldCount', parseOld);\nsetupUpload('newBox', 'newFile', 'newName', 'newCount', parseNew);\n\n// ── Slider wiring ──\nfor (const [sid, vid] of [['somlodOldSlider','somlodOldVal'],['somlodNewSlider','somlodNewVal'],['maxlodOldSlider','maxlodOldVal'],['maxlodNewSlider','maxlodNewVal'],['toleranceSlider','toleranceVal']]) {\n  document.getElementById(sid).addEventListener('input', e => { document.getElementById(vid).textContent = e.target.value; });\n}\n\n// ── Helpers ──\nfunction getChecked(id) { return new Set([...document.querySelectorAll(`#${id} input:checked`)].map(c => c.value)); }\n\nfunction dedup(calls, dedup = 10) {\n  if (!calls.length) return calls;\n  // Use canonical (_cchr1/_cpos1/_cchr2/_cpos2) so that flipped-pair duplicates\n  // — e.g. (chr1:216833626 + , chr11:117581568 -) vs\n  //         (chr11:117581568 -, chr1:216833626 +) — collapse into one row.\n  const sorted = calls.map(c => ({ c }));\n  sorted.sort((a, b) => {\n    const ca = a.c, cb = b.c;\n    if (ca._cchr1 !== cb._cchr1) return chrCmp(ca._cchr1, cb._cchr1);\n    if (ca._cchr2 !== cb._cchr2) return chrCmp(ca._cchr2, cb._cchr2);\n    if (ca._cpos1 !== cb._cpos1) return ca._cpos1 - cb._cpos1;\n    return ca._cpos2 - cb._cpos2;\n  });\n  const kept = [sorted[0]];\n  for (let i = 1; i < sorted.length; i++) {\n    const prev = kept[kept.length - 1].c, cur = sorted[i].c;\n    if (cur._cchr1 === prev._cchr1 && cur._cchr2 === prev._cchr2 &&\n        Math.abs(cur._cpos1 - prev._cpos1) <= dedup &&\n        Math.abs(cur._cpos2 - prev._cpos2) <= dedup) {\n      if ((cur.qual || 0) > (prev.qual || 0)) kept[kept.length - 1] = sorted[i];\n    } else {\n      kept.push(sorted[i]);\n    }\n  }\n  return kept.map(k => k.c);\n}\n\nfunction filterOld() {\n  // New-format filter for side A\n  const ty = getChecked('evidenceChecks');\n  const conf = getChecked('confChecksOld');\n  const minLod = parseFloat(document.getElementById('somlodOldSlider').value);\n  const minMaxLod = parseFloat(document.getElementById('maxlodOldSlider').value);\n  return dedup(oldCalls.filter(c => ty.has(c.type) && conf.has(c.conf) && c.somlod >= minLod && (c.maxlod || 0) >= minMaxLod));\n}\n\nfunction filterNew() {\n  const ty = getChecked('typeChecks');\n  const conf = getChecked('confChecksNew');\n  const minLod = parseFloat(document.getElementById('somlodNewSlider').value);\n  const minMaxLod = parseFloat(document.getElementById('maxlodNewSlider').value);\n  return dedup(newCalls.filter(c => ty.has(c.type) && conf.has(c.conf) && c.somlod >= minLod && (c.maxlod || 0) >= minMaxLod));\n}\n\n// ── Matching: best-first, both breakends within tolerance ──\nfunction compareCalls(oldFiltered, newFiltered, tolerance) {\n  // Build spatial index on new calls keyed by the canonical first chromosome\n  // (_cchr1). Canonicalization in the parser guarantees _cchr1 <= _cchr2 in\n  // chrCmp order, so a flipped-pair write of the same junction lands in the\n  // same bucket on both sides. Positions are stored in canonical order too\n  // (pos on _cchr1 side first), so no min/max gymnastics needed here.\n  const newByChrom = {};\n  for (let i = 0; i < newFiltered.length; i++) {\n    const c = newFiltered[i];\n    if (!newByChrom[c._cchr1]) newByChrom[c._cchr1] = [];\n    newByChrom[c._cchr1].push({ idx: i, p1: c._cpos1, p2: c._cpos2, chr2: c._cchr2 });\n  }\n  for (const k in newByChrom) newByChrom[k].sort((a, b) => a.p1 - b.p1);\n\n  // Collect all candidate pairs\n  const candidates = [];\n  for (let oi = 0; oi < oldFiltered.length; oi++) {\n    const o = oldFiltered[oi];\n    const bucket = newByChrom[o._cchr1];\n    if (!bucket) continue;\n\n    // Binary search on canonical p1\n    let lo = 0, hi = bucket.length - 1;\n    while (lo <= hi) {\n      const mid = (lo + hi) >> 1;\n      if (bucket[mid].p1 < o._cpos1 - tolerance) lo = mid + 1; else hi = mid - 1;\n    }\n    for (let j = Math.max(0, lo - 2); j < bucket.length; j++) {\n      const n = bucket[j];\n      if (n.p1 > o._cpos1 + tolerance) break;\n      // Require canonical chr2 match (flipped case already normalized away)\n      if (o._cchr2 !== n.chr2) continue;\n      const d1 = Math.abs(o._cpos1 - n.p1);\n      const d2 = Math.abs(o._cpos2 - n.p2);\n      const dist = Math.max(d1, d2);\n      if (dist <= tolerance) {\n        candidates.push({ oi, ni: n.idx, dist });\n      }\n    }\n  }\n\n  // Best-first greedy assignment\n  candidates.sort((a, b) => a.dist - b.dist);\n  const usedOld = new Set(), usedNew = new Set();\n  const agree = [], oldOnly = [], newOnly = [];\n\n  for (const c of candidates) {\n    if (usedOld.has(c.oi) || usedNew.has(c.ni)) continue;\n    usedOld.add(c.oi);\n    usedNew.add(c.ni);\n    agree.push({ old: oldFiltered[c.oi], new: newFiltered[c.ni], dist: c.dist });\n  }\n  for (let i = 0; i < oldFiltered.length; i++) {\n    if (!usedOld.has(i)) oldOnly.push(oldFiltered[i]);\n  }\n  for (let i = 0; i < newFiltered.length; i++) {\n    if (!usedNew.has(i)) newOnly.push(newFiltered[i]);\n  }\n  return { agree, oldOnly, newOnly };\n}\n\n// ── Charts ──\nconst charts = {};\nfunction makeChart(id, config) { if (charts[id]) charts[id].destroy(); charts[id] = new Chart(document.getElementById(id), config); }\nChart.defaults.color = '#8b8fa3';\nChart.defaults.borderColor = '#2e3140';\nconst C = { agree: 'rgba(74,222,128,0.8)', old: 'rgba(96,165,250,0.8)', new: 'rgba(168,85,247,0.8)' };\n\nfunction renderCharts(result) {\n  // Pie\n  makeChart('chartPie', {\n    type: 'doughnut',\n    data: {\n      labels: ['Agree', 'A only', 'B only'],\n      datasets: [{ data: [result.agree.length, result.oldOnly.length, result.newOnly.length], backgroundColor: [C.agree, C.old, C.new] }]\n    },\n    options: { responsive: true, plugins: { legend: { position: 'right' } } }\n  });\n\n  // By type (both sides are new format, so use type field for both)\n  const tyCounts = {};\n  for (const a of result.agree) {\n    const t = a.old.type || '?';\n    tyCounts[t] = (tyCounts[t] || { agree: 0, aOnly: 0, bOnly: 0 });\n    tyCounts[t].agree++;\n  }\n  for (const c of result.oldOnly) {\n    const t = c.type || '?';\n    tyCounts[t] = (tyCounts[t] || { agree: 0, aOnly: 0, bOnly: 0 });\n    tyCounts[t].aOnly++;\n  }\n  for (const c of result.newOnly) {\n    const t = c.type || '?';\n    tyCounts[t] = (tyCounts[t] || { agree: 0, aOnly: 0, bOnly: 0 });\n    tyCounts[t].bOnly++;\n  }\n\n  const typeLabels = Object.keys(tyCounts).sort();\n  const agreeByType = typeLabels.map(t => tyCounts[t].agree);\n  const aByType = typeLabels.map(t => tyCounts[t].aOnly);\n  const bByType = typeLabels.map(t => tyCounts[t].bOnly);\n\n  makeChart('chartByType', {\n    type: 'bar',\n    data: {\n      labels: typeLabels,\n      datasets: [\n        { label: 'Agree', data: agreeByType, backgroundColor: C.agree },\n        { label: 'A only', data: aByType, backgroundColor: C.old },\n        { label: 'B only', data: bByType, backgroundColor: C.new },\n      ]\n    },\n    options: { responsive: true, plugins: { legend: { position: 'top' } }, scales: { x: { stacked: true }, y: { stacked: true, beginAtZero: true } } }\n  });\n\n  // By size bin\n  const sizeBins = ['1-10', '10-100', '100-1k', '1k-10k', '10k+'];\n  const binFn = (c) => {\n    const s = Math.abs(c.span || (Math.max(c.pos1,c.pos2) - Math.min(c.pos1,c.pos2)));\n    if (s <= 10) return 0; if (s <= 100) return 1; if (s <= 1000) return 2; if (s <= 10000) return 3; return 4;\n  };\n  const sAgree = [0,0,0,0,0], sOld = [0,0,0,0,0], sNew = [0,0,0,0,0];\n  for (const a of result.agree) sAgree[binFn(a.old)]++;\n  for (const c of result.oldOnly) sOld[binFn(c)]++;\n  for (const c of result.newOnly) sNew[binFn(c)]++;\n\n  makeChart('chartBySize', {\n    type: 'bar',\n    data: {\n      labels: sizeBins,\n      datasets: [\n        { label: 'Agree', data: sAgree, backgroundColor: C.agree },\n        { label: 'A only', data: sOld, backgroundColor: C.old },\n        { label: 'B only', data: sNew, backgroundColor: C.new },\n      ]\n    },\n    options: { responsive: true, plugins: { legend: { position: 'top' } }, scales: { x: { stacked: true }, y: { stacked: true, beginAtZero: true } } }\n  });\n\n  // By confidence (both new format, so conf field for both)\n  const confLabels = new Set();\n  const confAgree = {}, confA = {}, confB = {};\n  for (const a of result.agree) {\n    const co = a.old.conf || '?';\n    confLabels.add(co);\n    confAgree[co] = (confAgree[co] || 0) + 1;\n  }\n  for (const c of result.oldOnly) { const co = c.conf || '?'; confLabels.add(co); confA[co] = (confA[co] || 0) + 1; }\n  for (const c of result.newOnly) { const co = c.conf || '?'; confLabels.add(co); confB[co] = (confB[co] || 0) + 1; }\n  const cLabels = [...confLabels].sort();\n\n  makeChart('chartByConf', {\n    type: 'bar',\n    data: {\n      labels: cLabels,\n      datasets: [\n        { label: 'Agree', data: cLabels.map(l => confAgree[l] || 0), backgroundColor: C.agree },\n        { label: 'A only', data: cLabels.map(l => confA[l] || 0), backgroundColor: C.old },\n        { label: 'B only', data: cLabels.map(l => confB[l] || 0), backgroundColor: C.new },\n      ]\n    },\n    options: { responsive: true, plugins: { legend: { position: 'top' } }, scales: { x: { stacked: true }, y: { stacked: true, beginAtZero: true } } }\n  });\n}\n\n// ── Table rendering ──\n//\n// Column metadata entries: {k, l, w} — k = row-field key, l = display label,\n// w = width class (loc / strand / tiny / num / wrap / gt / samp). Sample\n// columns are pushed on dynamically at tab-render time from the per-side\n// sample prefix lists so the set of columns adjusts to whatever the loaded\n// bps.txt.gz actually carries.\nconst _fmtLod = v => (v === undefined || v === null || isNaN(v)) ? '' : (+v).toFixed(2);\n\n// Core shared columns: IGV1 / S1 / IGV2 / S2 / Span appear on every tab.\nconst CORE_LOCUS_COLS = [\n  { k:'igvPos1', l:'IGV1', w:'loc'    },\n  { k:'strand1', l:'S1',   w:'strand' },\n  { k:'igvPos2', l:'IGV2', w:'loc'    },\n  { k:'strand2', l:'S2',   w:'strand' },\n];\n\nfunction agreeCols() {\n  const cols = [\n    ...CORE_LOCUS_COLS,\n    { k:'span_A',   l:'Span',    w:'num'  },\n    { k:'type_A',   l:'Type A',  w:'tiny' },\n    { k:'conf_A',   l:'Conf A',  w:'tiny' },\n    { k:'somlod_A', l:'Som A',   w:'num'  },\n    { k:'maxlod_A', l:'Max A',   w:'num'  },\n    { k:'qual_A',   l:'Q A',     w:'num'  },\n    { k:'type_B',   l:'Type B',  w:'tiny' },\n    { k:'conf_B',   l:'Conf B',  w:'tiny' },\n    { k:'somlod_B', l:'Som B',   w:'num'  },\n    { k:'maxlod_B', l:'Max B',   w:'num'  },\n    { k:'qual_B',   l:'Q B',     w:'num'  },\n    { k:'dist',     l:'\\u0394',  w:'num'  },\n    { k:'contig',   l:'Contig',  w:'wrap' },\n  ];\n  // Per-sample A then B blocks so each prefix appears twice for an\n  // at-a-glance comparison. Keys are namespaced `sampA_t001` / `sampB_t001`.\n  for (const p of oldSamplePrefixes) {\n    cols.push({ k:'sampA_'+p, l:p+' A', w:'gt' });\n  }\n  for (const p of newSamplePrefixes) {\n    cols.push({ k:'sampB_'+p, l:p+' B', w:'gt' });\n  }\n  return cols;\n}\n\nfunction singleSideCols(samplePrefixes) {\n  const cols = [\n    ...CORE_LOCUS_COLS,\n    { k:'span',    l:'Span',   w:'num'  },\n    { k:'type',    l:'Type',   w:'tiny' },\n    { k:'conf',    l:'Conf',   w:'tiny' },\n    { k:'somlod',  l:'Som',    w:'num'  },\n    { k:'maxlod',  l:'Max',    w:'num'  },\n    { k:'qual',    l:'Qual',   w:'num'  },\n    { k:'contig',  l:'Contig', w:'wrap' },\n  ];\n  for (const p of samplePrefixes) {\n    cols.push({ k:'samp_'+p, l:p, w:'gt' });\n  }\n  return cols;\n}\n\nfunction buildRow(item, category) {\n  if (category === 'agree') {\n    const a = item.old, b = item.new;\n    const row = {\n      igvPos1: a.igvPos1, igvPos2: a.igvPos2,\n      chr1: a.chr1, pos1: a.pos1, strand1: a.strand1,\n      chr2: a.chr2, pos2: a.pos2, strand2: a.strand2,\n      span_A: a.span,\n      type_A: a.type, conf_A: a.conf, somlod_A: _fmtLod(a.somlod), maxlod_A: _fmtLod(a.maxlod), qual_A: a.qual,\n      type_B: b.type, conf_B: b.conf, somlod_B: _fmtLod(b.somlod), maxlod_B: _fmtLod(b.maxlod), qual_B: b.qual,\n      contig: a.contig || b.contig || '',\n      dist: item.dist,\n      _search: `${a.chr1} ${a.pos1} ${a.pos2} ${a.type} ${a.conf} ${b.type} ${b.conf} ${a.contig || ''} ${b.contig || ''}`.toLowerCase(),\n      _cat: 'agree',\n      _recA: a,\n      _recB: b\n    };\n    for (const p of oldSamplePrefixes) row['sampA_'+p] = (a.samples && a.samples[p]) || '';\n    for (const p of newSamplePrefixes) row['sampB_'+p] = (b.samples && b.samples[p]) || '';\n    return row;\n  } else {\n    const c = item;\n    const prefixes = (c._side === 'A') ? oldSamplePrefixes : newSamplePrefixes;\n    const row = {\n      igvPos1: c.igvPos1, igvPos2: c.igvPos2,\n      chr1: c.chr1, pos1: c.pos1, strand1: c.strand1,\n      chr2: c.chr2, pos2: c.pos2, strand2: c.strand2,\n      span: c.span, type: c.type, conf: c.conf, somlod: _fmtLod(c.somlod), maxlod: _fmtLod(c.maxlod),\n      qual: c.qual, contig: c.contig || '',\n      _search: `${c.chr1} ${c.pos1} ${c.pos2} ${c.type} ${c.conf} ${c.contig || ''}`.toLowerCase(),\n      _cat: category,\n      _recA: c._side === 'A' ? c : null,\n      _recB: c._side === 'B' ? c : null\n    };\n    for (const p of prefixes) row['samp_'+p] = (c.samples && c.samples[p]) || '';\n    return row;\n  }\n}\n\n// =========================================================================\n// Full-row detail panel — renders every bps.txt column for the clicked row.\n// Mirrors the alignments_viewer.html detail style:\n//   - FORMAT key panel (SV/INDEL FORMAT strings + per-field definitions)\n//   - vertical key→value table with sample columns highlighted\n//   - FORMAT-aware tooltip on each sample cell\n// For \"Agree\" rows we render A and B side by side and diff-highlight any\n// field whose values differ.\n// =========================================================================\nconst SV_FORMAT    = \"GT:AD:DP:SR:DR:GQ:PL:LO:LO_n\";\nconst INDEL_FORMAT = \"GT:AD:DP:SR:CR:GQ:PL:LO:LO_n\";\nconst FORMAT_KEY = {\n  GT:    \"Genotype\",\n  AD:    \"Allele depth (alt-supporting reads)\",\n  DP:    \"Total read depth\",\n  SR:    \"Split-read alt support\",\n  DR:    \"Discordant read pair alt support (SVs)\",\n  CR:    \"Cigar-derived alt support (indels)\",\n  GQ:    \"Genotype quality (phred)\",\n  PL:    \"Phred-scaled likelihoods (0/0,0/1,1/1)\",\n  LO:    \"Per-sample LOD (variant vs error)\",\n  LO_n:  \"Per-sample normalized LOD\",\n};\nfunction _formatForType(type) {\n  return (type === \"INDEL\") ? INDEL_FORMAT : SV_FORMAT;\n}\nfunction _isSampleHeader(h) {\n  if (!h) return false;\n  if (/^[a-z]\\d{3}[_.-]/.test(h)) return true;\n  if (/\\.bam$/i.test(h)) return true;\n  if (/[\\\\/]/.test(h)) return true;\n  return false;\n}\nfunction _escape(s) {\n  return String(s ?? '').replace(/[&<>\"']/g, c => ({\n    '&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'\n  }[c]));\n}\nfunction _sampleTooltip(raw, typeVal) {\n  const fmtForRow = _formatForType(typeVal);\n  const fmtParts  = fmtForRow.split(':');\n  const parts = String(raw ?? '').split(':');\n  const tip = parts.map((p, k) => {\n    const key = fmtParts[k] || `f${k+1}`;\n    const desc = FORMAT_KEY[key] || '';\n    return `${key}=${p}${desc?'  ('+desc+')':''}`;\n  }).join('\\n');\n  return `FORMAT (${typeVal||'?'}): ${fmtForRow}\\n\\n${tip}`;\n}\n\nfunction _formatKeyPanelHtml() {\n  return `<div class=\"format-key\">\n    <div class=\"fk-title\">Per-sample column FORMAT</div>\n    <div class=\"fk-row\"><span class=\"fk-tag fk-sv\">SV</span> <code>${SV_FORMAT}</code></div>\n    <div class=\"fk-row\"><span class=\"fk-tag fk-indel\">INDEL</span> <code>${INDEL_FORMAT}</code></div>\n    <div class=\"fk-defs\">${\n      Object.entries(FORMAT_KEY).map(([k,v]) =>\n        `<span class=\"fk-def\"><code>${k}</code>=${_escape(v)}</span>`).join('')\n    }</div>\n  </div>`;\n}\n\nfunction renderRowDetail(row) {\n  const body = document.getElementById('rowDetailBody');\n  const subtitle = document.getElementById('rowDetailSubtitle');\n  if (!row) {\n    body.innerHTML = `<div class=\"empty\">Click a row in the table above to see every column from <code>bps.txt.gz</code> for that record.</div>`;\n    subtitle.textContent = 'click any row above';\n    return;\n  }\n\n  const recA = row._recA;\n  const recB = row._recB;\n  const hasA = recA && recA._cols;\n  const hasB = recB && recB._cols;\n\n  // Unify the columns to walk. For agree rows, walk the union of both headers\n  // aligned by index (they should match, but we fall back if not).\n  const headers = hasA ? oldHeader : (hasB ? newHeader : []);\n  const altHeaders = (hasA && hasB) ? newHeader : [];\n\n  if (!headers.length) {\n    body.innerHTML = `<div class=\"empty\">This row has no raw bps.txt data attached.</div>`;\n    return;\n  }\n\n  const typeA = hasA ? (recA.type || '') : '';\n  const typeB = hasB ? (recB.type || '') : '';\n\n  // Subtitle: location + category\n  const loc = `${row.chr1}:${row.pos1} ${row.strand1 || ''} ↔ ${row.chr2}:${row.pos2} ${row.strand2 || ''}`;\n  const catLabel = row._cat === 'agree' ? 'Agree (A & B)'\n                 : row._cat === 'oldOnly' ? 'A only'\n                 : 'B only';\n  subtitle.textContent = `${catLabel} · ${loc}`;\n\n  let html = _formatKeyPanelHtml();\n  html += '<table class=\"detail-kv\"><tbody>';\n\n  const bothSides = hasA && hasB;\n  const maxCols = Math.max(\n    hasA ? Math.max(headers.length, recA._cols.length) : 0,\n    hasB ? Math.max((altHeaders.length || headers.length), recB._cols.length) : 0\n  );\n\n  for (let i = 0; i < maxCols; i++) {\n    const hA = hasA ? (headers[i] || `col${i+1}`) : '';\n    const hB = hasB ? ((altHeaders[i] || headers[i]) || `col${i+1}`) : '';\n    const keyLabel = hA || hB || `col${i+1}`;\n    const isSample = _isSampleHeader(keyLabel);\n\n    const vA = hasA ? (recA._cols[i] ?? '') : '';\n    const vB = hasB ? (recB._cols[i] ?? '') : '';\n\n    const trClass = isSample ? 'sample-row' : '';\n    html += `<tr class=\"${trClass}\">`;\n    html += `<td class=\"kv-key\">${_escape(keyLabel)}</td>`;\n\n    if (bothSides) {\n      const diff = (vA !== vB) ? ' diff' : '';\n      const tipA = isSample ? ` title=\"${_escape(_sampleTooltip(vA, typeA))}\"` : '';\n      const tipB = isSample ? ` title=\"${_escape(_sampleTooltip(vB, typeB))}\"` : '';\n      html += `<td class=\"kv-val kv-val-a${diff}\"${tipA}>` +\n              `<span class=\"side-label side-a\">A</span>${_escape(vA)}</td>`;\n      html += `<td class=\"kv-val kv-val-b${diff}\"${tipB}>` +\n              `<span class=\"side-label side-b\">B</span>${_escape(vB)}</td>`;\n    } else if (hasA) {\n      const tipA = isSample ? ` title=\"${_escape(_sampleTooltip(vA, typeA))}\"` : '';\n      html += `<td class=\"kv-val\" colspan=\"2\"${tipA}>${_escape(vA)}</td>`;\n    } else {\n      const tipB = isSample ? ` title=\"${_escape(_sampleTooltip(vB, typeB))}\"` : '';\n      html += `<td class=\"kv-val\" colspan=\"2\"${tipB}>${_escape(vB)}</td>`;\n    }\n    html += '</tr>';\n  }\n\n  html += '</tbody></table>';\n  body.innerHTML = html;\n}\n\nfunction renderTable(rows, cols, rowClass) {\n  const query = document.getElementById('searchInput').value.toLowerCase().trim();\n  let filtered = query ? rows.filter(r => r._search.includes(query)) : rows;\n  document.getElementById('resultCount').textContent = `${filtered.length} of ${rows.length} events`;\n\n  // Sort\n  if (currentSortCol >= 0 && currentSortCol < cols.length) {\n    const key = cols[currentSortCol].k;\n    filtered = [...filtered].sort((a, b) => {\n      let va = a[key], vb = b[key];\n      const na = parseFloat(va), nb = parseFloat(vb);\n      if (!isNaN(na) && !isNaN(nb)) { va = na; vb = nb; }\n      if (va < vb) return currentSortAsc ? -1 : 1;\n      if (va > vb) return currentSortAsc ? 1 : -1;\n      return 0;\n    });\n  }\n\n  const max = 1000;\n  const show = filtered.slice(0, max);\n  let html = '<table><thead><tr>';\n  for (let i = 0; i < cols.length; i++) {\n    const c = cols[i];\n    const arrow = currentSortCol === i ? (currentSortAsc ? ' &#9650;' : ' &#9660;') : '';\n    const cls = c.w ? ('w-' + c.w) : '';\n    html += `<th data-col=\"${i}\" class=\"${cls}\">${esc(c.l)}<span class=\"sort-arrow\">${arrow}</span></th>`;\n  }\n  html += '</tr></thead><tbody>';\n  for (let ri = 0; ri < show.length; ri++) {\n    html += `<tr class=\"${rowClass}\" data-row-idx=\"${ri}\">`;\n    for (const c of cols) {\n      const v = show[ri][c.k];\n      const cls = c.w ? ('w-' + c.w) : '';\n      if (c.k === 'igvPos1' || c.k === 'igvPos2') {\n        if (v) {\n          html += `<td class=\"${cls}\"><a class=\"igv-link\" href=\"#\" data-locus=\"${esc(v)}\" title=\"Open in IGV (localhost:60151)\">${esc(v)}</a></td>`;\n        } else {\n          html += `<td class=\"${cls}\"></td>`;\n        }\n      } else {\n        html += `<td class=\"${cls}\">${esc(v ?? '')}</td>`;\n      }\n    }\n    html += '</tr>';\n  }\n  if (filtered.length > max) html += `<tr><td colspan=\"${cols.length}\" style=\"text-align:center;color:var(--text2)\">... ${filtered.length - max} more</td></tr>`;\n  html += '</tbody></table>';\n  document.getElementById('detailTable').innerHTML = html;\n\n  // Wire sort clicks\n  document.querySelectorAll('#detailTable th').forEach(th => {\n    th.addEventListener('click', () => {\n      const col = parseInt(th.dataset.col);\n      if (currentSortCol === col) currentSortAsc = !currentSortAsc;\n      else { currentSortCol = col; currentSortAsc = true; }\n      renderTable(rows, cols, rowClass);\n    });\n  });\n\n  // Wire IGV click-outs. stopPropagation so the row click (detail panel)\n  // doesn't also fire. Use the same `href=\"#\"` + preventDefault dance\n  // as bps_explorer.html.\n  document.querySelectorAll('#detailTable a.igv-link').forEach(a => {\n    a.addEventListener('click', e => {\n      e.preventDefault();\n      e.stopPropagation();\n      igvGoto(a.dataset.locus, a);\n    });\n  });\n\n  // Wire row clicks → populate the row-detail panel with every bps.txt field.\n  // Ignore clicks that land on a live text-selection so users can still\n  // select/copy cell values without accidentally triggering a detail render.\n  // Also ignore clicks that originated on an IGV link above.\n  document.querySelectorAll('#detailTable tbody tr[data-row-idx]').forEach(tr => {\n    tr.addEventListener('click', e => {\n      if (e.target && e.target.closest && e.target.closest('a.igv-link')) return;\n      const sel = window.getSelection();\n      if (sel && sel.toString().length > 0 && tr.contains(sel.anchorNode)) return;\n      const ri = parseInt(tr.dataset.rowIdx);\n      document.querySelectorAll('#detailTable tbody tr.selected').forEach(x => x.classList.remove('selected'));\n      tr.classList.add('selected');\n      renderRowDetail(show[ri]);\n    });\n  });\n}\n\n// HTML escape helper — matches the one used throughout bps_explorer.html\nfunction esc(v) {\n  return String(v == null ? '' : v)\n    .replace(/&/g, '&amp;').replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nlet activeTabData = null;\nfunction renderDetailTabs(result) {\n  const tabsEl = document.getElementById('detailTabs');\n  tabsEl.innerHTML = '';\n  // Build the column sets lazily each render so they pick up whatever\n  // sample prefixes the current input files actually carry.\n  const entries = [\n    { label: `Agree (${result.agree.length})`,   items: result.agree,   cat: 'agree',   cols: agreeCols(),                       cls: 'agree-row'  },\n    { label: `A only (${result.oldOnly.length})`, items: result.oldOnly, cat: 'oldOnly', cols: singleSideCols(oldSamplePrefixes), cls: 'a-only-row' },\n    { label: `B only (${result.newOnly.length})`, items: result.newOnly, cat: 'newOnly', cols: singleSideCols(newSamplePrefixes), cls: 'b-only-row' },\n  ];\n\n  entries.forEach((entry, i) => {\n    const btn = document.createElement('button');\n    btn.className = 'tab' + (i === 0 ? ' active' : '');\n    btn.textContent = entry.label;\n    btn.onclick = () => {\n      tabsEl.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));\n      btn.classList.add('active');\n      currentSortCol = -1; currentSortAsc = true;\n      const rows = entry.items.map(item => buildRow(item, entry.cat));\n      activeTabData = { rows, cols: entry.cols, cls: entry.cls };\n      renderTable(rows, entry.cols, entry.cls);\n      renderRowDetail(null);\n    };\n    tabsEl.appendChild(btn);\n  });\n\n  // Show first tab\n  if (entries.length > 0) {\n    const rows = entries[0].items.map(item => buildRow(item, entries[0].cat));\n    activeTabData = { rows, cols: entries[0].cols, cls: entries[0].cls };\n    renderTable(rows, entries[0].cols, entries[0].cls);\n  }\n}\n\n// Re-filter table on search input\ndocument.getElementById('searchInput').addEventListener('input', () => {\n  if (activeTabData) renderTable(activeTabData.rows, activeTabData.cols, activeTabData.cls);\n});\n\n// ── Main ──\ndocument.getElementById('runBtn').addEventListener('click', () => {\n  showProgress('Filtering & deduplicating...');\n  setTimeout(() => {\n    const tolerance = parseInt(document.getElementById('toleranceSlider').value);\n    setProgress(20, 'Filtering old calls...');\n    const of = filterOld();\n    setProgress(40, 'Filtering new calls...');\n    const nf = filterNew();\n    setProgress(60, 'Comparing...');\n    const result = compareCalls(of, nf, tolerance);\n\n    document.getElementById('placeholder').classList.add('hidden');\n    document.getElementById('results').classList.remove('hidden');\n    document.getElementById('agreeCount').textContent = result.agree.length;\n    document.getElementById('oldOnlyCount').textContent = result.oldOnly.length;\n    document.getElementById('newOnlyCount').textContent = result.newOnly.length;\n\n    setProgress(80, 'Rendering charts...');\n    renderCharts(result);\n    renderDetailTabs(result);\n    renderRowDetail(null);\n    hideProgress();\n  }, 50);\n});\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>SvABA Viewers</title>\n<style>\n:root {\n  --bg: #0f1117; --surface: #1a1d27; --surface2: #252833;\n  --border: #2e3140; --text: #e1e4ed; --text2: #8b8fa3;\n  --accent: #6c8cff; --green: #4ade80; --purple: #a855f7; --amber: #fbbf24;\n}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:'SF Mono','Fira Code','Consolas',monospace;background:var(--bg);color:var(--text);min-height:100vh;display:flex;align-items:center;justify-content:center}\n.page{max-width:700px;width:100%;padding:2rem}\nh1{font-size:1.4rem;font-weight:700;margin-bottom:.3rem}\nh1 span{color:var(--accent)}\n.sub{color:var(--text2);font-size:.82rem;margin-bottom:2rem}\n.grid{display:grid;gap:.8rem}\na.card{display:block;background:var(--surface);border:1px solid var(--border);border-radius:8px;\n  padding:1rem 1.2rem;text-decoration:none;color:var(--text);transition:border-color .2s,transform .15s}\na.card:hover{border-color:var(--accent);transform:translateY(-2px)}\n.card .title{font-size:.95rem;font-weight:600;margin-bottom:.3rem;display:flex;align-items:center;gap:.5rem}\n.card .title .tag{font-size:.6rem;padding:.15rem .4rem;border-radius:3px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}\n.tag-bps{background:rgba(108,140,255,.15);color:var(--accent)}\n.tag-align{background:rgba(74,222,128,.15);color:var(--green)}\n.tag-r2c{background:rgba(34,211,238,.15);color:#22d3ee}\n.tag-runtime{background:rgba(248,113,113,.15);color:#f87171}\n.tag-compare{background:rgba(168,85,247,.15);color:var(--purple)}\n.tag-legacy{background:rgba(251,191,36,.12);color:var(--amber)}\n.tag-learn{background:rgba(244,114,182,.15);color:#f472b6}\n.card .desc{font-size:.75rem;color:var(--text2);line-height:1.5}\n.card .files{font-size:.65rem;color:var(--text2);margin-top:.4rem;opacity:.6}\n.footer{margin-top:2rem;font-size:.7rem;color:var(--text2);text-align:center}\n.footer a{color:var(--accent);text-decoration:none}\n</style>\n</head>\n<body>\n<div class=\"page\">\n  <h1><span>SvABA</span> Viewers</h1>\n  <div class=\"sub\">Browser-based tools for exploring svaba output. All run client-side &mdash; no server required.</div>\n\n  <div class=\"grid\">\n    <a class=\"card\" href=\"bps_explorer.html\">\n      <div class=\"title\">BPS Explorer <span class=\"tag tag-bps\">bps.txt.gz</span></div>\n      <div class=\"desc\">\n        Dark, compact table-first viewer for <code>bps.txt.gz</code> files.\n        Sortable columns, numeric filters (somlod, maxlod, qual, span range),\n        genomic region search, chip filters for type/evidence/conf/somatic,\n        summary histograms, per-sample detail panel. Handles both legacy\n        41-col and SvABA2.0 51-col formats. Drag-and-drop or file picker.\n      </div>\n    </a>\n\n    <a class=\"card\" href=\"r2c_explorer.html\">\n      <div class=\"title\">R2C Explorer <span class=\"tag tag-r2c\">r2c.txt.gz</span></div>\n      <div class=\"desc\">\n        Browser-side re-plotter for the structured r2c TSV emitted by\n        <code>svaba run --dump-reads</code> (or the PASS / PASS-somatic\n        subsets from <code>svaba_postprocess.sh</code>). Load the file,\n        type/search for a contig name (autocomplete from the file's own\n        list of cnames), and get the alignments-style plot generated\n        fresh from the TSV: ruler, contig sequence, per-fragment\n        summaries, breakpoint rows, and per-read gap-expanded CIGAR\n        renderings with support-kind color-coding. Prev/Next/Random\n        navigation plus imperfect-only and support-kind filters.\n        Successor to the old <code>alignments.txt.gz</code> ASCII dump.\n      </div>\n    </a>\n\n    <a class=\"card\" href=\"alignments_viewer.html\">\n      <div class=\"title\">Alignments Viewer (legacy) <span class=\"tag tag-legacy\">alignments.txt.gz</span></div>\n      <div class=\"desc\">\n        Original ASCII-plot viewer for <code>*.alignments.txt.gz</code>\n        from svaba runs <em>before</em> the r2c migration. New runs no\n        longer produce <code>alignments.txt.gz</code> — prefer the R2C\n        Explorer above. Kept for rendering historical outputs.\n      </div>\n    </a>\n\n    <a class=\"card\" href=\"learn_explorer.html\">\n      <div class=\"title\">Learn Explorer <span class=\"tag tag-learn\">learn.tsv.gz</span></div>\n      <div class=\"desc\">\n        Interactive viewer for BAM learning data &mdash; per-read-group\n        insert-size distributions emitted by <code>svaba run</code> as\n        <code>${ID}.*.learn.tsv.gz</code>. Overlaid + faceted histograms,\n        sortable summary table (n, mean, median, SD, percentiles), RG chip\n        filters, click-to-solo. Drag-and-drop the gzipped TSV to explore.\n      </div>\n    </a>\n\n    <a class=\"card\" href=\"runtime_explorer.html\">\n      <div class=\"title\">Runtime Explorer <span class=\"tag tag-runtime\">runtime.txt</span></div>\n      <div class=\"desc\">\n        Explore per-region timing from <code>${ID}.runtime.txt</code>.\n        Sort regions by runtime, contigs, or breakpoint count; filter by\n        chromosome, region, runtime threshold, or contig / discordant-read\n        minimums. Prominent runtime-distribution histogram plus auxiliary\n        contig / discordant histograms with independent log10 toggles. Click\n        a region's locus to jump IGV to it (requires IGV on port 60151).\n        Standard-chr filter drops decoy / alt / random / HLA contigs.\n      </div>\n    </a>\n\n    <a class=\"card\" href=\"comparison.html\">\n      <div class=\"title\">Run Comparison <span class=\"tag tag-compare\">2&times; bps.txt.gz</span></div>\n      <div class=\"desc\">\n        Side-by-side comparison of two svaba runs (e.g. before/after a parameter\n        change, or tumor vs matched). Load two <code>bps.txt.gz</code> files,\n        match calls by locus, and see which are shared vs unique to each run.\n        Charts for agreement rates and score distributions.\n      </div>\n    </a>\n\n    <a class=\"card\" href=\"bps_viewer.html\">\n      <div class=\"title\">BPS Viewer (original) <span class=\"tag tag-legacy\">legacy</span></div>\n      <div class=\"desc\">\n        The original light-theme BPS viewer. Filter by LOD, confidence,\n        event type, and evidence. Per-sample support drill-down. Requires\n        <code>app.js</code> and <code>styles.css</code> alongside it.\n      </div>\n      <div class=\"files\">Files: bps_viewer.html + app.js + styles.css</div>\n    </a>\n  </div>\n\n  <div class=\"footer\">\n    SvABA &mdash; SV and indel detection by assembly &mdash;\n    <a href=\"https://github.com/walaj/svaba\">github.com/walaj/svaba</a>\n  </div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/learn_explorer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>SvABA Learn Explorer</title>\n<style>\n:root {\n  --bg: #0f1117; --surface: #1a1d27; --surface2: #252833;\n  --border: #2e3140; --text: #e1e4ed; --text2: #8b8fa3;\n  --accent: #6c8cff; --green: #4ade80; --red: #f87171; --amber: #fbbf24;\n  --blue: #60a5fa; --purple: #a855f7; --cyan: #22d3ee; --pink: #f472b6;\n}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:'SF Mono','Fira Code','Consolas',monospace;background:var(--bg);color:var(--text);min-height:100vh;font-size:12px}\n.header{display:flex;align-items:center;justify-content:space-between;padding:.6rem 1rem;border-bottom:1px solid var(--border);background:var(--surface)}\n.header h1{font-size:1rem;font-weight:600} .header h1 span{color:var(--accent)}\n.header .meta{font-size:.75rem;color:var(--text2)}\n\n/* Upload */\n.upload-row{display:flex;gap:.8rem;align-items:center;padding:.6rem 1rem;background:var(--surface);border-bottom:1px solid var(--border)}\n.upload-box{background:var(--surface2);border:2px dashed var(--border);border-radius:6px;padding:.6rem 1rem;cursor:pointer;transition:border-color .2s;font-size:.78rem;color:var(--text2);flex:1;text-align:center;max-width:600px}\n.upload-box:hover,.upload-box.over{border-color:var(--accent)}\n.upload-box.loaded{border-color:var(--green);border-style:solid}\n.upload-box input{display:none}\n.upload-box .fn{color:var(--green);font-size:.72rem;margin-top:.2rem;word-break:break-all}\n\n/* Stats bar */\n.stats-bar{display:flex;gap:1.2rem;padding:.4rem 1rem;background:var(--surface);border-bottom:1px solid var(--border);font-size:.75rem;color:var(--text2);flex-wrap:wrap}\n.stats-bar .sv{color:var(--accent);font-weight:600}\n\n/* Controls */\n.controls{display:flex;flex-wrap:wrap;gap:.5rem .8rem;padding:.5rem 1rem;background:var(--surface);border-bottom:1px solid var(--border);align-items:end}\n.ctrl{display:flex;flex-direction:column;gap:.2rem}\n.ctrl label{font-size:.65rem;color:var(--text2);text-transform:uppercase;letter-spacing:.05em}\n.ctrl input,.ctrl select{background:var(--surface2);border:1px solid var(--border);border-radius:4px;padding:.3rem .5rem;font-family:inherit;font-size:.78rem;color:var(--text)}\n.ctrl input[type=number]{width:80px}\n.ctrl input:focus,.ctrl select:focus{outline:none;border-color:var(--accent)}\n.chip{padding:.2rem .5rem;border-radius:4px;border:1px solid var(--border);font-size:.7rem;cursor:pointer;color:var(--text2);background:var(--surface2);display:inline-flex;align-items:center;gap:.3rem}\n.chip:hover{border-color:var(--accent);color:var(--text)}\n.chip.on{background:rgba(108,140,255,.15);border-color:var(--accent);color:var(--accent)}\n.chip .cnt{font-size:.6rem;opacity:.6}\n\n/* Charts */\n.charts-area{padding:.5rem 1rem;background:var(--bg)}\n.chart-row{display:grid;gap:.5rem;margin-bottom:.5rem}\n.chart-row.hero{grid-template-columns:1fr}\n.chart-row.hero .chart-card{min-height:260px}\n.chart-row.hero canvas{height:230px}\n.chart-row.grid2{grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}\n.chart-card{background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:.4rem .5rem;min-height:160px;position:relative}\n.chart-card .ct{font-size:.65rem;color:var(--text2);text-transform:uppercase;letter-spacing:.04em;margin-bottom:.3rem;display:flex;align-items:center;justify-content:space-between;gap:.3rem}\n.chart-card canvas{width:100%;height:140px;display:block}\n.log-tog{background:transparent;border:1px solid var(--border);color:var(--text2);font-size:.6rem;padding:1px 5px;border-radius:3px;cursor:pointer;font-family:inherit;text-transform:none;letter-spacing:0;line-height:1.1}\n.log-tog:hover{border-color:var(--accent);color:var(--text)}\n.log-tog.on{background:rgba(108,140,255,.15);border-color:var(--accent);color:var(--accent)}\n\n/* Table */\n.table-wrap{overflow:auto;background:var(--surface);border:1px solid var(--border);border-radius:6px;margin:.5rem 1rem;max-height:calc(100vh - 480px)}\ntable{width:100%;border-collapse:collapse;white-space:nowrap}\nth{background:var(--surface2);color:var(--text2);text-align:left;padding:.3rem .5rem;position:sticky;top:0;cursor:pointer;user-select:none;z-index:1;font-size:.72rem;text-transform:uppercase;letter-spacing:.03em}\nth:hover{color:var(--accent)}\nth .sa{font-size:.6em;margin-left:.15rem;opacity:.5}\ntd{padding:.3rem .5rem;border-top:1px solid rgba(46,49,64,.5);font-size:.75rem}\ntr:hover td{background:var(--surface2)}\ntr.sel td{background:#1e3a5f !important}\ntr{cursor:pointer}\ntd.num{text-align:right;font-variant-numeric:tabular-nums}\n::selection{background:#3b5bdb;color:#fff}\n.swatch{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:.3rem}\n\n.footer{margin-top:1rem;padding:.6rem 1rem;font-size:.7rem;color:var(--text2);text-align:center;border-top:1px solid var(--border)}\n.footer a{color:var(--accent);text-decoration:none}\n#content{display:none}\n</style>\n</head>\n<body>\n\n<div class=\"header\">\n  <h1><span>SvABA</span> Learn Explorer</h1>\n  <div class=\"meta\" id=\"file-meta\">No file loaded</div>\n</div>\n\n<div class=\"upload-row\">\n  <div class=\"upload-box\" id=\"drop-zone\" onclick=\"document.getElementById('file-input').click()\">\n    Drop or click &mdash; <code>*.learn.tsv.gz</code> (columns: bam, rg, isize)\n    <div class=\"fn\" id=\"file-name\" style=\"display:none\"></div>\n    <input type=\"file\" id=\"file-input\" accept=\".tsv,.gz,.tsv.gz,text/plain,application/gzip\">\n  </div>\n</div>\n\n<div id=\"content\">\n  <div class=\"stats-bar\" id=\"stats-bar\"></div>\n\n  <div class=\"controls\" id=\"controls\">\n    <div class=\"ctrl\"><label>RG filter</label><div id=\"rg-chips\" style=\"display:flex;flex-wrap:wrap;gap:.3rem;max-width:800px\"></div></div>\n    <div class=\"ctrl\"><label>Bins</label><input id=\"f-bins\" type=\"number\" value=\"80\" min=\"10\" max=\"500\"></div>\n    <div class=\"ctrl\"><label>Trim outliers (%)</label><input id=\"f-trim\" type=\"number\" value=\"2\" min=\"0\" max=\"20\" step=\"0.5\" title=\"Exclude top N% of isize values from display range\"></div>\n  </div>\n\n  <!-- Combined overlay histogram -->\n  <div class=\"charts-area\">\n    <div class=\"chart-row hero\">\n      <div class=\"chart-card\">\n        <div class=\"ct\">\n          Insert size distribution (all selected RGs overlaid)\n          <button class=\"log-tog\" id=\"tog-log-main\" title=\"Toggle log10 Y axis\">log Y</button>\n        </div>\n        <canvas id=\"chart-main\"></canvas>\n      </div>\n    </div>\n    <!-- Per-RG faceted histograms -->\n    <div class=\"chart-row grid2\" id=\"facet-row\"></div>\n  </div>\n\n  <div class=\"table-wrap\">\n    <table>\n      <thead id=\"thead\"></thead>\n      <tbody id=\"tbody\"></tbody>\n    </table>\n  </div>\n</div>\n\n<div class=\"footer\">\n  SvABA &mdash; Learn Explorer &mdash;\n  <a href=\"index.html\">&larr; all viewers</a> &mdash;\n  <a href=\"https://github.com/walaj/svaba\">github.com/walaj/svaba</a>\n</div>\n\n<script>\n/* ===================================================================\n   SvABA Learn Explorer — interactive isize distribution viewer\n   Single-file, no external dependencies (Canvas2D histograms).\n   =================================================================== */\n\nconst PALETTE = [\n  '#6c8cff','#4ade80','#f87171','#fbbf24','#a855f7',\n  '#22d3ee','#f472b6','#fb923c','#34d399','#818cf8',\n  '#e879f9','#facc15','#38bdf8','#f43f5e','#a3e635',\n  '#c084fc','#2dd4bf','#fb7185','#84cc16','#e2e8f0'\n];\n\nlet DATA = [];      // [{bam, rg, isize}]\nlet RG_STATS = [];  // [{rg, n, mean, median, sd, p01, p99, color}]\nlet activeRGs = new Set();\nlet sortCol = 'n', sortDir = -1;\nlet logYMain = false;\n\n// ---- file loading ----\nconst dropZone = document.getElementById('drop-zone');\nconst fileInput = document.getElementById('file-input');\n\ndropZone.addEventListener('dragover', e => { e.preventDefault(); dropZone.classList.add('over'); });\ndropZone.addEventListener('dragleave', () => dropZone.classList.remove('over'));\ndropZone.addEventListener('drop', e => { e.preventDefault(); dropZone.classList.remove('over'); handleFile(e.dataTransfer.files[0]); });\nfileInput.addEventListener('change', () => { if (fileInput.files.length) handleFile(fileInput.files[0]); });\n\nasync function handleFile(file) {\n  const fn = file.name;\n  document.getElementById('file-name').textContent = fn;\n  document.getElementById('file-name').style.display = 'block';\n  dropZone.classList.add('loaded');\n  document.getElementById('file-meta').textContent = 'Loading ' + fn + '…';\n\n  let text;\n  if (fn.endsWith('.gz')) {\n    const buf = await file.arrayBuffer();\n    const ds = new DecompressionStream('gzip');\n    const reader = new Blob([buf]).stream().pipeThrough(ds).getReader();\n    const chunks = [];\n    while (true) {\n      const {done, value} = await reader.read();\n      if (done) break;\n      chunks.push(value);\n    }\n    text = new TextDecoder().decode(await new Blob(chunks).arrayBuffer());\n  } else {\n    text = await file.text();\n  }\n\n  parseTSV(text);\n  document.getElementById('file-meta').textContent = fn;\n  document.getElementById('content').style.display = 'block';\n  buildUI();\n}\n\nfunction parseTSV(text) {\n  DATA = [];\n  const lines = text.split('\\n');\n  let headerParsed = false;\n  let colBam = 0, colRg = 1, colIsize = 2;\n  for (const line of lines) {\n    if (!line.trim()) continue;\n    const parts = line.split('\\t');\n    if (!headerParsed) {\n      // detect header\n      if (parts[0] === 'bam' || parts[0] === '#bam') {\n        // map column names\n        for (let i = 0; i < parts.length; i++) {\n          const c = parts[i].replace(/^#/, '').toLowerCase();\n          if (c === 'bam') colBam = i;\n          else if (c === 'rg') colRg = i;\n          else if (c === 'isize') colIsize = i;\n        }\n        headerParsed = true;\n        continue;\n      }\n      headerParsed = true;\n    }\n    const isize = parseInt(parts[colIsize], 10);\n    if (isNaN(isize) || isize <= 0) continue;\n    DATA.push({ bam: parts[colBam] || '', rg: parts[colRg] || 'NA', isize });\n  }\n}\n\nfunction computeStats() {\n  const byRG = {};\n  for (const d of DATA) {\n    if (!byRG[d.rg]) byRG[d.rg] = [];\n    byRG[d.rg].push(d.isize);\n  }\n  RG_STATS = [];\n  const rgs = Object.keys(byRG).sort();\n  rgs.forEach((rg, i) => {\n    const arr = byRG[rg].slice().sort((a, b) => a - b);\n    const n = arr.length;\n    const mean = arr.reduce((s, v) => s + v, 0) / n;\n    const median = n % 2 ? arr[(n - 1) / 2] : (arr[n / 2 - 1] + arr[n / 2]) / 2;\n    const sd = Math.sqrt(arr.reduce((s, v) => s + (v - mean) ** 2, 0) / n);\n    const p01 = arr[Math.floor(n * 0.01)] || arr[0];\n    const p99 = arr[Math.min(Math.floor(n * 0.99), n - 1)];\n    RG_STATS.push({ rg, n, mean, median, sd, p01, p99, color: PALETTE[i % PALETTE.length], values: arr });\n  });\n  activeRGs = new Set(RG_STATS.map(r => r.rg));\n}\n\n// ---- UI ----\nfunction buildUI() {\n  computeStats();\n  renderStats();\n  renderChips();\n  renderTable();\n  renderMainChart();\n  renderFacets();\n\n  document.getElementById('f-bins').addEventListener('input', () => { renderMainChart(); renderFacets(); });\n  document.getElementById('f-trim').addEventListener('input', () => { renderMainChart(); renderFacets(); });\n  document.getElementById('tog-log-main').addEventListener('click', function() {\n    logYMain = !logYMain;\n    this.classList.toggle('on', logYMain);\n    renderMainChart();\n  });\n}\n\nfunction renderStats() {\n  const nRG = RG_STATS.length;\n  const nObs = DATA.length;\n  const bams = new Set(DATA.map(d => d.bam));\n  document.getElementById('stats-bar').innerHTML =\n    `<span><span class=\"sv\">${nObs.toLocaleString()}</span> observations</span>` +\n    `<span><span class=\"sv\">${nRG}</span> read groups</span>` +\n    `<span><span class=\"sv\">${bams.size}</span> BAM source${bams.size > 1 ? 's' : ''}</span>`;\n}\n\nfunction renderChips() {\n  const box = document.getElementById('rg-chips');\n  box.innerHTML = '';\n  // \"all\" toggle\n  const allChip = document.createElement('span');\n  allChip.className = 'chip on';\n  allChip.textContent = 'All';\n  allChip.addEventListener('click', () => {\n    if (activeRGs.size === RG_STATS.length) {\n      activeRGs.clear();\n    } else {\n      activeRGs = new Set(RG_STATS.map(r => r.rg));\n    }\n    syncChips(); renderMainChart(); renderFacets(); renderTable();\n  });\n  box.appendChild(allChip);\n\n  for (const s of RG_STATS) {\n    const chip = document.createElement('span');\n    chip.className = 'chip' + (activeRGs.has(s.rg) ? ' on' : '');\n    chip.dataset.rg = s.rg;\n    chip.innerHTML = `<span class=\"swatch\" style=\"background:${s.color}\"></span>${s.rg} <span class=\"cnt\">${s.n.toLocaleString()}</span>`;\n    chip.addEventListener('click', () => {\n      if (activeRGs.has(s.rg)) activeRGs.delete(s.rg); else activeRGs.add(s.rg);\n      syncChips(); renderMainChart(); renderFacets(); renderTable();\n    });\n    box.appendChild(chip);\n  }\n}\n\nfunction syncChips() {\n  for (const chip of document.querySelectorAll('#rg-chips .chip')) {\n    if (chip.dataset.rg) {\n      chip.classList.toggle('on', activeRGs.has(chip.dataset.rg));\n    } else {\n      chip.classList.toggle('on', activeRGs.size === RG_STATS.length);\n    }\n  }\n}\n\n// ---- table ----\nconst COLS = [\n  { key: 'rg', label: 'Read Group', fmt: v => v },\n  { key: 'n', label: 'N', fmt: v => v.toLocaleString(), num: true },\n  { key: 'mean', label: 'Mean', fmt: v => v.toFixed(1), num: true },\n  { key: 'median', label: 'Median', fmt: v => v.toFixed(1), num: true },\n  { key: 'sd', label: 'SD', fmt: v => v.toFixed(1), num: true },\n  { key: 'p01', label: 'P1', fmt: v => v.toLocaleString(), num: true },\n  { key: 'p99', label: 'P99', fmt: v => v.toLocaleString(), num: true },\n];\n\nfunction renderTable() {\n  const thead = document.getElementById('thead');\n  thead.innerHTML = '<tr>' + COLS.map(c =>\n    `<th data-col=\"${c.key}\">${c.label}<span class=\"sa\">${sortCol === c.key ? (sortDir > 0 ? '▲' : '▼') : ''}</span></th>`\n  ).join('') + '</tr>';\n  thead.querySelectorAll('th').forEach(th => {\n    th.addEventListener('click', () => {\n      const col = th.dataset.col;\n      if (sortCol === col) sortDir *= -1; else { sortCol = col; sortDir = col === 'rg' ? 1 : -1; }\n      renderTable();\n    });\n  });\n\n  const rows = RG_STATS.filter(s => activeRGs.has(s.rg)).slice().sort((a, b) => {\n    const va = a[sortCol], vb = b[sortCol];\n    if (typeof va === 'string') return sortDir * va.localeCompare(vb);\n    return sortDir * (va - vb);\n  });\n\n  const tbody = document.getElementById('tbody');\n  tbody.innerHTML = rows.map(r =>\n    '<tr data-rg=\"' + r.rg + '\">' + COLS.map(c =>\n      `<td class=\"${c.num ? 'num' : ''}\"><span class=\"swatch\" style=\"background:${r.color}\"></span>${c.fmt(r[c.key])}</td>`\n    ).join('') + '</tr>'\n  ).join('');\n\n  tbody.querySelectorAll('tr').forEach(tr => {\n    tr.addEventListener('click', () => {\n      const rg = tr.dataset.rg;\n      // toggle to solo this RG (or back to all if already solo)\n      if (activeRGs.size === 1 && activeRGs.has(rg)) {\n        activeRGs = new Set(RG_STATS.map(r => r.rg));\n      } else {\n        activeRGs = new Set([rg]);\n      }\n      syncChips(); renderMainChart(); renderFacets(); renderTable();\n    });\n  });\n}\n\n// ---- histogram rendering (Canvas 2D) ----\nfunction getBins() { return parseInt(document.getElementById('f-bins').value, 10) || 80; }\n\nfunction histogram(values, nBins, lo, hi) {\n  const binW = (hi - lo) / nBins;\n  const counts = new Array(nBins).fill(0);\n  for (const v of values) {\n    let idx = Math.floor((v - lo) / binW);\n    if (idx < 0) idx = 0;\n    if (idx >= nBins) idx = nBins - 1;\n    counts[idx] = (counts[idx] || 0) + 1;\n  }\n  return { counts, lo, hi, binW };\n}\n\nfunction getTrimPct() { return Math.max(0, Math.min(20, parseFloat(document.getElementById('f-trim').value) || 2)); }\n\nfunction drawHistogram(canvas, datasets, { logY = false, title = '' } = {}) {\n  const ctx = canvas.getContext('2d');\n  const dpr = window.devicePixelRatio || 1;\n  const W = canvas.clientWidth, H = canvas.clientHeight;\n  canvas.width = W * dpr; canvas.height = H * dpr;\n  ctx.scale(dpr, dpr);\n  ctx.clearRect(0, 0, W, H);\n\n  if (!datasets.length) return;\n\n  const nBins = getBins();\n  const trimPct = getTrimPct() / 100;  // e.g. 0.02 for 2%\n\n  // global range across all datasets, trimming outliers\n  let glo = Infinity, ghi = -Infinity;\n  for (const ds of datasets) {\n    if (!ds.values.length) continue;\n    const sorted = ds.values; // already sorted\n    const lo = sorted[Math.floor(sorted.length * trimPct)] || sorted[0];\n    const hi = sorted[Math.min(Math.floor(sorted.length * (1 - trimPct)), sorted.length - 1)];\n    glo = Math.min(glo, lo);\n    ghi = Math.max(ghi, hi);\n  }\n  if (glo >= ghi) return;\n\n  // compute histograms\n  const hists = datasets.map(ds => ({\n    ...histogram(ds.values, nBins, glo, ghi),\n    color: ds.color, label: ds.label\n  }));\n\n  // find max count\n  let maxC = 0;\n  for (const h of hists) for (const c of h.counts) maxC = Math.max(maxC, c);\n  if (logY) maxC = Math.log10(maxC + 1);\n  if (maxC === 0) return;\n\n  // layout\n  const ml = 50, mr = 12, mt = 8, mb = 28;\n  const pw = W - ml - mr, ph = H - mt - mb;\n\n  // axes\n  ctx.strokeStyle = 'rgba(46,49,64,0.8)';\n  ctx.lineWidth = 1;\n  ctx.beginPath();\n  ctx.moveTo(ml, mt); ctx.lineTo(ml, mt + ph); ctx.lineTo(ml + pw, mt + ph);\n  ctx.stroke();\n\n  // Y ticks\n  ctx.fillStyle = '#8b8fa3'; ctx.font = '10px monospace'; ctx.textAlign = 'right';\n  const nYTicks = 5;\n  for (let i = 0; i <= nYTicks; i++) {\n    const frac = i / nYTicks;\n    const y = mt + ph - frac * ph;\n    const val = logY ? Math.pow(10, frac * maxC) - 1 : frac * maxC;\n    ctx.fillText(val < 10 ? val.toFixed(1) : Math.round(val).toLocaleString(), ml - 4, y + 3);\n    if (i > 0) {\n      ctx.strokeStyle = 'rgba(46,49,64,0.4)';\n      ctx.beginPath(); ctx.moveTo(ml, y); ctx.lineTo(ml + pw, y); ctx.stroke();\n    }\n  }\n\n  // X ticks\n  ctx.textAlign = 'center';\n  const nXTicks = Math.min(8, nBins);\n  for (let i = 0; i <= nXTicks; i++) {\n    const frac = i / nXTicks;\n    const x = ml + frac * pw;\n    const val = glo + frac * (ghi - glo);\n    ctx.fillStyle = '#8b8fa3';\n    ctx.fillText(Math.round(val).toLocaleString(), x, mt + ph + 14);\n  }\n\n  // draw bars (stacked alpha for overlay)\n  const barW = pw / nBins;\n  for (const h of hists) {\n    ctx.fillStyle = h.color;\n    ctx.globalAlpha = datasets.length > 1 ? 0.45 : 0.7;\n    for (let i = 0; i < nBins; i++) {\n      if (h.counts[i] === 0) continue;\n      const val = logY ? Math.log10(h.counts[i] + 1) : h.counts[i];\n      const barH = (val / maxC) * ph;\n      const x = ml + i * barW;\n      ctx.fillRect(x, mt + ph - barH, Math.max(barW - 0.5, 1), barH);\n    }\n  }\n  ctx.globalAlpha = 1;\n\n  // x-axis label\n  ctx.fillStyle = '#8b8fa3'; ctx.font = '9px monospace'; ctx.textAlign = 'center';\n  ctx.fillText('insert size (bp)', ml + pw / 2, H - 2);\n\n  // legend if multiple\n  if (datasets.length > 1 && datasets.length <= 8) {\n    let lx = ml + 8, ly = mt + 14;\n    ctx.font = '9px monospace'; ctx.textAlign = 'left';\n    for (const h of hists) {\n      ctx.fillStyle = h.color; ctx.globalAlpha = 0.8;\n      ctx.fillRect(lx, ly - 7, 8, 8);\n      ctx.globalAlpha = 1; ctx.fillStyle = '#e1e4ed';\n      ctx.fillText(h.label, lx + 12, ly);\n      ly += 13;\n    }\n  }\n}\n\nfunction renderMainChart() {\n  const canvas = document.getElementById('chart-main');\n  const datasets = RG_STATS\n    .filter(s => activeRGs.has(s.rg))\n    .map(s => ({ values: s.values, color: s.color, label: s.rg }));\n  drawHistogram(canvas, datasets, { logY: logYMain });\n}\n\nfunction renderFacets() {\n  const row = document.getElementById('facet-row');\n  row.innerHTML = '';\n  const active = RG_STATS.filter(s => activeRGs.has(s.rg));\n  // only show facets if there are multiple active RGs (otherwise the main chart is enough)\n  if (active.length <= 1) return;\n  for (const s of active) {\n    const card = document.createElement('div');\n    card.className = 'chart-card';\n    const label = `${s.rg}  (n=${s.n.toLocaleString()}, μ=${s.mean.toFixed(0)}, σ=${s.sd.toFixed(0)})`;\n    card.innerHTML = `<div class=\"ct\">${label}</div><canvas style=\"height:120px\"></canvas>`;\n    row.appendChild(card);\n    const cvs = card.querySelector('canvas');\n    // defer render to next frame so layout is settled\n    requestAnimationFrame(() => {\n      drawHistogram(cvs, [{ values: s.values, color: s.color, label: s.rg }]);\n    });\n  }\n}\n\n// resize handler\nwindow.addEventListener('resize', () => { renderMainChart(); renderFacets(); });\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/r2c_explorer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>SvABA R2C Explorer</title>\n<style>\n:root {\n  --bg: #0f1117; --surface: #1a1d27; --surface2: #252833;\n  --border: #2e3140; --text: #e1e4ed; --text2: #8b8fa3;\n  --accent: #6c8cff; --green: #4ade80; --red: #f87171; --amber: #fbbf24;\n  --blue: #60a5fa; --purple: #a855f7;\n}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:'SF Mono','Fira Code','Consolas',monospace;background:var(--bg);color:var(--text);min-height:100vh;font-size:12px}\n.header{display:flex;align-items:center;justify-content:space-between;padding:.6rem 1rem;border-bottom:1px solid var(--border);background:var(--surface)}\n.header h1{font-size:1rem;font-weight:600} .header h1 span{color:var(--accent)}\n.header .meta{font-size:.75rem;color:var(--text2)}\n\n/* Upload */\n.upload-row{display:flex;gap:.8rem;align-items:center;padding:.6rem 1rem;background:var(--surface);border-bottom:1px solid var(--border)}\n.upload-box{background:var(--surface2);border:2px dashed var(--border);border-radius:6px;padding:.6rem 1rem;cursor:pointer;transition:border-color .2s;font-size:.78rem;color:var(--text2);flex:1;text-align:center;max-width:480px}\n.upload-box:hover,.upload-box.over{border-color:var(--accent)}\n.upload-box.loaded{border-color:var(--green);border-style:solid}\n.upload-box input{display:none}\n.upload-box .fn{color:var(--green);font-size:.72rem;margin-top:.2rem;word-break:break-all}\n.btn{background:var(--accent);color:#fff;border:none;border-radius:5px;padding:.35rem .8rem;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit}\n.btn:hover{opacity:.9} .btn:disabled{opacity:.4;cursor:not-allowed}\n.btn-ghost{background:transparent;border:1px solid var(--border);color:var(--text2)}\n.btn-ghost:hover{border-color:var(--accent);color:var(--text)}\n\n/* Controls */\n.controls{display:flex;flex-wrap:wrap;gap:.5rem .8rem;padding:.5rem 1rem;background:var(--surface);border-bottom:1px solid var(--border);align-items:center}\n.ctrl{display:flex;flex-direction:column;gap:.2rem}\n.ctrl label{font-size:.65rem;color:var(--text2);text-transform:uppercase;letter-spacing:.05em}\n.ctrl input,.ctrl select{background:var(--surface2);border:1px solid var(--border);border-radius:4px;padding:.3rem .5rem;font-family:inherit;font-size:.78rem;color:var(--text)}\n.ctrl input:focus,.ctrl select:focus{outline:none;border-color:var(--accent)}\n.ctrl input[type=search]{width:420px}\n.ctrl .row{display:flex;gap:.3rem;align-items:center}\n.nav-group{display:flex;gap:.25rem;align-items:center}\n.nav-group .counter{font-size:.72rem;color:var(--text2);min-width:8ch;text-align:center}\n.tog-row{display:flex;gap:.7rem;align-items:center;font-size:.72rem;color:var(--text2)}\n.tog-row label{display:flex;gap:.2rem;align-items:center;cursor:pointer}\n\n/* Legend */\n.legend{display:flex;flex-wrap:wrap;gap:.4rem;padding:.35rem 1rem;font-size:.68rem;color:var(--text2);background:var(--surface2);border-bottom:1px solid var(--border);align-items:center}\n.legend .sw{padding:1px 6px;border-radius:3px;cursor:pointer;user-select:none}\n.legend .sw[data-on=\"0\"]{opacity:.3}\n.legend .support-legend{display:flex;gap:.5rem;margin-left:auto}\n.legend .support-legend span{padding:1px 5px;border-radius:3px;border-left:3px solid transparent}\n.legend .support-legend span.split{border-left-color:var(--green)}\n.legend .support-legend span.disc {border-left-color:var(--blue)}\n.legend .support-legend span.both {border-left-color:var(--purple)}\n.legend .support-legend span.none {border-left-color:#555}\n\n/* Plot */\n.panel{margin:.5rem 1rem;background:var(--surface);border:1px solid var(--border);border-radius:6px;overflow:hidden;min-height:140px}\n.panel-header{background:var(--surface2);padding:.4rem .8rem;font-size:.72rem;color:var(--text2);text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:.6rem}\n.panel-header strong{color:var(--text);text-transform:none;letter-spacing:0;font-family:inherit}\n.panel-header .hscroll-info{margin-left:auto;display:none;align-items:center;gap:.5rem;font-size:.68rem;color:var(--text2)}\n.panel-header .hscroll-info .hscroll-track{width:120px;height:6px;background:var(--border);border-radius:3px;position:relative;overflow:hidden}\n.panel-header .hscroll-info .hscroll-thumb{position:absolute;top:0;height:100%;background:var(--accent);border-radius:3px;opacity:.6;min-width:8px;transition:left .05s,width .05s}\n.panel-body{max-height:calc(100vh - 220px);overflow:auto;padding:.4rem .6rem;background:#0b0d13}\n.panel-body::-webkit-scrollbar{width:10px;height:10px}\n.panel-body::-webkit-scrollbar-track{background:#0b0d13}\n.panel-body::-webkit-scrollbar-thumb{background:var(--border);border-radius:5px}\n.panel-body::-webkit-scrollbar-thumb:hover{background:var(--text2)}\n.panel-body::-webkit-scrollbar-corner{background:#0b0d13}\n.panel-body .empty{padding:.8rem;text-align:center;color:var(--text2);font-size:.78rem}\n.r2c-pre{font-family:'SF Mono','Fira Code','Consolas',monospace;font-size:11px;line-height:1.15;white-space:pre;color:var(--text)}\n.r2c-pre .row{display:block;padding:0 2px;border-left:3px solid transparent}\n.r2c-pre .row.contig{background:#16321a;color:#b6e8c0;font-weight:600}\n.r2c-pre .row.frag{background:#1f2a3a;color:#d0dbf2}\n.r2c-pre .row.bp{background:#2d1b1b;color:#f1c2c2}\n.r2c-pre .row.marker{color:#f1c2c2;background:#1a0f0f}\n.r2c-pre .row.ruler{color:var(--text2);opacity:.5}\n.r2c-pre .row.read.support-split{border-left-color:var(--green)}\n.r2c-pre .row.read.support-disc{border-left-color:var(--blue)}\n.r2c-pre .row.read.support-both{border-left-color:var(--purple)}\n.r2c-pre .row.read.support-none{border-left-color:#555}\n.r2c-pre .row.read .meta{color:var(--text2);margin-left:1ch}\n::selection{background:#3b5bdb;color:#fff}\n\n.status{padding:.3rem 1rem;font-size:.7rem;color:var(--text2);background:var(--surface);border-top:1px solid var(--border)}\n.err{color:var(--red)}\n</style>\n</head>\n<body>\n\n<div class=\"header\">\n  <h1><span>SvABA</span> R2C Explorer</h1>\n  <div class=\"meta\" id=\"file-meta\">No file loaded</div>\n</div>\n\n<div class=\"upload-row\">\n  <div class=\"upload-box\" id=\"drop-zone\" onclick=\"document.getElementById('file-input').click()\">\n    Drop or click &mdash; <code>.r2c.txt.gz</code> / <code>.r2c.pass.txt.gz</code> / <code>.r2c.pass.somatic.txt.gz</code>\n    <div class=\"fn\" id=\"file-name\" style=\"display:none\"></div>\n    <input type=\"file\" id=\"file-input\" accept=\".txt,.tsv,.gz,text/plain,application/gzip\">\n  </div>\n</div>\n\n<div class=\"controls\" id=\"controls\" style=\"display:none\">\n  <div class=\"ctrl\">\n    <label>Contig name</label>\n    <div class=\"row\">\n      <input id=\"f-cname\" type=\"search\" list=\"cname-list\" placeholder=\"start typing a cname, e.g. c_chr7_…\">\n      <datalist id=\"cname-list\"></datalist>\n    </div>\n  </div>\n  <div class=\"nav-group\">\n    <button class=\"btn-ghost btn\" id=\"prev-btn\" title=\"Previous contig (by sort order)\">&lsaquo; Prev</button>\n    <button class=\"btn-ghost btn\" id=\"next-btn\" title=\"Next contig\">Next &rsaquo;</button>\n    <button class=\"btn-ghost btn\" id=\"rand-btn\" title=\"Jump to a random contig\">Random</button>\n    <span class=\"counter\" id=\"counter\">-</span>\n  </div>\n  <div class=\"ctrl\">\n    <label>Filters</label>\n    <div class=\"tog-row\">\n      <label title=\"Show only reads whose r2c CIGAR contains I or D operators\">\n        <input type=\"checkbox\" id=\"imperfect-only\"> imperfect only\n      </label>\n      <span style=\"color:var(--text2)\">support:</span>\n      <label><input type=\"checkbox\" id=\"show-split\" checked> split</label>\n      <label><input type=\"checkbox\" id=\"show-disc\"  checked> disc</label>\n      <label><input type=\"checkbox\" id=\"show-both\"  checked> both</label>\n      <label><input type=\"checkbox\" id=\"show-none\"  checked> none</label>\n    </div>\n    <div class=\"tog-row\" id=\"bp-id-row\" style=\"display:none;margin-top:.25rem\">\n      <span style=\"color:var(--text2)\" title=\"Restrict to reads supporting one specific breakpoint on this contig. Requires a v3 r2c file with split_bps/disc_bps columns.\">bp_id:</span>\n      <select id=\"f-bp-id\">\n        <option value=\"\">all (any bp)</option>\n      </select>\n    </div>\n  </div>\n</div>\n\n<div class=\"legend\" id=\"legend\" style=\"display:none\">\n  <span id=\"source-legend-label\" style=\"color:var(--text2)\">source:</span>\n  <span id=\"source-legend\"></span>\n  <div class=\"support-legend\" title=\"border-left color indicates the variant-support kind per read\">\n    <span class=\"split\">split</span>\n    <span class=\"disc\">disc</span>\n    <span class=\"both\">both</span>\n    <span class=\"none\">none</span>\n  </div>\n</div>\n\n<div class=\"panel\" id=\"panel\" style=\"display:none\">\n  <div class=\"panel-header\">\n    <span>Contig</span>\n    <strong id=\"panel-title\">-</strong>\n    <span class=\"hscroll-info\" id=\"hscroll-info\">\n      <span id=\"hscroll-pos\">col 0</span>\n      <span class=\"hscroll-track\"><span class=\"hscroll-thumb\" id=\"hscroll-thumb\"></span></span>\n      <span id=\"hscroll-width\"></span>\n    </span>\n  </div>\n  <div class=\"panel-body\" id=\"panel-body\">\n    <div class=\"empty\">Load an r2c file, then type or pick a contig name above.</div>\n  </div>\n</div>\n\n<div class=\"status\" id=\"status\" style=\"display:none\"></div>\n\n<script>\n(function(){\n\"use strict\";\n\n/* ============================================================\n * SvABA R2C Explorer — standalone viewer\n *\n * Replaces the old pre-rendered alignments.txt.gz ASCII dump: loads\n * a structured r2c TSV (emitted by svaba run under --dump-reads,\n * and/or filtered to PASS / PASS-somatic by scripts/svaba_postprocess.sh),\n * indexes rows by contig_name, and on demand re-renders the alignment\n * plot for a chosen contig. Schema is the one documented by\n *   src/svaba/AlignedContig.cpp :: r2cTsvHeader()\n * — 19 tab-separated columns, record-type discriminated (\"contig\" /\n * \"read\"), sharing contig_name as the group key.\n *\n * Rendering logic mirrors the old AlignedContig::printToAlignmentsFile\n * exactly for per-read gap-expansion (leading-S -> lowercase clip\n * placed at start-lead, M -> base, D -> '-', trailing-S -> lowercase\n * tail) so visual output matches what svaba would have emitted in the\n * legacy ASCII file. Ported from the inline r2c sub-panel that used to\n * live in bps_explorer.html; standalone now so loading works without\n * first loading a bps.txt.gz.\n * ============================================================ */\n\nconst R2C = {\n  loaded:false, fn:\"\", byName:new Map(), col:null,\n  cnamesSorted:[], currentCname:null,\n  // Palette matched to alignments_viewer.html / bps_explorer look.\n  palette:[\"#6c8cff\",\"#4ade80\",\"#f87171\",\"#fbbf24\",\"#60a5fa\",\"#a855f7\",\"#f0883e\",\"#22d3ee\",\"#e879f9\",\"#34d399\"],\n  prefixColor:new Map(), prefixCounter:0\n};\n\nconst $ = id => document.getElementById(id);\n\n/* === File load === */\n$(\"file-input\").onchange = e => { const f=e.target.files[0]; if(f) loadBlob(f,f.name); };\n[\"dragenter\",\"dragover\"].forEach(e=>$(\"drop-zone\").addEventListener(e,ev=>{ev.preventDefault();$(\"drop-zone\").classList.add(\"over\")}));\n[\"dragleave\",\"drop\"].forEach(e=>$(\"drop-zone\").addEventListener(e,ev=>{ev.preventDefault();$(\"drop-zone\").classList.remove(\"over\")}));\n$(\"drop-zone\").addEventListener(\"drop\",e=>{const f=e.dataTransfer.files[0];if(f)loadBlob(f,f.name)});\n\nasync function loadBlob(blob,name){\n  $(\"file-meta\").textContent=\"Loading \"+name+\"...\";\n  try{\n    let text;\n    if(name.endsWith(\".gz\")){\n      if(typeof DecompressionStream===\"undefined\") throw new Error(\"Browser lacks DecompressionStream (needs a modern Chrome/Edge/Safari)\");\n      text = await new Response(blob.stream().pipeThrough(new DecompressionStream(\"gzip\"))).text();\n    } else {\n      text = await blob.text();\n    }\n    ingest(text,name);\n  }catch(e){\n    $(\"file-meta\").textContent=\"Error: \"+e.message;\n    $(\"file-meta\").classList.add(\"err\");\n    console.error(e);\n  }\n  $(\"file-input\").value=\"\";\n}\n\n// Canonical column order from AlignedContig::r2cTsvHeader() in\n// src/svaba/AlignedContig.cpp. Used as the fallback schema when the\n// uploaded file has no header row — e.g. when a user `grep`-slices a\n// single contig out of r2c.txt.gz and forgets to `head -1` the header\n// along with it. Schema is versioned in the emitter; if the C++\n// header ever changes column count/order, update here to match.\nconst R2C_CANONICAL_COLS = [\n  \"record_type\",\"contig_name\",\"contig_len\",\"contig_seq\",\"frags\",\"bps\",\"n_reads\",\n  \"read_id\",\"read_chrom\",\"read_pos\",\"read_flag\",\"r2c_cigar\",\"r2c_start\",\n  \"r2c_rc\",\"r2c_nm\",\"support\",\"split_bps\",\"disc_bps\",\"r2c_score\",\"native_score\",\"read_seq\"\n];\n\nfunction ingest(text,name){\n  const t0=performance.now();\n  const lines=text.replace(/\\r\\n?/g,\"\\n\").split(\"\\n\");\n  if(lines.length<1 || (lines.length===1 && !lines[0])) throw new Error(\"r2c file empty\");\n\n  // Header-optional parse. We check whether line 0 is a data row by\n  // looking at its first field — data rows start with \"contig\" or\n  // \"read\" (record_type values), never a column name. If so, use the\n  // canonical schema baked in from the emitter and start iterating at\n  // line 0. Otherwise treat line 0 as the header and start at line 1.\n  const first = lines[0].split(\"\\t\");\n  let hdr, startIdx, headerPresent;\n  if (first[0] === \"contig\" || first[0] === \"read\") {\n    hdr = R2C_CANONICAL_COLS.slice();\n    startIdx = 0;\n    headerPresent = false;\n  } else {\n    hdr = first;\n    startIdx = 1;\n    headerPresent = true;\n  }\n\n  const col = {};\n  hdr.forEach((c,i) => { col[c] = i; });\n  for (const need of [\"record_type\",\"contig_name\",\"read_id\",\"r2c_cigar\",\"r2c_start\",\"r2c_rc\",\"support\",\"read_seq\",\"contig_seq\",\"frags\",\"bps\"]) {\n    if (!(need in col)) throw new Error(\"r2c file missing expected column: \"+need+\" (got: \"+hdr.join(\", \")+\")\");\n  }\n\n  const byName = new Map();\n  let nReads = 0, nContigs = 0;\n  for (let i = startIdx; i < lines.length; i++) {\n    const line = lines[i]; if(!line) continue;\n    const c = line.split(\"\\t\");\n    // Tolerate short rows when we're using the canonical schema against a\n    // header-less slice — as long as we have enough fields to key on\n    // record_type + contig_name, we can still bucket the row.\n    if (c.length < Math.min(hdr.length, 3)) continue;\n    const cname = c[col.contig_name];\n    let entry = byName.get(cname);\n    if (!entry){ entry = {contig:null, reads:[]}; byName.set(cname, entry); }\n    if (c[col.record_type] === \"contig\"){ entry.contig = c; nContigs++; }\n    else if (c[col.record_type] === \"read\"){ entry.reads.push(c); nReads++; }\n  }\n\n  R2C.loaded=true;\n  R2C.fn=name;\n  R2C.byName=byName;\n  R2C.col=col;\n  R2C.prefixColor.clear(); R2C.prefixCounter=0;\n\n  // Keep a sorted list of contig names for prev/next navigation + datalist.\n  R2C.cnamesSorted = Array.from(byName.keys()).sort();\n\n  // Populate <datalist> for the search box (browser autocomplete).\n  const dl=$(\"cname-list\"); dl.innerHTML=\"\";\n  // Cap the datalist size — Chrome gets sluggish above ~5000 options.\n  const dlCap = Math.min(R2C.cnamesSorted.length, 5000);\n  for(let i=0;i<dlCap;i++){\n    const o=document.createElement(\"option\"); o.value=R2C.cnamesSorted[i]; dl.appendChild(o);\n  }\n\n  const ms=(performance.now()-t0).toFixed(0);\n  $(\"drop-zone\").classList.add(\"loaded\");\n  $(\"file-name\").style.display=\"\";\n  $(\"file-name\").textContent=name;\n  $(\"file-meta\").classList.remove(\"err\");\n  const headerNote = headerPresent\n    ? \"\"\n    : \"  ·  no header row — used canonical r2c schema from the emitter\";\n  $(\"file-meta\").textContent = name + \" — \" + byName.size.toLocaleString() + \" contigs, \"\n    + nReads.toLocaleString() + \" read rows — parsed in \" + ms + \"ms\"\n    + (R2C.cnamesSorted.length > dlCap ? \" (autocomplete list capped at 5000)\" : \"\")\n    + headerNote;\n\n  [\"controls\",\"legend\",\"panel\",\"status\"].forEach(id => $(id).style.display = \"\");\n\n  // Auto-select the first contig so the user sees something immediately.\n  if(R2C.cnamesSorted.length){\n    $(\"f-cname\").value = R2C.cnamesSorted[0];\n    renderR2c(R2C.cnamesSorted[0]);\n  }\n  updateCounter();\n}\n\n/* === Contig navigation === */\n$(\"f-cname\").addEventListener(\"input\", e => {\n  const v = e.target.value.trim();\n  if(R2C.byName.has(v)) renderR2c(v);\n  else updateCounter();   // user still typing — don't render yet\n});\n$(\"f-cname\").addEventListener(\"keydown\", e => {\n  if(e.key === \"Enter\"){\n    const v = e.target.value.trim();\n    if(R2C.byName.has(v)) renderR2c(v);\n    else {\n      // Try prefix match — convenience for partial typing.\n      const hit = R2C.cnamesSorted.find(n => n.startsWith(v));\n      if(hit){ $(\"f-cname\").value = hit; renderR2c(hit); }\n      else $(\"status\").textContent = \"No contig matching: \" + v;\n    }\n  }\n});\n$(\"prev-btn\").onclick = () => step(-1);\n$(\"next-btn\").onclick = () => step(+1);\n$(\"rand-btn\").onclick = () => {\n  if(!R2C.cnamesSorted.length) return;\n  const pick = R2C.cnamesSorted[Math.floor(Math.random()*R2C.cnamesSorted.length)];\n  $(\"f-cname\").value = pick; renderR2c(pick);\n};\n\nfunction step(delta){\n  if(!R2C.cnamesSorted.length) return;\n  let idx = R2C.cnamesSorted.indexOf(R2C.currentCname || R2C.cnamesSorted[0]);\n  if(idx<0) idx = 0;\n  idx = (idx + delta + R2C.cnamesSorted.length) % R2C.cnamesSorted.length;\n  const next = R2C.cnamesSorted[idx];\n  $(\"f-cname\").value = next;\n  renderR2c(next);\n}\n\nfunction updateCounter(){\n  if(!R2C.cnamesSorted.length){ $(\"counter\").textContent = \"-\"; return; }\n  const idx = R2C.cnamesSorted.indexOf(R2C.currentCname);\n  $(\"counter\").textContent = (idx<0 ? \"?\" : String(idx+1)) + \" / \" + R2C.cnamesSorted.length;\n}\n\n/* Re-render on filter change */\n[\"imperfect-only\",\"show-split\",\"show-disc\",\"show-both\",\"show-none\",\"f-bp-id\"].forEach(id => {\n  $(id).addEventListener(\"change\", () => { if(R2C.currentCname) renderR2c(R2C.currentCname); });\n});\n\n/* === Rendering === */\nfunction r2cPrefixColor(p){\n  if(!R2C.prefixColor.has(p)){\n    R2C.prefixColor.set(p, R2C.palette[R2C.prefixCounter % R2C.palette.length]);\n    R2C.prefixCounter++;\n  }\n  return R2C.prefixColor.get(p);\n}\n\nfunction renderR2c(cname){\n  R2C.currentCname = cname;\n  const entry = R2C.byName.get(cname);\n  const col   = R2C.col;\n  const body  = $(\"panel-body\");\n  body.innerHTML = \"\";\n  $(\"panel-title\").textContent = cname;\n  updateCounter();\n\n  if(!entry || !entry.contig){\n    body.innerHTML = '<div class=\"empty\">No contig row for this cname in the loaded file.</div>';\n    $(\"status\").textContent = \"\";\n    return;\n  }\n  const contig = entry.contig;\n  const contig_seq = contig[col.contig_seq] || \"\";\n  const contig_len = +(contig[col.contig_len] || contig_seq.length);\n\n  const imperfectOnly = $(\"imperfect-only\").checked;\n  const showSupport = {\n    split: $(\"show-split\").checked,\n    disc:  $(\"show-disc\").checked,\n    both:  $(\"show-both\").checked,\n    none:  $(\"show-none\").checked\n  };\n\n  // Pre-pass: tabulate every source prefix that appears in the file so\n  // we can (a) lock in stable palette colors up-front (r2cPrefixColor\n  // memoizes assignments), and (b) know the full denominator for the\n  // \"shown/total\" label we render on the legend after filters apply.\n  // The legend itself gets rendered AFTER the read loop below so its\n  // counts reflect the visible subset, which is what a user wants when\n  // they pin a bp_id on the dropdown and expect to see \"how many reads\n  // from each sample support this variant\".\n  const allPrefixes = new Map();\n  for(const rr of entry.reads){\n    const id = rr[col.read_id] || \"\";\n    const m  = id.match(/^([a-z]\\d{3})_/i);\n    const p  = m ? m[1] : \"\";\n    if(p) allPrefixes.set(p, (allPrefixes.get(p)||0)+1);\n  }\n  // Lock color assignments early so later swatches are deterministic.\n  for(const p of Array.from(allPrefixes.keys()).sort()) r2cPrefixColor(p);\n\n  const pre = document.createElement(\"pre\");\n  pre.className = \"r2c-pre\";\n\n  // Ruler + contig row\n  {\n    const ruler = document.createElement(\"span\");\n    ruler.className = \"row ruler\";\n    const marks = [];\n    for(let i=0;i<contig_len;i+=10) marks.push(String(i).padEnd(10,\" \"));\n    ruler.textContent = marks.join(\"\").slice(0,contig_len) + \"  (contig 0-based)\";\n    pre.appendChild(ruler);\n\n    const c = document.createElement(\"span\");\n    c.className = \"row contig\";\n    c.textContent = contig_seq + \"    \" + cname;\n    pre.appendChild(c);\n  }\n\n  // Fragment rows + accumulate indel marker positions from each\n  // fragment's CIGAR, and remember each fragment's junction cpos\n  // for later bp_id ↔ cpos matching on SV breakpoints.\n  const fragsRaw = contig[col.frags] || \"NA\";\n  const indelMarks = [];\n  const fragJunctionCpos = [];  // cpos values where fragments meet\n  if(fragsRaw !== \"NA\" && fragsRaw !== \"\"){\n    for(const f of fragsRaw.split(\"|\")){\n      const parts = f.split(\":\");\n      if(parts.length < 10) continue;\n      const [chr,pos,strand,cigar,mapq,br1,br2,gbr1,gbr2,flipped] = parts;\n      const rendered = renderFragCigar(cigar, strand, flipped===\"1\");\n      const el = document.createElement(\"span\");\n      el.className = \"row frag\";\n      el.textContent = rendered + \"\\tC[\"+br1+\",\"+br2+\"] G[\"+gbr1+\",\"+gbr2+\"] -> \"+chr+\":\"+pos+\"(\"+strand+\") CIG:\"+cigar+\" MAPQ:\"+mapq;\n      pre.appendChild(el);\n\n      // Collect indel marks from this fragment's CIGAR. Deletions\n      // collapse to one contig column (the junction point between\n      // the flanking M blocks); insertions span a contig interval\n      // equal to the inserted length. See computeIndelMarksForFrag\n      // for the per-op accounting.\n      const frMarks = computeIndelMarksForFrag(cigar, strand, flipped===\"1\",\n                                               chr, pos);\n      for(const m of frMarks) indelMarks.push(m);\n\n      // Record this fragment's internal break columns. For single-\n      // fragment indel contigs these are 0 / contig_len (not\n      // meaningful SV junctions); for multi-fragment SV contigs\n      // these mark where the fragment meets its neighbors, which\n      // is the contig-space location of the SV breakpoint.\n      const b1v = +br1, b2v = +br2;\n      if (b1v > 0 && b1v < contig_len) fragJunctionCpos.push(b1v);\n      if (b2v > 0 && b2v < contig_len) fragJunctionCpos.push(b2v);\n    }\n  }\n\n  // Parse breakpoints ONCE into a structured list so we can\n  //   (a) render the BP summary rows,\n  //   (b) populate the bp_id filter dropdown,\n  //   (c) match bp_ids to indel-mark / fragment-junction cpos\n  //       for a compact \"BP index\" summary row.\n  //\n  // Two schemas live in the wild:\n  //   pre-v3 (9 fields):  kind:chr1:pos1:strand1:chr2:pos2:strand2:span:insertion\n  //   v3     (10 fields): kind:bp_id:chr1:pos1:strand1:chr2:pos2:strand2:span:insertion\n  //\n  // Disambiguate by whether parts[1] looks like a bp_id (starts with \"bp\"\n  // or is \".\") — the older format had `chr1` in that slot, which would\n  // start with \"chr\" or a digit.\n  const bpsRaw = contig[col.bps] || \"NA\";\n  const bpsList = []; // {kind, bpId, span, line, cpos (nullable)}\n  if(bpsRaw !== \"NA\" && bpsRaw !== \"\"){\n    for(const b of bpsRaw.split(\"|\")){\n      const parts = b.split(\":\");\n      if(parts.length < 9) continue;\n      let kind, bpId, c1, p1, s1, c2, p2, sp2, span, ins;\n      const hasBpId = parts.length >= 10 &&\n                      (parts[1].startsWith(\"bp\") || parts[1] === \".\");\n      if(hasBpId){\n        [kind, bpId, c1, p1, s1, c2, p2, sp2, span, ins] = parts;\n      } else {\n        bpId = null;\n        [kind, c1, p1, s1, c2, p2, sp2, span, ins] = parts;\n      }\n      const idTag = bpId && bpId !== \".\" ? \" [\" + bpId + \"]\" : \"\";\n      let line;\n      if(kind === \"indel\"){\n        line = (ins === \".\" ? \"Del \"+span+\"bp\" : \"Ins \"+ins.length+\"bp (\"+ins+\")\")\n             + \" at \"+c1+\":\"+p1+\"(\"+s1+\") - \"+c2+\":\"+p2+\"(\"+sp2+\")\" + idTag;\n      } else {\n        line = (kind===\"global\"?\"Global\":\"Multi\")+\" BP: \"+c1+\":\"+p1+\"(\"+s1+\") \\u2192 \"+c2+\":\"+p2+\"(\"+sp2+\n               \") SPAN \"+span + (ins !== \".\" ? \" INS:\"+ins : \"\") + idTag;\n      }\n      bpsList.push({kind, bpId, span, line,\n                    chr1: c1, pos1: +p1, chr2: c2, pos2: +p2,\n                    cpos: null});\n    }\n  }\n\n  // Match each bps entry to a contig-space position (cpos). Strategy:\n  //\n  //   INDEL bps:  walk the fragment CIGAR (we already did above and\n  //     cached indelMarks), then match the marker's refStart/refEnd\n  //     against the bps entry's pos1/pos2. On a match, use the\n  //     marker's contig column (single point for del, col1 for ins)\n  //     and stamp the bp_id back onto the mark so the marker row\n  //     label can carry it.\n  //\n  //   SV bps (kind = global/multi):  the contig-space junction is\n  //     wherever the fragments meet. For a 2-fragment contig with a\n  //     single SV junction, there's exactly one interior\n  //     fragJunctionCpos — use that. For rarer multi-junction\n  //     contigs we leave cpos null and fall back to ref-only\n  //     display (still useful; just one less anchor).\n  //\n  // cpos is ALWAYS the left-to-right screen column, independent of\n  // which reference strand a fragment maps to — see the comment on\n  // contig rendering above for why.\n  for (const bp of bpsList) {\n    if (bp.kind === \"indel\") {\n      for (const mk of indelMarks) {\n        if (mk.chr === bp.chr1 &&\n            Math.min(mk.refStart, mk.refEnd) === Math.min(bp.pos1, bp.pos2) &&\n            Math.max(mk.refStart, mk.refEnd) === Math.max(bp.pos1, bp.pos2)) {\n          bp.cpos = (mk.kind === \"del\") ? mk.col : mk.col1;\n          mk.bpId = bp.bpId;\n          break;\n        }\n      }\n    } else if (fragJunctionCpos.length > 0) {\n      // Dedupe and sort; adjacent fragments double-report the same\n      // junction. For a 2-frag contig this collapses to 1 value.\n      const uniq = Array.from(new Set(fragJunctionCpos)).sort((a, b) => a - b);\n      if (uniq.length === 1) bp.cpos = uniq[0];\n      // If >1 unique junction, we don't know the 1:1 mapping bps→junction\n      // without deeper parsing. Leave cpos null.\n    }\n  }\n\n  // Emit a compact \"BP index\" row above the indel markers when the\n  // contig hosts ≥1 BP. Shows `bp_id @ cpos X [kind Nbp]` per entry.\n  // Makes multi-BP contigs (e.g. indel + flanking SV) navigable at a\n  // glance without having to scroll to the per-BP summary row below.\n  {\n    const labeled = bpsList.filter(b => b.bpId && b.bpId !== \".\");\n    if (labeled.length) {\n      const chunks = labeled.map(b => {\n        const where = (b.cpos != null) ? \"@ cpos \" + b.cpos : \"@ \" + b.chr1 + \":\" + b.pos1;\n        let kindShort;\n        if (b.kind === \"indel\") {\n          kindShort = (b.line.indexOf(\"Ins \") === 0 || b.line.indexOf(\"Ins \") > 0)\n            ? \"Ins \" + b.span + \"bp\"\n            : \"Del \" + b.span + \"bp\";\n        } else {\n          kindShort = (b.kind === \"global\" ? \"global\" : \"multi\") + \" SV\";\n        }\n        return b.bpId + \" \" + where + \" [\" + kindShort + \"]\";\n      });\n      const el = document.createElement(\"span\");\n      el.className = \"row bp\";\n      el.textContent = \"BP index: \" + chunks.join(\"  |  \");\n      pre.appendChild(el);\n    }\n  }\n\n  // Emit one marker row per indel now that bp_ids are matched in.\n  // Deletions render as `||` at adjacent contig columns followed by\n  // a description; insertions render as `|...|` bracketing the\n  // inserted region. Labels include chr:refStart-refEnd and the\n  // matched bp_id (when we were able to tie a CIGAR op back to a\n  // bps entry above) so the operator can cross-reference the\n  // marker and the BP summary row without counting columns.\n  for(const m of indelMarks){\n    const idTag = m.bpId ? \"  [\" + m.bpId + \"]\" : \"\";\n    let line;\n    if(m.kind === \"del\"){\n      const lead = \" \".repeat(Math.max(0, m.col - 1));\n      line = lead + \"||  Del \" + m.len + \"bp at \" +\n             m.chr + \":\" + m.refStart + \"-\" + m.refEnd + idTag;\n    } else {\n      const lead  = \" \".repeat(m.col1);\n      const inner = \" \".repeat(Math.max(0, m.col2 - m.col1 - 1));\n      line = lead + \"|\" + inner + \"|  Ins \" + m.len + \"bp at \" +\n             m.chr + \":\" + m.refStart + \"-\" + m.refEnd + idTag;\n    }\n    const el = document.createElement(\"span\");\n    el.className = \"row marker\";\n    el.textContent = line;\n    pre.appendChild(el);\n  }\n\n  // Populate the bp_id filter dropdown. Only v3 files have per-BP IDs,\n  // so on pre-v3 or files with no BPs the row stays hidden and no\n  // bp_id filter is applied downstream. Preserve the user's current\n  // selection across re-renders IFF the new contig still carries that\n  // bp_id; otherwise reset to \"all\".\n  const bpSel = $(\"f-bp-id\");\n  const bpRow = $(\"bp-id-row\");\n  const ids = bpsList.map(b => b.bpId).filter(id => id && id !== \".\");\n  const canFilterByBpId = ids.length > 0\n                          && col.split_bps != null\n                          && col.disc_bps  != null;\n  const prevBpSel = bpSel.value;\n  bpSel.innerHTML = '<option value=\"\">all (any bp)</option>';\n  for(const b of bpsList){\n    if(!b.bpId || b.bpId === \".\") continue;\n    const o = document.createElement(\"option\");\n    o.value = b.bpId;\n    // short label: bp_id  kind  span=...\n    o.textContent = b.bpId + \"  \" + b.kind +\n                    (b.span != null && b.span !== \"\" ? \"  span=\" + b.span : \"\");\n    bpSel.appendChild(o);\n  }\n  bpRow.style.display = canFilterByBpId ? \"\" : \"none\";\n  bpSel.value = (canFilterByBpId && ids.includes(prevBpSel)) ? prevBpSel : \"\";\n  const selectedBpId = canFilterByBpId ? bpSel.value : \"\";\n\n  // Render BP summary rows from the parsed list.\n  for(const b of bpsList){\n    const el = document.createElement(\"span\");\n    el.className = \"row bp\";\n    el.textContent = b.line;\n    pre.appendChild(el);\n  }\n\n  // Read rows (sorted by r2c_start). shownPrefixes counts only the\n  // reads that actually survive every filter, so the legend we emit\n  // after the loop reflects the visible-subset per source prefix\n  // (not the unconditional file totals).\n  const reads = entry.reads.slice().sort((a,b) => (+a[col.r2c_start]) - (+b[col.r2c_start]));\n  const shownPrefixes = new Map();\n  let nShown = 0;\n  for(const rr of reads){\n    const supp = rr[col.support] || \"none\";\n    if(!showSupport[supp]) continue;\n    const cig = rr[col.r2c_cigar] || \"\";\n    if(imperfectOnly && !/[ID]/.test(cig)) continue;\n\n    // bp_id filter: keep the read only if the selected bp_id appears\n    // in its split_bps or disc_bps column (comma-joined bp_id lists).\n    // A read can support multiple BPs on a contig, so these are\n    // set-membership checks, not equality.\n    if(selectedBpId){\n      const sb = rr[col.split_bps] || \"\";\n      const db = rr[col.disc_bps]  || \"\";\n      const toks = (sb + \",\" + db).split(\",\");\n      let ok = false;\n      for(let t = 0; t < toks.length; t++){\n        if(toks[t].trim() === selectedBpId){ ok = true; break; }\n      }\n      if(!ok) continue;\n    }\n\n    const id = rr[col.read_id] || \"\";\n    const m  = id.match(/^([a-z]\\d{3})_/i);\n    const prefix = m ? m[1] : \"\";\n\n    const line = renderReadLine(rr, col);\n    if(line === null) continue;\n\n    const el = document.createElement(\"span\");\n    el.className = \"row read support-\" + supp;\n    if(prefix) el.dataset.prefix = prefix;\n    const color = prefix ? r2cPrefixColor(prefix) : \"#555\";\n    el.style.borderLeftColor = color;\n    el.style.background = color + \"11\";\n\n    const pad = \" \".repeat(Math.max(0, line.startCol));\n    // The split_bps / disc_bps columns are v3 additions (see\n    // AlignedContig::printToR2CTsv). For older r2c files without these\n    // columns, col.split_bps / col.disc_bps are undefined and we just\n    // skip them in the meta line — the categorical `support` carries\n    // the older-coarse-grained info in that case.\n    const splitBps = col.split_bps != null ? (rr[col.split_bps] || \"NA\") : null;\n    const discBps  = col.disc_bps  != null ? (rr[col.disc_bps]  || \"NA\") : null;\n    const metaParts = [\n      id,\n      \"r2c POS:\" + rr[col.r2c_start],\n      \"FLAG:\" + (rr[col.r2c_rc]===\"1\" ? \"16\" : \"0\"),\n      \"NM:\"   + rr[col.r2c_nm],\n      \"support:\" + supp\n    ];\n    if (splitBps !== null) metaParts.push(\"split_bps:\" + splitBps);\n    if (discBps  !== null) metaParts.push(\"disc_bps:\"  + discBps);\n    metaParts.push(\n      \"r2cScore:\"    + (rr[col.r2c_score]    || \"NA\"),\n      \"nativeScore:\" + (rr[col.native_score] || \"NA\"),\n      \"CIGAR:\" + (cig || \"NA\")\n    );\n    const meta = document.createElement(\"span\");\n    meta.className = \"meta\";\n    meta.textContent = \"  \" + metaParts.join(\" \");\n    el.appendChild(document.createTextNode(pad + line.text));\n    el.appendChild(meta);\n    pre.appendChild(el);\n    nShown++;\n    if(prefix) shownPrefixes.set(prefix, (shownPrefixes.get(prefix)||0) + 1);\n  }\n\n  body.appendChild(pre);\n\n  // Render the source legend now that shownPrefixes reflects the\n  // actual visible read set. Each swatch shows \"prefix (shown/total)\"\n  // when a filter hides at least one read for that prefix; otherwise\n  // a bare \"(n)\". Prefixes with zero visible reads are rendered\n  // greyed-out rather than hidden entirely, so the user can still\n  // see at a glance that a given sample had reads in this contig\n  // but none of them supported the currently-selected bp_id.\n  const legEl = $(\"source-legend\"); legEl.innerHTML = \"\";\n  if(allPrefixes.size){\n    $(\"source-legend-label\").style.display = \"\";\n    const sorted = Array.from(allPrefixes.keys()).sort();\n    for(const p of sorted){\n      const shown = shownPrefixes.get(p) || 0;\n      const total = allPrefixes.get(p);\n      const isFiltered = (shown < total);\n      const sw = document.createElement(\"span\");\n      sw.className = \"sw\";\n      const c = r2cPrefixColor(p);\n      sw.style.background = c + \"33\";\n      sw.style.border = \"1px solid \" + c;\n      if(shown === 0) sw.style.opacity = \"0.4\";\n      sw.textContent = p + \" (\" + shown + (isFiltered ? \"/\" + total : \"\") + \")\";\n      sw.dataset.on = \"1\";\n      sw.dataset.prefix = p;\n      sw.addEventListener(\"click\", () => {\n        const on = sw.dataset.on === \"1\";\n        sw.dataset.on = on ? \"0\" : \"1\";\n        body.querySelectorAll('span.row.read[data-prefix=\"'+p+'\"]').forEach(el => {\n          el.style.display = on ? \"none\" : \"\";\n        });\n      });\n      legEl.appendChild(sw);\n    }\n  } else {\n    $(\"source-legend-label\").style.display = \"none\";\n  }\n\n  $(\"status\").textContent =\n    cname + \"  —  contig \" + contig_len + \"bp, \" +\n    entry.reads.length + \" reads in file, \" + nShown + \" shown after filters.\" +\n    (selectedBpId ? \"  [bp_id=\" + selectedBpId + \"]\" : \"\") +\n    (allPrefixes.size ? \"  Click a source tag above to hide/show that source's reads.\" : \"\");\n\n  // Horizontal scroll indicator — show when content is wider than viewport.\n  // Uses requestAnimationFrame so the DOM has laid out the <pre> first.\n  requestAnimationFrame(() => updateHScrollInfo());\n}\n\nfunction renderReadLine(rr, col){\n  const rawSeq = rr[col.read_seq] || \"\";\n  const cigStr = rr[col.r2c_cigar] || \"\";\n  const rc     = rr[col.r2c_rc] === \"1\";\n  if(!cigStr || cigStr === \"NA\") return null;\n\n  const seq = rc ? revcomp(rawSeq) : rawSeq;\n  const ops = parseCigar(cigStr);\n  if(!ops.length) return null;\n\n  let lead = 0, trail = 0;\n  if(ops[0].op === \"S\") lead = ops[0].len;\n  if(ops.length > 1 && ops[ops.length-1].op === \"S\") trail = ops[ops.length-1].len;\n\n  const leadClip  = seq.substr(0, lead).toLowerCase();\n  const trailClip = trail > 0 ? seq.substr(seq.length - trail).toLowerCase() : \"\";\n\n  // Gap-expand: M -> base, D -> '-', I/S/H -> advance in query but don't emit.\n  let p = 0, body = \"\";\n  for(const o of ops){\n    if(o.op === \"M\"){ body += seq.substr(p, o.len); p += o.len; }\n    else if(o.op === \"D\"){ body += \"-\".repeat(o.len); }\n    else if(o.op === \"I\" || o.op === \"S\" || o.op === \"H\"){ p += o.len; }\n  }\n\n  // Shift left by leading-clip so lowercase clip bases sit in their true\n  // contig columns. Clamp if the shift would push us past column 0.\n  let startCol = (+rr[col.r2c_start]) - lead;\n  let text = leadClip + body + trailClip;\n  if(startCol < 0){\n    const drop = -startCol;\n    text = drop >= text.length ? \"\" : text.substr(drop);\n    startCol = 0;\n  }\n  return { startCol, text };\n}\n\nfunction renderFragCigar(cigStr, strand, flipped){\n  const ops = parseCigar(cigStr);\n  const ordered = flipped ? ops.slice().reverse() : ops;\n  const sign = strand === \"-\" ? \"<\" : \">\";\n  let s = \"\";\n  for(const o of ordered){\n    if(o.op === \"M\") s += sign.repeat(o.len);\n    else if(o.op === \"I\") s += \"I\".repeat(o.len);\n    else if(o.op === \"S\" || o.op === \"H\") s += \".\".repeat(o.len);\n  }\n  return s;\n}\n\n// Walk a fragment's CIGAR and return the contig-column positions of any\n// internal indel ops (D / N for deletions, I for insertions). This\n// reconstructs the visual indicators that were baked into the old\n// alignments.txt.gz output by BreakPoint::printDeletionMarksForAlignmentsFile.\n//\n// Returned marks:\n//   {kind:\"del\", col, len, chr, refStart, refEnd}\n//     col = contig column of the deletion junction (reference advances,\n//           contig stays). Callers draw two `|` at col-1 and col so the\n//           deletion reads as `||` on the contig line.\n//   {kind:\"ins\", col1, col2, len, chr, refStart, refEnd}\n//     col1/col2 = contig columns of the first and last inserted base.\n//     Callers draw `|` at col1 and col2 so the inserted region is\n//     bracketed on the contig line.\n//\n// Orientation: if flipped, the CIGAR ops are walked in reverse so the\n// resulting contig columns match the same orientation the contig row\n// and the fragment row render in.\n//\n// fragStartGpos is the fragment's 1-based alignment start on the\n// reference (parts[1] of the frag field). rpos is kept monotonically\n// increasing as the CIGAR consumes reference bases; on flipped\n// fragments the \"reference start/end\" on the label is the forward-\n// strand coordinate, which is the convention the bp summary row\n// already uses.\nfunction computeIndelMarksForFrag(cigStr, strand, flipped, chr, fragStartGpos){\n  const ops = parseCigar(cigStr);\n  const ordered = flipped ? ops.slice().reverse() : ops;\n  const marks = [];\n  let cpos = 0;\n  let rpos = +fragStartGpos;\n  for(const o of ordered){\n    if(o.op === \"M\" || o.op === \"=\" || o.op === \"X\"){\n      cpos += o.len;\n      rpos += o.len;\n    } else if(o.op === \"D\" || o.op === \"N\"){\n      // Skip tiny indels so every noisy 1bp CIGAR op doesn't clutter\n      // the plot. svaba's indel caller has its own minimum anyway.\n      //\n      // refStart / refEnd conventions here intentionally match the\n      // pos1 / pos2 convention emitted by BreakPoint::toFileString\n      // and shown on the BP summary row below, so a user can\n      // cross-reference the marker label and the BP row by literal\n      // eyeball match:\n      //   pos1 = last flanking ref base BEFORE the deletion\n      //   pos2 = LAST deleted ref base (not first-after)\n      if(o.len >= 1){\n        marks.push({kind:\"del\", col:cpos, len:o.len,\n                    chr, refStart:rpos - 1, refEnd:rpos + o.len - 1});\n      }\n      rpos += o.len;\n    } else if(o.op === \"I\"){\n      // For insertions there are no deleted ref bases, so refStart /\n      // refEnd are the two flanking ref bases (last-before / first-\n      // after). Same as the BP summary convention.\n      if(o.len >= 1){\n        marks.push({kind:\"ins\", col1:cpos, col2:cpos + o.len - 1, len:o.len,\n                    chr, refStart:rpos - 1, refEnd:rpos});\n      }\n      cpos += o.len;\n    } else if(o.op === \"S\" || o.op === \"H\"){\n      cpos += o.len;\n    }\n    // P: silent; treat as no-op\n  }\n  return marks;\n}\n\nfunction parseCigar(s){\n  const ops = [];\n  const re = /(\\d+)([MIDNSHP=X])/g;\n  let m;\n  while((m = re.exec(s)) !== null) ops.push({ len: +m[1], op: m[2] });\n  return ops;\n}\n\nfunction revcomp(s){\n  let out = \"\";\n  for(let i = s.length - 1; i >= 0; i--){\n    const ch = s.charAt(i);\n    switch(ch){\n      case \"A\": out += \"T\"; break; case \"a\": out += \"t\"; break;\n      case \"T\": out += \"A\"; break; case \"t\": out += \"a\"; break;\n      case \"C\": out += \"G\"; break; case \"c\": out += \"g\"; break;\n      case \"G\": out += \"C\"; break; case \"g\": out += \"c\"; break;\n      default:  out += ch;\n    }\n  }\n  return out;\n}\n\n/* ---- Horizontal scroll indicator ---- */\nfunction updateHScrollInfo(){\n  const body = $(\"panel-body\");\n  const info = $(\"hscroll-info\");\n  const thumb = $(\"hscroll-thumb\");\n  const posEl = $(\"hscroll-pos\");\n  const widthEl = $(\"hscroll-width\");\n  const cw = body.clientWidth, sw = body.scrollWidth;\n  if(sw <= cw + 4){\n    // Content fits — hide indicator\n    info.style.display = \"none\";\n    return;\n  }\n  info.style.display = \"flex\";\n  const sl = body.scrollLeft;\n  // Approximate column position (monospace ~6.6px per char at 11px font)\n  const charW = 6.6;\n  const col = Math.round(sl / charW);\n  const totalCols = Math.round(sw / charW);\n  posEl.textContent = \"col \" + col;\n  widthEl.textContent = totalCols + \" cols\";\n  // Minimap thumb position\n  const trackW = 120;\n  const ratio = cw / sw;\n  const thumbW = Math.max(8, Math.round(trackW * ratio));\n  const thumbL = Math.round((sl / (sw - cw)) * (trackW - thumbW));\n  thumb.style.width = thumbW + \"px\";\n  thumb.style.left  = thumbL + \"px\";\n}\n\n$(\"panel-body\").addEventListener(\"scroll\", function(){\n  requestAnimationFrame(updateHScrollInfo);\n});\n\n// Allow the minimap track to be clicked/dragged to jump horizontally\n(function(){\n  const track = $(\"hscroll-info\").querySelector(\".hscroll-track\");\n  if(!track) return;\n  function jumpTo(e){\n    const body = $(\"panel-body\");\n    const rect = track.getBoundingClientRect();\n    const frac = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n    body.scrollLeft = frac * (body.scrollWidth - body.clientWidth);\n  }\n  let dragging = false;\n  track.addEventListener(\"mousedown\", e => { dragging = true; jumpTo(e); e.preventDefault(); });\n  document.addEventListener(\"mousemove\", e => { if(dragging) jumpTo(e); });\n  document.addEventListener(\"mouseup\", () => { dragging = false; });\n})();\n\n})();\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/runtime_explorer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>SvABA Runtime Explorer</title>\n<style>\n:root {\n  --bg: #0f1117; --surface: #1a1d27; --surface2: #252833;\n  --border: #2e3140; --text: #e1e4ed; --text2: #8b8fa3;\n  --accent: #6c8cff; --green: #4ade80; --red: #f87171; --amber: #fbbf24;\n  --blue: #60a5fa; --purple: #a855f7;\n}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:'SF Mono','Fira Code','Consolas',monospace;background:var(--bg);color:var(--text);min-height:100vh;font-size:12px}\n.header{display:flex;align-items:center;justify-content:space-between;padding:.6rem 1rem;border-bottom:1px solid var(--border);background:var(--surface)}\n.header h1{font-size:1rem;font-weight:600} .header h1 span{color:var(--accent)}\n.header .meta{font-size:.75rem;color:var(--text2)}\n\n/* Upload */\n.upload-row{display:flex;gap:.8rem;align-items:center;padding:.6rem 1rem;background:var(--surface);border-bottom:1px solid var(--border)}\n.upload-box{background:var(--surface2);border:2px dashed var(--border);border-radius:6px;padding:.6rem 1rem;cursor:pointer;transition:border-color .2s;font-size:.78rem;color:var(--text2);flex:1;text-align:center;max-width:460px}\n.upload-box:hover,.upload-box.over{border-color:var(--accent)}\n.upload-box.loaded{border-color:var(--green);border-style:solid}\n.upload-box input{display:none}\n.upload-box .fn{color:var(--green);font-size:.72rem;margin-top:.2rem;word-break:break-all}\n.btn{background:var(--accent);color:#fff;border:none;border-radius:5px;padding:.35rem .8rem;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit}\n.btn:hover{opacity:.9} .btn:disabled{opacity:.4;cursor:not-allowed}\n.btn-ghost{background:transparent;border:1px solid var(--border);color:var(--text2)}\n.btn-ghost:hover{border-color:var(--accent);color:var(--text)}\n\n/* Controls */\n.controls{display:flex;flex-wrap:wrap;gap:.5rem .8rem;padding:.5rem 1rem;background:var(--surface);border-bottom:1px solid var(--border);align-items:end}\n.ctrl{display:flex;flex-direction:column;gap:.2rem}\n.ctrl label{font-size:.65rem;color:var(--text2);text-transform:uppercase;letter-spacing:.05em}\n.ctrl input,.ctrl select{background:var(--surface2);border:1px solid var(--border);border-radius:4px;padding:.3rem .5rem;font-family:inherit;font-size:.78rem;color:var(--text)}\n.ctrl input[type=number]{width:80px} .ctrl input[type=search]{width:200px} .ctrl input[type=text]{width:200px}\n.ctrl input:focus,.ctrl select:focus{outline:none;border-color:var(--accent)}\n.chip{padding:.2rem .5rem;border-radius:4px;border:1px solid var(--border);font-size:.7rem;cursor:pointer;color:var(--text2);background:var(--surface2)}\n.chip:hover{border-color:var(--accent);color:var(--text)}\n.chip.on{background:rgba(108,140,255,.15);border-color:var(--accent);color:var(--accent)}\n.preset{padding:.15rem .4rem;border-radius:3px;border:1px solid var(--border);font-size:.65rem;cursor:pointer;color:var(--text2);background:transparent}\n.preset:hover{border-color:var(--accent);color:var(--accent)}\n\n/* Stats bar */\n.stats-bar{display:flex;gap:1.2rem;padding:.4rem 1rem;background:var(--surface);border-bottom:1px solid var(--border);font-size:.75rem;color:var(--text2);flex-wrap:wrap}\n.stats-bar .sv{color:var(--accent);font-weight:600}\n\n/* Charts */\n.charts-row{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.5rem 1rem;background:var(--bg)}\n/* \"hero\" = single tall chart spanning the full width (used for the runtime\n   distribution, which is the primary thing a user of this viewer cares\n   about). \"compact\" = 2-column narrower row for the auxiliary charts. */\n.charts-row.hero{grid-template-columns:1fr;padding-bottom:.15rem}\n.charts-row.hero .chart-card{min-height:240px}\n.charts-row.hero canvas{height:210px}\n.charts-row.compact{grid-template-columns:repeat(2,1fr);padding-top:.15rem}\n.chart-card{background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:.4rem .5rem;min-height:140px}\n.chart-card .ct{font-size:.65rem;color:var(--text2);text-transform:uppercase;letter-spacing:.04em;margin-bottom:.3rem;display:flex;align-items:center;justify-content:space-between;gap:.3rem}\n.chart-card canvas{width:100%;height:120px;display:block}\n.log-tog{background:transparent;border:1px solid var(--border);color:var(--text2);font-size:.6rem;padding:1px 5px;border-radius:3px;cursor:pointer;font-family:inherit;text-transform:none;letter-spacing:0;line-height:1.1}\n.log-tog:hover{border-color:var(--accent);color:var(--text)}\n.log-tog.on{background:rgba(108,140,255,.15);border-color:var(--accent);color:var(--accent)}\n\n/* Table */\n.table-wrap{overflow:auto;background:var(--surface);border:1px solid var(--border);border-radius:6px;margin:.5rem 1rem;flex:1;max-height:calc(100vh - 360px)}\ntable{width:100%;border-collapse:collapse;white-space:nowrap}\nth{background:var(--surface2);color:var(--text2);text-align:left;padding:.3rem .5rem;position:sticky;top:0;cursor:pointer;user-select:none;z-index:1;font-size:.72rem;text-transform:uppercase;letter-spacing:.03em}\nth:hover{color:var(--accent)}\nth .sa{font-size:.6em;margin-left:.15rem;opacity:.5}\ntd{padding:.3rem .5rem;border-top:1px solid rgba(46,49,64,.5);font-size:.75rem;user-select:text;-webkit-user-select:text}\ntr:hover td{background:var(--surface2)}\ntr.sel td{background:#1e3a5f !important}\ntr{cursor:pointer}\ntd.num{text-align:right;font-variant-numeric:tabular-nums}\ntd.hot{color:var(--red);font-weight:600}\ntd.warm{color:var(--amber)}\n::selection{background:#3b5bdb;color:#fff}\na.igv-link{color:var(--accent);text-decoration:none;cursor:pointer}\na.igv-link:hover{text-decoration:underline}\na.igv-link.ok{color:var(--green)}\na.igv-link.err{color:var(--red)}\n.pagination{display:flex;align-items:center;justify-content:space-between;padding:.35rem 1rem;font-size:.75rem;color:var(--text2);background:var(--surface);border-top:1px solid var(--border)}\n.pagination .pg-btns{display:flex;gap:.3rem}\n\n/* Detail panel */\n.detail-panel{margin:.5rem 1rem;background:var(--surface);border:1px solid var(--border);border-radius:6px;overflow:hidden}\n.dp-header{background:var(--surface2);padding:.4rem .8rem;font-size:.72rem;color:var(--text2);text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--border);display:flex;justify-content:space-between}\n.dp-header strong{color:var(--text);text-transform:none;letter-spacing:0}\n.dp-body{max-height:280px;overflow:auto}\n.dp-empty{padding:.8rem;text-align:center;color:var(--text2);font-size:.78rem}\n.kv{width:100%;border-collapse:collapse;font-size:.72rem}\n.kv td{padding:2px 8px;border-bottom:1px solid rgba(46,49,64,.4);vertical-align:top}\n.kv .k{width:200px;color:var(--text2);background:rgba(0,0,0,.15);white-space:nowrap;font-weight:600}\n.kv .v{color:var(--text);word-break:break-all;white-space:pre-wrap}\n.kv tr:hover td{background:#1f2937}\n\n@media(max-width:1100px){.charts-row{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:700px){.charts-row{grid-template-columns:1fr}}\n</style>\n</head>\n<body>\n\n<div class=\"header\">\n  <h1><span>SvABA</span> Runtime Explorer</h1>\n  <div class=\"meta\" id=\"file-meta\">No file loaded &mdash; drop a runtime log to begin</div>\n</div>\n\n<div class=\"upload-row\">\n  <div class=\"upload-box\" id=\"drop-zone\" onclick=\"document.getElementById('file-input').click()\">\n    Drop or click &mdash; SvABA runtime log (TSV, 17 cols: <code>chromosome start end &hellip; runtime_seconds &hellip;</code>)\n    <div class=\"fn\" id=\"file-name\" style=\"display:none\"></div>\n    <input type=\"file\" id=\"file-input\" accept=\".txt,.tsv,.log,.gz,text/plain,application/gzip\">\n  </div>\n  <button class=\"btn-ghost btn\" id=\"export-btn\" disabled>Export TSV</button>\n</div>\n\n<div class=\"controls\" id=\"controls\" style=\"display:none\">\n  <div class=\"ctrl\"><label>Search</label><input id=\"f-search\" type=\"search\" placeholder=\"chrom or text\"></div>\n  <div class=\"ctrl\"><label>Region</label><input id=\"f-region\" type=\"text\" placeholder=\"chr7:55M-56M\"></div>\n  <div class=\"ctrl\"><label>Runtime &ge; sec</label>\n    <div style=\"display:flex;gap:.2rem;align-items:center\">\n      <input id=\"f-rt-min\" type=\"number\" step=\"0.1\" placeholder=\"-\">\n      <span style=\"color:var(--text2)\">to</span>\n      <input id=\"f-rt-max\" type=\"number\" step=\"0.1\" placeholder=\"-\">\n      <div style=\"display:flex;gap:.15rem\">\n        <button class=\"preset\" data-t=\"f-rt-min\" data-v=\"1\">1s</button>\n        <button class=\"preset\" data-t=\"f-rt-min\" data-v=\"10\">10s</button>\n        <button class=\"preset\" data-t=\"f-rt-min\" data-v=\"60\">1m</button>\n        <button class=\"preset\" data-t=\"f-rt-min\" data-v=\"600\">10m</button>\n      </div>\n    </div>\n  </div>\n  <div class=\"ctrl\"><label>Min contigs</label><input id=\"f-contigs-min\" type=\"number\" step=\"1\" placeholder=\"-\"></div>\n  <div class=\"ctrl\"><label>Min discordant</label><input id=\"f-dc-min\" type=\"number\" step=\"1\" placeholder=\"-\"></div>\n  <div class=\"ctrl\"><label>Min weird (T+N)</label><input id=\"f-weird-min\" type=\"number\" step=\"1\" placeholder=\"-\"></div>\n  <div class=\"ctrl\"><label>Chr</label>\n    <button class=\"chip\" id=\"f-std-chr\" title=\"Hide regions on non-standard chromosomes (chrUn, *_random, *_alt, decoy, etc.)\">Standard only</button>\n  </div>\n  <div class=\"ctrl\"><label>Rows/pg</label>\n    <select id=\"f-page-size\"><option value=\"50\">50</option><option value=\"100\" selected>100</option><option value=\"250\">250</option><option value=\"500\">500</option><option value=\"1000\">1k</option></select>\n  </div>\n  <button class=\"btn-ghost btn\" id=\"reset-btn\" style=\"margin-left:auto\">Reset</button>\n</div>\n\n<div class=\"stats-bar\" id=\"stats-bar\" style=\"display:none\">\n  <span>Regions: <span class=\"sv\" id=\"s-total\">0</span></span>\n  <span>Shown: <span class=\"sv\" id=\"s-shown\">0</span></span>\n  <span>&Sigma; runtime: <span class=\"sv\" id=\"s-sumrt\">0</span></span>\n  <span>Max: <span class=\"sv\" id=\"s-maxrt\">0</span></span>\n  <span>Mean: <span class=\"sv\" id=\"s-meanrt\">0</span></span>\n  <span>p95: <span class=\"sv\" id=\"s-p95rt\">0</span></span>\n  <span>Hottest: <span class=\"sv\" id=\"s-hot\">-</span></span>\n</div>\n\n<!--\n  Charts layout:\n    * hero row     = runtime distribution, tall + full-width.\n                     This is the primary thing a user of this viewer cares\n                     about; everything else is auxiliary context.\n    * compact row  = contigs-per-region + discordant-reads histograms.\n                     Half-height, 2 columns — there to give you a sanity\n                     check on what else scales with the slow regions.\n  Both rows show only after a file is loaded; `ingest()` flips their\n  display back on together.\n-->\n<div class=\"charts-row hero\" id=\"charts-row-hero\" style=\"display:none\">\n  <div class=\"chart-card\">\n    <div class=\"ct\">\n      <span>Runtime distribution (seconds per region)</span>\n      <button class=\"log-tog\" data-chart=\"rt\" title=\"Toggle log10 x-axis\">log10</button>\n    </div>\n    <canvas id=\"c-rt\"></canvas>\n  </div>\n</div>\n<div class=\"charts-row compact\" id=\"charts-row\" style=\"display:none\">\n  <div class=\"chart-card\"><div class=\"ct\"><span>Contigs per region</span><button class=\"log-tog\" data-chart=\"contigs\" title=\"Toggle log10 x-axis\">log10</button></div><canvas id=\"c-contigs\"></canvas></div>\n  <div class=\"chart-card\"><div class=\"ct\"><span>Discordant reads</span><button class=\"log-tog\" data-chart=\"dc\" title=\"Toggle log10 x-axis\">log10</button></div><canvas id=\"c-dc\"></canvas></div>\n</div>\n\n<div class=\"table-wrap\" id=\"table-wrap\" style=\"display:none\">\n  <table><thead><tr id=\"thead\"></tr></thead><tbody id=\"tbody\"></tbody></table>\n</div>\n<div class=\"pagination\" id=\"pagination\" style=\"display:none\">\n  <span id=\"pg-info\">-</span>\n  <div class=\"pg-btns\">\n    <button class=\"btn-ghost btn\" id=\"pg-first\">&laquo;</button>\n    <button class=\"btn-ghost btn\" id=\"pg-prev\">&lsaquo; Prev</button>\n    <button class=\"btn-ghost btn\" id=\"pg-next\">Next &rsaquo;</button>\n    <button class=\"btn-ghost btn\" id=\"pg-last\">&raquo;</button>\n  </div>\n</div>\n\n<div class=\"detail-panel\" id=\"detail-panel\" style=\"display:none\">\n  <div class=\"dp-header\"><span>Selected region detail</span><strong id=\"dp-locus\">-</strong></div>\n  <div class=\"dp-body\" id=\"dp-body\"><div class=\"dp-empty\">Click a table row</div></div>\n</div>\n\n<script>\n(function(){\n\"use strict\";\n\n/* === Column schema ===\n * Matches svabaTimer::header in src/svaba/SvabaUtils.cpp:\n *   chromosome start end tumor_weird_reads normal_weird_reads\n *   tumor_mate_reads normal_mate_reads discordant_reads discordant_clusters\n *   contigs contigs_pass bps runtime_seconds pct_r pct_m pct_k pct_as\n *\n * pct_* fields are integer percentages of total runtime spent in each phase\n * (r=reads, m=mate-region-collect, k=kmer-correct, as=assemble).\n */\nconst CORE=[\n  \"chromosome\",\"start\",\"end\",\n  \"tumor_weird_reads\",\"normal_weird_reads\",\n  \"tumor_mate_reads\",\"normal_mate_reads\",\n  \"discordant_reads\",\"discordant_clusters\",\n  \"contigs\",\"contigs_pass\",\"bps\",\"runtime_seconds\",\n  \"pct_r\",\"pct_m\",\"pct_k\",\"pct_as\"\n];\nconst NUM=new Set([\n  \"start\",\"end\",\n  \"tumor_weird_reads\",\"normal_weird_reads\",\n  \"tumor_mate_reads\",\"normal_mate_reads\",\n  \"discordant_reads\",\"discordant_clusters\",\n  \"contigs\",\"contigs_pass\",\"bps\",\"runtime_seconds\",\n  \"pct_r\",\"pct_m\",\"pct_k\",\"pct_as\",\n  \"length\",\"weird_total\",\"mate_total\"\n]);\n\n// Displayed columns, in order. Also includes two derived columns.\nconst TCOLS=[\n  {k:\"igvLoc\",l:\"Region \\u2192 IGV\",help:\"Click to navigate IGV (port 60151) to this region\"},\n  {k:\"length\",l:\"Len\",n:1,help:\"end - start\"},\n  {k:\"runtime_seconds\",l:\"Runtime s\",n:1,help:\"wall seconds for this region\"},\n  {k:\"contigs\",l:\"Contigs\",n:1},\n  {k:\"contigs_pass\",l:\"Contigs\\u2713\",n:1,help:\"contigs that passed realignment filters\"},\n  {k:\"bps\",l:\"BPs\",n:1,help:\"breakpoints emitted\"},\n  {k:\"discordant_reads\",l:\"Disc rd\",n:1},\n  {k:\"discordant_clusters\",l:\"Disc cl\",n:1},\n  {k:\"weird_total\",l:\"Weird T+N\",n:1,help:\"tumor_weird_reads + normal_weird_reads\"},\n  {k:\"tumor_weird_reads\",l:\"Weird T\",n:1},\n  {k:\"normal_weird_reads\",l:\"Weird N\",n:1},\n  {k:\"mate_total\",l:\"Mate T+N\",n:1,help:\"tumor_mate_reads + normal_mate_reads\"},\n  {k:\"pct_r\",l:\"%r\",n:1,help:\"% runtime in read collection\"},\n  {k:\"pct_m\",l:\"%m\",n:1,help:\"% runtime in mate-region collection\"},\n  {k:\"pct_k\",l:\"%k\",n:1,help:\"% runtime in kmer correction\"},\n  {k:\"pct_as\",l:\"%as\",n:1,help:\"% runtime in assembly\"}\n];\n\n/* === State === */\nconst S={fn:\"\",hdr:[],rows:[],filt:[],selId:null,\n  pg:1,pgSz:100,sort:{k:\"runtime_seconds\",d:\"desc\"},\n  // rt defaults to log10 because runtime distributions are always\n  // long-tailed (a few HLA / centromere / high-coverage regions dominate\n  // the high end by orders of magnitude). On linear scale virtually every\n  // region ends up crammed into the first bin. contigs/dc usually have\n  // less extreme tails, so linear is fine as the default there.\n  logScale:{rt:true,contigs:false,dc:false},\n  f:{search:\"\",region:null,rtMin:null,rtMax:null,contigsMin:null,dcMin:null,weirdMin:null,stdChrOnly:false}};\n\nconst $=id=>document.getElementById(id);\n\n/* === Table header init === */\nTCOLS.forEach(c=>{\n  const th=document.createElement(\"th\");th.dataset.k=c.k;\n  th.innerHTML=esc(c.l)+'<span class=\"sa\"></span>';\n  if(c.help)th.title=c.help;\n  th.onclick=()=>{toggleSort(c.k);render()};\n  $(\"thead\").appendChild(th);\n});\n\n/* === Events === */\n$(\"file-input\").onchange=e=>{const f=e.target.files[0];if(f)loadBlob(f,f.name)};\n[\"dragenter\",\"dragover\"].forEach(e=>$(\"drop-zone\").addEventListener(e,ev=>{ev.preventDefault();$(\"drop-zone\").classList.add(\"over\")}));\n[\"dragleave\",\"drop\"].forEach(e=>$(\"drop-zone\").addEventListener(e,ev=>{ev.preventDefault();$(\"drop-zone\").classList.remove(\"over\")}));\n$(\"drop-zone\").addEventListener(\"drop\",e=>{const f=e.dataTransfer.files[0];if(f)loadBlob(f,f.name)});\n$(\"export-btn\").onclick=exportTSV;\n$(\"reset-btn\").onclick=()=>{resetF();render()};\n$(\"pg-prev\").onclick=()=>{if(S.pg>1){S.pg--;rTable()}};\n$(\"pg-next\").onclick=()=>{if(S.pg<tPages()){S.pg++;rTable()}};\n$(\"pg-first\").onclick=()=>{S.pg=1;rTable()};\n$(\"pg-last\").onclick=()=>{S.pg=tPages();rTable()};\ndocument.querySelectorAll(\".preset\").forEach(b=>{b.onclick=()=>{$(b.dataset.t).value=b.dataset.v;syncF();render()}});\n[\"f-search\",\"f-region\",\"f-rt-min\",\"f-rt-max\",\"f-contigs-min\",\"f-dc-min\",\"f-weird-min\",\"f-page-size\"]\n  .forEach(id=>{$(id).addEventListener(\"input\",()=>{syncF();render()})});\n$(\"f-std-chr\").onclick=()=>{\n  S.f.stdChrOnly=!S.f.stdChrOnly;\n  $(\"f-std-chr\").classList.toggle(\"on\",S.f.stdChrOnly);\n  S.pg=1;render();\n};\ndocument.querySelectorAll(\".log-tog\").forEach(b=>{\n  const c=b.dataset.chart;\n  // reflect the initial default in the button's visual state — otherwise\n  // a log-by-default chart (like runtime) would render in log scale but\n  // the button would look \"off\", which is confusing.\n  b.classList.toggle(\"on\",!!S.logScale[c]);\n  b.onclick=()=>{\n    S.logScale[c]=!S.logScale[c];\n    b.classList.toggle(\"on\",S.logScale[c]);\n    rCharts();\n  };\n});\n\n/* === File load === */\nasync function loadBlob(blob,name){\n  $(\"file-meta\").textContent=\"Loading \"+name+\"...\";\n  try{\n    let text;\n    if(name.endsWith(\".gz\")){\n      if(typeof DecompressionStream===\"undefined\") throw new Error(\"Browser lacks DecompressionStream\");\n      text=await new Response(blob.stream().pipeThrough(new DecompressionStream(\"gzip\"))).text();\n    } else text=await blob.text();\n    ingest(text,name);\n  }catch(e){$(\"file-meta\").textContent=\"Error: \"+e.message;console.error(e)}\n  $(\"file-input\").value=\"\";\n}\n\n// Detect whether line 1 is the header (same as CORE) or just data. svaba\n// writes the file with a header; but we fall back to header-less parsing if\n// the first token isn't \"chromosome\".\nfunction ingest(text,name){\n  const t0=performance.now();\n  const lines=text.replace(/\\r\\n?/g,\"\\n\").split(\"\\n\").filter(l=>l&&!l.startsWith(\"#\"));\n  if(!lines.length)throw new Error(\"empty file\");\n\n  const firstTok=lines[0].split(\"\\t\")[0].toLowerCase();\n  const hasHeader=(firstTok===\"chromosome\");\n  const hdr=hasHeader?lines[0].split(\"\\t\"):CORE.slice();\n  if(hdr.length<CORE.length)\n    throw new Error(\"expected \\u2265\"+CORE.length+\" columns, got \"+hdr.length+\" (first line: \"+lines[0].slice(0,80)+\")\");\n\n  const start=hasHeader?1:0;\n  const rows=[];\n  for(let i=start;i<lines.length;i++){\n    const c=lines[i].split(\"\\t\");\n    if(c.length<CORE.length)continue;\n    rows.push(mkRow(rows.length,c,hdr));\n  }\n\n  S.fn=name;S.hdr=hdr;S.rows=rows;\n  resetF();S.selId=rows.length?rows[0].id:null;S.sort={k:\"runtime_seconds\",d:\"desc\"};\n\n  [\"controls\",\"stats-bar\",\"charts-row-hero\",\"charts-row\",\"table-wrap\",\"pagination\",\"detail-panel\"].forEach(id=>{$(id).style.display=\"\"});\n  $(\"drop-zone\").classList.add(\"loaded\");\n  $(\"file-name\").style.display=\"\";$(\"file-name\").textContent=name;\n  const ms=(performance.now()-t0).toFixed(0);\n  $(\"file-meta\").textContent=name+\" \\u2014 \"+rows.length.toLocaleString()+\" regions \\u2014 parsed in \"+ms+\"ms\";\n  render();\n}\n\nfunction mkRow(id,cells,hdr){\n  const r={id,_c:cells};\n  // Map by header name so extra columns in novel layouts don't shift meaning.\n  hdr.forEach((f,i)=>{r[f]=NUM.has(f)?mNum(cells[i]):cells[i]});\n  r.chromosome=stripH(r.chromosome);\n  r.length=(r.end!=null&&r.start!=null&&isFinite(r.end-r.start))?(r.end-r.start):null;\n  r.weird_total=(safe(r.tumor_weird_reads)+safe(r.normal_weird_reads));\n  r.mate_total=(safe(r.tumor_mate_reads)+safe(r.normal_mate_reads));\n  r.igvLoc=igvLoc(r.chromosome,r.start,r.end);\n  r._st=[r.chromosome,r.start,r.end,r.igvLoc].join(\" \").toLowerCase();\n  return r;\n}\n\n/* === Filters === */\nfunction resetF(){\n  S.f={search:\"\",region:null,rtMin:null,rtMax:null,contigsMin:null,dcMin:null,weirdMin:null,stdChrOnly:false};\n  S.pg=1;S.pgSz=100;\n  [\"f-search\",\"f-region\",\"f-rt-min\",\"f-rt-max\",\"f-contigs-min\",\"f-dc-min\",\"f-weird-min\"].forEach(id=>{$(id).value=\"\"});\n  $(\"f-page-size\").value=\"100\";\n  const sc=$(\"f-std-chr\");if(sc)sc.classList.remove(\"on\");\n}\n\nfunction syncF(){\n  S.f.search=$(\"f-search\").value.trim().toLowerCase();\n  S.f.region=parseReg($(\"f-region\").value.trim());\n  S.f.rtMin=nNum($(\"f-rt-min\").value);S.f.rtMax=nNum($(\"f-rt-max\").value);\n  S.f.contigsMin=nNum($(\"f-contigs-min\").value);\n  S.f.dcMin=nNum($(\"f-dc-min\").value);\n  S.f.weirdMin=nNum($(\"f-weird-min\").value);\n  S.pgSz=Number($(\"f-page-size\").value)||100;S.pg=1;\n}\n\nfunction parseReg(s){\n  if(!s)return null;\n  const m=s.replace(/,/g,\"\").replace(/([Mm])/g,e=>e==='M'||e==='m'?'000000':'').match(/^(chr)?(\\w+?)(?::(\\d+)(?:-(\\d+))?)?$/i);\n  if(!m)return null;\n  return{chr:m[2],start:m[3]?+m[3]:null,end:m[4]?+m[4]:null};\n}\n\nfunction regMatch(r,reg){\n  if(!reg)return true;\n  if(normC(r.chromosome)!==normC(reg.chr))return false;\n  // Overlap: region [reg.start, reg.end] intersects [r.start, r.end]\n  if(reg.start!=null&&r.end!=null&&r.end<reg.start)return false;\n  if(reg.end!=null&&r.start!=null&&r.start>reg.end)return false;\n  return true;\n}\n\nfunction doFilter(){\n  const f=S.f;\n  S.filt=S.rows.filter(r=>{\n    if(f.search&&!r._st.includes(f.search))return false;\n    if(f.region&&!regMatch(r,f.region))return false;\n    if(f.stdChrOnly&&!isStdChr(r.chromosome))return false;\n    if(!nRng(r.runtime_seconds,f.rtMin,f.rtMax))return false;\n    if(!nMin(r.contigs,f.contigsMin))return false;\n    if(!nMin(r.discordant_reads,f.dcMin))return false;\n    if(!nMin(r.weird_total,f.weirdMin))return false;\n    return true;\n  });\n}\n\n/* === Sort === */\nfunction toggleSort(k){if(S.sort.k===k)S.sort.d=S.sort.d===\"asc\"?\"desc\":\"asc\";else{S.sort.k=k;S.sort.d=NUM.has(k)?\"desc\":\"asc\"}}\nfunction doSort(){\n  const d=S.sort.d===\"asc\"?1:-1,k=S.sort.k;\n  S.filt.sort((a,b)=>{\n    let av=a[k],bv=b[k];\n    if(NUM.has(k)||typeof av===\"number\"||typeof bv===\"number\"){av=sn(av);bv=sn(bv);if(av!==bv)return(av-bv)*d}\n    else{const c=String(av||\"\").localeCompare(String(bv||\"\"));if(c)return c*d}\n    return a.id-b.id;\n  });\n}\n\n/* === Render === */\nfunction render(){\n  doFilter();doSort();\n  if(!S.filt.some(r=>r.id===S.selId))S.selId=S.filt.length?S.filt[0].id:null;\n  rStats();rTable();rDetail();rCharts();\n  document.querySelectorAll(\"#thead th\").forEach(th=>{\n    const a=th.querySelector(\".sa\");\n    a.textContent=th.dataset.k===S.sort.k?(S.sort.d===\"asc\"?\"\\u25B2\":\"\\u25BC\"):\"\";\n  });\n}\n\nfunction tPages(){return Math.max(1,Math.ceil(S.filt.length/S.pgSz))}\n\nfunction rStats(){\n  const rts=S.filt.map(r=>r.runtime_seconds).filter(v=>v!=null&&isFinite(v));\n  const sum=rts.reduce((a,b)=>a+b,0);\n  const max=rts.length?Math.max(...rts):0;\n  const mean=rts.length?sum/rts.length:0;\n  const sorted=rts.slice().sort((a,b)=>a-b);\n  const p95=sorted.length?sorted[Math.floor(sorted.length*0.95)-1]||sorted[sorted.length-1]:0;\n  const hottest=S.filt.slice().sort((a,b)=>sn(b.runtime_seconds)-sn(a.runtime_seconds))[0];\n\n  $(\"s-total\").textContent=S.rows.length.toLocaleString();\n  $(\"s-shown\").textContent=S.filt.length.toLocaleString();\n  $(\"s-sumrt\").textContent=fmtDuration(sum);\n  $(\"s-maxrt\").textContent=fmtDuration(max);\n  $(\"s-meanrt\").textContent=fmtDuration(mean);\n  $(\"s-p95rt\").textContent=fmtDuration(p95);\n  $(\"s-hot\").textContent=hottest?(hottest.igvLoc+\" (\"+fmtDuration(hottest.runtime_seconds)+\")\"):\"-\";\n  $(\"export-btn\").disabled=!S.filt.length;\n}\n\n/* === Table === */\nfunction rTable(){\n  const tp=tPages();if(S.pg>tp)S.pg=tp;\n  const s=(S.pg-1)*S.pgSz,e=s+S.pgSz,page=S.filt.slice(s,e);\n  // Color scale: mark the top 10% of filtered rows as \"hot\" and the next 10% as \"warm\".\n  const sortedRt=S.filt.map(r=>r.runtime_seconds).filter(v=>v!=null&&isFinite(v)).sort((a,b)=>b-a);\n  const hotCut=sortedRt.length?sortedRt[Math.max(0,Math.floor(sortedRt.length*0.1)-1)]:Infinity;\n  const warmCut=sortedRt.length?sortedRt[Math.max(0,Math.floor(sortedRt.length*0.25)-1)]:Infinity;\n\n  if(!page.length){$(\"tbody\").innerHTML='<tr><td colspan=\"'+TCOLS.length+'\" style=\"padding:1rem;text-align:center;color:var(--text2)\">No rows match</td></tr>'}\n  else{\n    const h=[];\n    for(const r of page){\n      h.push('<tr data-id=\"'+r.id+'\"'+(r.id===S.selId?' class=\"sel\"':'')+'>');\n      for(const c of TCOLS){\n        let v=r[c.k],cls=c.n?\"num\":\"\";\n        if(c.k===\"igvLoc\"){\n          if(v)h.push('<td><a class=\"igv-link\" href=\"#\" data-locus=\"'+esc(v)+'\" title=\"Click to navigate IGV (requires IGV running on port 60151)\">'+esc(v)+'</a></td>');\n          else h.push('<td>-</td>');\n          continue;\n        }\n        if(c.k===\"runtime_seconds\"){\n          const rt=r.runtime_seconds;\n          if(rt!=null&&isFinite(rt)){\n            if(rt>=hotCut)cls+=\" hot\";\n            else if(rt>=warmCut)cls+=\" warm\";\n          }\n          v=(rt==null||!isFinite(rt))?\"-\":fmtDuration(rt);\n          h.push('<td class=\"'+cls+'\" title=\"'+esc(rt==null?\"\":rt+\" seconds\")+'\">'+esc(v)+'</td>');\n          continue;\n        }\n        if(typeof v===\"number\")v=fN(v);\n        h.push('<td class=\"'+cls+'\">'+esc(v)+'</td>');\n      }\n      h.push('</tr>');\n    }\n    $(\"tbody\").innerHTML=h.join(\"\");\n    $(\"tbody\").querySelectorAll(\"tr[data-id]\").forEach(tr=>{\n      tr.addEventListener(\"mousedown\",e=>{tr._mdx=e.clientX;tr._mdy=e.clientY});\n      tr.onclick=e=>{\n        const dx=e.clientX-(tr._mdx||e.clientX),dy=e.clientY-(tr._mdy||e.clientY);\n        if(Math.hypot(dx,dy)>4)return;\n        const sel=window.getSelection&&window.getSelection();\n        if(sel&&sel.toString().length>0)return;\n        if(e.target&&e.target.closest&&e.target.closest(\"a.igv-link\"))return;\n        S.selId=+tr.dataset.id;rTable();rDetail();\n      };\n    });\n    $(\"tbody\").querySelectorAll(\"a.igv-link\").forEach(a=>{\n      a.addEventListener(\"click\",e=>{\n        e.preventDefault();e.stopPropagation();\n        igvGoto(a.dataset.locus,a);\n      });\n    });\n  }\n  $(\"pg-info\").textContent=\"Page \"+S.pg+\"/\"+tp+\" (\"+S.filt.length.toLocaleString()+\" regions)\";\n  $(\"pg-prev\").disabled=S.pg<=1;$(\"pg-first\").disabled=S.pg<=1;\n  $(\"pg-next\").disabled=S.pg>=tp;$(\"pg-last\").disabled=S.pg>=tp;\n}\n\n/* === Detail === */\nfunction rDetail(){\n  const r=S.filt.find(x=>x.id===S.selId)||S.rows.find(x=>x.id===S.selId);\n  if(!r){$(\"dp-body\").innerHTML='<div class=\"dp-empty\">Click a row</div>';$(\"dp-locus\").textContent=\"-\";return}\n\n  $(\"dp-locus\").innerHTML=(r.igvLoc?\n    '<a class=\"igv-link\" href=\"#\" data-locus=\"'+esc(r.igvLoc)+'\">'+esc(r.igvLoc)+'</a>':\n    '-')+' &middot; '+fmtDuration(r.runtime_seconds)+' &middot; '+fN(r.contigs)+' contigs, '+fN(r.bps)+' bps';\n\n  // Raw columns first, then derived.\n  let h='<table class=\"kv\">';\n  S.hdr.forEach((col,i)=>{\n    h+='<tr><td class=\"k\">'+esc(col)+'</td><td class=\"v\">'+esc(r._c[i])+'</td></tr>';\n  });\n  // Derived\n  h+='<tr><td class=\"k\">length (end-start)</td><td class=\"v\">'+esc(fN(r.length))+'</td></tr>';\n  h+='<tr><td class=\"k\">weird_total</td><td class=\"v\">'+esc(fN(r.weird_total))+'</td></tr>';\n  h+='<tr><td class=\"k\">mate_total</td><td class=\"v\">'+esc(fN(r.mate_total))+'</td></tr>';\n  h+='</table>';\n  $(\"dp-body\").innerHTML=h;\n\n  // Wire the detail-panel IGV link too\n  $(\"dp-body\").parentElement.querySelectorAll(\"a.igv-link\").forEach(a=>{\n    a.addEventListener(\"click\",e=>{e.preventDefault();e.stopPropagation();igvGoto(a.dataset.locus,a)});\n  });\n  const hdrA=$(\"dp-locus\").querySelector(\"a.igv-link\");\n  if(hdrA)hdrA.addEventListener(\"click\",e=>{e.preventDefault();e.stopPropagation();igvGoto(hdrA.dataset.locus,hdrA)});\n}\n\n/* === Charts === */\nfunction rCharts(){\n  const rt=S.filt.map(r=>r.runtime_seconds).filter(v=>v!=null&&isFinite(v)&&v>=0);\n  const ct=S.filt.map(r=>r.contigs).filter(v=>v!=null&&isFinite(v)&&v>=0);\n  const dc=S.filt.map(r=>r.discordant_reads).filter(v=>v!=null&&isFinite(v)&&v>=0);\n  hist(\"c-rt\",S.logScale.rt?rt.map(logp):rt,\"#f87171\",S.logScale.rt);\n  hist(\"c-contigs\",S.logScale.contigs?ct.map(logp):ct,\"#60a5fa\",S.logScale.contigs);\n  hist(\"c-dc\",S.logScale.dc?dc.map(logp):dc,\"#a855f7\",S.logScale.dc);\n}\n\nfunction hist(id,vals,color,isLog){\n  const cv=$(id),ctx=cv.getContext(\"2d\"),dpr=devicePixelRatio||1;\n  const w=cv.clientWidth,h=cv.clientHeight;cv.width=w*dpr;cv.height=h*dpr;\n  ctx.setTransform(dpr,0,0,dpr,0,0);ctx.clearRect(0,0,w,h);\n  if(!vals.length){ctx.fillStyle=\"#555\";ctx.font=\"10px monospace\";ctx.fillText(\"no data\",w/2-18,h/2);return}\n  const nb=Math.min(40,Math.max(8,Math.ceil(Math.sqrt(vals.length))));\n  const mn=Math.min(...vals),mx=Math.max(...vals),rng=mx-mn||1,bw=rng/nb;\n  const bins=new Array(nb).fill(0);\n  for(const v of vals){let i=Math.floor((v-mn)/bw);if(i>=nb)i=nb-1;bins[i]++}\n  const mxB=Math.max(...bins);\n  const p={l:32,r:4,t:4,b:18},pw=w-p.l-p.r,ph=h-p.t-p.b;\n  ctx.fillStyle=color;ctx.globalAlpha=.7;\n  const bW=pw/nb;\n  for(let i=0;i<nb;i++){const bh=mxB>0?(bins[i]/mxB)*ph:0;ctx.fillRect(p.l+i*bW,p.t+ph-bh,Math.max(bW-.5,1),bh)}\n  ctx.globalAlpha=1;ctx.strokeStyle=\"#444\";ctx.lineWidth=.5;\n  ctx.beginPath();ctx.moveTo(p.l,p.t);ctx.lineTo(p.l,p.t+ph);ctx.lineTo(p.l+pw,p.t+ph);ctx.stroke();\n  ctx.fillStyle=\"#777\";ctx.font=\"9px monospace\";ctx.textAlign=\"center\";\n  for(let i=0;i<=3;i++){\n    const tv=mn+rng*i/3;\n    ctx.fillText(isLog?fmtLogp(tv):fmtTick(tv),p.l+pw*i/3,h-2);\n  }\n  if(isLog){ctx.textAlign=\"left\";ctx.fillStyle=\"#6c8cff\";ctx.fillText(\"log10(1+x)\",p.l+2,p.t+9)}\n  ctx.fillStyle=\"#777\";ctx.textAlign=\"right\";\n  for(let i=0;i<=2;i++)ctx.fillText(Math.round(mxB*i/2).toLocaleString(),p.l-2,p.t+ph-ph*i/2+3);\n}\n\n/* === Export === */\nfunction exportTSV(){\n  if(!S.filt.length)return;\n  const lines=[S.hdr.join(\"\\t\")].concat(S.filt.map(r=>r._c.join(\"\\t\")));\n  const blob=new Blob([lines.join(\"\\n\")],{type:\"text/tab-separated-values\"});\n  const u=URL.createObjectURL(blob),a=document.createElement(\"a\");\n  a.href=u;a.download=S.fn.replace(/\\.gz$/i,\"\").replace(/\\.(tsv|txt|log)$/i,\"\")+\".filtered.tsv\";\n  a.click();URL.revokeObjectURL(u);\n}\n\n/* === IGV === */\nfunction igvLoc(chr,start,end){\n  if(chr==null||chr===\"\"||start==null||end==null||!isFinite(+start)||!isFinite(+end))return \"\";\n  let c=String(chr).replace(/^#/,\"\");\n  if(!/^chr/i.test(c))c=\"chr\"+c;\n  // Use 1-based inclusive IGV coords. BAM/BED intervals are 0-based half-open,\n  // but svabaTimer emits 1-based values already (reuses GenomicRegion pos1/pos2).\n  return c+\":\"+start+\"-\"+end;\n}\nfunction igvGoto(locus,anchor){\n  if(!locus)return;\n  const url=\"http://localhost:60151/goto?locus=\"+encodeURIComponent(locus);\n  fetch(url,{mode:\"no-cors\",cache:\"no-store\"})\n    .then(()=>{if(anchor){anchor.classList.remove(\"err\");anchor.classList.add(\"ok\");setTimeout(()=>anchor.classList.remove(\"ok\"),600)}})\n    .catch(()=>{if(anchor){anchor.classList.add(\"err\");setTimeout(()=>anchor.classList.remove(\"err\"),1500)}});\n}\n\n/* === Util === */\nfunction mNum(s){if(s==null||s===\"\"||s===\"NA\"||s===\"x\"||s===\"NOTSET\")return null;const v=+s;return isFinite(v)?v:null}\nfunction nNum(s){if(s===\"\"||s==null)return null;const v=+s;return isFinite(v)?v:null}\nfunction nRng(v,mn,mx){if(mn==null&&mx==null)return true;if(v==null||!isFinite(v))return false;if(mn!=null&&v<mn)return false;if(mx!=null&&v>mx)return false;return true}\nfunction nMin(v,mn){if(mn==null)return true;if(v==null||!isFinite(v))return false;return v>=mn}\nfunction sn(v){if(v===Infinity)return 9e15;if(v==null||Number.isNaN(v))return-9e15;return+v}\nfunction safe(v){return(v==null||!isFinite(v))?0:+v}\nfunction fN(v){if(v==null||v===Infinity)return\"-\";if(!isFinite(v))return String(v);return Math.abs(v)>=1000||Number.isInteger(v)?v.toLocaleString():v.toFixed(3).replace(/\\.?0+$/,\"\")}\nfunction fmtTick(v){if(Math.abs(v)>=1000)return (v/1000).toFixed(1)+\"k\";return Number.isInteger(v)?String(v):v.toFixed(1)}\nfunction fmtDuration(s){\n  if(s==null||!isFinite(s))return\"-\";\n  if(s<1)return (s*1000).toFixed(0)+\"ms\";\n  if(s<60)return s.toFixed(s<10?2:1)+\"s\";\n  if(s<3600){const m=Math.floor(s/60),r=Math.round(s-m*60);return m+\"m\"+(r?(\" \"+r+\"s\"):\"\")}\n  const h=Math.floor(s/3600),m=Math.floor((s-h*3600)/60);return h+\"h\"+(m?(\" \"+m+\"m\"):\"\");\n}\nfunction logp(v){return Math.log10(1+Math.max(0,v))}\nfunction fmtLogp(t){const v=Math.pow(10,t)-1;if(v>=1000)return (v/1000).toFixed(1)+\"k\";if(v>=10)return v.toFixed(0);return v.toFixed(1)}\nfunction stripH(s){return typeof s===\"string\"?s.replace(/^#/,\"\"):s}\nfunction normC(s){return typeof s===\"string\"?s.replace(/^chr/i,\"\").toLowerCase():\"\"}\nfunction isStdChr(c){return /^([1-9]|1[0-9]|2[0-2]|x|y|m|mt)$/i.test(normC(c))}\nfunction esc(v){return String(v==null?\"\":v).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\")}\n\n})();\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/styles.css",
    "content": ":root {\n  --bg: #f3ece1;\n  --bg-deep: #d7e2df;\n  --panel: rgba(255, 251, 246, 0.85);\n  --panel-strong: rgba(255, 253, 250, 0.94);\n  --text: #162430;\n  --muted: #5d6a72;\n  --line: rgba(22, 36, 48, 0.12);\n  --shadow: 0 24px 60px rgba(41, 54, 61, 0.14);\n  --accent: #c65a31;\n  --accent-ink: #7c2d12;\n  --accent-soft: rgba(198, 90, 49, 0.12);\n  --teal: #235b60;\n  --teal-soft: rgba(35, 91, 96, 0.12);\n  --green-soft: rgba(74, 122, 76, 0.14);\n  --danger-soft: rgba(164, 65, 65, 0.12);\n  --mono: \"SFMono-Regular\", \"Menlo\", \"Monaco\", \"Liberation Mono\", monospace;\n  --sans: \"Avenir Next\", \"Segoe UI\", \"Helvetica Neue\", sans-serif;\n  --serif: \"Iowan Old Style\", \"Palatino Linotype\", \"Book Antiqua\", Georgia, serif;\n}\n\n* {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-size: 16px;\n}\n\nbody {\n  margin: 0;\n  min-height: 100vh;\n  color: var(--text);\n  font-family: var(--sans);\n  background:\n    radial-gradient(circle at top left, rgba(217, 153, 96, 0.25), transparent 32%),\n    linear-gradient(160deg, var(--bg) 0%, #f8f4ee 45%, var(--bg-deep) 100%);\n}\n\ncode,\npre,\nth,\ntd,\n.stat-value,\n.chip,\n.status,\n.field input,\n.field select,\n.detail-grid dd {\n  font-family: var(--mono);\n}\n\n.background-glow {\n  position: fixed;\n  inset: auto;\n  width: 32rem;\n  height: 32rem;\n  border-radius: 50%;\n  filter: blur(48px);\n  opacity: 0.45;\n  pointer-events: none;\n  z-index: 0;\n}\n\n.background-glow-a {\n  top: -10rem;\n  right: -8rem;\n  background: rgba(198, 90, 49, 0.2);\n}\n\n.background-glow-b {\n  bottom: -12rem;\n  left: -10rem;\n  background: rgba(35, 91, 96, 0.18);\n}\n\n.page {\n  position: relative;\n  z-index: 1;\n  width: min(1500px, calc(100vw - 2rem));\n  margin: 0 auto;\n  padding: 1rem 0 2rem;\n}\n\n.panel {\n  background: var(--panel);\n  border: 1px solid rgba(255, 255, 255, 0.45);\n  box-shadow: var(--shadow);\n  border-radius: 1.5rem;\n  backdrop-filter: blur(14px);\n}\n\n.hero,\n.filters,\n.table-panel,\n.detail-panel {\n  padding: 1.4rem;\n}\n\n.hero {\n  display: grid;\n  gap: 1.2rem;\n  grid-template-columns: minmax(0, 1.5fr) minmax(280px, 0.8fr);\n  align-items: start;\n}\n\n.hero-copy h1,\n.panel-heading h2 {\n  margin: 0;\n  font-family: var(--serif);\n  font-weight: 700;\n  line-height: 1.04;\n}\n\n.hero-copy h1 {\n  font-size: clamp(2rem, 4vw, 3.6rem);\n  max-width: 12ch;\n}\n\n.hero-text {\n  margin: 1rem 0 0;\n  max-width: 62ch;\n  color: var(--muted);\n  font-size: 1.02rem;\n  line-height: 1.6;\n}\n\n.eyebrow {\n  margin: 0 0 0.45rem;\n  text-transform: uppercase;\n  letter-spacing: 0.18em;\n  font-size: 0.72rem;\n  font-weight: 700;\n  color: var(--teal);\n}\n\n.hero-actions,\n.pagination,\n.panel-heading,\n.chip-heading,\n.preset-group,\n.table-meta {\n  display: flex;\n  align-items: center;\n  gap: 0.75rem;\n}\n\n.hero-actions {\n  margin-top: 1.2rem;\n  flex-wrap: wrap;\n}\n\n.button {\n  appearance: none;\n  border: 0;\n  border-radius: 999px;\n  padding: 0.82rem 1.1rem;\n  font: inherit;\n  cursor: pointer;\n  transition: transform 140ms ease, box-shadow 140ms ease, background 140ms ease;\n}\n\n.button:hover:not(:disabled),\n.button:focus-visible:not(:disabled) {\n  transform: translateY(-1px);\n}\n\n.button:disabled {\n  cursor: not-allowed;\n  opacity: 0.45;\n}\n\n.button-primary {\n  background: linear-gradient(135deg, #12222f, #264053);\n  color: #fdf7f1;\n  box-shadow: 0 16px 32px rgba(18, 34, 47, 0.22);\n}\n\n.button-secondary {\n  background: rgba(255, 255, 255, 0.8);\n  color: var(--text);\n  border: 1px solid var(--line);\n}\n\n.button-ghost {\n  background: transparent;\n  color: var(--text);\n  border: 1px solid var(--line);\n}\n\n.button-small {\n  padding: 0.55rem 0.85rem;\n}\n\n.file-picker input {\n  display: none;\n}\n\n.status {\n  margin: 1rem 0 0;\n  color: var(--muted);\n  line-height: 1.5;\n}\n\n.hero-stats {\n  display: grid;\n  gap: 0.75rem;\n}\n\n.stat-card {\n  padding: 1rem 1.1rem;\n  border-radius: 1.15rem;\n  background: linear-gradient(160deg, var(--panel-strong), rgba(255, 248, 240, 0.8));\n  border: 1px solid rgba(255, 255, 255, 0.55);\n}\n\n.stat-label {\n  display: block;\n  font-size: 0.8rem;\n  color: var(--muted);\n}\n\n.stat-value {\n  display: block;\n  margin-top: 0.45rem;\n  font-size: clamp(1.4rem, 3vw, 2.2rem);\n}\n\n.filters {\n  margin-top: 1rem;\n}\n\n.filter-grid {\n  display: grid;\n  grid-template-columns: repeat(11, minmax(0, 1fr));\n  gap: 0.9rem;\n  margin-top: 1rem;\n}\n\n.field {\n  display: flex;\n  flex-direction: column;\n  gap: 0.45rem;\n  min-width: 0;\n}\n\n.field:first-child {\n  grid-column: span 3;\n}\n\n.field-label {\n  font-size: 0.78rem;\n  font-weight: 700;\n  color: var(--muted);\n}\n\n.field input,\n.field select {\n  width: 100%;\n  border: 1px solid rgba(22, 36, 48, 0.14);\n  background: rgba(255, 255, 255, 0.8);\n  border-radius: 0.95rem;\n  padding: 0.82rem 0.92rem;\n  color: var(--text);\n}\n\n.field input:focus-visible,\n.field select:focus-visible {\n  outline: 2px solid rgba(198, 90, 49, 0.24);\n  outline-offset: 1px;\n}\n\n.preset-row {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 1rem;\n  margin-top: 1rem;\n}\n\n.preset-group {\n  flex-wrap: wrap;\n}\n\n.preset-label {\n  font-size: 0.78rem;\n  color: var(--muted);\n  font-weight: 700;\n}\n\n.chip-section {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 1rem;\n  margin-top: 1.2rem;\n}\n\n.chip-block {\n  padding: 1rem;\n  border-radius: 1.2rem;\n  background: rgba(255, 255, 255, 0.58);\n  border: 1px solid rgba(255, 255, 255, 0.45);\n}\n\n.chip-heading {\n  justify-content: space-between;\n  margin-bottom: 0.8rem;\n}\n\n.chip-heading .eyebrow {\n  margin: 0;\n}\n\n.chip-list {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.55rem;\n}\n\n.chip {\n  padding: 0.55rem 0.75rem;\n  border-radius: 999px;\n  border: 1px solid var(--line);\n  background: rgba(255, 255, 255, 0.78);\n  color: var(--text);\n  font-size: 0.82rem;\n  cursor: pointer;\n  transition: background 120ms ease, border-color 120ms ease, transform 120ms ease;\n}\n\n.chip:hover,\n.chip:focus-visible {\n  transform: translateY(-1px);\n}\n\n.chip.active {\n  background: linear-gradient(135deg, rgba(198, 90, 49, 0.18), rgba(35, 91, 96, 0.12));\n  border-color: rgba(198, 90, 49, 0.4);\n  color: var(--accent-ink);\n}\n\n.workspace {\n  display: grid;\n  grid-template-columns: minmax(0, 1.4fr) minmax(320px, 0.8fr);\n  gap: 1rem;\n  margin-top: 1rem;\n}\n\n.panel-heading {\n  justify-content: space-between;\n  align-items: end;\n}\n\n.panel-heading h2 {\n  font-size: 1.55rem;\n}\n\n.table-meta,\n.detail-content,\n.detail-grid dd,\n.detail-grid dt,\n.table-shell td,\n.table-shell th {\n  font-size: 0.9rem;\n}\n\n.table-shell {\n  margin-top: 1rem;\n  overflow: auto;\n  max-height: 72vh;\n  border-radius: 1rem;\n  border: 1px solid var(--line);\n  background: rgba(255, 255, 255, 0.55);\n}\n\ntable {\n  width: 100%;\n  border-collapse: collapse;\n}\n\nthead th {\n  position: sticky;\n  top: 0;\n  background: rgba(246, 241, 234, 0.94);\n  z-index: 1;\n}\n\nth,\ntd {\n  padding: 0.82rem 0.88rem;\n  border-bottom: 1px solid var(--line);\n  text-align: left;\n  vertical-align: top;\n}\n\ntbody tr {\n  cursor: pointer;\n  transition: background 120ms ease;\n}\n\ntbody tr:hover {\n  background: rgba(198, 90, 49, 0.06);\n}\n\ntbody tr.selected {\n  background: linear-gradient(90deg, rgba(198, 90, 49, 0.12), rgba(35, 91, 96, 0.08));\n}\n\n.sort-button {\n  border: 0;\n  background: transparent;\n  padding: 0;\n  font: inherit;\n  font-weight: 700;\n  cursor: pointer;\n  color: inherit;\n}\n\n.empty-table,\n.detail-empty {\n  padding: 1.4rem;\n  color: var(--muted);\n}\n\n.pagination {\n  justify-content: flex-end;\n  margin-top: 1rem;\n}\n\n.detail-content {\n  margin-top: 1rem;\n}\n\n.detail-header h3 {\n  margin: 0;\n  font-family: var(--serif);\n  font-size: 1.5rem;\n}\n\n.detail-subtitle {\n  margin: 0.5rem 0 0;\n  color: var(--muted);\n}\n\n.detail-tags {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.45rem;\n  margin-top: 0.9rem;\n}\n\n.tag {\n  padding: 0.38rem 0.62rem;\n  border-radius: 999px;\n  background: rgba(255, 255, 255, 0.78);\n  border: 1px solid var(--line);\n  font-size: 0.78rem;\n}\n\n.tag.pass {\n  background: var(--green-soft);\n}\n\n.tag.warn {\n  background: var(--accent-soft);\n}\n\n.tag.low {\n  background: var(--danger-soft);\n}\n\n.detail-grid {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 0.85rem 1rem;\n  margin-top: 1.15rem;\n}\n\n.detail-grid div,\n.sample-card {\n  padding: 0.9rem;\n  border-radius: 1rem;\n  background: rgba(255, 255, 255, 0.62);\n  border: 1px solid var(--line);\n}\n\n.detail-grid dt,\n.sample-card dt {\n  color: var(--muted);\n  margin-bottom: 0.3rem;\n}\n\n.detail-grid dd,\n.sample-card dd {\n  margin: 0;\n  word-break: break-word;\n}\n\n.section-title {\n  margin: 1.2rem 0 0.7rem;\n  font-size: 0.82rem;\n  text-transform: uppercase;\n  letter-spacing: 0.14em;\n  color: var(--teal);\n}\n\n.sample-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n  gap: 0.8rem;\n}\n\n.sample-card dl {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 0.45rem 0.75rem;\n  margin: 0.6rem 0 0;\n}\n\n.raw-block {\n  margin-top: 1rem;\n  padding: 0.95rem;\n  border-radius: 1rem;\n  background: #162430;\n  color: #eff4f3;\n  overflow: auto;\n  line-height: 1.55;\n  font-size: 0.82rem;\n}\n\n.locus-cell strong {\n  display: block;\n}\n\n.locus-cell span,\n.mini-note {\n  color: var(--muted);\n}\n\n.badge {\n  display: inline-flex;\n  align-items: center;\n  padding: 0.2rem 0.45rem;\n  border-radius: 999px;\n  font-size: 0.75rem;\n  background: rgba(35, 91, 96, 0.1);\n  color: var(--teal);\n}\n\n.reveal {\n  animation: rise-in 360ms ease both;\n}\n\n@keyframes rise-in {\n  from {\n    opacity: 0;\n    transform: translateY(10px);\n  }\n\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@media (max-width: 1100px) {\n  .hero,\n  .workspace,\n  .chip-section {\n    grid-template-columns: 1fr;\n  }\n\n  .filter-grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n\n  .field:first-child {\n    grid-column: span 2;\n  }\n}\n\n@media (max-width: 700px) {\n  .page {\n    width: min(100vw - 1rem, 1500px);\n    padding-top: 0.5rem;\n  }\n\n  .hero,\n  .filters,\n  .table-panel,\n  .detail-panel {\n    padding: 1rem;\n  }\n\n  .filter-grid,\n  .detail-grid {\n    grid-template-columns: 1fr;\n  }\n\n  .field:first-child {\n    grid-column: span 1;\n  }\n\n  .panel-heading,\n  .pagination {\n    align-items: flex-start;\n    flex-direction: column;\n  }\n}\n"
  },
  {
    "path": "notes",
    "content": "AlignedContig constructor from BamRecordPtrVector\n--- Makes the alignment fragments\n------ Makes the indel bps from each AlignmentFragment\n--- Make the SV BreakPoints\n------- Makes each BreakEnd -- this will take BamRecordPtr data from AlignmentFragment into the BreakEnd (e.g. nm)\n------- Makes the \"local\" breakpoints and \"secondaries\" breakpoints\n------- Sets the \"global\" breakpoint\n----------- Calls BreakPoint \"set_homologies_insertions\" for all global and local bps\n----------- Calls BreakPoint \"order\" for all \n----------- Sets the BreakPoint SVType\n----------- Instantiates a new Prefix : SampleInfo map\n\nDirectly from BreakPoints\n--- scoreBreakpoints\n------- \"set_evidence\" that sets DSCRD, INDEL, ASDIS, etc\n------- calls SampleInfo -> modelSelection\n--------------- sets the alt cov and total cov\n--------------- calls the __log_likelihood for alt or err\n--------------- calls the __log_likelihood for ref or alt\n--------------- calls the __genotype_likelihoods for 0/0, 0/1 or 1/1\n--------------- calls \"score_somatic\" that sets somatic_lod\n"
  },
  {
    "path": "opt/jemalloc_test.sh",
    "content": "REGION=chr12:10,000,000-12,000,000\nT=/Users/jeremiahwala/Desktop/svaba_compare/SG.wgs.UCLA.2025.01.tumor_cleaned.recal.bam\nN=/Users/jeremiahwala/Desktop/svaba_compare/blood.recal.bam\n\n# prime the page cache so cold-I/O doesn't dominate\nREF=${HOME}/ref_genome/Homo_sapiens_assembly38.fasta\nfor f in $REF ${REF}.bwt ${REF}.sa ${REF}.pac\ndo cat \"$f\" > /dev/null; done\n\n# baseline (system malloc) 3 trials\nfor t in 1 2 3; do\n  /usr/bin/time -l ~/git/svaba/build/svaba run \\\n    -t $T -n $N  -G $REF \\\n    -k $REGION -p 16 -a base_$t 2>&1 \\\n  | tail -15 | grep -E \"real|user|sys|maximum resident\"\ndone\n\n# jemalloc 3 trials\nfor t in 1 2 3; do\n  /usr/bin/time -l env \\\n    DYLD_INSERT_LIBRARIES=$(brew --prefix jemalloc)/lib/libjemalloc.dylib \\\n    DYLD_FORCE_FLAT_NAMESPACE=1 \\\n    MALLOC_CONF=background_thread:true,narenas:24,dirty_decay_ms:10000 \\\n    ~/git/svaba/build/svaba run \\\n    -t $T -n $N -G $REF \\\n    -k $REGION -p 16 -a jem_$t 2>&1 \\\n  | tail -15 | grep -E \"real|user|sys|maximum resident\"\ndone\n"
  },
  {
    "path": "opt/memprof.sh",
    "content": "#!/usr/bin/env bash\nset -euo pipefail\n\nif (( $# < 1 )); then\n  echo \"Usage: $0 <cmd> [args]\"\n  exit 1\nfi\n\nOUT_LOG=\"memlog.txt\"\nPLOT=\"memory.png\"\n\n# Clean slate\n: > \"$OUT_LOG\"\nrm -f \"$PLOT\"\n\n# Start the users command\n\"$@\" &\nPID=$!\necho \"[$(date)] Started PID $PID: $*\" >&2\n\nSTART=$(date +%s)\nLAST_PLOT=$START\n\n# Monitor until the process exits\nwhile kill -0 \"$PID\" 2>/dev/null; do\n  NOW=$(date +%s)\n  ELAPSED=$(( NOW - START ))\n  # Get PSS in KB\n  PSS=$(awk '/^Pss:/ { print $2 }' /proc/\"$PID\"/smaps_rollup 2>/dev/null || echo 0)\n  echo \"$ELAPSED $PSS\" >> \"$OUT_LOG\"\n  \n#  RSS=$(ps -o rss= -p \"$PID\" | awk '{print $1}')\n  #echo \"$ELAPSED $RSS\" >> \"$OUT_LOG\"\n\n  # every 30s replot\n  if (( ELAPSED - (LAST_PLOT - START) >= 30 )); then\n    LAST_PLOT=$NOW\n    Rscript --vanilla - <<EOF\nlibrary(ggplot2)\ndf <- read.table(\"$OUT_LOG\", col.names = c(\"time\",\"mem\"))\n# plot RSS vs time\np <- ggplot(df, aes(x=time, y=mem/1024/1024)) +\n     geom_line() +\n     labs(x=\"Seconds since start\", y=\"RSS (GB)\",\n          title=\"Memory Profile of '$*'\") +\n     theme_minimal()\nggsave(\"$PLOT\", plot=p, width=6, height=4)\nEOF\n    echo \"[$(date)] Updated plot: $PLOT\" >&2\n  fi\n\n  sleep 1\ndone\n\n# One final log entry (in case it just exited)\nNOW=$(date +%s)\nELAPSED=$(( NOW - START ))\nPSS=$(awk '/^Pss:/ { print $2 }' /proc/\"$PID\"/smaps_rollup 2>/dev/null || echo 0)\necho \"$ELAPSED $PSS\" >> \"$OUT_LOG\"\n\n# Final plot\nRscript --vanilla - <<EOF\nlibrary(ggplot2)\ndf <- read.table(\"$OUT_LOG\", col.names = c(\"time\",\"mem\"))\np <- ggplot(df, aes(x=time, y=mem/1024/1024)) +\n     geom_line() +\n     labs(x=\"Seconds since start\", y=\"RSS (GB)\",\n          title=\"Memory Profile of '$*'\") +\n     theme_minimal()\nggsave(\"$PLOT\", plot=p, width=6, height=4)\nEOF\necho \"[$(date)] Final plot: $PLOT\" >&2\n\nwait \"$PID\"\nexit $?\n"
  },
  {
    "path": "opt/memprof_osx.sh",
    "content": "#!/usr/bin/env bash\nset -euo pipefail\nif (( $# < 1 )); then\n  echo \"Usage: $0 <cmd> [args]\"\n  exit 1\nfi\nOUT_LOG=\"memlog.txt\"\nPLOT=\"memory.png\"\n: > \"$OUT_LOG\"\nrm -f \"$PLOT\"\n\"$@\" &\nPID=$!\necho \"[$(date)] Started PID $PID: $*\" >&2\nSTART=$(date +%s)\nLAST_PLOT=$START\nwhile kill -0 \"$PID\" 2>/dev/null; do\n  NOW=$(date +%s)\n  ELAPSED=$(( NOW - START ))\n  # macOS: footprint reports physical memory in bytes (matches Activity Monitor)\nMEM_MB=$(footprint -p \"$PID\" 2>/dev/null \\\n    | awk '/^[[:space:]]*phys_footprint:/ {\n        val=$2; unit=$3;\n        if (unit == \"B\")  val=val/1024/1024;\n        else if (unit == \"KB\") val=val/1024;\n        else if (unit == \"GB\") val=val*1024;\n        # MB stays as-is\n        printf \"%d\\n\", val; exit\n      }')\n  MEM_MB=${MEM_MB:-0}\n  # Convert to KB to match the original log format (R script divides by 1024/1024 for GB)\n  MEM=$(( MEM_MB * 1024 ))  \n\n  echo \"$ELAPSED $MEM\" >> \"$OUT_LOG\"\n  if (( NOW - LAST_PLOT >= 30 )); then\n    LAST_PLOT=$NOW\n    if (( $(wc -l < \"$OUT_LOG\") >= 2 )); then\n      Rscript --vanilla - <<EOF\nsuppressPackageStartupMessages(library(ggplot2))\ndf <- read.table(\"$OUT_LOG\", col.names=c(\"time\",\"mem\"))\np <- ggplot(df, aes(x=time, y=mem/1024/1024)) +\n     geom_line() +\n     labs(x=\"Seconds since start\", y=\"Physical footprint (GB)\",\n          title=\"Memory profile\") +\n     theme_minimal()\nggsave(\"$PLOT\", plot=p, width=6, height=4)\nEOF\n      echo \"[$(date)] Updated plot: $PLOT\" >&2\n    fi\n  fi\n  sleep 1\ndone\nwait \"$PID\" || true\n"
  },
  {
    "path": "opt/memusg.sh",
    "content": "#!/usr/bin/env bash\n# memusg -- Measure memory usage of processes\n# Usage: memusg COMMAND [ARGS]...\n#\n# Author: Jaeho Shin <netj@sparcs.org>\n# Created: 2010-08-16\nset -um\n \n# check input\n[ $# -gt 0 ] || { sed -n '2,/^#$/ s/^# //p' <\"$0\"; exit 1; }\n \n# TODO support more options: peak, footprint, sampling rate, etc.\n \npgid=`ps -o pgid= $$`\n# make sure we're in a separate process group\nif [ $pgid = $(ps -o pgid= $(ps -o ppid= $$)) ]; then\n    cmd=\n    set -- \"$0\" \"$@\"\n    for a; do cmd+=\"'${a//\"'\"/\"'\\\\''\"}' \"; done\n    exec bash -i -c \"$cmd\"\nfi\n \n# detect operating system and prepare measurement\ncase `uname` in\n    Darwin|*BSD) sizes() { /bin/ps -o rss= -g $1; } ;;\n    Linux) sizes() { /bin/ps -o rss= -$1; } ;;\n    *) echo \"`uname`: unsupported operating system\" >&2; exit 2 ;;\nesac\n \n# monitor the memory usage in the background.\n(\npeak=0\nwhile sizes=`sizes $pgid`\ndo\n    set -- $sizes\n    sample=$((${@/#/+}))\n    let peak=\"sample > peak ? sample : peak\"\n    sleep 0.1\ndone\necho \"memusg: peak=$peak\" >&2\n) &\nmonpid=$!\n \n \n# run the given command\nexec \"$@\"\n"
  },
  {
    "path": "opt/profiler.sh",
    "content": "#!/usr/bin/env bash\n\"$@\" & # Run the given command line in the background.\npid=$! peak=0\nrm mem.log\n\n## make the Rscript\nrm -f memplot.R\necho \"require(ggplot2); df = read.table('mem.log', header=FALSE); df\\$time = seq(from=10,to=10*nrow(df), by=10);\" >> memplot.R;\necho \"pdf('memgraph.pdf'); g <- ggplot(df, aes(x=time, y=V1/1024)) + geom_line() + xlab('Time (s)') + ylab('Memory (Mb)') + theme_bw(); print(g); dev.off();\" >> memplot.R;\nchmod +x memplot.R;\n\nwhile true; do\n  sleep 0.1\n  sample=\"$(ps -o rss= $pid 2> /dev/null)\" || break\n  let peak='sample > peak ? sample : peak'\n  echo \"$sample\" >> mem.log\ndone\necho \"Peak: $peak\" 1>&2\n\nRscript memplot.R\n"
  },
  {
    "path": "opt/runtime.R",
    "content": "#!/usr/bin/env Rscript\n\nsuppressPackageStartupMessages({\n  library(data.table)\n  library(ggplot2)\n  library(ggrepel)\n})\n\n# Parse arguments\nargs <- commandArgs(trailingOnly = TRUE)\nif (length(args) < 2) {\n  stop(\"Usage: ./runtime_plot.R input.tsv output.pdf\")\n}\n\ninput_file  <- args[1]\noutput_file <- args[2]\n\n# Read data\ndt <- fread(input_file)\n\n# Only keep chromosomes 1-22 and X\nallowed_chr <- paste0(\"chr\", c(1:22, \"X\"))\ndt <- dt[chromosome %in% allowed_chr]\n\n# Convert start to Mb\ndt[, start_mb := start / 1e6]\n\n# Region label for top runtime labels\ndt[, region_label := paste0(chromosome, \":\", start, \"-\", end)]\n\n# For each chromosome, find top 10 regions by runtime\ntop10 <- dt[, .SD[order(-runtime_seconds)][1:10], by = chromosome]\n\n# Plot with facet by chromosome\np <- ggplot(dt, aes(x = start_mb, y = runtime_seconds)) +\n  geom_point(size = 0.7) +\n  geom_line(aes(group = 1), alpha = 0.7) +  # explicitly group the line\n  geom_text_repel(\n    data         = top10,\n    aes(label = region_label),\n    size         = 2,\n    max.overlaps = Inf,\n    box.padding  = 0.5\n  ) +\n  facet_wrap(~chromosome, scales = \"free_x\", ncol = 5) +\n  labs(\n    title = \"Runtime per Genomic Region by Chromosome\",\n    x     = \"Genomic Start Position (Mb)\",\n    y     = \"Wall Time (seconds)\"\n  ) +\n    scale_y_continuous(limits=c(0,200)) + \n  theme_minimal(base_size = 9) +\n  theme(strip.text = element_text(face = \"bold\")) +\n  scale_x_continuous(expand = expansion(add = c(0.01, 0.01)))  # avoid zero-width panels\n\n# Save a large PDF\nggsave(output_file, plot = p, width = 20, height = 16, dpi = 300)\n"
  },
  {
    "path": "scripts/combine_blacklists.sh",
    "content": "#!/usr/bin/env bash\n#\n# combine_blacklists.sh — combine multiple BED blacklists into one file.\n#\n# \"Combining\" blacklists means a UNION over intervals: a region ends up in the\n# output if ANY of the input files covered it. This is what you almost always\n# want when you're assembling a single --blacklist argument for svaba run out\n# of several sources (high-signal regions, low-mappability, simple repeats,\n# non-standard contigs, high-runtime regions, ad-hoc bad list, etc.).\n#\n# (If you actually need the set intersection — regions blacklisted by ALL\n# sources simultaneously — this is not that script. For that, use\n# `bedtools multiinter -i FILES | awk '$4==NFILES'` or iterated\n# `bedtools intersect`. Intersect-of-blacklists is almost never the right\n# semantics; you'd end up with a tiny output.)\n#\n# What this script does:\n#   1. cat every input BED to stdout with a 5th-column source tag = basename.\n#      Any existing 4th-column label is preserved.\n#   2. Filter out obvious non-BED noise: empty lines, `#` comments,\n#      `track`/`browser` UCSC header lines.\n#   3. By default: sort by (chrom, start) and emit as a 5-column BED.\n#   4. With --merge: run `bedtools merge` to collapse overlapping/adjacent\n#      intervals into one, and collapse the set of contributing source tags\n#      into a comma-separated list in column 4.\n#\n# Usage:\n#     ./combine_blacklists.sh -o OUT.bed [--merge [--slop N]] FILE1.bed FILE2.bed ...\n#\n# Flags:\n#     -o, --output OUT     output path (required)\n#     -m, --merge          sort + bedtools merge the concatenation (union of\n#                          overlapping intervals, with label-distinct column).\n#                          Requires `bedtools` on PATH.\n#     -d, --merge-dist N   pass to bedtools merge -d (intervals within N bp\n#                          are merged). Default 0 (touching/overlapping only).\n#         --slop N         grow each interval by N bp on both sides before\n#                          merging (expands the blacklist). Default 0.\n#                          Requires `bedtools` and --merge.\n#     -c, --clip GENOME    clip every interval's end to the real contig length\n#                          in GENOME, and drop intervals whose start is past the\n#                          contig. GENOME may be a .fai, a two-column tsv\n#                          (chrom<TAB>length), or svaba's tracks/chr fasta-\n#                          header dump (>chrN AC:...  LN:... ...). Unknown\n#                          contigs are passed through unchanged (with a\n#                          warning). This is what saves you from a 250,000,000-\n#                          end sentinel in one of the input BEDs blowing the\n#                          reported covered-bp up to absurd levels.\n#         --no-label       drop the label column(s); emit 3-col BED only\n#     -q, --quiet          suppress progress to stderr\n#     -h, --help           this message\n#\n# Typical invocation (regenerate the project's combined blacklist):\n#\n#   ./combine_blacklists.sh --merge \\\n#     -o tracks/hg38.combined_blacklist.bed \\\n#     tracks/hg38.blacklist.bed \\\n#     tracks/hg38.high_runtime.bed \\\n#     tracks/hg38.extra_badlist.bed \\\n#     tracks/hg38.nonstd_chr.blacklist.bed \\\n#     tracks/hg38.rmsk.simple_repeat.bed\n#\n# The script is idempotent — re-running it always rebuilds OUT from current\n# inputs. Change `high_runtime.bed`, rerun, and the combined file updates.\n\nset -euo pipefail\n\nOUT=\"\"\nMERGE=0\nMERGE_DIST=0\nSLOP=0\nCLIP=\"\"\nNO_LABEL=0\nQUIET=0\nINPUTS=()\n\nlog() { [[ $QUIET -eq 1 ]] || echo \"$@\" >&2; }\n\nusage() { sed -n '2,60p' \"$0\" | sed 's/^# \\{0,1\\}//'; exit \"${1:-0}\"; }\n\n# ---- arg parsing ----\nwhile (( $# )); do\n  case \"$1\" in\n    -o|--output)      OUT=\"$2\"; shift 2 ;;\n    -m|--merge)       MERGE=1; shift ;;\n    -d|--merge-dist)  MERGE_DIST=\"$2\"; shift 2 ;;\n    --slop)           SLOP=\"$2\"; shift 2 ;;\n    -c|--clip)        CLIP=\"$2\"; shift 2 ;;\n    --no-label)       NO_LABEL=1; shift ;;\n    -q|--quiet)       QUIET=1; shift ;;\n    -h|--help)        usage 0 ;;\n    --)               shift; while (( $# )); do INPUTS+=(\"$1\"); shift; done ;;\n    -*)               echo \"Unknown flag: $1\" >&2; usage 2 ;;\n    *)                INPUTS+=(\"$1\"); shift ;;\n  esac\ndone\n\n[[ -z \"$OUT\" ]]       && { echo \"ERROR: -o OUTPUT is required\" >&2; usage 2; }\n[[ ${#INPUTS[@]} -lt 1 ]] && { echo \"ERROR: no input BED files given\" >&2; usage 2; }\n\n# ---- sanity on inputs ----\nfor f in \"${INPUTS[@]}\"; do\n  [[ -f \"$f\" ]] || { echo \"ERROR: input not found: $f\" >&2; exit 1; }\ndone\n\nif [[ $MERGE -eq 1 || $SLOP -gt 0 ]]; then\n  command -v bedtools >/dev/null 2>&1 \\\n    || { echo \"ERROR: --merge/--slop require 'bedtools' on PATH\" >&2; exit 1; }\nfi\n\nif [[ $SLOP -gt 0 && $MERGE -ne 1 ]]; then\n  echo \"ERROR: --slop requires --merge (expanded intervals need to be merged to stay collapsed)\" >&2\n  exit 2\nfi\n\n# ---- work in a tempdir ----\nTMPDIR_LOCAL=\"$(mktemp -d)\"\ntrap 'rm -rf \"$TMPDIR_LOCAL\"' EXIT\nCAT=\"$TMPDIR_LOCAL/cat.bed\"\nSORTED=\"$TMPDIR_LOCAL/sorted.bed\"\nGENOME_TSV=\"$TMPDIR_LOCAL/genome.tsv\"\n\n# ---- optional: parse clip-genome file into a flat chrom<TAB>length TSV ----\n#\n# Accepts three input shapes; we auto-detect:\n#   .fai       : name<TAB>len<TAB>offset<TAB>linebases<TAB>linewidth\n#   genome tsv : name<TAB>len                                (optional extra cols ignored)\n#   tracks/chr : >chrN  AC:...  LN:NNNN  ...                 (fasta-header dump)\nif [[ -n \"$CLIP\" ]]; then\n  [[ -f \"$CLIP\" ]] || { echo \"ERROR: --clip file not found: $CLIP\" >&2; exit 1; }\n  awk -v OFS='\\t' '\n    /^>/ {\n      name=$1; sub(/^>/, \"\", name)\n      ln=\"\"\n      for (i=2;i<=NF;i++) if ($i ~ /^LN:/) { ln=substr($i,4); break }\n      if (ln!=\"\" && ln+0>0) print name, ln\n      next\n    }\n    /^[[:space:]]*$/ {next}\n    /^[[:space:]]*#/ {next}\n    {\n      # .fai or 2-col genome. col1=name, col2=length.\n      if ($2 ~ /^[0-9]+$/ && $2+0 > 0) print $1, $2\n    }\n  ' \"$CLIP\" > \"$GENOME_TSV\"\n  CLIP_N=\"$(wc -l < \"$GENOME_TSV\" | awk '{print $1}')\"\n  [[ \"$CLIP_N\" -gt 0 ]] || { echo \"ERROR: --clip file $CLIP has no usable (name, length) entries\" >&2; exit 1; }\n  log \"combine_blacklists.sh: clip genome loaded from $CLIP ($CLIP_N contigs)\"\nfi\n\nlog \"combine_blacklists.sh: building $OUT from ${#INPUTS[@]} source(s)\"\n\n# ---- step 1: concatenate with a 5th-column source tag ----\n: > \"$CAT\"\nfor f in \"${INPUTS[@]}\"; do\n  src=\"$(basename \"$f\")\"\n  # Drop blank / comment / UCSC-header lines. For each record, collapse leading\n  # whitespace and ensure we end up tab-separated. Keep cols 1-3, promote any\n  # existing col 4 to the label, and append src as col 5.\n  awk -v src=\"$src\" '\n    BEGIN{OFS=\"\\t\"}\n    /^[[:space:]]*$/ {next}\n    /^[[:space:]]*#/ {next}\n    /^[[:space:]]*(track|browser)[[:space:]]/ {next}\n    {\n      # Normalize: the input may already be tab-separated (BED spec) or\n      # whitespace-separated. Use awk default FS (runs of whitespace) but\n      # write tabs on output.\n      chr=$1; start=$2; end=$3\n      if (start !~ /^[0-9]+$/ || end !~ /^[0-9]+$/) next\n      label=\"\"\n      if (NF >= 4) {\n        label=$4\n        for (i=5;i<=NF;i++) label=label\" \"$i\n      }\n      if (label==\"\") print chr, start, end, \"-\", src\n      else          print chr, start, end, label, src\n    }\n  ' \"$f\" >> \"$CAT\"\n  log \"  + $(printf \"%-45s\" \"$src\")  $(wc -l < \"$f\" | awk '{print $1}') lines\"\ndone\n\nRAW_LINES=\"$(wc -l < \"$CAT\" | awk '{print $1}')\"\nlog \"  = $RAW_LINES raw intervals before sort/merge\"\n\n# ---- step 2: sort ----\n# LC_ALL=C to keep sort output stable across locales and compatible with\n# bedtools' lexicographic chrom ordering.\nLC_ALL=C sort -k1,1 -k2,2n \"$CAT\" > \"$SORTED\"\n\n# ---- step 2b: optional clip-to-genome ----\n#\n# Applied BEFORE merge and slop so downstream steps see real coordinates.\n# Intervals on unknown contigs are passed through unchanged (with a single\n# warning). Intervals whose start is beyond the contig length are dropped;\n# intervals whose end overshoots are clipped to the contig length.\nif [[ -n \"$CLIP\" ]]; then\n  CLIPPED=\"$TMPDIR_LOCAL/clipped.bed\"\n  awk -v OFS='\\t' -v genomefile=\"$GENOME_TSV\" '\n    BEGIN {\n      while ((getline < genomefile) > 0) { len[$1] = $2 }\n      close(genomefile)\n      dropped=0; clipped=0; passthrough=0; unknown_n=0\n    }\n    {\n      chr=$1; s=$2; e=$3\n      if (!(chr in len)) {\n        if (!(chr in unknown_seen)) { unknown_seen[chr]=1; unknown_n++ }\n        passthrough++\n        print\n        next\n      }\n      L = len[chr]\n      if (s+0 >= L) { dropped++; next }\n      if (e+0 > L)  { e = L; clipped++ }\n      $2=s; $3=e\n      print\n    }\n    END {\n      fmt=\"  · clip: %d clipped to contig length, %d dropped past contig end, %d intervals on %d unknown contig(s) passed through\\n\"\n      printf fmt, clipped, dropped, passthrough, unknown_n > \"/dev/stderr\"\n      if (unknown_n > 0) {\n        n=0\n        for (c in unknown_seen) {\n          if (n < 5) printf \"    · unknown contig example: %s\\n\", c > \"/dev/stderr\"\n          n++\n        }\n        if (unknown_n > 5) printf \"    · ... (%d unknown contigs total)\\n\", unknown_n > \"/dev/stderr\"\n      }\n    }\n  ' \"$SORTED\" > \"$CLIPPED\"\n  SORTED=\"$CLIPPED\"\nfi\n\n# ---- step 3: emit ----\nif [[ $MERGE -eq 1 ]]; then\n  # bedtools merge collapses overlapping / touching intervals. We carry the\n  # source tag (col 5) into the collapsed output as a comma-separated set\n  # of contributing sources via -c 5 -o distinct; and also collapse the\n  # original labels via col 4 so downstream tools still see a human-readable\n  # label column.\n  #\n  # Layout of the intermediate we feed to bedtools:\n  #   chr start end label src\n  # After merge with -c 4,5 -o distinct,distinct we get:\n  #   chr start end label_set src_set\n\n  if [[ $SLOP -gt 0 ]]; then\n    GEN=\"$TMPDIR_LOCAL/genome.tsv\"\n    # Try to derive a genome file from the first input's chroms as max(end).\n    # This is a permissive fallback; if you have a real .fai / .genome file\n    # available, you can swap this with `bedtools slop -g your.genome`.\n    awk 'BEGIN{OFS=\"\\t\"} {if($3>m[$1]) m[$1]=$3} END{for (k in m) print k, m[k]}' \\\n      \"$SORTED\" > \"$GEN\"\n    SLOPPED=\"$TMPDIR_LOCAL/slopped.bed\"\n    bedtools slop -i \"$SORTED\" -g \"$GEN\" -b \"$SLOP\" > \"$SLOPPED\"\n    LC_ALL=C sort -k1,1 -k2,2n \"$SLOPPED\" > \"$SORTED\"\n    log \"  · slopped +/-${SLOP}bp (genome inferred from max end per chrom)\"\n  fi\n\n  MERGED=\"$TMPDIR_LOCAL/merged.bed\"\n  bedtools merge -i \"$SORTED\" -d \"$MERGE_DIST\" -c 4,5 -o distinct,distinct \\\n    > \"$MERGED\"\n  MERGED_LINES=\"$(wc -l < \"$MERGED\" | awk '{print $1}')\"\n  log \"  · bedtools merge (d=$MERGE_DIST) : $RAW_LINES -> $MERGED_LINES intervals\"\n\n  if [[ $NO_LABEL -eq 1 ]]; then\n    cut -f1-3 \"$MERGED\" > \"$OUT\"\n  else\n    # 5 cols: chr start end label-set source-set\n    cp \"$MERGED\" \"$OUT\"\n  fi\nelse\n  if [[ $NO_LABEL -eq 1 ]]; then\n    cut -f1-3 \"$SORTED\" > \"$OUT\"\n  else\n    # 5 cols: chr start end label src (pre-merge, duplicates preserved)\n    cp \"$SORTED\" \"$OUT\"\n  fi\nfi\n\nFINAL_LINES=\"$(wc -l < \"$OUT\" | awk '{print $1}')\"\nFINAL_BP=\"$(awk 'BEGIN{s=0} {s+=$3-$2} END{print s+0}' \"$OUT\")\"\nlog \"combine_blacklists.sh: wrote $OUT  ($FINAL_LINES intervals, $(printf \"%'d\" \"$FINAL_BP\") bp covered)\"\n\n# Sanity check: the human genome is ~3.1 Gbp (~3.2 Gbp incl. alts). If the\n# reported coverage is larger than a loose 10 Gbp threshold, the input almost\n# certainly contains synthetic \"end-of-contig\" sentinels (e.g. end=250000000\n# on short alt contigs) and the user should rerun with --clip GENOME to get\n# a meaningful number.\nif [[ $FINAL_BP -gt 10000000000 ]]; then\n  log \"\"\n  log \"WARNING: $(printf \"%'d\" $FINAL_BP) bp is larger than any reasonable reference.\"\n  if [[ -z \"$CLIP\" ]]; then\n    log \"  Likely cause: an input BED uses oversized end coordinates as a 'whole\"\n    log \"  contig' shorthand (e.g. end=250000000 on short alt contigs). Rerun\"\n    log \"  with  --clip tracks/chr  (or a .fai / genome tsv) to clip each\"\n    log \"  interval to its real contig length before the bp tally.\"\n  else\n    log \"  --clip was used; the oversize is probably legitimate (very large\"\n    log \"  genome) or caused by intervals on contigs missing from your clip\"\n    log \"  genome file — check the 'unknown contig' lines above.\"\n  fi\nfi\n"
  },
  {
    "path": "scripts/extract_by_qname.sh",
    "content": "#!/bin/bash\n# ============================================================\n# Extract all reads from a target BAM whose QNAMEs appear in\n# a query BAM.\n#\n# Both inputs can be coordinate-sorted. We extract QNAMEs from\n# the query BAM into a hash set, then stream the target BAM and\n# keep any record whose QNAME is in the set. No requirement that\n# the BAMs are sorted the same way, or at all.\n#\n# Usage:\n#   ./extract_by_qname.sh <query.bam> <target.bam> <output.bam>\n#\n# Example:\n#   ./extract_by_qname.sh matches.bam /mnt/ssd/tumor.recal.bam out.bam\n# ============================================================\n\nset -euo pipefail\n\nif [ $# -ne 3 ]; then\n    echo \"Usage: $0 <query.bam> <target.bam> <output.bam>\" >&2\n    echo \"  Extracts from target.bam all reads whose QNAME appears\" >&2\n    echo \"  in query.bam. Writes sorted, indexed BAM to output.bam.\" >&2\n    exit 1\nfi\n\nQUERY_BAM=\"$1\"\nTARGET_BAM=\"$2\"\nOUT_BAM=\"$3\"\nTHREADS=${THREADS:-8}\n\n# ---- Sanity checks ----\nfor f in \"$QUERY_BAM\" \"$TARGET_BAM\"; do\n    if [ ! -f \"$f\" ]; then\n        echo \"ERROR: BAM not found: $f\" >&2\n        exit 1\n    fi\ndone\n\nif ! command -v samtools >/dev/null 2>&1; then\n    echo \"ERROR: samtools not found in PATH\" >&2\n    exit 1\nfi\n\n# ---- Use a scratch dir for intermediate files ----\nTMPDIR=$(mktemp -d -t extract_qname.XXXXXX)\ntrap \"rm -rf $TMPDIR\" EXIT\nQNAME_LIST=\"$TMPDIR/qnames.txt\"\n\necho \"Temp dir: $TMPDIR\" >&2\n\n# ---- Step 1: extract unique QNAMEs from query BAM ----\necho \"[1/3] Extracting QNAMEs from $QUERY_BAM...\" >&2\nsamtools view -@ \"$THREADS\" \"$QUERY_BAM\" \\\n    | awk '{print $1}' \\\n    | sort -u \\\n    > \"$QNAME_LIST\"\n\nN_QNAMES=$(wc -l < \"$QNAME_LIST\")\necho \"  Found $N_QNAMES unique QNAMEs\" >&2\n\nif [ \"$N_QNAMES\" -eq 0 ]; then\n    echo \"ERROR: No QNAMEs found in query BAM\" >&2\n    exit 1\nfi\n\n# ---- Step 2: stream target BAM, filter by QNAME ----\necho \"[2/3] Filtering $TARGET_BAM...\" >&2\n# Use awk with a hash lookup - O(1) per read, linear in target BAM size\nsamtools view -@ \"$THREADS\" -h \"$TARGET_BAM\" \\\n    | awk -v list=\"$QNAME_LIST\" '\n        BEGIN {\n            while ((getline line < list) > 0) {\n                qnames[line] = 1\n            }\n            close(list)\n        }\n        /^@/ { print; next }\n        ($1 in qnames) { print }\n      ' \\\n    | samtools view -@ \"$THREADS\" -b -o \"$TMPDIR/unsorted.bam\" -\n\n# ---- Step 3: sort and index ----\necho \"[3/3] Sorting and indexing output...\" >&2\nsamtools sort -@ \"$THREADS\" -o \"$OUT_BAM\" \"$TMPDIR/unsorted.bam\"\nsamtools index -@ \"$THREADS\" \"$OUT_BAM\"\n\n# ---- Report ----\nN_OUT=$(samtools view -c \"$OUT_BAM\")\necho \"\" >&2\necho \"Done.\" >&2\necho \"  Query QNAMEs:       $N_QNAMES\" >&2\necho \"  Output reads:       $N_OUT\" >&2\necho \"  (Output includes all alignments per QNAME - primary, secondary,\" >&2\necho \"   supplementary, and both mates of pairs.)\" >&2\necho \"  Output: $OUT_BAM + ${OUT_BAM%.bam}.bam.bai\" >&2\n"
  },
  {
    "path": "scripts/extract_discordants.sh",
    "content": "#!/bin/bash\n\nprefix=$1\n##prefix=\"${1%%.*}\"\n/usr/bin/samtools view -h ${prefix}.weird.bam | grep -E '^@|DC:Z' | /usr/bin/samtools view -b -o tmp.filtered.bam\n/usr/bin/samtools sort -o ${prefix}.dc.bam tmp.filtered.bam\n/usr/bin/samtools index ${prefix}.dc.bam\nrm tmp.filtered.bam\n\nTARGET=$2\nif [[ -n \"$TARGET\" ]]; then\n    /usr/bin/samtools view -h ${prefix}.dc.bam | \\\n\tawk -v pat=\"${TARGET}\" 'BEGIN{OFS=\"\\t\"} /^@/ {print; next} $0 ~ pat {print}' | \\\n\t/usr/bin/samtools view -b -o dc.${TARGET}.bam\n  /usr/bin/samtools index dc.${TARGET}.bam\nfi\n"
  },
  {
    "path": "scripts/extract_pairs_by_seq.sh",
    "content": "#!/bin/bash\n# ============================================================\n# Extract read pairs from a BAM where either mate contains any\n# of the given sequences (or their reverse complements).\n#\n# Two-pass approach on the target BAM:\n#   Pass 1: stream through BAM, collect QNAMEs of reads whose\n#           SEQ matches any query sequence or its reverse complement\n#   Pass 2: stream through BAM again, extract ALL reads (both mates,\n#           plus supplementary/secondary) whose QNAME was collected\n#\n# Usage:\n#   ./extract_pairs_by_seq.sh <target.bam> <output.bam> <seq1> [seq2 ...]\n#\n# Example:\n#   ./extract_pairs_by_seq.sh tumor.bam fusion_reads.bam \\\n#       ACGTACGTACGT TTACGATCGATC\n# ============================================================\n\nset -euo pipefail\n\n# ---- Args ----\nif [ $# -lt 3 ]; then\n    echo \"Usage: $0 <target.bam> <output.bam> <seq1> [seq2 ...]\" >&2\n    echo \"  Extracts read pairs where either mate matches any sequence\" >&2\n    echo \"  (or its reverse complement).\" >&2\n    echo \"  Output: sorted, indexed BAM + BAI.\" >&2\n    exit 1\nfi\n\nTARGET_BAM=\"$1\"\nOUT_BAM=\"$2\"\nshift 2\nSEQS=(\"$@\")\n\nTHREADS=${THREADS:-8}\nAWK_BIN=$(command -v mawk || command -v awk)\n\n# ---- Sanity checks ----\nif [ ! -f \"$TARGET_BAM\" ]; then\n    echo \"ERROR: Target BAM not found: $TARGET_BAM\" >&2\n    exit 1\nfi\n\nif ! command -v samtools >/dev/null 2>&1; then\n    echo \"ERROR: samtools not found in PATH\" >&2\n    exit 1\nfi\n\n# ---- Scratch dir ----\nTMPDIR=$(mktemp -d -t extract_pairs.XXXXXX)\ntrap \"rm -rf $TMPDIR\" EXIT\nQNAME_LIST=\"$TMPDIR/qnames.txt\"\n\necho \"Target: $TARGET_BAM\" >&2\necho \"Output: $OUT_BAM\" >&2\necho \"Temp:   $TMPDIR\" >&2\necho \"Awk:    $AWK_BIN\" >&2\necho \"Threads: $THREADS\" >&2\necho \"\" >&2\n\n# ---- Build combined regex: seq1|revcomp1|seq2|revcomp2|... ----\nrevcomp() {\n    echo \"$1\" | tr 'acgtnACGTN' 'tgcanTGCAN' | rev\n}\n\nPATTERNS=()\necho \"Query sequences (with reverse complements):\" >&2\nfor seq in \"${SEQS[@]}\"; do\n    seq_up=$(echo \"$seq\" | tr 'a-z' 'A-Z' | tr -d '[:space:]')\n    rc=$(revcomp \"$seq_up\")\n    PATTERNS+=(\"$seq_up\" \"$rc\")\n    echo \"  $seq_up  (rc: $rc)\" >&2\ndone\nPATTERN=$(IFS='|'; echo \"${PATTERNS[*]}\")\necho \"\" >&2\n\n# ---- PASS 1: find QNAMEs whose SEQ matches ----\necho \"[Pass 1/2] Scanning $TARGET_BAM for matching sequences...\" >&2\nsamtools view -@ \"$THREADS\" \"$TARGET_BAM\" \\\n    | \"$AWK_BIN\" -v pat=\"$PATTERN\" '$10 ~ pat {print $1}' \\\n    | sort -u \\\n    > \"$QNAME_LIST\"\n\nN_QNAMES=$(wc -l < \"$QNAME_LIST\")\necho \"  Matching QNAMEs: $N_QNAMES\" >&2\n\nif [ \"$N_QNAMES\" -eq 0 ]; then\n    echo \"No matches found. Exiting without creating output.\" >&2\n    exit 0\nfi\n\n# ---- PASS 2: extract all alignments for those QNAMEs (both mates) ----\necho \"[Pass 2/2] Extracting all alignments for matching QNAMEs...\" >&2\nsamtools view -@ \"$THREADS\" -h \"$TARGET_BAM\" \\\n    | \"$AWK_BIN\" -v list=\"$QNAME_LIST\" '\n        BEGIN {\n            while ((getline line < list) > 0) {\n                qnames[line] = 1\n            }\n            close(list)\n        }\n        /^@/ { print; next }\n        ($1 in qnames) { print }\n      ' \\\n    | samtools view -@ \"$THREADS\" -b -o \"$TMPDIR/unsorted.bam\" -\n\n# ---- Sort and index ----\necho \"Sorting and indexing...\" >&2\nsamtools sort -@ \"$THREADS\" -o \"$OUT_BAM\" \"$TMPDIR/unsorted.bam\"\nsamtools index -@ \"$THREADS\" \"$OUT_BAM\"\n\n# ---- Report ----\nN_OUT=$(samtools view -c \"$OUT_BAM\")\nN_PRIMARY=$(samtools view -c -F 2304 \"$OUT_BAM\")  # exclude secondary + supplementary\n\necho \"\" >&2\necho \"Done.\" >&2\necho \"  Matching QNAMEs (read pairs):  $N_QNAMES\" >&2\necho \"  Total alignments in output:    $N_OUT\" >&2\necho \"  Primary alignments (both mates): $N_PRIMARY\" >&2\necho \"  Output: $OUT_BAM + ${OUT_BAM%.bam}.bam.bai\" >&2\n"
  },
  {
    "path": "scripts/filter_contig_supporting_reads.sh",
    "content": "#!/usr/bin/env bash\n#\n# filter_contig_supporting_reads.sh\n#\n# Filter a svaba *.corrected.bam down to just the reads whose r2c (read-to-\n# contig) BWA alignment landed on a single named contig. The contig name is\n# matched against the `bi` aux tag that svaba writes onto each corrected\n# read (one tag value per r2c hit, comma-separated). Output is a coordinate-\n# sorted+indexed BAM for easy IGV inspection.\n\nset -euo pipefail\n\nPROG=\"$(basename \"$0\")\"\n\nusage() {\n  cat <<EOF\nUsage: ${PROG} -i ID -c CONTIG [-o OUT] [-t THREADS]\n       ${PROG} ID CONTIG                       # positional shorthand\n\nFilter \\${ID}.corrected.bam down to reads that r2c-aligned to CONTIG (matched\nagainst the 'bi' aux tag) and write a sorted+indexed BAM.\n\nRequired:\n  -i, --id      ID         svaba sample/run prefix; expects \\${ID}.corrected.bam\n                           in the current directory (or a path; .corrected.bam\n                           is appended if it doesn't end in .bam).\n  -c, --contig  CONTIG     Contig name to filter on (e.g.\n                           c_fermi_chr12_13405500_13430500_13C).\n\nOptional:\n  -o, --out     OUT        Output BAM path (default: \\${ID}.\\${CONTIG}.bam).\n  -t, --threads N          Threads passed to samtools sort (default: 4).\n  -h, --help               Show this help and exit.\n\nExample:\n  ${PROG} -i tumor_run1 -c c_fermi_chr12_13405500_13430500_13C\n  ${PROG} tumor_run1 c_fermi_chr12_13405500_13430500_13C -o chr12_13C.bam\nEOF\n}\n\n# --- arg parsing ------------------------------------------------------------\nID=\"\"\nCONTIG=\"\"\nOUT=\"\"\nTHREADS=4\nPOS=()\n\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    -h|--help)    usage; exit 0 ;;\n    -i|--id)      ID=\"$2\";      shift 2 ;;\n    -c|--contig)  CONTIG=\"$2\";  shift 2 ;;\n    -o|--out)     OUT=\"$2\";     shift 2 ;;\n    -t|--threads) THREADS=\"$2\"; shift 2 ;;\n    --)           shift; POS+=(\"$@\"); break ;;\n    -*)           echo \"${PROG}: unknown option: $1\" >&2; usage >&2; exit 2 ;;\n    *)            POS+=(\"$1\"); shift ;;\n  esac\ndone\n\n# Positional fallback: ID CONTIG\nif [[ -z \"$ID\"     && ${#POS[@]} -ge 1 ]]; then ID=\"${POS[0]}\"; fi\nif [[ -z \"$CONTIG\" && ${#POS[@]} -ge 2 ]]; then CONTIG=\"${POS[1]}\"; fi\n\nif [[ -z \"$ID\" || -z \"$CONTIG\" ]]; then\n  echo \"${PROG}: missing required argument(s)\" >&2\n  usage >&2\n  exit 2\nfi\n\n# --- resolve input/output paths --------------------------------------------\nif [[ \"$ID\" == *.bam ]]; then\n  IN_BAM=\"$ID\"\n  ID_BASE=\"${ID%.corrected.bam}\"\n  ID_BASE=\"${ID_BASE%.bam}\"\nelse\n  IN_BAM=\"${ID}.corrected.bam\"\n  ID_BASE=\"$ID\"\nfi\n\nif [[ ! -f \"$IN_BAM\" ]]; then\n  echo \"${PROG}: input BAM not found: ${IN_BAM}\" >&2\n  exit 1\nfi\n\nif [[ -z \"$OUT\" ]]; then\n  OUT=\"${ID_BASE}.${CONTIG}.bam\"\nfi\n\n# --- check tools ------------------------------------------------------------\ncommand -v samtools >/dev/null 2>&1 || {\n  echo \"${PROG}: samtools not found on PATH\" >&2; exit 127;\n}\n\n# --- filter -----------------------------------------------------------------\necho \"${PROG}: ID        = ${ID_BASE}\" >&2\necho \"${PROG}: input     = ${IN_BAM}\"  >&2\necho \"${PROG}: contig    = ${CONTIG}\"  >&2\necho \"${PROG}: output    = ${OUT}\"     >&2\necho \"${PROG}: threads   = ${THREADS}\" >&2\n\nsamtools view -h -e \"[bi]=~\\\"${CONTIG}\\\"\" \"${IN_BAM}\" \\\n  | samtools sort -@\"${THREADS}\" -o \"${OUT}\" -\nsamtools index \"${OUT}\"\n\necho \"${PROG}: wrote ${OUT} (+ ${OUT}.bai)\" >&2\n"
  },
  {
    "path": "scripts/gcloud_teardown.sh",
    "content": "#!/usr/bin/env bash\n#\n# gcloud_teardown.sh — kill svaba cloud workers and clean up the bucket.\n#\n# Usage:\n#   gcloud_teardown.sh [options]\n#\n#   --id STR          analysis ID (default: my_run)\n#   --partitions N    number of workers (default: 5)\n#   --zone ZONE       GCP zone (default: us-central1-a)\n#   --bucket gs://... GCS bucket to clean (default: gs://osteosarc-private/svaba-run)\n#   --keep-bucket     don't delete bucket contents\n#   -h, --help        this message\n#\n\nset -euo pipefail\n\nID=\"my_run\"\nPARTITIONS=5\nZONE=\"us-central1-a\"\nBUCKET=\"gs://osteosarc-private/svaba-run\"\nCLEAN_BUCKET=1\n\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    --id)          ID=\"$2\";         shift 2 ;;\n    --partitions)  PARTITIONS=\"$2\"; shift 2 ;;\n    --zone)        ZONE=\"$2\";       shift 2 ;;\n    --bucket)      BUCKET=\"$2\";     shift 2 ;;\n    --keep-bucket) CLEAN_BUCKET=0;  shift ;;\n    -h|--help)     sed -n '2,14p' \"$0\" | sed 's/^# \\{0,1\\}//'; exit 0 ;;\n    *)             echo \"unknown option: $1\" >&2; exit 2 ;;\n  esac\ndone\n\nGCP_ID=$(echo \"$ID\" | tr '[:upper:]' '[:lower:]' | tr '_' '-' | sed 's/[^a-z0-9-]//g')\n\n# 1. Delete worker VMs\necho \"deleting $PARTITIONS workers (${GCP_ID})...\"\nfor i in $(seq 1 \"$PARTITIONS\"); do\n  vm=\"svaba-${GCP_ID}-worker-${i}\"\n  if gcloud compute instances describe \"$vm\" --zone=\"$ZONE\" &>/dev/null; then\n    echo \"  deleting $vm\"\n    gcloud compute instances delete \"$vm\" --zone=\"$ZONE\" --quiet &\n  else\n    echo \"  $vm not found, skipping\"\n  fi\ndone\nwait\n\n# 2. Clean up the bucket\nif [[ $CLEAN_BUCKET -eq 1 ]]; then\n  echo \"cleaning bucket ${BUCKET}/...\"\n  gsutil -m rm \"${BUCKET}/**\" 2>/dev/null || true\n  echo \"bucket cleaned\"\nelse\n  echo \"keeping bucket contents (--keep-bucket)\"\nfi\n\necho \"teardown complete\"\n"
  },
  {
    "path": "scripts/mosdepth_lowmapq_blacklist.sh",
    "content": "#!/usr/bin/env bash\n#\n# mosdepth_lowmapq_blacklist.sh — flag regions dominated by multi-mappers.\n#\n# Given paired mosdepth regions.bed.gz outputs, one unfiltered by MAPQ and\n# one MAPQ-filtered, emit a BED of genomic windows where the fraction of\n# reads passing the MAPQ filter is low enough that the locus is effectively\n# \"unmapped\" for any caller that only trusts unique placements. These are\n# prime candidate blacklist intervals for svaba.\n#\n# The input pair must come from the SAME BAM with the SAME --by, differing\n# only in --mapq. Typical generation:\n#\n#   mosdepth --by 1000 --fast-mode --mapq  0 --threads 4 unf  SAMPLE.bam\n#   mosdepth --by 1000 --fast-mode --mapq 30 --threads 4 filt SAMPLE.bam\n#\n# mosdepth writes half-open 0-based BED with 4 columns:\n#   chrom  start  end  mean_depth\n#\n# This script joins the two files row-by-row (they are bin-aligned), computes\n#   ratio = filt_mean_depth / unf_mean_depth\n# and flags windows that pass BOTH of:\n#   unf_mean_depth >= --min-cov         (skip near-empty bins where 0/0 dominates)\n#   ratio          <  --max-ratio       (most reads are multi-mappers)\n#\n# Flagged per-bin rows are then bedtools-merged with --merge-gap into\n# contiguous intervals, carrying the worst ratio and peak coverage forward\n# so the merged output has useful label columns.\n#\n# The merged BED plugs straight into `combine_blacklists.sh` alongside your\n# other component BEDs (tracks/hg38.blacklist.sorted.bed, high_runtime.bed,\n# rmsk.simple_repeat.bed, etc.).\n#\n# Usage:\n#   mosdepth_lowmapq_blacklist.sh [OPTIONS] UNF.regions.bed.gz FILT.regions.bed.gz\n#\n# Options:\n#   --min-cov N         minimum unfiltered mean depth for a bin to be\n#                       considered (default 10). Bins below this get skipped\n#                       entirely — you do not want a 0/1 accidental flag on\n#                       an empty region.\n#   --max-ratio R       flag if filt/unf < R (default 0.5). Lower = stricter.\n#                       Typical blacklist tuning range is 0.3 – 0.7.\n#   --merge-gap N       bedtools merge -d value (default 1000). Flagged bins\n#                       within N bp of each other get coalesced into one\n#                       interval.\n#   --out PREFIX        output prefix (default ./lowmapq).\n#   --dump-per-region   also emit ${PREFIX}.per_region.tsv.gz with every\n#                       considered bin (chr start end unf filt ratio). Off\n#                       by default — on a WGS BAM this file is ~coverage-\n#                       file-sized.\n#   -h | --help         show this help\n#\n# Outputs (always):\n#   ${PREFIX}.flagged.bed         one row per flagged bin, cols:\n#                                   chr  start  end  ratio  unf_cov_rounded\n#   ${PREFIX}.flagged.merged.bed  bedtools-merged intervals, cols:\n#                                   chr  start  end  min_ratio  max_cov\n#                                 (min_ratio = worst ratio inside the merged\n#                                  block; max_cov = peak unfiltered coverage)\n#   ${PREFIX}.summary.txt         coverage + flag tallies\n#\n# Outputs (optional):\n#   ${PREFIX}.per_region.tsv.gz   with --dump-per-region\n#\n# Requires: gzip, awk, sort, bedtools on PATH.\n\nset -euo pipefail\n\nMIN_COV=10\nMAX_RATIO=0.5\nMERGE_GAP=1000\nOUT_PREFIX=lowmapq\nDUMP_PER=0\n\nusage() {\n  cat <<'EOF'\nmosdepth_lowmapq_blacklist.sh — flag regions dominated by multi-mappers.\n\nUsage:\n  mosdepth_lowmapq_blacklist.sh [OPTIONS] UNF.regions.bed.gz FILT.regions.bed.gz\n\nThe two inputs must come from the SAME BAM with the SAME --by on mosdepth,\ndiffering only in --mapq. Example generation:\n  mosdepth --by 1000 --fast-mode --mapq  0 --threads 4 unf  sample.bam\n  mosdepth --by 1000 --fast-mode --mapq 30 --threads 4 filt sample.bam\n\nOptions:\n  --min-cov N         minimum unf mean-depth for a bin to be considered (default 10)\n  --max-ratio R       flag if filt/unf < R (default 0.5); 0.3 stricter, 0.7 looser\n  --merge-gap N       bedtools merge -d value (default 1000 bp)\n  --out PREFIX        output prefix (default lowmapq)\n  --dump-per-region   also write ${PREFIX}.per_region.tsv.gz\n  -h, --help          show this message\n\nOutputs:\n  ${PREFIX}.flagged.bed         flagged bins:  chr start end ratio unf_cov\n  ${PREFIX}.flagged.merged.bed  merged:        chr start end min_ratio max_cov\n  ${PREFIX}.summary.txt         coverage + flag tallies\n\nSee the header comment in this script for the full rationale / column docs.\nEOF\n  exit 0\n}\n\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    --min-cov)         MIN_COV=$2; shift 2 ;;\n    --max-ratio)       MAX_RATIO=$2; shift 2 ;;\n    --merge-gap)       MERGE_GAP=$2; shift 2 ;;\n    --out)             OUT_PREFIX=$2; shift 2 ;;\n    --dump-per-region) DUMP_PER=1; shift ;;\n    -h|--help)         usage ;;\n    --)                shift; break ;;\n    -*)                echo \"unknown option: $1\" >&2; exit 2 ;;\n    *)                 break ;;\n  esac\ndone\n\nif [[ $# -ne 2 ]]; then\n  echo \"usage: $0 [opts] UNF.regions.bed.gz FILT.regions.bed.gz\" >&2\n  echo \"       (try -h for full docs)\" >&2\n  exit 2\nfi\nUNF=$1\nFILT=$2\n\nfor t in gzip awk sort bedtools; do\n  command -v \"$t\" >/dev/null || { echo \"ERROR: $t not on PATH\" >&2; exit 1; }\ndone\nfor f in \"$UNF\" \"$FILT\"; do\n  [[ -f $f ]] || { echo \"ERROR: file not found: $f\" >&2; exit 1; }\ndone\n\n# Make sure the output directory exists if the user passed a pathy prefix.\nOUT_DIR=$(dirname -- \"$OUT_PREFIX\")\n[[ -d \"$OUT_DIR\" ]] || mkdir -p \"$OUT_DIR\"\n\necho \"mosdepth_lowmapq_blacklist:\"\necho \"  unf=$UNF\"\necho \"  filt=$FILT\"\necho \"  min_cov=$MIN_COV  max_ratio=$MAX_RATIO  merge_gap=$MERGE_GAP\"\necho \"  out_prefix=$OUT_PREFIX  dump_per_region=$DUMP_PER\"\n\n# ---- 1. Join and filter -----------------------------------------------------\n# Both mosdepth files were emitted from the same --by on the same reference,\n# so their row-1..row-N bins are identical. We paste them and sanity-check\n# the coords on every row — a mismatch usually means the user accidentally\n# paired files from different BAMs or different --by values, which makes the\n# ratio meaningless.\nflagged=\"${OUT_PREFIX}.flagged.bed\"\ntmp_flag=$(mktemp)\ntmp_per=$(mktemp)\ntrap 'rm -f \"$tmp_flag\" \"$tmp_per\" \"${tmp_per}.gz\"' EXIT\n\npaste <(gzip -dc -- \"$UNF\") <(gzip -dc -- \"$FILT\") \\\n  | awk -F'\\t' -v OFS='\\t' \\\n        -v mc=\"$MIN_COV\" -v mr=\"$MAX_RATIO\" \\\n        -v flag=\"$tmp_flag\" -v per=\"$tmp_per\" -v dump=\"$DUMP_PER\" '\n    BEGIN {\n      total       = 0\n      considered  = 0\n      flagged_cnt = 0\n    }\n    {\n      # cols 1-4: unf (chrom start end meanDepth)\n      # cols 5-8: filt (chrom start end meanDepth)\n      if ($1 != $5 || $2 != $6 || $3 != $7) {\n        printf \"ERROR: row %d coordinate mismatch: %s:%s-%s vs %s:%s-%s\\n\" \\\n               \"  likely --by mismatch or different BAMs.\\n\",\n               NR, $1, $2, $3, $5, $6, $7 > \"/dev/stderr\"\n        exit 1\n      }\n      total++\n      u = $4 + 0\n      f = $8 + 0\n      if (u < mc) next\n      considered++\n      r = (u > 0 ? f / u : 0)\n      if (dump == 1) {\n        printf \"%s\\t%s\\t%s\\t%.3f\\t%.3f\\t%.4f\\n\", $1, $2, $3, u, f, r > per\n      }\n      if (r < mr) {\n        # Col 4 = ratio (merge-friendly numeric), col 5 = rounded unf cov\n        # so a `bedtools merge -c 4,5 -o min,max` gives \"worst ratio in\n        # block / peak coverage in block\" — both useful for downstream\n        # inspection / QC.\n        printf \"%s\\t%s\\t%s\\t%.4f\\t%d\\n\", $1, $2, $3, r, int(u + 0.5) > flag\n        flagged_cnt++\n      }\n    }\n    END {\n      printf \"scan: rows_total=%d  rows_considered=%d  rows_flagged=%d\\n\",\n             total, considered, flagged_cnt > \"/dev/stderr\"\n    }\n  '\n\n# ---- 2. Sort + write per-bin flagged BED ------------------------------------\n# bedtools merge requires a sorted BED. mosdepth output is usually already in\n# BAM-SQ order (which is often `chr1,chr2,...,chrX,chrY,chrM`), but we don't\n# rely on that — re-sort with LC_ALL=C for deterministic output.\nLC_ALL=C sort -k1,1 -k2,2n \"$tmp_flag\" > \"$flagged\"\nn_flag=$(wc -l < \"$flagged\" | tr -d ' ')\necho \"[1/3] wrote $flagged  ($n_flag flagged bins)\"\n\n# ---- 3. Merge ---------------------------------------------------------------\nmerged=\"${OUT_PREFIX}.flagged.merged.bed\"\nif [[ $n_flag -gt 0 ]]; then\n  bedtools merge -i \"$flagged\" -d \"$MERGE_GAP\" \\\n    -c 4,5 -o min,max > \"$merged\"\nelse\n  : > \"$merged\"\nfi\nn_merged=$(wc -l < \"$merged\" | tr -d ' ')\necho \"[2/3] wrote $merged  ($n_merged merged intervals)\"\n\n# ---- 4. Summary -------------------------------------------------------------\nsummary=\"${OUT_PREFIX}.summary.txt\"\nflag_bp=$(awk   '{s+=$3-$2} END {print s+0}' \"$flagged\")\nmerged_bp=$(awk '{s+=$3-$2} END {print s+0}' \"$merged\")\n{\n  echo \"mosdepth_lowmapq_blacklist  ($(date -u +%Y-%m-%dT%H:%M:%SZ))\"\n  echo \"inputs:\"\n  echo \"  unf:        $UNF\"\n  echo \"  filt:       $FILT\"\n  echo \"parameters:\"\n  echo \"  min_cov:    $MIN_COV\"\n  echo \"  max_ratio:  $MAX_RATIO\"\n  echo \"  merge_gap:  $MERGE_GAP\"\n  echo \"\"\n  printf \"flagged bins:      %8d  (%12d bp,  %7.1f Mb)\\n\" \\\n         \"$n_flag\"   \"$flag_bp\"   \"$(awk -v x=\"$flag_bp\"   'BEGIN{printf \"%.1f\", x/1e6}')\"\n  printf \"merged intervals:  %8d  (%12d bp,  %7.1f Mb)\\n\" \\\n         \"$n_merged\" \"$merged_bp\" \"$(awk -v x=\"$merged_bp\" 'BEGIN{printf \"%.1f\", x/1e6}')\"\n  echo \"\"\n  echo \"Top 20 widest merged intervals:\"\n  sort -k1,1 -k2,2n \"$merged\" \\\n    | awk 'BEGIN{OFS=\"\\t\"} {print $1, $2, $3, $3-$2, $4, $5}' \\\n    | sort -k4,4nr \\\n    | head -20 \\\n    | awk 'BEGIN{OFS=\"\\t\"; print \"#chrom\",\"start\",\"end\",\"width\",\"min_ratio\",\"max_cov\"} {print}'\n} > \"$summary\"\necho \"[3/3] wrote $summary\"\n\n# ---- 5. Optional per-region dump -------------------------------------------\nif [[ $DUMP_PER -eq 1 ]]; then\n  out=\"${OUT_PREFIX}.per_region.tsv.gz\"\n  # Prepend header, then gzip. Keep it streaming so we don't materialize the\n  # full file uncompressed.\n  { printf \"#chrom\\tstart\\tend\\tunf_cov\\tfilt_cov\\tratio\\n\"; cat \"$tmp_per\"; } \\\n    | gzip -c > \"$out\"\n  echo \"     wrote $out\"\nfi\n\necho\ncat \"$summary\"\n"
  },
  {
    "path": "scripts/plot_learn.sh",
    "content": "#!/usr/bin/env bash\n# plot_learn.sh — plot per-RG insert-size distributions from svaba learn data\n#\n# Usage:\n#   plot_learn.sh <ID_or_file> [output.pdf]\n#\n# If the argument ends in .tsv or .tsv.gz, treat it as the learn file directly.\n# Otherwise treat it as a run ID and glob for ${ID}.*.learn.tsv.gz in the\n# current directory.\n#\n# Output PDF defaults to ${ID}.learn.pdf or ${stem}.learn.pdf.\n#\n# Requires: Rscript, R packages ggplot2 + data.table (both on CRAN).\n\nset -euo pipefail\n\nusage() {\n  cat <<EOF\nUsage: $(basename \"$0\") <ID_or_file> [output.pdf]\n\n  ID_or_file   Either a svaba run ID (will find *.learn.tsv.gz files)\n               or a path to a .tsv / .tsv.gz learn file directly.\n\n  output.pdf   Optional output path. Defaults to <ID>.learn.pdf\n\nExamples:\n  $(basename \"$0\") my_run\n  $(basename \"$0\") my_run.tumor.learn.tsv.gz\n  $(basename \"$0\") my_run custom_output.pdf\nEOF\n  exit 1\n}\n\n[[ $# -lt 1 ]] && usage\n\nINPUT=\"$1\"\nOUTPDF=\"${2:-}\"\n\n# Determine the list of learn files\nFILES=()\nID=\"\"\n\nif [[ \"$INPUT\" == *.tsv.gz || \"$INPUT\" == *.tsv ]]; then\n  # Direct file path\n  [[ -f \"$INPUT\" ]] || { echo \"ERROR: file not found: $INPUT\" >&2; exit 1; }\n  FILES=(\"$INPUT\")\n  # derive stem for default output name\n  stem=$(basename \"$INPUT\")\n  stem=\"${stem%.gz}\"\n  stem=\"${stem%.tsv}\"\n  stem=\"${stem%.learn}\"\n  ID=\"$stem\"\nelse\n  # Treat as run ID — glob for learn files\n  ID=\"$INPUT\"\n  shopt -s nullglob\n  FILES=( ${ID}.*.learn.tsv.gz ${ID}.learn.tsv.gz )\n  shopt -u nullglob\n  if [[ ${#FILES[@]} -eq 0 ]]; then\n    echo \"ERROR: no learn files found for ID '$ID'\" >&2\n    echo \"  looked for: ${ID}.*.learn.tsv.gz, ${ID}.learn.tsv.gz\" >&2\n    exit 1\n  fi\nfi\n\n[[ -z \"$OUTPDF\" ]] && OUTPDF=\"${ID}.learn.pdf\"\n\necho \"Input files: ${FILES[*]}\"\necho \"Output PDF:  $OUTPDF\"\n\n# Build a comma-separated list of files for R (no quoting — paths with\n# commas would break, but that's exotic enough to not worry about)\nFILE_LIST=$(IFS=,; echo \"${FILES[*]}\")\n\nLEARN_FILES=\"$FILE_LIST\" Rscript --vanilla - \"$OUTPDF\" <<'REOF'\nsuppressPackageStartupMessages({\n  library(data.table)\n  library(ggplot2)\n})\n\nargs <- commandArgs(trailingOnly = TRUE)\noutpdf <- args[1]\n\n# The file list is passed via environment variable\nfile_list <- strsplit(Sys.getenv(\"LEARN_FILES\"), \",\")[[1]]\n\n# Read and combine all files\ndt <- rbindlist(lapply(file_list, function(f) {\n  d <- fread(f, sep = \"\\t\")\n  # add a source column from the filename\n  stem <- basename(f)\n  stem <- sub(\"\\\\.learn\\\\.tsv\\\\.gz$\", \"\", stem)\n  stem <- sub(\"\\\\.learn\\\\.tsv$\", \"\", stem)\n  d[, source := stem]\n  d\n}))\n\ncat(sprintf(\"Loaded %s isize observations across %d RGs from %d files\\n\",\n            format(nrow(dt), big.mark = \",\"),\n            uniqueN(dt$rg),\n            length(file_list)))\n\n# Summary stats per RG per source\nstats <- dt[, .(\n  n = .N,\n  mean = mean(isize),\n  median = as.double(median(isize)),\n  sd = sd(isize),\n  p01 = quantile(isize, 0.01),\n  p99 = quantile(isize, 0.99)\n), by = .(source, rg)]\n\ncat(\"\\nPer-RG summary:\\n\")\nprint(stats[order(source, rg)])\n\n# Trim extreme tails for plotting (1st-99th percentile per RG)\ndt_trim <- dt[, .SD[isize >= quantile(isize, 0.01) &\n                     isize <= quantile(isize, 0.99)],\n              by = .(source, rg)]\n\n# Create label with n for facets\ndt_trim[, facet_label := paste0(rg, \" (n=\", format(.N, big.mark = \",\"), \")\"),\n        by = .(source, rg)]\n\n# Determine a reasonable number of columns for facet_wrap\nn_facets <- uniqueN(dt_trim[, paste(source, rg)])\nncol_facet <- min(4, ceiling(sqrt(n_facets)))\n\n# Plot\np <- ggplot(dt_trim, aes(x = isize, fill = source)) +\n  geom_histogram(bins = 80, alpha = 0.7, color = \"grey30\", linewidth = 0.2) +\n  facet_wrap(~ facet_label, scales = \"free_y\", ncol = ncol_facet) +\n  labs(\n    title = \"Insert size distribution per read group\",\n    subtitle = paste(\"Sources:\", paste(unique(dt_trim$source), collapse = \", \")),\n    x = \"Insert size (bp)\",\n    y = \"Count\",\n    fill = \"BAM\"\n  ) +\n  theme_minimal(base_size = 10) +\n  theme(\n    strip.text = element_text(size = 7),\n    legend.position = if (uniqueN(dt_trim$source) > 1) \"bottom\" else \"none\"\n  )\n\n# Size the PDF to fit the facets\nn_rows <- ceiling(n_facets / ncol_facet)\npdf_h <- max(4, 1.5 + n_rows * 2.5)\npdf_w <- max(6, ncol_facet * 3)\n\nggsave(outpdf, p, width = pdf_w, height = pdf_h, limitsize = FALSE)\ncat(sprintf(\"\\nWrote %s (%d x %d inches)\\n\", outpdf, as.integer(pdf_w), as.integer(pdf_h)))\nREOF\n"
  },
  {
    "path": "scripts/r2c_for_contig.sh",
    "content": "#!/usr/bin/env bash\n# r2c_for_contig.sh\n#\n# Given a svaba contig name, reconstruct the per-contig read-to-contig\n# (r2c) alignment BAM for IGV. Uses the `bz:Z` aux tag that svaba writes\n# on every r2c-aligned read (cname-keyed) to pick the right reads out\n# of corrected.bam.\n#\n# Usage:\n#   r2c_for_contig.sh CNAME CONTIGS_BAM CORRECTED_BAM [OUT_DIR]\n#\n# Example:\n#   r2c_for_contig.sh c_chr12_10180001_10181001_0C \\\n#     T2_fermi.contigs.bam T2_fermi.corrected.bam \\\n#     r2c_debug/\n#\n# Output (in OUT_DIR):\n#   contig.fa     single-contig reference FASTA (+ BWA & faidx indices)\n#   reads.fq      corrected reads tagged bz:Z:<CNAME>\n#   r2c.bam(.bai) sorted+indexed read-to-contig BAM — load this in IGV\n#                 alongside contig.fa\n#\n# Tag semantics (v3):\n#   bz:Z = cname list — every contig this read r2c-aligned to. This is\n#          the right key for a per-contig read pull.\n#   bi:Z = bp_id list — the specific variant rows this read supports\n#          as ALT (matches r2c.txt.gz split_bps/disc_bps and bps.txt.gz\n#          col 52). Pre-v3 this carried cnames; it no longer does.\n#          If you want the ALT-supporter subset, set TAG=bi and pass\n#          a bp_id as the first argument instead of a cname.\n\nset -euo pipefail\n\nif [[ $# -lt 3 ]]; then\n  echo \"usage: $0 CNAME CONTIGS_BAM CORRECTED_BAM [OUT_DIR]\" >&2\n  exit 2\nfi\n\nCNAME=$1\nCONTIGS_BAM=$2\nCORRECTED_BAM=$3\nOUT_DIR=${4:-r2c_${CNAME}}\n\nfor t in samtools bwa awk; do\n  command -v \"$t\" >/dev/null || { echo \"ERROR: $t not on PATH\" >&2; exit 1; }\ndone\n\nmkdir -p \"$OUT_DIR\"\ncd \"$OUT_DIR\"\n\n# ---- 1. Pull the contig sequence out of contigs.bam -----------------------\n# svaba writes each contig as a single BAM record whose QNAME == cname. Take\n# SEQ as the reference. If the contig is reverse-complemented in the BAM\n# (FLAG & 16), revcomp it back so the coordinate system matches cname.\n# NB: use arithmetic bit extraction (int(flag/16)%2) instead of gawk's\n# `and(flag,16)` so this works with BSD awk on macOS as well as gawk.\nsamtools view \"../$CONTIGS_BAM\" 2>/dev/null \\\n  | awk -v c=\"$CNAME\" '\n      BEGIN { found=0 }\n      $1==c && !found {\n        flag=$2+0; seq=$10\n        if (int(flag/16) % 2 == 1) {\n          # revcomp\n          n=length(seq); out=\"\"\n          for (i=n;i>=1;i--) {\n            b=substr(seq,i,1)\n            if      (b==\"A\") out=out\"T\"\n            else if (b==\"T\") out=out\"A\"\n            else if (b==\"C\") out=out\"G\"\n            else if (b==\"G\") out=out\"C\"\n            else if (b==\"a\") out=out\"t\"\n            else if (b==\"t\") out=out\"a\"\n            else if (b==\"c\") out=out\"g\"\n            else if (b==\"g\") out=out\"c\"\n            else             out=out\"N\"\n          }\n          seq=out\n        }\n        print \">\"c; print seq\n        found=1\n      }\n      END { if (!found) exit 1 }\n    ' > contig.fa || {\n      echo \"ERROR: contig $CNAME not found in $CONTIGS_BAM\" >&2\n      exit 1\n    }\n\necho \"contig length: $(awk 'NR==2{print length($0)}' contig.fa) bp\"\n\n# ---- 2. Build mini BWA index + faidx --------------------------------------\nbwa index contig.fa 2> bwa_index.log\nsamtools faidx contig.fa\n\n# ---- 3. Pull corrected reads tagged for this contig (boundary-aware) ------\n# Default TAG=bz selects by cname (all r2c'd reads). TAG=bi selects by bp_id\n# (ALT-supporter subset only) — in that mode, the CNAME positional arg is\n# treated as a bp_id instead. See the v3 tag-semantics note in the header.\nTAG=${TAG:-bz}\nsamtools view -h \"../$CORRECTED_BAM\" \\\n  | awk -v c=\"$CNAME\" -v tag=\"$TAG\" 'BEGIN{OFS=\"\\t\"; pfx=\"^\"tag\":Z:\"}\n      /^@/ { print; next }\n      {\n        for (i=12;i<=NF;i++) if ($i ~ pfx) {\n          v=substr($i,6); n=split(v,a,\",\")\n          for (j=1;j<=n;j++) if (a[j]==c) { print; next }\n        }\n      }' \\\n  | samtools fastq -@2 -n - > reads.fq 2> /dev/null\n\nn_reads=$(( $(wc -l < reads.fq) / 4 ))\necho \"reads tagged ${TAG}:Z:${CNAME}: $n_reads\"\n\nif [[ \"$n_reads\" -eq 0 ]]; then\n  echo \"ERROR: no reads tagged for $CNAME in $CORRECTED_BAM\" >&2\n  exit 1\nfi\n\n# ---- 4. Re-align reads to the single-contig reference ---------------------\n# -k 15 lowers the minimum seed to pick up more partial matches on a small\n# reference; -a outputs secondary hits so you can spot reads that map to\n# multiple places on the contig (e.g. tandem repeats). Drop both if you\n# want svaba-equivalent alignments.\nbwa mem -t 4 -k 15 -a contig.fa reads.fq 2> bwa_mem.log \\\n  | samtools sort -@4 -o r2c.bam -\nsamtools index r2c.bam\n\necho\necho \"Done. IGV: load contig.fa as Genome, then r2c.bam as track.\"\necho \"Files in $PWD:\"\nls -la r2c.bam r2c.bam.bai contig.fa contig.fa.fai reads.fq\n"
  },
  {
    "path": "scripts/search_sequence.sh",
    "content": "#!/bin/bash\n# ============================================================\n# Search a BAM for reads matching any of the given sequences\n# (or their reverse complements) and write matches to a new BAM.\n#\n# Usage:\n#   ./bam_grep.sh <input.bam> <output_prefix> <seq1> [seq2 ...]\n#\n# Example:\n#   ./bam_grep.sh tumor.bam egfr_vIII ACTGACTGACTG TGCATGCATGCA\n#   -> produces egfr_vIII.bam + egfr_vIII.bam.bai\n# ============================================================\n\nset -euo pipefail\n\n# ---- Args ----\nif [ $# -lt 3 ]; then\n    echo \"Usage: $0 <input.bam> <output_prefix> <seq1> [seq2 ...]\" >&2\n    echo \"  Searches for each sequence and its reverse complement.\" >&2\n    echo \"  Output: <output_prefix>.bam + .bam.bai\" >&2\n    exit 1\nfi\n\nINPUT_BAM=\"$1\"\nOUT_PREFIX=\"$2\"\nshift 2\nSEQS=(\"$@\")\n\nOUT_BAM=\"${OUT_PREFIX}.bam\"\nTHREADS=${THREADS:-4}\n\n# ---- Sanity checks ----\nif [ ! -f \"$INPUT_BAM\" ]; then\n    echo \"ERROR: Input BAM not found: $INPUT_BAM\" >&2\n    exit 1\nfi\n\nif ! command -v samtools >/dev/null 2>&1; then\n    echo \"ERROR: samtools not found in PATH\" >&2\n    exit 1\nfi\n\n# ---- Build the combined regex: seq1|revcomp1|seq2|revcomp2|... ----\nrevcomp() {\n    # Uppercase, complement, reverse\n    echo \"$1\" | tr 'acgtnACGTN' 'tgcanTGCAN' | rev\n}\n\nPATTERNS=()\necho \"Searching for sequences (and reverse complements):\" >&2\nfor seq in \"${SEQS[@]}\"; do\n    # Uppercase and strip whitespace\n    seq_up=$(echo \"$seq\" | tr 'a-z' 'A-Z' | tr -d '[:space:]')\n    rc=$(revcomp \"$seq_up\")\n    PATTERNS+=(\"$seq_up\" \"$rc\")\n    echo \"  $seq_up  (rc: $rc)\" >&2\ndone\n\n# Join patterns with | for egrep\nPATTERN=$(IFS='|'; echo \"${PATTERNS[*]}\")\n\necho \"\" >&2\necho \"Input:   $INPUT_BAM\" >&2\necho \"Output:  $OUT_BAM\" >&2\necho \"Threads: $THREADS\" >&2\necho \"\" >&2\n\n# ---- Filter ----\n# samtools view streams SAM (header + reads), awk keeps headers and any read\n# whose sequence column (field 10) matches the pattern, samtools view -b\n# re-encodes BAM.\nsamtools view -@ \"$THREADS\" -h \"$INPUT_BAM\" \\\n    | awk -v pat=\"$PATTERN\" '\n        /^@/ { print; next }\n        $10 ~ pat { print }\n      ' \\\n    | samtools view -@ \"$THREADS\" -b -o \"$OUT_BAM\" -\n\n# ---- Sort (safer - preserves coordinate order for indexing) ----\n# If input was already sorted, output is too (we only filter), but re-sort\n# defensively in case the original had unsorted regions.\nsamtools sort -@ \"$THREADS\" -o \"${OUT_BAM}.sorted\" \"$OUT_BAM\"\nmv \"${OUT_BAM}.sorted\" \"$OUT_BAM\"\n\n# ---- Index ----\nsamtools index -@ \"$THREADS\" \"$OUT_BAM\"\n\n# ---- Report ----\nN_READS=$(samtools view -c \"$OUT_BAM\")\necho \"Done. Matched reads: $N_READS\" >&2\necho \"Output: $OUT_BAM + ${OUT_BAM}.bai\" >&2\n"
  },
  {
    "path": "scripts/sort_and_dedupe_bps_old.sh",
    "content": "#!/usr/bin/env bash\n#\n# sort_and_dedupe_bps_old.sh — sort + dedup + PASS-filter for legacy\n# (pre-2.0) svaba bps.txt.gz files.\n#\n# Same logic as the v3 postprocess step but with auto-detected column\n# positions from the header row. Works on any bps.txt.gz schema as\n# long as the header has #chr1, confidence, and either maxlod or tlod.\n#\n# Usage:\n#   sort_and_dedupe_bps_old.sh [options] <input.bps.txt.gz>\n#\n#   -o DIR         output directory (default: same as input)\n#   -t THREADS     parallel sort threads (default: 4)\n#   -S SIZE        sort buffer size (default: 4G)\n#   -h, --help     this message\n#\n# Outputs:\n#   <basename>.sorted.txt.gz\n#   <basename>.sorted.dedup.txt.gz\n#   <basename>.sorted.dedup.pass.txt.gz\n#\n\nset -exo pipefail\n\nTHREADS=4\nSORT_BUFFER=\"4G\"\nOUT_DIR=\"\"\n\nprint_usage() { sed -n '2,20p' \"$0\" | sed 's/^# \\{0,1\\}//'; }\n\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    -o)        OUT_DIR=\"$2\";      shift 2 ;;\n    -t)        THREADS=\"$2\";      shift 2 ;;\n    -S)        SORT_BUFFER=\"$2\";  shift 2 ;;\n    -h|--help) print_usage;       exit 0 ;;\n    -*)        echo \"unknown option: $1\" >&2; exit 2 ;;\n    *)         break ;;\n  esac\ndone\n\nif [[ $# -lt 1 ]]; then\n  echo \"usage: sort_and_dedupe_bps_old.sh [options] <input.bps.txt.gz>\" >&2\n  exit 2\nfi\n\nINPUT=\"$1\"\nif [[ ! -r \"$INPUT\" ]]; then\n  echo \"cannot read: $INPUT\" >&2\n  exit 1\nfi\n\n# Determine reader\ncase \"$INPUT\" in\n  *.gz)  READER=\"gzip -dc\" ;;\n  *)     READER=\"cat\" ;;\nesac\n\n# Derive output names\nBASENAME=$(basename \"$INPUT\" .txt.gz)\nBASENAME=$(basename \"$BASENAME\" .txt)\n[[ -z \"$OUT_DIR\" ]] && OUT_DIR=$(dirname \"$INPUT\")\n\nOUT_SORTED=\"${OUT_DIR}/${BASENAME}.sorted.txt.gz\"\nOUT_DEDUP=\"${OUT_DIR}/${BASENAME}.sorted.dedup.txt.gz\"\nOUT_PASS=\"${OUT_DIR}/${BASENAME}.sorted.dedup.pass.txt.gz\"\n\n# Pick GNU sort\nif command -v gsort >/dev/null 2>&1; then\n  SORT_BIN=gsort\nelif sort --version 2>&1 | grep -qi 'gnu' 2>/dev/null; then\n  SORT_BIN=sort\nelse\n  echo \"GNU sort not found (macOS: 'brew install coreutils' for gsort)\" >&2\n  exit 1\nfi\n\n# --- Auto-detect column positions from header ---\nHEADER=$($READER \"$INPUT\" | head -n 1 || true)\nif [[ \"${HEADER:0:1}\" != \"#\" ]]; then\n  echo \"ERROR: first line doesn't start with '#' — not a bps.txt.gz header?\" >&2\n  echo \"  got: ${HEADER:0:80}...\" >&2\n  exit 1\nfi\n\n# Split header into array, find columns by name\nfind_col() {\n  local name=\"$1\"\n  local col\n  col=$(echo \"$HEADER\" | awk -F'\\t' -v name=\"$name\" '{\n    for (i=1; i<=NF; i++) if ($i == name) { print i; exit }\n  }')\n  if [[ -z \"$col\" ]]; then\n    return 1\n  fi\n  echo \"$col\"\n}\n\nCONF_COL=$(find_col \"confidence\") || { echo \"ERROR: 'confidence' column not found in header\" >&2; exit 1; }\n\n# Try maxlod first (v3), then tlod (legacy)\nif LOD_COL=$(find_col \"maxlod\" 2>/dev/null); then\n  LOD_NAME=\"maxlod\"\nelif LOD_COL=$(find_col \"tlod\" 2>/dev/null); then\n  LOD_NAME=\"tlod\"\nelse\n  echo \"ERROR: neither 'maxlod' nor 'tlod' column found in header\" >&2\n  exit 1\nfi\n\necho \"=== sort_and_dedupe_bps_old.sh ===\"\necho \"  input:      $INPUT\"\necho \"  confidence: col $CONF_COL\"\necho \"  ${LOD_NAME}:     col $LOD_COL\"\necho \"  sort:       $SORT_BIN  buffer=$SORT_BUFFER  parallel=$THREADS\"\necho \"\"\n\nTMP_DIR=$(mktemp -d \"${TMPDIR:-/tmp}/svaba_sort_bps.XXXXXXXX\")\ntrap 'rm -rf \"$TMP_DIR\"' EXIT INT TERM\n\n# --- 1) sort ---\necho \"[1/3] sorting...\"\n{\n  # Emit header first, then sort the data rows\n  printf '%s\\n' \"$HEADER\"\n  $READER \"$INPUT\" | tail -n +2 | \\\n    LC_ALL=C \"$SORT_BIN\" \\\n      -t $'\\t' \\\n      -k1,1V \\\n      -k2,2n \\\n      -k3,3 \\\n      -k4,4V \\\n      -k5,5n \\\n      -k6,6 \\\n      -k${LOD_COL},${LOD_COL}gr \\\n      -S \"$SORT_BUFFER\" \\\n      --parallel=\"$THREADS\" \\\n      -T \"$TMP_DIR\"\n} | gzip -c > \"$OUT_SORTED\"\necho \"  wrote $OUT_SORTED\"\n\n# --- 2) dedup by breakpoint pair (first row per key wins = highest lod) ---\necho \"[2/3] deduplicating...\"\ngzip -dc \"$OUT_SORTED\" | awk -F'\\t' -v OFS='\\t' '\n  NR == 1 && $0 ~ /^#/ { print; next }\n  { key = $1 FS $2 FS $3 FS $4 FS $5 FS $6\n    if (!(key in seen)) { seen[key] = 1; print } }\n' | gzip -c > \"$OUT_DEDUP\"\necho \"  wrote $OUT_DEDUP\"\n\n# --- 3) PASS-filter ---\necho \"[3/3] PASS-filtering...\"\ngzip -dc \"$OUT_DEDUP\" | awk -F'\\t' -v OFS='\\t' -v CCOL=\"$CONF_COL\" '\n  NR == 1 && $0 ~ /^#/ { print; next }\n  $CCOL == \"PASS\" { print }\n' | gzip -c > \"$OUT_PASS\"\necho \"  wrote $OUT_PASS\"\n\n# Summary\nN_SORTED=$(gzip -dc \"$OUT_SORTED\" | tail -n +2 | wc -l)\nN_DEDUP=$(gzip -dc \"$OUT_DEDUP\" | tail -n +2 | wc -l)\nN_PASS=$(gzip -dc \"$OUT_PASS\" | tail -n +2 | wc -l)\necho \"\"\necho \"  sorted: $N_SORTED  dedup: $N_DEDUP  PASS: $N_PASS\"\necho \"=== done ===\"\n"
  },
  {
    "path": "scripts/sort_bps.sh",
    "content": "#!/usr/bin/env bash\n#\n# sort_bps.sh — sort a svaba bps.txt.gz file by (chr1, pos1, chr2, pos2, -somlod)\n#\n# Reads:   ${ID}.bps.txt.gz\n# Writes:  ${ID}.bps.sorted.txt.gz\n#\n# Preserves the leading \"#chr1 ...\" header row, then sorts the body by:\n#   1) chr1 (natural/version order)   ascending\n#   2) pos1 (numeric)                 ascending\n#   3) chr2 (natural/version order)   ascending\n#   4) pos2 (numeric)                 ascending\n#   5) somlod (general numeric)       DESCENDING (higher first)\n#\n# The sort is external — GNU sort spills sorted chunks to a scratch directory\n# and merges them, so memory stays bounded even on 10+ GB inputs. The scratch\n# directory is auto-created with mktemp and cleaned up on exit. Works on both\n# Linux and macOS; on macOS you'll want GNU coreutils installed (`brew install\n# coreutils`) so `gsort` is available — BSD sort does not support -V / --parallel.\n#\n# Usage:\n#   ./sort_bps.sh <ID>\n#   ./sort_bps.sh -h | --help\n#\n# Options via environment variables (all optional):\n#   BUFFER_SIZE   per-chunk memory for sort       (default: 2G)\n#   PARALLEL      threads used by the sort phase  (default: 4)\n#   INPUT_DIR     where to look for the input     (default: .)\n#   OUTPUT_DIR    where to write the output       (default: $INPUT_DIR)\n#   KEEP_TMP      1 = don't delete the scratch dir on exit (for debugging)\n#\n# Examples:\n#   ./sort_bps.sh tumor_vs_normal\n#   BUFFER_SIZE=8G PARALLEL=8 ./sort_bps.sh tumor_vs_normal\n#   INPUT_DIR=/data/run42 OUTPUT_DIR=/tmp ./sort_bps.sh run42\n#\n\nset -euo pipefail\n\n# ------------------------------------------------------------------ usage ---\n\nprint_usage() {\n    cat <<'EOF'\nsort_bps.sh — sort a svaba bps.txt.gz file\n\nUsage:\n  sort_bps.sh <ID>\n  sort_bps.sh -h | --help\n\nReads  <INPUT_DIR>/<ID>.bps.txt.gz\nWrites <OUTPUT_DIR>/<ID>.bps.sorted.txt.gz\n\nSort keys (in order):\n  1. chr1  ascending   (natural / version order — chr1, chr2, ..., chrX)\n  2. pos1  ascending\n  3. chr2  ascending\n  4. pos2  ascending\n  5. somlod DESCENDING (higher somatic LOD first; \"NA\" sorts last)\n\nOptions (environment variables):\n  BUFFER_SIZE   per-chunk memory for sort       (default: 2G)\n  PARALLEL      threads used by the sort phase  (default: 4)\n  INPUT_DIR     where to look for the input     (default: .)\n  OUTPUT_DIR    where to write the output       (default: $INPUT_DIR)\n  KEEP_TMP      1 = keep the scratch dir for debugging (default: unset)\n\nExamples:\n  sort_bps.sh tumor_vs_normal\n  BUFFER_SIZE=8G PARALLEL=8 sort_bps.sh tumor_vs_normal\n  INPUT_DIR=/data/run42 OUTPUT_DIR=/tmp sort_bps.sh run42\n\nNotes:\n  * Uses GNU sort. On macOS install it via `brew install coreutils` — the\n    script will pick up `gsort` automatically. BSD sort does not support -V\n    or --parallel and will not work.\n  * Memory is bounded by BUFFER_SIZE; scratch disk usage is roughly the\n    uncompressed size of the input (often 6-10x the .gz size).\nEOF\n}\n\n# ---------------------------------------------------------------- args -----\n\nif [[ $# -eq 0 ]]; then\n    print_usage\n    exit 1\nfi\n\ncase \"${1:-}\" in\n    -h|--help)\n        print_usage\n        exit 0\n        ;;\n    -*)\n        echo \"sort_bps.sh: unknown option '$1'\" >&2\n        echo \"Run 'sort_bps.sh --help' for usage.\" >&2\n        exit 2\n        ;;\nesac\n\nID=$1\nif [[ -z \"$ID\" ]]; then\n    echo \"sort_bps.sh: <ID> is required\" >&2\n    print_usage\n    exit 2\nfi\n\nINPUT_DIR=${INPUT_DIR:-.}\nOUTPUT_DIR=${OUTPUT_DIR:-$INPUT_DIR}\nBUFFER_SIZE=${BUFFER_SIZE:-2G}\nPARALLEL=${PARALLEL:-4}\n\nIN=\"${INPUT_DIR%/}/${ID}.bps.txt.gz\"\nOUT=\"${OUTPUT_DIR%/}/${ID}.bps.sorted.txt.gz\"\n\nif [[ ! -r \"$IN\" ]]; then\n    echo \"sort_bps.sh: cannot read input '$IN'\" >&2\n    exit 3\nfi\n\nmkdir -p \"$(dirname \"$OUT\")\"\n\n# ----------------------------------------------------------- tool lookup ---\n\n# Prefer `gsort` (GNU coreutils on macOS via homebrew); fall back to `sort`\n# if it reports itself as GNU. Bail out if neither works.\npick_sort() {\n    if command -v gsort >/dev/null 2>&1; then\n        echo gsort\n        return 0\n    fi\n    if sort --version 2>/dev/null | head -n 1 | grep -qi 'gnu'; then\n        echo sort\n        return 0\n    fi\n    return 1\n}\n\nif ! SORT_BIN=$(pick_sort); then\n    echo \"sort_bps.sh: GNU sort not found.\" >&2\n    echo \"  On macOS: brew install coreutils   (provides 'gsort')\" >&2\n    echo \"  On Linux: install the 'coreutils' package\" >&2\n    exit 4\nfi\n\n# zcat on macOS appends .Z instead of reading .gz — use `gzip -dc` to stay\n# portable.\nZCAT=\"gzip -dc\"\n\n# ---------------------------------------------------------- scratch dir ---\n\n# mktemp -d is portable across Linux and macOS. The template form with a\n# trailing XXXXXX works on both.\nTMP=$(mktemp -d \"${TMPDIR:-/tmp}/svaba_bps_sort.XXXXXXXX\")\n\ncleanup() {\n    if [[ \"${KEEP_TMP:-0}\" == \"1\" ]]; then\n        echo \"sort_bps.sh: leaving scratch dir at $TMP\" >&2\n    else\n        rm -rf \"$TMP\"\n    fi\n}\ntrap cleanup EXIT INT TERM\n\n# ------------------------------------------------------------- the sort ---\n\necho \"sort_bps.sh: sorting $IN -> $OUT\" >&2\necho \"sort_bps.sh: sort=$SORT_BIN buffer=$BUFFER_SIZE parallel=$PARALLEL tmp=$TMP\" >&2\n\n# Extract the header once (if present) so we don't have to zcat twice.\nHEADER_FILE=\"$TMP/header.txt\"\nBODY_PIPE=0\n\n# Peek at the first line. If it starts with '#', save it; otherwise there is\n# no header and we just sort the whole file.\nFIRST_LINE=$($ZCAT \"$IN\" | head -n 1 || true)\nif [[ \"${FIRST_LINE:0:1}\" == \"#\" ]]; then\n    printf '%s\\n' \"$FIRST_LINE\" > \"$HEADER_FILE\"\n    BODY_PIPE=1\nfi\n\n{\n    if [[ $BODY_PIPE -eq 1 ]]; then\n        cat \"$HEADER_FILE\"\n        $ZCAT \"$IN\" | tail -n +2\n    else\n        $ZCAT \"$IN\"\n    fi | {\n        # The header (if any) is the first line; pass it through untouched,\n        # then pipe the rest into sort. Using `read` here keeps everything\n        # streaming — no intermediate uncompressed file on disk.\n        if [[ $BODY_PIPE -eq 1 ]]; then\n            IFS= read -r hdr\n            printf '%s\\n' \"$hdr\"\n        fi\n        LC_ALL=C \"$SORT_BIN\" \\\n            -t $'\\t' \\\n            -k1,1V -k2,2n -k4,4V -k5,5n -k37,37gr \\\n            -S \"$BUFFER_SIZE\" \\\n            --parallel=\"$PARALLEL\" \\\n            -T \"$TMP\"\n    }\n} | gzip -c > \"$OUT\"\n\necho \"sort_bps.sh: done -> $OUT\" >&2\n"
  },
  {
    "path": "scripts/svaba_cloud.sh",
    "content": "#!/usr/bin/env bash\n#\n# svaba_cloud.sh — scatter svaba across GCP VMs, one partition per VM.\n#\n# Takes the svaba run command you'd normally run locally and distributes\n# it across N worker VMs, each handling a chromosome partition. The\n# script manages -k (regions) and -a (analysis ID) per worker — you\n# provide everything else exactly as you would on the command line.\n#\n# Workers boot from a pre-built image (--image) that has svaba, htslib,\n# jemalloc, and the reference genome baked in. A shared read-only data\n# disk provides the BAM files.\n#\n# Usage:\n#   svaba_cloud.sh [cloud options] -- <svaba run args without -k and -a>\n#\n# Cloud options (before the --):\n#   --id STR              analysis ID prefix (required)\n#   --data-disk NAME      GCP persistent disk name for BAMs (required)\n#   --bucket gs://...     GCS bucket for outputs (required)\n#   --partitions N        number of VMs / partitions     (default: 6)\n#   --machine TYPE        GCP machine type               (default: n2-highcpu-16)\n#   --zone ZONE           GCP zone                       (default: us-central1-a)\n#   --image NAME          GCP image for workers           (default: svaba-worker-image)\n#   --mount-point DIR     where data disk mounts          (default: /mnt/data)\n#   --boot-disk-size STR  boot disk size                  (default: 50GB)\n#   --regions-file FILE   custom partition file (one comma-sep line per partition)\n#   --merge               merge + postprocess after all workers finish\n#   --keep-vms            don't delete worker VMs on completion\n#   --dry-run             print commands without executing\n#   -h, --help            this message\n#\n# Everything after -- is passed verbatim to `svaba run` on each worker,\n# with -k and -a injected by the script. Do NOT include -k or -a in\n# your svaba args.\n#\n# Examples:\n#   # 5-way scatter, n2-highcpu-16, merge at the end\n#   svaba_cloud.sh \\\n#     --id my_run --data-disk svaba-data \\\n#     --bucket gs://my-bucket/svaba-run \\\n#     --partitions 5 --machine n2-highcpu-16 --merge \\\n#     -- \\\n#     svaba run \\\n#       -t /mnt/data/tumor.bam -n /mnt/data/normal.bam \\\n#       -G /home/user/ref/hg38.fa -p 14 \\\n#       --blacklist /home/user/tracks/blacklist.bed\n#\n#   # Dry run\n#   svaba_cloud.sh --id test --data-disk d1 \\\n#     --bucket gs://b/r --dry-run \\\n#     -- svaba run -t /mnt/data/t.bam -G /ref/hg38.fa -p 8\n#\n\nset -euo pipefail\n\n# ----------------------------------------------------------- defaults ---\nMACHINE=\"n2-highcpu-16\"\nZONE=\"us-central1-a\"\nPARTITIONS=6\nMOUNT=\"/mnt/data\"\nBOOT_DISK_SIZE=\"50GB\"\nIMAGE=\"svaba-worker-image\"\nDO_MERGE=0\nKEEP_VMS=0\nDRY_RUN=0\nREGIONS_FILE=\"\"\n\n# Required\nDATA_DISK=\"\"\nBUCKET=\"\"\nID=\"\"\n\n# ---------------------------------------------------------------- help ---\nprint_usage() {\n  sed -n '2,50p' \"$0\" | sed 's/^# \\{0,1\\}//'\n}\n\n# -------------------------------------------------------------- parse ---\n# Everything before -- is cloud options; everything after is svaba args.\nSVABA_ARGS=()\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    --id)             ID=\"$2\";             shift 2 ;;\n    --data-disk)      DATA_DISK=\"$2\";      shift 2 ;;\n    --bucket)         BUCKET=\"$2\";         shift 2 ;;\n    --partitions)     PARTITIONS=\"$2\";     shift 2 ;;\n    --machine)        MACHINE=\"$2\";        shift 2 ;;\n    --zone)           ZONE=\"$2\";           shift 2 ;;\n    --image)          IMAGE=\"$2\";          shift 2 ;;\n    --mount-point)    MOUNT=\"$2\";          shift 2 ;;\n    --boot-disk-size) BOOT_DISK_SIZE=\"$2\"; shift 2 ;;\n    --regions-file)   REGIONS_FILE=\"$2\";   shift 2 ;;\n    --merge)          DO_MERGE=1;          shift ;;\n    --keep-vms)       KEEP_VMS=1;          shift ;;\n    --dry-run)        DRY_RUN=1;           shift ;;\n    -h|--help)        print_usage;         exit 0 ;;\n    --)               shift; SVABA_ARGS=(\"$@\"); break ;;\n    -*)\n      echo \"svaba_cloud.sh: unknown option '$1'\" >&2\n      echo \"run 'svaba_cloud.sh --help' for usage\" >&2\n      exit 2\n      ;;\n    *)\n      # No -- separator; assume everything from here on is svaba args\n      SVABA_ARGS=(\"$@\"); break ;;\n  esac\ndone\n\n# ------------------------------------------------------- validate args ---\nmissing=()\n[[ -z \"$ID\" ]]        && missing+=(\"--id\")\n[[ -z \"$DATA_DISK\" ]] && missing+=(\"--data-disk\")\n[[ -z \"$BUCKET\" ]]    && missing+=(\"--bucket\")\n[[ ${#SVABA_ARGS[@]} -eq 0 ]] && missing+=(\"svaba run args (after --)\")\n\nif [[ ${#missing[@]} -gt 0 ]]; then\n  echo \"svaba_cloud.sh: missing required: ${missing[*]}\" >&2\n  exit 2\nfi\n\nBUCKET=${BUCKET%/}\n\n# Sanitize ID for GCP resource names\nGCP_ID=$(echo \"$ID\" | tr '[:upper:]' '[:lower:]' | tr '_' '-' | sed 's/[^a-z0-9-]//g')\nif [[ \"$GCP_ID\" != \"$ID\" ]]; then\n  echo \"note: sanitized ID for GCP names: '$ID' -> '$GCP_ID'\"\nfi\n\n# Strip \"svaba run\" prefix if present (we add it back ourselves)\nif [[ \"${SVABA_ARGS[0]:-}\" == \"svaba\" ]]; then\n  SVABA_ARGS=(\"${SVABA_ARGS[@]:1}\")\nfi\nif [[ \"${SVABA_ARGS[0]:-}\" == \"run\" ]]; then\n  SVABA_ARGS=(\"${SVABA_ARGS[@]:1}\")\nfi\n\n# Build the svaba args string for embedding in the startup script\nSVABA_ARGS_STR=\"\"\nfor arg in \"${SVABA_ARGS[@]}\"; do\n  # Quote args that contain spaces\n  if [[ \"$arg\" == *\" \"* ]]; then\n    SVABA_ARGS_STR+=\"\\\"${arg}\\\" \"\n  else\n    SVABA_ARGS_STR+=\"${arg} \"\n  fi\ndone\n\n# Extract -p value from svaba args for the merge step (default 8)\nTHREADS=8\nfor i in \"${!SVABA_ARGS[@]}\"; do\n  if [[ \"${SVABA_ARGS[$i]}\" == \"-p\" ]]; then\n    THREADS=\"${SVABA_ARGS[$((i+1))]}\"\n    break\n  fi\ndone\n\n# ---------------------------------------- default hg38 6-way partition ---\ndefault_regions() {\n  local n=$1\n  case $n in\n    1) echo \"chr1,chr2,chr3,chr4,chr5,chr6,chr7,chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX\" ;;\n    2)\n      echo \"chr1,chr2,chr3,chr4,chr5,chr6,chr7\"\n      echo \"chr8,chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX\" ;;\n    3)\n      echo \"chr1,chr2,chr3\"\n      echo \"chr4,chr5,chr6,chr7,chr8\"\n      echo \"chr9,chr10,chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX\" ;;\n    4)\n      echo \"chr1,chr2\"\n      echo \"chr3,chr4,chr5\"\n      echo \"chr6,chr7,chr8,chr9,chr10\"\n      echo \"chr11,chr12,chr13,chr14,chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX\" ;;\n    5)\n      echo \"chr1,chr2\"\n      echo \"chr3,chr4,chr5\"\n      echo \"chr6,chr7,chr8,chr9\"\n      echo \"chr10,chr11,chr12,chr13,chr14\"\n      echo \"chr15,chr16,chr17,chr18,chr19,chr20,chr21,chr22,chrX\" ;;\n    6)\n      echo \"chr1,chr2\"\n      echo \"chr3,chr4,chr5\"\n      echo \"chr6,chr7,chr8,chr9\"\n      echo \"chr10,chr11,chr12,chr13\"\n      echo \"chr14,chr15,chr16,chr17,chr18\"\n      echo \"chr19,chr20,chr21,chr22,chrX\" ;;\n    *)\n      for c in chr{1..22} chrX; do echo \"$c\"; done | head -n \"$n\" ;;\n  esac\n}\n\ndeclare -a REGIONS\nif [[ -n \"$REGIONS_FILE\" ]]; then\n  while IFS= read -r line; do REGIONS+=(\"$line\"); done < \"$REGIONS_FILE\"\n  PARTITIONS=${#REGIONS[@]}\nelse\n  while IFS= read -r line; do REGIONS+=(\"$line\"); done < <(default_regions \"$PARTITIONS\")\nfi\n\nif [[ ${#REGIONS[@]} -ne $PARTITIONS ]]; then\n  echo \"svaba_cloud.sh: got ${#REGIONS[@]} region lines but expected $PARTITIONS\" >&2\n  exit 2\nfi\n\n# ----------------------------------------------------------- run/exec ---\nrun_cmd() {\n  if [[ $DRY_RUN -eq 1 ]]; then\n    echo \"[dry-run] $*\"\n  else\n    \"$@\"\n  fi\n}\n\n# ================================================================\n# STEP 1: Create worker VMs\n# ================================================================\necho \"============================================================\"\necho \"svaba_cloud.sh: launching $PARTITIONS workers\"\necho \"  machine=$MACHINE zone=$ZONE image=$IMAGE\"\necho \"  data_disk=$DATA_DISK bucket=$BUCKET id=$ID\"\necho \"  svaba args: ${SVABA_ARGS_STR}\"\necho \"============================================================\"\n\nSCRIPT_TMPDIR=$(mktemp -d)\ntrap 'rm -rf \"$SCRIPT_TMPDIR\"' EXIT\n\nVM_NAMES=()\nfor i in $(seq 1 \"$PARTITIONS\"); do\n  vm=\"svaba-${GCP_ID}-worker-${i}\"\n  VM_NAMES+=(\"$vm\")\n\n  SCRIPT_FILE=\"${SCRIPT_TMPDIR}/startup_${i}.sh\"\n  cat > \"$SCRIPT_FILE\" <<STARTUP_EOF\n#!/bin/bash\nexec > /var/log/svaba_startup.log 2>&1\nset -euxo pipefail\n\necho \"=== svaba worker ${i} starting at \\$(date) ===\"\n\n# --- mount data disk ---\nmkdir -p ${MOUNT} /mnt/output\n\necho \"waiting for data disk...\"\nfor attempt in \\$(seq 1 30); do\n  [[ -b /dev/sdb ]] && break\n  echo \"  attempt \\${attempt}: /dev/sdb not yet available\"\n  sleep 2\ndone\n\nif [[ ! -b /dev/sdb ]]; then\n  echo \"FATAL: /dev/sdb not found after 60s\"\n  echo \"available block devices:\"\n  lsblk\n  exit 1\nfi\n\nMOUNT_DEV=/dev/sdb\n[[ -b /dev/sdb1 ]] && MOUNT_DEV=/dev/sdb1\necho \"mounting \\${MOUNT_DEV} -> ${MOUNT}\"\nmount -o ro,noload \\${MOUNT_DEV} ${MOUNT} || mount -o ro \\${MOUNT_DEV} ${MOUNT}\n\necho \"data disk mounted, contents:\"\nls ${MOUNT}/\n\n# --- run svaba ---\nPART_ID=\"${ID}_part${i}\"\ncd /mnt/output\n\necho \"=== starting svaba at \\$(date) ===\"\nsvaba run \\\\\n  ${SVABA_ARGS_STR} \\\\\n  -k ${REGIONS[$((i-1))]} \\\\\n  -a \\${PART_ID} \\\\\n  2>&1 | tee \\${PART_ID}.startup.log\n\necho \"=== svaba finished at \\$(date) ===\"\necho \"output files:\"\nls -lh /mnt/output/\n\n# --- upload results ---\necho \"uploading to ${BUCKET}/\"\ngsutil -m cp \\\\\n  \\${PART_ID}.bps.txt.gz \\\\\n  \\${PART_ID}.log \\\\\n  \\${PART_ID}.startup.log \\\\\n  \\${PART_ID}.contigs.bam \\\\\n  \\${PART_ID}.runtime.txt \\\\\n  ${BUCKET}/\n\n# Upload optional outputs if they exist (--dump-reads)\nfor f in \\${PART_ID}.discordant.bam \\${PART_ID}.corrected.bam \\${PART_ID}.r2c.txt.gz; do\n  [[ -f \"\\$f\" ]] && gsutil cp \"\\$f\" ${BUCKET}/ || true\ndone\n\n# Signal completion\necho \"=== uploading done marker at \\$(date) ===\"\necho \"DONE\" | gsutil cp - ${BUCKET}/.done_part${i}\necho \"=== worker ${i} complete ===\"\nSTARTUP_EOF\n\n  echo \"[${i}/${PARTITIONS}] creating $vm  regions=${REGIONS[$((i-1))]}\"\n  run_cmd gcloud compute instances create \"$vm\" \\\n    --zone=\"$ZONE\" \\\n    --machine-type=\"$MACHINE\" \\\n    --image=\"$IMAGE\" \\\n    --disk=\"name=${DATA_DISK},mode=ro,device-name=svaba-data\" \\\n    --boot-disk-size=\"$BOOT_DISK_SIZE\" \\\n    --scopes=storage-rw \\\n    --metadata-from-file=startup-script=\"$SCRIPT_FILE\"\n\n  # Stagger VM creation to avoid disk-attach races\n  [[ $i -lt $PARTITIONS ]] && sleep 5\ndone\necho \"all $PARTITIONS VMs created\"\n\n# ================================================================\n# STEP 2: Wait for all workers to finish\n# ================================================================\necho \"waiting for workers to complete...\"\necho \"(checking ${BUCKET}/.done_part* every 60s)\"\n\npoll_done() {\n  local expected=$1\n  while true; do\n    local count\n    count=$(gsutil ls \"${BUCKET}/.done_part*\" 2>/dev/null | grep -c '\\.done_part' || true)\n    if [[ $count -ge $expected ]]; then\n      echo \"all $expected partitions complete\"\n      return 0\n    fi\n    echo \"  $(date +%H:%M:%S)  $count / $expected done\"\n    sleep 60\n  done\n}\n\nif [[ $DRY_RUN -eq 0 ]]; then\n  poll_done \"$PARTITIONS\"\nfi\n\n# ================================================================\n# STEP 3: Tear down workers (unless --keep-vms)\n# ================================================================\nif [[ $KEEP_VMS -eq 0 ]]; then\n  echo \"deleting worker VMs...\"\n  for vm in \"${VM_NAMES[@]}\"; do\n    run_cmd gcloud compute instances delete \"$vm\" \\\n      --zone=\"$ZONE\" --quiet &\n  done\n  wait\n  echo \"all workers deleted\"\nelse\n  echo \"keeping VMs (--keep-vms): ${VM_NAMES[*]}\"\nfi\n\n# Clean up done markers\nif [[ $DRY_RUN -eq 0 ]]; then\n  gsutil -m rm \"${BUCKET}/.done_part*\" 2>/dev/null || true\nfi\n\n# ================================================================\n# STEP 4: Merge + postprocess (optional, --merge)\n# ================================================================\nif [[ $DO_MERGE -eq 1 ]]; then\n  if [[ $DRY_RUN -eq 1 ]]; then\n    echo \"[dry-run] would merge ${PARTITIONS} partitions from ${BUCKET}/\"\n    echo \"svaba_cloud.sh: finished\"\n    exit 0\n  fi\n\n  echo \"============================================================\"\n  echo \"MERGE: downloading and postprocessing\"\n  echo \"============================================================\"\n\n  MERGE_DIR=\"${ID}_cloud_merge\"\n  mkdir -p \"$MERGE_DIR\"\n  cd \"$MERGE_DIR\"\n\n  # Download all bps.txt.gz files\n  for i in $(seq 1 \"$PARTITIONS\"); do\n    gsutil cp \"${BUCKET}/${ID}_part${i}.bps.txt.gz\" .\n  done\n\n  # Concatenate (gzip is concat-safe per RFC 1952)\n  echo \"concatenating ${PARTITIONS} bps.txt.gz files...\"\n  cat ${ID}_part*.bps.txt.gz > \"${ID}.bps.txt.gz\"\n\n  # Merge contigs BAMs\n  echo \"downloading and merging contigs BAMs...\"\n  CONTIG_BAMS=()\n  for i in $(seq 1 \"$PARTITIONS\"); do\n    gsutil cp \"${BUCKET}/${ID}_part${i}.contigs.bam\" .\n    CONTIG_BAMS+=(\"${ID}_part${i}.contigs.bam\")\n  done\n  samtools merge -f \"${ID}.contigs.bam\" \"${CONTIG_BAMS[@]}\"\n  rm -f \"${CONTIG_BAMS[@]}\"\n\n  # Merge runtime.txt (just cat, first file has the header)\n  echo \"merging runtime.txt...\"\n  gsutil cp \"${BUCKET}/${ID}_part1.runtime.txt\" \"${ID}.runtime.txt\"\n  for i in $(seq 2 \"$PARTITIONS\"); do\n    gsutil cp \"${BUCKET}/${ID}_part${i}.runtime.txt\" tmp_rt.txt\n    tail -n +2 tmp_rt.txt >> \"${ID}.runtime.txt\"\n    rm -f tmp_rt.txt\n  done\n\n  # Merge optional r2c.txt.gz if present\n  R2C_FILES=()\n  for i in $(seq 1 \"$PARTITIONS\"); do\n    if gsutil -q stat \"${BUCKET}/${ID}_part${i}.r2c.txt.gz\" 2>/dev/null; then\n      gsutil cp \"${BUCKET}/${ID}_part${i}.r2c.txt.gz\" .\n      R2C_FILES+=(\"${ID}_part${i}.r2c.txt.gz\")\n    fi\n  done\n  if [[ ${#R2C_FILES[@]} -gt 0 ]]; then\n    echo \"merging ${#R2C_FILES[@]} r2c.txt.gz files...\"\n    cat \"${R2C_FILES[@]}\" > \"${ID}.r2c.txt.gz\"\n    rm -f \"${R2C_FILES[@]}\"\n  fi\n\n  # Postprocess\n  SCRIPT_DIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\n  if [[ -x \"${SCRIPT_DIR}/svaba_postprocess.sh\" ]]; then\n    echo \"running svaba_postprocess.sh...\"\n    \"${SCRIPT_DIR}/svaba_postprocess.sh\" -t \"$THREADS\" -m 4G \"$ID\"\n  else\n    echo \"svaba_postprocess.sh not found at ${SCRIPT_DIR}; skipping\"\n    echo \"run manually: scripts/svaba_postprocess.sh -t 8 -m 4G ${ID}\"\n  fi\n\n  echo \"============================================================\"\n  echo \"DONE. Merged outputs in: $(pwd)\"\n  echo \"  ${ID}.bps.sorted.dedup.txt.gz\"\n  echo \"  ${ID}.contigs.bam\"\n  echo \"  ${ID}.runtime.txt\"\n  echo \"============================================================\"\nfi\n\necho \"svaba_cloud.sh: finished\"\n"
  },
  {
    "path": "scripts/svaba_local_function.sh",
    "content": "# svaba_local_function.sh — sourceable bash helpers for common svaba tasks.\n#\n# Designed to be dot-sourced into an interactive shell (bash/zsh), NOT\n# executed as a script. Usage:\n#\n#   # in your ~/.bashrc or ~/.zshrc (or run once per shell session):\n#   source ~/git/svaba/scripts/svaba_local_function.sh\n#\n#   # then use any of the svaba_* helpers:\n#   svaba_help\n#   svaba_grep_contig fermi4.r2c.pass.txt.gz c_fermi_chr19_48755001_48780001_13C\n#\n# Every function is prefixed `svaba_` to stay out of the way of anything\n# else on your PATH. Every function responds to `-h` / `--help` with its\n# own usage block, so you don't need to remember signatures — just type\n# the name and `-h`.\n#\n# Set `SVABA_FUNCTIONS_QUIET=1` before sourcing to suppress the banner.\n\n# ---------------------------------------------------------------------\n# svaba_help — list all svaba_* functions defined here with one-liners.\n# ---------------------------------------------------------------------\nsvaba_help() {\n  cat <<'EOF'\nsvaba_* helper functions (from scripts/svaba_local_function.sh).\nCall any function with -h / --help for detailed usage.\n\n  svaba_help\n      this message\n\n  svaba_grep_contig FILE CNAME [OUTFILE]\n      pull one contig's rows out of an r2c TSV, preserving the header\n      so the result loads in viewer/r2c_explorer.html\n\n  svaba_pass_cnames FILE\n      print cnames of all PASS variants in a bps.txt[.gz]\n\n  svaba_pass_somatic_cnames FILE\n      same, restricted to PASS with somlod >= 1\n\n  svaba_bps_cols\n      print the bps.txt.gz column-index reference\n\n  svaba_igv LOCUS [PORT]\n      tell a running IGV (default port 60151) to jump to LOCUS\n\n  svaba_swap_bps IN.bps.txt.gz OUT.bps.txt.gz\n      sanity-check helper: randomly (50%/row) swap bp1<->bp2 fields\n      across all paired columns, so downstream compare code can be\n      tested for orientation-invariance\n\n  svaba_bam_grep IN.bam SEQUENCE OUT.bam [REGION]\n      pull reads whose SEQ contains SEQUENCE (or its reverse\n      complement) into a sub-BAM. Optional REGION restricts the scan\n      to a samtools-style locus first (requires indexed IN.bam)\nEOF\n}\n\n# ---------------------------------------------------------------------\n# svaba_grep_contig — the most frequent ask: pull one contig's rows out\n# of an r2c TSV, preserving the header row so the sliced file loads in\n# viewer/r2c_explorer.html without falling back to the canonical schema.\n# ---------------------------------------------------------------------\nsvaba_grep_contig() {\n  if [[ \"${1:-}\" == \"-h\" || \"${1:-}\" == \"--help\" || $# -lt 2 ]]; then\n    cat <<'EOF'\nsvaba_grep_contig FILE CNAME [OUTFILE]\n\n  Extract the \"contig\" row plus all \"read\" rows for a given cname from\n  an r2c TSV produced by svaba run --dump-reads (or the PASS / PASS-\n  somatic subsets from svaba_postprocess.sh). The header line is always\n  preserved so the output loads directly in viewer/r2c_explorer.html.\n\n  FILE      input r2c TSV — .txt.gz (auto-decompressed) or plain .txt\n  CNAME     contig name (awk regex; a prefix or unique substring works)\n  OUTFILE   output path   (default: CNAME.txt — note: plain text, not .gz)\n\nExamples:\n  svaba_grep_contig fermi4_full.r2c.pass.txt.gz c_fermi_chr19_48755001_48780001_13C\n  svaba_grep_contig fermi4.r2c.pass.txt.gz c_fermi_chr7  /tmp/chr7_contigs.txt\nEOF\n    return 1\n  fi\n  local file=\"$1\" cname=\"$2\" out=\"${3:-${2}.txt}\"\n  if [[ ! -r \"$file\" ]]; then\n    echo \"svaba_grep_contig: cannot read $file\" >&2\n    return 2\n  fi\n  # Decompress if .gz, cat otherwise. `gzip -dc` works on macOS where\n  # plain `zcat` expects a .Z suffix rather than .gz.\n  local reader\n  case \"$file\" in\n    *.gz) reader=\"gzip -dc\" ;;\n    *)    reader=\"cat\" ;;\n  esac\n  $reader \"$file\" | awk -v cname=\"$cname\" 'NR==1 || $0 ~ cname' > \"$out\"\n  local n\n  n=$(wc -l < \"$out\" | awk '{print $1}')\n  echo \"svaba_grep_contig: wrote $out  ($n lines incl. header)\" >&2\n}\n\n# ---------------------------------------------------------------------\n# svaba_pass_cnames — one-liner for pulling the cnames of PASS variants\n# out of bps.txt[.gz]. Useful for feeding into svaba_grep_contig in a\n# loop, or for sanity-checking counts.\n# ---------------------------------------------------------------------\nsvaba_pass_cnames() {\n  if [[ \"${1:-}\" == \"-h\" || \"${1:-}\" == \"--help\" || $# -lt 1 ]]; then\n    cat <<'EOF'\nsvaba_pass_cnames FILE\n\n  Print cnames (bps.txt col 30 = contig_and_region) for every PASS row\n  (col 32 == \"PASS\") in FILE. Output is sorted + unique.\n\n  FILE   ${ID}.bps.txt.gz (or plain .txt)\n\nExample:\n  svaba_pass_cnames tumor_normal.bps.txt.gz | wc -l\nEOF\n    return 1\n  fi\n  local file=\"$1\" reader\n  case \"$file\" in\n    *.gz) reader=\"gzip -dc\" ;;\n    *)    reader=\"cat\" ;;\n  esac\n  $reader \"$file\" | awk -F'\\t' 'NR>1 && $32==\"PASS\" {print $30}' | LC_ALL=C sort -u\n}\n\n# ---------------------------------------------------------------------\n# svaba_pass_somatic_cnames — same as above but restricted to the\n# PASS + somlod >= 1 subset (i.e. what ends up in r2c.pass.somatic).\n# ---------------------------------------------------------------------\nsvaba_pass_somatic_cnames() {\n  if [[ \"${1:-}\" == \"-h\" || \"${1:-}\" == \"--help\" || $# -lt 1 ]]; then\n    cat <<'EOF'\nsvaba_pass_somatic_cnames FILE\n\n  Print cnames for every PASS + somatic variant (col 32 == \"PASS\" AND\n  col 37 somlod >= 1) in FILE. Non-numeric somlod values (\"NA\",\n  missing) coerce to 0 and are excluded. Output is sorted + unique.\n\n  FILE   ${ID}.bps.txt.gz (or plain .txt)\nEOF\n    return 1\n  fi\n  local file=\"$1\" reader\n  case \"$file\" in\n    *.gz) reader=\"gzip -dc\" ;;\n    *)    reader=\"cat\" ;;\n  esac\n  $reader \"$file\" | awk -F'\\t' 'NR>1 && $32==\"PASS\" && $37+0 >= 1 {print $30}' | LC_ALL=C sort -u\n}\n\n# ---------------------------------------------------------------------\n# svaba_bps_cols — quick printable reference for the bps.txt column\n# layout. Useful when you're writing one-off awks and need to remember\n# \"which column is somlod again?\"\n# ---------------------------------------------------------------------\nsvaba_bps_cols() {\n  cat <<'EOF'\nsvaba bps.txt column layout (from BreakPoint::toFileString).\nColumn numbers are 1-indexed (awk $1 == chr1).\n\n  col  name                   notes\n  ---  ---------------------  -----------------------------------------\n   1   chr1\n   2   pos1\n   3   strand1\n   4   chr2\n   5   pos2\n   6   strand2\n   7   ref\n   8   alt\n   9   span\n  10   split\n  11   alt_count\n  12   cov\n  13   cigar\n  14   cigar_near\n  15   dmq1                   discordant-MAPQ, side 1\n  16   dmq2                   discordant-MAPQ, side 2\n  17   dcn                    discordant count, normal\n  18   dct                    discordant count, tumor\n  19   mapq1                  contig-alignment MAPQ, side 1\n  20   mapq2\n  21   nm1\n  22   nm2\n  23   as1\n  24   as2\n  25   sub1\n  26   sub2\n  27   homol\n  28   insert\n  29   repeat\n  30   contig_and_region      <- cname, used as r2c join key\n  31   naln\n  32   conf                   <- \"PASS\" / \"LOWLOD\" / etc.\n  33   type                   (older files: named \"evidence\")\n  34   qual\n  35   2ndary                 (older files: named \"secondary\")\n  36   somatic\n  37   somlod                 <- \"somatic LOD\"\n  38   maxlod                 <- max over per-sample LO\n  39   dbsnp\n  40   contig_conf1\n  41   contig_conf2\n  42   cpos1                  v2 only (post-SvABA2.0 refilter round-trip)\n  43   cpos2                  v2 only\n  44   lmatch                 v2 only\n  45   rmatch                 v2 only\n  46   scov1                  v2 only\n  47   scov2                  v2 only\n  48   local1                 v2 only\n  49   local2                 v2 only\n  50   ctglen                 v2 only\n  51   flipped                v2 only\n  52   bp_id                  v3 only — unique per-BP identifier,\n                              format \"bpTTTNNNNNNNN\" (thread TTT,\n                              counter NNNNNNNN). Cross-references to\n                              r2c.txt.gz's split_bps / disc_bps\n                              columns so you can tell which BP on a\n                              contig a given read actually supports.\n                              (\".\" on very old v2 files rewritten\n                              through a v3 emitter that left id unset.)\n  53+  per-sample blocks      FORMAT: GT:AD:DP:SR:DR:GQ:PL:LO:LO_n\n                              (one block per BAM, order from the header row)\nEOF\n}\n\n# ---------------------------------------------------------------------\n# svaba_igv — nudge a running IGV to a locus via its HTTP command port.\n# Requires IGV's \"Enable port\" preference to be on (default port 60151).\n# Useful in loops while eyeballing variants.\n# ---------------------------------------------------------------------\nsvaba_igv() {\n  if [[ \"${1:-}\" == \"-h\" || \"${1:-}\" == \"--help\" || $# -lt 1 ]]; then\n    cat <<'EOF'\nsvaba_igv LOCUS [PORT]\n\n  POST a goto request to a running IGV instance so it navigates to\n  LOCUS. IGV must have the \"Enable port\" preference turned on.\n\n  LOCUS   anything IGV understands: chr:pos, chr:start-end, gene name, ...\n  PORT    IGV command port (default 60151)\n\nExamples:\n  svaba_igv chr7:55249071\n  svaba_igv chr17:7675000-7687000\nEOF\n    return 1\n  fi\n  local locus=\"$1\" port=\"${2:-60151}\"\n  # Use curl (widely available on macOS + linux). encodeURIComponent-style\n  # minimal escaping: swap spaces for %20 so gene/locus queries work.\n  local enc\n  enc=$(printf '%s' \"$locus\" | sed 's/ /%20/g')\n  if ! curl -sS --max-time 3 \"http://localhost:${port}/goto?locus=${enc}\" >/dev/null; then\n    echo \"svaba_igv: IGV not reachable at localhost:${port} (is IGV running with 'Enable port' on?)\" >&2\n    return 3\n  fi\n  echo \"svaba_igv: IGV -> $locus\"\n}\n\n# ---------------------------------------------------------------------\n# svaba_swap_bps — sanity-check helper. Randomly (50% per row) swap all\n# bp1-side <-> bp2-side paired columns in a bps.txt[.gz], producing an\n# orientation-randomized file. Downstream compare code that's supposed\n# to be orientation-invariant should treat in.bps.txt.gz and its\n# swapped version as equivalent.\n# ---------------------------------------------------------------------\nsvaba_swap_bps() {\n  if [[ \"${1:-}\" == \"-h\" || \"${1:-}\" == \"--help\" || $# -lt 2 ]]; then\n    cat <<'EOF'\nsvaba_swap_bps IN.bps.txt[.gz] OUT.bps.txt.gz\n\n  Read IN, preserve the header, then for each data row independently\n  flip a fair coin: with prob 1/2, swap every bp1-side column with its\n  bp2-side partner. Output is gzip-compressed regardless of the input\n  form.\n\n  Paired columns swapped together (so rows stay internally consistent):\n     1/4   chr1   <-> chr2\n     2/5   pos1   <-> pos2\n     3/6   strand1 <-> strand2\n    15/16  dmq1   <-> dmq2\n    19/20  mapq1  <-> mapq2\n    21/22  nm1    <-> nm2\n    23/24  as1    <-> as2\n    25/26  sub1   <-> sub2\n    40/41  contig_conf1 <-> contig_conf2\n    42/43  cpos1  <-> cpos2          (v2 only — auto-skipped on v1 files)\n    44/45  lmatch <-> rmatch          (v2 only)\n    46/47  scov1  <-> scov2           (v2 only)\n    48/49  local1 <-> local2          (v2 only)\n\n  Non-paired side-agnostic columns (ref, alt, span, somlod, ...) are\n  left alone.\n\nExample:\n  svaba_swap_bps fermi4_full.bps.txt.gz fermi4_full.bp_swapped.bps.txt.gz\nEOF\n    return 1\n  fi\n  local in=\"$1\" out=\"$2\" reader\n  case \"$in\" in\n    *.gz) reader=\"gzip -dc\" ;;\n    *)    reader=\"cat\" ;;\n  esac\n  $reader \"$in\" | awk 'BEGIN{\n      FS=OFS=\"\\t\"; srand()\n      split(\"1,4 2,5 3,6 15,16 19,20 21,22 23,24 25,26 40,41 42,43 44,45 46,47 48,49\", P, \" \")\n    }\n    /^#/ { print; next }\n    {\n      if (rand() < 0.5) {\n        for (k in P) {\n          split(P[k], q, \",\")\n          a = q[1] + 0; b = q[2] + 0\n          if (a <= NF && b <= NF) {\n            t = $a; $a = $b; $b = t\n          }\n        }\n      }\n      print\n    }' | gzip -c > \"$out\"\n  echo \"svaba_swap_bps: wrote $out\" >&2\n}\n\n# ---------------------------------------------------------------------\n# svaba_bam_grep — pull reads whose SEQ contains a target sequence (or\n# its reverse complement) into a sub-BAM. Useful for fishing for reads\n# carrying a specific motif, breakpoint junction, inserted sequence,\n# etc. Decodes BAM -> SAM, filters col 10 (SEQ) via awk's index(), then\n# re-encodes to BAM.\n# ---------------------------------------------------------------------\nsvaba_bam_grep() {\n  if [[ \"${1:-}\" == \"-h\" || \"${1:-}\" == \"--help\" || $# -lt 3 ]]; then\n    cat <<'EOF'\nsvaba_bam_grep IN.bam SEQUENCE OUT.bam [REGION]\n\n  Filter IN.bam to reads whose SEQ field contains SEQUENCE or its\n  reverse complement. Writes OUT.bam (with the original header). Match\n  is case-insensitive (SEQUENCE is uppercased, reverse-complemented\n  using the standard A<->T / C<->G / N<->N mapping); both strands are\n  checked in one pass so you don't need to submit both orientations.\n\n  IN.bam      input BAM (reads will be decompressed + re-encoded;\n              coordinate-sorted input yields coordinate-sorted output)\n  SEQUENCE    DNA motif to grep for. ACGTN only.\n  OUT.bam     output path.\n  REGION      optional samtools-style region (e.g. \"chr7:55000000-56000000\")\n              to restrict the scan. Requires IN.bam to be indexed (.bai).\n\n  Depends on `samtools` being on PATH. Scanning is linear in the number\n  of reads in the region (full-BAM scan of a 30x WGS takes ~15-30 min\n  on a single core; use REGION to localize when you can). Short\n  sequences (< ~8 bp) will match nearly every read — a warning is\n  printed if you pass one.\n\nExamples:\n  # Find reads carrying a specific junction/insert sequence anywhere\n  svaba_bam_grep tumor.bam TTAGGGTTAGGGTTAGGG telomere_reads.bam\n\n  # Same, but only scan chr17 to speed things up\n  svaba_bam_grep tumor.bam CATCGATCGATC chr17_hits.bam chr17\n\n  # Short sequence — will match lots; use a longer motif if you can\n  svaba_bam_grep tumor.bam ACGT lots.bam\nEOF\n    return 1\n  fi\n  local in=\"$1\" seq=\"$2\" out=\"$3\" region=\"${4:-}\"\n  if [[ ! -r \"$in\" ]]; then\n    echo \"svaba_bam_grep: cannot read $in\" >&2\n    return 2\n  fi\n  if ! command -v samtools >/dev/null 2>&1; then\n    echo \"svaba_bam_grep: samtools not on PATH\" >&2\n    return 3\n  fi\n  if [[ -z \"$seq\" ]]; then\n    echo \"svaba_bam_grep: empty SEQUENCE\" >&2\n    return 4\n  fi\n  # Validate: ACGTN only, any case.\n  if ! printf '%s' \"$seq\" | grep -qE '^[ACGTNacgtn]+$'; then\n    echo \"svaba_bam_grep: SEQUENCE must contain only ACGTN (got: $seq)\" >&2\n    return 5\n  fi\n  # Uppercase via tr (works on bash 3.2, unlike ${seq^^}).\n  local upper_seq rc_seq\n  upper_seq=$(printf '%s' \"$seq\" | tr '[:lower:]' '[:upper:]')\n  # Reverse-complement: complement via tr, then reverse.\n  rc_seq=$(printf '%s' \"$upper_seq\" | tr 'ACGTN' 'TGCAN' | rev)\n\n  if [[ ${#upper_seq} -lt 8 ]]; then\n    echo \"svaba_bam_grep: warning — sequence length ${#upper_seq} is short; expect many incidental matches\" >&2\n  fi\n\n  echo \"svaba_bam_grep: matching '$upper_seq' (or rc '$rc_seq') in $in${region:+  region=$region}\" >&2\n\n  # samtools view -h emits header (@) + records; awk keeps header as-is\n  # and data rows only if SEQ (col 10) contains either orientation.\n  # index() is a substring search — fast, no regex compile per row.\n  # Re-encode via `samtools view -b -o OUT -` so output is a valid BAM.\n  # If the user passed a REGION, include it after the input path; that's\n  # samtools' native locus-restriction syntax and it only works if the\n  # input has a .bai (or .csi) alongside.\n  if [[ -n \"$region\" ]]; then\n    samtools view -h \"$in\" \"$region\"\n  else\n    samtools view -h \"$in\"\n  fi | awk -v fwd=\"$upper_seq\" -v rc=\"$rc_seq\" '\n      /^@/ { print; next }\n      index($10, fwd) || index($10, rc) { print }\n    ' | samtools view -b -o \"$out\" -\n\n  # Report count. Try to build a .bai if the output ended up coord-sorted;\n  # silently skip if it didn't (e.g. name-sorted input BAM).\n  local n\n  n=$(samtools view -c \"$out\" 2>/dev/null)\n  if samtools index \"$out\" 2>/dev/null; then\n    echo \"svaba_bam_grep: wrote $out  ($n matching reads, indexed)\" >&2\n  else\n    echo \"svaba_bam_grep: wrote $out  ($n matching reads; not coord-sorted, no .bai built)\" >&2\n  fi\n}\n\n# ---------------------------------------------------------------------\n# Banner — suppressible with SVABA_FUNCTIONS_QUIET=1. Sent to stderr so\n# a non-interactive shell piping output isn't polluted.\n# ---------------------------------------------------------------------\nif [[ \"${SVABA_FUNCTIONS_QUIET:-0}\" != \"1\" ]]; then\n  echo \"svaba_local_function.sh sourced. Try 'svaba_help' for the list.\" >&2\nfi\n"
  },
  {
    "path": "scripts/svaba_postprocess.sh",
    "content": "#!/usr/bin/env bash\n#\n# svaba_postprocess.sh — one-stop post-processing of a svaba run.\n#\n# Replaces (and subsumes) the older sort_output.sh and\n# sort_and_deduplicate_bps.sh. Given a svaba analysis ID, this script:\n#\n#   1. Merges per-thread output BAMs into one BAM per suffix.\n#        ${ID}.thread*.${suffix}.bam -> ${ID}.${suffix}.bam\n#\n#   2. Runs `svaba postprocess` (the C++ subcommand) to coord-sort, stream-\n#      dedup on exact (qname,flag) duplicates, stamp a @PG \"svaba_postprocess\"\n#      line onto every final BAM header, and build a .bai index. Suffixes:\n#        weird, corrected, discordant, contigs.\n#      Final state per suffix is ${ID}.${suffix}.bam(.bai); no\n#      .sorted / .deduped intermediate files remain on the user path.\n#\n#   3. Sorts, deduplicates, and PASS-filters ${ID}.bps.txt.gz. Emits:\n#        ${ID}.bps.sorted.txt.gz            — full sorted list\n#        ${ID}.bps.sorted.dedup.txt.gz      — best SV (max maxlod) per\n#                                              (chr1,pos1,strand1,chr2,pos2,strand2)\n#        ${ID}.bps.sorted.dedup.pass.txt.gz — dedup restricted to PASS rows\n#        ${ID}.bps.sorted.dedup.pass.somatic.txt.gz — PASS rows that are also\n#                                              somatic (somlod >= 0 for v3\n#                                              format, somatic_state == 1 for\n#                                              legacy format)\n#\n#   4. Filters ${ID}.r2c.txt.gz down to PASS breakpoints — writes both\n#      ${ID}.r2c.pass.txt.gz (all PASS calls) and\n#      ${ID}.r2c.pass.somatic.txt.gz (PASS calls with somlod >= 1,\n#      i.e. the somatic subset) for interactive use in bps_explorer.html\n#      (the full r2c.txt.gz is typically too heavy to load).\n#\n#   5. Optionally (--split-by-source) demultiplexes the deduped BAMs by the\n#      first 4 chars of each read's QNAME into per-source BAMs.\n#\n# Every step is idempotent — missing inputs cause that step to log a short\n# note and continue, so rerunning this after regenerating one of the inputs\n# Just Works. The --skip-* flags let you skip a stage explicitly when you\n# only want to refresh one phase.\n#\n# Usage:\n#   svaba_postprocess.sh [options] <ID>\n#\n# Options (flags take precedence over equivalent env vars):\n#   -t, --threads N       total threads budget                 (default: 4)\n#   -m, --mem STR         per-samtools-sort-thread memory      (default: 2G)\n#       --sort-buffer STR per-chunk memory for the bps sorter  (default: 2G)\n#       --split-by-source also split BAMs by QNAME source prefix\n#       --input-dir DIR   look for inputs in DIR               (default: .)\n#       --output-dir DIR  write outputs to DIR               (default: INPUT_DIR)\n#       --svaba PATH      path to svaba binary (default: ~/git/svaba/build/svaba)\n#       --keep-tmp        keep scratch dirs for debugging\n#       --skip-bam        skip BAM merge/sort/dedup/index (steps 1 & 2)\n#       --skip-dedup      keep step 2 but tell svaba postprocess to skip the\n#                         dedup substep (passes --sort-only through). Useful\n#                         for quick reruns of sort + @PG stamp + index\n#                         without redoing the expensive dedup pass. Sort is\n#                         also auto-skipped when the BAM's header already\n#                         declares @HD SO:coordinate, so a repeat rerun is\n#                         effectively a no-op except for index rebuild.\n#       --skip-bps        skip bps sort/dedup/PASS (step 3)\n#       --skip-r2c        skip r2c PASS filter (step 4)\n#       --skip-split      force-disable split-by-source\n#   -h, --help            this message\n#\n# Environment variable fallbacks (used only if the matching flag is absent):\n#   THREADS, MEM, BUFFER_SIZE (→ --sort-buffer), SVABA, SAM, INPUT_DIR,\n#   OUTPUT_DIR, SPLIT_BY_SOURCE, KEEP_TMP\n#\n# Examples:\n#   svaba_postprocess.sh tumor_vs_normal\n#   svaba_postprocess.sh -t 16 -m 4G tumor_vs_normal\n#   svaba_postprocess.sh --split-by-source --output-dir /tmp/run42 run42\n#   svaba_postprocess.sh --skip-bam --skip-bps tumor_vs_normal   # only r2c refresh\n#\n# Notes:\n#   * Step 3 needs GNU sort (or `gsort` on macOS via `brew install coreutils`).\n#   * Steps 1+2 need samtools on PATH; step 2 needs a working svaba binary.\n\nset -euo pipefail\n\n# ----------------------------------------------------------- defaults ---\nTHREADS=${THREADS:-4}\nMEM=${MEM:-2G}\nSORT_BUFFER=${BUFFER_SIZE:-${SORT_BUFFER:-2G}}\nSVABA=${SVABA:-~/git/svaba/build/svaba}\nSAM=${SAM:-samtools}\nSPLIT_BY_SOURCE=${SPLIT_BY_SOURCE:-0}\nINPUT_DIR=${INPUT_DIR:-.}\nOUTPUT_DIR=${OUTPUT_DIR:-}\nKEEP_TMP=${KEEP_TMP:-0}\nSKIP_BAM=0\nSKIP_DEDUP=0\nSKIP_BPS=0\nSKIP_R2C=0\n\nprint_usage() {\n  sed -n '2,65p' \"$0\" | sed 's/^# \\{0,1\\}//'\n}\n\n# ---------------------------------------------------------- arg parse ---\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    -t|--threads)      THREADS=\"$2\"; shift 2 ;;\n    -m|--mem)          MEM=\"$2\"; shift 2 ;;\n    --sort-buffer)     SORT_BUFFER=\"$2\"; shift 2 ;;\n    --split-by-source) SPLIT_BY_SOURCE=1; shift ;;\n    --skip-split)      SPLIT_BY_SOURCE=0; shift ;;\n    --input-dir)       INPUT_DIR=\"$2\"; shift 2 ;;\n    --output-dir)      OUTPUT_DIR=\"$2\"; shift 2 ;;\n    --svaba)           SVABA=\"$2\"; shift 2 ;;\n    --keep-tmp)        KEEP_TMP=1; shift ;;\n    --skip-bam)        SKIP_BAM=1; shift ;;\n    --skip-dedup)      SKIP_DEDUP=1; shift ;;\n    --skip-bps)        SKIP_BPS=1; shift ;;\n    --skip-r2c)        SKIP_R2C=1; shift ;;\n    -h|--help)         print_usage; exit 0 ;;\n    --)                shift; break ;;\n    -*)\n      echo \"svaba_postprocess.sh: unknown option '$1'\" >&2\n      echo \"run 'svaba_postprocess.sh --help' for usage\" >&2\n      exit 2\n      ;;\n    *)                 break ;;\n  esac\ndone\n\nif [[ $# -lt 1 ]]; then\n  print_usage\n  exit 2\nfi\nID=$1\nshift\n\nOUTPUT_DIR=${OUTPUT_DIR:-$INPUT_DIR}\nif [[ ! -d \"$INPUT_DIR\" ]]; then\n  echo \"svaba_postprocess.sh: INPUT_DIR does not exist: $INPUT_DIR\" >&2\n  exit 3\nfi\nmkdir -p \"$OUTPUT_DIR\"\n\n# Human-readable echo of the plan so logs tell you what was about to run.\necho \"svaba_postprocess.sh: id=$ID threads=$THREADS mem=$MEM sort_buffer=$SORT_BUFFER\"\necho \"                    : input_dir=$INPUT_DIR output_dir=$OUTPUT_DIR\"\necho \"                    : split_by_source=$SPLIT_BY_SOURCE skip_bam=$SKIP_BAM skip_dedup=$SKIP_DEDUP skip_bps=$SKIP_BPS skip_r2c=$SKIP_R2C\"\n\n# Useful for absolute-path filenames in the steps below. Use trailing-slash-\n# free form so we always concatenate `${DIR}/${name}`.\nINPUT_DIR=${INPUT_DIR%/}\nOUTPUT_DIR=${OUTPUT_DIR%/}\n\n# ========================================================================\n# STEP 1: Merge per-thread BAMs and per-thread r2c.txt.gz.\n#\n# svaba run with multiple threads produces ${ID}.thread*.${suffix}.bam for\n# suffix in {discordant,weird,corrected}, and (with --dump-reads)\n# ${ID}.thread*.r2c.txt.gz. This step coalesces each family into a single\n# ${ID}.${suffix}.bam / ${ID}.r2c.txt.gz.\n#\n# Per-thread BAMs are merged with `samtools merge` — standard BAM merge\n# with header reconciliation.\n#\n# Per-thread r2c.txt.gz files are merged with plain `cat`: gzip is a\n# concatenation-safe format (RFC 1952), so concatenating multiple .gz\n# streams produces a valid .gz whose decompressed output is the\n# concatenation of each member's decompressed output. svaba guarantees\n# only the first worker (threadId == 1; the worker pool numbers\n# threads 1..N) emits the TSV column-header line, and the awk|sort\n# below places that file first in the merge, so the merged file has\n# exactly one header at the top regardless of thread count.\n#\n# Single-file inputs (only one thread) are renamed. No-file inputs are\n# silently skipped — this happens when the svaba run was single-threaded,\n# or when --dump-reads wasn't set (no r2c files to merge).\n# ========================================================================\nif [[ $SKIP_BAM -eq 0 ]]; then\n  echo \"[1/5] merging per-thread BAMs\"\n  for suffix in discordant weird corrected; do\n    target=\"${INPUT_DIR}/${ID}.${suffix}.bam\"\n    shopt -s nullglob\n    bam_files=(\"${INPUT_DIR}/${ID}\".thread*.\"${suffix}\".bam)\n    shopt -u nullglob\n    if [[ ${#bam_files[@]} -gt 1 ]]; then\n      echo \"      merge ${#bam_files[@]} thread BAMs for '$suffix' -> $target\"\n      \"$SAM\" merge -f -@ \"$THREADS\" \"$target\" \"${bam_files[@]}\"\n      rm -f \"${bam_files[@]}\"\n    elif [[ ${#bam_files[@]} -eq 1 ]]; then\n      echo \"      mv ${bam_files[0]} -> $target\"\n      mv \"${bam_files[0]}\" \"$target\"\n    fi\n  done\n\n  # Merge per-thread r2c.txt.gz → ${ID}.r2c.txt.gz. gzip is concat-safe,\n  # so `cat a.gz b.gz > c.gz` is valid. Thread 1's file is first in the\n  # numeric sort order (worker pool numbers threads 1..N; see\n  # threadpool.h), and thread 1 is the one that emits the TSV header,\n  # so its header line ends up at the top of the merged file.\n  target=\"${INPUT_DIR}/${ID}.r2c.txt.gz\"\n  shopt -s nullglob\n  r2c_files=(\"${INPUT_DIR}/${ID}\".thread*.r2c.txt.gz)\n  shopt -u nullglob\n  if [[ ${#r2c_files[@]} -gt 1 ]]; then\n    echo \"      merge ${#r2c_files[@]} thread r2c files -> $target\"\n    # Sort by thread index so thread 1 (with the header) is first.\n    # Filenames are ${ID}.threadN.r2c.txt.gz — awk pulls the numeric\n    # thread index out, sort -k1,1n orders it numerically, cut drops\n    # the index so we get just the filenames back in sorted order.\n    #\n    # NB: avoid `mapfile` / `readarray` — they're bash 4+, and macOS\n    # ships bash 3.2 as /bin/bash, which `#!/usr/bin/env bash` often\n    # resolves to. The `while read` loop below is fully portable.\n    r2c_sorted=()\n    while IFS= read -r f; do\n      r2c_sorted+=(\"$f\")\n    done < <(\n      printf '%s\\n' \"${r2c_files[@]}\" \\\n      | awk -F'.thread|.r2c.txt.gz' '{print $(NF-1)\"\\t\"$0}' \\\n      | sort -k1,1n \\\n      | cut -f2-\n    )\n    cat \"${r2c_sorted[@]}\" > \"$target\"\n    rm -f \"${r2c_sorted[@]}\"\n  elif [[ ${#r2c_files[@]} -eq 1 ]]; then\n    echo \"      mv ${r2c_files[0]} -> $target\"\n    mv \"${r2c_files[0]}\" \"$target\"\n  fi\nelse\n  echo \"[1/5] skipping BAM + r2c merge (--skip-bam)\"\nfi\n\n# ========================================================================\n# STEP 2: svaba postprocess — sort, stream-dedup, stamp @PG, build .bai.\n#\n# Heavy lifting lives in the C++ subcommand. We just pass it the thread /\n# memory budget; svaba postprocess splits THREADS across suffixes and passes\n# -m to samtools sort per-thread.\n#\n# --skip-dedup at this layer maps to `--sort-only` on the C++ CLI, which\n# still runs the sort + @PG-stamp + index phases but skips the\n# stream-dedup pass. Combined with the C++'s auto-skip-sort-when-already-\n# sorted check (via @HD SO:coordinate), a rerun with --skip-dedup on\n# already-postprocessed files is effectively a no-op other than\n# re-stamping PG + rebuilding the .bai.\n# ========================================================================\nif [[ $SKIP_BAM -eq 0 ]]; then\n  pp_args=(-i \"$ID\" -t \"$THREADS\" -m \"$MEM\")\n  if [[ $SKIP_DEDUP -eq 1 ]]; then\n    pp_args+=(--sort-only)\n    dedup_banner=\"(dedup skipped via --skip-dedup)\"\n  else\n    dedup_banner=\"\"\n  fi\n  echo \"[2/5] svaba postprocess: sort + dedup + @PG + BAI index (threads=$THREADS, mem=$MEM) $dedup_banner\"\n  # Indent all sub-output and suppress the harmless htslib \"idx_find_and_load\"\n  # warnings (index files don't exist yet when the reader opens the BAM —\n  # they're built as the final step of each suffix's pipeline). Also strip\n  # the NOTE line about those warnings since we're filtering them here.\n  # Use awk instead of grep -v so a zero-match case doesn't trigger pipefail.\n  (cd \"$INPUT_DIR\" && \"$SVABA\" postprocess \"${pp_args[@]}\" 2>&1) \\\n    | awk '!/idx_find_and_load/ && !/Could not retrieve index file.*expected and can be ignored/' \\\n    | sed 's/^/      /'\nelse\n  echo \"[2/5] skipping svaba postprocess (--skip-bam)\"\nfi\n\n# ========================================================================\n# STEP 3: Sort, dedup, and PASS-filter the bps.txt.\n#\n# Three outputs: sorted, sorted+dedup (one row per unique breakpoint pair,\n# keeping the row with highest maxlod), sorted+dedup+PASS. Preserves the\n# leading \"#chr1...\" header row in every output. Uses GNU sort (or gsort\n# on macOS) for external-memory sort; --parallel=THREADS, -S SORT_BUFFER.\n#\n# Column positions in bps.txt (hard-coded from BreakPoint::toFileString):\n#   col 32 = confidence (PASS / LOWMAPQ / BLACKLIST / ...)\n#   col 38 = maxlod     (numeric; \"NA\" sorts last with -g)\n#\n# Sort keys in order: chr1(V), pos1(n), strand1, chr2(V), pos2(n), strand2,\n#                     maxlod(gr, descending).\n# ========================================================================\nBPS_GZ=\"${INPUT_DIR}/${ID}.bps.txt.gz\"\nBPS_TXT=\"${INPUT_DIR}/${ID}.bps.txt\"\nOUT_SORTED=\"${OUTPUT_DIR}/${ID}.bps.sorted.txt.gz\"\nOUT_DEDUP=\"${OUTPUT_DIR}/${ID}.bps.sorted.dedup.txt.gz\"\nOUT_PASS=\"${OUTPUT_DIR}/${ID}.bps.sorted.dedup.pass.txt.gz\"\nOUT_PASS_SOM=\"${OUTPUT_DIR}/${ID}.bps.sorted.dedup.pass.somatic.txt.gz\"\n\n# Column positions — auto-detected from the header when available (see\n# detect_columns below). These are the v3 defaults; the old format has\n# different positions (e.g. confidence at col 26 instead of 32).\nCONF_COL=32\nSOMATIC_COL=36\nSOMLOD_COL=37\nMAXLOD_COL=38\nCNAME_COL=30\n\npick_sort() {\n  if command -v gsort >/dev/null 2>&1; then\n    echo gsort; return 0\n  fi\n  if sort --version 2>/dev/null | head -n 1 | grep -qi 'gnu'; then\n    echo sort; return 0\n  fi\n  return 1\n}\n\n# Auto-detect column positions from the header line. Looks for known\n# column names and sets CONF_COL, SOMATIC_COL, SOMLOD_COL, MAXLOD_COL.\n# Falls back to v3 defaults if the header is missing or unrecognised.\ndetect_columns() {\n  local header_line=\"$1\"\n  # strip leading # if present\n  local clean=\"${header_line#\\#}\"\n\n  # Use awk to find column indices by name. Tries both old and new\n  # column names (e.g. \"somatic_score\" vs the unnamed v3 col,\n  # \"contig\" vs \"cname\").\n  eval \"$(echo \"$clean\" | awk -F'\\t' '{\n    for (i = 1; i <= NF; i++) {\n      col = $i\n      # strip whitespace\n      gsub(/^[ \\t]+|[ \\t]+$/, \"\", col)\n      # normalise to lowercase for matching\n      lcol = tolower(col)\n\n      if (lcol == \"confidence\")          printf \"CONF_COL=%d\\n\", i\n      if (lcol == \"somatic_score\")       printf \"SOMATIC_COL=%d\\n\", i\n      if (lcol == \"somatic_lod\")         printf \"SOMLOD_COL=%d\\n\", i\n      if (lcol == \"tlod\" || lcol == \"maxlod\" || lcol == \"max_lod\")\n                                         printf \"MAXLOD_COL=%d\\n\", i\n      if (lcol == \"contig\" || lcol == \"cname\")\n                                         printf \"CNAME_COL=%d\\n\", i\n    }\n  }')\"\n}\n\nif [[ $SKIP_BPS -eq 0 ]]; then\n  if [[ -r \"$BPS_GZ\"  ]]; then IN_BPS=\"$BPS_GZ\";  READER=\"gzip -dc\"\n  elif [[ -r \"$BPS_TXT\" ]]; then IN_BPS=\"$BPS_TXT\"; READER=\"cat\"\n  else IN_BPS=\"\"; fi\n\n  if [[ -z \"$IN_BPS\" ]]; then\n    echo \"[3/5] skipping bps sort/dedup/PASS: $BPS_GZ (or .bps.txt) not found\"\n  elif ! SORT_BIN=$(pick_sort); then\n    echo \"[3/5] skipping bps sort/dedup/PASS: GNU sort not on PATH\" >&2\n    echo \"      (macOS: 'brew install coreutils' for gsort)\" >&2\n  else\n    echo \"[3/5] sort + dedup + PASS-filter  $IN_BPS\"\n    echo \"      sort=$SORT_BIN  buffer=$SORT_BUFFER  parallel=$THREADS\"\n\n    TMP_BPS=$(mktemp -d \"${TMPDIR:-/tmp}/svaba_pp_bps.XXXXXXXX\")\n    # Single cleanup trap for the whole script; registered the first time\n    # we need a tempdir. Registered here because step 3 creates the first\n    # tempdir used.\n    trap 'if [[ \"${KEEP_TMP:-0}\" == \"1\" ]]; then\n            echo \"svaba_postprocess.sh: leaving scratch at: $TMP_BPS${TMP_SPLIT:+ $TMP_SPLIT}\" >&2\n          else\n            rm -rf \"$TMP_BPS\" \"${TMP_SPLIT:-}\"\n          fi' EXIT INT TERM\n\n    # Peek at the first line to decide whether to split off a header.\n    FIRST_LINE=$($READER \"$IN_BPS\" | head -n 1 || true)\n    HAS_HEADER=0\n    [[ \"${FIRST_LINE:0:1}\" == \"#\" ]] && HAS_HEADER=1\n\n    # Auto-detect column positions from the header.\n    if [[ $HAS_HEADER -eq 1 ]]; then\n      detect_columns \"$FIRST_LINE\"\n    fi\n    echo \"      columns: confidence=$CONF_COL cname=$CNAME_COL somatic=$SOMATIC_COL somlod=$SOMLOD_COL maxlod=$MAXLOD_COL\"\n\n    # --- 3a) sort ---\n    {\n      if [[ $HAS_HEADER -eq 1 ]]; then\n        printf '%s\\n' \"$FIRST_LINE\"\n        $READER \"$IN_BPS\" | tail -n +2\n      else\n        $READER \"$IN_BPS\"\n      fi | {\n        if [[ $HAS_HEADER -eq 1 ]]; then\n          IFS= read -r hdr\n          printf '%s\\n' \"$hdr\"\n        fi\n        LC_ALL=C \"$SORT_BIN\" \\\n          -t $'\\t' \\\n          -k1,1V \\\n          -k2,2n \\\n          -k3,3 \\\n          -k4,4V \\\n          -k5,5n \\\n          -k6,6 \\\n          -k${MAXLOD_COL},${MAXLOD_COL}gr \\\n          -S \"$SORT_BUFFER\" \\\n          --parallel=\"$THREADS\" \\\n          -T \"$TMP_BPS\"\n      }\n    } | gzip -c > \"$OUT_SORTED\"\n    echo \"      wrote $OUT_SORTED\"\n\n    # --- 3b) dedup by breakpoint pair (first row per key wins = highest maxlod) ---\n    gzip -dc \"$OUT_SORTED\" | awk -F'\\t' -v OFS='\\t' '\n      NR == 1 && $0 ~ /^#/ { print; next }\n      { key = $1 FS $2 FS $3 FS $4 FS $5 FS $6\n        if (!(key in seen)) { seen[key] = 1; print } }\n    ' | gzip -c > \"$OUT_DEDUP\"\n    echo \"      wrote $OUT_DEDUP\"\n\n    # --- 3c) PASS-filter the dedup ---\n    gzip -dc \"$OUT_DEDUP\" | awk -F'\\t' -v OFS='\\t' -v CCOL=\"$CONF_COL\" '\n      NR == 1 && $0 ~ /^#/ { print; next }\n      $CCOL == \"PASS\" { print }\n    ' | gzip -c > \"$OUT_PASS\"\n    echo \"      wrote $OUT_PASS\"\n\n    # --- 3d) PASS + somatic filter ---\n    # Use somatic_score == \"1\" as the sole somatic gate. The old format's\n    # \"somatic_lod\" column is actually n.LO_n (normal variant LO) — high\n    # values mean strong normal evidence, which argues AGAINST somatic.\n    # The v3 \"somlod\" is a proper somatic log-odds, but somatic_score is\n    # set correctly in both formats, so we use it uniformly.\n    gzip -dc \"$OUT_PASS\" | awk -F'\\t' -v OFS='\\t' \\\n        -v SCOL=\"$SOMATIC_COL\" '\n      NR == 1 && $0 ~ /^#/ { print; next }\n      $SCOL == \"1\" { print }\n    ' | gzip -c > \"$OUT_PASS_SOM\"\n    echo \"      wrote $OUT_PASS_SOM\"\n  fi\nelse\n  echo \"[3/5] skipping bps sort/dedup/PASS (--skip-bps)\"\nfi\n\n# ========================================================================\n# STEP 4: Filter r2c.txt.gz to PASS contigs (+ PASS-somatic subset).\n#\n# The structured r2c TSV emitted by `svaba run` contains one row per\n# assembled contig + one row per r2c-aligned read, for every variant-\n# bearing contig. At full genome scale this can be tens of millions of\n# rows — too heavy for the interactive viewer. Here we produce TWO\n# filtered outputs from a single pass over r2c.txt.gz:\n#\n#   ${ID}.r2c.pass.txt.gz          - rows for all PASS variants\n#   ${ID}.r2c.pass.somatic.txt.gz  - rows for PASS variants that are also\n#                                    somatic (somlod >= 1 for v3 format,\n#                                    somatic_score == 1 for legacy)\n#\n# Both are keyed on cname (col 30 in bps.txt.gz, col 2 in r2c.txt.gz);\n# contig and read rows survive together since they share col 2.\n#\n# The somatic subset is a strict subset of the pass set, and both are\n# written by the same awk invocation over r2c.txt.gz via awk's pipe-to-\n# command output — one decompress+iterate pass, two gzip compressors\n# running in parallel as child processes. Avoids reading the multi-GB\n# r2c file twice.\n# ========================================================================\nR2C_GZ=\"${INPUT_DIR}/${ID}.r2c.txt.gz\"\nR2C_OUT=\"${OUTPUT_DIR}/${ID}.r2c.pass.txt.gz\"\nR2C_OUT_SOM=\"${OUTPUT_DIR}/${ID}.r2c.pass.somatic.txt.gz\"\n\nif [[ $SKIP_R2C -eq 0 ]]; then\n  if [[ ! -f \"$BPS_GZ\" ]]; then\n    echo \"[4/5] skipping r2c PASS filter: $BPS_GZ not found\"\n  elif [[ ! -f \"$R2C_GZ\" ]]; then\n    echo \"[4/5] skipping r2c PASS filter: $R2C_GZ not found\"\n    echo \"       (svaba run must be invoked with --dump-reads to produce it;\"\n    echo \"        or this is an older svaba run from before r2c.txt.gz existed.)\"\n  else\n    echo \"[4/5] filter r2c to PASS contigs (+ PASS-somatic subset)\"\n    pass_list=\"$(mktemp -t \"svaba.${ID}.pass_cnames.XXXXXX\")\"\n    som_list=\"$(mktemp  -t \"svaba.${ID}.som_cnames.XXXXXX\")\"\n    # Column positions are auto-detected from the header in step 3 above\n    # (CONF_COL, CNAME_COL, SOMLOD_COL, SOMATIC_COL). If step 3 was\n    # skipped, re-detect from bps.txt.gz's own header here.\n    if [[ $SKIP_BPS -eq 1 ]]; then\n      BPS_HEADER=$(gzip -dc \"$BPS_GZ\" | head -n 1 || true)\n      [[ \"${BPS_HEADER:0:1}\" == \"#\" ]] && detect_columns \"$BPS_HEADER\"\n      echo \"      columns: confidence=$CONF_COL cname=$CNAME_COL somatic=$SOMATIC_COL somlod=$SOMLOD_COL\"\n    fi\n    # One awk pass builds both cname sets so we only decompress bps.txt.gz\n    # once. NB: use `gzip -dc` (not `zcat`) so this works on macOS — BSD\n    # zcat hunts for a .Z suffix rather than .gz.\n    # Somatic criterion: somatic_score == \"1\" (reliable in both old and v3 formats).\n    gzip -dc \"$BPS_GZ\" \\\n      | awk -F'\\t' -v pass_f=\"$pass_list\" -v som_f=\"$som_list\" \\\n            -v CCOL=\"$CONF_COL\" -v NCOL=\"$CNAME_COL\" \\\n            -v SCOL=\"$SOMATIC_COL\" '\n          NR>1 && $CCOL==\"PASS\" {\n            print $NCOL >> pass_f\n            if ($SCOL == \"1\")\n              { print $NCOL >> som_f }\n          }\n        '\n    LC_ALL=C sort -u \"$pass_list\" -o \"$pass_list\"\n    LC_ALL=C sort -u \"$som_list\"  -o \"$som_list\"\n    n_pass=$(wc -l < \"$pass_list\" | awk '{print $1}')\n    n_som=$(wc  -l < \"$som_list\"  | awk '{print $1}')\n\n    if [[ \"$n_pass\" -eq 0 ]]; then\n      echo \"      no PASS breakpoints — skipping both r2c.pass and r2c.pass.somatic.\"\n      rm -f \"$pass_list\" \"$som_list\"\n    else\n      # Single-pass r2c filter writing both outputs via awk's pipe-to-\n      # command feature. The two `gzip -c > file` child processes run in\n      # parallel, so compression of the two outputs happens concurrently\n      # on separate cores. Each output gets the same header row and then\n      # whichever filtered rows match its cname set.\n      gzip -dc \"$R2C_GZ\" \\\n        | awk -F'\\t' -v pass_f=\"$pass_list\"   -v som_f=\"$som_list\" \\\n                     -v pass_out=\"$R2C_OUT\"   -v som_out=\"$R2C_OUT_SOM\" '\n            BEGIN {\n              while ((getline line < pass_f) > 0) keep_pass[line] = 1\n              close(pass_f)\n              while ((getline line < som_f)  > 0) keep_som[line]  = 1\n              close(som_f)\n              pass_cmd = \"gzip -c > \" pass_out\n              som_cmd  = \"gzip -c > \" som_out\n            }\n            NR == 1 {\n              print | pass_cmd\n              print | som_cmd\n              next\n            }\n            ($1 == \"contig\" || $1 == \"read\") {\n              if ($2 in keep_pass) print | pass_cmd\n              if ($2 in keep_som)  print | som_cmd\n            }\n            END {\n              close(pass_cmd)\n              close(som_cmd)\n            }\n          '\n\n      n_pass_rows=$(gzip -dc \"$R2C_OUT\"     | wc -l | awk '{print $1}')\n      n_som_rows=$(gzip  -dc \"$R2C_OUT_SOM\" | wc -l | awk '{print $1}')\n      echo \"      wrote $R2C_OUT        ($n_pass PASS contigs, $n_pass_rows rows incl. header)\"\n      echo \"      wrote $R2C_OUT_SOM  ($n_som PASS+somatic [somlod>=1] contigs, $n_som_rows rows incl. header)\"\n      rm -f \"$pass_list\" \"$som_list\"\n    fi\n  fi\nelse\n  echo \"[4/5] skipping r2c PASS filter (--skip-r2c)\"\nfi\n\n# ========================================================================\n# STEP 5 (optional): Split deduped BAMs by QNAME source prefix.\n#\n# Enabled by --split-by-source (or SPLIT_BY_SOURCE=1). Routes each record\n# into ${ID}.${suffix}.${prefix}.bam based on the first 4 chars of QNAME\n# (the \"source tag\" like t001/n001), then sorts+indexes each output.\n# Runs for discordant/weird/corrected only (not contigs).\n# ========================================================================\nif [[ \"$SPLIT_BY_SOURCE\" == \"1\" ]]; then\n  echo \"[5/5] splitting BAMs by QNAME source prefix\"\n  for suffix in discordant weird corrected; do\n    bam=\"${INPUT_DIR}/${ID}.${suffix}.bam\"\n    if [[ ! -f \"$bam\" ]]; then\n      echo \"      skip: $bam not found\"\n      continue\n    fi\n    echo \"      splitting $bam\"\n\n    TMP_SPLIT=$(mktemp -d \"${TMPDIR:-/tmp}/svaba_pp_split.XXXXXXXX\")\n    header=\"${TMP_SPLIT}/header.sam\"\n    \"$SAM\" view -H \"$bam\" > \"$header\"\n    # Single-pass route by first 4 chars of QNAME into per-prefix SAM files.\n    \"$SAM\" view \"$bam\" | awk -v tmpdir=\"$TMP_SPLIT\" '{\n      prefix = substr($1, 1, 4)\n      out = tmpdir \"/body.\" prefix \".sam\"\n      print >> out\n    }'\n\n    shopt -s nullglob\n    bodies=(\"${TMP_SPLIT}\"/body.*.sam)\n    shopt -u nullglob\n    n_bodies=${#bodies[@]}\n    if [[ $n_bodies -gt 0 ]]; then\n      per_job_threads=$(( THREADS / n_bodies ))\n      [[ $per_job_threads -lt 1 ]] && per_job_threads=1\n      max_parallel=$(( THREADS < n_bodies ? THREADS : n_bodies ))\n      echo \"        reassembling $n_bodies per-prefix BAMs (max_parallel=$max_parallel, threads/job=$per_job_threads)\"\n\n      pids=()\n      for body in \"${bodies[@]}\"; do\n        while [[ ${#pids[@]} -ge $max_parallel ]]; do\n          new_pids=()\n          for pid in \"${pids[@]}\"; do\n            kill -0 \"$pid\" 2>/dev/null && new_pids+=(\"$pid\")\n          done\n          pids=(\"${new_pids[@]}\")\n          [[ ${#pids[@]} -ge $max_parallel ]] && sleep 0.1\n        done\n        base=$(basename \"$body\" .sam)\n        prefix=\"${base#body.}\"\n        out=\"${OUTPUT_DIR}/${ID}.${suffix}.${prefix}.bam\"\n        echo \"          writing $out\"\n        (\n          cat \"$header\" \"$body\" \\\n            | \"$SAM\" view -@ \"$per_job_threads\" -u -bS - \\\n            | \"$SAM\" sort -@ \"$per_job_threads\" -m \"$MEM\" -o \"$out\" - \\\n            && \"$SAM\" index -@ \"$per_job_threads\" \"$out\"\n        ) &\n        pids+=(\"$!\")\n      done\n      wait\n    fi\n\n    if [[ \"${KEEP_TMP:-0}\" != \"1\" ]]; then\n      rm -rf \"$TMP_SPLIT\"\n      TMP_SPLIT=\"\"\n    fi\n  done\nelse\n  echo \"[5/5] skipping split-by-source (pass --split-by-source to enable)\"\nfi\n\necho \"svaba_postprocess.sh: done.\"\n"
  },
  {
    "path": "scripts/update_svaba_image.sh",
    "content": "#!/usr/bin/env bash\n#\n# update_svaba_image.sh — rebuild the svaba worker image from the builder VM.\n#\n# Stops the builder, deletes the old image, creates a new one, restarts\n# the builder. Takes ~2-3 minutes.\n#\n# Usage:\n#   update_svaba_image.sh [options]\n#\n#   --builder NAME    builder VM name     (default: svaba-image-builder)\n#   --image NAME      image name          (default: svaba-worker-image)\n#   --zone ZONE       GCP zone            (default: us-central1-a)\n#   -h, --help        this message\n#\n\nset -euo pipefail\n\nBUILDER=\"svaba-image-builder\"\nIMAGE=\"svaba-worker-image\"\nZONE=\"us-central1-a\"\n\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    --builder) BUILDER=\"$2\"; shift 2 ;;\n    --image)   IMAGE=\"$2\";   shift 2 ;;\n    --zone)    ZONE=\"$2\";    shift 2 ;;\n    -h|--help) sed -n '2,14p' \"$0\" | sed 's/^# \\{0,1\\}//'; exit 0 ;;\n    *)         echo \"unknown option: $1\" >&2; exit 2 ;;\n  esac\ndone\n\necho \"=== updating image '${IMAGE}' from '${BUILDER}' ===\"\n\necho \"1. stopping ${BUILDER}...\"\ngcloud compute instances stop \"$BUILDER\" --zone=\"$ZONE\"\n\necho \"2. deleting old image '${IMAGE}'...\"\ngcloud compute images delete \"$IMAGE\" --quiet 2>/dev/null || echo \"   (no existing image to delete)\"\n\necho \"3. creating new image...\"\ngcloud compute images create \"$IMAGE\" \\\n  --source-disk=\"$BUILDER\" \\\n  --source-disk-zone=\"$ZONE\"\n\necho \"4. restarting ${BUILDER}...\"\ngcloud compute instances start \"$BUILDER\" --zone=\"$ZONE\"\n\necho \"=== done. image '${IMAGE}' is ready ===\"\n"
  },
  {
    "path": "src/SGA/Algorithm/ClusterProcess.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ClusterProcess - Merge unambiguously overlapping sequences\n//\n#include \"ClusterProcess.h\"\n#include \"SGAlgorithms.h\"\n#include \"SGVisitors.h\"\n\n//\nClusterProcess::ClusterProcess(ClusterParameters params) : m_parameters(params)\n{\n    // Check parameters are set\n    assert(m_parameters.pOverlapper != NULL);\n    assert(m_parameters.pMarkedReads != NULL);\n    assert(m_parameters.minOverlap >= 12);\n}\n\n//\nClusterProcess::~ClusterProcess()\n{\n\n\n}\n\n//\nClusterResult ClusterProcess::process(const SequenceWorkItem& item)\n{\n    ReadCluster cluster(m_parameters.pOverlapper, m_parameters.minOverlap);\n    ClusterNode node = cluster.addSeed(item.read.seq.toString(), true);\n    assert(node.interval.isValid());\n    // Check if this read is already part of a cluster. If so, return an empty result\n    for(int64_t i = node.interval.lower; i <= node.interval.upper; ++i)\n    {\n        if(m_parameters.pMarkedReads->test(i))\n        {\n            ClusterResult result;\n            return result; // already part of a cluster, return nothing\n        }\n    }\n    \n    // Add sequences to be used to stop extension, if requested\n    if(m_parameters.pLimitKmers != NULL)\n        cluster.setLimitKmers(m_parameters.pLimitKmers, m_parameters.limitK);\n\n    // Run the clustering process\n    cluster.run(m_parameters.maxClusterSize, 0);\n\n    // If some work was performed, update the bitvector so other threads do not try to merge the same set of reads.\n    // As a given set of reads should all be merged together, we only need to make sure we atomically update\n    // the bit for the read with the lowest index in the set.\n    ClusterResult result;\n    result.clusterNodes = cluster.getOutput();\n\n    // Check if the bit in the vector has already been set for the lowest read index\n    // If it has some other thread has already output this set so we do nothing\n    int64_t lowestIndex = result.clusterNodes.front().interval.lower;\n    bool currentValue = m_parameters.pMarkedReads->test(lowestIndex);\n    bool updateSuccess = false;\n\n    if(currentValue == false)\n    {\n        // Attempt to update the bit vector with an atomic CAS. If this returns false\n        // the bit was set by some other thread\n        updateSuccess = m_parameters.pMarkedReads->updateCAS(lowestIndex, currentValue, true);\n    }\n\n    if(updateSuccess)\n    {\n        // We successfully atomically set the bit for the first read in this set\n        // to true. We can safely update the rest of the bits and keep the merged sequences\n        // for output.\n        std::vector<ClusterNode>::const_iterator iter = result.clusterNodes.begin();\n        for(; iter != result.clusterNodes.end(); ++iter)\n        {\n            for(int64_t i = iter->interval.lower; i <= iter->interval.upper; ++i)\n            {\n                if(i == lowestIndex) //already set\n                    continue;\n                currentValue = m_parameters.pMarkedReads->test(i);\n                if(currentValue)\n                {\n                    // This value should not be true, emit a warning\n                    std::cout << \"Warning: Bit \" << i << \" was unexpectedly set by a different thread\\n\";\n                }\n                else\n                {\n                    m_parameters.pMarkedReads->updateCAS(i, currentValue, true);\n                }\n            }\n        }\n    }\n    else\n    {\n        // Some other thread merged these reads already, discard the intermediate\n        // data and set the result to false\n        result.clusterNodes.clear();\n    }\n    return result;\n}\n\n// Generate a new cluster from a previously build cluster\nClusterResult ClusterProcess::process(const ClusterVector& inSequences)\n{\n    ReadCluster cluster(m_parameters.pOverlapper, m_parameters.minOverlap);\n    \n    // Add seeds to the cluster generator\n    for(size_t i = 0; i < inSequences.size(); ++i)\n        cluster.addSeed(inSequences[i].sequence, false);\n\n    // Add sequences to be used to stop extension, if requested\n    if(m_parameters.pLimitKmers != NULL)\n        cluster.setLimitKmers(m_parameters.pLimitKmers, m_parameters.limitK);\n\n    cluster.run(m_parameters.maxClusterSize, m_parameters.maxIterations);\n\n    ClusterResult result;\n    result.clusterNodes = cluster.getOutput();\n    return result;\n}\n\n//\nClusterPostProcess::ClusterPostProcess(std::ostream* pWriter, \n                                       size_t minClusterSize, \n                                       BitVector* pMarkedReads) : m_minClusterSize(minClusterSize),\n                                                                  m_numClusters(0), \n                                                                  m_numTotalReads(0), \n                                                                  m_numTotalReadsClustered(0), \n                                                                  m_pWriter(pWriter), \n                                                                  m_pMarkedReads(pMarkedReads)\n{\n\n}\n\n//\nClusterPostProcess::~ClusterPostProcess()\n{\n    printf(\"[sga cluster] Clustered %zu reads into %zu clusters (%zu total reads input)\\n\", m_numTotalReadsClustered, m_numClusters, m_numTotalReads);\n}\n\n// This just dispatches to main post-process function\nvoid ClusterPostProcess::process(const SequenceWorkItem& /*item*/, const ClusterResult& result)\n{\n    process(result);\n}\n\n//\nvoid ClusterPostProcess::process(const ClusterVector& /*in*/, const ClusterResult& result)\n{\n    process(result);\n}\n\nvoid ClusterPostProcess::process(const ClusterResult& result)\n{\n    m_numTotalReads += 1;\n\n    if(result.clusterNodes.size() > 0)\n    {\n        // Compute the cluster size\n        size_t clusterSize = 0;\n        for(size_t i = 0; i < result.clusterNodes.size(); ++i)\n        {\n            if(result.clusterNodes[i].interval.isValid())\n                clusterSize += result.clusterNodes[i].interval.size();\n            else\n                clusterSize += 1;\n        }\n               \n        if(clusterSize >= m_minClusterSize)\n        {\n            for(size_t i = 0; i < result.clusterNodes.size(); ++i)\n                *m_pWriter << \"cluster-\" << m_numClusters << \"\\t\" << clusterSize << \"\\t\" << result.clusterNodes[i].sequence << \"\\t\" << result.clusterNodes[i].interval << \"\\n\";\n            m_numClusters += 1;\n            m_numTotalReadsClustered += clusterSize;\n        }\n    }\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/ClusterProcess.h",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ClusterProcess - Compute clusters of overlapping reads\n//\n#ifndef CLUSTERPROCESS_H\n#define CLUSTERPROCESS_H\n\n#include \"Util.h\"\n#include \"OverlapAlgorithm.h\"\n#include \"SequenceProcessFramework.h\"\n#include \"BitVector.h\"\n#include \"Bigraph.h\"\n#include \"SGUtil.h\"\n#include \"ReadCluster.h\"\n#include \"ClusterReader.h\"\n\nstruct ClusterParameters\n{\n    const OverlapAlgorithm* pOverlapper;\n    int minOverlap;\n    size_t maxClusterSize;\n    int maxIterations;\n    BitVector* pMarkedReads; // shared between threads\n    const std::set<std::string>* pLimitKmers;\n    size_t limitK;\n};\n\nstruct ClusterResult\n{\n    std::vector<ClusterNode> clusterNodes;\n};\n\n// Compute the overlap blocks for reads\nclass ClusterProcess\n{\n    public:\n        ClusterProcess(ClusterParameters params);\n        ~ClusterProcess();\n        \n        // Generate a cluster from a single sequence\n        ClusterResult process(const SequenceWorkItem& item);\n\n        // Generate a new cluster from a previously build cluster\n        ClusterResult process(const ClusterVector& inSequences);\n    \n    private:\n\n        ClusterParameters m_parameters;\n};\n\n// Write the cluster results to a temporary output file\nclass ClusterPostProcess\n{\n    public:\n        ClusterPostProcess(std::ostream* pWriter, size_t minClusterSize, BitVector* pMarkedReads);\n        ~ClusterPostProcess();\n        \n        void process(const SequenceWorkItem& item, const ClusterResult& result);\n        void process(const ClusterVector& inSequences /*in*/, const ClusterResult& result);\n        void process(const ClusterResult& result);\n\n    private:\n        size_t m_minClusterSize;\n        size_t m_numClusters;\n        size_t m_numTotalReads;\n        size_t m_numTotalReadsClustered;\n        \n        std::ostream* m_pWriter;\n        BitVector* m_pMarkedReads;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/ConnectProcess.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ConnectProcess - Algorithm to resolve the sequence\n// connecting two ends of a paired end read\n//\n#include \"ConnectProcess.h\"\n#include \"StringGraphGenerator.h\"\n\n//\n//\n//\nConnectProcess::ConnectProcess(const OverlapAlgorithm* pOverlapper, \n                               int minOverlap,\n                               int maxDistance) : \n                                                 m_pOverlapper(pOverlapper), \n                                                 m_minOverlap(minOverlap),\n                                                 m_maxDistance(maxDistance)\n{\n\n}\n\n//\nConnectProcess::~ConnectProcess()\n{\n\n}\n\n//\nConnectResult ConnectProcess::process(const SequenceWorkItemPair& workItemPair)\n{\n    assert(getPairID(workItemPair.first.read.id) == workItemPair.second.read.id);\n    ConnectResult result;\n\n    StringGraphGenerator localGraph(m_pOverlapper, workItemPair.first.read, workItemPair.second.read, m_minOverlap, ED_SENSE, m_maxDistance);\n    SGWalkVector walks = localGraph.searchWalks();\n    //std::cout << \"Found \" << walks.size() << \" walk between \" << workItemPair.first.read.id << \" and \" << workItemPair.second.read.id << \"\\n\";\n    if(walks.size() == 1)\n    {\n        SGWalk& solution = walks.front();\n        result.resolvedSequence = solution.getString(SGWT_START_TO_END);\n        //std::cout << \"Solution has length \" << solution.getStartToEndDistance() << \"\\n\";\n    }\n    return result;\n}\n\n//\n//\n//\nConnectPostProcess::ConnectPostProcess(std::ostream* pWriter,\n                                       std::ostream* pUnconnectedWriter) : \n                                                                m_pWriter(pWriter),\n                                                                m_pUnconnectedWriter(pUnconnectedWriter),\n                                                                m_numPairsTotal(0),\n                                                                m_numPairsResolved(0)\n{\n\n}\n\n//\nConnectPostProcess::~ConnectPostProcess()\n{\n    printf(\"connect: Resolved %d out of %d pairs (%lf)\\n\", m_numPairsResolved, m_numPairsTotal, (double)m_numPairsResolved / m_numPairsTotal);\n}\n\n//\nvoid ConnectPostProcess::process(const SequenceWorkItemPair& workItemPair, const ConnectResult& result)\n{\n    ++m_numPairsTotal;\n\n    if(result.resolvedSequence.length() > 0)\n    {\n        ++m_numPairsResolved;\n\n        SeqRecord record;\n        record.id = getPairBasename(workItemPair.first.read.id);\n        record.seq = result.resolvedSequence;\n        record.write(*m_pWriter);\n    }\n    else\n    {\n        workItemPair.first.read.write(*m_pUnconnectedWriter);\n        workItemPair.second.read.write(*m_pUnconnectedWriter);\n    }\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/ConnectProcess.h",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ConnectProcess - Wrapper to resolve the sequence\n// connecting two ends of a paired end read\n//\n#ifndef CONNECTROCESS_H\n#define CONNECTPROCESS_H\n\n#include \"Util.h\"\n#include \"OverlapAlgorithm.h\"\n#include \"SequenceProcessFramework.h\"\n#include \"SequenceWorkItem.h\"\n#include \"MultiOverlap.h\"\n#include \"Metrics.h\"\n\n\nclass ConnectResult\n{\n    public:\n        DNAString resolvedSequence;\n};\n\n//\nclass ConnectProcess\n{\n    public:\n        ConnectProcess(const OverlapAlgorithm* pOverlapper, \n                       int minOverlap,\n                       int maxDistance);\n\n        ~ConnectProcess();\n\n        ConnectResult process(const SequenceWorkItemPair& workPair);\n    \n    private:\n\n        const OverlapAlgorithm* m_pOverlapper;\n        const int m_minOverlap;\n        const int m_maxDistance;\n};\n\n// Write the results from the overlap step to an ASQG file\nclass ConnectPostProcess\n{\n    public:\n        ConnectPostProcess(std::ostream* pWriter, std::ostream* pUnconnectedWriter);\n        ~ConnectPostProcess();\n\n        void process(const SequenceWorkItemPair& workPair, const ConnectResult& result);\n\n    private:\n\n        std::ostream* m_pWriter;\n        std::ostream* m_pUnconnectedWriter;\n\n        int m_numPairsTotal;\n        int m_numPairsResolved;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/DPAlignment.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// DPAlignment - Generic class for dynamic programming alignments \n//\n#include \"DPAlignment.h\"\n\nDPAlignment::DPAlignment(const std::string& s1, \n                         const std::string& s2, \n                         DPAlignMode mode, DPScoringScheme scoring) : m_mode(mode), m_scoring(scoring)\n{\n    if(s1.empty() || s2.empty())\n        return;\n\n    m_dimM = s1.size() + 1; // = num rows\n    m_dimN = s2.size() + 1; // = num columns\n    initializeDPMatrix();\n    fillMatrix(s1, s2);\n    //printMatrix(s1, s2);\n}\n\n//\nint DPAlignment::getNumRows() const\n{\n    return m_dimM;\n}\n\n//\nint DPAlignment::getNumColumns() const\n{\n    return m_dimN;\n}\n\n// \nint DPAlignment::getScore(int i, int j) const\n{\n    assert(i < m_dimM && j < m_dimN);\n    return m_matrix[i][j];\n}\n\n//\nDPScoringScheme DPAlignment::getScoringScheme() const\n{\n    return m_scoring;\n}\n\n// Setup the dynamic programming matrix for overlap computation\nvoid DPAlignment::initializeDPMatrix()\n{\n    m_matrix.resize(m_dimM); // rows\n    for(int i = 0; i < m_dimM; ++i)\n        m_matrix[i].resize(m_dimN); // columns\n\n    // Set score[i][0] (first column) to be zero for all i if in overlap mode.\n    // This is so we don't penalize the portion of S1 that\n    // S2 does not overlap\n    for(int i = 0; i < m_dimM; ++i)\n        m_matrix[i][0] = (m_mode == DPM_OVERLAP) ? 0 : i * gap_penalty();\n\n    // Set score [0][j] (first row) to be j for all j\n    // This represents not matching the first j bases of S1\n    for(int j = 0; j < m_dimN; ++j)\n        m_matrix[0][j] = gap_penalty() * j;\n}\n\n// Fill in the DP matrix\nvoid DPAlignment::fillMatrix(const std::string& s1, const std::string& s2)\n{\n    // Update the value of each cell for all i and j greater than zero\n    for(int i = 1; i < m_dimM; ++i)\n    {\n        for(int j = 1; j < m_dimN; ++j)\n        {\n            int up = m_matrix[i - 1][j] + gap_penalty(); // skip a base of S1\n            int left = m_matrix[i][j - 1] + gap_penalty(); // skip a base of S2\n\n            int idx1 = i - 1;\n            int idx2 = j - 1;\n            int diag = m_matrix[i - 1][j - 1] + match_score(s1[idx1], s2[idx2]);\n            m_matrix[i][j] = compare3(up, left, diag);\n        }\n    }\n}\n\n// Print the best alignment starting from the given cell\nvoid DPAlignment::printAlignment(const std::string& s1, const std::string& s2,\n                                 int startI, int startJ) const\n{\n    if(m_matrix.empty())\n        return;\n    if(startI == -1 || startJ == -1)\n    {\n        startI = m_dimM - 1;\n        startJ = m_dimN - 1;\n    }\n    int score = m_matrix[startI][startJ];\n    DPPath backtrack = calculatePath(s1, s2, startI, startJ);\n\n    // Print the match strings\n    std::string m1;\n    std::string m2;\n    std::string os;\n    for(DPPath::iterator iter = backtrack.begin(); iter != backtrack.end(); ++iter)\n    {\n        int i = iter->i;\n        int j = iter->j;\n        //printf(\"(%d %d)\\n\", i, j);\n        switch(iter->op)\n        {\n            case DPO_MATCH:\n            case DPO_SUB:\n                assert(i >= 0 && i < (int)s1.size() && j >= 0 && j < (int)s2.size());\n                m1.push_back(s1[i]);\n                m2.push_back(s2[j]);\n                os.push_back(iter->op == DPO_MATCH ? '.' : 'S');\n                break;\n            case DPO_INSERT:\n                assert(j >= 0 && j < (int)s2.size());\n                m1.push_back('-');\n                m2.push_back(s2[j]);\n                os.push_back('I');\n                break;\n            case DPO_DELETE:\n                assert(i >= 0 && i < (int)s1.size());\n                m1.push_back(s1[i]);\n                m2.push_back('-');\n                os.push_back('D');\n                break;\n            case DPO_NOOP:\n                assert(false);\n                break;\n        }\n    }\n\n    std::cout << \"M1: \" << m1 << \"\\n\";\n    std::cout << \"M2: \" << m2 << \"\\n\";\n    std::cout << \"OS: \" << os << \"\\n\";\n    std::cout << \"Score: \" << score << \"\\n\";\n}\n\n// Get the operation that was performed to arrive at cell i,j\n// If there are multiple possible paths, the\n// precedence is diagonal, above, left\nDPOperation DPAlignment::getPathOperationToCell(const std::string& s1, const std::string& s2, int i, int j) const\n{\n    assert((i > 0 || j > 0) && i < m_dimM && j < m_dimN);\n    // Get the score of cell i,j\n    int currScore = getScore(i,j);\n\n    // Check diagonal first\n    int a = i - 1;\n    int b = j - 1;\n    if(a >= 0 && b >= 0)\n    {\n        if(currScore == m_matrix[a][b] + match_score(s1[a],s2[b]))\n            return (s1[a] == s2[b]) ? DPO_MATCH : DPO_SUB;\n    }\n\n    // Check above element\n    a = i - 1;\n    b = j;\n    if(a >= 0 && b >= 0)\n    {\n        // If this is overlap mode, there is no deletion\n        // penalty in the first column\n        int above_score = (m_mode == DPM_OVERLAP && b == 0) ? 0 : gap_penalty();\n        if(currScore == m_matrix[a][b] + above_score)\n            return DPO_DELETE;\n    }\n\n    // Check left element\n    a = i;\n    b = j - 1;\n    if(a >= 0 && b >= 0)\n    {                  \n        if(currScore == m_matrix[a][b] + gap_penalty())\n            return DPO_INSERT;\n    }\n    assert(false);\n    return DPO_NOOP;\n}\n\n// Calculate an optimal path through the alignment starting from the given cell\nDPPath DPAlignment::calculatePath(const std::string& s1, const std::string& s2, \n                                  int startI, int startJ) const\n{\n    assert((int)s1.size() == m_dimM - 1 && (int)s2.size() == m_dimN - 1);\n    DPPath out;\n    DPPathNode currNode;\n    currNode.i = startI;\n    currNode.j = startJ;\n    currNode.op = DPO_NOOP;\n\n    while(currNode.i != 0 || currNode.j != 0)\n    {\n        // Set the node to be the cell that preceded the current one\n        DPPathNode nextNode;\n\n        // The path node op is the operation leading away from the cell\n        nextNode.op = getPathOperationToCell(s1, s2, currNode.i, currNode.j);\n\n        // Set the cell coordinates based on the op\n        switch(nextNode.op)\n        {\n            case DPO_MATCH:\n            case DPO_SUB:\n                nextNode.i = currNode.i - 1;\n                nextNode.j = currNode.j - 1;\n                break;\n            case DPO_DELETE:\n                nextNode.i = currNode.i - 1;\n                nextNode.j = currNode.j;\n                break;\n            case DPO_INSERT:\n                nextNode.i = currNode.i;\n                nextNode.j = currNode.j - 1;\n                break;\n            case DPO_NOOP:\n                assert(false);\n        }\n\n        out.push_back(nextNode);\n        currNode = nextNode;\n    }\n    out.reverse();\n    return out;\n}\n\n//\nvoid DPAlignment::printMatrix(const std::string& s1, const std::string& s2) const\n{\n    // Print the DP matrix\n    std::cout << \" \\t-\\t\";\n    for(int j = 1; j < m_dimN; ++j)\n    {\n        std::cout << s2[j - 1] << \"\\t\";\n    }\n    std::cout << \"\\n\";\n\n    for(int i = 0; i < m_dimM; ++i)\n    {\n        if(i == 0)\n            std::cout << \"-\\t\";\n        else\n            std::cout << s1[i - 1] << \"\\t\";\n\n        for(int j = 0; j < m_dimN; ++j)\n        {\n            std::cout << m_matrix[i][j] << \"\\t\";\n        }\n        std::cout << \"\\n\";\n    }\n}\n\n"
  },
  {
    "path": "src/SGA/Algorithm/DPAlignment.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// DPAlignment - Generic class for dynamic programming alignments \n//\n#ifndef DPALIGNMENT_H\n#define DPALIGNMENT_H\n#include \"Match.h\"\n#include <list>\n\ninline int min3(int a, int b, int c)\n{\n    return std::min(std::min(a,b), c);\n}\n\ninline int max3(int a, int b, int c)\n{\n    return std::max(std::max(a,b), c);\n}\n\n// Scoring scheme used to calculate the minimum edit distance\n// between two strings\nclass EditDistanceScoring\n{\n    public:\n        static int match_score(char a, char b) { return (a == b) ? 0 : 1; };\n        static int compare3(int a, int b, int c) { return min3(a,b,c); }\n        static int gap_penalty() { return 1; }\n};\n\n// Scoring scheme used to calculate the similarity of two strings\nclass SimilarityScoring\n{\n    public:\n        static int match_score(char a, char b) { return (a == b) ? 2 : -1; };\n        static int compare3(int a, int b, int c) { return max3(a,b,c); }\n        static int gap_penalty() { return -1; }\n};\n\n// Path data structures\nenum DPOperation\n{\n    DPO_MATCH,\n    DPO_SUB,\n    DPO_INSERT,\n    DPO_DELETE,\n    DPO_NOOP\n};\n\n//\nstruct DPPathNode\n{\n    DPPathNode() : i(0), j(0), op(DPO_MATCH) {}\n    int i;\n    int j;\n\n    // The operation leading to the next cell, not to this one\n    DPOperation op;\n};\ntypedef std::list<DPPathNode> DPPath;\n\n//\nenum DPAlignMode\n{\n    DPM_OVERLAP,\n    DPM_ALIGNMENT  \n};\n\n//\nenum DPScoringScheme\n{\n    DPSS_EDIT,\n    DPSS_SIMILARITY\n};\n\nclass DPAlignment\n{\n    public:\n   \n        //\n        DPAlignment(const std::string& s1, const std::string& s2, DPAlignMode mode, DPScoringScheme scoring);\n\n        //\n        void printMatrix(const std::string& s1, const std::string& s2) const; \n        void printAlignment(const std::string& s1, const std::string& s2, int startI = -1, int startJ = -1) const;\n        DPPath calculatePath(const std::string& s1, const std::string& s2, int startI, int startJ) const;\n\n        //\n        int getNumRows() const;\n        int getNumColumns() const;\n        int getScore(int i, int j) const;\n        DPOperation getPathOperationToCell(const std::string& s1, const std::string& s2, int i, int j) const;\n\n        //\n        DPScoringScheme getScoringScheme() const;\n    private:\n\n        //\n        inline int match_score(char a, char b) const\n        {\n            switch(m_scoring)\n            {\n                case DPSS_SIMILARITY:\n                    return (a == b) ? 7 : -3; \n                case DPSS_EDIT:\n                    return (a == b) ? 0 : 1; \n                default:\n                    assert(false);\n            }\n            return 0;\n        }\n\n        //\n        inline int gap_penalty() const\n        {\n            switch(m_scoring)\n            {\n                case DPSS_SIMILARITY:\n                    return -10;\n                case DPSS_EDIT:\n                    return 1;\n                default:\n                    assert(false);\n            }\n            return 0;\n        }\n\n        // GCC 4.7 warns on this\n#pragma GCC diagnostic ignored \"-Wuninitialized\"\n        inline int compare3(int a, int b, int c) const\n        {\n            switch(m_scoring)\n            {\n                case DPSS_SIMILARITY:\n                    return max3(a,b,c);\n                case DPSS_EDIT:\n                    return min3(a,b,c);\n                default:\n                    assert(false);\n                    return a;\n            }\n            return a;\n        }\n\n        void initializeDPMatrix();\n        void fillMatrix(const std::string& s1, const std::string& s2);\n        \n        typedef std::vector<int> IntVector;\n        typedef std::vector<IntVector> IntMatrix;\n\n        IntMatrix m_matrix;\n        int m_dimM;\n        int m_dimN;\n        DPAlignMode m_mode;\n        DPScoringScheme m_scoring;\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/ErrorCorrectProcess.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ErrorCorrectProcess - Wrapper to perform error correction\n// for a sequence work item\n//\n#include \"ErrorCorrectProcess.h\"\n#include \"CorrectionThresholds.h\"\n#include \"HashMap.h\"\n#include \"multiple_alignment.h\"\n#include \"KmerOverlaps.h\"\n#include \"StringThreader.h\"\n\n//#define KMER_TESTING 1\n\n//\n//\n//\nErrorCorrectProcess::ErrorCorrectProcess(const ErrorCorrectParameters params) : m_params(params)  \n{\n    m_params.depthFilter = 10000;\n}\n\n//\nErrorCorrectProcess::~ErrorCorrectProcess()\n{\n\n}\n\n//\nErrorCorrectResult ErrorCorrectProcess::process(const SequenceWorkItem& workItem)\n{\n    ErrorCorrectResult result = correct(workItem);\n    if(!result.kmerQC && !result.overlapQC && m_params.printOverlaps)\n        std::cout << workItem.read.id << \" failed error correction QC\\n\";\n    return result;\n}\n    \nErrorCorrectResult ErrorCorrectProcess::correct(const SequenceWorkItem& workItem)\n{\n    switch(m_params.algorithm)\n    {\n        case ECA_HYBRID:\n        {\n            ErrorCorrectResult result = kmerCorrection(workItem);\n            if(!result.kmerQC)\n                return overlapCorrectionNew(workItem);\n            else\n                return result;\n            break;\n        }\n        case ECA_KMER:\n        {\n            return kmerCorrection(workItem);\n            break;\n        }\n        case ECA_OVERLAP:\n        {\n            return overlapCorrectionNew(workItem);\n            break;\n        }\n        case ECA_THREAD:\n        {\n            return threadingCorrection(workItem);\n            break;\n        }\n        default:\n        {\n            assert(false);\n        }\n    }\n    ErrorCorrectResult result;\n    return result;\n}\n\nErrorCorrectResult ErrorCorrectProcess::overlapCorrection(const SequenceWorkItem& workItem)\n{\n    // Overlap based correction\n    static const double p_error = 0.01f;\n    bool done = false;\n    int rounds = 0;\n    \n    ErrorCorrectResult result;\n    SeqRecord currRead = workItem.read;\n    std::string originalRead = workItem.read.seq.toString();\n\n    bool bQCPass = false;\n\n    while(!done)\n    {\n        // Compute the set of overlap blocks for the read\n        m_blockList.clear();\n        m_params.pOverlapper->overlapRead(currRead, m_params.minOverlap, &m_blockList);\n        int sumOverlaps = 0;\n\n        // Sum the spans of the overlap blocks to calculate the total number of overlaps this read has\n        for(OverlapBlockList::iterator iter = m_blockList.begin(); iter != m_blockList.end(); ++iter)\n        {\n            assert(iter->ranges.interval[0].size() == iter->ranges.interval[1].size());\n            sumOverlaps += iter->ranges.interval[0].size();\n        }\n\n        if(m_params.depthFilter > 0 && sumOverlaps > m_params.depthFilter)\n        {\n            result.num_prefix_overlaps = sumOverlaps;\n            result.num_suffix_overlaps = sumOverlaps;\n            result.correctSequence = currRead.seq;\n            result.overlapQC = true;\n            break;\n        }\n\n        // Convert the overlap block list into a multi-overlap \n        MultiOverlap mo = blockListToMultiOverlap(currRead, m_blockList);\n\n        if(m_params.printOverlaps)\n            mo.printMasked();\n\n        result.num_prefix_overlaps = 0;\n        result.num_suffix_overlaps = 0;\n        mo.countOverlaps(result.num_prefix_overlaps, result.num_suffix_overlaps);\n\n        // Perform conflict-aware consensus correction on the read\n        result.correctSequence = mo.consensusConflict(p_error, m_params.conflictCutoff);\n\n        ++rounds;\n        if(rounds == m_params.numOverlapRounds || result.correctSequence == currRead.seq)\n        {\n            // Correction has converged or the number of rounds was exceeded.\n            // Check if the sequence of the read passes QC in the multioverlap\n            mo.updateRootSeq(result.correctSequence.toString());\n            bQCPass = mo.qcCheck();\n            done = true;\n        }\n        else\n        {\n            currRead.seq = result.correctSequence;\n        }\n    }\n    \n    result.overlapQC = bQCPass;\n\n    if(m_params.printOverlaps)\n    {\n        std::string corrected_seq = result.correctSequence.toString();\n        std::cout << \"OS:     \" << originalRead << \"\\n\";\n        std::cout << \"CS:     \" << corrected_seq << \"\\n\";\n        std::cout << \"DS:     \" << getDiffString(originalRead, corrected_seq) << \"\\n\";\n        std::cout << \"QS:     \" << currRead.qual << \"\\n\";\n        std::cout << \"QC: \" << (result.overlapQC ? \"pass\" : \"fail\") << \"\\n\"; \n        std::cout << \"\\n\";\n    }\n    \n    return result;\n}\n\n//\nErrorCorrectResult ErrorCorrectProcess::overlapCorrectionNew(const SequenceWorkItem& workItem)\n{\n    assert(m_params.indices.pBWT != NULL);\n    assert(m_params.indices.pSSA != NULL);\n\n    ErrorCorrectResult result;\n    SeqRecord currRead = workItem.read;\n    std::string current_sequence = workItem.read.seq.toString();\n    std::string consensus;\n\n    int num_rounds = m_params.numOverlapRounds;\n    for(int round = 0; round < num_rounds; ++round)\n    {\n        // Construct the multiple alignment\n        MultipleAlignment multiple_alignment = KmerOverlaps::buildMultipleAlignment(current_sequence,\n                                                                                    m_params.kmerLength,\n                                                                                    m_params.minOverlap,\n                                                                                    m_params.minIdentity,\n                                                                                    20,\n                                                                                    m_params.indices);\n\n        multiple_alignment.filterByCount(m_params.conflictCutoff);\n        \n        bool last_round = (round == num_rounds - 1);\n        if(last_round)\n            consensus = multiple_alignment.calculateBaseConsensus(10000, 0);\n        else\n            current_sequence = multiple_alignment.calculateBaseConsensus(10000, 0);\n\n        if(m_params.printOverlaps)\n            multiple_alignment.print(200);\n    }\n\n    if(!consensus.empty())\n    {\n        result.correctSequence = consensus;\n        result.overlapQC = true;\n    }\n    else\n    {\n        // Return the unmodified query sequence\n        result.correctSequence = workItem.read.seq.toString();\n        result.overlapQC = false;\n    }\n    return result;\n}\n\n\n// Correct a read with a k-mer based corrector\nErrorCorrectResult ErrorCorrectProcess::kmerCorrection(const SequenceWorkItem& workItem)\n{\n    assert(m_params.indices.pBWT != NULL);\n    assert(m_params.indices.pCache != NULL);\n\n    ErrorCorrectResult result;\n\n    typedef std::map<std::string, int> KmerCountMap;\n    KmerCountMap kmerCache;\n\n    SeqRecord currRead = workItem.read;\n    std::string readSequence = workItem.read.seq.toString();\n\n#ifdef KMER_TESTING\n    std::cout << \"Kmer correcting read \" << workItem.read.id << \"\\n\";\n#endif\n    \n    if((int)readSequence.size() < m_params.kmerLength)\n    {\n        // The read is shorter than the kmer length, nothing can be done\n        result.correctSequence = readSequence;\n        result.kmerQC = false;\n        return result;\n    }\n\n    int n = readSequence.size();\n    int nk = n - m_params.kmerLength + 1;\n    \n    // Are all kmers in the read well-represented?\n    bool allSolid = false;\n    bool done = false;\n    int rounds = 0;\n    int maxAttempts = m_params.numKmerRounds;\n\n    // For each kmer, calculate the minimum phred score seen in the bases\n    // of the kmer\n    std::vector<int> minPhredVector(nk, 0);\n    for(int i = 0; i < nk; ++i)\n    {\n        int end = i + m_params.kmerLength - 1;\n        int minPhred = std::numeric_limits<int>::max();\n        for(int j = i; j <= end; ++j)\n        {\n            int ps = workItem.read.getPhredScore(j);\n            if(ps < minPhred)\n                minPhred = ps;\n        }\n        minPhredVector[i] = minPhred;\n    }\n\n    while(!done && nk > 0)\n    {\n        // Compute the kmer counts across the read\n        // and determine the positions in the read that are not covered by any solid kmers\n        // These are the candidate incorrect bases\n        std::vector<int> countVector(nk, 0);\n        std::vector<int> solidVector(n, 0);\n\n        for(int i = 0; i < nk; ++i)\n        {\n            std::string kmer = readSequence.substr(i, m_params.kmerLength);\n\n            // First check if this kmer is in the cache\n            // If its not, find its count from the fm-index and cache it\n            int count = 0;\n            KmerCountMap::iterator iter = kmerCache.find(kmer);\n\n            if(iter != kmerCache.end())\n            {\n                count = iter->second;\n            }\n            else\n            {\n                count = BWTAlgorithms::countSequenceOccurrences(kmer, m_params.indices);\n                kmerCache.insert(std::make_pair(kmer, count));\n            }\n\n            // Get the phred score for the last base of the kmer\n            int phred = minPhredVector[i];\n            countVector[i] = count;\n//            std::cout << i << \"\\t\" << phred << \"\\t\" << count << \"\\n\";\n\n            // Determine whether the base is solid or not based on phred scores\n            int threshold = CorrectionThresholds::Instance().getRequiredSupport(phred);\n            if(count >= threshold)\n            {\n                for(int j = i; j < i + m_params.kmerLength; ++j)\n                    solidVector[j] = 1;\n            }\n        }\n\n        allSolid = true;\n        for(int i = 0; i < n; ++i)\n        {\n#ifdef KMER_TESTING\n            std::cout << \"Position[\" << i << \"] = \" << solidVector[i] << \"\\n\";\n#endif\n            if(solidVector[i] != 1)\n                allSolid = false;\n        }\n        \n#ifdef KMER_TESTING  \n        std::cout << \"Read \" << workItem.read.id << (allSolid ? \" is solid\\n\" : \" has potential errors\\n\");\n#endif\n\n        // Stop if all kmers are well represented or we have exceeded the number of correction rounds\n        if(allSolid || rounds++ > maxAttempts)\n            break;\n\n        // Attempt to correct the leftmost potentially incorrect base\n        bool corrected = false;\n        for(int i = 0; i < n; ++i)\n        {\n            if(solidVector[i] != 1)\n            {\n                // Attempt to correct the base using the leftmost covering kmer\n                int phred = workItem.read.getPhredScore(i);\n                int threshold = CorrectionThresholds::Instance().getRequiredSupport(phred);\n\n                int left_k_idx = (i + 1 >= m_params.kmerLength ? i + 1 - m_params.kmerLength : 0);\n                corrected = attemptKmerCorrection(i, left_k_idx, std::max(countVector[left_k_idx], threshold), readSequence);\n                if(corrected)\n                    break;\n\n                // base was not corrected, try using the rightmost covering kmer\n                size_t right_k_idx = std::min(i, n - m_params.kmerLength);\n                corrected = attemptKmerCorrection(i, right_k_idx, std::max(countVector[right_k_idx], threshold), readSequence);\n                if(corrected)\n                    break;\n            }\n        }\n\n        // If no base in the read was corrected, stop the correction process\n        if(!corrected)\n        {\n            assert(!allSolid);\n            done = true;\n        }\n    }\n\n    if(allSolid)\n    {\n        result.correctSequence = readSequence;\n        result.kmerQC = true;\n    }\n    else\n    {\n        result.correctSequence = workItem.read.seq.toString();\n        result.kmerQC = false;\n    }\n    return result;\n}\n\n\n// Attempt to correct the base at position idx in readSequence. Returns true if a correction was made\n// The correction is made only if the count of the corrected kmer is at least minCount\nbool ErrorCorrectProcess::attemptKmerCorrection(size_t i, size_t k_idx, size_t minCount, std::string& readSequence)\n{\n    assert(i >= k_idx && i < k_idx + m_params.kmerLength);\n    size_t base_idx = i - k_idx;\n    char originalBase = readSequence[i];\n    std::string kmer = readSequence.substr(k_idx, m_params.kmerLength);\n    size_t bestCount = 0;\n    char bestBase = '$';\n\n#if KMER_TESTING\n    std::cout << \"i: \" << i << \" k-idx: \" << k_idx << \" \" << kmer << \" \" << reverseComplement(kmer) << \"\\n\";\n#endif\n\n    for(int j = 0; j < DNA_ALPHABET::size; ++j)\n    {\n        char currBase = ALPHABET[j];\n        if(currBase == originalBase)\n            continue;\n        kmer[base_idx] = currBase;\n        size_t count = BWTAlgorithms::countSequenceOccurrences(kmer, m_params.indices);\n\n#if KMER_TESTING\n        printf(\"%c %zu\\n\", currBase, count);\n#endif\n        if(count > bestCount && count >= minCount)\n        {\n            // Multiple corrections exist, do not correct\n            if(bestBase != '$')\n                return false;\n\n            bestCount = count;\n            bestBase = currBase;\n        }\n    }\n\n    if(bestCount >= minCount)\n    {\n        assert(bestBase != '$');\n        readSequence[i] = bestBase;\n        return true;\n    }\n    return false;\n}\n\n//\n//\n//\nErrorCorrectResult ErrorCorrectProcess::threadingCorrection(const SequenceWorkItem& workItem)\n{\n    ErrorCorrectResult result;\n\n    // Find the initial seed to start the threading from\n    // This is the prefix of the read containing right-most kmer that is present at least x times\n    SeqRecord currRead = workItem.read;\n    std::string query = workItem.read.seq.toString();\n    int k = m_params.kmerLength;\n    int nk = query.size() - m_params.kmerLength + 1;\n    int right_index = -1;\n    size_t x = 3;\n\n    for(int i = 0; i < nk; ++i)\n    {\n        std::string kmer = query.substr(i, k);\n        size_t count = BWTAlgorithms::countSequenceOccurrences(kmer, m_params.indices);\n        if(count >= x)\n            right_index = i;\n        else\n            break;\n    }\n\n    if(right_index == -1)\n    {\n        // No way to correct this read\n        result.correctSequence = \"\";\n        result.kmerQC = false;\n        return result;\n    }\n\n    if(right_index == nk - 1)\n    {\n        printf(\"Read does not need correction\\n\");\n        // This read does not need correction\n        result.correctSequence = query;\n        result.kmerQC = true;\n        return result;\n    }\n\n    // Correct the read with the threader\n    int seed_endpoint = k + right_index;\n    printf(\"Correcting %s [%d %d]\\n\", query.c_str(), right_index, seed_endpoint);\n    StringThreaderResultVector thread_results;\n    StringThreader threader(query.substr(0, seed_endpoint), &query, seed_endpoint, k, m_params.indices.pBWT);\n    threader.run(thread_results);\n\n    printf(\"Found %zu correction threads\\n\", thread_results.size());\n    int best_score = 0;\n    int best_index = -1;\n\n    for(size_t i = 0; i < thread_results.size(); ++i)\n    {\n        int score = StdAlnTools::globalAlignment(query, thread_results[i].thread, false);\n        if(score > best_score)\n        {\n            best_score = score;\n            best_index = i;\n        }\n    }\n\n    if(best_score > 0)\n    {\n        result.correctSequence = thread_results[best_index].thread;\n        result.kmerQC = true;\n    }\n    return result;\n}\n\n//\n//\n//\nErrorCorrectPostProcess::ErrorCorrectPostProcess(std::ostream* pCorrectedWriter,\n                                                 std::ostream* pDiscardWriter,\n                                                 bool bCollectMetrics) : \n                                                      m_pCorrectedWriter(pCorrectedWriter),\n                                                      m_pDiscardWriter(pDiscardWriter),\n                                                      m_bCollectMetrics(bCollectMetrics),\n                                                      m_totalBases(0), m_totalErrors(0),\n                                                      m_readsKept(0), m_readsDiscarded(0),\n                                                      m_kmerQCPassed(0), m_overlapQCPassed(0),\n                                                      m_qcFail(0)\n{\n\n}\n\n//\nErrorCorrectPostProcess::~ErrorCorrectPostProcess()\n{\n    std::cout << \"Reads passed kmer QC check: \" << m_kmerQCPassed << \"\\n\";\n    std::cout << \"Reads passed overlap QC check: \" << m_overlapQCPassed << \"\\n\";\n    std::cout << \"Reads failed QC: \" << m_qcFail << \"\\n\";\n}\n\n//\nvoid ErrorCorrectPostProcess::writeMetrics(std::ostream* pWriter)\n{\n    m_positionMetrics.write(pWriter, \"Bases corrected by position\\n\", \"pos\");\n    m_originalBaseMetrics.write(pWriter, \"\\nOriginal base that was corrected\\n\", \"base\");\n    m_precedingSeqMetrics.write(pWriter, \"\\nkmer preceding the corrected base\\n\", \"kmer\");\n    m_qualityMetrics.write(pWriter, \"\\nBases corrected by quality value\\n\\n\", \"quality\");\n        \n    std::cout << \"ErrorCorrect -- Corrected \" << m_totalErrors << \" out of \" << m_totalBases <<\n                 \" bases (\" << (double)m_totalErrors / m_totalBases << \")\\n\";\n    std::cout << \"Kept \" << m_readsKept << \" reads. Discarded \" << m_readsDiscarded <<\n                 \" reads (\" << (double)m_readsDiscarded / (m_readsKept + m_readsDiscarded)<< \")\\n\";\n}\n\n//\nvoid ErrorCorrectPostProcess::process(const SequenceWorkItem& item, const ErrorCorrectResult& result)\n{\n    \n    // Determine if the read should be discarded\n    bool readQCPass = true;\n    if(result.kmerQC)\n    {\n        m_kmerQCPassed += 1;\n    }\n    else if(result.overlapQC)\n    {\n        m_overlapQCPassed += 1;\n    }\n    else\n    {\n        readQCPass = false; \n        m_qcFail += 1;\n    }\n\n    // Collect metrics for the reads that were actually corrected\n    if(m_bCollectMetrics && readQCPass)\n    {\n        collectMetrics(item.read.seq.toString(), \n                       result.correctSequence.toString(), \n                       item.read.qual);\n    }\n\n    SeqRecord record = item.read;\n    record.seq = result.correctSequence;\n\n    if(readQCPass || m_pDiscardWriter == NULL)\n    {\n        record.write(*m_pCorrectedWriter);\n        ++m_readsKept;\n    }\n    else\n    {\n        record.write(*m_pDiscardWriter);\n        ++m_readsDiscarded;\n    }\n}\n\nvoid ErrorCorrectPostProcess::collectMetrics(const std::string& originalSeq,\n                                             const std::string& correctedSeq,\n                                             const std::string& qualityStr)\n{\n    size_t precedingLen = 2;\n    for(size_t i = 0; i < originalSeq.length(); ++i)\n    {\n        char qc = !qualityStr.empty() ? qualityStr[i] : '\\0';\n        char ob = originalSeq[i];\n\n        ++m_totalBases;\n        \n        m_positionMetrics.incrementSample(i);\n\n        if(!qualityStr.empty())\n            m_qualityMetrics.incrementSample(qc);\n\n        m_originalBaseMetrics.incrementSample(ob);\n\n        std::string precedingMer;\n        if(i > precedingLen)\n        {\n            precedingMer = originalSeq.substr(i - precedingLen, precedingLen);\n            m_precedingSeqMetrics.incrementSample(precedingMer);\n        }\n\n        if(originalSeq[i] != correctedSeq[i])\n        {\n            m_positionMetrics.incrementError(i);\n            if(!qualityStr.empty())\n                m_qualityMetrics.incrementError(qc);\n            m_originalBaseMetrics.incrementError(ob);\n\n            if(!precedingMer.empty())\n            {\n                m_precedingSeqMetrics.incrementError(precedingMer);\n            }\n            ++m_totalErrors;\n        }\n    }\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/ErrorCorrectProcess.h",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ErrorCorrectProcess - Wrapper to perform error correction\n// for a sequence work item\n//\n#ifndef CORRECTPROCESS_H\n#define CORRECTPROCESS_H\n\n#include \"Util.h\"\n#include \"OverlapAlgorithm.h\"\n#include \"SequenceProcessFramework.h\"\n#include \"SequenceWorkItem.h\"\n#include \"MultiOverlap.h\"\n#include \"Metrics.h\"\n#include \"BWTIndexSet.h\"\n#include \"SampledSuffixArray.h\"\n#include \"multiple_alignment.h\"\n\nenum ErrorCorrectAlgorithm\n{\n    ECA_HYBRID, // hybrid kmer/overlap correction\n    ECA_KMER, // kmer correction\n    ECA_OVERLAP, // overlap correction\n    ECA_THREAD // thread the read through a de Bruijn graph\n};\n\nenum ECFlag\n{\n    ECF_NOTCORRECTED,\n    ECF_CORRECTED,\n    ECF_AMBIGIOUS,\n    ECF_DUPLICATE\n};\n\n// Parameter object for the error corrector\nstruct ErrorCorrectParameters\n{\n    ErrorCorrectAlgorithm algorithm;\n\n    //\n    const OverlapAlgorithm* pOverlapper;\n    BWTIndexSet indices;\n\n    // Overlap-based corrector params\n    int minOverlap;\n    int numOverlapRounds;\n    double minIdentity;\n    int conflictCutoff;\n    int depthFilter;\n\n    // k-mer based corrector params\n    int numKmerRounds;\n    int kmerLength;\n\n    // output options\n    bool printOverlaps;\n};\n\nclass ErrorCorrectResult\n{\n    public:\n        ErrorCorrectResult() : num_prefix_overlaps(0), num_suffix_overlaps(0), kmerQC(false), overlapQC(false) {}\n\n        DNAString correctSequence;\n        ECFlag flag;\n\n        // Metrics\n        size_t num_prefix_overlaps;\n        size_t num_suffix_overlaps;\n        bool kmerQC;\n        bool overlapQC;\n};\n\n//\nclass ErrorCorrectProcess\n{\n    public:\n        ErrorCorrectProcess(const ErrorCorrectParameters params); \n        ~ErrorCorrectProcess();\n\n        ErrorCorrectResult process(const SequenceWorkItem& item);\n        ErrorCorrectResult correct(const SequenceWorkItem& item);\n\n        ErrorCorrectResult kmerCorrection(const SequenceWorkItem& item);\n        ErrorCorrectResult overlapCorrection(const SequenceWorkItem& workItem);\n        ErrorCorrectResult overlapCorrectionNew(const SequenceWorkItem& workItem);\n        ErrorCorrectResult threadingCorrection(const SequenceWorkItem& workItem);\n    \n    private:\n\n        bool attemptKmerCorrection(size_t i, size_t k_idx, size_t minCount, std::string& readSequence);\n\n        OverlapBlockList m_blockList;\n        ErrorCorrectParameters m_params;\n};\n\n// Write the results from the overlap step to an ASQG file\nclass ErrorCorrectPostProcess\n{\n    public:\n        ErrorCorrectPostProcess(std::ostream* pCorrectedWriter, \n                                std::ostream* pDiscardWriter, bool bCollectMetrics);\n\n        ~ErrorCorrectPostProcess();\n\n        void process(const SequenceWorkItem& item, const ErrorCorrectResult& result);\n        void writeMetrics(std::ostream* pWriter);\n\n    private:\n\n        void collectMetrics(const std::string& originalSeq, \n                            const std::string& correctedSeq, const std::string& qualityStr);\n\n        std::ostream* m_pCorrectedWriter;\n        std::ostream* m_pDiscardWriter;\n        bool m_bCollectMetrics;\n\n        ErrorCountMap<char> m_qualityMetrics;\n        ErrorCountMap<int64_t> m_positionMetrics;\n        ErrorCountMap<char> m_originalBaseMetrics;\n        ErrorCountMap<std::string> m_precedingSeqMetrics;\n\n        size_t m_totalBases;\n        size_t m_totalErrors;\n        size_t m_readsKept;\n        size_t m_readsDiscarded;\n\n        size_t m_kmerQCPassed;\n        size_t m_overlapQCPassed;\n        size_t m_qcFail;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/ExtensionDP.cpp",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n//\n// ExtensionDP - Class implementing an iterative\n// dynamic programming alignment. The alignment\n// starts by globally constructing an alignment\n// between two strings in a seed region. This initial\n// alignment can then be extended row-by-row as one of the\n// strings is extended. This is the core data structure for the \n// StringThreader class\n// \n#include \"ExtensionDP.h\"\n#include <stdio.h>\n#include <iostream>\n#include <assert.h>\n#include <limits>\n\nstatic const int MINUS_INF = -1073741823;\nstatic const int POSITIVE_INF = 1073741823;\n\n// Return the largest of the 3 values\ninline int max3(int a, int b, int c)\n{\n    return std::max(std::max(a,b), c);\n}\n\n// Return the smalleset of the 3 values\ninline int min3(int a, int b, int c)\n{\n    return std::min(std::min(a,b), c);\n}\n\n// Constructor\nBandedDPColumn::BandedDPColumn(int ci, int maxRows, int bandwidth, const BandedDPColumn* prevColumn)\n{\n    // Calculate the lower and upper band indices\n    m_bandwidth = bandwidth; // the requested bandwidth, may be greater than actual\n    m_colIdx = ci;\n    m_rowStartIdx = std::max(0, m_colIdx - (bandwidth / 2) - 1);\n    m_rowEndIdx = std::min(maxRows - 1, m_colIdx + (bandwidth / 2));\n    m_maxRows = maxRows;\n    assert(m_rowStartIdx <= m_rowEndIdx);\n    int numRows = m_rowEndIdx - m_rowStartIdx + 1;\n    m_cells.resize(numRows);\n\n    m_pPrevColumn = prevColumn;\n}\n\n// Get the score for row\nint BandedDPColumn::getRowScore(int row) const\n{\n    int vec_idx = getVectorIndex(row);\n    if(vec_idx == -1)\n        return POSITIVE_INF;\n    else\n        return m_cells[vec_idx].score;\n}\n\n// Get the type of the row\nchar BandedDPColumn::getRowType(int row) const\n{\n    int vec_idx = getVectorIndex(row);\n    if(vec_idx == -1)\n        return FROM_M;\n    else\n        return m_cells[vec_idx].ctype;\n}\n\n// Return the index of the best-scoring row\nint BandedDPColumn::getBestRowIndex() const\n{\n    int bestScore = POSITIVE_INF;\n    int bestIdx = -1;\n    for(int i = m_rowStartIdx; i <= m_rowEndIdx; ++i)\n    {\n        int s = getRowScore(i);\n        if(s < bestScore)\n        {\n            bestScore = s;\n            bestIdx = i;\n        }\n    }\n    return bestIdx;\n}\n\n\n// Return the pointer to the previous column\nconst BandedDPColumn* BandedDPColumn::getPreviousColumn() const\n{\n    return m_pPrevColumn;\n}\n\n// Set the score and type for row \nvoid BandedDPColumn::setRowScore(int row, int score, char ctype)\n{\n    int vec_idx = getVectorIndex(row);\n    if(vec_idx != -1)\n    {\n        m_cells[vec_idx].score = score;\n        m_cells[vec_idx].ctype = ctype;\n    }\n}\n\n// Return the score for the requested cell\nint BandedDPColumn::getCellScore(int colIdx, int rowIdx) const\n{\n    // If accessing the col/row with negative index, return\n    // the initial gap penalties. For now, we allow free gaps\n    // for the first row\n    if(colIdx == -1 || rowIdx == -1)\n        return 0;\n\n    const BandedDPColumn* pColumn;\n    if(colIdx < m_colIdx)\n        pColumn = m_pPrevColumn;\n    else\n        pColumn = this;\n    assert(pColumn != NULL);\n    \n    return pColumn->getRowScore(rowIdx);   \n}\n\n// Calculate the score for the given row in the column using an edit distance scheme\nvoid BandedDPColumn::fillRowEditDistance(int rowIdx, int matchScore)\n{\n    int vec_idx = getVectorIndex(rowIdx);\n    if(vec_idx == -1)\n        return; // out of band, ignore\n\n    // Get the scores for the cell above, to the left and diagonal\n    int above = getCellScore(m_colIdx, rowIdx - 1) + 1;\n    int diag = getCellScore(m_colIdx - 1, rowIdx - 1) + matchScore;\n    \n    // Give free insertions if the last row\n    // JS Apr/12 do not give free insertions in the last row\n    //int insert_score = rowIdx < (m_maxRows - 1) ? 1 : 0;\n    int insert_score = 1;\n    int left = getCellScore(m_colIdx - 1, rowIdx) + insert_score;\n    int score = min3(above, left, diag);\n\n    char ctype;\n    if(score == diag)\n        ctype = FROM_M;\n    else if(score == above)\n        ctype = FROM_D;\n    else\n        ctype = FROM_I;\n//    printf(\"Cell(%d, %d) a: %d d: %d l: %d s: %d t: %d\\n\", m_colIdx, rowIdx, above, diag, left, score, ctype);\n    setRowScore(rowIdx, score, ctype);\n}\n\n// Transform a row index into an index in the scores vector\nint BandedDPColumn::getVectorIndex(int rowIdx) const\n{\n    if(rowIdx < m_rowStartIdx || rowIdx > m_rowEndIdx)\n        return -1;\n    else\n        return rowIdx - m_rowStartIdx;\n}\n\n// Initialize the extension DP by computing a global alignment between extendable and fixed\n// This function allocates memory and stores the created pointers in outPtrVec, which\n// should initially be empty\nvoid ExtensionDP::createInitialAlignment(const std::string& extendable, const std::string& fixed, int bandwidth, BandedDPColumnPtrVector& outPtrVec)\n{\n    assert(outPtrVec.empty());\n    // Initialize the zero-th column\n    size_t numRows = fixed.size() + 1;\n    size_t numCols = extendable.size() + 1;\n\n    // Set the score of column zero \n    BandedDPColumn* pZeroCol = new BandedDPColumn(0, numRows, bandwidth, NULL);\n    pZeroCol->setRowScore(0, 0, FROM_M);\n    for(size_t i = 1; i < numRows; ++i)\n        pZeroCol->setRowScore(i, i, FROM_I);\n\n    outPtrVec.push_back(pZeroCol);\n    BandedDPColumn* pPrevCol = outPtrVec.back();\n    for(size_t colIdx = 1; colIdx < numCols; ++colIdx)\n    {\n        BandedDPColumn* pCurrCol = createNewColumn(extendable[colIdx - 1], fixed, pPrevCol);\n        outPtrVec.push_back(pCurrCol);\n        pPrevCol = pCurrCol;\n    }\n}\n\n// Create a new column, representing the extension of the alignment to char b\nBandedDPColumn* ExtensionDP::createNewColumn(char b, const std::string& fixed, const BandedDPColumn* pPrevColumn)\n{\n    int numRows = fixed.size() + 1;\n    int colIdx = pPrevColumn->getColIdx() + 1;\n    BandedDPColumn* pCurrCol = new BandedDPColumn(colIdx, numRows, pPrevColumn->getBandwidth(), pPrevColumn);\n\n    // Set the first row score\n    pCurrCol->setRowScore(0, colIdx, FROM_D);\n    \n    // Fill in the rest of the rows\n    int startRow = std::max(1, pCurrCol->getMinRow());\n    for(int rowIdx = startRow; rowIdx <= pCurrCol->getMaxRow(); ++rowIdx)\n    {\n        int match_score = b == fixed[rowIdx - 1] ? 0 : 1;\n        pCurrCol->fillRowEditDistance(rowIdx, match_score);\n    }\n    return pCurrCol;\n}\n\n// Calculate the edit percentage over the last numBases bases\ndouble ExtensionDP::calculateLocalEditPercentage(const BandedDPColumn* pColumn, int numBases)\n{\n    // Get the row with in the start column with the best score\n    int rowIdx = pColumn->getBestRowIndex();\n    assert(rowIdx != -1);\n    int colIdx = pColumn->getColIdx();\n    int startScore = pColumn->getRowScore(rowIdx);\n\n    int alignLength = 1;\n    while(alignLength < numBases)\n    {\n        char ctype = pColumn->getRowType(rowIdx);\n        switch(ctype)\n        {\n   \t\t\tcase FROM_M: \n                pColumn = pColumn->getPreviousColumn();\n                --colIdx; \n                --rowIdx; \n                break;\n\t\t\tcase FROM_D: \n                --rowIdx; \n                break;\n\t\t\tcase FROM_I: \n                pColumn = pColumn->getPreviousColumn();\n                --colIdx; \n                break;\n        }\n        alignLength += 1;\n    }\n    int endScore = pColumn->getRowScore(rowIdx);\n\n    assert(startScore >= endScore);\n    int numDiffs = startScore - endScore;\n    return static_cast<double>(numDiffs) / alignLength;\n}\n\n// Returns the error percentage over the entire alignment\ndouble ExtensionDP::calculateGlobalEditPercentage(const BandedDPColumn* pStartColumn)\n{\n    int edits, alignLength;\n    countEditsAndAlignLength(pStartColumn, edits, alignLength);\n    return (double)edits / alignLength;\n}\n\n// Returns the number of edits and the total alignment length for the submatrix starting at pColumn\nvoid ExtensionDP::countEditsAndAlignLength(const BandedDPColumn* pColumn, int& edits, int& alignLength)\n{\n    // Get the row with in the start column with the best score\n    int rowIdx = pColumn->getBestRowIndex();\n    assert(rowIdx != -1);\n    int colIdx = pColumn->getColIdx();\n    edits = pColumn->getRowScore(rowIdx);\n    alignLength = 1;\n\n    while(rowIdx != 0 && colIdx != 0)\n    {\n        char ctype = pColumn->getRowType(rowIdx);\n        switch(ctype)\n        {\n   \t\t\tcase FROM_M: \n                pColumn = pColumn->getPreviousColumn();\n                --colIdx; \n                --rowIdx; \n                break;\n\t\t\tcase FROM_D: \n                --rowIdx; \n                break;\n\t\t\tcase FROM_I: \n                pColumn = pColumn->getPreviousColumn();\n                --colIdx; \n                break;\n        }\n        alignLength += 1;\n    }\n}\n\n// Calculate the best alignment through the matrix. Assumes that\n// path_t* is pre-allocated with max_path entries.\nvoid ExtensionDP::backtrack(const BandedDPColumn* pLastColumn, path_t* path, int* path_len, const int maxPathLength)\n{\n    const BandedDPColumn* pCurrColumn = pLastColumn;\n\n    // Calculate the starting row and column\n    int colIdx = pLastColumn->getColIdx();\n    int rowIdx = pLastColumn->getBestRowIndex();\n    int pathLength = 0;\n\n\n    path_t* p = &path[pathLength];\n    char ctype = pLastColumn->getRowType(rowIdx);\n\n\tp->ctype = ctype; \n    p->i = rowIdx; \n    p->j = colIdx;\n\tpathLength += 1;\n    \n\tdo {\n        assert(pathLength < maxPathLength);\n        assert(pCurrColumn != NULL);\n\n        p = &path[pathLength];\n\n        // Update indices\n\t\tswitch (ctype) {\n\t\t\tcase FROM_M: \n                pCurrColumn = pCurrColumn->getPreviousColumn();\n                --colIdx; \n                --rowIdx; \n                break;\n\t\t\tcase FROM_D: \n                --rowIdx; \n                break;\n\t\t\tcase FROM_I: \n                pCurrColumn = pCurrColumn->getPreviousColumn();\n                --colIdx; \n                break;\n\t\t}\n\t\tctype = pCurrColumn->getRowType(rowIdx);\n\t\tp->ctype = ctype; \n        p->i = rowIdx; \n        p->j = colIdx;\n        pathLength += 1;\n\t} while (rowIdx || colIdx);\n\n    // We ignore the path character from the first column/row, like stdaln\n    *path_len = pathLength - 1;\n}\n\n// Return true if the extension can proceed no further. \n// This is based on two conditions:\n// 1) There are n insertions at the end of the sequence\n// 2) The bandwidth in this column is one \nbool ExtensionDP::isExtensionTerminated(const BandedDPColumn* pLastColumn, int insertionThreshold)\n{\n    if(pLastColumn->getMinRow() == pLastColumn->getMaxRow())\n        return true;\n\n    // Backtrack up to n steps checking for insertions\n    const BandedDPColumn* pCurrColumn = pLastColumn;\n    int rowIdx = pLastColumn->getBestRowIndex();\n    int colIdx = pLastColumn->getColIdx();\n    char ctype = pCurrColumn->getRowType(rowIdx);\n\tdo {\n        assert(pCurrColumn != NULL);\n\n\t\tswitch (ctype) \n        {\n\t\t\tcase FROM_M: \n            case FROM_D:\n                return false;\n\t\t\tcase FROM_I: \n                pCurrColumn = pCurrColumn->getPreviousColumn();\n                --colIdx; \n                insertionThreshold -= 1;\n                if(insertionThreshold == 0)\n                    return true;\n\t\t}\n\t\tctype = pCurrColumn->getRowType(rowIdx);\n\t} while (rowIdx || colIdx);\n    return false;\n}\n\n// Parse the score matrix and return a trimmed alignment between the query and target strings.\n// The trimming condition requires the last minMatches bases of the two sequences to be perfectly aligned\nExtensionDPAlignment ExtensionDP::findTrimmedAlignment(const BandedDPColumn* pLastColumn, int minMatches)\n{\n    const BandedDPColumn* pBestColumn = pLastColumn;\n    bool columnFound = false;\n\n    // Iterate backwards over the columns searching for one that \n    // has minMatches matches to the query at the end\n    while(!columnFound)\n    {\n        // Check if the best alignment starting from this column\n        // ends with n matches.\n        int matches = 0;\n        int mismatches = 0;\n        const BandedDPColumn* pCurrColumn = pBestColumn;\n        int rowIdx = pCurrColumn->getBestRowIndex();\n        int colIdx = pCurrColumn->getColIdx();\n        int startScore = pCurrColumn->getRowScore(rowIdx);\n        char ctype = pCurrColumn->getRowType(rowIdx);\n\n        do {\n            if(matches == minMatches)\n            {\n                // Ensure the edit distance is the same\n                columnFound = true;\n                break;    \n            }\n\n            switch (ctype) \n            {\n                case FROM_M: \n                    pCurrColumn = pCurrColumn->getPreviousColumn();\n                    --colIdx; \n                    --rowIdx;\n                    matches += 1;\n                    break;\n\n                case FROM_D:\n                case FROM_I:\n                    mismatches += 1;\n                    columnFound = false;\n                    break;\n            }\n            \n            ctype = pCurrColumn->getRowType(rowIdx);\n            \n            // Update mismatches\n            if(pCurrColumn->getRowScore(rowIdx) != startScore)\n                ++mismatches;\n\n        } while ((rowIdx || colIdx) && pCurrColumn != NULL && mismatches == 0);\n\n        if(!columnFound)\n            pBestColumn = pBestColumn->getPreviousColumn();\n    }\n    \n    // set the result output\n    ExtensionDPAlignment result;\n    if(pBestColumn != NULL)\n    {\n        result.target_align_length = pBestColumn->getColIdx();\n        result.query_align_length = pBestColumn->getBestRowIndex();\n    }\n    else\n    {\n        result.target_align_length = 0;\n        result.query_align_length = 0;\n    }\n    return result;\n}\n\n// Parse the score matrix and return a the best alignment that includes the entire query string.\nExtensionDPAlignment ExtensionDP::findGlocalAlignment(const BandedDPColumn* pLastColumn)\n{\n    const BandedDPColumn* pCurrColumn = pLastColumn;\n    int lastRowIdx = pLastColumn->getQueryRows() - 1;\n    \n    const BandedDPColumn* pBestColumn = NULL;\n    int best_score = std::numeric_limits<int>::max();\n\n    // Iterate backwards over the columns searching for one that \n    // has minMatches matches to the query at the end\n    while(pCurrColumn != NULL && pCurrColumn->getMaxRow() >= lastRowIdx)\n    {\n        // Get the score for the last row of the matrix\n        int score = pCurrColumn->getRowScore(lastRowIdx);\n        if(score < best_score)\n        {\n            best_score = score;\n            pBestColumn = pCurrColumn;\n        }\n\n        pCurrColumn = pCurrColumn->getPreviousColumn();\n    }\n    \n    // set the result output\n    ExtensionDPAlignment result;\n    if(pBestColumn != NULL)\n    {\n        result.target_align_length = pBestColumn->getColIdx();\n        result.query_align_length = lastRowIdx;\n    }\n    else\n    {\n        result.target_align_length = 0;\n        result.query_align_length = 0;\n    }\n    return result;\n}\n\n// Print the alignment starting from the given column\nvoid ExtensionDP::printAlignment(const std::string& extendable, const std::string& fixed, const BandedDPColumn* pLastColumn)\n{\n    // allocate space for the path\n    int maxPathLength = extendable.size() + fixed.size();\n    path_t* path = new path_t[maxPathLength];\n    int path_len;\n\n    // Perform the backtrack\n    backtrack(pLastColumn, path, &path_len, maxPathLength);\n\n    // Print the strings\n    std::string paddedF, paddedE, paddedMatch;\n    StdAlnTools::makePaddedStringsFromPath(fixed, extendable, path, path_len, paddedF, paddedE, paddedMatch);\n    StdAlnTools::printPaddedStrings(paddedF, paddedE, paddedMatch);\n\n    std::cout << \"CIGAR: \" << StdAlnTools::makeCigar(path, path_len) << \"\\n\";\n\n    delete [] path;\n}\n\n// Print the full scoring matrix\nvoid ExtensionDP::printMatrix(const BandedDPColumnPtrVector& columnPtrVec)\n{\n    int numCols = columnPtrVec.size();\n    int numRows = columnPtrVec[numCols - 1]->getMaxRow() + 1;\n\n    printf(\"c:\\t\");\n    for(int j = 0; j < numCols; ++j)\n    {\n        printf(\"%d\\t\", j);\n    }\n    printf(\"\\n\");\n\n    for(int i = 0; i < numRows; ++i)\n    {\n        printf(\"%d:\\t\", i);\n        for(int j = 0; j < numCols; ++j)\n        {\n            int score = columnPtrVec[j]->getRowScore(i);\n            printf(\"%d\\t\", score);\n        }\n        printf(\"\\n\");\n    }\n}\n\n"
  },
  {
    "path": "src/SGA/Algorithm/ExtensionDP.h",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n//\n// ExtensionDP - Class implementing an iterative\n// dynamic programming alignment. The alignment\n// starts by globally constructing an alignment\n// between two strings in a seed region. This initial\n// alignment can then be extended row-by-row as one of the\n// strings is extended. This is the core data structure for the \n// StringThreader class\n// \n#ifndef EXTENSION_DP_H\n#define EXTENSION_DP_H\n\n#include <vector>\n#include \"StdAlnTools.h\"\n\n// Structure holding the score for a single cell\n// of the DP matrix\nstruct DPCell\n{\n    DPCell() : score(0), ctype('\\0') {}\n    int score;\n    char ctype;\n};\ntypedef std::vector<DPCell> CellVector;\n\n// Result object providing the coordinates\n// of the endpoints of the alignment\nstruct ExtensionDPAlignment\n{\n    int query_align_length;\n    int target_align_length;\n};\n\n// Core class providing a single column of the dynamic\n// programming matrix\nclass BandedDPColumn\n{\n    public:\n\n        //\n        // Functions\n        //\n        BandedDPColumn(int ci, int maxRows, int bandwidth, const BandedDPColumn* prevColumn);\n\n        // Simple getters\n        int getColIdx() const { return m_colIdx; }\n        int getBandwidth() const { return m_bandwidth; }\n\n        int getRowScore(int row) const;\n        char getRowType(int row) const;\n        int getCellScore(int colIdx, int rowIdx) const;\n        int getMinRow() const { return m_rowStartIdx; }   \n        int getMaxRow() const { return m_rowEndIdx; }\n        int getQueryRows() const { return m_maxRows; }\n\n        const BandedDPColumn* getPreviousColumn() const;\n\n        // Set the cell information for a given row in the column\n        void setRowScore(int row, int score, char ctype);\n        \n        // Returns the row index of the best scoring cell\n        int getBestRowIndex() const;\n\n        // Calculate and set the score for the row\n        void fillRowEditDistance(int rowIdx, int matchScore);\n\n    private:\n        \n        //\n        // Functions\n        //\n        int getVectorIndex(int rowIdx) const;\n\n        //\n        // Data\n        //\n        int m_colIdx;\n        int m_maxRows;\n        int m_rowStartIdx;\n        int m_rowEndIdx;\n        int m_bandwidth;\n        CellVector m_cells;\n        const BandedDPColumn* m_pPrevColumn;\n};\ntypedef std::vector<BandedDPColumn*> BandedDPColumnPtrVector;\n\n// Algorithms to use/extend the extensionDP functionality\nnamespace ExtensionDP\n{\n    // Initialize the extension DP by computing a global alignment between extendable and fixed\n    // This function allocates memory and stores the created pointers in outPtrVec\n    void createInitialAlignment(const std::string& extendable, const std::string& fixed, int bandwidth, BandedDPColumnPtrVector& outPtrVec);\n\n    // Create a new column, representing the extended alignment from pPrevColumn to char b\n    BandedDPColumn* createNewColumn(char b, const std::string& fixed, const BandedDPColumn* pPrevColumn);\n\n    // Calculate the best alignment through the matrix. Assumes that\n    // path_t* is pre-allocated with maxPathLength entries.\n    void backtrack(const BandedDPColumn* pLastColumn, path_t* path, int* pPathLen, const int maxPathLength);\n\n    // Check if the extension has terminated. This is true if there are more\n    // than insertionThreshold insertions at the end of the alignment.\n    bool isExtensionTerminated(const BandedDPColumn* pLastColumn, int insertionThreshold);\n\n    // Return the best trimmed alignment of the extensionDP object requiring minMatches matches\n    // at the end of the alignment\n    ExtensionDPAlignment findTrimmedAlignment(const BandedDPColumn* pLastColumn, int minMatches);\n\n    // Return the best alignment that contains the entire fixed string\n    ExtensionDPAlignment findGlocalAlignment(const BandedDPColumn* pLastColumn);\n    \n    // Calculate mismatch/error rates between the query and the string up to pStartColumn\n    double calculateLocalEditPercentage(const BandedDPColumn* pStartColumn, int numBases);\n    double calculateGlobalEditPercentage(const BandedDPColumn* pStartColumn);\n    void countEditsAndAlignLength(const BandedDPColumn* pStartColumn, int& edits, int& alignLength);\n\n    // Print the alignment starting from the given column\n    void printAlignment(const std::string& s1, const std::string& s2, const BandedDPColumn* pLastColumn);\n\n    // Print the full scoring matrix\n    void printMatrix(const BandedDPColumnPtrVector& columnPtrVec);\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/FMMergeProcess.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// FMMergeProcess - Merge unambiguously overlapping sequences\n//\n#include \"FMMergeProcess.h\"\n#include \"SGAlgorithms.h\"\n#include \"SGVisitors.h\"\n\n//\nFMMergeProcess::FMMergeProcess(const OverlapAlgorithm* pOverlapper, int minOverlap, BitVector* pMarkedReads) : \n                                     m_pOverlapper(pOverlapper), \n                                     m_minOverlap(minOverlap), \n                                     m_pMarkedReads(pMarkedReads)\n{\n\n}\n\n//\nFMMergeProcess::~FMMergeProcess()\n{\n\n\n}\n\n//\nFMMergeResult FMMergeProcess::process(const SequenceWorkItem& item)\n{\n    // Calculate the intervals in the forward FM-index for this read\n    const BWT* pBWT = m_pOverlapper->getBWT();\n\n    // Find the interval in the fm-index containing the read\n    std::string readString = item.read.seq.toString();\n    BWTInterval readInterval = BWTAlgorithms::findInterval(pBWT, readString);\n\n    // Update the interval by looking for the $ to map the interval into indices in the bit array\n    BWTAlgorithms::updateInterval(readInterval, '$', pBWT);\n\n    // The read must be present in the index\n    assert(readInterval.isValid());\n\n    // Check if this read has been used yet\n    bool used = false;\n    for(int64_t i = readInterval.lower; i <= readInterval.upper; ++i)\n    {\n        if(m_pMarkedReads->test(i))\n        {\n            used = true;\n            break;\n        }\n    }\n\n    FMMergeResult result;\n\n    if(!used)\n    {\n        // Construct a new local graph around this read\n        StringGraph* pGraph = new StringGraph;\n        std::stringstream ssID;\n        ssID << \"IDX-\" << readInterval.lower;\n        std::string rootID = ssID.str();\n        \n        Vertex* pVertex = new(pGraph->getVertexAllocator()) Vertex(rootID, readString);\n        pGraph->addVertex(pVertex);\n\n        // Add the root vertex to the result structure\n        result.usedIntervals.push_back(readInterval);\n\n        // Enqueue the read for overlap detection in both directions\n        FMMergeQueue queue;\n\n        // Construct the overlap block list for this node\n        SeqRecord record;\n        record.id = pVertex->getID();\n        record.seq = pVertex->getSeq().toString();\n        OverlapBlockList blockList;\n        m_pOverlapper->overlapRead(record, m_minOverlap, &blockList);\n\n        removeContainmentBlocks(pVertex->getSeqLen(), &blockList);\n\n        // Construct the initial list of candidates from the block list\n        addCandidates(pGraph, pVertex, NULL, &blockList, queue);\n\n        while(!queue.empty())\n        {\n            FMMergeCandidate currCandidate = queue.front();\n            queue.pop();\n\n            // Determine whether this is a valid vertex to merge or not.\n            // It is valid if it has a single edge in the direction of the vertex\n            // that added it to the candidate list\n            SeqRecord record;\n            record.id = currCandidate.pVertex->getID();\n            record.seq = currCandidate.pVertex->getSeq().toString();\n\n            OverlapBlockList candidateBlockList;\n            m_pOverlapper->overlapRead(record, m_minOverlap, &candidateBlockList);\n            removeContainmentBlocks(currCandidate.pVertex->getSeqLen(), &candidateBlockList);\n\n            bool validMergeNode = checkCandidate(currCandidate, &candidateBlockList);\n            if(validMergeNode)\n            {\n                addCandidates(pGraph, currCandidate.pVertex, currCandidate.pEdge, &candidateBlockList, queue);\n                result.usedIntervals.push_back(currCandidate.interval);\n            }\n            else\n            {\n                // Mark this vertex for later removal\n                currCandidate.pVertex->setColor(GC_RED);\n            }\n        }\n        \n        // The graph has now been constructed. Remove all the nodes that are marked invalid for merging\n        pGraph->sweepVertices(GC_RED);\n\n        SGDuplicateVisitor dupVisit(true);\n        pGraph->visit(dupVisit);\n        \n        // Merge nodes\n        pGraph->simplify();\n\n        // If there was a cycle in the graph, it is possible that more than 1 vertex \n        // remains in the graph. Copy the vertex sequences into the result object.\n        pGraph->getVertexSequences(result.mergedSequences);\n        result.isMerged = true;\n        delete pGraph;\n    }\n    else\n    {\n        result.isMerged = false;\n    }\n\n    if(result.isMerged)\n    {\n        // If some work was performed, update the bitvector so other threads do not try to merge the same set of reads.\n        // This uses compare-and-swap instructions to ensure the uppdate is atomic. \n        // If some other thread has merged this set (and updated\n        // the bitvector), we discard all the merged data.\n        \n        // As a given set of reads should all be merged together, we only need to make sure we atomically update\n        // the bit for the read with the lowest index in the set.\n\n        // Sort the intervals into ascending order and remove any duplicate intervals (which can occur\n        // if the subgraph has a simple cycle)\n        std::sort(result.usedIntervals.begin(), result.usedIntervals.end(), BWTInterval::compare);\n        std::vector<BWTInterval>::iterator newEnd = std::unique(result.usedIntervals.begin(),\n                                                                result.usedIntervals.end(),\n                                                                BWTInterval::equal);\n        result.usedIntervals.erase(newEnd, result.usedIntervals.end());\n\n        // Check if the bit in the vector has already been set for the lowest read index\n        // If it has some other thread has already output this set so we do nothing\n        int64_t lowestIndex = result.usedIntervals.front().lower;\n        bool currentValue = m_pMarkedReads->test(lowestIndex);\n        bool updateSuccess = false;\n\n        if(currentValue == false)\n        {\n            // Attempt to update the bit vector with an atomic CAS. If this returns false\n            // the bit was set by some other thread\n            updateSuccess = m_pMarkedReads->updateCAS(lowestIndex, currentValue, true);\n        }\n\n        if(updateSuccess)\n        {\n            // We successfully atomically set the bit for the first read in this set\n            // to true. We can safely update the rest of the bits and keep the merged sequences\n            // for output.\n            std::vector<BWTInterval>::const_iterator iter = result.usedIntervals.begin();\n            for(; iter != result.usedIntervals.end(); ++iter)\n            {\n                for(int64_t i = iter->lower; i <= iter->upper; ++i)\n                {\n                    if(i == lowestIndex) //already set\n                        continue;\n\n                    currentValue = m_pMarkedReads->test(i);\n                    if(currentValue)\n                    {\n                        // This value should not be true, emit a warning\n                        std::cout << \"Warning: Bit \" << i << \" was set outside of critical section\\n\";\n                    }\n                    else\n                    {\n                        m_pMarkedReads->updateCAS(i, currentValue, true);\n                    }\n                }\n            }\n        }\n        else\n        {\n            // Some other thread merged these reads already, discard the intermediate\n            // data and set the result to false\n            result.mergedSequences.clear();\n            result.usedIntervals.clear();\n            result.isMerged = false;\n        }\n    }\n    return result;\n}\n\n// Check if the candidate node can be merged with the node it is linked to. Returns true if so\nbool FMMergeProcess::checkCandidate(const FMMergeCandidate& candidate, const OverlapBlockList* pBlockList) const\n{\n    // Get the direction of the edge back to the node that generated this candidate\n    // pEdge is the edge TO the candidate vertex so the twin direction is the direction away\n    // from the candidate vertex\n    EdgeDir mergeDir = candidate.pEdge->getTwinDir();\n\n    size_t mergeDirCount = 0;\n    for(OverlapBlockList::const_iterator iter = pBlockList->begin(); iter != pBlockList->end(); ++iter)\n    {\n        if(iter->getEdgeDir() == mergeDir)\n            mergeDirCount += 1;\n    }\n\n    assert(mergeDirCount > 0);\n    return mergeDirCount == 1;\n}\n\n// Add the edges starting from pX as candidate vertices\n// using the blockList.\n// Precondition: pX is a valid vertex in the merge graph. In other words, there is a\n// unique assembly that includes pX and the root vertex.\nvoid FMMergeProcess::addCandidates(StringGraph* pGraph, const Vertex* pX, const Edge* pEdgeToX, const OverlapBlockList* pBlockList, FMMergeQueue& candidateQueue)\n{\n    // Count the number of edges in each direction. \n    size_t numAnti = 0;\n    size_t numSense = 0;\n\n    for(OverlapBlockList::const_iterator iter = pBlockList->begin(); iter != pBlockList->end(); ++iter)\n    {\n        if(iter->getEdgeDir() == ED_SENSE)\n            ++numSense;\n        if(iter->getEdgeDir() == ED_ANTISENSE)\n            ++numAnti;\n    }\n\n    // For each edge block, if it is unique for the direction add the vertex it describes as a candidate\n    for(OverlapBlockList::const_iterator iter = pBlockList->begin(); iter != pBlockList->end(); ++iter)\n    {\n        EdgeDir currDir = iter->getEdgeDir();\n        if((currDir == ED_SENSE && numSense == 1) || \n           (currDir == ED_ANTISENSE && numAnti == 1))\n        {\n            // Skip edges in the direction to X\n            if(pEdgeToX != NULL && pEdgeToX->getTwinDir() == currDir)\n                continue;\n\n            // Construct new candidate vertices and add them to the graph\n            std::string vertexID = iter->toCanonicalID();\n            assert(vertexID != pX->getID());\n            std::string vertexSeq = iter->getFullString(pX->getSeq().toString());\n            Overlap ovrXY = iter->toOverlap(pX->getID(), vertexID, pX->getSeqLen(), vertexSeq.length());\n\n            // The vertex may already exist in the graph if the graph contains a loop\n            Vertex* pY = pGraph->getVertex(vertexID);\n\n            // Generate the new vertex\n            if(pY == NULL)\n            {\n                pY = new(pGraph->getVertexAllocator()) Vertex(vertexID, vertexSeq);\n                pGraph->addVertex(pY);\n            }\n\n            // Construct a description of the edge based on the overlap\n            EdgeDesc ed = SGAlgorithms::overlapToEdgeDesc(pY, ovrXY);\n\n            // If an edge with the same description as XY exists for X do not add a new edge or candidate\n            if(!pX->hasEdge(ed))\n            {\n                // Construct the found edge and add it to the graph\n                Edge* pXY = SGAlgorithms::createEdgesFromOverlap(pGraph, ovrXY, false);\n\n                // Add the new vertex as a candidate\n                FMMergeCandidate candidate;\n                candidate.pVertex = pY;\n                candidate.pEdge = pXY;\n                candidate.interval = iter->getCanonicalInterval();\n                candidateQueue.push(candidate);\n            }\n        }\n    }\n}\n\n//\nFMMergePostProcess::FMMergePostProcess(std::ostream* pWriter, BitVector* pMarkedReads) : m_numMerged(0), \n                                                                                          m_numTotal(0), \n                                                                                          m_totalLength(0), \n                                                                                          m_pWriter(pWriter), \n                                                                                          m_pMarkedReads(pMarkedReads)\n{\n\n}\n\n//\nFMMergePostProcess::~FMMergePostProcess()\n{\n    printf(\"[sga fm-merge] Merged %zu reads into %zu sequences\\n\", m_numTotal, m_numMerged);\n    printf(\"[sga fm-merge] Reduction factor: %lf\\n\", (double)m_numTotal / m_numMerged);\n    printf(\"[sga fm-merge] Mean merged size: %lf\\n\", (double)m_totalLength / m_numMerged);\n}\n\n//\nvoid FMMergePostProcess::process(const SequenceWorkItem& item, const FMMergeResult& result)\n{\n    (void)item;\n    m_numTotal += 1;\n\n    if(result.isMerged)\n    {\n        // Write out the merged sequences\n        for(std::vector<std::string>::const_iterator iter = result.mergedSequences.begin();\n                iter != result.mergedSequences.end(); ++iter)\n        {\n            std::stringstream nameSS;\n            nameSS << \"merged-\" << m_numMerged++;\n            SeqRecord record;\n            record.id = nameSS.str();\n            record.seq = *iter;\n            record.write(*m_pWriter);\n\n            m_totalLength += iter->size();\n        }\n    }\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/FMMergeProcess.h",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// FMMergeProcess - Merge unambiguously overlapping sequences\n//\n#ifndef FMMERGEPROCESS_H\n#define FMMERGEPROCESS_H\n\n#include \"Util.h\"\n#include \"OverlapAlgorithm.h\"\n#include \"SequenceProcessFramework.h\"\n#include \"BitVector.h\"\n#include \"Bigraph.h\"\n#include \"SGUtil.h\"\n\nstruct FMMergeResult\n{\n    std::vector<std::string> mergedSequences;\n    std::vector<BWTInterval> usedIntervals;\n    bool isMerged;\n};\n\n// A merge candidate is a read that is a unique extension\n// from an existing read. If it has a single edge\n// in the direction pointing back to the existing read\n// it can be merged with that read. if it has multiple\n// edges back to the read it cannot and will be marked as\n// invalid.\n// \nstruct FMMergeCandidate\n{\n    Vertex* pVertex;\n    Edge* pEdge; // Edge from the existing vertex to pVertex\n    BWTInterval interval; // interval containing this candidate\n};\ntypedef std::queue<FMMergeCandidate> FMMergeQueue;\n\n// Compute the overlap blocks for reads\nclass FMMergeProcess\n{\n    public:\n        FMMergeProcess(const OverlapAlgorithm* pOverlapper, \n                       int minOverlap, BitVector* pMarkedReads);\n\n        ~FMMergeProcess();\n\n        FMMergeResult process(const SequenceWorkItem& item);\n    \n    private:\n\n        // Add the edges of X as candidates to the graph\n        void addCandidates(StringGraph* pGraph, \n                           const Vertex* pX, \n                           const Edge* pEdgeToX, \n                           const OverlapBlockList* pBlockList, \n                           FMMergeQueue& candidateQueue);\n\n        // Check whether the candidate can be merged into the current graph\n        bool checkCandidate(const FMMergeCandidate& candidate, \n                            const OverlapBlockList* pBlockList) const;\n\n        //\n        std::string makeVertexID(BWTInterval interval);\n\n        const OverlapAlgorithm* m_pOverlapper;\n        const int m_minOverlap;\n        BitVector* m_pMarkedReads;\n};\n\n// Write the results from the overlap step to an ASQG file\nclass FMMergePostProcess\n{\n    public:\n        FMMergePostProcess(std::ostream* pWriter, BitVector* pMarkedReads);\n        ~FMMergePostProcess();\n        \n        void process(const SequenceWorkItem& item, const FMMergeResult& result);\n\n    private:\n        size_t m_numMerged;\n        size_t m_numTotal;\n        size_t m_totalLength;\n\n        std::ostream* m_pWriter;\n        BitVector* m_pMarkedReads;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/GapFillProcess.cpp",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// GapFillProcess - Fill in gaps in a scaffold\n//\n#include <algorithm>\n#include \"GapFillProcess.h\"\n#include \"BWTAlgorithms.h\"\n#include \"SGAlgorithms.h\"\n#include \"SGSearch.h\"\n#include \"StdAlnTools.h\"\n#include \"HaplotypeBuilder.h\"\n#include \"MultiAlignment.h\"\n\n//\nGapFillStats::GapFillStats()\n{\n    numGapsAttempted = numGapsFilled = 0;\n    for(size_t i = 0; i < GFRC_NUM_CODES; ++i)\n        numFails[i] = 0;\n}\n\n//\nvoid GapFillStats::print() const\n{\n    printf(\"Num gaps attempted: %zu\\n\", numGapsAttempted);\n    printf(\"Num gaps filled: %zu\\n\", numGapsFilled);\n    printf(\"    Failed -- no anchor: %zu\\n\", numFails[GFRC_NO_ANCHOR]);\n    printf(\"    Failed -- no haplotype path: %zu\\n\", numFails[GFRC_NO_HAPLOTYPE_PATH]);\n    printf(\"    Failed -- no haplotype, search aborted: %zu\\n\", numFails[GFRC_NO_HAPLOTYPE_ABORTED]);\n    printf(\"    Failed -- no haplotype, walk failed: %zu\\n\", numFails[GFRC_NO_HAPLOTYPE_WALK_FAIL]);\n    printf(\"    Failed -- ambiguous solution: %zu\\n\", numFails[GFRC_AMBIGUOUS]);\n    printf(\"    Failed -- assembled size differs from estimate: %zu\\n\", numFails[GFRC_BAD_SIZE]);\n    printf(\"    Failed -- anchor sequence mismatch: %zu\\n\", numFails[GFRC_BAD_TRIM]);\n}\n\n//\n//\n//\nGapFillProcess::GapFillProcess(const GapFillParameters& params) : m_parameters(params)\n{\n}\n\n//\nGapFillProcess::~GapFillProcess()\n{\n    m_stats.print();\n}\n\n// Process the given scaffold, filling in any gaps found\nGapFillResult GapFillProcess::processScaffold(const std::string& scaffold) const\n{\n    if(m_parameters.verbose > 0)\n        std::cout << \"Processing scaffold of length \" << scaffold.length() << \"\\n\";\n    \n    GapFillResult result;\n\n    size_t len = scaffold.length();\n    size_t currIdx = 0;\n    while(currIdx < len)\n    {\n        char b = scaffold[currIdx];\n\n        if(b != 'N')\n        {\n            // Append this non-gap character into the output scaffold\n            result.scaffold.append(1,b);\n            currIdx += 1;\n        }\n        else\n        {\n            // Found the start of a gap\n            size_t gapLength = 0;\n            while(scaffold[currIdx + gapLength] == 'N')\n                gapLength += 1;\n\n            if(m_parameters.verbose >= 1)\n                printf(\"Constructing gap at position %zu GapLength: %zu\\n\", currIdx, gapLength);\n            \n            GapFillReturnCode code = GFRC_UNKNOWN;\n\n            // Attempt to fill this gap starting with a long kmer, then relaxing the process\n            for(size_t k = m_parameters.startKmer; k >= m_parameters.endKmer; k -= m_parameters.stride)\n            {\n                // Calculate the left-anchor using the sequence of the scaffold already appended\n                AnchorSequence leftAnchor = findAnchor(k, result.scaffold, result.scaffold.length() - k, true);\n\n                // Calculate the right anchor using the sequence of the input scaffold\n                AnchorSequence rightAnchor = findAnchor(k, scaffold, currIdx + gapLength, false);\n\n                // Estimate the size of the assembled sequence, including the flanking anchors\n                int leftFlanking = result.scaffold.length() - leftAnchor.position;\n                int rightFlankingPlusGap = rightAnchor.position + k - currIdx;\n                int estimatedSize = leftFlanking + rightFlankingPlusGap;\n\n                // Attempt to build the gap sequence\n                std::string gapSequence;\n                code = processGap(k, estimatedSize, leftAnchor, rightAnchor, gapSequence);\n\n                if(code == GFRC_OK)\n                {\n                    // Successfully resolved the gap. Calculate the amount of the anchor sequence\n                    // that is already present in the scaffold and must be removed. We remove this amount\n                    // of sequence from the current scaffold, not the gapSequence, to account\n                    // for the case that the gap sequence is significantly different than the sequence\n                    // after the left anchor. \n                    size_t trimLength = result.scaffold.length() - leftAnchor.position;\n                    result.scaffold.replace(leftAnchor.position, trimLength, gapSequence);\n                        \n                    // We need to update currIdx to point to the next base in the \n                    // input scaffold that is not already assembled. This is given\n                    // by the position of the rightAnchor, plus a kmer\n                    currIdx = rightAnchor.position + k;\n                    m_stats.numGapsFilled += 1;\n                    break; \n                }\n            }\n\n            if(code != GFRC_OK)\n            {\n                // Failed to resolve the gap. Append the gap into the growing scaffold\n                m_stats.numFails[code] += 1;\n\n                while(scaffold[currIdx] == 'N')\n                {\n                    result.scaffold.append(1, 'N');\n                    currIdx += 1;\n                }\n            }\n            m_stats.numGapsAttempted += 1;\n        }\n    }\n\n    if(m_parameters.verbose >= 2)\n        StdAlnTools::globalAlignment(scaffold, result.scaffold, true);\n    return result;\n}\n\n// Fill in the specified gap\nGapFillReturnCode GapFillProcess::processGap(size_t k, int estimatedSize, const AnchorSequence& startAnchor, const AnchorSequence& endAnchor, std::string& outSequence) const\n{\n\n    if(m_parameters.verbose > 0)\n    {\n        std::cout << \"\\tSTART: \" << startAnchor << \"\\n\";\n        std::cout << \"\\tEND: \" << endAnchor << \"\\n\";\n    }\n\n    if(startAnchor.sequence.empty() || endAnchor.sequence.empty() || startAnchor.sequence == endAnchor.sequence)\n        return GFRC_NO_ANCHOR;\n\n    HaplotypeBuilder builder;\n    builder.setTerminals(startAnchor, endAnchor);\n    builder.setIndex(m_parameters.pBWT, m_parameters.pRevBWT);\n    builder.setKmerParameters(k, m_parameters.kmerThreshold);\n    HaplotypeBuilderReturnCode code = builder.run();\n    \n    HaplotypeBuilderResult result;\n\n    // The search was successfull, build strings from the walks\n    if(code == HBRC_OK)\n        code = builder.parseWalks(result);\n\n    if(code == HBRC_OK)\n    {\n        assert(!result.haplotypes.empty());\n        // Calculate the estimated size of the sequence, including the anchors\n        return selectGapSequence(estimatedSize, result.haplotypes, outSequence);\n    }\n    else \n    {\n        // Map the haplotype builder code to a gap fill code\n        assert(code != HBRC_OK);\n        if(code == HBRC_NO_PATH)\n            return GFRC_NO_HAPLOTYPE_PATH;\n        else if(code == HBRC_TOO_MANY_VERTICES)\n            return GFRC_NO_HAPLOTYPE_ABORTED;\n        else if(code == HBRC_WALK_FAILED)\n            return GFRC_NO_HAPLOTYPE_WALK_FAIL;\n    }\n\n    // should not reach here\n    return GFRC_UNKNOWN;\n}\n\n// Find an anchor sequence to start the process of building the gap sequence\nAnchorSequence GapFillProcess::findAnchor(size_t k, const std::string& scaffold, int64_t position, bool upstream) const\n{\n    AnchorSequence anchor;\n    int64_t stride = upstream ? -1 : 1;\n    int MAX_DISTANCE = 50;\n    int64_t stop = upstream ? position - MAX_DISTANCE : position + MAX_DISTANCE;\n\n    // Cap the travel distance to avoid out of bounds\n    if(stop < 0)\n        stop = 0;\n    if(stop > (int64_t)(scaffold.length() - k))\n        stop = scaffold.length() - k;\n\n    for(; position != stop; position += stride)\n    {\n        assert(position >= 0);\n        std::string testSeq = scaffold.substr(position, k);\n        std::transform(testSeq.begin(), testSeq.end(), testSeq.begin(), ::toupper);\n        if(testSeq.find_first_not_of(\"ACGT\") != std::string::npos)\n            continue;\n\n        size_t count = BWTAlgorithms::countSequenceOccurrencesWithCache(testSeq, m_parameters.pBWT, m_parameters.pBWTCache);\n        if(count > m_parameters.kmerThreshold)\n        {\n            anchor.sequence = testSeq;\n            anchor.count = count;\n            anchor.position = position;\n            return anchor;\n        }\n    }\n\n    anchor.sequence = \"\";\n    anchor.count = -1;\n    return anchor;\n}\n\n// Attempt to select one of the passed in strings as the gap sequence. If none fit the constraints,\n// this sets gapSequence to the empty string and returns an error code\nGapFillReturnCode GapFillProcess::selectGapSequence(int estimatedSize, const StringVector& sequences, std::string& gapSequence) const\n{\n    assert(!sequences.empty());\n    int selectedIdx = -1;\n    int selectedSizeDiff = std::numeric_limits<int>::max();\n\n    for(size_t i = 0; i < sequences.size(); ++i)\n    {\n        int diff = abs(sequences[i].size() - estimatedSize);\n        //printf(\"ES: %d S: %zu D: %d\\n\", estimatedSize, sequences[i].size(), diff);\n\n        if(diff < selectedSizeDiff)\n        {\n            selectedSizeDiff = diff;\n            selectedIdx = i;\n        }\n    }\n\n    // Perform checks on the quality of the gap sequences\n    int MAX_SIZE_DIFF = 100;\n    if(selectedSizeDiff > MAX_SIZE_DIFF)\n    {\n        gapSequence = \"\";\n        return GFRC_BAD_SIZE;\n    }\n    \n    gapSequence = sequences[selectedIdx];\n    return GFRC_OK;\n}\n\n"
  },
  {
    "path": "src/SGA/Algorithm/GapFillProcess.h",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// GapFillProcess - Fill in gaps in a scaffold\n//\n#ifndef GAPFILL_PROCESS_H\n#define GAPFILL_PROCESS_H\n\n#include <list>\n#include <stack>\n#include <queue>\n#include \"BWT.h\"\n#include \"BWTInterval.h\"\n#include \"SGUtil.h\"\n#include \"SGWalk.h\"\n#include \"BitVector.h\"\n#include \"HaplotypeBuilder.h\"\n#include \"SequenceProcessFramework.h\"\n#include \"BWTIntervalCache.h\"\n#include \"SampledSuffixArray.h\"\n\n// Structures and typedefs\n\n// Parameters structure\nstruct GapFillParameters\n{\n    // BWTS\n    const BWT* pBWT; \n    const BWT* pRevBWT;\n\n    const BWTIntervalCache* pBWTCache;\n    const BWTIntervalCache* pRevBWTCache;\n    \n    size_t startKmer;\n    size_t endKmer;\n    size_t stride;\n    size_t kmerThreshold;\n\n    int verbose;\n};\n\n// \nstruct GapFillResult\n{\n    std::string scaffold;\n};\n\nenum GapFillReturnCode\n{\n    GFRC_UNKNOWN,\n    GFRC_OK,\n    GFRC_NO_HAPLOTYPE_PATH,\n    GFRC_NO_HAPLOTYPE_ABORTED,\n    GFRC_NO_HAPLOTYPE_WALK_FAIL,\n    GFRC_NO_ANCHOR,\n    GFRC_AMBIGUOUS,\n    GFRC_BAD_SIZE,\n    GFRC_BAD_TRIM,\n    GFRC_NUM_CODES\n};\n\n// Statistics tracking object\nstruct GapFillStats\n{\n    GapFillStats(); \n    size_t numGapsAttempted;\n    size_t numGapsFilled;\n\n    // Failure stats\n    size_t numFails[GFRC_NUM_CODES];\n\n    void print() const;\n};\n\n//\n//\n//\nclass GapFillProcess\n{\n    public:\n\n        //\n        // Functions\n        //\n        GapFillProcess(const GapFillParameters& params);\n        ~GapFillProcess();\n        \n        // Generate haplotypes from chromosome refName, position [start, end]\n        GapFillResult processScaffold(const std::string& scaffold) const;\n\n    private:\n        \n        //\n        // Functions\n        //\n        \n        // Attempt to fill in the sequence between the two anchors\n        GapFillReturnCode processGap(size_t k, \n                                     int estimatedSize,\n                                     const AnchorSequence& leftAnchor, \n                                     const AnchorSequence& rightAnchor, \n                                     std::string& outSequence) const;\n\n        // Find an anchor sequence to start the process of building the gap sequence\n        AnchorSequence findAnchor(size_t k, const std::string& scaffold, int64_t position, bool upstream) const;\n\n        // Attempt to select one of the passed in strings as the gap sequence. If none fit the constraints,\n        // this sets gapSequence to the empty string and returns an error code\n        GapFillReturnCode selectGapSequence(int estiamtedSize, const StringVector& sequences, std::string& gapSequence) const;\n\n        //\n        // Data\n        //\n        GapFillParameters m_parameters;\n        mutable GapFillStats m_stats;\n};\n\n#if 0\n// \nclass GapFillPostProcess\n{\n\n    public:\n        GapFillPostProcess(const std::string& filename);\n        ~GapFillPostProcess();\n\n        //void process(const SequenceWorkItem& item, const GraphCompareResult& result);\n\n\n    private:\n        std::ostream* m_pWriter;\n};\n#endif\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/HaplotypeBuilder.cpp",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// HaplotypeBuilder - Construct candidate\n// haplotypes from a pair of k-mer seeds.\n//\n#include \"HaplotypeBuilder.h\"\n#include \"BWTAlgorithms.h\"\n#include \"SGSearch.h\"\n#include \"SGAlgorithms.h\"\n#include \"Profiler.h\"\n\n//\n//\n//\nHaplotypeBuilder::HaplotypeBuilder() : m_pStartVertex(NULL), m_pJoinVertex(NULL), m_kmerThreshold(1), m_kmerSize(51)\n{\n    m_pGraph = new StringGraph;\n}\n\n//\nHaplotypeBuilder::~HaplotypeBuilder()\n{\n    delete m_pGraph;\n}\n\n//\nvoid HaplotypeBuilder::setKmerParameters(size_t k, size_t t)\n{\n    m_kmerSize = k;\n    m_kmerThreshold = t;\n}\n\n// The source string is the string the bubble starts from\nvoid HaplotypeBuilder::setTerminals(const AnchorSequence& leftAnchor, const AnchorSequence& rightAnchor)\n{\n    // Create a new vertex for the source sequence\n    // As we are creating a de Bruijn graph, we use the sequence\n    // of the vertex as its ID\n    assert(leftAnchor.sequence != rightAnchor.sequence);\n    Vertex* pLeftVertex = new(m_pGraph->getVertexAllocator()) Vertex(leftAnchor.sequence, leftAnchor.sequence);\n    addVertex(pLeftVertex, leftAnchor.count);\n\n    Vertex* pRightVertex = new(m_pGraph->getVertexAllocator()) Vertex(rightAnchor.sequence, rightAnchor.sequence);\n    addVertex(pRightVertex, rightAnchor.count);\n\n    // Add the vertex to the extension queue\n    m_queue.push(BuilderExtensionNode(pLeftVertex, ED_SENSE));\n    \n    m_pStartVertex = pLeftVertex;\n    m_pJoinVertex = pRightVertex;\n}\n\n// The source index is the index that the contains the source string\nvoid HaplotypeBuilder::setIndex(const BWT* pBWT, const BWT* pRBWT)\n{\n    m_pBWT = pBWT;\n    m_pRevBWT = pRBWT;\n}\n\n// Run the bubble construction process\nHaplotypeBuilderReturnCode HaplotypeBuilder::run()\n{\n    PROFILE_FUNC(\"HaplotypeBuilder::run\")\n    assert(m_queue.size() == 1);\n    assert(m_pJoinVertex != NULL);\n    assert(m_pBWT != NULL);\n\n    size_t MAX_ITERATIONS = 2000;\n    size_t MAX_SIMULTANEOUS_BRANCHES = 20;\n    size_t MAX_TOTAL_BRANCHES = 50;\n   \n    // Tracking stats\n    size_t total_branches = 0;\n    size_t iterations = 0;\n\n    while(!m_queue.empty())\n    {\n        if(iterations > MAX_ITERATIONS || m_queue.size() > MAX_SIMULTANEOUS_BRANCHES || total_branches > MAX_TOTAL_BRANCHES)\n            return HBRC_TOO_MANY_VERTICES;\n\n        iterations += 1;\n        BuilderExtensionNode curr = m_queue.front();\n        m_queue.pop();\n\n        // Calculate de Bruijn extensions for this node\n        std::string vertStr = curr.pVertex->getSeq().toString();\n        AlphaCount64 extensionCounts;\n        if(m_pRevBWT != NULL)\n            extensionCounts = BWTAlgorithms::calculateDeBruijnExtensions(vertStr, m_pBWT, m_pRevBWT, curr.direction);\n        else\n            extensionCounts = BWTAlgorithms::calculateDeBruijnExtensionsSingleIndex(vertStr, m_pBWT, curr.direction);\n        \n        size_t num_added = 0;\n        for(size_t i = 0; i < DNA_ALPHABET::size; ++i)\n        {\n            char b = DNA_ALPHABET::getBase(i);\n            size_t count = extensionCounts.get(b);\n            if(count < m_kmerThreshold)\n                continue;\n\n            std::string newStr = makeDeBruijnVertex(vertStr, b, curr.direction);\n            Vertex* pVertex = m_pGraph->getVertex(newStr);\n            \n            // Check if we have found the vertex we are assembling to\n            bool joinFound = pVertex != NULL && pVertex == m_pJoinVertex;\n            if(!joinFound && pVertex == NULL)\n            {\n                pVertex = new(m_pGraph->getVertexAllocator()) Vertex(newStr, newStr);\n                addVertex(pVertex, count);\n                m_queue.push(BuilderExtensionNode(pVertex, curr.direction));\n                num_added += 1;\n            }\n            \n            // Create the new edge in the graph\n            addDeBruijnEdges(curr.pVertex, pVertex, curr.direction);\n\n            // If we've found the join vertex, we have completed the target half of the bubble\n            if(joinFound)\n                return HBRC_OK;\n        }\n\n        if(num_added > 0)\n            total_branches += (num_added - 1);\n    }\n\n    // no path between the nodes found\n    return HBRC_NO_PATH;\n}\n\n// After the bubble has been built into the graph, this function\n// finds and compares the two sequences\nHaplotypeBuilderReturnCode HaplotypeBuilder::parseWalks(HaplotypeBuilderResult& results) const\n{\n    // Parse walks from the graph that go through the bubbles\n    SGWalkVector outWalks;\n    bool success = SGSearch::findWalks(m_pStartVertex,\n                                       m_pJoinVertex,\n                                       ED_SENSE,\n                                       10000, // max distance to search\n                                       10000, // max nodes to search\n                                       true, // exhaustive search\n                                       outWalks);\n    if(!success)\n        return HBRC_WALK_FAILED;\n\n    // Convert the walks into strings\n    for(size_t i = 0; i < outWalks.size(); ++i)\n    {\n        std::string walkStr = outWalks[i].getString(SGWT_START_TO_END);\n        results.haplotypes.push_back(walkStr);\n    }\n    \n    return HBRC_OK;\n}\n\n// Add a vertex to the graph\nvoid HaplotypeBuilder::addVertex(Vertex* pVertex, int coverage)\n{\n    m_pGraph->addVertex(pVertex);\n    m_vertexCoverageMap[pVertex->getSeq().toString()] = coverage;\n}\n\n// Add a new edge to the graph denoting the relationship between pX and pY.\n// Assumes pX and pY are already present in the m_pGraph\nvoid HaplotypeBuilder::addDeBruijnEdges(const Vertex* pX, const Vertex* pY, EdgeDir direction)\n{\n    assert(pX->getSeq().length() == pY->getSeq().length());\n    \n    // overlap length for a de bruijn edge\n    size_t p = pX->getSeq().length() - 1;\n\n    // Construct an overlap object for this relationship\n    Overlap o;\n    o.id[0] = pX->getID();\n    o.id[1] = pY->getID();\n\n    o.match.isReverse = false;\n    o.match.numDiff = 0;\n\n    if(direction == ED_SENSE)\n    {\n        // pX -> pY\n        o.match.coord[0].interval.start = 1;\n        o.match.coord[1].interval.start = 0;\n    }\n    else\n    {\n        // pY -> pX\n        o.match.coord[0].interval.start = 0;\n        o.match.coord[1].interval.start = 1;\n    }\n\n    o.match.coord[0].interval.end = o.match.coord[0].interval.start + p - 1; // inclusive coordinate\n    o.match.coord[1].interval.end = o.match.coord[1].interval.start + p - 1;\n    o.match.coord[0].seqlen = p + 1;\n    o.match.coord[1].seqlen = p + 1;\n    Edge* e = SGAlgorithms::createEdgesFromOverlap(m_pGraph, o, false);\n    assert(e != NULL);\n}\n\n\n// Make the sequence of a new deBruijn vertex using the edge details\nstd::string HaplotypeBuilder::makeDeBruijnVertex(const std::string& v, char edgeBase, EdgeDir direction)\n{\n    std::string w;\n    size_t p = v.size() - 1;\n    if(direction == ED_SENSE)\n    {\n        w = v.substr(1, p);\n        w.append(1, edgeBase);\n    }\n    else\n    {\n        w.append(1, edgeBase);\n        w.append(v.substr(0, p));\n    }\n    return w;\n}\n\n// Count the number of extensions of a de Bruijn node that are above\n// the required k-mer coverage\nsize_t HaplotypeBuilder::countValidExtensions(const AlphaCount64& ac) const\n{\n    size_t n = 0;\n    for(size_t i = 0; i < DNA_ALPHABET::size; ++i)\n    {\n        char b = DNA_ALPHABET::getBase(i);\n        size_t count = ac.get(b);\n        if(count >= m_kmerThreshold)\n            n += 1;\n    }\n    return n;\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/HaplotypeBuilder.h",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// HaplotypeBuilder - Construct candidate\n// haplotypes from a pair of k-mer seeds.\n//\n#ifndef HAPLOTYPE_BUILDER_H\n#define HAPLOTYPE_BUILDER_H\n#include \"BWT.h\"\n#include \"BWTInterval.h\"\n#include \"SGUtil.h\"\n#include \"SGWalk.h\"\n#include \"VariationBuilderCommon.h\"\n#include <queue>\n\n// Structs\nstruct AnchorSequence\n{\n    std::string sequence;\n    int position;\n    int count;\n\n    friend std::ostream& operator<<(std::ostream& out, const AnchorSequence& a) \n    { \n        out << a.position << \" \" << a.sequence << \" \" << a.count; \n        return out; \n    }\n};\ntypedef std::vector<AnchorSequence> AnchorVector;\n\n// The result, a set of haplotypes\nstruct HaplotypeBuilderResult\n{\n    StringVector haplotypes;\n};\n\n// Return codes to indicate why the process may have failed\nenum HaplotypeBuilderReturnCode\n{\n    HBRC_OK,\n    HBRC_TOO_MANY_VERTICES,\n    HBRC_NO_PATH,\n    HBRC_WALK_FAILED,\n};\n\n//\n// Class to build a variant bubble starting at a particular sequence\n//\nclass HaplotypeBuilder\n{\n    public:\n\n        HaplotypeBuilder();\n        ~HaplotypeBuilder();\n\n        void setTerminals(const AnchorSequence& leftAnchor, const AnchorSequence& rightAnchor);\n        void setIndex(const BWT* pBWT, const BWT* pRBWT);\n\n        // Set the threshold of kmer occurrences to use it as an edge\n        void setKmerParameters(size_t k, size_t t);\n    \n        // Run the bubble construction process\n        // Returns true if the graph was successfully built between the two sequences\n        HaplotypeBuilderReturnCode run();\n        \n        // Parse walks from the constructed graph\n        HaplotypeBuilderReturnCode parseWalks(HaplotypeBuilderResult& results) const;\n\n    private:\n        \n        // Add a vertex to the graph and record the sequence coverage value\n        void addVertex(Vertex* pVertex, int coverage);\n\n        // Make the sequence of a new deBruijn vertex using the edge details\n        std::string makeDeBruijnVertex(const std::string& v, char edgeBase, EdgeDir direction);\n        void addDeBruijnEdges(const Vertex* pX, const Vertex* pY, EdgeDir direction);\n\n        // Count the number of extensions of a de Bruijn node that are above\n        // the required k-mer coverage\n        size_t countValidExtensions(const AlphaCount64& ac) const;\n        \n        //\n        // Data\n        //\n        const BWT* m_pBWT;\n        const BWT* m_pRevBWT;\n\n        StringGraph* m_pGraph;\n        StrIntMap m_vertexCoverageMap;\n\n        BuilderExtensionQueue m_queue;\n        Vertex* m_pStartVertex;\n        Vertex* m_pJoinVertex;\n        \n        //\n        size_t m_kmerThreshold;\n        size_t m_kmerSize;\n};\n\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/KmerOverlaps.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// KmerOverlaps - Overlap computation functions\n// seeded by exact kmer matches\n//\n#include \"KmerOverlaps.h\"\n#include \"HashMap.h\"\n#include \"BWTAlgorithms.h\"\n#include \"Profiler.h\"\n#include \"Timer.h\"\n#include \"Verbosity.h\"\n\n//\nMultipleAlignment KmerOverlaps::buildMultipleAlignment(const std::string& query, \n                                                       size_t k,\n                                                       int min_overlap,\n                                                       double min_identity,\n                                                       int bandwidth,\n                                                       const BWTIndexSet& indices)\n{\n    SequenceOverlapPairVector overlap_vector = retrieveMatches(query, k, min_overlap, min_identity, bandwidth, indices);\n    MultipleAlignment multiple_alignment;\n    multiple_alignment.addBaseSequence(\"query\", query, \"\");\n    for(size_t i = 0; i < overlap_vector.size(); ++i)\n        multiple_alignment.addOverlap(\"null\", overlap_vector[i].sequence[1], \"\", overlap_vector[i].overlap);\n    return multiple_alignment;\n}\n\n// Struct to hold a partial match in the FM-index\n// The position field is the location in the query sequence of this kmer.\n// The index field is an index into the BWT. \n// The is_reverse flag indicates the strand of the partial match\nstruct KmerMatch\n{\n    size_t position:16;\n    size_t index:47;\n    size_t is_reverse:1;\n\n    friend bool operator<(const KmerMatch& a, const KmerMatch& b)\n    {\n        if(a.index == b.index)\n            return a.is_reverse < b.is_reverse;\n        else\n            return a.index < b.index;\n    }\n\n    friend bool operator==(const KmerMatch& a, const KmerMatch& b)\n    {\n        return a.index == b.index && a.is_reverse == b.is_reverse;\n    }\n};\n\n// Return a hash key for a KmerMatch\nstruct KmerMatchKey\n{\n    size_t operator()(const KmerMatch& a) const { return a.index; }\n};\n\ntypedef std::set<KmerMatch> KmerMatchSet;\ntypedef HashMap<KmerMatch, bool, KmerMatchKey> KmerMatchMap;\n\n//\nSequenceOverlapPairVector KmerOverlaps::retrieveMatches(const std::string& query, size_t k, \n                                                        int min_overlap, double min_identity,\n                                                        int bandwidth, const BWTIndexSet& indices)\n{\n    PROFILE_FUNC(\"OverlapHaplotypeBuilder::retrieveMatches\")\n    assert(indices.pBWT != NULL);\n    assert(indices.pSSA != NULL);\n\n    static size_t n_calls = 0;\n    static size_t n_candidates = 0;\n    static size_t n_output = 0;\n    static double t_time = 0;\n    Timer timer(\"test\", true);\n\n    n_calls++;\n\n    int64_t max_interval_size = 200;\n    SequenceOverlapPairVector overlap_vector;\n\n    // Use the FM-index to look up intervals for each kmer of the read. Each index\n    // in the interval is stored individually in the KmerMatchMap. We then\n    // backtrack to map these kmer indices to read IDs. As reads can share\n    // multiple kmers, we use the map to avoid redundant lookups.\n    // There is likely a faster algorithm which performs direct decompression\n    // of the read sequences without having to expand the intervals to individual\n    // indices. The current algorithm suffices for now.\n    KmerMatchMap prematchMap;\n    size_t num_kmers = query.size() - k + 1;\n    for(size_t i = 0; i < num_kmers; ++i)\n    {\n        std::string kmer = query.substr(i, k);\n        BWTInterval interval = BWTAlgorithms::findInterval(indices, kmer);\n        if(interval.isValid() && interval.size() < max_interval_size) \n        {\n            for(int64_t j = interval.lower; j <= interval.upper; ++j)\n            {\n                KmerMatch match = { i, static_cast<size_t>(j), false };\n                prematchMap.insert(std::make_pair(match, false));\n            }\n        }\n\n        kmer = reverseComplement(kmer);\n        interval = BWTAlgorithms::findInterval(indices, kmer);\n        if(interval.isValid() && interval.size() < max_interval_size) \n        {\n            for(int64_t j = interval.lower; j <= interval.upper; ++j)\n            {\n                KmerMatch match = { i, static_cast<size_t>(j), true };\n                prematchMap.insert(std::make_pair(match, false));\n            }\n        }\n    }\n\n    // Backtrack through the kmer indices to turn them into read indices.\n    // This mirrors the calcSA function in SampledSuffixArray except we mark each entry\n    // as visited once it is processed.\n    KmerMatchSet matches;\n    for(KmerMatchMap::iterator iter = prematchMap.begin(); iter != prematchMap.end(); ++iter)\n    {\n        // This index has been visited\n        if(iter->second)\n            continue;\n\n        // Mark this as visited\n        iter->second = true;\n\n        // Backtrack the index until we hit the starting symbol\n        KmerMatch out_match = iter->first;\n        while(1) \n        {\n            char b = indices.pBWT->getChar(out_match.index);\n            out_match.index = indices.pBWT->getPC(b) + indices.pBWT->getOcc(b, out_match.index - 1);\n\n            // Check if the hash indicates we have visited this index. If so, stop the backtrack\n            KmerMatchMap::iterator find_iter = prematchMap.find(out_match);\n            if(find_iter != prematchMap.end())\n            {\n                // We have processed this index already\n                if(find_iter->second)\n                    break;\n                else\n                    find_iter->second = true;\n            }\n\n            if(b == '$')\n            {\n                // We've found the lexicographic index for this read. Turn it into a proper ID\n                out_match.index = indices.pSSA->lookupLexoRank(out_match.index);\n                matches.insert(out_match);\n                break;\n            }\n        }\n    }\n\n    // Refine the matches by computing proper overlaps between the sequences\n    // Use the overlaps that meet the thresholds to build a multiple alignment\n    for(KmerMatchSet::iterator iter = matches.begin(); iter != matches.end(); ++iter)\n    {\n        std::string match_sequence = BWTAlgorithms::extractString(indices.pBWT, iter->index);\n        if(iter->is_reverse)\n            match_sequence = reverseComplement(match_sequence);\n        \n        // Ignore identical matches\n        if(match_sequence == query)\n            continue;\n\n        // Compute the overlap. If the kmer match occurs a single time in each sequence we use\n        // the banded extension overlap strategy. Otherwise we use the slow O(M*N) overlapper.\n        SequenceOverlap overlap;\n        std::string match_kmer = query.substr(iter->position, k);\n        size_t pos_0 = query.find(match_kmer);\n        size_t pos_1 = match_sequence.find(match_kmer);\n        assert(pos_0 != std::string::npos && pos_1 != std::string::npos);\n\n        // Check for secondary occurrences\n        if(query.find(match_kmer, pos_0 + 1) != std::string::npos || \n           match_sequence.find(match_kmer, pos_1 + 1) != std::string::npos) {\n            // One of the reads has a second occurrence of the kmer. Use\n            // the slow overlapper.\n            overlap = Overlapper::computeOverlap(query, match_sequence);\n        } else {\n            overlap = Overlapper::extendMatch(query, match_sequence, pos_0, pos_1, bandwidth);\n        }\n\n        n_candidates += 1;\n        bool bPassedOverlap = overlap.getOverlapLength() >= min_overlap;\n        bool bPassedIdentity = overlap.getPercentIdentity() / 100 >= min_identity;\n\n        if(bPassedOverlap && bPassedIdentity)\n        {\n            SequenceOverlapPair op;\n            op.sequence[0] = query;\n            op.sequence[1] = match_sequence;\n            op.overlap = overlap;\n            op.is_reversed = iter->is_reverse;\n            overlap_vector.push_back(op);\n            n_output += 1;\n        }\n    }\n\n    t_time += timer.getElapsedCPUTime();\n\n    if(Verbosity::Instance().getPrintLevel() > 6 && n_calls % 100 == 0)\n        printf(\"[kmer overlaps] n: %zu candidates: %zu valid: %zu (%.2lf) time: %.2lfs\\n\", \n            n_calls, n_candidates, n_output, (double)n_output / n_candidates, t_time);\n    return overlap_vector;\n}\n\nstruct SeedEdit\n{\n    SeedEdit(int i, char b) : index(i), base(b) {}\n    int index;\n    char base;\n};\n\ntypedef std::vector<SeedEdit> SeedEditVector;\n\nstruct ApproxSeed\n{\n    int query_index; // the index of the last query base included in the interval\n    BWTInterval interval;\n    int length;\n    SeedEditVector edits;\n\n    friend std::ostream& operator<<(std::ostream& o, ApproxSeed& a) {\n        o << \"QI: \" << a.query_index << \" IV: \" << a.interval;\n        o << \" Edits: \";\n        for(size_t i = 0; i < a.edits.size(); i++)\n            o << a.edits[i].index << \":\" << a.edits[i].base << \",\";\n        return o;\n    }\n};\n\nvoid _approximateSeededMatch(const std::string& in_query,\n                             int min_overlap, \n                             double min_identity,\n                             int bandwidth, \n                             int max_interval,\n                             bool do_reverse,\n                             const BWTIndexSet& indices,\n                             SequenceOverlapPairVector& out_vector)\n{\n    Timer timer(\"test\", true);\n    assert(indices.pBWT != NULL);\n    assert(indices.pSSA != NULL);\n    assert(indices.pCache != NULL);\n\n    static size_t n_calls = 0;\n    static size_t n_candidates = 0;\n    static size_t n_output = 0;\n    static double t_time = 0;\n\n    n_calls++;\n\n    int target_seed_length = 41;\n    int seed_stride = target_seed_length / 2;\n    size_t d = 1;\n\n    SequenceOverlapPairVector overlap_vector;\n\n    std::string strand_query = do_reverse ? reverseComplement(in_query) : in_query;\n\n    // Initialize seeds \n    int seed_end = strand_query.size();\n    int q = indices.pCache->getCachedLength();\n\n    std::queue<ApproxSeed> seeds;\n\n    while(seed_end > target_seed_length)\n    {\n        // For the last q bases of the seed, create all strings within edit distance d\n        std::string qmer = strand_query.substr(seed_end - q, q);\n        assert((int)qmer.size() == q);\n        // 0-distance seed\n        ApproxSeed seed;\n        seed.query_index = seed_end - q;\n        seed.interval = indices.pCache->lookup(qmer.c_str());\n        seed.length = q;\n        seeds.push(seed);\n\n        for(int i = 0; i < q; ++i)\n        {\n            // Switch base to other 3 symbols\n            char o = qmer[i];\n            for(size_t j = 0; j < 4; ++j)\n            {\n                char b = \"ACGT\"[j];\n                if(b != o)\n                {\n                    qmer[i] = b;\n                    ApproxSeed seed;\n                    seed.query_index = seed_end - q;\n                    seed.interval = indices.pCache->lookup(qmer.c_str());\n                    seed.length = q;\n                    seed.edits.push_back(SeedEdit(i + seed.query_index, b));\n                    seeds.push(seed);\n                }\n            }\n            qmer[i] = o;\n        }\n        seed_end -= seed_stride;\n    }\n    \n    // Extend seeds\n    std::vector<ApproxSeed> finished_seeds;\n    while(!seeds.empty())\n    {\n        ApproxSeed& seed = seeds.front();\n\n        // query_index is the index of the last base\n        // in the seed. get the next base\n        char qb = strand_query[seed.query_index - 1];\n\n        // Branch to inexact match\n        if(seed.edits.size() < d)\n        {\n            for(size_t j = 0; j < 4; ++j)\n            {\n                char b = \"ACGT\"[j];\n                if(b != qb)\n                {\n                    ApproxSeed new_seed;\n                    new_seed.query_index = seed.query_index - 1;\n                    new_seed.interval = seed.interval;\n                    BWTAlgorithms::updateInterval(new_seed.interval, b, indices.pBWT);\n                    if(new_seed.interval.isValid())\n                    {\n                        new_seed.length = seed.length + 1;\n                        new_seed.edits = seed.edits;\n                        new_seed.edits.push_back(SeedEdit(new_seed.query_index, b));\n\n                        if(new_seed.length < target_seed_length && new_seed.query_index > 0)\n                            seeds.push(new_seed);\n                        else\n                            finished_seeds.push_back(new_seed);\n                    }\n                }\n            }\n        }\n            \n        // Extend with the actual query base without branching\n        seed.query_index = seed.query_index - 1;\n        seed.length += 1;\n        BWTAlgorithms::updateInterval(seed.interval, qb, indices.pBWT);\n        if(!seed.interval.isValid() || seed.length >= target_seed_length || seed.query_index == 0)\n        {\n            if(seed.interval.isValid())\n                finished_seeds.push_back(seed);\n            seeds.pop();\n        }\n    }\n    \n    std::set<size_t> rank_set;\n    \n    for(size_t i = 0; i < finished_seeds.size(); ++i)\n    {\n        if(finished_seeds[i].interval.size() > max_interval)\n            continue;\n\n        //std::cout << finished_seeds[i] << \"\\n\";\n        std::string query_seed = strand_query.substr(finished_seeds[i].query_index, target_seed_length);\n        std::string match_seed = query_seed;\n\n        // Apply edits to the new sequence\n        for(size_t j = 0; j < finished_seeds[i].edits.size(); ++j)\n            match_seed[finished_seeds[i].edits[j].index - finished_seeds[i].query_index] = finished_seeds[i].edits[j].base;\n\n        // Flip the seeds to match the strand of the query\n        if(do_reverse)\n        {\n            query_seed = reverseComplement(query_seed);\n            match_seed = reverseComplement(match_seed);\n        }\n\n        // Extract the prefix of every occurrence of this seed\n        RankedPrefixVector extensions = BWTAlgorithms::extractRankedPrefixes(indices.pBWT, finished_seeds[i].interval);\n\n        // Extend the seeds to the full-length string\n        for(size_t j = 0; j < extensions.size(); ++j)\n        {\n            size_t rank = extensions[j].rank;\n\n            // The second element of the returned pair is\n            // false if the set already contains this rank\n            if(!rank_set.insert(rank).second)\n                continue;\n\n            // Extract the reminder of the read\n            std::string& prefix = extensions[j].prefix;\n            int64_t start_index_of_read = indices.pSSA->lookupLexoRank(rank);\n            std::string suffix = BWTAlgorithms::extractUntilInterval(indices.pBWT, \n                                                                     start_index_of_read, \n                                                                     finished_seeds[i].interval);\n\n            std::string match_sequence = prefix + suffix;\n\n            // Ignore identical matches\n            if(match_sequence == strand_query)\n                continue;\n\n            // Change strands\n            if(do_reverse)\n                match_sequence = reverseComplement(match_sequence);\n\n            // Compute the overlap\n            SequenceOverlap overlap;\n            size_t pos_0 = in_query.find(query_seed);\n            size_t pos_1 = match_sequence.find(match_seed);\n            assert(pos_0 != std::string::npos);\n            assert(pos_1 != std::string::npos);\n\n            if(in_query.find(query_seed, pos_0 + 1) != std::string::npos || \n               match_sequence.find(match_seed, pos_1 + 1) != std::string::npos) {\n                // One of the reads has a second occurrence of the kmer. Use\n                // the slow overlapper.\n                overlap = Overlapper::computeOverlap(in_query, match_sequence);\n            } else {\n                overlap = Overlapper::extendMatch(in_query, match_sequence, pos_0, pos_1, bandwidth);\n            }\n\n            n_candidates += 1;\n            bool bPassedOverlap = overlap.getOverlapLength() >= min_overlap;\n            bool bPassedIdentity = overlap.getPercentIdentity() / 100 >= min_identity;\n\n            if(bPassedOverlap && bPassedIdentity)\n            {\n                //printf(\"Rank\\t%zu\\t%zu\\t%s\\t%.2lf\\t%d\\n\", n_calls,\n                //    rank, match_sequence.c_str(), overlap.getPercentIdentity(), overlap.getOverlapLength());\n                \n                SequenceOverlapPair op;\n                op.sequence[0] = in_query;\n                op.sequence[1] = match_sequence;\n                op.overlap = overlap;\n                op.is_reversed = do_reverse;\n                out_vector.push_back(op);\n                n_output += 1;\n            }                \n        }\n    }\n    t_time += timer.getElapsedCPUTime();\n    \n    if(Verbosity::Instance().getPrintLevel() > 6 && n_calls % 100 == 0)\n        printf(\"[approx seeds] n: %zu candidates: %zu valid: %zu (%.2lf) time: %.2lfs\\n\", \n            n_calls, n_candidates, n_output, (double)n_output / n_candidates, t_time);\n}\n\n//\nSequenceOverlapPairVector KmerOverlaps::approximateMatch(const std::string& query,\n                                                         int min_overlap, \n                                                         double min_identity,\n                                                         int bandwidth, \n                                                         int max_interval,\n                                                         const BWTIndexSet& indices)\n{\n    SequenceOverlapPairVector opv;\n    _approximateSeededMatch(query, min_overlap, min_identity, bandwidth, max_interval, false, indices, opv);\n    _approximateSeededMatch(query, min_overlap, min_identity, bandwidth, max_interval, true, indices, opv);\n    return opv;\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/KmerOverlaps.h",
    "content": "///-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// KmerOverlaps - Overlap computation functions\n// seeded by exact kmer matches\n//\n#ifndef KMER_OVERLAPS_H\n#define KMER_OVERLAPS_H\n\n#include \"multiple_alignment.h\"\n#include \"BWTIndexSet.h\"\n#include \"SampledSuffixArray.h\"\n\n// A pair of sequences and an overlap matching them\nstruct SequenceOverlapPair\n{\n    std::string sequence[2];\n    bool is_reversed;\n    SequenceOverlap overlap;\n\n    static bool sortByOverlapLengthDesc(const SequenceOverlapPair& a, const SequenceOverlapPair& b) { return a.overlap.getOverlapLength() > b.overlap.getOverlapLength(); }\n\n};\ntypedef std::vector<SequenceOverlapPair> SequenceOverlapPairVector;\n\nnamespace KmerOverlaps\n{\n\n// Build a multiple alignment for the query, based on initial exact k-matches \nMultipleAlignment buildMultipleAlignment(const std::string& query, \n                                         size_t k,\n                                         int min_overlap,\n                                         double min_identity,\n                                         int bandwidth,\n                                         const BWTIndexSet& indices);\n\n// Retrieve matches to the query sequence\nSequenceOverlapPairVector retrieveMatches(const std::string& query, \n                                          size_t k,\n                                          int min_overlap,\n                                          double min_identity,\n                                          int bandwidth,\n                                          const BWTIndexSet& indices);\n\nSequenceOverlapPairVector approximateMatch(const std::string& query,\n                                           int min_overlap, \n                                           double min_identity,\n                                           int bandwidth, \n                                           int max_interval,\n                                           const BWTIndexSet& indices);\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/LRAlignment.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// LRAlignment - Collection of algorithms for performing\n// long read matches against an FM-index\n//\n#include \"LRAlignment.h\"\n#include \"QuickBWT.h\"\n#include \"MultiAlignment.h\"\n#include \"StdAlnTools.h\"\n\n//#define BWA_COMPAT_DEBUG 1\n//#define BWA_COMPAT_DEBUG_RESOLVE 1\n\nnamespace LRAlignment\n{\nstatic const int MINUS_INF = -0x3fffffff;\n#define MASK_LEVEL 0.90f\n\n// Initialize the LRCell with default values\nvoid LRCell::initializeDefault()\n{\n    interval.lower = 0;\n    interval.upper = 0;\n    I = MINUS_INF;\n    D = MINUS_INF;\n    G = MINUS_INF;\n\n    parent_cidx = 0;\n    q_len = 0;\n    t_len = 0;\n    parent_idx = -1;\n    u_idx = -1;\n\n    clearChildren();\n}\n\n// Reset the child indices for the cell\nvoid LRCell::clearChildren()\n{\n    children_idx[0] = -1;\n    children_idx[1] = -1;\n    children_idx[2] = -1;\n    children_idx[3] = -1;\n}\n\n// Returns true if any child of the cell is uninitialized\nbool LRCell::hasUninitializedChild() const\n{\n    return children_idx[0] == -1 || children_idx[1] == -1 || children_idx[2] == -1 ||  children_idx[3] == -1;\n}\n\n// Implementation of bwa-sw algorithm.\n// Roughly follows Heng Li's implementation \nvoid bwaswAlignment(const std::string& query, const BWT* pTargetBWT, const SampledSuffixArray* pTargetSSA, const LRParams& params, LRHitVector& outHits)\n{\n    // Construct an FM-index of the query sequence\n    BWT* pQueryBWT = NULL;\n    SuffixArray* pQuerySA = NULL;\n    createQuickBWT(query, pQueryBWT, pQuerySA);\n    \n    // Interval hash table used to mark cells as being duplicate\n    LRHash dupHash;\n\n    // Initialize the hash table of DAWG nodes\n    LRHash dawgHash;\n    initializeDAWGHash(pQueryBWT, dawgHash);\n    \n    // Initialize a stack of elements with a single entry for the root node\n    // of the query DAWG\n    LRStack stack;\n    \n    // High scoring alignments are stored as LRHits in these vectors\n    // positionHitsVector stores up to 2 hits starting at every base of the query sequence\n    // terminalHitsVector stores hits to sequence prefixes \n    LRHitVector positionHitsVector(2*query.size());\n    LRHitVector terminalHitsVector;\n\n    // Each dawg node is added to the pendingVector initially\n    // Once all predecessors of the node have been visited,\n    // the node is moved to the stack\n    LRPendingVector pendingVector;\n    size_t num_pending = 0;\n\n    // Initialize a stack entry for the root node with an empty scoring cell\n    LRStackEntry* pInitial = new LRStackEntry;\n    pInitial->interval.lower = 0;\n    pInitial->interval.upper = pQueryBWT->getBWLen() - 1;\n\n    //\n    LRCell x;\n    x.initializeDefault();\n    x.G = 0;\n    x.interval.lower = 0;\n    x.interval.upper = pTargetBWT->getBWLen() - 1;\n\n    pInitial->cells.push_back(x);\n    stack.push(pInitial);\n\n    // The main loop of the algorithm - traverse the DAWG\n    while(!stack.empty())\n    {\n        LRStackEntry* v = stack.top();\n        stack.pop();\n        \n        size_t old_n = v->cells.size();\n\n        // TODO: bandwidth test and max depth ?\n        \n        // Descend into the children of the current dawg node\n        // If the interval update succeeds, calculate scores between\n        // the child node and all the LRCells of the current node\n        for(int qci = 0; qci < DNA_ALPHABET::size; ++qci)\n        {\n            char query_child_base = DNA_ALPHABET::getBase(qci);\n            BWTInterval child_interval = v->interval;\n            BWTAlgorithms::updateInterval(child_interval, query_child_base, pQueryBWT);\n\n            if(!child_interval.isValid())\n                continue;\n    \n            // Create an new array of cells for the scores between the child node\n            // and all the nodes in the prefix tree\n            LRStackEntry* u = new LRStackEntry;\n            u->interval = child_interval;\n\n            // Loop over the nodes in v\n            for(size_t i = 0; i < v->cells.size(); ++i)\n            {\n                LRCell* p = &v->cells[i];\n\n                if(p->interval.upper == -1)\n                    continue; // duplicate that has been deleted\n                LRCell x; // the cell being calculated\n                LRCell* c[4]; // pointers to cells required to calculate x\n\n                c[0] = &x; \n                x.G = MINUS_INF;\n                x.u_idx = p->u_idx = -1;\n\n                bool add_x_to_u = false;\n                if(p->parent_idx >= 0) \n                {\n                    int upos = v->cells[p->parent_idx].u_idx;\n\n                    // Set pointers to the cell\n                    c[1] = upos >= 0 ? &u->cells[upos] : NULL;\n                    c[2] = p;\n                    c[3] = &v->cells[p->parent_idx];\n\n                    int match_score = qci == p->parent_cidx ? params.alnParams.match : -params.alnParams.mismatch;\n                    int score = fillCells(params, match_score, c);\n\n                    if(score > 0)\n                    {\n                        // this cell has a positive score\n                        // set the x's parent position in u and set the\n                        // parent's child position to x\n                        x.parent_idx = upos;\n                        p->u_idx = u->cells.size(); // x will be added to u in this position\n                        \n                        if(x.parent_idx >= 0)\n                            u->cells[upos].children_idx[p->parent_cidx] = p->u_idx;\n                        add_x_to_u = true;\n                    }\n                }\n                else\n                {\n                    if(p->D > p->G - params.alnParams.gap_open)\n                        x.D = p->D - params.alnParams.gap_ext; // extend gap\n                    else\n                        x.D = p->G - params.alnParams.gap_open_extend; // open a new gap\n\n                    if(x.D > 0)\n                    {\n                        x.G = x.D;\n                        x.I = MINUS_INF;\n                        x.parent_idx = -1;\n                        p->u_idx = u->cells.size();\n                        add_x_to_u = true;\n                    }\n                }\n\n                if(add_x_to_u)\n                {\n                    // set the remaining fields in the current cell\n                    x.clearChildren();\n                    x.parent_cidx = p->parent_cidx;\n                    x.interval = p->interval;\n                    x.q_len = p->q_len + 1;\n                    x.t_len = p->t_len;\n                    u->cells.push_back(x);\n\n                    // TODO: heap heuristics from bwa-sw?\n                }\n\n                // Check if we should descend into another node of the prefix trie of the target\n                if( (x.G > params.alnParams.gap_open_extend /* && heap test */) || i < old_n)\n                {\n                    if(p->hasUninitializedChild())\n                    {\n                        for(int tci = 0; tci < DNA_ALPHABET::size; ++tci)\n                        {\n                            if(p->children_idx[tci] != -1)\n                                continue; // already added\n                            char target_child_base = DNA_ALPHABET::getBase(tci);\n                            BWTInterval target_child_interval = p->interval;\n                            BWTAlgorithms::updateInterval(target_child_interval, target_child_base, pTargetBWT);\n                            if(!target_child_interval.isValid()) // child with this extension base does not exist\n                            {\n                                p->children_idx[tci] = -2;\n                                continue;\n                            }\n\n                            // Create new entry on array v\n                            LRCell y;\n                            y.G = y.I = y.D = MINUS_INF;\n                            y.interval = target_child_interval;\n                            y.parent_cidx = tci;\n                            y.q_len = p->q_len;\n                            y.t_len = p->t_len + 1;\n\n\n                            y.parent_idx = i;\n                            y.clearChildren();\n\n                            p->children_idx[tci] = v->cells.size();\n                            v->cells.push_back(y);\n\n                            p = &v->cells[i]; // p may have been invalidated in the push, update\n                        } // for tcl\n                    } // if has uninitialized\n                } // if X.h\n            } // for all v\n\t\t\n            // Save high-scoring cells as hits\n            if(!u->cells.empty())\n            {\n                saveBestPositionHits(pQuerySA, u, params.alnParams.threshold, positionHitsVector);\n                //saveAllHits(pQuerySA, pTargetSSA, pTargetBWT, u, params.threshold, terminalHitsVector);\n                //saveTerminalHits(pQuerySA, pTargetSSA, pTargetBWT, u, params.threshold, terminalHitsVector);\n            }\n\n            // Update the stack by adding u or pushing it to the pending vector\n            num_pending += updateStack(&stack, u, &pendingVector, &dawgHash, params);\n\n        } // for qci\n        \n        // done with v\n        delete v;\n    } // for all stack\n\n    assert(num_pending == 0);\n\n    // Append the two hits vectors together\n    positionHitsVector.insert(positionHitsVector.end(), terminalHitsVector.begin(), terminalHitsVector.end());\n    terminalHitsVector.clear();\n    resolveDuplicateHits(pTargetBWT, pTargetSSA, positionHitsVector, 2);\n\n    // set the output hits\n    outHits.insert(outHits.end(), positionHitsVector.begin(), positionHitsVector.end());\n\n    delete pQueryBWT;\n    delete pQuerySA;\n}\n\n// Update the stack to contain entry u, after considering any possible merges\n// with StackEntries from the pending vector\nint updateStack(LRStack* pStack, \n                LRStackEntry* u, \n                LRPendingVector* pPendingVector, \n                LRHash* pDawgHash, \n                const LRParams& params)\n{\n    // Find the iterator for u in the dawgHash\n    LRHash dupHash;\n\n    uint64_t key = u->interval.lower << 32 | u->interval.upper;\n    LRHash::iterator hashIter = pDawgHash->find(key);\n    assert(hashIter != pDawgHash->end() && (uint32_t)hashIter->second > 0);\n    --hashIter->second;\n    uint32_t count = (uint32_t)hashIter->second;\n    uint32_t position = hashIter->second >> 32;\n\n    // Check if an entry in the pending array exists for this DAWG node\n    int change = 0;\n    if(position > 0)\n    {\n        LRStackEntry* w = (*pPendingVector)[position - 1];\n\n        // An entry in the pending array has been created for this query substing\n        // Merge u into the interval\n        if(!u->cells.empty())\n        {\n            // Swap so w is the StackEntry wth more cells\n            if(w->cells.size() < u->cells.size())\n            {\n                w = u;\n                u = (*pPendingVector)[position - 1];\n                (*pPendingVector)[position - 1] = w;\n            }\n            mergeStackEntries(w, u);\n        }\n\n        if(count == 0)\n        {\n            // this node in the dawg will not be visited again\n            // move the stack entry from the pending list to the stack\n            removeDuplicateCells(w, dupHash);\n            cutTail(w, params);\n            pStack->push(w);\n            (*pPendingVector)[position - 1] = 0;\n            change -= 1;\n        }\n\n        // u is empty or merged, it is no longer needed\n        delete u;\n\n    }\n    else if(count > 0)\n    {\n        // Create an entry in the pending queue for the current node of the DAWG\n        if(!u->cells.empty())\n        {\n            pPendingVector->push_back(u);\n            change += 1;\n\n            // Save the position of u in the pending vector into the hash\n            // all subsequent traversals that visit this node of the dawg\n            // will get merged into this position. index + 1 is stored\n            // so that position == 0 indicates the empty case\n            hashIter->second = (uint64_t)pPendingVector->size() << 32 | count;\n        }\n        else\n        {\n            // u has no cells to calculate, discard it\n            delete u;\n        }\n    }\n    else // count == 0, pos == 0\n    {\n        // This substring is unique, push u straight onto the stack\n        cutTail(u, params);\n        pStack->push(u);\n    }\n\n    return change;\n}\n\n// Process a list of cells and save a best hit for each position\nvoid saveBestPositionHits(const SuffixArray* pQuerySA, LRStackEntry* u, int threshold, LRHitVector& hits)\n{\n    for(size_t i = 0; i < u->cells.size(); ++i)\n    {\n        LRCell* p = &u->cells[i];\n        if(p->G < threshold)\n            continue;\n        \n        for(int64_t k = u->interval.lower; k <= u->interval.upper; ++k)\n        {\n            // Calculate the beginning of the alignment using the suffix array\n            // of the query\n            SAElem e = pQuerySA->get(k);\n            int beg = e.getPos();\n            int end = beg + p->q_len;\n\n            // Save the best hit for alignments starting at beg in positions hits[2*beg]\n            // and the second best hit in hits[2*beg+1]\n            LRHit* q = NULL;\n            if(p->G > hits[beg*2].G)\n            {\n                // move the previous best to the second best slot\n                hits[beg*2+1] = hits[beg*2];\n                q = &hits[2*beg];\n            }\n            else if(p->G > hits[beg*2+1].G)\n            {\n                // the current hit is the second best at this position\n                q = &hits[2*beg+1];\n            }\n\n            if(q)\n            {\n                q->interval = p->interval;\n                q->length = p->t_len;\n                q->G = p->G;\n                q->q_start = beg;\n                q->q_end = end;\n                q->flag = 0;\n                q->num_seeds = 0;\n            }\n        }\n    }\n\n}\n\n\n// Process a list of cells and save alignment hits meeting the threshold\nvoid saveAllHits(const SuffixArray* pQuerySA, const SampledSuffixArray* /*pTargetSSA*/,\n                 const BWT* /*pTargetBWT*/, LRStackEntry* u, \n                 int threshold, LRHitVector& hits)\n{\n    for(size_t i = 0; i < u->cells.size(); ++i)\n    {\n        LRCell* p = &u->cells[i];\n        if(p->G < threshold)\n            continue;\n        \n        for(int64_t k = u->interval.lower; k <= u->interval.upper; ++k)\n        {\n            // Calculate the beginning of the alignment using the suffix array\n            // of the query\n            SAElem e = pQuerySA->get(k);\n            int beg = e.getPos();\n            int end = beg + p->q_len;\n\n            // Save the best hit for alignments starting at beg in positions hits[2*beg]\n            // and the second best hit in hits[2*beg+1]\n            LRHit q;\n            q.interval = p->interval;\n            q.length = p->t_len;\n            q.G = p->G;\n            q.q_start = beg;\n            q.q_end = end;\n            q.flag = 0;\n            q.num_seeds = 0;\n            hits.push_back(q);\n        }\n    }\n}\n\n// Process all the cells in the stack entry and save hits to cells that represent\n// terminal intervals (those intervals containing the start of some reads)\nvoid saveTerminalHits(const SuffixArray* pQuerySA, const SampledSuffixArray* /*pTargetSSA*/, \n                      const BWT* pTargetBWT, LRStackEntry* u, \n                      int threshold, LRHitVector& hits)\n{\n    for(size_t i = 0; i < u->cells.size(); ++i)\n    {\n        LRCell* p = &u->cells[i];\n        if(p->G < threshold)\n            continue;\n        \n        // If the target bwt interval contains a '$' symbol, push the hit\n        AlphaCount64 extCount = BWTAlgorithms::getExtCount(p->interval, pTargetBWT);\n        if(extCount.get('$') > 0)\n        {\n            // Create a hit for every beginning position in the query\n            for(int64_t k = u->interval.lower; k <= u->interval.upper; ++k)\n            {\n                // Calculate the beginning of the alignment using the suffix array\n                // of the query\n                SAElem e = pQuerySA->get(k);\n                int beg = e.getPos();\n                int end = beg + p->q_len;\n\n                LRHit q;\n                q.interval = p->interval;\n                q.length = p->t_len;\n                q.G = p->G;\n                q.q_start = beg;\n                q.q_end = end;\n                q.flag = 0;\n                q.num_seeds = 0;\n                hits.push_back(q);\n            }\n        }\n    }\n}\n\n// Initialize the hash table of DAWG nodes by inserting an element\n// into the hash table for each distinct substring of the query\nvoid initializeDAWGHash(BWT* pQueryBWT, LRHash& hashTable)\n{\n    std::stack<uint64_t> stack;\n    stack.push(pQueryBWT->getBWLen() - 1);\n    while(!stack.empty())\n    {\n        uint64_t x = stack.top();\n        stack.pop();\n\n        BWTInterval interval(x >> 32, (uint32_t)x);\n        AlphaCount64 lower = pQueryBWT->getFullOcc(interval.lower - 1);\n        AlphaCount64 upper = pQueryBWT->getFullOcc(interval.upper);\n        for(int ci = 0; ci < DNA_ALPHABET::size; ++ci)\n        {\n            char b = DNA_ALPHABET::getBase(ci);    \n            size_t pb = pQueryBWT->getPC(b);\n            interval.lower = pb + lower.get(b);\n            interval.upper = pb + upper.get(b) - 1;\n\n            if(!interval.isValid())\n                continue;\n            x = (uint64_t)interval.lower << 32 | interval.upper;\n\n            // insert (or update) this key in the hash\n            LRHash::iterator iter = hashTable.find(x);\n            if(iter == hashTable.end())\n            {\n                hashTable.insert(std::make_pair(x,1));\n                stack.push(x);\n            }\n            else\n            {\n                iter->second++;\n            }\n        }\n    }\n}\n\n// Merge two stack entries which represent the same node in the DAWG\nvoid mergeStackEntries(LRStackEntry* u, LRStackEntry* v)\n{\n    // Update parent index and child entries for v cell's to reflect\n    // their new positions at the end of array of u\n    size_t num_u = u->cells.size();\n\tfor (size_t i = 0; i != v->cells.size(); ++i) \n    {\n        LRCell* p = &v->cells[i];\n\t\tif(p->parent_idx >= 0)\n            p->parent_idx += num_u;\n        for(size_t j = 0; j < 4; ++j)\n    \t\tif (p->children_idx[j] >= 0) \n                p->children_idx[j] += num_u;\n\t}\n    u->cells.insert(u->cells.end(), v->cells.begin(), v->cells.end());\n}\n\n// Remove duplicated cells from the stack entry\nvoid removeDuplicateCells(LRStackEntry* u, LRHash& hash)\n{\n    hash.clear();\n    int n = 0;\n    for(size_t i = 0; i < u->cells.size(); ++i)\n    {\n        int j = -1; // element to be deleted\n        LRCell* p = &u->cells[i];\n\n        if(p->interval.upper == -1)\n            continue; // already deleted\n\n        uint64_t key = p->interval.lower << 32 | p->interval.upper;\n        LRHash::iterator iter = hash.find(key);\n        if(iter != hash.end())\n        {\n            // Check if the score of p is greater than the stored cell\n            // with the same key. Set j to be the index of u with the lower\n            // score.\n            uint32_t currScore = iter->second;\n            if((int)currScore >= p->G)\n            {\n                j = i;\n            }\n            else\n            {\n                j = iter->second >> 32;\n                iter->second = i << 32 | p->G;\n            }\n        }\n        else\n        {\n            // initialize hash for cell i\n            hash[key] = i << 32 | p->G;\n        }\n\n        if(j >= 0)\n        {\n#ifdef BWA_COMPAT_DEBUG\n            printf(\"marking p [%zu %zu] as deleted cidx: %d [DUP]\\n\", p->interval.lower, p->interval.upper, p->parent_cidx);\n#endif\n            p = &u->cells[j];\n            p->interval.lower = -1;\n            p->interval.upper = -1;\n            p->G = 0;\n            if(p->parent_idx >= 0)\n                u->cells[p->parent_idx].children_idx[p->parent_cidx] = -3;\n            n += 1;\n        }\n    }\n#ifdef BWA_COMPAT_DEBUG\n    printf(\"removed %d duplicate entries\\n\", n);\n#endif\n}\n\n// Fill the values of C[0] depending on the values in the other 3 cells\nint fillCells(const LRParams& params, int match_score, LRCell* c[4])\n{\n\tint G = c[3] ? c[3]->G + match_score : MINUS_INF;\n\tif(c[1]) \n    {\n\t\tif(c[1]->I > c[1]->G - params.alnParams.gap_open)\n            c[0]->I = c[1]->I - params.alnParams.gap_ext; // extend gap\n        else\n            c[0]->I = c[1]->G - params.alnParams.gap_open_extend; // open new gap\n\t\tif (c[0]->I > G)\n            G = c[0]->I; // new best score\n\t} \n    else\n    {\n        c[0]->I = MINUS_INF;\n    }\n\n\tif(c[2])\n    {\n\t\tif(c[2]->D > c[2]->G - params.alnParams.gap_open)\n            c[0]->D = c[2]->D - params.alnParams.gap_ext; // extend gap\n        else\n            c[0]->D = c[2]->G - params.alnParams.gap_open_extend; // open new gap\n\n\t\tif (c[0]->D > G) \n            G = c[0]->D; // new best score\n\t} \n    else\n    {\n        c[0]->D = MINUS_INF;\n    }\n    \n\treturn(c[0]->G = G);\n}\n\n// Remove duplicate hits to the same target sequence from the hits vector\nint resolveDuplicateHitsByID(const BWT* pTargetBWT, const SampledSuffixArray* pTargetSSA, LRHitVector& hits, int /*IS*/)\n{\n    if(hits.empty())\n        return 0;\n    assert(pTargetBWT != NULL);\n    assert(pTargetSSA != NULL);\n\n    // Convert each hit interval to target coordinates\n    LRHitVector newHits;\n    for(size_t i = 0; i < hits.size(); ++i)\n    {\n        LRHit* p = &hits[i];\n#ifdef BWA_COMPAT_DEBUG_RESOLVE\n        printf(\"Total hits: %zu\\n\", hits.size());\n        printf(\"Reallocating hits array to size: %d\\n\", n);\n#endif\n    \n        if(!p->interval.isValid() || p->G <= 0)\n            continue;\n\n        for(int64_t k = p->interval.lower; k <= p->interval.upper; ++k)\n        {\n            LRHit tmp = *p;\n            SAElem elem = pTargetSSA->calcSA(k, pTargetBWT);\n            tmp.targetID = elem.getID();\n            tmp.t_start = elem.getPos();\n            tmp.interval.lower = 0;\n            tmp.interval.upper = -1;\n#ifdef BWA_COMPAT_DEBUG_RESOLVE\n            printf(\"Created new hit at position (%d, %d)\\n\", tmp.targetID, tmp.position);\n#endif\n            newHits.push_back(tmp);\n        }\n    }\n    \n    // Swap the new hits structure with the old hits\n    hits.swap(newHits);\n\n    // sort hits by targetID, then score\n    std::sort(hits.begin(), hits.end(), LRHit::compareIDandG);\n    \n    // Loop over the hits, zeroing all but the highest scoring hit for each target\n    uint64_t prevID = std::numeric_limits<uint64_t>::max();\n    size_t new_n = 0;\n    for(size_t i = 0; i < hits.size(); ++i)\n    {\n//        std::cout << \"ID: \" << hits[i].targetID << \" score: \" << hits[i].G << \"\\n\";\n        if(prevID == hits[i].targetID)\n            hits[i].G = 0;\n        else\n            new_n += 1;\n        prevID = hits[i].targetID;\n    }\n\n    std::sort(hits.begin(), hits.end(), LRHit::compareG);\n    hits.resize(new_n);\n    std::cout << \"FINAL HITS: \" << new_n << \"\\n\";\n#ifdef BWA_COMPAT_DEBUG_RESOLVE\n    printf(\"Final number of hits after duplicate removal: %zu\\n\", hits.size());\n#endif\n    return hits.size();\n}\n// Remove duplicated hits from the hits vector\nint resolveDuplicateHits(const BWT* pTargetBWT, const SampledSuffixArray* pTargetSSA, LRHitVector& hits, int IS)\n{\n    if(hits.empty())\n        return 0;\n    assert(pTargetBWT != NULL);\n\n    if(pTargetBWT != NULL && pTargetSSA != NULL)\n    {\n        // Convert each hit to target coordinates\n        int old_n = hits.size();\n        int n = 0;\n        \n        // Count the number of valid hits \n        LRHitVector newHits;\n        for(size_t i = 0; i < hits.size(); ++i)\n        {\n            LRHit* p = &hits[i];\n            if(p->interval.isValid() && p->interval.size() <= IS)\n                n += p->interval.size();\n            else if(!p->interval.isValid()) // bwa compatibility hack\n                n += 1; \n            else if(p->G > 0)\n                n += 1;\n        }\n#ifdef BWA_COMPAT_DEBUG_RESOLVE\n        printf(\"Total hits: %zu\\n\", hits.size());\n        printf(\"Reallocating hits array to size: %d\\n\", n);\n#endif\n        newHits.resize(n);\n    \n        // Populate the newHits vector with the hits to keep\n        int j = 0;\n        for(int i = 0; i < old_n; ++i)\n        {\n            LRHit* p = &hits[i];\n            if(p->interval.isValid() && p->interval.size() <= IS)\n            {\n                for(int64_t k = p->interval.lower; k <= p->interval.upper; ++k)\n                {\n                    newHits[j] = *p;\n                    SAElem elem = pTargetSSA->calcSA(k, pTargetBWT);\n                    newHits[j].targetID = elem.getID();\n                    newHits[j].t_start = elem.getPos();\n                    newHits[j].interval.lower = 0;\n                    newHits[j].interval.upper = -1;\n#ifdef BWA_COMPAT_DEBUG_RESOLVE\n                    printf(\"Created new hit at position (%d, %d)\\n\", newHits[j].targetID, newHits[j].position);\n#endif\n                    ++j;\n                }\n            }\n            else if(p->G > 0)\n            {\n                newHits[j] = *p;\n                SAElem elem = pTargetSSA->calcSA(p->interval.lower, pTargetBWT);\n                newHits[j].targetID = elem.getID();\n                newHits[j].t_start = elem.getPos();\n                newHits[j].interval.lower = 0;\n                newHits[j].interval.upper = -1;\n                newHits[j].flag |= 1;\n#ifdef BWA_COMPAT_DEBUG_RESOLVE\n                printf(\"Created new hit at position (%d, %d)\\n\", newHits[j].targetID, newHits[j].position);\n#endif\n                ++j;\n            }\n        }\n\n        // Swap the new hits structure with the old hits\n        hits.swap(newHits);\n    }\n\n    // sort hits by score\n    std::sort(hits.begin(), hits.end(), LRHit::compareG);\n    \n    int i,j;\n    // Remove hits with significant overlaps on the query or target sequences\n    for(i = 1; i < (int)hits.size(); ++i)\n    {\n        LRHit* p = &hits[i];\n        if(p->G == 0)\n            break;\n        for(j = 0; j < i; ++j)\n        {\n            LRHit* q = &hits[j];\n            bool compatible = true;\n\n            // hit q has already been removed\n            if(q->G == 0)\n                continue;\n\n            // if the hits are to different targets they can't overlap\n            if(p->targetID != q->targetID)\n                continue;\n\n            if(p->interval.upper == -1 && q->interval.upper == -1)\n            {\n                // Calculate the overlap length on the query\n                int qol = (p->q_end < q->q_end? p->q_end : q->q_end) - (p->q_start > q->q_start? p->q_start : q->q_start);\n                if(qol < 0)\n                    qol = 0;\n\n                if((float)qol / (p->q_end - p->q_start) > MASK_LEVEL || (float)qol / (q->q_end - q->q_start) > MASK_LEVEL) \n                {\n                    int64_t tol = 0;\n                    if(p->t_start + p->length < q->t_start + q->length)\n                        tol = p->t_start + p->length;\n                    else\n                        tol = q->t_start + q->length;\n\n                    if(p->t_start > q->t_start)\n                        tol -= p->t_start;\n                    else\n                        tol -= q->t_start;\n                    \n\t\t\t\t\tif((double)tol / p->length > MASK_LEVEL || (double)tol / q->length > MASK_LEVEL)\n\t\t\t\t\t\tcompatible = false;\n\n#ifdef BWA_COMPAT_DEBUG_RESOLVE\n                    printf(\"    idx = (%d,%d) id=(%d,%d) G=(%d,%d) qol: %d tol: %zu compat: %d\\n\", \n                            i,j, (int)p->targetID, (int)q->targetID, p->G, q->G, qol, tol, compatible);\n#endif\n                    if(!compatible)\n                    {\n                        p->G = 0;\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n    int new_n = i;\n\n    for(i = j = 0; i < new_n; ++i)\n    {\n        if(hits[i].G == 0)\n            continue;\n        if(i != j)\n            hits[j++] = hits[i];\n        else\n            ++j;\n    }\n    hits.resize(j);\n#ifdef BWA_COMPAT_DEBUG_RESOLVE\n    printf(\"Final number of hits after duplicate removal: %zu\\n\", hits.size());\n#endif\n    return hits.size();\n}\n\n// Remove cells from a stack entry based on some criteria\nvoid cutTail(LRStackEntry* u, const LRParams& params)\n{\n    switch(params.cutTailAlgorithm)\n    {\n        case LRCA_Z_BEST:\n            cutTailByZBest(u, params);\n            break;\n        case LRCA_Z_BEST_STRATA:\n            cutTailByStratifiedZBest(u, params);\n            break;\n        case LRCA_SCORE_FRAC:\n            cutTailByScorePercent(u, params);\n            break;\n        case LRCA_NONE:\n            return;\n        default:\n            assert(false);\n    }\n}\n\n// Remove cells from a stack entry (query dawg node) by their score\n// as expressed as a fraction of the maximum possible score for the\n// query\nvoid cutTailByScorePercent(LRStackEntry* u, const LRParams& params)\n{\n    //printf(\"cutTail starting split score: %2.lf\\n\", split);\n    for(size_t i = 0; i < u->cells.size(); ++i)\n    {\n        LRCell* p = &u->cells[i];\n        double cellScore = (double)p->G * 100.0f / (p->q_len * 1);\n\n        if(cellScore < params.percentCutoff)\n        {\n#ifdef BWA_COMPAT_DEBUG\n            if(p->interval.upper > -1)\n                printf(\"marking p [%d %d] as deleted [CT]\\n\", (int)p->interval.lower, (int)p->interval.upper);\n#endif\n            //printf(\"cutTail cutting cell with qlen: %d %d %2.1lf\\n\", p->q_len, p->G, cellScore);\n            p->interval.lower = 0;\n            p->interval.upper = -1;\n            p->G = 0;\n            if(p->parent_idx >= 0)\n                u->cells[p->parent_idx].children_idx[p->parent_cidx] = -1;\n        }\n//        else\n//            printf(\"cutTail keeping cell with qlen: %d %d %2.1lf\\n\", p->q_len, p->G, cellScore);\n\n    }\n}\n\n// Remove cells from a stack entry, only keeping the top zBest scoring nodes\nvoid cutTailByZBest(LRStackEntry* u, const LRParams& params)\n{\n    assert(params.zBest > 0);\n    // Save an int vector of scores\n    IntVector scores;\n    for(size_t i = 0; i < u->cells.size(); ++i)\n    {\n        LRCell* p = &u->cells[i];\n        if(p->interval.upper != -1 && p->G > 0)\n            scores.push_back(-p->G);\n    }\n\n    if((int)scores.size() <= params.zBest)\n        return;\n\n    // Partially sort the scores to select the T-th best score\n    std::nth_element(scores.begin(), scores.begin() + params.zBest, scores.end());\n    double split = -scores[params.zBest];\n\n#ifdef BWA_COMPAT_DEBUG\n    printf(\"[CT] split score: %2.lf\\n\", split);\n#endif\n\n    int n = 0;\n    //printf(\"cutTail starting split score: %2.lf\\n\", split);\n    for(size_t i = 0; i < u->cells.size(); ++i)\n    {\n        LRCell* p = &u->cells[i];\n        if(p->G == split)\n            ++n;\n        if(p->G < split || (p->G == split && n >= params.zBest))\n        {\n#ifdef BWA_COMPAT_DEBUG\n            if(p->interval.upper > -1)\n                printf(\"marking p [%d %d] as deleted [CT]\\n\", (int)p->interval.lower, (int)p->interval.upper);\n#endif\n            //printf(\"cutTail cutting cell with qlen: %d %d %2.1lf\\n\", p->q_len, p->G, cellScore);\n            p->interval.lower = 0;\n            p->interval.upper = -1;\n            p->G = 0;\n            if(p->parent_idx >= 0)\n                u->cells[p->parent_idx].children_idx[p->parent_cidx] = -1;\n        }\n        /*else\n            printf(\"cutTail keeping cell with qlen: %d %d %2.1lf\\n\", p->q_len, p->G, cellScore);\n        */\n\n    }\n}\n\n// Remove cells from a stack entry, only keeping the top zBest scoring nodes for each query length\nvoid cutTailByStratifiedZBest(LRStackEntry* u, const LRParams& params)\n{\n    assert(params.zBest > 0);\n    if(u->cells.empty())\n        return;\n\n    // Calculate the range of query lengths\n    int minQ = std::numeric_limits<int>::max();\n    int maxQ = 0;\n    for(size_t i = 0; i < u->cells.size(); ++i)\n    {\n        LRCell* p = &u->cells[i];\n        if(p->q_len < minQ)\n            minQ = p->q_len;\n        if(p->q_len > maxQ)\n            maxQ = p->q_len;\n    }\n\n    // Calculate cut points for each strata\n    int span = maxQ - minQ + 1;\n    assert(span > 0);\n\n    //\n    std::vector<IntVector> scores(span);\n    IntVector cutoffs(span);\n    IntVector counts(span);\n\n    for(size_t i = 0; i < u->cells.size(); ++i)\n    {\n        LRCell* p = &u->cells[i];\n        int strata = p->q_len - minQ;\n        assert(strata >= 0 && strata < (int)scores.size());\n\n        if(p->interval.upper != -1 && p->G > 0)\n            scores[strata].push_back(-p->G);\n    }\n\n    // Perform a partial sort of each strata and determine cutoff points\n    for(int i = 0; i < span; ++i)\n    {\n        if((int)scores[i].size() <= params.zBest)\n        {\n            cutoffs[i] = 0; // keep all positively-scored nodes\n            continue;\n        }\n\n        // Partially sort the scores to select the T-th best score\n        std::sort(scores[i].begin(), scores[i].end());\n        cutoffs[i] = -scores[i][params.zBest];\n    }\n\n#ifdef BWA_COMPAT_DEBUG\n    printf(\"[CT] split score: %2.lf\\n\", split);\n#endif\n\n    //printf(\"cutTail starting split score: %2.lf\\n\", split);\n    for(size_t i = 0; i < u->cells.size(); ++i)\n    {\n        LRCell* p = &u->cells[i];\n        int strata = p->q_len - minQ;\n        int c = cutoffs[strata];\n\n        if(p->G == c)\n            ++counts[strata];\n        if(p->G < c || (p->G == c && counts[strata] >= params.zBest))\n        {\n#ifdef BWA_COMPAT_DEBUG\n            if(p->interval.upper > -1)\n                printf(\"marking p [%d %d] as deleted [CT]\\n\", (int)p->interval.lower, (int)p->interval.upper);\n#endif\n            //printf(\"cutTail cutting cell with qlen: %d %d %2.1lf\\n\", p->q_len, p->G, cellScore);\n            p->interval.lower = 0;\n            p->interval.upper = -1;\n            p->G = 0;\n            if(p->parent_idx >= 0)\n                u->cells[p->parent_idx].children_idx[p->parent_cidx] = -1;\n        }\n        /*else\n            printf(\"cutTail keeping cell with qlen: %d %d %2.1lf\\n\", p->q_len, p->G, cellScore);\n        */\n\n    }\n}\n\n\n// Construct a multiple alignment from a vector of hits\nMultiAlignment convertHitsToMultiAlignment(const std::string& query, \n                                           const BWT* pTargetBWT, \n                                           const SampledSuffixArray* /*pTargetSSA*/,\n                                           const LRParams& params,\n                                           const LRHitVector& hits)\n{\n    // Set up stdaln data structures\n\tsize_t max_target = StdAlnTools::calculateMaxTargetLength(query.size(), params.alnParams);\n\n    path_t* path = (path_t*)calloc(max_target + query.size(), sizeof(path_t));\n    \n    AlnParam par;\n    int matrix[25];\n    StdAlnTools::setAlnParam(par, matrix, params.alnParams);\n\n    MAlignDataVector mAlignVec;\n    uint8_t* pQueryT = StdAlnTools::createPacked(query);\n\n    for(size_t i = 0; i < hits.size(); ++i)\n    {\n        LRHit tempHit = hits[i];\n        assert(tempHit.targetID != (uint64_t)-1);\n        std::string target = BWTAlgorithms::extractString(pTargetBWT, tempHit.targetID);\n        uint8_t* pTargetT = StdAlnTools::createPacked(target);\n\n        //extendHitFullLength(tempHit, pQueryT, pTargetT, query.size(), target.size(), &par);\n\n        int q_start_pos, q_end_pos, t_start_pos, t_end_pos;\n        q_start_pos = tempHit.q_start;\n        q_end_pos = tempHit.q_end; // exclusive\n        t_start_pos = tempHit.t_start;\n        t_end_pos = t_start_pos + tempHit.length; // exclusive\n        \n        // Get pointers to the substrings of interest\n        int ql = q_end_pos - q_start_pos;\n        uint8_t* pQuerySub = pQueryT + q_start_pos; \n        \n        int tl = t_end_pos - t_start_pos;\n        uint8_t* pTargetSub = pTargetT + t_start_pos;\n        \n        int path_len = 0;\n\t\t/*int score =*/ aln_global_core(pTargetSub, tl, pQuerySub, ql, &par, path, &path_len);\n        int cigarLen = 0;\n\t\tuint32_t* pCigar = aln_path2cigar32(path, path_len, &cigarLen);\n        \n        //\n        MAlignData maData;\n        maData.str = target.substr(t_start_pos, t_end_pos - t_start_pos);\n        maData.position = q_start_pos;\n\n        // Add initial padding to cigar\n        maData.expandedCigar.append(maData.position, 'S');\n        \n        // Add alignment symbols\n        for (int j = 0; j != cigarLen; ++j)\n            maData.expandedCigar.append(pCigar[j]>>4, \"MID\"[pCigar[j]&0xf]);\n\n        /*        \n        printf(\"AlignmentDP (%zu)\\n\", hits[i].targetID);\n        printf(\"Coords: q[%d, %d] t[%d, %d]\\n\", q_start_pos, q_end_pos, t_start_pos, t_end_pos);\n        printf(\"C: %s\\n\", maData.expandedCigar.c_str());\n        */\n        mAlignVec.push_back(maData);\n\n        // Cleanup\n        delete [] pTargetT;\n        free(pCigar);\n    }\n\n    // Cleanup\n    free(path);\n    delete [] pQueryT;\n\n    return MultiAlignment(query, mAlignVec);\n}\n\n// Attempt to extend a hit to the left and right using aln_extend_core\n// from stdaln\nvoid extendHitFullLength(LRHit& hit, uint8_t* pQueryPacked, uint8_t* pTargetPacked, \n                         int q_length, int t_length, AlnParam* pStdAlnPar)\n{\n    int q_start = hit.q_start;\n    int q_end = hit.q_end; // exclusive\n    int t_start = hit.t_start;\n    int t_end = t_start + hit.length; // exclusive\n\n    // Attempt left-extension\n    if(t_start != 0 && q_start != 0)\n    {\n        int q_diff = q_start;\n        int t_diff = t_start;\n        int d = std::min(q_diff, t_diff);\n        q_start -= d;\n        t_start -= d;\n    }\n\n    // Attempt right-extension\n    if(q_end < q_length && t_end < t_length)\n    {\n        // extension match lengths\n        int tel = t_length - t_start;\n        int qel = q_length - q_start;\n        uint8_t* pTargetPackedSub = pTargetPacked + t_start;\n        uint8_t* pQueryPackedSub = pQueryPacked + q_start;\n        path_t path;\n        int score = aln_extend_core(pTargetPackedSub, tel, pQueryPackedSub, qel, pStdAlnPar, &path, 0, hit.G, NULL);\n        if(score > hit.G)\n        {\n            hit.G = score;\n            hit.length = path.i;\n            hit.q_end = path.j + hit.q_start;\n        }\n    }\n}\n\n\n\n};\n"
  },
  {
    "path": "src/SGA/Algorithm/LRAlignment.h",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// LRAlignment - Collection of algorithms for performing\n// long read matches against an FM-index\n//\n#ifndef LRALIGNMENT_H\n#define LRALIGNMENT_H\n\n#include \"BWT.h\"\n#include \"SampledSuffixArray.h\"\n#include \"BWTAlgorithms.h\"\n#include \"HashMap.h\"\n#include \"MultiAlignment.h\"\n#include \"StdAlnTools.h\"\n#include \"stdaln.h\"\n#include <stack>\n\nnamespace LRAlignment\n{\n\n// Enum of identifiers for cell-filtering heuristics\nenum CutAlgorithm\n{\n    LRCA_DEFAULT,\n    LRCA_Z_BEST,\n    LRCA_Z_BEST_STRATA,\n    LRCA_SCORE_FRAC,\n    LRCA_NONE\n};\n\n// Parameters object\nstruct LRParams\n{\n    LRParams() { setDefaults(); }\n\n    void setDefaults()\n    {\n        alnParams.setDefaults();\n        zBest = 20;\n        percentCutoff = 0.90f;\n        cutTailAlgorithm = LRCA_Z_BEST;\n    }\n\n    //\n    void setPacBio()\n    {\n        setDefaults();\n        alnParams.setPacBio();\n    }\n\n    GlobalAlnParams alnParams;\n\n    // Cell filtering heuristics\n    int zBest;\n    double percentCutoff;\n    CutAlgorithm cutTailAlgorithm;\n};\n\n// Structure holding an alignment between a query sequence and a BWT of a collection of sequences\nstruct LRHit\n{\n    LRHit() : interval(0,-1), flag(0), num_seeds(0), targetID(-1), t_start(-1), length(0), G(0), q_start(0), q_end(0) {}\n    BWTInterval interval;\n\n    uint32_t flag;\n    uint32_t num_seeds;\n\n    uint64_t targetID; // ID of target sequence\n    int t_start; // alignment start position on target\n    int length; // length of the target alignment\n    int G;\n    int q_start; // alignment start on query\n    int q_end; // alignment end (exclusive) on query\n\n    static bool compareG(const LRHit& a, const LRHit& b) { return a.G > b.G; }\n    static bool compareIDandG(const LRHit& a, const LRHit& b) \n    { \n        if(a.targetID == b.targetID)\n            return a.G > b.G;\n        else\n            return a.targetID < b.targetID;\n    }\n};\ntypedef std::vector<LRHit> LRHitVector;\n\n// Structure holding the score between a node of the prefix DAWG of the query\n// and the prefix trie of the target\nstruct LRCell\n{\n    // Functions\n    void initializeDefault();\n    void clearChildren();\n    bool hasUninitializedChild() const;\n\n    // Data Members\n    \n    // interval on the target bwt\n    BWTInterval interval;\n\n    // scores\n    int I;\n    int D;\n    int G;\n\n    // Character code from parent\n    uint8_t parent_cidx;\n\n    // Query and target lengths\n    int q_len;\n    int t_len;\n\n    // Index of the parent in cell array of the stack entry\n    int parent_idx;\n\n    // Index of this cell in the cell array\n    int u_idx;\n\n    // Indices of the children in the cell array\n    int children_idx[4];\n};\ntypedef std::vector<LRCell> LRCellVector;\n\n//\ntypedef HashMap<uint64_t, uint64_t> LRHash;\n\n// A stack entry holds the an interval into the query BWT\n// and an array of cells with the scores for that interval\nstruct LRStackEntry\n{\n    BWTInterval interval;\n    LRCellVector cells;\n};\n\n//\ntypedef std::stack<LRStackEntry*> LRStack;\ntypedef std::vector<LRStackEntry*> LRPendingVector;\n\n// Core alignment function - align the sequence query \n// against all sequences in pTargetBWT\nvoid bwaswAlignment(const std::string& query, \n                    const BWT* pTargetBWT, \n                    const SampledSuffixArray* pTargetSSA,\n                    const LRParams& params,\n                    LRHitVector& outHits);\n\n//\nMultiAlignment convertHitsToMultiAlignment(const std::string& query, \n                                           const BWT* pTargetBWT, \n                                           const SampledSuffixArray* pTargetSSA,\n                                           const LRParams& params,\n                                           const LRHitVector& hits);\n\n//\n// Helper functions\n//\n\n// Initialize a hash table of BWT intervals representing\n// the nodes in a DAWG\nvoid initializeDAWGHash(BWT* pQueryBWT, LRHash& dawgHash);\n\n// Merge the cells of the two stack entries\nvoid mergeStackEntries(LRStackEntry* u, LRStackEntry* v);\n\n// Update the given LRStack to contain the new StackEntry after\n// performing any necessary merges with pending Stacks\nint updateStack(LRStack* pStack, \n                LRStackEntry* u, \n                LRPendingVector* pPendingVector, \n                LRHash* pDawgHash, \n                const LRParams& params);\n\n// Cull duplicated cells in the given stack entry\nvoid removeDuplicateCells(LRStackEntry* u, LRHash& hash);\n\n// Filter duplicated hits from hitsVector using their position on the query sequence\nint resolveDuplicateHits(const BWT* pTargetBWT, \n                         const SampledSuffixArray* pTargetSSA, \n                         LRHitVector& hits, \n                         int IS);\n\n// Filter hits out of the hits vector using their ID\n// At most 1 hit per target sequence is kept\nint resolveDuplicateHitsByID(const BWT* pTargetBWT, \n                             const SampledSuffixArray* pTargetSSA, \n                             LRHitVector& hits, \n                             int IS);\n\n// Save the best hits at each position\nvoid saveBestPositionHits(const SuffixArray* pQuerySA, \n                          LRStackEntry* u, \n                          int threshold, \n                          LRHitVector& hits);\n\n\n// add hits to the vector for cells that score above threshold\nvoid saveAllHits(const SuffixArray* pQuerySA, \n                 const SampledSuffixArray* pTargetSSA, \n                 const BWT* pTargetBWT, \n                 LRStackEntry* u, \n                 int threshold, \n                 LRHitVector& hits);\n\n// save hits to cells that contain intervals that represent prefixes of reads\nvoid saveTerminalHits(const SuffixArray* pQuerySA, \n                      const SampledSuffixArray* pTargetSSA, \n                      const BWT* pTargetBWT, \n                      LRStackEntry* u, \n                      int threshold, \n                      LRHitVector& hits);\n\n// Using the cell points in c, calculate scores for cell c[0]\nint fillCells(const LRParams& params, int match_score, LRCell* c[4]);\n\n// Functions to heuristically remove low-scoring cells\nvoid cutTail(LRStackEntry* u, const LRParams& params);\nvoid cutTailByScorePercent(LRStackEntry* u, const LRParams& params);\nvoid cutTailByZBest(LRStackEntry* u, const LRParams& params);\nvoid cutTailByStratifiedZBest(LRStackEntry* u, const LRParams& params);\n\n// Attempt to extend a hit coordinate to a full-length match\nvoid extendHitFullLength(LRHit& hit, uint8_t* pQueryPacked, uint8_t* pTargetPacked, \n                         int query_length, int target_length, AlnParam* pStdAlnPar);\n\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/Makefile.am",
    "content": "noinst_LIBRARIES = libalgorithm.a\n\nlibalgorithm_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/StringGraph \\\n\t-I$(top_srcdir)/src/SGA/SQG \\\n\t-I$(top_srcdir)/src/SGA/SuffixTools \\\n\t-I$(top_srcdir)/SeqLib\n\nlibalgorithm_a_SOURCES = \\\n        OverlapAlgorithm.h OverlapAlgorithm.cpp \\\n\t\tSearchSeed.h SearchSeed.cpp \\\n\t\tOverlapBlock.h OverlapBlock.cpp \\\n\t\tSearchHistory.h SearchHistory.cpp \\\n##        ErrorCorrectProcess.h ErrorCorrectProcess.cpp \\\n##        QCProcess.h QCProcess.cpp \\\n        OverlapTools.h OverlapTools.cpp \n##\t\tDPAlignment.h DPAlignment.cpp \\\n##        ConnectProcess.h ConnectProcess.cpp \\\n##        StringGraphGenerator.h StringGraphGenerator.cpp \\\n##        FMMergeProcess.h FMMergeProcess.cpp \\\n##        StatsProcess.h StatsProcess.cpp \\\n##        ClusterProcess.h ClusterProcess.cpp \\\n##        ReadCluster.h ReadCluster.cpp \\\n##        LRAlignment.h LRAlignment.cpp \\\n##        StringThreader.h StringThreader.cpp \\\n##        ExtensionDP.h ExtensionDP.cpp \\\n##        HaplotypeBuilder.h HaplotypeBuilder.cpp \\\n##        GapFillProcess.h GapFillProcess.cpp \\\n##        VariationBuilderCommon.h VariationBuilderCommon.cpp \\\n##        KmerOverlaps.h KmerOverlaps.cpp\n"
  },
  {
    "path": "src/SGA/Algorithm/Makefile.in",
    "content": "# Makefile.in generated by automake 1.16.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2018 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nsubdir = src/SGA/Algorithm\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLIBRARIES = $(noinst_LIBRARIES)\nAR = ar\nARFLAGS = cru\nAM_V_AR = $(am__v_AR_@AM_V@)\nam__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)\nam__v_AR_0 = @echo \"  AR      \" $@;\nam__v_AR_1 = \nlibalgorithm_a_AR = $(AR) $(ARFLAGS)\nlibalgorithm_a_LIBADD =\nam_libalgorithm_a_OBJECTS = libalgorithm_a-OverlapAlgorithm.$(OBJEXT) \\\n\tlibalgorithm_a-SearchSeed.$(OBJEXT) \\\n\tlibalgorithm_a-OverlapBlock.$(OBJEXT) \\\n\tlibalgorithm_a-SearchHistory.$(OBJEXT) \\\n\tlibalgorithm_a-OverlapTools.$(OBJEXT)\nlibalgorithm_a_OBJECTS = $(am_libalgorithm_a_OBJECTS)\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__maybe_remake_depfiles = depfiles\nam__depfiles_remade = ./$(DEPDIR)/libalgorithm_a-OverlapAlgorithm.Po \\\n\t./$(DEPDIR)/libalgorithm_a-OverlapBlock.Po \\\n\t./$(DEPDIR)/libalgorithm_a-OverlapTools.Po \\\n\t./$(DEPDIR)/libalgorithm_a-SearchHistory.Po \\\n\t./$(DEPDIR)/libalgorithm_a-SearchSeed.Po\nam__mv = mv -f\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nAM_V_CXX = $(am__v_CXX_@AM_V@)\nam__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)\nam__v_CXX_0 = @echo \"  CXX     \" $@;\nam__v_CXX_1 = \nCXXLD = $(CXX)\nCXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \\\n\t-o $@\nAM_V_CXXLD = $(am__v_CXXLD_@AM_V@)\nam__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)\nam__v_CXXLD_0 = @echo \"  CXXLD   \" $@;\nam__v_CXXLD_1 = \nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libalgorithm_a_SOURCES)\nDIST_SOURCES = $(libalgorithm_a_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_CXXFLAGS = @AM_CXXFLAGS@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nOBJEXT = @OBJEXT@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild_alias = @build_alias@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost_alias = @host_alias@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nnoinst_LIBRARIES = libalgorithm.a\nlibalgorithm_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/StringGraph \\\n\t-I$(top_srcdir)/src/SGA/SQG \\\n\t-I$(top_srcdir)/src/SGA/SuffixTools \\\n\t-I$(top_srcdir)/SeqLib\n\nlibalgorithm_a_SOURCES = \\\n        OverlapAlgorithm.h OverlapAlgorithm.cpp \\\n\t\tSearchSeed.h SearchSeed.cpp \\\n\t\tOverlapBlock.h OverlapBlock.cpp \\\n\t\tSearchHistory.h SearchHistory.cpp \\\n        OverlapTools.h OverlapTools.cpp \n\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .cpp .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/SGA/Algorithm/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/SGA/Algorithm/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLIBRARIES:\n\t-test -z \"$(noinst_LIBRARIES)\" || rm -f $(noinst_LIBRARIES)\n\nlibalgorithm.a: $(libalgorithm_a_OBJECTS) $(libalgorithm_a_DEPENDENCIES) $(EXTRA_libalgorithm_a_DEPENDENCIES) \n\t$(AM_V_at)-rm -f libalgorithm.a\n\t$(AM_V_AR)$(libalgorithm_a_AR) libalgorithm.a $(libalgorithm_a_OBJECTS) $(libalgorithm_a_LIBADD)\n\t$(AM_V_at)$(RANLIB) libalgorithm.a\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libalgorithm_a-OverlapAlgorithm.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libalgorithm_a-OverlapBlock.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libalgorithm_a-OverlapTools.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libalgorithm_a-SearchHistory.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libalgorithm_a-SearchSeed.Po@am__quote@ # am--include-marker\n\n$(am__depfiles_remade):\n\t@$(MKDIR_P) $(@D)\n\t@echo '# dummy' >$@-t && $(am__mv) $@-t $@\n\nam--depfiles: $(am__depfiles_remade)\n\n.cpp.o:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<\n\n.cpp.obj:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\nlibalgorithm_a-OverlapAlgorithm.o: OverlapAlgorithm.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libalgorithm_a-OverlapAlgorithm.o -MD -MP -MF $(DEPDIR)/libalgorithm_a-OverlapAlgorithm.Tpo -c -o libalgorithm_a-OverlapAlgorithm.o `test -f 'OverlapAlgorithm.cpp' || echo '$(srcdir)/'`OverlapAlgorithm.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libalgorithm_a-OverlapAlgorithm.Tpo $(DEPDIR)/libalgorithm_a-OverlapAlgorithm.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='OverlapAlgorithm.cpp' object='libalgorithm_a-OverlapAlgorithm.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libalgorithm_a-OverlapAlgorithm.o `test -f 'OverlapAlgorithm.cpp' || echo '$(srcdir)/'`OverlapAlgorithm.cpp\n\nlibalgorithm_a-OverlapAlgorithm.obj: OverlapAlgorithm.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libalgorithm_a-OverlapAlgorithm.obj -MD -MP -MF $(DEPDIR)/libalgorithm_a-OverlapAlgorithm.Tpo -c -o libalgorithm_a-OverlapAlgorithm.obj `if test -f 'OverlapAlgorithm.cpp'; then $(CYGPATH_W) 'OverlapAlgorithm.cpp'; else $(CYGPATH_W) '$(srcdir)/OverlapAlgorithm.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libalgorithm_a-OverlapAlgorithm.Tpo $(DEPDIR)/libalgorithm_a-OverlapAlgorithm.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='OverlapAlgorithm.cpp' object='libalgorithm_a-OverlapAlgorithm.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libalgorithm_a-OverlapAlgorithm.obj `if test -f 'OverlapAlgorithm.cpp'; then $(CYGPATH_W) 'OverlapAlgorithm.cpp'; else $(CYGPATH_W) '$(srcdir)/OverlapAlgorithm.cpp'; fi`\n\nlibalgorithm_a-SearchSeed.o: SearchSeed.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libalgorithm_a-SearchSeed.o -MD -MP -MF $(DEPDIR)/libalgorithm_a-SearchSeed.Tpo -c -o libalgorithm_a-SearchSeed.o `test -f 'SearchSeed.cpp' || echo '$(srcdir)/'`SearchSeed.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libalgorithm_a-SearchSeed.Tpo $(DEPDIR)/libalgorithm_a-SearchSeed.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SearchSeed.cpp' object='libalgorithm_a-SearchSeed.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libalgorithm_a-SearchSeed.o `test -f 'SearchSeed.cpp' || echo '$(srcdir)/'`SearchSeed.cpp\n\nlibalgorithm_a-SearchSeed.obj: SearchSeed.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libalgorithm_a-SearchSeed.obj -MD -MP -MF $(DEPDIR)/libalgorithm_a-SearchSeed.Tpo -c -o libalgorithm_a-SearchSeed.obj `if test -f 'SearchSeed.cpp'; then $(CYGPATH_W) 'SearchSeed.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchSeed.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libalgorithm_a-SearchSeed.Tpo $(DEPDIR)/libalgorithm_a-SearchSeed.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SearchSeed.cpp' object='libalgorithm_a-SearchSeed.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libalgorithm_a-SearchSeed.obj `if test -f 'SearchSeed.cpp'; then $(CYGPATH_W) 'SearchSeed.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchSeed.cpp'; fi`\n\nlibalgorithm_a-OverlapBlock.o: OverlapBlock.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libalgorithm_a-OverlapBlock.o -MD -MP -MF $(DEPDIR)/libalgorithm_a-OverlapBlock.Tpo -c -o libalgorithm_a-OverlapBlock.o `test -f 'OverlapBlock.cpp' || echo '$(srcdir)/'`OverlapBlock.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libalgorithm_a-OverlapBlock.Tpo $(DEPDIR)/libalgorithm_a-OverlapBlock.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='OverlapBlock.cpp' object='libalgorithm_a-OverlapBlock.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libalgorithm_a-OverlapBlock.o `test -f 'OverlapBlock.cpp' || echo '$(srcdir)/'`OverlapBlock.cpp\n\nlibalgorithm_a-OverlapBlock.obj: OverlapBlock.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libalgorithm_a-OverlapBlock.obj -MD -MP -MF $(DEPDIR)/libalgorithm_a-OverlapBlock.Tpo -c -o libalgorithm_a-OverlapBlock.obj `if test -f 'OverlapBlock.cpp'; then $(CYGPATH_W) 'OverlapBlock.cpp'; else $(CYGPATH_W) '$(srcdir)/OverlapBlock.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libalgorithm_a-OverlapBlock.Tpo $(DEPDIR)/libalgorithm_a-OverlapBlock.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='OverlapBlock.cpp' object='libalgorithm_a-OverlapBlock.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libalgorithm_a-OverlapBlock.obj `if test -f 'OverlapBlock.cpp'; then $(CYGPATH_W) 'OverlapBlock.cpp'; else $(CYGPATH_W) '$(srcdir)/OverlapBlock.cpp'; fi`\n\nlibalgorithm_a-SearchHistory.o: SearchHistory.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libalgorithm_a-SearchHistory.o -MD -MP -MF $(DEPDIR)/libalgorithm_a-SearchHistory.Tpo -c -o libalgorithm_a-SearchHistory.o `test -f 'SearchHistory.cpp' || echo '$(srcdir)/'`SearchHistory.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libalgorithm_a-SearchHistory.Tpo $(DEPDIR)/libalgorithm_a-SearchHistory.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SearchHistory.cpp' object='libalgorithm_a-SearchHistory.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libalgorithm_a-SearchHistory.o `test -f 'SearchHistory.cpp' || echo '$(srcdir)/'`SearchHistory.cpp\n\nlibalgorithm_a-SearchHistory.obj: SearchHistory.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libalgorithm_a-SearchHistory.obj -MD -MP -MF $(DEPDIR)/libalgorithm_a-SearchHistory.Tpo -c -o libalgorithm_a-SearchHistory.obj `if test -f 'SearchHistory.cpp'; then $(CYGPATH_W) 'SearchHistory.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchHistory.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libalgorithm_a-SearchHistory.Tpo $(DEPDIR)/libalgorithm_a-SearchHistory.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SearchHistory.cpp' object='libalgorithm_a-SearchHistory.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libalgorithm_a-SearchHistory.obj `if test -f 'SearchHistory.cpp'; then $(CYGPATH_W) 'SearchHistory.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchHistory.cpp'; fi`\n\nlibalgorithm_a-OverlapTools.o: OverlapTools.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libalgorithm_a-OverlapTools.o -MD -MP -MF $(DEPDIR)/libalgorithm_a-OverlapTools.Tpo -c -o libalgorithm_a-OverlapTools.o `test -f 'OverlapTools.cpp' || echo '$(srcdir)/'`OverlapTools.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libalgorithm_a-OverlapTools.Tpo $(DEPDIR)/libalgorithm_a-OverlapTools.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='OverlapTools.cpp' object='libalgorithm_a-OverlapTools.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libalgorithm_a-OverlapTools.o `test -f 'OverlapTools.cpp' || echo '$(srcdir)/'`OverlapTools.cpp\n\nlibalgorithm_a-OverlapTools.obj: OverlapTools.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libalgorithm_a-OverlapTools.obj -MD -MP -MF $(DEPDIR)/libalgorithm_a-OverlapTools.Tpo -c -o libalgorithm_a-OverlapTools.obj `if test -f 'OverlapTools.cpp'; then $(CYGPATH_W) 'OverlapTools.cpp'; else $(CYGPATH_W) '$(srcdir)/OverlapTools.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libalgorithm_a-OverlapTools.Tpo $(DEPDIR)/libalgorithm_a-OverlapTools.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='OverlapTools.cpp' object='libalgorithm_a-OverlapTools.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libalgorithm_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libalgorithm_a-OverlapTools.obj `if test -f 'OverlapTools.cpp'; then $(CYGPATH_W) 'OverlapTools.cpp'; else $(CYGPATH_W) '$(srcdir)/OverlapTools.cpp'; fi`\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(BUILT_SOURCES)\n\t$(MAKE) $(AM_MAKEFLAGS) distdir-am\n\ndistdir-am: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LIBRARIES)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am\n\ndistclean: distclean-am\n\t\t-rm -f ./$(DEPDIR)/libalgorithm_a-OverlapAlgorithm.Po\n\t-rm -f ./$(DEPDIR)/libalgorithm_a-OverlapBlock.Po\n\t-rm -f ./$(DEPDIR)/libalgorithm_a-OverlapTools.Po\n\t-rm -f ./$(DEPDIR)/libalgorithm_a-SearchHistory.Po\n\t-rm -f ./$(DEPDIR)/libalgorithm_a-SearchSeed.Po\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t\t-rm -f ./$(DEPDIR)/libalgorithm_a-OverlapAlgorithm.Po\n\t-rm -f ./$(DEPDIR)/libalgorithm_a-OverlapBlock.Po\n\t-rm -f ./$(DEPDIR)/libalgorithm_a-OverlapTools.Po\n\t-rm -f ./$(DEPDIR)/libalgorithm_a-SearchHistory.Po\n\t-rm -f ./$(DEPDIR)/libalgorithm_a-SearchSeed.Po\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \\\n\tclean-generic clean-noinstLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/SGA/Algorithm/OverlapAlgorithm.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n#include \"OverlapAlgorithm.h\"\n#include \"ASQG.h\"\n#include <math.h>\n\n// Collect the complete set of overlaps in pOBOut\nstatic const AlignFlags sufPreAF(false, false, false);\nstatic const AlignFlags prePreAF(false, true, true);\nstatic const AlignFlags sufSufAF(true, false, true);\nstatic const AlignFlags preSufAF(true, true, false);\n\n//#define DEBUGOVERLAP 2\n\n// Perform the overlap\nOverlapResult OverlapAlgorithm::overlapRead(const SeqRecord& read, int minOverlap, OverlapBlockList* pOutList) const\n{\n  \n    OverlapResult r;\n    if(static_cast<int>(read.seq.length()) < minOverlap)\n        return r;\n\n    if(!m_exactModeOverlap)\n        r = overlapReadInexact(read, minOverlap, pOutList);\n    else\n        r = overlapReadExact(read, minOverlap, pOutList);\n    return r;\n}\n\n//\nOverlapResult OverlapAlgorithm::overlapReadInexact(const SeqRecord& read, int minOverlap, OverlapBlockList* pOBOut) const\n{\n    OverlapResult result;\n    OverlapBlockList obWorkingList;\n    std::string seq = read.seq.toString();\n\n#ifdef DEBUGOVERLAP\n    std::cout << \"\\n\\n***Overlapping read \" << read.id << \" suffix\\n\";\n    std::cout << \"***Overlapping seq \" << read.seq.toString() << \" suffix\\n\";\n#endif\n\n    // Match the suffix of seq to prefixes\n\n    // findInexact returns false is the maximum search time was exceeded. In this\n    // case we dont run any of the subsequent commands and return no overlaps.\n    bool valid = true;\n\n    valid = findOverlapBlocksInexact(seq, m_pBWT, m_pRevBWT, sufPreAF, \n                                 minOverlap, &obWorkingList, pOBOut, result);\n\n    if(valid)\n       valid = findOverlapBlocksInexact(complement(seq), m_pRevBWT, m_pBWT, prePreAF, \n                                       minOverlap, &obWorkingList, pOBOut, result);\n\n\n#ifdef DEBUGOVERLAP\n    std::cout << \"WORKING OverlapBlockList Length SUFFIX: \" << obWorkingList.size() << std::endl;\n#endif       \n\n    if(valid)\n    {\n        if(m_bIrreducible)\n        {\n            computeIrreducibleBlocks(m_pBWT, m_pRevBWT, &obWorkingList, pOBOut);\n            obWorkingList.clear();\n        }\n        else\n        {\n            pOBOut->splice(pOBOut->end(), obWorkingList);\n            assert(obWorkingList.empty());\n        }\n    }\n\n#ifdef DEBUGOVERLAP\n    std::cout << \"\\n\\n***Overlapping read \" << read.id << \" prefix\\n\";\n#endif\n\n    // Match the prefix of seq to suffixes\n    if(valid)\n        valid = findOverlapBlocksInexact(reverseComplement(seq), m_pBWT, m_pRevBWT, sufSufAF, minOverlap, &obWorkingList, pOBOut, result);\n    \n    if(valid)\n        valid = findOverlapBlocksInexact(reverse(seq), m_pRevBWT, m_pBWT, preSufAF, minOverlap, &obWorkingList, pOBOut, result);\n\n#ifdef DEBUGOVERLAP\n    std::cout << \"WORKING OverlapBlockList Length PREFIX: \" << obWorkingList.size() << std::endl;\n#endif\n\n    if(valid)\n    {\n        if(m_bIrreducible)\n        {\n            computeIrreducibleBlocks(m_pBWT, m_pRevBWT, &obWorkingList, pOBOut);\n            obWorkingList.clear();\n        }\n        else\n        {\n            pOBOut->splice(pOBOut->end(), obWorkingList);\n            assert(obWorkingList.empty());\n        }\n\t}\n    \n    if(!valid)\n    {\n        pOBOut->clear();\n        result.isSubstring = false;\n        result.searchAborted = true;\n        return result;\n    }\n\n#ifdef DEBUGOVERLAP\n     unsigned N = 1;\n     if (pOBOut->size() > N)\n      {\n\tstd::cout << read.id << \" OverlapBlockList Length: \" << pOBOut->size() << std::endl;\n\tstd::list<OverlapBlock>::iterator it = pOBOut->begin();\n\tstd::advance(it, N);\n        //std::cout << \"Olen: \" << it->overlapLen << \" numDiff: \" << it->numDiff << std::endl;\n        std::cout << \" BWT1L: \" << it->ranges.interval[0].lower;\n        std::cout << \" BWT1U: \" << it->ranges.interval[0].upper;\n        std::cout << \" BWT2L: \" << it->ranges.interval[1].lower;\n        std::cout << \" BWT2U: \" << it->ranges.interval[1].upper;\n        std::cout << \" RBWT1L: \" << it->rawRanges.interval[0].lower;\n        std::cout << \" RBWT1U: \" << it->rawRanges.interval[0].upper;\n        std::cout << \" RBWT2L: \" << it->rawRanges.interval[1].lower;\n        std::cout << \" RBWT2U: \" << it->rawRanges.interval[1].upper << std::endl;\n      }\n#endif\n\n\n    return result;\n}\n\n//\nOverlapResult OverlapAlgorithm::alignReadDuplicate(const SeqRecord& read, OverlapBlockList* pOBOut) const\n{\n    OverlapResult result;\n    OverlapBlockList obWorkingList;\n    std::string seq = read.seq.toString();\n    int readLength = seq.length();\n\n    findOverlapBlocksInexact(seq, m_pBWT, m_pRevBWT, sufPreAF, readLength, &obWorkingList, pOBOut, result);\n    findOverlapBlocksInexact(complement(seq), m_pRevBWT, m_pBWT, prePreAF, readLength, &obWorkingList, pOBOut, result);\n    return result;\n}\n\n\n// Construct the set of blocks describing irreducible overlaps with READ\n// and write the blocks to pOBOut\nOverlapResult OverlapAlgorithm::overlapReadExact(const SeqRecord& read, int minOverlap, OverlapBlockList* pOBOut) const\n{\n    OverlapResult result;\n    // The complete set of overlap blocks are collected in obWorkingList\n    // The filtered set (containing only irreducible overlaps) are placed into pOBOut\n    // by calculateIrreducibleHits\n    OverlapBlockList obWorkingList;\n    std::string seq = read.seq.toString();\n\n    // We store the various overlap blocks using a number of lists, one for the containments\n    // in the forward and reverse index and one for each set of overlap blocks\n    OverlapBlockList oblFwdContain;\n    OverlapBlockList oblRevContain;\n    \n    OverlapBlockList oblSuffixFwd;\n    OverlapBlockList oblSuffixRev;\n    OverlapBlockList oblPrefixFwd;\n    OverlapBlockList oblPrefixRev;\n\n    // Match the suffix of seq to prefixes\n    findOverlapBlocksExact(seq, m_pBWT, m_pRevBWT, sufPreAF, minOverlap, &oblSuffixFwd, &oblFwdContain, result);\n    findOverlapBlocksExact(complement(seq), m_pRevBWT, m_pBWT, prePreAF, minOverlap, &oblSuffixRev, &oblRevContain, result);\n\n    // Match the prefix of seq to suffixes\n    findOverlapBlocksExact(reverseComplement(seq), m_pBWT, m_pRevBWT, sufSufAF, minOverlap, &oblPrefixFwd, &oblFwdContain, result);\n    findOverlapBlocksExact(reverse(seq), m_pRevBWT, m_pBWT, preSufAF, minOverlap, &oblPrefixRev, &oblRevContain, result);\n\n    // Remove submaximal blocks for each block list including fully contained blocks\n    // Copy the containment blocks into the prefix/suffix lists\n    oblSuffixFwd.insert(oblSuffixFwd.end(), oblFwdContain.begin(), oblFwdContain.end());\n    oblPrefixFwd.insert(oblPrefixFwd.end(), oblFwdContain.begin(), oblFwdContain.end());\n    oblSuffixRev.insert(oblSuffixRev.end(), oblRevContain.begin(), oblRevContain.end());\n    oblPrefixRev.insert(oblPrefixRev.end(), oblRevContain.begin(), oblRevContain.end());\n    \n    // Perform the submaximal filter\n    removeSubMaximalBlocks(&oblSuffixFwd, m_pBWT, m_pRevBWT);\n    removeSubMaximalBlocks(&oblPrefixFwd, m_pBWT, m_pRevBWT);\n    removeSubMaximalBlocks(&oblSuffixRev, m_pRevBWT, m_pBWT);\n    removeSubMaximalBlocks(&oblPrefixRev, m_pRevBWT, m_pBWT);\n    \n    // Remove the contain blocks from the suffix/prefix lists\n    removeContainmentBlocks(seq.length(), &oblSuffixFwd);\n    removeContainmentBlocks(seq.length(), &oblPrefixFwd);\n    removeContainmentBlocks(seq.length(), &oblSuffixRev);\n    removeContainmentBlocks(seq.length(), &oblPrefixRev);\n\n    // Join the suffix and prefix lists\n    oblSuffixFwd.splice(oblSuffixFwd.end(), oblSuffixRev);\n    oblPrefixFwd.splice(oblPrefixFwd.end(), oblPrefixRev);\n\n    // Move the containments to the output list\n    pOBOut->splice(pOBOut->end(), oblFwdContain);\n    pOBOut->splice(pOBOut->end(), oblRevContain);\n\n    // Filter out transitive overlap blocks if requested\n    if(m_bIrreducible)\n    {\n        computeIrreducibleBlocks(m_pBWT, m_pRevBWT, &oblSuffixFwd, pOBOut);\n        computeIrreducibleBlocks(m_pBWT, m_pRevBWT, &oblPrefixFwd, pOBOut);\n    }\n    else\n    {\n        pOBOut->splice(pOBOut->end(), oblSuffixFwd);\n        pOBOut->splice(pOBOut->end(), oblPrefixFwd);\n    }\n\n    return result;\n}\n\n// Write overlap results to an ASQG file\nvoid OverlapAlgorithm::writeResultASQG(std::ostream& writer, const SeqRecord& read, const OverlapResult& result) const\n{\n    ASQG::VertexRecord record(read.id, read.seq.toString());\n    record.setSubstringTag(result.isSubstring);\n    record.write(writer);\n}\n\n// Write overlap blocks out to a file\nvoid OverlapAlgorithm::writeOverlapBlocks(std::ostream& writer, size_t readIdx, bool isSubstring, const OverlapBlockList* pList) const\n{\n\n    // Write the header info\n    size_t numBlocks = pList->size();\n    writer << readIdx << \" \" << isSubstring << \" \" << numBlocks << \" \";\n    //std::cout << readIdx << \" \" << isSubstring << \" \" << numBlocks << \" \";\n    //std::cout << \"<Wrote> idx: \" << count << \" count: \" << numBlocks << \"\\n\";\n    for(OverlapBlockList::const_iterator iter = pList->begin(); iter != pList->end(); ++iter)\n    {\n        writer << *iter << \" \";\n\t//std::cout << *iter << \" \";\n    }\n    writer << \"\\n\";\n    //std::cout << \"\\n\";\n}\n\n//JEREMIAH\nvoid OverlapAlgorithm::writeOverlapBlocks(std::stringstream& writer, size_t readIdx, bool isSubstring, const OverlapBlockList* pList) const\n{\n    // Write the header info\n    size_t numBlocks = pList->size();\n    writer << readIdx << \" \" << isSubstring << \" \" << numBlocks << \" \";\n    //std::cout << readIdx << \" \" << isSubstring << \" \" << numBlocks << \" \";\n    for(OverlapBlockList::const_iterator iter = pList->begin(); iter != pList->end(); ++iter)\n    {\n        writer << *iter << \" \";\n\t//std::cout << *iter << \" \";\n    }\n    writer << \"\\n\";\n    //std::cout << \"\\n\";\n}\n\n\n// Calculate the ranges in pBWT that contain a prefix of at least minOverlap basepairs that\n// overlaps with a suffix of w. The ranges are added to the pOBList\nvoid OverlapAlgorithm::findOverlapBlocksExact(const std::string& w, const BWT* pBWT,\n                                              const BWT* pRevBWT, const AlignFlags& af, int minOverlap,\n                                              OverlapBlockList* pOverlapList, OverlapBlockList* pContainList, \n                                              OverlapResult& result) const\n{\n    // The algorithm is as follows:\n    // We perform a backwards search using the FM-index for the string w.\n    // As we perform the search we collect the intervals \n    // of the significant prefixes (len >= minOverlap) that overlap w.\n    BWTIntervalPair ranges;\n    size_t l = w.length();\n    int start = l - 1;\n    BWTAlgorithms::initIntervalPair(ranges, w[start], pBWT, pRevBWT);\n    \n    // Collect the OverlapBlocks\n    for(size_t i = start - 1; i >= 1; --i)\n    {\n        // Compute the range of the suffix w[i, l]\n        BWTAlgorithms::updateBothL(ranges, w[i], pBWT);\n        int overlapLen = l - i;\n        if(overlapLen >= minOverlap)\n        {\n            // Calculate which of the prefixes that match w[i, l] are terminal\n            // These are the proper prefixes (they are the start of a read)\n            BWTIntervalPair probe = ranges;\n            BWTAlgorithms::updateBothL(probe, '$', pBWT);\n            \n            // The probe interval contains the range of proper prefixes\n            if(probe.interval[1].isValid())\n            {\n                assert(probe.interval[1].lower > 0);\n                pOverlapList->push_back(OverlapBlock(probe, ranges, overlapLen, 0, af));\n            }\n        }\n    }\n\n    // Determine if this sequence is contained and should not be processed further\n    BWTAlgorithms::updateBothL(ranges, w[0], pBWT);\n\n    // Ranges now holds the interval for the full-length read\n    // To handle containments, we output the overlapBlock to the final overlap block list\n    // and it will be processed later\n    // Two possible containment cases:\n    // 1) This read is a substring of some other read\n    // 2) This read is identical to some other read\n    \n    // Case 1 is indicated by the existance of a non-$ left or right hand extension\n    // In this case we return no alignments for the string\n    AlphaCount64 left_ext = BWTAlgorithms::getExtCount(ranges.interval[0], pBWT);\n    AlphaCount64 right_ext = BWTAlgorithms::getExtCount(ranges.interval[1], pRevBWT);\n    if(left_ext.hasDNAChar() || right_ext.hasDNAChar())\n    {\n        result.isSubstring = true;\n    }\n    else\n    {\n        BWTIntervalPair probe = ranges;\n        BWTAlgorithms::updateBothL(probe, '$', pBWT);\n        if(probe.isValid())\n        {\n            // terminate the contained block and add it to the contained list\n            BWTAlgorithms::updateBothR(probe, '$', pRevBWT);\n            assert(probe.isValid());\n            pContainList->push_back(OverlapBlock(probe, ranges, w.length(), 0, af));\n        }\n    }\n\n    //OverlapBlockList containedWorkingList;\n    //partitionBlockList(w.length(), &workingList, pOverlapList, &containedWorkingList);\n    \n    // Terminate the contained blocks\n    //terminateContainedBlocks(containedWorkingList);\n    \n    // Move the contained blocks to the final contained list\n    //pContainList->splice(pContainList->end(), containedWorkingList);\n\n    return;\n}\n\n// Seeded blockwise BWT alignment of prefix-suffix for reads\n// Each alignment is given a seed region and a block region\n// The seed region is the terminal portion of w where maxDiff + 1 seeds are created\n// at least 1 of these seeds must align exactly for there to be an alignment with \n// at most maxDiff differences between the prefix/suffix. Only alignments within the\n// range [block_start, block_end] are output. The block_end coordinate is inclusive.\nbool OverlapAlgorithm::findOverlapBlocksInexact(const std::string& w, const BWT* pBWT, \n                                                const BWT* pRevBWT, const AlignFlags& af, int minOverlap,\n                                                OverlapBlockList* pOverlapList, OverlapBlockList* pContainList, \n                                                OverlapResult& result) const\n{\n    int len = w.length();\n    int overlap_region_left = len - minOverlap;\n    SearchSeedVector* pCurrVector = new SearchSeedVector;\n    SearchSeedVector* pNextVector = new SearchSeedVector;\n    OverlapBlockList workingList;\n    SearchSeedVector::iterator iter;\n\n    // Create and extend the initial seeds\n    int actual_seed_length = m_seedLength;\n    int actual_seed_stride = m_seedStride;\n#ifdef DEBUGOVERLAP\n    std::cout << \"SeedLen: \" << m_seedLength << \" SeedStride: \" << m_seedStride << std::endl;\n#endif\n\n    if(actual_seed_length == 0)\n    {\n        // Calculate a seed length and stride that will guarantee all overlaps\n        // with error rate m_errorRate will be found\n        calculateSeedParameters(w, minOverlap, actual_seed_length, actual_seed_stride);\n    }\n\n    assert(actual_seed_stride != 0);\n\n    createSearchSeeds(w, pBWT, pRevBWT, actual_seed_length, actual_seed_stride, pCurrVector);\n    extendSeedsExactRight(w, pBWT, pRevBWT, ED_RIGHT, pCurrVector, pNextVector);\n    pCurrVector->clear();\n    pCurrVector->swap(*pNextVector);\n    assert(pNextVector->empty());\n\n    int num_steps = 0;\n\n    // Perform the inexact extensions\n    bool fail = false;\n    while(!pCurrVector->empty())\n    {\n        if(m_maxSeeds != -1 && (int)pCurrVector->size() > m_maxSeeds)\n        {\n            fail = true;\n            break;\n        }\n\n        iter = pCurrVector->begin();\n        while(iter != pCurrVector->end())\n        {\n            SearchSeed& align = *iter;\n\n            // If the current aligned region is right-terminal\n            // and the overlap is greater than minOverlap, try to find overlaps\n            // or containments\n            if(align.right_index == len - 1)\n            {\n                double align_error = align.calcErrorRate();\n\n                // Check for overlaps\n                if(align.left_index <= overlap_region_left && isErrorRateAcceptable(align_error, m_errorRate))\n                {\n                    int overlapLen = len - align.left_index;\n                    BWTIntervalPair probe = align.ranges;\n                    BWTAlgorithms::updateBothL(probe, '$', pBWT);\n                    \n                    // The probe interval contains the range of proper prefixes\n                    if(probe.interval[1].isValid())\n                    {\n                        assert(probe.interval[1].lower > 0);\n                        OverlapBlock nBlock(probe, align.ranges, overlapLen, align.z, af, align.historyLink->getHistoryVector());\n                        workingList.push_back(nBlock);\n                    }\n                }\n\n                // Check for containments\n                // If the seed is left-terminal and there are [ACGT] left/right extensions of the sequence\n                // this read must be a substring of another read\n                if(align.left_index == 0)\n                {\n                    AlphaCount64 left_ext = BWTAlgorithms::getExtCount(align.ranges.interval[0], pBWT);\n                    AlphaCount64 right_ext = BWTAlgorithms::getExtCount(align.ranges.interval[1], pRevBWT);\n                    if(left_ext.hasDNAChar() || right_ext.hasDNAChar())\n                        result.isSubstring = true;\n                }\n            }\n\n            // Extend the seed to the right/left\n            if(align.dir == ED_RIGHT)\n                extendSeedInexactRight(align, w, pBWT, pRevBWT, pNextVector);\n            else\n                extendSeedInexactLeft(align, w, pBWT, pRevBWT, pNextVector);\n            ++iter;\n            //pCurrVector->erase(iter++);\n        }\n        pCurrVector->clear();\n        assert(pCurrVector->empty());\n        pCurrVector->swap(*pNextVector);\n\n        // Remove identical seeds after we have performed seed_len steps\n        // as there now might be redundant seeds\n        if(num_steps % actual_seed_stride == 0)\n        {\n            std::sort(pCurrVector->begin(), pCurrVector->end(), SearchSeed::compareLeftRange);\n            SearchSeedVector::iterator end_iter = std::unique(pCurrVector->begin(), pCurrVector->end(), \n                                                                   SearchSeed::equalLeftRange);\n            pCurrVector->resize(end_iter - pCurrVector->begin());\n        }\n        ++num_steps;\n    }\n\n    if(!fail)\n    {\n        // parse the working list to remove any submaximal overlap blocks\n        // these blocks correspond to reads that have multiple valid overlaps. \n        // we only keep the longest\n        removeSubMaximalBlocks(&workingList, pBWT, pRevBWT);\n\n        OverlapBlockList containedWorkingList;\n        partitionBlockList(len, &workingList, pOverlapList, &containedWorkingList);\n        \n        // Terminate the contained blocks\n        terminateContainedBlocks(containedWorkingList);\n        \n        // Move the contained blocks to the final contained list\n        pContainList->splice(pContainList->end(), containedWorkingList);\n    }\n\n    delete pCurrVector;\n    delete pNextVector;\n    return !fail;\n}\n\n// Build forward history for the blocks\nvoid OverlapAlgorithm::buildForwardHistory(OverlapBlockList* pList) const\n{\n    OverlapBlockList terminalList;\n    OverlapBlockList potentialContainedList;\n    while(!pList->empty())\n    {\n        // The terminalBlock list contains all the blocks that became right-terminal\n        // in the current extension round.\n\n        // Perform a single round of extension, any terminal blocks\n        // are moved to the terminated list\n        extendActiveBlocksRight(m_pBWT, m_pRevBWT, *pList, terminalList, potentialContainedList);\n    }\n    *pList = terminalList;\n    pList->splice(pList->end(), potentialContainedList);\n}\n\n// Calculate the single right extension to the '$' for each the contained blocks\n// so that the interval ranges are consistent\nvoid OverlapAlgorithm::terminateContainedBlocks(OverlapBlockList& containedBlocks) const\n{\n    for(OverlapBlockList::iterator iter = containedBlocks.begin(); iter != containedBlocks.end(); ++iter)\n        BWTAlgorithms::updateBothR(iter->ranges, '$', iter->getExtensionBWT(m_pBWT, m_pRevBWT));\n}\n\n// Calculate the seed length and stride to ensure that we will find all \n// all overlaps with error rate at most m_errorRate.\n// To overlap two reads allowing for d errors, we create d+1 seeds so that at least one seed will match\n// exactly. d is a function of the overlap length so we define the seed length using the minimum overlap\n// parameter. We then tile seeds across the read starting from the end such that for every overlap length\n// x, there are at least floor(x * error_rate) + 1 seeds.\nvoid OverlapAlgorithm::calculateSeedParameters(const std::string& w, const int minOverlap, int& seed_length, int& seed_stride) const\n{\n\n    int read_len = w.length();\n    seed_length = 0;\n    \n    // The maximum possible number of differences occurs for a fully-aligned read\n    int max_diff_high = static_cast<int>(m_errorRate * read_len);\n\n    // Calculate the seed length to use\n    // If the error rate is so low that no differences are possible just seed\n    // over the entire minOverlap region\n    if(max_diff_high > 0)\n    {\n        // Calculate the maximum number of differences between two sequences that overlap\n        // by minOverlap\n        int max_diff_low = static_cast<int>(m_errorRate * minOverlap);\n\n         if(max_diff_low == 0)\n            max_diff_low = 1;\n         \n         int seed_region_length = static_cast<int>(ceil(max_diff_low / m_errorRate));\n         int num_seeds_low = max_diff_low + 1;\n         seed_length = static_cast<int>(seed_region_length / num_seeds_low);\n         if(seed_length > static_cast<int>(minOverlap))\n            seed_length = minOverlap;\n    }\n    else\n    {\n        seed_length = minOverlap;\n    }\n    seed_stride = seed_length;    \n}\n\n// Create and intialize the search seeds\nint OverlapAlgorithm::createSearchSeeds(const std::string& w, const BWT* pBWT, \n                                        const BWT* pRevBWT, int seed_length, int seed_stride,\n                                        SearchSeedVector* pOutVector) const\n{\n    // Start a new chain of history links\n    SearchHistoryLink rootLink = SearchHistoryNode::createRoot();\n\n    // The maximum possible number of differences occurs for a fully-aligned read\n    int read_len = w.length();\n    int max_diff_high = static_cast<int>(m_errorRate * read_len);\n\n    // Start the seeds at the end of the read\n    int seed_start = read_len - seed_length;\n\n    while(seed_start >= 0)\n    {\n        SearchSeed seed;\n        seed.left_index = seed_start;\n        seed.right_index = seed_start;\n        seed.dir = ED_RIGHT;\n        seed.seed_len = seed_length;\n        seed.z = 0;\n        seed.maxDiff = max_diff_high;\n        seed.historyLink = rootLink;\n\n        // Initialize the left and right suffix array intervals\n        char b = w[seed.left_index];\n        BWTAlgorithms::initIntervalPair(seed.ranges, b, pBWT, pRevBWT);        \n        pOutVector->push_back(seed);\n\n        seed_start -= seed_stride;\n        \n        // Only create one seed in the exact case\n        if(max_diff_high == 0)\n            break;\n    }\n    return seed_length;\n}\n\n// Extend all the seeds in pInVector to the right over the entire seed range\nvoid OverlapAlgorithm::extendSeedsExactRightQueue(const std::string& w, const BWT* /*pBWT*/, const BWT* pRevBWT,\n                                             ExtendDirection /*dir*/, const SearchSeedVector* pInVector, \n                                             SearchSeedQueue* pOutQueue) const\n{\n    for(SearchSeedVector::const_iterator iter = pInVector->begin(); iter != pInVector->end(); ++iter)\n    {\n        SearchSeed align = *iter;\n        bool valid = true;\n        while(align.isSeed())\n        {\n            ++align.right_index;\n            char b = w[align.right_index];\n            BWTAlgorithms::updateBothR(align.ranges, b, pRevBWT);\n            if(!align.isIntervalValid(RIGHT_INT_IDX))\n            {\n                valid = false;\n                break;\n            }\n        }\n\n        if(valid)\n            pOutQueue->push(align);\n    }\n}\n\n// Extend all the seeds in pInVector to the right over the entire seed range\nvoid OverlapAlgorithm::extendSeedsExactRight(const std::string& w, const BWT* /*pBWT*/, const BWT* pRevBWT,\n                                             ExtendDirection /*dir*/, const SearchSeedVector* pInVector, \n                                             SearchSeedVector* pOutVector) const\n{\n    for(SearchSeedVector::const_iterator iter = pInVector->begin(); iter != pInVector->end(); ++iter)\n    {\n        SearchSeed align = *iter;\n        bool valid = true;\n        while(align.isSeed())\n        {\n            ++align.right_index;\n            char b = w[align.right_index];\n            BWTAlgorithms::updateBothR(align.ranges, b, pRevBWT);\n            if(!align.isIntervalValid(RIGHT_INT_IDX))\n            {\n                valid = false;\n                break;\n            }\n        }\n\n        //std::cout << \"Initial seed: \";\n        //align.print(w);\n\n        if(valid)\n            pOutVector->push_back(align);\n    }\n}\n\n//\nvoid OverlapAlgorithm::extendSeedInexactRight(SearchSeed& seed, const std::string& w, const BWT* /*pBWT*/, \n                                              const BWT* pRevBWT, SearchSeedVector* pOutVector) const\n{\n    // If this alignment has run all the way to the end of the sequence\n    // switch it to be a left extension sequence\n    if(seed.right_index == int(w.length() - 1))\n    {\n        seed.dir = ED_LEFT;\n        pOutVector->push_back(seed);\n        return;\n    }\n\n    ++seed.right_index;\n    \n    if(!seed.allowMismatches())\n    {\n        char b = w[seed.right_index];\n        BWTAlgorithms::updateBothR(seed.ranges, b, pRevBWT);\n        if(seed.isIntervalValid(RIGHT_INT_IDX))\n            pOutVector->push_back(seed);\n    }\n    else\n    {\n        // Calculating the AlphaCounts is the heavy part of the computation so we cache\n        // the value outside the loop, it is the same for all bases\n        AlphaCount64 lower = pRevBWT->getFullOcc(seed.ranges.interval[1].lower - 1);\n        AlphaCount64 upper = pRevBWT->getFullOcc(seed.ranges.interval[1].upper);\n        for(int i = 0; i < 4; ++i)\n        {\n            char b = ALPHABET[i];    \n            BWTIntervalPair probe = seed.ranges;\n            BWTAlgorithms::updateBothR(probe, b, pRevBWT, lower, upper);\n            if(probe.interval[RIGHT_INT_IDX].isValid())\n            {\n                SearchSeed branched = seed;\n                branched.ranges = probe;\n                if(b != w[seed.right_index])\n                {\n                    ++branched.z;\n                    branched.historyLink = seed.historyLink->createChild(w.length() - seed.right_index, b);\n                }\n                pOutVector->push_back(branched);\n            }\n        }\n    }\n}\n\n//\nvoid OverlapAlgorithm::extendSeedInexactLeft(SearchSeed& seed, const std::string& w, \n                                             const BWT* pBWT, const BWT* /*pRevBWT*/,\n                                             SearchSeedVector* pOutVector) const\n{\n    //printf(\"ProcessingLEFT: \"); align.print(w);\n    --seed.left_index;\n    if(seed.left_index >= 0)\n    {\n        if(!seed.allowMismatches())\n        {\n            // Extend exact\n            char b = w[seed.left_index];\n            BWTAlgorithms::updateBothL(seed.ranges, b, pBWT);\n            if(seed.isIntervalValid(LEFT_INT_IDX))\n                pOutVector->push_back(seed);\n        }\n        else\n        {\n            // Calculating the AlphaCounts is the heavy part of the computation so we cache\n            // the value outside the loop, it is the same for all bases\n            AlphaCount64 lower = pBWT->getFullOcc(seed.ranges.interval[0].lower - 1);\n            AlphaCount64 upper = pBWT->getFullOcc(seed.ranges.interval[0].upper);\n            for(int i = 0; i < 4; ++i)\n            {\n                char b = ALPHABET[i];\n                BWTIntervalPair probe = seed.ranges;\n                BWTAlgorithms::updateBothL(probe, b, pBWT, lower, upper);\n                if(probe.interval[LEFT_INT_IDX].isValid())\n                {\n                    SearchSeed branched = seed;\n                    branched.ranges = probe;\n                    if(b != w[seed.left_index])\n                    {\n                        ++branched.z;\n                        // The history coordinates are wrt the right end of the read\n                        // so that each position corresponds to the length of the overlap\n                        // including that position        \n                        branched.historyLink = seed.historyLink->createChild(w.length() - seed.left_index, b);                \n                        //branched.history.add(w.length() - seed.left_index, b);\n                    }\n                    pOutVector->push_back(branched);\n                }\n            }\n        }\n    }\n}\n\n// Extend the seed to the right, return true if the seed is still a valid range\nbool OverlapAlgorithm::extendSeedExactRight(SearchSeed& seed, const std::string& w, const BWT* /*pBWT*/, const BWT* pRevBWT) const\n{\n    // If this alignment has run all the way to the end of the sequence\n    // switch it to be a left extension sequence\n    if(seed.right_index == int(w.length() - 1))\n    {\n        seed.dir = ED_LEFT;\n        return true;\n    }\n\n    ++seed.right_index;\n    char b = w[seed.right_index];\n    BWTAlgorithms::updateBothR(seed.ranges, b, pRevBWT);\n    if(seed.isIntervalValid(RIGHT_INT_IDX))\n        return true;\n    else\n        return false;\n}\n\n//\nbool OverlapAlgorithm::extendSeedExactLeft(SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* /*pRevBWT*/) const\n{\n    --seed.left_index;\n    if(seed.left_index >= 0)\n    {\n        char b = w[seed.left_index];\n        BWTAlgorithms::updateBothL(seed.ranges, b, pBWT);\n        if(seed.isIntervalValid(LEFT_INT_IDX))\n            return true;\n        else\n            return false;\n    }\n    else\n    {\n        return false;\n    }\n}\n\n// Calculate the irreducible blocks from the vector of OverlapBlocks\nvoid OverlapAlgorithm::computeIrreducibleBlocks(const BWT* pBWT, const BWT* pRevBWT, \n                                                OverlapBlockList* pOBList, \n                                                OverlapBlockList* pOBFinal) const\n{\n    // processIrreducibleBlocks requires the pOBList to be sorted in descending order\n    pOBList->sort(OverlapBlock::sortSizeDescending);\n\n#ifdef DEBUGOVERLAP\n\tstd::cout << \" m_exactModeIrreducible \" << m_exactModeIrreducible << \"\\n\";\n#endif       \n\n    if(m_exactModeIrreducible)\n        _processIrreducibleBlocksExactIterative(pBWT, pRevBWT, *pOBList, pOBFinal);\n    else\n        _processIrreducibleBlocksInexact(pBWT, pRevBWT, *pOBList, pOBFinal);\n    pOBList->clear();\n}\n\n// iterate through obList and determine the overlaps that are irreducible. This function is recursive.\n// The final overlap blocks corresponding to irreducible overlaps are written to pOBFinal.\n// Invariant: the blocks are ordered in descending order of the overlap size so that the longest overlap is first.\n// Invariant: each block corresponds to the same extension of the root sequence w.\nvoid OverlapAlgorithm::_processIrreducibleBlocksExactIterative(const BWT* pBWT, const BWT* pRevBWT, \n                                                               OverlapBlockList& inList, \n                                                               OverlapBlockList* pOBFinal) const\n{\n    if(inList.empty())\n        return;\n    \n    // We store the overlap blocks in groups of blocks that have the same right-extension.\n    // When a branch is found, the groups are split based on the extension\n    typedef std::list<OverlapBlockList> BlockGroups;\n\n    BlockGroups blockGroups;\n    blockGroups.push_back(inList);\n    int numExtensions = 0;\n    int numBranches = 0;\n    while(!blockGroups.empty())\n    {\n        // Perform one extenion round for each group.\n        // If the top-level block has ended, push the result\n        // to the final list and remove the group from processing\n        BlockGroups::iterator groupIter = blockGroups.begin();\n        BlockGroups incomingGroups; // Branched blocks are placed here\n\n        while(groupIter != blockGroups.end())\n        {\n            OverlapBlockList& currList = *groupIter;\n            bool bEraseGroup = false;\n\n            // Count the extensions in the top level (longest) blocks first\n            int topLen = currList.front().overlapLen;\n            AlphaCount64 ext_count;\n            OBLIter blockIter = currList.begin();\n            while(blockIter != currList.end() && blockIter->overlapLen == topLen)\n            {\n                ext_count += blockIter->getCanonicalExtCount(pBWT, pRevBWT);\n                ++blockIter;\n            }\n            \n            // Three cases:\n            // 1) The top level block has ended as it contains the extension $. Output TLB and end.\n            // 2) There is a singular unique extension base for all the blocks. Update the blocks and continue.\n            // 3) There are multiple extension bases, split the block group and continue.\n            // If some block other than the TLB ended, it must be contained within the TLB and it is not output\n            // or considered further. \n            // Likewise if multiple distinct strings in the TLB ended, we only output the top one. The rest\n            // must have the same sequence as the top one and are hence considered to be contained with the top element.\n\n#ifdef DEBUGOVERLAP\n\t    std::cout << \"ext_gcount.get($) \" << ext_count.get('$') << \"\\n\";\n#endif             \n\n            if(ext_count.get('$') > 0)\n            {\n                // An irreducible overlap has been found. It is possible that there are two top level blocks\n                // (one in the forward and reverse direction). Since we can't decide which one\n                // contains the other at this point, we output hits to both. Under a fixed \n                // length string assumption one will be contained within the other and removed later.\n                OBLIter tlbIter = currList.begin();\n                while(tlbIter != currList.end() && tlbIter->overlapLen == topLen)\n                {\n                    // Ensure the tlb is actually terminal and not a substring block\n                    AlphaCount64 test_count = tlbIter->getCanonicalExtCount(pBWT, pRevBWT);\n                    if(test_count.get('$') == 0)\n                    {\n                        std::cerr << \"Error: substring read found during overlap computation.\\n\";\n                        std::cerr << \"Please run sga rmdup before sga overlap\\n\";\n                        exit(EXIT_FAILURE);\n                    }\n                    \n                    // Perform the final right-update to make the block terminal\n                    OverlapBlock branched = *tlbIter;\n                    BWTAlgorithms::updateBothR(branched.ranges, '$', branched.getExtensionBWT(pBWT, pRevBWT));\n                    pOBFinal->push_back(branched);\n#ifdef DEBUGOVERLAP\n                    std::cout << \"[IE] TLB of length \" << branched.overlapLen << \" has ended\\n\";\n                    std::cout << \"[IE]\\tBlock data: \" << branched << \"\\n\";\n#endif             \n                    ++tlbIter;\n                } \n\n                // Set the flag to erase this group, it is finished\n                bEraseGroup = true;\n            }\n            else\n            {\n                // Count the extension for the rest of the blocks\n                while(blockIter != currList.end())\n                {\n                    ext_count += blockIter->getCanonicalExtCount(pBWT, pRevBWT);\n                    ++blockIter;\n                }\n\n                if(ext_count.hasUniqueDNAChar())\n                {\n                    // Update all the blocks using the unique extension character\n                    // This character is in the canonical representation wrt to the query\n                    char b = ext_count.getUniqueDNAChar();\n                    updateOverlapBlockRangesRight(pBWT, pRevBWT, currList, b);\n                    numExtensions++;\n                    bEraseGroup = false;\n                }\n                else\n                {\n                    for(size_t idx = 0; idx < DNA_ALPHABET_SIZE; ++idx)\n                    {\n                        char b = ALPHABET[idx];\n                        if(ext_count.get(b) > 0)\n                        {\n                            numBranches++;\n                            OverlapBlockList branched = currList;\n                            updateOverlapBlockRangesRight(pBWT, pRevBWT, branched, b);\n                            incomingGroups.push_back(branched);\n                            bEraseGroup = true;\n                        }\n                    }\n                }\n            }\n\n            if(bEraseGroup)\n                groupIter = blockGroups.erase(groupIter);\n            else\n                ++groupIter;\n        }\n\n        // Splice in the newly branched blocks, if any\n        blockGroups.splice(blockGroups.end(), incomingGroups);\n    }\n}\n\n// Classify the blocks in obList as irreducible, transitive or substrings. The irreducible blocks are\n// put into pOBFinal. The remaining are discarded.\n// Invariant: the blocks are ordered in descending order of the overlap size so that the longest overlap is first.\nvoid OverlapAlgorithm::_processIrreducibleBlocksInexact(const BWT* pBWT, const BWT* pRevBWT, \n                                                        OverlapBlockList& activeList, \n                                                        OverlapBlockList* pOBFinal) const\n{\n    if(activeList.empty())\n        return;\n\n#ifdef DEBUGOVERLAP\n\tstd::cout << \" activeList.size() \" << activeList.size() << \"\\n\";\n#endif       \n    \n    // The activeList contains all the blocks that are not yet right terminal\n    // Count the extensions in the top level (longest) blocks first\n    bool all_eliminated = false;\n    while(!activeList.empty() && !all_eliminated)\n    {\n        // The terminalBlock list contains all the blocks that became right-terminal\n        // in the current extension round.\n        OverlapBlockList terminalList;\n        OverlapBlockList potentialContainedList;\n\n        // Perform a single round of extension, any terminal blocks\n        // are moved to the terminated list\n        extendActiveBlocksRight(pBWT, pRevBWT, activeList, terminalList, potentialContainedList);\n\n        // Compare the blocks in the contained list against the other terminal and active blocks\n        // If they are a substring match to any of these, discard them\n        OverlapBlockList::iterator containedIter = potentialContainedList.begin();\n        for(; containedIter != potentialContainedList.end(); ++containedIter)\n        {\n           if(!isBlockSubstring(*containedIter, terminalList, m_errorRate) && \n              !isBlockSubstring(*containedIter, activeList, m_errorRate))\n           {\n                // Not a substring, move to terminal list\n                terminalList.push_back(*containedIter);\n                //std::cout << \"Contained block kept: \" << containedIter->overlapLen << \"\\n\";\n           }\n           else\n           {\n                //std::cout << \"Contained block found and removed: \" << containedIter->overlapLen << \"\\n\";\n           }\n        }\n\n        // Using the terminated blocks, mark as eliminated any active blocks\n        // that form a valid overlap to the terminal block. These are transitive edges\n        // We do not compare two terminal blocks, we don't consider these overlaps to be\n        // transitive\n#ifdef DEBUGOVERLAP\n\tstd::cout << \" terminalList.sizee() \" << terminalList.size() << \"\\n\";\n#endif       \n\n        OverlapBlockList::iterator terminalIter = terminalList.begin();\n        for(; terminalIter != terminalList.end(); ++terminalIter)\n        {\n#ifdef DEBUGOVERLAP\n            std::cout << \"[II] ***TLB of length \" << terminalIter->overlapLen << \" has ended\\n\";\n#endif       \n            all_eliminated = true;\n            OverlapBlockList::iterator activeIter = activeList.begin();\n            for(; activeIter != activeList.end(); ++activeIter)\n            {\n                if(activeIter->isEliminated)\n                    continue; // skip previously marked blocks\n                \n                // Two conditions must be met for a block to be transitive wrt terminal:\n                // 1) It must have a strictly shorter overlap than the terminal block\n                // 2) The error rate between the block and terminal must be less than the threshold\n                double inferredErrorRate = calculateBlockErrorRate(*terminalIter, *activeIter);\n                if(activeIter->overlapLen < terminalIter->overlapLen && \n                   isErrorRateAcceptable(inferredErrorRate, m_errorRate))\n                {\n#ifdef DEBUGOVERLAP_2                            \n                    std::cout << \"Marking block of length \" << activeIter->overlapLen << \" as eliminated\\n\";\n#endif\n                    activeIter->isEliminated = true;\n                }\n                else\n                {\n                    all_eliminated = false;\n                }\n            } \n            \n            // Move this block to the final list if it has not been previously marked eliminated\n            if(!terminalIter->isEliminated)\n            {\n#ifdef DEBUGOVERLAP\n                std::cout << \"[II] Adding block \" << *terminalIter << \" to final list\\n\";\n                //std::cout << \"  extension: \" << terminalIter->forwardHistory << \"\\n\";\n#endif                \n                pOBFinal->push_back(*terminalIter);\n            }\n        }\n    }\n\n    activeList.clear();\n}\n\n// Extend all the blocks in activeList by one base to the right\n// Move all right-terminal blocks to the termainl list. If a block \n// is terminal and potentially contained by another block, add it to \n// containedList\nvoid OverlapAlgorithm::extendActiveBlocksRight(const BWT* pBWT, const BWT* pRevBWT, \n                                               OverlapBlockList& activeList, \n                                               OverlapBlockList& terminalList,\n                                               OverlapBlockList& /*containedList*/) const\n{\n    OverlapBlockList::iterator iter = activeList.begin();\n    OverlapBlockList::iterator next;\n    while(iter != activeList.end())\n    {\n        next = iter;\n        ++next;\n\n        // Check if block is terminal\n        AlphaCount64 ext_count = iter->getCanonicalExtCount(pBWT, pRevBWT);\n        if(ext_count.get('$') > 0)\n        {\n            // Only consider this block to be terminal irreducible if it has at least one extension\n            // or else it is a substring block\n            if(iter->forwardHistory.size() > 0)\n            {\n                OverlapBlock branched = *iter;\n                BWTAlgorithms::updateBothR(branched.ranges, '$', branched.getExtensionBWT(pBWT, pRevBWT));\n                terminalList.push_back(branched);\n#ifdef DEBUGOVERLAP_2            \n                std::cout << \"Block of length \" << iter->overlapLen << \" moved to terminal\\n\";\n#endif\n            }\n        }\n\n        int curr_extension = iter->forwardHistory.size();\n\n        // Perform the right extensions\n        \n        // Best case, there is only a single extension character\n        // Handle this case specially so we don't need to copy the potentially\n        // large OverlapBlock structure and its full history\n        if(ext_count.hasUniqueDNAChar())\n        {\n            // Get the extension character with respect to the queried sequence\n            char canonical_base = ext_count.getUniqueDNAChar();\n\n            // Flip the base into the frame of reference for the block\n            char block_base = iter->flags.isQueryComp() ? complement(canonical_base) : canonical_base;\n\n            // Update the block using the base in its frame of reference\n            BWTAlgorithms::updateBothR(iter->ranges, block_base, iter->getExtensionBWT(pBWT, pRevBWT));\n\n            // Add the base to the history in the frame of reference of the query read\n            // This is so the history is consistent when comparing between blocks from different strands\n            iter->forwardHistory.add(curr_extension, canonical_base);\n        }\n        else\n        {\n            for(size_t idx = 0; idx < DNA_ALPHABET_SIZE; ++idx)\n            {\n                char canonical_base = ALPHABET[idx];\n                char block_base = iter->flags.isQueryComp() ? complement(canonical_base) : canonical_base;\n                if(ext_count.get(canonical_base) == 0)\n                    continue;\n\n                // Branch the sequence. This involves copying the entire history which can be large\n                // if the input sequences are very long. This could be avoided by using the SearchHistoyNode/Link\n                // structure but branches are infrequent enough to not have a large impact\n                OverlapBlock branched = *iter;\n                BWTAlgorithms::updateBothR(branched.ranges, block_base, branched.getExtensionBWT(pBWT, pRevBWT));\n                assert(branched.ranges.isValid());\n\n                // Add the base in the canonical frame\n                branched.forwardHistory.add(curr_extension, canonical_base);\n\n                // Insert the new block after the iterator\n                activeList.insert(iter, branched);\n            }\n\n            // Remove the original block, which has been superceded by the branches\n            activeList.erase(iter);\n        }\n\n        iter = next; // this skips the newly-inserted blocks\n    }\n} \n\n// Return true if the terminalBlock is a substring of any member of blockList\nbool OverlapAlgorithm::isBlockSubstring(OverlapBlock& terminalBlock, const OverlapBlockList& blockList, double maxER) const\n{\n    OverlapBlockList::const_iterator iter = blockList.begin();\n    size_t right_extension_length = terminalBlock.forwardHistory.size();\n    for(; iter != blockList.end(); ++iter)\n    {\n        if(terminalBlock.overlapLen == iter->overlapLen && \n           right_extension_length == iter->forwardHistory.size())\n        {\n            continue; // same length, cannot be a substring\n        }\n        \n        // Calculate error rate between blocks\n        double er = calculateBlockErrorRate(terminalBlock, *iter);\n        if(isErrorRateAcceptable(er, maxER))\n            return true;\n    }\n    return false;\n}\n\n// Calculate the error rate between two overlap blocks using their history\ndouble OverlapAlgorithm::calculateBlockErrorRate(const OverlapBlock& terminalBlock, const OverlapBlock& otherBlock) const\n{\n    int back_max = std::min(terminalBlock.overlapLen, otherBlock.overlapLen);\n    int backwards_diff = SearchHistoryVector::countDifferences(terminalBlock.backHistory, otherBlock.backHistory, back_max);\n\n    // We compare the forward (right) extension only up to the last position of the terminated block's extension\n    int forward_len = terminalBlock.forwardHistory.size();\n    int forward_max = forward_len - 1;\n    int forward_diff = SearchHistoryVector::countDifferences(terminalBlock.forwardHistory, otherBlock.forwardHistory, forward_max);\n\n    // Calculate the length of the inferred overlap\n    int trans_overlap_length = back_max + forward_len;\n    double er = static_cast<double>(backwards_diff + forward_diff) / trans_overlap_length;\n            \n#ifdef DEBUGOVERLAP_2\n    std::cout << \"OL: \" << terminalBlock.overlapLen << \"\\n\";\n    std::cout << \"TLB BH: \" << terminalBlock.backHistory << \"\\n\";\n    std::cout << \"TB  BH: \" << otherBlock.backHistory << \"\\n\";\n    std::cout << \"TLB FH: \" << terminalBlock.forwardHistory << \"\\n\";\n    std::cout << \"TB  FH: \" << otherBlock.forwardHistory << \"\\n\";\n    std::cout << \"BM: \" << back_max << \" FM: \" << forward_max << \"\\n\";\n    std::cout << \"IOL: \" << trans_overlap_length << \" TD: \" << (backwards_diff + forward_diff) << \"\\n\";\n    std::cout << \"Block of length \" << otherBlock.overlapLen << \" has ier: \" << er << \"\\n\";\n#endif\n    return er;\n}\n\n// Update the overlap block list with a righthand extension to b, removing ranges that become invalid\nvoid OverlapAlgorithm::updateOverlapBlockRangesRight(const BWT* pBWT, const BWT* pRevBWT, \n                                                     OverlapBlockList& obList, char canonical_base) const\n{\n    OverlapBlockList::iterator iter = obList.begin(); \n    while(iter != obList.end())\n    {\n        char relative_base = iter->flags.isQueryComp() ? complement(canonical_base) : canonical_base;\n        BWTAlgorithms::updateBothR(iter->ranges, relative_base, iter->getExtensionBWT(pBWT, pRevBWT));\n        // remove the block from the list if its no longer valid\n        if(!iter->ranges.isValid())\n        {\n            iter = obList.erase(iter);\n        }\n        else\n        {\n            // Add the base to the extension history\n            int currExtension = iter->forwardHistory.size();\n            iter->forwardHistory.add(currExtension, canonical_base);\n            ++iter;\n        }\n    }\n}\n\n"
  },
  {
    "path": "src/SGA/Algorithm/OverlapAlgorithm.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// OverlapAlgorithm - This class implements all the logic\n// for finding and outputting overlaps for sequence reads\n//\n#ifndef OVERLAPALGORITHM_H\n#define OVERLAPALGORITHM_H\n\n// be explicit because there are two bwt.h (in bwa) and BWT.h (in SGA)\n#include \"SuffixTools/BWT.h\"\n\n#include \"OverlapBlock.h\"\n#include \"SearchSeed.h\"\n#include \"BWTAlgorithms.h\"\n#include \"Util.h\"\n\nenum OverlapMode\n{\n    OM_OVERLAP,\n    OM_FULLREAD\n};\n\nstruct OverlapResult\n{\n    OverlapResult() : isSubstring(false), searchAborted(false) {}\n    bool isSubstring;\n    bool searchAborted;\n};\n\nclass OverlapAlgorithm\n{\n    public:\n\n        OverlapAlgorithm(const BWT* pBWT, const BWT* pRevBWT, \n                         double er, int seedLen, int seedStride,\n                         bool irrOnly, int maxSeeds = -1) : m_pBWT(pBWT), \n                                         m_pRevBWT(pRevBWT),\n                                         m_errorRate(er),\n                                         m_seedLength(seedLen),\n                                         m_seedStride(seedStride),\n                                         m_bIrreducible(irrOnly),\n                                         m_exactModeOverlap(false),\n                                         m_exactModeIrreducible(false),\n                                         m_maxSeeds(maxSeeds) {}\n\n        // Perform the overlap\n        // This function is threaded so everything must be const\n        OverlapResult overlapRead(const SeqRecord& read, int minOverlap, OverlapBlockList* pOutList) const;\n    \n        // Perform an irreducible overlap\n        OverlapResult overlapReadExact(const SeqRecord& read, int minOverlap, OverlapBlockList* pOBOut) const;\n\n        // Find duplicate blocks for this read\n        OverlapResult alignReadDuplicate(const SeqRecord& read, OverlapBlockList* pOBOut) const;\n\n        // Perform an inexact overlap\n        OverlapResult overlapReadInexact(const SeqRecord& read, int minOverlap, OverlapBlockList* pOBOut) const;\n\n        // Write the result of an overlap to an ASQG file\n        void writeResultASQG(std::ostream& writer, const SeqRecord& read, const OverlapResult& result) const;\n\n        // Write all the overlap blocks pList to the filehandle\n        void writeOverlapBlocks(std::ostream& writer, size_t readIdx, bool isSubstring, const OverlapBlockList* pList) const;\n        void writeOverlapBlocks(std::stringstream& writer, size_t readIdx, bool isSubstring, const OverlapBlockList* pList) const; //JEREMIAH\n\n        // Build the forward history structures for the blocks\n        void buildForwardHistory(OverlapBlockList* pList) const;\n\n        // Set flag to use exact-match algorithms only\n        void setExactModeOverlap(bool b) { m_exactModeOverlap = b; }\n        void setExactModeIrreducible(bool b) { m_exactModeIrreducible = b; }\n\n        //\n        const BWT* getBWT() const { return m_pBWT; }\n        const BWT* getRBWT() const { return m_pRevBWT; }\n        \n    private:\n\n        // Calculate the ranges in pBWT that contain a prefix of at least minOverlap basepairs that\n        // overlaps with a suffix of w.\n        void findOverlapBlocksExact(const std::string& w, const BWT* pBWT, const BWT* pRevBWT, \n                                    const AlignFlags& af, const int minOverlap, OverlapBlockList* pOBTemp, \n                                    OverlapBlockList* pOBFinal, OverlapResult& result) const;\n\n        // Same as above while allowing mismatches\n        bool findOverlapBlocksInexact(const std::string& w, const BWT* pBWT, const BWT* pRevBWT, \n                                      const AlignFlags& af, const int minOverlap, OverlapBlockList* pOBList, \n                                      OverlapBlockList* pOBFinal, OverlapResult& result) const;\n\n        //\n        inline bool extendSeedExactRight(SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT) const;\n        inline bool extendSeedExactLeft(SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT) const;\n\n        inline void branchSeedRight(const SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT, SearchSeedQueue* pQueue) const;\n        inline void branchSeedLeft(const SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT, SearchSeedQueue* pQueue) const;\n\n        //\n        inline void extendSeedInexactRight(SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT, \n                                           SearchSeedVector* pOutVector) const;\n\n        //\n        inline void extendSeedInexactLeft(SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT,\n                                          SearchSeedVector* pOutVector) const;\n\n\n        //\n        inline void calculateSeedParameters(const std::string& w, const int minOverlap, int& seed_length, int& seed_stride) const;\n        \n        //\n        inline int createSearchSeeds(const std::string& w, const BWT* pBWT, \n                                     const BWT* pRevBWT, int seed_length, int seed_stride, \n                                     SearchSeedVector* pOutVector) const;\n\n        //\n        inline void extendSeedsExactRightQueue(const std::string& w, const BWT* pBWT, const BWT* pRevBWT, \n                                                 ExtendDirection dir, const SearchSeedVector* pInVector, \n                                                 SearchSeedQueue* pOutQueue) const;\n\n        //\n        inline void extendSeedsExactRight(const std::string& w, const BWT* pBWT, const BWT* pRevBWT, \n                                                 ExtendDirection dir, const SearchSeedVector* pInVector, \n                                                 SearchSeedVector* pOutVector) const;\n        \n        // Calculate the terminal extension for the contained blocks to make the intervals consistent\n        void terminateContainedBlocks(OverlapBlockList& containedBlocks) const;\n\n        //                    \n        // Irreducible-only processing algorithms\n        //\n        // Reduce the block list pOBList by removing blocks that correspond to transitive edges\n        void computeIrreducibleBlocks(const BWT* pBWT, const BWT* pRevBWT, \n                                      OverlapBlockList* pOBList, OverlapBlockList* pOBFinal) const;\n        \n        // these recursive functions do the actual work of computing the irreducible blocks\n        void _processIrreducibleBlocksExact(const BWT* pBWT, const BWT* pRevBWT, \n                                            OverlapBlockList& obList, OverlapBlockList* pOBFinal) const;\n\n\n        void _processIrreducibleBlocksExactIterative(const BWT* pBWT, \n                                                     const BWT* pRevBWT, \n                                                     OverlapBlockList& inList, \n                                                     OverlapBlockList* pOBFinal) const;\n        //\n        void _processIrreducibleBlocksInexact(const BWT* pBWT, const BWT* pRevBWT, \n                                              OverlapBlockList& obList, OverlapBlockList* pOBFinal) const;\n\n        // Update the overlap block list with a righthand extension to b, removing ranges that become invalid\n        void updateOverlapBlockRangesRight(const BWT* pBWT, const BWT* pRevBWT, \n                                           OverlapBlockList& obList, char b) const;\n         \n        //                                  \n        void extendActiveBlocksRight(const BWT* pBWT, const BWT* pRevBWT, \n                                     OverlapBlockList& activeList, \n                                     OverlapBlockList& terminalList,\n                                     OverlapBlockList& containedList) const;\n\n        double calculateBlockErrorRate(const OverlapBlock& terminalBlock, const OverlapBlock& otherBlock) const;\n        bool isBlockSubstring(OverlapBlock& terminalBlock, const OverlapBlockList& blockList, double maxER) const;\n\n        // Data\n        const BWT* m_pBWT;\n        const BWT* m_pRevBWT;\n        double m_errorRate;\n        int m_seedLength;\n        int m_seedStride;\n        bool m_bIrreducible;\n        bool m_exactModeOverlap;\n        bool m_exactModeIrreducible;\n        \n        // Optional parameter to limit the amount of branching that is performed\n        int m_maxSeeds; \n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/OverlapBlock.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// OverlapBlock - Data structures holding\n// the result of the alignment of a sequence read\n// to a BWT\n// \n#include \"OverlapBlock.h\"\n#include \"BWTAlgorithms.h\"\n\n//#define DEBUG_RESOLVE 1\n\n// \nOverlapBlock::OverlapBlock(BWTIntervalPair r,\n                           BWTIntervalPair rawI,\n                           int ol, \n                           int nd, \n                           const AlignFlags& af, \n                           const SearchHistoryVector& backHist) : ranges(r), \n                                                                  rawRanges(rawI),\n                                                                  overlapLen(ol), \n                                                                  numDiff(nd),\n                                                                  flags(af),\n                                                                  isEliminated(false),\n                                                                  backHistory(backHist)\n{\n    backHistory.normalize(af.isQueryComp());\n}\n\n// Return a pointer to the BWT that should be used to extend the block\n// this is the opposite BWT that was used in the backwards search\nconst BWT* OverlapBlock::getExtensionBWT(const BWT* pBWT, const BWT* pRevBWT) const\n{\n    if(!flags.isTargetRev())\n        return pRevBWT;\n    else\n        return pBWT;\n}\n\n// \nAlphaCount64 OverlapBlock::getCanonicalExtCount(const BWT* pBWT, const BWT* pRevBWT) const\n{\n    AlphaCount64 out = BWTAlgorithms::getExtCount(ranges.interval[1], getExtensionBWT(pBWT, pRevBWT));\n    if(flags.isQueryComp())\n        out.complement();\n    return out;\n}\n\n// Returns 0 if the BWT used for the overlap step was the forward BWT\nint OverlapBlock::getCanonicalIntervalIndex() const\n{\n    if(!flags.isTargetRev())\n        return 0;\n    else\n        return 1;\n}\n\n//\nBWTInterval OverlapBlock::getCanonicalInterval() const\n{\n    return ranges.interval[getCanonicalIntervalIndex()];\n}\n\n// Get the string corresponding to the overlap block. This is the string found\n// during the backwards search\nstd::string OverlapBlock::getOverlapString(const std::string& original) const\n{\n    std::string transformed = backHistory.transform(original, flags.isQueryRev());\n    // If the query was reversed, we take the first overlapLen (the search\n    // was from the front of the sequence) otherwise we take the last overlapLen\n    if(flags.isQueryRev())\n        return transformed.substr(0, overlapLen);\n    else\n        return transformed.substr(transformed.length() - overlapLen);\n}\n\n// Get the full string corresponding to this overlapblock using the forward history\nstd::string OverlapBlock::getFullString(const std::string& original) const\n{\n    std::string str = getOverlapString(original);\n    std::string history = forwardHistory.getBaseString();\n\n    if(history.empty() && overlapLen != (int)original.size())\n    {\n        WARN_ONCE(\"getFullString() called on block with no history\")\n    }\n/*\n    std::cout << \"OVERLAP: \" << str << \"\\n\";\n    std::cout << \"HIST: \" << history << \"\\n\";\n    std::cout << \"QREV: \" << flags.isQueryRev() << \"\\n\";\n    std::cout << \"RC: \" << flags.isReverseComplement() << \"\\n\";\n    std::cout << \"QC: \" << flags.isQueryComp() << \"\\n\";\n*/\n    if(!flags.isQueryRev())\n    {\n        str.append(history);\n    }\n    else\n    {\n        history = reverse(history);\n        history.append(str);\n        str.swap(history);\n    }\n\n    if(flags.isReverseComplement())\n        str = reverseComplement(str);\n    return str;\n}\n\n\nEdgeDir OverlapBlock::getEdgeDir() const\n{\n    if(flags.isQueryRev())\n        return ED_ANTISENSE;\n    else\n        return ED_SENSE;\n}\n\n//\nOverlap OverlapBlock::toOverlap(const std::string queryID, const std::string targetID, int queryLen, int targetLen) const\n{\n    // Compute the sequence coordinates\n    int s1 = queryLen - overlapLen;\n    int e1 = s1 + overlapLen - 1;\n    SeqCoord sc1(s1, e1, queryLen);\n\n    int s2 = 0; // The start of the second hit must be zero by definition of a prefix/suffix match\n    int e2 = s2 + overlapLen - 1;\n    SeqCoord sc2(s2, e2, targetLen);\n\n    // The coordinates are always with respect to the read, so flip them if\n    // we aligned to/from the reverse of the read\n    if(flags.isQueryRev())\n    {\n        sc1.flip();\n    }\n    if(flags.isTargetRev())\n    {\n        sc2.flip();\n    }\n    bool isRC = flags.isReverseComplement();\n\n    Overlap o(queryID, sc1, targetID, sc2, isRC, numDiff);\n    return o;\n}\n\n//\nstd::string OverlapBlock::toCanonicalID() const\n{\n    std::stringstream ss;\n    int ci = getCanonicalIntervalIndex();\n    ss << \"IDX-\" << ranges.interval[ci].lower;\n    return ss.str();\n}\n\n\n//\nvoid printBlockList(const OverlapBlockList* pList)\n{\n    for(OverlapBlockList::const_iterator i = pList->begin(); i != pList->end(); ++i)\n    {\n        std::cout << \"Block: \" << *i << \"\\n\";\n    }\n}\n\n//\nvoid removeSubMaximalBlocks(OverlapBlockList* pList, const BWT* pBWT, const BWT* pRevBWT)\n{\n    // This algorithm removes any sub-maximal OverlapBlocks from pList\n    // The list is sorted by the left coordinate and iterated through\n    // if two adjacent blocks overlap they are split into maximal contiguous regions\n    // with resolveOverlap. The resulting list is merged back into pList. This process\n    // is repeated until each block in pList is a unique range\n    // The bookkeeping in the intersecting case could be more efficient \n    // but the vast vast majority of the cases will not have overlapping \n    // blocks.\n    pList->sort(OverlapBlock::sortIntervalLeft);\n    OverlapBlockList::iterator iter = pList->begin();\n    OverlapBlockList::iterator last = pList->end();\n    --last;\n\n    while(iter != pList->end())\n    {\n        OverlapBlockList::iterator next = iter;\n        ++next;\n\n        if(next == pList->end())\n            break;\n\n        // Check if iter and next overlap\n        if(Interval::isIntersecting(iter->ranges.interval[0].lower, iter->ranges.interval[0].upper, \n                                    next->ranges.interval[0].lower, next->ranges.interval[0].upper))\n        {\n            OverlapBlockList resolvedList = resolveOverlap(*iter, *next, pBWT, pRevBWT);\n            \n            // Merge the new elements in and start back from the beginning of the list\n            pList->erase(iter);\n            pList->erase(next);\n            pList->merge(resolvedList, OverlapBlock::sortIntervalLeft);\n            iter = pList->begin();\n\n            //std::cout << \"After splice: \\n\";\n            //printList(pList);\n        }\n        else\n        {\n            ++iter;\n        }\n    }\n}\n\n// A tracing interval maps an interval of an overlap block representing\n// a smaller overlap to an overlap block with a larger overlap. This is\n// used to determine which intervals are redundant and can be removed.\nstruct TracingInterval\n{\n    int64_t foundPosForward;\n    int64_t sourcePosReverse;\n    BWTInterval tracing;\n    BWTIntervalPair updateRanges;\n};\n\ntypedef std::list<TracingInterval> TracingIntervalList;\n\n// In rare cases, the overlap blocks may represent sub-maximal overlaps between reads\n// we need to distinguish these cases and remove the sub-optimal hits. This\n// function splits two overlapping OverlapBlocks into up to three distinct\n// blocks, keeping the maximal (longest) overlap at each stage.\nOverlapBlockList resolveOverlap(const OverlapBlock& A, const OverlapBlock& B, const BWT* pBWT, const BWT* pRevBWT)\n{\n    OverlapBlockList outList;\n\n    // Check if A and B have the same overlap length, if so they must be \n    // identical blocks (resulting from different seeds) and we can remove one\n    if(A.overlapLen == B.overlapLen)\n    {\n        if(A.ranges.interval[0].lower == B.ranges.interval[0].lower &&\n           A.ranges.interval[0].upper == B.ranges.interval[0].upper)\n        {\n            outList.push_back(A);\n            return outList;\n        }\n        else\n        {\n            std::cerr << \"Error in resolveOverlap: Overlap blocks with same length do not \"\n            \"the have same coordinates\\n\";\n            assert(false);\n        }    \n    }\n    // A and B must have different overlap lengths\n    assert(A.overlapLen != B.overlapLen);\n\n    // Determine which of A and B have a higher overlap\n    const OverlapBlock* pHigher;\n    const OverlapBlock* pLower;\n    if(A.overlapLen > B.overlapLen)\n    {\n        pHigher = &A;\n        pLower = &B;\n    }\n    else\n    {\n        pHigher = &B;\n        pLower = &A;\n    }\n\n    // Complicated logic follows\n    // We always want the entirity of the block with the longer\n    // overlap so it is added to outList unmodified\n    outList.push_back(*pHigher);\n\n    // The lower block can be split into up to two pieces:\n    // Case 1:\n    //     Lower  ------ \n    //     Higher    ------\n    //     Result ---\n    //\n    // Case 2:\n    //     Lower  -----------\n    //     Higher    ------\n    //     Result ---      --\n    //\n    // Case 3:\n    //     Lower  ------\n    //     Higher ------\n    //     Result (empty set)\n\n    // It is unclear whether case 2 can happen in reality but we handle it \n    // here anyway. Further complicating matters is that the BWTIntervalPair\n    // keeps track of both the BWT coordinates for the backwards search\n    // and forward search and we must take care to ensure that both intervals\n    // are updated and the mapping between them is correct. We do this\n    // by calculating the new forward interval using interval intersections\n    // and directly recalculating the coordinate of the reverse interval\n    //\n    OverlapBlock split = *pLower;\n\n    // Left-hand split\n    if( (pLower->ranges.interval[0].lower < pHigher->ranges.interval[0].lower) ||\n        (pLower->ranges.interval[0].upper > pHigher->ranges.interval[0].upper) )\n    {\n        // The intervals do not perfectly overlap and must be recalculated. \n        // We start from the raw intervals in the lower block (the intervals representing\n        // overlaps that are not capped by '$' symbols) and search backwards through the\n        // bwt until the start of the sequence has been found. This maps the source reverse\n        // index position to the forward index position. We can then decide which intervals\n        // are redundant and can be removed.\n        //\n        // If the index has duplicates, it is possible that a given source reverse position\n        // will map to multiple forward positions. To handle this case, we record the used\n        // forward positions in a std::map so we can lookup the next lowest index that is available.\n        //\n        // A better algorithm (that doesn't required so many interval calculations) probably exists\n        // but this case is very rare so simplicity wins here.\n        //\n\n#ifdef DEBUG_RESOLVE\n        std::cout << \"LOWER -- capped: \" << pLower->ranges << \"\\n\";\n        std::cout << \"LOWER -- raw: \" << pLower->rawRanges << \"\\n\";\n        std::cout << \"HIGHER -- capped: \" << pHigher->ranges << \"\\n\";\n        std::cout << \"HIGHER -- raw: \" << pHigher->rawRanges << \"\\n\";\n#endif\n\n        std::map<int64_t, int64_t> usedMap;\n\n        // Remap every reverse position to a forward position\n        TracingIntervalList tracingList;\n        int64_t j = pLower->ranges.interval[1].lower;\n        while(j <= pLower->ranges.interval[1].upper)\n        {\n            TracingInterval ti;\n            ti.sourcePosReverse = j;\n\n            ti.tracing.lower = j;\n            ti.tracing.upper = j;\n\n            ti.updateRanges = pLower->rawRanges;\n\n            bool done = false;\n            while(!done)\n            {\n                char trace_base = pRevBWT->getChar(ti.tracing.lower);\n                if(trace_base == '$')\n                {\n                    BWTAlgorithms::updateBothL(ti.updateRanges, '$', pBWT);\n                    done = true;\n                }\n                BWTAlgorithms::updateInterval(ti.tracing, trace_base, pRevBWT);\n                BWTAlgorithms::updateBothR(ti.updateRanges, trace_base, pRevBWT);\n            }\n            \n            if(ti.updateRanges.interval[0].lower == ti.updateRanges.interval[0].upper)\n            {\n                // This read is not duplicated\n                ti.foundPosForward = ti.updateRanges.interval[0].lower;\n            }\n            else\n            {\n                // This read is duplicated, look up its value in the map\n                int64_t basePos = ti.updateRanges.interval[0].lower;\n                if(usedMap.find(basePos) != usedMap.end())\n                {\n                    // Use the value in the map and update it\n                    ti.foundPosForward = usedMap[basePos];\n                    assert(ti.foundPosForward > ti.updateRanges.interval[0].lower && \n                           ti.foundPosForward <= ti.updateRanges.interval[0].upper);\n                    usedMap[basePos]++;\n                }\n                else\n                {\n                    // Use the base value and initialize the map\n                    ti.foundPosForward = basePos;\n                    usedMap[basePos] = basePos + 1;\n                }\n            }\n            ++j;\n            tracingList.push_back(ti);\n        }\n\n        // Reset the mapping between blocks\n        std::list<BWTIntervalPair> retainedIntervals;\n        TracingIntervalList::iterator tracingIter = tracingList.begin();\n        while(tracingIter != tracingList.end())\n        {\n            // Check if the forward position intersects the higher block, if so this block\n            // is redundant and can be removed.\n            if(!Interval::isIntersecting(tracingIter->foundPosForward, tracingIter->foundPosForward,\n                                         pHigher->ranges.interval[0].lower, pHigher->ranges.interval[0].upper))\n            {\n                BWTIntervalPair retained;\n                \n                retained.interval[0].lower = tracingIter->foundPosForward;\n                retained.interval[0].upper = tracingIter->foundPosForward;\n                retained.interval[1].lower = tracingIter->sourcePosReverse;\n                retained.interval[1].upper = tracingIter->sourcePosReverse;\n\n#ifdef DEBUG_RESOLVE\n                std::cout << \"Retained coords: \" << retained << \"\\n\";\n#endif\n                retainedIntervals.push_back(retained);\n            }\n            ++tracingIter;\n        }\n        \n        // Write out the final blocks\n        std::list<BWTIntervalPair>::iterator iter = retainedIntervals.begin();\n        while(iter != retainedIntervals.end())\n        {\n#ifdef DEBUG_RESOLVE\n            std::cout << \"OUTPUT: \" << *iter << \"\\n\";\n#endif\n            split.ranges = *iter;\n\n            // Sanity check\n            assert(split.ranges.interval[0].size() == split.ranges.interval[1].size());\n            assert(split.ranges.interval[0].isValid());\n            assert(split.ranges.interval[1].isValid());\n\n            outList.push_back(split);\n            ++iter;\n        }\n    }\n\n    // Sort the outlist by left coordinate\n    outList.sort(OverlapBlock::sortIntervalLeft);\n    return outList;\n}\n\n// Partition the overlap block list into two lists, \n// one for the containment overlaps and one for the proper overlaps\nvoid partitionBlockList(int readLen, OverlapBlockList* pCompleteList, \n                        OverlapBlockList* pOverlapList, \n                        OverlapBlockList* pContainList)\n{\n    OverlapBlockList::iterator iter = pCompleteList->begin();\n    while(iter != pCompleteList->end())\n    {\n        if(iter->overlapLen == readLen)\n            pContainList->splice(pContainList->end(), *pCompleteList, iter++);\n        else\n            pOverlapList->splice(pOverlapList->end(), *pCompleteList, iter++);\n    }\n}\n\n// Filter out full-length (containment) overlaps from the block list\nvoid removeContainmentBlocks(int readLen, OverlapBlockList* pList)\n{\n    OverlapBlockList::iterator iter = pList->begin();\n    while(iter != pList->end())\n    {\n        if(iter->overlapLen == readLen)\n            iter = pList->erase(iter);\n        else\n            ++iter;\n    }    \n}\n\n// \nMultiOverlap blockListToMultiOverlap(const SeqRecord& record, OverlapBlockList& blockList)\n{\n    std::string read_idx = record.id;\n    std::string read_seq = record.seq.toString();\n    std::string qual = record.qual;\n    MultiOverlap out(read_idx, read_seq, qual);\n\n    for(OverlapBlockList::iterator iter = blockList.begin(); iter != blockList.end(); ++iter)\n    {\n        std::string overlap_string = iter->getOverlapString(read_seq);\n\n        // Compute the endpoints of the overlap\n        int s1 = read_seq.length() - iter->overlapLen;\n        int e1 = s1 + iter->overlapLen - 1;\n        SeqCoord sc1(s1, e1, read_seq.length());\n\n        int s2 = 0; // The start of the second hit must be zero by definition of a prefix/suffix match\n        int e2 = s2 + iter->overlapLen - 1;\n        SeqCoord sc2(s2, e2, overlap_string.length());\n\n        // The coordinates are always with respect to the read, so flip them if\n        // we aligned to/from the reverse of the read\n        if(iter->flags.isQueryRev())\n            sc1.flip();\n        if(iter->flags.isTargetRev())\n            sc2.flip();\n\n        bool isRC = false; // since we transformed the original sequence, they are never RC\n        if(sc1.isContained())\n            continue; // skip containments\n\n        // Add an overlap for each member of the block\n        for(int64_t i = iter->ranges.interval[0].lower; i <= iter->ranges.interval[0].upper; ++i)\n        {\n            Overlap o(read_idx, sc1, makeIdxString(i), sc2, isRC, -1);\n            out.add(overlap_string, o);\n        }\n    }\n    return out;\n}\n\n// make an id string from a read index\nstd::string makeIdxString(int64_t idx)\n{\n    std::stringstream ss;\n    ss << idx;\n    return ss.str();\n}\n\n"
  },
  {
    "path": "src/SGA/Algorithm/OverlapBlock.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// OverlapBlock - Data structures holding\n// the result of the alignment of a sequence read\n// to a BWT\n// \n#ifndef OVERLAPBLOCK_H\n#define OVERLAPBLOCK_H\n\n#include \"BWTInterval.h\"\n#include \"SearchHistory.h\"\n#include \"BitChar.h\"\n#include \"SuffixTools/BWT.h\"\n#include \"SearchHistory.h\"\n#include \"GraphCommon.h\"\n#include \"MultiOverlap.h\"\n\n// Flags indicating how a given read was aligned to the FM-index\n// Used for internal bookkeeping\nstruct AlignFlags\n{\n    public:\n        AlignFlags() {}\n        AlignFlags(bool qr, bool tr, bool qc)\n        {\n            setQueryRev(qr);\n            setTargetRev(tr);\n            setQueryComp(qc);\n        }\n\n        bool isQueryRev() const { return data.test(QUERYREV_BIT); }\n        bool isTargetRev() const { return data.test(TARGETREV_BIT);    }\n        bool isQueryComp() const { return data.test(QUERYCOMP_BIT); }\n\n        // Returns true if the relationship between the query and target is reverse complement\n        bool isReverseComplement() const { return isTargetRev() != isQueryRev(); }\n\n        friend std::ostream& operator<<(std::ostream& out, const AlignFlags& af)\n        {\n            out << af.data;\n            return out;\n        }\n\n        friend std::istream& operator>>(std::istream& in, AlignFlags& af)\n        {\n            in >> af.data;\n            return in;\n        }\n\n        void write(std::ostream& out)\n        {\n            data.write(out);\n        }\n\n        void read(std::istream& in)\n        {\n            data.read(in);\n        }\n\n    private:\n\n        void setQueryRev(bool b) { data.set(QUERYREV_BIT, b); }\n        void setTargetRev(bool b) { data.set(TARGETREV_BIT, b); }\n        void setQueryComp(bool b) { data.set(QUERYCOMP_BIT, b); }\n\n        static const uint8_t QUERYREV_BIT = 0;\n        static const uint8_t TARGETREV_BIT = 1;\n        static const uint8_t QUERYCOMP_BIT = 2;\n        BitChar data;\n};\n\n\n// A BWTInterval pair and associated alignment data\nstruct OverlapBlock\n{\n    OverlapBlock() {}\n    \n    OverlapBlock(BWTIntervalPair r, \n                 BWTIntervalPair rawI,\n                 int ol, \n                 int nd, \n                 const AlignFlags& af)  : ranges(r), \n                                          rawRanges(rawI),\n                                          overlapLen(ol), \n                                          numDiff(nd),\n                                          flags(af), isEliminated(false) {}\n\n    OverlapBlock(BWTIntervalPair r,\n                 BWTIntervalPair rawI,\n                 int ol, \n                 int nd, \n                 const AlignFlags& af,\n                 const SearchHistoryVector& backHist);\n\n    // Returns the string that corresponds to this overlap block.\n    // This is constructed by transforming the original string using the back\n    // history while correcting for the reverse-complement searches\n    std::string getOverlapString(const std::string& original) const;\n\n    // Get the full string that is indicated by this overlap\n    // The overlap cannot be a containment and it must have a \n    // forward extension history. The returned string is the string\n    // of the actual read that forms the overlap with original. In other words\n    // it might not be the same strand as the original read.\n    std::string getFullString(const std::string& original) const;\n\n    // Return a pointer to the BWT that should be used to extend the block\n    // this is the opposite BWT that was used in the backwards search\n    const BWT* getExtensionBWT(const BWT* pBWT, const BWT* pRevBWT) const;\n\n    // Return the spectrum of extensions given by the interval in ranges\n    // The counts are given in the canonical frame, which means that\n    // if the query string was reversed, we flip the counts\n    AlphaCount64 getCanonicalExtCount(const BWT* pBWT, const BWT* pRevBWT) const;\n\n    // Return the index of the interval corresponding to the frame of \n    // reference for the original read\n    int getCanonicalIntervalIndex() const;\n\n    // Return the canonical interval.\n    BWTInterval getCanonicalInterval() const;\n\n    // Return the direction of the edge that this overlap block describes\n    EdgeDir getEdgeDir() const;\n\n    // Construct an overlap record from this overlap block\n    Overlap toOverlap(const std::string queryID, const std::string targetID, int queryLen, int targetLen) const;\n\n    // Construct an ID string describing this overlap block\n    std::string toCanonicalID() const;\n\n\n    // Comparison operator, compare by lower coordinate of 0 \n    friend bool operator<(const OverlapBlock& a, const OverlapBlock& b)\n    {\n        return a.ranges.interval[0].lower < b.ranges.interval[0].lower;    \n    }\n\n    static bool sortSizeDescending(const OverlapBlock& ob1, const OverlapBlock& ob2)\n    {\n        return ob1.overlapLen > ob2.overlapLen;\n    }\n\n    static bool sortIntervalLeft(const OverlapBlock& ob1, const OverlapBlock& ob2)\n    {\n        return ob1.ranges.interval[0].lower < ob2.ranges.interval[0].lower;\n    }\n\n    // I/O\n    friend std::ostream& operator<<(std::ostream& out, const OverlapBlock& obl)\n    {\n        out << obl.ranges << \" \" << obl.rawRanges << \" \" << obl.overlapLen << \" \" << obl.numDiff << \" \" << obl.flags;\n        return out;\n    }\n\n    friend std::istream& operator>>(std::istream& in, OverlapBlock& obl)\n    {\n        in >> obl.ranges >> obl.rawRanges >> obl.overlapLen >> obl.numDiff >> obl.flags;\n        return in;\n    }\n\n    // Data\n\n    // The ranges member holds the suffix array interval of the overlapping \n    // string + the terminating $ symbol. This allows us to either find the extension\n    // of the overlap (using the reverse interval) or lookup the index of the read.\n    BWTIntervalPair ranges;\n\n    // The raw interval of the overlap, not capped with '$' symbols is required\n    // to recompute the forward/reverse intervals if two overlap blocks intersect.\n    // This can happen when two reads/sequences have multiple possible overlaps\n    BWTIntervalPair rawRanges;\n\n    int overlapLen;\n    int numDiff;\n\n    AlignFlags flags;\n    bool isEliminated;\n\n    // The sequence of divergent bases during the backward and forward search steps\n    SearchHistoryVector backHistory;\n    SearchHistoryVector forwardHistory;\n};\n\n// Collections\ntypedef std::list<OverlapBlock> OverlapBlockList;\ntypedef OverlapBlockList::iterator OBLIter;\n\n// Global Functions\n\n\nvoid printBlockList(const OverlapBlockList* pList);\n\n// Ensure all the overlap blocks in the list are distinct\nvoid removeSubMaximalBlocks(OverlapBlockList* pList, const BWT* pBWT, const BWT* pRevBWT);\n\n// Given the overlapping blocks A and B, construct a list of blocks where the index ranges do not intersect\nOverlapBlockList resolveOverlap(const OverlapBlock& A, const OverlapBlock& B, const BWT* pBWT, const BWT* pRevBWT);\n\n// Partition the overlap block list into two lists, \n// one for the containment overlaps and one for the proper overlaps\nvoid partitionBlockList(int readLen, OverlapBlockList* pCompleteList, \n                        OverlapBlockList* pOverlapList,\n                        OverlapBlockList* pContainList);\n\n// Remove containment blocks from the list\nvoid removeContainmentBlocks(int readLen, OverlapBlockList* pList);\n\n// Convert an overlap block list into a multiple overlap\nMultiOverlap blockListToMultiOverlap(const SeqRecord& record, OverlapBlockList& blockList);\n\n// \nstd::string makeIdxString(int64_t idx);\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/OverlapTools.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// OverlapTools - Wrapper for the overlap machinery \n// to perform an overlap computation for two strings\n//\n#include \"OverlapTools.h\"\n#include \"SuffixArray.h\"\n//#define DPOVERLAPPRINT 1\n\n// Find a suffix of s1 that matches a prefix of s2 with minimal edit distance\nbool OverlapTools::boundedOverlapDP(const std::string& s1, const std::string& s2, int minOverlap, int maxOverlap, double maxErrorRate, Match& outMatch)\n{\n    const size_t MAX_REGION_LENGTH = 500; // do not try to align strings that are longer than this number\n    if(s1.empty() || s2.empty())\n        return false;\n \n    if(maxOverlap > (int)MAX_REGION_LENGTH)\n    {\n        std::cerr << \"Maximum requested overlap \" << maxOverlap << \" is larger than search limit (\" << MAX_REGION_LENGTH << \"), not aligning\\n\";\n        return false;\n    }\n\n    // The dynamic programming is too heavy to compute matches for very large strings\n    // so we only try to align the ends of s1 and s2 up to MAX_REGION_LENGTH bases.\n    size_t sublen = min3(maxOverlap, s1.size(), s2.size());\n    if(sublen > MAX_REGION_LENGTH)\n        return false;\n\n    std::string sub1 = s1.substr(s1.size() - sublen);\n    std::string sub2 = s2.substr(0, sublen);\n\n    DPAlignment dpAlign(sub1, sub2, DPM_OVERLAP, DPSS_SIMILARITY);\n    Match match;\n    bool validMatch = findBestOverlapByScore(sub1, sub2, minOverlap, maxErrorRate, dpAlign, match);\n    if(validMatch)\n    {\n        // If we are matching a substring of both s1 and s2, and the match\n        // is a containment (one string was completely matched) we call the\n        // match invalid. \n        if(match.isContainment() && sublen < s1.size() && sublen < s2.size())\n        {\n            return false;\n        }\n        else\n        {\n            // A valid match has been found which is maximal\n            // Expand the matches to the coordinates of s1 and s2 and return\n            int s1_add = s1.size() - sublen;\n            match.coord[0].interval.start += s1_add;\n            match.coord[0].interval.end += s1_add;\n            match.coord[0].seqlen = s1.size();\n\n            match.coord[1].seqlen = s2.size();\n\n#ifdef DPOVERLAPPRINT\n            match.printMatch(s1, s2);\n#endif\n            outMatch = match;\n            return true;\n        }\n    }\n    else\n    {\n        return false;\n    }\n}    \n\n//\nbool OverlapTools::findBestOverlapByScore(const std::string& s1, const std::string& s2, \n                                          int minOverlap, double maxErrorRate, \n                                          const DPAlignment& dpAlign, Match& outMatch)\n{\n    assert(dpAlign.getScoringScheme() == DPSS_SIMILARITY);\n\n    // The last row of the table holds the edit distance for the prefix-suffix overlaps of S1\n    // Iterate over this row and calculate the length and edit % of each overlap\n    int overlapRowIdx = dpAlign.getNumRows() - 1;\n    int numCols = dpAlign.getNumColumns();\n    int bestOverlapLen = -1;\n    int bestScore = 0;\n    for(int j = minOverlap; j < numCols; ++j)\n    {\n        int overlapLen = j;\n\n        // Do not allow overlaps to end with insertions\n        // For example, this case is a valid alignment but would be disallowed:\n        // S1 AGTACATTTACA--\n        // S2    ACATTTACATA\n        // This is an overlap of length 11 but the \"true\" overlap is only 9 bases\n        // Under a reasonable scoring system this should not happen\n        DPOperation lastOp = dpAlign.getPathOperationToCell(s1, s2, overlapRowIdx, j);\n        \n        if(lastOp != DPO_INSERT)\n        {\n            int score = dpAlign.getScore(overlapRowIdx,j);\n            if(score > bestScore)\n            {\n                // A higher scoring overlap has been found. Make sure that it is valid\n                // by checking that the error rate and overlap length are within the expected\n                // counts and that the coordinates are extreme w.r.t both sequences\n                int i_match = 0;\n                int num_edits = 0;\n                DPPath overlapPath = dpAlign.calculatePath(s1, s2, overlapRowIdx, overlapLen);\n                for(DPPath::iterator iter = overlapPath.begin(); iter != overlapPath.end(); ++iter)\n                {\n                    if(iter->j == 0 && iter->i > i_match)\n                        i_match = iter->i;\n\n                    // Count the mismatches but don't count deletions in the first column which are \"free\"\n                    if(iter->op != DPO_MATCH && !(iter->j == 0 && iter->op == DPO_DELETE))\n                        ++num_edits;\n                }\n                \n                Match currMatch;\n                currMatch.isReverse = false;\n                currMatch.coord[0].interval.start = i_match;\n                currMatch.coord[0].interval.end = overlapRowIdx - 1; // match coords are inclusive\n                currMatch.coord[0].seqlen = s1.size();\n                currMatch.coord[1].interval.start = 0;\n                currMatch.coord[1].interval.end = overlapLen - 1;\n                currMatch.coord[1].seqlen = s2.size();\n                currMatch.setNumDiffs(num_edits);\n                double errorRate = (double)num_edits / currMatch.getMinOverlapLength();\n                bool isValid = errorRate < maxErrorRate && currMatch.getMinOverlapLength() >= minOverlap &&\n                               currMatch.coord[0].isExtreme() && currMatch.coord[1].isExtreme();           \n                \n                if(isValid)\n                {\n                    bestOverlapLen = overlapLen;\n                    bestScore = score;\n                    outMatch = currMatch;\n                }\n            }\n         \n            /*   \n            std::cout << \"\\n\";\n            dpAlign.printAlignment(s1, s2, overlapRowIdx, j);\n            std::cout << \"OL: \" << overlapLen << \"\\n\";\n            std::cout << \"LO: \" << (int)lastOp << \" ED: \" << score << \"\\n\";\n            */\n        }\n    }\n\n    if(bestOverlapLen > 0)\n    {\n\n#ifdef DPOVERLAPPRINT\n        std::cout << \"\\nBest overlap: \" << bestOverlapLen << \"\\n\";\n        dpAlign.printAlignment(s1, s2, overlapRowIdx, bestOverlapLen);\n        outMatch.printMatch(s1, s2);\n#endif\n        return true;\n    }\n    else\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/OverlapTools.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// OverlapTools - Wrapper for the overlap machinery \n// to perform an overlap computation for two strings\n//\n#ifndef OVERLAPTOOLS_H\n#define OVERLAPTOOLS_H\n\n#include \"Match.h\"\n#include \"DPAlignment.h\"\n#include <list>\n\nnamespace OverlapTools\n{\n    // Datatypes\n    typedef std::vector<int> IntVector;\n    typedef std::vector<IntVector> DPMatrix;\n\n    //typedef EditDistanceScoring DPScoring;\n    typedef SimilarityScoring DPScoring;\n\n    // Find a match between s1 and s2 using a dynamic programming alignment\n    // This is something of a heavy function and the longest possible match must be provided\n    // If there is a match between minOverlap and maxOverlap with edit distance less than maxErrorRate, it will be returned.\n    // If there are multiple valid matches like this, the highest scoring match will be returned under the DPSS_SIMILARITY\n    // scoring scheme. If true is returned, a valid match has been found and outMatch is filled in appropriately.\n    // This function should not be used to find overlaps greater than 500bp\n    bool boundedOverlapDP(const std::string& s1, const std::string& s2, int minOverlap, int maxOverlap, double maxErrorRate, Match& outMatch);\n\n    // Find the best overlap using the dpAlign structure. Returns true\n    // if a valid overlap has been found and fills in the match structure\n    bool findBestOverlapByScore(const std::string& s1, const std::string& s2, \n                                int minOverlap, double maxErrorRate, const DPAlignment& dpAlign,\n                                Match& outMatch);\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/QCProcess.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// QCProcess - Process to perform quality checks \n// for a sequence work item\n//\n#include \"QCProcess.h\"\n#include \"BWTAlgorithms.h\"\n\n//\nstruct KmerWindow\n{\n    int64_t getCount(bool bothStrand) const\n    {\n        int64_t fwdCount = (fwdIntervals.interval[0].isValid()) ? fwdIntervals.interval[0].size() : 0;\n        int64_t rcCount = (rcIntervals.interval[0].isValid()) ? rcIntervals.interval[0].size() : 0;\n        if (bothStrand)\n            return std::min(fwdCount,rcCount);\n        else\n            return fwdCount + rcCount;\n    }\n\n    int start;\n    int end;\n    BWTIntervalPair fwdIntervals;\n    BWTIntervalPair rcIntervals;\n\n    bool isInitialized;\n};\n\n//\n//\n//\nQCProcess::QCProcess(QCParameters params) : m_params(params)\n{\n\n}\n\n//\nQCProcess::~QCProcess()\n{\n\n}\n\n//\nQCResult QCProcess::process(const SequenceWorkItem& workItem)\n{\n    QCResult result;\n\n    if(m_params.checkDuplicates) \n    {\n        DuplicateCheckResult dupCheckResult = performDuplicateCheck(workItem);\n        if(!m_params.substringOnly) \n            result.dupPassed = dupCheckResult == DCR_UNIQUE;\n        else\n            result.dupPassed = dupCheckResult != DCR_SUBSTRING;\n    }\n    else\n    {\n        result.dupPassed = true;\n    }\n        \n\n    // Only perform the more expensive k-mer test if the dup check succeeded\n    if(m_params.checkKmer && result.dupPassed)\n        result.kmerPassed = performKmerCheck(workItem);\n    else\n        result.kmerPassed = true;\n\n    if(result.kmerPassed && result.dupPassed && m_params.checkHPRuns)\n        result.hpPassed = performHomopolymerCheck(workItem);\n    else\n        result.hpPassed = true;\n\n    if(m_params.checkDegenerate && result.dupPassed && result.kmerPassed && result.hpPassed)\n        result.degenPassed = performDegenerateCheck(workItem);\n    else\n        result.degenPassed = true;\n\n    return result;\n}\n\nbool QCProcess::performKmerCheck(const SequenceWorkItem& workItem)\n{\n    // Perform a k-mer filter on the read\n    // Each k-mer must be seen at least m times for the read to be kept\n    // Naively, this would required k*(l - k + 1) calls to the BWT\n    // if each k-mer was computed independently. We improve this by performing\n    // a two-stage test. If the kmer k_i is seen at least m times, we extend\n    // it by one base. If this k+1-mer is also seen at least m times, it implies\n    // that the kmer k_(i+1) is also seen at least m times so it does not need\n    // to be recomputed. If the (k+1)-mer is seen less than m times, we recompute\n    // kmer k_(i+1) as a final check. Using this optimistic algorithm (checking\n    // longer kmers than is required) is significantly faster.\n    QCResult result;\n\n    std::string w = workItem.read.seq.toString();\n\n    // Ensure the read is longer than the k-mer length\n    if((int)w.size() < m_params.kmerLength)\n        return false;\n\n    int k = m_params.kmerLength;\n    int n = w.size();\n    int nk = n - k + 1;\n    int threshold = m_params.kmerThreshold;\n\n    // Are all kmers in the read well-represented?\n    bool allSolid = true;\n\n    int i = 0;\n\n    KmerWindow window;\n    window.start = 0;\n    window.end = 0;\n    window.isInitialized = false;\n    \n    while(i < nk)\n    {\n        // Determine whether the kmer at position i\n        // has been seen more than m times.\n        if(window.isInitialized)\n        {\n            // Extend the current window by 1 base\n            // to see if the spanning larger\n            // kmer is seen more than m times.\n            // If so, we don't need to check this kmer\n            // individually\n            int next = window.end + k;\n            assert(next < (int)w.size());\n            char b = w[next];\n            char cb = complement(b);\n\n            if(window.fwdIntervals.interval[0].isValid())\n                BWTAlgorithms::updateBothR(window.fwdIntervals, b, m_params.pRevBWT);\n            if(window.rcIntervals.interval[1].isValid())\n                BWTAlgorithms::updateBothR(window.rcIntervals, cb, m_params.pBWT);\n\n            int64_t count = window.getCount(m_params.kmerBothStrand);\n            if(count <= threshold)\n            {\n                // The extended kmer didn't meet the threshold\n                // recompute the interval for this kmer\n                window.isInitialized = false;\n            }\n            else\n            {\n                window.end += 1;\n            }\n        }\n        \n        if(!window.isInitialized)\n        {\n            // initialize the window by computing the\n            // BWTIntervals for the kmer starting at\n            // i and its reverse complement\n            char b = w[i];\n            char cb = complement(b);\n            BWTAlgorithms::initIntervalPair(window.fwdIntervals, b, m_params.pBWT, m_params.pRevBWT);\n            BWTAlgorithms::initIntervalPair(window.rcIntervals, cb, m_params.pRevBWT, m_params.pBWT);\n\n            for(int j = i + 1; j < i + k; ++j)\n            {\n                // Update intervals rightwards \n                b = w[j];\n                cb = complement(b);\n\n                if(window.fwdIntervals.interval[0].isValid())\n                    BWTAlgorithms::updateBothR(window.fwdIntervals, b, m_params.pRevBWT);\n                if(window.rcIntervals.interval[1].isValid())\n                    BWTAlgorithms::updateBothR(window.rcIntervals, cb, m_params.pBWT);\n            }\n\n            // record the start/end indices of the kmers spanned by this position\n            window.start = i;\n            window.end = i;\n            window.isInitialized = true;\n        }\n\n        // Check the count of this interval\n        int64_t count = window.getCount(m_params.kmerBothStrand);\n            \n        if(count <= threshold)\n        {\n            allSolid = false;\n            break;\n        }\n        else\n        {\n            i += 1;\n        }\n    }\n\n    return allSolid;\n}\n\n// Perform duplicate check\n// Look up the interval of the read in the BWT. If the index of the read\nDuplicateCheckResult QCProcess::performDuplicateCheck(const SequenceWorkItem& workItem)\n{\n    assert(m_params.pSharedBV != NULL);\n\n    std::string w = workItem.read.seq.toString();\n    std::string rc_w = reverseComplement(w);\n\n    // Look up the interval of the sequence and its reverse complement\n    BWTIntervalPair fwdIntervals = BWTAlgorithms::findIntervalPair(m_params.pBWT, m_params.pRevBWT, w);\n    BWTIntervalPair rcIntervals = BWTAlgorithms::findIntervalPair(m_params.pBWT, m_params.pRevBWT, rc_w);\n\n    // Check if this read is a substring of any other\n    // This is indicated by the presence of a non-$ extension in the left or right direction\n    AlphaCount64 fwdECL = BWTAlgorithms::getExtCount(fwdIntervals.interval[0], m_params.pBWT);\n    AlphaCount64 fwdECR = BWTAlgorithms::getExtCount(fwdIntervals.interval[1], m_params.pRevBWT);\n\n    AlphaCount64 rcECL = BWTAlgorithms::getExtCount(rcIntervals.interval[0], m_params.pBWT);\n    AlphaCount64 rcECR = BWTAlgorithms::getExtCount(rcIntervals.interval[1], m_params.pRevBWT);\n\n    if(fwdECL.hasDNAChar() || fwdECR.hasDNAChar() || rcECL.hasDNAChar() || rcECR.hasDNAChar())\n    {\n        // Substring reads are always removed so no need to update the bit vector\n        return DCR_SUBSTRING;\n    }\n\n    // Calculate the lexicographic intervals for the fwd and reverse intervals\n    BWTAlgorithms::updateBothL(fwdIntervals, '$', m_params.pBWT);\n    BWTAlgorithms::updateBothL(rcIntervals, '$', m_params.pBWT);\n\n    // Calculate the canonical index for this string - the lowest\n    // value in the two lexicographic index\n    assert(fwdIntervals.interval[0].isValid() || rcIntervals.interval[0].isValid());\n    int64_t fi = fwdIntervals.interval[0].isValid() ? fwdIntervals.interval[0].lower : std::numeric_limits<int64_t>::max();\n    int64_t ri = rcIntervals.interval[0].isValid() ? rcIntervals.interval[0].lower : std::numeric_limits<int64_t>::max();\n    int64_t canonicalIdx = std::min(fi, ri);\n\n    // Check if the bit reprsenting the canonical index is set in the shared bit vector\n    if(!m_params.pSharedBV->test(canonicalIdx))\n    {\n        // This read is not a duplicate\n        // Attempt to atomically set the bit from false to true\n        if(m_params.pSharedBV->updateCAS(canonicalIdx, false, true))\n        {\n            // Call succeed, return that this read is not a duplicate\n            return DCR_UNIQUE;\n        }\n        else\n        {\n            // Call failed, some other thread set the bit before\n            // this thread. Return that the reead is a duplicate\n            return DCR_FULL_LENGTH_DUPLICATE;\n        }\n    }\n    else\n    {\n        // this read is duplicate\n        return DCR_FULL_LENGTH_DUPLICATE;\n    }\n}\n\n// Perform homopolymer filter\nbool QCProcess::performHomopolymerCheck(const SequenceWorkItem& item)\n{\n    std::string w = item.read.seq.toString();\n    size_t k = m_params.hpKmerLength;\n\n    // Skip if the read length is less than the kmer size\n    // used for this test\n    if(w.size() < k)\n        return true;\n\n    size_t maxRunLength = 0;\n    size_t maxRunStart = 0;\n    \n    // Count the longest homopolymer run in the read\n    size_t currRunStart = 0;\n    size_t currRunLength = 1;\n    char prev = w[0];\n    char runChar = prev;\n    for(size_t i = 1; i < w.size(); ++i)\n    {\n        if(w[i] == prev)\n            currRunLength += 1;\n\n        if(w[i] != prev || i == w.size() - 1)\n        {\n            if(currRunLength > maxRunLength)\n            {\n                maxRunLength = currRunLength;\n                maxRunStart = currRunStart;\n                runChar = prev;\n            }\n            currRunLength = 1;\n            prev = w[i];\n            currRunStart = i;\n        }\n    }\n\n    // If the run length is above the threshold, find\n    // the frequency of the covering k-mer and k-mers with\n    // different lengths of the homopolymer\n    if(maxRunLength >= m_params.hpMinLength && maxRunLength < k / 2)\n    {\n        // Extract the kmer covering this run\n        int hprMiddle = maxRunStart + (maxRunLength / 2);\n        int estimatedKmerStart = hprMiddle - (k / 2);\n        int trueKmerStart = estimatedKmerStart;\n        \n        // If the calculated start position of the covering k-mer\n        //is before the start of the read, or past the end, shift it\n        if(estimatedKmerStart < 0)\n            trueKmerStart = 0;\n\n        if(estimatedKmerStart + k > w.size())\n            trueKmerStart = w.size() - k;\n\n        std::string prefix = w.substr(trueKmerStart, maxRunStart - trueKmerStart);\n        std::string suffix = w.substr(maxRunStart + maxRunLength, trueKmerStart + k - (maxRunStart + maxRunLength));\n\n        // Do not attempt this check if we do not have enough context preceding or following the HPR\n        if(prefix.size() < m_params.hpMinContext || suffix.size() < m_params.hpMinContext)\n            return true;\n\n        size_t highestCountLength = 0;\n        size_t highestCount = 0;\n        size_t actualCount = 0;\n        for(size_t l = maxRunLength - 2; l <= maxRunLength + 2; ++l)\n        {\n            std::string composite = prefix + std::string(l, runChar) + suffix;\n            size_t count = BWTAlgorithms::countSequenceOccurrences(composite, m_params.pBWT);\n            if(l == maxRunLength)\n                actualCount = count;\n\n            if(count > highestCount)\n            {\n                highestCount = count;\n                highestCountLength = l;\n            }\n        }\n\n        double proportion = (double)actualCount / (double)highestCount;\n        if(highestCountLength == maxRunLength || actualCount >= m_params.hpHardAcceptCount || proportion >= m_params.hpMinProportion)\n        {\n            return true;\n        }\n        else\n        {\n            if(m_params.verbose > 0)\n            {\n                printf(\"Read failed homopolymer filter %s\\n\", w.c_str());\n                printf(\"Filtered read with poly-%c run. DL: %zu DC: %zu. AL: %zu AC: %zu P: %lf\\n\", runChar, highestCountLength, highestCount, maxRunLength, actualCount, proportion);\n            }\n            return false;\n        }\n    }\n\n    return true;\n}\n\n// Check if sequence is composed of predominantely a single base\n// Returns true if the sequence is not degenrate\nbool QCProcess::performDegenerateCheck(const SequenceWorkItem& item)\n{\n    std::string w = item.read.seq.toString();\n    AlphaCount64 bc;\n    for(size_t i = 0; i < w.size(); ++i)\n    {\n        bc.increment(w[i]);\n    }\n\n    size_t maxCount = bc.getMaxCount();\n    double prop = (double)maxCount / w.size();\n    if(prop > m_params.degenProportion)\n    {\n        if(m_params.verbose > 0)\n            std::cout << \"Read \" << w << \" failed degenerate filter\\n\";\n        return false;\n    }\n    return true;\n}\n//\n//\n//\nQCPostProcess::QCPostProcess(std::ostream* pCorrectedWriter,\n                             std::ostream* pDiscardWriter) :\n                                m_pCorrectedWriter(pCorrectedWriter),\n                                m_pDiscardWriter(pDiscardWriter),\n                                m_readsKept(0), m_readsDiscarded(0),\n                                m_readsFailedKmer(0), m_readsFailedDup(0),\n                                m_readsFailedHP(0), m_readsFailedDegen(0)\n{\n\n}\n\n//\nQCPostProcess::~QCPostProcess()\n{\n    std::cout << \"Reads kept: \" << m_readsKept << \"\\n\";\n    std::cout << \"Reads discarded: \" << m_readsDiscarded << \"\\n\";\n    std::cout << \"Reads failed kmer check: \" << m_readsFailedKmer << \"\\n\";\n    std::cout << \"Reads failed duplicate check: \" << m_readsFailedDup << \"\\n\";\n    std::cout << \"Reads failed homopolymer check: \" << m_readsFailedHP << \"\\n\";\n    std::cout << \"Reads failed degenerate check: \" << m_readsFailedDegen << \"\\n\";\n}\n\n//\nvoid QCPostProcess::process(const SequenceWorkItem& item, const QCResult& result)\n{\n    SeqRecord record = item.read;\n    if(result.kmerPassed && result.dupPassed && result.hpPassed && result.degenPassed)\n    {\n        record.write(*m_pCorrectedWriter);\n        ++m_readsKept;\n    }\n    else\n    {\n        // To be able to rebuild the index after discarding the read, we need to write\n        // the rank of the string (its position in the original read file into the read name)\n        std::stringstream newID;\n        newID << item.read.id << \",seqrank=\" << item.idx;\n        record.id = newID.str();\n\n        record.write(*m_pDiscardWriter);\n        ++m_readsDiscarded;\n\n        if(!result.kmerPassed)\n            m_readsFailedKmer += 1;\n        else if(!result.dupPassed)\n            m_readsFailedDup += 1;\n        else if(!result.hpPassed)\n            m_readsFailedHP += 1;\n        else if(!result.degenPassed)\n            m_readsFailedDegen += 1;\n    }\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/QCProcess.h",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// QCProcess - Process to perform quality checks \n// for a sequence work item\n//\n#ifndef QCPROCESS_H\n#define QCPROCESS_H\n\n#include \"Util.h\"\n#include \"BWT.h\"\n#include \"SequenceProcessFramework.h\"\n#include \"SequenceWorkItem.h\"\n#include \"BitVector.h\"\n\n// Parameters\nstruct QCParameters\n{\n    QCParameters() { setDefaults(); }\n\n    // Set reasonable default values for the qc filters\n    void setDefaults()\n    {\n        checkDuplicates = true;\n        checkKmer = true;\n\tkmerBothStrand = false;\n        checkHPRuns = true;\n        checkDegenerate = true;\n        verbose = 0;\n\n        pBWT = NULL;\n        pRevBWT = NULL;\n        pSharedBV = NULL;\n\n        kmerLength = 27;\n        kmerThreshold = 2;\n\n        hpHardAcceptCount = 10;\n        hpMinProportion = 0.1f;\n        hpKmerLength = 51;\n        hpMinLength = 6;\n        hpMinContext = 5;\n\n        degenProportion = 0.90;\n    }\n\n    const BWT* pBWT;\n    const BWT* pRevBWT;\n    BitVector* pSharedBV;\n\n    // Control parameters\n    bool checkDuplicates;\n    bool checkKmer;\n    bool kmerBothStrand;\n    bool checkHPRuns;\n    bool checkDegenerate;\n    bool substringOnly;\n    int verbose;\n\n    //\n    // Kmer frequency filtering parameters\n    //\n    int kmerLength;\n    int kmerThreshold;\n\n    //\n    // Homopolymer filter parameters\n    //\n\n    // The length a run must be to trigger filtering\n    size_t hpMinLength;\n\n    // If the k-mer covering the HP run is seen\n    // at least this many times, it is accepted\n    size_t hpHardAcceptCount; \n\n    // The hp run length in the read must be\n    // at least this fraction of the dominant\n    // run length to be kept\n    double hpMinProportion;\n\n    // The context k-mer length for the homopolymer\n    // filter.\n    size_t hpKmerLength;\n    \n    // The minimum amount of sequence around the homopolymer\n    // to trigger filtering\n    size_t hpMinContext;\n\n    //\n    // Degenerate filter parameters\n    //\n\n    // If the most frequent base in the read\n    // makes up more than this proportion, the read\n    // is discarded\n    double degenProportion;\n\n};\n\n// Results object\nclass QCResult\n{\n    public:\n        QCResult() : kmerPassed(false), dupPassed(false), hpPassed(false), degenPassed(false) {}\n\n        bool kmerPassed;\n        bool dupPassed;\n        bool hpPassed;\n        bool degenPassed;\n};\n\nenum DuplicateCheckResult\n{\n    DCR_UNIQUE,\n    DCR_SUBSTRING,\n    DCR_FULL_LENGTH_DUPLICATE\n};\n\n// Perform quality checks on the input stream of reads\nclass QCProcess\n{\n    public:\n        QCProcess(QCParameters params); \n        ~QCProcess();\n        QCResult process(const SequenceWorkItem& item);\n        \n        // Discard reads with low-frequency kmers\n        bool performKmerCheck(const SequenceWorkItem& item);\n\n        // Discard reads that are identical to, or a substring of, some other read\n        DuplicateCheckResult performDuplicateCheck(const SequenceWorkItem& item);\n\n        // Check whether the sequence has a homopolymer sequencing error. This\n        // check finds a kmer covering a homopolymer run then modifies it to check\n        // for a shorter/longer run of higher frequency\n        bool performHomopolymerCheck(const SequenceWorkItem& item);\n\n        // Check if the sequence read is degenerate\n        // A degenerate read is define to be reads consisting almost\n        // entirely of a single nucleotide\n        bool performDegenerateCheck(const SequenceWorkItem& item);\n\n    private:\n        \n        const QCParameters m_params;\n};\n\n// Write the results from the overlap step to an ASQG file\nclass QCPostProcess\n{\n    public:\n        QCPostProcess(std::ostream* pCorrectedWriter, std::ostream* pDiscardWriter);\n        ~QCPostProcess();\n\n        void process(const SequenceWorkItem& item, const QCResult& result);\n\n    private:\n\n        std::ostream* m_pCorrectedWriter;\n        std::ostream* m_pDiscardWriter;\n\n        size_t m_readsKept;\n        size_t m_readsDiscarded;\n        size_t m_readsFailedKmer;\n        size_t m_readsFailedDup;\n        size_t m_readsFailedHP;\n        size_t m_readsFailedDegen;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/ReadCluster.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ReadCluster - Generate a cluster of overlapping\n// reads using the FM-index\n//\n#include \"ReadCluster.h\"\n\n//\nReadCluster::ReadCluster(const OverlapAlgorithm* pOverlapper, int minOverlap) : m_pOverlapper(pOverlapper), \n                                                                                m_minOverlap(minOverlap),\n                                                                                m_pLimitKmers(NULL),\n                                                                                m_limitK(0)\n{\n\n}\n\n//\nvoid ReadCluster::setLimitKmers(const std::set<std::string>* pLimitKmers, size_t limitK)\n{\n    m_pLimitKmers = pLimitKmers;\n    m_limitK = limitK;\n}\n\n// Add a seed read to the cluster. Overlaps will be found for \n// each seed read to grow the cluster\nClusterNode ReadCluster::addSeed(const std::string& sequence, bool bCheckInIndex)\n{\n    // Check if this read is a substring\n    SeqRecord tempRecord;\n    tempRecord.id = \"cluster-seed\";\n    tempRecord.seq = sequence;\n\n    OverlapBlockList tempBlockList;\n    OverlapResult overlapResult = m_pOverlapper->alignReadDuplicate(tempRecord, &tempBlockList);\n    if(overlapResult.isSubstring)\n    {\n        // If bCheckInIndex is true, then we are extending clusters from reads that are in the FM-index\n        // In this case, seeding a substring read is an error and we abort. If the seed is NOT in the index\n        // we just emit a warning and ignore the seed\n        if(bCheckInIndex)\n        {\n            std::cerr << \"Error: The seed used for sga-cluster-extend is a substring of some read.\\n\";\n            std::cerr << \"Please run sga rmdup before cluster\\n\";\n            std::cerr << \"Sequence: \" << sequence << \"\\n\";\n            exit(1);\n        }\n        else\n        {\n            std::cerr << \"Warning: The cluster sequence to extend is a substring of some read. This seed is being skipped\\n\";\n            std::cerr << \"Sequence: \" << sequence << \"\\n\";\n            ClusterNode emptyNode;\n\n            // Set an invalid interval\n            emptyNode.interval.lower = 0;\n            emptyNode.interval.upper = -1;\n            return emptyNode;\n        }\n    }\n\n    // Find the interval in the fm-index containing the read\n    const BWT* pBWT = m_pOverlapper->getBWT();\n    BWTInterval readInterval = BWTAlgorithms::findInterval(pBWT, sequence);\n    BWTAlgorithms::updateInterval(readInterval, '$', pBWT);\n\n    // When building primary clusters, we require each read to be in the index.\n    if(bCheckInIndex)\n    {\n        if(!readInterval.isValid())\n        {\n            std::cerr << \"sga cluster error: The seed read is not part of the FM-index.\\n\";\n            exit(EXIT_FAILURE);\n        }\n    }\n\n    ClusterNode node;\n    node.sequence = sequence;\n    node.interval = readInterval;\n    node.isReverseInterval = false;\n    m_usedIndex.insert(readInterval.lower);\n    m_queue.push(node);\n    return node;\n}\n\n// Run the cluster process. If the number of total nodes\n// exceeds max, abort the search.\nvoid ReadCluster::run(size_t max_size, int max_iterations)\n{\n    int iteration = 0;\n    do\n    {\n        // Perform one iteration of extending each sequence in the queue\n        ClusterNodeQueue next_queue;\n        bool aborted = false;\n            \n        // Have we performed enough iterations?\n        if(max_iterations > 0 && iteration++ > max_iterations)\n            aborted = true;\n\n        while(!aborted && !m_queue.empty())\n        {\n            if(m_queue.size() + m_outCluster.size() > max_size)\n            {\n                // Abort the search\n                m_outCluster.clear();\n                aborted = true;\n                break;\n            }\n            \n            ClusterNode node = m_queue.front();\n            m_queue.pop();\n\n            // Add this node to the output\n            m_outCluster.push_back(node);\n            \n            // If we are using limit kmers, only try to extend this sequence if it does not contain a limit kmer\n            bool extend_read = canExtendRead(node);\n            if(!extend_read)\n                continue; \n\n            // Find overlaps for the current node\n            SeqRecord tempRecord;\n            tempRecord.id = \"cluster\";\n            tempRecord.seq = node.sequence;\n            OverlapBlockList blockList;\n            m_pOverlapper->overlapRead(tempRecord, m_minOverlap, &blockList);\n            \n            // Parse each member of the block list and potentially expand the cluster\n            for(OverlapBlockList::const_iterator iter = blockList.begin(); iter != blockList.end(); ++iter)\n            {\n                // Check if the reads in this block are part of the cluster already\n                BWTInterval canonicalInterval = iter->getCanonicalInterval();\n                int64_t canonicalIndex = canonicalInterval.lower;\n                if(m_usedIndex.count(canonicalIndex) == 0)\n                {\n                    // This is a new node that isn't in the cluster. Add it.\n                    m_usedIndex.insert(canonicalIndex);\n\n                    ClusterNode newNode;\n                    newNode.sequence = iter->getFullString(node.sequence);\n                    newNode.interval = canonicalInterval;\n                    newNode.isReverseInterval = iter->flags.isTargetRev();\n                    next_queue.push(newNode);\n                }\n            }\n        }\n\n            \n        // Clear the queue\n        if(aborted) \n        {\n            while(!m_queue.empty())\n                m_queue.pop();\n        } \n        else\n        {\n            // Swap the reads to extend in the next iteration\n            m_queue = next_queue;\n        }\n\n    } while(!m_queue.empty());\n}\n\n// Check if the given node contains a kmer that we stop extension at.\n// Returns true if we can extend the cluster using the given node\nbool ReadCluster::canExtendRead(const ClusterNode& node) const\n{\n    // No limiting kmers\n    if(m_pLimitKmers == NULL)\n        return true;\n    // Node too short\n    if(node.sequence.size() < m_limitK)\n        return false;\n\n    size_t nk = node.sequence.size() - m_limitK + 1;\n    for(size_t i = 0; i < nk; ++i)\n    {\n        std::string kmer = node.sequence.substr(i, m_limitK);\n        if(m_pLimitKmers->find(kmer) != m_pLimitKmers->end())\n            return false; // this read contains a limiting kmer\n        \n        // check reverse complement too\n        kmer = reverseComplement(kmer);\n        if(m_pLimitKmers->find(kmer) != m_pLimitKmers->end())\n            return false; // this read contains a limiting kmer\n    }\n\n    return true;\n}\n\n// \nClusterNodeVector ReadCluster::getOutput() const\n{\n    // Sort the intervals into ascending order and remove any duplicate intervals (which can occur\n    // if the subgraph has a simple cycle)\n    ClusterNodeVector retVector = m_outCluster;\n    std::sort(retVector.begin(), retVector.end(), ClusterNode::compare);\n\n    std::vector<ClusterNode>::iterator newEnd = std::unique(retVector.begin(),\n                                                            retVector.end(),\n                                                            ClusterNode::equal);\n\n    retVector.erase(newEnd, retVector.end());\n    return retVector;\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/ReadCluster.h",
    "content": "///-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ReadCluster - Generate a cluster of overlapping\n// reads using the FM-index\n//\n#ifndef READCLUSTER_H\n#define READCLUSTER_H\n\n#include \"Util.h\"\n#include \"OverlapAlgorithm.h\"\n\n// A node in the queue of reads to use to expand the cluster\nstruct ClusterNode\n{\n    std::string sequence;\n    int64_t fwdCanonicalID;\n    BWTInterval interval;\n    bool isReverseInterval;\n\n    static inline bool compare(const ClusterNode& a, const ClusterNode& b)\n    {\n        return BWTInterval::compare(a.interval, b.interval);\n    }\n\n    static inline bool equal(const ClusterNode& a, const ClusterNode& b)\n    {\n        return BWTInterval::equal(a.interval, b.interval);\n    }\n};\ntypedef std::queue<ClusterNode> ClusterNodeQueue;\ntypedef std::vector<ClusterNode> ClusterNodeVector;\ntypedef std::set<int64_t> ClusterIntervalSet;\n\n//\nclass ReadCluster\n{\n    public:\n\n        //\n        ReadCluster(const OverlapAlgorithm* pOverlapper, int minOverlap);\n\n        // To avoid extending the cluster through repetitive sequence, the extension\n        // process can optionally take in kmers that we use to block extension. If a\n        // read contains a kmer in this set, we do not extend the cluster using the read.\n        void setLimitKmers(const std::set<std::string>* pLimitKmers, size_t limitK);\n        \n        // Add a new sequence to extend the cluster from\n        ClusterNode addSeed(const std::string& sequence, bool bCheckInIndex);\n\n        // Run the cluster process. If the number of total nodes\n        // exceeds max, abort the search.\n        void run(size_t max_size, int max_iterations);\n        \n        //\n        ClusterNodeVector getOutput() const;\n    \n    private:\n\n        // Check if the sequence of the given node contains a limit kmer, which blocks extension \n        bool canExtendRead(const ClusterNode& node) const;\n\n        ClusterNodeQueue m_queue;\n        const OverlapAlgorithm* m_pOverlapper;\n        int m_minOverlap;\n\n        const std::set<std::string>* m_pLimitKmers;\n        size_t m_limitK;\n\n        ClusterNodeVector m_outCluster;\n        ClusterIntervalSet m_usedIndex;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/SearchHistory.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//\n// SearchHistory - data structures to track\n// the history of a FM-index search\n//\n//-----------------------------------------------\n#include \"SearchHistory.h\"\n#include <algorithm>\n#include <iterator>\n\n//\n// Link\n//\nSearchHistoryLink::SearchHistoryLink() : pNode(NULL)\n{\n\n}\n\n//\nSearchHistoryLink::SearchHistoryLink(SearchHistoryNode* ptr) : pNode(ptr)\n{\n    if(pNode != NULL)\n        pNode->increment();\n}\n\n// We need to handle the copy constructor and the assignment operator\n// for the reference counting to be correct\nSearchHistoryLink::SearchHistoryLink(const SearchHistoryLink& link) : pNode(link.pNode)\n{\n    if(pNode != NULL)\n        pNode->increment();\n}\n\n//\nSearchHistoryLink& SearchHistoryLink::operator=(SearchHistoryLink const& link)\n{\n    SearchHistoryNode* pOld = pNode;\n    pNode = link.pNode;\n    if(pNode != NULL)\n        pNode->increment();\n\n    if(pOld != NULL)\n    {\n        pOld->decrement();\n        if(pOld->getCount() == 0)\n            delete pOld;\n    }\n    return *this;\n}\n\n//\nSearchHistoryLink::~SearchHistoryLink()\n{\n    if(pNode != NULL)\n    {\n        pNode->decrement();\n        if(pNode->getCount() == 0)\n            delete pNode;\n    }\n}\n\n//\n// Node\n//\n\n// adding a child of the node automatically increments the refCount of this node\n// through the child's Link to this node. Once all the children of this node\n// have been removed it will automatically be deleted\nSearchHistoryLink SearchHistoryNode::createChild(int var_pos, char var_base)\n{\n    return SearchHistoryLink(new SearchHistoryNode(this, var_pos, var_base));\n}\n\n// The root has NULL as a parent \nSearchHistoryLink SearchHistoryNode::createRoot()\n{\n    return SearchHistoryLink(new SearchHistoryNode(NULL, -1, ROOT_CHAR));\n}\n\n// Return the search history up to the root node\nSearchHistoryVector SearchHistoryNode::getHistoryVector()\n{\n    SearchHistoryVector out;\n    SearchHistoryLink pCurr(this);\n    bool done = false;\n    while(!done)\n    {\n        if(pCurr->m_variant.base == ROOT_CHAR)\n        {\n            // root found, terminate the search\n            done = true;\n        }\n        else\n        {\n            out.add(pCurr->m_variant);\n            pCurr = pCurr->m_parentLink;\n        }\n    }\n    return out;\n}\n\n//\n// SearchHistoryVector\n//\n\n// Normalize the search history so that the positions are in ascending (left to right)\n// order and the bases are wrt. the original strand of the forward sequence\n// This is required to compare two SearchHistories that represent alignments to different \n// strands\nvoid SearchHistoryVector::normalize(bool doComplement)\n{\n    std::sort(m_history.begin(), m_history.end(), SearchHistoryItem::sortPos);\n\n    if(doComplement)\n    {\n        for(size_t i = 0; i < m_history.size(); ++i)\n        {\n            m_history[i].base = complement(m_history[i].base);    \n        }\n    }\n}\n\n//\nvoid SearchHistoryVector::add(int pos, char base)\n{\n    SearchHistoryItem item(pos, base);\n    m_history.push_back(item);\n}\n\n// \nvoid SearchHistoryVector::add(SearchHistoryItem& item)\n{\n    m_history.push_back(item);\n}\n\n//\nint SearchHistoryVector::countDifferences(const SearchHistoryVector& a, const SearchHistoryVector& b, int maxPos)\n{\n    size_t na = a.m_history.size();\n    size_t nb = b.m_history.size();\n\n    size_t i = 0;\n    size_t j = 0;\n    int count = 0;\n\n    while(i < na && j < nb)\n    {\n        const SearchHistoryItem& itemA = a.m_history[i];\n        const SearchHistoryItem& itemB = b.m_history[j];\n        \n        if(itemA.pos > maxPos || itemB.pos > maxPos)\n            break;\n\n        if(itemA.pos == itemB.pos)\n        {\n            if(itemA.base != itemB.base)\n                ++count;\n            ++i;\n            ++j;\n        }\n        else if(itemA.pos < itemB.pos)\n        {\n            ++count;\n            ++i;\n        }\n        else if(itemB.pos < itemA.pos)\n        {\n            ++count;\n            ++j;\n        }\n        else\n        {\n            assert(false);\n        }\n    }\n    \n    // Count the remaining elements in A and B that are less than maxpos\n    while(i < na && a.m_history[i].pos <= maxPos)\n    {\n        ++count;\n        ++i;\n    }\n\n    // Count the remaining elements in A and B that are less than maxpos\n    while(j < nb && b.m_history[j].pos <= maxPos)\n    {\n        ++count;\n        ++j;\n    }\n\n    return count;\n}\n\n// Transform the original string using the history \nstd::string SearchHistoryVector::transform(const std::string& original, bool queryReversed) const\n{\n    std::string transformed = original;\n    int l = transformed.size();\n    for(size_t i = 0; i < m_history.size(); ++i)\n    {\n        const SearchHistoryItem& item = m_history[i];\n\n        // Transform the position onto the read - if the queryReversed flag\n        // is set, the numbering starts from the left at one\n        int t_pos = (queryReversed) ? item.pos - 1 : l - item.pos;\n        assert(t_pos >= 0 && t_pos < l);\n        assert(transformed[t_pos] != item.base);\n\n        // pos is 1-based starting from the right side of original\n        transformed[t_pos] = item.base;\n    }\n    return transformed;\n}\n\n// Return the string of bases that make up the history\nstd::string SearchHistoryVector::getBaseString() const\n{\n    std::string out;\n    out.reserve(m_history.size());\n    for(size_t i = 0; i < m_history.size(); ++i)\n        out.push_back(m_history[i].base);\n    return out;\n}\n\n//\nstd::ostream& operator<<(std::ostream& out, const SearchHistoryVector& hist)\n{\n    std::copy(hist.m_history.begin(), hist.m_history.end(), \n              std::ostream_iterator<SearchHistoryItem>(out, \"\\t\"));\n    return out;\n}\n\n"
  },
  {
    "path": "src/SGA/Algorithm/SearchHistory.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//\n// SearchHistory - data structures to track\n// the history of a FM-index search\n//-----------------------------------------------\n#ifndef SEARCHHISTORY_H\n#define SEARCHHISTORY_H\n\n#include \"Util.h\"\n\n// Base, Position pair indicating a divergence during the search\nstruct SearchHistoryItem\n{\n    SearchHistoryItem(int p, char b) : pos(p), base(b) {}\n    int pos;\n    char base;\n\n    static bool sortPos(const SearchHistoryItem& a, const SearchHistoryItem& b)\n    {\n        return a.pos < b.pos;\n    }\n\n    friend std::ostream& operator<<(std::ostream& out, const SearchHistoryItem& hi)\n    {\n        out << hi.pos << \",\" << hi.base;\n        return out;\n    }\n};\ntypedef std::vector<SearchHistoryItem> HistoryItemVector;\n\n// A vector of history items that can be compared with other histories\nclass SearchHistoryVector\n{\n    public:\n        \n        //\n        SearchHistoryVector() {}\n\n        //\n        void add(int pos, char base);\n        void add(SearchHistoryItem& item);\n        void normalize(bool doComplement);\n        size_t size() const { return m_history.size(); }\n        std::string getBaseString() const;\n\n        // Transform the original string using the history into a string representing\n        // the sequence of bases searched to create the history\n        std::string transform(const std::string& original, bool queryReversed) const;\n\n        //\n        static int countDifferences(const SearchHistoryVector& a, const SearchHistoryVector& b, int maxPos);\n\n        //\n        friend std::ostream& operator<<(std::ostream& out, const SearchHistoryVector& hist);\n\n    private:\n\n        HistoryItemVector m_history;\n};\n\n\nclass SearchHistoryNode;\n\n// A SearchHistoryLink is a reference-counted wrapper of a \n// search node. This is the external interface to the SearchHistoryNodes\n// This allows the SearchHistoryNodes to be automatically cleaned up when \n// they are no longer referred to\nclass SearchHistoryLink\n{\n    public:\n        \n        //\n        SearchHistoryLink();\n        SearchHistoryLink(SearchHistoryNode* ptr);\n\n        // We need to handle the copy constructor and the assignment operator\n        // for the reference counting to be correct\n        SearchHistoryLink(const SearchHistoryLink& link);        \n        SearchHistoryLink& operator=(SearchHistoryLink const& link);\n        ~SearchHistoryLink();\n\n\n        SearchHistoryNode* operator->() const { assert(pNode != NULL); return pNode; }\n        SearchHistoryNode& operator*() const { assert(pNode != NULL); return *pNode; }\n\n    private:\n        SearchHistoryNode* pNode;\n};\n\n// A search history node is one link in a chain of history items. createChild makes a \n// new element in the chain, indicating a divergence from the parent history\nclass SearchHistoryNode\n{\n    public:\n\n        SearchHistoryLink createChild(int var_pos, char var_base);\n        static SearchHistoryLink createRoot(); // Create the root node of the history tree\n        SearchHistoryVector getHistoryVector();\n\n    private:\n\n        friend class SearchHistoryLink;\n        friend class SearchTree;\n\n        // The nodes should only be constructed/destructed through the links\n        SearchHistoryNode(SearchHistoryNode* pParent, \n                          int var_pos, char var_base) : m_parentLink(pParent), \n                                                        m_variant(var_pos, var_base),\n                                                        m_refCount(0) {}\n        \n        ~SearchHistoryNode() { assert(m_refCount == 0); }\n\n        inline void increment() { ++m_refCount; }\n        inline void decrement() { --m_refCount; }\n        inline int getCount() const { return m_refCount; }\n\n        SearchHistoryLink m_parentLink;\n        SearchHistoryItem m_variant;\n        int m_refCount;\n\n        static const char ROOT_CHAR = '0';\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/SearchSeed.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SearchSeed.h - Data structure holding a partial \n// alignment to a FM-index. \n//\n#include <stdio.h>\n#include \"SearchSeed.h\"\n\n//\nvoid SearchSeed::print() const\n{\n    printf(\"li: %d ri: %d sl: %d dir: %d z: %d lrl: %d lru: %d rlr: %d rlu: %d\\n\", \n            left_index, right_index, seed_len, dir, z, \n            (int)ranges.interval[0].lower, (int)ranges.interval[0].upper, \n            (int)ranges.interval[1].lower, (int)ranges.interval[1].upper);\n}\n\n//\nvoid SearchSeed::print(const std::string& w) const\n{\n    int range = (int)ranges.interval[0].upper - (int)ranges.interval[0].lower;\n    printf(\"sub: %s li: %d ri: %d sl: %d dir: %d z: %d lrl: %d lru: %d range: %d rlr: %d rlu: %d\\n\", \n            w.substr(left_index, length()).c_str(), left_index, right_index,\n            seed_len, dir, z, (int)ranges.interval[0].lower, (int)ranges.interval[0].upper, range,\n            (int)ranges.interval[1].lower, (int)ranges.interval[1].upper);\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/SearchSeed.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SearchSeed.h - Data structure holding a partial \n// alignment to a FM-index. \n//\n#ifndef SEARCHSEED_H\n#define SEARCHSEED_H\n\n#include <queue>\n#include <list>\n#include \"BWTInterval.h\"\n#include \"SearchHistory.h\"\n\n// types\nenum ExtendDirection\n{\n    ED_LEFT,\n    ED_RIGHT\n};\n\n// A search seed describes a partial alignment to a BWT\nstruct SearchSeed\n{\n    //\n    // Functions\n    //\n    inline int length() const { return right_index - left_index + 1; }\n    inline bool isSeed() const { return length() < seed_len; }\n    inline bool isIntervalValid(int idx) { return ranges.interval[idx].isValid(); }\n    inline bool allowMismatches() const { return z < maxDiff; }\n    inline double calcErrorRate() const { return static_cast<double>(z) / static_cast<double>(length()); }\n     \n    // Sort the alignments based on their r_lower/r_upper\n    static inline bool compareLeftRange(const SearchSeed& a, const SearchSeed& b)\n    {\n        return BWTInterval::compare(a.ranges.interval[0], b.ranges.interval[0]);\n    }\n\n    // Compare for equality based on the left range\n    // If the length of the alignment is equal, then if the left ranges\n    // are a match, the two alignment objects are redundant and one can be removed\n    static inline bool equalLeftRange(const SearchSeed& a, const SearchSeed& b)\n    {\n#ifdef VALIDATE\n        if(BWTInterval::equal(a.ranges.inteval[0], b.ranges.interval[0]))\n            assert(a.length() == b.length() && a.z == b.z);\n#endif\n        return BWTInterval::equal(a.ranges.interval[0], b.ranges.interval[0]);\n    }\n    \n    friend bool operator==(const SearchSeed& a, const SearchSeed& b)\n    {\n        return a.ranges == b.ranges && a.left_index == b.left_index &&\n               a.right_index == b.right_index && a.z == b.z && a.dir == b.dir; \n    }\n\n    //\n    void print() const;\n    void print(const std::string& w) const;\n     \n    //\n    // Data\n    //\n\n    // BWT interval coordinates, the first element of the pair is the left range\n    BWTIntervalPair ranges;\n    SearchHistoryLink historyLink;\n\n    // Index range is inclusive on both ends\n    int left_index;\n    int right_index;\n    int seed_len;\n\n    // The direction the alignment is currently being extended\n    ExtendDirection dir; \n    \n    // The current number of mismatches in the block\n    int z;\n\n    // The total number of allowed mismatches\n    int maxDiff;\n\n};\n\n// Collections\ntypedef std::vector<SearchSeed> SearchSeedVector;\ntypedef std::queue<SearchSeed> SearchSeedQueue;\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/StatsProcess.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// StatsProcess - Compute statistics about the reads\n//\n#include \"StatsProcess.h\"\n#include \"BWTAlgorithms.h\"\n#include \"MultiOverlap.h\"\n\n//\n//\n//\nStatsProcess::StatsProcess(const BWT* pBWT, const BWT* pRBWT, int kmerLength, int minOverlap, int branchCutoff, bool bNoOverlap) :\n                            m_pBWT(pBWT),\n                            m_pRBWT(pRBWT),\n                            m_kmerLength(kmerLength),\n                            m_minOverlap(minOverlap),\n                            m_branchCutoff(branchCutoff),\n                            m_bNoOverlap(bNoOverlap),\n                            m_pAllOverlapper(NULL)\n{\n    if (!m_bNoOverlap)\n    {\n        assert(m_pRBWT);\n        m_pAllOverlapper = new OverlapAlgorithm(m_pBWT, m_pRBWT, 0.05, 16, 16, false, m_branchCutoff);\n    }\n}\n\n//\nStatsProcess::~StatsProcess()\n{\n    if(m_pAllOverlapper)\n    {\n        delete m_pAllOverlapper;\n        m_pAllOverlapper = NULL;\n    }\n}\n\n//\nStatsResult StatsProcess::process(const SequenceWorkItem& workItem)\n{\n    StatsResult result;\n\n        \n    std::string readSequence = workItem.read.seq.toString();\n\n    //\n    // Compute the kmer distribution\n    //\n    int k = m_kmerLength;\n    int n = readSequence.size();\n    int nk = n - m_kmerLength + 1;\n\n    for(int i = 0; i < nk; ++i)\n    {\n        std::string kmer = readSequence.substr(i, k);\n        int count = BWTAlgorithms::countSequenceOccurrences(kmer, m_pBWT);\n        result.kmerCoverage.push_back(count);\n    }\n    \n    //\n    // Compute the number of implied errors in the read\n    //\n    if(!m_bNoOverlap)\n    {\n        SeqRecord currRead = workItem.read;\n        OverlapBlockList blockList;\n        OverlapResult overlap_result = m_pAllOverlapper->overlapRead(currRead, m_minOverlap, &blockList);\n        \n        // Convert the overlap block list into a multi-overlap \n        if(!overlap_result.searchAborted)\n        {\n            MultiOverlap mo = blockListToMultiOverlap(currRead, blockList);\n            int covered = mo.countBasesCovered();\n            int wrong = mo.countPotentialIncorrect(m_errorThreshold);\n            result.mean_depth = mo.getMeanDepth();\n            result.bases_counted += covered;\n            result.bases_wrong += wrong;\n        }\n    }\n\n    return result;\n}\n\n//\n//\n//\nStatsPostProcess::StatsPostProcess(bool bPrintKmer) : m_bPrintKmer(bPrintKmer), m_basesCounted(0), m_basesWrong(0), m_depthSum(0.0f), m_numReads(0), m_numPerfect(0)\n{\n}\n\n//\nStatsPostProcess::~StatsPostProcess()\n{\n    std::cout << \"\\n*** Stats: \\n\";\n    \n    if(m_bPrintKmer)\n    {\n        int max = 100;\n        m_kmerDist.print(max);\n    }\n\n    printf(\"%d out of %d bases are potentially incorrect (%lf)\\n\", m_basesWrong, m_basesCounted, (double)m_basesWrong/m_basesCounted);\n    printf(\"%d reads out of %d are perfect (%lf)\\n\", m_numPerfect, m_numReads, (double)m_numPerfect/m_numReads);\n    printf(\"Mean overlap depth: %.2lf\\n\", m_depthSum / m_numReads);\n}\n\n//\nvoid StatsPostProcess::process(const SequenceWorkItem& /*item*/, const StatsResult& result)\n{\n    for(size_t i = 0; i < result.kmerCoverage.size(); ++i)\n        m_kmerDist.add(result.kmerCoverage[i]);\n\n    m_basesCounted += result.bases_counted;\n    m_basesWrong += result.bases_wrong;\n    m_depthSum += result.mean_depth;\n    m_numReads += 1;\n    m_numPerfect += (result.bases_wrong == 0 ? 1 : 0);\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/StatsProcess.h",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// StatsProcess - Compute statistics about the reads\n//\n#ifndef STATSPROCESS_H\n#define STATSPROCESS_H\n\n#include \"Util.h\"\n#include \"BWT.h\"\n#include \"SequenceProcessFramework.h\"\n#include \"SequenceWorkItem.h\"\n#include \"OverlapAlgorithm.h\"\n#include \"KmerDistribution.h\"\n\nclass StatsResult\n{\n    public:\n        StatsResult() : bases_counted(0), bases_wrong(0), mean_depth(0.0f) {}\n\n        std::vector<int> kmerCoverage;\n        int bases_counted;\n        int bases_wrong;\n        double mean_depth;\n};\n\n//\nclass StatsProcess\n{\n    public:\n        StatsProcess(const BWT* pBWT, const BWT* pRBWT, int kmerLength, int minOverlap, int branchCutoff, bool bNoOverlap);\n        ~StatsProcess();\n        StatsResult process(const SequenceWorkItem& item);\n\n    private:\n        \n        const BWT* m_pBWT;\n        const BWT* m_pRBWT;\n        const int m_kmerLength;\n        const int m_minOverlap;\n        const int m_branchCutoff;\n        const bool m_bNoOverlap;\n        static const int m_errorThreshold = 3;\n\n        const OverlapAlgorithm* m_pAllOverlapper;\n};\n\n// Write the results from the overlap step to an ASQG file\nclass StatsPostProcess\n{\n    public:\n        StatsPostProcess(bool bPrintKmer);\n        ~StatsPostProcess();\n\n        void process(const SequenceWorkItem& item, const StatsResult& result);\n\n    private:\n\n        KmerDistribution m_kmerDist;\n        bool m_bPrintKmer;\n        int m_basesCounted;\n        int m_basesWrong;\n        double m_depthSum;\n        int m_numReads;\n        int m_numPerfect;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/StringGraphGenerator.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// StringGraphGenerator - Iteratively construct \n// a local String Graph using the FM-index\n//\n#include \"StringGraphGenerator.h\"\n#include \"SGAlgorithms.h\"\n#include \"SGVisitors.h\"\n\n//#define DEBUGGENERATE 1\n\nStringGraphGenerator::StringGraphGenerator(const OverlapAlgorithm* pOverlapper, \n                                           const SeqRecord& startRead, \n                                           const SeqRecord& endRead, \n                                           int minOverlap,\n                                           EdgeDir startDir,\n                                           int maxDistance) : m_pOverlapper(pOverlapper), \n                                                              m_minOverlap(minOverlap), \n                                                              m_pGraph(NULL), \n                                                              m_startDir(startDir), \n                                                              m_maxDistance(maxDistance)\n{\n    m_pGraph = new StringGraph;\n\n    // Add the start and end vertices to the graph\n    m_pStartVertex = addTerminalVertex(startRead);\n    m_pEndVertex = addTerminalVertex(endRead);\n\n    // Set the color of the starting node to be UNEXPLORED\n    // and the color of the end node to be EXPLORED.\n    // This indicates to the subsequent search which vertices\n    // should be expanded\n    m_pStartVertex->setColor(UNEXPLORED_COLOR);\n    m_pEndVertex->setColor(EXPLORED_COLOR);\n\n    // Set up the expansion frontier\n    FrontierQueue queue;\n    GraphFrontier node;\n    node.pVertex = m_pStartVertex;\n    node.dir = m_startDir;\n    node.distance = m_pStartVertex->getSeqLen();\n    queue.push(node);\n\n    buildGraph(queue);\n\n    //m_pGraph->writeDot(\"local.dot\");\n\n    SGDuplicateVisitor dupVisit(true);\n    m_pGraph->visit(dupVisit);\n\n    // If the terminal vertices are marked as contained, reset the containment flags so they will not be removed\n    resetContainmentFlags(m_pStartVertex);\n    resetContainmentFlags(m_pEndVertex);\n\n    SGContainRemoveVisitor containVisit;\n    m_pGraph->visit(containVisit);\n    //m_pGraph->writeDot(\"local-final.dot\");\n}\n\n//\nStringGraphGenerator::~StringGraphGenerator()\n{\n    delete m_pGraph;\n    m_pGraph = NULL;\n\n    // m_pStartVertex and m_pEndVertex are deleted by the graph destructor\n    // so they do not need to be explicitly freed here.\n}\n\n// Build the graph by expanding nodes on the frontier\nvoid StringGraphGenerator::buildGraph(FrontierQueue& queue)\n{\n    while(!queue.empty())\n    {\n        if(queue.size() > 200)\n            break;\n\n        GraphFrontier node = queue.front();\n        queue.pop();\n        if(node.pVertex->getColor() == EXPLORED_COLOR)\n            continue; // node has been visited already\n        \n        // Search the FM-index for the current vertex\n        SeqRecord record;\n        record.id = node.pVertex->getID();\n        record.seq = node.pVertex->getSeq().toString();\n        \n        OverlapBlockList blockList;\n        assert(blockList.empty());\n        m_pOverlapper->overlapRead(record, m_minOverlap, &blockList);\n\n        // Update the graph and the frontier queue with newly found vertices\n        updateGraphAndQueue(node, queue, blockList);\n        node.pVertex->setColor(EXPLORED_COLOR);\n    }\n\n    m_pGraph->setColors(GC_WHITE);\n}\n\n// Search for walks between the start and end vertex\nSGWalkVector StringGraphGenerator::searchWalks()\n{\n    SGWalkVector walks;\n    SGSearch::findWalks(m_pStartVertex, m_pEndVertex, m_startDir, m_maxDistance, true, 10000, walks);\n    return walks;\n}\n\n// \nvoid StringGraphGenerator::updateGraphAndQueue(GraphFrontier& currNode, FrontierQueue& queue, OverlapBlockList& blockList)\n{\n    // Partition the block list into containment blocks and extension (valid) blocks\n    // We do not add containment edges to the graph so the containments are discarded\n    OverlapBlockList containList;\n    OverlapBlockList overlapList;\n\n    Vertex* pX = currNode.pVertex;\n\n    //partitionBlockList(pX->getSeqLen(), &blockList, &overlapList, &containList);\n\n    // Process the overlap blocks, adding new vertices and edges where necessary\n    for(OverlapBlockList::iterator iter = blockList.begin(); iter != blockList.end(); ++iter)\n    {\n        if(iter->getEdgeDir() != currNode.dir)\n            continue;\n\n        std::string vertexID = iter->toCanonicalID();\n        if(vertexID == pX->getID())\n            continue; // skip self-edges\n\n\n        std::string vertexSeq = iter->getFullString(pX->getSeq().toString());\n        Overlap o = iter->toOverlap(pX->getID(), vertexID, pX->getSeqLen(), vertexSeq.length());\n\n/*\n#if DEBUGGENERATE\n        std::cout << \"has overlap to: \" << vertexID << \" len: \" << iter->overlapLen << \" flags: \" << iter->flags << \"\\n\";\n        std::cout << \"Overlap string: \" << iter->getOverlapString(pX->getSeq().toString()) << \"\\n\";\n#endif\n*/      \n        // Check if a vertex with endVertexID exists in the graph\n        Vertex* pVertex = m_pGraph->getVertex(vertexID);\n        if(pVertex == NULL)\n        {\n\n#if DEBUGGENERATE\n            std::cout << \"Vertex with ID: \" << vertexID << \" does not exist, creating\\n\";\n            std::cout << \"Vertex sequence: \" << vertexSeq << \"\\n\";\n#endif\n            // Generate the new vertex\n            vertexSeq = iter->getFullString(pX->getSeq().toString());\n            //pVertex = new(m_pGraph->getVertexAllocator()) Vertex(vertexID, vertexSeq);\n            pVertex = new Vertex(vertexID, vertexSeq);\n            pVertex->setColor(UNEXPLORED_COLOR);\n            m_pGraph->addVertex(pVertex);\n        }\n\n        // Construct the found edge\n        Edge* pXY = SGAlgorithms::createEdgesFromOverlap(m_pGraph, o, true);\n\n        // If the endpoint vertex is unexplored, queue it\n        if(pVertex->getColor() == UNEXPLORED_COLOR)\n        {\n            GraphFrontier node;\n            node.pVertex = pVertex;\n            node.dir = !pXY->getTwin()->getDir(); // continuation direction\n            node.distance = currNode.distance + pXY->getSeqLen();\n            if(node.distance <= m_maxDistance)\n                queue.push(node);\n        }\n    }\n}\n\n//\nVertex* StringGraphGenerator::addTerminalVertex(const SeqRecord& record)\n{\n    assert(m_pGraph != NULL);\n\n    // Build the vertex by performing a full-length search for the\n    // sequence in the FM-index. We set the ID of the vertex to be the \n    // lowest index in the returned block list.\n    OverlapBlockList endBlockList;\n    m_pOverlapper->alignReadDuplicate(record, &endBlockList);\n\n    // Search the block list for the exact match to the end read. This must exist\n    OverlapBlockList::iterator matchIter = endBlockList.begin();\n    while(matchIter != endBlockList.end())\n    {\n        if(matchIter->numDiff == 0 && !matchIter->flags.isQueryRev())\n            break; // this block corresponds to the actual sequence of endRead\n    }\n    assert(matchIter != endBlockList.end());\n    \n    // Construct the canonical ID from the matching interval\n    std::string endID = matchIter->toCanonicalID();\n\n    Vertex* pVertex = m_pGraph->getVertex(endID);\n    if(pVertex == NULL)\n    {\n      //pVertex = new(m_pGraph->getVertexAllocator()) Vertex(endID, record.seq.toString());\n        pVertex = new Vertex(endID, record.seq.toString());\n        m_pGraph->addVertex(pVertex);\n    }\n    return pVertex;\n}\n\n//\nvoid StringGraphGenerator::resetContainmentFlags(Vertex* pVertex)\n{\n    if(!pVertex->isContained())\n        return;\n    pVertex->setContained(false);\n    // Set the containment flag for all the vertices that have containment edges with this vertex\n    EdgePtrVec edges = pVertex->getEdges();\n    for(size_t i = 0; i < edges.size(); ++i)\n    {\n        Edge* pEdge = edges[i];\n        if(pEdge->getOverlap().isContainment())\n            pEdge->getEnd()->setContained(true);\n    }\n}\n\n"
  },
  {
    "path": "src/SGA/Algorithm/StringGraphGenerator.h",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// StringGraphGenerator - Iteratively construct \n// a local String Graph using the FM-index\n//\n#ifndef STRINGGRAPHGENERATOR_H\n#define STRINGGRAPHGENERATOR_H\n\n#include <queue>\n#include \"OverlapAlgorithm.h\"\n#include \"SGUtil.h\"\n#include \"GraphCommon.h\"\n#include \"SGSearch.h\"\n\n// The GraphFrontier is a node that is on the edge\n// of the graph - it can be used to search the FM-index\n// to expand the graph outwards.\nstruct GraphFrontier\n{\n    Vertex* pVertex;\n    EdgeDir dir;\n    int distance; // The distance from the starting node\n};\n\ntypedef std::queue<GraphFrontier> FrontierQueue;\n\nclass StringGraphGenerator\n{\n    public:\n        StringGraphGenerator(const OverlapAlgorithm* pOverlapper,\n                             const SeqRecord& startRead, \n                             const SeqRecord& endRead, \n                             int minOverlap,\n                             EdgeDir startDir,\n                             int maxDistance);\n\n        ~StringGraphGenerator();\n\n        // Find walks between the start vertex and the end vertex\n        SGWalkVector searchWalks();\n\n    private:\n\n        //\n        void buildGraph(FrontierQueue& queue);\n        void updateGraphAndQueue(GraphFrontier& currNode, FrontierQueue& queue, OverlapBlockList& blockList);\n        \n        Vertex* addTerminalVertex(const SeqRecord& record);\n        void resetContainmentFlags(Vertex* pVertex);\n        \n        // Data\n        const OverlapAlgorithm* m_pOverlapper;\n        int m_minOverlap;\n\n        StringGraph* m_pGraph;\n        Vertex* m_pStartVertex;\n        Vertex* m_pEndVertex;\n        EdgeDir m_startDir;\n        int m_maxDistance;\n\n        static const GraphColor UNEXPLORED_COLOR = GC_WHITE;\n        static const GraphColor EXPLORED_COLOR = GC_BLACK;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/StringThreader.cpp",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// StringThreader - Iteratively construct a\n// string representing a walk through an assembly graph\n// matching a query sequence. \n//\n// The assembly graph is abstractly represented as\n// an FM-index.\n//\n#include \"StringThreader.h\"\n#include \"BWTAlgorithms.h\"\n#include \"LRAlignment.h\"\n#include \"StdAlnTools.h\"\n\n//\n// StringThreaderNode\n//\nStringThreaderNode::StringThreaderNode(const std::string* pQuery,\n                                       StringThreaderNode* parent) : m_pQuery(pQuery),\n                                                                     m_pParent(parent)\n{\n\n}\n\n// Destructor, recurisvely delete the children of the node\nStringThreaderNode::~StringThreaderNode()\n{\n    // Delete children\n    for(STNodePtrList::iterator iter = m_children.begin(); iter != m_children.end(); ++iter)\n        delete *iter;\n\n    // Delete alignment columns\n    for(size_t i = 0; i < m_alignmentColumns.size(); ++i)\n        delete m_alignmentColumns[i];\n}\n\n// Return a suffix of length l of the path from the root to this node\nstd::string StringThreaderNode::getSuffix(size_t l) const\n{\n    size_t n = m_label.size();\n    if(l <= n)\n    {\n        return m_label.substr(n - l, l);\n    }\n    else \n    {\n        assert(m_pParent != NULL);\n        return m_pParent->getSuffix(l - n) + m_label;\n    }\n}\n\n// Return the full string of the path from the root to this node\nstd::string StringThreaderNode::getFullString() const\n{\n    if(m_pParent == NULL)\n        return m_label;\n    else\n        return m_pParent->getFullString() + m_label;\n}\n\n// Create a new child node with the given label. Returns a pointer to the new node.\nStringThreaderNode* StringThreaderNode::createChild(const std::string& label)\n{\n    StringThreaderNode* pAdded = new StringThreaderNode(m_pQuery, this);\n    m_children.push_back(pAdded);\n\n    assert(!m_alignmentColumns.empty());\n    pAdded->computeExtendedAlignment(label, m_alignmentColumns.back());\n    return pAdded;\n}\n\n// Extend the label of this node\nvoid StringThreaderNode::extend(const std::string& ext)\n{\n    assert(!ext.empty());\n    assert(!m_alignmentColumns.empty());\n    computeExtendedAlignment(ext, m_alignmentColumns.back());\n}\n   \n// Update the alignment columns for this node.\nvoid StringThreaderNode::computeExtendedAlignment(const std::string& ext, const BandedDPColumn* pPrevColumn)\n{\n    // Calculate a new alignment column for each base of the label\n    for(size_t i = 0; i < ext.size(); ++i)\n    {\n        BandedDPColumn* pNewColumn = ExtensionDP::createNewColumn(ext[i], *m_pQuery, pPrevColumn);\n        m_alignmentColumns.push_back(pNewColumn);\n        pPrevColumn = pNewColumn;\n    }\n    m_label.append(ext);\n}\n\n// Initialize the alignment columns. \nvoid StringThreaderNode::computeInitialAlignment(const std::string& initialLabel, int queryAlignmentEnd, int bandwidth)\n{\n    // Create the initial alignment columnds between label and query\n    m_label = initialLabel;\n    assert(!m_label.empty());\n    ExtensionDP::createInitialAlignment(m_label, m_pQuery->substr(0, queryAlignmentEnd), bandwidth, m_alignmentColumns);\n}\n\n// Calculate error rate over last context bases of the alignment\ndouble StringThreaderNode::getLocalErrorRate(int context) const\n{\n    return ExtensionDP::calculateLocalEditPercentage(m_alignmentColumns.back(), context);\n}\n\n// Calculate error rate over the entire alignment\ndouble StringThreaderNode::getGlobalErrorRate() const\n{\n    return ExtensionDP::calculateGlobalEditPercentage(m_alignmentColumns.back());\n}\n\n// Calculate the edit distance between the thread and query\nint StringThreaderNode::getEditDistance() const\n{\n    int edits, alignLength;\n    ExtensionDP::countEditsAndAlignLength(m_alignmentColumns.back(), edits, alignLength);\n    return edits;\n}\n\n// Returns true if the extension has terminated\nbool StringThreaderNode::hasExtensionTerminated() const\n{\n    return ExtensionDP::isExtensionTerminated(m_alignmentColumns.back(), 2);\n}\n\n// Return the best alignment between the string represented by this node and the query\nStringThreaderResult StringThreaderNode::getAlignment() const\n{\n    ExtensionDPAlignment alignment = ExtensionDP::findGlocalAlignment(m_alignmentColumns.back());\n    StringThreaderResult result;\n    result.query_align_length = alignment.query_align_length;\n    result.thread =  getFullString().substr(0, alignment.target_align_length);\n    return result;\n}\n\n// Print the alignment\nvoid StringThreaderNode::printFullAlignment() const\n{\n    std::string fullString = getFullString();\n    ExtensionDP::printAlignment(fullString, *m_pQuery, m_alignmentColumns.back());\n}\n\n// Print the string(s) represented by this node and its children\nvoid StringThreaderNode::printAllStrings(const std::string& parent) const\n{\n    if(m_children.empty())\n    {\n        std::cout << \"S: \" << parent + m_label << \"\\n\";\n    }\n    else\n    {\n        for(STNodePtrList::const_iterator iter = m_children.begin(); iter != m_children.end(); ++iter)\n            (*iter)->printAllStrings(parent + m_label);\n    }\n}\n\n//\n// StringTheader\n//\nStringThreader::StringThreader(const std::string& seed, \n                               const std::string* pQuery,\n                               int queryAlignmentEnd,\n                               int kmer, \n                               const BWT* pBWT) : m_pBWT(pBWT), m_kmer(kmer), m_pQuery(pQuery)\n{\n    // Create the root node containing the seed string\n    m_pRootNode = new StringThreaderNode(pQuery, NULL);\n    m_pRootNode->computeInitialAlignment(seed, queryAlignmentEnd, 50);\n    m_leaves.push_back(m_pRootNode);\n}\n\n//\nStringThreader::~StringThreader()\n{\n    // Recursively destroy the tree\n    delete m_pRootNode;\n}\n\n// Run the threading algorithm\nvoid StringThreader::run(StringThreaderResultVector& results)\n{\n    // Extend the leaf nodes\n    while(!m_leaves.empty())\n    {\n        extendLeaves();\n        cullLeavesByEdits();\n        checkTerminated(results);\n    }\n}\n\n// Print the string represented by every node\nvoid StringThreader::printAll()\n{\n    std::cout << \"Print all: \\n\";\n    m_pRootNode->printAllStrings(\"\");\n}\n\n// Extend each leaf node\nvoid StringThreader::extendLeaves()\n{\n    STNodePtrList newLeaves;\n    for(STNodePtrList::iterator iter = m_leaves.begin(); iter != m_leaves.end(); ++iter)\n    {\n        StringVector extensions = getDeBruijnExtensions(*iter);\n\n        // Either extend the current node or branch it\n        // If no extension, do nothing and this node\n        // is no longer considered a leaf\n        if(extensions.size() == 1)\n        {\n            // Single extension, do not branch\n            (*iter)->extend(extensions.front());\n            newLeaves.push_back(*iter);\n        }\n        else if(extensions.size() > 1)\n        {\n            // Branch\n            for(size_t i = 0; i < extensions.size(); ++i)\n            {\n                StringThreaderNode* pAdded = (*iter)->createChild(extensions[i]);\n                newLeaves.push_back(pAdded);\n            }\n        }\n    }\n\n    m_leaves.clear();\n    m_leaves = newLeaves;\n}\n\n// Remove leaves that are have a high local error rate\n// These leaves probably represent branches that are not\n// the query sequence.\nvoid StringThreader::cullLeavesByLocalError()\n{\n    STNodePtrList newLeaves;\n\n    int context = 20;\n    double threshold = 0.3f;\n\n    // Calculate the local error rate of the alignments to each new leaf\n    // If it is less than threshold, add the leaf to the node\n    for(STNodePtrList::iterator iter = m_leaves.begin(); iter != m_leaves.end(); ++iter)\n    {\n        double ler = (*iter)->getLocalErrorRate(context);\n\n        if(ler < threshold)\n            newLeaves.push_back(*iter);\n    }\n    m_leaves = newLeaves;\n}\n\n// Remove leaves that have an edit distance much higher than\n// the best leaf\nvoid StringThreader::cullLeavesByEdits()\n{\n    STNodePtrList newLeaves;\n\n    // Calculate the local error rate of the alignments to each new leaf\n    // If it is less than threshold, add the leaf to the node\n    int bestEdits = std::numeric_limits<int>::max();\n    IntVector editsVector;\n    for(STNodePtrList::iterator iter = m_leaves.begin(); iter != m_leaves.end(); ++iter)\n    {\n        int edits = (*iter)->getEditDistance();\n        if(edits < bestEdits)\n            bestEdits = edits;\n         editsVector.push_back(edits);\n    }\n\n    int leafID = 0;\n    int threshold = 1;\n    for(STNodePtrList::iterator iter = m_leaves.begin(); iter != m_leaves.end(); ++iter)\n    {\n        if(editsVector[leafID] <= bestEdits + threshold)\n            newLeaves.push_back(*iter);\n        leafID += 1;\n    }\n\n    m_leaves = newLeaves;\n}\n\n// Check for leaves whose extension has terminated. If the leaf has\n// terminated, its alignment result is pushed to the result vector\nvoid StringThreader::checkTerminated(StringThreaderResultVector& results)\n{\n    STNodePtrList newLeaves;\n    for(STNodePtrList::iterator iter = m_leaves.begin(); iter != m_leaves.end(); ++iter)\n    {\n        if((*iter)->hasExtensionTerminated())\n            results.push_back((*iter)->getAlignment());\n        else\n            newLeaves.push_back(*iter);\n    }\n    m_leaves = newLeaves;\n}\n\n// Calculate the successors of this node in the implicit deBruijn graph\nStringVector StringThreader::getDeBruijnExtensions(StringThreaderNode* pNode)\n{\n    // Get the last k-1 bases of the node\n    std::string pmer = pNode->getSuffix(m_kmer - 1);\n    AlphaCount64 extensions = BWTAlgorithms::calculateDeBruijnExtensionsSingleIndex(pmer, m_pBWT, ED_SENSE, NULL);\n\n    // Loop over the DNA symbols, if there is are more than two characters create a branch\n    // otherwise just perform an extension.\n    bool hasExtension = extensions.hasDNAChar();\n\n    StringVector out;\n    if(hasExtension)\n    {\n        for(int i = 0; i < DNA_ALPHABET::size; ++i)\n        {\n            char b = DNA_ALPHABET::getBase(i);\n            if(extensions.get(b) >= 3)\n            {\n                // extend to b\n                std::string tmp;\n                tmp.append(1,b);\n                out.push_back(tmp);\n            }\n        }\n    }\n\n    return out;\n}\n"
  },
  {
    "path": "src/SGA/Algorithm/StringThreader.h",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// StringThreader - Iteratively construct a\n// string representing a walk through an assembly graph\n// matching a query sequence. \n//\n// The assembly graph is abstractly represented as\n// an FM-index.\n//\n#ifndef STRING_THREADER_H\n#define STRING_THREADER_H\n\n#include <list>\n#include \"BWT.h\"\n#include \"ExtensionDP.h\"\n\n// Typedefs\nclass StringThreaderNode;\ntypedef std::list<StringThreaderNode*> STNodePtrList;\n\n// Object to hold the result of the threading process\nstruct StringThreaderResult\n{\n    std::string thread;\n    int query_align_length;\n};\ntypedef std::vector<StringThreaderResult> StringThreaderResultVector;\n\n// A node in the threading tree\nclass StringThreaderNode\n{\n    public:\n\n        //\n        // Functions\n        // \n        StringThreaderNode(const std::string* pQuery, StringThreaderNode* parent);\n        ~StringThreaderNode();\n      \n        // Add a child node to this node with the given label\n        // Returns a pointer to the created node\n        StringThreaderNode* createChild(const std::string& label);\n\n        // Extend the label of this node by l\n        void extend(const std::string& ext);\n        \n        // Return a suffix of length l of the string represented by this node\n        std::string getSuffix(size_t l) const;\n\n        // Return the complete sequence of the string represented by the branch\n        std::string getFullString() const;\n\n        // Get alignment mismatch/error rate metrics\n        double getLocalErrorRate(int context) const;\n        double getGlobalErrorRate() const;\n        int getEditDistance() const;\n        \n        // Initialize or update the alignment data\n        void computeInitialAlignment(const std::string& initialLabel, int queryAlignmentEnd, int bandwidth);\n        void computeExtendedAlignment(const std::string& ext, const BandedDPColumn* pPrevColumn);\n\n        // Return the best alignment for the string this node represents\n        StringThreaderResult getAlignment() const;\n\n        // Check if this node can be extended any further\n        bool hasExtensionTerminated() const;\n\n        // Print the alignment between the string represented by the\n        // path from the root of the tree to this node\n        void printFullAlignment() const;\n        \n        // Recursive function to print all the strings represented\n        // by this node and all its children.\n        void printAllStrings(const std::string& parent) const;\n\n\n    private:\n        \n        //\n        // Data\n        //\n        \n        // The extension string from the parent\n        std::string m_label;\n\n        // The query string being threaded through the graph\n        const std::string* m_pQuery;\n\n        // The parent node, can be NULL\n        StringThreaderNode* m_pParent;\n        STNodePtrList m_children;\n\n        // Alignment information between the label of this node and the query sequence\n        // One column per label base\n        BandedDPColumnPtrVector m_alignmentColumns;\n};\n\nclass StringThreader\n{\n    public:\n\n        //\n        // Functions\n        //\n        StringThreader(const std::string& seed, \n                       const std::string* pQuery,\n                       int queryAlignmentEnd,\n                       int kmer,\n                       const BWT* pBWT);\n\n        ~StringThreader();\n\n        // Run the threading process. Valid alignments are pushed to the results\n        // vector\n        void run(StringThreaderResultVector& results);\n\n        // Print all the strings represented by the tree\n        void printAll();\n\n    private:\n\n        //\n        // Functions\n        //\n        void extendLeaves();\n\n        // Leaf removal heuristics\n        void cullLeavesByLocalError();\n        void cullLeavesByEdits();\n        \n        // Check if the leaves can be extended no further\n        // If so, the best alignment is pushed to results\n        void checkTerminated(StringThreaderResultVector& results);\n\n        // Calculate the successors of this node in the implicit deBruijn graph\n        StringVector getDeBruijnExtensions(StringThreaderNode* pNode);\n        \n        //\n        // Data\n        //\n        const BWT* m_pBWT; \n        int m_kmer;\n        const std::string* m_pQuery;\n        StringThreaderNode* m_pRootNode;\n        STNodePtrList m_leaves;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Algorithm/VariationBuilderCommon.cpp",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// VariantionVariationBuilderCommon -- Common functions and data\n// structures for the abstract graph builders\n//\n#include \"VariationBuilderCommon.h\"\n#include \"SGAlgorithms.h\"\n\n// Count the number of extensions above the given threshold\nsize_t VariationBuilderCommon::countValidExtensions(const AlphaCount64& ac, size_t threshold)\n{\n    size_t n = 0;\n    for(size_t i = 0; i < DNA_ALPHABET::size; ++i)\n    {\n        char b = DNA_ALPHABET::getBase(i);\n        size_t count = ac.get(b);\n        if(count >= threshold)\n            n += 1;\n    }\n    return n;\n}\n\n// Filter out low counts in AlphaCount using a coverage threshold\n// relative to the most frequent count. Returns the number of\n// surviving counts\nsize_t VariationBuilderCommon::filterLowFrequency(AlphaCount64& ac, double alpha)\n{\n    size_t n = 0;\n    size_t max = ac.getMaxCount();\n    if(max == 0)\n        return 0;\n\n    for(size_t i = 0; i < DNA_ALPHABET::size; ++i)\n    {\n        char b = DNA_ALPHABET::getBase(i);\n        size_t count = ac.get(b);\n        double ratio = (double)count / max;\n        if(ratio >= alpha)\n            n += 1;\n        else\n            ac.set(b,0);\n    }\n    return n;\n}\n\n\n// Make a de Bruijn graph string \nstd::string VariationBuilderCommon::makeDeBruijnVertex(const std::string& v, char edgeBase, EdgeDir direction)\n{\n    std::string w;\n    size_t p = v.size() - 1;\n    if(direction == ED_SENSE)\n    {\n        w = v.substr(1, p);\n        w.append(1, edgeBase);\n    }\n    else\n    {\n        w.append(1, edgeBase);\n        w.append(v.substr(0, p));\n    }\n    return w;\n}\n\n// Add a de Bruijn graph edge to the given graph betwee pX and pY.\n// Assumes the sequences are from the same strand (not reverse complements)\nvoid VariationBuilderCommon::addSameStrandDeBruijnEdges(StringGraph* pGraph, const Vertex* pX, const Vertex* pY, EdgeDir direction)\n{\n    assert(pX->getSeq().length() == pY->getSeq().length());\n    \n    // overlap length for a de bruijn edge\n    size_t p = pX->getSeq().length() - 1;\n\n    // Construct an overlap object for this relationship\n    Overlap o;\n    o.id[0] = pX->getID();\n    o.id[1] = pY->getID();\n\n    o.match.isReverse = false;\n    o.match.numDiff = 0;\n\n    if(direction == ED_SENSE)\n    {\n        // pX -> pY\n        o.match.coord[0].interval.start = 1;\n        o.match.coord[1].interval.start = 0;\n    }\n    else\n    {\n        // pY -> pX\n        o.match.coord[0].interval.start = 0;\n        o.match.coord[1].interval.start = 1;\n    }\n\n    o.match.coord[0].interval.end = o.match.coord[0].interval.start + p - 1; // inclusive coordinate\n    o.match.coord[1].interval.end = o.match.coord[1].interval.start + p - 1;\n    o.match.coord[0].seqlen = p + 1;\n    o.match.coord[1].seqlen = p + 1;\n    Edge* e = SGAlgorithms::createEdgesFromOverlap(pGraph, o, false);\n    assert(e != NULL);\n}\n\n"
  },
  {
    "path": "src/SGA/Algorithm/VariationBuilderCommon.h",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// VariationBuilderCommon - Data structures\n// commons to various algorithms for assembling\n// variation haplotypes\n//\n#ifndef VARIATION_BUILDER_COMMON_H\n#define VARIATION_BUILDER_COMMON_H\n#include \"BWT.h\"\n#include \"BWTInterval.h\"\n#include \"SGUtil.h\"\n#include \"SGWalk.h\"\n#include <queue>\n\n// Result of the bubble construction\n// Used to track statistics\nenum BubbleResultCode\n{\n    BRC_UNKNOWN,\n    BRC_OK,\n    BRC_SOURCE_BROKEN,\n    BRC_SOURCE_BRANCH,\n    BRC_TARGET_BROKEN,\n    BRC_TARGET_BRANCH,\n    BRC_WALK_FAILED,\n    BRC_HB_FAILED,\n    BRC_NO_SOLUTION\n};\n\n// The actual result structure\nstruct BubbleResult\n{\n    std::string targetString;\n    std::string sourceString;\n    double targetCoverage;\n    double sourceCoverage;\n    BubbleResultCode returnCode;\n};\n\n// A directed node in a graph that\n// has not had it's neighbors visited\nstruct BuilderExtensionNode\n{\n    BuilderExtensionNode(Vertex* pX, EdgeDir d) : pVertex(pX), direction(d), distance(0) {}\n    BuilderExtensionNode(Vertex* pX, EdgeDir dir, int dist) : pVertex(pX), direction(dir), distance(dist) {}\n\n    Vertex* pVertex; // the vertex to extend\n    EdgeDir direction; // the direction to extend to\n    int distance; // the total number of nodes from the start to this node.\n};\ntypedef std::queue<BuilderExtensionNode> BuilderExtensionQueue;\ntypedef std::map<std::string, int> StrIntMap;\n\n// Common functions\nnamespace VariationBuilderCommon\n{\n\n// Count the number of extensions above the given threshold\nsize_t countValidExtensions(const AlphaCount64& ac, size_t threshold);\n\n// Returns true if there are multiple characters above the threshold\nbool hasMultipleBranch(const AlphaCount64& ac, size_t threshold);\n\n// Filter out low counts in AlphaCount using a coverage threshold\n// relative to the most frequent count. Returns the number of\n// surviving counts\nsize_t filterLowFrequency(AlphaCount64& ac, double alpha);\n\n// Make a de Bruijn graph string \nstd::string makeDeBruijnVertex(const std::string& v, char edgeBase, EdgeDir direction);\n\n// Add a de Bruijn graph edge to the given graph betwee pX and pY.\nvoid addSameStrandDeBruijnEdges(StringGraph* pGraph, const Vertex* pX, const Vertex* pY, EdgeDir direction);\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Bigraph/Bigraph.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Bidirectional graph \n//\n#include <assert.h>\n#include <ostream>\n#include <fstream>\n#include <iostream>\n#include \"Bigraph.h\"\n#include \"Timer.h\"\n#include \"ASQG.h\"\n\n//\n//\n//\nBigraph::Bigraph() : m_hasContainment(false), m_hasTransitive(false), m_isExactMode(false), m_minOverlap(0), m_errorRate(0.0f)\n{\n  //JEREMIAH\n    // Set up the memory pools for the graph\n    //m_pEdgeAllocator = new SimpleAllocator<Edge>();\n    //m_pVertexAllocator = new SimpleAllocator<Vertex>();\n\n    //m_vertices.set_deleted_key(\"\"); // JEREMIAH\n    //WARN_ONCE(\"HARDCODED HASH TABLE MAX SIZE\");\n    //m_vertices.resize(600000000);\n}\n\n//\n//\n//\nBigraph::~Bigraph()\n{\n    VertexPtrMap::iterator iter = m_vertices.begin(); \n    for(; iter != m_vertices.end(); ++iter)\n    {\n        delete iter->second;\n        iter->second = NULL;\n    }\n\n    //JEREMIAH\n    // Clean up the memory pools\n    //delete m_pEdgeAllocator;\n    //delete m_pVertexAllocator;\n}\n\n//\n// Add a vertex\n//\nvoid Bigraph::addVertex(Vertex* pVert)\n{\n  //    std::pair<VertexPtrMapIter, bool> result = \n  //    m_vertices_tokeep.insert(std::make_pair(pVert->getID(), pVert));//JEREMIAH\n  std::pair<VertexPtrMapIter, bool> result =\n    m_vertices.insert(std::make_pair(pVert->getID(), pVert));\n\n    if(!result.second)\n    {\n        std::cerr << \"Error: Attempted to insert vertex into graph with a duplicate id: \" <<\n                     pVert->getID() << \"\\n\";\n        std::cerr << \"All reads must have a unique identifier\\n\";\n        exit(1);\n    }\n}\n\n//\n// Remove a vertex that is not connected to any other\n//\nvoid Bigraph::removeIslandVertex(Vertex* pVertex)\n{\n    assert(pVertex->countEdges() == 0);\n\n    // Remove the vertex from the collection\n    VertexID id = pVertex->getID();\n    delete pVertex;\n    m_vertices.erase(id);\n    //m_vertices_tokeep.erase(id); //JEREMIAH\n}\n\n//\n// Remove a vertex that is not connected to any other\n//\nvoid Bigraph::removeIslandVertexNoErase(Vertex* pVertex)\n{\n    assert(pVertex->countEdges() == 0);\n\n    // Remove the vertex from the collection\n    VertexID id = pVertex->getID();\n    delete pVertex;\n    m_vertices.erase(id);\n}\n\n\n//\n// Remove a vertex\n//\nvoid Bigraph::removeConnectedVertex(Vertex* pVertex)\n{\n    // Remove the edges pointing to this Vertex\n    pVertex->deleteEdges();\n\n    // Remove the vertex from the collection\n    VertexID id = pVertex->getID();\n    delete pVertex;\n    m_vertices.erase(id);\n}\n\n\n//\n// Check for the existance of a vertex\n//\nbool Bigraph::hasVertex(VertexID id)\n{\n    VertexPtrMapIter iter = m_vertices.find(id);\n    return iter != m_vertices.end();\n}\n\n//\n// Get a vertex\n//\nVertex* Bigraph::getVertex(VertexID id) const\n{\n    VertexPtrMapConstIter iter = m_vertices.find(id);\n    if(iter == m_vertices.end())\n        return NULL;\n    return iter->second;\n}\n\n//\n// Add an edge\n//\nvoid Bigraph::addEdge(Vertex* pVertex, Edge* pEdge)\n{\n    assert(pEdge->getStart() == pVertex);\n    pVertex->addEdge(pEdge);\n}\n\n//\n// Remove an edge\n//\nvoid Bigraph::removeEdge(const EdgeDesc& ed)\n{\n    ed.pVertex->removeEdge(ed);\n}\n\n//\n// High level merge function that does not specify an edge\n//\nvoid Bigraph::mergeVertices(VertexID id1, VertexID id2)\n{\n    Vertex* pVert1 = getVertex(id1);\n\n    // Get the edges from vertex1 to vertex2\n    EdgePtrVec edgesTo = pVert1->findEdgesTo(id2);\n\n    if(edgesTo.empty())\n    {\n        std::cerr << \"mergeVertices: vertices are not connected\\n\";\n        return;\n    }\n\n    if(edgesTo.size() > 1)\n    {\n        std::cerr << \"mergeVertces: cannot merge because of ambigious edges\\n\";\n        return;\n    }\n\n    // There is a single unique edge between the vertices\n    Edge* mergeEdge = *edgesTo.begin();\n\n    // Call the real merging function\n    merge(pVert1, mergeEdge);\n}\n\n//\n// Merge two vertices along the specified edge\n//\nvoid Bigraph::merge(Vertex* pV1, Edge* pEdge)\n{\n    Vertex* pV2 = pEdge->getEnd();\n    //std::cout << \"Merging \" << pV1->getID() << \" with \" << pV2->getID() << \"\\n\";\n\n    // jeremiah connected component tracking\n    if (m_get_components) {\n      int lab1 = m_connected_components[pV1->getID()];\n      int lab2 = m_connected_components[pV2->getID()];\n      ++m_label;\n      m_connected_components[pV1->getID()] = m_label;\n      m_connected_components[pV2->getID()] = m_label;\n      for (auto& i : m_connected_components)\n\tif (i.second == lab1 || i.second == lab2)\n\t  i.second = m_label;\n    }\n\n    //JEREMIAH\n    //pV1->addParent(pV2->getID());\n    //std::cerr << \"LEN: \" << pV1->getParentID().size() << std::endl;\n\n    // Merge the data\n    pV1->merge(pEdge);\n\n    // Get the twin edge (the edge in v2 that points to v1)\n    Edge* pTwin = pEdge->getTwin();\n\n    // Ensure v2 has the twin edge\n    assert(pV2->hasEdge(pTwin));\n\n    // Get the edge set opposite of the twin edge (which will be the new edges in this direction for V1)\n    EdgePtrVec transEdges = pV2->getEdges(!pTwin->getDir());\n\n    // Move the edges from pV2 to pV1\n    for(EdgePtrVecIter iter = transEdges.begin(); iter != transEdges.end(); ++iter)\n    {\n        Edge* pTransEdge = *iter;\n\n        // Remove the edge from V2, this does not destroy the edge\n        pV2->removeEdge(pTransEdge);\n\n        // Join pEdge to the start of transEdge\n        // This updates the starting point of pTransEdge to be V1\n        // This calls Edge::extend on the twin edge\n        pTransEdge->join(pEdge);\n        assert(pTransEdge->getDir() == pEdge->getDir());\n        pV1->addEdge(pTransEdge); // add to V1\n\n        // Notify the edges they have been updated\n        pTransEdge->update();\n        pTransEdge->getTwin()->update();\n    }\n\n    // Remove the edge from pV1 to pV2\n    pV1->removeEdge(pEdge);\n    delete pEdge;\n    pEdge = 0;\n\n    // Remove the edge from pV2 to pV1\n    pV2->removeEdge(pTwin);\n    delete pTwin;\n    pEdge = 0;\n\n    // Remove V2\n    // It is guarenteed to not be connected\n    removeIslandVertexNoErase(pV2);\n    //validate();\n}\n\n//\nint Bigraph::sweepVertices(GraphColor c)\n{\n    int numRemoved = 0;\n    VertexPtrMapIter iter = m_vertices.begin();\n    while(iter != m_vertices.end())\n    {\n        VertexPtrMapIter next = iter;\n        ++next;\n        if(iter->second->getColor() == c)\n        {\n            removeConnectedVertex(iter->second); \n            ++numRemoved;\n        }\n        iter = next;\n    }\n    return numRemoved;\n}\n\n\n//\nint Bigraph::sweepEdges(GraphColor c)\n{\n    int numRemoved = 0;\n    for(VertexPtrMapIter iter = m_vertices.begin(); iter != m_vertices.end(); ++iter)\n        numRemoved += iter->second->sweepEdges(c);\n    return numRemoved;\n}\n\n//    Simplify the graph by compacting singular edges\nvoid Bigraph::simplify()\n{\n    assert(!hasContainment());\n    simplify(ED_SENSE);\n    simplify(ED_ANTISENSE);\n}\n\n// Simplify the graph by compacting edges in the given direction\nvoid Bigraph::simplify(EdgeDir dir)\n{\n    bool graph_changed = true;\n    while(graph_changed)\n    {\n        graph_changed = false;\n        VertexPtrMapIter iter = m_vertices.begin(); \n        while(iter != m_vertices.end())\n        {\n\n\n\n            // Get the edges for this direction\n            EdgePtrVec edges = iter->second->getEdges(dir);\n\n\t    //std::cout << \"--VERTEX: dir \" << dir << \" \" << iter->first << \" seq len \" << iter->second->getSeqLen() << \" eges size \" << edges.size() << std::endl;\n\n\t    // for (auto& i : edges)\n\t    // std::cerr << \"    EDGE: \" << i->getStartID() << \" \" << i->getEndID()<< std::endl;\n\n            // If there is a single edge in this direction, merge the vertices\n            // Don't merge singular self edges though\n            if(edges.size() == 1 && !edges.front()->isSelf())\n            {\n                // Check that the edge back is singular as well\n                Edge* pSingle = edges.front();\n                Edge* pTwin = pSingle->getTwin();\n                Vertex* pV2 = pSingle->getEnd();\n\t\t//std::cerr << \"...edge back edge counts \" << pV2->countEdges(pTwin->getDir()) << std::endl;\n                if(pV2->countEdges(pTwin->getDir()) == 1)\n                {\n\t\t  //std::cerr << \"merging \" << std::endl;\n                    merge(iter->second, pSingle);\n                    graph_changed = true;\n                }\n            }\n\n            ++iter;\n        }\n    } \n}\n\n//\n// Rename the vertices to have a sequential idx\n// starting with prefix. This requires extra memory\n// as we need to keep a vector of vertex pointers to reconstruct\n// the graph after the vertices are renamed. This should\n// only be done after the string graph has been simplified or\n// else it could require a lot of memory.\n//\nvoid Bigraph::renameVertices(const std::string& prefix)\n{\n    size_t currIdx = 0;\n    size_t numVertices = m_vertices.size();\n    std::vector<Vertex*> vertexPtrVec(numVertices, 0);\n\n    VertexPtrMapIter iter = m_vertices.begin();\n    while(iter != m_vertices.end())\n    {\n        std::stringstream ss;\n        ss << prefix << currIdx;\n\tstd::string newlab = ss.str();\n\n\t// jeremiah\n\tif (m_get_components) {\n\t  int label = m_connected_components[iter->second->getID()];\n\t  if (label) { // is a connected component\n\t    for (auto& i : m_connected_components) {\n\t      if (i.second == label)\n\t\tm_reads_on_contigs[newlab].push_back(i.first); // i.first is read name of merged read\n\t    }\n\t  }\n\t}\n\n        iter->second->setID(ss.str());\n        vertexPtrVec[currIdx] = iter->second;\n        ++iter;\n        ++currIdx;\n    }\n\n    // Clear the old graph\n    m_vertices.clear();\n    \n    // Re-add the vertices\n    for(size_t i = 0; i < numVertices; ++i)\n        addVertex(vertexPtrVec[i]);\n}\n\n//\n// Sort the adjacency list for each vertex by length\n//\nvoid Bigraph::sortVertexAdjListsByLen()\n{\n    VertexPtrMapIter iter = m_vertices.begin();\n    for(; iter != m_vertices.end(); ++iter)\n        iter->second->sortAdjListByLen();\n}\n\n\n//\n// Sort the adjacency list for each vertex by ID\n//\nvoid Bigraph::sortVertexAdjListsByID()\n{\n    VertexPtrMapIter iter = m_vertices.begin();\n    for(; iter != m_vertices.end(); ++iter)\n        iter->second->sortAdjListByID();\n}\n\n//\n// Validate that the graph is sane\n//\nvoid Bigraph::validate()\n{\n    VertexPtrMapIter iter = m_vertices.begin();\n    for(; iter != m_vertices.end(); ++iter)\n    {\n        iter->second->validate();\n    }\n}\n\n//\n// Flip a vertex\n//\nvoid Bigraph::flip(VertexID /*id*/)\n{\n    assert(false);\n#if 0\n    // TODO: update this code\n    Vertex* pVertex = getVertex(id);\n    EdgePtrVec edges = pVertex->getEdges();\n\n    for(EdgePtrVecIter iter = edges.begin(); iter != edges.end(); ++iter)\n    {\n        // Get the old twin\n        GraphEdgeType twin = iter->getTwin();\n        \n        GraphEdgeType flipped = *iter; \n        flipped.flip();\n\n        // Remove the edge from the source ver\n        pVertex->removeEdge(*iter);\n        pVertex->addEdge(flipped);\n\n        // Update the partner by deleting the old twin and \n        Vertex* pV2 = getVertex(twin.getStart());\n        pV2->removeEdge(twin);\n        pV2->addEdge(flipped.getTwin());\n    }\n#endif\n}\n\n//\n// Get the IDs of the vertices that do not branch (both sense/antisense degree <= 1)\n//\nVertexIDVec Bigraph::getNonBranchingVertices() const\n{\n    VertexIDVec out;\n    VertexPtrMapConstIter iter = m_vertices.begin(); \n    for(; iter != m_vertices.end(); ++iter)\n    {\n        int senseEdges = iter->second->countEdges(ED_SENSE);\n        int antisenseEdges = iter->second->countEdges(ED_ANTISENSE);\n        if(antisenseEdges <= 1 && senseEdges <= 1)\n        {\n            out.push_back(iter->second->getID());\n        }\n    }\n    return out;\n}\n\n\n//\n// Get all the paths corresponding to the linear components of the graph\n// Precondition: all vertices have in/out degree at most 1 (no branching)\n//\nPathVector Bigraph::getLinearComponents()\n{\n    PathVector outPaths;\n    setColors(GC_WHITE);\n    VertexPtrMapIter iter = m_vertices.begin(); \n    for(; iter != m_vertices.end(); ++iter)\n    {\n        // Output the linear path containing this vertex if it hasnt been visited already\n        if(iter->second->getColor() != GC_BLACK)\n        {\n            outPaths.push_back(constructLinearPath(iter->second->getID()));\n        }\n    }\n    assert(checkColors(GC_BLACK));\n    return outPaths;\n}\n\n//\n// Return all the path of nodes that can be linearally reached from this node\n// The path expands in both directions so the first node in the path is not necessarily the source\n//\nPath Bigraph::constructLinearPath(VertexID id)\n{\n    Path sensePath;\n    Path antisensePath;\n    followLinear(id, ED_SENSE, sensePath);\n    followLinear(id, ED_ANTISENSE, antisensePath);\n\n    // Construct the final path \n    Path final = reversePath(antisensePath);\n    final.insert(final.end(), sensePath.begin(), sensePath.end());\n    return final;\n}\n\n//\n// Recursively follow the graph in the specified direction without branching\n// outPath is an out-parameter of the edges that were followed\n//\nvoid Bigraph::followLinear(VertexID id, EdgeDir dir, Path& outPath)\n{\n    Vertex* pVertex = getVertex(id);\n    EdgePtrVec edges = pVertex->getEdges(dir);\n\n    // Color the vertex\n    pVertex->setColor(GC_BLACK);\n    \n    if(edges.size() == 1)\n    {\n        Edge* pSingle = edges.front();\n        outPath.push_back(pSingle);\n        // Correct the direction for the comp\n        assert(pSingle->getDir() == dir);\n        EdgeDir corrected_dir = correctDir(pSingle->getDir(), pSingle->getComp());\n\n        // Recurse\n        followLinear(pSingle->getEndID(), corrected_dir, outPath);\n    }\n}\n\n//\nPath Bigraph::reversePath(const Path& path)\n{\n    Path out;\n    for(Path::const_reverse_iterator iter = path.rbegin(); iter != path.rend(); ++iter)\n        out.push_back((*iter)->getTwin());\n    return out;\n}\n\n//\nVertex* Bigraph::getFirstVertex() const\n{\n    if(m_vertices.empty())\n        return NULL;\n    else\n        return m_vertices.begin()->second;\n}\n\n// Returns a vector of pointers to the vertices\nVertexPtrVec Bigraph::getAllVertices() const\n{\n    VertexPtrVec out;\n    VertexPtrMapConstIter iter = m_vertices.begin();\n    for(; iter != m_vertices.end(); ++iter)\n        out.push_back(iter->second);\n    return out;\n}\n\n// Returns a vector of pointers to the vertices\n/*VertexPtrVec Bigraph::getAllKeepVertices() const\n{\n    VertexPtrVec out;\n    VertexPtrMapConstIter iter = m_vertices_tokeep.begin();\n    for(; iter != m_vertices_tokeep.end(); ++iter)\n        out.push_back(iter->second);\n    return out;\n    }*/\n\n//\n// Append vertex sequences to the vector\nvoid Bigraph::getVertexSequences(std::vector<std::string>& outSequences) const\n{\n    VertexPtrMapConstIter iter = m_vertices.begin();\n    for(; iter != m_vertices.end(); ++iter)\n        outSequences.push_back(iter->second->getSeq().toString());\n}\n\n\n//\n// Visit each vertex and call the function pointer\n// The function returns TRUE if it modifies the graph\n//\nbool Bigraph::visit(VertexVisitFunction f)\n{\n    bool modified = false;\n    VertexPtrMapConstIter iter = m_vertices.begin(); \n    for(; iter != m_vertices.end(); ++iter)\n    {\n        modified = f(this, iter->second) || modified;\n    }\n    return modified;\n}\n\n\n//\n// Set all the vertices and edges in the graph to the given color\n//\nvoid Bigraph::setColors(GraphColor c)\n{\n    VertexPtrMapIter iter = m_vertices.begin(); \n    for(; iter != m_vertices.end(); ++iter)\n    {\n        iter->second->setColor(c);\n        iter->second->setEdgeColors(c);\n    }\n}\n\n//\n// Get/Set the containment flag\n//\nvoid Bigraph::setContainmentFlag(bool b)\n{\n    m_hasContainment = b;\n}\n\n//\nbool Bigraph::hasContainment() const\n{\n    return m_hasContainment;\n}\n\n//\n// Get/Set the exact mode flag\n//\nvoid Bigraph::setExactMode(bool b)\n{\n    m_isExactMode = b;\n}\n\n//\nbool Bigraph::isExactMode() const\n{\n    return m_isExactMode;\n}\n\n//\n// Get/Set the transitive flag\n//\nvoid Bigraph::setTransitiveFlag(bool b)\n{\n    m_hasTransitive = b;\n}\n\n//\nbool Bigraph::hasTransitive() const\n{\n    return m_hasTransitive;\n}\n\n//\n//\n//\nvoid Bigraph::setMinOverlap(int mo)\n{\n    m_minOverlap = mo;\n}\n\n//\nint Bigraph::getMinOverlap() const\n{\n    return m_minOverlap;\n}\n\n//\n//\n//\nvoid Bigraph::setErrorRate(double er)\n{\n    m_errorRate = er;\n}\n\n//\ndouble Bigraph::getErrorRate() const\n{\n    return m_errorRate;\n}\n\n//\n// Check if all the vertices in the graph are the given color\n//\nbool Bigraph::checkColors(GraphColor c)\n{\n    VertexPtrMapIter iter = m_vertices.begin(); \n    for(; iter != m_vertices.end(); ++iter)\n    {\n        if(iter->second->getColor() != c)\n        {\n            std::cerr << \"Warning vertex \" << iter->second->getID() << \" is color \" << iter->second->getColor() << \" expected \" << c << \"\\n\";\n            return false;\n        }\n    }\n    return true;\n}\n\n//\n// Output simple stats\n//\nvoid Bigraph::stats() const\n{\n    int numVerts = 0;\n    int numEdges = 0;\n\n    VertexPtrMapConstIter iter = m_vertices.begin(); \n    for(; iter != m_vertices.end(); ++iter)\n    {\n        numEdges += iter->second->countEdges();\n        ++numVerts;\n    }\n\n    std::cout << \"Graph has \" << numVerts << \" vertices and \" << numEdges << \" edges\\n\";\n}\n\n//\n//\n//\nsize_t Bigraph::getNumVertices() const\n{\n    return m_vertices.size();\n}\n\n//\n// Output mem stats\n//\nvoid Bigraph::printMemSize() const\n{\n    size_t numVerts = 0;\n    size_t vertMem = 0;\n\n    size_t numEdges = 0;\n    size_t edgeMem = 0;\n\n    VertexPtrMapConstIter iter = m_vertices.begin(); \n    for(; iter != m_vertices.end(); ++iter)\n    {\n        ++numVerts;\n        vertMem += iter->second->getMemSize();\n\n        EdgePtrVec edges = iter->second->getEdges();\n        for(EdgePtrVecIter edgeIter = edges.begin(); edgeIter != edges.end(); ++edgeIter)\n        {\n            ++numEdges;\n            edgeMem += (*edgeIter)->getMemSize();\n        }\n    }\n    //printf(\"num verts: %zu using %zu bytes (%.2lf per vert)\\n\", numVerts, vertMem, double(vertMem) / numVerts);\n    //printf(\"num edges: %zu using %zu bytes (%.2lf per edge)\\n\", numEdges, edgeMem, double(edgeMem) / numEdges);\n    //printf(\"total: %zu\\n\", edgeMem + vertMem);\n}\n\n//\n// Write the graph to a dot file\n//\nvoid Bigraph::writeDot(const std::string& filename, int dotFlags) const\n{\n    std::ofstream out(filename.c_str());\n    \n    std::string graphType = (dotFlags & DF_UNDIRECTED) ? \"graph\" : \"digraph\";\n\n    out << graphType << \" G\\n{\\n\";\n    VertexPtrMapConstIter iter = m_vertices.begin(); \n    for(; iter != m_vertices.end(); ++iter)\n    {\n        VertexID id = iter->second->getID();\n        std::string label = (dotFlags & DF_NOID) ? \"\" : id;\n        \n        out << \"\\\"\" << id << \"\\\" [ label=\\\"\" << label << \"\\\" \";\n        if(dotFlags & DF_COLORED)\n            out << \" style=\\\"filled\\\" fillcolor=\\\"\" << getColorString(iter->second->getColor()) << \"\\\" \";\n        out << \"];\\n\";\n        iter->second->writeEdges(out, dotFlags);\n    }\n    out << \"}\\n\";\n    out.close();\n}\n\n//\n// Write the graph to an ASQG file\n//\nvoid Bigraph::writeASQG(const std::string& filename) const\n{\n    std::ostream* pWriter = createWriter(filename);\n    \n    // Header\n    ASQG::HeaderRecord headerRecord;\n    headerRecord.setOverlapTag(m_minOverlap);\n    headerRecord.setErrorRateTag(m_errorRate);\n    headerRecord.setTransitiveTag(m_hasTransitive);\n    headerRecord.setContainmentTag(m_hasContainment);\n    headerRecord.write(*pWriter);\n\n\n    VertexPtrMapConstIter iter; \n\n    // Vertices\n    for(iter = m_vertices.begin(); iter != m_vertices.end(); ++iter)\n    {\n        ASQG::VertexRecord vertexRecord(iter->second->getID(), iter->second->getSeq().toString());\n        vertexRecord.write(*pWriter);\n    }\n\n    // Edges\n    for(iter = m_vertices.begin(); iter != m_vertices.end(); ++iter)\n    {\n        EdgePtrVec edges = iter->second->getEdges();\n        for(EdgePtrVecIter edgeIter = edges.begin(); edgeIter != edges.end(); ++edgeIter)\n        {\n            // We write one record for every bidirectional edge so only write edges\n            // that are in canonical form (where id1 < id2)\n            Overlap ovr = (*edgeIter)->getOverlap();\n            if(ovr.id[0] <= ovr.id[1])\n            {\n                // Containment edges are in both directions so only output one\n                // record if it is a containment\n                if(!ovr.isContainment() || ((*edgeIter)->getDir() == ED_SENSE))\n                {\n                    ASQG::EdgeRecord edgeRecord(ovr);\n                    edgeRecord.write(*pWriter);\n                }\n            }\n        }\n    }\n    delete pWriter;\n}\n\n//\nstd::string Bigraph::getColorString(GraphColor c)\n{\n    switch(c)\n    {\n        case GC_WHITE:\n            return \"white\";\n        case GC_GRAY:\n            return \"gray\";\n        case GC_BLACK:\n            return \"black\";\n        case GC_BLUE:\n            return \"blue\";\n        case GC_RED:\n            return \"red\";\n        default:\n            return \"black\";\n    }\n}\n"
  },
  {
    "path": "src/SGA/Bigraph/Bigraph.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// Bidirectional graph \n//\n#ifndef BIGRAPH_H\n#define BIGRAPH_H\n\n#include <string>\n#include <stdio.h>\n#include <vector>\n#include <map>\n#include \"GraphCommon.h\"\n#include \"Vertex.h\"\n#include \"Edge.h\"\n#include \"HashMap.h\"\n\n#include <unordered_map>\n\n//\n// Typedefs\n//\n//typedef std::map<VertexID, Vertex*> VertexPtrMap;\n//typedef __gnu_cxx::hash_map<VertexID, Vertex*> VertexPtrMap;\n//typedef std::tr1::unordered_map<VertexID, Vertex*> VertexPtrMap; // JEREMIAH commented to switch to normal unordered\ntypedef std::unordered_map<VertexID, Vertex*> VertexPtrMap;\n//typedef SparseHashMap<VertexID, Vertex*, StringHasher> VertexPtrMap;// JEREMIAH\n\ntypedef VertexPtrMap::iterator VertexPtrMapIter;\ntypedef VertexPtrMap::const_iterator VertexPtrMapConstIter;\n\nclass Bigraph;\ntypedef bool(*VertexVisitFunction)(Bigraph*, Vertex*);\n\ntypedef EdgePtrVec Path; // alias\ntypedef std::vector<Path> PathVector;\ntypedef std::vector<VertexID> VertexIDVec;\ntypedef std::vector<Vertex*> VertexPtrVec;\n\nclass Bigraph\n{\n\n    public:\n    \n        Bigraph();\n        ~Bigraph();\n\n        // Add a vertex\n        void addVertex(Vertex* pVert);\n        \n        // Remove a vertex\n        // removeIslandVertex removes a vertex that is guarenteed to not have edges\n        // removeConnectedVertex removes a (possibly) connected vertex and all the edges to/from it\n        void removeIslandVertex(Vertex* pVertex);\n        void removeIslandVertexNoErase(Vertex* pVertex);\n        void removeConnectedVertex(Vertex* pVertex);\n\n        // Check if a vertex exists\n        bool hasVertex(VertexID id);\n\n        // Get a vertex\n        Vertex* getVertex(VertexID id) const;\n\n        // Add an edge\n        void addEdge(Vertex* pVertex, Edge* pEdge);\n\n        // Remove an edge\n        void removeEdge(const EdgeDesc& ed);\n\n        // Remove all edges marked by color c\n        int sweepVertices(GraphColor c);\n        int sweepEdges(GraphColor c);\n\n        // Merge vertices\n        void mergeVertices(VertexID id1, VertexID id2);\n\n        // Merge vertices that are joined by the specified edge\n        void merge(Vertex* pV1, Edge* pEdge);\n\n        // Rename all the vertices in the graph\n        void renameVertices(const std::string& prefix = \"\");\n\n        // Simplify the graph by removing transitive edges\n        void simplify();\n\n        // Validate that the graph is sane\n        void validate();\n\n        // Flip a given vertex\n        void flip(VertexID id);\n\n        // Sort all the vertex adjacency lists\n        void sortVertexAdjListsByLen();\n        void sortVertexAdjListsByID();\n\n        // Get the IDs of the vertices that do not branch (both sense/antisense degree <= 1)\n        VertexIDVec getNonBranchingVertices() const;\n\n        // Get the linear components of a non-branching graph\n        PathVector getLinearComponents();\n\n        // Return all the path of nodes that can be linearally reached from this node\n        // The path expands in both directions so the first node in the path is not necessarily the source\n        Path constructLinearPath(VertexID id);\n\n        // Reverse a path\n        static Path reversePath(const Path& path);\n\n        // Returns an iterator to the first vertex in the graph.\n        // If the graph is empty, a null pointer is returned\n        Vertex* getFirstVertex() const;\n\n        // Print simple summary statistics to stdout\n        void stats() const;\n        void printMemSize() const;\n\n        size_t getNumVertices() const;\n\n        // Visit each vertex in the graph and perform the visit function\n        bool visit(VertexVisitFunction f);\n        bool visit(VertexVisitFunction f, std::stringstream &stream);\n\n        //\n        VertexPtrVec getAllVertices() const;\n        VertexPtrVec getAllKeepVertices() const;\n\n        // Append each vertex sequence to the vector of strings\n        void getVertexSequences(std::vector<std::string>& outSequences) const;\n\n        // Visit each vertex in the graph and call the visit functor object\n        template<typename VF>\n        bool visit(VF& vf)\n        {\n            bool modified = false;\n            vf.previsit(this);\n            VertexPtrMapConstIter iter = m_vertices.begin(); \n            for(; iter != m_vertices.end(); ++iter)\n            {\n                modified = vf.visit(this, iter->second) || modified;\n            }\n            vf.postvisit(this);\n            return modified;\n        }\n        \n        // Set the colors for the entire graph\n        void setColors(GraphColor c);\n\n        // Check the colors for the entire graph\n        bool checkColors(GraphColor c);\n\n        // Get/Set the containment flag\n        void setContainmentFlag(bool b);\n        bool hasContainment() const;\n\n        //\n        void setTransitiveFlag(bool b);\n        bool hasTransitive() const;\n\n        //\n        void setMinOverlap(int mo);\n        int getMinOverlap() const;\n\n        //\n        void setErrorRate(double er);\n        double getErrorRate() const;\n\n        void setExactMode(bool b);\n        bool isExactMode() const;\n\n        // Write the graph to a file\n        void writeDot(const std::string& filename, int dotFlags = 0) const;\n        void writeASQG(const std::string& filename) const;\n\n        // Returns an allocator for the edges of the graph\n        SimpleAllocator<Edge>* getEdgeAllocator() { return m_pEdgeAllocator; }\n\n        // Returns an allocator for the vertices of the graph\n        SimpleAllocator<Vertex>* getVertexAllocator() { return m_pVertexAllocator; }\n\n        // Return a string for a color code\n        static std::string getColorString(GraphColor c);\n\n        // return the vertex map JEREMIAH\n        //VertexPtrMap getVertexMap() { return m_vertices; }\n\n\t//JEREMIAH\n\tbool m_get_components = false;\n\tstd::unordered_map<std::string, int> m_connected_components;\n\tint m_label = 0;\n\tstd::unordered_map<std::string, std::vector<std::string>> m_reads_on_contigs;\n\n    private:\n        \n        // Simplify the graph by compacting edges in the given direction\n        void simplify(EdgeDir dir);\n\n        void followLinear(VertexID id, EdgeDir dir, Path& outPath);\n\n        //\n        // data\n        //\n        VertexPtrMap m_vertices;\n        //VertexPtrMap m_vertices_tokeep; //JEREMIAH\n\n        // Graph parameters\n        bool m_hasContainment;\n        bool m_hasTransitive;\n        bool m_isExactMode;\n\n        int m_minOverlap;\n        double m_errorRate;\n\n        // Memory management\n\tSimpleAllocator<Vertex>* m_pVertexAllocator;\n        SimpleAllocator<Edge>* m_pEdgeAllocator;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Bigraph/Edge.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Base bidirectional edge class \n//\n#include \"Edge.h\"\n#include \"Vertex.h\"\n\n// \nEdgeDesc Edge::getTwinDesc() const\n{\n    return EdgeDesc(getStart(), getTwinDir(), getComp());\n}\n\n// Get the edge's label\nstd::string Edge::getLabel() const\n{\n    const Edge* pTwin = getTwin();\n    const Vertex* pEndpoint = m_pEnd;\n    \n    // get the unmatched coordinates in V2\n    SeqCoord unmatched = pTwin->getMatchCoord().complement();\n    std::string seq = unmatched.getSubstring(pEndpoint->getStr());\n\n    if(getComp() == EC_REVERSE)\n        seq = reverseComplement(seq);\n\n    return seq;\n}\n\n\n// Join the edge pEdge into this edge, adding to the start\nvoid Edge::join(const Edge* pEdge)\n{\n    // Update the match coordinate\n    Match m12 = pEdge->getMatch();\n    Match m23 = getMatch();\n    m_matchCoord = m12.inverseTranslate(m23.coord[0]);\n\n    if(pEdge->getComp() == EC_REVERSE)\n        flip();\n\n    // Now, update the twin of this edge to extend to the twin of pEdge\n    m_pTwin->extend(pEdge->getTwin());\n}\n\n// Extend this edge by adding pEdge to the end\nvoid Edge::extend(const Edge* pEdge)\n{\n    if(pEdge->getComp() == EC_REVERSE)\n        flipComp();\n    m_pEnd = pEdge->getEnd();\n}\n\n// return the mapping from V1 to V2 via this edge\n// If necessary, flip the SC of V2 so that it is\n// in the same coordinate system as V1\nMatch Edge::getMatch() const\n{\n    const SeqCoord& sc = getMatchCoord();\n    const SeqCoord& tsc = m_pTwin->getMatchCoord();\n    return Match(sc, tsc, getComp() == EC_REVERSE, -1);\n}\n\n// The overlap structure implied by this edge\nOverlap Edge::getOverlap() const\n{\n    return Overlap(getStartID(), getEndID(), getMatch());\n}\n\n// Get the matching portion of V1 described by this edge\nstd::string Edge::getMatchStr() const\n{\n    return m_matchCoord.getSubstring(getStart()->getStr());\n}\n\n// Return the length of the sequence\nsize_t Edge::getSeqLen() const\n{\n    SeqCoord unmatched = m_pTwin->getMatchCoord().complement();\n    return unmatched.length();\n}\n\nvoid Edge::offsetMatch(int offset)\n{\n    m_matchCoord.interval.start += offset;\n    m_matchCoord.interval.end += offset;\n}\n\nvoid Edge::extendMatch(int ext_len)\n{\n    m_matchCoord.interval.end += ext_len;\n}\n\n// Bump the edges of the match outwards so it covers the entire \n// sequence\nvoid Edge::extendMatchFullLength()\n{\n    if(m_matchCoord.isLeftExtreme())\n        m_matchCoord.interval.end = m_matchCoord.seqlen - 1;\n    else\n        m_matchCoord.interval.start = 0;\n}\n\nvoid Edge::updateSeqLen(int newLen)\n{\n    m_matchCoord.seqlen = newLen;\n}\n\n// Validate that the edge members are sane\nvoid Edge::validate() const\n{\n    const Edge* pTwin = getTwin();\n    std::string m_v1 = getMatchStr();\n    std::string m_v2 = pTwin->getMatchStr();\n\n    if(getComp() == EC_REVERSE)\n        m_v2 = reverseComplement(m_v2);\n\n    bool error = false;\n    if(m_v1.length() != m_v2.length())\n    {\n        std::cerr << \"Error, matching strings are not the same length\\n\";\n        error = true;\n    }\n\n    if(error)\n    {\n        std::cerr << \"V1M: \" << m_v1 << \"\\n\";\n        std::cerr << \"V2M: \" << m_v2 << \"\\n\";\n        std::cerr << \"V1MC: \" << getMatchCoord() << \"\\n\";\n        std::cerr << \"V2MC: \" << pTwin->getMatchCoord() << \"\\n\";\n        std::cerr << \"V1: \" << getStart()->getSeq() << \"\\n\";\n        std::cerr << \"Validation failed for edge \" << *this << \"\\n\";\n        assert(false);\n    }\n}\n\n// Output\nstd::ostream& operator<<(std::ostream& out, const Edge& obj)\n{\n    out << obj.m_pEnd->getID() << \",\" << obj.getDir() << \",\" << obj.getComp();\n    return out;\n}\n\n"
  },
  {
    "path": "src/SGA/Bigraph/Edge.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// Base bidirectional edge class \n//\n\n#ifndef EDGE_H\n#define EDGE_H\n\n#include <ostream>\n#include \"Match.h\"\n#include \"Util.h\"\n#include \"GraphCommon.h\"\n#include \"EdgeDesc.h\"\n#include \"Vertex.h\"\n#include \"BitChar.h\"\n#include \"SimpleAllocator.h\"\n\n// Packed structure holding the direction and comp of an edge\n// The EdgeDir/EdgeComp enums (which only have values 0/1) are used \n// as the interface for this class so the set flags are cast to/from\n// these types.\nstruct EdgeData\n{\n    public:\n        EdgeData() {}\n\n        // Setters \n        void setDir(EdgeDir dir)\n        {\n            if(dir == ED_ANTISENSE)\n                m_data.set(DIR_BIT, true);\n            else\n                m_data.set(DIR_BIT, false);\n        }\n\n        void setComp(EdgeComp comp)\n        {\n            if(comp == EC_REVERSE)\n                m_data.set(COMP_BIT, true);\n            else\n                m_data.set(COMP_BIT, false);\n        }\n\n        void flipDir() { m_data.flip(DIR_BIT); }\n        void flipComp() { m_data.flip(COMP_BIT); }\n\n        // Getters\n        inline EdgeDir getDir() const\n        {\n            return m_data.test(DIR_BIT) ? ED_ANTISENSE : ED_SENSE;\n        }\n\n        inline EdgeComp getComp() const\n        {\n            return m_data.test(COMP_BIT) ? EC_REVERSE : EC_SAME;\n        }\n\n    private:\n        static const size_t DIR_BIT = 0;\n        static const size_t COMP_BIT = 1;\n        BitChar m_data;\n};\n\nclass Edge\n{\n    public:\n        Edge(Vertex* end, EdgeDir dir, EdgeComp comp, SeqCoord m) : \n                 m_pEnd(end), m_pTwin(NULL), m_matchCoord(m), m_color(GC_WHITE), isTrusted(false)\n        {\n            m_edgeData.setDir(dir);\n            m_edgeData.setComp(comp);\n        }\n\n        ~Edge() { }\n        \n        // High level modification functions\n        \n        // Join merges pEdge into this edge, with pEdge describing the starting point\n        void join(const Edge* pEdge);\n\n        // Extend merged pEdge into this edge, with pEdge describing the endpoint\n        void extend(const Edge* pEdge);\n\n        // Post merge update function\n        void update() {}\n\n        // Sequence Coordinate functions\n        \n        // update functions\n        void extendMatchFullLength();\n        void extendMatch(int ext_len);\n        void offsetMatch(int offset);\n        void updateSeqLen(int newLen);\n\n        // access functions\n        size_t getSeqLen() const;\n        size_t getMatchLength() const { return m_matchCoord.length(); }\n        const SeqCoord& getMatchCoord() const { return m_matchCoord; }\n        std::string getMatchStr() const;\n        Match getMatch() const;\n        Overlap getOverlap() const;\n        \n        // setters\n        void setTwin(Edge* pEdge) { m_pTwin = pEdge; }\n        void setColor(GraphColor c) { m_color = c; }\n\n        // getters\n        VertexID getStartID() const { return getStart()->getID(); }\n        VertexID getEndID() const { return m_pEnd->getID(); }\n        inline Vertex* getStart() const { assert(m_pTwin != NULL); return m_pTwin->getEnd(); }\n        inline Vertex* getEnd() const { return m_pEnd; }\n        inline EdgeDir getDir() const { return m_edgeData.getDir(); }\n        inline EdgeComp getComp() const { return m_edgeData.getComp(); }        \n        inline Edge* getTwin() const { assert(m_pTwin != NULL); return m_pTwin; }\n        EdgeDesc getTwinDesc() const;\n        std::string getLabel() const;\n        bool isSelf() const { return getStart() == getEnd(); }\n        inline GraphColor getColor() const { return m_color; }\n        size_t getMemSize() const { return sizeof(*this); }\n\n        // Returns the direction of an edge that continues in the same direction\n        // as this edge, corrected for complementary \n        inline EdgeDir getTransitiveDir() const { return (getComp() == EC_SAME) ? getDir() : !getDir(); }\n\n        // Make the direction of the edge that its twin should point along \n        inline EdgeDir getTwinDir() const { return (getComp() == EC_SAME) ? !getDir() : getDir(); }\n        inline EdgeDesc getDesc() const { return EdgeDesc(getEnd(), getDir(), getComp()); }\n        \n        // Flip the edge\n        inline void flipComp() { m_edgeData.flipComp(); }\n        inline void flipDir() { m_edgeData.flipDir(); }\n        void flip() { flipComp(); flipDir(); }\n\n        // Memory management\n        //void* operator new(size_t /*size*/, SimpleAllocator<Edge>* pAllocator)\n        //{\n        //    return pAllocator->alloc();\n        //}\n\n        //void operator delete(void* /*target*/, size_t /*size*/)\n        //{\n            // Deletions are handled at the graph/pool level. The lifetime of an edge\n            // is as long as the graph it belongs to, even if it is deleted before\n            // the graph.\n        //}\n\n        // Validate that the edge is sane\n        void validate() const;\n\n        // Output\n        friend std::ostream& operator<<(std::ostream& out, const Edge& obj);\n\n    protected:\n        \n        // Global new is not allowed, allocation must go through the memory pool\n        // belonging to the graph.\n        //void* operator new(size_t size) { return malloc(size); } \n        \n        Edge() {}; // Default constructor is not allowed\n\n        Vertex* m_pEnd;\n        Edge* m_pTwin;\n        SeqCoord m_matchCoord;\n        GraphColor m_color;\n        EdgeData m_edgeData; // dir/comp member\n\n    public:\n        bool isTrusted;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Bigraph/EdgeDesc.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// EdgeDesc - A unique description of an edge \n//\n#include \"EdgeDesc.h\"\n#include \"Vertex.h\"\n\n// Operators\nbool EdgeDesc::operator<(const EdgeDesc& obj) const\n{\n    assert(pVertex != NULL && obj.pVertex != NULL);\n    if(pVertex->getID() < obj.pVertex->getID())\n        return true;\n    else if(pVertex->getID() > obj.pVertex->getID())\n        return false;\n    else if(dir < obj.dir)\n        return true;\n    else if(dir > obj.dir)\n        return false;\n    else if(comp < obj.comp)\n        return true;\n    else if(comp > obj.comp)\n        return false;\n    return false;\n}\n\nbool EdgeDesc::operator==(const EdgeDesc& obj) const\n{\n    assert(pVertex != NULL && obj.pVertex != NULL);\n    return pVertex->getID() == obj.pVertex->getID() && dir == obj.dir && comp == obj.comp;\n}\n\nstd::ostream& operator<<(std::ostream& out, const EdgeDesc& ed)\n{\n    assert(ed.pVertex != NULL);\n    out << ed.pVertex->getID() << \",\" << ed.dir << \",\" << ed.comp;\n    return out;\n}\n\n"
  },
  {
    "path": "src/SGA/Bigraph/EdgeDesc.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// EdgeDesc - A unique description of an edge \n//\n#ifndef EDGEDESC_H\n#define EDGEDESC_H\n\n#include \"GraphCommon.h\"\n\nclass Vertex;\n\nstruct EdgeDesc\n{\n    EdgeDesc() : pVertex(NULL) {}\n    EdgeDesc(Vertex* pV, EdgeDir d, EdgeComp c) : pVertex(pV), dir(d), comp(c) {}\n    Vertex* pVertex;\n    EdgeDir dir;\n    EdgeComp comp;\n\n    //\n    inline EdgeDir getTransitiveDir() const { return (comp == EC_SAME) ? dir : !dir; }\n    inline EdgeDir getTwinDir() const { return (comp == EC_SAME) ? !dir : dir; }\n\n    // Operators\n    bool operator<(const EdgeDesc& obj) const;\n    bool operator==(const EdgeDesc& obj) const;\n    friend std::ostream& operator<<(std::ostream& out, const EdgeDesc& ed);\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Bigraph/GraphCommon.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// GraphCommon - Definitions and functions common\n// to the grpah implementation\n//\n#ifndef GRAPHCOMMON_H\n#define GRAPHCOMMON_H\n\n#include <vector>\n#include \"Util.h\"\n\n// The directions an edge can take.\n// Do not change the values\nenum EdgeDir\n{\n        ED_SENSE = 0,\n        ED_ANTISENSE = 1,\n        ED_COUNT = 2\n};\n\n// Flag indicating whether the sequences linked by an edge\n// are from the same strand or not.\n// Do not change the values\nenum EdgeComp\n{\n        EC_SAME = 0,\n        EC_REVERSE = 1\n};\n\n// Array holding the directions, for iteration\nconst EdgeDir EDGE_DIRECTIONS[ED_COUNT] = { ED_SENSE, ED_ANTISENSE };\n\n// Flags specifying how the dot file should be drawn\nenum DotFlags\n{\n    DF_UNDIRECTED = 0x01,\n    DF_ANNOTATIONS = 0x02,\n    DF_COLORED = 0x04,\n    DF_NOID = 0x08\n};\n\n// GraphColors are generic flags that can be used to indicate state\ntypedef uint8_t GraphColor;\n\nconst GraphColor GC_WHITE = 0;\nconst GraphColor GC_GRAY = 1;\nconst GraphColor GC_BLACK = 2;\nconst GraphColor GC_BLUE = 3;\nconst GraphColor GC_RED = 4;\n\n// Typedefs\ntypedef std::string VertexID;\ntypedef std::vector<VertexID> VertexIDVec;\n\n//\n// Edge Operations\n//\ninline EdgeDir operator!(const EdgeDir& dir)\n{\n        return (dir == ED_SENSE) ? ED_ANTISENSE : ED_SENSE;\n}\n\ninline EdgeComp operator!(const EdgeComp& comp)\n{\n        return (comp == EC_SAME) ? EC_REVERSE : EC_SAME;\n}\n\n// Correct an edges direction, given the relationship between the nodes\ninline EdgeDir correctDir(EdgeDir dir, EdgeComp comp)\n{\n    return (comp == EC_SAME) ? dir : !dir;\n}\n\n\n#endif \n"
  },
  {
    "path": "src/SGA/Bigraph/Makefile.am",
    "content": "noinst_LIBRARIES = libbigraph.a\n\nlibbigraph_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/Thirdparty \\\n\t-I$(top_srcdir)/src/SGA/SQG\n\nlibbigraph_a_SOURCES = \\\n                       Bigraph.h Bigraph.cpp \\\n                       Vertex.h Vertex.cpp  \\\n                       Edge.h Edge.cpp \\\n                       EdgeDesc.h EdgeDesc.cpp \\\n                       GraphCommon.h\n"
  },
  {
    "path": "src/SGA/Bigraph/Makefile.in",
    "content": "# Makefile.in generated by automake 1.16.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2018 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nsubdir = src/SGA/Bigraph\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLIBRARIES = $(noinst_LIBRARIES)\nAR = ar\nARFLAGS = cru\nAM_V_AR = $(am__v_AR_@AM_V@)\nam__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)\nam__v_AR_0 = @echo \"  AR      \" $@;\nam__v_AR_1 = \nlibbigraph_a_AR = $(AR) $(ARFLAGS)\nlibbigraph_a_LIBADD =\nam_libbigraph_a_OBJECTS = libbigraph_a-Bigraph.$(OBJEXT) \\\n\tlibbigraph_a-Vertex.$(OBJEXT) libbigraph_a-Edge.$(OBJEXT) \\\n\tlibbigraph_a-EdgeDesc.$(OBJEXT)\nlibbigraph_a_OBJECTS = $(am_libbigraph_a_OBJECTS)\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__maybe_remake_depfiles = depfiles\nam__depfiles_remade = ./$(DEPDIR)/libbigraph_a-Bigraph.Po \\\n\t./$(DEPDIR)/libbigraph_a-Edge.Po \\\n\t./$(DEPDIR)/libbigraph_a-EdgeDesc.Po \\\n\t./$(DEPDIR)/libbigraph_a-Vertex.Po\nam__mv = mv -f\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nAM_V_CXX = $(am__v_CXX_@AM_V@)\nam__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)\nam__v_CXX_0 = @echo \"  CXX     \" $@;\nam__v_CXX_1 = \nCXXLD = $(CXX)\nCXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \\\n\t-o $@\nAM_V_CXXLD = $(am__v_CXXLD_@AM_V@)\nam__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)\nam__v_CXXLD_0 = @echo \"  CXXLD   \" $@;\nam__v_CXXLD_1 = \nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libbigraph_a_SOURCES)\nDIST_SOURCES = $(libbigraph_a_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_CXXFLAGS = @AM_CXXFLAGS@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nOBJEXT = @OBJEXT@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild_alias = @build_alias@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost_alias = @host_alias@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nnoinst_LIBRARIES = libbigraph.a\nlibbigraph_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/Thirdparty \\\n\t-I$(top_srcdir)/src/SGA/SQG\n\nlibbigraph_a_SOURCES = \\\n                       Bigraph.h Bigraph.cpp \\\n                       Vertex.h Vertex.cpp  \\\n                       Edge.h Edge.cpp \\\n                       EdgeDesc.h EdgeDesc.cpp \\\n                       GraphCommon.h\n\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .cpp .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/SGA/Bigraph/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/SGA/Bigraph/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLIBRARIES:\n\t-test -z \"$(noinst_LIBRARIES)\" || rm -f $(noinst_LIBRARIES)\n\nlibbigraph.a: $(libbigraph_a_OBJECTS) $(libbigraph_a_DEPENDENCIES) $(EXTRA_libbigraph_a_DEPENDENCIES) \n\t$(AM_V_at)-rm -f libbigraph.a\n\t$(AM_V_AR)$(libbigraph_a_AR) libbigraph.a $(libbigraph_a_OBJECTS) $(libbigraph_a_LIBADD)\n\t$(AM_V_at)$(RANLIB) libbigraph.a\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbigraph_a-Bigraph.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbigraph_a-Edge.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbigraph_a-EdgeDesc.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbigraph_a-Vertex.Po@am__quote@ # am--include-marker\n\n$(am__depfiles_remade):\n\t@$(MKDIR_P) $(@D)\n\t@echo '# dummy' >$@-t && $(am__mv) $@-t $@\n\nam--depfiles: $(am__depfiles_remade)\n\n.cpp.o:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<\n\n.cpp.obj:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\nlibbigraph_a-Bigraph.o: Bigraph.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libbigraph_a-Bigraph.o -MD -MP -MF $(DEPDIR)/libbigraph_a-Bigraph.Tpo -c -o libbigraph_a-Bigraph.o `test -f 'Bigraph.cpp' || echo '$(srcdir)/'`Bigraph.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libbigraph_a-Bigraph.Tpo $(DEPDIR)/libbigraph_a-Bigraph.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Bigraph.cpp' object='libbigraph_a-Bigraph.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libbigraph_a-Bigraph.o `test -f 'Bigraph.cpp' || echo '$(srcdir)/'`Bigraph.cpp\n\nlibbigraph_a-Bigraph.obj: Bigraph.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libbigraph_a-Bigraph.obj -MD -MP -MF $(DEPDIR)/libbigraph_a-Bigraph.Tpo -c -o libbigraph_a-Bigraph.obj `if test -f 'Bigraph.cpp'; then $(CYGPATH_W) 'Bigraph.cpp'; else $(CYGPATH_W) '$(srcdir)/Bigraph.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libbigraph_a-Bigraph.Tpo $(DEPDIR)/libbigraph_a-Bigraph.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Bigraph.cpp' object='libbigraph_a-Bigraph.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libbigraph_a-Bigraph.obj `if test -f 'Bigraph.cpp'; then $(CYGPATH_W) 'Bigraph.cpp'; else $(CYGPATH_W) '$(srcdir)/Bigraph.cpp'; fi`\n\nlibbigraph_a-Vertex.o: Vertex.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libbigraph_a-Vertex.o -MD -MP -MF $(DEPDIR)/libbigraph_a-Vertex.Tpo -c -o libbigraph_a-Vertex.o `test -f 'Vertex.cpp' || echo '$(srcdir)/'`Vertex.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libbigraph_a-Vertex.Tpo $(DEPDIR)/libbigraph_a-Vertex.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Vertex.cpp' object='libbigraph_a-Vertex.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libbigraph_a-Vertex.o `test -f 'Vertex.cpp' || echo '$(srcdir)/'`Vertex.cpp\n\nlibbigraph_a-Vertex.obj: Vertex.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libbigraph_a-Vertex.obj -MD -MP -MF $(DEPDIR)/libbigraph_a-Vertex.Tpo -c -o libbigraph_a-Vertex.obj `if test -f 'Vertex.cpp'; then $(CYGPATH_W) 'Vertex.cpp'; else $(CYGPATH_W) '$(srcdir)/Vertex.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libbigraph_a-Vertex.Tpo $(DEPDIR)/libbigraph_a-Vertex.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Vertex.cpp' object='libbigraph_a-Vertex.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libbigraph_a-Vertex.obj `if test -f 'Vertex.cpp'; then $(CYGPATH_W) 'Vertex.cpp'; else $(CYGPATH_W) '$(srcdir)/Vertex.cpp'; fi`\n\nlibbigraph_a-Edge.o: Edge.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libbigraph_a-Edge.o -MD -MP -MF $(DEPDIR)/libbigraph_a-Edge.Tpo -c -o libbigraph_a-Edge.o `test -f 'Edge.cpp' || echo '$(srcdir)/'`Edge.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libbigraph_a-Edge.Tpo $(DEPDIR)/libbigraph_a-Edge.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Edge.cpp' object='libbigraph_a-Edge.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libbigraph_a-Edge.o `test -f 'Edge.cpp' || echo '$(srcdir)/'`Edge.cpp\n\nlibbigraph_a-Edge.obj: Edge.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libbigraph_a-Edge.obj -MD -MP -MF $(DEPDIR)/libbigraph_a-Edge.Tpo -c -o libbigraph_a-Edge.obj `if test -f 'Edge.cpp'; then $(CYGPATH_W) 'Edge.cpp'; else $(CYGPATH_W) '$(srcdir)/Edge.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libbigraph_a-Edge.Tpo $(DEPDIR)/libbigraph_a-Edge.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Edge.cpp' object='libbigraph_a-Edge.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libbigraph_a-Edge.obj `if test -f 'Edge.cpp'; then $(CYGPATH_W) 'Edge.cpp'; else $(CYGPATH_W) '$(srcdir)/Edge.cpp'; fi`\n\nlibbigraph_a-EdgeDesc.o: EdgeDesc.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libbigraph_a-EdgeDesc.o -MD -MP -MF $(DEPDIR)/libbigraph_a-EdgeDesc.Tpo -c -o libbigraph_a-EdgeDesc.o `test -f 'EdgeDesc.cpp' || echo '$(srcdir)/'`EdgeDesc.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libbigraph_a-EdgeDesc.Tpo $(DEPDIR)/libbigraph_a-EdgeDesc.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='EdgeDesc.cpp' object='libbigraph_a-EdgeDesc.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libbigraph_a-EdgeDesc.o `test -f 'EdgeDesc.cpp' || echo '$(srcdir)/'`EdgeDesc.cpp\n\nlibbigraph_a-EdgeDesc.obj: EdgeDesc.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libbigraph_a-EdgeDesc.obj -MD -MP -MF $(DEPDIR)/libbigraph_a-EdgeDesc.Tpo -c -o libbigraph_a-EdgeDesc.obj `if test -f 'EdgeDesc.cpp'; then $(CYGPATH_W) 'EdgeDesc.cpp'; else $(CYGPATH_W) '$(srcdir)/EdgeDesc.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libbigraph_a-EdgeDesc.Tpo $(DEPDIR)/libbigraph_a-EdgeDesc.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='EdgeDesc.cpp' object='libbigraph_a-EdgeDesc.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbigraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libbigraph_a-EdgeDesc.obj `if test -f 'EdgeDesc.cpp'; then $(CYGPATH_W) 'EdgeDesc.cpp'; else $(CYGPATH_W) '$(srcdir)/EdgeDesc.cpp'; fi`\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(BUILT_SOURCES)\n\t$(MAKE) $(AM_MAKEFLAGS) distdir-am\n\ndistdir-am: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LIBRARIES)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am\n\ndistclean: distclean-am\n\t\t-rm -f ./$(DEPDIR)/libbigraph_a-Bigraph.Po\n\t-rm -f ./$(DEPDIR)/libbigraph_a-Edge.Po\n\t-rm -f ./$(DEPDIR)/libbigraph_a-EdgeDesc.Po\n\t-rm -f ./$(DEPDIR)/libbigraph_a-Vertex.Po\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t\t-rm -f ./$(DEPDIR)/libbigraph_a-Bigraph.Po\n\t-rm -f ./$(DEPDIR)/libbigraph_a-Edge.Po\n\t-rm -f ./$(DEPDIR)/libbigraph_a-EdgeDesc.Po\n\t-rm -f ./$(DEPDIR)/libbigraph_a-Vertex.Po\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \\\n\tclean-generic clean-noinstLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/SGA/Bigraph/Vertex.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Vertex - Generic vertex class for bigraph\n//\n#include \"Vertex.h\"\n#include \"Edge.h\"\n#include <algorithm>\n\nVertex::~Vertex()\n{\n    EdgePtrVecIter iter = m_edges.begin();\n    for(; iter != m_edges.end(); ++iter)\n    {\n        delete *iter;\n        *iter = NULL;\n    }\n}\n\n// Merging two string vertices has two parts\n// First, the sequence of the vertex is extended\n// by the the content of the edge label\n// Then, all the edges that are pointing to this node\n// must be updated to contain the extension of the vertex\nvoid Vertex::merge(Edge* pEdge)\n{\n    Edge* pTwin = pEdge->getTwin();\n    //std::cout << \"Adding label to \" << getID() << \" str: \" << pSE->getLabel() << \"\\n\";\n\n    // Merge the sequence\n    DNAEncodedString label = pEdge->getLabel();\n    size_t label_len = label.length();\n    pEdge->updateSeqLen(m_seq.length() + label_len);\n    bool prepend = false;\n\n    if(pEdge->getDir() == ED_SENSE)\n    {\n        m_seq.append(label);\n    }\n    else\n    {\n        label.append(m_seq);\n        std::swap(m_seq, label);\n        prepend = true;\n    }\n\n    // Update the coverage value of the vertex\n    m_coverage += pEdge->getEnd()->getCoverage();\n\n    pEdge->extendMatch(label_len);\n    pTwin->extendMatchFullLength();\n\n    // All the SeqCoords for the edges must have their seqlen field updated\n    // Also, if we prepended sequence to this edge, all the matches in the \n    // SENSE direction must have their coordinates offset\n    size_t newLen = m_seq.length();\n    for(EdgePtrVecIter iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n    {\n        Edge* pUpdateEdge = *iter;\n        pUpdateEdge->updateSeqLen(newLen);\n        if(prepend && pUpdateEdge->getDir() == ED_SENSE && pEdge != pUpdateEdge)\n            pUpdateEdge->offsetMatch(label_len);\n    }\n\n#ifdef VALIDATE\n    VALIDATION_WARNING(\"Vertex::merge\")\n    validate();\n#endif\n\n}\n\nvoid Vertex::validate() const\n{\n    for(EdgePtrVecConstIter iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n    {\n        (*iter)->validate();\n        /*\n        std::string label = pSE->getLabel();\n        StringVertex* pEnd = SV_CAST(pSE->getEnd());\n\n        std::string vertSeq = pEnd->getSeq();\n        EdgeDir suffixDir = (pSE->getComp() == EC_SAME) ? pSE->getDir() : !pSE->getDir();\n        std::string vertSuffix = (suffixDir == ED_SENSE) ? vertSeq.substr(vertSeq.length() - label.length()) :\n                                                                vertSeq.substr(0, label.length());\n\n        if(pSE->getComp() == EC_REVERSE)\n            vertSuffix = reverseComplement(vertSuffix);\n        if(vertSuffix != label)\n        {\n            std::cerr << \"Warning edge label \" << label << \" does not match vertex suffix \" << vertSuffix << \"\\n\";\n        }\n        */\n    }\n}\n\n//\nvoid Vertex::sortAdjListByID()\n{\n    EdgeIDComp comp;\n    std::sort(m_edges.begin(), m_edges.end(), comp);\n}\n\nvoid Vertex::sortAdjListByLen()\n{\n    EdgeLenComp comp;\n    std::sort(m_edges.begin(), m_edges.end(), comp);\n}\n\n// Mark duplicate edges with dupColor\n// Returns true if a duplicate has been marked\nbool Vertex::markDuplicateEdges(GraphColor dupColor)\n{\n    // Sort the edge lists by length\n    sortAdjListByLen();\n    bool hasDup = false;\n    hasDup = markDuplicateEdges(ED_SENSE, dupColor) || hasDup;\n    hasDup = markDuplicateEdges(ED_ANTISENSE, dupColor) || hasDup;\n    return hasDup;\n}\n\n// Mark duplicate edges in the specified direction\nbool Vertex::markDuplicateEdges(EdgeDir dir, GraphColor dupColor)\n{\n    for(EdgePtrVecIter iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n    {\n        Edge* pEdge = *iter;\n        if(pEdge->getDir() == dir)\n        {\n            Vertex* pY = pEdge->getEnd();\n            if(pY->getColor() == GC_BLACK)\n            {\n                //std::cerr << getID() << \" has a duplicate edge to \" << pEdge->getEndID() << \" in direction \" << dir << \"\\n\";\n\n                // This vertex is the endpoint of some other (potentially longer) edge\n                // Delete the edge\n                Edge* pTwin = pEdge->getTwin();\n                pTwin->setColor(dupColor);\n                pEdge->setColor(dupColor);\n            }\n            else\n            {\n                assert(pY->getColor() == GC_WHITE);\n                pY->setColor(GC_BLACK);\n            }\n        }\n    }\n\n    // Reset vertex colors\n    for(EdgePtrVecIter iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n        (*iter)->getEnd()->setColor(GC_WHITE);\n    return true;\n}\n\n// Get a multioverlap object representing the overlaps for this vertex\nMultiOverlap Vertex::getMultiOverlap() const\n{\n    MultiOverlap mo(getID(), getSeq().toString());\n    for(size_t i = 0; i < m_edges.size(); ++i)\n    {\n        Edge* pEdge = m_edges[i];\n        mo.add(pEdge->getEnd()->getSeq().toString(), pEdge->getOverlap());\n    }\n    return mo;\n}\n\n// Add an edge\nvoid Vertex::addEdge(Edge* ep)\n{\n    assert(ep->getStart() == this);\n\n#ifdef VALIDATE\n    for(EdgePtrVecConstIter iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n    {\n        if((*iter)->getEndID() == ep->getEndID())\n        {\n            std::cout << \"Attempted to add duplicate edge with ID: \" << ep->getEndID() \n                        << \" to vertex: \" << ep->getStartID() << \"\\n\";\n            std::cout << \"Added in desc: \" << ep->getDesc() << \" curr desc: \" << (*iter)->getDesc() << \"\\n\";\n            //assert(false);\n        }\n    }\n#endif\n    m_edges.push_back(ep);\n\n}\n\n// Remove an edge from the edge list of the vertex\n// and free the storage. This does not remove the twin\nvoid Vertex::deleteEdge(Edge* pEdge)\n{\n\n    removeEdge(pEdge);\n    delete pEdge;\n    pEdge = NULL;\n}\n\n// Remove an edge but do not destroy it\nvoid Vertex::removeEdge(Edge* pEdge)\n{\n\n    EdgePtrVecIter iter = m_edges.begin();\n    while(iter != m_edges.end())\n    {\n        if(*iter == pEdge)\n            break;\n        ++iter;\n    }\n    assert(iter != m_edges.end());\n    m_edges.erase(iter);    \n}\n\n//\nvoid Vertex::removeEdge(const EdgeDesc& ed)\n{\n\n    EdgePtrVecIter iter = findEdge(ed);\n    if(iter == m_edges.end())\n    {\n        std::cout << \"EDGE NOT FOUND: \" << ed << \"\\n\";\n    }\n    assert(iter != m_edges.end());\n    m_edges.erase(iter);\n}\n\n// Delete all the edges, and their twins, from this vertex\nvoid Vertex::deleteEdges()\n{\n\n    EdgePtrVecIter iter = m_edges.begin();\n    for(; iter != m_edges.end(); ++iter)\n    {\n        Edge* pEdge = *iter;\n        Edge* pTwin = pEdge->getTwin();\n        Vertex* pPartner = pEdge->getEnd();\n        pPartner->removeEdge(pTwin);\n        delete pEdge;\n        pEdge = NULL;\n        delete pTwin;\n        pTwin = NULL;\n        *iter = NULL;\n    }\n    m_edges.clear();\n}\n\n// Delete edges that are marked\n// This only deletes the edge and not its twin\nint Vertex::sweepEdges(GraphColor c)\n{\n\n    int numRemoved = 0;\n    EdgePtrVecIter iter = m_edges.begin();\n    while(iter != m_edges.end())\n    {\n        Edge* pEdge = *iter;\n        if(pEdge->getColor() == c)\n        {\n            delete pEdge;\n            pEdge = NULL;\n            iter = m_edges.erase(iter);\n            ++numRemoved;\n        }\n        else\n            ++iter;\n    }\n    return numRemoved;\n}\n\n// Return the iterator to the edge matching edgedesc\nEdgePtrVecIter Vertex::findEdge(const EdgeDesc& ed)\n{\n    for(EdgePtrVecIter iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n    {\n        if((*iter)->getDesc() == ed)\n            return iter;\n    }\n    return m_edges.end();\n}\n\n//\nEdgePtrVecConstIter Vertex::findEdge(const EdgeDesc& ed) const\n{\n    for(EdgePtrVecConstIter iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n    {\n        if((*iter)->getDesc() == ed)\n            return iter;\n    }\n    return m_edges.end();\n}\n\n// Check for the presence of an edge\nbool Vertex::hasEdge(Edge* pEdge) const\n{\n    return hasEdge(pEdge->getDesc());\n}\n\n//\nbool Vertex::hasEdge(const EdgeDesc& ed) const\n{\n    return findEdge(ed) != m_edges.end();\n}\n\n//\nbool Vertex::hasEdgeTo(const Vertex* pY) const\n{\n    assert(pY != NULL);\n    EdgePtrVecConstIter iter = m_edges.begin();\n    for(; iter != m_edges.end(); ++iter)\n        if((*iter)->getEnd() == pY)\n            return true;\n    return false;\n}\n\n// Return the edge matching the descriptions\nEdge* Vertex::getEdge(const EdgeDesc& ed)\n{\n     EdgePtrVecIter i = findEdge(ed);\n     assert(i != m_edges.end());\n     return *i;\n}\n\n// Find edges to the specified vertex\nEdgePtrVec Vertex::findEdgesTo(VertexID id)\n{\n    EdgePtrVecConstIter iter = m_edges.begin();\n    EdgePtrVec outEdges;\n    for(; iter != m_edges.end(); ++iter)\n    {\n        if((*iter)->getEndID() == id)\n            outEdges.push_back(*iter);\n    }\n    return outEdges;\n}\n\n// Returns the edge with the longest overlap length\n// in direction dir\n// Returns NULL if the vertex has no edges\nEdge* Vertex::getLongestOverlapEdge(EdgeDir dir) const\n{\n    Edge* pOut = NULL;\n    int maxOL = 0;\n    EdgePtrVecConstIter iter = m_edges.begin();\n    for(; iter != m_edges.end(); ++iter)\n    {\n        if((*iter)->getDir() != dir)\n            continue;\n\n        int currOL = (*iter)->getMatchLength();\n        if(currOL > maxOL)\n        {\n            pOut = *iter;\n            maxOL = currOL;\n        }\n    }\n    return pOut;\n}\n\n\n//\n// Get the edges in a particular direction\n// This preserves the ordering of the edges\n//\nEdgePtrVec Vertex::getEdges(EdgeDir dir) const\n{\n    EdgePtrVecConstIter iter = m_edges.begin();\n    EdgePtrVec outEdges;\n    for(; iter != m_edges.end(); ++iter)\n    {\n        if((*iter)->getDir() == dir)\n            outEdges.push_back(*iter);\n    }\n    return outEdges;\n}\n\n\n// Get the edges\nEdgePtrVec Vertex::getEdges() const\n{\n    EdgePtrVec outEdges(m_edges.begin(), m_edges.end());\n    return outEdges;    \n}\n\nvoid Vertex::setEdgeColors(GraphColor c) \n{ \n    for(EdgePtrVecIter iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n        (*iter)->setColor(c);\n}\n\n// Count the edges\n// This function is not necessarily constant time\nsize_t Vertex::countEdges() const\n{ \n    return m_edges.size(); \n}\n\n//\nsize_t Vertex::countEdges(EdgeDir dir)\n{\n    EdgePtrVec ev = getEdges(dir);\n    return ev.size();\n}\n\n// Calculate the difference in overlap lengths between\n// the longest and second longest edge\nint Vertex::getOverlapLengthDiff(EdgeDir dir) const\n{\n    int longest_len = 0;\n    int second_longest_len = 0;\n    EdgePtrVecConstIter iter = m_edges.begin();\n    for(; iter != m_edges.end(); ++iter)\n    {\n        if((*iter)->getDir() != dir)\n            continue;\n\n        int currOL = (*iter)->getMatchLength();\n        if(currOL > longest_len)\n        {\n            second_longest_len = longest_len;\n            longest_len = currOL;\n        }\n        else if(currOL > second_longest_len)\n        {\n            second_longest_len = currOL;\n        }\n    }\n    return longest_len - second_longest_len;\n}\n\n\n// Return the amount of memory this vertex is using, in bytes\nsize_t Vertex::getMemSize() const\n{\n    return sizeof(*this) + (m_edges.size() * sizeof(Edge*)) + m_seq.getMemSize();\n}\n\n\n// Output edges in graphviz format\nvoid Vertex::writeEdges(std::ostream& out, int dotFlags) const\n{\n    EdgePtrVecConstIter iter = m_edges.begin();\n    for(; iter != m_edges.end(); ++iter)\n    {\n        if(dotFlags & DF_UNDIRECTED)\n        {\n            if((*iter)->getStartID() < (*iter)->getEndID())\n            {\n                out << \"\\\"\" << (*iter)->getStartID() << \"\\\" -- \\\"\" << (*iter)->getEndID() << \"\\\"\";\n            }\n        }\n        else\n        {\n            out << \"\\\"\" << (*iter)->getStartID() << \"\\\" -> \\\"\" << (*iter)->getEndID();\n            std::string color = ((*iter)->getDir() == ED_SENSE) ? \"black\" : \"red\";\n            std::string label = ((*iter)->getComp() == EC_SAME) ? \"S\" : \"F\";\n            out << \"\\\" [color=\\\"\" << color << \"\\\" \";\n            out << \"label=\\\"\" << (*iter)->getMatchLength() << \"\\\"\";\n            out << \"];\";\n        }\n        out << \"\\n\";\n    }\n}\n\nbool EdgeIDComp::operator()(const Edge* pA, const Edge* pB) \n{\n       return pA->getEndID() < pB->getEndID();\n}\n\n// Compare string edge points by length\nbool EdgeLenComp::operator()(const Edge* pA, const Edge* pB)\n{\n    return pA->getSeqLen() < pB->getSeqLen();\n}\n\n"
  },
  {
    "path": "src/SGA/Bigraph/Vertex.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// Vertex - Generic vertex class for bigraph\n//\n#ifndef VERTEX_H\n#define VERTEX_H\n\n// Includes\n#include <stdio.h>\n#include <map>\n#include <set>\n#include <vector>\n#include <list>\n#include <ostream>\n#include <iostream>\n#include <iterator>\n#include \"GraphCommon.h\"\n#include \"QualityVector.h\"\n#include \"EncodedString.h\"\n#include \"SimpleAllocator.h\"\n#include \"EdgeDesc.h\"\n#include \"MultiOverlap.h\"\n\n// Forward declare\nclass Edge;\n\n// Default edge sorting function, by ID\nstruct EdgeIDComp\n{\n    bool operator()(const Edge* pA, const Edge* pB);\n};\n\n// Edge sorting function, by length\nstruct EdgeLenComp\n{\n    bool operator()(const Edge* pA, const Edge* pB);\n};\n\n\n// Typedefs\ntypedef std::map<EdgeDesc, Edge*> EdgePtrMap;\ntypedef std::vector<Edge*> EdgePtrVec;\ntypedef std::set<EdgeDesc> EdgeDescSet;\ntypedef std::list<Edge*> EdgePtrList;\ntypedef EdgePtrMap::iterator EdgePtrMapIter;\ntypedef EdgePtrMap::const_iterator EdgePtrMapConstIter;\ntypedef EdgePtrVec::iterator EdgePtrVecIter;\ntypedef EdgePtrVec::const_iterator EdgePtrVecConstIter;\ntypedef EdgePtrList::iterator EdgePtrListIter;\ntypedef EdgePtrList::const_iterator EdgePtrListConstIter;\n\nclass Vertex\n{\n    public:\n    \n        Vertex(VertexID id, const std::string& s) : m_id(id), \n                                                    m_seq(s), \n                                                    m_color(GC_WHITE),\n                                                    m_coverage(1),\n\t  m_isContained(false), m_isSuperRepeat(false) { \n          //m_parent_id.push_back(id); //JEREMIAH\n\t  /*std::cerr << \"ID: \" << id << \"Seq: \" << s << std::endl;*/\t\n         }\n        ~Vertex();\n\n        // High-level modification functions\n        \n        // Merge another vertex into this vertex, as specified by pEdge\n        void merge(Edge* pEdge);\n\n        // sort the edges by the ID of the vertex they point to\n        void sortAdjListByID();\n\n        // sort the edges by the length of the label of the edge\n        void sortAdjListByLen();\n\n        // Ensure that all the edges are unique\n        bool markDuplicateEdges(GraphColor dupColor); \n\n        //JEREMIAH\n        //void addParent(VertexID mid) { m_parent_id.push_back(mid);} ; \n\t//std::vector<std::string> getParentID() { return m_parent_id; } ;\n\n        // Get a multioverlap object representing the overlaps for this vertex\n        MultiOverlap getMultiOverlap() const;\n\n        // Edge list operations\n        void addEdge(Edge* ep);\n        void removeEdge(Edge* pEdge);\n        void removeEdge(const EdgeDesc& ed);\n        void deleteEdge(Edge* pEdge);\n        void deleteEdges();\n\n        int sweepEdges(GraphColor c);\n        bool hasEdge(Edge* pEdge) const;\n        bool hasEdge(const EdgeDesc& ed) const;\n        bool hasEdgeTo(const Vertex* pY) const;\n\n        Edge* getEdge(const EdgeDesc& ed);\n        EdgePtrVec findEdgesTo(VertexID id);\n        EdgePtrVec getEdges(EdgeDir dir) const;\n        EdgePtrVec getEdges() const;\n        EdgePtrVecIter findEdge(const EdgeDesc& ed);\n        EdgePtrVecConstIter findEdge(const EdgeDesc& ed) const;\n        Edge* getLongestOverlapEdge(EdgeDir dir) const;\n\n        size_t countEdges() const;\n        size_t countEdges(EdgeDir dir);\n\n        // Calculate the difference in overlap lengths between\n        // the longest and second longest edge\n        int getOverlapLengthDiff(EdgeDir dir) const;\n\n        // Ensure the vertex data is sane\n        void validate() const;\n        \n        // setters\n        void setID(VertexID id) { m_id = id; }\n        void setEdgeColors(GraphColor c);\n        void setSeq(const std::string& s) { m_seq = s; }\n        void setColor(GraphColor c) { m_color = c; }\n        void setContained(bool c) { m_isContained = c; }\n        void setSuperRepeat(bool b) { m_isSuperRepeat = b; }\n\n        // getters\n        VertexID getID() const { return m_id; }\n        GraphColor getColor() const { return m_color; }\n        const DNAEncodedString& getSeq() const { return m_seq; }\n        std::string getStr() const { return m_seq.toString(); }\n        size_t getSeqLen() const { return m_seq.length(); }\n        size_t getMemSize() const;\n        bool isContained() const { return m_isContained; }\n        bool isSuperRepeat() const { return m_isSuperRepeat; }\n        uint16_t getCoverage() const { return m_coverage; }\n\n        // Memory management\n        //void* operator new(size_t /*size*/, SimpleAllocator<Vertex>* pAllocator)\n        //{\n        //    return pAllocator->alloc();\n        //}\n\n        //void operator delete(void* /*target*/, size_t /*size*/)\n        //{\n            // delete does nothing since all allocations go through the memory pool\n            // belonging to the graph. The memory allocated for the vertex will be\n            // cleaned up when the graph is destroyed.\n        //}\n\n        // Output edges in graphviz format\n        void writeEdges(std::ostream& out, int dotFlags) const;\n\n    private:\n\n        // Global new is disallowed, all allocations must go through the pool\n        /*void* operator new(size_t size)\n        {\n            return malloc(size);\n\t    }*/\n\n        // Ensure all the edges in DIR are unique\n        bool markDuplicateEdges(EdgeDir dir, GraphColor dupColor);\n\n        VertexID m_id;\n\t//std::vector<VertexID> m_parent_id; //JEREMIAH\n        EdgePtrVec m_edges;\n        DNAEncodedString m_seq;\n        GraphColor m_color;\n\n        // Counter of the number of vertices that have been merged into this one\n        uint16_t m_coverage; \n\n        bool m_isContained;\n        bool m_isSuperRepeat;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SGA/Makefile.am",
    "content": "noinst_LIBRARIES = libsga.a\n\nlibsga_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/src/SGA/SuffixTools \\\n\t-I$(top_srcdir)/src/SGA/StringGraph \\\n\t-I$(top_srcdir)/SeqLib \\\n\t-I$(top_srcdir)/src/SGA/Algorithm \\\n\t-I$(top_srcdir)/src/SGA/SQG \n\nlibsga_a_SOURCES = \\\n##index.cpp index.h \\\n              ##overlap.cpp overlap.h \\\n##              assemble.cpp assemble.h \\\n##              correct.cpp correct.h \\\n##              oview.cpp oview.h \\\n##              preprocess.cpp preprocess.h \\\n##              rmdup.cpp rmdup.h \\\n##              merge.cpp merge.h \\\n##              subgraph.cpp subgraph.h \\\n##              scaffold.cpp scaffold.h \\\n##              scaffold2fasta.cpp scaffold2fasta.h \\\n##              connect.cpp connect.h \\\n##              walk.cpp walk.h \\\n##              filter.cpp filter.h \\\n##              kmer-count.cpp kmer-count.h \\\n ##             stats.cpp stats.h \\\n##              fm-merge.cpp fm-merge.h \\\n##              gmap.h gmap.cpp \\\n ##             filterBAM.h filterBAM.cpp \\\n   ##           cluster.h cluster.cpp \\\n     ##         gen-ssa.h gen-ssa.cpp \\\n       ##       bwt2fa.h bwt2fa.cpp \\\n         ##     graph-diff.h graph-diff.cpp \\\n           ##   graph-concordance.h graph-concordance.cpp \\\n  ##            gapfill.h gapfill.cpp \\\n    ##          preqc.h preqc.cpp \\\n      ##        variant-detectability.h variant-detectability.cpp \\\n        ##      rewrite-evidence-bam.h rewrite-evidence-bam.cpp \\\n          ##    somatic-variant-filters-bam.h somatic-variant-filters.cpp \\\n            ##  haplotype-filter.h haplotype-filter.cpp \\\n              OverlapCommon.h OverlapCommon.cpp \\\n              SGACommon.h \n\n# LocalWords:  srcdir\n"
  },
  {
    "path": "src/SGA/SGA/Makefile.in",
    "content": "# Makefile.in generated by automake 1.16.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2018 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nsubdir = src/SGA/SGA\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLIBRARIES = $(noinst_LIBRARIES)\nAR = ar\nARFLAGS = cru\nAM_V_AR = $(am__v_AR_@AM_V@)\nam__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)\nam__v_AR_0 = @echo \"  AR      \" $@;\nam__v_AR_1 = \nlibsga_a_AR = $(AR) $(ARFLAGS)\nlibsga_a_LIBADD =\nam_libsga_a_OBJECTS = libsga_a-OverlapCommon.$(OBJEXT)\nlibsga_a_OBJECTS = $(am_libsga_a_OBJECTS)\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__maybe_remake_depfiles = depfiles\nam__depfiles_remade = ./$(DEPDIR)/libsga_a-OverlapCommon.Po\nam__mv = mv -f\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nAM_V_CXX = $(am__v_CXX_@AM_V@)\nam__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)\nam__v_CXX_0 = @echo \"  CXX     \" $@;\nam__v_CXX_1 = \nCXXLD = $(CXX)\nCXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \\\n\t-o $@\nAM_V_CXXLD = $(am__v_CXXLD_@AM_V@)\nam__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)\nam__v_CXXLD_0 = @echo \"  CXXLD   \" $@;\nam__v_CXXLD_1 = \nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libsga_a_SOURCES)\nDIST_SOURCES = $(libsga_a_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_CXXFLAGS = @AM_CXXFLAGS@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nOBJEXT = @OBJEXT@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild_alias = @build_alias@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost_alias = @host_alias@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nnoinst_LIBRARIES = libsga.a\nlibsga_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/src/SGA/SuffixTools \\\n\t-I$(top_srcdir)/src/SGA/StringGraph \\\n\t-I$(top_srcdir)/SeqLib \\\n\t-I$(top_srcdir)/src/SGA/Algorithm \\\n\t-I$(top_srcdir)/src/SGA/SQG \n\nlibsga_a_SOURCES = \\\n              OverlapCommon.h OverlapCommon.cpp \\\n              SGACommon.h \n\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .cpp .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/SGA/SGA/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/SGA/SGA/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLIBRARIES:\n\t-test -z \"$(noinst_LIBRARIES)\" || rm -f $(noinst_LIBRARIES)\n\nlibsga.a: $(libsga_a_OBJECTS) $(libsga_a_DEPENDENCIES) $(EXTRA_libsga_a_DEPENDENCIES) \n\t$(AM_V_at)-rm -f libsga.a\n\t$(AM_V_AR)$(libsga_a_AR) libsga.a $(libsga_a_OBJECTS) $(libsga_a_LIBADD)\n\t$(AM_V_at)$(RANLIB) libsga.a\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsga_a-OverlapCommon.Po@am__quote@ # am--include-marker\n\n$(am__depfiles_remade):\n\t@$(MKDIR_P) $(@D)\n\t@echo '# dummy' >$@-t && $(am__mv) $@-t $@\n\nam--depfiles: $(am__depfiles_remade)\n\n.cpp.o:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<\n\n.cpp.obj:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\nlibsga_a-OverlapCommon.o: OverlapCommon.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsga_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsga_a-OverlapCommon.o -MD -MP -MF $(DEPDIR)/libsga_a-OverlapCommon.Tpo -c -o libsga_a-OverlapCommon.o `test -f 'OverlapCommon.cpp' || echo '$(srcdir)/'`OverlapCommon.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsga_a-OverlapCommon.Tpo $(DEPDIR)/libsga_a-OverlapCommon.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='OverlapCommon.cpp' object='libsga_a-OverlapCommon.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsga_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsga_a-OverlapCommon.o `test -f 'OverlapCommon.cpp' || echo '$(srcdir)/'`OverlapCommon.cpp\n\nlibsga_a-OverlapCommon.obj: OverlapCommon.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsga_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsga_a-OverlapCommon.obj -MD -MP -MF $(DEPDIR)/libsga_a-OverlapCommon.Tpo -c -o libsga_a-OverlapCommon.obj `if test -f 'OverlapCommon.cpp'; then $(CYGPATH_W) 'OverlapCommon.cpp'; else $(CYGPATH_W) '$(srcdir)/OverlapCommon.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsga_a-OverlapCommon.Tpo $(DEPDIR)/libsga_a-OverlapCommon.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='OverlapCommon.cpp' object='libsga_a-OverlapCommon.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsga_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsga_a-OverlapCommon.obj `if test -f 'OverlapCommon.cpp'; then $(CYGPATH_W) 'OverlapCommon.cpp'; else $(CYGPATH_W) '$(srcdir)/OverlapCommon.cpp'; fi`\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(BUILT_SOURCES)\n\t$(MAKE) $(AM_MAKEFLAGS) distdir-am\n\ndistdir-am: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LIBRARIES)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am\n\ndistclean: distclean-am\n\t\t-rm -f ./$(DEPDIR)/libsga_a-OverlapCommon.Po\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t\t-rm -f ./$(DEPDIR)/libsga_a-OverlapCommon.Po\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \\\n\tclean-generic clean-noinstLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\n# LocalWords:  srcdir\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/SGA/SGA/OverlapCommon.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// OverlapCommon - Common wrapper used for finding overlaps\n// for a set of reads\n//\n#include \"OverlapCommon.h\"\n\n// Convert a line from a hits file into a vector of overlaps and sets the flag\n// indicating whether the read was found to be a substring of other reads\n// Only the forward read table is used since we only care about the IDs and length\n// of the read, not the sequence, so that we don't need an explicit reverse read table\nvoid OverlapCommon::parseHitsString(const std::string& hitString, \n                                    const ReadInfoTable* pQueryRIT, \n                                    const ReadInfoTable* pTargetRIT, \n                                    const SuffixArray* pFwdSAI, \n                                    const SuffixArray* pRevSAI, \n                                    bool bCheckIDs,\n                                    size_t& readIdx,\n                                    size_t& sumBlockSize,\n                                    OverlapVector& outVector, \n                                    bool& isSubstring)\n{\n    OverlapVector outvec;\n    std::istringstream convertor(hitString);\n\n    sumBlockSize = 0;\n    // Read the overlap blocks for a read\n    size_t numBlocks;\n    convertor >> readIdx >> isSubstring >> numBlocks;\n\n    for(size_t i = 0; i < numBlocks; ++i)\n    {\n        // Read the block\n        OverlapBlock record;\n        convertor >> record;\n        //std::cout << \"\\t\" << record << \"\\n\";\n\n        // Iterate through the range and write the overlaps\n        for(int64_t j = record.ranges.interval[0].lower; j <= record.ranges.interval[0].upper; ++j)\n        {\n            sumBlockSize += 1;\n            const SuffixArray* pCurrSAI = (record.flags.isTargetRev()) ? pRevSAI : pFwdSAI;\n            const ReadInfo& queryInfo = pQueryRIT->getReadInfo(readIdx);\n\n            int64_t saIdx = j;\n\n            // The index of the second read is given as the position in the SuffixArray index\n            const ReadInfo& targetInfo = pTargetRIT->getReadInfo(pCurrSAI->get(saIdx).getID());\n\n\t    //std::cout << \" HERE RER \" << queryInfo.id << \" \" << targetInfo.id << \" \" << queryInfo.length << \" \" << targetInfo.length << \"\\n\";\n            // Skip self alignments and non-canonical (where the query read has a lexo. higher name)\n            if(queryInfo.id != targetInfo.id)\n            {    \n                Overlap o = record.toOverlap(queryInfo.id, targetInfo.id, queryInfo.length, targetInfo.length);\n\t\t//std::cout << queryInfo.id << \" \" << targetInfo.id << \" \" << queryInfo.length << \" \" << targetInfo.length << \"\\n\";\n\n                // The alignment logic above has the potential to produce duplicate alignments\n                // To avoid this, we skip overlaps where the id of the first coord is lexo. lower than \n                // the second or the match is a containment and the query is reversed (containments can be \n                // output up to 4 times total).\n                if(bCheckIDs && (o.id[0] < o.id[1] || (o.match.isContainment() && record.flags.isQueryRev())))\n                    continue;\n\n                outVector.push_back(o);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/SGA/SGA/OverlapCommon.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// OverlapCommon - Common functions used in overlap methods\n//\n#ifndef OVERLAPCOMMON_H\n#define OVERLAPCOMMON_H\n\n#include \"Util.h\"\n#include \"overlap.h\"\n#include \"SuffixArray.h\"\n#include \"SGACommon.h\"\n#include \"Timer.h\"\n#include \"ReadInfoTable.h\"\n\nnamespace OverlapCommon\n{\n\n// Parse a line from a .hits file into a variety of overlap-related data\nvoid parseHitsString(const std::string& hitString, \n                     const ReadInfoTable* pQueryRIT, \n                     const ReadInfoTable* pTargetRIT, \n                     const SuffixArray* pFwdSAI, \n                     const SuffixArray* pRevSAI,\n                     bool bCheckIDs,\n                     size_t& readIdx, \n                     size_t& sumBlockSize,\n                     OverlapVector& outVector, \n                     bool& isSubstring);\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SGA/SGACommon.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// SGACommon.h - Common definitions used in the \n// SGA programs\n//\n\n#ifndef SGACOMMON_H\n#define SGACOMMON_H\n\n// File extensions\n#define OVR_EXT \".ovr\"\n#define HITS_EXT \".hits\"\n#define RMDUPHITS_EXT \".rmhits\"\n#define GMAPHITS_EXT \".gmhits\"\n#define CTN_EXT \".ctn\"\n#define ASQG_EXT \".asqg\"\n#define SA_EXT \".sa\"\n#define RSA_EXT \".rsa\"\n#define BWT_EXT \".bwt\"\n#define RBWT_EXT \".rbwt\"\n#define SAI_EXT \".sai\"\n#define RSAI_EXT \".rsai\"\n#define SSA_EXT \".ssa\"\n#define POPIDX_EXT \".popidx\"\n\n// Default values\n#define DEFAULT_MIN_OVERLAP 45\n#define DEFAULT_EXTRACT_LEN 100\n\n#endif\n"
  },
  {
    "path": "src/SGA/SGA/index.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// index - Build a BWT/FM-index for a set of reads\n//\n#include <iostream>\n#include <fstream>\n#include <algorithm>\n#include \"SGACommon.h\"\n#include \"Util.h\"\n#include \"index.h\"\n#include \"SuffixArray.h\"\n#include \"SeqReader.h\"\n#include \"SACAInducedCopying.h\"\n#include \"BWTDiskConstruction.h\"\n#include \"BWT.h\"\n#include \"Timer.h\"\n#include \"BWTCABauerCoxRosone.h\"\n#include \"BWTCARopebwt.h\"\n#include \"SampledSuffixArray.h\"\n\n//\n// Getopt\n//\n#define SUBPROGRAM \"index\"\n\nstatic const char *INDEX_VERSION_MESSAGE =\nSUBPROGRAM \" Version \" PACKAGE_VERSION \"\\n\"\n\"Written by Jared Simpson.\\n\"\n\"\\n\"\n  \"Copyright 2009 Wellcome Trust Sanger Institute\\n\";\n\nstatic const char *INDEX_USAGE_MESSAGE =\n\"Usage: \" PACKAGE_NAME \" \" SUBPROGRAM \" [OPTION] ... READSFILE\\n\"\n\"Index the reads in READSFILE using a suffixarray/bwt\\n\"\n\"\\n\"\n\"  -v, --verbose                        display verbose output\\n\"\n\"      --help                           display this help and exit\\n\"\n\"  -a, --algorithm=STR                  BWT construction algorithm. STR can be:\\n\"\n\"                                       sais - induced sort algorithm, slower but works for very long sequences (default)\\n\"\n\"                                       ropebwt - very fast and memory efficient. use this for short (<200bp) reads\\n\"\n\"  -d, --disk=NUM                       use disk-based BWT construction algorithm. The suffix array/BWT will be constructed\\n\"\n\"                                       for batchs of NUM reads at a time. To construct the suffix array of 200 megabases of sequence\\n\"\n\"                                       requires ~2GB of memory, set this parameter accordingly.\\n\"\n\"  -t, --threads=NUM                    use NUM threads to construct the index (default: 1)\\n\"\n\"  -c, --check                          validate that the suffix array/bwt is correct\\n\"\n\"  -p, --prefix=PREFIX                  write index to file using PREFIX instead of prefix of READSFILE\\n\"\n\"      --no-reverse                     suppress construction of the reverse BWT. Use this option when building the index\\n\"\n\"                                       for reads that will be error corrected using the k-mer corrector, which only needs the forward index\\n\"\n\"      --no-forward                     suppress construction of the forward BWT. Use this option when building the forward and reverse index separately\\n\"\n\"      --no-sai                         suppress construction of the SAI file. This option only applies to -a ropebwt\\n\"\n\"  -g, --gap-array=N                    use N bits of storage for each element of the gap array. Acceptable values are 4,8,16 or 32. Lower\\n\"\n\"                                       values can substantially reduce the amount of memory required at the cost of less predictable memory usage.\\n\"\n\"                                       When this value is set to 32, the memory requirement is essentially deterministic and requires ~5N bytes where\\n\"\n\"                                       N is the size of the FM-index of READS2.\\n\"\n\"                                       The default value is 8.\\n\"\n  \"\\nReport bugs to \" PACKAGE_BUGREPORT \"\\n\\n\";\n\nnamespace opt\n{\n  static unsigned int verbose;\n  static std::string readsFile;\n  static std::string prefix;\n  static std::string algorithm = \"sais\";\n  static int numReadsPerBatch = 2000000;\n  static int numThreads = 1;\n  static bool bDiskAlgo = false;\n  static bool bBuildReverse = true;\n  static bool bBuildForward = true;\n  static bool bBuildSAI = true;\n  static bool validate;\n  static int gapArrayStorage = 4;\n}\n\nstatic const char* shortopts = \"p:a:m:t:d:g:cv\";\n\nenum { OPT_HELP = 1, OPT_VERSION, OPT_NO_REVERSE, OPT_NO_FWD, OPT_NO_SAI };\n\nstatic const struct option longopts[] = {\n  { \"verbose\",     no_argument,       NULL, 'v' },\n  { \"check\",       no_argument,       NULL, 'c' },\n  { \"prefix\",      required_argument, NULL, 'p' },\n  { \"threads\",     required_argument, NULL, 't' },\n  { \"disk\",        required_argument, NULL, 'd' },\n  { \"gap-array\",   required_argument, NULL, 'g' },\n  { \"algorithm\",   required_argument, NULL, 'a' },\n  { \"no-reverse\",  no_argument,       NULL, OPT_NO_REVERSE },\n  { \"no-forward\",  no_argument,       NULL, OPT_NO_FWD },\n  { \"no-sai\",      no_argument,       NULL, OPT_NO_SAI },\n  { \"help\",        no_argument,       NULL, OPT_HELP },\n  { \"version\",     no_argument,       NULL, OPT_VERSION },\n  { NULL, 0, NULL, 0 }\n};\n\nint indexMain(int argc, char** argv)\n{\n  Timer t(\"sga index\");\n  parseIndexOptions(argc, argv);\n  if(!opt::bDiskAlgo)\n    {\n      if(opt::algorithm == \"sais\")\n\tindexInMemorySAIS();\n      else if(opt::algorithm == \"bcr\")\n\tindexInMemoryBCR();\n      else if(opt::algorithm == \"ropebwt\")\n\tindexInMemoryRopebwt();\n    }\n  else\n    {\n      indexOnDisk();\n    }\n  return 0;\n}\n\n//\nvoid indexInMemoryBCR()\n{\n  std::cout << \"Building index for \" << opt::readsFile << \" in memory using BCR\\n\";\n\n  if(opt::bBuildForward || opt::bBuildReverse)\n    {\n      // Parse the initial read table\n      std::vector<DNAEncodedString> readSequences;\n      SeqReader reader(opt::readsFile);\n      SeqRecord sr;\n      while(reader.get(sr))\n\treadSequences.push_back(sr.seq.toString());\n\n      if(opt::bBuildForward)\n\t{\n\t  BWTCA::runBauerCoxRosone(&readSequences, opt::prefix + BWT_EXT, opt::prefix + SAI_EXT);\n\t}\n\n\n      if(opt::bBuildReverse)\n\t{\n\t  // Reverse all the reads\n\t  for(size_t i = 0; i < readSequences.size(); ++i)\n\t    readSequences[i] = reverse(readSequences[i].toString());\n\t  BWTCA::runBauerCoxRosone(&readSequences, opt::prefix + RBWT_EXT, opt::prefix + RSAI_EXT);\n\t}\n    }\n}\n\n//\nvoid indexInMemoryRopebwt()\n{\n  std::cout << \"Building index for \" << opt::readsFile << \" in memory using ropebwt\\n\";\n\n  bool use_threads = opt::numThreads >= 4;\n\n  if(opt::bBuildForward)\n    {\n      std::string bwt_filename = opt::prefix + BWT_EXT;\n      std::string sai_filename = opt::prefix + SAI_EXT;\n      BWTCA::runRopebwt(opt::readsFile, bwt_filename, use_threads, false);\n\n      if(opt::bBuildSAI)\n        {\n\t  std::cout << \"\\t done bwt construction, generating .sai file\\n\";\n\t  BWT* pBWT = new BWT(bwt_filename);\n\t  SampledSuffixArray ssa;\n\t  ssa.buildLexicoIndex(pBWT, opt::numThreads);\n\t  ssa.writeLexicoIndex(sai_filename);\n\t  delete pBWT;\n        }\n    }\n\n  if(opt::bBuildReverse)\n    {\n      std::string rbwt_filename = opt::prefix + RBWT_EXT;\n      std::string rsai_filename = opt::prefix + RSAI_EXT;\n      BWTCA::runRopebwt(opt::readsFile, rbwt_filename, use_threads, true);\n\n      if(opt::bBuildSAI)\n        {\n\t  std::cout << \"\\t done rbwt construction, generating .rsai file\\n\";\n\t  BWT* pRBWT = new BWT(rbwt_filename);\n\t  SampledSuffixArray ssa;\n\t  ssa.buildLexicoIndex(pRBWT, opt::numThreads);\n\t  ssa.writeLexicoIndex(rsai_filename);\n\t  delete pRBWT;\n        }\n    }\n}\n//\nvoid indexInMemorySAIS()\n{\n  std::cout << \"Building index for \" << opt::readsFile << \" in memory using SAIS\\n\";\n\n  if(opt::bBuildForward || opt::bBuildReverse)\n    {\n      // Parse the initial read table\n      ReadTable* pRT = new ReadTable(opt::readsFile);\n\n      // Create and write the suffix array for the forward reads\n      if(opt::bBuildForward)\n\t{\n\t  buildIndexForTable(opt::prefix, pRT, false);\n\t}\n\n      if(opt::bBuildReverse)\n\t{\n\t  // Reverse all the reads\n\t  pRT->reverseAll();\n\n\t  // Build the reverse suffix array\n\t  buildIndexForTable(opt::prefix, pRT, true);\n\t}\n\n      delete pRT;\n    }\n}\n\n//\nvoid indexOnDisk()\n{\n  std::cout << \"Building index for \" << opt::readsFile << \" on disk\\n\";\n  BWTDiskParameters parameters;\n  parameters.inFile = opt::readsFile;\n  parameters.outPrefix = opt::prefix;\n  parameters.bwtExtension = BWT_EXT;\n  parameters.saiExtension = SAI_EXT;\n  parameters.numReadsPerBatch = opt::numReadsPerBatch;\n  parameters.numThreads = opt::numThreads;\n  parameters.storageLevel = opt::gapArrayStorage;\n  parameters.bBuildReverse = false;\n  parameters.bUseBCR = (opt::algorithm == \"bcr\");\n  \n  if(opt::bBuildForward)\n    {\n      buildBWTDisk(parameters);\n    }\n  \n  if(opt::bBuildReverse)\n    {\n      parameters.bwtExtension = RBWT_EXT;\n      parameters.saiExtension = RSAI_EXT;\n      parameters.bBuildReverse = true;\n      buildBWTDisk(parameters);\n    }\n}\n\n//\nvoid buildIndexForTable(std::string prefix, const ReadTable* pRT, bool isReverse)\n{\n  // Create suffix array from read table\n  SuffixArray* pSA = new SuffixArray(pRT, opt::numThreads);\n\n  if(opt::validate)\n    {\n      std::cout << \"Validating suffix array\\n\";\n      pSA->validate(pRT);\n    }\n\n  std::string bwt_filename = prefix + (!isReverse ? BWT_EXT : RBWT_EXT);\n  pSA->writeBWT(bwt_filename, pRT);\n\n  std::string sufidx_filename = prefix + (!isReverse ? SAI_EXT : RSAI_EXT);\n  pSA->writeIndex(sufidx_filename);\n\n  delete pSA;\n  pSA = NULL;\n}\n\n// \n// Handle command line arguments\n//\nvoid parseIndexOptions(int argc, char** argv)\n{\n  bool die = false;\n  for (char c; (c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1;) \n    {\n      std::istringstream arg(optarg != NULL ? optarg : \"\");\n      switch (c) \n        {\n\tcase 'p': arg >> opt::prefix; break;\n\tcase '?': die = true; break;\n\tcase 'c': opt::validate = true; break;\n\tcase 'd': opt::bDiskAlgo = true; arg >> opt::numReadsPerBatch; break;\n\tcase 't': arg >> opt::numThreads; break;\n\tcase 'g': arg >> opt::gapArrayStorage; break;\n\tcase 'a': arg >> opt::algorithm; break;\n\tcase 'v': opt::verbose++; break;\n\tcase OPT_NO_REVERSE: opt::bBuildReverse = false; break;\n\tcase OPT_NO_FWD: opt::bBuildForward = false; break;\n\tcase OPT_NO_SAI: opt::bBuildSAI = false; break;\n\tcase OPT_HELP:\n\t  std::cout << INDEX_USAGE_MESSAGE;\n\t  exit(EXIT_SUCCESS);\n\tcase OPT_VERSION:\n\t  std::cout << INDEX_VERSION_MESSAGE;\n\t  exit(EXIT_SUCCESS);\n        }\n    }\n\n  // Transform algorithm parameter to lower case\n  std::transform(opt::algorithm.begin(), opt::algorithm.end(), opt::algorithm.begin(), ::tolower);\n    \n  if (argc - optind < 1) \n    {\n      std::cerr << SUBPROGRAM \": missing arguments\\n\";\n      die = true;\n    } \n  else if (argc - optind > 1) \n    {\n      std::cerr << SUBPROGRAM \": too many arguments\\n\";\n      die = true;\n    }\n\n  if(opt::gapArrayStorage != 4 && opt::gapArrayStorage != 8 &&\n     opt::gapArrayStorage != 16 && opt::gapArrayStorage != 32)\n    {\n      std::cerr << SUBPROGRAM \": invalid argument, --gap-array,-g must be one of 4,8,16,32 (found: \" << opt::gapArrayStorage << \")\\n\";\n      die = true;\n    }\n\n  if(opt::numThreads <= 0)\n    {\n      std::cerr << SUBPROGRAM \": invalid number of threads: \" << opt::numThreads << \"\\n\";\n      die = true;\n    }\n\n  if(opt::algorithm != \"sais\" && opt::algorithm != \"bcr\" && opt::algorithm != \"ropebwt\")\n    {\n      std::cerr << SUBPROGRAM \": unrecognized algorithm string \" << opt::algorithm << \". --algorithm must be sais, bcr or ropebwt\\n\";\n      die = true;\n    }\n\n  if(opt::algorithm == \"ropebwt\" && opt::bDiskAlgo)\n    {\n      std::cerr << SUBPROGRAM \": the options -a ropebwt and -d are not compatible, please only use one.\\n\";\n      die = true;\n    }\n\n  if (die) \n    {\n      std::cout << \"\\n\" << INDEX_USAGE_MESSAGE;\n      exit(EXIT_FAILURE);\n    }\n\n  // Parse the input filenames\n  opt::readsFile = argv[optind++];\n  if(opt::prefix.empty())\n    opt::prefix = stripFilename(opt::readsFile);\n\n  // Check if input file is empty\n  size_t filesize = getFilesize(opt::readsFile);\n  if(filesize == 0)\n    {\n      std::cerr << SUBPROGRAM \": input file is empty\\n\";\n      exit(EXIT_FAILURE);\n    }\n}\n"
  },
  {
    "path": "src/SGA/SGA/index.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// index - Build a BWT/FM-index for a set of reads\n//\n#ifndef INDEX_H\n#define INDEX_H\n#include <getopt.h>\n#include \"config.h\"\n#include \"SuffixArray.h\"\n\nint indexMain(int argc, char** argv);\nvoid indexInMemorySAIS();\nvoid indexInMemoryBCR();\nvoid indexInMemoryRopebwt();\nvoid indexOnDisk();\nvoid buildIndexForTable(std::string outfile, const ReadTable* pRT, bool isReverse);\nvoid parseIndexOptions(int argc, char** argv);\n\n#endif\n"
  },
  {
    "path": "src/SGA/SGA/overlap.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// overlap - compute pairwise overlaps between reads\n//\n#include <iostream>\n#include <fstream>\n#include <sstream>\n#include <iterator>\n#include \"Util.h\"\n#include \"overlap.h\"\n#include \"SuffixArray.h\"\n#include \"BWT.h\"\n#include \"SGACommon.h\"\n#include \"OverlapCommon.h\"\n#include \"Timer.h\"\n#include \"BWTAlgorithms.h\"\n#include \"ASQG.h\"\n#include \"gzstream.h\"\n#include \"SequenceProcessFramework.h\"\n#include \"OverlapProcess.h\"\n#include \"ReadInfoTable.h\"\n\n//\nenum OutputType\n{\n    OT_ASQG,\n    OT_RAW\n};\n\n// Functions\nsize_t computeHitsSerial(const std::string& prefix, const std::string& readsFile, \n                         const OverlapAlgorithm* pOverlapper, int minOverlap, \n                         StringVector& filenameVec, std::ostream* pASQGWriter);\n\nsize_t computeHitsParallel(int numThreads, const std::string& prefix, const std::string& readsFile, \n                           const OverlapAlgorithm* pOverlapper, int minOverlap, \n                           StringVector& filenameVec, std::ostream* pASQGWriter);\n\n//\nvoid convertHitsToASQG(const std::string& indexPrefix, const StringVector& hitsFilenames, std::ostream* pASQGWriter);\n\n\n//\n// Getopt\n//\n#define SUBPROGRAM \"overlap\"\nstatic const char *OVERLAP_VERSION_MESSAGE =\nSUBPROGRAM \" Version \" PACKAGE_VERSION \"\\n\"\n\"Written by Jared Simpson.\\n\"\n\"\\n\"\n\"Copyright 2009 Wellcome Trust Sanger Institute\\n\";\n\nstatic const char *OVERLAP_USAGE_MESSAGE =\n\"Usage: \" PACKAGE_NAME \" \" SUBPROGRAM \" [OPTION] ... READSFILE\\n\"\n\"Compute pairwise overlap between all the sequences in READS\\n\"\n\"\\n\"\n\"      --help                           display this help and exit\\n\"\n\"      -v, --verbose                    display verbose output\\n\"\n\"      -t, --threads=NUM                use NUM worker threads to compute the overlaps (default: no threading)\\n\"\n\"      -e, --error-rate                 the maximum error rate allowed to consider two sequences aligned (default: exact matches only)\\n\"\n\"      -m, --min-overlap=LEN            minimum overlap required between two reads (default: 45)\\n\"\n\"      -p, --prefix=PREFIX              use PREFIX for the names of the index files (default: prefix of the input file)\\n\"\n\"      -f, --target-file=FILE           perform the overlap queries against the reads in FILE\\n\"\n\"      -x, --exhaustive                 output all overlaps, including transitive edges\\n\"\n\"          --exact                      force the use of the exact-mode irreducible block algorithm. This is faster\\n\"\n\"                                       but requires that no substrings are present in the input set.\\n\"\n\"      -l, --seed-length=LEN            force the seed length to be LEN. By default, the seed length in the overlap step\\n\"\n\"                                       is calculated to guarantee all overlaps with --error-rate differences are found.\\n\"\n\"                                       This option removes the guarantee but will be (much) faster. As SGA can tolerate some\\n\"\n\"                                       missing edges, this option may be preferable for some data sets.\\n\"\n\"      -s, --seed-stride=LEN            force the seed stride to be LEN. This parameter will be ignored unless --seed-length\\n\"\n\"                                       is specified (see above). This parameter defaults to the same value as --seed-length\\n\"\n\"      -d, --sample-rate=N              sample the symbol counts every N symbols in the FM-index. Higher values use significantly\\n\"\n\"                                       less memory at the cost of higher runtime. This value must be a power of 2 (default: 128)\\n\"\n\"\\nReport bugs to \" PACKAGE_BUGREPORT \"\\n\\n\";\n\nstatic const char* PROGRAM_IDENT =\nPACKAGE_NAME \"::\" SUBPROGRAM;\n\nnamespace opt\n{\n    static unsigned int verbose;\n    static int numThreads = 1;\n    static OutputType outputType = OT_ASQG;\n    static std::string readsFile;\n    static std::string targetFile;\n    static std::string outFile;\n    static std::string prefix;\n  \n    static double errorRate = 0.0f;\n    static unsigned int minOverlap = DEFAULT_MIN_OVERLAP;\n    static int seedLength = 0;\n    static int seedStride = 0;\n    static int sampleRate = BWT::DEFAULT_SAMPLE_RATE_SMALL;\n    static bool bIrreducibleOnly = true;\n    static bool bExactIrreducible = false;\n}\n\nstatic const char* shortopts = \"m:d:e:t:l:s:o:f:p:vix\";\n\nenum { OPT_HELP = 1, OPT_VERSION, OPT_EXACT };\n\nstatic const struct option longopts[] = {\n    { \"verbose\",     no_argument,       NULL, 'v' },\n    { \"threads\",     required_argument, NULL, 't' },\n    { \"min-overlap\", required_argument, NULL, 'm' },\n    { \"sample-rate\", required_argument, NULL, 'd' },\n    { \"outfile\",     required_argument, NULL, 'o' },\n    { \"target-file\", required_argument, NULL, 'f' },\n    { \"prefix\",      required_argument, NULL, 'p' },\n    { \"error-rate\",  required_argument, NULL, 'e' },\n    { \"seed-length\", required_argument, NULL, 'l' },\n    { \"seed-stride\", required_argument, NULL, 's' },\n    { \"exhaustive\",  no_argument,       NULL, 'x' },\n    { \"exact\",       no_argument,       NULL, OPT_EXACT },\n    { \"help\",        no_argument,       NULL, OPT_HELP },\n    { \"version\",     no_argument,       NULL, OPT_VERSION },\n    { NULL, 0, NULL, 0 }\n};\n\n//\n// Main\n//\nint overlapMain(int argc, char** argv)\n{\n    parseOverlapOptions(argc, argv);\n\n    // Prepare the output ASQG file\n    assert(opt::outputType == OT_ASQG);\n\n    // Open output file\n    std::ostream* pASQGWriter = createWriter(opt::outFile);\n\n    // Build and write the ASQG header\n    ASQG::HeaderRecord headerRecord;\n    headerRecord.setOverlapTag(opt::minOverlap);\n    headerRecord.setErrorRateTag(opt::errorRate);\n    headerRecord.setInputFileTag(opt::readsFile);\n    headerRecord.setContainmentTag(true); // containments are always present\n    headerRecord.setTransitiveTag(!opt::bIrreducibleOnly);\n    headerRecord.write(*pASQGWriter);\n\n    // Compute the overlap hits\n    StringVector hitsFilenames;\n\n    // Determine which index files to use. If a target file was provided,\n    // use the index of the target reads\n    std::string indexPrefix;\n    if(!opt::prefix.empty())\n      indexPrefix = opt::prefix;\n    else\n    {\n      if(!opt::targetFile.empty())\n        indexPrefix = stripFilename(opt::targetFile);\n      else\n        indexPrefix = stripFilename(opt::readsFile);\n    }\n    BWT* pBWT = new BWT(indexPrefix + BWT_EXT, opt::sampleRate);\n    BWT* pRBWT = new BWT(indexPrefix + RBWT_EXT, opt::sampleRate);\n    OverlapAlgorithm* pOverlapper = new OverlapAlgorithm(pBWT, pRBWT, \n                                                         opt::errorRate, opt::seedLength, \n                                                         opt::seedStride, opt::bIrreducibleOnly);\n\n    pOverlapper->setExactModeOverlap(opt::errorRate <= 0.0001);\n    pOverlapper->setExactModeIrreducible(opt::errorRate <= 0.0001);\n\n    Timer* pTimer = new Timer(PROGRAM_IDENT);\n    pBWT->printInfo();\n\n    // Make a prefix for the temporary hits files\n    std::string outPrefix;\n    outPrefix = stripFilename(opt::readsFile);\n    if(!opt::targetFile.empty())\n    {\n        outPrefix.append(1, '.');\n        outPrefix.append(stripFilename(opt::targetFile));\n    }\n\n    if(opt::numThreads <= 1)\n    {\n        printf(\"[%s] starting serial-mode overlap computation\\n\", PROGRAM_IDENT);\n        computeHitsSerial(outPrefix, opt::readsFile, pOverlapper, opt::minOverlap, hitsFilenames, pASQGWriter);\n    }\n    else\n    {\n        printf(\"[%s] starting parallel-mode overlap computation with %d threads\\n\", PROGRAM_IDENT, opt::numThreads);\n        computeHitsParallel(opt::numThreads, outPrefix, opt::readsFile, pOverlapper, opt::minOverlap, hitsFilenames, pASQGWriter);\n    }\n\n    // Get the number of strings in the BWT, this is used to pre-allocated the read table\n    delete pOverlapper;\n    delete pBWT; \n    delete pRBWT;\n\n    // Parse the hits files and write the overlaps to the ASQG file\n    convertHitsToASQG(indexPrefix, hitsFilenames, pASQGWriter);\n\n    // Cleanup\n    delete pASQGWriter;\n    delete pTimer;\n    if(opt::numThreads > 1)\n        pthread_exit(NULL);\n\n    return 0;\n}\n\n// Compute the hits for each read in the input file without threading\n// Return the number of reads processed\nsize_t computeHitsSerial(const std::string& prefix, const std::string& readsFile, \n                         const OverlapAlgorithm* pOverlapper, int minOverlap, \n                         StringVector& filenameVec, std::ostream* pASQGWriter)\n{\n    std::string filename = prefix + HITS_EXT + GZIP_EXT;\n    filenameVec.push_back(filename);\n\n    OverlapProcess processor(filename, pOverlapper, minOverlap);\n    OverlapPostProcess postProcessor(pASQGWriter, pOverlapper);\n\n    size_t numProcessed = \n           SequenceProcessFramework::processSequencesSerial<SequenceWorkItem,\n                                                            OverlapResult, \n                                                            OverlapProcess, \n                                                            OverlapPostProcess>(readsFile, &processor, &postProcessor);\n    return numProcessed;\n}\n\n// Compute the hits for each read in the SeqReader file with threading\n// The way this works is we create a vector of numThreads OverlapProcess pointers and \n// pass this to the SequenceProcessFramework which wraps the processes\n// in threads and distributes the reads to each thread.\n// The number of reads processsed is returned\nsize_t computeHitsParallel(int numThreads, const std::string& prefix, const std::string& readsFile, \n                           const OverlapAlgorithm* pOverlapper, int minOverlap, \n                           StringVector& filenameVec, std::ostream* pASQGWriter)\n{\n    std::string filename = prefix + HITS_EXT + GZIP_EXT;\n\n    std::vector<OverlapProcess*> processorVector;\n    for(int i = 0; i < numThreads; ++i)\n    {\n        std::stringstream ss;\n        ss << prefix << \"-thread\" << i << HITS_EXT << GZIP_EXT;\n        std::string outfile = ss.str();\n        filenameVec.push_back(outfile);\n        OverlapProcess* pProcessor = new OverlapProcess(outfile, pOverlapper, minOverlap);\n        processorVector.push_back(pProcessor);\n    }\n\n    // The post processing is performed serially so only one post processor is created\n    OverlapPostProcess postProcessor(pASQGWriter, pOverlapper);\n    \n    size_t numProcessed = \n           SequenceProcessFramework::processSequencesParallel<SequenceWorkItem,\n                                                              OverlapResult, \n                                                              OverlapProcess, \n                                                              OverlapPostProcess>(readsFile, processorVector, &postProcessor);\n    for(int i = 0; i < numThreads; ++i)\n        delete processorVector[i];\n    return numProcessed;\n}\n\n//\nvoid convertHitsToASQG(const std::string& indexPrefix, const StringVector& hitsFilenames, std::ostream* pASQGWriter)\n{\n    // Load the suffix array index and the reverse suffix array index\n    // Note these are not the full suffix arrays\n    SuffixArray* pFwdSAI = new SuffixArray(indexPrefix + SAI_EXT);\n    SuffixArray* pRevSAI = new SuffixArray(indexPrefix + RSAI_EXT);\n\n    // Load the ReadInfoTable for the queries to look up the ID and lengths of the hits\n    ReadInfoTable* pQueryRIT = new ReadInfoTable(opt::readsFile);\n\n   \n\n    // If the target file is not the query file, load its ReadInfoTable\n    ReadInfoTable* pTargetRIT;\n    if(!opt::targetFile.empty() && opt::targetFile != opt::readsFile)\n        pTargetRIT = new ReadInfoTable(opt::targetFile);\n    else\n        pTargetRIT = pQueryRIT;\n\n    bool bIsSelfCompare = pTargetRIT == pQueryRIT;\n\n    // Convert the hits to overlaps and write them to the asqg file as initial edges\n    for(StringVector::const_iterator iter = hitsFilenames.begin(); iter != hitsFilenames.end(); ++iter)\n    {\n        printf(\"[%s] parsing file %s\\n\", PROGRAM_IDENT, iter->c_str());\n        std::istream* pReader = createReader(*iter);\n    \n        // Read each hit sequentially, converting it to an overlap\n        std::string line;\n        while(getline(*pReader, line))\n        {\n            size_t readIdx;\n            size_t totalEntries;\n            bool isSubstring;\n            OverlapVector ov;\n            OverlapCommon::parseHitsString(line, pQueryRIT, pTargetRIT, pFwdSAI, pRevSAI, bIsSelfCompare, readIdx, totalEntries, ov, isSubstring);\n\t    std::cout << line << \" \" << bIsSelfCompare << \" \" << readIdx << \" \" << totalEntries << \" \" << isSubstring << \"\\n\";\n            for(OverlapVector::iterator iter = ov.begin(); iter != ov.end(); ++iter)\n            {\n                ASQG::EdgeRecord edgeRecord(*iter);\n                edgeRecord.write(*pASQGWriter);\n            }\n        }\n        delete pReader;\n\n        // delete the hits file\n        //unlink(iter->c_str());\n    }\n\n    // Deallocate data\n    if(pTargetRIT != pQueryRIT)\n        delete pTargetRIT;\n    delete pFwdSAI;\n    delete pRevSAI;\n    delete pQueryRIT;\n}\n\n// \n// Handle command line arguments\n//\nvoid parseOverlapOptions(int argc, char** argv)\n{\n    bool die = false;\n    for (char c; (c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1;) \n    {\n        std::istringstream arg(optarg != NULL ? optarg : \"\");\n        switch (c) \n        {\n            case 'm': arg >> opt::minOverlap; break;\n            case 'o': arg >> opt::outFile; break;\n            case 'p': arg >> opt::prefix; break;\n            case 'e': arg >> opt::errorRate; break;\n            case 't': arg >> opt::numThreads; break;\n            case 'l': arg >> opt::seedLength; break;\n            case 's': arg >> opt::seedStride; break;\n            case 'd': arg >> opt::sampleRate; break;\n            case 'f': arg >> opt::targetFile; break;\n            case OPT_EXACT: opt::bExactIrreducible = true; break;\n            case 'x': opt::bIrreducibleOnly = false; break;\n            case '?': die = true; break;\n            case 'v': opt::verbose++; break;\n            case OPT_HELP:\n                std::cout << OVERLAP_USAGE_MESSAGE;\n                exit(EXIT_SUCCESS);\n            case OPT_VERSION:\n                std::cout << OVERLAP_VERSION_MESSAGE;\n                exit(EXIT_SUCCESS);\n        }\n    }\n\n    if (argc - optind < 1) \n    {\n        std::cerr << SUBPROGRAM \": missing arguments\\n\";\n        die = true;\n    } \n    else if (argc - optind > 1) \n    {\n        std::cerr << SUBPROGRAM \": too many arguments\\n\";\n        die = true;\n    }\n\n    if(opt::numThreads <= 0)\n    {\n        std::cerr << SUBPROGRAM \": invalid number of threads: \" << opt::numThreads << \"\\n\";\n        die = true;\n    }\n\n    if(!IS_POWER_OF_2(opt::sampleRate))\n    {\n        std::cerr << SUBPROGRAM \": invalid parameter to -d/--sample-rate, must be power of 2. got: \" << opt::sampleRate << \"\\n\";\n        die = true;\n    }\n\n    if (die) \n    {\n        std::cout << \"\\n\" << OVERLAP_USAGE_MESSAGE;\n        exit(EXIT_FAILURE);\n    }\n\n    // Validate parameters\n    if(opt::errorRate <= 0)\n        opt::errorRate = 0.0f;\n    \n    if(opt::seedLength < 0)\n        opt::seedLength = 0;\n\n    if(opt::seedLength > 0 && opt::seedStride <= 0)\n        opt::seedStride = opt::seedLength;\n    \n    // Parse the input filenames\n    opt::readsFile = argv[optind++];\n\n    if(opt::outFile.empty())\n    {\n        std::string prefix = stripFilename(opt::readsFile);\n        if(!opt::targetFile.empty())\n        {\n            prefix.append(1,'.');\n            prefix.append(stripFilename(opt::targetFile));\n        }\n        opt::outFile = prefix + ASQG_EXT + GZIP_EXT;\n    }\n}\n"
  },
  {
    "path": "src/SGA/SGA/overlap.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// overlap - Overlap reads using a bwt\n//\n#ifndef OVERLAP_H\n#define OVERLAP_H\n#include <getopt.h>\n//#include \"config.h\"\n#include \"SuffixTools/BWT.h\"\n#include \"Match.h\"\n#include \"BWTAlgorithms.h\"\n#include \"OverlapAlgorithm.h\"\n#include <unistd.h>\n\n// functions\n\n//\nint overlapMain(int argc, char** argv);\n\n// options\nvoid parseOverlapOptions(int argc, char** argv);\n\n#endif\n"
  },
  {
    "path": "src/SGA/SQG/ASQG.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ASQG - Definitions and functions\n// for handling ASGQ files\n//\n#include \"ASQG.h\"\n#include <iterator>\n\nnamespace ASQG\n{\n\nconst int HEADER_VERSION = 1;\n\n// Record ID tags\nstatic constexpr int RECORD_TAG_SIZE = 2; // do not include null terminator \nstatic char HEADER_TAG[] = \"HT\";\nstatic char VERTEX_TAG[] = \"VT\";\nstatic char EDGE_TAG[] = \"ED\";\n\n// Header tags\nconst int FIELD_TAG_SIZE = 2;\nstatic char VERSION_TAG[] = \"VN\";\nstatic char OVERLAP_TAG[] = \"OL\";\nstatic char INPUT_FILE_TAG[] = \"IN\";\nstatic char ERROR_RATE_TAG[] = \"ER\";\nstatic char CONTAINMENT_TAG[] = \"CN\"; // 1 if the graph has containment edges/vertices\nstatic char TRANSITIVE_TAG[] = \"TE\"; // 1 if the graph has transitive edges\n\n// Vertex tags\nstatic char SUBSTRING_TAG[] = \"SS\";\n\n//\n// Header Record\n//\nHeaderRecord::HeaderRecord()\n{\n    setVersionTag(HEADER_VERSION);\n}\n\n//\nHeaderRecord::HeaderRecord(const std::string& recordLine)\n{\n    parse(recordLine);\n}\n\n//\nvoid HeaderRecord::setVersionTag(int version)\n{\n    m_versionTag.set(version);\n}\n\n//\nvoid HeaderRecord::setOverlapTag(int overlapLen)\n{\n    m_overlapTag.set(overlapLen);\n}\n\n//\nvoid HeaderRecord::setInputFileTag(const std::string& name)\n{\n    m_infileTag.set(name);\n}\n\n//\nvoid HeaderRecord::setErrorRateTag(float errorRate)\n{\n    m_errorRateTag.set(errorRate);\n}\n\n//\nvoid HeaderRecord::setContainmentTag(int v)\n{\n    m_containmentTag.set(v);\n}\n\n//\nvoid HeaderRecord::setTransitiveTag(int v)\n{\n    m_transitiveTag.set(v);\n}\n\n//\nvoid HeaderRecord::write(std::ostream& out)\n{\n    StringVector fields;\n    fields.push_back(HEADER_TAG);\n\n    // Check for mandatory tags\n    if(!m_versionTag.isInitialized())\n    {\n        std::cerr << \"Error: Header version tag not set, aborting.\" << std::endl;\n        exit(EXIT_FAILURE);\n    }\n    else\n    {\n        fields.push_back(m_versionTag.toTagString(VERSION_TAG));\n    }\n\n    if(m_errorRateTag.isInitialized())\n        fields.push_back(m_errorRateTag.toTagString(ERROR_RATE_TAG));\n\n    if(m_overlapTag.isInitialized())\n        fields.push_back(m_overlapTag.toTagString(OVERLAP_TAG));\n    \n    if(m_infileTag.isInitialized())\n        fields.push_back(m_infileTag.toTagString(INPUT_FILE_TAG));\n    \n    if(m_containmentTag.isInitialized())\n        fields.push_back(m_containmentTag.toTagString(CONTAINMENT_TAG));\n    \n    if(m_transitiveTag.isInitialized())\n        fields.push_back(m_transitiveTag.toTagString(TRANSITIVE_TAG));\n\n    writeFields(out, fields);\n}\n\n//JEREMIAH\nvoid HeaderRecord::write(std::stringstream& out)\n{\n    StringVector fields;\n    fields.push_back(HEADER_TAG);\n\n    // Check for mandatory tags\n    if(!m_versionTag.isInitialized())\n    {\n        std::cerr << \"Error: Header version tag not set, aborting.\" << std::endl;\n        exit(EXIT_FAILURE);\n    }\n    else\n    {\n        fields.push_back(m_versionTag.toTagString(VERSION_TAG));\n    }\n\n    if(m_errorRateTag.isInitialized())\n        fields.push_back(m_errorRateTag.toTagString(ERROR_RATE_TAG));\n\n    if(m_overlapTag.isInitialized())\n        fields.push_back(m_overlapTag.toTagString(OVERLAP_TAG));\n    \n    if(m_infileTag.isInitialized())\n        fields.push_back(m_infileTag.toTagString(INPUT_FILE_TAG));\n    \n    if(m_containmentTag.isInitialized())\n        fields.push_back(m_containmentTag.toTagString(CONTAINMENT_TAG));\n    \n    if(m_transitiveTag.isInitialized())\n        fields.push_back(m_transitiveTag.toTagString(TRANSITIVE_TAG));\n\n    writeFields(out, fields);\n}\n\n\n//\nvoid HeaderRecord::parse(const std::string& record)\n{\n    if(record.size() < 2)\n    {\n        std::cerr << \"Error: Record is not valid\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    // Tokenize record\n    StringVector tokens = SQG::tokenizeRecord(record);\n\n    // Ensure the first token indicates this is a valid header record\n    if(tokens[0].compare(0, RECORD_TAG_SIZE, HEADER_TAG) != 0)\n    {\n        std::cerr << \"Error: Record does not have a header tag\" << std::endl;\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    for(size_t i = 1; i < tokens.size(); ++i)\n    {\n        static char VERSION_TAG[] = \"VN\";\n        static char OVERLAP_TAG[] = \"OL\";\n        static char INPUT_FILE_TAG[] = \"IN\";\n        static char ERROR_RATE_TAG[] = \"ER\";\n        \n        if(tokens[i].compare(0, FIELD_TAG_SIZE, VERSION_TAG) == 0)\n            m_versionTag.fromString(tokens[i]);\n\n        if(tokens[i].compare(0, FIELD_TAG_SIZE, OVERLAP_TAG) == 0)\n            m_overlapTag.fromString(tokens[i]);\n\n        if(tokens[i].compare(0, FIELD_TAG_SIZE, INPUT_FILE_TAG) == 0)\n            m_infileTag.fromString(tokens[i]);\n\n        if(tokens[i].compare(0, FIELD_TAG_SIZE, ERROR_RATE_TAG) == 0)\n            m_errorRateTag.fromString(tokens[i]);\n\n        if(tokens[i].compare(0, FIELD_TAG_SIZE, CONTAINMENT_TAG) == 0)\n            m_containmentTag.fromString(tokens[i]);\n        \n        if(tokens[i].compare(0, FIELD_TAG_SIZE, TRANSITIVE_TAG) == 0)\n            m_transitiveTag.fromString(tokens[i]);\n\n    }\n}\n\n//\n// Vertex Record\n//\n//\nVertexRecord::VertexRecord(const std::string& recordLine)\n{\n    parse(recordLine);\n}\n\n//\nvoid VertexRecord::setSubstringTag(bool b)\n{\n    m_substringTag.set(b);\n}\n\n//\nvoid VertexRecord::write(std::ostream& out)\n{\n    StringVector fields;\n    fields.push_back(VERTEX_TAG);\n    fields.push_back(m_id);\n    fields.push_back(m_seq);\n\n    if(m_substringTag.isInitialized())\n        fields.push_back(m_substringTag.toTagString(SUBSTRING_TAG));\n\n    writeFields(out, fields);\n}\n\n//JEREMIAH\nvoid VertexRecord::write(std::stringstream& out)\n{\n    StringVector fields;\n    fields.push_back(VERTEX_TAG);\n    fields.push_back(m_id);\n    fields.push_back(m_seq);\n\n    if(m_substringTag.isInitialized())\n        fields.push_back(m_substringTag.toTagString(SUBSTRING_TAG));\n\n    writeFields(out, fields);\n}\n\n\n\n//\nvoid VertexRecord::parse(const std::string& record)\n{\n    if(record.size() < 2)\n    {\n        std::cerr << \"Error: Record is not valid\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    // Tokenize record\n    StringVector tokens = SQG::tokenizeRecord(record);\n\n    if(tokens.size() < 3)\n    {\n        std::cerr << \"Error: Vertex record is incomplete.\\n\";\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    // Ensure the first token indicates this is a valid vertex record\n    if(tokens[0].compare(0, RECORD_TAG_SIZE, VERTEX_TAG) != 0)\n    {\n        std::cerr << \"Error: Record does not have a vertex tag\" << std::endl;\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    m_id = tokens[1];\n    m_seq = tokens[2];\n    \n    for(size_t i = 3; i < tokens.size(); ++i)\n    {\n        if(tokens[i].compare(0, FIELD_TAG_SIZE, SUBSTRING_TAG) == 0)\n            m_substringTag.fromString(tokens[i]);\n    }    \n}\n\n\n\n//\n// EdgeRecord\n//\nEdgeRecord::EdgeRecord(const std::string& recordLine)\n{\n    parse(recordLine);\n}\n\n//\nvoid EdgeRecord::write(std::ostream& out)\n{\n    StringVector fields;\n    fields.push_back(EDGE_TAG);\n    std::stringstream ss;\n    ss << m_overlap;\n    fields.push_back(ss.str());\n    writeFields(out, fields);\n}\n\n//\nvoid EdgeRecord::parse(const std::string& record)\n{\n    if(record.size() < 2)\n    {\n        std::cerr << \"Error: Record is not valid\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    // Tokenize record\n    StringVector tokens = SQG::tokenizeRecord(record);\n\n    if(tokens.size() < 2)\n    {\n        std::cerr << \"Error: Edge record is incomplete.\\n\";\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    // Ensure the first token indicates this is a valid edge record\n    if(tokens[0].compare(EDGE_TAG) != 0)\n    {\n        std::cerr << \"Error: Record does not have an edge tag\" << std::endl;\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    // Parse the overlap\n    std::stringstream ssparser(tokens[1]);\n    ssparser >> m_overlap;\n}\n\n//\n//\n//\nRecordType getRecordType(const std::string& record)\n{\n    // the record type is the first two characters of the record\n    if(record.size() < 2)\n    {\n        std::cerr << \"Error: record does not have a valid record-type tag\" << std::endl;\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    char recordTag[RECORD_TAG_SIZE];\n    record.copy(recordTag, RECORD_TAG_SIZE);\n\n    if(strncmp(recordTag, HEADER_TAG, RECORD_TAG_SIZE) == 0)\n    {\n        return RT_HEADER;\n    }\n\n    if(strncmp(recordTag, VERTEX_TAG, RECORD_TAG_SIZE) == 0)\n    {\n        return RT_VERTEX;\n    }\n\n    if(strncmp(recordTag, EDGE_TAG, RECORD_TAG_SIZE) == 0)\n    {\n        return RT_EDGE;\n    }\n\n    // Unknown tag\n    std::cerr << \"Error: Unknown ASQG file record tag: \" << recordTag << std::endl;\n    exit(EXIT_FAILURE);\n}\n\nvoid writeFields(std::ostream& out, const StringVector& fields)\n{\n    for(size_t i = 0; i < fields.size(); ++i)\n    {\n        out << fields[i];\n        if(i != fields.size() - 1)\n            out << SQG::FIELD_SEP;\n    }\n    out << \"\\n\";\n}\n\n}\n\n"
  },
  {
    "path": "src/SGA/SQG/ASQG.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ASQG - Definitions and functions\n// for handling ASGQ files\n//\n#ifndef ASQG_H\n#define ASQG_H\n\n#include \"SQG.h\"\n#include \"Match.h\"\n\nnamespace ASQG\n{\n    enum RecordType\n    {\n        RT_HEADER = 0,\n        RT_VERTEX,\n        RT_EDGE\n    };\n\n    // A header record is just a tag:value pairs\n    struct HeaderRecord\n    {\n        public:\n            HeaderRecord();\n            HeaderRecord(const std::string& recordLine);\n            \n            void setOverlapTag(int overlapLen);\n            void setInputFileTag(const std::string& name);\n            void setErrorRateTag(float errorRate);\n            void setContainmentTag(int v);\n            void setTransitiveTag(int v);\n\n            const SQG::IntTag& getVersionTag() const { return m_versionTag; }\n            const SQG::FloatTag& getErrorRateTag() const { return m_errorRateTag; }\n            const SQG::StringTag& getInfileTag() const { return m_infileTag; }\n            const SQG::IntTag& getOverlapTag() const { return m_overlapTag; }\n            const SQG::IntTag& getContainmentTag() const { return m_containmentTag; };\n            const SQG::IntTag& getTransitiveTag() const { return m_transitiveTag; };\n\n            void write(std::ostream& out);\n            void write(std::stringstream& out); // JEREMIAH\n            void parse(const std::string& record);\n\n        private:\n\n            void setVersionTag(int version);\n            \n            SQG::IntTag m_versionTag;\n            SQG::FloatTag m_errorRateTag;\n            SQG::StringTag m_infileTag;\n            SQG::IntTag m_overlapTag;\n            SQG::IntTag m_containmentTag;\n            SQG::IntTag m_transitiveTag;\n    };\n\n    // A vertex record is an id, sequence and an array of\n    // tag:value \n    struct VertexRecord\n    {\n        public:\n            VertexRecord() {}\n            VertexRecord(const std::string& recordLine);\n            VertexRecord(const std::string& i, const std::string& s) : m_id(i), m_seq(s) {}\n\n            void setSubstringTag(bool b);\n            \n            const std::string& getID() const { return m_id; }\n            const std::string& getSeq() const { return m_seq; }\n            const SQG::IntTag& getSubstringTag() const { return m_substringTag; }\n\n            void write(std::ostream& out);\n            void write(std::stringstream& out);\n            void parse(const std::string& record);\n\n        private:\n\n            std::string m_id;\n            std::string m_seq;\n            SQG::IntTag m_substringTag;\n    };\n\n    // An edge record is just an overlap object and tag:values\n    struct EdgeRecord\n    {\n        public:\n            EdgeRecord() {}\n            EdgeRecord(const std::string& recordLine);\n            EdgeRecord(const Overlap& o) : m_overlap(o) {}\n\n            const Overlap& getOverlap() const { return m_overlap; }\n\n            void write(std::ostream& out);\n            void parse(const std::string& record);\n\n        private:\n        \n            Overlap m_overlap;\n    };\n\n    // Parsing functions\n    RecordType getRecordType(const std::string& record);\n    HeaderRecord parseHeaderRecord(const std::string& record);\n    VertexRecord parseVertexRecord(const std::string& record);\n    EdgeRecord parseEdgeRecord(const std::string& record);\n\n    // Writing functions\n    void writeFields(std::ostream& out, const StringVector& fields);\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SQG/Makefile.am",
    "content": "noinst_LIBRARIES = libsqg.a\n\nlibsqg_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/src/SGA/Thirdparty \\\n\t-I$(top_srcdir)/src/SGA/Util\n\n\nlibsqg_a_SOURCES = \\\n        SQG.h SQG.cpp \\\n\t\tASQG.h ASQG.cpp\n"
  },
  {
    "path": "src/SGA/SQG/Makefile.in",
    "content": "# Makefile.in generated by automake 1.16.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2018 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nsubdir = src/SGA/SQG\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLIBRARIES = $(noinst_LIBRARIES)\nAR = ar\nARFLAGS = cru\nAM_V_AR = $(am__v_AR_@AM_V@)\nam__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)\nam__v_AR_0 = @echo \"  AR      \" $@;\nam__v_AR_1 = \nlibsqg_a_AR = $(AR) $(ARFLAGS)\nlibsqg_a_LIBADD =\nam_libsqg_a_OBJECTS = libsqg_a-SQG.$(OBJEXT) libsqg_a-ASQG.$(OBJEXT)\nlibsqg_a_OBJECTS = $(am_libsqg_a_OBJECTS)\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__maybe_remake_depfiles = depfiles\nam__depfiles_remade = ./$(DEPDIR)/libsqg_a-ASQG.Po \\\n\t./$(DEPDIR)/libsqg_a-SQG.Po\nam__mv = mv -f\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nAM_V_CXX = $(am__v_CXX_@AM_V@)\nam__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)\nam__v_CXX_0 = @echo \"  CXX     \" $@;\nam__v_CXX_1 = \nCXXLD = $(CXX)\nCXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \\\n\t-o $@\nAM_V_CXXLD = $(am__v_CXXLD_@AM_V@)\nam__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)\nam__v_CXXLD_0 = @echo \"  CXXLD   \" $@;\nam__v_CXXLD_1 = \nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libsqg_a_SOURCES)\nDIST_SOURCES = $(libsqg_a_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_CXXFLAGS = @AM_CXXFLAGS@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nOBJEXT = @OBJEXT@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild_alias = @build_alias@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost_alias = @host_alias@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nnoinst_LIBRARIES = libsqg.a\nlibsqg_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/src/SGA/Thirdparty \\\n\t-I$(top_srcdir)/src/SGA/Util\n\nlibsqg_a_SOURCES = \\\n        SQG.h SQG.cpp \\\n\t\tASQG.h ASQG.cpp\n\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .cpp .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/SGA/SQG/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/SGA/SQG/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLIBRARIES:\n\t-test -z \"$(noinst_LIBRARIES)\" || rm -f $(noinst_LIBRARIES)\n\nlibsqg.a: $(libsqg_a_OBJECTS) $(libsqg_a_DEPENDENCIES) $(EXTRA_libsqg_a_DEPENDENCIES) \n\t$(AM_V_at)-rm -f libsqg.a\n\t$(AM_V_AR)$(libsqg_a_AR) libsqg.a $(libsqg_a_OBJECTS) $(libsqg_a_LIBADD)\n\t$(AM_V_at)$(RANLIB) libsqg.a\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsqg_a-ASQG.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsqg_a-SQG.Po@am__quote@ # am--include-marker\n\n$(am__depfiles_remade):\n\t@$(MKDIR_P) $(@D)\n\t@echo '# dummy' >$@-t && $(am__mv) $@-t $@\n\nam--depfiles: $(am__depfiles_remade)\n\n.cpp.o:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<\n\n.cpp.obj:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\nlibsqg_a-SQG.o: SQG.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsqg_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsqg_a-SQG.o -MD -MP -MF $(DEPDIR)/libsqg_a-SQG.Tpo -c -o libsqg_a-SQG.o `test -f 'SQG.cpp' || echo '$(srcdir)/'`SQG.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsqg_a-SQG.Tpo $(DEPDIR)/libsqg_a-SQG.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SQG.cpp' object='libsqg_a-SQG.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsqg_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsqg_a-SQG.o `test -f 'SQG.cpp' || echo '$(srcdir)/'`SQG.cpp\n\nlibsqg_a-SQG.obj: SQG.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsqg_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsqg_a-SQG.obj -MD -MP -MF $(DEPDIR)/libsqg_a-SQG.Tpo -c -o libsqg_a-SQG.obj `if test -f 'SQG.cpp'; then $(CYGPATH_W) 'SQG.cpp'; else $(CYGPATH_W) '$(srcdir)/SQG.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsqg_a-SQG.Tpo $(DEPDIR)/libsqg_a-SQG.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SQG.cpp' object='libsqg_a-SQG.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsqg_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsqg_a-SQG.obj `if test -f 'SQG.cpp'; then $(CYGPATH_W) 'SQG.cpp'; else $(CYGPATH_W) '$(srcdir)/SQG.cpp'; fi`\n\nlibsqg_a-ASQG.o: ASQG.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsqg_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsqg_a-ASQG.o -MD -MP -MF $(DEPDIR)/libsqg_a-ASQG.Tpo -c -o libsqg_a-ASQG.o `test -f 'ASQG.cpp' || echo '$(srcdir)/'`ASQG.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsqg_a-ASQG.Tpo $(DEPDIR)/libsqg_a-ASQG.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='ASQG.cpp' object='libsqg_a-ASQG.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsqg_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsqg_a-ASQG.o `test -f 'ASQG.cpp' || echo '$(srcdir)/'`ASQG.cpp\n\nlibsqg_a-ASQG.obj: ASQG.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsqg_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsqg_a-ASQG.obj -MD -MP -MF $(DEPDIR)/libsqg_a-ASQG.Tpo -c -o libsqg_a-ASQG.obj `if test -f 'ASQG.cpp'; then $(CYGPATH_W) 'ASQG.cpp'; else $(CYGPATH_W) '$(srcdir)/ASQG.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsqg_a-ASQG.Tpo $(DEPDIR)/libsqg_a-ASQG.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='ASQG.cpp' object='libsqg_a-ASQG.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsqg_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsqg_a-ASQG.obj `if test -f 'ASQG.cpp'; then $(CYGPATH_W) 'ASQG.cpp'; else $(CYGPATH_W) '$(srcdir)/ASQG.cpp'; fi`\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(BUILT_SOURCES)\n\t$(MAKE) $(AM_MAKEFLAGS) distdir-am\n\ndistdir-am: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LIBRARIES)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am\n\ndistclean: distclean-am\n\t\t-rm -f ./$(DEPDIR)/libsqg_a-ASQG.Po\n\t-rm -f ./$(DEPDIR)/libsqg_a-SQG.Po\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t\t-rm -f ./$(DEPDIR)/libsqg_a-ASQG.Po\n\t-rm -f ./$(DEPDIR)/libsqg_a-SQG.Po\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \\\n\tclean-generic clean-noinstLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/SGA/SQG/SQG.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SQG - Common functions for parsing \n// assembly and sequence graph files\n//\n#include \"SQG.h\"\n\nnamespace SQG\n{\n\n//\nStringVector tokenizeRecord(const std::string& record)\n{\n    return split(record, FIELD_SEP);\n}\n\n//\nStringVector tokenizeTagValue(const std::string& tagValue)\n{\n    return split(tagValue, TAG_SEP);\n}\n\n}\n"
  },
  {
    "path": "src/SGA/SQG/SQG.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SQG - Common definitions and functions for parsing \n// assembly and sequence graph files\n//\n#ifndef SQG_H\n#define SQG_H\n\n#include <vector>\n#include <string>\n#include \"Util.h\"\n\nnamespace SQG\n{\n    //\n    const char FIELD_SEP = '\\t';\n    const char TAG_SEP = ':';\n\n    // getTypeCode must be defined for every type that TagValue can take\n    static inline char getTypeCode(int)                 { return 'i'; }\n    static inline char getTypeCode(char)                { return 'A'; }\n    static inline char getTypeCode(const std::string&)  { return 'Z'; }\n    static inline char getTypeCode(float)               { return 'f'; }\n\n\n    // Tokenize functions\n    StringVector tokenizeRecord(const std::string& record);\n    StringVector tokenizeTagValue(const std::string& tagValue);\n\n    // Two-state TagValue that allows the data value to be not set\n    template<typename T>\n    class TagValue\n    {\n        public:\n            TagValue() : m_isInitialized(false) {}\n            TagValue(const T& v) : m_isInitialized(true), m_value(v) {}\n\n            T get() const\n            {\n                assert(m_isInitialized);\n                return m_value;\n            }\n\n            void set(T v)\n            {\n                m_isInitialized = true;\n                m_value = v;\n            }\n\n            bool isInitialized() const\n            {\n                return m_isInitialized;\n            }\n\n            std::string toTagString(const char* tag)\n            {\n                std::stringstream ss;\n                char type_code = getTypeCode(m_value);\n                ss << tag << TAG_SEP << type_code << TAG_SEP << m_value;\n                return ss.str();\n            }\n\n            void fromString(const std::string& str)\n            {\n                StringVector tokens = tokenizeTagValue(str);\n                if(tokens.size() != 3)\n                {\n                    std::cerr << \"Incorrect format for tagged value\\n\";\n                    std::cerr << \"Field: \" << str << \"\\n\";\n                    exit(EXIT_FAILURE);\n                }\n\n                if(tokens[1].size() != 1 && tokens[1][0] != getTypeCode(m_value))\n                {\n                    std::cerr << \"Unexpected type in tagged value. Expected: \" << getTypeCode(m_value);\n                    std::cerr << \" Found: \" << tokens[1] << \"\\n\";\n                    exit(EXIT_FAILURE);\n                }\n\n                std::stringstream ss(tokens[2]);\n                ss >> m_value;\n                m_isInitialized = true;\n            }\n        \n        private:\n            T m_value;\n            bool m_isInitialized;\n    };\n\n    // These are the valid tags that can be used\n    typedef TagValue<char> CharTag;\n    typedef TagValue<int> IntTag;\n    typedef TagValue<float> FloatTag;\n    typedef TagValue<std::string> StringTag;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/StringGraph/CompleteOverlapSet.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// CompleteOverlapSet - A collection of all\n// valid overlaps for a given vertex. This is\n// inferred from the structure of a transitive reduced\n// graph\n//\n#include \"CompleteOverlapSet.h\"\n\n// \nCompleteOverlapSet::CompleteOverlapSet(const Vertex* pVertex, double maxER, int minLength) : m_pX(pVertex), m_maxER(maxER), m_minLength(minLength)\n{\n    m_cost = 0;\n    //iterativeConstruct();\n    constructBFS();\n    //constructMap();\n}\n\n// Perform a breadth-first search of the graph, accumulating all the valid\n// overlaps of reads to m_pX. \n// Precondition: All vertices in the graph are colored GC_WHTE\nvoid CompleteOverlapSet::constructBFS()\n{\n    EdgeDescList markedList;\n    ExploreQueue queue;\n    EdgePtrVec edges = m_pX->getEdges();\n    for(size_t i = 0; i < edges.size(); ++i)\n    {\n        Edge* pEdge = edges[i];\n        EdgeDesc ed = pEdge->getDesc();\n        Overlap ovr = pEdge->getOverlap();\n        ed.pVertex->setColor(GC_GRAY);\n        queue.push(ExploreElement(ed, ovr));\n    }\n\n    while(!queue.empty())\n    {\n        ExploreElement ee = queue.front();\n        queue.pop();\n        //\n        EdgeDesc& edXY = ee.ed;\n        Vertex* pY = edXY.pVertex;\n        Overlap& ovrXY = ee.ovr;\n        int overlapLen = ovrXY.getOverlapLength(0);\n        markedList.push_back(edXY);\n        \n        // Check if the overlap between this node and m_pX is valid\n        if(overlapLen >= m_minLength)\n        {\n            double error_rate = SGAlgorithms::calcErrorRate(m_pX, pY, ovrXY);\n            if(isErrorRateAcceptable(error_rate, m_maxER))\n            {\n                // Mark the vertex as valid\n                pY->setColor(GC_BLACK);\n                m_overlapMap.insert(std::make_pair(edXY, ovrXY));\n            }\n            else\n            {\n                pY->setColor(GC_RED);\n            }\n        }\n        else\n        {\n            pY->setColor(GC_RED);\n        }\n\n        // Enqueue neighbors\n        EdgePtrVec neighborEdges = pY->getEdges();\n        for(size_t i = 0; i < neighborEdges.size(); ++i)\n        {\n            Edge* pEdgeYZ = neighborEdges[i];\n            Vertex* pZ = pEdgeYZ->getEnd();\n            if(pZ == m_pX || pZ->getColor() != GC_WHITE)\n                continue;\n\n            Overlap ovrYZ = pEdgeYZ->getOverlap();\n            // Check that this vertex actually overlaps pX\n            if(SGAlgorithms::hasTransitiveOverlap(ovrXY, ovrYZ))\n            {\n                Overlap ovrXZ = SGAlgorithms::inferTransitiveOverlap(ovrXY, ovrYZ);\n                EdgeDesc edXZ = SGAlgorithms::overlapToEdgeDesc(pZ, ovrXZ);\n\n                if(ovrXZ.getOverlapLength(0) >= m_minLength)\n                {\n                    pZ->setColor(GC_GRAY);\n                    queue.push(ExploreElement(edXZ, ovrXZ));\n                }\n            }\n        }\n    }\n\n    // reset colors\n    for(EdgeDescList::iterator iter = markedList.begin(); iter != markedList.end(); ++iter)\n        iter->pVertex->setColor(GC_WHITE);\n}\n\n// Perform a breadth-first search of the graph, accumulating all the valid\n// overlaps of reads to m_pX\nvoid CompleteOverlapSet::iterativeConstruct()\n{\n    m_cost = 0;\n    ExplorePriorityQueue queue;\n\n    // We store the overlaps that do not meet the overlap parameters\n    // in this map. The neighbors of these vertices might have valid\n    // overlaps to m_pX so they must still be explored.\n    SGAlgorithms::EdgeDescOverlapMap exclusionMap;\n\n    // Add first-order overlaps\n    EdgePtrVec edges = m_pX->getEdges();\n    for(size_t i = 0; i < edges.size(); ++i)\n    {\n        Edge* pEdge = edges[i];\n        EdgeDesc ed = pEdge->getDesc();\n        Overlap ovr = pEdge->getOverlap();\n\n        double error_rate = SGAlgorithms::calcErrorRate(m_pX, pEdge->getEnd(), ovr);\n        int overlapLen = ovr.getOverlapLength(0);\n        if(isErrorRateAcceptable(error_rate, m_maxER) && overlapLen >= m_minLength)\n        {\n            m_overlapMap.insert(std::make_pair(ed, ovr));\n            queue.push(ExploreElement(ed, ovr));\n        }\n        else\n        {\n            exclusionMap.insert(std::make_pair(ed, ovr));\n            queue.push(ExploreElement(ed, ovr));\n        }\n    }\n\n    while(!queue.empty())\n    {\n        ExploreElement ee = queue.top();\n        queue.pop();\n\n        EdgeDesc& edXY = ee.ed;\n        Overlap& ovrXY = ee.ovr;\n        \n        // Add the overlaps of Y\n        Vertex* pY = edXY.pVertex;\n        EdgePtrVec neighborEdges = pY->getEdges();\n\n        for(size_t i = 0; i < neighborEdges.size(); ++i)\n        {\n            Edge* pEdgeYZ = neighborEdges[i];\n            Vertex* pZ = pEdgeYZ->getEnd();\n            if(pZ == m_pX)\n                continue;\n\n            Overlap ovrYZ = pEdgeYZ->getOverlap();\n            // Check that this vertex actually overlaps pX\n            if(SGAlgorithms::hasTransitiveOverlap(ovrXY, ovrYZ))\n            {\n                ++m_cost;\n                Overlap ovrXZ = SGAlgorithms::inferTransitiveOverlap(ovrXY, ovrYZ);\n                \n                EdgeDesc edXZ = SGAlgorithms::overlapToEdgeDesc(pZ, ovrXZ);\n\n                double error_rate = SGAlgorithms::calcErrorRate(m_pX, pZ, ovrXZ);\n                int overlapLen = ovrXZ.getOverlapLength(0);\n\n                if(isErrorRateAcceptable(error_rate, m_maxER) && overlapLen >= m_minLength)\n                {\n                    // Overlap is valid\n                    SGAlgorithms::EdgeDescOverlapMap::iterator findIter = m_overlapMap.find(edXZ);\n                    \n                    if(findIter == m_overlapMap.end())\n                    {\n                        m_overlapMap.insert(std::make_pair(edXZ, ovrXZ));\n                        queue.push(ExploreElement(edXZ, ovrXZ));\n                    }\n                    else if(ovrXZ.getOverlapLength(0) > findIter->second.getOverlapLength(0))\n                    {\n                        findIter->second = ovrXZ;\n                        queue.push(ExploreElement(edXZ, ovrXZ));\n                    }   \n                }\n                else\n                {\n                    // Overlap is invalid\n                    SGAlgorithms::EdgeDescOverlapMap::iterator findIter = exclusionMap.find(edXZ);\n                    if(findIter == exclusionMap.end())\n                    {\n                        exclusionMap.insert(std::make_pair(edXZ, ovrXZ));\n                        queue.push(ExploreElement(edXZ, ovrXZ));\n                    }\n                    else if(overlapLen > findIter->second.getOverlapLength(0))\n                    {\n                        findIter->second = ovrXZ;\n                        queue.push(ExploreElement(edXZ, ovrXZ));\n                    }\n                }\n            }\n        }\n    }\n}\n\n//\nvoid CompleteOverlapSet::constructMap()\n{\n    EdgePtrVec edges = m_pX->getEdges();\n\n    // Add the primary overlaps to the map, and all the nodes reachable from the primaries\n    for(size_t i = 0; i < edges.size(); ++i)\n    {\n        Edge* pEdge = edges[i];\n        EdgeDesc ed = pEdge->getDesc();\n        Overlap ovr = pEdge->getOverlap();\n\n        if(ovr.isContainment())\n            continue;\n        m_overlapMap.insert(std::make_pair(ed, ovr));\n\n        // Recursively add neighbors\n        recursiveConstruct(ed, ovr, 1, ovr.getOverlapLength(0));\n    }\n}\n\n// Recursively add overlaps to pX inferred from the edges of pY to outMap\nvoid CompleteOverlapSet::recursiveConstruct(const EdgeDesc& edXY, const Overlap& ovrXY, int depth, int)\n{\n    //std::cout << \"depth: \" << depth << \" \" << distance << \" \" << ovrXY << \"\\n\";\n    Vertex* pY = edXY.pVertex;\n\n    EdgePtrVec neighborEdges = pY->getEdges();\n\n    for(size_t i = 0; i < neighborEdges.size(); ++i)\n    {\n        Edge* pEdgeYZ = neighborEdges[i];\n        Vertex* pZ = pEdgeYZ->getEnd();\n        if(pZ != m_pX)\n        {\n            Overlap ovrYZ = pEdgeYZ->getOverlap();\n            if(ovrYZ.isContainment())\n                continue;\n            // Check that this vertex actually overlaps pX\n            if(SGAlgorithms::hasTransitiveOverlap(ovrXY, ovrYZ))\n            {\n                Overlap ovrXZ = SGAlgorithms::inferTransitiveOverlap(ovrXY, ovrYZ);\n                EdgeDesc edXZ = SGAlgorithms::overlapToEdgeDesc(pZ, ovrXZ);\n                if(edXZ.dir != edXY.dir || ovrXZ.isContainment())\n                    continue;\n\n                double error_rate = SGAlgorithms::calcErrorRate(m_pX, pZ, ovrXZ);\n                int overlapLen = ovrXZ.getOverlapLength(0);\n\n                //std::cout << \"ovrXY \" << ovrXY << \"\\n\";\n                //std::cout << \"ovrYZ \" << ovrYZ << \"\\n\";\n                //std::cout << \"ovrXZ \" << ovrXZ << \"\\n\";\n                if(isErrorRateAcceptable(error_rate, m_maxER) && overlapLen >= m_minLength)\n                {\n                    SGAlgorithms::EdgeDescOverlapMap::iterator findIter = m_overlapMap.find(edXZ);\n                    \n                    if(findIter == m_overlapMap.end())\n                    {\n                        m_overlapMap.insert(std::make_pair(edXZ, ovrXZ));\n                        recursiveConstruct(edXZ, ovrXZ, depth + 1, ovrXZ.getOverlapLength(0));\n                    }\n                    else if(ovrXZ.getOverlapLength(0) > findIter->second.getOverlapLength(0))\n                    {\n                        findIter->second = ovrXZ;\n                        recursiveConstruct(edXZ, ovrXZ, depth + 1, ovrXZ.getOverlapLength(0));\n                    }   \n                }\n            }\n        }\n    }\n}\n\n// Compare the actual edges of m_pX with the edges in the overlap map\nvoid CompleteOverlapSet::getDiffMap(SGAlgorithms::EdgeDescOverlapMap& missingMap, SGAlgorithms::EdgeDescOverlapMap& extraMap)\n{\n    missingMap = m_overlapMap;\n    EdgePtrVec edges = m_pX->getEdges();\n\n    for(size_t i = 0; i < edges.size(); ++i)\n    {\n        EdgeDesc ed = edges[i]->getDesc();\n        SGAlgorithms::EdgeDescOverlapMap::iterator iter = missingMap.find(edges[i]->getDesc());\n        if(iter != missingMap.end())\n        {\n            missingMap.erase(iter);\n        }\n        else\n        {\n            Overlap ovr = edges[i]->getOverlap();\n            extraMap.insert(std::make_pair(ed, ovr));\n        }\n    }\n}\n\n// Reset the overlap parameters and filter edges\nvoid CompleteOverlapSet::resetParameters(double maxER, int minLength)\n{\n    m_maxER = maxER;\n    m_minLength = minLength;\n\n    // Filter out overlaps no longer meeting the criteria\n    SGAlgorithms::EdgeDescOverlapMap::iterator iter = m_overlapMap.begin();\n    while(iter != m_overlapMap.end())\n    {\n        double er = SGAlgorithms::calcErrorRate(m_pX, iter->first.pVertex, iter->second);\n        bool acceptER = isErrorRateAcceptable(er, m_maxER);\n        bool acceptLen = iter->second.getOverlapLength(0) >= m_minLength;\n        \n        if(!acceptER || !acceptLen)\n        {\n            //std::cout << \"Filtering \" << iter->second << \" flags: \" << acceptER << acceptLen << \"\\n\";\n            //std::cout << \"er: \" << er << \" len: \" << iter->second.getOverlapLength(0) << \"\\n\";\n            m_overlapMap.erase(iter++);\n        }\n        else\n            ++iter;\n    }\n}\n\n// Remove all overlaps to a particular vertex\nvoid CompleteOverlapSet::removeOverlapsTo(Vertex* pRemove)\n{\n    EdgeDesc ed;\n    ed.pVertex = pRemove;\n\n    for(int i = 0; i != ED_COUNT; ++i)\n    {\n        ed.dir = (EdgeDir)i;\n        ed.comp = EC_SAME;\n        m_overlapMap.erase(ed);\n        ed.comp = EC_REVERSE;\n        m_overlapMap.erase(ed);\n    }\n}\n\n// Remove all the transitive and containment relationships, leaving only the irreducible\nvoid CompleteOverlapSet::computeIrreducible(SGAlgorithms::EdgeDescOverlapMap* pTransitive, SGAlgorithms::EdgeDescOverlapMap* pContainments)\n{\n    SGAlgorithms::EdgeDescOverlapMap temp;\n    partitionOverlaps(&temp, pTransitive, pContainments);\n    m_overlapMap = temp;\n}\n\n// Partition the OverlapMap into edges that are containments, irreducible and transitive\n// If the pointer for an output map is NULL, simply discard the edges\nvoid CompleteOverlapSet::partitionOverlaps(SGAlgorithms::EdgeDescOverlapMap* pIrreducible, \n                                           SGAlgorithms::EdgeDescOverlapMap* pTransitive, \n                                           SGAlgorithms::EdgeDescOverlapMap* pContainment) const\n{\n    if(pIrreducible == NULL && pTransitive == NULL && pContainment == NULL)\n        return; // Nothing to do\n    m_cost = 0;\n    SGAlgorithms::EdgeDescOverlapMap workingMap;\n\n    // Stage 1, remove containments\n    for(SGAlgorithms::EdgeDescOverlapMap::const_iterator iter = m_overlapMap.begin();\n                                                   iter != m_overlapMap.end(); ++iter)\n    {\n        if(iter->second.isContainment())\n        {\n            if(pContainment != NULL)\n                pContainment->insert(*iter);\n        }\n        else\n        {\n            workingMap.insert(*iter);\n        }\n    }\n\n    // Stage 2, remove transitive edges\n    SGAlgorithms::partitionTransitiveOverlaps(&workingMap, pTransitive, m_maxER, m_minLength);\n\n    *pIrreducible = workingMap;\n}\n\n\n"
  },
  {
    "path": "src/SGA/StringGraph/CompleteOverlapSet.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// CompleteOverlapSet - A collection of all\n// valid overlaps for a given vertex. This is\n// inferred from the structure of a transitive reduced\n// graph\n//\n#ifndef COMPLETEOVERLAPSET_H\n#define COMPLETEOVERLAPSET_H\n\n#include \"Bigraph.h\"\n#include \"SGAlgorithms.h\"\n\n// Structure used for iterative exploration of the graph\n// The exploration starts at some vertex X, each element\n// holds a possible overlap between X and another vertex Y\nstruct ExploreElement\n{\n    ExploreElement(const EdgeDesc& e, const Overlap& o) : ed(e), ovr(o) {}\n    EdgeDesc ed;\n    Overlap ovr;\n};\n\n// Comparison operator used to compare ExploreElements\n// by the length of the overlap on vertex X\nstruct CompareExploreElemOverlapLength\n{\n    bool operator()(const ExploreElement& elemXY, const ExploreElement& elemXZ)\n    {\n        return elemXY.ovr.match.coord[0].length() < elemXZ.ovr.match.coord[0].length();\n    }\n};\n\n//\ntypedef std::priority_queue<ExploreElement, \n                            std::vector<ExploreElement>, \n                            CompareExploreElemOverlapLength> ExplorePriorityQueue;\ntypedef std::list<EdgeDesc> EdgeDescList;\ntypedef std::queue<ExploreElement> ExploreQueue;\n\nclass CompleteOverlapSet\n{\n    public:\n\n        CompleteOverlapSet(const Vertex* pVertex, double maxER, int minLength);\n\n        void getDiffMap(SGAlgorithms::EdgeDescOverlapMap& missingMap, SGAlgorithms::EdgeDescOverlapMap& extraMap);\n        void removeOverlapsTo(Vertex* pRemove);\n\n        // Remove all the transitive and containment relationships, leaving only the irreducible\n        // If the input pointers are not NULL, the transitive and containment overlaps will be placed\n        // in the appropriate map\n        void computeIrreducible(SGAlgorithms::EdgeDescOverlapMap* pTransitive, \n                                SGAlgorithms::EdgeDescOverlapMap* pContainments);\n        \n        void constructMap();\n        void recursiveConstruct(const EdgeDesc& edXY, const Overlap& ovrXY, int depth, int distance);\n\n        // Partition the OverlapMap into edges that are containments, irreducible and transitive\n        // If the pointer for an output map is NULL, simply discard the edges\n        void partitionOverlaps(SGAlgorithms::EdgeDescOverlapMap* pIrreducible, \n                               SGAlgorithms::EdgeDescOverlapMap* pTransitive, \n                               SGAlgorithms::EdgeDescOverlapMap* pContainment) const;\n\n        void resetParameters(double maxER, int minLength);\n        SGAlgorithms::EdgeDescOverlapMap getOverlapMap() const { return m_overlapMap; }\n        size_t size() const { return m_overlapMap.size(); }\n        size_t getCost() const { return m_cost; }\n    private:\n\n        // functions\n        void iterativeConstruct();\n        void constructBFS();\n\n        // data\n        SGAlgorithms::EdgeDescOverlapMap m_overlapMap;\n\n        // the vertex this set is centered on\n        const Vertex* m_pX;\n\n        double m_maxER;\n        int m_minLength;\n        mutable size_t m_cost;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/StringGraph/GraphSearchTree.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// GraphSearchTree - Generic data structure used for implementing\n// a breadth-first search of a bidirectional graph. It is designed\n// to return all possible walks between the given start\n// and end vertices, up to a given distance. Used to search a\n// string graph or scaffold graph.\n//\n#ifndef GRAPHSEARCHTREE_H\n#define GRAPHSEARCHTREE_H\n\n#include \"Bigraph.h\"\n#include \"SGWalk.h\"\n#include <deque>\n#include <queue>\n\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nclass GraphSearchNode\n{\n    // Typedefs\n    public:\n        typedef std::deque<GraphSearchNode<VERTEX,EDGE,DISTANCE>* > GraphSearchNodePtrDeque;\n        typedef std::vector<EDGE*> _EDGEPtrVector;\n\n    public:\n        GraphSearchNode(VERTEX* pVertex, EdgeDir expandDir, GraphSearchNode* pParent, EDGE* pEdgeFromParent, int distance);\n        ~GraphSearchNode();\n\n        // Reduce the child count by 1\n        void decrementChildren();\n\n        // Create the children of this node and place pointers to their nodes\n        // on the queue. Returns the number of children created;\n        int createChildren(GraphSearchNodePtrDeque& outQueue, const DISTANCE& distanceFunc);\n\n        GraphSearchNode* getParent() const { return m_pParent; }\n        VERTEX* getVertex() const { return m_pVertex; }\n        int64_t getDistance() const { return m_distance; }\n        EDGE* getEdgeFromParent() const { return m_pEdgeFromParent; }\n        int getNumChildren() const { return m_numChildren; }\n\n    private:\n\n        // data\n        VERTEX* m_pVertex;\n        EdgeDir m_expandDir;\n        GraphSearchNode* m_pParent;\n        EDGE* m_pEdgeFromParent;\n\n        int m_numChildren;\n        int64_t m_distance;\n};\n\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nclass GraphSearchTree\n{\n    // typedefs\n    typedef GraphSearchNode<VERTEX,EDGE,DISTANCE> _SearchNode;\n    typedef typename _SearchNode::GraphSearchNodePtrDeque _SearchNodePtrDeque;\n    typedef typename std::set<_SearchNode*> _SearchNodePtrSet;\n    typedef std::vector<EDGE*> WALK; // list of edges defines a walk through the graph\n    typedef std::vector<WALK> WALKVector; // vector of walks\n    \n    typedef std::vector<VERTEX*> VertexPtrVector;\n    typedef std::vector<VertexPtrVector> VertexPtrVectorVector;\n\n    public:\n\n        GraphSearchTree(VERTEX* pStartVertex, \n                     VERTEX* pEndVertex,\n                     EdgeDir searchDir,\n                     int64_t distanceLimit,\n                     size_t nodeLimit);\n\n        ~GraphSearchTree();\n\n        // Find connected components in the graph\n        // Takes in a vector of all the vertices in the graph\n        static void connectedComponents(VertexPtrVector allVertices, VertexPtrVectorVector& connectedComponents);\n\n        // Returns true if the search has converged on a single vertex. In\n        // other words, all walks from the start node share a common vertex,\n        // which is represented by one of the nodes waiting expansion.\n        // This function is the key to finding collapsed walks that represent\n        // complex variation bubbles. It is a heavy operation however, as the\n        // entire tree is search for each node in the expand queue. It should\n        // only be used on small trees.\n        // Returns true if the search converged and the pointer to the vertex\n        // is return in pConvergedVertex.\n        bool hasSearchConverged(VERTEX*& pConvergedVertex);\n\n        // build walks to a given vertex\n        template<typename BUILDER>\n        void buildWalksContainingVertex(VERTEX* pTarget, BUILDER& walkBuilder);\n\n        // Construct walks representing every path from the start node\n        template<typename BUILDER>\n        void buildWalksToAllLeaves(BUILDER& walkBuilder);\n\n        // Construct walks representing every path from the start vertex to the goal vertex\n        template<typename BUILDER>\n        void buildWalksToGoal(BUILDER& walkBuilder);\n                \n        // Expand all nodes in the queue a single time\n        // Returns false if the search has stopped\n        bool stepOnce();\n\n        // Check whether the search was aborted or not\n        bool wasSearchAborted() const { return m_searchAborted; }\n\n    private:\n\n        // Search the branch from pNode to the root for pX.  \n        bool searchBranchForVertex(_SearchNode* pNode, VERTEX* pX, _SearchNode*& pFoundNode) const;\n\n        // Build the walks from the root to the leaves in the queue\n        template<typename BUILDER>\n        void _buildWalksToLeaves(const _SearchNodePtrDeque& queue, BUILDER& walkBuilder);\n\n        //\n        void addEdgesFromBranch(_SearchNode* pNode, WALK& outEdges);\n\n        // Build a queue with all the leaves in it\n        void _makeFullLeafQueue(_SearchNodePtrDeque& completeQueue) const;\n\n        // print the branch sequence\n        void printBranch(_SearchNode* pNode) const;\n\n        // We keep the pointers to the search nodes\n        // in one of three queues. \n        // The goal queue contains the nodes representing the vertex we are searching for.\n        // The expand queue contains nodes that have not yet been explored.\n        // The done queue contains non-goal nodes that will not be expanded further.\n        // Together, they represent all leaves of the tree\n        _SearchNodePtrDeque m_goalQueue;\n        _SearchNodePtrDeque m_expandQueue;\n        _SearchNodePtrDeque m_doneQueue;\n        size_t m_totalNodes; // The total number of nodes in the search tree\n    \n        _SearchNode* m_pRootNode;\n        VERTEX* m_pGoalVertex;\n        EdgeDir m_initialDir;\n\n        int64_t m_distanceLimit;\n        size_t m_nodeLimit;\n\n        // Flag indicating the search was aborted\n        bool m_searchAborted;\n\n        // Distance functor\n        DISTANCE m_distanceFunc;\n};\n\n//\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nGraphSearchNode<VERTEX,EDGE,DISTANCE>::GraphSearchNode(VERTEX* pVertex,\n                           EdgeDir expandDir,\n                           GraphSearchNode<VERTEX,EDGE,DISTANCE>* pParent,\n                           EDGE* pEdgeFromParent,\n                           int distance) : m_pVertex(pVertex),\n                                                    m_expandDir(expandDir),\n                                                    m_pParent(pParent), \n                                                    m_pEdgeFromParent(pEdgeFromParent),\n                                                    m_numChildren(0)\n{\n    // Set the extension distance\n    if(m_pParent == NULL)\n    {\n        // this is the root node with distance 0\n        m_distance = 0;\n    }\n    else\n    {\n        assert(m_pEdgeFromParent != NULL);\n        m_distance = m_pParent->m_distance + distance;\n    }\n}\n\n// Delete this node and decrement the number of children\n// in the parent node. All children of a node must\n// be deleted before the parent\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nGraphSearchNode<VERTEX,EDGE,DISTANCE>::~GraphSearchNode()\n{\n    assert(m_numChildren == 0);\n    if(m_pParent != NULL)\n        m_pParent->decrementChildren();\n}\n\n//\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nvoid GraphSearchNode<VERTEX,EDGE,DISTANCE>::decrementChildren()\n{\n    assert(m_numChildren != 0);\n    m_numChildren -= 1;\n}\n\n// creates nodes for the children of this node\n// and place pointers to them in the queue.\n// Returns the number of nodes created\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nint GraphSearchNode<VERTEX,EDGE,DISTANCE>::createChildren(GraphSearchNodePtrDeque& outDeque, const DISTANCE& distanceFunc)\n{\n    assert(m_numChildren == 0);\n\n    _EDGEPtrVector edges = m_pVertex->getEdges(m_expandDir);\n\n    for(size_t i = 0; i < edges.size(); ++i)\n    {\n        EdgeDir childExpandDir = !edges[i]->getTwin()->getDir();\n        GraphSearchNode* pNode = new GraphSearchNode(edges[i]->getEnd(), childExpandDir, this, edges[i], distanceFunc(edges[i]));\n        outDeque.push_back(pNode);\n        m_numChildren += 1;\n    }\n    return edges.size();\n}\n\n//\n// GraphSearchTree\n//\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nGraphSearchTree<VERTEX,EDGE,DISTANCE>::GraphSearchTree(VERTEX* pStartVertex, \n                                                       VERTEX* pEndVertex, \n                                                       EdgeDir searchDir,\n                                                       int64_t distanceLimit,\n                                                       size_t nodeLimit) : m_pGoalVertex(pEndVertex),\n                                                                           m_distanceLimit(distanceLimit),\n                                                                           m_nodeLimit(nodeLimit),\n                                                                           m_searchAborted(false)\n{\n    // Create the root node of the search tree\n    m_pRootNode = new GraphSearchNode<VERTEX, EDGE, DISTANCE>(pStartVertex, searchDir, NULL, NULL, 0);\n\n    // add the root to the expand queue\n    m_expandQueue.push_back(m_pRootNode);\n\n    m_totalNodes = 1;\n}\n\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nGraphSearchTree<VERTEX,EDGE,DISTANCE>::~GraphSearchTree()\n{\n    // Delete the tree\n    // We delete each leaf and recurse up the tree iteratively deleting\n    // parents with a single child node. This ensure that each parent is\n    // deleted after all its children\n    _SearchNodePtrDeque completeLeafNodes;\n    _makeFullLeafQueue(completeLeafNodes);\n\n    size_t totalDeleted = 0;\n    for(typename _SearchNodePtrDeque::iterator iter = completeLeafNodes.begin(); \n                                               iter != completeLeafNodes.end();\n                                               ++iter)    \n    {\n        _SearchNode* pCurr = *iter;\n\n        // loop invariant: pCurr is a deletable node\n        // the loop stops when the parent is NULL or has \n        // a child other than pCurr\n        do\n        {\n            assert(pCurr->getNumChildren() == 0);\n            _SearchNode* pNext = pCurr->getParent();\n            \n            delete pCurr; // decrements pNext's child count\n            totalDeleted += 1;\n\n            pCurr = pNext;\n        } while(pCurr && pCurr->getNumChildren() == 0);\n    }\n\n    assert(totalDeleted == m_totalNodes);\n}\n\n// Perform one step of the BFS\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nbool GraphSearchTree<VERTEX,EDGE,DISTANCE>::stepOnce()\n{\n    if(m_expandQueue.empty())\n        return false;\n\n    if(m_totalNodes > m_nodeLimit)\n    {\n        // Move all nodes in the expand queue to the done queue\n        m_doneQueue.insert(m_doneQueue.end(), m_expandQueue.begin(), m_expandQueue.end());\n        m_expandQueue.clear();\n\n        // Set a flag indicating the search was aborted\n        m_searchAborted = true;\n        return false;\n    }\n\n    // Iterate over the expand queue. If the path to the node\n    // is outside the depth limit, move that node to the done queue. It cannot\n    // yield a valid path to the goal. Otherwise, add the children of the node \n    // to the incoming queue\n    _SearchNodePtrDeque incomingQueue;\n    while(!m_expandQueue.empty())\n    {\n        _SearchNode* pNode = m_expandQueue.front();\n        m_expandQueue.pop_front();\n        \n        if(pNode->getVertex() == m_pGoalVertex)\n        {\n            // This node represents the goal, add it to the goal queue\n            m_goalQueue.push_back(pNode);\n            continue;\n        }\n\n        if(pNode->getDistance() > m_distanceLimit)\n        {\n            // Path to this node is too long, expand it no further\n            m_doneQueue.push_back(pNode);\n        }\n        else\n        {\n            // Add the children of this node to the queue\n            int numCreated = pNode->createChildren(incomingQueue, m_distanceFunc);\n            m_totalNodes += numCreated;\n\n            if(numCreated == 0)\n            {\n                // No children created, add this node to the done queue\n                m_doneQueue.push_back(pNode);\n            }\n        }\n    }\n\n    m_expandQueue = incomingQueue;\n    return true;\n}\n\n// Return true if all the walks from the root converge\n// to one vertex (ie if the search from pX converged\n// to pY, then ALL paths from pX must go through pY).\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nbool GraphSearchTree<VERTEX,EDGE,DISTANCE>::hasSearchConverged(VERTEX*& pConvergedVertex)\n{\n    // Construct a set of all the leaf nodes\n    _SearchNodePtrDeque completeLeafNodes;\n    _makeFullLeafQueue(completeLeafNodes);\n\n    // Search all the tree for all the nodes in the expand queue\n    for(typename _SearchNodePtrDeque::iterator iter = m_expandQueue.begin(); \n                                               iter != m_expandQueue.end();\n                                               ++iter)\n    {\n        _SearchNode* pNode = *iter;\n        // If this node has the same vertex as the root skip it\n        // We do not want to collapse at the root\n        if(pNode->getVertex() == m_pRootNode->getVertex())\n            continue;\n\n        bool isInAllBranches = true;\n        for(typename _SearchNodePtrDeque::iterator leafIter = completeLeafNodes.begin();\n                                                   leafIter != completeLeafNodes.end();\n                                                   ++leafIter)\n        {\n            // Search the current branch from this leaf node to the root\n            _SearchNode* pFoundNode = NULL;\n            bool isInBranch = searchBranchForVertex(*leafIter, pNode->getVertex(), pFoundNode);\n            if(!isInBranch)\n            {\n                isInAllBranches = false;\n                break;\n            }\n        }\n    \n        // search has converted\n        if(isInAllBranches)\n        {\n            pConvergedVertex = pNode->getVertex();\n            return true;\n        }\n    }\n\n    // search has not converted\n    pConvergedVertex = NULL;\n    return false;\n}\n\n// Construct walks representing every path from the start node\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\ntemplate<typename BUILDER>\nvoid GraphSearchTree<VERTEX,EDGE,DISTANCE>::buildWalksToAllLeaves(BUILDER& walkBuilder)\n{\n    // Construct a queue with all leaf nodes in it\n    _SearchNodePtrDeque completeLeafNodes;\n    _makeFullLeafQueue(completeLeafNodes);\n\n    _buildWalksToLeaves(completeLeafNodes, walkBuilder);\n}\n\n// Construct walks representing every path from the start vertex to the goal vertex\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\ntemplate<typename BUILDER>\nvoid GraphSearchTree<VERTEX,EDGE,DISTANCE>::buildWalksToGoal(BUILDER& walkBuilder)\n{\n    _buildWalksToLeaves(m_goalQueue, walkBuilder);\n}\n\n// Build all the walks that contain pTarget.\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\ntemplate<typename BUILDER>\nvoid GraphSearchTree<VERTEX,EDGE,DISTANCE>::buildWalksContainingVertex(VERTEX* pTarget, BUILDER& walkBuilder)\n{\n    _SearchNodePtrDeque completeLeafNodes;\n    _makeFullLeafQueue(completeLeafNodes);\n\n    // Search upwards from each leaf until pTarget is found.\n    // When it is found, insert the pointer to the search node\n    // in the set\n    _SearchNodePtrSet leafSet;\n\n    // Find pTarget in each branch of the graph\n    for(typename _SearchNodePtrDeque::const_iterator iter = completeLeafNodes.begin();\n                                                     iter != completeLeafNodes.end();\n                                                     ++iter)\n    {\n        _SearchNode* pFoundNode = NULL;\n        searchBranchForVertex(*iter, pTarget, pFoundNode);\n        assert(pFoundNode != NULL);\n        leafSet.insert(pFoundNode);\n    }\n\n    // Construct all the walks to the found leaves\n    completeLeafNodes.clear();\n    completeLeafNodes.insert(completeLeafNodes.end(), leafSet.begin(), leafSet.end());\n    _buildWalksToLeaves(completeLeafNodes, walkBuilder);\n}\n\n// Main function for constructing a vector of walks from a set of leaves\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\ntemplate<typename BUILDER>\nvoid GraphSearchTree<VERTEX,EDGE,DISTANCE>::_buildWalksToLeaves(const _SearchNodePtrDeque& queue, BUILDER& walkBuilder)\n{\n    for(typename _SearchNodePtrDeque::const_iterator iter = queue.begin();\n                                                     iter != queue.end();\n                                                     ++iter)\n    {\n\n        // Recursively travel the tree from the leaf to the root collecting the edges in the vector\n        WALK currWalk;\n        addEdgesFromBranch(*iter, currWalk);\n\n        // Reverse the walk and write it to the output structure\n        walkBuilder.startNewWalk(m_pRootNode->getVertex());\n        for(typename WALK::reverse_iterator iter = currWalk.rbegin(); iter != currWalk.rend(); ++iter)\n            walkBuilder.addEdge(*iter);\n        walkBuilder.finishCurrentWalk();\n    }\n}\n\n// Return true if the vertex pX is found somewhere in the branch \n// from pNode to the root. If it is found, pFoundNode is set\n// to the furtherest instance of pX from the root.\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nbool GraphSearchTree<VERTEX,EDGE,DISTANCE>::searchBranchForVertex(_SearchNode* pNode, VERTEX* pX, _SearchNode*& pFoundNode) const\n{\n    if(pNode == NULL)\n    {\n        pFoundNode = NULL;\n        return false;\n    }\n\n    if(pNode->getVertex() == pX && pNode != m_pRootNode)\n    {\n        pFoundNode = pNode;\n        return true;\n    }\n    return searchBranchForVertex(pNode->getParent(), pX, pFoundNode);\n}\n\n//\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nvoid GraphSearchTree<VERTEX,EDGE,DISTANCE>::addEdgesFromBranch(_SearchNode* pNode, WALK& outEdges)\n{\n    // Terminate the recursion at the root node and dont add an edge\n    if(pNode->getParent() != NULL)\n    {\n        outEdges.push_back(pNode->getEdgeFromParent());\n        return addEdgesFromBranch(pNode->getParent(), outEdges);\n    }\n}\n\n//\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nvoid GraphSearchTree<VERTEX,EDGE,DISTANCE>::_makeFullLeafQueue(_SearchNodePtrDeque& completeQueue) const\n{\n    completeQueue.insert(completeQueue.end(), m_expandQueue.begin(), m_expandQueue.end());\n    completeQueue.insert(completeQueue.end(), m_goalQueue.begin(), m_goalQueue.end());\n    completeQueue.insert(completeQueue.end(), m_doneQueue.begin(), m_doneQueue.end());\n}\n\n//\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nvoid GraphSearchTree<VERTEX,EDGE,DISTANCE>::printBranch(_SearchNode* pNode) const\n{\n    if(pNode != NULL)\n    {\n        std::cout << pNode->getVertex()->getID() << \",\";\n        printBranch(pNode->getParent());\n    }\n}\n\ntemplate<typename VERTEX, typename EDGE, typename DISTANCE>\nvoid GraphSearchTree<VERTEX,EDGE,DISTANCE>::connectedComponents(VertexPtrVector allVertices, \n                                                                VertexPtrVectorVector& connectedComponents)\n{\n    // Set the color of each vertex to be white signalling its not visited\n    typename VertexPtrVector::iterator iter = allVertices.begin();\n    for(; iter != allVertices.end(); ++iter)\n    {\n        assert((*iter)->getColor() == GC_WHITE);\n        (*iter)->setColor(GC_WHITE);\n    }\n\n    // \n    iter = allVertices.begin();\n    for(; iter != allVertices.end(); ++iter)\n    {\n        // Do nothing if this vertex is already part of a CC\n        if((*iter)->getColor() == GC_BLACK)\n            continue;\n\n       // Start a new CC\n       VertexPtrVector currComponent;\n\n       std::queue<VERTEX*> exploreQueue;\n       (*iter)->setColor(GC_GRAY); // queued color\n       exploreQueue.push(*iter);\n\n       while(!exploreQueue.empty())\n       {\n            VERTEX* pCurr = exploreQueue.front();\n            exploreQueue.pop();\n\n            assert(pCurr->getColor() != GC_BLACK);\n            currComponent.push_back(pCurr);\n            pCurr->setColor(GC_BLACK); //done with this vertex\n\n            // Enqueue edges if they havent been visited already\n            std::vector<EDGE*> edges = pCurr->getEdges();\n            for(size_t i = 0; i < edges.size(); ++i)\n            {\n                EDGE* pEdge = edges[i];\n                VERTEX* pNext = pEdge->getEnd();\n                if(pNext->getColor() == GC_WHITE)\n                {\n                    pNext->setColor(GC_GRAY); // queued\n                    exploreQueue.push(pNext);\n                }\n            }\n       }\n\n        connectedComponents.push_back(currComponent);\n    }\n\n    iter = allVertices.begin();\n    for(; iter != allVertices.end(); ++iter)\n    {\n        (*iter)->setColor(GC_WHITE);\n    }\n\n    // Sanity check\n    size_t totalVertices = allVertices.size();\n    size_t totalInComponents = 0;\n\n    for(size_t i = 0; i < connectedComponents.size(); ++i)\n    {\n        totalInComponents += connectedComponents[i].size();\n    }\n    assert(totalVertices == totalInComponents);\n    //std::cout << \"[CC] total: \" << totalVertices << \" num components: \" << connectedComponents.size() << \"\\n\";\n    //std::cout << \"[CC] total vertices in components: \" << totalInComponents << \"\\n\";\n}\n\n#endif\n"
  },
  {
    "path": "src/SGA/StringGraph/Makefile.am",
    "content": "noinst_LIBRARIES = libstringgraph.a\n\nlibstringgraph_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/Thirdparty \\\n\t-I$(top_srcdir)/src/SGA/Algorithm \\\n\t-I$(top_srcdir)/src/SGA/SQG \\\n\t-I$(top_srcdir)/SeqLib\n\nlibstringgraph_a_SOURCES = \\\n        SGUtil.cpp SGUtil.h \\\n        SGAlgorithms.cpp SGAlgorithms.h \\\n        SGVisitors.h SGVisitors.cpp \\\n        CompleteOverlapSet.h CompleteOverlapSet.cpp \\\n        RemovalAlgorithm.h RemovalAlgorithm.cpp \\\n\t\tSGSearch.h SGSearch.cpp \\\n\t\tGraphSearchTree.h \\\n\t\tSGWalk.h SGWalk.cpp\n\n"
  },
  {
    "path": "src/SGA/StringGraph/Makefile.in",
    "content": "# Makefile.in generated by automake 1.16.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2018 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nsubdir = src/SGA/StringGraph\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLIBRARIES = $(noinst_LIBRARIES)\nAR = ar\nARFLAGS = cru\nAM_V_AR = $(am__v_AR_@AM_V@)\nam__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)\nam__v_AR_0 = @echo \"  AR      \" $@;\nam__v_AR_1 = \nlibstringgraph_a_AR = $(AR) $(ARFLAGS)\nlibstringgraph_a_LIBADD =\nam_libstringgraph_a_OBJECTS = libstringgraph_a-SGUtil.$(OBJEXT) \\\n\tlibstringgraph_a-SGAlgorithms.$(OBJEXT) \\\n\tlibstringgraph_a-SGVisitors.$(OBJEXT) \\\n\tlibstringgraph_a-CompleteOverlapSet.$(OBJEXT) \\\n\tlibstringgraph_a-RemovalAlgorithm.$(OBJEXT) \\\n\tlibstringgraph_a-SGSearch.$(OBJEXT) \\\n\tlibstringgraph_a-SGWalk.$(OBJEXT)\nlibstringgraph_a_OBJECTS = $(am_libstringgraph_a_OBJECTS)\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__maybe_remake_depfiles = depfiles\nam__depfiles_remade =  \\\n\t./$(DEPDIR)/libstringgraph_a-CompleteOverlapSet.Po \\\n\t./$(DEPDIR)/libstringgraph_a-RemovalAlgorithm.Po \\\n\t./$(DEPDIR)/libstringgraph_a-SGAlgorithms.Po \\\n\t./$(DEPDIR)/libstringgraph_a-SGSearch.Po \\\n\t./$(DEPDIR)/libstringgraph_a-SGUtil.Po \\\n\t./$(DEPDIR)/libstringgraph_a-SGVisitors.Po \\\n\t./$(DEPDIR)/libstringgraph_a-SGWalk.Po\nam__mv = mv -f\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nAM_V_CXX = $(am__v_CXX_@AM_V@)\nam__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)\nam__v_CXX_0 = @echo \"  CXX     \" $@;\nam__v_CXX_1 = \nCXXLD = $(CXX)\nCXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \\\n\t-o $@\nAM_V_CXXLD = $(am__v_CXXLD_@AM_V@)\nam__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)\nam__v_CXXLD_0 = @echo \"  CXXLD   \" $@;\nam__v_CXXLD_1 = \nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libstringgraph_a_SOURCES)\nDIST_SOURCES = $(libstringgraph_a_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_CXXFLAGS = @AM_CXXFLAGS@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nOBJEXT = @OBJEXT@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild_alias = @build_alias@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost_alias = @host_alias@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nnoinst_LIBRARIES = libstringgraph.a\nlibstringgraph_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/Thirdparty \\\n\t-I$(top_srcdir)/src/SGA/Algorithm \\\n\t-I$(top_srcdir)/src/SGA/SQG \\\n\t-I$(top_srcdir)/SeqLib\n\nlibstringgraph_a_SOURCES = \\\n        SGUtil.cpp SGUtil.h \\\n        SGAlgorithms.cpp SGAlgorithms.h \\\n        SGVisitors.h SGVisitors.cpp \\\n        CompleteOverlapSet.h CompleteOverlapSet.cpp \\\n        RemovalAlgorithm.h RemovalAlgorithm.cpp \\\n\t\tSGSearch.h SGSearch.cpp \\\n\t\tGraphSearchTree.h \\\n\t\tSGWalk.h SGWalk.cpp\n\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .cpp .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/SGA/StringGraph/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/SGA/StringGraph/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLIBRARIES:\n\t-test -z \"$(noinst_LIBRARIES)\" || rm -f $(noinst_LIBRARIES)\n\nlibstringgraph.a: $(libstringgraph_a_OBJECTS) $(libstringgraph_a_DEPENDENCIES) $(EXTRA_libstringgraph_a_DEPENDENCIES) \n\t$(AM_V_at)-rm -f libstringgraph.a\n\t$(AM_V_AR)$(libstringgraph_a_AR) libstringgraph.a $(libstringgraph_a_OBJECTS) $(libstringgraph_a_LIBADD)\n\t$(AM_V_at)$(RANLIB) libstringgraph.a\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstringgraph_a-CompleteOverlapSet.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstringgraph_a-RemovalAlgorithm.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstringgraph_a-SGAlgorithms.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstringgraph_a-SGSearch.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstringgraph_a-SGUtil.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstringgraph_a-SGVisitors.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstringgraph_a-SGWalk.Po@am__quote@ # am--include-marker\n\n$(am__depfiles_remade):\n\t@$(MKDIR_P) $(@D)\n\t@echo '# dummy' >$@-t && $(am__mv) $@-t $@\n\nam--depfiles: $(am__depfiles_remade)\n\n.cpp.o:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<\n\n.cpp.obj:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\nlibstringgraph_a-SGUtil.o: SGUtil.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-SGUtil.o -MD -MP -MF $(DEPDIR)/libstringgraph_a-SGUtil.Tpo -c -o libstringgraph_a-SGUtil.o `test -f 'SGUtil.cpp' || echo '$(srcdir)/'`SGUtil.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-SGUtil.Tpo $(DEPDIR)/libstringgraph_a-SGUtil.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SGUtil.cpp' object='libstringgraph_a-SGUtil.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-SGUtil.o `test -f 'SGUtil.cpp' || echo '$(srcdir)/'`SGUtil.cpp\n\nlibstringgraph_a-SGUtil.obj: SGUtil.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-SGUtil.obj -MD -MP -MF $(DEPDIR)/libstringgraph_a-SGUtil.Tpo -c -o libstringgraph_a-SGUtil.obj `if test -f 'SGUtil.cpp'; then $(CYGPATH_W) 'SGUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/SGUtil.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-SGUtil.Tpo $(DEPDIR)/libstringgraph_a-SGUtil.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SGUtil.cpp' object='libstringgraph_a-SGUtil.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-SGUtil.obj `if test -f 'SGUtil.cpp'; then $(CYGPATH_W) 'SGUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/SGUtil.cpp'; fi`\n\nlibstringgraph_a-SGAlgorithms.o: SGAlgorithms.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-SGAlgorithms.o -MD -MP -MF $(DEPDIR)/libstringgraph_a-SGAlgorithms.Tpo -c -o libstringgraph_a-SGAlgorithms.o `test -f 'SGAlgorithms.cpp' || echo '$(srcdir)/'`SGAlgorithms.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-SGAlgorithms.Tpo $(DEPDIR)/libstringgraph_a-SGAlgorithms.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SGAlgorithms.cpp' object='libstringgraph_a-SGAlgorithms.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-SGAlgorithms.o `test -f 'SGAlgorithms.cpp' || echo '$(srcdir)/'`SGAlgorithms.cpp\n\nlibstringgraph_a-SGAlgorithms.obj: SGAlgorithms.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-SGAlgorithms.obj -MD -MP -MF $(DEPDIR)/libstringgraph_a-SGAlgorithms.Tpo -c -o libstringgraph_a-SGAlgorithms.obj `if test -f 'SGAlgorithms.cpp'; then $(CYGPATH_W) 'SGAlgorithms.cpp'; else $(CYGPATH_W) '$(srcdir)/SGAlgorithms.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-SGAlgorithms.Tpo $(DEPDIR)/libstringgraph_a-SGAlgorithms.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SGAlgorithms.cpp' object='libstringgraph_a-SGAlgorithms.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-SGAlgorithms.obj `if test -f 'SGAlgorithms.cpp'; then $(CYGPATH_W) 'SGAlgorithms.cpp'; else $(CYGPATH_W) '$(srcdir)/SGAlgorithms.cpp'; fi`\n\nlibstringgraph_a-SGVisitors.o: SGVisitors.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-SGVisitors.o -MD -MP -MF $(DEPDIR)/libstringgraph_a-SGVisitors.Tpo -c -o libstringgraph_a-SGVisitors.o `test -f 'SGVisitors.cpp' || echo '$(srcdir)/'`SGVisitors.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-SGVisitors.Tpo $(DEPDIR)/libstringgraph_a-SGVisitors.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SGVisitors.cpp' object='libstringgraph_a-SGVisitors.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-SGVisitors.o `test -f 'SGVisitors.cpp' || echo '$(srcdir)/'`SGVisitors.cpp\n\nlibstringgraph_a-SGVisitors.obj: SGVisitors.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-SGVisitors.obj -MD -MP -MF $(DEPDIR)/libstringgraph_a-SGVisitors.Tpo -c -o libstringgraph_a-SGVisitors.obj `if test -f 'SGVisitors.cpp'; then $(CYGPATH_W) 'SGVisitors.cpp'; else $(CYGPATH_W) '$(srcdir)/SGVisitors.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-SGVisitors.Tpo $(DEPDIR)/libstringgraph_a-SGVisitors.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SGVisitors.cpp' object='libstringgraph_a-SGVisitors.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-SGVisitors.obj `if test -f 'SGVisitors.cpp'; then $(CYGPATH_W) 'SGVisitors.cpp'; else $(CYGPATH_W) '$(srcdir)/SGVisitors.cpp'; fi`\n\nlibstringgraph_a-CompleteOverlapSet.o: CompleteOverlapSet.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-CompleteOverlapSet.o -MD -MP -MF $(DEPDIR)/libstringgraph_a-CompleteOverlapSet.Tpo -c -o libstringgraph_a-CompleteOverlapSet.o `test -f 'CompleteOverlapSet.cpp' || echo '$(srcdir)/'`CompleteOverlapSet.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-CompleteOverlapSet.Tpo $(DEPDIR)/libstringgraph_a-CompleteOverlapSet.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='CompleteOverlapSet.cpp' object='libstringgraph_a-CompleteOverlapSet.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-CompleteOverlapSet.o `test -f 'CompleteOverlapSet.cpp' || echo '$(srcdir)/'`CompleteOverlapSet.cpp\n\nlibstringgraph_a-CompleteOverlapSet.obj: CompleteOverlapSet.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-CompleteOverlapSet.obj -MD -MP -MF $(DEPDIR)/libstringgraph_a-CompleteOverlapSet.Tpo -c -o libstringgraph_a-CompleteOverlapSet.obj `if test -f 'CompleteOverlapSet.cpp'; then $(CYGPATH_W) 'CompleteOverlapSet.cpp'; else $(CYGPATH_W) '$(srcdir)/CompleteOverlapSet.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-CompleteOverlapSet.Tpo $(DEPDIR)/libstringgraph_a-CompleteOverlapSet.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='CompleteOverlapSet.cpp' object='libstringgraph_a-CompleteOverlapSet.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-CompleteOverlapSet.obj `if test -f 'CompleteOverlapSet.cpp'; then $(CYGPATH_W) 'CompleteOverlapSet.cpp'; else $(CYGPATH_W) '$(srcdir)/CompleteOverlapSet.cpp'; fi`\n\nlibstringgraph_a-RemovalAlgorithm.o: RemovalAlgorithm.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-RemovalAlgorithm.o -MD -MP -MF $(DEPDIR)/libstringgraph_a-RemovalAlgorithm.Tpo -c -o libstringgraph_a-RemovalAlgorithm.o `test -f 'RemovalAlgorithm.cpp' || echo '$(srcdir)/'`RemovalAlgorithm.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-RemovalAlgorithm.Tpo $(DEPDIR)/libstringgraph_a-RemovalAlgorithm.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='RemovalAlgorithm.cpp' object='libstringgraph_a-RemovalAlgorithm.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-RemovalAlgorithm.o `test -f 'RemovalAlgorithm.cpp' || echo '$(srcdir)/'`RemovalAlgorithm.cpp\n\nlibstringgraph_a-RemovalAlgorithm.obj: RemovalAlgorithm.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-RemovalAlgorithm.obj -MD -MP -MF $(DEPDIR)/libstringgraph_a-RemovalAlgorithm.Tpo -c -o libstringgraph_a-RemovalAlgorithm.obj `if test -f 'RemovalAlgorithm.cpp'; then $(CYGPATH_W) 'RemovalAlgorithm.cpp'; else $(CYGPATH_W) '$(srcdir)/RemovalAlgorithm.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-RemovalAlgorithm.Tpo $(DEPDIR)/libstringgraph_a-RemovalAlgorithm.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='RemovalAlgorithm.cpp' object='libstringgraph_a-RemovalAlgorithm.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-RemovalAlgorithm.obj `if test -f 'RemovalAlgorithm.cpp'; then $(CYGPATH_W) 'RemovalAlgorithm.cpp'; else $(CYGPATH_W) '$(srcdir)/RemovalAlgorithm.cpp'; fi`\n\nlibstringgraph_a-SGSearch.o: SGSearch.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-SGSearch.o -MD -MP -MF $(DEPDIR)/libstringgraph_a-SGSearch.Tpo -c -o libstringgraph_a-SGSearch.o `test -f 'SGSearch.cpp' || echo '$(srcdir)/'`SGSearch.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-SGSearch.Tpo $(DEPDIR)/libstringgraph_a-SGSearch.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SGSearch.cpp' object='libstringgraph_a-SGSearch.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-SGSearch.o `test -f 'SGSearch.cpp' || echo '$(srcdir)/'`SGSearch.cpp\n\nlibstringgraph_a-SGSearch.obj: SGSearch.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-SGSearch.obj -MD -MP -MF $(DEPDIR)/libstringgraph_a-SGSearch.Tpo -c -o libstringgraph_a-SGSearch.obj `if test -f 'SGSearch.cpp'; then $(CYGPATH_W) 'SGSearch.cpp'; else $(CYGPATH_W) '$(srcdir)/SGSearch.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-SGSearch.Tpo $(DEPDIR)/libstringgraph_a-SGSearch.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SGSearch.cpp' object='libstringgraph_a-SGSearch.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-SGSearch.obj `if test -f 'SGSearch.cpp'; then $(CYGPATH_W) 'SGSearch.cpp'; else $(CYGPATH_W) '$(srcdir)/SGSearch.cpp'; fi`\n\nlibstringgraph_a-SGWalk.o: SGWalk.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-SGWalk.o -MD -MP -MF $(DEPDIR)/libstringgraph_a-SGWalk.Tpo -c -o libstringgraph_a-SGWalk.o `test -f 'SGWalk.cpp' || echo '$(srcdir)/'`SGWalk.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-SGWalk.Tpo $(DEPDIR)/libstringgraph_a-SGWalk.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SGWalk.cpp' object='libstringgraph_a-SGWalk.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-SGWalk.o `test -f 'SGWalk.cpp' || echo '$(srcdir)/'`SGWalk.cpp\n\nlibstringgraph_a-SGWalk.obj: SGWalk.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstringgraph_a-SGWalk.obj -MD -MP -MF $(DEPDIR)/libstringgraph_a-SGWalk.Tpo -c -o libstringgraph_a-SGWalk.obj `if test -f 'SGWalk.cpp'; then $(CYGPATH_W) 'SGWalk.cpp'; else $(CYGPATH_W) '$(srcdir)/SGWalk.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libstringgraph_a-SGWalk.Tpo $(DEPDIR)/libstringgraph_a-SGWalk.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SGWalk.cpp' object='libstringgraph_a-SGWalk.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstringgraph_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstringgraph_a-SGWalk.obj `if test -f 'SGWalk.cpp'; then $(CYGPATH_W) 'SGWalk.cpp'; else $(CYGPATH_W) '$(srcdir)/SGWalk.cpp'; fi`\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(BUILT_SOURCES)\n\t$(MAKE) $(AM_MAKEFLAGS) distdir-am\n\ndistdir-am: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LIBRARIES)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am\n\ndistclean: distclean-am\n\t\t-rm -f ./$(DEPDIR)/libstringgraph_a-CompleteOverlapSet.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-RemovalAlgorithm.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-SGAlgorithms.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-SGSearch.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-SGUtil.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-SGVisitors.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-SGWalk.Po\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t\t-rm -f ./$(DEPDIR)/libstringgraph_a-CompleteOverlapSet.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-RemovalAlgorithm.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-SGAlgorithms.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-SGSearch.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-SGUtil.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-SGVisitors.Po\n\t-rm -f ./$(DEPDIR)/libstringgraph_a-SGWalk.Po\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \\\n\tclean-generic clean-noinstLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/SGA/StringGraph/RemovalAlgorithm.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// RemovalAlgorithm - Determine the set of edges that\n// must be added to a given vertex to keep the structure of the\n// graph intact when a vertex that it shares an edge with\n// is going to be removed from the graph.\n// This is similar to the CompleteOverlapSet but does\n// not perform an exhaustive exploration of the edges\n//\n#include \"RemovalAlgorithm.h\"\n\n//\nSGAlgorithms::EdgeDescOverlapMap RemovalAlgorithm::computeRequiredOverlaps(const Vertex* pVertex, const Edge* pRemovalEdge, double maxER, int minLength)\n{\n    // this procedure is only valid for proper overlaps, the edge cannot be a containment\n    assert(!pRemovalEdge->getOverlap().isContainment());\n    SGAlgorithms::EdgeDescOverlapMap outMap;\n    findPotentialOverlaps(pVertex, pRemovalEdge, maxER, minLength, outMap);\n    eliminateReachableEdges(pVertex, pRemovalEdge, maxER, minLength, outMap);   \n    return outMap;\n}\n\n// Find edges of pRemovalEdge->getEnd() that are potentially irreducible edges of pX once pRemovalEdge\n// has been eliminated from the graph\nvoid RemovalAlgorithm::findPotentialOverlaps(const Vertex* pX, const Edge* pRemovalEdge, \n                                             double maxER, int minLength, SGAlgorithms::EdgeDescOverlapMap& outMap)\n{\n    ExploreQueue queue;\n    Vertex* pY = pRemovalEdge->getEnd();\n    Overlap ovrXY = pRemovalEdge->getOverlap();\n    EdgeDesc edXY = pRemovalEdge->getDesc();\n\n    // Get the edges of pY that face in the opposite direction of edge X <-- Y\n    // New edges of pX must be in this direction. Edges in the direction of X\n    // must have a longer overlap with X than Y does and therefore cannot be transitive\n    // wrt to Y.\n    EdgeDescSet visitedSet;\n    EdgeDir dirY = !pRemovalEdge->getTwin()->getDir();\n    enqueueEdges(pY, dirY, ovrXY, edXY, minLength, queue, &visitedSet);\n\n    int extra_extension = 0;\n    while(!queue.empty())\n    {\n        ExploreElement ee = queue.front();\n        queue.pop();\n        \n        // If the overlap between this element and X is valid, add it to the output map\n        // and proceed no further. If the overlap is above minLength but the error rate\n        // with X is higher than the threshold, do not add it to the map but add its neighbors\n        // as they may be valid overlaps to X\n        EdgeDesc& edXZ = ee.ed;\n        Vertex* pZ = edXZ.pVertex;\n        Overlap& ovrXZ = ee.ovr;\n        int overlapLen = ovrXZ.getOverlapLength(0);\n        \n        if(pZ == pX)\n            continue;\n\n        if(overlapLen >= minLength)\n        {\n            double error_rate = SGAlgorithms::calcErrorRate(pX, pZ, ovrXZ);\n            if(isErrorRateAcceptable(error_rate, maxER))\n            {\n                outMap.insert(std::make_pair(edXZ, ovrXZ));\n            }\n            else\n            {\n                // Enqueue neighbors of pZ\n                EdgeDir dirZ = edXZ.getTransitiveDir();\n                enqueueEdges(pZ, dirZ, ovrXZ, edXZ, minLength, queue, &visitedSet);\n                ++extra_extension;\n            }\n        }\n    }\n\n    // Remove non-maximal overlaps from the collection\n    SGAlgorithms::removeSubmaximalOverlaps(&outMap);\n}\n\n// Using the edges of pVertex, eliminate edges from outMap if they are transitive\nvoid RemovalAlgorithm::eliminateReachableEdges(const Vertex* pVertex, const Edge* pRemovalEdge,\n                                               double maxER, int minLength, SGAlgorithms::EdgeDescOverlapMap& outMap)\n{\n    // During the enqueue process, edges may have been added to outMap that are transitive to another\n    // edge in outMap. We get rid of these first.\n    SGAlgorithms::partitionTransitiveOverlaps(&outMap, NULL, maxER, minLength);\n\n    // Now, eliminate any edges in outMap that are transitive wrt some edge reachable from pVertex\n    // We control the depth of search using the shortest overlap in outMap\n    // Get the length of the shortest overlap on pX in outMap\n    int shortestOverlap = -1;\n    for(SGAlgorithms::EdgeDescOverlapMap::iterator iter = outMap.begin();\n        iter != outMap.end(); ++iter)\n    {\n        int currOverlap = iter->second.getOverlapLength(0);\n        if(shortestOverlap == -1 || currOverlap < shortestOverlap)\n        {\n            shortestOverlap = currOverlap;\n      //      std::cout << \"SHORT: \" << iter->second << \"\\n\";\n        }\n    }\n    \n    // Avoid loops by only enqueuing vertices that have not been visited before\n    EdgeDescSet visitedSet;\n    ExploreQueue queue;\n\n    // Enqueue the initial overlaps of pX to the queue if they are longer than the shortest overlap\n    EdgeDir dirX = pRemovalEdge->getDir();\n    EdgePtrVec edges = pVertex->getEdges(dirX);\n    for(size_t i = 0; i < edges.size(); ++i)\n    {\n        Edge* pEdge = edges[i];\n\n        // Skip the edge that is being removed\n        if(pEdge == pRemovalEdge)\n            continue;\n\n        EdgeDesc ed = pEdge->getDesc();\n        Overlap ovr = pEdge->getOverlap();\n        if(ovr.getOverlapLength(0) >= shortestOverlap && !ovr.isContainment())\n        {\n            queue.push(ExploreElement(ed, ovr));\n            visitedSet.insert(ed);\n        }\n    }\n\n    // The elements in the queue represent the irreducible overlaps of pX and any overlaps\n    // that are transitive wrt the irreducible edges. If the edges in outMap are transitive\n    // wrt to this edge set, remove them from the map. Any remaining edges are new irreducible edges.\n    int num_ext = 0;\n    while(!queue.empty())\n    {\n        if(outMap.empty())\n            return;\n\n        ExploreElement ee = queue.front();\n        queue.pop();\n        \n        // If the overlap between this element and X is valid, add it to the output map\n        // and proceed no further. If the overlap is above minLength but the error rate\n        // with X is higher than the threshold, do not add it to the map but add its neighbors\n        // as they may be valid overlaps to X\n        EdgeDesc& edXY = ee.ed;\n        Vertex* pY = edXY.pVertex;\n        Overlap& ovrXY = ee.ovr;\n        //std::cout << \"OVRXY: \" << ovrXY << \"\\n\";\n        int overlapLen = ovrXY.getOverlapLength(0);\n        assert(overlapLen >= shortestOverlap);\n        (void)overlapLen;\n\n        // Check all the overlaps in the map to see if they are transitive wrt pY\n        SGAlgorithms::EdgeDescOverlapMap::iterator iter = outMap.begin();\n        while(iter != outMap.end())\n        {\n            bool eliminate = false;\n            const EdgeDesc& edXZ = iter->first;\n            const Overlap& ovrXZ = iter->second;\n            \n            if(ovrXY.getOverlapLength(0) >= ovrXZ.getOverlapLength(0))\n            {\n                if(edXY.pVertex == edXZ.pVertex)\n                    eliminate = true;\n                else\n                    eliminate = SGAlgorithms::isOverlapTransitive(edXY.pVertex, edXZ.pVertex, ovrXY, ovrXZ, maxER, minLength);\n            }\n\n            if(eliminate)\n            {\n                outMap.erase(iter++);\n            }\n            else\n                ++iter;\n        }\n\n        // If any overlaps remain in the map, enqueue the neighbors of this vertex\n        // that have an overlap with X that is at least as long as shortest overlap\n        if(!outMap.empty())\n        {\n            num_ext++;\n            enqueueEdges(pY, edXY.getTransitiveDir(), ovrXY, edXY, shortestOverlap, queue, &visitedSet);\n        }\n    }\n}\n\n// Add the edges of pY in direction dirY to the explore queue if they have a valid overlap with X\nvoid RemovalAlgorithm::enqueueEdges(const Vertex* pY, EdgeDir dirY, const Overlap& ovrXY, const EdgeDesc& /*edXY*/, int minOverlap, \n                                    ExploreQueue& outQueue, EdgeDescSet* pSeenSet)\n{\n    EdgePtrVec edges = pY->getEdges(dirY);\n    for(size_t i = 0; i < edges.size(); ++i)\n    {\n        Edge* pEdge = edges[i];\n        Vertex* pZ = pEdge->getEnd();\n\n        // Compute the edgeDesc and overlap on pX for this edge\n        Overlap ovrYZ = pEdge->getOverlap();\n\n        if(!ovrYZ.isContainment() && SGAlgorithms::hasTransitiveOverlap(ovrXY, ovrYZ))\n        {\n            Overlap ovrXZ = SGAlgorithms::inferTransitiveOverlap(ovrXY, ovrYZ);\n            EdgeDesc edXZ = SGAlgorithms::overlapToEdgeDesc(pZ, ovrXZ);\n\n            if((pSeenSet == NULL || pSeenSet->count(edXZ) == 0) && ovrXZ.getOverlapLength(0) >= minOverlap)\n            {\n                outQueue.push(ExploreElement(edXZ, ovrXZ));\n                if(pSeenSet != NULL)\n                    pSeenSet->insert(edXZ);\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "src/SGA/StringGraph/RemovalAlgorithm.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// RemovalAlgorithm - Determine the set of edges that\n// must be added to a given vertex to keep the structure of the\n// graph intact when a vertex that it shares an edge with\n// is going to be removed from the graph.\n// This is similar to the CompleteOverlapSet but does\n// not perform an exhaustive exploration of the edges\n//\n#ifndef REMOVALALGORITHM_H\n#define REMOVALALGORITHM_H\n\n#include \"Bigraph.h\"\n#include \"SGAlgorithms.h\"\n#include \"CompleteOverlapSet.h\"\n\nnamespace RemovalAlgorithm\n{\n    \n// Returns the set of overlaps that must be added to the graph\n// if the vertex at the end of pRemovalEdge is going to be deleted\nSGAlgorithms::EdgeDescOverlapMap computeRequiredOverlaps(const Vertex* pVertex, const Edge* pRemovalEdge, double maxER, int minLength);\nvoid findPotentialOverlaps(const Vertex* pX, const Edge* pRemovalEdge, double maxER, int minLength, SGAlgorithms::EdgeDescOverlapMap& outMap);\nvoid eliminateReachableEdges(const Vertex* pVertex, const Edge* pRemovalEdge, double maxER, int minLength, SGAlgorithms::EdgeDescOverlapMap& outMap);\nvoid enqueueEdges(const Vertex* pY, EdgeDir dirY, const Overlap& ovrXY, const EdgeDesc& edXY, int minOverlap, ExploreQueue& outQueue, EdgeDescSet* pSeenSet);\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/StringGraph/SGAlgorithms.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGAlgorithms - Collection of algorithms for operating on string graphs\n//\n#include \"SGAlgorithms.h\"\n#include \"SGUtil.h\"\n#include \"CompleteOverlapSet.h\"\n#include \"RemovalAlgorithm.h\"\n#include <iterator>\n\n// add edges to the graph for the given overlap\nEdge* SGAlgorithms::createEdgesFromOverlap(StringGraph* pGraph, const Overlap& o, bool allowContained, size_t maxEdges)\n{\n    // Initialize data and perform checks\n    Vertex* pVerts[2];\n    //Vertex* pVerts = new Vertex[2]; //JEREMIAH PUT ON HEAP\n    EdgeComp comp = (o.match.isRC()) ? EC_REVERSE : EC_SAME;\n\n    bool isContainment = o.match.isContainment();\n    assert(allowContained || !isContainment);\n    (void)allowContained;\n    for(size_t idx = 0; idx < 2; ++idx)\n    {\n        pVerts[idx] = pGraph->getVertex(o.id[idx]);\n\n        // If one of the vertices is not in the graph, skip this edge\n        // This can occur if one of the verts is a strict substring of some other vertex so it will\n        // never be added to the graph\n        if(pVerts[idx] == NULL)\n            return NULL;\n    }\n\n    // Check if this is a substring containment, if so mark the contained read\n    // but do not create edges\n    for(size_t idx = 0; idx < 2; ++idx)\n    {\n        if(!o.match.coord[idx].isExtreme())\n        {\n\t  std::cerr << \"contained \"; //JEREMIAH\n\n            size_t containedIdx = 1 - idx;\n            assert(o.match.coord[containedIdx].isExtreme());\n            pVerts[containedIdx]->setColor(GC_RED);\n            pGraph->setContainmentFlag(true);\n            return NULL;\n        }\n    }\n\n    // If either vertex has the maximum number of edges,\n    // do not add any more. This is to protect against ultra-dense\n    // regions of the graph inflating memory usage. The nodes that reach\n    // this limit, and nodes connected to them are marked as super repeats.\n    // After loading the graph, all edges to super repeats are cut to prevent\n    // misassembly.\n    size_t num_edges_0 = pVerts[0]->countEdges();\n    size_t num_edges_1 = pVerts[1]->countEdges();\n    if(num_edges_0 > maxEdges || num_edges_1 > maxEdges)\n    {\n        //WARN_ONCE(\"Edge limit reached for vertex when loading graph\");\n        pVerts[0]->setSuperRepeat(true);\n        pVerts[1]->setSuperRepeat(true);\n        return NULL;\n    }\n\n    if(!isContainment)\n    {\n        Edge* pEdges[2];\n        for(size_t idx = 0; idx < 2; ++idx)\n        {\n            EdgeDir dir = o.match.coord[idx].isLeftExtreme() ? ED_ANTISENSE : ED_SENSE;\n            const SeqCoord& coord = o.match.coord[idx];\n            //pEdges[idx] = new(pGraph->getEdgeAllocator()) Edge(pVerts[1 - idx], dir, comp, coord); // JEREMIAH\n            pEdges[idx] = new Edge(pVerts[1 - idx], dir, comp, coord); // JEREMIAH\n        }\n\n        pEdges[0]->setTwin(pEdges[1]);\n        pEdges[1]->setTwin(pEdges[0]);\n         \n        pGraph->addEdge(pVerts[0], pEdges[0]);\n        pGraph->addEdge(pVerts[1], pEdges[1]);\n        return pEdges[0];\n    }\n    else\n    {\n        // Contained edges don't have a direction, they can be travelled from\n        // one vertex to the other in either direction. Hence, we \n        // add two edges per vertex. Later during the contain removal\n        // algorithm this is important to determine transitivity\n        Edge* pEdges[4];\n        for(size_t idx = 0; idx < 2; ++idx)\n        {\n            const SeqCoord& coord = o.match.coord[idx];\n\t    //            pEdges[idx] = new(pGraph->getEdgeAllocator()) Edge(pVerts[1 - idx], ED_SENSE, comp, coord);\n            //            pEdges[idx + 2] = new(pGraph->getEdgeAllocator()) Edge(pVerts[1 - idx], ED_ANTISENSE, comp, coord);\n            pEdges[idx] = new Edge(pVerts[1 - idx], ED_SENSE, comp, coord);\n            pEdges[idx + 2] = new Edge(pVerts[1 - idx], ED_ANTISENSE, comp, coord);\n\n        }\n        \n        // Twin the edges and add them to the graph\n        pEdges[0]->setTwin(pEdges[1]);\n        pEdges[1]->setTwin(pEdges[0]);\n\n        pEdges[2]->setTwin(pEdges[3]);\n        pEdges[3]->setTwin(pEdges[2]);\n    \n        pGraph->addEdge(pVerts[0], pEdges[0]);\n        pGraph->addEdge(pVerts[0], pEdges[2]);\n\n        pGraph->addEdge(pVerts[1], pEdges[1]);\n        pGraph->addEdge(pVerts[1], pEdges[3]);\n     \n        // Set containment flags\n        updateContainFlags(pGraph, pVerts[0], pEdges[0]->getDesc(), o);\n        return pEdges[0];\n    }\n}\n\n// Find new edges for pVertex that are required if pDeleteEdge is removed from the graph\nvoid SGAlgorithms::remodelVertexForExcision(StringGraph* pGraph, Vertex* pVertex, Edge* pDeleteEdge)\n{\n    assert(pVertex == pDeleteEdge->getStart());\n    // If the edge is a containment edge, nothing needs to be done. No edges can be transitive\n    // through containments\n    if(pDeleteEdge->getOverlap().isContainment())\n        return;\n\n    double maxER = pGraph->getErrorRate();\n    int minLength = pGraph->getMinOverlap();\n    \n    EdgeDescOverlapMap addMap = RemovalAlgorithm::computeRequiredOverlaps(pVertex, pDeleteEdge, maxER, minLength);\n    for(EdgeDescOverlapMap::iterator iter = addMap.begin();\n        iter != addMap.end(); ++iter)\n    {\n        //std::cout << \"Adding edge \" << iter->second << \" during removal of \" << pDeleteEdge->getEndID() << \"\\n\";\n        createEdgesFromOverlap(pGraph, iter->second, false);\n    }\n\n    /*\n    // Set the contain flags based on newly discovered edges\n    updateContainFlags(pGraph, pVertex, containMap);\n    */\n}\n\n// Set containment flags in the graph based on the overlap map\nvoid SGAlgorithms::updateContainFlags(StringGraph* pGraph, Vertex* pVertex, EdgeDescOverlapMap& containMap)\n{\n    for(EdgeDescOverlapMap::iterator iter = containMap.begin(); iter != containMap.end(); ++iter)\n    {\n        updateContainFlags(pGraph, pVertex, iter->first, iter->second);\n    }\n}\n\n//\nvoid SGAlgorithms::updateContainFlags(StringGraph* pGraph, Vertex* pVertex, const EdgeDesc& ed, const Overlap& ovr)\n{\n    assert(ovr.isContainment());\n    // Determine which of the two vertices is contained\n    Vertex* pOther = ed.pVertex;\n    if(ovr.getContainedIdx() == 0)\n        pVertex->setContained(true);\n    else\n        pOther->setContained(true);\n    pGraph->setContainmentFlag(true);\n}\n\n// Calculate the error rate between the two vertices\ndouble SGAlgorithms::calcErrorRate(const Vertex* pX, const Vertex* pY, const Overlap& ovrXY)\n{\n    int num_diffs = ovrXY.match.countDifferences(pX->getSeq().toString(), pY->getSeq().toString());\n    return static_cast<double>(num_diffs) / static_cast<double>(ovrXY.match.getMinOverlapLength());\n}\n\n// Infer an overlap from two edges\n// The input edges are between X->Y Y->Z\n// and the returned overlap is X->Z\nOverlap SGAlgorithms::inferTransitiveOverlap(const Overlap& ovrXY, const Overlap& ovrYZ)\n{\n    // Construct the match\n    Match match_yx = ovrXY.match;\n    match_yx.swap(); \n    Match match_yz = ovrYZ.match;\n\n    // Infer the match_ij based match_i and match_j\n    Match match_xz = Match::infer(match_yx, match_yz);\n    match_xz.expand();\n\n    // Convert the match to an overlap\n    Overlap ovr(ovrXY.id[0], ovrYZ.id[1], match_xz);\n    return ovr;\n}\n\n// Returns true if, given overlaps X->Y, X->Z, the overlap X->Z is transitive\nbool SGAlgorithms::isOverlapTransitive(const Vertex* pY, const Vertex* pZ, const Overlap& ovrXY, \n                                       const Overlap& ovrXZ, const double maxER, const int minOverlap)\n{\n    // Ensure the overlaps are in the correct order, the overlap with Y should be at least\n    // as large as the overlap with Z\n    assert(ovrXY.getOverlapLength(0) >= ovrXZ.getOverlapLength(0));\n    assert(pY != pZ);\n\n    // Compute the overlap YZ\n    Overlap ovrYX = ovrXY;\n    ovrYX.swap();\n    Overlap ovrYZ = SGAlgorithms::inferTransitiveOverlap(ovrYX, ovrXZ);\n\n    // If ovrYZ is a containment, then Z is not transitive wrt Y\n    if(ovrYZ.match.isContainment())\n        return false;\n\n    // If the overlap between Y and Z is not long enough then Z is not transitive\n    if(ovrYZ.getOverlapLength(0) < minOverlap)\n        return false;\n\n    // Finally, check that the error rate is below the threshold\n    double error_rate = SGAlgorithms::calcErrorRate(pY, pZ, ovrYZ);\n    if(isErrorRateAcceptable(error_rate, maxER))\n        return true;\n    else\n        return false;\n}\n\n// The following algorithms use these local types\n// defining an edge/overlap pair.\ntypedef std::pair<EdgeDesc, Overlap> EdgeDescOverlapPair;\n\n// Compare two edges by their overlap length\nstruct EDOPairCompare\n{\n    bool operator()(const EdgeDescOverlapPair& edpXY, const EdgeDescOverlapPair& edpXZ) {\n        return edpXY.second.match.coord[0].length() < edpXZ.second.match.coord[0].length();\n    }\n};\n\n// typedefs\ntypedef std::priority_queue<EdgeDescOverlapPair, \n                            std::vector<EdgeDescOverlapPair>,\n                            EDOPairCompare> EDOPairQueue;\n\n// Move the transitive edges from pOverlapMap to pTransitive\nvoid SGAlgorithms::partitionTransitiveOverlaps(EdgeDescOverlapMap* pOverlapMap, \n                                               EdgeDescOverlapMap* pTransitive,\n                                               double maxER, int minLength)\n{\n    EDOPairQueue overlapQueue;\n    for(SGAlgorithms::EdgeDescOverlapMap::iterator iter = pOverlapMap->begin();\n        iter != pOverlapMap->end(); ++iter)\n    {\n        overlapQueue.push(*iter);\n    }\n\n    // Traverse the list of overlaps in order of length and move elements from\n    // the irreducible map to the transitive map\n    while(!overlapQueue.empty())\n    {\n        EdgeDescOverlapPair edoPair = overlapQueue.top();\n        overlapQueue.pop();\n\n        EdgeDesc& edXY = edoPair.first;\n        Overlap& ovrXY = edoPair.second;\n\n        assert(!ovrXY.match.isContainment());\n\n        SGAlgorithms::EdgeDescOverlapMap::iterator iter = pOverlapMap->begin();\n        while(iter != pOverlapMap->end())\n        {\n            bool move = false;\n            const EdgeDesc& edXZ = iter->first;\n            const Overlap& ovrXZ = iter->second;\n\n            // Four conditions must be met to mark an edge X->Z transitive through X->Y\n            // 1) The overlaps must be in the same direction\n            // 2) The overlap X->Y must be strictly longer than X->Z\n            // 3) The overlap between Y->Z must not be a containment\n            // 4) The overlap between Y->Z must be within the error and length thresholds\n            if(!(edXZ == edXY) && edXY.dir == edXZ.dir && ovrXY.getOverlapLength(0) > ovrXZ.getOverlapLength(0))\n            {\n                move = SGAlgorithms::isOverlapTransitive(edXY.pVertex, edXZ.pVertex, ovrXY, ovrXZ, maxER, minLength);\n            }\n            \n            if(move)\n            {\n                //std::cout << \"Marking overlap: \" << iter->second << \" as trans via \" << ovrXY << \"\\n\";\n                if(pTransitive != NULL)\n                    pTransitive->insert(*iter);\n                pOverlapMap->erase(iter++);\n            }\n            else\n            {\n                ++iter;\n            }\n        }\n    }\n}\n\nvoid SGAlgorithms::removeSubmaximalOverlaps(EdgeDescOverlapMap* pOverlapMap)\n{\n    EDOPairQueue overlapQueue;\n    for(SGAlgorithms::EdgeDescOverlapMap::iterator iter = pOverlapMap->begin();\n        iter != pOverlapMap->end(); ++iter)\n    {\n        overlapQueue.push(*iter);\n    }\n\n    // Traverse the list of overlaps in order of length\n    // Only add the first seen overlap for each vertex\n    pOverlapMap->clear();\n    VertexIDSet seenVerts;\n    // the irreducible map to the transitive map\n    while(!overlapQueue.empty())\n    {\n        EdgeDescOverlapPair edoPair = overlapQueue.top();\n        overlapQueue.pop();\n\n        EdgeDesc& edXY = edoPair.first;\n        if(seenVerts.count(edXY.pVertex->getID()) == 0)\n        {\n            seenVerts.insert(edXY.pVertex->getID());\n            pOverlapMap->insert(edoPair);\n        }\n    }\n}\n\n// Return a descriptor of the edge describing ovrXY\nEdgeDesc SGAlgorithms::overlapToEdgeDesc(Vertex* pY, const Overlap& ovrXY)\n{\n    EdgeDesc edXY;\n    edXY.pVertex = pY;\n    edXY.comp = (ovrXY.match.isRC()) ? EC_REVERSE : EC_SAME;\n    edXY.dir = ovrXY.match.coord[0].isLeftExtreme() ? ED_ANTISENSE : ED_SENSE; // X -> Y\n    return edXY;\n}\n\n// Return true if XZ has an overlap\nbool SGAlgorithms::hasTransitiveOverlap(const Overlap& ovrXY, const Overlap& ovrYZ)\n{\n    Match match_yx = ovrXY.match;\n    match_yx.swap(); \n    Match match_yz = ovrYZ.match;\n    return Match::doMatchesIntersect(match_yx, match_yz);\n}\n\n//\nEdgeDesc SGAlgorithms::getEdgeDescFromEdge(Edge* pEdge)\n{\n    return pEdge->getDesc();\n}\n\nvoid SGAlgorithms::printOverlapMap(const EdgeDescOverlapMap& overlapMap)\n{\n    for(EdgeDescOverlapMap::const_iterator iter = overlapMap.begin(); iter != overlapMap.end(); ++iter)\n    {\n        std::cout << \"  Overlap:\" << iter->second << \"\\n\";\n    }\n}\n\n"
  },
  {
    "path": "src/SGA/StringGraph/SGAlgorithms.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGAlgorithms - Algorithms for manipulating\n// the string graph\n//\n#ifndef SGALGORITHMS_H\n#define SGALGORITHMS_H\n\n#include \"Bigraph.h\"\n#include \"SGUtil.h\"\n#include <queue>\n\n\nnamespace SGAlgorithms\n{\n\n//\n// Helper data structures\n//\n\ntypedef std::set<VertexID> VertexIDSet;\ntypedef std::set<EdgeDesc> EdgeDescSet;\ntypedef std::map<EdgeDesc, Overlap> EdgeDescOverlapMap;\n\n// Remodel the graph by finding new edges for the given vertex to avoid\n// causing a disconnection when removing pDeleteEdge\nvoid remodelVertexForExcision(StringGraph* pGraph, Vertex* pVertex, Edge* pDeleteEdge);\n\n// Create the edges in pGraph described by the overlap\n// A pointer to the first edge of the edge/edge twin is returned or NULL\n// if the edges cannot be added\nEdge* createEdgesFromOverlap(StringGraph* pGraph, const Overlap& o, bool allowContained, size_t maxEdges = -1);\n\n// Calculate the error rate between the two vertex sequences\ndouble calcErrorRate(const Vertex* pX, const Vertex* pY, const Overlap& ovrXY);\n\n// Update the containment flags in the graph using the described overlaps\nvoid updateContainFlags(StringGraph* pGraph, Vertex* pVertex, EdgeDescOverlapMap& containMap);\nvoid updateContainFlags(StringGraph* pGraph, Vertex* pVertex, const EdgeDesc& ed, const Overlap& ovr);\n\n//\n// Overlap inference algorithms\n//\n\n// Infer an overlap from two edges\n// The input overlaps are between X->Y Y->Z\n// and the returned overlap is X->Z\nOverlap inferTransitiveOverlap(const Overlap& ovrXY, const Overlap& ovrYZ);\nEdgeDesc overlapToEdgeDesc(Vertex* pY, const Overlap& ovrXY);\n\n// Returns true if given overlaps X->Y, X->Z, the overlap X->Z is transitive\nbool isOverlapTransitive(const Vertex* pY, const Vertex* pZ, const Overlap& ovrXY, \n                         const Overlap& ovrXZ, const double maxER, const int minOverlap);\n\n// Returns true if XZ has a non-zero length overlap\nbool hasTransitiveOverlap(const Overlap& ovrXY, const Overlap& ovrYZ);\n\n// Partition a set of overlaps into transitive and irreducible edges\nvoid partitionTransitiveOverlaps(EdgeDescOverlapMap* pOverlapMap, \n                                 EdgeDescOverlapMap* pTransitive,\n                                 double maxER, int minLength);\n\n// Each read can have at most one edge to any other read in a given direction\n// This function removes any duplicates\nvoid removeSubmaximalOverlaps(EdgeDescOverlapMap* pOverlapMap);\n\n// Simple getters for std::transform\nEdgeDesc getEdgeDescFromEdge(Edge* pEdge);\n\nvoid printOverlapMap(const EdgeDescOverlapMap& overlapMap);\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/StringGraph/SGSearch.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGSearch - Algorithms and data structures\n// for searching a string graph\n//\n#include \"SGSearch.h\"\n#include <queue>\n\n//\nSGWalkBuilder::SGWalkBuilder(SGWalkVector& outWalks, bool bIndexWalk) : m_outWalks(outWalks), m_pCurrWalk(NULL), m_bIndexWalk(bIndexWalk)\n{\n    \n}\n\n//\nSGWalkBuilder::~SGWalkBuilder()\n{\n    // The pointer to the current walk should be NULL\n    // or else finishCurrentWalk() was not called for the last\n    // walk and the graph search algorithm has a bug\n    assert(m_pCurrWalk == NULL);\n}\n\n//\nvoid SGWalkBuilder::startNewWalk(Vertex* pStartVertex)\n{\n    m_pCurrWalk = new SGWalk(pStartVertex, m_bIndexWalk);\n}\n\n//\nvoid SGWalkBuilder::addEdge(Edge* pEdge)\n{\n    m_pCurrWalk->addEdge(pEdge);\n}\n\n//\nvoid SGWalkBuilder::finishCurrentWalk()\n{\n    m_outWalks.push_back(*m_pCurrWalk);\n    delete m_pCurrWalk;\n    m_pCurrWalk = NULL;\n}\n\n// Find all the walks between pX and pY that are within maxDistance\n// If the exhaustive flag is set, only return walks if all the possible\n// solutions have been found. If exhaustive is false, any walks found will be\n// returned in outWalks even if the search is aborted.\n// Returns true if all the possible walks were found.\nbool SGSearch::findWalks(Vertex* pX, Vertex* pY, EdgeDir initialDir,\n                         int maxDistance, size_t maxNodes, bool exhaustive, SGWalkVector& outWalks)\n{\n    SGSearchTree searchTree(pX, pY, initialDir, maxDistance, maxNodes);\n\n    // Iteravively perform the BFS using the search tree.\n    while(searchTree.stepOnce()) { }\n\n    // If the search was aborted, do not return any walks\n    // because we do not know if there are more valid paths from pX\n    // to pY that we could not find because the search space was too large\n    if(!searchTree.wasSearchAborted() || !exhaustive)\n    {\n        // Extract the walks from the graph as a vector of edges\n        SGWalkBuilder builder(outWalks, false);\n        searchTree.buildWalksToGoal(builder);\n    }\n    return !searchTree.wasSearchAborted();\n}\n\n// Search the graph for a set of walks that represent alternate\n// versions of the same sequence. These walks are found by searching\n// the graph for a set of walks that start/end at a common vertex and cover\n// every vertex inbetween the start/end points. Additionally, the internal\n// vertices cannot have an edge to any vertex that is not in the set of vertices\n// indicated by the walks. Finally, all walks must have the same orientation for the\n// end vertex.\n// If these conditions are met, we can retain one of the walks and cleanly remove\n// the others.\nvoid SGSearch::findVariantWalks(Vertex* pX, \n                                EdgeDir initialDir, \n                                int maxDistance,\n                                size_t maxWalks, \n                                SGWalkVector& outWalks)\n{\n    findCollapsedWalks(pX, initialDir, maxDistance, 500, outWalks);\n\n    if(outWalks.size() <= 1 || outWalks.size() > maxWalks)\n    {\n        outWalks.clear();\n        return;\n    }\n\n    Edge* pLastEdge = outWalks.front().getLastEdge();\n    Vertex* pLastVertex = pLastEdge->getEnd();\n    EdgeDir lastDir = pLastEdge->getTwinDir();\n\n    // Validate that any of the returned walks can be removed cleanly.\n    // This means that for all the internal vertices on each walk (between\n    // the common endpoints) the only links are to other vertices in the set,\n    // and that the last vertex has the same orientation for all walks.\n\n    // Construct the set of vertex IDs\n    std::set<Vertex*> completeVertexSet;\n    bool sameOrientation = true;\n    for(size_t i = 0; i < outWalks.size(); ++i)\n    {\n        if (outWalks[i].getLastEdge()->getTwinDir() != lastDir)\n        {\n            sameOrientation = false;\n            break;\n        }\n\n        VertexPtrVec verts = outWalks[i].getVertices();\n        for(size_t j = 0; j < verts.size(); ++j)\n        {\n            completeVertexSet.insert(verts[j]);\n        }\n    }\n\n    // Return if the walks do not have the same orientation for the last vertex\n    if(!sameOrientation)\n    {\n        outWalks.clear();\n        return;\n    }\n\n    // Check that each vertex in the internal nodes only has\n    // edges to the vertices in the set\n\n    bool cleanlyRemovable = true;\n\n    // Ensure that all the vertices linked to the start vertex\n    // in the specified dir are present in the set.\n    EdgePtrVec epv = pX->getEdges(initialDir);\n    cleanlyRemovable = checkEndpointsInSet(epv, completeVertexSet);\n\n    // Ensure that all the vertex linked to the last vertex\n    // in the incoming direction are preset\n    epv = pLastVertex->getEdges(lastDir);\n    cleanlyRemovable = cleanlyRemovable && checkEndpointsInSet(epv, completeVertexSet);\n\n    // Check that each vertex connected to an interval vertex is also present\n    for(std::set<Vertex*>::iterator iter = completeVertexSet.begin(); iter != completeVertexSet.end(); ++iter)\n    {\n        Vertex* pY = *iter;\n        if(pY == pX || pY == pLastVertex)\n            continue;\n        epv = pY->getEdges();\n        cleanlyRemovable = cleanlyRemovable && checkEndpointsInSet(epv, completeVertexSet);\n    }\n\n    if(!cleanlyRemovable)\n    {\n        outWalks.clear();\n    }\n    return;\n}\n\n// Check that all the endpoints of the edges in the edge pointer vector\n// are members of the set\nbool SGSearch::checkEndpointsInSet(EdgePtrVec& epv, std::set<Vertex*>& vertexSet)\n{\n    for(size_t i = 0; i < epv.size(); ++i)\n    {\n        if(vertexSet.find(epv[i]->getEnd()) == vertexSet.end())\n            return false;\n    }\n    return true;\n}\n\n// Return a set of walks that all start from pX and join together at some later vertex\n// If no such walk exists, an empty set is returned\nvoid SGSearch::findCollapsedWalks(Vertex* pX, EdgeDir initialDir, \n                                  int maxDistance, size_t maxNodes, \n                                  SGWalkVector& outWalks)\n{\n    SGSearchTree searchTree(pX, NULL, initialDir, maxDistance, maxNodes);\n\n    // Iteravively perform the BFS using the search tree. After each step\n    // we check if the search has collapsed to a single vertex.\n    bool done = false;\n    while(!done)\n    {\n        done = !searchTree.stepOnce();\n        if(searchTree.wasSearchAborted())\n            break;\n\n        Vertex* pCollapsedVertex;\n        bool isCollapsed = searchTree.hasSearchConverged(pCollapsedVertex);\n        if(isCollapsed)\n        {\n            assert(pCollapsedVertex != NULL);\n            \n            // pCollapsedVertex is common between all walks.\n            // Check that the extension distance for any walk is no longer than maxDistance.\n            // If this is the case, we truncate all walks so they end at pCollapsedVertex and return \n            // all the non-redundant walks in outWalks\n            SGWalkBuilder builder(outWalks, true);\n            searchTree.buildWalksContainingVertex(pCollapsedVertex, builder);\n            return;\n        }\n    }\n\n    // no collapsed walk found, return empty set\n    outWalks.clear();\n}\n\n// Count the number of reads that span the junction described by edge XY\n// X --------------\n// Y        ------------\n// Z            -----------\n// W                ----------\n// In this case Z spans the junction but W does not. \nint SGSearch::countSpanningCoverage(Edge* pXY, size_t maxQueue)\n{\n    (void)pXY;\n    (void)maxQueue;\n    \n    assert(false && \"deprecated\");\n    return 0;\n}\n"
  },
  {
    "path": "src/SGA/StringGraph/SGSearch.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGSearch - Algorithms and data structures\n// for searching a string graph\n//\n#ifndef SGSEARCH_H\n#define SGSEARCH_H\n\n#include \"Bigraph.h\"\n#include \"SGWalk.h\"\n#include \"GraphSearchTree.h\"\n#include <deque>\n\n// Returns the extension distance indicated\n// by the given edge\nstruct SGDistanceFunction\n{\n    int operator()(const Edge* pEdge) const\n    {\n        return pEdge->getSeqLen();\n    }\n};\n\n// \ntypedef GraphSearchTree<Vertex, Edge, SGDistanceFunction> SGSearchTree;\n\n//\nstruct SGWalkBuilder\n{\n    public:\n        SGWalkBuilder(SGWalkVector& outWalks, bool bIndexWalk);\n        ~SGWalkBuilder();\n\n        // These three functions must be provided by the builder object\n        // the generic graph code calls these to describe the walks through\n        // the graph\n        void startNewWalk(Vertex* pStartVertex);\n        void addEdge(Edge* pEdge);\n        void finishCurrentWalk();\n\n    private:\n        SGWalkVector& m_outWalks;\n        SGWalk* m_pCurrWalk;\n        bool m_bIndexWalk;\n\n};\n\n// String Graph searching algorithms\nnamespace SGSearch\n{\n    //\n    bool findWalks(Vertex* pX, \n                   Vertex* pY, \n                   EdgeDir initialDir,\n                   int maxDistance, \n                   size_t maxNodes, \n                   bool exhaustive,\n                   SGWalkVector& outWalks);\n\n    void findVariantWalks(Vertex* pX, \n                          EdgeDir initialDir, \n                          int maxDistance,\n                          size_t maxWalks, \n                          SGWalkVector& outWalks);\n\n    void findCollapsedWalks(Vertex* pX, EdgeDir initialDir, \n                            int maxDistance, size_t maxNodes,\n                            SGWalkVector& outWalks);\n\n    // Count the number of vertices that span the sequence junction\n    // described by edge XY. Returns -1 if the search was not completed\n    int countSpanningCoverage(Edge* pXY, size_t maxQueue);\n\n    // Returns true if all the endpoints of the edges in epv are in vertexSet\n    bool checkEndpointsInSet(EdgePtrVec& epv, std::set<Vertex*>& vertexSet);\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/StringGraph/SGUtil.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGUtils - Data structures/Functions related\n// to building and manipulating string graphs\n//\n#include \"SGUtil.h\"\n#include \"SeqReader.h\"\n#include \"SGAlgorithms.h\"\n#include \"SGVisitors.h\"\n\nStringGraph* SGUtil::loadASQG(const std::string& filename, const unsigned int minOverlap, \n                              bool allowContainments, size_t maxEdges)\n{\n    // Initialize graph\n    StringGraph* pGraph = new StringGraph;\n\n    std::istream* pReader = createReader(filename);\n\n    int stage = 0;\n    int line = 0;\n    std::string recordLine;\n    while(getline(*pReader, recordLine))\n    {\n        ASQG::RecordType rt = ASQG::getRecordType(recordLine);\n        switch(rt)\n        {\n            case ASQG::RT_HEADER:\n            {\n                if(stage != 0)\n                {\n                    std::cerr << \"Error: Unexpected header record found at line \" << line << \"\\n\";\n                    exit(EXIT_FAILURE);\n                }\n\n                ASQG::HeaderRecord headerRecord(recordLine);\n                const SQG::IntTag& overlapTag = headerRecord.getOverlapTag();\n                if(overlapTag.isInitialized())\n                    pGraph->setMinOverlap(overlapTag.get());\n                else\n                    pGraph->setMinOverlap(0);\n\n                const SQG::FloatTag& errorRateTag = headerRecord.getErrorRateTag();\n                if(errorRateTag.isInitialized())\n                    pGraph->setErrorRate(errorRateTag.get());\n                \n                const SQG::IntTag& containmentTag = headerRecord.getContainmentTag();\n                if(containmentTag.isInitialized())\n                    pGraph->setContainmentFlag(containmentTag.get());\n                else\n                    pGraph->setContainmentFlag(true); // conservatively assume containments are present\n\n                const SQG::IntTag& transitiveTag = headerRecord.getTransitiveTag();\n                if(!transitiveTag.isInitialized())\n                {\n                    std::cerr << \"Warning: ASQG does not have transitive tag\\n\";\n                    pGraph->setTransitiveFlag(true);\n                }\n                else\n                {\n                    pGraph->setTransitiveFlag(transitiveTag.get());\n                }\n\n                break;\n            }\n            case ASQG::RT_VERTEX:\n            {\n                // progress the stage if we are done the header\n                if(stage == 0)\n                    stage = 1;\n\n                if(stage != 1)\n                {\n                    std::cerr << \"Error: Unexpected vertex record found at line \" << line << \"\\n\";\n                    exit(EXIT_FAILURE);\n                }\n\n                ASQG::VertexRecord vertexRecord(recordLine);\n                const SQG::IntTag& ssTag = vertexRecord.getSubstringTag();\n\n\t\t//                Vertex* pVertex = new(pGraph->getVertexAllocator()) Vertex(vertexRecord.getID(), vertexRecord.getSeq());\n\t\tVertex* pVertex = new Vertex(vertexRecord.getID(), vertexRecord.getSeq());\n                if(ssTag.isInitialized() && ssTag.get() == 1)\n                {\n                    // Vertex is a substring of some other vertex, mark it as contained\n                    pVertex->setContained(true);\n                    pGraph->setContainmentFlag(true);\n                }\n                pGraph->addVertex(pVertex);\n                break;\n            }\n            case ASQG::RT_EDGE:\n            {\n                if(stage == 1)\n                    stage = 2;\n                \n                if(stage != 2)\n                {\n                    std::cerr << \"Error: Unexpected edge record found at line \" << line << \"\\n\";\n                    exit(EXIT_FAILURE);\n                }\n\n                ASQG::EdgeRecord edgeRecord(recordLine);\n                const Overlap& ovr = edgeRecord.getOverlap();\n\n                // Add the edge to the graph\n                if(ovr.match.getMinOverlapLength() >= (int)minOverlap)\n                    SGAlgorithms::createEdgesFromOverlap(pGraph, ovr, allowContainments, maxEdges);\n                break;\n            }\n        }\n        ++line;\n    }\n\n    // Completely delete the edges for all nodes that were marked as super-repetitive in the graph\n    SGSuperRepeatVisitor superRepeatVisitor;\n    pGraph->visit(superRepeatVisitor);\n\n    // Remove any duplicate edges\n    SGDuplicateVisitor dupVisit;\n    pGraph->visit(dupVisit);\n\n    SGGraphStatsVisitor statsVisit;\n    pGraph->visit(statsVisit);\n    // Remove identical vertices\n    // This is much cheaper to do than remove via\n    // SGContainRemove as no remodelling needs to occur\n   /*\n    SGIdenticalRemoveVisitor irv;\n    pGraph->visit(irv);\n\n    // Remove substring vertices\n    while(pGraph->hasContainment())\n    {\n        SGContainRemoveVisitor crv;\n        pGraph->visit(crv);\n    }\n*/\n    delete pReader;\n    return pGraph;\n}\n\n//JEREMIAH\nStringGraph* SGUtil::loadASQG(std::stringstream& pReader, const unsigned int minOverlap, \n                              bool allowContainments, size_t maxEdges)\n{\n    // Initialize graph\n    StringGraph* pGraph = new StringGraph;\n\n    //std::istream* pReader = createReader(filename);\n\n    int stage = 0;\n    int line = 0;\n    std::string recordLine;\n    while(getline(pReader, recordLine))\n    {\n        ASQG::RecordType rt = ASQG::getRecordType(recordLine);\n        switch(rt)\n        {\n            case ASQG::RT_HEADER:\n            {\n                if(stage != 0)\n                {\n                    std::cerr << \"Error: Unexpected header record found at line \" << line << \"\\n\";\n                    exit(EXIT_FAILURE);\n                }\n\n                ASQG::HeaderRecord headerRecord(recordLine);\n                const SQG::IntTag& overlapTag = headerRecord.getOverlapTag();\n                if(overlapTag.isInitialized())\n                    pGraph->setMinOverlap(overlapTag.get());\n                else\n                    pGraph->setMinOverlap(0);\n\n                const SQG::FloatTag& errorRateTag = headerRecord.getErrorRateTag();\n                if(errorRateTag.isInitialized())\n                    pGraph->setErrorRate(errorRateTag.get());\n                \n                const SQG::IntTag& containmentTag = headerRecord.getContainmentTag();\n                if(containmentTag.isInitialized())\n                    pGraph->setContainmentFlag(containmentTag.get());\n                else\n                    pGraph->setContainmentFlag(true); // conservatively assume containments are present\n\n                const SQG::IntTag& transitiveTag = headerRecord.getTransitiveTag();\n                if(!transitiveTag.isInitialized())\n                {\n                    std::cerr << \"Warning: ASQG does not have transitive tag\\n\";\n                    pGraph->setTransitiveFlag(true);\n                }\n                else\n                {\n                    pGraph->setTransitiveFlag(transitiveTag.get());\n                }\n\n                break;\n            }\n            case ASQG::RT_VERTEX:\n            {\n                // progress the stage if we are done the header\n                if(stage == 0)\n                    stage = 1;\n\n                if(stage != 1)\n                {\n                    std::cerr << \"Error: Unexpected vertex record found at line \" << line << \"\\n\";\n                    exit(EXIT_FAILURE);\n                }\n\n                ASQG::VertexRecord vertexRecord(recordLine);\n                const SQG::IntTag& ssTag = vertexRecord.getSubstringTag();\n\n\t\t//                Vertex* pVertex = new(pGraph->getVertexAllocator()) Vertex(vertexRecord.getID(), vertexRecord.getSeq());\n                Vertex* pVertex = new Vertex(vertexRecord.getID(), vertexRecord.getSeq());\n                if(ssTag.isInitialized() && ssTag.get() == 1)\n                {\n                    // Vertex is a substring of some other vertex, mark it as contained\n                    pVertex->setContained(true);\n                    pGraph->setContainmentFlag(true);\n                }\n                pGraph->addVertex(pVertex);\n                break;\n            }\n            case ASQG::RT_EDGE:\n            {\n                if(stage == 1)\n                    stage = 2;\n                \n                if(stage != 2)\n                {\n                    std::cerr << \"Error: Unexpected edge record found at line \" << line << \"\\n\";\n                    exit(EXIT_FAILURE);\n                }\n\n                ASQG::EdgeRecord edgeRecord(recordLine);\n                const Overlap& ovr = edgeRecord.getOverlap();\n\n                // Add the edge to the graph\n                if(ovr.match.getMinOverlapLength() >= (int)minOverlap)\n                    SGAlgorithms::createEdgesFromOverlap(pGraph, ovr, allowContainments, maxEdges);\n                break;\n            }\n        }\n        ++line;\n    }\n\n    // Completely delete the edges for all nodes that were marked as super-repetitive in the graph\n    SGSuperRepeatVisitor superRepeatVisitor;\n    pGraph->visit(superRepeatVisitor);\n\n    // Remove any duplicate edges\n    SGDuplicateVisitor dupVisit;\n    pGraph->visit(dupVisit);\n\n    //SGGraphStatsVisitor statsVisit;\n    //pGraph->visit(statsVisit);\n    // Remove identical vertices\n    // This is much cheaper to do than remove via\n    // SGContainRemove as no remodelling needs to occur\n   /*\n    SGIdenticalRemoveVisitor irv;\n    pGraph->visit(irv);\n\n    // Remove substring vertices\n    while(pGraph->hasContainment())\n    {\n        SGContainRemoveVisitor crv;\n        pGraph->visit(crv);\n    }\n*/\n    //delete pReader;\n    return pGraph;\n}\n\n// Load a graph (with no edges) from a fasta file\nStringGraph* SGUtil::loadFASTA(const std::string& filename)\n{\n    StringGraph* pGraph = new StringGraph;\n    SeqReader reader(filename);\n    SeqRecord record;\n\n    while(reader.get(record))\n    {\n      //Vertex* pVertex = new(pGraph->getVertexAllocator()) Vertex(record.id, record.seq.toString());\n        Vertex* pVertex = new Vertex(record.id, record.seq.toString());\n        pGraph->addVertex(pVertex);\n    }\n    return pGraph;\n}\n"
  },
  {
    "path": "src/SGA/StringGraph/SGUtil.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// SGUtils - Data structures/Functions related\n// to building and manipulating string graphs\n//\n#ifndef SGUTIL_H\n#define SGUTIL_H\n\n#include \"Bigraph.h\"\n#include \"ASQG.h\"\n\n// typedefs\ntypedef Bigraph StringGraph;\n\nnamespace SGUtil\n{\n// Main string graph loading function\n// The allowContainments flag forces the string graph to retain identical vertices\n// Vertices that are substrings of other vertices (SS flag = 1) are never kept\nStringGraph* loadASQG(const std::string& filename, const unsigned int minOverlap, bool allowContainments = false, size_t maxEdges = -1);\nStringGraph* loadASQG(std::stringstream& pReader, const unsigned int minOverlap, bool allowContainments = false, size_t maxEdges = -1);\n\n// Load a string graph from a fasta file.\n// Returns a graph where each sequence in the fasta is a vertex but there are no edges in the graph.\nStringGraph* loadFASTA(const std::string& filename);\n\n\n};\n#endif\n"
  },
  {
    "path": "src/SGA/StringGraph/SGVisitors.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGVisitors - Algorithms that visit\n// each vertex in the graph and perform some\n// operation\n//\n#include \"SGVisitors.h\"\n#include \"CompleteOverlapSet.h\"\n#include \"SGSearch.h\"\n#include \"stdaln.h\"\n\n//\n// SGFastaVisitor - output the vertices in the graph in \n// fasta format\n//\nbool SGFastaVisitor::visit(StringGraph* /*pGraph*/, Vertex* pVertex)\n{\n    m_fileHandle << \">\" << pVertex->getID() << \" \" <<  pVertex->getSeq().length() \n                 << \" \" << 0 << \"\\n\";\n    m_fileHandle << pVertex->getSeq() << \"\\n\";\n    return false;\n}\n\n// jwala added\nbool SGVisitorContig::visit(StringGraph* /*pGraph*/, Vertex* pVertex)\n{\n  m_ct.push_back(SeqLib::UnalignedSequence(pVertex->getID(), pVertex->getSeq().toString(),std::string()));\n  return false;\n}\n\n\n//\n// SGTransRedVisitor - Perform a transitive reduction about this vertex\n// This uses Myers' algorithm (2005, The fragment assembly string graph)\n// Precondition: the edge list is sorted by length (ascending)\nvoid SGTransitiveReductionVisitor::previsit(StringGraph* pGraph)\n{\n    // The graph must not have containments\n    assert(!pGraph->hasContainment());\n\n    // Set all the vertices in the graph to \"vacant\"\n    pGraph->setColors(GC_WHITE);\n    pGraph->sortVertexAdjListsByLen();\n\n    marked_verts = 0;\n    marked_edges = 0;\n}\n\n//\nbool SGTransitiveReductionVisitor::visit(StringGraph* /*pGraph*/, Vertex* pVertex)\n{\n    size_t trans_count = 0;\n    static const size_t FUZZ = 10; // see myers\n\n    for(size_t idx = 0; idx < ED_COUNT; idx++)\n    {\n        EdgeDir dir = EDGE_DIRECTIONS[idx];\n        EdgePtrVec edges = pVertex->getEdges(dir); // These edges are already sorted\n        if(edges.size() == 0)\n            continue;\n\n        for(size_t i = 0; i < edges.size(); ++i)\n            (edges[i])->getEnd()->setColor(GC_GRAY);\n\n        Edge* pLongestEdge = edges.back();\n        size_t longestLen = pLongestEdge->getSeqLen() + FUZZ;\n        \n        // Stage 1\n        for(size_t i = 0; i < edges.size(); ++i)\n        {\n            Edge* pVWEdge = edges[i];\n            Vertex* pWVert = pVWEdge->getEnd();\n\n            EdgeDir transDir = !pVWEdge->getTwinDir();\n            if(pWVert->getColor() == GC_GRAY)\n            {\n                EdgePtrVec w_edges = pWVert->getEdges(transDir);\n                for(size_t j = 0; j < w_edges.size(); ++j)\n                {\n                    Edge* pWXEdge = w_edges[j];\n                    size_t trans_len = pVWEdge->getSeqLen() + pWXEdge->getSeqLen();\n                    if(trans_len <= longestLen)\n                    {\n                        if(pWXEdge->getEnd()->getColor() == GC_GRAY)\n                        {\n                            // X is the endpoint of an edge of V, therefore it is transitive\n                            pWXEdge->getEnd()->setColor(GC_BLACK);\n                        }\n                    }\n                    else\n                        break;\n                }\n            }\n        }\n        \n        // Stage 2\n        for(size_t i = 0; i < edges.size(); ++i)\n        {\n            Edge* pVWEdge = edges[i];\n            Vertex* pWVert = pVWEdge->getEnd();\n\n            EdgeDir transDir = !pVWEdge->getTwinDir();\n            EdgePtrVec w_edges = pWVert->getEdges(transDir);\n            for(size_t j = 0; j < w_edges.size(); ++j)\n            {\n                Edge* pWXEdge = w_edges[j];\n                size_t len = pWXEdge->getSeqLen();\n\n                if(len < FUZZ || j == 0)\n                {\n                    if(pWXEdge->getEnd()->getColor() == GC_GRAY)\n                    {\n                        // X is the endpoint of an edge of V, therefore it is transitive\n                        pWXEdge->getEnd()->setColor(GC_BLACK);\n                    }\n                }\n                else\n                {\n                    break;\n                }\n            }\n        }\n\n        for(size_t i = 0; i < edges.size(); ++i)\n        {\n            if(edges[i]->getEnd()->getColor() == GC_BLACK)\n            {\n                // Mark the edge and its twin for removal\n                if(edges[i]->getColor() != GC_BLACK || edges[i]->getTwin()->getColor() != GC_BLACK)\n                {\n                    edges[i]->setColor(GC_BLACK);\n                    edges[i]->getTwin()->setColor(GC_BLACK);\n                    marked_edges += 2;\n                    trans_count++;\n                }\n            }\n            edges[i]->getEnd()->setColor(GC_WHITE);\n        }\n    }\n\n    if(trans_count > 0)\n        ++marked_verts;\n\n    return false;\n}\n\n// Remove all the marked edges\nvoid SGTransitiveReductionVisitor::postvisit(StringGraph* pGraph)\n{\n    //printf(\"TR marked %d verts and %d edges\\n\", marked_verts, marked_edges);\n    pGraph->sweepEdges(GC_BLACK);\n    pGraph->setTransitiveFlag(false);\n    assert(pGraph->checkColors(GC_WHITE));\n}\n\n//\n// SGIdenticalRemoveVisitor - Removes identical vertices\n// from the graph. This algorithm is less complex \n// than SGContainRemoveVisitor because we do not have to\n// remodel the graph in this case because no irreducible\n// edges need to be moved.\n//\nvoid SGIdenticalRemoveVisitor::previsit(StringGraph* pGraph)\n{\n    pGraph->setColors(GC_WHITE);\n    count = 0;\n}\n\n// \nbool SGIdenticalRemoveVisitor::visit(StringGraph* /*pGraph*/, Vertex* pVertex)\n{\n    if(!pVertex->isContained())\n        return false;\n\n    // Check if this vertex is identical to any other vertex\n    EdgePtrVec neighborEdges = pVertex->getEdges();\n    for(size_t i = 0; i < neighborEdges.size(); ++i)\n    {\n        Edge* pEdge = neighborEdges[i];\n        Vertex* pOther = pEdge->getEnd();\n        if(pVertex->getSeqLen() != pOther->getSeqLen())\n            continue;\n        \n        Overlap ovr = pEdge->getOverlap();\n        if(!ovr.isContainment() || ovr.getContainedIdx() != 0)\n            continue;\n\n        if(pVertex->getSeq() == pOther->getSeq())\n        {\n            pVertex->setColor(GC_BLACK);\n            ++count;\n            break;\n        }\n    }\n            \n    return false;\n}\n\nvoid SGIdenticalRemoveVisitor::postvisit(StringGraph* pGraph)\n{\n    pGraph->sweepVertices(GC_BLACK);\n}\n\n//\n// SGContainRemoveVisitor - Removes contained\n// vertices from the graph\n//\nvoid SGContainRemoveVisitor::previsit(StringGraph* pGraph)\n{\n    pGraph->setColors(GC_WHITE);\n\n    // Clear the containment flag, if any containments are added\n    // during this algorithm the flag will be reset and another\n    // round must be re-run\n    pGraph->setContainmentFlag(false);    \n}\n\n//\nbool SGContainRemoveVisitor::visit(StringGraph* pGraph, Vertex* pVertex)\n{\n\n    if(!pVertex->isContained())\n        return false;\n\n    //cout << pVertex->getID() << endl; // debug\n    // Add any new irreducible edges that exist when pToRemove is deleted\n    // from the graph\n    EdgePtrVec neighborEdges = pVertex->getEdges();\n    \n    // If the graph has been transitively reduced, we have to check all\n    // the neighbors to see if any new edges need to be added. If the graph is a\n    // complete overlap graph we can just remove the edges to the deletion vertex\n    if(!pGraph->hasTransitive() && !pGraph->isExactMode())\n    {\n        // This must be done in order of edge length or some transitive edges\n        // may be created\n        EdgeLenComp comp;\n        std::sort(neighborEdges.begin(), neighborEdges.end(), comp);\n\n        for(size_t j = 0; j < neighborEdges.size(); ++j)\n        {\n            Vertex* pRemodelVert = neighborEdges[j]->getEnd();\n            Edge* pRemodelEdge = neighborEdges[j]->getTwin();\n            SGAlgorithms::remodelVertexForExcision(pGraph, \n                                                   pRemodelVert, \n                                                   pRemodelEdge);\n        }\n    }\n            \n    // Delete the edges from the graph\n    for(size_t j = 0; j < neighborEdges.size(); ++j)\n    {\n        Vertex* pRemodelVert = neighborEdges[j]->getEnd();\n        Edge* pRemodelEdge = neighborEdges[j]->getTwin();\n        pRemodelVert->deleteEdge(pRemodelEdge);\n        pVertex->deleteEdge(neighborEdges[j]);\n    }\n    pVertex->setColor(GC_BLACK);\n    return false;\n}\n\nvoid SGContainRemoveVisitor::postvisit(StringGraph* pGraph)\n{\n    pGraph->sweepVertices(GC_BLACK);\n}\n\n//\n// Validate the structure of the graph by detecting missing\n// or erroneous edges\n//\n\n//\nbool SGValidateStructureVisitor::visit(StringGraph* pGraph, Vertex* pVertex)\n{\n    SGAlgorithms::EdgeDescOverlapMap irreducibleMap;\n    SGAlgorithms::EdgeDescOverlapMap transitiveMap;\n    \n    // Construct the set of overlaps reachable within the current parameters\n    CompleteOverlapSet vertexOverlapSet(pVertex, pGraph->getErrorRate(), pGraph->getMinOverlap());\n    vertexOverlapSet.computeIrreducible(NULL, NULL);\n\n    SGAlgorithms::EdgeDescOverlapMap missingMap;\n    SGAlgorithms::EdgeDescOverlapMap extraMap;\n    \n    vertexOverlapSet.getDiffMap(missingMap, extraMap);  \n    \n    if(!missingMap.empty())\n    {\n        std::cout << \"Missing irreducible for \" << pVertex->getID() << \":\\n\";\n        SGAlgorithms::printOverlapMap(missingMap);\n    }\n\n    if(!extraMap.empty())\n    {\n        std::cout << \"Extra irreducible for \" << pVertex->getID() << \":\\n\";\n        SGAlgorithms::printOverlapMap(extraMap);\n    }\n    return false;\n}\n\n//\n// SGTrimVisitor - Remove \"dead-end\" vertices from the graph\n//\nvoid SGTrimVisitor::previsit(StringGraph* pGraph)\n{\n    num_island = 0;\n    num_terminal = 0;\n    pGraph->setColors(GC_WHITE);\n}\n\n// Mark any nodes that either dont have edges or edges in only one direction for removal\nbool SGTrimVisitor::visit(StringGraph* /*pGraph*/, Vertex* pVertex)\n{\n    if(pVertex->countEdges() == 0)\n    {\n        // Is an island, remove if the sequence length is less than the threshold\n        if(pVertex->getSeqLen() < m_minLength)\n        {\n            pVertex->setColor(GC_BLACK);\n            ++num_island;\n        }\n    }\n    else\n    {\n        // Check if this node is a dead-end\n        for(size_t idx = 0; idx < ED_COUNT; idx++)\n        {\n            EdgeDir dir = EDGE_DIRECTIONS[idx];\n            if(pVertex->countEdges(dir) == 0 && pVertex->getSeqLen() < m_minLength)\n            {\n                pVertex->setColor(GC_BLACK);\n                ++num_terminal;\n            }\n        }\n    }\n\n    return false;\n}\n\n// Remove all the marked edges\nvoid SGTrimVisitor::postvisit(StringGraph* pGraph)\n{\n    pGraph->sweepVertices(GC_BLACK);\n    //printf(\"StringGraphTrim: Removed %d island and %d dead-end short vertices\\n\", num_island, num_terminal);\n}\n\n//\n// SGDuplicateVisitor - Detect and remove duplicate edges\n//\nvoid SGDuplicateVisitor::previsit(StringGraph* pGraph)\n{\n    assert(pGraph->checkColors(GC_WHITE));\n    (void)pGraph;\n    m_hasDuplicate = false;\n}\n\nbool SGDuplicateVisitor::visit(StringGraph* /*pGraph*/, Vertex* pVertex)\n{\n    m_hasDuplicate = pVertex->markDuplicateEdges(GC_RED) || m_hasDuplicate;\n    return false;\n}\n\n\nvoid SGDuplicateVisitor::postvisit(StringGraph* pGraph)\n{\n    assert(pGraph->checkColors(GC_WHITE));\n    //if(m_hasDuplicate)\n    // {\n    //int numRemoved = pGraph->sweepEdges(GC_RED);\n        //if(!m_bSilent)\n        //    std::cerr << \"Warning: removed \" << numRemoved << \" duplicate edges\\n\";\n\t//}\n}\n\n//\n// Small repeat resolver - Remove edges induced from small (sub-read length)\n// repeats\n// \nvoid SGSmallRepeatResolveVisitor::previsit(StringGraph*)\n{\n\n}\n\n//\nbool SGSmallRepeatResolveVisitor::visit(StringGraph* /*pGraph*/, Vertex* pX)\n{\n    bool changed = false;\n\n    // If the vertex has more than MAX_EDGES, do not\n    // attempt to resolve\n    size_t MAX_EDGES = 10;\n\n    for(size_t idx = 0; idx < ED_COUNT; idx++)\n    {\n        EdgeDir dir = EDGE_DIRECTIONS[idx];\n        EdgePtrVec x_edges = pX->getEdges(dir); // These edges are already sorted\n\n        if(x_edges.size() < 2 || x_edges.size() > MAX_EDGES)\n            continue;\n\n        // Try to eliminate the shortest edge from this vertex (let this be X->Y)\n        // If Y has a longer edge than Y->X in the same direction, we remove X->Y\n\n        // Edges are sorted by length so the last edge is the shortest\n        Edge* pXY = x_edges.back();\n        size_t xy_len = pXY->getOverlap().getOverlapLength(0);\n        size_t x_longest_len = x_edges.front()->getOverlap().getOverlapLength(0);\n        if(xy_len == x_longest_len)\n            continue;\n\n        Edge* pYX = pXY->getTwin();\n        Vertex* pY = pXY->getEnd();\n\n        EdgePtrVec y_edges = pY->getEdges(pYX->getDir());\n        if(y_edges.size() > MAX_EDGES)\n            continue;\n\n        size_t yx_len = pYX->getOverlap().getOverlapLength(0);\n\n        size_t y_longest_len = 0;\n        for(size_t i = 0; i < y_edges.size(); ++i)\n        {\n            Edge* pYZ = y_edges[i];\n            if(pYZ == pYX)\n                continue; // skip Y->X\n\n            size_t yz_len = pYZ->getOverlap().getOverlapLength(0);\n            if(yz_len > y_longest_len)\n                y_longest_len = yz_len;\n        }\n\n\n        if(y_longest_len > yx_len)\n        {\n            // Delete the edge if the difference between the shortest and longest is greater than minDiff\n            int x_diff = x_longest_len - xy_len;\n            int y_diff = y_longest_len - yx_len;\n\n            if(x_diff > m_minDiff && y_diff > m_minDiff)\n            {\n                pX->deleteEdge(pXY);\n                pY->deleteEdge(pYX);\n                changed = true;\n            }\n        }\n    }\n\n    return changed;\n}\n\n//\nvoid SGSmallRepeatResolveVisitor::postvisit(StringGraph* pGraph)\n{\n    pGraph->sweepEdges(GC_RED);\n}\n\n//\n// OverlapRatio Visitor - Only keep edges in the graph when the ratio\n// between their length and the length of the longest overlap meets a minimum cutoff\n// \nvoid SGOverlapRatioVisitor::previsit(StringGraph*)\n{\n\n}\n\n//\nbool SGOverlapRatioVisitor::visit(StringGraph* /*pGraph*/, Vertex* pX)\n{\n    bool changed = false;\n\n    for(size_t idx = 0; idx < ED_COUNT; idx++)\n    {\n        EdgeDir dir = EDGE_DIRECTIONS[idx];\n        EdgePtrVec x_edges = pX->getEdges(dir); // These edges are already sorted\n\n        if(x_edges.size() < 2)\n            continue;\n\n        size_t x_longest_len = x_edges.front()->getOverlap().getOverlapLength(0);\n        for(size_t i = 1; i < x_edges.size(); ++i)\n        {\n            size_t curr_len = x_edges[i]->getOverlap().getOverlapLength(0);\n            double ratio = (double)curr_len / x_longest_len;\n            if(ratio < m_minRatio)\n            {\n                x_edges[i]->setColor(GC_RED);\n                x_edges[i]->getTwin()->setColor(GC_RED);\n                changed = true;\n            }\n        }\n    }\n\n    return changed;\n}\n\n//\nvoid SGOverlapRatioVisitor::postvisit(StringGraph* pGraph)\n{\n    pGraph->sweepEdges(GC_RED);\n}\n\n//\n// SGSuperRepeatVisitor\n//\n\n// Remove all edges of nodes that have been marked as super repeats\nvoid SGSuperRepeatVisitor::previsit(StringGraph*)\n{\n    m_num_superrepeats = 0;\n}\n\n//\nbool SGSuperRepeatVisitor::visit(StringGraph*, Vertex* pVertex)\n{\n    if(pVertex->isSuperRepeat())\n    {\n        pVertex->deleteEdges();\n        m_num_superrepeats += 1;\n        return true;\n    }\n    return false;\n}\n\n//\nvoid SGSuperRepeatVisitor::postvisit(StringGraph*)\n{\n  //printf(\"Deleted edges for %zu super repetitive vertices\\n\", m_num_superrepeats); \n}\n\n//\n// SGSmoothingVisitor - Find branches in the graph\n// which arise from variation and remove them\n//\nvoid SGSmoothingVisitor::previsit(StringGraph* pGraph)\n{\n    pGraph->setColors(GC_WHITE);\n    m_simpleBubblesRemoved = 0;\n    m_complexBubblesRemoved = 0;\n}\n\n//\nbool SGSmoothingVisitor::visit(StringGraph* pGraph, Vertex* pVertex)\n{\n    (void)pGraph;\n    if(pVertex->getColor() == GC_RED)\n        return false;\n\n    bool found = false;\n    for(size_t idx = 0; idx < ED_COUNT; idx++)\n    {\n        EdgeDir dir = EDGE_DIRECTIONS[idx];\n        EdgePtrVec edges = pVertex->getEdges(dir);\n        if(edges.size() <= 1)\n            continue;\n\n        for(size_t i = 0; i < edges.size(); ++i)\n        {\n            if(edges[i]->getEnd()->getColor() == GC_RED)\n                return false;\n        }\n\n        //std::cout << \"Smoothing \" << pVertex->getID() << \"\\n\";\n\n        const int MAX_WALKS = 10;\n        const int MAX_DISTANCE = 5000;\n        bool bIsDegenerate = false;\n        bool bFailGapCheck = false;\n        bool bFailDivergenceCheck = false;\n        bool bFailIndelSizeCheck = false;\n\n        SGWalkVector variantWalks;\n        SGSearch::findVariantWalks(pVertex, dir, MAX_DISTANCE, MAX_WALKS, variantWalks);\n\n        if(variantWalks.size() > 0)\n        {\n            found = true;\n            size_t selectedIdx = -1;\n            size_t selectedCoverage = 0;\n\n            // Calculate the minimum amount overlapped on the start/end vertex.\n            // This is used to properly extract the sequences from walks that represent the variation.\n            int minOverlapX = std::numeric_limits<int>::max();\n            int minOverlapY = std::numeric_limits<int>::max();\n\n            for(size_t i = 0; i < variantWalks.size(); ++i)\n            {\n                if(variantWalks[i].getNumEdges() <= 1)\n                    bIsDegenerate = true;\n\n                // Calculate the walk coverage using the internal vertices of the walk. \n                // The walk with the highest coverage will be retained\n                size_t walkCoverage = 0;\n                for(size_t j = 1; j < variantWalks[i].getNumVertices() - 1; ++j)\n                    walkCoverage += variantWalks[i].getVertex(j)->getCoverage();\n\n                if(walkCoverage > selectedCoverage || selectedCoverage == 0)\n                {\n                    selectedIdx = i;\n                    selectedCoverage = walkCoverage;\n                }\n                \n                Edge* pFirstEdge = variantWalks[i].getFirstEdge();\n                Edge* pLastEdge = variantWalks[i].getLastEdge();\n\n                if((int)pFirstEdge->getMatchLength() < minOverlapX)\n                    minOverlapX = pFirstEdge->getMatchLength();\n\n                if((int)pLastEdge->getTwin()->getMatchLength() < minOverlapY)\n                    minOverlapY = pLastEdge->getTwin()->getMatchLength();\n            }\n\n            // Calculate the strings for each walk that represent the region of variation\n            StringVector walkStrings;\n            for(size_t i = 0; i < variantWalks.size(); ++i)\n            {\n                Vertex* pStartVertex = variantWalks[i].getStartVertex();\n                Vertex* pLastVertex = variantWalks[i].getLastVertex();\n                assert(pStartVertex != NULL && pLastVertex != NULL);\n                \n                std::string full = variantWalks[i].getString(SGWT_START_TO_END);\n                int posStart = 0;\n                int posEnd = 0;\n\n                if(dir == ED_ANTISENSE)\n                {\n                    // pLast   -----------\n                    // pStart          ------------\n                    // full    --------------------\n                    // out             ----\n                    posStart = pLastVertex->getSeqLen() - minOverlapY;\n                    posEnd = full.size() - (pStartVertex->getSeqLen() - minOverlapX);\n                }\n                else\n                {\n                    // pStart         --------------\n                    // pLast   -----------\n                    // full    ---------------------\n                    // out            ----\n                    posStart = pStartVertex->getSeqLen() - minOverlapX; // match start position\n                    posEnd = full.size() - (pLastVertex->getSeqLen() - minOverlapY); // match end position\n                }\n                \n                std::string out;\n                if(posEnd > posStart)\n                    out = full.substr(posStart, posEnd - posStart);\n                walkStrings.push_back(out);\n            }\n\n            assert(selectedIdx != (size_t)-1);\n            SGWalk& selectedWalk = variantWalks[selectedIdx];\n            assert(selectedWalk.isIndexed());\n\n            // Check the divergence of the other walks to this walk\n            StringVector cigarStrings;\n            std::vector<int> maxIndel;\n            std::vector<double> gapPercent; // percentage of matching that is gaps\n            std::vector<double> totalPercent; // percent of total alignment that is mismatch or gap\n\n            cigarStrings.resize(variantWalks.size());\n            gapPercent.resize(variantWalks.size());\n            totalPercent.resize(variantWalks.size());\n            maxIndel.resize(variantWalks.size());\n\n            for(size_t i = 0; i < variantWalks.size(); ++i)\n            {\n                if(i == selectedIdx)\n                    continue;\n\n                // We want to compute the total gap length, total mismatches and percent\n                // divergence between the two paths.\n                int matchLen = 0;\n                int totalDiff = 0;\n                int gapLength = 0;\n                int maxGapLength = 0;\n                // We have to handle the degenerate case where one internal string has zero length\n                // this can happen when there is an isolated insertion/deletion and the walks are like:\n                // x -> y -> z\n                // x -> z\n                if(walkStrings[selectedIdx].empty() || walkStrings[i].empty())\n                {\n                    matchLen = std::max(walkStrings[selectedIdx].size(), walkStrings[i].size());\n                    totalDiff = matchLen;\n                    gapLength = matchLen;\n                }\n                else\n                {\n                    AlnAln *aln_global;\n                    aln_global = aln_stdaln(walkStrings[selectedIdx].c_str(), walkStrings[i].c_str(), &aln_param_blast, 1, 1);\n\n                    // Calculate the alignment parameters\n                    while(aln_global->outm[matchLen] != '\\0')\n                    {\n                        if(aln_global->outm[matchLen] == ' ')\n                            totalDiff += 1;\n                        matchLen += 1;\n                    }\n\n                    std::stringstream cigarSS;\n                    for (int j = 0; j != aln_global->n_cigar; ++j)\n                    {\n                        char cigarOp = \"MID\"[aln_global->cigar32[j]&0xf];\n                        int cigarLen = aln_global->cigar32[j]>>4;\n                        if(cigarOp == 'I' || cigarOp == 'D')\n                        {\n                            gapLength += cigarLen;\n                            if(gapLength > maxGapLength)\n                                maxGapLength = gapLength;\n                        }\n\n                        cigarSS << cigarLen;\n                        cigarSS << cigarOp;\n                    }\n                    cigarStrings[i] = cigarSS.str();\n                    aln_free_AlnAln(aln_global);\n                }\n\n                double percentDiff = (double)totalDiff / matchLen;\n                double percentGap = (double)gapLength / matchLen;\n\n                if(percentDiff > m_maxTotalDivergence)\n                    bFailDivergenceCheck = true;\n                \n                if(percentGap > m_maxGapDivergence)\n                    bFailGapCheck = true;\n\n                if(maxGapLength > m_maxIndelLength)\n                    bFailIndelSizeCheck = true;\n\n                gapPercent[i] = percentGap;\n                totalPercent[i] = percentDiff;\n                maxIndel[i] = maxGapLength;\n            }\n\n            if(bIsDegenerate || bFailGapCheck || bFailDivergenceCheck || bFailIndelSizeCheck)\n                continue;\n\n            // Write the selected path to the variants file as variant 0\n            int variantIdx = 0;\n            std::string selectedSequence = selectedWalk.getString(SGWT_START_TO_END);\n            std::stringstream ss;\n            ss << \"variant-\" << m_numRemovedTotal << \"/\" << variantIdx++;\n            writeFastaRecord(&m_outFile, ss.str(), selectedSequence);\n\n\n            // The vertex set for each walk is not necessarily disjoint,\n            // the selected walk may contain vertices that are part\n            // of other paths. We handle this be initially marking all\n            // vertices of the \n            for(size_t i = 0; i < variantWalks.size(); ++i)\n            {\n                if(i == selectedIdx)\n                    continue;\n\n                SGWalk& currWalk = variantWalks[i];\n                for(size_t j = 0; j < currWalk.getNumEdges() - 1; ++j)\n                {\n                    Edge* currEdge = currWalk.getEdge(j);\n                    \n                    // If the vertex is also on the selected path, do not mark it\n                    Vertex* currVertex = currEdge->getEnd();\n                    if(!selectedWalk.containsVertex(currVertex->getID()))\n                    {\n                        currEdge->getEnd()->setColor(GC_RED);\n                    }\n                }\n\n                // Write the variant to a file\n                std::string variantSequence = currWalk.getString(SGWT_START_TO_END);\n                std::stringstream variantID;\n                std::stringstream ss;\n                ss << \"variant-\" << m_numRemovedTotal << \"/\" << variantIdx++;\n                ss << \" IGD:\" << (double)gapPercent[i] << \" ITD:\" << totalPercent[i] << \" MID: \" << maxIndel[i] << \" InternalCigar:\" << cigarStrings[i];\n                writeFastaRecord(&m_outFile, ss.str(), variantSequence);\n            }\n\n            if(variantWalks.size() == 2)\n                m_simpleBubblesRemoved += 1;\n            else\n                m_complexBubblesRemoved += 1;\n            ++m_numRemovedTotal;\n        }\n    }\n    return found;\n}\n\n// Remove all the marked edges\nvoid SGSmoothingVisitor::postvisit(StringGraph* pGraph)\n{\n    pGraph->sweepVertices(GC_RED);\n    assert(pGraph->checkColors(GC_WHITE));\n\n    //printf(\"VariationSmoother: Removed %d simple and %d complex bubbles\\n\", m_simpleBubblesRemoved, m_complexBubblesRemoved);\n}\n\n//\n// SGGraphStatsVisitor - Collect summary stasitics\n// about the graph\n//\nvoid SGGraphStatsVisitor::previsit(StringGraph* /*pGraph*/)\n{\n    num_terminal = 0;\n    num_island = 0;\n    num_monobranch = 0;\n    num_dibranch = 0;\n    num_simple = 0;\n    num_edges = 0;\n    num_vertex = 0;\n    sum_edgeLen = 0;\n}\n\n// Find bubbles (nodes where there is a split and then immediate rejoin) and mark them for removal\nbool SGGraphStatsVisitor::visit(StringGraph* /*pGraph*/, Vertex* pVertex)\n{\n    int s_count = pVertex->countEdges(ED_SENSE);\n    int as_count = pVertex->countEdges(ED_ANTISENSE);\n    if(s_count == 0 && as_count == 0)\n    {\n        ++num_island;\n    }\n    else if(s_count == 0 || as_count == 0)\n    {\n        ++num_terminal;\n    }\n\n    if(s_count > 1 && as_count > 1)\n        ++num_dibranch;\n    else if(s_count > 1 || as_count > 1)\n        ++num_monobranch;\n\n    if(s_count == 1 || as_count == 1)\n        ++num_simple;\n\n    num_edges += (s_count + as_count);\n    ++num_vertex;\n\n    EdgePtrVec edges = pVertex->getEdges();\n    for(size_t i = 0; i < edges.size(); ++i)\n        sum_edgeLen += edges[i]->getSeqLen();\n\n    return false;\n}\n\n//\nvoid SGGraphStatsVisitor::postvisit(StringGraph* /*pGraph*/)\n{\n  printf(\"Vertices: %d Edges: %d Islands: %d Tips: %d Monobranch: %d Dibranch: %d Simple: %d\\n\", num_vertex, num_edges, \n  num_island, num_terminal,\n                                                                                                   num_monobranch, num_dibranch, num_simple);\n  \n}\n"
  },
  {
    "path": "src/SGA/StringGraph/SGVisitors.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGVisitors - Algorithms that visit\n// each vertex in the graph and perform some\n// operation\n//\n#include \"SGAlgorithms.h\"\n#include \"SGUtil.h\"\n#include \"Util.h\"\n//#include \"contigs.h\"\n#include \"SeqLib/UnalignedSequence.h\"\n\n#ifndef SGVISITORS_H\n#define SGVISITORS_H\n\n// Visit each node, writing it to a file as a fasta record\nstruct SGFastaVisitor\n{\n    // constructor\n    SGFastaVisitor(std::string filename) : m_fileHandle(filename.c_str()) {}\n    ~SGFastaVisitor() { m_fileHandle.close(); }\n\n    // functions\n    void previsit(StringGraph* /*pGraph*/) {}\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph* /*pGraph*/) {}\n\n    // data\n    std::ofstream m_fileHandle;\n};\n\n// Visit each node, writing it to a file as a fasta record\n// jwala modified\nstruct SGVisitorContig\n{\n  // constructor\n  SGVisitorContig() {}\n  ~SGVisitorContig() {}\n  \n  // functions\n  void previsit(StringGraph* /*pGraph*/) {}\n  bool visit(StringGraph* pGraph, Vertex* pVertex);\n  void postvisit(StringGraph* /*pGraph*/) {}\n  \n  // data\n  SeqLib::UnalignedSequenceVector m_ct;\n};\n\n// Visit each node, writing it to a file as a fasta record\n// Run the Myers transitive reduction algorithm on each node\nstruct SGTransitiveReductionVisitor\n{\n    SGTransitiveReductionVisitor() {}\n    void previsit(StringGraph* pGraph);\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph*);\n\n    int marked_verts;\n    int marked_edges;\n};\n\n// Remove identical vertices from the graph\nstruct SGIdenticalRemoveVisitor\n{\n    SGIdenticalRemoveVisitor() {}\n    void previsit(StringGraph* pGraph);\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph* pGraph);\n    int count;\n};\n\n// Remove contained vertices from the graph\nstruct SGContainRemoveVisitor\n{\n    SGContainRemoveVisitor() {}\n    void previsit(StringGraph* pGraph);\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph* pGraph);\n};\n\n// Validate that the graph does not contain\n// any extra edges or missing irreducible edges\nstruct SGValidateStructureVisitor\n{\n    SGValidateStructureVisitor() {}\n    void previsit(StringGraph*) {}\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph*) {}\n};\n\n// Remodel the graph to infer missing edges or remove erroneous edges\nstruct SGSmallRepeatResolveVisitor\n{\n    SGSmallRepeatResolveVisitor(int minDiff) : m_minDiff(minDiff) {}\n    void previsit(StringGraph* pGraph);\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph*);\n\n    int m_minDiff;\n};\n\n// Remove edges from the graph when the ratio between an edge's overlap length\n// and the longest overlap for the vertex is less than the given parameter\nstruct SGOverlapRatioVisitor\n{\n    SGOverlapRatioVisitor(double minRatio) : m_minRatio(minRatio) {}\n    void previsit(StringGraph* pGraph);\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph*);\n\n    double m_minRatio;\n};\n\n// Detects and removes small \"tip\" vertices from the graph\n// when they are less than minLength in size\nstruct SGTrimVisitor\n{\n    SGTrimVisitor(size_t minLength) : m_minLength(minLength) {}\n    void previsit(StringGraph* pGraph);\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph*);\n\n    size_t m_minLength;\n    int num_island;\n    int num_terminal;\n};\n\n// Detect and remove duplicate edges\nstruct SGDuplicateVisitor\n{\n    SGDuplicateVisitor(bool silent = false) : m_bSilent(silent) {}\n    void previsit(StringGraph*);\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph*);\n\n    bool m_hasDuplicate;\n    bool m_bSilent;\n};\n\n// Remove the edges of super-repetitive vertices in the graph\nstruct SGSuperRepeatVisitor\n{\n    SGSuperRepeatVisitor() {}\n    void previsit(StringGraph* pGraph);\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph*);\n\n    size_t m_num_superrepeats;\n};\n\n// Smooth out variation in the graph\nstruct SGSmoothingVisitor\n{\n    SGSmoothingVisitor(std::string filename, \n                       double maxGapDiv, \n                       double maxTotalDiv, \n                       int maxIndelLength) : m_numRemovedTotal(0), \n                                             m_maxGapDivergence(maxGapDiv),\n                                             m_maxTotalDivergence(maxTotalDiv),\n                                             m_maxIndelLength(maxIndelLength),\n                                             m_outFile(filename.c_str()) {}\n\n    void previsit(StringGraph* pGraph);\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph*);\n\n    int m_simpleBubblesRemoved;\n    int m_complexBubblesRemoved;\n    int m_numRemovedTotal;\n\n    double m_maxGapDivergence;\n    double m_maxTotalDivergence;\n    int m_maxIndelLength;\n    std::ofstream m_outFile;\n};\n\n// Compile summary statistics for the graph\nstruct SGGraphStatsVisitor\n{\n    SGGraphStatsVisitor() {}\n    void previsit(StringGraph* pGraph);\n    bool visit(StringGraph* pGraph, Vertex* pVertex);\n    void postvisit(StringGraph*);\n\n    int num_terminal;\n    int num_island;\n    int num_monobranch;\n    int num_dibranch;\n    int num_simple;\n    int num_edges;\n    int num_vertex;\n    size_t sum_edgeLen;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/StringGraph/SGWalk.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGWalk - Data structure holding a walk through\n// the graph\n//\n#include \"SGWalk.h\"\n\n//\nSGWalk::SGWalk(Vertex* pStartVertex, bool bIndexWalk) : m_pStartVertex(pStartVertex), m_extensionDistance(0), m_extensionFinished(false)\n{\n    if(bIndexWalk)\n        m_pWalkIndex = new WalkIndex;\n    else\n        m_pWalkIndex = NULL;\n}\n\n//\nSGWalk::~SGWalk()\n{\n    if(m_pWalkIndex != NULL)\n    {\n        delete m_pWalkIndex;\n        m_pWalkIndex = NULL;\n    }\n}\n\n//\nSGWalk::SGWalk(const SGWalk& other)\n{\n    m_pStartVertex = other.m_pStartVertex;\n    m_edges = other.m_edges;\n    m_extensionDistance = other.m_extensionDistance;\n    m_extensionFinished = other.m_extensionFinished;\n    m_pWalkIndex = NULL;\n\n    if(other.m_pWalkIndex != NULL)\n        m_pWalkIndex = new WalkIndex(*other.m_pWalkIndex);\n}\n\n// Construct the walk structure from a vector of edges\nSGWalk::SGWalk(const EdgePtrVec& edgeVec, bool bIndexWalk) : m_extensionDistance(0), m_extensionFinished(false)\n\n{\n    assert(!edgeVec.empty());\n\n    if(bIndexWalk)\n        m_pWalkIndex = new WalkIndex;\n    else\n        m_pWalkIndex = NULL;\n\n    // The start vector is the start vertex of the first edge\n    Edge* first = edgeVec.front();\n    m_pStartVertex = first->getStart();\n\n    for(EdgePtrVec::const_iterator iter = edgeVec.begin();\n                                   iter != edgeVec.end();\n                                   ++iter)\n    {\n        addEdge(*iter);\n    }\n}\n\n\n//\nSGWalk& SGWalk::operator=(const SGWalk& other)\n{\n    if(&other == this)\n        return *this; // self-assign\n   \n    m_pStartVertex = other.m_pStartVertex;\n    m_edges = other.m_edges;\n    m_extensionDistance = other.m_extensionDistance;\n    \n    if(m_pWalkIndex != NULL)\n        delete m_pWalkIndex;\n    \n    if(other.m_pWalkIndex != NULL)\n        m_pWalkIndex = new WalkIndex(*other.m_pWalkIndex);\n        \n    return *this;\n}\n\n//\nvoid SGWalk::addEdge(Edge* pEdge)\n{\n    m_edges.push_back(pEdge);\n    m_extensionDistance += pEdge->getSeqLen();\n\n    // Add the vertex ID to the index if necessary\n    if(m_pWalkIndex != NULL)\n        m_pWalkIndex->insert(m_edges.back()->getEndID());\n}\n\n//\nvoid SGWalk::setFinished(bool b)\n{\n    m_extensionFinished = b;\n}\n\nbool SGWalk::isFinished() const\n{\n    return m_extensionFinished;\n}\n\n//\nvoid SGWalk::popLast()\n{\n    m_edges.pop_back();\n}\n\n// \nVertex* SGWalk::getStartVertex() const\n{\n    return m_pStartVertex;\n}\n\n//\nsize_t SGWalk::getNumVertices() const\n{\n    return getNumEdges() + 1;\n}\n\n//\nsize_t SGWalk::getNumEdges() const\n{\n    return m_edges.size();\n}\n\nbool SGWalk::isIndexed() const\n{\n    return m_pWalkIndex != NULL;\n}\n\n//\nbool SGWalk::containsVertex(const VertexID& id) const\n{\n    if(m_pWalkIndex == NULL)\n        assert(false);\n    return m_pWalkIndex->count(id) > 0;\n}\n\n//\nvoid SGWalk::truncate(const VertexID& id)\n{\n    EdgePtrVec::iterator iter = m_edges.begin();\n    while(iter != m_edges.end())\n    {\n        if((*iter)->getEndID() == id)\n            break;\n        ++iter;\n    }\n    assert(iter != m_edges.end());\n    m_edges.erase(iter + 1, m_edges.end());\n}\n\n// Construct the extension string corresponding to the path\nstd::string SGWalk::getString(SGWalkType type, SGWalkVertexPlacementVector* pPlacementVector) const\n{\n    std::string out;\n\n    // Append the full length of the starting vertex to the walk\n    if(type == SGWT_START_TO_END || type == SGWT_INTERNAL)\n    {\n        out.append(m_pStartVertex->getSeq().toString());\n\n        // Add the first record to the placement vector if required\n        if(pPlacementVector != NULL)\n        {\n            SGWalkVertexPlacement firstPlace;\n            firstPlace.pVertex = m_pStartVertex;\n            firstPlace.position = 0; // 0-based coordinates\n            firstPlace.isRC = false;\n            pPlacementVector->push_back(firstPlace);\n        }\n    }\n\n    // Determine if the string should go to the end of the last vertex\n    // in the path\n    size_t stop = m_edges.size();\n\n    // The first edge is always in correct frame of reference \n    // so the comp is EC_SAME. This variable tracks where the \n    // string that is being added is different from the starting sequence\n    // and needs to be flipped\n    EdgeComp currComp = EC_SAME;\n\n    // If the walk direction is antisense, we reverse every component and then\n    // reverse the entire string to generate the final string\n    bool reverseAll = !m_edges.empty() && m_edges[0]->getDir() == ED_ANTISENSE;\n    if(reverseAll)\n        out = reverse(out);\n    \n    for(size_t i = 0; i < stop; ++i)\n    {\n        Edge* pYZ = m_edges[i];\n        // Append in the extension string\n        std::string edge_str = pYZ->getLabel();\n        assert(edge_str.size() != 0);\n\n        // Determine whether this node is reverse complement wrt the string\n        // we are building\n        if(currComp == EC_REVERSE)\n            edge_str = reverseComplement(edge_str);\n\n        if(reverseAll)\n            edge_str = reverse(edge_str);\n\n        // Calculate the next comp, between X and Z\n        EdgeComp ecYZ = pYZ->getComp();\n        EdgeComp ecXZ;\n        if(ecYZ == EC_SAME)\n            ecXZ = currComp;\n        else\n            ecXZ = !currComp;\n\n        out.append(edge_str);\n        \n        // Add this record into the placement vector\n        if(pPlacementVector != NULL)\n        {\n            SGWalkVertexPlacement placement;\n            placement.pVertex = pYZ->getEnd();\n            placement.isRC = ecXZ == EC_REVERSE;\n            placement.position = out.size() - pYZ->getEnd()->getSeqLen();\n            pPlacementVector->push_back(placement);\n        }\n\n        currComp = ecXZ;\n    }\n\n    // If we want the internal portion of the string (which does not contain the endpoints\n    // perform the truncation now. This needs to be done before the reversal.\n    if(type == SGWT_INTERNAL)\n    {\n        if(pPlacementVector != NULL)\n        {\n            std::cerr << \"Error: Vertex placement not supported for SGWT_INTERNAL walk types\\n\";\n            exit(EXIT_FAILURE);\n        }\n\n        Edge* pFirstEdge = getFirstEdge();\n        Edge* pLastEdge = getLastEdge();\n        if(pFirstEdge == NULL || pLastEdge == NULL)\n        {\n            out.clear();\n        }\n        else\n        {\n            Vertex* pStart = m_pStartVertex;\n            Vertex* pLast = getLastVertex();\n            int start = pStart->getSeqLen() - pFirstEdge->getMatchLength();\n            int end = out.size() - (pLast->getSeqLen() - pLastEdge->getMatchLength());\n\n            if(end <= start)\n                out.clear();\n            else\n            {\n                std::string ss = out.substr(start, end - start);\n                out = ss;\n            }\n        }\n    }\n\n    if(out.empty())\n        std::cout << \"No output for walk: \" << pathSignature() << \"\\n\";\n\n    if(reverseAll)\n    {\n        out = reverse(out);\n\n        // Reverse the placement vector too, including flipping the alignment coordinates\n        if(pPlacementVector != NULL)\n        {\n            std::reverse(pPlacementVector->begin(), pPlacementVector->end());\n            for(size_t i = 0; i < pPlacementVector->size(); ++i)\n            {\n                SGWalkVertexPlacement& item = pPlacementVector->at(i);\n                item.position = out.size() - item.position - item.pVertex->getSeqLen();\n            }\n        }\n    }\n\n    return out;\n}\n\n// Returns a vector of EdgeComps of the orientation of each\n// vertex in the path with respect to the start of the walk\nstd::vector<EdgeComp> SGWalk::getOrientationsToStart() const\n{\n    std::vector<EdgeComp> out;\n    if(m_edges.empty())\n        return out;\n    \n    // Tracking variable of the orientation between X (the start)\n    // and the next vertex in the walk\n    EdgeComp compXY = m_edges[0]->getComp();\n    out.push_back(compXY);\n\n    for(size_t i = 1; i < m_edges.size(); ++i)\n    {\n        // Calculate the orientation of XZ using YZ\n        EdgeComp compYZ = m_edges[i]->getComp();\n\n        // The direction flips if the XY/YZ are different\n        EdgeComp compXZ = (compXY == compYZ) ? EC_SAME : EC_REVERSE;\n        out.push_back(compXZ);\n        compXY = compXZ;\n    }\n    return out;\n}\n\n// Get the substring of the full path string starting from position fromX\n// to position toY on the first and last vertices, respectively.\n// dirX is the direction along contig X towards vertex Y, vis-versa for dirY\nstd::string SGWalk::getFragmentString(const Vertex* pX, const Vertex* pY,\n                                      int fromX, int toY, \n                                      EdgeDir dirX, EdgeDir dirY) const\n{\n    std::string out;\n\n    // Calculate the portion of X that we should include in the string\n    // If dirX is SENSE, we take the everything after position fromX\n    // otherwise we take everything up to and including fromX\n    SeqCoord xCoord(0,0,pX->getSeqLen());\n\n    if(dirX == ED_SENSE)\n    {\n        xCoord.interval.start = fromX;\n        xCoord.interval.end = pX->getSeqLen() - 1;\n    }\n    else\n    {\n        xCoord.interval.start = 0;\n        xCoord.interval.end = fromX;\n    }\n\n    // Handle the trivial case where pX == pY and the walk is found immediately\n    if(m_edges.empty() && pX == pY)\n    {\n        if(dirY == ED_SENSE)\n        {\n            xCoord.interval.start = toY;\n        }\n        else\n        {\n            xCoord.interval.end = toY;\n        }\n    }\n\n    if(!xCoord.isValid())\n        return \"\";\n\n    //\n    out.append(m_pStartVertex->getSeq().substr(xCoord.interval.start, xCoord.length()));\n\n    // Determine if the string should go to the end of the last vertex\n    // in the path\n    size_t stop = m_edges.size();\n\n    // The first edge is always in correct frame of reference \n    // so the comp is EC_SAME. This variable tracks where the \n    // string that is being added is different from the starting sequence\n    // and needs to be flipped\n    EdgeComp currComp = EC_SAME;\n\n    // If the walk direction is antisense, we reverse every component and then\n    // reverse the entire string to generate the final string\n    bool reverseAll = !m_edges.empty() && m_edges[0]->getDir() == ED_ANTISENSE;\n    if(reverseAll)\n        out = reverse(out);\n\n    for(size_t i = 0; i < stop; ++i)\n    {\n        Edge* pYZ = m_edges[i];\n        bool isLast = i == (stop - 1);\n\n        if(!isLast)\n        {\n            // Append the extension string without modification\n            std::string edge_str = pYZ->getLabel();\n            assert(edge_str.size() != 0);\n            if(currComp == EC_REVERSE)\n                edge_str = reverseComplement(edge_str);\n\n            if(reverseAll)\n                edge_str = reverse(edge_str);\n            out.append(edge_str);\n        }\n        else\n        {\n            // \n            const Edge* pZY = pYZ->getTwin();\n            \n            // get the unmatched coordinates on pY\n            SeqCoord unmatched = pZY->getMatchCoord().complement();\n\n            // Now, we have to shrink the unmatched interval on Y to\n            // only incude up to toY\n            if(dirY == ED_SENSE)\n                unmatched.interval.start = toY;\n            else\n                unmatched.interval.end = toY;\n\n            if(!unmatched.isValid())\n                return \"\";\n\n            std::string seq = unmatched.getSubstring(pY->getStr());\n            if(pYZ->getComp() != currComp)\n                seq = reverseComplement(seq);\n            \n            if(reverseAll)\n                seq = reverse(seq);\n            out.append(seq);\n        }\n\n        // Calculate the next comp, between X and Z\n        EdgeComp ecYZ = pYZ->getComp();\n        EdgeComp ecXZ;\n        if(ecYZ == EC_SAME)\n            ecXZ = currComp;\n        else\n            ecXZ = !currComp;\n\n        currComp = ecXZ;\n    }\n\n    if(reverseAll)\n        out = reverse(out);\n    return out;\n}\n\n//\nint SGWalk::getExtensionDistance() const\n{\n    return m_extensionDistance;\n}\n\n// This is equivalent to the extension distance\nint SGWalk::getEndToEndDistance() const\n{\n    return m_extensionDistance;\n}\n\n// \nint SGWalk::getStartToEndDistance() const\n{\n    return m_pStartVertex->getSeqLen() + getEndToEndDistance();\n}\n\n// Returns the distance from the end of pStart to the beginning of the last vertex in the path\n// This can be negative if they overlap\nint SGWalk::getEndToStartDistance() const\n{\n    if(m_edges.empty())\n        return 0;\n\n    int len_x = m_pStartVertex->getSeqLen();\n    int len_y = getLastEdge()->getEnd()->getSeqLen();\n    return getStartToEndDistance() - (len_x + len_y);\n}\n\n//\nEdge* SGWalk::getFirstEdge() const\n{\n    if(m_edges.empty())\n        return NULL;\n    else\n        return m_edges.front();\n}\n\n//\nEdge* SGWalk::getLastEdge() const\n{\n    if(m_edges.empty())\n        return NULL;\n    else\n        return m_edges.back();\n}\n\n//\nVertex* SGWalk::getLastVertex() const\n{\n    if(m_edges.empty())\n        return NULL;\n    else\n        return getLastEdge()->getEnd();\n}\n\n//\nEdge* SGWalk::getEdge(size_t idx) const\n{\n    return m_edges[idx];\n}\n\n\n//\nVertex* SGWalk::getVertex(size_t idx) const\n{\n    assert(idx < getNumVertices());\n    if(idx == 0)\n        return m_pStartVertex;\n    else\n        return m_edges[idx - 1]->getEnd();\n}\n\n//\nVertexPtrVec SGWalk::getVertices() const\n{\n    VertexPtrVec out;\n    out.push_back(m_pStartVertex);\n    for(EdgePtrVec::const_iterator iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n        out.push_back((*iter)->getEnd());\n    return out;\n}\n\n// Return a string describing this path\nstd::string SGWalk::pathSignature() const\n{\n    std::stringstream ss;\n    ss << m_pStartVertex->getID() << \",\";\n    for(EdgePtrVec::const_iterator iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n        ss << (*iter)->getEndID() << \", \";\n    return ss.str();\n}\n\n// \nvoid SGWalk::print() const\n{\n    std::cout << \"Walk start: \" << m_pStartVertex->getID() << \"\\nWalk: \";\n    const Vertex* pLast = m_pStartVertex;\n    for(EdgePtrVec::const_iterator iter = m_edges.begin(); iter != m_edges.end(); ++iter)\n    {\n        //std::cout << *(*iter) << \" \";\n        std::cout << (*iter)->getStartID() << \" -- \" << (*iter)->getEndID() << \",\" << (*iter)->getDir() << \",\" << (*iter)->getComp() << \"\\t\";\n        assert((*iter)->getStart() == pLast);\n        pLast = (*iter)->getEnd();\n    }\n    std::cout << \"\\n\";\n}\n\n// \nvoid SGWalk::printSimple() const\n{\n    std::cout << pathSignature() << \"\\n\";\n}\n\n// \nbool SGWalk::compareByTotalLength(const SGWalk& a, const SGWalk& b)\n{\n    return a.getStartToEndDistance() > b.getStartToEndDistance();\n}\n\n"
  },
  {
    "path": "src/SGA/StringGraph/SGWalk.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGWalk - Data structure holding a walk through\n// the graph\n//\n#ifndef SGWALK_H\n#define SGWALK_H\n\n#include \"Bigraph.h\"\n#include <deque>\n\n// A walk on the string graph is given by the starting vertex\n// then a vector of edges used in the walk\nenum SGWalkType\n{\n    SGWT_START_TO_END, // include every vertex of the walk\n    SGWT_EXTENSION, // do not include the start vertex\n    SGWT_INTERNAL // do not include the start and end vertex\n};\n\n// Placement data for the position of a vertex sequence in a walk\nstruct SGWalkVertexPlacement\n{\n    Vertex* pVertex;\n    int position; // 0-based\n    bool isRC; \n};\ntypedef std::vector<SGWalkVertexPlacement> SGWalkVertexPlacementVector;\n\nclass SGWalk\n{\n    public:\n        \n        SGWalk(Vertex* pStartVertex, bool bIndexWalk = false);\n        SGWalk(const SGWalk& other);\n        SGWalk(const EdgePtrVec& edgeVec, bool bIndexWalk = false);\n\n        ~SGWalk();\n\n        SGWalk& operator=(const SGWalk& other);\n\n        void addEdge(Edge* pEdge);\n        void popLast();\n        void setFinished(bool b);\n        bool isFinished() const;\n\n        VertexPtrVec getVertices() const;\n        Vertex* getStartVertex() const;\n        Vertex* getLastVertex() const;\n\n        // Returns a vector of EdgeComps of the orientation of each\n        // vertex in the path with respect to the start of the walk\n        std::vector<EdgeComp> getOrientationsToStart() const;\n\n        Edge* getFirstEdge() const;\n        Edge* getLastEdge() const;\n        Edge* getEdge(size_t idx) const;\n        Vertex* getVertex(size_t idx) const;\n\n        size_t getNumVertices() const;\n        size_t getNumEdges() const;\n\n        // Returns true if the walk contains the specified vertex\n        // If the walk is not indexed, this will assert\n        bool isIndexed() const;\n        bool containsVertex(const VertexID& id) const;\n\n        // Truncate the walk after the first instance of id\n        void truncate(const VertexID& id);\n\n        // Get the string this walk represents. This function supports multiple different walk types\n        // (see the enum description). If the pointer to the VertexPlacementVector is not NULL,\n        // the position of the vertices within the walk are written there.\n        std::string getString(SGWalkType type, SGWalkVertexPlacementVector* pPlacementVector = NULL) const;\n        \n        // Get the substring of the full path string starting from position fromX\n        // to position toY on the first and last vertices, respectively\n        std::string getFragmentString(const Vertex* pX, const Vertex* pY,\n                                      int fromX, int toY, \n                                      EdgeDir dirX, EdgeDir dirY) const;\n\n        // Return a string identifying the path through the graph this walk represents\n        std::string pathSignature() const;\n\n        // distance calculations\n        int getExtensionDistance() const;\n        int getEndToEndDistance() const;\n        int getStartToEndDistance() const;\n        int getEndToStartDistance() const;\n\n        // Compare a pair of walks by the total string length\n        // Returns true if the walk of a is longer than the walk of b\n        static bool compareByTotalLength(const SGWalk& a, const SGWalk& b);\n\n        void print() const;\n        void printSimple() const;\n\n    private:\n        \n        Vertex* m_pStartVertex;\n        EdgePtrVec m_edges;\n        \n        typedef std::set<VertexID> WalkIndex;\n        WalkIndex* m_pWalkIndex;\n\n        // The distance from the end of pStart to the last vertex in the walk\n        // This equals the length of the extension string\n        // x -----------\n        // y     ------------\n        // z              ----------\n        // distance     ************\n        int m_extensionDistance;\n        bool m_extensionFinished;\n};\n\ntypedef std::vector<SGWalk> SGWalkVector;\ntypedef std::deque<SGWalk> WalkQueue;\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWT.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWT - All functions that use a BWT include this file\n// it simple typedefs the BWT name to the implementation\n// of the BWT that we want, either the uncompressed version\n// (SBWT) or the run-length encoded version (RLBWT). This could \n// be done using inheritence but the BWT is so used so much that \n// overhead of calling virtual functions is unwanted\n//          \n//\n#ifndef BWT_H\n#define BWT_H\n\n#include \"RLBWT.h\"\n#include \"SBWT.h\"\n\ntypedef RLBWT BWT;\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTAlgorithms.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// bwt_algorithms.cpp - Algorithms for aligning to a bwt structure\n//\n#include \"BWTAlgorithms.h\"\n\n// Find the interval in pBWT corresponding to w\n// If w does not exist in the BWT, the interval \n// coordinates [l, u] will be such that l > u\nBWTInterval BWTAlgorithms::findInterval(const BWT* pBWT, const std::string& w)\n{\n    int len = w.size();\n    int j = len - 1;\n    char curr = w[j];\n    BWTInterval interval;\n    initInterval(interval, curr, pBWT);\n    --j;\n\n    for(;j >= 0; --j)\n    {\n        curr = w[j];\n        updateInterval(interval, curr, pBWT);\n        if(!interval.isValid())\n            return interval;\n    }\n    return interval;\n}\n\n// Find the interval in pBWT corresponding to w\n// using a cache of short k-mer intervals to avoid\n// some of the iterations\nBWTInterval BWTAlgorithms::findIntervalWithCache(const BWT* pBWT, const BWTIntervalCache* pIntervalCache, const std::string& w)\n{\n\n  size_t cacheLen = pIntervalCache->getCachedLength();\n\n  if(w.size() < cacheLen)\n    return findInterval(pBWT, w);\n\n    // Compute the interval using the cache for the last k bases\n    int len = w.size();\n    int j = len - cacheLen;\n\n    // Check whether the input string has a '$' in it.\n    // We don't cache these strings so if it does\n    // we have to do a direct lookup\n    if(index(w.c_str() + j, '$') != NULL)\n        return findInterval(pBWT, w);\n\n    BWTInterval interval = pIntervalCache->lookup(w.c_str() + j);\n    j -= 1;\n    for(;j >= 0; --j)\n    {\n        char curr = w[j];\n        updateInterval(interval, curr, pBWT);\n        if(!interval.isValid())\n            return interval;\n    }\n    return interval;\n}\n\n// Delegate the findInterval call based on what indices are loaded\nBWTInterval BWTAlgorithms::findInterval(const BWTIndexSet& indices, const std::string& w)\n{\n    if(indices.pCache != NULL)\n        return findIntervalWithCache(indices.pBWT, indices.pCache, w);\n    else\n        return findInterval(indices.pBWT, w);\n}\n\n// Find the intervals in pBWT/pRevBWT corresponding to w\n// If w does not exist in the BWT, the interval \n// coordinates [l, u] will be such that l > u\nBWTIntervalPair BWTAlgorithms::findIntervalPair(const BWT* pBWT, const BWT* pRevBWT, const std::string& w)\n{\n    BWTIntervalPair intervals;    \n    int len = w.size();\n    int j = len - 1;\n    char curr = w[j];\n    initIntervalPair(intervals, curr, pBWT, pRevBWT);\n    --j;\n\n    for(;j >= 0; --j)\n    {\n        curr = w[j];\n        updateBothL(intervals, curr, pBWT);\n        if(!intervals.isValid())\n            return intervals;\n    }\n    return intervals;\n}\n\n// Find the interval pair corresponding to w using a cached intervals for short substrings\nBWTIntervalPair BWTAlgorithms::findIntervalPairWithCache(const BWT* pBWT, \n                                                         const BWT* pRevBWT, \n                                                         const BWTIntervalCache* pFwdCache, \n                                                         const BWTIntervalCache* pRevCache,\n                                                         const std::string& w)\n{\n    size_t cacheLen = pFwdCache->getCachedLength();\n    if(w.size() < cacheLen)\n        return findIntervalPair(pBWT, pRevBWT, w);\n    \n    // Compute the fwd and reverse interval using the cache for the last k bases\n    BWTIntervalPair ip;\n    int len = w.size();\n    int j = len - cacheLen;\n\n    std::string ss = w.substr(j);\n    std::string r_ss = reverse(ss);\n    assert(ss.size() == cacheLen);\n    ip.interval[0] = pFwdCache->lookup(ss.c_str());\n    ip.interval[1] = pRevCache->lookup(r_ss.c_str());\n    \n    // Extend the interval to the full length of w as normal\n    j -= 1;\n    for(;j >= 0; --j)\n    {\n        updateBothL(ip, w[j], pBWT);\n        if(!ip.isValid())\n            return ip;\n    }\n    return ip;\n}\n\n// Count the number of occurrences of string w, including the reverse complement\nsize_t BWTAlgorithms::countSequenceOccurrences(const std::string& w, const BWT* pBWT)\n{\n    BWTInterval fwd_interval = findInterval(pBWT, w);\n    BWTInterval rc_interval = findInterval(pBWT, reverseComplement(w));\n\n    size_t count = 0;\n    if(fwd_interval.isValid())\n        count += fwd_interval.size();\n    if(rc_interval.isValid())\n        count += rc_interval.size();\n    return count;\n}\n\n// Count the number of occurrences of string w, including the reverse complement using a BWTInterval cache\nsize_t BWTAlgorithms::countSequenceOccurrencesWithCache(const std::string& w, const BWT* pBWT, const BWTIntervalCache* pIntervalCache)\n{\n    BWTInterval fwd_interval = findIntervalWithCache(pBWT, pIntervalCache, w);\n    BWTInterval rc_interval = findIntervalWithCache(pBWT, pIntervalCache, reverseComplement(w));\n\n    size_t count = 0;\n    if(fwd_interval.isValid())\n        count += fwd_interval.size();\n    if(rc_interval.isValid())\n        count += rc_interval.size();\n    return count;\n}\n\n//\nsize_t BWTAlgorithms::countSequenceOccurrences(const std::string& w, const BWTIndexSet& indices)\n{\n    assert(indices.pBWT != NULL);\n    if(indices.pCache != NULL)\n        return countSequenceOccurrencesWithCache(w, indices.pBWT, indices.pCache);\n    else\n        return countSequenceOccurrences(w, indices.pBWT);\n}\n\nsize_t BWTAlgorithms::countSequenceOccurrencesSingleStrand(const std::string& w, const BWTIndexSet& indices)\n{\n    assert(indices.pBWT != NULL);\n    assert(indices.pCache != NULL);\n\n    BWTInterval interval = findIntervalWithCache(indices.pBWT, indices.pCache, w);\n    return interval.isValid() ? interval.size() : 0;\n}\n\n\n// Return the count of all the possible one base extensions of the string w.\n// This returns the number of times the suffix w[i, l]A, w[i, l]C, etc \n// appears in the FM-index for all i s.t. length(w[i, l]) == overlapLen.\nAlphaCount64 BWTAlgorithms::calculateExactExtensions(const unsigned int overlapLen, const std::string& w, const BWT* pBWT, const BWT* pRevBWT)\n{\n    // The algorithm is as follows:\n    // We perform a backward search on the FM-index of w.\n    // For each signficant suffix (length w[i,l] >= minOverlap)\n    // we determine the proper prefixes that match w[i,l]. For each proper prefix matching, \n    // we compute the number of extensions of A,C,G,T for those prefix.\n    AlphaCount64 ext_counts;\n    BWTIntervalPair ranges;\n    size_t l = w.length();\n    int start = l - 1;\n    BWTAlgorithms::initIntervalPair(ranges, w[start], pBWT, pRevBWT);\n\n    for(int i = start - 1; i >= 0; --i)\n    {\n        // Compute the range of the suffix w[i, l]\n        BWTAlgorithms::updateBothL(ranges, w[i], pBWT);\n\n        // Break if the suffix is no longer found\n        if(!(ranges.interval[0].isValid() && ranges.interval[1].isValid())) \n            break;\n\n        if((l - i) == overlapLen)\n        {\n            if(ranges.interval[1].isValid())\n            {\n                assert(ranges.interval[1].lower > 0);\n                // The count for each extension is the difference between rank(B, upper) and rank(B, lower - 1)\n                AlphaCount64 ac = pRevBWT->getOccDiff(ranges.interval[1].lower - 1, ranges.interval[1].upper);\n                ext_counts += ac;\n            }\n        }\n    }\n    return ext_counts;\n}\n\n// Calculate the 1-base de Bruijn graph extensions of str\n// The includes the reverse complement\nAlphaCount64 BWTAlgorithms::calculateDeBruijnExtensions(const std::string str, \n                                                        const BWT* pBWT, \n                                                        const BWT* pRevBWT, \n                                                        EdgeDir direction, \n                                                        const BWTIntervalCache* pFwdCache,\n                                                        const BWTIntervalCache* pRevCache)\n{\n    size_t k = str.size();\n    size_t p = k - 1;\n    \n    std::string pmer;\n\n    // In the sense direction, we extend from the 3' end\n    if(direction == ED_SENSE)\n        pmer = str.substr(1, p);\n    else\n        pmer = str.substr(0, p);\n    assert(pmer.length() == p);\n    std::string rc_pmer = reverseComplement(pmer);\n\n    // Get the interval for the p-mer and its reverse complement\n    BWTIntervalPair ip;\n    BWTIntervalPair rc_ip;\n\n    // If pointers to interval caches are available, use them\n    // to speed up the initial calculation\n    if(pFwdCache != NULL && pRevCache != NULL)\n    {\n        ip = BWTAlgorithms::findIntervalPairWithCache(pBWT, pRevBWT, pFwdCache, pRevCache, pmer);\n        rc_ip = BWTAlgorithms::findIntervalPairWithCache(pBWT, pRevBWT, pFwdCache, pRevCache, rc_pmer);\n    }\n    else\n    {\n        ip = BWTAlgorithms::findIntervalPair(pBWT, pRevBWT, pmer);\n        rc_ip = BWTAlgorithms::findIntervalPair(pBWT, pRevBWT, rc_pmer);\n    }\n\n    assert(ip.isValid() || rc_ip.isValid());\n\n    // Get the extension bases\n    AlphaCount64 extensions;\n    AlphaCount64 rc_extensions;\n\n    // Calculate the interval to use to find the extensions. If extending in the sense\n    // direction this is the reverse interval/reverse bwt for the forward bwt and the forward\n    // interval for the reverse BWT. Vice-versa for anti-sense\n    size_t fwdIdx;\n    if(direction == ED_SENSE)\n        fwdIdx = 1;\n    else\n        fwdIdx = 0;\n    size_t revIdx = 1 - fwdIdx;\n    const BWT* bwts[2];\n    bwts[0] = pBWT;\n    bwts[1] = pRevBWT;\n\n    if(ip.interval[fwdIdx].isValid())\n        extensions += BWTAlgorithms::getExtCount(ip.interval[fwdIdx], bwts[fwdIdx]);\n    if(rc_ip.interval[revIdx].isValid())\n        rc_extensions = BWTAlgorithms::getExtCount(rc_ip.interval[revIdx], bwts[revIdx]);\n\n    // Switch the reverse-complement extensions to the same strand as the str\n    rc_extensions.complement();\n    extensions += rc_extensions;\n    return extensions;\n}\n\n//\nAlphaCount64 BWTAlgorithms::calculateDeBruijnExtensionsSingleIndex(const std::string str, \n                                                                   const BWT* pBWT, \n                                                                   EdgeDir direction,\n                                                                   const BWTIntervalCache* pFwdCache)\n{\n    size_t k = str.size();\n    size_t p = k - 1;\n    \n    std::string pmer;\n\n    // In the sense direction, we extend from the 3' end\n    if(direction == ED_SENSE)\n        pmer = str.substr(1, p);\n    else\n        pmer = str.substr(0, p);\n    assert(pmer.length() == p);\n    std::string rc_pmer = reverseComplement(pmer);\n\n    // As we only have a single index, we can only directly look up\n    // the extensions for either the pmer or its reverse complement\n    // In the SENSE extension direction, we directly look up for\n    // the reverse complement. In ANTISENSE we directly look up for\n    // the pmer.\n    \n    // Get the extension bases\n    AlphaCount64 extensions;\n    AlphaCount64 rc_extensions;\n\n    // Set up pointers to the data to fill in/query\n    // depending on the direction of the extension\n    AlphaCount64* pDirectEC;\n    AlphaCount64* pIndirectEC;\n    std::string* pDirectStr;\n    std::string* pIndirectStr;\n    if(direction == ED_SENSE)\n    {\n        pDirectEC = &rc_extensions;\n        pDirectStr = &rc_pmer;\n\n        pIndirectEC = &extensions;\n        pIndirectStr = &pmer;\n    }\n    else\n    {\n        pDirectEC = &extensions;\n        pDirectStr = &pmer;\n\n        pIndirectEC = &rc_extensions;\n        pIndirectStr = &rc_pmer;\n    }\n\n    // Get the interval for the direct query string\n    BWTInterval interval;\n\n    // Use interval cache if available\n    if(pFwdCache)\n        interval = BWTAlgorithms::findIntervalWithCache(pBWT, pFwdCache, *pDirectStr);\n    else\n        interval = BWTAlgorithms::findInterval(pBWT, *pDirectStr);\n\n    // Fill in the direct count\n    if(interval.isValid())\n        *pDirectEC = BWTAlgorithms::getExtCount(interval, pBWT);\n\n    // Now, for the non-direct index, query the 4 possible k-mers that are adjacent to the pmer\n    // Setup the query sequence\n    std::string query(k, 'A');\n    int varIdx = query.size() - 1;\n    query.replace(0, p, *pIndirectStr);\n\n    for(int i = 0; i < BWT_ALPHABET::size; ++i)\n    {\n        // Transform the query\n        char b = BWT_ALPHABET::getChar(i);\n        query[varIdx] = b;\n\n        // Perform lookup\n        if(pFwdCache)\n            interval = BWTAlgorithms::findIntervalWithCache(pBWT, pFwdCache, query);\n        else\n            interval = BWTAlgorithms::findInterval(pBWT, query);\n        \n        // Update the extension count\n        if(interval.isValid())\n            pIndirectEC->add(b, interval.size());\n    }\n\n    // Switch the reverse-complement extensions to the same strand as the str\n    rc_extensions.complement();\n    extensions += rc_extensions;\n    return extensions;\n}\n\n// Return a random string from the BWT\nstd::string BWTAlgorithms::sampleRandomString(const BWT* pBWT)\n{\n    assert(RAND_MAX > 0x7FFF);\n    size_t n = pBWT->getNumStrings();\n    size_t idx = rand() % n;\n    return extractString(pBWT, idx);\n}\n\n// Return a random string from the BWT\nstd::string BWTAlgorithms::sampleRandomSubstring(const BWT* pBWT, size_t len)\n{\n    assert(RAND_MAX > 0x7FFF);\n    size_t tries = 1000;\n    while(1 && tries-- > 0)\n    {\n        size_t n = pBWT->getBWLen();\n        size_t idx = rand() % n;\n        std::string s = extractString(pBWT, idx, len);\n        if(s.size() == len)\n            return s;\n    }\n    return \"\";\n}\n\n\n// Return the string from the BWT at idx\nstd::string BWTAlgorithms::extractString(const BWT* pBWT, size_t idx)\n{\n    assert(idx < pBWT->getNumStrings());\n\n    // The range [0,n) in the BWT contains all the terminal\n    // symbols for the reads. Search backwards from one of them\n    // until the '$' is found gives a full string.\n    std::string out;\n    BWTInterval interval(idx, idx);\n    while(1)\n    {\n        assert(interval.isValid());\n        char b = pBWT->getChar(interval.lower);\n        if(b == '$')\n            break;\n        else\n            out.push_back(b);\n        updateInterval(interval, b, pBWT);\n    } \n    return reverse(out);\n}\n\n// Extract the substring from start, start+length of the sequence starting at position idx\nstd::string BWTAlgorithms::extractSubstring(const BWT* pBWT, uint64_t idx, size_t start, size_t length)\n{\n    std::string s = extractString(pBWT, idx);\n    return s.substr(start, length);\n}\n\n// Return the next len bases of the string starting at index idx of the BWT\nstd::string BWTAlgorithms::extractString(const BWT* pBWT, size_t idx, size_t len)\n{\n    std::string out;\n    BWTInterval interval(idx, idx);\n    while(out.length() < len)\n    {\n        assert(interval.isValid());\n        char b = pBWT->getChar(interval.lower);\n        if(b == '$')\n            break;\n        else\n            out.push_back(b);\n        updateInterval(interval, b, pBWT);\n    } \n    return reverse(out);\n}\n\n\n// Recursive traversal to extract all the strings needed for the above function\nvoid _extractRankedPrefixes(const BWT* pBWT, BWTInterval interval, const std::string& curr, RankedPrefixVector* pOutput)\n{\n    AlphaCount64 extensions = BWTAlgorithms::getExtCount(interval, pBWT);\n\n    for(size_t i = 0; i < 4; ++i)\n    {\n        char b = \"ACGT\"[i];\n\n        if(extensions.get(b) > 0)\n        {\n            BWTInterval ni = interval;\n            BWTAlgorithms::updateInterval(ni, b, pBWT);\n            _extractRankedPrefixes(pBWT, ni, curr + b, pOutput);\n        }\n\n    }\n\n    // If we have extended the prefix as far as possible, stop\n    BWTAlgorithms::updateInterval(interval, '$', pBWT);\n    for(int64_t i = interval.lower; i <= interval.upper; ++i)\n    {\n        // backwards search gives a reversed prefix, fix it\n        RankedPrefix rp = { (size_t)i, reverse(curr) };\n        pOutput->push_back(rp);\n    }\n}\n\n// Extract all strings found from a backwards search starting at the given interval\nRankedPrefixVector BWTAlgorithms::extractRankedPrefixes(const BWT* pBWT, BWTInterval interval)\n{\n    std::string curr;\n    RankedPrefixVector output;\n    output.reserve(interval.size());\n    _extractRankedPrefixes(pBWT, interval, curr, &output);\n    return output;\n}\n\nstd::string BWTAlgorithms::extractUntilInterval(const BWT* pBWT, int64_t start, const BWTInterval& check)\n{\n    std::string out;\n    BWTInterval interval(start, start);\n    while(interval.lower < check.lower || interval.lower > check.upper)\n    {\n        assert(interval.isValid());\n        char b = pBWT->getChar(interval.lower);\n        if(b == '$')\n            return \"\";\n        else\n            out.push_back(b);\n        updateInterval(interval, b, pBWT);\n    } \n    return reverse(out);        \n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTAlgorithms.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWTAlgorithms.h - Algorithms for aligning to a bwt structure\n//\n#ifndef BWT_ALGORITHMS_H\n#define BWT_ALGORITHMS_H\n\n#include \"STCommon.h\"\n#include \"BWTIndexSet.h\"\n#include \"BWTInterval.h\"\n#include \"GraphCommon.h\"\n\n#include <queue>\n#include <list>\n\n#define LEFT_INT_IDX 0\n#define RIGHT_INT_IDX 1\n\n// structures\n\n// A (partial) prefix of a string contained in the BWT\n// and its lexicographic rank\nstruct RankedPrefix\n{\n    size_t rank;\n    std::string prefix;\n};\ntypedef std::vector<RankedPrefix> RankedPrefixVector;\n\n// functions\nnamespace BWTAlgorithms\n{\n\n// get the interval(s) in pBWT/pRevBWT that corresponds to the string w using a backward search algorithm\nBWTInterval findInterval(const BWT* pBWT, const std::string& w);\nBWTInterval findIntervalWithCache(const BWT* pBWT, const BWTIntervalCache* pIntervalCache, const std::string& w);\nBWTInterval findInterval(const BWTIndexSet& indices, const std::string& w);\n\nBWTIntervalPair findIntervalPair(const BWT* pBWT, const BWT* pRevBWT, const std::string& w);\nBWTIntervalPair findIntervalPairWithCache(const BWT* pBWT, \n                                          const BWT* pRevBWT, \n                                          const BWTIntervalCache* pFwdCache, \n                                          const BWTIntervalCache* pRevCache,\n                                          const std::string& w);\n\n// Count the number of times the sequence w appears in the collection, including\n// its reverse complement\nsize_t countSequenceOccurrences(const std::string& w, const BWT* pBWT);\nsize_t countSequenceOccurrencesWithCache(const std::string& w, const BWT* pBWT, const BWTIntervalCache* pIntervalCache);\nsize_t countSequenceOccurrences(const std::string& w, const BWTIndexSet& indices);\n\n// Count the occurrences of w, not including the reverse complement\nsize_t countSequenceOccurrencesSingleStrand(const std::string& w, const BWTIndexSet& indices);\n\n// Update the given interval using backwards search\n// If the interval corrsponds to string S, it will be updated \n// for string bS\ninline void updateInterval(BWTInterval& interval, char b, const BWT* pBWT)\n{\n    size_t pb = pBWT->getPC(b);\n    interval.lower = pb + pBWT->getOcc(b, interval.lower - 1);\n    interval.upper = pb + pBWT->getOcc(b, interval.upper) - 1;\n}\n\n// Update the interval pair for the right extension to symbol b.\n// In this version the AlphaCounts for the upper and lower intervals\n// have been calculated\ninline void updateBothR(BWTIntervalPair& pair, char b, const BWT* pRevBWT,\n                        AlphaCount64& l, AlphaCount64& u)\n{\n    AlphaCount64 diff = u - l;\n\n    pair.interval[0].lower = pair.interval[0].lower + diff.getLessThan(b);\n    pair.interval[0].upper = pair.interval[0].lower + diff.get(b) - 1;\n\n    // Update the right index directly\n    size_t pb = pRevBWT->getPC(b);\n    pair.interval[1].lower = pb + l.get(b);\n    pair.interval[1].upper = pb + u.get(b) - 1;\n}\n\n//\n// Update the interval pair for the right extension to symbol b.\n// \ninline void updateBothR(BWTIntervalPair& pair, char b, const BWT* pRevBWT)\n{\n    // Update the left index using the difference between the AlphaCounts in the reverse table\n    AlphaCount64 l = pRevBWT->getFullOcc(pair.interval[1].lower - 1);\n    AlphaCount64 u = pRevBWT->getFullOcc(pair.interval[1].upper);\n    updateBothR(pair, b, pRevBWT, l, u);\n}\n\n// Update the interval pair for the left extension to symbol b.\n// In this version the AlphaCounts for the upper and lower intervals\n// have been calculated.\ninline void updateBothL(BWTIntervalPair& pair, char b, const BWT* pBWT, \n                        AlphaCount64& l, AlphaCount64& u)\n{\n    AlphaCount64 diff = u - l;\n    // Update the left index using the difference between the AlphaCounts in the reverse table\n    pair.interval[1].lower = pair.interval[1].lower + diff.getLessThan(b);\n    pair.interval[1].upper = pair.interval[1].lower + diff.get(b) - 1;\n\n    // Update the left index directly\n    size_t pb = pBWT->getPC(b);\n    pair.interval[0].lower = pb + l.get(b);\n    pair.interval[0].upper = pb + u.get(b) - 1;\n}\n\n//\n// Update the interval pair for the left extension to symbol b.\n//\ninline void updateBothL(BWTIntervalPair& pair, char b, const BWT* pBWT)\n{\n    // Update the left index using the difference between the AlphaCounts in the reverse table\n    AlphaCount64 l = pBWT->getFullOcc(pair.interval[0].lower - 1);\n    AlphaCount64 u = pBWT->getFullOcc(pair.interval[0].upper);\n    updateBothL(pair, b, pBWT, l, u);\n}\n\n\n// Initialize the interval of index idx to be the range containining all the b suffixes\ninline void initInterval(BWTInterval& interval, char b, const BWT* pB)\n{\n    interval.lower = pB->getPC(b);\n    interval.upper = interval.lower + pB->getOcc(b, pB->getBWLen() - 1) - 1;\n}\n\n// Initialize the interval of index idx to be the range containining all the b suffixes\ninline void initIntervalPair(BWTIntervalPair& pair, char b, const BWT* pBWT, const BWT* pRevBWT)\n{\n    initInterval(pair.interval[LEFT_INT_IDX], b, pBWT);\n    initInterval(pair.interval[RIGHT_INT_IDX], b, pRevBWT);\n}\n\n// Return the counts of the bases between the lower and upper interval in pBWT\ninline AlphaCount64 getExtCount(const BWTInterval& interval, const BWT* pBWT)\n{\n    return pBWT->getOccDiff(interval.lower - 1, interval.upper);\n}\n\n// Return the count of all the possible one base extensions of the string w.\n// This returns the number of times the suffix w[i, l]A, w[i, l]C, etc \n// appears in the FM-index for all i s.t. length(w[i, l]) >= minOverlap.\nAlphaCount64 calculateExactExtensions(const unsigned int overlapLen, const std::string& w, const BWT* pBWT, const BWT* pRevBWT);\n\n// Calculate de Bruijn graph extensions of the given sequence using an index pair\n// Returns an AlphaCount64 with the count of each extension base\n// This function optionally takes in an interval cache to speed up the computation\nAlphaCount64 calculateDeBruijnExtensions(const std::string str, \n                                         const BWT* pBWT, \n                                         const BWT* pRevBWT, \n                                         EdgeDir direction,\n                                         const BWTIntervalCache* pFwdCache = NULL,\n                                         const BWTIntervalCache* pRevCache = NULL);\n\n// Calculate de Bruijn graph extensions of the given sequence using a single index\n// This version is more computationally expensive than above but allows\n// only one index to be held in memory. \n// Returns an AlphaCount64 with the count of each extension base\n// This function optionally takes in an interval cache to speed up the computation\nAlphaCount64 calculateDeBruijnExtensionsSingleIndex(const std::string str, \n                                                    const BWT* pBWT, \n                                                    EdgeDir direction,\n                                                    const BWTIntervalCache* pFwdCache = NULL);\n\n// Extract the complete string starting at idx in the BWT\nstd::string extractString(const BWT* pBWT, size_t idx);\n\n// Extract the next len bases of the string starting at idx\nstd::string extractString(const BWT* pBWT, size_t idx, size_t len);\n\n// Extract the substring from start, start+length of the sequence starting at position idx\nstd::string extractSubstring(const BWT* pBWT, uint64_t idx, size_t start, size_t length = std::string::npos);\n\n// Extract all prefixes of the suffixes for the given interval, along\n// with their lexicographic rank.\nRankedPrefixVector extractRankedPrefixes(const BWT* pBWT, BWTInterval interval);\n\n// Extract symbols from the starting index of the BWT until the index lies\n// within the given interval. If the extraction hits the start of a string\n// without finding a prefix, the empty string is returned.\nstd::string extractUntilInterval(const BWT* pBWT, int64_t start, const BWTInterval& interval);\n\n// Returns a randomly chosen string from the BWT\nstd::string sampleRandomString(const BWT* pBWT);\n\n// Returns a randomly chosen substring from the BWT \nstd::string sampleRandomSubstring(const BWT* pBWT, size_t len);\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTCABauerCoxRosone.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// BWTCABauerCoxRosone - In-memory version of Illumina's\n// BWT construction algorithm\n#include \"BWTCABauerCoxRosone.h\"\n#include \"Timer.h\"\n#include \"BWTWriterBinary.h\"\n#include <algorithm>\n#include <iterator>\n\nvoid BWTCA::runBauerCoxRosone(const DNAEncodedStringVector* pReadSequences,\n                              const std::string& bwt_out_name, \n                              const std::string& sai_out_name)\n{\n    size_t num_reads = pReadSequences->size();\n\n    size_t num_symbols = 0;\n    for(size_t i = 0; i < num_reads; ++i)\n        num_symbols += pReadSequences->at(i).length();\n    num_symbols += num_reads; // include 1 sentinal per read\n    printf(\"Running BCR on %zu symbols, %zu reads\\n\", num_symbols, num_reads);\n\n    // Allocate two working BWTs\n    DNAEncodedString read_bwt;\n    DNAEncodedString write_bwt;\n\n    read_bwt.resize(num_symbols);\n    write_bwt.resize(num_symbols);\n\n    // Allocate the bcr vector, which tracks the state of the algorithm\n    BCRVector bcrVector(num_reads);\n    \n    // Track the number of suffixes that start with a given symbol\n    AlphaCount64 suffixStartCounts;\n\n    // Iteration 1:\n    // Output a BWT with the last symbol of every read, in the order they appear in the read table.\n    // This is the ordering of all suffixes that start with the sentinel character\n    outputInitialCycle(pReadSequences, bcrVector, write_bwt, suffixStartCounts);\n    write_bwt.swap(read_bwt);\n\n    // Iteration 2...n, create new bwts from the bwt of the previous cycle\n    size_t partial_bwt_length = num_reads;\n    Timer timer(\"cycles\", false);\n\n    size_t maxCycles = pReadSequences->at(0).length();\n    for(size_t cycle = 2; cycle <= maxCycles; ++cycle)\n    {\n        //std::cout << \"Starting cycle \" << cycle << \"\\n\";\n        \n        // Convert relative positions to absolute positions\n        calculateAbsolutePositions(bcrVector, suffixStartCounts);\n       \n        // Sort nvector by the absolute position to insert the symbol\n        std::sort(bcrVector.begin(), bcrVector.end());\n        //std::cout << \"  done sorting...\" << timer.getElapsedWallTime() << \"\\n\";\n\n        // Output the BWT for this cycle and update the vector and suffix start count\n        partial_bwt_length = outputPartialCycle(cycle, pReadSequences, bcrVector, read_bwt, partial_bwt_length, write_bwt, suffixStartCounts);\n        //std::cout << \"  done writing...\" << timer.getElapsedWallTime() << \"\\n\";\n\n        // Swap the in/out bwt\n        read_bwt.swap(write_bwt);\n    }\n\n    // Write the resulting bwt and suffix array index\n    BWTWriterBinary bwtWriter(bwt_out_name);\n    bwtWriter.writeHeader(num_reads, num_symbols, BWF_NOFMI);\n\n    SAWriter saWriter(sai_out_name);\n    saWriter.writeHeader(num_reads, num_reads);\n\n    // Calculate the positions of the final insertion symbols and write them directly to the file\n    calculateAbsolutePositions(bcrVector, suffixStartCounts);\n    std::sort(bcrVector.begin(), bcrVector.end());\n    size_t num_wrote = outputFinalBWT(bcrVector, read_bwt, partial_bwt_length, &bwtWriter, &saWriter);\n    assert(num_wrote == num_symbols);\n}\n\n// Update N and the output BWT for the initial cycle, corresponding to the sentinel suffixes\n// the symbolCounts vector is updated to hold the number of times each symbol has been inserted\n// into the bwt\nvoid BWTCA::outputInitialCycle(const DNAEncodedStringVector* pReadSequences, BCRVector& bcrVector, DNAEncodedString& bwt, AlphaCount64& suffixSymbolCounts)\n{\n    AlphaCount64 incomingSymbolCounts;\n\n    size_t n = pReadSequences->size();\n    size_t first_read_len = pReadSequences->at(0).length();\n    for(size_t i = 0; i < n; ++i)\n    {\n        size_t rl =  pReadSequences->at(i).length();\n        \n        // Check that all reads are the same length\n        if(rl != first_read_len)\n        {\n            std::cout << \"Error: This implementation of BCR requires all reads to be the same length\\n\";\n            exit(EXIT_FAILURE);\n        }\n\n        char c = pReadSequences->at(i).get(rl - 1);\n        bwt.set(i, c);\n\n        assert(rl > 1);\n\n        // Load the elements of the N vector with the next symbol\n        bcrVector[i].sym = c;\n        bcrVector[i].index = i;\n\n        // Set the relative position of the symbol that is being inserted\n        bcrVector[i].position = incomingSymbolCounts.get(c);\n\n        // Increment the count of the first base of the suffix of the\n        // incoming strings. This is $ for the initial cycle\n        suffixSymbolCounts.increment('$');\n\n        // Update the inserted symbols\n        incomingSymbolCounts.increment(c);\n    }\n\n    suffixSymbolCounts += incomingSymbolCounts;\n}\n\n// Write out the next BWT for the next cycle. This updates BCRVector\n// and suffixSymbolCounts. Returns the number of symbols written to writeBWT\nsize_t BWTCA::outputPartialCycle(int cycle,\n                                 const DNAEncodedStringVector* pReadSequences,\n                                 BCRVector& bcrVector, \n                                 const DNAEncodedString& readBWT, \n                                 size_t total_read_symbols,\n                                 DNAEncodedString& writeBWT, \n                                 AlphaCount64& suffixStartCounts)\n{\n    // We track the rank of each symbol as it is copied/inserted\n    // into the new bwt\n    AlphaCount64 rank;\n\n    // Counters\n    size_t num_copied = 0;\n    size_t num_inserted = 0;\n    size_t num_wrote = 0;\n\n    for(size_t i = 0; i < bcrVector.size(); ++i)\n    {\n        BCRElem& ne = bcrVector[i];\n        \n        // Copy elements from the read bwt until we reach the target position\n        while(num_copied + num_inserted < ne.position)\n        {\n            char c = readBWT.get(num_copied++);\n            writeBWT.set(num_wrote++, c);\n            rank.increment(c);\n        }\n\n        // Now insert the incoming symbol\n        int rl = pReadSequences->at(ne.index).length();\n        char c = '$';\n\n        // If the cycle number is greater than the read length, we are\n        // on the final iteration and we just add in the '$' characters\n        if(cycle <= rl)\n            c = pReadSequences->at(ne.index).get(rl - cycle);\n        //std::cout << \"Inserting \" << c << \" at position \" << num_copied + num_inserted << \"\\n\";\n        writeBWT.set(num_wrote++, c);\n        num_inserted += 1;\n\n        // Update the nvector element\n        ne.sym = c;\n\n        // Record the rank of the inserted symbol\n        ne.position = rank.get(c);\n\n        // Update the rank and the number of suffixes that start with c\n        rank.increment(c);\n        suffixStartCounts.increment(c);\n    }\n\n    // Copy any remaining symbols in the bwt\n    while(num_copied < total_read_symbols)\n        writeBWT.set(num_wrote++, readBWT.get(num_copied++));\n\n    return num_wrote;\n}\n\n// Write the final BWT to a file.\nsize_t BWTCA::outputFinalBWT(BCRVector& bcrVector, \n                             const DNAEncodedString& readBWT, \n                             size_t partial_bwt_symbols,\n                             BWTWriterBinary* pBWTWriter,\n                             SAWriter* pSAWriter)\n{\n\n    // Counters\n    size_t num_copied = 0;\n    size_t num_inserted = 0;\n\n    for(size_t i = 0; i < bcrVector.size(); ++i)\n    {\n        BCRElem& ne = bcrVector[i];\n        \n        // Copy elements from the read bwt until we reach the target position\n        while(num_copied + num_inserted < ne.position)\n            pBWTWriter->writeBWChar(readBWT.get(num_copied++));\n        \n        // Write a single $, terminating this string\n        pBWTWriter->writeBWChar('$');\n        pSAWriter->writeElem(SAElem(ne.index, 0));\n        num_inserted += 1;\n    }\n\n    // Copy any remaining symbols in the bwt\n    while(num_copied < partial_bwt_symbols)\n        pBWTWriter->writeBWChar(readBWT.get(num_copied++));\n\n    pBWTWriter->finalize();\n    return num_copied + num_inserted;\n}\n\n\nvoid BWTCA::calculateAbsolutePositions(BCRVector& bcrVector, const AlphaCount64& suffixSymbolCounts)\n{\n    // Calculate a predecessor array from the suffix symbol counts\n    AlphaCount64 predCounts;\n    for(int i = 0; i < BWT_ALPHABET::size; ++i)\n    {\n        char b = RANK_ALPHABET[i];\n        int64_t pc = suffixSymbolCounts.getLessThan(b);\n        predCounts.set(b, pc);\n    }\n\n    for(size_t i = 0; i < bcrVector.size(); ++i)\n        bcrVector[i].position += predCounts.get(bcrVector[i].sym);\n}\n\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTCABauerCoxRosone.h",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// BWTCABauerCoxRosone - In-memory version of Illumina's\n// BWT construction algorithm\n#ifndef BWTCA_COX_BAUER_ROSONE_H\n#define BWTCA_COX_BAUER_ROSONE_H\n\n#include \"SAWriter.h\"\n#include \"ReadTable.h\"\n#include \"Alphabet.h\"\n#include \"EncodedString.h\"\n#include \"BWTWriterBinary.h\"\n\nnamespace BWTCA\n{\n    // This structure tracks the state of each read\n    // It contains a position field, which stores the relative/absolute\n    // position to insert the next symbol of a read into the partial BWT.\n    // It also stores the read index and the symbol to insert\n    struct BCRElem\n    {\n        BCRElem() : index(0), sym('\\0') {}\n\n        // Comparator. Sort first on the symbol, then break ties using the index\n        friend bool operator<(const BCRElem& a, const BCRElem& b)\n        {\n            return a.position < b.position;\n        }\n\n        friend std::ostream& operator<<(std::ostream& out, const BCRElem& elem)\n        {\n            out << \"I: \" << elem.index << \" S: \" << elem.sym << \" P: \" << elem.position;\n            return out;\n        }\n\n        // Data\n        uint64_t position; // the relative or absolute position into the next partial bwt to insert a symbol\n        uint32_t index; // the read index this entry represents\n        char sym; // a symbol to be inserted\n    };\n    typedef std::vector<BCRElem> BCRVector;\n\n    // Construct the burrows-wheeler transform of the set of reads\n    void runBauerCoxRosone(const DNAEncodedStringVector* pReadSequences, \n                           const std::string& bwt_out_name, \n                           const std::string& sai_out_name);\n    \n    // Run the initial special first iteration of the algorithm\n    void outputInitialCycle(const DNAEncodedStringVector* pReadSequences, BCRVector& bcrVector, DNAEncodedString& bwt, AlphaCount64& suffixSymbolCounts);\n\n    // Write the final bwt to a file\n    size_t outputFinalBWT(BCRVector& bcrVector, \n                          const DNAEncodedString& readBWT, \n                          size_t partial_bwt_symbols, \n                          BWTWriterBinary* pBWTWriter,\n                          SAWriter* pSAWriter);\n\n    // Output an intermediate bwt \n    size_t outputPartialCycle(int cycle,\n                             const DNAEncodedStringVector* pReadSequences, \n                             BCRVector& bcrVector, \n                             const DNAEncodedString& readBWT, \n                             size_t partial_bwt_symbols,\n                             DNAEncodedString& writeBWT, \n                             AlphaCount64& suffixStartCounts);\n\n    // Calculate absolute position for each element of the nvector\n    void calculateAbsolutePositions(BCRVector& bcrVector, const AlphaCount64& suffixSymbolCounts);\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTCARopebwt.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWTCARopebwt - Construct the BWT for a set of reads\n// using Heng Li's ropebwt implementation\n//\n#include \"BWTCARopebwt.h\"\n#include \"bcr.h\"\n#include \"SeqReader.h\"\n#include \"StdAlnTools.h\"\n#include \"BWTWriterBinary.h\"\n#include \"BWTWriterAscii.h\"\n#include \"SAWriter.h\"\n\nstatic unsigned char seq_nt6_table[128] = {\n    0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 1, 5, 2, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 1, 5, 2, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5\n};\n\nvoid BWTCA::runRopebwt(const std::string& input_filename, const std::string& bwt_out_name, \n                       bool use_threads, bool do_reverse)\n{\n    // Initialize ropebwt\n    std::string tmp_name = bwt_out_name + \".tmp\";\n    bcr_t* bcr = bcr_init(use_threads, tmp_name.c_str());\n\n    size_t num_sequences = 0;\n    size_t num_bases = 0;\n    SeqReader reader(input_filename);\n    SeqRecord record;\n    while(reader.get(record))\n    {\n        if(do_reverse)\n            record.seq.reverse();\n\n        size_t l = record.seq.length();\n\n        // Convert the string into the alphabet encoding expected by ropebwt\n        uint8_t* s = new uint8_t[l];\n        for(size_t i = 0; i < l; ++i) {\n            char c = record.seq.get(i);\n            s[i] = seq_nt6_table[(int)c];\n        }\n        \n        // Send the sequence to ropebwt\n        bcr_append(bcr, l, s);\n\n        num_sequences += 1;\n        num_bases += l;\n        delete [] s;\n    }\n\n    // Build the BWT\n    bcr_build(bcr);\n    \n    // write the BWT and SAI\n    bcritr_t* itr = bcr_itr_init(bcr);\n    const uint8_t* s;\n    int l;\n\n    BWTWriterBinary* out_bwt = new BWTWriterBinary(bwt_out_name);\n    size_t num_symbols = num_bases + num_sequences;\n    out_bwt->writeHeader(num_sequences, num_symbols, BWF_NOFMI);\n\n    // Write each run\n    while( (s = bcr_itr_next(itr, &l)) != 0 ) {\n        for (int i = 0; i < l; ++i) {\n            char c = \"$ACGTN\"[s[i]&7];\n            int rl = s[i]>>3;\n            for(int j = 0; j < rl; ++j)\n                out_bwt->writeBWChar(c);\n        }\n    }\n\n    free(itr);\n    out_bwt->finalize();\n    delete out_bwt;\n\n    // Cleanup\n    bcr_destroy(bcr);\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTCARopebwt.h",
    "content": "//-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWTCARopebwt - Construct the BWT for a set of reads\n// using Heng Li's ropebwt implementation\n//\n#ifndef BWTCA_ROPEBWT_H\n#define BWTCA_ROPEBWT_H\n\n#include <string>\n\nnamespace BWTCA\n{\n    void runRopebwt(const std::string& input_filename, const std::string& bwt_out_name, \n                    bool use_threads, bool do_reverse);\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTDiskConstruction.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWTDiskConstruction - Implementation of the\n// BWT disk construction algorithm of Ferragina,\n// Gagie, Manzini. See Lightweight Data Indexing\n// and Compression in External Memory\n//\n#include \"BWTDiskConstruction.h\"\n#include \"Util.h\"\n#include \"BWTWriter.h\"\n#include \"BWTReader.h\"\n#include \"SAWriter.h\"\n#include \"SAReader.h\"\n#include \"GapArray.h\"\n#include \"RankProcess.h\"\n#include \"SequenceProcessFramework.h\"\n#include \"BWTCABauerCoxRosone.h\"\n#include <unistd.h>\n\n// Definitions and structures\nstatic const bool USE_GZ = false;\nstatic const int BWT_SAMPLE_RATE = 512;\n\nstruct MergeItem\n{\n    int64_t start_index;\n    int64_t end_index;\n    std::string reads_filename;\n    std::string bwt_filename;\n    std::string sai_filename;\n\n    friend std::ostream& operator<<(std::ostream& out, const MergeItem& item)\n    {\n        out << \"[\" << item.start_index << \",\" << item.end_index << \"] \" << item.bwt_filename;\n        out << \" \" << item.sai_filename << \" \" << item.reads_filename;\n        return out;\n    }\n};\ntypedef std::vector<MergeItem> MergeVector;\n\n// Function declarations\nint64_t merge(SeqReader* pReader, \n              const MergeItem& item1, const MergeItem& item2, \n              const std::string& bwt_outname, const std::string& sai_outname,\n              bool doReverse, int numThreads, int storageLevel);\n\n// Initial BWT construction algorithms\nMergeVector computeInitialSAIS(const BWTDiskParameters& parameters); \nMergeVector computeInitialBCR(const BWTDiskParameters& parameters); \n\n//\nvoid writeMergedIndex(const BWT* pBWTInternal, const MergeItem& externalItem, \n                      const MergeItem& internalItem, const std::string& bwt_outname,\n                      const std::string& sai_outname, const GapArray* pGapArray);\n\nvoid writeRemovalIndex(const BWT* pBWTInternal, const std::string& sai_inname,\n                       const std::string& bwt_outname, const std::string& sai_outname, \n                       size_t num_strings_remove, size_t num_symbols_remove,\n                       const GapArray* pGapArray);\n\nvoid computeGapArray(SeqReader* pReader, size_t n, const BWT* pBWT, bool doReverse, \n                     int numThreads, GapArray* pGapArray, bool removeMode,\n                     size_t& num_strings_read, size_t& num_symbols_read);\n\n//\nstd::string makeTempName(const std::string& prefix, int id, const std::string& extension);\nstd::string makeFilename(const std::string& prefix, const std::string& extension);\n\n\n// The algorithm is as follows. We create M BWTs for subsets of \n// the input reads. These are created independently and written\n// to disk. They are then merged either sequentially or pairwise\n// to create the final BWT\nvoid buildBWTDisk(const BWTDiskParameters& parameters)\n{\n    // Build the initial bwts for subsets of the data\n    MergeVector mergeVector;\n    if(parameters.bUseBCR)\n        mergeVector = computeInitialBCR(parameters);\n    else\n        mergeVector = computeInitialSAIS(parameters);\n\n    // Phase 2: Pairwise merge the BWTs\n    int groupID = mergeVector.size(); // Initial the name of the next intermediate bwt\n    int round = 1;\n    MergeVector nextMergeRound;\n    while(mergeVector.size() > 1)\n    {\n        std::cout << \"Starting round \" << round << \"\\n\";\n        SeqReader* pReader = new SeqReader(parameters.inFile);\n        SeqRecord record;\n\n        for(size_t i = 0; i < mergeVector.size(); i+=2)\n        {\n            if(i + 1 != mergeVector.size())\n            {\n                std::string bwt_merged_name = makeTempName(parameters.outPrefix, groupID, parameters.bwtExtension);\n                std::string sai_merged_name = makeTempName(parameters.outPrefix, groupID, parameters.saiExtension);\n\n                MergeItem item1 = mergeVector[i];\n                MergeItem item2 = mergeVector[i+1];\n\n                // Perform the actual merge\n                int64_t curr_idx = merge(pReader, item1, item2, \n                                         bwt_merged_name, sai_merged_name, \n                                         parameters.bBuildReverse, parameters.numThreads, parameters.storageLevel);\n\n                // pReader now points to the end of item1's block of \n                // reads. Skip item2's reads\n                assert(curr_idx == item2.start_index);\n                while(curr_idx <= item2.end_index)\n                {\n                    bool eof = !pReader->get(record);\n                    assert(!eof);\n                    (void)eof;\n                    ++curr_idx;\n                }\n\n                // Create the merged mergeItem to use in the next round\n                MergeItem merged;\n                merged.start_index = item1.start_index;\n                merged.end_index = item2.end_index;\n                merged.bwt_filename = bwt_merged_name;\n                merged.sai_filename = sai_merged_name;\n                nextMergeRound.push_back(merged);\n\n                // Done with the temp files, remove them\n                unlink(item1.bwt_filename.c_str());\n                unlink(item2.bwt_filename.c_str());\n                unlink(item1.sai_filename.c_str());\n                unlink(item2.sai_filename.c_str());\n\n                ++groupID;\n            }\n            else\n            {\n                // Singleton, pass through to the next round\n                nextMergeRound.push_back(mergeVector[i]);\n            }\n        }\n        delete pReader;\n        mergeVector.clear();\n        mergeVector.swap(nextMergeRound);\n        ++round;\n    }\n    assert(mergeVector.size() == 1);\n\n    // Done, rename the files to their final name\n    std::stringstream bwt_ss;\n    bwt_ss << parameters.outPrefix << parameters.bwtExtension << (USE_GZ ? \".gz\" : \"\");\n    std::string bwt_final_filename = bwt_ss.str();\n    rename(mergeVector.front().bwt_filename.c_str(), bwt_final_filename.c_str());\n\n    std::stringstream sai_ss;\n    sai_ss << parameters.outPrefix << parameters.saiExtension << (USE_GZ ? \".gz\" : \"\");\n    std::string sai_final_filename = sai_ss.str();\n    rename(mergeVector.front().sai_filename.c_str(), sai_final_filename.c_str());\n}\n\n// Compute the initial BWTs for the input file split into blocks of records using the SAIS algorithm\nMergeVector computeInitialSAIS(const BWTDiskParameters& parameters)\n{\n    SeqReader* pReader = new SeqReader(parameters.inFile);\n    SeqRecord record;\n\n    int groupID = 0;\n    size_t numReadTotal = 0;\n\n    MergeVector mergeVector;\n    MergeItem mergeItem;\n    mergeItem.start_index = 0;\n\n    // Phase 1: Compute the initial BWTs\n    ReadTable* pCurrRT = new ReadTable;\n    bool done = false;\n    while(!done)\n    {\n        done = !pReader->get(record);\n\n        if(!done)\n        {\n            // the read is valid\n            SeqItem item = record.toSeqItem();\n            if(parameters.bBuildReverse)\n                item.seq.reverse();\n            pCurrRT->addRead(item);\n            ++numReadTotal;\n        }\n\n        if(pCurrRT->getCount() >= parameters.numReadsPerBatch || (done && pCurrRT->getCount() > 0))\n        {\n            // Compute the SA and BWT for this group\n            SuffixArray* pSA = new SuffixArray(pCurrRT, 1);\n\n            // Write the BWT to disk                \n            std::string bwt_temp_filename = makeTempName(parameters.outPrefix, groupID, parameters.bwtExtension);\n            pSA->writeBWT(bwt_temp_filename, pCurrRT);\n\n            std::string sai_temp_filename = makeTempName(parameters.outPrefix, groupID, parameters.saiExtension);\n            pSA->writeIndex(sai_temp_filename);\n\n            // Push the merge info\n            mergeItem.end_index = numReadTotal - 1; // inclusive\n            mergeItem.reads_filename = parameters.inFile;\n            mergeItem.bwt_filename = bwt_temp_filename;\n            mergeItem.sai_filename = sai_temp_filename;\n            mergeVector.push_back(mergeItem);\n\n            // Cleanup\n            delete pSA;\n\n            // Start the new group\n            mergeItem.start_index = numReadTotal;\n            ++groupID;\n            pCurrRT->clear();\n        }\n    }\n    delete pCurrRT;\n    delete pReader;\n    return mergeVector;\n}\n\n// Compute the initial BWTs for the input file split into blocks of records using the BCR algorithm\nMergeVector computeInitialBCR(const BWTDiskParameters& parameters)\n{\n    SeqReader* pReader = new SeqReader(parameters.inFile);\n    SeqRecord record;\n\n    int groupID = 0;\n    size_t numReadTotal = 0;\n\n    MergeVector mergeVector;\n    MergeItem mergeItem;\n    mergeItem.start_index = 0;\n\n    // Phase 1: Compute the initial BWTs\n    DNAEncodedStringVector readSequences;\n    bool done = false;\n    while(!done)\n    {\n        done = !pReader->get(record);\n\n        if(!done)\n        {\n            // the read is valid\n            SeqItem item = record.toSeqItem();\n            if(parameters.bBuildReverse)\n                item.seq.reverse();\n            readSequences.push_back(item.seq.toString());\n            ++numReadTotal;\n        }\n\n        if(readSequences.size() >= parameters.numReadsPerBatch || (done && readSequences.size() > 0))\n        {\n            std::string bwt_temp_filename = makeTempName(parameters.outPrefix, groupID, parameters.bwtExtension);\n            std::string sai_temp_filename = makeTempName(parameters.outPrefix, groupID, parameters.saiExtension);\n            BWTCA::runBauerCoxRosone(&readSequences, bwt_temp_filename, sai_temp_filename);\n\n            // Push the merge info\n            mergeItem.end_index = numReadTotal - 1; // inclusive\n            mergeItem.reads_filename = parameters.inFile;\n            mergeItem.bwt_filename = bwt_temp_filename;\n            mergeItem.sai_filename = sai_temp_filename;\n            mergeVector.push_back(mergeItem);\n\n            // Start the new group\n            mergeItem.start_index = numReadTotal;\n            ++groupID;\n            readSequences.clear();\n        }\n    }\n    delete pReader;\n    return mergeVector;\n}\n\n// Merge the indices for the two independent sets of reads in readsFile1 and readsFile2\nvoid mergeIndependentIndices(const std::string& readsFile1, const std::string& readsFile2, \n                             const std::string& outPrefix, const std::string& bwt_extension, \n                             const std::string& sai_extension, bool doReverse, int numThreads, int storageLevel)\n{\n    MergeItem item1;\n    std::string prefix1 = stripGzippedExtension(readsFile1);\n    item1.reads_filename = readsFile1;\n    item1.bwt_filename = makeFilename(prefix1, bwt_extension);\n    item1.sai_filename = makeFilename(prefix1, sai_extension);\n    item1.start_index = 0;\n    item1.end_index = -1; // this tells merge to read the entire file\n\n    MergeItem item2;\n    std::string prefix2 = stripGzippedExtension(readsFile2);\n    item2.reads_filename = readsFile2;\n    item2.bwt_filename = makeFilename(prefix2, bwt_extension);\n    item2.sai_filename = makeFilename(prefix2, sai_extension);\n    item2.start_index = 0;\n    item2.end_index = -1;\n\n    // Prepare the input filehandle\n    SeqReader* pReader = new SeqReader(item1.reads_filename);\n    \n    // Build the outnames\n    std::string bwt_merged_name = makeFilename(outPrefix, bwt_extension);\n    std::string sai_merged_name = makeFilename(outPrefix, sai_extension);\n\n    // Perform the actual merge\n    merge(pReader, item1, item2, bwt_merged_name, sai_merged_name, doReverse, numThreads, storageLevel);\n    delete pReader;\n}\n\n// Construct new indices without the reads in readsToRemove\nvoid removeReadsFromIndices(const std::string& allReadsPrefix, const std::string& readsToRemove,\n                             const std::string& outPrefix, const std::string& bwt_extension, \n                             const std::string& sai_extension, bool doReverse, int numThreads)\n{\n    std::string bwt_filename = makeFilename(allReadsPrefix, bwt_extension);\n    std::string sai_filename = makeFilename(allReadsPrefix, sai_extension);\n\n    // Prepare the input filehandle\n    SeqReader* pReader = new SeqReader(readsToRemove);\n    \n    // Build the outnames\n    std::string bwt_out_name = makeFilename(outPrefix, bwt_extension);\n    std::string sai_out_name = makeFilename(outPrefix, sai_extension);\n\n    // Compute the gap array\n    BWT* pBWT = new BWT(bwt_filename, BWT_SAMPLE_RATE);\n\n    // Boolean gap array\n    GapArray* pGapArray = createGapArray(1);\n\n    size_t num_strings_remove;\n    size_t num_symbols_remove;\n    computeGapArray(pReader, (size_t)-1, pBWT, doReverse, numThreads, pGapArray, true, num_strings_remove, num_symbols_remove);\n\n    //writeRemovalIndex();\n    writeRemovalIndex(pBWT, sai_filename, bwt_out_name, sai_out_name, num_strings_remove, num_symbols_remove, pGapArray);\n\n    // Perform the actual merge\n    //merge(pReader, item1, item2, bwt_merged_name, sai_merged_name, doReverse, numThreads);\n\n    delete pGapArray;\n    delete pReader;\n    delete pBWT;\n}\n\n// Merge two readsFiles together\nvoid mergeReadFiles(const std::string& readsFile1, const std::string& readsFile2, const std::string& outPrefix)\n{\n    // If the outfile is the empty string, append the reads in readsFile2 into readsFile1\n    // otherwise cat the files together\n    std::ostream* pWriter;\n    if(outPrefix.empty())\n    {\n        pWriter = createWriter(readsFile1, std::ios_base::out | std::ios_base::app);\n    }\n    else\n    {\n        bool both_fastq = isFastq(readsFile1) && isFastq(readsFile2);\n        bool both_gzip = isGzip(readsFile1) && isGzip(readsFile2);\n        std::string extension = both_fastq ? \".fastq\" : \".fa\";\n        if(both_gzip)\n            extension.append(\".gz\");\n        std::string out_filename = outPrefix + extension;\n        pWriter = createWriter(out_filename);\n\n        // Copy reads1 to the outfile\n        SeqReader reader(readsFile1);\n        SeqRecord record;\n        while(reader.get(record))\n            record.write(*pWriter);\n    }\n\n    // Copy reads2 to writer\n    SeqReader reader(readsFile2);\n    SeqRecord record;\n    while(reader.get(record))\n        record.write(*pWriter);\n    delete pWriter;\n}\n\n// Compute the gap array for the first n items in pReader\nvoid computeGapArray(SeqReader* pReader, size_t n, const BWT* pBWT, bool doReverse, int numThreads, GapArray* pGapArray, \n                     bool removeMode, size_t& num_strings_read, size_t& num_symbols_read)\n{\n    // Create the gap array\n    size_t gap_array_size = pBWT->getBWLen() + 1;\n    pGapArray->resize(gap_array_size);\n\n    // The rank processor calculates the rank of every suffix of a given sequence\n    // and returns a vector of ranks. The postprocessor takes in the vector\n    // and updates the gap array\n    RankPostProcess postProcessor(pGapArray);\n    size_t numProcessed = 0;\n    if(numThreads <= 1)\n    {\n        RankProcess processor(pBWT, pGapArray, doReverse, removeMode);\n\n        numProcessed = \n           SequenceProcessFramework::processSequencesSerial<SequenceWorkItem,\n                                                            RankResult, \n                                                            RankProcess, \n                                                            RankPostProcess>(*pReader, &processor, &postProcessor, n);\n    }\n    else\n    {\n        typedef std::vector<RankProcess*> RankProcessVector;\n        RankProcessVector rankProcVec;\n        for(int i = 0; i < numThreads; ++i)\n        {\n            RankProcess* pProcess = new RankProcess(pBWT, pGapArray, doReverse, removeMode);\n            rankProcVec.push_back(pProcess);\n        }\n    \n        numProcessed = \n           SequenceProcessFramework::processSequencesParallel<SequenceWorkItem,\n                                                              RankResult, \n                                                              RankProcess, \n                                                              RankPostProcess>(*pReader, rankProcVec, &postProcessor, n);\n\n        for(int i = 0; i < numThreads; ++i)\n            delete rankProcVec[i];\n    }\n\n    num_strings_read = postProcessor.getNumStringsProcessed();\n    num_symbols_read = postProcessor.getNumSymbolsProcessed();\n    assert(n == (size_t)-1 || (numProcessed == n));\n}\n\n// Merge a pair of BWTs using disk storage\n// Precondition: pReader is positioned at the start of the read block for item1\nint64_t merge(SeqReader* pReader,\n              const MergeItem& item1, const MergeItem& item2,\n              const std::string& bwt_outname, const std::string& sai_outname,\n              bool doReverse, int numThreads, int storageLevel)\n{\n    std::cout << \"Merge1: \" << item1 << \"\\n\";\n    std::cout << \"Merge2: \" << item2 << \"\\n\";\n\n    // Load the bwt of item2 into memory as the internal bwt\n    BWT* pBWTInternal = new BWT(item2.bwt_filename, BWT_SAMPLE_RATE);\n    \n    // If end_index is -1, calculate the ranks for every sequence in the file\n    // otherwise only calculate the rank for the next (end_index - start_index + 1) sequences\n    size_t n = (item1.end_index == -1) ? -1 : item1.end_index - item1.start_index + 1;\n    \n    // Calculate the rank of every read from item1.start_index to item1.end_index\n    // and increment the gap counts\n    int64_t curr_idx = item1.start_index;\n    \n    // Compute the gap/rank array\n    GapArray* pGapArray = createGapArray(storageLevel);\n    size_t num_strings_read = 0;\n    size_t num_symbols_read = 0;\n    computeGapArray(pReader, n, pBWTInternal, doReverse, numThreads, pGapArray, \n                    false, num_strings_read, num_symbols_read);\n\n    assert(n == (size_t)-1 || (num_strings_read == n));\n\n    // At this point, the gap array has been calculated for all the sequences\n    curr_idx += num_strings_read;\n    assert(item1.end_index == -1 || (curr_idx == item1.end_index + 1 && curr_idx == item2.start_index));\n\n    // Write the merged BWT/SAI to disk\n    writeMergedIndex(pBWTInternal, item1, item2, bwt_outname, sai_outname, pGapArray);\n\n    delete pBWTInternal;\n    delete pGapArray;\n    return curr_idx;\n}\n\n// Merge the internal and external BWTs and the SAIs\nvoid writeMergedIndex(const BWT* pBWTInternal, const MergeItem& externalItem, \n                      const MergeItem& internalItem, const std::string& bwt_outname,\n                      const std::string& sai_outname, const GapArray* pGapArray)\n{\n    IBWTWriter* pBWTWriter = BWTWriter::createWriter(bwt_outname);\n    IBWTReader* pBWTExtReader = BWTReader::createReader(externalItem.bwt_filename);\n    \n    SAWriter saiWriter(sai_outname);\n    SAReader saiExtReader(externalItem.sai_filename);\n    SAReader saiIntReader(internalItem.sai_filename);\n\n    // Calculate and write header values\n    size_t disk_strings;\n    size_t disk_symbols;\n    BWFlag flag;\n    pBWTExtReader->readHeader(disk_strings, disk_symbols, flag);\n\n    size_t total_strings = disk_strings + pBWTInternal->getNumStrings();\n    size_t total_symbols = disk_symbols + pBWTInternal->getBWLen();\n    pBWTWriter->writeHeader(total_strings, total_symbols, BWF_NOFMI);\n    \n    // Discard the first header each sai\n    size_t discard1, discard2;\n    saiExtReader.readHeader(discard1, discard2);\n    saiIntReader.readHeader(discard1, discard2);\n\n    // Write the header of the SAI which is just the number of strings and elements in the SAI\n    saiWriter.writeHeader(total_strings, total_strings);\n\n    // Calculate and write the actual string\n    // The semantics of the gap array are that we need to write gap_array[i]\n    // symbols to the stream before writing bwtInternal[i]\n    // Each time a '$' symbol is read, it signals the end of some read. We\n    // output one element of the sai from corresponding internal or external\n    // sai file.\n    size_t num_bwt_wrote = 0;\n    size_t num_sai_wrote = 0;\n    for(size_t i = 0; i < pGapArray->size(); ++i)\n    {\n        size_t v = pGapArray->get(i);\n        for(size_t j = 0; j < v; ++j)\n        {\n            char b = pBWTExtReader->readBWChar();\n            assert(b != '\\n');\n            pBWTWriter->writeBWChar(b);\n            ++num_bwt_wrote;\n            \n            if(b == '$')\n            {\n                // The external indices only need to be copied\n                SAElem e = saiExtReader.readElem(); \n                saiWriter.writeElem(e);\n                ++num_sai_wrote;\n            }\n        }\n        \n        // If this is the last entry in the gap array, do not output a symbol from\n        // the internal BWT\n        if(i != pBWTInternal->getBWLen())\n        {\n            char b = pBWTInternal->getChar(i);\n            pBWTWriter->writeBWChar(b);\n            ++num_bwt_wrote;\n\n            if(b == '$')\n            {\n                // The internal indices need to be offset\n                // by the number of strings in the external collection\n                SAElem e = saiIntReader.readElem(); \n\n                uint64_t id = e.getID();\n                id += disk_strings;\n                e.setID(id);\n                \n                saiWriter.writeElem(e);\n                ++num_sai_wrote;\n            }\n        }\n    }\n    if(num_bwt_wrote != total_symbols)\n    {\n        printf(\"Error expected to write %zu symbols, actually wrote %zu\\n\", total_symbols, num_bwt_wrote);\n        assert(num_bwt_wrote == total_symbols);\n    }\n        \n    assert(num_sai_wrote == total_strings);\n    \n    // Ensure we read the entire bw string from disk\n    char last = pBWTExtReader->readBWChar();\n    assert(last == '\\n');\n    (void)last;\n\n    // Finalize the BWT disk file\n    pBWTWriter->finalize();\n\n    delete pBWTExtReader;\n    delete pBWTWriter;\n}\n\n// Write a new BWT and SAI that skips the elements marked\n// by the gap array. This is used to remove entire strings from the \n// index\nvoid writeRemovalIndex(const BWT* pBWTInternal, const std::string& sai_inname,\n                       const std::string& bwt_outname, const std::string& sai_outname, \n                       size_t num_strings_remove, size_t num_symbols_remove,\n                       const GapArray* pGapArray)\n{\n    IBWTWriter* pBWTWriter = BWTWriter::createWriter(bwt_outname);\n    \n    SAWriter* pSAIWriter = new SAWriter(sai_outname);\n    SAReader* pSAIReader = new SAReader(sai_inname);\n\n    // Calculate and write header values\n    assert(num_strings_remove <= pBWTInternal->getNumStrings());\n    assert(num_symbols_remove <= pBWTInternal->getBWLen());\n    size_t input_strings = pBWTInternal->getNumStrings();\n    size_t input_symbols = pBWTInternal->getBWLen();\n\n    size_t output_strings = input_strings - num_strings_remove;\n    size_t output_symbols = input_symbols - num_symbols_remove;\n\n    pBWTWriter->writeHeader(output_strings, output_symbols, BWF_NOFMI);\n    \n    // Discard the header of the sai\n    size_t discard1, discard2;\n    pSAIReader->readHeader(discard1, discard2);\n\n    // Write the header of the SAI which is just the number of strings and elements in the SAI\n    pSAIWriter->writeHeader(output_strings, output_strings);\n\n    // We need to fix the IDs in the SAI. We do this by tracking\n    // the number of IDs that are removed that are lower than a given\n    // id.\n    std::vector<int> id_vector(pBWTInternal->getNumStrings(), 0);\n\n    // Calculate and write the actual string\n    // The gap array marks the symbols that should be removed. We\n    // iterate over the gap array, if the value is zero, we output \n    // the BWT symbol. Otherwise we skip the number of elements\n    // indicated by the gap. \n    size_t num_bwt_wrote = 0;\n    size_t num_sai_wrote = 0;\n    size_t i = 0;\n    while(i < input_symbols)\n    {\n        size_t v = pGapArray->get(i);\n        // If v is zero we output a single symbol, otherwise\n        // we skip v elements. \n        size_t num_to_read = (v == 0) ? 1 : v;\n        for(size_t j = 0; j < num_to_read; ++j)\n        {\n            char b = pBWTInternal->getChar(i);\n            if(b == '$')\n            {\n                SAElem e = pSAIReader->readElem(); \n            \n                // This element of the SAI will be removed,\n                // increment the id vector so we can correct\n                // the indices later\n                if(v > 0)\n                {\n                    id_vector[e.getID()]++;\n                }\n            }\n            \n            // output\n            if(v == 0)\n            {\n                pBWTWriter->writeBWChar(b);\n                assert(b != '\\n');\n                ++num_bwt_wrote;\n            }\n        }\n        i += num_to_read;\n    }\n    \n    if(num_bwt_wrote != output_symbols)\n    {\n        printf(\"Error expected to write %zu symbols, actually wrote %zu\\n\", output_symbols, num_bwt_wrote);\n        assert(num_bwt_wrote == output_symbols);\n    }\n\n    // Finalize the BWT disk file\n    pBWTWriter->finalize();\n\n    // Accumulate the counts for each id\n    int prev = 0;\n    for(size_t i = 0; i < id_vector.size(); ++i)\n    {\n        id_vector[i] += prev;\n        prev = id_vector[i];\n    }\n\n    // Read the SAI file again, writing out the\n    // corrected IDs that are not marked for removal\n    delete pSAIReader;\n    pSAIReader = new SAReader(sai_inname);\n    pSAIReader->readHeader(discard1, discard2);\n    for(size_t i = 0; i < input_strings; ++i)\n    {\n        SAElem e = pSAIReader->readElem();\n        uint64_t id = e.getID();\n        int prev_count = (id > 0) ? id_vector[id - 1] : 0;\n        int count = id_vector[id];\n        if(count == prev_count)\n        {\n            // the current element should be output, it wasn't marked for removal\n            id -= count;\n            e.setID(id);\n            pSAIWriter->writeElem(e);\n            ++num_sai_wrote;\n        }\n    }\n    assert(num_sai_wrote == output_strings);\n\n    delete pSAIReader;\n    delete pSAIWriter;\n    delete pBWTWriter;\n}\n\n//\nstd::string makeTempName(const std::string& prefix, int id, const std::string& extension)\n{\n    std::stringstream ss;\n    ss << prefix << \".temp-\" << id << extension << (USE_GZ ? \".gz\" : \"\");\n    return ss.str();\n}\n\n//\nstd::string makeFilename(const std::string& prefix, const std::string& extension)\n{\n    std::stringstream ss;\n    ss << prefix << extension << (USE_GZ ? \".gz\" : \"\");\n    return ss.str();\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTDiskConstruction.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWTDiskConstruction - Implementation of the\n// BWT disk construction algorithm of Ferragina,\n// Gagie, Manzini. See Lightweight Data Indexing\n// and Compression in External Memory\n//\n// This implementation does not strictly follow \n// their method but is modified to handle\n// large numbers of short strings\n#ifndef BWTDISKCONSTRUCTION_H\n#define BWTDISKCONSTRUCTION_H\n\n#include \"SuffixArray.h\"\n#include \"BWT.h\"\n\nstruct BWTDiskParameters\n{\n    std::string inFile;\n    std::string outPrefix;\n    std::string bwtExtension;\n    std::string saiExtension;\n    size_t numReadsPerBatch;\n    int numThreads;\n    int storageLevel;\n    bool bBuildReverse;\n    bool bUseBCR;\n};\n\n// Construct the burrows-wheeler transform of reads in in_filename\n// using the disk storage algorithm\nvoid buildBWTDisk(const BWTDiskParameters& parameters);\n\n// Merge the indices for the readsFile1 and readsFile2\nvoid mergeIndependentIndices(const std::string& readsFile1, const std::string& readsFile2, \n                             const std::string& outPrefix, const std::string& bwt_extension, \n                             const std::string& sai_extension, bool doReverse, int numThreads, int storageLevel);\n\n// Compute new indices from allReadsFile without the reads in readsToRemove\nvoid removeReadsFromIndices(const std::string& allReadsFile, const std::string& readsToRemove,\n                             const std::string& outPrefix, const std::string& bwt_extension, \n                             const std::string& sai_extension, bool doReverse, int numThreads);\n\n//\nvoid mergeReadFiles(const std::string& readsFile1, const std::string& readsFile2, const std::string& outPrefix);\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTIndexSet.h",
    "content": "//-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWTIndexSet.h - Struct holding the different\n// types of index for a set of sequences. Used\n// to simplify the interface to some functions.\n//\n#ifndef BWTINDEXSET_H\n#define BWTINDEXSET_H\n\n#include \"BWT.h\"\n#include \"BWTIntervalCache.h\"\n#include \"SampledSuffixArray.h\"\n#include \"PopulationIndex.h\"\n#include \"QualityTable.h\"\n\n// A collection of indices. For some algorithms\n// all indices are not necessary so some of these\n// can be NULL. The algorithms will check as preconditions\n// which indices they need.\nstruct BWTIndexSet\n{\n    // Constructor\n    BWTIndexSet() : pBWT(NULL), pRBWT(NULL), pCache(NULL), pSSA(NULL), pPopIdx(NULL), pQualityTable(NULL) {}\n\n    // Data\n    const BWT* pBWT;\n    const BWT* pRBWT;\n    const BWTIntervalCache* pCache;\n    const SampledSuffixArray* pSSA;\n    const PopulationIndex* pPopIdx;\n    const QualityTable* pQualityTable;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTInterval.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// BWTInterval - Data structures for holding and manipulating\n// the coordinates in a BWT/FM-index\n// \n#ifndef BWTINTERVAL_H\n#define BWTINTERVAL_H\n\n#include <list>\n#include <iostream>\n#include <inttypes.h>\n\n// A BWTInterval holds a pair of integers which delineate an alignment of some string\n// to a BWT/Suffix Array\nstruct BWTInterval\n{\n    // Functions\n    BWTInterval() : lower(0), upper(0) {}\n    BWTInterval(int64_t l, int64_t u) : lower(l), upper(u) {}\n\n    inline bool isValid() const { return lower <= upper; }\n    inline int64_t size() const { return upper - lower + 1; }\n\n    static inline bool compare(const BWTInterval& a, const BWTInterval& b)\n    {\n        if(a.lower == b.lower)\n            return a.upper < b.upper;\n        else\n            return a.lower < b.lower;\n    }\n\n    static inline bool equal(const BWTInterval& a, const BWTInterval& b)\n    {\n        return a.lower == b.lower && a.upper == b.upper;\n    }\n\n    friend std::ostream& operator<<(std::ostream& out, const BWTInterval& a)\n    {\n        out << a.lower << \" \" << a.upper;\n        return out;\n    }\n\n    friend std::istream& operator>>(std::istream& in, BWTInterval& a)\n    {\n        in >> a.lower >> a.upper;\n        return in;\n    }\n\n    void write(std::ostream& out)\n    {\n        out.write((char*)&lower, sizeof(lower));\n        out.write((char*)&upper, sizeof(upper));\n    }\n\n    void read(std::istream& in)\n    {\n        in.read((char*)&lower, sizeof(lower));\n        in.read((char*)&upper, sizeof(upper));\n    }\n\n    // Data\n    int64_t lower;\n    int64_t upper;\n};\n\n// A pair of intervals, used for bidirectional searching a bwt/revbwt in lockstep\nstruct BWTIntervalPair\n{\n    // Functions\n    BWTInterval& get(unsigned int idx) { return interval[idx]; }\n    bool isValid() const { return interval[0].isValid() && interval[1].isValid(); }\n\n    friend bool operator==(const BWTIntervalPair& a, const BWTIntervalPair& b)\n    {\n        return BWTInterval::equal(a.interval[0], b.interval[0]) && \n               BWTInterval::equal(a.interval[1], b.interval[1]);\n    }\n\n    // Sort an itnerval pair by interval[0]'s lower coordinate\n    static bool sortFirstLower(const BWTIntervalPair& a, const BWTIntervalPair& b)\n    {\n        return a.interval[0].lower < b.interval[0].lower;\n    }\n\n    // Sort an itnerval pair by interval[1]'s lower coordinate\n    static bool sortSecondLower(const BWTIntervalPair& a, const BWTIntervalPair& b)\n    {\n        return a.interval[1].lower < b.interval[1].lower;\n    }    \n\n    // I/O\n    friend std::ostream& operator<<(std::ostream& out, const BWTIntervalPair& a)\n    {\n        out << a.interval[0] << \" \" << a.interval[1];\n        return out;\n    }\n\n    friend std::istream& operator>>(std::istream& in, BWTIntervalPair& a)\n    {\n        in >> a.interval[0] >> a.interval[1];\n        return in;\n    }\n    \n    // Data\n    BWTInterval interval[2];\n};\n\n#endif\n\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTIntervalCache.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWTIntervalCache - Array of cached bwt intervals for all\n// substrings of a fixed length\n//\n#include \"BWTIntervalCache.h\"\n#include \"BWTAlgorithms.h\"\n\nBWTIntervalCache::BWTIntervalCache(size_t k, const BWT* pBWT) : m_kmer(k)\n{\n    build(pBWT);\n}\n\n// Build the table for the given bwt\nvoid BWTIntervalCache::build(const BWT* pBWT)\n{\n    // Restrict the kmer parameter to something reasonable\n    // so we don't try to allocate an absurdly large array\n    assert(m_kmer <= 12);\n\n    size_t num_entries = 1 << 2*m_kmer;\n    m_table.resize(num_entries);\n\n    //debug\n    //std::cerr << \"num entries \" << num_entries << \" m_kmer \" << m_kmer << std::endl;\n\n    // Construct the table\n    for(size_t i = 0; i < num_entries; ++i)\n    {\n        std::string w = int2string(i);\n\n\t//debug\n\t//std::cerr << w << std::endl;\n\n        //printf(\"i: %zu w: %s o: %zu\\n\", i, w.c_str(), string2int(w));\n        BWTInterval interval = BWTAlgorithms::findInterval(pBWT, w);\n        m_table[i] = interval;\n    }\n\n    //debug\n    //std::cerr << \"m_table.size() \" << m_table.size() << std::endl;\n\n}\n\n// Construct the corresponding string for integer i\nstd::string BWTIntervalCache::int2string(size_t i) const\n{\n    std::string out(m_kmer, 'A');\n    for(size_t k = 0; k < m_kmer; ++k)\n    {\n        // Get the character as position k (0 = left-most position)\n        size_t code = (i >> 2*(m_kmer - k - 1)) & 3;\n        char b = DNA_ALPHABET::getBase(code);\n        out[k] = b;\n    }\n    return out;\n}\n\n// Return the length of the cached strings\nsize_t BWTIntervalCache::getCachedLength() const\n{\n    return m_kmer;\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTIntervalCache.h",
    "content": "///-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWTIntervalCache - Array of cached bwt intervals for all\n// substrings of a fixed length\n//\n#ifndef BWTINTERVAL_CACHE_H\n#define BWTINTERVAL_CACHE_H\n\n#include \"BWT.h\"\n#include \"BWTInterval.h\"\n\nclass BWTIntervalCache\n{\n    public:\n\n        //\n        BWTIntervalCache(size_t k, const BWT* pBWT);\n        \n        // Look up the bwt interval for the given string\n        inline BWTInterval lookup(const char* w) const\n        {\n            // Convert the string to an integer index in the lookup table\n            size_t idx = str2int(w);\n            return m_table[idx];\n        }\n\n        // \n        size_t getCachedLength() const;\n\n    private:\n\n        // Build the array for the given BWt\n        void build(const BWT* pBWT);\n        \n        // Map a string to an integer\n        // Precondition: w must be at least m_kmer symbols long\n        inline size_t str2int(const char* w) const\n        {\n            size_t out = 0;\n            for(size_t k = 0; k < m_kmer; ++k) {\n                assert(w[k] != '$');\n                out |= DNA_ALPHABET::getBaseRank(w[k]) << 2*(m_kmer - k - 1);\n            }\n            return out;\n        }\n\n        // Map an integer to a string\n        std::string int2string(size_t i) const;\n\n        size_t m_kmer;\n        std::vector<BWTInterval> m_table;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTReader.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTReader - Abstract class for reading a BWT file\n//\n#include \"BWTReader.h\"\n#include \"BWTReaderBinary.h\"\n#include \"BWTReaderAscii.h\"\n\n//\nIBWTReader* BWTReader::createReader(const std::string& filename)\n{\n    return new BWTReaderBinary(filename);\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTReader.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTReader - Abstract class for reading a BWT file\n//\n#ifndef BWTREADER_H\n#define BWTREADER_H\n\n#include \"Util.h\"\n#include \"STCommon.h\"\n#include \"Occurrence.h\"\n#include \"EncodedString.h\"\n\nenum BWIOStage\n{\n    IOS_NONE,\n    IOS_HEADER,\n    IOS_BWSTR,\n    IOS_PC,\n    IOS_OCC,\n    IOS_DONE\n};\n\nenum BWFlag\n{\n    BWF_NOFMI = 0,\n    BWF_HASFMI\n};\n\nconst uint16_t RLBWT_FILE_MAGIC = 0xCACA;\nconst uint16_t BWT_FILE_MAGIC = 0xEFEF;\n\nclass RLBWT;\n\nclass IBWTReader\n{\n    public:\n        IBWTReader() {}\n        IBWTReader(const std::string& /*filename*/) {}\n        virtual ~IBWTReader() {}\n\n        //\n        virtual void read(RLBWT* pRLBWT) = 0;\n        virtual void readHeader(size_t& num_strings, size_t& num_symbols, BWFlag& flag) = 0; \n        virtual char readBWChar() = 0;\n};\n\nnamespace BWTReader\n{\n    IBWTReader* createReader(const std::string& filename);\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTReaderAscii.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTReaderAsciiAscii - Read a BWT file from disk\n//\n#include \"BWTReaderAscii.h\"\n#include \"SBWT.h\"\n#include \"RLBWT.h\"\n\n//\nBWTReaderAscii::BWTReaderAscii(const std::string& filename) : m_stage(IOS_NONE)\n{\n    m_pReader = createReader(filename);\n    m_stage = IOS_HEADER;\n}\n\n//\nBWTReaderAscii::~BWTReaderAscii()\n{\n    delete m_pReader;\n}\n\nvoid BWTReaderAscii::read(SBWT* pBWT)\n{\n    size_t n;\n    BWFlag flag;\n    readHeader(pBWT->m_numStrings, n, flag);\n\n    pBWT->m_bwStr.resize(n);\n    readBWStr(pBWT->m_bwStr);\n \n    // Reading the occurrence array from disk is deprecated\n    // we ignore it if it is present\n}\n\nvoid BWTReaderAscii::read(RLBWT* pRLBWT)\n{\n    size_t n;\n    BWFlag flag;\n    readHeader(pRLBWT->m_numStrings, n, flag);\n\n    bool done = false;\n    while(!done)\n    {\n        char b = readBWChar();\n        if(b != '\\n')\n        {\n            pRLBWT->append(b);\n        }\n        else\n        {\n            done = false;\n            break;\n        }\n    }\n}\n\n//\nvoid BWTReaderAscii::readHeader(size_t& num_strings, size_t& num_symbols, BWFlag& flag)\n{\n    assert(m_stage == IOS_HEADER);\n    uint16_t magic_number;\n\n    // Ensure the file format is sane\n    *m_pReader >> magic_number;\n    if(magic_number != BWT_FILE_MAGIC)\n    {\n        std::cerr << \"BWT file is not properly formatted, aborting\\n\";\n        exit(EXIT_FAILURE);\n    }\n    *m_pReader >> num_strings;\n    *m_pReader >> num_symbols;\n    int temp;\n    *m_pReader >> temp;\n    flag = static_cast<BWFlag>(temp);\n    // We must explicitly set the stream\n    // to the start of the BWStr portion of\n    // the file. The above extraction\n    // does not discard the trailing newline \n    // so we do it here\n    m_pReader->get();\n\n    m_stage = IOS_BWSTR;    \n}\n\n//\nvoid BWTReaderAscii::readBWStr(BWTString& out_str)\n{\n    assert(m_stage == IOS_BWSTR);\n    char b;\n    size_t idx = 0;\n    while(1)\n    {\n        m_pReader->get(b);\n        if(b != '\\n')\n            out_str.set(idx++, b);\n        else\n            break;\n    }\n\n    assert(idx == out_str.length());\n    m_stage = IOS_PC;\n}\n\n// Read a single base from the BWStr\nchar BWTReaderAscii::readBWChar()\n{\n    assert(m_stage == IOS_BWSTR);\n    char b;\n    m_pReader->get(b);\n    if(b == '\\n')\n        m_stage = IOS_PC;\n    return b;\n}\n\n//\nvoid BWTReaderAscii::readPred(AlphaCount64& out_pc)\n{\n    assert(m_stage == IOS_PC);\n    *m_pReader >> out_pc;\n    m_stage = IOS_OCC;\n}\n\n//\nvoid BWTReaderAscii::readOccurrence(Occurrence& out_occ)\n{\n    assert(m_stage == IOS_OCC);\n    *m_pReader >> out_occ;\n    m_stage = IOS_DONE;\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTReaderAscii.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTReaderAsciiAscii.h - Read a plain-text BWT file from disk\n//\n#ifndef BWTREADERASCII_H\n#define BWTREADERASCII_H\n\n#include \"Util.h\"\n#include \"STCommon.h\"\n#include \"Occurrence.h\"\n#include \"EncodedString.h\"\n#include \"BWTReader.h\"\n\nclass SBWT;\nclass RLBWT;\n\nclass BWTReaderAscii : public IBWTReader\n{\n    public:\n        BWTReaderAscii(const std::string& filename);\n        ~BWTReaderAscii();\n\n        //\n        void read(SBWT* pBWT);\n        void read(RLBWT* pRLBWT);\n        void readHeader(size_t& num_strings, size_t& num_symbols, BWFlag& flag);\n        void readBWStr(BWTString& out_str);\n        char readBWChar();\n        void readPred(AlphaCount64& out_pc);\n        void readOccurrence(Occurrence& out_icc);\n\n    private:\n        std::istream* m_pReader;\n        BWIOStage m_stage;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTReaderBinary.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// RLBWTReaderBinary - Read a run length encoded BWT file from disk\n//\n#include \"BWTReaderBinary.h\"\n#include \"SBWT.h\"\n#include \"RLBWT.h\"\n\n//\nBWTReaderBinary::BWTReaderBinary(const std::string& filename) : m_stage(IOS_NONE), m_numRunsOnDisk(0), m_numRunsRead(0)\n{\n    m_pReader = createReader(filename, std::ios::binary);\n    m_stage = IOS_HEADER;\n}\n\n//\nBWTReaderBinary::~BWTReaderBinary()\n{\n    delete m_pReader;\n}\n\nvoid BWTReaderBinary::read(RLBWT* pRLBWT)\n{\n    BWFlag flag;\n    readHeader(pRLBWT->m_numStrings, pRLBWT->m_numSymbols, flag);\n\n    assert(m_numRunsOnDisk > 0);\n    readRuns(pRLBWT->m_rlString, m_numRunsOnDisk);\n\n    //pRLBWT->printInfo();\n    //pRLBWT->print();\n}\n\nvoid BWTReaderBinary::read(SBWT* pSBWT)\n{\n    BWFlag flag;\n    size_t numSymbols;\n    readHeader(pSBWT->m_numStrings, numSymbols, flag);\n    size_t numRead = 0;\n    pSBWT->m_bwStr.resize(numSymbols);\n    while(numRead < numSymbols)\n    {\n        char b = readBWChar();\n        pSBWT->m_bwStr.set(numRead++, b);\n    }\n\n    assert(m_numRunsOnDisk > 0);\n}\n\n//\nvoid BWTReaderBinary::readHeader(size_t& num_strings, size_t& num_symbols, BWFlag& flag)\n{\n    assert(m_stage == IOS_HEADER);\n    uint16_t magic_number;\n    m_pReader->read(reinterpret_cast<char*>(&magic_number), sizeof(magic_number));\n    \n    if(magic_number != RLBWT_FILE_MAGIC)\n    {\n        std::cerr << \"BWT file is not properly formatted, aborting\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    m_pReader->read(reinterpret_cast<char*>(&num_strings), sizeof(num_strings));\n    m_pReader->read(reinterpret_cast<char*>(&num_symbols), sizeof(num_symbols));\n    m_pReader->read(reinterpret_cast<char*>(&m_numRunsOnDisk), sizeof(m_numRunsOnDisk));\n    m_pReader->read(reinterpret_cast<char*>(&flag), sizeof(flag));\n    \n    //std::cout << \"Read magic: \" << magic_number << \"\\n\";\n    //std::cout << \"strings:\" << num_strings << \"\\n\";\n    //std::cout << \"symbols: \" << num_symbols << \"\\n\";\n    //std::cout << \"runs: \" << m_numRunsOnDisk << \"\\n\";\n    \n    m_stage = IOS_BWSTR;    \n}\n\nvoid BWTReaderBinary::readRuns(RLVector& out, size_t numRuns)\n{\n    out.resize(numRuns);\n    m_pReader->read(reinterpret_cast<char*>(&out[0]), numRuns*sizeof(RLUnit));\n    m_numRunsRead = numRuns;\n}\n\n// Read a single base from the BWStr\n// The BWT is stored as runs on disk, so this class keeps\n// an internal buffer of a single run and emits characters from this buffer\n// and performs reads as necessary. If all the runs have been read, emit\n// a newline character to signal the end of the BWT\nchar BWTReaderBinary::readBWChar()\n{\n    assert(m_stage == IOS_BWSTR);\n\n    if(m_currRun.isEmpty())\n    {\n        // All runs have been read and emitted, return the end marker\n        if(m_numRunsRead == m_numRunsOnDisk)\n            return '\\n';\n \n        // Read one run from disk\n        m_pReader->read(reinterpret_cast<char*>(&m_currRun), sizeof(RLUnit));\n        ++m_numRunsRead;\n    }\n\n    // Decrement the current run and emit its symbol\n    m_currRun.decrementCount();\n    return m_currRun.getChar();\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTReaderBinary.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTWriterBinary - Read a run length encoded binary BWT file from disk\n//\n#ifndef BWTREADERBINARY_H\n#define BWTREADERBINARY_H\n\n#include \"Util.h\"\n#include \"STCommon.h\"\n#include \"Occurrence.h\"\n#include \"EncodedString.h\"\n#include \"BWTReader.h\"\n#include \"RLBWT.h\"\n\nclass SBWT;\nclass RLBWT;\n\nclass BWTReaderBinary : public IBWTReader\n{\n    public:\n        BWTReaderBinary(const std::string& filename);\n        virtual ~BWTReaderBinary();\n\n        //\n        virtual void read(RLBWT* pRLBWT);\n        virtual void read(SBWT* pSBWT);\n\n        virtual void readHeader(size_t& num_strings, size_t& num_symbols, BWFlag& flag);\n        virtual char readBWChar();\n        virtual void readRuns(RLVector& out, size_t numRuns);\n\n    private:\n        std::istream* m_pReader;\n        BWIOStage m_stage;\n        RLUnit m_currRun;\n        size_t m_numRunsOnDisk;\n        size_t m_numRunsRead;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTTraverse.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWTTraverse - traverse a bwt, outputting all\n// strings that are length greater than some threshold\n//\n#include \"BWTTraverse.h\"\n\nvoid BWTTraverse::extract(const BWT* pBWT, unsigned int len)\n{\n    // Keep a stack of the elements to visit and \n    // a string which is the reverse string corresponding\n    // to the current stack elements\n    TraverseStack stack;\n    std::string rev_str;\n    size_t iter_count = 0;\n    size_t output_count = 0;\n\n    for(size_t i = 0; i < DNA_ALPHABET_SIZE; ++i)\n    {\n        char base_char = ALPHABET[i];\n\n        // Initialize the stack and rev_str\n        BWTInterval range;\n        BWTAlgorithms::initInterval(range, base_char, pBWT);\n        AlphaCount ext = BWTAlgorithms::getExtCount(range, pBWT);\n        stack.push(TraverseElem(range, ext));\n        rev_str.append(1, base_char);\n\n        while(!stack.empty())\n        {\n            ++iter_count;\n            TraverseElem& curr = stack.top();\n            curr.goNext();\n            bool doPop = !curr.isValid(); \n\n            // If rev_str is long enough output it and stop the traversal at this depth\n            if(rev_str.length() == len)\n            {\n                if(output_count % 1000000 == 0)\n                    std::cerr << \"output: \" << output_count << \"\\n\";\n\n                doPop = true;\n                size_t multiplicity = curr.getRange().size();\n                printf(\">%zu %u %zu\\n%s\\n\", output_count, len, multiplicity, reverse(rev_str).c_str());\n                ++output_count;\n            }\n\n            if(doPop)\n            {\n                // Remove one char from the end of the string \n                // and one element from the stack\n                rev_str.erase(rev_str.length() - 1, 1);\n                stack.pop();\n            }\n            else\n            {\n                // Traverse one level deeper \n                char b = curr.getCurrChar();\n                BWTInterval subrange = curr.getRange();\n                BWTAlgorithms::updateInterval(subrange, b, pBWT);\n                AlphaCount subext = BWTAlgorithms::getExtCount(subrange, pBWT);\n                stack.push(TraverseElem(subrange, subext));\n                rev_str.append(1, b);\n            }\n        }\n    }\n\n    std::cerr << \"Num output: \" << output_count << \" num iterations: \" << iter_count << \" count/len: \" << (double)iter_count / len << \"\\n\";\n}\n\nvoid BWTTraverse::extractSG(const BWT* pBWT, const BWT* pRevBWT, const unsigned int len)\n{\n    WARN_ONCE(\"Skipping bwt[0]\");\n    // Keep a bool vector marking which entries in pBWT have been visited\n    size_t n_elems = pBWT->getBWLen();\n    bool_vec visited(n_elems, false);\n\n    size_t count = 0;\n    size_t currIdx = 1;\n    while(currIdx < n_elems)\n    {\n        // Invariant: currIdx is the index into pBWT that is the lowest index that has not been visited\n        // Left-extend the entry at currIdx into a string of length len\n        \n        std::string str;\n        str.reserve(len);\n\n        // Get the first character of the suffix starting at this position\n        char first = pBWT->getF(currIdx);\n        str += first;\n        BWTInterval range(currIdx, currIdx);\n\n        while(str.length() < len)\n        {\n            char b = pBWT->getChar(range.lower);\n            if(b == '$')\n                break;\n            str += b;\n            BWTAlgorithms::updateInterval(range, b, pBWT);\n        }\n\n        // The string was built backwards, reverse it\n        str = reverse(str);\n        if(str.length() < len)\n        {\n            visited[currIdx] = true;\n        }\n        else if(!visited[range.lower])\n        {\n            markVisited(str, visited, pBWT);\n            //std::cout << currIdx << \" interval: \" << range << \" string: \" << str << \"\\n\";\n            extendLeft(len, str, visited, pBWT, pRevBWT);\n            extendRight(len, str, visited, pBWT, pRevBWT, false);\n            printf(\">%zu %zu 0\\n%s\\n\", count++, str.length(), str.c_str());\n        }\n\n        currIdx++;\n    }\n}\n\n\n// Extend the sequence by finding a consensus right-ward extension base\nvoid BWTTraverse::extendRight(const unsigned int len, std::string& str, bool_vec& visited, const BWT* pBWT, const BWT* pRevBWT, bool isReverse)\n{\n    // Extract the last len characters\n    unsigned int overlapLen = len - 1;\n\n    // Initialize the range for str\n    BWTIntervalPair ranges = BWTAlgorithms::findIntervalPair(pBWT, pRevBWT, str);\n\n    bool done = false;\n    while(!done)\n    {\n        AlphaCount ext_counts = BWTAlgorithms::getExtCount(ranges.interval[1], pRevBWT);\n\n        if(ext_counts.hasUniqueDNAChar())\n        {\n            char b = ext_counts.getUniqueDNAChar();\n\n            // There is a unique extension from the seed sequence to B\n            // Ensure that the reverse is true and that the sequence we are extending to, extends to this one\n            std::string joined = str + b;\n            std::string back_search = suffix(joined, len);\n\n            // Get the count of bases back to the ending sequence of seed\n            // We do this in the opposite direction of extension\n            AlphaCount back_count = BWTAlgorithms::calculateExactExtensions(overlapLen, reverse(back_search), pRevBWT, pBWT);\n\n            if(back_count.hasUniqueDNAChar())\n            {\n                // Assert back is the character we are expecting\n                assert(back_count.getUniqueDNAChar() == str[str.length() - len]);\n                str = joined;\n\n                // mark the newly visited l-mers\n                if(!isReverse)\n                {\n                    markVisited(back_search, visited, pBWT);\n                }\n                else\n                {\n                    markVisited(reverse(back_search), visited, pRevBWT);\n                }    \n                BWTAlgorithms::updateBothR(ranges, b, pRevBWT);\n            }\n            else\n            {\n                done = true;\n            }\n        }\n        else\n        {\n            done = true;\n        }\n    }\n}\n\n// Extend the string to the left by reversing it and calling extendRight\nvoid BWTTraverse::extendLeft(const unsigned int len, std::string& str, bool_vec& visited, const BWT* pBWT, const BWT* pRevBWT)\n{\n    str = reverse(str);\n    extendRight(len, str, visited, pRevBWT, pBWT, true);\n    str = reverse(str);\n}\n\nvoid BWTTraverse::markVisited(const std::string& str, bool_vec& visited, const BWT* pBWT)\n{\n    BWTInterval range = BWTAlgorithms::findInterval(pBWT, str);\n    for(int64_t i = range.lower; i <= range.upper; ++i)\n    {\n        assert(i >= 0 && i < (int64_t)visited.size());\n        visited[i] = true;\n    }\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTTraverse.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// BWTTraverse - bwt traversal algorithms\n//\n#ifndef BWTTRAVERSE_H\n#define BWTTRAVERSE_H\n\n#include \"BWT.h\"\n#include \"BWTAlgorithms.h\"\n#include <stack>\n\nstruct TraverseElem\n{\n    // The current index is set to 0 and we iterate forward until we find the first valid (non-zero) entry\n    // This skips elem 0 which is the $ \n    TraverseElem(const BWTInterval& i, AlphaCount ac) : base_range(i), desc(ac), currIdx(0) { }\n\n    // Return true if the current position is valid\n    bool isValid() const\n    {\n        return currIdx < ALPHABET_SIZE;\n    }\n\n    // Return the current char\n    char getCurrChar() const\n    {\n        assert(isValid());\n        return desc.getBase(currIdx);\n    }\n\n    // Return the range\n    const BWTInterval& getRange() const { return base_range; }\n\n    // go to the next character with a non-zero count\n    // this automatically skips index 0, which we want since its the '$' character\n    void goNext()\n    {\n        do\n        {\n            ++currIdx;\n        }\n        while(currIdx < ALPHABET_SIZE && desc.getByIdx(currIdx) == 0);\n    }\n\n    // The ranges in the BWT that correspond to the string leading up to this element\n    BWTInterval base_range;\n\n    // The counts of each base {A,C,G,T} that are left-extensions of this range\n    AlphaCount desc;\n\n    // The index of the current base being processed\n    int currIdx;\n};\n\ntypedef std::stack<TraverseElem> TraverseStack;\ntypedef std::vector<bool> bool_vec;\n\nnamespace BWTTraverse\n{\n\n// Extract all strings of length len from the BWT\nvoid extract(const BWT* pBWT, unsigned int len);\n\n// Extract the string graph which minimum component length len from the BWT\nvoid extractSG(const BWT* pBWT, const BWT* pRevBWT, const unsigned int len);\nvoid extendLeft(const unsigned int len, std::string& str, bool_vec& visited, const BWT* pBWT, const BWT* pRevBWT);\nvoid extendRight(const unsigned int len, std::string& str, bool_vec& visited, const BWT* pBWT, const BWT* pRevBWT, bool isReverse);\nvoid markVisited(const std::string& str, bool_vec& visited, const BWT* pBWT);\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTWriter.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTWriter - Abstract class for writing a BWT file to disk\n//\n#include \"BWTWriter.h\"\n#include \"BWTWriterBinary.h\"\n#include \"BWTWriterAscii.h\"\n\n//\nvoid IBWTWriter::write(const SuffixArray* pSA, const ReadTable* pRT)\n{\n    size_t num_symbols = pSA->getSize();\n    size_t num_strings = pSA->getNumStrings();\n    writeHeader(num_strings, num_symbols, BWF_NOFMI);\n\n    for(size_t i = 0; i < num_symbols; ++i)\n    {\n        SAElem saElem = pSA->get(i);\n        const SeqItem& si = pRT->getRead(saElem.getID());\n\n        // Get the position of the start of the suffix\n        uint64_t f_pos = saElem.getPos();\n        uint64_t l_pos = (f_pos == 0) ? si.seq.length() : f_pos - 1;\n        char b = (l_pos == si.seq.length()) ? '$' : si.seq.get(l_pos);\n        writeBWChar(b);\n    }\n    finalize();\n}\n\n//\nIBWTWriter* BWTWriter::createWriter(const std::string& filename)\n{\n    return new BWTWriterBinary(filename);\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTWriter.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTWriter - Abstract class for writing a BWT file to disk\n//\n#ifndef BWTWRITER_H\n#define BWTWRITER_H\n\n#include \"Util.h\"\n#include \"STCommon.h\"\n#include \"Occurrence.h\"\n#include \"BWTReader.h\"\n#include \"EncodedString.h\"\n#include \"SuffixArray.h\"\n\nclass IBWTWriter\n{\n    public:\n        IBWTWriter() {}\n        IBWTWriter(const std::string& /*filename*/) {}\n        virtual ~IBWTWriter() {}\n\n        //\n        void write(const SuffixArray* pSA, const ReadTable* pRT);\n        virtual void writeHeader(const size_t& num_strings, const size_t& num_symbols, const BWFlag& flag) = 0;\n        virtual void writeBWChar(char b) = 0;\n        virtual void finalize() = 0;\n};\n\nnamespace BWTWriter\n{\n    IBWTWriter* createWriter(const std::string& filename);\n}\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTWriterAscii.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTWriterAscii - Write a BWT file to disk\n//\n#include \"BWTWriterAscii.h\"\n#include \"SBWT.h\"\n#include \"RLBWT.h\"\n\n//\nBWTWriterAscii::BWTWriterAscii(const std::string& filename) : m_stage(IOS_NONE)\n{\n    m_pWriter = createWriter(filename);\n    m_stage = IOS_HEADER;\n}\n\n//\nBWTWriterAscii::~BWTWriterAscii()\n{\n    delete m_pWriter;\n}\n\nvoid BWTWriterAscii::write(const SBWT* pBWT)\n{\n    writeHeader(pBWT->m_numStrings, pBWT->m_bwStr.length(), BWF_HASFMI);\n    writeBWStr(pBWT->m_bwStr);\n    writePred(pBWT->m_predCount);\n    writeOccurrence(pBWT->m_occurrence);\n}\n\nvoid BWTWriterAscii::write(const RLBWT* pRLBWT)\n{\n    writeHeader(pRLBWT->m_numStrings, pRLBWT->m_numSymbols, BWF_NOFMI);\n    size_t numRuns = pRLBWT->getNumRuns();\n    for(size_t i = 0; i < numRuns; ++i)\n    {\n        const RLUnit& unit = pRLBWT->m_rlString[i];\n        char symbol = unit.getChar();\n        size_t length = unit.getCount();\n        for(size_t j = 0; j < length; ++j)\n            writeBWChar(symbol);\n    }\n    // Finalize the string\n    writeBWChar('\\n');\n}\n\n//\nvoid BWTWriterAscii::writeHeader(const size_t& num_strings, const size_t& num_symbols, const BWFlag& flag)\n{\n    assert(m_stage == IOS_HEADER);\n    *m_pWriter << BWT_FILE_MAGIC << \"\\n\";\n    *m_pWriter << num_strings << \"\\n\";\n    *m_pWriter << num_symbols << \"\\n\";\n    int temp = flag;\n    *m_pWriter << temp << \"\\n\";\n    m_stage = IOS_BWSTR;    \n}\n\n//\nvoid BWTWriterAscii::writeBWStr(const BWTString& str)\n{\n    assert(m_stage == IOS_BWSTR);\n    size_t n = str.length();\n    for(size_t i = 0; i < n; ++i)\n        *m_pWriter << str.get(i);\n    finalize();\n}\n\n// Write a single character of the BWStr\n// If the char is '\\n' we are finished\nvoid BWTWriterAscii::writeBWChar(char b)\n{\n    m_pWriter->put(b);\n}\n\nvoid BWTWriterAscii::finalize()\n{\n    m_pWriter->put('\\n');\n    m_stage = IOS_PC;\n}\n//\nvoid BWTWriterAscii::writePred(const AlphaCount64& pc)\n{\n    assert(m_stage == IOS_PC);\n    *m_pWriter << pc << \"\\n\";\n    m_stage = IOS_OCC;\n}\n\n//\nvoid BWTWriterAscii::writeOccurrence(const Occurrence& occ)\n{\n    assert(m_stage == IOS_OCC);\n    *m_pWriter << occ; // delibrately no newline\n    m_stage = IOS_DONE;\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTWriterAscii.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTWriterAsciiAscii - Write a BWT to a plain text file\n//\n#ifndef BWTWRITERASCII_H\n#define BWTWRITERASCII_H\n\n#include \"Util.h\"\n#include \"STCommon.h\"\n#include \"Occurrence.h\"\n#include \"BWTWriter.h\"\n#include \"EncodedString.h\"\n#include \"SuffixArray.h\"\n\nclass SBWT;\nclass RLBWT;\n\nclass BWTWriterAscii : public IBWTWriter\n{\n    public:\n        BWTWriterAscii(const std::string& filename);\n        virtual ~BWTWriterAscii();\n\n        //\n        virtual void write(const RLBWT* pRLBWT);\n        virtual void writeHeader(const size_t& num_strings, const size_t& num_symbols, const BWFlag& flag);\n        virtual void writeBWChar(char b);\n        virtual void finalize();\n\n        void write(const SBWT* pBWT);\n        void writeBWStr(const BWTString& str); \n        void writePred(const AlphaCount64& pc);\n        void writeOccurrence(const Occurrence& icc);\n\n    private:\n        std::ostream* m_pWriter;\n        BWIOStage m_stage;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTWriterBinary.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTWriterBinary - Write a run-length encoded BWT to a binary file\n//\n#include \"BWTWriterBinary.h\"\n#include \"SBWT.h\"\n#include \"RLBWT.h\"\n\n//\nBWTWriterBinary::BWTWriterBinary(const std::string& filename) : m_numRuns(0), m_runFileOffset(0), m_stage(IOS_NONE)\n{\n    m_pWriter = createWriter(filename, std::ios::out | std::ios::binary);\n    m_stage = IOS_HEADER;\n}\n\n//\nBWTWriterBinary::~BWTWriterBinary()\n{\n    assert(m_stage == IOS_DONE);\n    delete m_pWriter;\n}\n\n//\nvoid BWTWriterBinary::writeHeader(const size_t& num_strings, const size_t& num_symbols, const BWFlag& flag)\n{\n    assert(m_stage == IOS_HEADER);\n    m_pWriter->write(reinterpret_cast<const char*>(&RLBWT_FILE_MAGIC), sizeof(RLBWT_FILE_MAGIC));\n    m_pWriter->write(reinterpret_cast<const char*>(&num_strings), sizeof(num_strings));\n    m_pWriter->write(reinterpret_cast<const char*>(&num_symbols), sizeof(num_symbols));\n\n    // Here we do not know the number of runs that are going to be written to the file\n    // so we save the offset in the file and write a dummy value. After the bwt string\n    // has been written, we return here and fill in the correct value\n    m_runFileOffset = m_pWriter->tellp();\n    m_numRuns = 0;\n    m_pWriter->write(reinterpret_cast<const char*>(&m_numRuns), sizeof(m_numRuns));\n\n    assert(flag == BWF_NOFMI);\n    m_pWriter->write(reinterpret_cast<const char*>(&flag), sizeof(flag));\n\n    m_stage = IOS_BWSTR;    \n}\n\n// Write a single character of the BWStr\n// If the char is '\\n' we are finished\nvoid BWTWriterBinary::writeBWChar(char b)\n{\n    if(m_currRun.isInitialized())\n    {\n        if(m_currRun.getChar() == b && !m_currRun.isFull())\n        {\n            m_currRun.incrementCount();\n        }\n        else\n        {\n            // Write out the old run and start a new one\n            assert(m_currRun.isInitialized());\n            writeRun(m_currRun);\n            m_currRun = RLUnit(b);\n        }        \n    }\n    else\n    {\n        // Start a new run\n        m_currRun = RLUnit(b);\n    }\n}\n\n//\nvoid BWTWriterBinary::writeRun(RLUnit& unit)\n{\n    //std::cout << \"Writing \" << unit.getChar() << \",\" << (int)unit.getCount() << \"\\n\";\n    m_pWriter->write(reinterpret_cast<const char*>(&unit.data), sizeof(unit.data));\n    ++m_numRuns;\n}\n\n// write the final run to the stream and fill in the number of runs\nvoid BWTWriterBinary::finalize()\n{\n    // JS Bugfix 24/05/12\n    // Allow empty BWTs to be written out\n    if(m_currRun.isInitialized())\n        writeRun(m_currRun);\n\n    m_pWriter->seekp(m_runFileOffset);\n    m_pWriter->write(reinterpret_cast<const char*>(&m_numRuns), sizeof(m_numRuns));\n    m_pWriter->seekp(std::ios_base::end);\n    m_stage = IOS_DONE;\n}\n\n"
  },
  {
    "path": "src/SGA/SuffixTools/BWTWriterBinary.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// BWTWriterBinary - Write a run-length encoded BWT to a binary file\n//\n#ifndef BWTWRITERBINARY_H\n#define BWTWRITERBINARY_H\n\n#include \"Util.h\"\n#include \"STCommon.h\"\n#include \"Occurrence.h\"\n#include \"BWTWriter.h\"\n#include \"BWTReaderBinary.h\"\n#include \"EncodedString.h\"\n#include \"RLBWT.h\"\n\nclass SBWT;\nclass RLBWT;\n\nclass BWTWriterBinary : public IBWTWriter\n{\n    public:\n        BWTWriterBinary(const std::string& filename);\n        virtual ~BWTWriterBinary();\n\n        // Write an RLBWT file directly from a suffix array and read table\n        virtual void writeHeader(const size_t& num_strings, const size_t& num_symbols, const BWFlag& flag);\n        virtual void writeBWChar(char b);\n        virtual void finalize(); // this method must be called after writing the BW string\n\n    private:\n\n        void writeRun(RLUnit& unit);\n\n        std::ostream* m_pWriter;\n        size_t m_numRuns;\n        std::streampos m_runFileOffset;\n        RLUnit m_currRun;\n        BWIOStage m_stage;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/FMMarkers.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// FMMarkers - Marker classes used in the FM-index\n// implementation\n//\n#ifndef FMMARKERS_H\n#define FMMARKERS_H\n\n// LargeMarker - To allow random access to the \n// BWT symbols and implement the occurrence array\n// we keep a vector of symbol counts every D1 symbols.\n// These counts are the absolute number of times each\n// symbol has been seen up to that point.\n// \nstruct LargeMarker\n{\n    LargeMarker() : unitIndex(0) {}\n\n    // Calculate the actual position in the uncompressed BWT of this marker\n    // This is the number of symbols preceding this marker\n    inline size_t getActualPosition() const\n    {\n        return counts.getSum();\n    }\n\n    void print() const\n    {\n        std::cout << \"Large marker actual pos: \" << getActualPosition() << \"\\n\";\n        std::cout << \"Marker unit index: \" << unitIndex << \"\\n\";\n        std::cout << \"Marker counts: \";\n        for(int i = 0; i < ALPHABET_SIZE; ++i)\n        {\n            std::cout << (int)counts.getByIdx(i) << \" \";\n        }\n        std::cout << \"\\n\";\n    }    \n\n    // Returns true if the data in the markers is identical\n    bool operator==(const LargeMarker& rhs)\n    {\n        for(size_t i = 0; i < ALPHABET_SIZE; ++i)\n        {\n            if(counts.getByIdx(i) != rhs.counts.getByIdx(i))\n                return false;\n        }\n        return unitIndex == rhs.unitIndex;\n    }\n\n    // The number of times each symbol has been seen up to this marker\n    AlphaCount64 counts; \n\n    // The index in the RLVector of the run that starts after\n    // this marker. That is, if C = getActualPosition(), then\n    // the run containing the B[C] is at unitIndex. This is not necessary\n    // a valid index if there is a marker after the last symbol in the BWT\n    size_t unitIndex;\n};\ntypedef std::vector<LargeMarker> LargeMarkerVector;\n\n// SmallMarker - Small markers contain the counts\n// within an individual block of the BWT. In other words\n// the small marker contains the count for the last D2 symbols\n// \nstruct SmallMarker\n{\n    SmallMarker() : unitCount(0) {}\n\n    // Calculate the actual position in the uncompressed BWT of this marker\n    // This is the number of symbols preceding this marker\n    inline size_t getCountSum() const\n    {\n        return counts.getSum();\n    }\n\n    void print() const\n    {\n        for(int i = 0; i < ALPHABET_SIZE; ++i)\n        {\n            std::cout << (int)counts.getByIdx(i) << \" \";\n        }\n        std::cout << \"\\n\";\n    }\n\n    // The number of times each symbol has been seen up to this marker\n    AlphaCount16 counts; \n\n    // The number of RL units in this block\n    uint16_t unitCount;\n};\ntypedef std::vector<SmallMarker> SmallMarkerVector;\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/GapArray.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// GapArray - Data structure and functions used to count \n// the number of times a suffix of a given rank occurs in a data set\n//\n#include \"GapArray.h\"\n#include \"SparseGapArray.h\"\n#if 0\n// SimpleGapArray\nSimpleGapArray::SimpleGapArray()\n{\n\n}\n\n//\nvoid SimpleGapArray::resize(size_t n)\n{\n    m_data.resize(n);\n}\n\n//\nvoid SimpleGapArray::increment(size_t i)\n{\n    static size_t max_gap_count = std::numeric_limits<GAP_TYPE>::max();\n    assert(i < m_data.size());    \n    assert(m_data[i] < max_gap_count);\n    ++m_data[i];\n}\n\n//\nsize_t SimpleGapArray::get(size_t i) const\n{\n    return m_data[i];\n}\n\n// \nsize_t SimpleGapArray::size() const\n{\n    return m_data.size();\n}\n#endif\n\n// Construct a gap array for the given underlying storage storage\nGapArray* createGapArray(int storage)\n{\n    switch(storage)\n    {\n        case 1:\n            return new SparseGapArray1;\n        case 4:\n            return new SparseGapArray4;\n        case 8:\n            return new SparseGapArray8;\n        case 16:\n            return new SparseGapArray16;\n        case 32:\n            return new SparseGapArray32;\n        default:\n        {\n            std::cerr << \"Invalid gap array storage parameter: \" << storage << \"\\n\";\n            exit(1);\n        }\n    }\n}\n\n// Increment the gap array for each suffix of seq. Not thread safe.\nvoid updateGapArray(const DNAString& w, const BWT* pBWTInternal, GapArray* pGapArray)\n{\n    (void)w;\n    (void)pBWTInternal;\n    (void)pGapArray;\n\n    assert(false);\n\n#if 0\n    size_t l = w.length();\n    int i = l - 1;\n\n    // Compute the rank of the last character of seq. We consider $ to be implicitly\n    // terminated by a $ character. The first rank calculated is for this and it is given\n    // by the C(a) array in BWTInternal\n    int64_t rank = pBWTInternal->getPC('$'); // always zero\n    pGapArray->incrementSerial(rank);\n\n    // Compute the starting rank for the last symbol of w\n    char c = w.get(i);\n    rank = pBWTInternal->getPC(c);\n    pGapArray->incrementSerial(rank);\n    --i;\n\n    // Iteratively compute the remaining ranks\n    while(i >= 0)\n    {\n        char c = w.get(i);\n        rank = pBWTInternal->getPC(c) + pBWTInternal->getOcc(c, rank - 1);\n        pGapArray->incrementSerial(rank);\n        --i;\n    }\n#endif\n}\n\n//\nvoid analyzeGapArray(GapArray* pGapArray)\n{\n    size_t thresh_8 = 255;\n    size_t thresh_16 = 65535;\n    size_t count_8 = 0;\n    size_t count_16 = 0;\n    size_t count_0 = 0;\n    size_t count_1 = 0;\n    size_t count_2 = 0;\n    size_t count_4 = 0;\n\n    for(size_t i = 0; i < pGapArray->size(); ++i)\n    {\n        size_t c = pGapArray->get(i);\n        printf(\"GA\\t%zu\\t%zu\\n\", i, c);\n        if(c >= thresh_8)\n            ++count_8;\n        if(c >= thresh_16)\n            ++count_16;\n        if(c == 0)\n            ++count_0;\n        if(c == 1)\n            ++count_1;\n        if(c == 2)\n            ++count_2;\n        if(c >= 16)\n            ++count_4;\n    }\n\n    printf(\"Num >= %zu: %zu\\n\", thresh_8, count_8);\n    printf(\"Num >= %zu: %zu\\n\", thresh_16, count_16);\n    printf(\"Num >= 16: %zu\\n\", count_4);\n    printf(\"Num == 0: %zu\\n\", count_0);\n    printf(\"Num == 1: %zu\\n\", count_1);\n    printf(\"Num == 2: %zu\\n\", count_2);\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/GapArray.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// GapArray - Data structure and functions used to count \n// the number of times a suffix of a given rank occurs in a data set\n//\n#ifndef GAPARRAY_H\n#define GAPARRAY_H\n\n#include <vector>\n#include \"BWT.h\"\n#include \"DNAString.h\"\n\n// Abstract class for GapArrays\nclass GapArray\n{\n    public:\n        GapArray() {}\n        virtual ~GapArray() {}\n        virtual void resize(size_t n) = 0;\n\n        // Attempt to increment the value in the gap array\n        // Call can fail in which case the updates must be serialized\n        // through the call to incrementOverflowSerial\n        virtual bool attemptBaseIncrement(size_t i) = 0;\n\n        // Update the overflow array of the gap array. This call\n        // is not threadsafe.\n        virtual void incrementOverflowSerial(size_t i) = 0;\n\n        virtual size_t get(size_t i) const = 0;\n        virtual size_t size() const = 0;\n\n};\n\n#if 0\n// The simplest representation of a gap array is a vector\n// of integers. This has a deterministic size\n// and O(1) increment/get but in most cases will\n// use (much) more storage than the SparseGapArray since most gap\n// counts will be very low (<< INT_MAX). See also SparseGapArray.h\nclass SimpleGapArray : public GapArray\n{\n    public:\n        SimpleGapArray();\n        void resize(size_t n);\n        void increment(size_t i);\n        size_t get(size_t i) const;\n        size_t size() const;\n\n    private:\n        typedef uint32_t GAP_TYPE;\n        typedef std::vector<GAP_TYPE> GapStorage;\n        GapStorage m_data; \n};\n#endif\n\n//typedef uint32_t GAP_TYPE;\n//typedef std::vector<GAP_TYPE> GapArray;\nGapArray* createGapArray(int storage);\nvoid updateGapArray(const DNAString& w, const BWT* pBWTInternal, GapArray* pGapArray);\nvoid analyzeGapArray(GapArray* pGapArray);\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/HitData.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// HitData - Data structure holding all positions of\n// alignment hits of a read\n//\n#ifndef HITDATA_H\n#define HITDATA_H\n#include \"STCommon.h\"\n#include \"BitChar.h\"\n#include <iostream>\n\n// Deprecated \nstruct Hit\n{\n    Hit() {}\n    Hit(size_t ri, size_t si, uint32_t qs, uint32_t l, bool tr, bool qr, int nd) : readIdx(ri), saIdx(si), qstart(qs), \n                                                                             len(l), targetRev(tr), queryRev(qr), numDiff(nd) {}\n\n    size_t readIdx; // The index in the read table\n    size_t saIdx; // The index into the suffix array\n\n    uint32_t qstart; // The query start position\n    uint32_t len; // The overlap length\n    bool targetRev; // Whether the target was reversed\n    bool queryRev; // Whether the query was reversed\n    int numDiff; // the number of differences in the match\n\n    void setRev(bool tr, bool qr)\n    {\n        targetRev = tr;\n        queryRev = qr;\n    }\n\n    // Sort hits by saIdx and then by overlap length\n    friend bool operator<(const Hit& h1, const Hit& h2)\n    {\n        if(h1.saIdx != h2.saIdx)\n            return h1.saIdx < h2.saIdx;\n        else\n            return h1.len > h2.len;\n    }\n\n    friend std::ostream& operator<<(std::ostream& out, const Hit& hit)\n    {\n        out << hit.readIdx << \" \" << hit.saIdx << \" \" << hit.qstart << \" \" << hit.len << \" \" << hit.targetRev << \" \" << hit.queryRev << \" \" << hit.numDiff;\n        return out;\n    }\n\n    friend std::istream& operator>>(std::istream& in, Hit& hit)\n    {\n        in >> hit.readIdx >> hit.saIdx >> hit.qstart >> hit.len >> hit.targetRev >> hit.queryRev >> hit.numDiff;\n        return in;\n    }\n\n};\n\ntypedef std::vector<Hit> HitVector;\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/InverseSuffixArray.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// InverseSuffixArray - The inverse of a generalized suffix array\n// Implemented as a Vector of Vectors\n//\n#include \"InverseSuffixArray.h\"\n\n// Constructor which knows the number of strings that will be in the ISA\nInverseSuffixArray::InverseSuffixArray(const SuffixArray& sa)\n{\n    // Make a temporary vector to count the number of ranks for each string\n    RankCountMap rcm;\n\n    // Fill in the max ranks\n    size_t n_sa = sa.getSize();\n\n    for(size_t i = 0; i < n_sa; ++i)\n    {\n        size_t id = sa.get(i).getID();\n        rcm[id]++;\n    }\n\n    for(RankCountMap::iterator iter = rcm.begin(); iter != rcm.end(); ++iter)\n    {\n        m_data[iter->first].resize(iter->second);\n    }\n\n    // Fill in the data\n    for(size_t i = 0; i < n_sa; ++i)\n    {\n        size_t id = sa.get(i).getID();\n        size_t pos = sa.get(i).getPos();\n        m_data[id][pos] = i;\n    }\n}\n\n// get the rank\nuint64_t InverseSuffixArray::getRank(size_t id, size_t pos) const\n{\n    return m_data.find(id)->second[pos];\n    //return m_data[id][pos];\n}\n\n// validate\nvoid InverseSuffixArray::validate() const\n{\n    RankVector allRanks;\n    for(RankVectorMap::const_iterator iter = m_data.begin(); iter != m_data.end(); ++iter)\n    {        \n        const RankVector& rv = iter->second;\n        for(size_t j = 0; j < rv.size(); ++j)\n        {\n            allRanks.push_back(rv[j]);\n        }\n    }\n\n    std::sort(allRanks.begin(), allRanks.end());\n    for(size_t i = 0; i < allRanks.size(); ++i)\n    {\n        assert(i == allRanks[i]);\n    }\n}\n\n// Print the ISA\nvoid InverseSuffixArray::print() const\n{\n    for(RankVectorMap::const_iterator iter = m_data.begin(); iter != m_data.end(); ++iter)\n    {        \n        const RankVector& rv = iter->second;\n        for(size_t j = 0; j < rv.size(); ++j)\n        {\n            printf(\"ISA(%zu, %zu): %zu\\n\", (size_t)iter->first, j, (size_t)getRank(iter->first, j));\n        }\n    }\n}\n\n"
  },
  {
    "path": "src/SGA/SuffixTools/InverseSuffixArray.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// InverseSuffixArray - The inverse of a generalized suffix array\n// Implemented as a Vector of Vectors\n//\n#ifndef INVERSESUFFIXARRAY_H\n#define INVERSESUFFIXARRAY_H\n#include \"STCommon.h\"\n#include \"SuffixArray.h\"\n\ntypedef std::vector<uint64_t> RankVector;\ntypedef std::map<uint64_t, uint32_t> RankCountMap;\ntypedef std::map<uint64_t, RankVector> RankVectorMap;\n\nclass InverseSuffixArray\n{\n    public:\n        \n        InverseSuffixArray(const SuffixArray& sa);\n        \n        //\n        uint64_t getRank(size_t id, size_t pos) const;\n        void validate() const;\n        void print() const;\n\n    private:\n        RankVectorMap m_data;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/Makefile.am",
    "content": "noinst_LIBRARIES = libsuffixtools.a\n\nlibsuffixtools_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/SeqLib\n\nlibsuffixtools_a_SOURCES = STCommon.cpp STCommon.h \\\n                           STGlobals.h \\\n                           Occurrence.cpp Occurrence.h \\\n                           SuffixArray.cpp SuffixArray.h \\\n                           SuffixCompare.cpp SuffixCompare.h \\\n                           InverseSuffixArray.cpp InverseSuffixArray.h \\\n                           SACAInducedCopying.h SACAInducedCopying.cpp \\\n                           BWTAlgorithms.h BWTAlgorithms.cpp \\\n##\t\t\t\t\t\t   BWTDiskConstruction.h BWTDiskConstruction.cpp \\\n\t\t\t\t\t\t   BWTReader.h BWTReader.cpp \\\n\t\t\t\t\t\t   BWTWriter.h BWTWriter.cpp \\\n\t\t\t\t\t\t   SAReader.h SAReader.cpp \\\n\t\t\t\t\t\t   SAWriter.h SAWriter.cpp \\\n##\t\t\t\t\t\t   GapArray.h GapArray.cpp \\\n##\t\t\t\t\t\t   RankProcess.h RankProcess.cpp \\\n                           SBWT.h SBWT.cpp \\\n                           RLBWT.h RLBWT.cpp \\\n                           BWTReader.h BWTReader.cpp \\\n                           BWTWriter.h BWTWriter.cpp \\\n                           BWTWriterBinary.h BWTWriterBinary.cpp \\\n                           BWTReaderBinary.h BWTReaderBinary.cpp \\\n                           BWTWriterAscii.h BWTWriterAscii.cpp \\\n                           BWTReaderAscii.h BWTReaderAscii.cpp \\\n                           BWTIntervalCache.h BWTIntervalCache.cpp \\\n ##                          QuickBWT.h QuickBWT.cpp \\\n                           SampledSuffixArray.h SampledSuffixArray.cpp \\\n##                           BWTCABauerCoxRosone.h BWTCABauerCoxRosone.cpp \\\n##                           BWTCARopebwt.h BWTCARopebwt.cpp \\\n##                           PopulationIndex.h PopulationIndex.cpp \\\n                           BWT.h \\\n                           BWTInterval.h \\\n                           BWTIndexSet.h \\\n                           HitData.h \\\n                           SparseGapArray.h \\\n\t\t\t\t\t\t   FMMarkers.h \\\n\t\t\t\t\t\t   RLUnit.h\n"
  },
  {
    "path": "src/SGA/SuffixTools/Makefile.in",
    "content": "# Makefile.in generated by automake 1.16.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2018 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nsubdir = src/SGA/SuffixTools\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLIBRARIES = $(noinst_LIBRARIES)\nAR = ar\nARFLAGS = cru\nAM_V_AR = $(am__v_AR_@AM_V@)\nam__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)\nam__v_AR_0 = @echo \"  AR      \" $@;\nam__v_AR_1 = \nlibsuffixtools_a_AR = $(AR) $(ARFLAGS)\nlibsuffixtools_a_LIBADD =\nam_libsuffixtools_a_OBJECTS = libsuffixtools_a-STCommon.$(OBJEXT) \\\n\tlibsuffixtools_a-Occurrence.$(OBJEXT) \\\n\tlibsuffixtools_a-SuffixArray.$(OBJEXT) \\\n\tlibsuffixtools_a-SuffixCompare.$(OBJEXT) \\\n\tlibsuffixtools_a-InverseSuffixArray.$(OBJEXT) \\\n\tlibsuffixtools_a-SACAInducedCopying.$(OBJEXT) \\\n\tlibsuffixtools_a-BWTAlgorithms.$(OBJEXT) \\\n\tlibsuffixtools_a-BWTReader.$(OBJEXT) \\\n\tlibsuffixtools_a-BWTWriter.$(OBJEXT) \\\n\tlibsuffixtools_a-SAReader.$(OBJEXT) \\\n\tlibsuffixtools_a-SAWriter.$(OBJEXT) \\\n\tlibsuffixtools_a-SBWT.$(OBJEXT) \\\n\tlibsuffixtools_a-RLBWT.$(OBJEXT) \\\n\tlibsuffixtools_a-BWTReader.$(OBJEXT) \\\n\tlibsuffixtools_a-BWTWriter.$(OBJEXT) \\\n\tlibsuffixtools_a-BWTWriterBinary.$(OBJEXT) \\\n\tlibsuffixtools_a-BWTReaderBinary.$(OBJEXT) \\\n\tlibsuffixtools_a-BWTWriterAscii.$(OBJEXT) \\\n\tlibsuffixtools_a-BWTReaderAscii.$(OBJEXT) \\\n\tlibsuffixtools_a-BWTIntervalCache.$(OBJEXT) \\\n\tlibsuffixtools_a-SampledSuffixArray.$(OBJEXT)\nlibsuffixtools_a_OBJECTS = $(am_libsuffixtools_a_OBJECTS)\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__maybe_remake_depfiles = depfiles\nam__depfiles_remade = ./$(DEPDIR)/libsuffixtools_a-BWTAlgorithms.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-BWTIntervalCache.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-BWTReader.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-BWTReaderAscii.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-BWTReaderBinary.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-BWTWriter.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-BWTWriterAscii.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-BWTWriterBinary.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-InverseSuffixArray.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-Occurrence.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-RLBWT.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-SACAInducedCopying.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-SAReader.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-SAWriter.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-SBWT.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-STCommon.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-SampledSuffixArray.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-SuffixArray.Po \\\n\t./$(DEPDIR)/libsuffixtools_a-SuffixCompare.Po\nam__mv = mv -f\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nAM_V_CXX = $(am__v_CXX_@AM_V@)\nam__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)\nam__v_CXX_0 = @echo \"  CXX     \" $@;\nam__v_CXX_1 = \nCXXLD = $(CXX)\nCXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \\\n\t-o $@\nAM_V_CXXLD = $(am__v_CXXLD_@AM_V@)\nam__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)\nam__v_CXXLD_0 = @echo \"  CXXLD   \" $@;\nam__v_CXXLD_1 = \nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libsuffixtools_a_SOURCES)\nDIST_SOURCES = $(libsuffixtools_a_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_CXXFLAGS = @AM_CXXFLAGS@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nOBJEXT = @OBJEXT@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild_alias = @build_alias@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost_alias = @host_alias@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nnoinst_LIBRARIES = libsuffixtools.a\nlibsuffixtools_a_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/SeqLib\n\nlibsuffixtools_a_SOURCES = STCommon.cpp STCommon.h \\\n                           STGlobals.h \\\n                           Occurrence.cpp Occurrence.h \\\n                           SuffixArray.cpp SuffixArray.h \\\n                           SuffixCompare.cpp SuffixCompare.h \\\n                           InverseSuffixArray.cpp InverseSuffixArray.h \\\n                           SACAInducedCopying.h SACAInducedCopying.cpp \\\n                           BWTAlgorithms.h BWTAlgorithms.cpp \\\n\t\t\t\t\t\t   BWTReader.h BWTReader.cpp \\\n\t\t\t\t\t\t   BWTWriter.h BWTWriter.cpp \\\n\t\t\t\t\t\t   SAReader.h SAReader.cpp \\\n\t\t\t\t\t\t   SAWriter.h SAWriter.cpp \\\n                           SBWT.h SBWT.cpp \\\n                           RLBWT.h RLBWT.cpp \\\n                           BWTReader.h BWTReader.cpp \\\n                           BWTWriter.h BWTWriter.cpp \\\n                           BWTWriterBinary.h BWTWriterBinary.cpp \\\n                           BWTReaderBinary.h BWTReaderBinary.cpp \\\n                           BWTWriterAscii.h BWTWriterAscii.cpp \\\n                           BWTReaderAscii.h BWTReaderAscii.cpp \\\n                           BWTIntervalCache.h BWTIntervalCache.cpp \\\n                           SampledSuffixArray.h SampledSuffixArray.cpp \\\n                           BWT.h \\\n                           BWTInterval.h \\\n                           BWTIndexSet.h \\\n                           HitData.h \\\n                           SparseGapArray.h \\\n\t\t\t\t\t\t   FMMarkers.h \\\n\t\t\t\t\t\t   RLUnit.h\n\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .cpp .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/SGA/SuffixTools/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/SGA/SuffixTools/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLIBRARIES:\n\t-test -z \"$(noinst_LIBRARIES)\" || rm -f $(noinst_LIBRARIES)\n\nlibsuffixtools.a: $(libsuffixtools_a_OBJECTS) $(libsuffixtools_a_DEPENDENCIES) $(EXTRA_libsuffixtools_a_DEPENDENCIES) \n\t$(AM_V_at)-rm -f libsuffixtools.a\n\t$(AM_V_AR)$(libsuffixtools_a_AR) libsuffixtools.a $(libsuffixtools_a_OBJECTS) $(libsuffixtools_a_LIBADD)\n\t$(AM_V_at)$(RANLIB) libsuffixtools.a\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-BWTAlgorithms.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-BWTIntervalCache.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-BWTReader.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-BWTReaderAscii.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-BWTReaderBinary.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-BWTWriter.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-BWTWriterAscii.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-BWTWriterBinary.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-InverseSuffixArray.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-Occurrence.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-RLBWT.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-SACAInducedCopying.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-SAReader.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-SAWriter.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-SBWT.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-STCommon.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-SampledSuffixArray.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-SuffixArray.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsuffixtools_a-SuffixCompare.Po@am__quote@ # am--include-marker\n\n$(am__depfiles_remade):\n\t@$(MKDIR_P) $(@D)\n\t@echo '# dummy' >$@-t && $(am__mv) $@-t $@\n\nam--depfiles: $(am__depfiles_remade)\n\n.cpp.o:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<\n\n.cpp.obj:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\nlibsuffixtools_a-STCommon.o: STCommon.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-STCommon.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-STCommon.Tpo -c -o libsuffixtools_a-STCommon.o `test -f 'STCommon.cpp' || echo '$(srcdir)/'`STCommon.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-STCommon.Tpo $(DEPDIR)/libsuffixtools_a-STCommon.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='STCommon.cpp' object='libsuffixtools_a-STCommon.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-STCommon.o `test -f 'STCommon.cpp' || echo '$(srcdir)/'`STCommon.cpp\n\nlibsuffixtools_a-STCommon.obj: STCommon.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-STCommon.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-STCommon.Tpo -c -o libsuffixtools_a-STCommon.obj `if test -f 'STCommon.cpp'; then $(CYGPATH_W) 'STCommon.cpp'; else $(CYGPATH_W) '$(srcdir)/STCommon.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-STCommon.Tpo $(DEPDIR)/libsuffixtools_a-STCommon.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='STCommon.cpp' object='libsuffixtools_a-STCommon.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-STCommon.obj `if test -f 'STCommon.cpp'; then $(CYGPATH_W) 'STCommon.cpp'; else $(CYGPATH_W) '$(srcdir)/STCommon.cpp'; fi`\n\nlibsuffixtools_a-Occurrence.o: Occurrence.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-Occurrence.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-Occurrence.Tpo -c -o libsuffixtools_a-Occurrence.o `test -f 'Occurrence.cpp' || echo '$(srcdir)/'`Occurrence.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-Occurrence.Tpo $(DEPDIR)/libsuffixtools_a-Occurrence.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Occurrence.cpp' object='libsuffixtools_a-Occurrence.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-Occurrence.o `test -f 'Occurrence.cpp' || echo '$(srcdir)/'`Occurrence.cpp\n\nlibsuffixtools_a-Occurrence.obj: Occurrence.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-Occurrence.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-Occurrence.Tpo -c -o libsuffixtools_a-Occurrence.obj `if test -f 'Occurrence.cpp'; then $(CYGPATH_W) 'Occurrence.cpp'; else $(CYGPATH_W) '$(srcdir)/Occurrence.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-Occurrence.Tpo $(DEPDIR)/libsuffixtools_a-Occurrence.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Occurrence.cpp' object='libsuffixtools_a-Occurrence.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-Occurrence.obj `if test -f 'Occurrence.cpp'; then $(CYGPATH_W) 'Occurrence.cpp'; else $(CYGPATH_W) '$(srcdir)/Occurrence.cpp'; fi`\n\nlibsuffixtools_a-SuffixArray.o: SuffixArray.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SuffixArray.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SuffixArray.Tpo -c -o libsuffixtools_a-SuffixArray.o `test -f 'SuffixArray.cpp' || echo '$(srcdir)/'`SuffixArray.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SuffixArray.Tpo $(DEPDIR)/libsuffixtools_a-SuffixArray.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SuffixArray.cpp' object='libsuffixtools_a-SuffixArray.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SuffixArray.o `test -f 'SuffixArray.cpp' || echo '$(srcdir)/'`SuffixArray.cpp\n\nlibsuffixtools_a-SuffixArray.obj: SuffixArray.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SuffixArray.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SuffixArray.Tpo -c -o libsuffixtools_a-SuffixArray.obj `if test -f 'SuffixArray.cpp'; then $(CYGPATH_W) 'SuffixArray.cpp'; else $(CYGPATH_W) '$(srcdir)/SuffixArray.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SuffixArray.Tpo $(DEPDIR)/libsuffixtools_a-SuffixArray.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SuffixArray.cpp' object='libsuffixtools_a-SuffixArray.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SuffixArray.obj `if test -f 'SuffixArray.cpp'; then $(CYGPATH_W) 'SuffixArray.cpp'; else $(CYGPATH_W) '$(srcdir)/SuffixArray.cpp'; fi`\n\nlibsuffixtools_a-SuffixCompare.o: SuffixCompare.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SuffixCompare.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SuffixCompare.Tpo -c -o libsuffixtools_a-SuffixCompare.o `test -f 'SuffixCompare.cpp' || echo '$(srcdir)/'`SuffixCompare.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SuffixCompare.Tpo $(DEPDIR)/libsuffixtools_a-SuffixCompare.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SuffixCompare.cpp' object='libsuffixtools_a-SuffixCompare.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SuffixCompare.o `test -f 'SuffixCompare.cpp' || echo '$(srcdir)/'`SuffixCompare.cpp\n\nlibsuffixtools_a-SuffixCompare.obj: SuffixCompare.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SuffixCompare.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SuffixCompare.Tpo -c -o libsuffixtools_a-SuffixCompare.obj `if test -f 'SuffixCompare.cpp'; then $(CYGPATH_W) 'SuffixCompare.cpp'; else $(CYGPATH_W) '$(srcdir)/SuffixCompare.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SuffixCompare.Tpo $(DEPDIR)/libsuffixtools_a-SuffixCompare.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SuffixCompare.cpp' object='libsuffixtools_a-SuffixCompare.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SuffixCompare.obj `if test -f 'SuffixCompare.cpp'; then $(CYGPATH_W) 'SuffixCompare.cpp'; else $(CYGPATH_W) '$(srcdir)/SuffixCompare.cpp'; fi`\n\nlibsuffixtools_a-InverseSuffixArray.o: InverseSuffixArray.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-InverseSuffixArray.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-InverseSuffixArray.Tpo -c -o libsuffixtools_a-InverseSuffixArray.o `test -f 'InverseSuffixArray.cpp' || echo '$(srcdir)/'`InverseSuffixArray.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-InverseSuffixArray.Tpo $(DEPDIR)/libsuffixtools_a-InverseSuffixArray.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='InverseSuffixArray.cpp' object='libsuffixtools_a-InverseSuffixArray.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-InverseSuffixArray.o `test -f 'InverseSuffixArray.cpp' || echo '$(srcdir)/'`InverseSuffixArray.cpp\n\nlibsuffixtools_a-InverseSuffixArray.obj: InverseSuffixArray.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-InverseSuffixArray.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-InverseSuffixArray.Tpo -c -o libsuffixtools_a-InverseSuffixArray.obj `if test -f 'InverseSuffixArray.cpp'; then $(CYGPATH_W) 'InverseSuffixArray.cpp'; else $(CYGPATH_W) '$(srcdir)/InverseSuffixArray.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-InverseSuffixArray.Tpo $(DEPDIR)/libsuffixtools_a-InverseSuffixArray.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='InverseSuffixArray.cpp' object='libsuffixtools_a-InverseSuffixArray.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-InverseSuffixArray.obj `if test -f 'InverseSuffixArray.cpp'; then $(CYGPATH_W) 'InverseSuffixArray.cpp'; else $(CYGPATH_W) '$(srcdir)/InverseSuffixArray.cpp'; fi`\n\nlibsuffixtools_a-SACAInducedCopying.o: SACAInducedCopying.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SACAInducedCopying.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SACAInducedCopying.Tpo -c -o libsuffixtools_a-SACAInducedCopying.o `test -f 'SACAInducedCopying.cpp' || echo '$(srcdir)/'`SACAInducedCopying.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SACAInducedCopying.Tpo $(DEPDIR)/libsuffixtools_a-SACAInducedCopying.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SACAInducedCopying.cpp' object='libsuffixtools_a-SACAInducedCopying.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SACAInducedCopying.o `test -f 'SACAInducedCopying.cpp' || echo '$(srcdir)/'`SACAInducedCopying.cpp\n\nlibsuffixtools_a-SACAInducedCopying.obj: SACAInducedCopying.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SACAInducedCopying.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SACAInducedCopying.Tpo -c -o libsuffixtools_a-SACAInducedCopying.obj `if test -f 'SACAInducedCopying.cpp'; then $(CYGPATH_W) 'SACAInducedCopying.cpp'; else $(CYGPATH_W) '$(srcdir)/SACAInducedCopying.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SACAInducedCopying.Tpo $(DEPDIR)/libsuffixtools_a-SACAInducedCopying.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SACAInducedCopying.cpp' object='libsuffixtools_a-SACAInducedCopying.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SACAInducedCopying.obj `if test -f 'SACAInducedCopying.cpp'; then $(CYGPATH_W) 'SACAInducedCopying.cpp'; else $(CYGPATH_W) '$(srcdir)/SACAInducedCopying.cpp'; fi`\n\nlibsuffixtools_a-BWTAlgorithms.o: BWTAlgorithms.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTAlgorithms.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTAlgorithms.Tpo -c -o libsuffixtools_a-BWTAlgorithms.o `test -f 'BWTAlgorithms.cpp' || echo '$(srcdir)/'`BWTAlgorithms.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTAlgorithms.Tpo $(DEPDIR)/libsuffixtools_a-BWTAlgorithms.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTAlgorithms.cpp' object='libsuffixtools_a-BWTAlgorithms.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTAlgorithms.o `test -f 'BWTAlgorithms.cpp' || echo '$(srcdir)/'`BWTAlgorithms.cpp\n\nlibsuffixtools_a-BWTAlgorithms.obj: BWTAlgorithms.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTAlgorithms.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTAlgorithms.Tpo -c -o libsuffixtools_a-BWTAlgorithms.obj `if test -f 'BWTAlgorithms.cpp'; then $(CYGPATH_W) 'BWTAlgorithms.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTAlgorithms.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTAlgorithms.Tpo $(DEPDIR)/libsuffixtools_a-BWTAlgorithms.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTAlgorithms.cpp' object='libsuffixtools_a-BWTAlgorithms.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTAlgorithms.obj `if test -f 'BWTAlgorithms.cpp'; then $(CYGPATH_W) 'BWTAlgorithms.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTAlgorithms.cpp'; fi`\n\nlibsuffixtools_a-BWTReader.o: BWTReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTReader.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTReader.Tpo -c -o libsuffixtools_a-BWTReader.o `test -f 'BWTReader.cpp' || echo '$(srcdir)/'`BWTReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTReader.Tpo $(DEPDIR)/libsuffixtools_a-BWTReader.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTReader.cpp' object='libsuffixtools_a-BWTReader.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTReader.o `test -f 'BWTReader.cpp' || echo '$(srcdir)/'`BWTReader.cpp\n\nlibsuffixtools_a-BWTReader.obj: BWTReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTReader.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTReader.Tpo -c -o libsuffixtools_a-BWTReader.obj `if test -f 'BWTReader.cpp'; then $(CYGPATH_W) 'BWTReader.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTReader.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTReader.Tpo $(DEPDIR)/libsuffixtools_a-BWTReader.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTReader.cpp' object='libsuffixtools_a-BWTReader.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTReader.obj `if test -f 'BWTReader.cpp'; then $(CYGPATH_W) 'BWTReader.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTReader.cpp'; fi`\n\nlibsuffixtools_a-BWTWriter.o: BWTWriter.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTWriter.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTWriter.Tpo -c -o libsuffixtools_a-BWTWriter.o `test -f 'BWTWriter.cpp' || echo '$(srcdir)/'`BWTWriter.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTWriter.Tpo $(DEPDIR)/libsuffixtools_a-BWTWriter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTWriter.cpp' object='libsuffixtools_a-BWTWriter.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTWriter.o `test -f 'BWTWriter.cpp' || echo '$(srcdir)/'`BWTWriter.cpp\n\nlibsuffixtools_a-BWTWriter.obj: BWTWriter.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTWriter.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTWriter.Tpo -c -o libsuffixtools_a-BWTWriter.obj `if test -f 'BWTWriter.cpp'; then $(CYGPATH_W) 'BWTWriter.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTWriter.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTWriter.Tpo $(DEPDIR)/libsuffixtools_a-BWTWriter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTWriter.cpp' object='libsuffixtools_a-BWTWriter.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTWriter.obj `if test -f 'BWTWriter.cpp'; then $(CYGPATH_W) 'BWTWriter.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTWriter.cpp'; fi`\n\nlibsuffixtools_a-SAReader.o: SAReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SAReader.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SAReader.Tpo -c -o libsuffixtools_a-SAReader.o `test -f 'SAReader.cpp' || echo '$(srcdir)/'`SAReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SAReader.Tpo $(DEPDIR)/libsuffixtools_a-SAReader.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SAReader.cpp' object='libsuffixtools_a-SAReader.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SAReader.o `test -f 'SAReader.cpp' || echo '$(srcdir)/'`SAReader.cpp\n\nlibsuffixtools_a-SAReader.obj: SAReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SAReader.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SAReader.Tpo -c -o libsuffixtools_a-SAReader.obj `if test -f 'SAReader.cpp'; then $(CYGPATH_W) 'SAReader.cpp'; else $(CYGPATH_W) '$(srcdir)/SAReader.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SAReader.Tpo $(DEPDIR)/libsuffixtools_a-SAReader.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SAReader.cpp' object='libsuffixtools_a-SAReader.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SAReader.obj `if test -f 'SAReader.cpp'; then $(CYGPATH_W) 'SAReader.cpp'; else $(CYGPATH_W) '$(srcdir)/SAReader.cpp'; fi`\n\nlibsuffixtools_a-SAWriter.o: SAWriter.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SAWriter.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SAWriter.Tpo -c -o libsuffixtools_a-SAWriter.o `test -f 'SAWriter.cpp' || echo '$(srcdir)/'`SAWriter.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SAWriter.Tpo $(DEPDIR)/libsuffixtools_a-SAWriter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SAWriter.cpp' object='libsuffixtools_a-SAWriter.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SAWriter.o `test -f 'SAWriter.cpp' || echo '$(srcdir)/'`SAWriter.cpp\n\nlibsuffixtools_a-SAWriter.obj: SAWriter.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SAWriter.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SAWriter.Tpo -c -o libsuffixtools_a-SAWriter.obj `if test -f 'SAWriter.cpp'; then $(CYGPATH_W) 'SAWriter.cpp'; else $(CYGPATH_W) '$(srcdir)/SAWriter.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SAWriter.Tpo $(DEPDIR)/libsuffixtools_a-SAWriter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SAWriter.cpp' object='libsuffixtools_a-SAWriter.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SAWriter.obj `if test -f 'SAWriter.cpp'; then $(CYGPATH_W) 'SAWriter.cpp'; else $(CYGPATH_W) '$(srcdir)/SAWriter.cpp'; fi`\n\nlibsuffixtools_a-SBWT.o: SBWT.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SBWT.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SBWT.Tpo -c -o libsuffixtools_a-SBWT.o `test -f 'SBWT.cpp' || echo '$(srcdir)/'`SBWT.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SBWT.Tpo $(DEPDIR)/libsuffixtools_a-SBWT.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SBWT.cpp' object='libsuffixtools_a-SBWT.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SBWT.o `test -f 'SBWT.cpp' || echo '$(srcdir)/'`SBWT.cpp\n\nlibsuffixtools_a-SBWT.obj: SBWT.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SBWT.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SBWT.Tpo -c -o libsuffixtools_a-SBWT.obj `if test -f 'SBWT.cpp'; then $(CYGPATH_W) 'SBWT.cpp'; else $(CYGPATH_W) '$(srcdir)/SBWT.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SBWT.Tpo $(DEPDIR)/libsuffixtools_a-SBWT.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SBWT.cpp' object='libsuffixtools_a-SBWT.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SBWT.obj `if test -f 'SBWT.cpp'; then $(CYGPATH_W) 'SBWT.cpp'; else $(CYGPATH_W) '$(srcdir)/SBWT.cpp'; fi`\n\nlibsuffixtools_a-RLBWT.o: RLBWT.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-RLBWT.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-RLBWT.Tpo -c -o libsuffixtools_a-RLBWT.o `test -f 'RLBWT.cpp' || echo '$(srcdir)/'`RLBWT.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-RLBWT.Tpo $(DEPDIR)/libsuffixtools_a-RLBWT.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='RLBWT.cpp' object='libsuffixtools_a-RLBWT.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-RLBWT.o `test -f 'RLBWT.cpp' || echo '$(srcdir)/'`RLBWT.cpp\n\nlibsuffixtools_a-RLBWT.obj: RLBWT.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-RLBWT.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-RLBWT.Tpo -c -o libsuffixtools_a-RLBWT.obj `if test -f 'RLBWT.cpp'; then $(CYGPATH_W) 'RLBWT.cpp'; else $(CYGPATH_W) '$(srcdir)/RLBWT.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-RLBWT.Tpo $(DEPDIR)/libsuffixtools_a-RLBWT.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='RLBWT.cpp' object='libsuffixtools_a-RLBWT.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-RLBWT.obj `if test -f 'RLBWT.cpp'; then $(CYGPATH_W) 'RLBWT.cpp'; else $(CYGPATH_W) '$(srcdir)/RLBWT.cpp'; fi`\n\nlibsuffixtools_a-BWTWriterBinary.o: BWTWriterBinary.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTWriterBinary.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTWriterBinary.Tpo -c -o libsuffixtools_a-BWTWriterBinary.o `test -f 'BWTWriterBinary.cpp' || echo '$(srcdir)/'`BWTWriterBinary.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTWriterBinary.Tpo $(DEPDIR)/libsuffixtools_a-BWTWriterBinary.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTWriterBinary.cpp' object='libsuffixtools_a-BWTWriterBinary.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTWriterBinary.o `test -f 'BWTWriterBinary.cpp' || echo '$(srcdir)/'`BWTWriterBinary.cpp\n\nlibsuffixtools_a-BWTWriterBinary.obj: BWTWriterBinary.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTWriterBinary.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTWriterBinary.Tpo -c -o libsuffixtools_a-BWTWriterBinary.obj `if test -f 'BWTWriterBinary.cpp'; then $(CYGPATH_W) 'BWTWriterBinary.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTWriterBinary.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTWriterBinary.Tpo $(DEPDIR)/libsuffixtools_a-BWTWriterBinary.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTWriterBinary.cpp' object='libsuffixtools_a-BWTWriterBinary.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTWriterBinary.obj `if test -f 'BWTWriterBinary.cpp'; then $(CYGPATH_W) 'BWTWriterBinary.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTWriterBinary.cpp'; fi`\n\nlibsuffixtools_a-BWTReaderBinary.o: BWTReaderBinary.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTReaderBinary.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTReaderBinary.Tpo -c -o libsuffixtools_a-BWTReaderBinary.o `test -f 'BWTReaderBinary.cpp' || echo '$(srcdir)/'`BWTReaderBinary.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTReaderBinary.Tpo $(DEPDIR)/libsuffixtools_a-BWTReaderBinary.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTReaderBinary.cpp' object='libsuffixtools_a-BWTReaderBinary.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTReaderBinary.o `test -f 'BWTReaderBinary.cpp' || echo '$(srcdir)/'`BWTReaderBinary.cpp\n\nlibsuffixtools_a-BWTReaderBinary.obj: BWTReaderBinary.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTReaderBinary.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTReaderBinary.Tpo -c -o libsuffixtools_a-BWTReaderBinary.obj `if test -f 'BWTReaderBinary.cpp'; then $(CYGPATH_W) 'BWTReaderBinary.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTReaderBinary.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTReaderBinary.Tpo $(DEPDIR)/libsuffixtools_a-BWTReaderBinary.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTReaderBinary.cpp' object='libsuffixtools_a-BWTReaderBinary.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTReaderBinary.obj `if test -f 'BWTReaderBinary.cpp'; then $(CYGPATH_W) 'BWTReaderBinary.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTReaderBinary.cpp'; fi`\n\nlibsuffixtools_a-BWTWriterAscii.o: BWTWriterAscii.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTWriterAscii.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTWriterAscii.Tpo -c -o libsuffixtools_a-BWTWriterAscii.o `test -f 'BWTWriterAscii.cpp' || echo '$(srcdir)/'`BWTWriterAscii.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTWriterAscii.Tpo $(DEPDIR)/libsuffixtools_a-BWTWriterAscii.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTWriterAscii.cpp' object='libsuffixtools_a-BWTWriterAscii.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTWriterAscii.o `test -f 'BWTWriterAscii.cpp' || echo '$(srcdir)/'`BWTWriterAscii.cpp\n\nlibsuffixtools_a-BWTWriterAscii.obj: BWTWriterAscii.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTWriterAscii.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTWriterAscii.Tpo -c -o libsuffixtools_a-BWTWriterAscii.obj `if test -f 'BWTWriterAscii.cpp'; then $(CYGPATH_W) 'BWTWriterAscii.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTWriterAscii.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTWriterAscii.Tpo $(DEPDIR)/libsuffixtools_a-BWTWriterAscii.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTWriterAscii.cpp' object='libsuffixtools_a-BWTWriterAscii.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTWriterAscii.obj `if test -f 'BWTWriterAscii.cpp'; then $(CYGPATH_W) 'BWTWriterAscii.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTWriterAscii.cpp'; fi`\n\nlibsuffixtools_a-BWTReaderAscii.o: BWTReaderAscii.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTReaderAscii.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTReaderAscii.Tpo -c -o libsuffixtools_a-BWTReaderAscii.o `test -f 'BWTReaderAscii.cpp' || echo '$(srcdir)/'`BWTReaderAscii.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTReaderAscii.Tpo $(DEPDIR)/libsuffixtools_a-BWTReaderAscii.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTReaderAscii.cpp' object='libsuffixtools_a-BWTReaderAscii.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTReaderAscii.o `test -f 'BWTReaderAscii.cpp' || echo '$(srcdir)/'`BWTReaderAscii.cpp\n\nlibsuffixtools_a-BWTReaderAscii.obj: BWTReaderAscii.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTReaderAscii.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTReaderAscii.Tpo -c -o libsuffixtools_a-BWTReaderAscii.obj `if test -f 'BWTReaderAscii.cpp'; then $(CYGPATH_W) 'BWTReaderAscii.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTReaderAscii.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTReaderAscii.Tpo $(DEPDIR)/libsuffixtools_a-BWTReaderAscii.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTReaderAscii.cpp' object='libsuffixtools_a-BWTReaderAscii.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTReaderAscii.obj `if test -f 'BWTReaderAscii.cpp'; then $(CYGPATH_W) 'BWTReaderAscii.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTReaderAscii.cpp'; fi`\n\nlibsuffixtools_a-BWTIntervalCache.o: BWTIntervalCache.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTIntervalCache.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTIntervalCache.Tpo -c -o libsuffixtools_a-BWTIntervalCache.o `test -f 'BWTIntervalCache.cpp' || echo '$(srcdir)/'`BWTIntervalCache.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTIntervalCache.Tpo $(DEPDIR)/libsuffixtools_a-BWTIntervalCache.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTIntervalCache.cpp' object='libsuffixtools_a-BWTIntervalCache.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTIntervalCache.o `test -f 'BWTIntervalCache.cpp' || echo '$(srcdir)/'`BWTIntervalCache.cpp\n\nlibsuffixtools_a-BWTIntervalCache.obj: BWTIntervalCache.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-BWTIntervalCache.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-BWTIntervalCache.Tpo -c -o libsuffixtools_a-BWTIntervalCache.obj `if test -f 'BWTIntervalCache.cpp'; then $(CYGPATH_W) 'BWTIntervalCache.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTIntervalCache.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-BWTIntervalCache.Tpo $(DEPDIR)/libsuffixtools_a-BWTIntervalCache.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BWTIntervalCache.cpp' object='libsuffixtools_a-BWTIntervalCache.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-BWTIntervalCache.obj `if test -f 'BWTIntervalCache.cpp'; then $(CYGPATH_W) 'BWTIntervalCache.cpp'; else $(CYGPATH_W) '$(srcdir)/BWTIntervalCache.cpp'; fi`\n\nlibsuffixtools_a-SampledSuffixArray.o: SampledSuffixArray.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SampledSuffixArray.o -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SampledSuffixArray.Tpo -c -o libsuffixtools_a-SampledSuffixArray.o `test -f 'SampledSuffixArray.cpp' || echo '$(srcdir)/'`SampledSuffixArray.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SampledSuffixArray.Tpo $(DEPDIR)/libsuffixtools_a-SampledSuffixArray.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SampledSuffixArray.cpp' object='libsuffixtools_a-SampledSuffixArray.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SampledSuffixArray.o `test -f 'SampledSuffixArray.cpp' || echo '$(srcdir)/'`SampledSuffixArray.cpp\n\nlibsuffixtools_a-SampledSuffixArray.obj: SampledSuffixArray.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsuffixtools_a-SampledSuffixArray.obj -MD -MP -MF $(DEPDIR)/libsuffixtools_a-SampledSuffixArray.Tpo -c -o libsuffixtools_a-SampledSuffixArray.obj `if test -f 'SampledSuffixArray.cpp'; then $(CYGPATH_W) 'SampledSuffixArray.cpp'; else $(CYGPATH_W) '$(srcdir)/SampledSuffixArray.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libsuffixtools_a-SampledSuffixArray.Tpo $(DEPDIR)/libsuffixtools_a-SampledSuffixArray.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SampledSuffixArray.cpp' object='libsuffixtools_a-SampledSuffixArray.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsuffixtools_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsuffixtools_a-SampledSuffixArray.obj `if test -f 'SampledSuffixArray.cpp'; then $(CYGPATH_W) 'SampledSuffixArray.cpp'; else $(CYGPATH_W) '$(srcdir)/SampledSuffixArray.cpp'; fi`\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(BUILT_SOURCES)\n\t$(MAKE) $(AM_MAKEFLAGS) distdir-am\n\ndistdir-am: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LIBRARIES)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am\n\ndistclean: distclean-am\n\t\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTAlgorithms.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTIntervalCache.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTReader.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTReaderAscii.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTReaderBinary.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTWriter.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTWriterAscii.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTWriterBinary.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-InverseSuffixArray.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-Occurrence.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-RLBWT.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SACAInducedCopying.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SAReader.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SAWriter.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SBWT.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-STCommon.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SampledSuffixArray.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SuffixArray.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SuffixCompare.Po\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTAlgorithms.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTIntervalCache.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTReader.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTReaderAscii.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTReaderBinary.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTWriter.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTWriterAscii.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-BWTWriterBinary.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-InverseSuffixArray.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-Occurrence.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-RLBWT.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SACAInducedCopying.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SAReader.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SAWriter.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SBWT.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-STCommon.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SampledSuffixArray.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SuffixArray.Po\n\t-rm -f ./$(DEPDIR)/libsuffixtools_a-SuffixCompare.Po\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \\\n\tclean-generic clean-noinstLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/SGA/SuffixTools/Occurrence.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Occurrence.cpp - Data structure holding the number of times\n// the letter b appears in the string S from S[0..i] (inclusive)\n//\n#include \"Occurrence.h\"\n#include \"SBWT.h\"\n\n// Initialize the counts from the bwt string b\nvoid Occurrence::initialize(const BWTString& bwStr, int sampleRate)\n{\n    m_sampleRate = sampleRate;\n    m_shift = calculateShiftValue(m_sampleRate);\n\n    size_t l = bwStr.length();\n    int num_samples = (l % m_sampleRate == 0) ? (l / m_sampleRate) : (l / m_sampleRate + 1);\n    m_values.resize(num_samples);\n    \n    AlphaCount64 sum;\n    for(size_t i = 0; i < l; ++i)\n    {\n        char currB = bwStr.get(i);\n        sum.increment(currB);\n        if(i % m_sampleRate == 0)\n            m_values[i / m_sampleRate] = sum;\n    }\n}\n\n// \nint Occurrence::calculateShiftValue(int divisor)\n{\n    assert(divisor > 0);\n    assert(IS_POWER_OF_2(divisor));\n\n    // m_sampleRate is a power of 2, count what bit is set\n    unsigned int v = divisor;\n    unsigned int c = 0; // c accumulates the total bits set in v\n\n    while(v != 1)\n    {\n        v >>= 1;\n        ++c;\n    }\n    assert(1 << c == divisor);\n    return c;\n}\n\n//\nvoid Occurrence::set(char a, size_t i, BaseCount s)\n{\n    m_values[i].set(a, s);\n}\n\n//\nsize_t Occurrence::getByteSize() const\n{\n    return m_values.size() * sizeof(AlphaCount64);\n}\n\n// Validate that the sampled occurrence array is correct\nvoid Occurrence::validate(const BWTString& bwStr) const\n{\n    size_t l = bwStr.length();\n    AlphaCount64 sum;\n    for(size_t i = 0; i < l; ++i)\n    {\n        char currB = bwStr.get(i);\n        sum.increment(currB);\n        AlphaCount64 calculated = get(bwStr, i);\n        for(int i = 0; i < ALPHABET_SIZE; ++i)\n            assert(calculated.get(ALPHABET[i]) == sum.get(ALPHABET[i]));\n    }\n}\n\nstd::ostream& operator<<(std::ostream& out, const Occurrence& o)\n{\n    out << o.m_sampleRate << \"\\n\";\n    out << o.m_values.size() << \"\\n\";\n    for(size_t i = 0; i < o.m_values.size(); ++i)\n        out << o.m_values[i] << \"\\n\";\n    return out;\n}\n\nstd::istream& operator>>(std::istream& in, Occurrence& o)\n{\n    in >> o.m_sampleRate;\n    size_t n;\n    in >> n;\n    o.m_values.resize(n);\n    for(size_t i = 0; i < n; ++i)\n        in >> o.m_values[i];\n    o.m_shift = Occurrence::calculateShiftValue(o.m_sampleRate);\n    return in;\n}\n\n\n//\nvoid Occurrence::print() const\n{\n    for(size_t i = 0; i < m_values.size(); i++)\n    {\n        std::cout << m_values[i];\n    }\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/Occurrence.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// Occurrence.h - Data structure holding the number of times\n// the letter b appears in the string S before position i\n//\n#ifndef OCCURRENCE_H\n#define OCCURRENCE_H\n#include \"STCommon.h\"\n#include \"EncodedString.h\"\n\n// Power of 2 macros\n\n// return true if x is a power of 2\n#define IS_POWER_OF_2(x) ((x) & ((x) - 1)) == 0\n\n// return the x % y given that y is a power of 2\n#define MOD_POWER_2(x, y) (x) & ((y) - 1)\nclass SBWT;\n\nclass Occurrence\n{\n    public:\n        \n        // Constructors\n        Occurrence() : m_sampleRate(1) {}\n\n        // Initialize the counts from the bwt string b\n        void initialize(const BWTString& bwStr, int sampleRate);\n\n        //\n        inline const AlphaCount64 get(const BWTString& bwStr, size_t idx) const\n        {\n            // Quick path\n            if((MOD_POWER_2(idx,m_sampleRate)) == 0)\n                return m_values[idx >> m_shift];\n\n            // Calculate the nearest sample to this index\n            size_t lower_idx = idx >> m_shift;\n            size_t upper_idx = lower_idx + 1;\n            size_t lower_start = lower_idx << m_shift;\n            size_t upper_start = upper_idx << m_shift;\n\n            AlphaCount64 sum;\n\n            // Choose the closest index or force the choice to lower_idx is the upper_idx is invalid\n            if((idx - lower_start < upper_start - idx) || upper_idx == m_values.size())\n            {\n                for(size_t j = lower_start + 1; j <= idx; ++j)\n                    sum.increment(bwStr.get(j));\n                return m_values[lower_idx] + sum;\n            }\n            else\n            {\n                for(size_t j = idx + 1; j <= upper_start; ++j)\n                    sum.increment(bwStr.get(j));\n                return m_values[upper_idx] - sum;\n            }\n        }\n\n        // Get the alphacount difference between idx1 and idx0\n        inline AlphaCount64 getDiff(const BWTString& bwStr, size_t idx0, size_t idx1) const\n        {\n            return get(bwStr, idx1) - get(bwStr, idx0);\n        }\n        \n        inline BaseCount get(const BWTString& bwStr, char a, size_t idx) const\n        {\n            // Quick path\n            if((MOD_POWER_2(idx,m_sampleRate)) == 0)\n                return m_values[idx >> m_shift].get(a);\n\n            // Calculate the nearest sample to this index\n            size_t lower_idx = idx >> m_shift;\n            size_t upper_idx = lower_idx + 1;\n            size_t lower_start = lower_idx << m_shift;\n            size_t upper_start = upper_idx << m_shift;\n            BaseCount sum = 0;\n        \n            // Choose the closest index or force the choice to lower_idx is the upper_idx is invalid\n            if((idx - lower_start < upper_start - idx) || upper_idx == m_values.size())\n            {\n                for(size_t j = lower_start + 1; j <= idx; ++j)\n                {\n                    if(bwStr.get(j) == a)\n                        ++sum;\n                }\n                return m_values[lower_idx].get(a) + sum;\n            }\n            else\n            {\n                for(size_t j = idx + 1; j <= upper_start; ++j)\n                {\n                    if(bwStr.get(j) == a)\n                        ++sum;\n                }\n                return m_values[upper_idx].get(a) - sum;\n            }\n            \n            //return get(bwStr, idx).get(a);\n        }\n\n        void set(char a, size_t i, BaseCount s);\n        void print() const;\n        size_t getByteSize() const;\n        size_t size() const { return m_values.size(); }\n        size_t getSampleRate() const { return m_sampleRate; }\n\n        // Calculate the amount a value should be shifted to perform a division\n        // by divisor. The divisor must be a power of 2\n        static int calculateShiftValue(int divisor);\n        void validate(const BWTString& bwStr) const;\n\n        friend std::ostream& operator<<(std::ostream& out, const Occurrence& o);\n        friend std::istream& operator>>(std::istream& in, Occurrence& o);\n\n    private:\n\n        int m_shift;\n        int m_sampleRate;\n        std::vector<AlphaCount64> m_values;\n};\n\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/PopulationIndex.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// PopulationIndex - A structure mapping a read\n// index to a member of a population\n//\n#include \"PopulationIndex.h\"\n#include \"Util.h\"\n#include <algorithm>\n\nPopulationIndex::PopulationIndex(const std::string& filename)\n{\n    std::istream* reader = createReader(filename);\n    std::string line;\n    while(getline(*reader, line))\n    {\n        PopulationMember member = str2member(line);\n        m_population.push_back(member);\n    }\n    delete reader;\n    reader = NULL;\n\n    // Make sure the index is properly formatted\n    assert(m_population.size() != 0);\n    assert(m_population[0].start == 0);\n    for(size_t i = 1; i < m_population.size(); ++i)\n    {\n        assert(m_population[i].start > m_population[i-1].start);\n        assert(m_population[i].start == m_population[i-1].end + 1);\n    }\n    \n    /* Test the index\n    size_t start = 0;\n    size_t end = m_population.back().end + 2;\n    for(size_t i = start; i <= end; ++i)\n    {\n        std::string name = getName(i);\n        printf(\"%zu = %s\\n\", i, name.c_str());\n    }\n    */\n}\n\n//\nstd::string PopulationIndex::getName(size_t read_index) const\n{\n    std::vector<PopulationMember>::const_iterator iter = getIterByReadIndex(read_index);\n    return iter->name;\n}\n\n//\nsize_t PopulationIndex::getSampleIndex(size_t read_index) const\n{\n    std::vector<PopulationMember>::const_iterator iter = getIterByReadIndex(read_index);\n    return iter - m_population.begin();\n}\n\n//\nstd::vector<PopulationMember>::const_iterator PopulationIndex::getIterByReadIndex(size_t read_index) const\n{\n    assert(read_index <= m_population.back().end);\n    // Perform a binary search to identify the first element of the population\n    // that is strictly greater than the index. This returns an iterator that is \n    // guarenteed to be one past the individual that index belongs to.\n    PopulationMember search = { read_index, read_index, \"\" };\n    std::vector<PopulationMember>::const_iterator iter = std::upper_bound(m_population.begin(), \n                                                                          m_population.end(), \n                                                                          search, \n                                                                          PopulationMember::compareByStart);\n    assert(iter != m_population.begin());\n    iter--;\n    assert(read_index >= iter->start && read_index <= iter->end);\n    return iter;\n}\n\n//\nStringVector PopulationIndex::getSamples() const\n{\n    StringVector out;\n    for(size_t i = 0; i < m_population.size(); ++i)\n        out.push_back(m_population[i].name);\n    return out;\n}\n\n//\nvoid PopulationIndex::mergeIndexFiles(const std::string& file1, const std::string& file2, const std::string& outfile)\n{\n    std::ostream* writer = createWriter(outfile);\n    \n    // Copy the first index to the output unmodified but track the number of elements read\n    size_t num_file_1 = 0;\n    std::istream* reader = createReader(file1);\n    std::string line;\n    while(getline(*reader, line))\n    {\n        // Copy\n        *writer << line << \"\\n\";\n        \n        // Parse\n        PopulationMember member = str2member(line);\n        num_file_1 += (member.end - member.start + 1);\n    }    \n    delete reader;\n\n    // Copy the second index, offsetting by the number of reads in file1\n    reader = createReader(file2);\n    while(getline(*reader, line))\n    {\n        PopulationMember member = str2member(line);\n        member.start += num_file_1;\n        member.end += num_file_1;\n\n        // Copy\n        *writer << member.start << \"\\t\" << member.end << \"\\t\" << member.name << \"\\n\";\n    } \n    delete reader;\n    delete writer;\n}\n\n//\nPopulationMember PopulationIndex::str2member(const std::string& line)\n{\n    std::stringstream parser(line);\n    PopulationMember member;\n    parser >> member.start;\n    parser >> member.end;\n    parser >> member.name;\n    return member;\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/PopulationIndex.h",
    "content": "//-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// PopulationIndex - A structure mapping a read\n// index to a member of a population\n//\n#ifndef POPULATION_INDEX_H\n#define POPULATION_INDEX_H\n\n#include <vector>\n#include <string>\n\ntypedef std::vector<std::string> StringVector;\n\nstruct PopulationMember\n{\n    size_t start;\n    size_t end;\n    std::string name;\n\n    //\n    static bool compareByStart(const PopulationMember& a,\n                               const PopulationMember& b)\n    {\n        return a.start < b.start;\n    }\n};\n\nclass PopulationIndex\n{\n    public:\n        PopulationIndex(const std::string& filename);\n\n        // Return the name of the individual for the read at index\n        std::string getName(size_t read_index) const;\n        \n        // Return the index of the sample containing the given read index\n        size_t getSampleIndex(size_t read_index) const;\n        \n        // Get the names of all samples in the collection\n        StringVector getSamples() const;\n        \n        // Returns the number of samples in the population\n        size_t getNumSamples() const { return m_population.size(); }\n\n        // Merge two population index files into a new one\n        static void mergeIndexFiles(const std::string& file1, const std::string& file2, const std::string& outfile);\n\n    private:\n        \n        // Returns an iterator pointing to the sample that the contains the given index\n        std::vector<PopulationMember>::const_iterator getIterByReadIndex(size_t index) const;\n\n        // Parse a string from a .popidx file into a population member\n        static PopulationMember str2member(const std::string& line);\n        \n        // Data\n        std::vector<PopulationMember> m_population;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/QuickBWT.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// QuickBWT - Construct a simple BWT for a short input string\n//\n#include \"QuickBWT.h\"\n\n// Construct a BWT for a small string.\n// Calling function is responsible for freeing the memory\nvoid createQuickBWT(const std::string& str, BWT*& pBWT, SuffixArray*& pSA)\n{\n    ReadTable rt;\n    SeqItem si = { \"a\", str };\n    rt.addRead(si);  \n\n    pSA = new SuffixArray(&rt, 1, true);\n    pBWT = new BWT(pSA, &rt);\n\n    /*\n    std::cout << \"QBWT -- str len: \" << str.length() << \"\\n\";\n    std::cout << \"QBWT -- bwt len: \" << pBWT->getBWLen() << \"\\n\";\n    pBWT->printInfo();\n    */\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/QuickBWT.h",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// QuickBWT - Construct a simple BWT for a short input string\n//\n#include \"BWT.h\"\n\n// Construct a BWT/suffix array of the given string\n// Calling code is responsible for freeing the BWT/SA\nvoid createQuickBWT(const std::string& str, BWT*& pBWT, SuffixArray*& pSA);\n"
  },
  {
    "path": "src/SGA/SuffixTools/RLBWT.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// RLBWT - Run-length encoded Burrows Wheeler transform\n//\n#include \"RLBWT.h\"\n#include \"Timer.h\"\n#include \"BWTReader.h\"\n#include \"BWTWriter.h\"\n#include \"BWTReader.h\"\n#include <istream>\n#include <queue>\n#include <inttypes.h>\n\n// macros\n#define OCC(c,i) m_occurrence.get(m_bwStr, (c), (i))\n#define PRED(c) m_predCount.get((c))\n\n// Parse a BWT from a file\nRLBWT::RLBWT(const std::string& filename, int sampleRate) : m_numStrings(0), \n                                                            m_numSymbols(0), \n                                                            m_largeSampleRate(DEFAULT_SAMPLE_RATE_LARGE),\n                                                            m_smallSampleRate(sampleRate)\n{\n    IBWTReader* pReader = BWTReader::createReader(filename);\n    pReader->read(this);\n    initializeFMIndex();\n    delete pReader;\n}\n\n// Construct the BWT from a suffix array\nRLBWT::RLBWT(const SuffixArray* pSA, const ReadTable* pRT)\n{\n\n      // Set up BWT state\n    size_t n = pSA->getSize();\n    m_smallSampleRate = DEFAULT_SAMPLE_RATE_SMALL;\n    m_largeSampleRate = DEFAULT_SAMPLE_RATE_LARGE;\n    m_numStrings = pSA->getNumStrings();\n    m_numSymbols = n;\n\n    RLUnit currRun;\n    // Set up the bwt string and suffix array from the cycled strings\n    for(size_t i = 0; i < n; ++i)\n    {\n\n        SAElem saElem = pSA->get(i);\n        const SeqItem& si = pRT->getRead(saElem.getID());\n\n        // Get the position of the start of the suffix\n        uint64_t f_pos = saElem.getPos();\n        uint64_t l_pos = (f_pos == 0) ? si.seq.length() : f_pos - 1;\n        char b = (l_pos == si.seq.length()) ? '$' : si.seq.get(l_pos);\n\n        // Add to the current run or append in the new char\n        if(currRun.isInitialized())\n        {\n            if(currRun.getChar() == b && !currRun.isFull())\n            {\n                currRun.incrementCount();\n            }\n            else\n            {\n                // Write out the old run and start a new one\n                assert(currRun.isInitialized());\n                m_rlString.push_back(currRun);\n                currRun = RLUnit(b);\n            }        \n        }\n        else\n        {\n            // Start a new run\n            currRun = RLUnit(b);\n        }\n    }\n    assert(currRun.isInitialized());\n    if(currRun.isInitialized())\n        m_rlString.push_back(currRun);\n\n    initializeFMIndex();\n}\n\n//\nvoid RLBWT::append(char b)\n{\n    bool increment = false;\n    if(!m_rlString.empty())\n    {\n        RLUnit& lastUnit = m_rlString.back();\n        if(lastUnit.getChar() == b && !lastUnit.isFull())\n        {\n            lastUnit.incrementCount();\n            increment = true;\n        }\n    }\n\n    if(!increment)\n    {\n        // Must add a new unit to the string\n        RLUnit unit(b);\n        m_rlString.push_back(unit);\n    }\n    ++m_numSymbols;\n}\n\n// Fill in the FM-index data structures\nvoid RLBWT::initializeFMIndex()\n{\n    m_smallShiftValue = Occurrence::calculateShiftValue(m_smallSampleRate);\n    m_largeShiftValue = Occurrence::calculateShiftValue(m_largeSampleRate);\n\n    // initialize the marker vectors,\n    // LargeMarkers are placed every 2048 bases (by default) containing the absolute count\n    // of symbols seen up to that point. SmallMarkers are placed every 128 bases with the\n    // count over the last 128 symbols. From these relative counts the absolute count\n    // every 128 symbols can be interpolated.\n    size_t num_large_markers = getNumRequiredMarkers(m_numSymbols, m_largeSampleRate);\n    size_t num_small_markers = getNumRequiredMarkers(m_numSymbols, m_smallSampleRate);\n    m_largeMarkers.resize(num_large_markers);\n    m_smallMarkers.resize(num_small_markers);\n\n    // Fill in the marker values\n    // We wish to place markers every sampleRate symbols however since a run may\n    // not end exactly on sampleRate boundaries, we place the markers AFTER\n    // the run crossing the boundary ends\n\n    // Place a blank markers at the start of the data\n    m_largeMarkers[0].unitIndex = 0;\n    m_smallMarkers[0].unitCount = 0;\n\n    // State variables for the number of markers placed,\n    // the next marker to place, etc\n    size_t curr_large_marker_index = 1;\n    size_t curr_small_marker_index = 1;\n\n    size_t next_small_marker = m_smallSampleRate;\n    size_t next_large_marker = m_largeSampleRate;\n\n    size_t prev_small_marker_unit_index = 0;\n    size_t running_total = 0;\n    AlphaCount64 running_ac;\n\n    for(size_t i = 0; i < m_rlString.size(); ++i)\n    {\n        // Update the count and advance the running total\n        RLUnit& unit = m_rlString[i];\n\n        char symbol = unit.getChar();\n        uint8_t run_len = unit.getCount();\n        running_ac.add(symbol, run_len);\n        running_total += run_len;\n\n        size_t curr_unit_index = i + 1;\n        bool last_symbol = i == m_rlString.size() - 1;\n\n        // Check whether to place a new large marker\n        bool place_last_large_marker = last_symbol && curr_large_marker_index < num_large_markers;\n        while(running_total >= next_large_marker || place_last_large_marker)\n        {\n            size_t expected_marker_pos = curr_large_marker_index * m_largeSampleRate;\n\n            // Sanity checks\n            // The marker position should always be less than the running total unless \n            // the number of symbols is smaller than the sample rate\n            assert(expected_marker_pos <= running_total || place_last_large_marker);\n            assert((running_total - expected_marker_pos) <= RL_FULL_COUNT || place_last_large_marker);\n            assert(curr_large_marker_index < num_large_markers);\n            assert(running_ac.getSum() == running_total);\n\n            LargeMarker& marker = m_largeMarkers[curr_large_marker_index];\n            marker.unitIndex = i + 1;\n            marker.counts = running_ac;\n\n            next_large_marker += m_largeSampleRate;\n            curr_large_marker_index += 1;\n            place_last_large_marker = last_symbol && curr_large_marker_index < num_large_markers;\n        }    \n\n        // Check whether to place a new small marker\n        bool place_last_small_marker = last_symbol && curr_small_marker_index < num_small_markers;\n        while(running_total >= next_small_marker || place_last_small_marker)\n        {\n            // Place markers\n            size_t expected_marker_pos = curr_small_marker_index * m_smallSampleRate;\n\n            // Sanity checks\n            // The marker position should always be less than the running total unless \n            // the number of symbols is smaller than the sample rate\n            assert(expected_marker_pos <= running_total || place_last_small_marker);\n            assert((running_total - expected_marker_pos) <= RL_FULL_COUNT || place_last_small_marker);\n            assert(curr_small_marker_index < num_small_markers);\n            assert(running_ac.getSum() == running_total);\n    \n            // Calculate the number of rl units that are contained in this block\n            if(curr_unit_index - prev_small_marker_unit_index > std::numeric_limits<uint16_t>::max())\n            {\n                std::cerr << \"Error: Number of units in occurrence array block \" << curr_small_marker_index \n                          << \" exceeds the maximum value.\\n\";\n                exit(EXIT_FAILURE);\n\n            }\n\n            // Calculate the large marker to set the relative count from\n            // This is generally the most previously placed large block except it might \n            // be the second-previous in the case that we placed the last large marker.\n            size_t large_marker_index = expected_marker_pos >> m_largeShiftValue;\n            assert(large_marker_index < curr_large_marker_index); // ensure the last has ben placed\n            LargeMarker& prev_large_marker = m_largeMarkers[large_marker_index];\n\n            // Set the 8bit AlphaCounts as the sum since the last large (superblock) marker\n            AlphaCount16 smallAC;\n            for(size_t j = 0; j < ALPHABET_SIZE; ++j)\n            {\n                size_t v = running_ac.getByIdx(j) - prev_large_marker.counts.getByIdx(j);\n                if(v > smallAC.getMaxValue())\n                {\n                    std::cerr << \"Error: Number of symbols in occurrence array block \" << curr_small_marker_index \n                              << \" exceeds the maximum value (\" << v << \" > \" << smallAC.getMaxValue() << \")\\n\";\n                    exit(EXIT_FAILURE);\n                }\n                smallAC.setByIdx(j, v);\n            }\n            \n            // Set the small marker\n            SmallMarker& small_marker = m_smallMarkers[curr_small_marker_index];\n            small_marker.unitCount = curr_unit_index - prev_large_marker.unitIndex;\n            small_marker.counts = smallAC;\n\n            // Update state variables\n            next_small_marker += m_smallSampleRate;\n            curr_small_marker_index += 1;\n            prev_small_marker_unit_index = curr_unit_index;\n            place_last_small_marker = last_symbol && curr_small_marker_index < num_small_markers;\n        }    \n    }\n\n    assert(curr_small_marker_index == num_small_markers);\n    assert(curr_large_marker_index == num_large_markers);\n\n    // Initialize C(a)\n    m_predCount.set('$', 0);\n    m_predCount.set('A', running_ac.get('$')); \n    m_predCount.set('C', m_predCount.get('A') + running_ac.get('A'));\n    m_predCount.set('G', m_predCount.get('C') + running_ac.get('C'));\n    m_predCount.set('T', m_predCount.get('G') + running_ac.get('G'));\n}\n\n// get the number of markers required to cover the n symbols at sample rate of d\nsize_t RLBWT::getNumRequiredMarkers(size_t n, size_t d) const\n{\n    // we place a marker at the beginning (with no accumulated counts), every m_sampleRate\n    // bases and one at the very end (with the total counts)\n    size_t num_markers = (n % d == 0) ? (n / d) + 1 : (n / d) + 2;\n    return num_markers;\n}\n\n// Print the BWT\nvoid RLBWT::print() const\n{\n    size_t numRuns = getNumRuns();\n    std::string bwt;\n    for(size_t i = 0; i < numRuns; ++i)\n    {\n        const RLUnit& unit = m_rlString[i];\n        char symbol = unit.getChar();\n        size_t length = unit.getCount();\n        for(size_t j = 0; j < length; ++j)\n            std::cout << symbol;\n        std::cout << \" : \" << symbol << \",\" << length << \"\\n\"; \n        bwt.append(length, symbol);\n    }\n    std::cout << \"B: \" << bwt << \"\\n\";\n}\n\n// Print information about the BWT\nvoid RLBWT::printInfo() const\n{\n    size_t small_m_size = m_smallMarkers.capacity() * sizeof(SmallMarker);\n    size_t large_m_size = m_largeMarkers.capacity() * sizeof(LargeMarker);\n    size_t total_marker_size = small_m_size + large_m_size;\n\n    size_t bwStr_size = m_rlString.capacity() * sizeof(RLUnit);\n    size_t other_size = sizeof(*this);\n    size_t total_size = total_marker_size + bwStr_size + other_size;\n\n    double mb = (double)(1024 * 1024);\n    double total_mb = total_size / mb;\n    \n    printf(\"\\nRLBWT info:\\n\");\n    printf(\"Large Sample rate: %zu\\n\", m_largeSampleRate);\n    printf(\"Small Sample rate: %zu\\n\", m_smallSampleRate);\n    printf(\"Contains %zu symbols in %zu runs (%1.4lf symbols per run)\\n\", m_numSymbols, m_rlString.size(), (double)m_numSymbols / m_rlString.size());\n    printf(\"Marker Memory -- Small Markers: %zu (%.1lf MB) Large Markers: %zu (%.1lf MB)\\n\", small_m_size, small_m_size / mb, large_m_size, large_m_size / mb);\n    printf(\"Total Memory -- Markers: %zu (%.1lf MB) Str: %zu (%.1lf MB) Misc: %zu Total: %zu (%lf MB)\\n\", total_marker_size, total_marker_size / mb, bwStr_size, bwStr_size / mb, other_size, total_size, total_mb);\n    printf(\"N: %zu Bytes per symbol: %lf\\n\\n\", m_numSymbols, (double)total_size / m_numSymbols);\n}\n\n// Print the run length distribution of the BWT\nvoid RLBWT::printRunLengths() const\n{\n    typedef std::map<size_t, size_t> DistMap;\n    DistMap rlDist;\n\n    char prevSym = '\\0';\n    size_t prevRunLen = 0;\n    size_t currLen = 0;\n    size_t adjacentSingletons = 0;\n    size_t numRuns = getNumRuns();\n    size_t totalRuns = 0;\n    for(size_t i = 0; i < numRuns; ++i)\n    {\n        const RLUnit& unit = m_rlString[i];\n        size_t length = unit.getCount();\n        if(unit.getChar() == prevSym)\n        {\n            currLen += unit.getCount();\n        }\n        else\n        {\n            if(prevSym != '\\0')\n            {\n                if(currLen >= 200)\n                    rlDist[200]++;\n                else\n                    rlDist[currLen]++;\n                totalRuns++;\n            }\n            currLen = length;\n            prevSym = unit.getChar();\n        }\n\n        if(length == 1 && prevRunLen == 1)\n        {\n            adjacentSingletons += 1;\n            prevRunLen = 0;\n        }\n        prevRunLen = length;\n    }\n    \n    printf(\"Run length distrubtion\\n\");\n    printf(\"rl\\tcount\\tfrac\\n\");\n    double cumulative_mb = 0.0f;\n    for(DistMap::iterator iter = rlDist.begin(); iter != rlDist.end(); ++iter)\n    {\n        cumulative_mb += ((double)iter->second / (1024 * 1024));\n        printf(\"%zu\\t%zu\\t%lf\\t%lf\\n\", iter->first, iter->second, double(iter->second) / totalRuns, cumulative_mb);\n    }\n    printf(\"Total runs: %zu\\n\", totalRuns);\n    printf(\"Number of adjacent singleton runs: %zu\\n\", adjacentSingletons);\n    printf(\"Minimal runs: %zu\\n\", totalRuns - adjacentSingletons / 2);\n}\n\n"
  },
  {
    "path": "src/SGA/SuffixTools/RLBWT.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// RLBWT - Run-length encoded Burrows Wheeler transform\n//\n#ifndef RLBWT_H\n#define RLBWT_H\n\n#include \"STCommon.h\"\n#include \"Occurrence.h\"\n#include \"SuffixArray.h\"\n#include \"ReadTable.h\"\n#include \"HitData.h\"\n#include \"BWTReader.h\"\n#include \"EncodedString.h\"\n#include \"FMMarkers.h\"\n#include \"RLUnit.h\"\n\n// Defines\n//#define RLBWT_VALIDATE 1\n\n//\n// RLBWT\n//\nclass RLBWT\n{\n    public:\n    \n        // Constructors\n        RLBWT(const std::string& filename, int sampleRate = DEFAULT_SAMPLE_RATE_SMALL);\n        RLBWT(const SuffixArray* pSA, const ReadTable* pRT);\n\n        //    \n        void initializeFMIndex();\n\n        // Append a symbol to the bw string\n        void append(char b);\n\n        inline char getChar(size_t idx) const\n        {\n            // Calculate the Marker who's position is not less than idx\n            const LargeMarker& upper = getUpperMarker(idx);\n            size_t current_position = upper.getActualPosition();\n            assert(current_position >= idx);\n\n            size_t symbol_index = upper.unitIndex; \n\n            // Search backwards (towards 0) until idx is found\n            while(current_position > idx)\n            {\n                assert(symbol_index != 0);\n                symbol_index -= 1;\n                current_position -= m_rlString[symbol_index].getCount();\n            }\n\n            // symbol_index is now the index of the run containing the idx symbol\n            const RLUnit& unit = m_rlString[symbol_index];\n            assert(current_position <= idx && current_position + unit.getCount() >= idx);\n            return unit.getChar();\n        }\n\n        // Get the index of the marker nearest to position in the bwt\n        inline size_t getNearestMarkerIdx(size_t position, size_t sampleRate, size_t shiftValue) const\n        {\n            size_t offset = MOD_POWER_2(position, sampleRate); // equivalent to position % sampleRate\n            size_t baseIdx = position >> shiftValue;\n\n            if(offset < (sampleRate >> 1))\n            {\n                return baseIdx;\n            }\n            else\n            {\n                return baseIdx + 1;\n            }\n        }        \n\n        // Get the interpolated marker with position closest to position\n        inline LargeMarker getNearestMarker(size_t position) const\n        {\n            size_t nearest_small_idx = getNearestMarkerIdx(position, m_smallSampleRate, m_smallShiftValue);\n            return getInterpolatedMarker(nearest_small_idx);\n        }\n\n        // Get the greatest interpolated marker whose position is less than or equal to position\n        inline LargeMarker getLowerMarker(size_t position) const\n        {\n            size_t target_small_idx = position >> m_smallShiftValue;\n            return getInterpolatedMarker(target_small_idx);\n        }\n\n        // Get the lowest interpolated marker whose position is strictly greater than position\n        inline LargeMarker getUpperMarker(size_t position) const\n        {\n            size_t target_small_idx = (position >> m_smallShiftValue) + 1;\n            return getInterpolatedMarker(target_small_idx);\n        }\n\n        // Return a LargeMarker with values that are interpolated by adding\n        // the relative count nearest to the requested position to the last\n        // LargeMarker\n        inline LargeMarker getInterpolatedMarker(size_t target_small_idx) const\n        {\n            // Calculate the position of the LargeMarker closest to the target SmallMarker\n            size_t target_position = target_small_idx << m_smallShiftValue;\n            size_t curr_large_idx = target_position >> m_largeShiftValue;\n\n            LargeMarker absoluteMarker = m_largeMarkers[curr_large_idx];\n            const SmallMarker& relative = m_smallMarkers[target_small_idx];\n            alphacount_add16(absoluteMarker.counts, relative.counts);\n            absoluteMarker.unitIndex += relative.unitCount;\n            return absoluteMarker;\n        }\n\n        inline BaseCount getPC(char b) const { return m_predCount.get(b); }\n\n        // Return the number of times char b appears in bwt[0, idx]\n        inline BaseCount getOcc(char b, size_t idx) const\n        {\n            // The counts in the marker are not inclusive (unlike the Occurrence class)\n            // so we increment the index by 1.\n            ++idx;\n\n            const LargeMarker& marker = getNearestMarker(idx);\n            size_t current_position = marker.getActualPosition();\n            bool forwards = current_position < idx;\n            //printf(\"cp: %zu idx: %zu f: %d dist: %d\\n\", current_position, idx, forwards, (int)idx - (int)current_position);\n\n            size_t running_count = marker.counts.get(b);\n            size_t symbol_index = marker.unitIndex; \n\n            if(forwards)\n                accumulateForwards(b, running_count, symbol_index, current_position, idx);\n            else\n                accumulateBackwards(b, running_count, symbol_index, current_position, idx);\n            return running_count;\n        }\n\n        // Return the number of times each symbol in the alphabet appears in bwt[0, idx]\n        inline AlphaCount64 getFullOcc(size_t idx) const \n        { \n            // The counts in the marker are not inclusive (unlike the Occurrence class)\n            // so we increment the index by 1.\n            ++idx;\n\n            const LargeMarker& marker = getNearestMarker(idx);\n            size_t current_position = marker.getActualPosition();\n            bool forwards = current_position < idx;\n\n            AlphaCount64 running_count = marker.counts;\n            size_t symbol_index = marker.unitIndex; \n\n            if(forwards)\n                accumulateForwards(running_count, symbol_index, current_position, idx);\n            else\n                accumulateBackwards(running_count, symbol_index, current_position, idx);\n            return running_count;\n        }\n\n        // Adds to the count of symbol b in the range [targetPosition, currentPosition)\n        // Precondition: currentPosition <= targetPosition\n        inline void accumulateBackwards(AlphaCount64& running_count, size_t currentUnitIndex, size_t currentPosition, const size_t targetPosition) const\n        {\n            // Search backwards (towards 0) until idx is found\n            while(currentPosition != targetPosition)\n            {\n                size_t diff = currentPosition - targetPosition;\n#ifdef RLBWT_VALIDATE                \n                assert(currentUnitIndex != 0);\n#endif\n                --currentUnitIndex;\n\n                const RLUnit& curr_unit = m_rlString[currentUnitIndex];\n                currentPosition -= curr_unit.subtractAlphaCount(running_count, diff);\n            }\n        }\n\n        // Adds to the count of symbol b in the range [currentPosition, targetPosition)\n        // Precondition: currentPosition <= targetPosition\n        inline void accumulateForwards(AlphaCount64& running_count, size_t currentUnitIndex, size_t currentPosition, const size_t targetPosition) const\n        {\n            // Search backwards (towards 0) until idx is found\n            while(currentPosition != targetPosition)\n            {\n                size_t diff = targetPosition - currentPosition;\n#ifdef RLBWT_VALIDATE\n                assert(currentUnitIndex != m_rlString.size());\n#endif\n                const RLUnit& curr_unit = m_rlString[currentUnitIndex];\n                currentPosition += curr_unit.addAlphaCount(running_count, diff);\n                ++currentUnitIndex;\n            }\n        }\n\n        // Adds to the count of symbol b in the range [targetPosition, currentPosition)\n        // Precondition: currentPosition <= targetPosition\n        inline void accumulateBackwards(char b, size_t& running_count, size_t currentUnitIndex, size_t currentPosition, const size_t targetPosition) const\n        {\n            // Search backwards (towards 0) until idx is found\n            while(currentPosition != targetPosition)\n            {\n                size_t diff = currentPosition - targetPosition;\n#ifdef RLBWT_VALIDATE                \n                assert(currentUnitIndex != 0);\n#endif\n                --currentUnitIndex;\n                const RLUnit& curr_unit = m_rlString[currentUnitIndex];\n                currentPosition -= curr_unit.subtractCount(b, running_count, diff);\n            }\n        }\n\n        // Adds to the count of symbol b in the range [currentPosition, targetPosition)\n        // Precondition: currentPosition <= targetPosition\n        inline void accumulateForwards(char b, size_t& running_count, size_t currentUnitIndex, size_t currentPosition, const size_t targetPosition) const\n        {\n            // Search backwards (towards 0) until idx is found\n            while(currentPosition != targetPosition)\n            {\n                size_t diff = targetPosition - currentPosition;\n#ifdef RLBWT_VALIDATE\n                assert(currentUnitIndex != m_rlString.size());\n#endif\n                const RLUnit& curr_unit = m_rlString[currentUnitIndex];\n                currentPosition += curr_unit.addCount(b, running_count, diff);\n                ++currentUnitIndex;\n            }\n        }\n\n        // Return the number of times each symbol in the alphabet appears ins bwt[idx0, idx1]\n        inline AlphaCount64 getOccDiff(size_t idx0, size_t idx1) const \n        { \n            return getFullOcc(idx1) - getFullOcc(idx0); \n        }\n\n        inline size_t getNumStrings() const { return m_numStrings; } \n        inline size_t getBWLen() const { return m_numSymbols; }\n        inline size_t getNumRuns() const { return m_rlString.size(); }\n\n        // Return the first letter of the suffix starting at idx\n        inline char getF(size_t idx) const\n        {\n            size_t ci = 0;\n            while(ci < ALPHABET_SIZE && m_predCount.getByIdx(ci) <= idx)\n                ci++;\n            assert(ci != 0);\n            return RANK_ALPHABET[ci - 1];\n        }\n\n        // Print the size of the BWT\n        void printInfo() const;\n        void print() const;\n        void printRunLengths() const;\n\n        // IO\n        friend class BWTReaderBinary;\n        friend class BWTWriterBinary;\n        friend class BWTReaderAscii;\n        friend class BWTWriterAscii;\n\n        // Default sample rates for the large (64-bit) and small (8-bit) occurrence markers\n        static const int DEFAULT_SAMPLE_RATE_LARGE = 2; //8192;\n        static const int DEFAULT_SAMPLE_RATE_SMALL = 2;\n\n    private:\n\n\n        // Default constructor is not allowed\n        RLBWT() {}\n        \n        // Calculate the number of markers to place\n        size_t getNumRequiredMarkers(size_t n, size_t d) const;\n\n        // The C(a) array\n        AlphaCount64 m_predCount;\n        \n        // The run-length encoded string\n        RLVector m_rlString;\n\n        // The marker vector\n        LargeMarkerVector m_largeMarkers;\n        SmallMarkerVector m_smallMarkers;\n\n        // The number of strings in the collection\n        size_t m_numStrings;\n\n        // The total length of the bw string\n        size_t m_numSymbols;\n\n        // The sample rate used for the markers\n        size_t m_largeSampleRate;\n        size_t m_smallSampleRate;\n\n        // The amount to shift values by to divide by m_sampleRate\n        int m_smallShiftValue;\n        int m_largeShiftValue;\n\n};\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/RLUnit.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// RLUnit - A run-length encoded unit of the FM-index\n//\n#ifndef RLUNIT_H\n#define RLUNIT_H\n\n//\n#define RL_COUNT_MASK 0x1F  //00011111\n#define RL_SYMBOL_MASK 0xE0 //11100000\n#define RL_FULL_COUNT 31\n#define RL_SYMBOL_SHIFT 5\n#define RLE_VALIDATE\n\n// A unit of the RLBWT is a pair of a symbol and its count\n// The high 3 bits encodes the symbol to store\n// The low 5 bits encodes the length of the run\nstruct RLUnit\n{\n    RLUnit() : data(0) {}\n    RLUnit(char b) : data(1)\n    {\n        setChar(b);   \n    }\n\n    // Returns true if the count cannot be incremented\n    inline bool isFull() const\n    {\n        return (data & RL_COUNT_MASK) == RL_FULL_COUNT;\n    }\n\n    inline bool isEmpty() const\n    {\n        return (data & RL_COUNT_MASK) == 0;\n    }\n\n    inline bool isInitialized() const\n    {\n        return data > 0;\n    }\n\n    // Add this run to the AlphaCount\n    // Only add up to maxCount symbols. Returns the number\n    // of symbols added\n    inline size_t addAlphaCount(AlphaCount64& ac, size_t max) const\n    {\n        size_t count = getCount();\n        if(count > max)\n            count = max;\n        char symbol = getChar();\n        ac.add(symbol, count);\n        return count;\n    }\n\n    // Add this run to the count of base b if it matches\n    // Only add up to maxCount symbols. Returns the number\n    // of symbols in the current run, up to max\n    inline size_t addCount(char b, size_t& base_count, size_t max) const\n    {\n        size_t run_len = getCount();\n        if(run_len > max)\n            run_len = max;\n        char symbol = getChar();\n        if(symbol == b)\n            base_count += run_len;\n        return run_len;\n    }    \n\n    // Subtract this run from the AlphaCount\n    // Only subtract up to maxCount symbols. Returns the number\n    // of symbols added\n    inline size_t subtractAlphaCount(AlphaCount64& ac, size_t max) const\n    {\n        size_t count = getCount();\n        if(count > max)\n            count = max;\n        char symbol = getChar();\n        ac.subtract(symbol, count);\n        return count;\n    }\n\n    // Subtract this run from the count of base b if it matches\n    // Only add up to maxCount symbols. Returns the number\n    // of symbols in the current run, up to max\n    inline size_t subtractCount(char b, size_t& base_count, size_t max) const\n    {\n        size_t run_len = getCount();\n        if(run_len > max)\n            run_len = max;\n        char symbol = getChar();\n        if(symbol == b)\n            base_count -= run_len;\n        return run_len;\n    }\n        \n    // \n    inline void incrementCount()\n    {\n#ifdef RLE_VALIDATE\n        assert(!isFull());\n#endif\n        ++data;\n    }\n\n    // \n    inline void decrementCount()\n    {\n#ifdef RLE_VALIDATE\n        assert(!isEmpty());\n#endif\n        --data;\n    }    \n\n    inline uint8_t getCount() const\n    {\n#ifdef RLE_VALIDATE\n        assert((data & RL_COUNT_MASK) != 0);\n#endif\n        return data & RL_COUNT_MASK;\n    }\n\n    // Set the symbol\n    inline void setChar(char symbol)\n    {\n        // Clear the current symbol\n        data &= RL_COUNT_MASK;\n        \n        uint8_t code = BWT_ALPHABET::getRank(symbol);\n        code <<= RL_SYMBOL_SHIFT;\n        data |= code;\n    }\n\n    // Get the symbol\n    inline char getChar() const\n    {\n        uint8_t code = data & RL_SYMBOL_MASK;\n        code >>= RL_SYMBOL_SHIFT;\n        return BWT_ALPHABET::getChar(code);\n    }\n\n    // \n    uint8_t data;\n\n    friend class RLBWTReader;\n    friend class RLBWTWriter;\n};\ntypedef std::vector<RLUnit> RLVector;\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/RankProcess.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// RankProcess - Compute a vector of BWT ranks for\n// SequenceWorkItems\n//\n#include \"RankProcess.h\"\n\n//\n//\n//\nRankProcess::RankProcess(const BWT* pBWT, \n                         GapArray* pSharedGapArray, \n                         bool doReverse, \n                         bool removeMode) : m_pBWT(pBWT), \n                                            m_pSharedGapArray(pSharedGapArray),\n                                            m_doReverse(doReverse), \n                                            m_removeMode(removeMode)\n{\n\n}\n\n//\nRankProcess::~RankProcess()\n{\n\n}\n\n// Calculate the ranks of the given sequence.\n// We attempt to update the count of the rank in the gap array \n// using an atomic compare and swap. The update will fail if the\n// small-storage maximum count is exceeded. In this case\n// we push the value to the overflow array for a serial\n// update in the post-processing step.\nRankResult RankProcess::process(const SequenceWorkItem& workItem)\n{\n    RankResult out;\n    DNAString w = workItem.read.seq;\n    if(m_doReverse)\n        w.reverse();\n\n    size_t l = w.length();\n    int i = l - 1;\n\n    // In add mode, the initial rank is zero and we calculate the rank\n    // for the last base of the sequence using just C(a). In remove\n    // mode we use the index of the read (in the original read table) as\n    // the rank so that ranks calculate correspond to the correct\n    // entries in the BWT for the read to remove.\n    int64_t rank = 0; // add mode\n    if(m_removeMode)\n    {\n        // Parse the read index from the read id\n        rank = parseRankFromID(workItem.read.id);\n    }\n\n    out.numRanksProcessed += 1;\n    if(!m_pSharedGapArray->attemptBaseIncrement(rank))\n        out.overflowVec.push_back(rank);\n\n    // Compute the starting rank for the last symbol of w\n    char c = w.get(i);\n\n    // In the case that the starting rank is zero (default\n    // in add mode, or if we are removing the first read)\n    // there can no occurrence of any characters before this\n    // suffix so we just calculate the rank from C(a)\n    if(rank == 0)\n        rank = m_pBWT->getPC(c);\n    else\n        rank = m_pBWT->getPC(c) + m_pBWT->getOcc(c, rank - 1);\n    \n    out.numRanksProcessed += 1;\n    if(!m_pSharedGapArray->attemptBaseIncrement(rank))\n        out.overflowVec.push_back(rank);\n    --i;\n\n    // Iteratively compute the remaining ranks\n    while(i >= 0)\n    {\n        char c = w.get(i);\n        rank = m_pBWT->getPC(c) + m_pBWT->getOcc(c, rank - 1);\n        //std::cout << \"c: \" << c << \" rank: \" << rank << \"\\n\";\n        out.numRanksProcessed += 1;\n        if(!m_pSharedGapArray->attemptBaseIncrement(rank))\n            out.overflowVec.push_back(rank);\n        --i;\n    }\n    return out;\n}\n\n// Parse the rank of a read from its ID. This must be set by the process\n// which discards the read.\nint64_t RankProcess::parseRankFromID(const std::string& id)\n{\n    static const std::string rank_str = \"seqrank=\";\n    // Find the position of the rank expression in the string\n    size_t rank_pos = id.rfind(rank_str);\n    if(rank_pos == std::string::npos)\n    {\n        std::cout << \"Error: rank token not found in the discarded read with id: \" << id << \"\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    assert(rank_pos + rank_str.length() < id.length());\n    std::stringstream rp(id.substr(rank_pos + rank_str.length()));\n    int64_t rank;\n    rp >> rank;\n    return rank;\n}\n//\n//\n//\nRankPostProcess::RankPostProcess(GapArray* pGapArray) : m_pGapArray(pGapArray), num_strings(0), num_symbols(0), num_serial_updates(0)\n{\n\n}\n\nRankPostProcess::~RankPostProcess()\n{\n    //printf(\"Debug: num serial updates: %zu\\n\", num_serial_updates); \n}\n\n//\nvoid RankPostProcess::process(const SequenceWorkItem& /*item*/, const RankResult& result)\n{\n    ++num_strings;\n    num_symbols += result.numRanksProcessed;\n\n    // We update any overflowed ranks here. This call is serial and only updates\n    // the Overflow table in the gap array.\n    for(RankVector::const_iterator iter = result.overflowVec.begin(); iter != result.overflowVec.end(); ++iter)\n        m_pGapArray->incrementOverflowSerial(*iter);\n    num_serial_updates += result.overflowVec.size();\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/RankProcess.h",
    "content": "///-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// RankProcess - Compute a vector of BWT ranks for\n// SequenceWorkItems\n//\n#ifndef RANKPROCESS_H\n#define RANKPROCESS_H\n\n#include \"Util.h\"\n#include \"BWT.h\"\n#include \"SequenceWorkItem.h\"\n#include \"GapArray.h\"\n\ntypedef std::vector<int64_t> RankVector;\nstruct RankResult\n{\n    RankResult() : numRanksProcessed(0) {}\n\n    RankVector overflowVec;\n    size_t numRanksProcessed;\n};\n\n// Compute the overlap blocks for reads\nclass RankProcess\n{\n    public:\n        RankProcess(const BWT* pBWT, GapArray* pSharedGapArray, bool doReverse, bool removeMode);\n        ~RankProcess();\n\n        RankResult process(const SequenceWorkItem& item);\n    \n    private:\n\n        int64_t parseRankFromID(const std::string& id);\n\n        const BWT* m_pBWT;\n        GapArray* m_pSharedGapArray;\n\n        bool m_doReverse;\n        bool m_removeMode;\n};\n\n// Update the gap array with \nclass RankPostProcess\n{\n    public:\n        RankPostProcess(GapArray* pGapArray);\n        ~RankPostProcess();\n\n        void process(const SequenceWorkItem& item, const RankResult& result);\n        size_t getNumStringsProcessed() const { return num_strings; }\n        size_t getNumSymbolsProcessed() const { return num_symbols; }\n\n    private:\n        GapArray* m_pGapArray;\n        size_t num_strings;\n        size_t num_symbols;\n        size_t num_serial_updates;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/SACAInducedCopying.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SACAInducedCopying algorithm\n//\n#include \"SACAInducedCopying.h\"\n#include \"SuffixCompare.h\"\n#include \"mkqs.h\"\n#include \"bucketSort.h\"\n#include \"Util.h\"\n\nunsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};\n\n#define GET_CHAR(i, j) pRT->getChar((i),(j))\n#define isLMS(i, j) ((j) > 0 && getBit(type_array, (i), (j)) && !getBit(type_array, (i), (j-1)))\n#define GET_BKT(c) getBaseRank((c))\n\n// Implementation of induced copying algorithm by\n// Nong, Zhang, Chan\n// Follows implementation given as an appendix to their 2008 paper\n// '\\0' is the sentinenl in this algorithm\nvoid saca_induced_copying(SuffixArray* pSA, const ReadTable* pRT, int numThreads, bool silent)\n{\n\n    // In the multiple strings case, we need a 2D bit array\n    // to hold the L/S types for the suffixes\n    size_t num_strings = pRT->getCount();\n    char** type_array = new char*[num_strings];\n\n    for(size_t i = 0; i < num_strings; ++i)\n    {\n        size_t s_len = pRT->getReadLength(i) + 1;\n        size_t num_bytes = (s_len / 8) + 1;\n        type_array[i] = new char[num_bytes];\n        assert(type_array[i] != 0);\n        memset(type_array[i], 0, num_bytes);\n    }\n\n    // Classify each suffix as being L or S type\n    for(size_t i = 0; i < num_strings; ++i)\n    {\n        size_t s_len = pRT->getReadLength(i) + 1;\n\n        // The empty suffix ($) for each string is defined to be S type\n        // and hence the next suffix must be L type\n        setBit(type_array, i, s_len - 1, 1);\n        setBit(type_array, i, s_len - 2, 0);\n        for(int64_t j = s_len - 3; j >= 0; --j)\n        {\n            char curr_c = GET_CHAR(i, j);\n            char next_c = GET_CHAR(i, j + 1);\n\n            bool s_type = (curr_c < next_c || (curr_c == next_c && getBit(type_array, i, j + 1) == 1));\n            setBit(type_array, i, j, s_type);\n        }\n    }\n\n    // setup buckets\n    const int ALPHABET_SIZE = 5;\n    int64_t bucket_counts[ALPHABET_SIZE];\n    int64_t buckets[ALPHABET_SIZE];\n\n    // find the ends of the buckets\n    countBuckets(pRT, bucket_counts, ALPHABET_SIZE);\n    getBuckets(bucket_counts, buckets, ALPHABET_SIZE, true); \n\n    // Initialize the suffix array\n    size_t num_suffixes = buckets[ALPHABET_SIZE - 1];\n    pSA->initialize(num_suffixes, pRT->getCount());\n\n    // Copy all the LMS substrings into the first n1 places in the SA\n    size_t n1 = 0;\n    for(size_t i = 0; i < num_strings; ++i)\n    {\n        size_t s_len = pRT->getReadLength(i) + 1;\n        for(size_t j = 0; j < s_len; ++j)\n        {\n            if(isLMS(i,j))\n                pSA->set(n1++, SAElem(i, j));\n        }\n    }\n\n    /*\n    //induceSAl(pRT, pSA, type_array, bucket_counts, buckets, num_suffixes, ALPHABET_SIZE, false);\n    //induceSAs(pRT, pSA, type_array, bucket_counts, buckets, num_suffixes, ALPHABET_SIZE, true);\n    \n    // Compact all the sorted substrings into the first portion of the SA\n    size_t n1 = 0;\n    for(size_t i = 0; i < num_suffixes; ++i)\n    {\n        SAElem elem = pSA->get(i);\n        if(!elem.isEmpty() && isLMS(elem.getID(), elem.getPos()))\n        {\n            pSA->set(n1++, elem);\n        }\n    }\n    */\n\n    // Call MKQS, first on the sequence and then on the index in the read table\n    SuffixCompareRadix radix_compare(pRT, 6);\n    SuffixCompareIndex index_compare;\n    //SuffixCompareID id_compare(pRT);\n    \n    if(numThreads <= 1)\n        mkqs2(&pSA->m_data[0], n1, 0, radix_compare, index_compare);\n    //else\n    //    parallel_mkqs(&pSA->m_data[0], n1, numThreads, radix_compare, index_compare);\n\n    //if(!silent)\n    //    std::cout << \"[saca] mkqs finished\\n\";\n\n    // Induction sort the remaining suffixes\n    for(size_t i = n1; i < num_suffixes; ++i)\n        pSA->set(i, SAElem());\n    \n    // Find the ends of the buckets\n    getBuckets(bucket_counts, buckets, ALPHABET_SIZE, true);\n\n    for(int64_t i = n1 - 1; i >= 0; --i)\n    {\n        SAElem elem_i = pSA->get(i);\n        pSA->set(i, SAElem()); // empty\n        char c = GET_CHAR(elem_i.getID(), elem_i.getPos());\n        pSA->set(--buckets[GET_BKT(c)], elem_i);\n    }\n\n    induceSAl(pRT, pSA, type_array, bucket_counts, buckets, num_suffixes, ALPHABET_SIZE, false);\n    induceSAs(pRT, pSA, type_array, bucket_counts, buckets, num_suffixes, ALPHABET_SIZE, true);\n\n    // deallocate t array\n    for(size_t i = 0; i < num_strings; ++i)\n    {\n        delete [] type_array[i];\n    }\n    delete [] type_array;\n}\n\nvoid induceSAl(const ReadTable* pRT, SuffixArray* pSA, char** p_array, int64_t* counts, int64_t* buckets, size_t n, int K, bool end)\n{\n    getBuckets(counts, buckets, K, end);\n    for(size_t i = 0; i < n; ++i)\n    {\n        const SAElem& elem_i = pSA->get(i);\n        if(!elem_i.isEmpty() && elem_i.getPos() > 0)\n        {\n            //std::cout << \"Curr: \" << elem_i << \"\\n\";\n            SAElem elem_j(elem_i.getID(), elem_i.getPos() - 1);\n            if(!getBit(p_array, elem_j.getID(), elem_j.getPos()))\n            {\n                char c = GET_CHAR(elem_j.getID(),elem_j.getPos());\n                //std::cout << \"<iSA1>Placing \" << elem_j << \" at position \" << buckets[GET_BKT(c)] << \"\\n\";\n                pSA->set(buckets[GET_BKT(c)]++, elem_j);\n            }\n        }\n    }\n}\n\nvoid induceSAs(const ReadTable* pRT, SuffixArray* pSA, char** p_array, int64_t* counts, int64_t* buckets, size_t n, int K, bool end)\n{\n    getBuckets(counts, buckets, K, end);\n    for(int64_t i = n - 1; i >= 0; --i)\n    {\n        const SAElem& elem_i = pSA->get(i);\n        if(!elem_i.isEmpty() && elem_i.getPos() > 0)\n        {\n            //std::cout << \"<isas>Curr: \" << elem_i << \"\\n\";\n            SAElem elem_j(elem_i.getID(), elem_i.getPos() - 1);\n            if(getBit(p_array, elem_j.getID(), elem_j.getPos()))\n            {\n                char c = GET_CHAR(elem_j.getID(),elem_j.getPos());\n                //std::cout << \"<iSAs>Placing \" << elem_j << \" at position \" << buckets[GET_BKT(c)] - 1 << \"\\n\";\n                pSA->set(--buckets[GET_BKT(c)], elem_j);\n            }\n        }\n    }\n}\n\n\n// Calculate the number of items that should be in each bucket\nvoid countBuckets(const ReadTable* pRT, int64_t* counts, int K)\n{\n    for(int i = 0; i < K; ++i)\n        counts[i] = 0;\n\n    for(size_t i = 0; i < pRT->getCount(); ++i)\n    {\n        size_t s_len = pRT->getReadLength(i);\n        for(size_t j = 0; j < s_len; ++j)\n            counts[getBaseRank(GET_CHAR(i,j))]++;\n\n        counts[getBaseRank('\\0')]++;\n    }\n}\n\n// If end is true, calculate the end of the buckets, otherwise \n// calculate the starts\nvoid getBuckets(int64_t* counts, int64_t* buckets, int K, bool end)\n{\n    for(int i = 0; i < K; ++i)\n        buckets[i] = 0;\n\n    size_t sum = 0; \n    for(int i = 0; i < K; ++i)\n    {\n        sum += counts[i];\n        buckets[i] = end ? sum : sum - counts[i];\n    }\n}\n\n// set the element to b\nvoid setBit(char** p_array, size_t str_idx, size_t bit_idx, bool b)\n{\n    char* ba = p_array[str_idx];\n    ba[bit_idx / 8] = b ? mask[bit_idx % 8] | ba[bit_idx / 8] : ~mask[bit_idx % 8] & ba[bit_idx / 8];\n}\n\nbool getBit(char** p_array, size_t str_idx, size_t bit_idx)\n{\n    return p_array[str_idx][bit_idx / 8] & mask[bit_idx % 8] ? 1 : 0;\n}\n\nvoid printType(const ReadTable* pRT, char** p_array, size_t str_idx)\n{\n    std::string suf_string = pRT->getRead(str_idx).seq.getSuffixString(0);\n    std::cout << suf_string << \"\\n\";\n    for(size_t i = 0; i < suf_string.length(); ++i)\n    {\n        std::cout << (getBit(p_array, str_idx, i) == 1 ? \"S\" : \"L\");\n    }\n    std::cout << \"\\n\";\n}\n\n"
  },
  {
    "path": "src/SGA/SuffixTools/SACAInducedCopying.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// SACAInducedCopying - Implementation of the \n// induced copying algorithm as described \n// by Nong, Zhang, Chan (2008)\n// Modified by JTS to handle multiple strings\n#ifndef SACA_INDUCED_COPYING_H\n#include \"SuffixArray.h\"\n#include \"ReadTable.h\"\n\nvoid saca_induced_copying(SuffixArray* pSA, const ReadTable* pRT, int numThreads, bool silent = false);\n\nvoid induceSAl(const ReadTable* pRT, SuffixArray* pSA, char** p_array, int64_t* counts, int64_t* buckets, size_t n, int K, bool end);\nvoid induceSAs(const ReadTable* pRT, SuffixArray* pSA, char** p_array, int64_t* counts, int64_t* buckets, size_t n, int K, bool end);\n\nvoid countBuckets(const ReadTable* pRT, int64_t* buckets, int K);\nvoid getBuckets(int64_t* counts, int64_t* buckets, int K, bool end);\ninline void setBit(char** p_array, size_t str_idx, size_t bit_idx, bool b);\ninline bool getBit(char** p_array, size_t str_idx, size_t bit_idx);\nvoid printType(const ReadTable* pRT, char** p_array, size_t str_idx);\n\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/SAReader.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// SAReader.h - Read a suffix array file from disk\n//\n#include \"SAReader.h\"\n#include \"SuffixArray.h\"\n\n//\nSAReader::SAReader(const std::string& filename) : m_stage(SAIOS_NONE)\n{\n    m_pReader = createReader(filename);\n    m_stage = SAIOS_HEADER;\n}\n\n//\nSAReader::~SAReader()\n{\n    delete m_pReader;\n}\n\nvoid SAReader::read(SuffixArray* pSA)\n{\n    size_t num_elems;\n    readHeader(pSA->m_numStrings, num_elems);\n    pSA->m_data.reserve(num_elems);\n    \n    readElems(pSA->m_data);\n}\n\n//\nvoid SAReader::readHeader(size_t& num_strings, size_t& num_elems)\n{\n    assert(m_stage == SAIOS_HEADER);\n    uint16_t magic_number;\n\n    // Ensure the file format is sane\n    *m_pReader >> magic_number;\n    if(magic_number != SA_FILE_MAGIC)\n    {\n        std::cerr << \"Suffix array file is not properly formatted, aborting\\n\";\n        exit(EXIT_FAILURE);\n    }\n    *m_pReader >> num_strings;\n    *m_pReader >> num_elems;\n\n    // Explicitly set the stream\n    // to the start of the elements\n    m_pReader->get();\n    m_stage = SAIOS_ELEM;    \n}\n\n//\nvoid SAReader::readElems(SAElemVector& elemVector)\n{\n    assert(m_stage == SAIOS_ELEM);\n    size_t cap = elemVector.capacity();\n    size_t num_read = 0;\n    SAElem e;\n    while(*m_pReader >> e)\n    {\n        elemVector.push_back(e);\n        ++num_read;\n    }\n    assert(cap >= num_read);\n    (void)cap;\n    m_stage = SAIOS_DONE;\n}\n\n//\nvoid SAReader::readElems(std::vector<uint32_t>& outVector)\n{\n    assert(m_stage == SAIOS_ELEM);\n    size_t cap = outVector.capacity();\n    size_t num_read = 0;\n    size_t MAX_ELEMS = std::numeric_limits<uint32_t>::max();\n\n    SAElem e;\n    while(*m_pReader >> e)\n    {\n        size_t index = e.getID();\n        size_t pos = e.getPos();\n        assert(pos == 0);\n\n        // Ensure this index is representable by the collection\n        if(index > MAX_ELEMS)\n        {\n            std::cerr << \"Error: Only \" << MAX_ELEMS << \" reads are allowed in this program\\n\";\n            std::cerr << \"Found read with index \" << index << \"\\n\";\n            std::cerr << \"Contact sga-users@googlegroups.com for help\\n\";\n            exit(EXIT_FAILURE);\n        }\n        outVector.push_back(index);\n        ++num_read;\n    }\n    assert(cap >= num_read);\n    (void)cap;\n    m_stage = SAIOS_DONE;\n}\n\nSAElem SAReader::readElem()\n{\n    assert(m_stage == SAIOS_ELEM);\n    SAElem e;\n    if(*m_pReader >> e)\n    {\n        return e;\n    }\n    else\n    {\n        std::cerr << \"Error: Read past end-of-file in SAReader::readElem()\\n\";\n        exit(EXIT_FAILURE);\n    }\n}\n\n"
  },
  {
    "path": "src/SGA/SuffixTools/SAReader.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// SAReader.h - Read a suffix array file from disk\n//\n#ifndef SAREADER_H\n#define SAREADER_H\n\n#include \"Util.h\"\n#include \"STCommon.h\"\n#include \"Occurrence.h\"\n\nconst uint16_t SA_FILE_MAGIC = 0xCACA;\n\nenum SAIOStage\n{\n    SAIOS_NONE,\n    SAIOS_HEADER,\n    SAIOS_ELEM,\n    SAIOS_DONE\n};\n\nclass SuffixArray;\n\nclass SAReader\n{\n    public:\n        SAReader(const std::string& filename);\n        ~SAReader();\n\n        //\n        void read(SuffixArray* pSA);\n\n        // Read the header of the file\n        void readHeader(size_t& num_strings, size_t& num_elems);\n        \n        // Read the file into a vector of SAElems\n        void readElems(SAElemVector& elemVector);\n\n        // Read the file into a vector of unsigned ints storing\n        // the read indices. This is a more compact representation\n        // than storing the full SAElems but only works up to 2**32 values\n        void readElems(std::vector<uint32_t>& outVector);\n\n        // Read a single element\n        SAElem readElem();\n\n    private:\n        std::istream* m_pReader;\n        SAIOStage m_stage;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/SAWriter.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// SAWriter.h - Read a suffix array file from disk\n//\n#include \"SAWriter.h\"\n#include \"SuffixArray.h\"\n\n//\nSAWriter::SAWriter(const std::string& filename) : m_stage(SAIOS_NONE)\n{\n    m_pWriter = createWriter(filename);\n    m_stage = SAIOS_HEADER;\n}\n\n//\nSAWriter::~SAWriter()\n{\n    delete m_pWriter;\n}\n\nvoid SAWriter::write(const SuffixArray* pSA)\n{\n    writeHeader(pSA->m_numStrings, pSA->m_data.size());\n    writeElems(pSA->m_data);\n}\n\n//\nvoid SAWriter::writeHeader(const size_t& num_strings, const size_t& num_elems)\n{\n    assert(m_stage == SAIOS_HEADER);\n    *m_pWriter << SA_FILE_MAGIC << \"\\n\";\n    *m_pWriter << num_strings << \"\\n\";\n    *m_pWriter << num_elems << \"\\n\";\n    m_stage = SAIOS_ELEM;    \n}\n\n//\nvoid SAWriter::writeElems(const SAElemVector& elemVector)\n{\n    assert(m_stage == SAIOS_ELEM);\n    for(size_t i = 0; i < elemVector.size(); ++i)\n        writeElem(elemVector[i]);\n    m_stage = SAIOS_DONE;\n}\n\n//\nvoid SAWriter::writeElem(const SAElem& elem)\n{\n    *m_pWriter << elem << \"\\n\";\n}\n\n"
  },
  {
    "path": "src/SGA/SuffixTools/SAWriter.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// SAWriter.h - Read a suffix array file from disk\n//\n#ifndef SAWRITER_H\n#define SAWRITER_H\n\n#include \"Util.h\"\n#include \"STCommon.h\"\n#include \"Occurrence.h\"\n#include \"SAReader.h\"\n\nclass SuffixArray;\n\nclass SAWriter\n{\n    public:\n        SAWriter(const std::string& filename);\n        ~SAWriter();\n\n        //\n        void write(const SuffixArray* pSA);\n        void writeHeader(const size_t& num_strings, const size_t& num_elems);\n        void writeElems(const SAElemVector& elemVector);\n        void writeElem(const SAElem& elem);\n\n    private:\n        std::ostream* m_pWriter;\n        SAIOStage m_stage;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/SBWT.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SBWT.cpp - Burrows Wheeler transform of a generalized suffix array\n//\n#include \"SBWT.h\"\n#include \"Timer.h\"\n#include \"BWTReaderAscii.h\"\n#include \"BWTReaderBinary.h\"\n#include \"BWTWriterAscii.h\"\n#include <istream>\n#include <queue>\n#include <inttypes.h>\n\n// macros\n#define OCC(c,i) m_occurrence.get(m_bwStr, (c), (i))\n#define PRED(c) m_predCount.get((c))\n\n// Parse a BWT from a file\nSBWT::SBWT(const std::string& filename, int sampleRate)\n{\n    BWTReaderBinary reader(filename);\n    reader.read(this);\n    initializeFMIndex(sampleRate);\n}\n\n// Construct the BWT from a suffix array\nSBWT::SBWT(const SuffixArray* pSA, const ReadTable* pRT)\n{\n    size_t n = pSA->getSize();\n    m_numStrings = pSA->getNumStrings();\n    m_bwStr.resize(n);\n\n    // Set up the bwt string and suffix array from the cycled strings\n    for(size_t i = 0; i < n; ++i)\n    {\n        SAElem saElem = pSA->get(i);\n        const SeqItem& si = pRT->getRead(saElem.getID());\n\n        // Get the position of the start of the suffix\n        uint64_t f_pos = saElem.getPos();\n        uint64_t l_pos = (f_pos == 0) ? si.seq.length() : f_pos - 1;\n        char b = (l_pos == si.seq.length()) ? '$' : si.seq.get(l_pos);\n        m_bwStr.set(i, b);\n    }\n\n    initializeFMIndex(DEFAULT_SAMPLE_RATE);\n}\n\n// Fill in the FM-index data structures\nvoid SBWT::initializeFMIndex(int sampleRate)\n{\n    // initialize the occurance table\n    m_occurrence.initialize(m_bwStr, sampleRate);\n\n    // Calculate the C(a) array\n    \n    // Calculate the total number of occurances of each character in the BW str\n    AlphaCount64 tmp;\n    for(size_t i = 0; i < m_bwStr.length(); ++i)\n    {\n        tmp.increment(m_bwStr.get(i));\n    }\n\n    m_predCount.set('$', 0);\n    m_predCount.set('A', tmp.get('$')); \n    m_predCount.set('C', m_predCount.get('A') + tmp.get('A'));\n    m_predCount.set('G', m_predCount.get('C') + tmp.get('C'));\n    m_predCount.set('T', m_predCount.get('G') + tmp.get('G'));\n}\n\n// Compute the last to first mapping\nsize_t SBWT::LF(size_t idx) const\n{\n    return m_bwStr.get(idx) != '$' ? PRED(m_bwStr.get(idx)) + OCC(m_bwStr.get(idx), idx) : 0;\n}\n\n// Perform a exact search for the string w using the backwards algorithm\nvoid SBWT::backwardSearch(std::string w) const\n{\n    std::cout << \"Searching for \" << w << \"\\n\";\n    int len = w.size();\n    int j = len - 1;\n    char curr = w[j];\n    int r_lower = PRED(curr);\n    int r_upper = r_lower + OCC(curr, m_bwStr.length() - 1) - 1;\n    --j;\n    std::cout << \"Starting point: \" << r_lower << \",\" << r_upper << \"\\n\";\n    for(;j >= 0; --j)\n    {\n        curr = w[j];\n        printf(\"RL = C(%c) + O(%c,%d) + %zu\\n\", curr, curr, r_lower - 1, m_numStrings); \n        printf(\"RU = C(%c) + O(%c,%d)\\n\", curr, curr, r_upper); \n        printf(\"RL = %zu + %zu + %zu\\n\", (size_t)PRED(curr), (size_t)OCC(curr, r_lower - 1), m_numStrings); \n        printf(\"RU = %zu + %zu\\n\", (size_t)PRED(curr), (size_t)OCC(curr, r_upper)); \n        r_lower = PRED(curr) + OCC(curr, r_lower - 1);\n        r_upper = PRED(curr) + OCC(curr, r_upper) - 1;\n        printf(\"Curr: %c, Interval now: %d,%d\\n\", curr, r_lower, r_upper);\n    }\n\n    std::cout << \"Interval found: \" << r_lower << \",\" << r_upper << \"\\n\";\n}\n\n//\nvoid SBWT::validate() const\n{\n    std::cerr << \"Warning BWT validation is turned on\\n\";\n    m_occurrence.validate(m_bwStr);\n}\n\n// Print the BWT\nvoid SBWT::print(const ReadTable* pRT, const SuffixArray* pSA) const\n{\n    std::cout << \"i\\tL(i)\\tF(i)\\tO(-,i)\\tSUFF\\n\";\n    for(size_t i = 0; i < m_bwStr.length(); ++i)\n    {\n        assert(getF(i) == pSA->getSuffix(i, pRT)[0]);\n        std::cout << i << \"\\t\" << m_bwStr.get(i) << \"\\t\" << getF(i) << \"\\t\" << m_occurrence.get(m_bwStr, i) << pSA->getSuffix(i, pRT) << \"\\n\";\n    }\n}\n\n// Print information about the BWT\nvoid SBWT::printInfo() const\n{\n    size_t o_size = m_occurrence.getByteSize();\n    size_t p_size = sizeof(m_predCount);\n\n    size_t bwStr_size = m_bwStr.getMemSize();\n    size_t offset_size = sizeof(m_numStrings);\n    size_t total_size = o_size + p_size + bwStr_size + offset_size;\n    double total_mb = ((double)total_size / (double)(1024 * 1024));\n    printf(\"\\nSBWT info\\n\");\n    printf(\"Sample rate: %zu\\n\", m_occurrence.getSampleRate());\n    printf(\"Memory -- OCC: %zu C: %zu Str: %zu Misc: %zu TOTAL: %zu (%lf MB)\\n\",\n            o_size, p_size, bwStr_size, offset_size, total_size, total_mb);\n    printf(\"N: %zu Bytes per symbol: %lf\\n\", m_bwStr.length(), (double)total_size / m_bwStr.length());\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/SBWT.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL \n//-----------------------------------------------\n//\n// SBWT - Uncompressed burrows Wheeler transform \n//        of a set of sequence reads\n//          \n//\n#ifndef SBWT_H\n#define SBWT_H\n\n#include \"STCommon.h\"\n#include \"Occurrence.h\"\n#include \"SuffixArray.h\"\n#include \"ReadTable.h\"\n#include \"HitData.h\"\n#include \"BWTReader.h\"\n#include \"EncodedString.h\"\n\n//\n// BWT\n//\nclass SBWT\n{\n    public:\n    \n        // Constructors\n        SBWT(const std::string& filename, int sampleRate = DEFAULT_SAMPLE_RATE);\n        SBWT(const SuffixArray* pSA, const ReadTable* pRT);\n        \n        //    \n        void initializeFMIndex(int sampleRate);\n\n        // Exact match\n        void backwardSearch(std::string w) const;\n\n        // L[i] -> F mapping \n        size_t LF(size_t idx) const;\n\n        inline char getChar(size_t idx) const { return m_bwStr.get(idx); }\n        inline BaseCount getPC(char b) const { return m_predCount.get(b); }\n\n        // Return the number of times char b appears in bwt[0, idx]\n        inline BaseCount getOcc(char b, size_t idx) const { return m_occurrence.get(m_bwStr, b, idx); }\n\n        // Return the number of times each symbol in the alphabet appears in bwt[0, idx]\n        inline AlphaCount64 getFullOcc(size_t idx) const { return m_occurrence.get(m_bwStr, idx); }\n\n        // Return the number of times each symbol in the alphabet appears ins bwt[idx0, idx1]\n        inline AlphaCount64 getOccDiff(size_t idx0, size_t idx1) const { return m_occurrence.getDiff(m_bwStr, idx0, idx1); }\n\n        inline size_t getNumStrings() const { return m_numStrings; } \n        inline size_t getBWLen() const { return m_bwStr.length(); }\n\n        // Return the first letter of the suffix starting at idx\n        inline char getF(size_t idx) const\n        {\n            size_t ci = 0;\n            while(ci < ALPHABET_SIZE && m_predCount.getByIdx(ci) <= idx)\n                ci++;\n            assert(ci != 0);\n            return RANK_ALPHABET[ci - 1];\n        }\n\n        // Print the size of the BWT\n        void printInfo() const;\n        void print(const ReadTable* pRT, const SuffixArray* pSA) const;\n        void printRunLengths() const { std::cout << \"Using SimpleBWT - No run lengths\\n\"; }\n        void validate() const;\n\n        // IO\n        friend class BWTReaderBinary;\n        friend class BWTWriterBinary;\n        friend class BWTReaderAscii;\n        friend class BWTWriterAscii;\n\n        static const int DEFAULT_SAMPLE_RATE = 128;\n        static const int DEFAULT_SAMPLE_RATE_SMALL = DEFAULT_SAMPLE_RATE;\n\n    private:\n\n        \n        // Default constructor is not allowed\n        SBWT() {}\n\n        // The O(a,i) array\n        Occurrence m_occurrence;\n\n        // The C(a) array\n        AlphaCount64 m_predCount;\n        \n        // The bw string\n        BWTString m_bwStr;\n\n        // The number of strings in the collection\n        size_t m_numStrings;\n};\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/STCommon.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// STCommon.cpp - Implementation of basic data structures\n//\n#include \"STCommon.h\"\n#include <iterator>\n\n//\n// SAId\n//\n\n// Constructors\nSAElem::SAElem(uint64_t i)\n{\n    setID(i);\n}\n\n//\nSAElem::SAElem(uint64_t i, uint64_t p)\n{\n    setID(i);\n    setPos(p);\n}\n\n// Input\nstd::istream& operator>>(std::istream& in, SAElem& s)\n{\n    uint64_t i;\n    uint64_t p;\n    in >> i >> p;\n    s.setID(i);\n    s.setPos(p);\n    return in;\n}\n\n// Output\nstd::ostream& operator<<(std::ostream& out, const SAElem& s)\n{\n    if(!s.isEmpty())\n        out << s.getID() << \" \" << s.getPos();\n    else\n        out << -1;\n    return out;\n}\n\n//\n// Global functions\n// \n\n// Print a map\ntemplate<class K, class V>\nvoid printMap(const std::map<K,V>& m)\n{\n    for(typename std::map<K,V>::const_iterator iter = m.begin(); iter != m.end(); ++iter)\n    {\n        std::cout << iter->first << \"\\t\" << iter->second << \"\\n\";\n    }\n}\n\n// Print a vector\ntemplate<class T>\nvoid printVector(const std::vector<T>& v)\n{\n    std::copy(v.begin(), v.end(), std::ostream_iterator<T>(std::cout, \"\\n\"));\n}\n\n"
  },
  {
    "path": "src/SGA/SuffixTools/STCommon.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// STCommon.h - Base classes and data structures\n//\n#ifndef STCOMMON_H\n#define STCOMMON_H\n#include \"STGlobals.h\"\n#include \"Util.h\"\n\n//\n// Functions\n//\n\n// Print out a map using cout\ntemplate<class K, class V>\nvoid printMap(const std::map<K,V>& m);\n\n// Print a vector\ntemplate<class T>\nvoid printVector(const std::vector<T>& v);\n\n//\n// Classes\n//\n\n\n//\n// A Generalized SuffixArray ID (SAElem) is a single number where the high n bits represents the\n// identifier of the string (as the index into a StringDictionary) and the low (64 - n) bits \n// represents the position in that string\n//\nstruct SAElem\n{\n    public:\n        SAElem() : m_val(std::numeric_limits<uint64_t>::max()) { }\n        SAElem(uint64_t i);\n        SAElem(uint64_t i, uint64_t p);\n\n        //\n        inline bool isEmpty() const\n        {\n            return m_val == std::numeric_limits<uint64_t>::max();\n        }\n\n        // set the id\n        inline void setID(uint64_t i)\n        {\n            // Clear the HIGH bits by ANDing with the low mask\n            m_val &= LOW_MASK;\n            \n            // Shift the new position into place and set the new value\n            i <<= POS_BITS;\n            m_val |= i;\n        }\n\n        // set the position\n        void setPos(uint64_t i)\n        {\n            // Clear the LOW bits by anding with the high mask\n            m_val &= HIGH_MASK;\n\n            // Set the new value\n            m_val |= i;\n        }\n\n        inline uint64_t getID() const\n        {\n            return (m_val & HIGH_MASK) >> POS_BITS;\n        }\n\n        inline uint64_t getPos() const\n        {\n            return (m_val & LOW_MASK);\n        }\n\n        // Returns true if the suffix is the full length of the string\n        inline bool isFull() const\n        {\n            return getPos() == 0;\n        }\n\n        // Input/Output\n        friend std::istream& operator>>(std::istream& in, SAElem& s);\n        friend std::ostream& operator<<(std::ostream& out, const SAElem& s);\n\n\n    private:\n        \n        //\n        uint64_t m_val;\n\n        // Masks\n        static const uint8_t ID_BITS = 36; // Allows up to 68 billion IDs\n        static const uint8_t POS_BITS = 64 - ID_BITS;\n  static const uint64_t HIGH_MASK = (~((uint64_t)(0))) << POS_BITS;\n        static const uint64_t LOW_MASK = ~HIGH_MASK;\n};\n\n// Typedefs of STL collections of the above classes\ntypedef std::vector<SAElem> SAElemVector;\ntypedef std::pair<SAElem, SAElem> SAElemPair;\ntypedef std::vector<SAElemPair> SAElemPairVec;\ntypedef std::set<uint64_t> NumericIDSet;\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/STGlobals.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// STGlobals.h - Common definitions and declarations for suffix tree,\n// suffix array and BWT data types\n//\n#ifndef STGLOBALS_H\n#define STGLOBALS_H\n#include <iostream>\n#include <vector>\n#include <algorithm>\n#include <map>\n#include <set>\n#include <assert.h>\n#include <stdint.h>\n#include \"Alphabet.h\"\n\n//\n// Basic typedefs\n//\ntypedef std::string BWStr;\ntypedef uint32_t Label;\ntypedef uint8_t AIdx;\ntypedef std::vector<int> IntVector;\ntypedef std::vector<std::string> StringVector;\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/SampledSuffixArray.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SampledSuffixArray - Data structure holding\n// a subset of suffix array positions. From the\n// sampled positions, the other entries of the\n// suffix array can be calculated.\n//\n#include \"SampledSuffixArray.h\"\n#include \"SAReader.h\"\n#include \"SAWriter.h\"\n//#include \"config.h\"\n\n#if HAVE_OPENMP\n#include <omp.h>\n#endif\n\nstatic const uint32_t SSA_MAGIC_NUMBER = 12412;\n#define SSA_READ(x) pReader->read(reinterpret_cast<char*>(&(x)), sizeof((x)));\n#define SSA_READ_N(x,n) pReader->read(reinterpret_cast<char*>(&(x)), (n));\n\n#define SSA_WRITE(x) pWriter->write(reinterpret_cast<const char*>(&(x)), sizeof((x)));\n#define SSA_WRITE_N(x,n) pWriter->write(reinterpret_cast<const char*>(&(x)), (n));\n\n//\nSampledSuffixArray::SampledSuffixArray()\n{\n\n}\n\nSampledSuffixArray::SampledSuffixArray(const std::string& filename, SSAFileType filetype)\n{\n    // Read the sampled suffix array from a file - either from a .ssa or .sai file\n    if(filetype == SSA_FT_SSA)\n        readSSA(filename);\n    else\n        readSAI(filename);\n}\n\n// \nSAElem SampledSuffixArray::calcSA(int64_t idx, const BWT* pBWT) const\n{\n    size_t offset = 0;\n    SAElem elem;\n\n    while(1)\n    {\n        // Check if this position is sampled. If the sample rate is zero we are using the lexo. index only\n        if(m_sampleRate > 0 && idx % m_sampleRate == 0 && !m_saSamples[idx / m_sampleRate].isEmpty())\n        {\n            // A valid sample is stored for this idx\n            elem = m_saSamples[idx / m_sampleRate];\n            break;\n        }\n\n        // A sample does not exist for this position, perform a backtracking step\n        char b = pBWT->getChar(idx);\n        idx = pBWT->getPC(b) + pBWT->getOcc(b, idx - 1);\n\n        if(b == '$')\n        {\n            // idx (before the update) corresponds to the start of a read.\n            // We can directly look up the saElem for idx from the lexicographic index\n            assert(idx < (int64_t)m_saLexoIndex.size());\n            elem.setID(m_saLexoIndex[idx]);\n            elem.setPos(0);\n            break;\n        }\n        else\n        {\n            // A backtracking step is performed, increment offset\n            offset += 1;\n        }\n    }\n\n    elem.setPos(elem.getPos() + offset);\n    return elem;\n}\n\n// Returns the ID of the read with lexicographic rank r\nsize_t SampledSuffixArray::lookupLexoRank(size_t r) const\n{\n    return m_saLexoIndex[r];\n}\n\n// \nvoid SampledSuffixArray::build(const BWT* pBWT, const ReadInfoTable* pRIT, int sampleRate)\n{\n    m_sampleRate = sampleRate;\n\n    size_t numStrings = pRIT->getCount();\n    m_saLexoIndex.resize(numStrings);\n\n    size_t MAX_ELEMS = std::numeric_limits<SSA_INT_TYPE>::max();\n    if(numStrings > MAX_ELEMS)\n    {\n        std::cerr << \"Error: Only \" << MAX_ELEMS << \" reads are allowed in the sampled suffix array\\n\";\n        std::cerr << \"Number of reads in your index: \" << numStrings << \"\\n\";\n        std::cerr << \"Contact sga-users@googlegroups.com for help\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    // Set the size of the sampled vector\n    size_t numElems = (pBWT->getBWLen() / m_sampleRate) + 1;\n    m_saSamples.resize(numElems);\n\n    // For each read, start from the end of the read and backtrack through the suffix array/BWT.\n    // For every idx that is divisible by the sample rate, store the calculate SAElem\n    for(size_t i = 0; i < numStrings; ++i)\n    {\n        // The suffix array positions for the ends of reads are ordered\n        // by their position in the read information table, therefore\n        // the starting suffix array index is i\n        size_t idx = i;\n\n        // The ID of the read is i. The position coordinate is inclusive but \n        // since the read information table does not store the '$' symbol\n        // the starting position equals the read length\n        SAElem elem(i, pRIT->getReadLength(i));\n\n        while(1)\n        {\n            if(idx % m_sampleRate == 0)\n            {\n                // store this SAElem\n                m_saSamples[idx / m_sampleRate] = elem;\n            }\n\n            char b = pBWT->getChar(idx);\n            idx = pBWT->getPC(b) + pBWT->getOcc(b, idx - 1);\n            if(b == '$')\n            {\n                // we have hit the beginning of this string\n                // store the SAElem for the beginning of the read\n                // in the lexicographic index\n                if(elem.getPos() != 0)\n                    std::cout << \"elem: \" << elem << \" i: \" << i << \"\\n\";\n\n                assert(elem.getPos() == 0);\n                size_t id = elem.getID();\n                assert(id < MAX_ELEMS);\n                m_saLexoIndex[idx] = id;\n                break; // done;\n            }\n            else\n            {\n                // Decrease the position of the elem\n                elem.setPos(elem.getPos() - 1);\n            }\n        }\n    }\n}\n\n// A streamlined version of the above function\nvoid SampledSuffixArray::buildLexicoIndex(const BWT* pBWT, int num_threads)\n{\n    int64_t numStrings = pBWT->getNumStrings();\n    m_saLexoIndex.resize(numStrings);\n    int64_t MAX_ELEMS = std::numeric_limits<SSA_INT_TYPE>::max();\n    assert(numStrings < MAX_ELEMS);\n\n    (void)num_threads;\n    // Parallelize this computaiton using openmp, if the compiler supports it\n#if HAVE_OPENMP\n    omp_set_num_threads(num_threads);\n    #pragma omp parallel for\n#endif\n    for(int64_t read_idx = 0; read_idx < numStrings; ++read_idx)\n    {\n        // For each read, start from the end of the read and backtrack through the suffix array/BWT\n        // to calculate its lexicographic rank in the collection\n        size_t idx = read_idx;\n        while(1)\n        {\n            char b = pBWT->getChar(idx);\n            idx = pBWT->getPC(b) + pBWT->getOcc(b, idx - 1);\n            if(b == '$')\n            {\n                // There is a one-to-one mapping between read_index and the element\n                // of the array that is set - therefore we can perform this operation\n                // without a lock.\n                m_saLexoIndex[idx] = read_idx;\n                break; // done;\n            }\n        }\n    }\n}\n\n// Validate the sampled suffix array values are correct\n/*void SampledSuffixArray::validate(const std::string filename, const BWT* pBWT)\n{\n    ReadTable* pRT = new ReadTable(filename);\n    SuffixArray* pSA = new SuffixArray(pRT, 1);\n    \n    std::cout << \"Validating sampled suffix array entries\\n\";\n\n    for(size_t i = 0; i < pSA->getSize(); ++i)\n    {\n        SAElem calc = calcSA(i, pBWT);\n        SAElem real = pSA->get(i);\n        if(calc.getID() != real.getID() || calc.getPos() != real.getPos())\n        {\n            std::cout << \"Error SA elements do not match for \" << i << \"\\n\";\n            std::cout << \"Calc: \" << calc << \"\\n\";\n            std::cout << \"Real: \" << real << \"\\n\";\n            exit(1);\n        }\n    }\n    \n    std::cout << \"All calculate SA values are correct\\n\";\n\n    delete pRT;\n    delete pSA;\n}\n*/\n\n// Save the SA to disc\nvoid SampledSuffixArray::writeSSA(std::string filename)\n{\n    std::ostream* pWriter = createWriter(filename, std::ios::out | std::ios::binary);\n    \n    // Write a magic number\n    SSA_WRITE(SSA_MAGIC_NUMBER)\n\n    // Write sample rate\n    SSA_WRITE(m_sampleRate)\n\n    // Write number of lexicographic index entries\n    size_t n = m_saLexoIndex.size();\n    SSA_WRITE(n)\n\n    // Write lexo index\n    SSA_WRITE_N(m_saLexoIndex.front(), sizeof(SSA_INT_TYPE) * n)\n    \n    // Write number of samples\n    n = m_saSamples.size();\n    SSA_WRITE(n)\n\n    // Write samples\n    SSA_WRITE_N(m_saSamples.front(), sizeof(SAElem) * n)\n\n    delete pWriter;\n}\n\n// Save just the lexicographic index portion of the SSA to disk as plaintext\nvoid SampledSuffixArray::writeLexicoIndex(const std::string& filename)\n{\n    SAWriter writer(filename);\n    size_t num_strings = m_saLexoIndex.size();\n    writer.writeHeader(num_strings, num_strings);\n    for(size_t i = 0; i < m_saLexoIndex.size(); ++i) \n    {\n        SAElem elem(m_saLexoIndex[i], 0);\n        writer.writeElem(elem);\n    }\n}\n\n\nvoid SampledSuffixArray::readSSA(std::string filename)\n{\n    std::istream* pReader = createReader(filename, std::ios::binary);\n    \n    // Write a magic number\n    uint32_t magic = 0;\n    SSA_READ(magic)\n    assert(magic == SSA_MAGIC_NUMBER);\n\n    // Read sample rate\n    SSA_READ(m_sampleRate)\n\n    // Read number of lexicographic index entries\n    size_t n = 0;\n    SSA_READ(n)\n    m_saLexoIndex.resize(n);\n\n    // Read lexo index\n    SSA_READ_N(m_saLexoIndex.front(), sizeof(SSA_INT_TYPE) * n)\n    \n    // Read number of samples\n    n = 0;\n    SSA_READ(n)\n    m_saSamples.resize(n);\n\n    // Read samples\n    SSA_READ_N(m_saSamples.front(), sizeof(SAElem) * n)\n\n    delete pReader;\n}\n\nvoid SampledSuffixArray::readSAI(std::string filename)\n{\n    SAReader reader(filename);\n    size_t num_strings, num_elems;\n    reader.readHeader(num_strings, num_elems);\n    assert(num_strings == num_elems);\n    m_saLexoIndex.reserve(num_strings);\n    reader.readElems(m_saLexoIndex);\n\n    // Set the sample rate to zero to signify there are no samples\n    m_sampleRate = 0;\n}\n\n// Print memory usage information\nvoid SampledSuffixArray::printInfo() const\n{\n    double mb = (double)(1024*1024);\n    double lexoSize = (double)(sizeof(SSA_INT_TYPE) * m_saLexoIndex.capacity()) / mb;\n    double sampleSize = (double)(sizeof(SAElem) * m_saSamples.capacity()) / mb;\n    \n    printf(\"SampledSuffixArray info:\\n\");\n    printf(\"Sample rate: %d\\n\", m_sampleRate);\n    printf(\"Contains %zu entries in lexicographic array (%.1lf MB)\\n\", m_saLexoIndex.size(), lexoSize);\n    printf(\"Contains %zu entries in sample array (%.1lf MB)\\n\", m_saSamples.size(), sampleSize);\n    printf(\"Total size: %.1lf\\n\", lexoSize + sampleSize);\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/SampledSuffixArray.h",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SampledSuffixArray - Data structure holding\n// a subset of suffix array positions. From the\n// sampled positions, the other entries of the\n// suffix array can be calculated.\n//\n#ifndef SAMPLED_SUFFIX_ARRAY\n#define SAMPLED_SUFFIX_ARRAY\n\n#include \"SuffixArray.h\"\n#include \"BWT.h\"\n#include \"ReadInfoTable.h\"\n\ntypedef uint32_t SSA_INT_TYPE;\n\nenum SSAFileType\n{\n    SSA_FT_SSA,\n    SSA_FT_SAI\n};\n\nclass SampledSuffixArray\n{\n    public:\n\n        SampledSuffixArray();\n        SampledSuffixArray(const std::string& filename, SSAFileType filetype = SSA_FT_SSA);\n        \n        // Calculate the suffix array element for the given index\n        SAElem calcSA(int64_t idx, const BWT* pBWT) const;\n\n        // Returns the ID of the read with lexicographic rank r\n        size_t lookupLexoRank(size_t r) const;\n\n        // Construct the sampled SA using the bwt of a set of reads and their lengths\n        void build(const BWT* pBWT, const ReadInfoTable* pRIT, int sampleRate = DEFAULT_SA_SAMPLE_RATE);\n\n        // Construct the lexicographic index (.sai) from the BWT\n        void buildLexicoIndex(const BWT* pBWT, int num_threads);\n\n        // Validate using the full suffix array for the given set of reads. Very slow.\n        void validate(std::string readsFile, const BWT* pBWT);\n        void printInfo() const;\n\n        // I/O\n        void writeLexicoIndex(const std::string& filename);\n        void writeSSA(std::string filename);\n        void readSSA(std::string filename);\n        void readSAI(std::string filename);\n\n    private:\n\n        // Unsigned integers indicating the start of every read in the\n        // sequence collection. These elements are in lexicographic order\n        // based on the whole read sequence. Tracing a read backwards through\n        // the suffix array necessarily ends at one of these positions. These\n        // are nominally SAElems representing the full length suffix but\n        // we store them here as unsigned integers to save 4 bytes per entry.\n        // This limits the SampledSuffixArray to represent at most 2**32 strings.\n        // To improve this we could use a polymorphic vector with a runtime-determined\n        // size.\n        std::vector<SSA_INT_TYPE> m_saLexoIndex;\n\n        static const int DEFAULT_SA_SAMPLE_RATE = 64;\n        int m_sampleRate;\n        SAElemVector m_saSamples;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/SparseGapArray.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SparseGapArray\n//\n// The sparse gap array uses a small integer type to\n// keep the count for each element. A small number\n// of positions will have a count that is larger\n// than the maximum value the integer can represent.\n// These values are automatically overflowed into a \n// hash map with a larger integer type. In the typical\n// case this will require far less memory than the\n// SimpleGapArray. The storage unit is templated\n// to allow a dynamic tradeoff between the amount\n// of memory required to store the simple cases \n// and the overflow rate.\n//\n#ifndef SPARSEGAPARRAY_H\n#define SPARSEGAPARRAY_H\n\n#include \"HashMap.h\"\n#include \"GapArray.h\"\n#include \"BitVector.h\"\n\n// Template base storage for the sparse gap array\ntemplate<class IntType>\nclass SparseBaseStorage\n{\n    public:\n        //\n        void resize(size_t n)\n        {\n            m_data.resize(n);\n        }\n\n        //\n        inline void set(size_t i, IntType c)\n        {\n            m_data[i] = c;\n        }\n\n        // Attempt to set the value using an atomic update\n        // Returns false if the update fails\n        inline bool setCAS(size_t i, IntType oldV, IntType newV)\n        {\n            assert(oldV != getMax() && newV <= getMax() && oldV != newV);\n            bool success = __sync_bool_compare_and_swap(&m_data[i], oldV, newV);\n            return success;\n        }\n\n        //\n        inline IntType get(size_t i) const\n        {\n            return m_data[i];\n        }\n\n        inline static size_t getMax()\n        {\n            static size_t max = std::numeric_limits<IntType>::max();\n            return max;\n        }\n\n        //\n        size_t size() const\n        {\n            return m_data.size();\n        }\n\n    private:\n        //\n        typedef std::vector<IntType> BaseStorageVector;\n        BaseStorageVector m_data;\n};\n\nstatic const uint8_t storage4_offset_mask[]={0xF0,0x0F}; // 11110000, 00001111\nstatic const uint8_t storage4_shift[]={4, 0};\n\n// specialized 4-bit per value base storage for the sparse gap array\nclass SparseBaseStorage4\n{\n    public:\n\n        SparseBaseStorage4() : m_numElems(0) {}\n\n        //\n        void resize(size_t n)\n        {\n            // With 4 bits per entry, we need n / 2 bytes of storage\n            size_t numBytes = ((n & 1) == 0) ? n / 2 : (n / 2) + 1;\n            m_data.resize(numBytes);\n            m_numElems = n;\n        }\n\n        //\n        inline void set(size_t i, uint8_t c)\n        {\n            assert(i < m_numElems);\n            assert(c <= getMax());\n\n            size_t idx = i >> 1; // equivalent to i / 2\n            size_t offset = i & 1; // 0 if even, 1 if odd\n            uint8_t mask = storage4_offset_mask[offset];\n            uint8_t& elem = m_data[idx];\n\n            // Clear current value\n            elem &= ~mask;\n            \n            // Set new value\n            elem |= c << storage4_shift[offset];\n        }\n\n        // Attempt to set the value using an atomic update\n        // Returns false if the update fails\n        inline bool setCAS(size_t i, uint8_t oldV, uint8_t newV)\n        {\n            assert(i < m_numElems);\n            assert(oldV < getMax() && newV <= getMax());\n            assert(oldV != newV);\n            size_t idx = i >> 1; // equivalent to i / 2\n            size_t offset = i & 1; // 0 if even, 1 if odd\n            uint8_t mask = storage4_offset_mask[offset];\n\n            uint8_t oldElem = m_data[idx];\n            \n            // If the count in the stored element has changed since this\n            // function was called, return false\n            uint8_t currV = (oldElem & mask) >> storage4_shift[offset];\n            if(currV != oldV)\n                return false;\n            \n            // Calculate the new element to swap in\n            uint8_t newElem = oldElem;\n            newElem &= ~mask;\n            newElem |= newV << storage4_shift[offset];\n\n            // Perform the update\n            bool success = __sync_bool_compare_and_swap(&m_data[idx], oldElem, newElem);\n            return success;\n        }\n\n        //\n        inline uint8_t get(size_t i) const\n        {\n            assert(i < m_numElems);\n\n            size_t idx = i >> 1; // equivalent to i / 2\n            size_t offset = i & 1; // 0 if even, 1 if odd\n            uint8_t mask = storage4_offset_mask[offset];\n            uint8_t elem = m_data[idx];\n\n            elem &= mask;\n            elem >>= storage4_shift[offset];\n            assert(elem <= getMax());\n            return elem;\n        }\n\n        inline static size_t getMax()\n        {\n            return 15;\n        }\n\n        //\n        size_t size() const\n        {\n            return m_numElems;\n        }\n\n    private:\n        \n        //\n\n        typedef std::vector<uint8_t> BaseStorageVector;\n        BaseStorageVector m_data;\n        size_t m_numElems;\n};\n\n// specialized 1-bit per value base storage for the sparse gap array\n// used for removing entries from an fm-index when the count\n// will not exceed 1.\nclass SparseBaseStorage1\n{\n    public:\n\n        SparseBaseStorage1() : m_numElems(0) {}\n\n        //\n        void resize(size_t n)\n        {\n            m_numElems = n;\n            m_bitVector.resize(n);\n        }\n\n        // Set bit i from oldV to newV using a compare and swap\n        // Returns false if the update fails\n        inline bool setCAS(size_t i, uint8_t oldV, uint8_t newV)\n        {\n            assert(i < m_numElems);\n            assert(oldV == 0);\n            assert(newV == 1);\n            return m_bitVector.updateCAS(i, oldV, newV);\n        }\n\n        //\n        inline void set(size_t i, uint8_t c)\n        {\n            assert(i < m_numElems);\n            assert(c <= getMax());\n\n            m_bitVector.set(i, true);\n        }\n\n        //\n        inline uint8_t get(size_t i) const\n        {\n            assert(i < m_numElems);\n            return m_bitVector.test(i) ? 1 : 0;\n        }\n\n        inline static size_t getMax()\n        {\n            return 1;\n        }\n\n        //\n        size_t size() const\n        {\n            return m_numElems;\n        }\n\n    private:\n        \n        //\n        BitVector m_bitVector;\n        size_t m_numElems;\n};\n\n// The SparseGapArray has two levels of storage.\n// The first level uses x bits to store counts\n// up to 2**x for n elements in the array. \n// If the count for a particular element exceeds 2**x\n// then an entry in the overflow hash table is created\n// allowing arbitrary values to be stored. This\n// class is optimized to allow the base storage to be updated\n// concurrently with compare and swap operations. Any overflowed\n// updates must be serialized though incrementOverflowSerial\n// \ntemplate<class BaseStorage, class OverflowStorage>\nclass SparseGapArray : public GapArray\n{\n    public:\n        SparseGapArray() : m_rankZeroCount(0) {}\n        ~SparseGapArray()\n        {\n            //printf(\"SparseGapArray -- n: %zu overflow: %zu (%lf)\\n\", m_baseStorage.size(), m_overflow.size(), (double)m_overflow.size() / m_baseStorage.size());    \n        }\n\n        //\n        void resize(size_t n)\n        {\n            m_baseStorage.resize(n);\n        }\n\n        // Attempt to increment a value in the GapArray using a compare and swap function\n        // This call can fail to perform the update and return false. In this case\n        // the calling code is responsible for serializing access to this data structure\n        // and calling incrementSerial\n        bool attemptBaseIncrement(size_t i)\n        {\n            assert(i < m_baseStorage.size());\n\n            bool success = false;\n            // Rank zero optimization\n            // When merging two indices, all reads\n            // start at rank 0. This would cause many serial\n            // updates to the overflow array so we optimize \n            // for this case by doing a compare and swap update\n            // of a large integer value if the rank is zero.\n            if(i == 0)\n            {\n                do\n                {\n                    size_t count = m_rankZeroCount;\n                    success = __sync_bool_compare_and_swap(&m_rankZeroCount, count, count+1);\n                }\n                while(!success);\n                return true;\n            }\n\n            success = false;\n            do\n            {\n                size_t count = m_baseStorage.get(i);\n                if(count == getBaseMax())\n                    return false;\n                success = m_baseStorage.setCAS(i, count, count + 1);\n            } while(!success);\n            return success;\n        }\n\n        // Increment the value for rank i in the overflow array. This call must be serialized\n        // between any threads.\n        void incrementOverflowSerial(size_t i)\n        {\n            assert(i != 0);\n            assert(i < m_baseStorage.size());    \n            size_t count = m_baseStorage.get(i);\n            assert(count == getBaseMax());\n            \n            // Check if the overflow map has a value for this index already\n            // if not, enter one\n            if(m_overflow.count(i) == 0)\n                initOverflow(i, count);\n\n            incrementOverflow(i);\n        }\n\n        //\n        void initOverflow(size_t i, OverflowStorage c)\n        {\n            m_overflow.insert(std::make_pair(i, c));\n        }\n\n        //\n        void incrementOverflow(size_t i)\n        {\n            // precondition: there must be an entry in the hash for this key\n            assert(m_overflow.count(i) != 0);\n            ++m_overflow[i];\n        }\n\n        //\n        size_t get(size_t i) const\n        {\n            // rank zero optimization\n            if(i == 0)\n                return m_rankZeroCount;\n\n            size_t count = m_baseStorage.get(i);\n            if(count == getBaseMax())\n            {\n                typename OverflowHash::const_iterator iter = m_overflow.find(i);\n\n                // If there is no entry in the overflow table yet\n                // the count is exactly the maximum value representable\n                // in the base storage\n                if(iter == m_overflow.end())\n                    return count;\n                else\n                    return iter->second;\n            }\n            else\n            {\n                return count;\n            }\n        }\n\n        //\n        size_t getBaseMax() const\n        {\n            return BaseStorage::getMax();\n        }\n\n        //\n        size_t size() const\n        {\n            return m_baseStorage.size();\n        }\n\n   private:\n\n        typedef SparseHashMap<size_t, OverflowStorage> OverflowHash;\n        OverflowHash m_overflow;\n        BaseStorage m_baseStorage;\n        size_t m_rankZeroCount;\n};\n\ntypedef SparseGapArray<SparseBaseStorage1, size_t> SparseGapArray1;\ntypedef SparseGapArray<SparseBaseStorage4, size_t> SparseGapArray4;\ntypedef SparseGapArray<SparseBaseStorage<uint8_t>, size_t> SparseGapArray8;\ntypedef SparseGapArray<SparseBaseStorage<uint16_t>, size_t> SparseGapArray16;\ntypedef SparseGapArray<SparseBaseStorage<uint32_t>, size_t> SparseGapArray32;\n\n#endif\n"
  },
  {
    "path": "src/SGA/SuffixTools/SuffixArray.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SuffixArray - Generalized suffix array\n//\n#include \"SuffixArray.h\"\n#include \"InverseSuffixArray.h\"\n#include \"bucketSort.h\"\n#include \"SuffixCompare.h\"\n#include \"mkqs.h\"\n#include \"SACAInducedCopying.h\"\n#include \"Timer.h\"\n#include \"SAReader.h\"\n#include \"SAWriter.h\"\n#include \"BWTWriter.h\"\n\n// Read a suffix array from a file\nSuffixArray::SuffixArray(const std::string& filename)\n{\n    SAReader reader(filename);\n    reader.read(this);\n}\n\n// Construct the suffix array for a table of reads\nSuffixArray::SuffixArray(const ReadTable* pRT, int numThreads, bool silent)\n{\n    //Timer timer(\"SuffixArray Construction\", silent);\n    saca_induced_copying(this, pRT, numThreads, silent);\n}\n\n// Initialize a suffix array for the strings in RT\nvoid SuffixArray::initialize(const ReadTable& rt)\n{\n    size_t n = rt.countSumLengths() + rt.getCount(); \n    initialize(n, rt.getCount());\n\n    // Fill the data table with the linear ordering of the suffixes\n    size_t count = 0;\n    for(size_t i = 0; i < rt.getCount(); ++i)\n    {\n        // + 1 below is for the empty suffix (is it actually needed?)\n        for(size_t j = 0; j < rt.getRead(i).seq.length() + 1; ++j)\n        {\n            m_data[count++] = SAElem(i, j);\n        }\n    }\n}\n\nvoid SuffixArray::initialize(size_t num_suffixes, size_t num_strings)\n{\n    m_data.resize(num_suffixes);\n    m_numStrings = num_strings;\n}\n\n// Validate the suffix array using the read table\nvoid SuffixArray::validate(const ReadTable* pRT) const\n{\n    size_t maxIdx = pRT->getCount();\n    size_t n = m_data.size();\n\n    // Exit if there is nothing to do\n    if(n == 0)\n        return;\n\n    // Compute the ISA\n    InverseSuffixArray isa(*this);\n\n    // Validate the ISA is a permutation of 1..n, this implies that the id,pos pairs of the SA are valid\n    isa.validate();\n\n    size_t empty_count = 0;\n    // Ensure that the suffix at pos i is lexographically lower than the suffix at i + 1 using the full string\n    for(size_t i = 0; i < n - 1; ++i)\n    {\n        SAElem id1 = m_data[i];\n        SAElem id2 = m_data[i+1];\n\n        assert(id1.getID() < maxIdx);\n        std::string suffix1 = pRT->getRead(id1.getID()).seq.getSuffixString(id1.getPos());\n        std::string suffix2 = pRT->getRead(id2.getID()).seq.getSuffixString(id2.getPos());\n\n        if(suffix1.length() == 1)\n            ++empty_count;\n\n        bool suffixValidated = true;\n        if(suffix1 == suffix2)\n        {\n            suffixValidated = id1.getID() < id2.getID();\n        }\n        else\n        {\n            suffixValidated = suffix1 < suffix2;\n        }\n\n        if(!suffixValidated)\n        {\n            std::cerr << \"Validation failure: \" << suffix1 << \" is not less than \" << suffix2\n                        << \" ids: \" << id1.getID() << \",\" << id2.getID() << \"\\n\";\n            assert(suffix1 < suffix2);\n        }\n    }\n\n    assert(m_numStrings == empty_count);\n}\n\n// \nvoid SuffixArray::removeReads(const NumericIDSet& idSet)\n{\n    // Early exit if the idset is empty\n    if(idSet.empty())\n        return;\n\n    SAElemVector newData;\n    newData.reserve(m_data.size());\n\n    for(size_t idx = 0; idx < m_data.size(); ++idx)\n    {\n        SAElem id = m_data[idx];\n        if(idSet.find(id.getID()) == idSet.end())\n        {\n            // not on the delete list\n            newData.push_back(id);\n        }\n    }\n\n    m_data.swap(newData);\n    m_numStrings -= idSet.size();\n}\n\n\n// Get the suffix cooresponding to idx using the read table\nstd::string SuffixArray::getSuffix(size_t idx, const ReadTable* pRT) const\n{\n    SAElem id = m_data[idx];\n    return pRT->getRead(id.getID()).seq.getSuffixString(id.getPos());\n}\n\n// Return the length of the suffix corresponding to elem \nsize_t SuffixArray::getSuffixLength(const ReadTable* pRT, const SAElem elem) const\n{\n    size_t readLength = pRT->getReadLength(elem.getID());\n    return readLength - elem.getPos();\n}\n\n\n// Print the suffix array\nvoid SuffixArray::print(const ReadTable* pRT) const\n{\n    std::cout << \"i\\tSA(i)\\n\";\n    for(size_t i = 0; i < m_data.size(); ++i)\n    {\n        SAElem id1 = m_data[i];\n        std::string suffix = !id1.isEmpty() ? getSuffix(i, pRT) : \"\";\n        int pos = id1.getPos();\n        char b;\n        if(pos == 0)\n            b = '$';\n        else\n            b =  pRT->getRead(id1.getID()).seq.get(pos - 1);\n        std::cout << i << \"\\t\" << id1 << \"\\t\" << b << \"\\t\" << suffix << \"\\n\";\n    }\n}\n\n// Print the suffix array\nvoid SuffixArray::print() const\n{\n    std::cout << \"i\\tSA(i)\\n\";\n    for(size_t i = 0; i < m_data.size(); ++i)\n    {\n        std::cout << i << \"\\t\" << m_data[i] << \"\\n\";\n    }\n}\n\n// write the suffix array to a file\nvoid SuffixArray::write(const std::string& filename)\n{\n    SAWriter writer(filename);\n    writer.write(this);\n}\n\n// write the suffix array to a file\nvoid SuffixArray::writeBWT(const std::string& filename, const ReadTable* pRT)\n{\n    //RLBWTWriter writer(filename);\n    IBWTWriter* pWriter = BWTWriter::createWriter(filename);\n    pWriter->write(this, pRT);\n    delete pWriter;\n}\n\n// write the index of the suffix array to a file\nvoid SuffixArray::writeIndex(std::string& filename)\n{\n    SAWriter writer(filename);\n    writer.writeHeader(m_numStrings, m_numStrings);\n    for(size_t i = 0; i < m_data.size(); ++i)\n      {\n      if(m_data[i].isFull()) \n\twriter.writeElem(m_data[i]);\n    }\n}\n\n/*template<typename T>\ninline std::vector<T> erase_indices(const std::vector<T>& data, std::vector<size_t>& indicesToDelete)\n{\n  if(indicesToDelete.empty())\n    return data;\n\n  std::vector<T> ret;\n  ret.reserve(data.size() - indicesToDelete.size());\n\n  std::sort(indicesToDelete.begin(), indicesToDelete.end());\n\n  // new we can assume there is at least 1 element to delete. copy blocks at a time.\n  std::vector<T>::const_iterator itBlockBegin = data.begin();\n  for(std::vector<size_t>::const_iterator it = indicesToDelete.begin(); it != indicesToDelete.end(); ++ it)\n    {\n      std::vector<T>::const_iterator itBlockEnd = data.begin() + *it;\n      if(itBlockBegin != itBlockEnd)\n        {\n\t  std::copy(itBlockBegin, itBlockEnd, std::back_inserter(ret));\n        }\n      itBlockBegin = itBlockEnd + 1;\n    }\n\n  // copy last block.\n  if(itBlockBegin != data.end())\n    {\n      std::copy(itBlockBegin, data.end(), std::back_inserter(ret));\n    }\n\n  return ret;\n}*/\n\n//JEREMIAH\nvoid SuffixArray::writeIndex()\n{\n    SAElemVector sae;\n    for(int i = 1; i < m_data.size(); ++i)\n    {\n      if(m_data[i].isFull()) \n        sae.push_back(m_data[i]);\n    }\n\n    m_data = sae;\n}\n\n// Output operator\nstd::ostream& operator<<(std::ostream& out, const SuffixArray& sa)\n{\n    // Write the size and number of strings\n    out << sa.m_data.size() << \"\\n\";\n    out << sa.m_numStrings << \"\\n\";\n\n    for(size_t i = 0; i < sa.m_data.size(); ++i)\n    {\n        out << sa.m_data[i] << \"\\n\";\n    }\n    return out;\n}\n\n\n// Input operator\nstd::istream& operator>>(std::istream& in, SuffixArray& sa)\n{\n    // Read the size and number of strings\n    size_t n;\n    in >> n;\n    in >> sa.m_numStrings;\n\n    sa.m_data.resize(n);\n    size_t i = 0;\n    SAElem id;\n    while(in >> id)\n        sa.m_data[i++] = id;\n    assert(i == n);\n    return in;\n}\n"
  },
  {
    "path": "src/SGA/SuffixTools/SuffixArray.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// SuffixArray - Generalized suffix array\n//\n#ifndef SUFFIXARRAY_H\n#define SUFFIXARRAY_H\n#include \"STCommon.h\"\n#include \"ReadTable.h\"\n#include \"Match.h\"\n\nclass LCPArray;\n\nclass SuffixArray\n{\n    public:\n        \n        //\n        SuffixArray() {}\n        SuffixArray(const std::string& filename);\n        SuffixArray(const ReadTable* pRT, int numThreads, bool silent = false);\n\n        // Construction/Validation functions\n        void initialize(const ReadTable& rt);\n        void initialize(size_t num_suffixes, size_t num_strings);\n        void validate(const ReadTable* pRT) const;\n        void sort(const ReadTable* pRT);\n\n        // Remove all the suffixes from the SA that have an id in idSet\n        void removeReads(const NumericIDSet& idSet);\n\n        // Simple accessors\n        inline const SAElem& get(size_t idx) const { assert(idx < m_data.size()); return m_data[idx]; }\n        inline void set(size_t idx, SAElem e) { m_data[idx] = e; }\n        size_t getSize() const { return m_data.size(); }\n        size_t getNumStrings() const { return m_numStrings; } \n        std::string getSuffix(size_t idx, const ReadTable* pRT) const;\n        size_t getSuffixLength(const ReadTable* pRT, const SAElem elem) const;\n        \n\n        // Operators\n        friend std::ostream& operator<<(std::ostream& out, const SuffixArray& sa);\n        friend std::istream& operator>>(std::istream& in, SuffixArray& sa);\n\n        // Output the entire suffix array\n        void write(const std::string& filename);\n\n        // Write the BWT directly to disk\n        void writeBWT(const std::string& filename, const ReadTable* pRT);\n\n        // Output the suffix array index\n        // The suffix array index are the full-length suffixes (the entire string)\n        // of the suffix array, sorted into lexographical order\n        // The file format is the same as the suffix array\n        // This is used during the BWT indexing and is the only part of the\n        // suffix array that we need\n        void writeIndex(std::string& filename);\n        void writeIndex(); //JEREMIAH\n\n        // Print funcs\n        void print() const;\n        void print(const ReadTable* pRT) const;\n\n        // friends\n        friend void saca_induced_copying(SuffixArray* pSA, const ReadTable* pRT, int numThreads, bool silent);\n        friend class SAReader;\n        friend class SAWriter;\n\n    private:\n        \n        // Data members\n        SAElemVector m_data;\n        size_t m_numStrings;\n};\n\n#endif \n"
  },
  {
    "path": "src/SGA/SuffixTools/SuffixCompare.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SuffixCompareRadix \n//\n#include \"SuffixCompare.h\"\n\n//\nSuffixCompareRadix::SuffixCompareRadix(const ReadTable* pRT) : m_pRT(pRT), m_pNumSuffixLUT(0)\n{\n    m_bucketOffset = 0;\n    m_bucketLen = 6;\n    initializeNumSuffixLUT();\n}\n\n//\nSuffixCompareRadix::SuffixCompareRadix(const ReadTable* pRT, int bucket_len) : m_pRT(pRT),\n                                                                                 m_bucketOffset(0),\n                                                                                 m_bucketLen(bucket_len),\n                                                                                 m_pNumSuffixLUT(0)\n\n{\n    if(m_bucketOffset % m_bucketLen != 0)\n    {\n        std::cerr << \"Error, bucket offset must be a multiple of bucket length\\n\";\n        assert(false);\n    }\n    initializeNumSuffixLUT();\n}\n\n// \nSuffixCompareRadix::~SuffixCompareRadix()\n{\n    delete [] m_pNumSuffixLUT;\n}\n\nvoid SuffixCompareRadix::initializeNumSuffixLUT()\n{\n    m_pNumSuffixLUT = new int[m_bucketLen];\n    for(int i = 0; i < (int)m_bucketLen; ++i)\n    {\n        m_pNumSuffixLUT[i] = calcNumSuffixes(i);\n    }\n}\n\n// Get the bucket for a particular SAElem\nint SuffixCompareRadix::getBucket(SAElem x) const\n{\n    //std::cout << \"Finding bucket for \" << x << \"\\n\";\n    const DNAString& read = m_pRT->getRead(x.getID()).seq;\n\n    size_t suffix_start = x.getPos() + m_bucketOffset;\n    const char* suffix = read.getSuffix(suffix_start);\n    size_t suffix_len = read.getSuffixLength(suffix_start);\n\n    size_t stop = std::min(m_bucketLen, suffix_len);\n\n    int rank = 0;\n    for(size_t i = 0; i < stop; ++i)\n    {\n        char b = suffix[i];\n        rank += numPredSuffixes(b, m_bucketLen - i);\n    }\n\n    return rank;\n}\n\n//\nvoid SuffixCompareRadix::printElem(SAElem& x) const\n{\n    const DNAString& read = m_pRT->getRead(x.getID()).seq;\n    std::cout << x << \" = \" << read.getSuffixString(x.getPos()) << \"\\n\";\n}\n\n//\nvoid SuffixCompareRadix::setBucketDepth(int depth)\n{\n    m_bucketOffset = m_bucketLen * depth;\n}\n\n//\nint SuffixCompareRadix::calcNumSuffixes(int maxLen) const\n{\n    int r = 0;\n    for(int i = 0; i <= maxLen; ++i)\n        r += (1 << 2*i);\n    return r;\n}\n\nbool SuffixCompareRadix::isBucketDegenerate(int index) const\n{\n    if(index == 0)\n        return true;\n    else\n    {\n        for(int i = m_bucketLen; i >= 2; --i)\n        {\n            --index;\n            int block_size = calcNumSuffixes(i - 1);\n            if(index % block_size == 0)\n                return true;\n            else\n            {\n                int block = index / block_size;\n                index -= block * block_size;\n            }\n        }\n    }\n    return false;\n}\n\n//\nint SuffixCompareRadix::getNumBuckets() const\n{\n    return calcNumSuffixes(m_bucketLen);\n}\n\n// Compare two suffixes by ID\n// Precondition: the suffixes are sorted by sequence already\nbool SuffixCompareID::operator()(SAElem x, SAElem y) const\n{ \n    const SeqItem& rx = m_pRT->getRead(x.getID());\n    const SeqItem& ry = m_pRT->getRead(y.getID());\n    return rx.id < ry.id;\n}\n\n\n"
  },
  {
    "path": "src/SGA/SuffixTools/SuffixCompare.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// SuffixCompare - Suffix Comparator classes\n// Used for histogram/bucket sort, mkqs and std::sort\n//\n#ifndef SUFFIXCOMPARE_H\n#define SUFFIXCOMPARE_H\n#include \"STCommon.h\"\n#include \"ReadTable.h\"\n\n// Suffix comparator object for radix-like sorts (bucket/histogram and MKQS)\nclass SuffixCompareRadix\n{\n    public:\n        SuffixCompareRadix(const ReadTable* pRT);\n        SuffixCompareRadix(const ReadTable* pRT, int bucket_len);\n        ~SuffixCompareRadix();\n    \n        //\n        void initializeNumSuffixLUT();\n\n        // Bucket function\n        int getBucket(SAElem x) const;\n\n        // Get the character at position d for the SAElem\n        inline char getChar(SAElem& x, int d) const\n        {\n            return m_pRT->getChar(x.getID(), x.getPos() + d);\n        }\n\n        // Calculate the number of possible suffixes\n        int calcNumSuffixes(int maxLen) const;\n\n        // Get the number of possible suffixes of length maxLen using the lookup table\n        inline int getNumSuffixes(int maxLen) const\n        {\n            return m_pNumSuffixLUT[maxLen];\n        }\n\n        // Get the suffix character string corresponding to this element\n        inline const char* getChrPtr(SAElem& x) const\n        {\n            return m_pRT->getRead(x.getID()).seq.getSuffix(x.getPos());\n        }\n\n        // Calculate the number of suffixes that precede the first instance of b for a \n        // given maximum suffix length\n        inline int numPredSuffixes(char b, int maxLen) const\n        {\n            // base case\n            int rb = getBaseRank(b);\n            if(rb == 0)\n                return 0;\n            int block_size = getNumSuffixes(maxLen - 1);\n            return block_size * (rb - 1) + 1;\n        }\n\n        // Return the number of buckets needed for bucket sort\n        int getNumBuckets() const;\n\n        // Return the bucket offset\n        size_t getBucketOffset() const { return m_bucketOffset; }\n\n        // Get the bucket length\n        size_t getBucketLen() const { return m_bucketLen; }\n\n        // Set the offset\n        void setBucketDepth(int depth);\n\n        // Return true if a bucket is degenerate ie it cannot be subdivided any further\n        bool isBucketDegenerate(int index) const;\n\n\n        // Print the element\n        void printElem(SAElem& x) const;\n\n    private:\n\n        // Disallow default and copy constructor\n        SuffixCompareRadix() {}\n        SuffixCompareRadix(const SuffixCompareRadix& /*other*/) { assert(false); }\n\n        const ReadTable* m_pRT;\n        size_t m_bucketOffset;\n        size_t m_bucketLen;\n        int* m_pNumSuffixLUT;\n};\n\n// Compare two suffixes by their ID\n// This is used for the final pass, after suffixes has been compared by sequence\nclass SuffixCompareID\n{\n    public:\n        SuffixCompareID(const ReadTable* pRT) : m_pRT(pRT) {}\n\n        // Comparator function\n        bool operator()(SAElem x, SAElem y) const;\n\n    private:\n        \n        // default is not accessible\n        SuffixCompareID() : m_pRT(0) {}\n\n        const ReadTable* m_pRT;\n};\n\n// Compare two suffixes by their index in the read table\n// This is used for the final pass, after suffixes has been compared by sequence\nclass SuffixCompareIndex\n{\n    public:\n        SuffixCompareIndex() {}\n\n        // Comparator function\n        inline bool operator()(SAElem x, SAElem y) const\n        {\n            return x.getID() < y.getID();\n        }\n\n    private:\n        \n};\n\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Alphabet.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Alphabet.h - Abstraction of the alphabet\n// that is used in the suffix array, fm-index,\n// etc data structures\n//\n#include \"Alphabet.h\"\n#include <iostream>\n#include <iterator>\n\n// IUPAC alphabet\nbool IUPAC::isUnambiguous(char c)\n{\n    switch(c)\n    {\n        case 'A':\n        case 'C':\n        case 'G':\n        case 'T':\n            return true;\n        default:\n            return false;\n    }\n}\n\n// Returns true if c is a valid ambiguity code\nbool IUPAC::isAmbiguous(char c)\n{\n    switch(c)\n    {\n        case 'M':\n        case 'R':\n        case 'W':\n        case 'S':\n        case 'Y':\n        case 'K':\n        case 'V':\n        case 'H':\n        case 'D':\n        case 'B':\n        case 'N':\n            return true;\n        default:\n            return false;\n    }\n}\n\n// Returns true if c is a valid symbol in this alphabet\nbool IUPAC::isValid(char c)\n{\n    return isUnambiguous(c) || isAmbiguous(c);\n}\n\n//\nstd::string IUPAC::getPossibleSymbols(char c)\n{\n    switch(c)\n    {\n        case 'A':\n            return \"A\";\n        case 'C':\n            return \"C\";\n        case 'G':\n            return \"G\";\n        case 'T':\n            return \"T\";\n        case 'M':\n            return \"AC\";\n        case 'R':\n            return \"AG\";\n        case 'W':\n            return \"AT\";\n        case 'S':\n            return \"CG\";\n        case 'Y':\n            return \"CT\";\n        case 'K':\n            return \"GT\";\n        case 'V':\n            return \"ACG\";\n        case 'H':\n            return \"ACT\";\n        case 'D':\n            return \"AGT\";\n        case 'B':\n            return \"CGT\";\n        case 'N':\n            return \"ACGT\";\n        default:\n            return \"\";\n    }\n}\n\n// AlphaCount\ntemplate<> const size_t AlphaCount8::maxValue = std::numeric_limits<uint8_t>::max();\ntemplate<> const size_t AlphaCount16::maxValue = std::numeric_limits<uint16_t>::max();\ntemplate<> const size_t AlphaCount64::maxValue = std::numeric_limits<uint64_t>::max();\n"
  },
  {
    "path": "src/SGA/Util/Alphabet.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Alphabet.h - Abstraction of the alphabet\n// that is used in the suffix array, fm-index,\n// etc data structures\n//\n#ifndef ALPHABET_H\n#define ALPHABET_H\n\n//#define USE_SSE 1\n//#define ALPHACOUNT_VALIDATE 1\n#include <utility>\n#include <stdint.h>\n#include <limits>\n#include <math.h>\n\n#if USE_SSE\n#include <emmintrin.h>\n#include <xmmintrin.h>\n#endif\n\n#include <iostream>\n#include <iterator>\n#include <algorithm>\n#include \"Util.h\"\n\n//\n// Constants\n//\n// TODO: Refactor these into a namespaced alphabet like DNA_ALPHABET below\nconst uint8_t ALPHABET_SIZE = 5;\nconst char ALPHABET[ALPHABET_SIZE] = {'A', 'C', 'G', 'T', '$'};\nconst char RANK_ALPHABET[ALPHABET_SIZE] = {'$', 'A', 'C', 'G', 'T'};\nconst uint8_t DNA_ALPHABET_SIZE = 4;\ntypedef uint64_t BaseCount;\n\nnamespace DNA_ALPHABET\n{\n    static const uint8_t s_dnaLexoRankLUT[256] = {\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,\n        0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n    };\n\n    inline static uint8_t getBaseRank(char b)\n    {\n        return s_dnaLexoRankLUT[static_cast<uint8_t>(b)];\n    }\n    \n    inline char getBase(size_t idx)\n    {\n        assert(idx < DNA_ALPHABET_SIZE);\n        return ALPHABET[idx];\n    }\n\n    static const uint8_t size = 4;\n};\n\nnamespace BWT_ALPHABET\n{\n    static const uint8_t s_bwtLexoRankLUT[256] = {\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,1,0,2,0,0,0,3,0,0,0,0,0,0,0,0,\n        0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n    };\n\n    static const uint8_t size = 5;\n\n    inline static uint8_t getRank(char b)\n    {\n        return s_bwtLexoRankLUT[static_cast<uint8_t>(b)];\n    }\n    \n    inline char getChar(size_t idx)\n    {\n        return RANK_ALPHABET[idx];\n    }\n};\n\n// IUPAC ambiguity alphabet\nnamespace IUPAC\n{\n    // Returns true if c is [ACGT]\n    bool isUnambiguous(char c);\n\n    // Returns true if c is a valid ambiguity code\n    bool isAmbiguous(char c);\n\n    // Returns true if c is a valid symbol in this alphabet\n    bool isValid(char c);\n\n    // Returns a string defining the possible unambiguous bases for each symbol\n    // in the alphabet\n    std::string getPossibleSymbols(char c);\n};\n\n//\n// A simple class holding the count for each base of a DNA string (plus the terminator)\n// Note that this uses RANK_ALPHABET\ntemplate<typename Storage>\nclass AlphaCount\n{\n    public:\n        //\n        inline AlphaCount()\n        {\n            clear();\n        }\n\n        inline void clear()\n        {\n            memset(m_counts, 0, ALPHABET_SIZE * sizeof(Storage));\n        }\n\n        //\n        inline void set(char b, Storage v)\n        {\n            m_counts[getBaseRank(b)] = v;\n        }\n\n        //\n        inline void setByIdx(size_t i, Storage v)\n        {\n            m_counts[i] = v;\n        }\n\n\n        // \n        inline void increment(char b)\n        {\n            int br = getBaseRank(b);\n#ifdef ALPHACOUNT_VALIDATE\n            assert(m_counts[br] != maxValue);\n#endif\n            m_counts[br]++;\n        }\n\n        //\n        inline void add(char b, Storage v)\n        {\n            int br = getBaseRank(b);\n#ifdef ALPHACOUNT_VALIDATE\n            assert(m_counts[br] + v <= maxValue);\n#endif\n            m_counts[br] += v;\n        }\n\n        //\n        inline void subtract(char b, Storage v)\n        {\n            int br = getBaseRank(b);\n#ifdef ALPHACOUNT_VALIDATE\n            assert(m_counts[br] > v);\n#endif            \n            m_counts[br] -= v;\n        }\n\n        // \n        inline Storage get(char b) const\n        {\n            return m_counts[getBaseRank(b)];\n        }\n\n        //\n        inline Storage getByIdx(const int i) const\n        {\n            return m_counts[i];\n        }\n\n        // Return the base for index i\n        static char getBase(size_t i)\n        {\n            return RANK_ALPHABET[i];\n        }\n        \n        // Return the maximum possible count for a symbol\n        static size_t getMaxValue()\n        {\n            return maxValue;\n        }\n\n        // Swap the (A,T) and (C,G) entries, which turns the AlphaCount\n        // into the AlphaCount for the complemented sequence\n        inline void complement()\n        {\n            Storage tmp;\n\n            // A,T\n            tmp = m_counts[4];\n            m_counts[4] = m_counts[1];\n            m_counts[1] = tmp;\n\n            // C,G\n            tmp = m_counts[3];\n            m_counts[3] = m_counts[2];\n            m_counts[2] = tmp;\n        }\n\n        // Return the sum of the basecounts for characters lexo. lower than b\n        inline size_t getLessThan(char b) const\n        {\n            size_t out = 0;\n            int stop = getBaseRank(b);\n            for(int i = 0; i < stop; ++i)\n                out += m_counts[i];\n            return out;\n        }\n\n        // Returns the number of non-zero counts\n        uint8_t getNumNonZero() const\n        {\n            uint8_t count = 0;\n            for(int i = 0; i < ALPHABET_SIZE; ++i)\n            {\n                if(m_counts[i] > 0)\n                    count += 1;\n            }\n            return count;\n        }\n\n        // Returns true if only one of the DNA characters\n        // has a non-zero count\n        inline bool hasUniqueDNAChar()\n        {\n            // index 0 is the '$' character, which we skip\n            bool nonzero = false;\n            for(int i = 1; i < ALPHABET_SIZE; ++i)\n            {\n                if(m_counts[i] > 0)\n                {\n                    // if nonzero is set, there is some other nonzero character, return false\n                    if(nonzero)\n                        return false;\n                    else\n                        nonzero = true;\n                }\n            }\n            return nonzero;\n        }\n\n        // Returns true if any DNA char \n        // has a non-zero count\n        inline bool hasDNAChar()\n        {\n            // index 0 is the '$' character, which we skip\n            for(int i = 1; i < ALPHABET_SIZE; ++i)\n            {\n                if(m_counts[i] > 0)\n                    return true;\n            }\n            return false;\n        }\n\n        //\n        inline char getMaxBase() const\n        {\n            char base;\n            Storage val;\n            getMax(base, val);\n            return base;\n        }\n\n        // \n        inline char getMaxDNABase() const\n        {\n            Storage max = 0;\n            int maxIdx = 0;\n            for(int i = 1; i < ALPHABET_SIZE; ++i)\n            {\n                if(m_counts[i] > max)\n                {\n                    max = m_counts[i];\n                    maxIdx = i;\n                }\n            }\n\n            assert(max > 0);\n            return RANK_ALPHABET[maxIdx];\n        }\n        //\n        inline Storage getMaxCount() const\n        {\n            char base;\n            Storage val;\n            getMax(base, val);\n            return val;\n        }\n\n        //\n        inline void getMax(char& base, Storage& val) const\n        {\n            Storage max = 0;\n            int maxIdx = 0;\n            for(int i = 0; i < ALPHABET_SIZE; ++i)\n            {\n                if(m_counts[i] > max)\n                {\n                    max = m_counts[i];\n                    maxIdx = i;\n                }\n            }\n            base = RANK_ALPHABET[maxIdx];\n            val = max;\n        }\n\n        //\n        inline size_t getSum() const\n        {\n            size_t sum = m_counts[0];\n            sum += m_counts[1];\n            sum += m_counts[2];\n            sum += m_counts[3];\n            sum += m_counts[4];\n            return sum;\n        }\n\n        // Sort the DNA bases into count order and\n        // write them to pOut. This does not include the '$' symbol\n        inline void getSorted(char* pOut, size_t len) const\n        {\n            assert(len >= ALPHABET_SIZE);\n            (void)len;\n            for(size_t i = 0; i < ALPHABET_SIZE; ++i)\n                pOut[i] = RANK_ALPHABET[i];\n            std::sort(pOut, pOut+ALPHABET_SIZE, AlphaCountCompareDesc(this));\n        }\n\n        // Return the unique DNA character described by the alphacount\n        // Returns '$' if no such character exists\n        // Asserts if more than one character is described by the alphacount\n        inline char getUniqueDNAChar()\n        {\n            char r = '$';\n            for(int i = 1; i < ALPHABET_SIZE; ++i)\n            {\n                if(m_counts[i] > 0)\n                {\n                    assert(r == '$');\n                    // lookup the character in the ranked alphabet, since the elements\n                    // are stored in lexographic order\n                    r = RANK_ALPHABET[i];\n                }\n            }\n            return r;\n        }\n\n        // Operators\n        friend std::ostream& operator<<(std::ostream& out, const AlphaCount<Storage>& ac)\n        {\n            std::copy(ac.m_counts, ac.m_counts+ALPHABET_SIZE, std::ostream_iterator<Storage>(out, \" \"));\n            return out;\n        }\n\n        friend std::istream& operator>>(std::istream& in, AlphaCount<Storage>& ac)\n        {\n            for(size_t i = 0; i < ALPHABET_SIZE; ++i)\n                in >> ac.m_counts[i];\n            return in;\n        }\n        \n        inline friend AlphaCount operator+(const AlphaCount<Storage>& left, const AlphaCount<Storage>& right)\n        {\n            AlphaCount out;\n            out.m_counts[0] = left.m_counts[0] + right.m_counts[0];\n            out.m_counts[1] = left.m_counts[1] + right.m_counts[1];\n            out.m_counts[2] = left.m_counts[2] + right.m_counts[2];\n            out.m_counts[3] = left.m_counts[3] + right.m_counts[3];\n            out.m_counts[4] = left.m_counts[4] + right.m_counts[4];\n            return out;\n        }\n\n        inline AlphaCount& operator+=(const AlphaCount& other)\n        {\n\n            m_counts[0] += other.m_counts[0];\n            m_counts[1] += other.m_counts[1];\n            m_counts[2] += other.m_counts[2];\n            m_counts[3] += other.m_counts[3];\n            m_counts[4] += other.m_counts[4];\n            return *this;\n        }\n\n        // Specialization for add/subtracing a small AlphaCount to/from a large alphacount\n        inline friend void alphacount_add(AlphaCount<uint64_t>& lhs, const AlphaCount<uint8_t>& rhs);\n        inline friend void alphacount_subtract(AlphaCount<uint64_t>& lhs, const AlphaCount<uint8_t>& rhs);\n        inline friend void alphacount_add16(AlphaCount<uint64_t>& lhs, const AlphaCount<uint16_t>& rhs);\n        inline friend void alphacount_subtract16(AlphaCount<uint64_t>& lhs, const AlphaCount<uint16_t>& rhs);\n\n        // As the counts are unsigned integers, each value in left\n        // must be larger or equal to value in right. The calling function\n        // must guarentee this.\n        friend AlphaCount operator-(const AlphaCount& left, const AlphaCount& right)\n        {\n            AlphaCount out;\n            out.m_counts[0] = left.m_counts[0] - right.m_counts[0];\n            out.m_counts[1] = left.m_counts[1] - right.m_counts[1];\n            out.m_counts[2] = left.m_counts[2] - right.m_counts[2];\n            out.m_counts[3] = left.m_counts[3] - right.m_counts[3];\n            out.m_counts[4] = left.m_counts[4] - right.m_counts[4];\n            return out;\n        }\n\n        inline friend bool operator==(const AlphaCount& left, const AlphaCount& right)\n        {\n            return left.m_counts[0] == right.m_counts[0] && left.m_counts[1] == right.m_counts[1] &&\n                   left.m_counts[2] == right.m_counts[2] && left.m_counts[3] == right.m_counts[3] &&\n                   left.m_counts[4] == right.m_counts[4];   \n        }\n        \n        inline friend bool operator!=(const AlphaCount& left, const AlphaCount& right)\n        {\n            return !(left == right);\n        }\n                \n\n    private:\n        Storage m_counts[ALPHABET_SIZE];\n        const static size_t maxValue;\n\n        struct AlphaCountCompareDesc\n        {\n            AlphaCountCompareDesc(const AlphaCount* p) : pAC(p) {}\n            bool operator()(char a, char b)\n            {\n                return pAC->get(a) > pAC->get(b);\n            }\n            const AlphaCount* pAC;\n        };\n\n};\n\n// Typedef commonly used AlphaCounts\ntypedef AlphaCount<uint64_t> AlphaCount64;\ntypedef AlphaCount<uint16_t> AlphaCount16;\ntypedef AlphaCount<uint8_t> AlphaCount8;\n\n//\ninline void alphacount_add16(AlphaCount64& lhs, const AlphaCount16& rhs)\n{\n    lhs.m_counts[0] += rhs.m_counts[0];\n    lhs.m_counts[1] += rhs.m_counts[1];\n    lhs.m_counts[2] += rhs.m_counts[2];\n    lhs.m_counts[3] += rhs.m_counts[3];\n    lhs.m_counts[4] += rhs.m_counts[4];\n}\n\ninline void alphacount_subtract16(AlphaCount64& lhs, const AlphaCount16& rhs)\n{\n    // This function should only be used when lhs is larger the rhs\n    // the calling function must guarentee this\n    lhs.m_counts[0] -= rhs.m_counts[0];\n    lhs.m_counts[1] -= rhs.m_counts[1];\n    lhs.m_counts[2] -= rhs.m_counts[2];\n    lhs.m_counts[3] -= rhs.m_counts[3];\n    lhs.m_counts[4] -= rhs.m_counts[4];\n}\n\n//\ninline void alphacount_add(AlphaCount64& lhs, const AlphaCount8& rhs)\n{\n    lhs.m_counts[0] += rhs.m_counts[0];\n    lhs.m_counts[1] += rhs.m_counts[1];\n    lhs.m_counts[2] += rhs.m_counts[2];\n    lhs.m_counts[3] += rhs.m_counts[3];\n    lhs.m_counts[4] += rhs.m_counts[4];\n}\n\ninline void alphacount_subtract(AlphaCount64& lhs, const AlphaCount8& rhs)\n{\n    // This function should only be used when lhs is larger the rhs\n    // the calling function must guarentee this\n    lhs.m_counts[0] -= rhs.m_counts[0];\n    lhs.m_counts[1] -= rhs.m_counts[1];\n    lhs.m_counts[2] -= rhs.m_counts[2];\n    lhs.m_counts[3] -= rhs.m_counts[3];\n    lhs.m_counts[4] -= rhs.m_counts[4];\n}\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/BWT4Codec.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWT4Codec - Encoder/decoder for a BWT\n// string over the alphabet $ACGT using 4\n// bits per symbol\n//\n#ifndef BWT4CODEC_H\n#define BWT4CODEC_H\n\n#include \"Alphabet.h\"\n\nstatic const uint8_t bwt4_offset_mask[]={0xF0,0x0F};\nstatic const uint8_t  bwt4_offset_shift[]={4, 0};\n\nclass BWT4Codec\n{\n    public:\n        // The data is stored 2 characters per byte\n        // The data pattern is:\n        // 11110000 first symbol\n        // 00001111 second symbol\n        typedef uint8_t UNIT_TYPE;\n        static const int SYMBOLS_PER_UNIT = 2;\n\n        // Encoded the character b into a value\n        inline uint8_t encode(char b) const\n        {\n            return BWT_ALPHABET::getRank(b);\n        }\n\n        // Decode the value c into a character\n        inline char decode(uint8_t c) const\n        {\n            return BWT_ALPHABET::getChar(c);\n        }\n\n        // Returns the number of units required to encode\n        // a string of length n\n        inline size_t getRequiredUnits(size_t n) const\n        {\n            return (n + SYMBOLS_PER_UNIT - 1) / SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the number of symbols that can be stored\n        // in n units\n        inline size_t getCapacity(size_t n) const\n        {\n            return n * SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the index of the unit to store the\n        // i-th symbol of the string\n        inline size_t getUnitIndex(const size_t& i) const\n        {\n            return i >> 1; // equivalent to i / 2\n        }\n\n        // Returns the position within a unit that the i-th symbol \n        // should be stored in\n        inline size_t getUnitOffset(const size_t& i) const\n        {\n            // this position is the k-th symbol of the unit\n            return i & 1; // equivalent to i % 2\n        }\n\n        // Return the amount that a value must be shifted to\n        // store a code at a given offset\n        inline uint8_t getOffsetShift(size_t offset) const\n        {\n            return 4*(1 - offset);\n        }\n\n        // Store the value v at the i-th encoded position in the data array\n        inline void store(UNIT_TYPE* pData, size_t i, char b) const\n        {\n            UNIT_TYPE& unit = pData[getUnitIndex(i)];\n            size_t offset = getUnitOffset(i);\n            uint8_t shift = bwt4_offset_shift[offset];\n            \n            // Clear the currrent position\n            uint16_t mask = bwt4_offset_mask[offset];\n            unit &= ~mask;\n\n            // Set position\n            UNIT_TYPE code = encode(b);\n            code <<= shift;\n            unit |= code; \n        }\n\n        // get the character stored at position i\n        inline char get(const UNIT_TYPE* pData, const size_t& i) const\n        {\n            const UNIT_TYPE& unit = pData[getUnitIndex(i)];\n            size_t offset = getUnitOffset(i);\n            uint16_t mask = bwt4_offset_mask[offset];\n            UNIT_TYPE code = unit & mask;\n            uint8_t shift = bwt4_offset_shift[offset];\n            code >>= shift;\n            return decode(code);\n        }\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/BWTCodec.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BWTCodec - Encoder/decoder for a BWT\n// string over the alphabet $ACGT using\n// 3 bits per symbol\n//\n#ifndef BWTCODEC_H\n#define BWTCODEC_H\n\n#include \"Alphabet.h\"\n\nstatic const uint16_t bwt_offset_mask[]={0xE000,0x1C00,0x0380,0x0070,0x000E};\nstatic const uint8_t  bwt_offset_shift[]={13, 10, 7, 4, 1};\n\nclass BWTCodec\n{\n    public:\n        // The data is stored 5 characters per uint16_t\n        // The data pattern is:\n        // 11100000 00000000 first symbol\n        // 00011100 00000000 second symbol, etc\n        typedef uint16_t UNIT_TYPE;\n        static const int SYMBOLS_PER_UNIT = 5;\n\n        // Encoded the character b into a value\n        inline uint8_t encode(char b) const\n        {\n            return BWT_ALPHABET::getRank(b);\n        }\n\n        // Decode the value c into a character\n        inline char decode(uint8_t c) const\n        {\n            return BWT_ALPHABET::getChar(c);\n        }\n\n        // Returns the number of units required to encode\n        // a string of length n\n        inline size_t getRequiredUnits(size_t n) const\n        {\n            return (n + SYMBOLS_PER_UNIT - 1) / SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the number of symbols that can be stored\n        // in n units\n        inline size_t getCapacity(size_t n) const\n        {\n            return n * SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the index of the unit to store the\n        // i-th symbol of the string\n        inline size_t getUnitIndex(size_t i) const\n        {\n            return i / SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the position within a unit that the i-th symbol \n        // should be stored in\n        inline size_t getUnitOffset(size_t i) const\n        {\n            // this position is the k-th symbol of the unit\n            return i % SYMBOLS_PER_UNIT;\n        }\n\n        // Return the amount that a value must be shifted to\n        // store a code at a given offset\n        inline uint8_t getOffsetShift(size_t offset) const\n        {\n            return 1 + 3*(4 - offset);\n        }\n\n        // Store the value v at the i-th encoded position in the data array\n        inline void store(UNIT_TYPE* pData, size_t i, char b) const\n        {\n            UNIT_TYPE& unit = pData[getUnitIndex(i)];\n            size_t offset = getUnitOffset(i);\n            uint8_t shift = getOffsetShift(offset);\n            \n            // Clear the currrent position\n            uint16_t mask = bwt_offset_mask[offset];\n            unit &= ~mask;\n\n            // Set position\n            UNIT_TYPE code = encode(b);\n            code <<= shift;\n            unit |= code; \n        }\n\n        // get the character stored at position i\n        inline char get(const UNIT_TYPE* pData, size_t i) const\n        {\n            const UNIT_TYPE& unit = pData[getUnitIndex(i)];\n            size_t offset = getUnitOffset(i);\n            uint16_t mask = bwt_offset_mask[offset];\n            UNIT_TYPE code = unit & mask;\n            uint8_t shift = bwt_offset_shift[offset];\n            code >>= shift;\n            return decode(code);\n        }\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Bamreader.cpp",
    "content": "#include \"bamreader.h\"\n\nbool Bamreader::bamToSeqRecordVector(SeqRecordVector &srv) {\n \n  if (!m_reader.Open(m_bam) || !reader.SetRegion(m_region)) \n    return false;\n\n  BamTools::BamAlignment a;\n\n  while (m_reader.GetNextAlignment())\n\n}\n\nbool Bamreader::findBamIndex() {\n\n  m_bai = m_bam.substr(0, m_bam.size()-3.append(\"bai\"));\n  return m_reader.OpenIndex(m_bai);\n\n}\n\nbool Bamreader::setBamRegion(int refid1, int refid2, int pos1, int pos2);\n"
  },
  {
    "path": "src/SGA/Util/BitChar.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BitChar - Fixed-size bitset of 8 bits\n//\n\n#include <iostream>\n#include <assert.h>\n#include \"BitChar.h\"\n\nstatic unsigned char bc_mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};\n\n//\nvoid BitChar::set(unsigned char idx, bool v)\n{\n    if(v)\n        m_data = m_data | bc_mask[idx];\n    else\n        m_data = m_data & ~bc_mask[idx];\n}\n\n//\nbool BitChar::test(unsigned char idx) const\n{\n    return m_data & bc_mask[idx];\n}\n\n//\nvoid BitChar::flip(unsigned idx)\n{\n    m_data = m_data ^ bc_mask[idx];\n}\n\n//\nvoid printBinary(std::ostream& out, const BitChar& bc)\n{\n    for(int i = 7; i >= 0; i--)\n    {\n        if(bc.test(i))\n            out << \"1\";\n        else\n            out << \"0\";\n    }\n}\n\n// Update the value of bit idx from oldValue to newValue using an atomic compare and swap operation\n// Returns true if the update was successfully performed.\nbool BitChar::updateCAS(unsigned char idx, bool oldValue, bool newValue)\n{\n    assert(oldValue != newValue);\n    \n    // Iterate attempts of the CAS operation until the desired bit has the correct value.\n    while(1)\n    {\n        // Get the current value of the data. \n        // If any thread updates d after this call the CAS will fail.\n        unsigned char oldData = m_data;\n        \n        // Check if the bit is already set to newValue in our copy of the data. If so,\n        // some other thread must have updated the value already so we return false.\n        bool currValue = (oldData & bc_mask[idx]);\n        if(currValue == newValue)\n            return false;\n\n        // Calculate the value of the data with the bit set to the correct value\n        unsigned char newData;\n        if(newValue)\n            newData = oldData | bc_mask[idx]; //set the bit\n        else\n            newData = oldData & ~bc_mask[idx]; //clear the bit\n\n        // perform the atomic CAS. this returns false if the real value of d does not match oldData\n        bool success = __sync_bool_compare_and_swap(&m_data, oldData, newData);\n\n        // If the update was successfully performed, return true.\n        // Otherwise, some other thread must have updated a bit in this char so we iterate again.\n        if(success)\n            return true;\n    }\n}\n\n//\nstd::ostream& operator<<(std::ostream& out, const BitChar& bc)\n{\n    int temp = bc.m_data;\n    out << temp;\n    return out;\n}\n\n//\nstd::istream& operator>>(std::istream& in, BitChar& bc)\n{\n    int temp;\n    in >> temp;\n    bc.m_data = (unsigned char)temp;\n    return in;\n}\n\n// \nvoid BitChar::write(std::ostream& out)\n{\n    out.write((char*)&m_data, sizeof(m_data));\n}\n\n//\nvoid BitChar::read(std::istream& in)\n{\n    in.read((char*)&m_data, sizeof(m_data));\n}\n"
  },
  {
    "path": "src/SGA/Util/BitChar.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// BitChar - Fixed-size bitset of 8 bits\n//\n#ifndef BITCHAR_H\n#define BITCHAR_H\n\n#include <iostream>\n\nstruct BitChar\n{\n    public:\n        BitChar() : m_data(0) {}\n        \n        // Update the value of bit idx from oldValue to newValue using an atomic compare and swap operation\n        // Returns true if the update was successfully performed. This is the only thread-safe way to update the BitChar\n        bool updateCAS(unsigned char idx, bool oldValue, bool newValue);\n\n        // set the bit at idx to the value u\n        void set(unsigned char idx, bool v);\n\n        // returns true if bit at idx is set\n        bool test(unsigned char idx) const;\n\n        // flips the bit at idx\n        void flip(unsigned idx);\n\n        // I/O\n        friend std::ostream& operator<<(std::ostream& out, const BitChar& bc);\n        friend std::istream& operator>>(std::istream& in, BitChar& bc);\n\n        void write(std::ostream& out);\n        void read(std::istream& in);\n\n    private:\n        volatile unsigned char m_data;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/BitVector.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// BitVector - Vector of bits \n//\n#include \"BitVector.h\"\n#include <assert.h>\n#include <cstdlib>\n\n//\nBitVector::BitVector()\n{\n    initializeMutex();\n}\n\n//\nBitVector::BitVector(size_t n)\n{\n    initializeMutex();\n    resize(n);\n}\n\nvoid BitVector::initializeMutex()\n{\n    int ret = pthread_mutex_init(&m_mutex, NULL);\n    if(ret != 0)\n    {\n        std::cerr << \"Mutex initialization in BitVector failed with error \" << ret << \", aborting\" << std::endl;\n        exit(EXIT_FAILURE);\n    }\n}\n\n//\nBitVector::~BitVector()\n{\n    int ret = pthread_mutex_destroy(&m_mutex);\n    if(ret != 0)\n    {\n        std::cerr << \"Mutex destruction in BitVector failed with error \" << ret << \", aborting\" << std::endl;\n        exit(EXIT_FAILURE);\n    }\n}\n\n//\nvoid BitVector::resize(size_t n)\n{\n    size_t num_bytes = (n % 8 == 0) ? n / 8 : (n / 8) + 1;\n    m_data.resize(num_bytes);\n}\n\n//\nvoid BitVector::lock()\n{\n    pthread_mutex_lock(&m_mutex);\n}\n\n//\nvoid BitVector::unlock()\n{\n    pthread_mutex_unlock(&m_mutex);\n}\n\n//\nbool BitVector::updateCAS(size_t i, bool oldValue, bool newValue)\n{\n    size_t byte = i / 8;\n    assert(byte < m_data.size());\n    size_t offset = i - byte * 8;\n    return m_data[byte].updateCAS(offset, oldValue, newValue);\n}\n\n\n// Set bit at position i to value v\nvoid BitVector::set(size_t i, bool v)\n{\n    size_t byte = i / 8;\n    assert(byte < m_data.size());\n    size_t offset = i - byte * 8;\n    m_data[byte].set(offset, v);\n}\n\n// Test bit i\nbool BitVector::test(size_t i) const\n{\n    size_t byte = i / 8;\n    size_t offset = i - byte * 8;\n    return m_data[byte].test(offset);\n}\n\n"
  },
  {
    "path": "src/SGA/Util/BitVector.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// BitVector - Vector of bits. The structure\n// can be locked by a mutex to guarentee atomic access.\n//\n#ifndef BITVECTOR_H\n#define BITVECTOR_H\n\n#include \"BitChar.h\"\n#include <vector>\n\nclass BitVector\n{\n    public:\n    \n        BitVector();\n        BitVector(size_t n);\n        ~BitVector();\n\n        // Functions to acquire/release the mutex\n        // The client code is responsible for acquiring\n        // the lock before calling set(). Reading a bit with \n        // test() is ok however.\n        void lock();\n        void unlock();\n\n        // Update the bit at position i from oldValue to newValue using a\n        // compare and swap operation. Returns true if the update is successful.\n        bool updateCAS(size_t i, bool oldValue, bool newValue);\n\n        void resize(size_t n);\n        void set(size_t i, bool v);\n        bool test(size_t i) const;\n\n        size_t capacity() const { return m_data.size() * 8; }\n\n    private:\n\n        void initializeMutex();\n\n        std::vector<BitChar> m_data;\n        pthread_mutex_t m_mutex;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/BloomFilter.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n#include \"BloomFilter.h\"\n#include <cstdlib>\n#include <assert.h>\n#include <stdio.h>\n#include \"MurmurHash3.h\"\n\n//\nBloomFilter::BloomFilter() : m_occupancy(0)\n{\n\n#if TRACK_OCCUPANCY\n    m_test_counter = 0;\n#endif\n\n}\n\n//\nvoid BloomFilter::initialize(size_t width, size_t num_hashes)\n{\n    m_width = width;\n    m_bitvector.resize(width);\n    m_occupancy = 0;\n\n    // Create seeds for murmer hash\n    // TODO: Check how independent this method of selecting\n    // hash function is...\n    m_hashes.resize(num_hashes);\n    for(size_t i = 0; i < m_hashes.size(); ++i)\n        m_hashes[i] = rand();\n}\n\n//\nvoid BloomFilter::add(const void* key, int num_bytes)\n{\n    // Set h bits\n    for(size_t i = 0; i < m_hashes.size(); ++i) {\n        int64_t h[2];\n        MurmurHash3_x64_128(key, num_bytes, m_hashes[i], &h);\n        size_t idx = h[0] % m_width;\n\n        bool was_set = m_bitvector.updateCAS(idx, false, true);\n#if TRACK_OCCUPANCY\n        // This call uses an atomic update and returns true if the\n        // bit was sucessfully set\n        if(was_set)\n        {\n            // A bit was set, update the occupancy\n            bool set = false;\n            do {\n                size_t old_occ = m_occupancy;\n                size_t new_occ = old_occ + 1;\n                set = __sync_bool_compare_and_swap(&m_occupancy, old_occ, new_occ);\n            } while(!set);\n        }\n#else\n        (void)was_set;\n#endif\n    }\n}\n\n//\nbool BloomFilter::test(const void* key, int num_bytes) const\n{\n    for(size_t i = 0; i < m_hashes.size(); ++i) {\n        int64_t h[2];\n        MurmurHash3_x64_128(key, num_bytes, m_hashes[i], &h);\n        size_t idx = h[0] % m_width;\n        if(!m_bitvector.test(idx))\n            return false;\n    }\n\n#if TRACK_OCCUPANCY\n    m_test_counter++;\n    if(m_test_counter % 500000 == 0) {\n        double p = (double)m_occupancy / m_width;\n        printf(\"WIDTH: %zu OCC: %zu\\n\", m_width, m_occupancy);\n        printf(\"Access: %zu Occupancy: %zu P: %1.4lf\\n\", m_test_counter, m_occupancy, p);\n    }\n#endif\n    return true;\n}\n\n//\nvoid BloomFilter::printOccupancy() const\n{\n    size_t set_count = 0;\n    for(size_t i = 0; i < m_width; ++i)\n        set_count += m_bitvector.test(i);\n    printf(\"%zu out of %zu bits are set\\n\", set_count, m_width);\n}\n\n//\nvoid BloomFilter::printMemory() const\n{\n    size_t bytes = m_bitvector.capacity();\n    double mb = (double)bytes / (1 << 20);\n    printf(\"BloomFilter using %.1lf MB\\n\", mb);\n}\n"
  },
  {
    "path": "src/SGA/Util/BloomFilter.h",
    "content": "//-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n#ifndef BLOOM_FILTER_H\n#define BLOOM_FILTER_H\n\n#include <vector>\n#include <stdint.h>\n#include <stddef.h>\n#include <limits>\n#include \"BitVector.h\"\n\n//#define TRACK_OCCUPANCY 1\n\nclass BloomFilter\n{\n    public:\n\n        /**\n        * @brief Default constructor.\n        */\n        BloomFilter();\n        BloomFilter(size_t width, size_t num_hashes) { initialize(width, num_hashes); }\n\n        /**\n        * @brief Initialize the bloom filter.\n        *\n        * @param width       The number of bits to use\n        * @param num_hashes  The number of hashes to use\n        */\n        void initialize(size_t width, size_t num_hashes);\n\n        /**\n        * @brief Add an object to the collection\n        *\n        * @param key        A pointer to the key data\n        * @param num_bytes  The number of bytes to read from the key\n        */\n        void add(const void* key, int num_bytes);\n\n        /**\n        * @brief Test whether an object is in the collection\n        *\n        * @param key         A pointer to the key data\n        * @param num_bytes   The number of bytes to read from the key\n        *\n        * @return            true if the object is in the bloom filter\n        */\n        bool test(const void* key, int num_bytes) const;\n\n        /**\n        * @brief Print the amount of memory used to stdout\n        */\n        void printMemory() const;\n\n        /**\n        * @brief Count how many bits are set and print to stdout\n        */\n        void printOccupancy() const;\n\n    private:\n        BitVector m_bitvector;\n        std::vector<uint32_t> m_hashes;\n        size_t m_width;\n        size_t m_occupancy;\n#if TRACK_OCCUPANCY\n        mutable size_t m_test_counter;\n#endif\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/ClusterReader.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ClusterReader - Read in a file of read clusters.\n// This class conforms to the interface needed\n// for the SequenceProcessFramework concurrency lib\n//\n#include \"ClusterReader.h\"\n#include \"Util.h\"\n\n//\nClusterReader::ClusterReader(const std::string& filename) : m_numConsumedLast(0), m_numConsumedTotal(0)\n{\n    m_pReader = createReader(filename);\n}\n\nClusterReader::~ClusterReader()\n{\n    delete m_pReader;\n}\n\n// Read a cluster from the file and write its members\n// to out. Returns false if the read failed\nbool ClusterReader::generate(ClusterVector& out)\n{\n    out.clear();\n\n    // Read a single cluster from the file.\n    ClusterRecord record;\n    bool good = readCluster(record);\n\n    // Read failed, return false\n    if(!good)\n        return false;\n\n    out.push_back(record);\n\n    // Read the remaining records for this cluster\n    int remaining = record.numElements - 1;\n    for(int i = 0; i < remaining; ++i)\n    {\n        bool good = readCluster(record);\n        if(!good)\n        {\n            std::cerr << \"Error: expected \" << remaining + 1 << \" elements in the cluster but only read \" << i+1 << \"\\n\";\n            exit(1);\n        }\n\n        if(record.clusterID != out.front().clusterID)\n        {\n            std::cerr << \"Error: cluster names do not match! \" << record.clusterID << \" != \" << out.front().clusterID << \"\\n\";\n            exit(1);\n        }\n        out.push_back(record);\n    }\n\n    m_numConsumedLast = 1;\n    m_numConsumedTotal += 1;\n\n    return true;\n}\n\n//\nbool ClusterReader::readCluster(ClusterRecord& record)\n{\n    std::string line;\n    bool good = getline(*m_pReader, line).good();\n    if(!good || line.empty())\n        return false;\n    std::stringstream parser(line);\n    parser >> record.clusterID;\n    parser >> record.numElements;\n    parser >> record.readID;\n    parser >> record.sequence;\n\n    if(record.clusterID.empty() || record.numElements == 0 || record.readID.empty() || record.sequence.empty())\n    {\n        std::cerr << \"Could not parse cluster record from line: \" << line << \"\\n\";\n        exit(1);\n    }\n    return true;\n}\n\n"
  },
  {
    "path": "src/SGA/Util/ClusterReader.h",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ClusterReader - Read in a file of read clusters.\n// This class conforms to the interface needed\n// for the SequenceProcessFramework concurrency lib\n//\n#ifndef CLUSTER_READER_H\n#define CLUSTER_READER_H\n\n#include <string>\n#include <iostream>\n#include <vector>\n\nstruct ClusterRecord\n{\n    std::string clusterID;\n    int numElements;\n    std::string readID;\n    std::string sequence;\n};\ntypedef std::vector<ClusterRecord> ClusterVector;\n\nclass ClusterReader\n{\n    public:\n        ClusterReader(const std::string& filename);\n        ~ClusterReader();\n\n        // Read in a cluster from the file and write the records\n        // to out. Returns true if a cluster was successfully read.\n        bool generate(ClusterVector& out);\n        bool readCluster(ClusterRecord& record);\n\n        // Functions to determine the progress of the read\n        inline size_t getConsumedLast() const { return m_numConsumedLast; }\n        inline size_t getNumConsumed() const { return m_numConsumedTotal; }\n        \n    private:\n\n        std::istream* m_pReader;\n        size_t m_numConsumedLast;\n        size_t m_numConsumedTotal;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Contig.cpp",
    "content": "#include \"Contig.h\"\n\n//\n// Statics\n//\nstatic const char* IDFIELD = \"ID\";\nstatic const char* LENFIELD = \"LN\";\nstatic const char* COVFIELD = \"CV\";\nstatic const char* SEQFIELD = \"SQ\";\nstatic const char* UNQFIELD = \"UN\";\nstatic const char* ANTFIELD = \"AN\";\n\nContig::Contig() :    m_length(0), \n                    m_coverage(0.0f), \n                    m_uniqueFlag(UF_UNKNOWN) {}\n\n//\n//\n//\nstd::istream& readFasta(std::istream& in, Contig& c)\n{\n    in.ignore(1); // skip \">\"\n    in >> c.m_id >> c.m_length >> c.m_coverage; // read header\n    in.ignore(1); // skip newline\n    in >> c.m_seq; // read seq\n    in.ignore(1); // place the ifstream at the next line\n    return in;\n}\n\nstd::istream& readCAF(std::istream& in, Contig& c)\n{\n    std::string line;\n    getline(in, line);\n    std::stringstream tokenizer(line);\n\n    std::string token;\n    while(tokenizer >> token)\n    {\n        std::string key;\n        std::string value;\n        splitKeyValue(token, key, value);\n        c.setFromKeyValue(key, value);\n    }\n    assert(c.getSequence().size() == c.getLength());\n    return in;\n}\n\n//\n//\n//\nSequenceVector Contig::getVariants() const\n{\n    SequenceVector out;\n    out.push_back(getSequence());\n    out.insert(out.end(), m_variants.begin(), m_variants.end());\n    return out;\n}\n\n//\n//\n//\nvoid Contig::addVariants(const SequenceVector& seqs)\n{\n    m_variants.insert(m_variants.end(), seqs.begin(), seqs.end());\n}\n\n\n//\n//\n//\nstd::ostream& writeCAF(std::ostream& out, Contig& c)\n{\n    std::vector<std::string> fields;\n        \n    // ID\n    fields.push_back(makeKeyValue(IDFIELD, c.m_id));\n    fields.push_back(makeKeyValue(LENFIELD, c.m_length));\n    fields.push_back(makeKeyValue(COVFIELD, c.m_coverage));\n    fields.push_back(makeKeyValue(SEQFIELD, c.m_seq));\n    fields.push_back(makeKeyValue(UNQFIELD, c.m_uniqueFlag));\n    std::copy(fields.begin(), fields.end(), std::ostream_iterator<std::string>(out, \"\\t\"));\n    return out;\n}\n\n//\n// Set a field based on a key/value pair\n//\nvoid Contig::setFromKeyValue(std::string& key, std::string& value)\n{\n    std::stringstream parser(value);\n    if(key == IDFIELD)\n        parser >> m_id;\n    else if(key == LENFIELD)\n        parser >> m_length;\n    else if(key == COVFIELD)\n        parser >> m_coverage;\n    else if(key == SEQFIELD)\n        parser >> m_seq;\n    else if(key == ANTFIELD)\n        parser >> m_annotation;\n    else if(key == UNQFIELD)\n    {\n        int v;\n        parser >> v;\n        m_uniqueFlag = (UniqueFlag)v;\n    }\n    else\n        assert(false && \"Unknown token found while parsing contig\");\n}\n"
  },
  {
    "path": "src/SGA/Util/Contig.h",
    "content": "#ifndef CONTIG_H\n#define CONTIG_H\n\n#include \"Util.h\"\n#include <iostream>\n#include <ostream>\n#include <sstream>\n#include <iterator>\n\n\n//\n// Enumerations\n//\nenum UniqueFlag\n{\n    UF_UNKNOWN = 0,\n    UF_UNIQUE,\n    UF_REPEAT,\n    UF_NOCALL\n};\n\nclass Contig\n{\n    public:\n\n        //\n        // Constructors\n        //\n        Contig();\n\n        //\n        // Getters\n        //\n        ContigID getID() const { return m_id; }\n        double getCoverage() const { return m_coverage; }\n        UniqueFlag getUniqueFlag() const { return m_uniqueFlag; }\n        size_t getLength() const { return m_length; }\n        Sequence getSequence() const { return m_seq; }\n        double getNormalizedCoverage() const { return m_coverage / m_length; }\n        bool isUnique() const { return m_uniqueFlag == UF_UNIQUE; }\n        unsigned int getAnnotation() { return m_annotation; }\n        SequenceVector getVariants() const;\n\n        //\n        // Setters\n        //\n        void setUniqueFlag(UniqueFlag uf) { m_uniqueFlag = uf; }\n        void setFromKeyValue(std::string& key, std::string& value);\n        void addVariants(const SequenceVector& seqs);\n\n        //\n        // Operators\n        //\n        bool operator()(Contig& c1, Contig& c2) const\n        {\n            return c1.m_seq < c2.m_seq;\n        }\n\n        //\n        // Readers\n        //\n        friend std::istream& readFasta(std::istream& in, Contig& c);\n        friend std::istream& readCAF(std::istream& in, Contig& c);\n        \n        //\n        // Writers\n        //\n        friend std::ostream& writeCAF(std::ostream& out, Contig& c);\n\n    private:\n        ContigID m_id;\n        size_t m_length;\n        double m_coverage;\n        UniqueFlag m_uniqueFlag;\n        Sequence m_seq;\n        unsigned int m_annotation;\n        SequenceVector m_variants;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/CorrectionThresholds.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// CorrectionThresholds - Cutoff values for determining\n// whether a particular base should be corrected or not\n//\n#include \"CorrectionThresholds.h\" \n\nCorrectionThresholds::CorrectionThresholds()\n{\n    // Set defaults\n    m_minSupportLowQuality = 4;\n    m_minSupportHighQuality = 3;\n    m_highQualityCutoff = 20;\n}\n\nCorrectionThresholds& CorrectionThresholds::Instance()\n{\n    static CorrectionThresholds instance;\n    return instance;\n}\n\nvoid CorrectionThresholds::setBaseMinSupport(int ms)\n{\n    m_minSupportHighQuality = ms;\n    m_minSupportLowQuality = ms + 1;\n}\n\n//\nint CorrectionThresholds::getRequiredSupport(int phred)\n{\n    int threshold = m_minSupportLowQuality;\n    if(phred >= m_highQualityCutoff)\n        threshold = m_minSupportHighQuality;\n    return threshold;\n}\n\n"
  },
  {
    "path": "src/SGA/Util/CorrectionThresholds.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// CorrectionThresholds.h - Singeleton class containing\n// cutoff values for determining whether a \n// base should be corrected or not\n//\n#ifndef CORRECTION_THRESHOLDS_H\n#define CORRECTION_THRESHOLDS_H\n\nclass CorrectionThresholds\n{\n    public:\n        CorrectionThresholds();\n        static CorrectionThresholds& Instance();\n        \n        // Set the base minimum support level (for high-quality reads)\n        void setBaseMinSupport(int ms);\n\n        int getMinSupportHighQuality() { return m_minSupportHighQuality; }\n        int getMinSupportLowQuality() { return m_minSupportLowQuality; }\n        int getHighQualityCutoff() { return m_highQualityCutoff; }\n\n        // Returns the support required for a base with phred score phred\n        int getRequiredSupport(int phred);\n\n    private:\n        int m_highQualityCutoff;\n        int m_minSupportLowQuality;\n        int m_minSupportHighQuality;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/DNACodec.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// DNACodec - Encoder/decoder for a DNA alphabet\n// of A,C,G,T using 2 bits per symbol\n//\n#ifndef DNACODEC_H\n#define DNACODEC_H\n\n#include \"Alphabet.h\"\n\nstatic const unsigned char dna_offset_mask[]={0xC0,0x30,0x0C,0x03};\n\nclass DNACodec\n{\n    public:\n        typedef uint8_t UNIT_TYPE;\n        static const int SYMBOLS_PER_UNIT = 4;\n\n        // Encoded the character b into a value\n        inline uint8_t encode(char b)\n        {\n            return DNA_ALPHABET::getBaseRank(b);\n        }\n\n        // Decode the value c into a character\n        inline char decode(uint8_t c)\n        {\n            return DNA_ALPHABET::getBase(c);\n        }\n\n        // Returns the number of units required to encode\n        // a string of length n\n        inline size_t getRequiredUnits(size_t n)\n        {\n            return (n + SYMBOLS_PER_UNIT - 1) / SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the number of symbols that can be stored\n        // in n units\n        inline size_t getCapacity(size_t n)\n        {\n            return n * SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the index of the unit to store the\n        // i-th symbol of the string\n        inline size_t getUnitIndex(size_t i)\n        {\n            return i / SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the position within a unit that the i-th symbol \n        // should be stored in\n        inline size_t getUnitOffset(size_t i)\n        {\n            // this position is the k-th symbol of the unit\n            return i % SYMBOLS_PER_UNIT;\n        }\n\n        // Return the amount that a value must be shifted to\n        // store a code at a given offset\n        inline uint8_t getOffsetShift(size_t offset)\n        {\n            return 2*(3 - offset);\n        }\n\n        // Store the value v at the i-th encoded position in the data array\n        inline void store(UNIT_TYPE* pData, size_t i, char b)\n        {\n            UNIT_TYPE& unit = pData[getUnitIndex(i)];\n            size_t offset = getUnitOffset(i);\n            uint8_t shift = getOffsetShift(offset);\n\n            // Clear the \n            unsigned char mask = dna_offset_mask[offset];\n\n            // Clear position\n            unit &= ~mask;\n\n            // Set position\n            uint8_t code = encode(b);\n            code <<= shift;\n            unit |= code; \n        }\n\n        // get the character stored at position i\n        inline char get(const UNIT_TYPE* pData, size_t i)\n        {\n            const UNIT_TYPE& unit = pData[getUnitIndex(i)];\n            size_t offset = getUnitOffset(i);\n            unsigned char mask = dna_offset_mask[offset];\n            UNIT_TYPE code = unit & mask;\n            uint8_t shift = getOffsetShift(offset);\n            code >>= shift;\n            return decode(code);\n        }\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/DNADouble.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// DNADouble.h - Simple map from the DNA\n// alphabet {A,C,G,T} to a double value\n//\n#ifndef ALPHADOUBLE_H\n#define ALPHADOUBLE_H\n\n#include \"Alphabet.h\"\n\nclass DNADouble\n{\n    public:\n        \n        //\n        inline DNADouble()\n        {\n            memset(m_vals, 0, DNA_ALPHABET::size * sizeof(double));\n        }\n\n        //\n        inline size_t getAlphabetSize() const\n        {\n            return DNA_ALPHABET::size;\n        }\n\n        //\n        inline void set(char b, double lp)\n        {\n            m_vals[DNA_ALPHABET::getBaseRank(b)] = lp;\n        }\n\n        // \n        inline double get(char b) const\n        {\n            return m_vals[DNA_ALPHABET::getBaseRank(b)];\n        }\n\n        //\n        inline char getMaxBase() const\n        {\n            char base;\n            double val;\n            getMax(base, val);\n            return base;\n        }\n\n        //\n        inline double getMaxVal() const\n        {\n            char base;\n            double val;\n            getMax(base, val);\n            return val;\n        }\n\n        //\n        inline void getMax(char& base, double& val) const\n        {\n            double max = -std::numeric_limits<double>::max();\n            int maxIdx = 0;\n            for(int i = 0; i < DNA_ALPHABET::size; ++i)\n            {\n                if(m_vals[i] > max)\n                {\n                    max = m_vals[i];\n                    maxIdx = i;\n                }\n            }\n            base = DNA_ALPHABET::getBase(maxIdx);\n            val = max;\n        }\n\n\n        //\n        inline double getByIdx(const int i) const\n        {\n            return m_vals[i];\n        }\n\n        // Return the base for index i\n        static char getBase(size_t i)\n        {\n            assert(i < DNA_ALPHABET::size);\n            return DNA_ALPHABET::getBase(i);\n        }\n\n        // Swap the (A,T) and (C,G) entries\n        inline void complement()\n        {\n            double tmp;\n\n            // A,T\n            tmp = m_vals[3];\n            m_vals[3] = m_vals[0];\n            m_vals[0] = tmp;\n\n            // C,G\n            tmp = m_vals[2];\n            m_vals[2] = m_vals[1];\n            m_vals[1] = tmp;\n        }\n\n        // Interpret the DNADouble as a log-probabilty vector of some \n        // event occurring and marginalize using a flat prior \n        double marginalize(double prior) const\n        {\n            double direct = 0.0f;\n            for(int i = 0; i < DNA_ALPHABET::size; ++i)\n            {\n                direct += exp(m_vals[i]);\n            }\n            double ld = log(direct) + log(prior);\n            /*\n            double max = -std::numeric_limits<double>::max();\n            int max_idx = 0;\n            for(int i = 0; i < DNA_ALPHABET::size; ++i)\n            {\n                if(m_vals[i] > max)\n                {\n                    max = m_vals[i];\n                    max_idx = i;\n                }\n            }\n\n            double sum = prior;\n            for(int i = 0; i < DNA_ALPHABET::size; ++i)\n            {\n                if(i != max_idx)\n                    sum += exp(m_vals[i] - max) * prior;\n            }\n            double ld = max + log(sum);*/\n            return ld;\n        }\n\n        // Add VAL to each element\n        inline void add(double val)\n        {\n            m_vals[0] += val;\n            m_vals[1] += val;\n            m_vals[2] += val;\n            m_vals[3] += val;\n        }\n\n        // Subtract VAL from each element\n        inline void subtract(double val)\n        {\n            m_vals[0] -= val;\n            m_vals[1] -= val;\n            m_vals[2] -= val;\n            m_vals[3] -= val;\n        }\n\n        inline DNADouble& operator+=(const DNADouble& other)\n        {\n            assert(DNA_ALPHABET::size == 4);\n            // Manually unrolled\n            m_vals[0] += other.m_vals[0];\n            m_vals[1] += other.m_vals[1];\n            m_vals[2] += other.m_vals[2];\n            m_vals[3] += other.m_vals[3];\n            return *this;\n        }\n\n        inline DNADouble& operator-=(const DNADouble& other)\n        {\n            assert(DNA_ALPHABET::size == 4);\n            // Manually unrolled\n            m_vals[0] -= other.m_vals[0];\n            m_vals[1] -= other.m_vals[1];\n            m_vals[2] -= other.m_vals[2];\n            m_vals[3] -= other.m_vals[3];\n            return *this;\n        }\n        \n        \n        //\n        void printVerbose() const\n        {\n            std::cout << \"AP \";\n            for(int i = 0; i < DNA_ALPHABET::size; ++i)\n            {\n                char b = DNA_ALPHABET::getBase(i);\n                std::cout << b << \": \" << m_vals[i] << \" \";\n            }\n            std::cout << \"\\n\";\n        }\n\n    private:\n        double m_vals[DNA_ALPHABET::size];\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/DNAString.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// DNAString \n//\n#include <iostream>\n#include \"DNAString.h\"\n#include \"Util.h\"\n\nDNAString::DNAString() : m_len(0), m_data(0) {}\n\n//\nDNAString::DNAString(std::string seq)\n{\n    _alloc(seq.c_str(), seq.length());\n}\n\n//\nDNAString::DNAString(const DNAString& other)\n{\n    // Deep copy\n    _alloc(other.m_data, other.m_len);\n}\n\n//\nDNAString& DNAString::operator=(const DNAString& dna)\n{\n    if(&dna == this)\n        return *this; // self-assign\n\n    _dealloc();\n    _alloc(dna.m_data, dna.m_len);\n    return *this;\n}\n\n//\nDNAString& DNAString::operator=(const std::string& str)\n{\n    _dealloc();\n    _alloc(str.c_str(), str.length());\n    return *this;\n}\n\n//\nbool DNAString::operator==(const DNAString& other)\n{\n    if(m_len != other.m_len)\n        return false;\n    return strncmp(m_data, other.m_data, m_len) == 0;\n}\n\n//\nvoid DNAString::_alloc(const char* pData, size_t l)\n{\n    m_len = l;\n    size_t alloc_len = m_len + 1;\n    m_data = new char[alloc_len];\n    strncpy(m_data, pData, m_len);\n    m_data[m_len] = '\\0';\n}\n\n//\nvoid DNAString::_dealloc()\n{\n    if(m_data != NULL)\n        delete [] m_data;\n    m_data = 0;\n    m_len = 0;\n}\n\n//\nDNAString::~DNAString()\n{\n    _dealloc();\n}\n\n// Reverse the sequence\nvoid DNAString::reverse()\n{\n    size_t half = m_len >> 1;\n    for(size_t idx = 0; idx < half; ++idx)\n    {\n        size_t opp = m_len - idx - 1;\n        char tmp = m_data[opp];\n        m_data[opp] = m_data[idx];\n        m_data[idx] = tmp;\n    }\n}\n\nvoid DNAString::reverseComplement()\n{\n    this->reverse();\n    for(size_t idx = 0; idx < m_len; ++idx) m_data[idx] = complement(m_data[idx]);    \n}\n\n\nvoid DNAString::disambiguate()\n{\n    if(m_len == 0)\n        return;\n    \n    for(size_t idx = 0; idx < m_len; ++idx)\n    {\n        if(m_data[idx] == 'N')\n        {\n            m_data[idx] = randomBase();\n        }\n    }\n}\n\n//\nstd::string DNAString::getSuffixString(size_t idx) const\n{\n    std::string str;\n    str.reserve(getSuffixLength(idx) + 1);\n    str += getSuffix(idx);\n    str += \"$\";\n    return str;\n}\n\n//\nstd::string DNAString::toString() const\n{\n    return std::string(m_data, m_len);\n}\n"
  },
  {
    "path": "src/SGA/Util/DNAString.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// DNAString - Wrapper for c-string for DNA sequences\n// It is tailored for fast suffix operations\n//\n\n#ifndef DNASTRING_H\n#define DNASTRING_H\n#include <string.h>\n#include <string>\n#include <assert.h> \n\nclass DNAString\n{\n    public:\n        \n        // Constructors/Destructors\n        DNAString();\n        DNAString(const DNAString& other);\n        DNAString(std::string seq);\n        ~DNAString();\n\n        // Operators\n        DNAString& operator=(const DNAString& dna);\n        DNAString& operator=(const std::string& str);\n        bool operator==(const DNAString& other);\n\n        size_t length() const\n        {\n            return m_len;\n        }\n\n        bool empty() const\n        {\n            return m_len == 0 || m_data[0] == '\\0';\n        }\n\n        inline const char* getSuffix(size_t idx) const\n        {\n            assert(m_len > 0);\n            // Force the suffix to point to the empty string if out of bounds\n            if(idx <= m_len)\n                return m_data + idx;\n            else\n                return m_data + m_len;\n        }\n        \n        // Return the length of the suffix (not including $) starting at idx\n        size_t getSuffixLength(size_t idx) const\n        {\n            assert(m_len > 0);\n            if(idx <= m_len)\n                return m_len - idx;\n            else\n                return 0;\n        }\n\n        // Get the character at the given position\n        inline char get(size_t idx) const\n        {\n            assert(idx < m_len + 1);\n            return m_data[idx];\n        }\n\n        // Set the character at the given position\n        inline void set(size_t idx, char b) const\n        {\n            assert(idx < m_len + 1);\n            m_data[idx] = b;\n        }\n\n        // Get the substring of length n starting at position pos\n        std::string substr(size_t pos, size_t n) const\n        {\n            assert(m_data != NULL && pos < m_len && pos + n <= m_len);\n            return std::string(m_data + pos, n);\n        }\n\n        // randomly change the 'N' bases to one of ACGT so that the string is not ambiguous\n        void disambiguate();\n\n        void reverse();\n        void reverseComplement();\n        std::string getSuffixString(size_t idx) const;\n        std::string toString() const;\n\n    private:\n\n        // functions\n        void _alloc(const char* pData, size_t l);\n        void _dealloc();\n\n        // data\n        size_t m_len;\n        char* m_data;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/EncodedString.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// EncodedString - Templated class to store\n// a string from a reduced alphabet. The actual\n// encoding is done outside this class by the Codec\n// template parameter.\n//\n// Here the storage is in terms of \"units\" which is\n// defined by the codec. For a simple 2-bit encoded\n// DNA string this would be a byte but for more complicated\n// encodings like the 3-bit BWT this could be a larger\n// structure like uint16_t\n//\n#ifndef ENCODEDSTRING_H\n#define ENCODEDSTRING_H\n#include <string.h>\n#include <string>\n#include <assert.h> \n#include \"DNACodec.h\"\n#include \"BWTCodec.h\"\n#include \"BWT4Codec.h\"\n#include \"NoCodec.h\"\n\ntemplate<class Codec>\nclass EncodedString\n{\n    typedef typename Codec::UNIT_TYPE StorageUnit;\n\n    public:\n        \n        // Constructors/Destructors\n        EncodedString() : m_len(0), m_capacity(0), m_data(0) {}\n\n        //\n        EncodedString(const EncodedString& other)\n        {\n            // deep copy\n            _alloc(other.m_len);\n            _copy(other);\n        }\n\n        //\n        EncodedString(const std::string& seq)\n        {\n            size_t n = seq.length();\n            _alloc(n);\n            _copy(seq.c_str(), n);\n        }\n\n        //\n        ~EncodedString()\n        {\n            _dealloc();\n        }\n\n        // Assignment op\n        EncodedString& operator=(const EncodedString& other)\n        {\n            if(&other == this)\n                return *this; // self-assign\n\n            _dealloc();\n            _alloc(other.m_len);\n            _copy(other);\n            return *this;\n        }\n\n        //\n        EncodedString& operator=(const std::string& str)\n        {\n            size_t n = str.length();\n            _dealloc();\n            _alloc(n);\n            _copy(str.c_str(), n);\n            return *this;\n        }\n\n        // Resize this string to n symbols, setting the \n        // new entries to the default value\n        void resize(size_t n)\n        {\n            if(n > m_capacity)\n                _realloc(n);\n            m_len = n;\n        }\n\n        // Append a std::string\n        void append(const std::string& str)\n        {\n            size_t n = str.length();\n            size_t num_total = m_len + n;\n            if(num_total > m_capacity)\n                _realloc(num_total);\n            _append(str.c_str(), n);\n        }\n\n        // Append some other EncodedString\n        void append(const EncodedString& other)\n        {\n            size_t n = other.length();\n            size_t num_total = m_len + n;\n            if(num_total > m_capacity)\n                _realloc(num_total);\n            _append(other);\n        }\n\n        // Swap the contents with another encoded string\n        void swap(EncodedString& other)\n        {\n            size_t tmp;\n            tmp = other.m_len;\n            other.m_len = m_len;\n            m_len = tmp;\n\n            tmp = other.m_capacity;\n            other.m_capacity = m_capacity;\n            m_capacity = tmp;\n\n            StorageUnit* pTmp = other.m_data;\n            other.m_data = m_data;\n            m_data = pTmp;\n        }\n\n        //\n        size_t length() const\n        {\n            return m_len;\n        }\n\n        //\n        size_t capacity() const\n        {\n            return m_capacity;\n        }\n\n        //\n        bool empty() const\n        {\n            return m_len == 0;\n        }\n\n        // Get the character at idx\n        inline char get(size_t idx) const\n        {\n            assert(idx < m_len);\n            return s_codec.get(m_data, idx);\n        }\n\n        // Set the character at idx\n        inline void set(size_t idx, char b)\n        {\n            assert(idx < m_len);\n            s_codec.store(m_data, idx, b);\n        }\n\n        //\n        std::string toString() const\n        {\n            std::string out(m_len, 'A');\n            for(size_t i = 0; i < m_len; ++i)\n                out[i] = s_codec.get(m_data, i);\n            return out;\n        }\n\n        //\n        std::string substr(size_t start) const\n        {\n            assert(start < m_len);\n            std::string out(m_len - start, 'A');\n            for(size_t i = start; i < m_len; ++i)\n                out[i - start] = s_codec.get(m_data, i);\n            return out;\n        }\n\n        //\n        std::string substr(size_t start, size_t len) const\n        {\n            assert(start < m_len);\n            assert(start + len <= m_len);\n            std::string out(len, 'C');\n            for(size_t i = 0; i < len; ++i)\n                out[i] = s_codec.get(m_data, i + start);\n            return out;\n        }\n\n        // \n        friend bool operator==(const EncodedString& a, const EncodedString& b)\n        {\n            if(a.m_len != b.m_len)\n                return false;\n\n            // Would be faster to compare entire units at a time\n            size_t n = a.m_len;\n            for(size_t i = 0; i < n; ++i)\n            {\n                if(a.get(i) != b.get(i))\n                    return false;\n            }\n            return true;\n        }\n\n        //\n        friend std::ostream& operator<<(std::ostream& out, const EncodedString<Codec>& a)\n        {\n            out << a.toString();\n            return out;\n        }\n\n        // Return the amount of space this string is using\n        size_t getMemSize() const\n        {\n            return sizeof(*this) + sizeof(StorageUnit) * s_codec.getRequiredUnits(m_capacity);\n        }\n\n    private:\n\n        // functions\n        void _copy(const char* pData, size_t n)\n        {\n            // this assumes that storage for n characters has been \n            // allocated\n            assert(m_capacity >= n);\n            for(size_t i = 0; i < n; ++i)\n                s_codec.store(m_data, i, pData[i]);\n            m_len = n;\n        }\n        \n        //\n        void _copy(const EncodedString& other)\n        {\n            // storage should have been allocated already\n            assert(m_capacity = other.m_capacity);\n            size_t num_units = s_codec.getRequiredUnits(other.m_capacity);\n            _copyUnitData(other.m_data, num_units);\n            m_len = other.m_len;\n        }\n\n        // Copy num_units from pData into the internal storage\n        void _copyUnitData(StorageUnit* pData, size_t num_units)\n        {\n            assert(s_codec.getRequiredUnits(m_capacity) >= num_units);\n            for(size_t i = 0; i < num_units; ++i)\n                m_data[i] = pData[i];\n        }\n\n        // append n symbols from pData into the buffer\n        void _append(const char* pData, size_t n)\n        {\n            assert(m_len + n <= m_capacity);\n            for(size_t i = 0; i < n; ++i)\n                s_codec.store(m_data, m_len + i, pData[i]);\n            m_len += n;\n        }\n\n        // append \n        void _append(const EncodedString& other)\n        {\n            size_t n = other.m_len;\n            assert(m_len + n <= m_capacity);\n            for(size_t i = 0; i < n; ++i)\n                s_codec.store(m_data, m_len + i, other.get(i));\n            m_len += n;\n        }\n\n        // allocate storage for n symbols\n        void _alloc(size_t n)\n        {\n            // Get the number of units that need to be allocated from the codec\n            size_t n_units = s_codec.getRequiredUnits(n);\n            m_data = new StorageUnit[n_units](); // This zeros the memory\n            m_capacity = s_codec.getCapacity(n_units);\n        }\n\n        // reallocate the storage so that the capacity is at least n symbols\n        // m_len is not changed\n        void _realloc(size_t n)\n        {\n            StorageUnit* oldData = m_data;\n            size_t old_units = s_codec.getRequiredUnits(m_len);\n            _alloc(n);\n            assert(m_capacity >= n);\n\n            _copyUnitData(oldData, old_units);\n            delete [] oldData;\n        }\n\n        // deallocate storage\n        void _dealloc()\n        {\n            if(m_data != NULL)\n                delete [] m_data;\n            m_data = 0;\n            m_len = 0;\n            m_capacity = 0;\n        }\n\n        // data\n        static Codec s_codec;\n        size_t m_len; // the length of the string\n        size_t m_capacity; // the maximum length of the string that can be stored\n        StorageUnit* m_data;\n};\n\n// Initialize the static member\ntemplate<class Codec>\nCodec EncodedString<Codec>::s_codec;\n\ntypedef EncodedString<DNACodec> DNAEncodedString;\ntypedef EncodedString<BWT4Codec> BWTString;\ntypedef EncodedString<NoCodec> NoEncodingString;\n\ntypedef std::vector<DNAEncodedString> DNAEncodedStringVector;\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/HashMap.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// HashMap compability defines. Similar to Shaun Jackman's\n// compatability code in abyss (see Common/HashMap)\n//\n//\n#ifndef HASHMAP_H\n#define HASHMAP_H\n\n//#include \"config.h\"\n#define HAVE_UNORDERED_MAP 1\n\n#if HAVE_UNORDERED_MAP\n\n# include <unordered_map>\n# include <unordered_set>\n#define HashMap std::unordered_map\n#define HashSet std::unordered_set\ntypedef std::hash<std::string> StringHasher;\n#elif HAVE_TR1_UNORDERED_MAP\n#include <tr1/unordered_map>\n#include <tr1/unordered_set>\n#define HashMap std::tr1::unordered_map\n#define HashSet std::tr1::unordered_set\ntypedef std::tr1::hash<std::string> StringHasher;\n#elif HAVE_EXT_HASH_MAP\n#define USING_EXT_HASH_MAP 1\n# undef __DEPRECATED\n#include <ext/hash_map>\n#include <ext/hash_set>\n#define HashMap __gnu_cxx::hash_map\n#define HashSet __gnu_cxx::hash_set\n#else\n# error No hash map implementation found\n#endif\n\n# if USING_EXT_HASH_MAP\n# include <cstddef>\n# include <string>\nstruct StringHasher\n{\n    size_t operator()( const std::string& x) const\n    {\n        return __gnu_cxx::hash<const char*>()( x.c_str());\n    }\n};\n#endif \n\n// Ensure the sparse hash is available\n#if HAVE_GOOGLE_SPARSE_HASH_MAP\n#include <google/sparse_hash_map>\n//#define SparseHashMap google::sparse_hash_map // JEREMIAH\n#else\n#define SparseHashMap std::tr1::unordered_map\n//#error The google sparse hash is required\n#endif \n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Interval.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Interval - A pair of integers denoting a range\n//\n#include \"Interval.h\"\n#if 0\nInterval Interval::intersect(const Interval& r1, const Interval& r2)\n{\n    Interval result;\n    result.start = std::max(r1.start, r2.start);\n    result.end = std::min(r1.end, r2.end);\n\n    // Check for non-overlap\n    if(result.end <= result.start)\n    {\n        result.start = 0;\n        result.end = 0;\n    }\n    return result;\n}\n#endif\n\nstd::ostream& operator<<(std::ostream& out, const Interval& r)\n{\n    out << r.start << \" \" << r.end;\n    return out;\n}\n\nstd::istream& operator>>(std::istream& in, Interval& r)\n{\n    in >> r.start >> r.end;\n    return in;\n}\n"
  },
  {
    "path": "src/SGA/Util/Interval.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// Interval - A pair of integers denoting a closed interval\n//\n\n#ifndef INTERVAL_H\n#define INTERVAL_H\n\n#include \"Util.h\"\n\nstruct Interval\n{\n    // constructors\n    Interval() : start(0), end(0) {}\n    Interval(int s, int e) : start(s), end(e) {}\n\n    // Find the intersection between [s1, e1] [s2, e2]\n    // The intersection is placed in [s3, e3], if the two input\n    // intervals do not intersect then e3 will be strictly less than s3\n    template<class T>\n    static void intersect(const T s1, const T e1, const T s2, const T e2, T& s3, T& e3)\n    {\n        assert(s1 <= e1 && s2 <= e2);\n        s3 = std::max(s1, s2);\n        e3 = std::min(e1, e2);\n    }\n\n    // Precondition: s1 >= e1 and s2 >= e2 \n    // Return true if the coordinates intersect\n    template<class T>\n    static bool isIntersecting(const T s1, const T e1, const T s2, const T e2)\n    {\n        assert(s1 <= e1 && s2 <= e2);\n        if(s2 > e1 || s1 > e2)\n            return false;\n        else\n            return true;\n    }\n\n    // functions\n    friend std::ostream& operator<<(std::ostream& out, const Interval& i);\n    friend std::istream& operator>>(std::istream& in, Interval& i);    \n    \n    // data members\n    int start;\n    int end;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/IntervalTree.h",
    "content": "#ifndef __INTERVAL_TREE_H\n#define __INTERVAL_TREE_H\n\n#include <climits>\n#include <vector>\n#include <algorithm>\n#include <iostream>\n\nusing namespace std;\n\n\ntemplate <class T, typename K = int>\n  class IntervalT {\n  public:\n  K start;\n  K stop;\n  T value;\n  IntervalT()\n  : start(0)\n  , stop(INT_MAX)\n  , value(\"\")\n  { }\n  IntervalT(K s, K e, const T& v)\n  : start(s)\n  , stop(e)\n  , value(v)\n  { }\n};\n\ntemplate <class T, typename K = int>\n  int intervalStart(const IntervalT<T,K>& i) {\n  return i.start;\n}\n\n  template <class T, typename K = int>\n  int intervalStop(const IntervalT<T,K>& i) {\n    return i.stop;\n  }\n\n    template <class T, typename K = int>\n  ostream& operator<<(ostream& out, IntervalT<T,K>& i) {\n      out << \"Interval(\" << i.start << \", \" << i.stop << \"): \" << i.value;\n      return out;\n    }\n\n      template <class T, typename K = int>\n  class IntervalStartSorter {\n\tpublic:\n\tbool operator() (const IntervalT<T,K>& a, const IntervalT<T,K>& b) {\n\t  return a.start < b.start;\n\t}\n      };\n\ntemplate <class T, typename K = int>\n  class IntervalTTree {\n\n  public:\n  typedef IntervalT<T,K> interval;\n  typedef vector<interval> intervalVector;\n  typedef IntervalTTree<T,K> intervalTree;\n    \n  intervalVector intervals;\n  intervalTree* left;\n  intervalTree* right;\n  int center;\n\n  IntervalTTree<T,K>(void)\n  : left(NULL)\n  , right(NULL)\n  , center(0)\n  { }\n\n  IntervalTTree<T,K>(const intervalTree& other) {\n    center = other.center;\n    intervals = other.intervals;\n    if (other.left) {\n      left = (intervalTree*) malloc(sizeof(intervalTree));\n      *left = *other.left;\n    } else {\n      left = NULL;\n    }\n    if (other.right) {\n      right = new intervalTree();\n      *right = *other.right;\n    } else {\n      right = NULL;\n    }\n  }\n\n  IntervalTTree<T,K>& operator=(const intervalTree& other) {\n    center = other.center;\n    intervals = other.intervals;\n    if (other.left) {\n      left = new intervalTree();\n      *left = *other.left;\n    } else {\n      left = NULL;\n    }\n    if (other.right) {\n      right = new intervalTree();\n      *right = *other.right;\n    } else {\n      right = NULL;\n    }\n    return *this;\n  }\n\n  IntervalTTree<T,K>(\n\t\t    intervalVector& ivals,\n\t\t    unsigned int depth = 16,\n\t\t    unsigned int minbucket = 64,\n\t\t    int leftextent = 0,\n\t\t    int rightextent = 0,\n            unsigned int maxbucket = 512\n\t\t    )\n  : left(NULL)\n  , right(NULL)\n  {\n\n    --depth;\n    if (depth == 0 || (ivals.size() < minbucket && ivals.size() < maxbucket)) {\n      intervals = ivals;\n    } else {\n      if (leftextent == 0 && rightextent == 0) {\n\t// sort intervals by start\n\tIntervalStartSorter<T,K> intervalStartSorter;\n\tsort(ivals.begin(), ivals.end(), intervalStartSorter);\n      }\n\n      int leftp = 0;\n      int rightp = 0;\n      int centerp = 0;\n            \n      if (leftextent || rightextent) {\n\tleftp = leftextent;\n\trightp = rightextent;\n      } else {\n\tleftp = ivals.front().start;\n\tvector<K> stops;\n\tstops.resize(ivals.size());\n\ttransform(ivals.begin(), ivals.end(), stops.begin(), intervalStop<T,K>);\n\trightp = *max_element(stops.begin(), stops.end());\n      }\n\n      //centerp = ( leftp + rightp ) / 2;\n      centerp = ivals.at(ivals.size() / 2).start;\n      center = centerp;\n\n      intervalVector lefts;\n      intervalVector rights;\n\n      for (typename intervalVector::iterator i = ivals.begin(); i != ivals.end(); ++i) {\n\tinterval& interval = *i;\n\tif (interval.stop < center) {\n\t  lefts.push_back(interval);\n\t} else if (interval.start > center) {\n\t  rights.push_back(interval);\n\t} else {\n\t  intervals.push_back(interval);\n\t}\n      }\n\n      if (!lefts.empty()) {\n\tleft = new intervalTree(lefts, depth, minbucket, leftp, centerp);\n      }\n      if (!rights.empty()) {\n\tright = new intervalTree(rights, depth, minbucket, centerp, rightp);\n      }\n    }\n  }\n\n  void findOverlapping(K start, K stop, intervalVector& overlapping) {\n    if (!intervals.empty() && ! (stop < intervals.front().start)) {\n      for (typename intervalVector::iterator i = intervals.begin(); i != intervals.end(); ++i) {\n\tinterval& interval = *i;\n\tif (interval.stop >= start && interval.start <= stop) {\n\t  overlapping.push_back(interval);\n\t}\n      }\n    }\n\n    if (left && start <= center) {\n      left->findOverlapping(start, stop, overlapping);\n    }\n\n    if (right && stop >= center) {\n      right->findOverlapping(start, stop, overlapping);\n    }\n\n  }\n\n  void findContained(K start, K stop, intervalVector& contained) {\n    if (!intervals.empty() && ! (stop < intervals.front().start)) {\n      for (typename intervalVector::iterator i = intervals.begin(); i != intervals.end(); ++i) {\n\tinterval& interval = *i;\n\tif (interval.start >= start && interval.stop <= stop) {\n\t  contained.push_back(interval);\n\t}\n      }\n    }\n\n    if (left && start <= center) {\n      left->findContained(start, stop, contained);\n    }\n\n    if (right && stop >= center) {\n      right->findContained(start, stop, contained);\n    }\n\n  }\n\n  ~IntervalTTree(void) {\n    // traverse the left and right\n    // delete them all the way down\n    if (left) {\n      delete left;\n    }\n    if (right) {\n      delete right;\n    }\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/KmerDistribution.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// KmerDistribution - Histogram of kmer frequencies\n//\n#include \"KmerDistribution.h\"\n#include <assert.h>\n#include <cstdlib>\n#include <stdio.h>\n#include <iostream>\n#include <limits>\n\nKmerDistribution::KmerDistribution()\n{\n\n}\n\nvoid KmerDistribution::add(int kcount)\n{\n    m_data[kcount]++;\n}\n\ndouble KmerDistribution::getCumulativeProportionLEQ(int n) const\n{\n    std::vector<int> countVector = toCountVector(1000);\n    int64_t sum = 0;\n    for(size_t i = 0; i < countVector.size(); ++i)\n    {\n        sum += countVector[i];\n    }\n\n    std::vector<double> cumulativeVector(countVector.size());\n    int64_t runningSum = 0;\n    for(size_t i = 0; i < cumulativeVector.size(); ++i)\n    {\n        runningSum += countVector[i];\n        cumulativeVector[i] = (double)runningSum / sum;\n        //std::cout << \"CUMUL \" << i << \" \" << cumulativeVector[i] << \"\\n\";\n    }\n\n    assert(n < (int)cumulativeVector.size());\n    return cumulativeVector[n];\n}\n\nsize_t KmerDistribution::getCutoffForProportion(double p) const\n{\n    int MAX_COUNT = 1000;\n    std::vector<int> countVector = toCountVector(MAX_COUNT);\n    int64_t sum = 0;\n    for(size_t i = 0; i < countVector.size(); ++i)\n        sum += countVector[i];\n\n    double c = 0.0f;\n    for(size_t i = 0; i < countVector.size(); ++i)\n    {\n        c += (double)countVector[i] / sum;\n        if(c > p)\n            return i;\n    }\n    return MAX_COUNT;\n}\n\n//\nint KmerDistribution::findFirstLocalMinimum() const\n{\n    std::vector<int> countVector = toCountVector(1000);\n    if(countVector.empty())\n        return -1;\n\n    std::cout << \"CV: \" << countVector.size() << \"\\n\";\n    int prevCount = countVector[1];\n    double threshold = 0.75;\n    for(size_t i = 2; i < countVector.size(); ++i)\n    {\n        int currCount = countVector[i];\n        double ratio = (double)currCount / prevCount;\n        std::cout << i << \" \" << currCount << \" \" << ratio << \"\\n\";\n        if(ratio > threshold)\n            return i;\n        prevCount = currCount;\n    }\n    return -1;\n}\n\nint KmerDistribution::getCensoredMode(size_t n) const\n{\n    std::vector<int> countVector = toCountVector(1000);\n    if(countVector.size() < n)\n        return -1;\n    int modeIdx = -1;\n    int modeCount = -1;\n\n    for(; n < countVector.size(); ++n)\n    {\n        if(countVector[n] > modeCount)\n        {\n            modeCount = countVector[n];\n            modeIdx = n;\n        }\n    }\n    return modeIdx;\n}\n\n// Find the boundary of the kmers that are likely erroneous\n// We do this by finding the value between 1 and the trusted mode\n// that contributes the fewest \nint KmerDistribution::findErrorBoundary() const\n{\n    int mode = getCensoredMode(5);\n    if(mode == -1)\n        return -1;\n\n    std::cerr << \"Trusted kmer mode: \" << mode  << \"\\n\";\n    std::vector<int> countVector = toCountVector(1000);\n    if(countVector.empty())\n        return -1;\n\n    int runningSum = 0;\n    double minContrib = std::numeric_limits<double>::max();\n    int idx = -1;\n    for(int i = 1; i < mode; ++i)\n    {\n        runningSum += countVector[i];\n        double v = (double)countVector[i] / runningSum;\n        if(v < minContrib)\n        {\n            minContrib = v;\n            idx = i;\n        }\n    }\n    return idx;\n}\n\n// Find the boundary of the kmers that are likely erroneous\n// We do this by finding the value between 1 and the trusted mode\n// that contributes the fewest \nint KmerDistribution::findErrorBoundaryByRatio(double ratio) const\n{\n    int mode = getCensoredMode(5);\n    if(mode == -1)\n        return -1;\n\n    std::cerr << \"Trusted kmer mode: \" << mode  << \"\\n\";\n    std::vector<int> countVector = toCountVector(1000);\n    if(countVector.empty())\n        return -1;\n\n    for(int i = 1; i < mode - 1; ++i)\n    {\n        int currCount = countVector[i];\n        int nextCount  = countVector[i+1];\n        double cr = (double)currCount / nextCount;\n        if(cr < ratio)\n            return i;\n    }\n    return -1;\n}\n\n// \nstd::vector<int> KmerDistribution::toCountVector(int max) const\n{\n    std::vector<int> out;\n    if(m_data.empty())\n        return out;\n\n    int min = 0;\n\n    for(int i = min; i <= max; ++i)\n    {\n        std::map<int,int>::const_iterator iter = m_data.find(i);\n        int v = (iter != m_data.end()) ? iter->second : 0;\n        out.push_back(v);\n    }\n    return out;\n}\n\nsize_t KmerDistribution::getTotalKmers() const\n{\n    size_t sum = 0;\n    std::map<int,int>::const_iterator iter = m_data.begin();\n    for(; iter != m_data.end(); ++iter)\n        sum += iter->second;\n    return sum;\n}\n\nsize_t KmerDistribution::getNumberWithCount(size_t c) const\n{\n    std::map<int,int>::const_iterator iter = m_data.find(c);\n    if(iter != m_data.end())\n        return iter->second;\n    else\n        return 0;\n}\n\n// for compatibility with old code\nvoid KmerDistribution::print(int max) const\n{\n    print(stdout, max);\n}\n\nvoid KmerDistribution::print(FILE* fp, int max) const\n{\n    fprintf(fp, \"Kmer coverage histogram\\n\");\n    fprintf(fp, \"cov\\tcount\\n\");\n\n    int maxCount = 0;\n    std::map<int,int>::const_iterator iter = m_data.begin();\n    for(; iter != m_data.end(); ++iter)\n    {\n        if(iter->first <= max)\n            fprintf(fp, \"%d\\t%d\\n\", iter->first, iter->second);\n        else\n            maxCount += iter->second;\n    }\n    fprintf(fp, \">%d\\t%d\\n\", max, maxCount);\n\n}\n"
  },
  {
    "path": "src/SGA/Util/KmerDistribution.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// KmerDistribution - Histogram of kmer frequencies\n//\n#ifndef KMERDISTRIBUTION_H\n#define KMERDISTRIBUTION_H\n\n#include <vector>\n#include <map>\n#include <cstddef>\n#include <stdio.h>\n\nclass KmerDistribution\n{\n    public:\n    \n        KmerDistribution();\n        ~KmerDistribution() {}\n        \n        // Returns the proportion of the distribution less than or equal to n\n        double getCumulativeProportionLEQ(int n) const;\n\n        // Returns the smallest value n such that the proportion of the data less\n        // than n is p. This is the inverse of getCumulativeProportionLEQ.\n        size_t getCutoffForProportion(double p) const;\n\n        // Returns the predicted boundary of the left tail which holds erroneous kmers\n        int findErrorBoundary() const;\n        int findErrorBoundaryByRatio(double ratio) const;\n\n        // Get the mode of the distribution if the first n values are ignored\n        int getCensoredMode(size_t n) const;\n \n        size_t getTotalKmers() const;\n        size_t getNumberWithCount(size_t c) const;\n\n        //\n        std::vector<int> toCountVector(int max) const;\n\n        //\n        int findFirstLocalMinimum() const;\n        void add(int count);\n        void print(int max) const; \n        void print(FILE* file, int max) const; \n\n    private:\n\n        // int -> int map of the number of times a kmer with multiplicty N has been seen\n        std::map<int,int> m_data;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Makefile.am",
    "content": "noinst_LIBRARIES = libutil.a\n\nlibutil_a_CPPFLAGS = -I$(top_srcdir)/src/SGA/Bigraph \\\n\t             -I$(top_srcdir)/SeqLib\n\nlibutil_a_SOURCES = Util.cpp stdaln.c Alphabet.cpp Contig.cpp \\\n\t\tReadTable.cpp ReadInfoTable.cpp SeqReader.cpp DNAString.cpp Match.cpp \\\n\t\tPileup.cpp Interval.cpp SeqCoord.cpp QualityVector.cpp Quality.cpp \\\n\t\tPrimerScreen.cpp CorrectionThresholds.cpp ClusterReader.cpp QualityTable.cpp \\\n\t\tgzstream.C BitChar.cpp MultiOverlap.cpp\n\n\n"
  },
  {
    "path": "src/SGA/Util/Makefile.in",
    "content": "# Makefile.in generated by automake 1.16.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2018 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nsubdir = src/SGA/Util\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLIBRARIES = $(noinst_LIBRARIES)\nAR = ar\nARFLAGS = cru\nAM_V_AR = $(am__v_AR_@AM_V@)\nam__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)\nam__v_AR_0 = @echo \"  AR      \" $@;\nam__v_AR_1 = \nlibutil_a_AR = $(AR) $(ARFLAGS)\nlibutil_a_LIBADD =\nam_libutil_a_OBJECTS = libutil_a-Util.$(OBJEXT) \\\n\tlibutil_a-stdaln.$(OBJEXT) libutil_a-Alphabet.$(OBJEXT) \\\n\tlibutil_a-Contig.$(OBJEXT) libutil_a-ReadTable.$(OBJEXT) \\\n\tlibutil_a-ReadInfoTable.$(OBJEXT) \\\n\tlibutil_a-SeqReader.$(OBJEXT) libutil_a-DNAString.$(OBJEXT) \\\n\tlibutil_a-Match.$(OBJEXT) libutil_a-Pileup.$(OBJEXT) \\\n\tlibutil_a-Interval.$(OBJEXT) libutil_a-SeqCoord.$(OBJEXT) \\\n\tlibutil_a-QualityVector.$(OBJEXT) libutil_a-Quality.$(OBJEXT) \\\n\tlibutil_a-PrimerScreen.$(OBJEXT) \\\n\tlibutil_a-CorrectionThresholds.$(OBJEXT) \\\n\tlibutil_a-ClusterReader.$(OBJEXT) \\\n\tlibutil_a-QualityTable.$(OBJEXT) libutil_a-gzstream.$(OBJEXT) \\\n\tlibutil_a-BitChar.$(OBJEXT) libutil_a-MultiOverlap.$(OBJEXT)\nlibutil_a_OBJECTS = $(am_libutil_a_OBJECTS)\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__maybe_remake_depfiles = depfiles\nam__depfiles_remade = ./$(DEPDIR)/libutil_a-Alphabet.Po \\\n\t./$(DEPDIR)/libutil_a-BitChar.Po \\\n\t./$(DEPDIR)/libutil_a-ClusterReader.Po \\\n\t./$(DEPDIR)/libutil_a-Contig.Po \\\n\t./$(DEPDIR)/libutil_a-CorrectionThresholds.Po \\\n\t./$(DEPDIR)/libutil_a-DNAString.Po \\\n\t./$(DEPDIR)/libutil_a-Interval.Po \\\n\t./$(DEPDIR)/libutil_a-Match.Po \\\n\t./$(DEPDIR)/libutil_a-MultiOverlap.Po \\\n\t./$(DEPDIR)/libutil_a-Pileup.Po \\\n\t./$(DEPDIR)/libutil_a-PrimerScreen.Po \\\n\t./$(DEPDIR)/libutil_a-Quality.Po \\\n\t./$(DEPDIR)/libutil_a-QualityTable.Po \\\n\t./$(DEPDIR)/libutil_a-QualityVector.Po \\\n\t./$(DEPDIR)/libutil_a-ReadInfoTable.Po \\\n\t./$(DEPDIR)/libutil_a-ReadTable.Po \\\n\t./$(DEPDIR)/libutil_a-SeqCoord.Po \\\n\t./$(DEPDIR)/libutil_a-SeqReader.Po \\\n\t./$(DEPDIR)/libutil_a-Util.Po \\\n\t./$(DEPDIR)/libutil_a-gzstream.Po \\\n\t./$(DEPDIR)/libutil_a-stdaln.Po\nam__mv = mv -f\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nAM_V_CXX = $(am__v_CXX_@AM_V@)\nam__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)\nam__v_CXX_0 = @echo \"  CXX     \" $@;\nam__v_CXX_1 = \nCXXLD = $(CXX)\nCXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \\\n\t-o $@\nAM_V_CXXLD = $(am__v_CXXLD_@AM_V@)\nam__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)\nam__v_CXXLD_0 = @echo \"  CXXLD   \" $@;\nam__v_CXXLD_1 = \nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libutil_a_SOURCES)\nDIST_SOURCES = $(libutil_a_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_CXXFLAGS = @AM_CXXFLAGS@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nOBJEXT = @OBJEXT@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild_alias = @build_alias@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost_alias = @host_alias@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nnoinst_LIBRARIES = libutil.a\nlibutil_a_CPPFLAGS = -I$(top_srcdir)/src/SGA/Bigraph \\\n\t             -I$(top_srcdir)/SeqLib\n\nlibutil_a_SOURCES = Util.cpp stdaln.c Alphabet.cpp Contig.cpp \\\n\t\tReadTable.cpp ReadInfoTable.cpp SeqReader.cpp DNAString.cpp Match.cpp \\\n\t\tPileup.cpp Interval.cpp SeqCoord.cpp QualityVector.cpp Quality.cpp \\\n\t\tPrimerScreen.cpp CorrectionThresholds.cpp ClusterReader.cpp QualityTable.cpp \\\n\t\tgzstream.C BitChar.cpp MultiOverlap.cpp\n\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .C .c .cpp .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/SGA/Util/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/SGA/Util/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLIBRARIES:\n\t-test -z \"$(noinst_LIBRARIES)\" || rm -f $(noinst_LIBRARIES)\n\nlibutil.a: $(libutil_a_OBJECTS) $(libutil_a_DEPENDENCIES) $(EXTRA_libutil_a_DEPENDENCIES) \n\t$(AM_V_at)-rm -f libutil.a\n\t$(AM_V_AR)$(libutil_a_AR) libutil.a $(libutil_a_OBJECTS) $(libutil_a_LIBADD)\n\t$(AM_V_at)$(RANLIB) libutil.a\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-Alphabet.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-BitChar.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-ClusterReader.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-Contig.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-CorrectionThresholds.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-DNAString.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-Interval.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-Match.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-MultiOverlap.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-Pileup.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-PrimerScreen.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-Quality.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-QualityTable.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-QualityVector.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-ReadInfoTable.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-ReadTable.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-SeqCoord.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-SeqReader.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-Util.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-gzstream.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_a-stdaln.Po@am__quote@ # am--include-marker\n\n$(am__depfiles_remade):\n\t@$(MKDIR_P) $(@D)\n\t@echo '# dummy' >$@-t && $(am__mv) $@-t $@\n\nam--depfiles: $(am__depfiles_remade)\n\n.C.o:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<\n\n.C.obj:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\nlibutil_a-Util.o: Util.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Util.o -MD -MP -MF $(DEPDIR)/libutil_a-Util.Tpo -c -o libutil_a-Util.o `test -f 'Util.cpp' || echo '$(srcdir)/'`Util.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Util.Tpo $(DEPDIR)/libutil_a-Util.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Util.cpp' object='libutil_a-Util.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Util.o `test -f 'Util.cpp' || echo '$(srcdir)/'`Util.cpp\n\nlibutil_a-Util.obj: Util.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Util.obj -MD -MP -MF $(DEPDIR)/libutil_a-Util.Tpo -c -o libutil_a-Util.obj `if test -f 'Util.cpp'; then $(CYGPATH_W) 'Util.cpp'; else $(CYGPATH_W) '$(srcdir)/Util.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Util.Tpo $(DEPDIR)/libutil_a-Util.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Util.cpp' object='libutil_a-Util.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Util.obj `if test -f 'Util.cpp'; then $(CYGPATH_W) 'Util.cpp'; else $(CYGPATH_W) '$(srcdir)/Util.cpp'; fi`\n\nlibutil_a-Alphabet.o: Alphabet.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Alphabet.o -MD -MP -MF $(DEPDIR)/libutil_a-Alphabet.Tpo -c -o libutil_a-Alphabet.o `test -f 'Alphabet.cpp' || echo '$(srcdir)/'`Alphabet.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Alphabet.Tpo $(DEPDIR)/libutil_a-Alphabet.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Alphabet.cpp' object='libutil_a-Alphabet.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Alphabet.o `test -f 'Alphabet.cpp' || echo '$(srcdir)/'`Alphabet.cpp\n\nlibutil_a-Alphabet.obj: Alphabet.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Alphabet.obj -MD -MP -MF $(DEPDIR)/libutil_a-Alphabet.Tpo -c -o libutil_a-Alphabet.obj `if test -f 'Alphabet.cpp'; then $(CYGPATH_W) 'Alphabet.cpp'; else $(CYGPATH_W) '$(srcdir)/Alphabet.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Alphabet.Tpo $(DEPDIR)/libutil_a-Alphabet.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Alphabet.cpp' object='libutil_a-Alphabet.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Alphabet.obj `if test -f 'Alphabet.cpp'; then $(CYGPATH_W) 'Alphabet.cpp'; else $(CYGPATH_W) '$(srcdir)/Alphabet.cpp'; fi`\n\nlibutil_a-Contig.o: Contig.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Contig.o -MD -MP -MF $(DEPDIR)/libutil_a-Contig.Tpo -c -o libutil_a-Contig.o `test -f 'Contig.cpp' || echo '$(srcdir)/'`Contig.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Contig.Tpo $(DEPDIR)/libutil_a-Contig.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Contig.cpp' object='libutil_a-Contig.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Contig.o `test -f 'Contig.cpp' || echo '$(srcdir)/'`Contig.cpp\n\nlibutil_a-Contig.obj: Contig.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Contig.obj -MD -MP -MF $(DEPDIR)/libutil_a-Contig.Tpo -c -o libutil_a-Contig.obj `if test -f 'Contig.cpp'; then $(CYGPATH_W) 'Contig.cpp'; else $(CYGPATH_W) '$(srcdir)/Contig.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Contig.Tpo $(DEPDIR)/libutil_a-Contig.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Contig.cpp' object='libutil_a-Contig.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Contig.obj `if test -f 'Contig.cpp'; then $(CYGPATH_W) 'Contig.cpp'; else $(CYGPATH_W) '$(srcdir)/Contig.cpp'; fi`\n\nlibutil_a-ReadTable.o: ReadTable.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-ReadTable.o -MD -MP -MF $(DEPDIR)/libutil_a-ReadTable.Tpo -c -o libutil_a-ReadTable.o `test -f 'ReadTable.cpp' || echo '$(srcdir)/'`ReadTable.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-ReadTable.Tpo $(DEPDIR)/libutil_a-ReadTable.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='ReadTable.cpp' object='libutil_a-ReadTable.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-ReadTable.o `test -f 'ReadTable.cpp' || echo '$(srcdir)/'`ReadTable.cpp\n\nlibutil_a-ReadTable.obj: ReadTable.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-ReadTable.obj -MD -MP -MF $(DEPDIR)/libutil_a-ReadTable.Tpo -c -o libutil_a-ReadTable.obj `if test -f 'ReadTable.cpp'; then $(CYGPATH_W) 'ReadTable.cpp'; else $(CYGPATH_W) '$(srcdir)/ReadTable.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-ReadTable.Tpo $(DEPDIR)/libutil_a-ReadTable.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='ReadTable.cpp' object='libutil_a-ReadTable.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-ReadTable.obj `if test -f 'ReadTable.cpp'; then $(CYGPATH_W) 'ReadTable.cpp'; else $(CYGPATH_W) '$(srcdir)/ReadTable.cpp'; fi`\n\nlibutil_a-ReadInfoTable.o: ReadInfoTable.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-ReadInfoTable.o -MD -MP -MF $(DEPDIR)/libutil_a-ReadInfoTable.Tpo -c -o libutil_a-ReadInfoTable.o `test -f 'ReadInfoTable.cpp' || echo '$(srcdir)/'`ReadInfoTable.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-ReadInfoTable.Tpo $(DEPDIR)/libutil_a-ReadInfoTable.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='ReadInfoTable.cpp' object='libutil_a-ReadInfoTable.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-ReadInfoTable.o `test -f 'ReadInfoTable.cpp' || echo '$(srcdir)/'`ReadInfoTable.cpp\n\nlibutil_a-ReadInfoTable.obj: ReadInfoTable.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-ReadInfoTable.obj -MD -MP -MF $(DEPDIR)/libutil_a-ReadInfoTable.Tpo -c -o libutil_a-ReadInfoTable.obj `if test -f 'ReadInfoTable.cpp'; then $(CYGPATH_W) 'ReadInfoTable.cpp'; else $(CYGPATH_W) '$(srcdir)/ReadInfoTable.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-ReadInfoTable.Tpo $(DEPDIR)/libutil_a-ReadInfoTable.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='ReadInfoTable.cpp' object='libutil_a-ReadInfoTable.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-ReadInfoTable.obj `if test -f 'ReadInfoTable.cpp'; then $(CYGPATH_W) 'ReadInfoTable.cpp'; else $(CYGPATH_W) '$(srcdir)/ReadInfoTable.cpp'; fi`\n\nlibutil_a-SeqReader.o: SeqReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-SeqReader.o -MD -MP -MF $(DEPDIR)/libutil_a-SeqReader.Tpo -c -o libutil_a-SeqReader.o `test -f 'SeqReader.cpp' || echo '$(srcdir)/'`SeqReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-SeqReader.Tpo $(DEPDIR)/libutil_a-SeqReader.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SeqReader.cpp' object='libutil_a-SeqReader.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-SeqReader.o `test -f 'SeqReader.cpp' || echo '$(srcdir)/'`SeqReader.cpp\n\nlibutil_a-SeqReader.obj: SeqReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-SeqReader.obj -MD -MP -MF $(DEPDIR)/libutil_a-SeqReader.Tpo -c -o libutil_a-SeqReader.obj `if test -f 'SeqReader.cpp'; then $(CYGPATH_W) 'SeqReader.cpp'; else $(CYGPATH_W) '$(srcdir)/SeqReader.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-SeqReader.Tpo $(DEPDIR)/libutil_a-SeqReader.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SeqReader.cpp' object='libutil_a-SeqReader.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-SeqReader.obj `if test -f 'SeqReader.cpp'; then $(CYGPATH_W) 'SeqReader.cpp'; else $(CYGPATH_W) '$(srcdir)/SeqReader.cpp'; fi`\n\nlibutil_a-DNAString.o: DNAString.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-DNAString.o -MD -MP -MF $(DEPDIR)/libutil_a-DNAString.Tpo -c -o libutil_a-DNAString.o `test -f 'DNAString.cpp' || echo '$(srcdir)/'`DNAString.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-DNAString.Tpo $(DEPDIR)/libutil_a-DNAString.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='DNAString.cpp' object='libutil_a-DNAString.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-DNAString.o `test -f 'DNAString.cpp' || echo '$(srcdir)/'`DNAString.cpp\n\nlibutil_a-DNAString.obj: DNAString.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-DNAString.obj -MD -MP -MF $(DEPDIR)/libutil_a-DNAString.Tpo -c -o libutil_a-DNAString.obj `if test -f 'DNAString.cpp'; then $(CYGPATH_W) 'DNAString.cpp'; else $(CYGPATH_W) '$(srcdir)/DNAString.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-DNAString.Tpo $(DEPDIR)/libutil_a-DNAString.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='DNAString.cpp' object='libutil_a-DNAString.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-DNAString.obj `if test -f 'DNAString.cpp'; then $(CYGPATH_W) 'DNAString.cpp'; else $(CYGPATH_W) '$(srcdir)/DNAString.cpp'; fi`\n\nlibutil_a-Match.o: Match.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Match.o -MD -MP -MF $(DEPDIR)/libutil_a-Match.Tpo -c -o libutil_a-Match.o `test -f 'Match.cpp' || echo '$(srcdir)/'`Match.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Match.Tpo $(DEPDIR)/libutil_a-Match.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Match.cpp' object='libutil_a-Match.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Match.o `test -f 'Match.cpp' || echo '$(srcdir)/'`Match.cpp\n\nlibutil_a-Match.obj: Match.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Match.obj -MD -MP -MF $(DEPDIR)/libutil_a-Match.Tpo -c -o libutil_a-Match.obj `if test -f 'Match.cpp'; then $(CYGPATH_W) 'Match.cpp'; else $(CYGPATH_W) '$(srcdir)/Match.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Match.Tpo $(DEPDIR)/libutil_a-Match.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Match.cpp' object='libutil_a-Match.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Match.obj `if test -f 'Match.cpp'; then $(CYGPATH_W) 'Match.cpp'; else $(CYGPATH_W) '$(srcdir)/Match.cpp'; fi`\n\nlibutil_a-Pileup.o: Pileup.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Pileup.o -MD -MP -MF $(DEPDIR)/libutil_a-Pileup.Tpo -c -o libutil_a-Pileup.o `test -f 'Pileup.cpp' || echo '$(srcdir)/'`Pileup.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Pileup.Tpo $(DEPDIR)/libutil_a-Pileup.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Pileup.cpp' object='libutil_a-Pileup.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Pileup.o `test -f 'Pileup.cpp' || echo '$(srcdir)/'`Pileup.cpp\n\nlibutil_a-Pileup.obj: Pileup.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Pileup.obj -MD -MP -MF $(DEPDIR)/libutil_a-Pileup.Tpo -c -o libutil_a-Pileup.obj `if test -f 'Pileup.cpp'; then $(CYGPATH_W) 'Pileup.cpp'; else $(CYGPATH_W) '$(srcdir)/Pileup.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Pileup.Tpo $(DEPDIR)/libutil_a-Pileup.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Pileup.cpp' object='libutil_a-Pileup.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Pileup.obj `if test -f 'Pileup.cpp'; then $(CYGPATH_W) 'Pileup.cpp'; else $(CYGPATH_W) '$(srcdir)/Pileup.cpp'; fi`\n\nlibutil_a-Interval.o: Interval.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Interval.o -MD -MP -MF $(DEPDIR)/libutil_a-Interval.Tpo -c -o libutil_a-Interval.o `test -f 'Interval.cpp' || echo '$(srcdir)/'`Interval.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Interval.Tpo $(DEPDIR)/libutil_a-Interval.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Interval.cpp' object='libutil_a-Interval.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Interval.o `test -f 'Interval.cpp' || echo '$(srcdir)/'`Interval.cpp\n\nlibutil_a-Interval.obj: Interval.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Interval.obj -MD -MP -MF $(DEPDIR)/libutil_a-Interval.Tpo -c -o libutil_a-Interval.obj `if test -f 'Interval.cpp'; then $(CYGPATH_W) 'Interval.cpp'; else $(CYGPATH_W) '$(srcdir)/Interval.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Interval.Tpo $(DEPDIR)/libutil_a-Interval.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Interval.cpp' object='libutil_a-Interval.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Interval.obj `if test -f 'Interval.cpp'; then $(CYGPATH_W) 'Interval.cpp'; else $(CYGPATH_W) '$(srcdir)/Interval.cpp'; fi`\n\nlibutil_a-SeqCoord.o: SeqCoord.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-SeqCoord.o -MD -MP -MF $(DEPDIR)/libutil_a-SeqCoord.Tpo -c -o libutil_a-SeqCoord.o `test -f 'SeqCoord.cpp' || echo '$(srcdir)/'`SeqCoord.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-SeqCoord.Tpo $(DEPDIR)/libutil_a-SeqCoord.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SeqCoord.cpp' object='libutil_a-SeqCoord.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-SeqCoord.o `test -f 'SeqCoord.cpp' || echo '$(srcdir)/'`SeqCoord.cpp\n\nlibutil_a-SeqCoord.obj: SeqCoord.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-SeqCoord.obj -MD -MP -MF $(DEPDIR)/libutil_a-SeqCoord.Tpo -c -o libutil_a-SeqCoord.obj `if test -f 'SeqCoord.cpp'; then $(CYGPATH_W) 'SeqCoord.cpp'; else $(CYGPATH_W) '$(srcdir)/SeqCoord.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-SeqCoord.Tpo $(DEPDIR)/libutil_a-SeqCoord.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='SeqCoord.cpp' object='libutil_a-SeqCoord.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-SeqCoord.obj `if test -f 'SeqCoord.cpp'; then $(CYGPATH_W) 'SeqCoord.cpp'; else $(CYGPATH_W) '$(srcdir)/SeqCoord.cpp'; fi`\n\nlibutil_a-QualityVector.o: QualityVector.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-QualityVector.o -MD -MP -MF $(DEPDIR)/libutil_a-QualityVector.Tpo -c -o libutil_a-QualityVector.o `test -f 'QualityVector.cpp' || echo '$(srcdir)/'`QualityVector.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-QualityVector.Tpo $(DEPDIR)/libutil_a-QualityVector.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='QualityVector.cpp' object='libutil_a-QualityVector.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-QualityVector.o `test -f 'QualityVector.cpp' || echo '$(srcdir)/'`QualityVector.cpp\n\nlibutil_a-QualityVector.obj: QualityVector.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-QualityVector.obj -MD -MP -MF $(DEPDIR)/libutil_a-QualityVector.Tpo -c -o libutil_a-QualityVector.obj `if test -f 'QualityVector.cpp'; then $(CYGPATH_W) 'QualityVector.cpp'; else $(CYGPATH_W) '$(srcdir)/QualityVector.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-QualityVector.Tpo $(DEPDIR)/libutil_a-QualityVector.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='QualityVector.cpp' object='libutil_a-QualityVector.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-QualityVector.obj `if test -f 'QualityVector.cpp'; then $(CYGPATH_W) 'QualityVector.cpp'; else $(CYGPATH_W) '$(srcdir)/QualityVector.cpp'; fi`\n\nlibutil_a-Quality.o: Quality.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Quality.o -MD -MP -MF $(DEPDIR)/libutil_a-Quality.Tpo -c -o libutil_a-Quality.o `test -f 'Quality.cpp' || echo '$(srcdir)/'`Quality.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Quality.Tpo $(DEPDIR)/libutil_a-Quality.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Quality.cpp' object='libutil_a-Quality.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Quality.o `test -f 'Quality.cpp' || echo '$(srcdir)/'`Quality.cpp\n\nlibutil_a-Quality.obj: Quality.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-Quality.obj -MD -MP -MF $(DEPDIR)/libutil_a-Quality.Tpo -c -o libutil_a-Quality.obj `if test -f 'Quality.cpp'; then $(CYGPATH_W) 'Quality.cpp'; else $(CYGPATH_W) '$(srcdir)/Quality.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-Quality.Tpo $(DEPDIR)/libutil_a-Quality.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='Quality.cpp' object='libutil_a-Quality.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-Quality.obj `if test -f 'Quality.cpp'; then $(CYGPATH_W) 'Quality.cpp'; else $(CYGPATH_W) '$(srcdir)/Quality.cpp'; fi`\n\nlibutil_a-PrimerScreen.o: PrimerScreen.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-PrimerScreen.o -MD -MP -MF $(DEPDIR)/libutil_a-PrimerScreen.Tpo -c -o libutil_a-PrimerScreen.o `test -f 'PrimerScreen.cpp' || echo '$(srcdir)/'`PrimerScreen.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-PrimerScreen.Tpo $(DEPDIR)/libutil_a-PrimerScreen.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='PrimerScreen.cpp' object='libutil_a-PrimerScreen.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-PrimerScreen.o `test -f 'PrimerScreen.cpp' || echo '$(srcdir)/'`PrimerScreen.cpp\n\nlibutil_a-PrimerScreen.obj: PrimerScreen.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-PrimerScreen.obj -MD -MP -MF $(DEPDIR)/libutil_a-PrimerScreen.Tpo -c -o libutil_a-PrimerScreen.obj `if test -f 'PrimerScreen.cpp'; then $(CYGPATH_W) 'PrimerScreen.cpp'; else $(CYGPATH_W) '$(srcdir)/PrimerScreen.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-PrimerScreen.Tpo $(DEPDIR)/libutil_a-PrimerScreen.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='PrimerScreen.cpp' object='libutil_a-PrimerScreen.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-PrimerScreen.obj `if test -f 'PrimerScreen.cpp'; then $(CYGPATH_W) 'PrimerScreen.cpp'; else $(CYGPATH_W) '$(srcdir)/PrimerScreen.cpp'; fi`\n\nlibutil_a-CorrectionThresholds.o: CorrectionThresholds.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-CorrectionThresholds.o -MD -MP -MF $(DEPDIR)/libutil_a-CorrectionThresholds.Tpo -c -o libutil_a-CorrectionThresholds.o `test -f 'CorrectionThresholds.cpp' || echo '$(srcdir)/'`CorrectionThresholds.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-CorrectionThresholds.Tpo $(DEPDIR)/libutil_a-CorrectionThresholds.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='CorrectionThresholds.cpp' object='libutil_a-CorrectionThresholds.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-CorrectionThresholds.o `test -f 'CorrectionThresholds.cpp' || echo '$(srcdir)/'`CorrectionThresholds.cpp\n\nlibutil_a-CorrectionThresholds.obj: CorrectionThresholds.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-CorrectionThresholds.obj -MD -MP -MF $(DEPDIR)/libutil_a-CorrectionThresholds.Tpo -c -o libutil_a-CorrectionThresholds.obj `if test -f 'CorrectionThresholds.cpp'; then $(CYGPATH_W) 'CorrectionThresholds.cpp'; else $(CYGPATH_W) '$(srcdir)/CorrectionThresholds.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-CorrectionThresholds.Tpo $(DEPDIR)/libutil_a-CorrectionThresholds.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='CorrectionThresholds.cpp' object='libutil_a-CorrectionThresholds.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-CorrectionThresholds.obj `if test -f 'CorrectionThresholds.cpp'; then $(CYGPATH_W) 'CorrectionThresholds.cpp'; else $(CYGPATH_W) '$(srcdir)/CorrectionThresholds.cpp'; fi`\n\nlibutil_a-ClusterReader.o: ClusterReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-ClusterReader.o -MD -MP -MF $(DEPDIR)/libutil_a-ClusterReader.Tpo -c -o libutil_a-ClusterReader.o `test -f 'ClusterReader.cpp' || echo '$(srcdir)/'`ClusterReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-ClusterReader.Tpo $(DEPDIR)/libutil_a-ClusterReader.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='ClusterReader.cpp' object='libutil_a-ClusterReader.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-ClusterReader.o `test -f 'ClusterReader.cpp' || echo '$(srcdir)/'`ClusterReader.cpp\n\nlibutil_a-ClusterReader.obj: ClusterReader.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-ClusterReader.obj -MD -MP -MF $(DEPDIR)/libutil_a-ClusterReader.Tpo -c -o libutil_a-ClusterReader.obj `if test -f 'ClusterReader.cpp'; then $(CYGPATH_W) 'ClusterReader.cpp'; else $(CYGPATH_W) '$(srcdir)/ClusterReader.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-ClusterReader.Tpo $(DEPDIR)/libutil_a-ClusterReader.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='ClusterReader.cpp' object='libutil_a-ClusterReader.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-ClusterReader.obj `if test -f 'ClusterReader.cpp'; then $(CYGPATH_W) 'ClusterReader.cpp'; else $(CYGPATH_W) '$(srcdir)/ClusterReader.cpp'; fi`\n\nlibutil_a-QualityTable.o: QualityTable.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-QualityTable.o -MD -MP -MF $(DEPDIR)/libutil_a-QualityTable.Tpo -c -o libutil_a-QualityTable.o `test -f 'QualityTable.cpp' || echo '$(srcdir)/'`QualityTable.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-QualityTable.Tpo $(DEPDIR)/libutil_a-QualityTable.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='QualityTable.cpp' object='libutil_a-QualityTable.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-QualityTable.o `test -f 'QualityTable.cpp' || echo '$(srcdir)/'`QualityTable.cpp\n\nlibutil_a-QualityTable.obj: QualityTable.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-QualityTable.obj -MD -MP -MF $(DEPDIR)/libutil_a-QualityTable.Tpo -c -o libutil_a-QualityTable.obj `if test -f 'QualityTable.cpp'; then $(CYGPATH_W) 'QualityTable.cpp'; else $(CYGPATH_W) '$(srcdir)/QualityTable.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-QualityTable.Tpo $(DEPDIR)/libutil_a-QualityTable.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='QualityTable.cpp' object='libutil_a-QualityTable.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-QualityTable.obj `if test -f 'QualityTable.cpp'; then $(CYGPATH_W) 'QualityTable.cpp'; else $(CYGPATH_W) '$(srcdir)/QualityTable.cpp'; fi`\n\nlibutil_a-gzstream.o: gzstream.C\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-gzstream.o -MD -MP -MF $(DEPDIR)/libutil_a-gzstream.Tpo -c -o libutil_a-gzstream.o `test -f 'gzstream.C' || echo '$(srcdir)/'`gzstream.C\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-gzstream.Tpo $(DEPDIR)/libutil_a-gzstream.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='gzstream.C' object='libutil_a-gzstream.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-gzstream.o `test -f 'gzstream.C' || echo '$(srcdir)/'`gzstream.C\n\nlibutil_a-gzstream.obj: gzstream.C\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-gzstream.obj -MD -MP -MF $(DEPDIR)/libutil_a-gzstream.Tpo -c -o libutil_a-gzstream.obj `if test -f 'gzstream.C'; then $(CYGPATH_W) 'gzstream.C'; else $(CYGPATH_W) '$(srcdir)/gzstream.C'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-gzstream.Tpo $(DEPDIR)/libutil_a-gzstream.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='gzstream.C' object='libutil_a-gzstream.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-gzstream.obj `if test -f 'gzstream.C'; then $(CYGPATH_W) 'gzstream.C'; else $(CYGPATH_W) '$(srcdir)/gzstream.C'; fi`\n\nlibutil_a-BitChar.o: BitChar.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-BitChar.o -MD -MP -MF $(DEPDIR)/libutil_a-BitChar.Tpo -c -o libutil_a-BitChar.o `test -f 'BitChar.cpp' || echo '$(srcdir)/'`BitChar.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-BitChar.Tpo $(DEPDIR)/libutil_a-BitChar.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BitChar.cpp' object='libutil_a-BitChar.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-BitChar.o `test -f 'BitChar.cpp' || echo '$(srcdir)/'`BitChar.cpp\n\nlibutil_a-BitChar.obj: BitChar.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-BitChar.obj -MD -MP -MF $(DEPDIR)/libutil_a-BitChar.Tpo -c -o libutil_a-BitChar.obj `if test -f 'BitChar.cpp'; then $(CYGPATH_W) 'BitChar.cpp'; else $(CYGPATH_W) '$(srcdir)/BitChar.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-BitChar.Tpo $(DEPDIR)/libutil_a-BitChar.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='BitChar.cpp' object='libutil_a-BitChar.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-BitChar.obj `if test -f 'BitChar.cpp'; then $(CYGPATH_W) 'BitChar.cpp'; else $(CYGPATH_W) '$(srcdir)/BitChar.cpp'; fi`\n\nlibutil_a-MultiOverlap.o: MultiOverlap.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-MultiOverlap.o -MD -MP -MF $(DEPDIR)/libutil_a-MultiOverlap.Tpo -c -o libutil_a-MultiOverlap.o `test -f 'MultiOverlap.cpp' || echo '$(srcdir)/'`MultiOverlap.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-MultiOverlap.Tpo $(DEPDIR)/libutil_a-MultiOverlap.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='MultiOverlap.cpp' object='libutil_a-MultiOverlap.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-MultiOverlap.o `test -f 'MultiOverlap.cpp' || echo '$(srcdir)/'`MultiOverlap.cpp\n\nlibutil_a-MultiOverlap.obj: MultiOverlap.cpp\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_a-MultiOverlap.obj -MD -MP -MF $(DEPDIR)/libutil_a-MultiOverlap.Tpo -c -o libutil_a-MultiOverlap.obj `if test -f 'MultiOverlap.cpp'; then $(CYGPATH_W) 'MultiOverlap.cpp'; else $(CYGPATH_W) '$(srcdir)/MultiOverlap.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-MultiOverlap.Tpo $(DEPDIR)/libutil_a-MultiOverlap.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='MultiOverlap.cpp' object='libutil_a-MultiOverlap.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_a-MultiOverlap.obj `if test -f 'MultiOverlap.cpp'; then $(CYGPATH_W) 'MultiOverlap.cpp'; else $(CYGPATH_W) '$(srcdir)/MultiOverlap.cpp'; fi`\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\nlibutil_a-stdaln.o: stdaln.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libutil_a-stdaln.o -MD -MP -MF $(DEPDIR)/libutil_a-stdaln.Tpo -c -o libutil_a-stdaln.o `test -f 'stdaln.c' || echo '$(srcdir)/'`stdaln.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-stdaln.Tpo $(DEPDIR)/libutil_a-stdaln.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='stdaln.c' object='libutil_a-stdaln.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libutil_a-stdaln.o `test -f 'stdaln.c' || echo '$(srcdir)/'`stdaln.c\n\nlibutil_a-stdaln.obj: stdaln.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libutil_a-stdaln.obj -MD -MP -MF $(DEPDIR)/libutil_a-stdaln.Tpo -c -o libutil_a-stdaln.obj `if test -f 'stdaln.c'; then $(CYGPATH_W) 'stdaln.c'; else $(CYGPATH_W) '$(srcdir)/stdaln.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libutil_a-stdaln.Tpo $(DEPDIR)/libutil_a-stdaln.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='stdaln.c' object='libutil_a-stdaln.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libutil_a-stdaln.obj `if test -f 'stdaln.c'; then $(CYGPATH_W) 'stdaln.c'; else $(CYGPATH_W) '$(srcdir)/stdaln.c'; fi`\n\n.cpp.o:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<\n\n.cpp.obj:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(BUILT_SOURCES)\n\t$(MAKE) $(AM_MAKEFLAGS) distdir-am\n\ndistdir-am: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LIBRARIES)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am\n\ndistclean: distclean-am\n\t\t-rm -f ./$(DEPDIR)/libutil_a-Alphabet.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-BitChar.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-ClusterReader.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Contig.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-CorrectionThresholds.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-DNAString.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Interval.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Match.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-MultiOverlap.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Pileup.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-PrimerScreen.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Quality.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-QualityTable.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-QualityVector.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-ReadInfoTable.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-ReadTable.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-SeqCoord.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-SeqReader.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Util.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-gzstream.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-stdaln.Po\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t\t-rm -f ./$(DEPDIR)/libutil_a-Alphabet.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-BitChar.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-ClusterReader.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Contig.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-CorrectionThresholds.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-DNAString.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Interval.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Match.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-MultiOverlap.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Pileup.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-PrimerScreen.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Quality.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-QualityTable.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-QualityVector.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-ReadInfoTable.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-ReadTable.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-SeqCoord.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-SeqReader.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-Util.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-gzstream.Po\n\t-rm -f ./$(DEPDIR)/libutil_a-stdaln.Po\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \\\n\tclean-generic clean-noinstLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/SGA/Util/Match.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Match - A pair of coordinates representing the overlapping\n// regions of two sequences\n//\n#include \"Match.h\"\n#include <iostream>\n\n// Constructor\nMatch::Match(const SeqCoord& sc1, const SeqCoord& sc2, bool isRC, int nd)\n{\n    coord[0] = sc1;\n    coord[1] = sc2;\n    isReverse = isRC;\n    numDiff = nd;\n}\n\n// Constructor\nMatch::Match(int s1, int e1, int l1, int s2, int e2, int l2, bool isRC, int nd)\n{\n    coord[0] = SeqCoord(s1, e1, l1);\n    coord[1] = SeqCoord(s2, e2, l2);\n    isReverse = isRC;\n    numDiff = nd;\n}\n\n// Swap the order of the elements\nvoid Match::swap()\n{\n    SeqCoord tmp = coord[0];\n    coord[0] = coord[1];\n    coord[1] = tmp;\n}\n\n// Flip coord2 so that it is in the same frame as coord1\nvoid Match::canonize()\n{\n    if(isRC())\n        coord[1].flip();\n    isReverse = false;\n}\n\n// Flip coord2 so it is out of frame of coord1\nvoid Match::decanonize()\n{\n    if(!isRC())\n        coord[1].flip();\n    isReverse = true;\n}\n\n// Calculation the translation offset to shift\n// a coord[0] position to a coord[1]. This must be calculated\n// using canonical coordinates\nint Match::calculateTranslation() const\n{\n    if(!isRC())\n        return coord[1].interval.start - coord[0].interval.start;\n    else\n    {\n        SeqCoord f = coord[1];\n        f.flip();\n        return f.interval.start - coord[0].interval.start;\n    }\n}\n\n// Calculation the translation offset to shift\n// a coord[1] position to a coord[0]. This must be calculated\n// using canonical coordinates\nint Match::calculateInverseTranslation() const\n{\n    if(!isRC())\n        return coord[0].interval.start - coord[1].interval.start;\n    else\n    {\n        SeqCoord f = coord[0];\n        f.flip();\n        return f.interval.start - coord[1].interval.start;\n    }\n}\n\n\n// Translate the SeqCoord c from the frame of coord[0] to coord[1]\nSeqCoord Match::translate(const SeqCoord& c) const\n{\n    assert(coord[0].length() == coord[1].length()); // ensure translation is valid\n    int t = calculateTranslation();\n\n    SeqCoord out;\n    out.seqlen = coord[1].seqlen;\n    out.interval.start = c.interval.start + t;\n    out.interval.end = c.interval.end + t;\n    if(isRC())\n        out.flip();\n    \n    return out;\n}\n\n// Translate the SeqCoord c from the frame of coord[1] to coord[0]\nSeqCoord Match::inverseTranslate(const SeqCoord& c) const\n{\n    assert(coord[0].length() == coord[1].length()); // ensure translation is valid\n    int t = calculateInverseTranslation();\n    \n    SeqCoord out;\n    out.seqlen = coord[0].seqlen;\n    out.interval.start = c.interval.start + t;\n    out.interval.end = c.interval.end + t;\n\n    if(isRC())\n        out.flip();\n\n    return out;\n}\n\n// Translate a single position from c[0] frame to c[1]\nint Match::translate(int c) const\n{\n    assert(!isRC());\n    assert(coord[0].length() == coord[1].length()); // ensure translation is valid\n    int t = calculateTranslation();\n    return c + t;\n}\n\n// Translate a single position from c[1] frame to c[0]\nint Match::inverseTranslate(int c) const\n{\n    assert(!isRC());\n    assert(coord[0].length() == coord[1].length());\n    int t = calculateInverseTranslation();\n    return c + t;\n}\n\n// Given two matches, match_xy and match_xz infer the \n// match between yz. This requies coord[0] of the input \n// matches to be referring to the same sequence\n// This returns the minimal matching region, it could possibly be extended\nMatch Match::infer(const Match& match_xy, const Match& match_xz)\n{\n    assert(match_xy.coord[0].seqlen == match_xz.coord[0].seqlen);\n\n    // Calculate the max/min start/end coordinates of coord[0]\n    int s = std::max(match_xy.coord[0].interval.start, match_xz.coord[0].interval.start);\n    int e = std::min(match_xy.coord[0].interval.end, match_xz.coord[0].interval.end);\n\n    // These are the coordinates in frame X\n    SeqCoord r_y(s, e, match_xy.coord[0].seqlen);\n    SeqCoord r_z(s, e, match_xz.coord[0].seqlen);\n\n    // Translate into the desired frame\n    SeqCoord t_y = match_xy.translate(r_y);\n    SeqCoord t_z = match_xz.translate(r_z);\n\n    // Set the new lengths of the seqcoords\n    t_y.seqlen = match_xy.coord[1].seqlen;\n    t_z.seqlen = match_xz.coord[1].seqlen;\n\n    return Match(t_y, t_z, match_xy.isRC() != match_xz.isRC(), -1);\n}\n\n// Given two matches, match_xy and match_xz, return\n// true if the match coordinates intersect. Assumes\n// that the matches have a common basis which is coord[0]\nbool Match::doMatchesIntersect(const Match& match_xy, const Match& match_xz)\n{\n    int s = std::max(match_xy.coord[0].interval.start, match_xz.coord[0].interval.start);\n    int e = std::min(match_xy.coord[0].interval.end, match_xz.coord[0].interval.end);\n    if(s > e)\n        return false;\n    else\n        return true;    \n}\n\n// Expand the match outwards so one sequence is left terminal and one sequence\n// is right terminal. This makes it a \"proper\" overlap\n// This function assumes the coordinates are valid (see SeqCoord)\nvoid Match::expand()\n{\n    assert(coord[0].isValid() && coord[1].isValid());\n\n    // This is simpler if the coordinates are in canonical form, so here were canonize\n    // them and decanonize after\n    bool flipped = false;\n    if(isRC())\n    {\n        flipped = true;\n        canonize();\n    }\n\n    // left expansion\n    if(!coord[0].isLeftExtreme() || !coord[1].isLeftExtreme())\n    {\n        int dist = std::min(coord[0].getLeftDist(), coord[1].getLeftDist());\n        coord[0].interval.start -= dist;\n        coord[1].interval.start -= dist;\n    }\n\n    // right expansion\n    if(!coord[0].isRightExtreme() || !coord[1].isRightExtreme())\n    {\n        int dist = std::min(coord[0].getRightDist(), coord[1].getRightDist());\n        coord[0].interval.end += dist;\n        coord[1].interval.end += dist;\n    }\n\n    if(flipped)\n        decanonize();\n    assert(coord[0].isValid() && coord[1].isValid());\n}\n\n// Count the number of differences between the two strings based on the match\nint Match::countDifferences(const std::string& s1, const std::string& s2) const\n{\n    std::string matched1 = coord[0].getSubstring(s1);\n    std::string matched2 = coord[1].getSubstring(s2);\n\n    if(isReverse)\n        matched2 = reverseComplement(matched2);\n\n    return ::countDifferences(matched1, matched2, matched1.length());\n}\n\nbool Match::isSubstringContainment() const\n{ \n    return isContainment() && (!coord[0].isContained() || !coord[1].isContained()); \n}\n\n\n// Print the matched strings\nvoid Match::printMatch(const std::string& s1, const std::string& s2) const\n{\n    std::string matched1 = coord[0].getSubstring(s1);\n    std::string matched2 = coord[1].getSubstring(s2);\n\n    if(isReverse)\n        matched2 = reverseComplement(matched2);\n\n    std::cout << \"M1: \" << matched1 << \"\\n\";\n    std::cout << \"M2: \" << matched2 << \"\\n\";\n}\n\n// Output\nstd::ostream& operator<<(std::ostream& out, const Match& m)\n{\n    out << m.coord[0] << \" \" << m.coord[1] << \" \" << m.isReverse << \" \" << m.numDiff;\n    return out;\n}\n\n// Input\nstd::istream& operator>>(std::istream& in, Match& m)\n{\n    in >> m.coord[0] >> m.coord[1] >> m.isReverse >> m.numDiff;\n    return in;\n}\n\n//\n// Overlap\n//\nOverlap::Overlap(const std::string& i1, const std::string& i2, const Match& m) : match(m)\n{\n    id[0] = i1;\n    id[1] = i2;\n}\n\nOverlap::Overlap(const std::string& i1, const SeqCoord& sc1, \n                 const std::string& i2, const SeqCoord& sc2, bool isRC, int nd)\n{\n    id[0] = i1;\n    id[1] = i2;\n    match = Match(sc1, sc2, isRC, nd);\n}\n\nOverlap::Overlap(const std::string& i1, int s1, int e1, int l1,\n                 const std::string& i2, int s2, int e2, int l2, bool isRC, int nd)\n{\n    id[0] = i1;\n    id[1] = i2;\n    match = Match(s1, e1, l1, s2, e2, l2, isRC, nd);\n}\n\n// Return the index of the contained vertex\n// Precondition: the overlap is a containment\nsize_t Overlap::getContainedIdx() const\n{\n    // The verts are mutually contained, return the lexographically lower id\n    if(match.coord[0].isContained() && match.coord[1].isContained())\n    {\n        if(id[0] < id[1])\n            return 1;\n        else\n            return 0;\n    }\n    else if(match.coord[0].isContained())\n    {\n        return 0;\n    }\n    else\n    {\n        assert(match.coord[1].isContained());\n        return 1;\n    }\n}\n\n// Return the ID of the contained vertex\n// Precondition: The overlap is a containment\nstd::string Overlap::getContainedID() const\n{\n    return id[getContainedIdx()];\n}\n\n// Swap the elements\nvoid Overlap::swap()\n{\n    id[0].swap(id[1]);\n    match.swap();\n}\n\n// \nint Overlap::getOverlapLength(size_t idx) const\n{\n    assert(idx <= 1);\n    return match.coord[idx].length();\n}\n\n// Output\nstd::ostream& operator<<(std::ostream& out, const Overlap& o)\n{\n    out << o.id[0] << \" \" << o.id[1] << \" \" << o.match;\n    return out;\n}\n\n// Input\nstd::istream& operator>>(std::istream& in, Overlap& o)\n{\n    in >> o.id[0] >> o.id[1] >> o.match;\n    return in;\n}\n"
  },
  {
    "path": "src/SGA/Util/Match.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// Match - A pair of coordinates representing the overlapping\n// regions of two sequences\n//\n#ifndef MATCH_H\n#define MATCH_H\n\n#include \"Util.h\"\n#include \"SeqCoord.h\"\n\nstruct Match\n{\n    // functions\n    Match() {}\n    Match(const SeqCoord& sc1, const SeqCoord& sc2, bool isRC, int nd);\n    Match(int s1, int e1, int l1, int s2, int e2, int l2, bool isRC, int nd);\n\n    // Accessors\n    inline bool isRC() const { return isReverse; }\n    inline int getNumDiffs() const { return numDiff; }\n    inline int getMinOverlapLength() const { return std::min(coord[0].length(), coord[1].length()); }\n    inline int getMaxOverlapLength() const { return std::max(coord[0].length(), coord[1].length()); }\n\n    void setNumDiffs(int n) { numDiff = n; }\n    \n    // Calculate the translation offset from coord[0] to coord[1]\n    int calculateTranslation() const;\n    int calculateInverseTranslation() const;\n\n    // Translate the SeqCoord c from the frame of coord[0] to coord[1]\n    SeqCoord translate(const SeqCoord& c) const;\n\n    // Translate the SeqCoord c from the frame of coord[1] to coord[0]\n    SeqCoord inverseTranslate(const SeqCoord& c) const;\n\n    // Translate a single position from c[0] frame to c[1]\n    int translate(int c) const;\n\n    // Translate a single position from c[1] frame to c[0]\n    int inverseTranslate(int c) const;\n\n    // Swap the coords of this element\n    void swap();\n\n    // Infer an overlap between yz given matches xy and xz\n    static Match infer(const Match& match_xy, const Match& match_xz);\n    static bool doMatchesIntersect(const Match& match_xy, const Match& match_xz);\n\n    // Expand a match outwards so each end is terminal for both coordinates\n    void expand();\n\n    // Count the number of differences between the strings assuming no indels\n    int countDifferences(const std::string& s1, const std::string& s2) const;\n\n    // Print the matched strings\n    void printMatch(const std::string& s1, const std::string& s2) const;\n\n    // Flip coord[1] if isReverse is true, effectively\n    // bringing the matching strings into the same coordinate system\n    void canonize();\n    void decanonize();\n\n    // Returns true if one overlap is contained within the other, ie they are not equal\n    bool isSubstringContainment() const; \n    bool isContainment() const { return coord[0].isContained() || coord[1].isContained(); }\n\n    // IO\n    friend std::ostream& operator<<(std::ostream& out, const Match& m);\n    friend std::istream& operator>>(std::istream& in, Match& m);\n\n    // data\n    SeqCoord coord[2];\n    bool isReverse;\n    int numDiff;\n};\n\n// Overlap\nstruct Overlap\n{\n    // constructors\n    Overlap() {}\n    Overlap(const std::string& i1, const std::string& i2, const Match& m);\n\n    Overlap(const std::string& i1, const SeqCoord& sc1, \n            const std::string& i2, const SeqCoord& sc2, bool isRC, int nd); \n\n    Overlap(const std::string& i1, int s1, int e1, int l1, \n            const std::string& i2, int s2, int e2, int l2, bool isRC, int nd); \n\n    // functions\n    \n    // Swap the order of the elements\n    void swap();\n\n    //\n    bool isContainment() const { return match.isContainment(); }\n    bool isSubstringContainment() const { return match.isSubstringContainment(); }\n    // Return the index (0 or 1) of the CONTAINED vertex (the discarded vertex of a containment)\n    size_t getContainedIdx() const;\n    std::string getContainedID() const;\n\n    //\n    int getOverlapLength(size_t idx) const;\n\n    friend std::ostream& operator<<(std::ostream& out, const Overlap& o);\n    friend std::istream& operator>>(std::istream& in, Overlap& o);\n\n    // data\n    std::string id[2];\n    Match match;\n};\n\n// Collections\ntypedef std::vector<Overlap> OverlapVector;\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Metrics.h",
    "content": "///-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Metrics - Data structures to record data metrics\n// error rates, error distributions, etc\n//\n#ifndef METRICS_H\n#define METRICS_H\n\n#include <map>\n\nstruct ErrorCount\n{\n    int64_t num_samples;\n    int64_t num_errors;\n};\n\ntemplate<class Key>\nclass ErrorCountMap\n{\n    typedef std::map<Key, ErrorCount> DataMap;\n\n    public:\n        ErrorCountMap() {}\n\n        //\n        void incrementSample(const Key& key)\n        {\n            ++m_data[key].num_samples;\n        }\n\n        //\n        void incrementError(const Key& key)\n        {\n            ++m_data[key].num_errors;\n        }\n\n        //\n        void write(std::ostream* pWriter, const std::string& leader, const std::string& header)\n        {\n            *pWriter << leader;\n            *pWriter << header << \"\\tsamples\\terrors\\tfraction\\n\";\n            for(typename DataMap::iterator iter = m_data.begin(); iter != m_data.end(); ++iter)\n            {\n                *pWriter << iter->first << \"\\t\" << \n                             iter->second.num_samples << \"\\t\" << \n                             iter->second.num_errors << \"\\t\" << \n                             (double)iter->second.num_errors / iter->second.num_samples << \"\\n\";\n            }\n        }\n\n    private:\n\n        DataMap m_data;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/MultiAlignment.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// MultiAlignment - Class constructing a multiple\n// alignment between a root sequence and a set of sequences\n//\n#include <iostream>\n#include <algorithm>\n#include <map>\n#include <limits>\n#include \"MultiAlignment.h\"\n#include \"StdAlnTools.h\"\n\nstruct CigarIter\n{\n    const MAlignData* pData;\n    int symIdx; // the index of the cigar string we are parsing\n    int baseIdx; // the index of the current base \n\n    char updateAndEmit(char updateMode)\n    {\n        char cigSym = getCigarSymbol();\n        char outBase;\n\n        if(updateMode == 'I')\n        {\n            if(cigSym == 'I')\n            {\n                symIdx += 1;\n                outBase = '-';\n            }\n            else if(cigSym == 'D')\n            {\n                assert(false);\n            }\n            else\n            {\n                symIdx += 1;\n                outBase = getOutputBase(cigSym);\n                if(outBase != '.' && outBase != '-')\n                    baseIdx += 1;\n            }\n        }\n        else if(updateMode == 'D')\n        {\n            if(cigSym == 'D')\n            {\n                symIdx += 1;\n                outBase = getOutputBase(cigSym);\n                if(outBase != '.')\n                    baseIdx += 1;\n            }\n            else if(cigSym == 'I')\n            {\n                outBase = '-';\n            }\n            else if(cigSym == 'S')\n            {\n                outBase = '.';\n            }\n            else\n            {\n                outBase = '-';\n                //symIdx += 1;\n            }\n        }\n        else\n        {\n            symIdx += 1;\n            outBase = getOutputBase(cigSym);\n            if(outBase != '.')\n                baseIdx += 1;\n        }\n\n        return outBase;\n    }\n\n    char getCigarSymbol()\n    {\n        if(symIdx >= (int)pData->expandedCigar.size())\n            return 'S';\n        return pData->expandedCigar[symIdx];\n    }\n\n    char getOutputBase(char cigSym)\n    {\n        if(cigSym == 'S' || cigSym == 'N')\n            return '.';\n        else\n            return pData->str[baseIdx];\n    }\n\n    static bool sortPosition(const CigarIter& a, const CigarIter& b)\n    {\n        return a.pData->position < b.pData->position;\n    }\n};\ntypedef std::vector<CigarIter> CigarIterVector;\n\nMultiAlignment::MultiAlignment(std::string rootStr, const MAlignDataVector& inData, std::string rootName)\n{\n    m_verbose = 1;\n    // Build a padded multiple alignment from the pairwise alignments to the root\n    CigarIterVector iterVec;\n\n    // Create entry for the root\n    MAlignData rootData;\n    rootData.str = rootStr;\n    rootData.expandedCigar = std::string(rootStr.size(), 'M');\n    rootData.position = 0;\n    rootData.name = rootName;\n\n    m_alignData.push_back(rootData);\n    m_alignData.insert(m_alignData.end(), inData.begin(), inData.end());\n\n    CigarIter tmp = {&rootData, 0, 0};\n    iterVec.push_back(tmp);\n\n    if(m_verbose > 1)\n        printf(\"%d\\t%s\\n\", 0, tmp.pData->expandedCigar.c_str());\n\n    for(size_t i = 0; i < inData.size(); ++i)\n    {\n        CigarIter iter = {&inData[i], 0, 0};\n        iterVec.push_back(iter);\n        if(m_verbose > 1)\n            printf(\"%zu\\t%s\\n\", i+1, iter.pData->expandedCigar.c_str());\n    }\n\n    // Build the padded strings by inserting '-' as necessary\n    bool done = false;\n    while(!done)\n    {\n        // Check if any strings have a deletion or insertion at this base\n        bool hasDel = false;\n        bool hasInsert = false;\n        bool hasMatch = false;\n\n        for(size_t i = 0; i < iterVec.size(); ++i)\n        {\n            char sym = iterVec[i].getCigarSymbol();\n            if(sym == 'D')\n                hasDel = true;\n            else if(sym == 'I')\n                hasInsert = true;\n            else if(sym == 'M')\n                hasMatch = true;\n        }\n\n        done = !hasDel && !hasInsert && !hasMatch;\n        if(done)\n            break;\n\n        char updateMode = hasDel ? 'D' : (hasInsert ? 'I' : 'M');\n        for(size_t i = 0; i < iterVec.size(); ++i)\n        {\n            char outSym = iterVec[i].updateAndEmit(updateMode);\n            m_alignData[i].padded.append(1,outSym);\n        }\n    }\n}\n\n// \nsize_t MultiAlignment::getIdxByName(const std::string& name) const\n{\n    size_t max = std::numeric_limits<size_t>::max();\n    size_t idx = max;\n    for(size_t i = 0; i < m_alignData.size(); ++i)\n    {\n        if(m_alignData[i].name == name)\n        {\n            if(idx == max)\n            {\n                idx = i;\n            }\n            else\n            {\n                std::cerr << \"Error in MultiAlignment::getIdxByName: duplicate rows found for \" << name << \"\\n\";\n                exit(EXIT_FAILURE);\n            }\n        }\n    }\n\n    if(idx == max)\n    {\n        std::cerr << \"Error in MultiAlignment::getIdxByName: row not found for \" << name << \"\\n\";\n        exit(EXIT_FAILURE);\n    }\n    return idx;\n}\n\n//\nsize_t MultiAlignment::getNumColumns() const\n{\n    assert(!m_alignData.empty());\n    return m_alignData.front().padded.size();\n}\n\nstd::string MultiAlignment::getCigar(size_t rowIdx) const\n{\n    assert(rowIdx < m_alignData.size());\n    std::cout << \"MA has \" << m_alignData.size() << \" elements\\n\";\n    return StdAlnTools::compactCigar(m_alignData[rowIdx].expandedCigar);\n}\n\n//\nchar MultiAlignment::getSymbol(size_t rowIdx, size_t colIdx) const\n{\n    assert(rowIdx < m_alignData.size());\n    assert(colIdx < m_alignData[rowIdx].padded.size());\n    return m_alignData[rowIdx].padded[colIdx];\n}\n\nsize_t MultiAlignment::getBaseIdx(size_t rowIdx, size_t colIdx) const\n{\n    assert(rowIdx < m_alignData.size());\n    assert(colIdx < m_alignData[rowIdx].padded.size());\n\n    // Convert the column index to the baseIndex in the sequence at\n\n    // Ensure this is a real base on the target string.\n    assert(getSymbol(rowIdx, colIdx) != '-');\n\n    // Substract the number of padding charcters from the column index to get the \n    // base index\n    size_t padSyms = 0;\n    for(size_t i = 0; i < colIdx; ++i)\n    {\n        if(getSymbol(rowIdx, i) == '-')\n            padSyms += 1;\n    }\n    assert(padSyms <= colIdx);\n    return colIdx - padSyms;\n}\n\n\n//\nstd::string MultiAlignment::getPaddedSubstr(size_t rowIdx, size_t start, size_t length) const\n{\n    assert(rowIdx < m_alignData.size());\n    assert(start < m_alignData[rowIdx].padded.size());\n    assert(start + length <= m_alignData[rowIdx].padded.size());\n    return m_alignData[rowIdx].padded.substr(start, length);\n}\n\n// Count the length of the homopolymer starting at from\nsize_t MultiAlignment::countHomopolymer(size_t rowIdx, int from, int to) const\n{\n    assert(rowIdx < m_alignData.size());\n    assert(from < (int)m_alignData[rowIdx].padded.size());\n    \n    //\n    if(to == -1)\n        to = m_alignData[rowIdx].padded.size() - 1; // inclusive\n\n    // Determine iteration direction\n    int step = from <= to ? 1 : -1;\n    \n    // The first or last column of the multiple alignment was requested\n    // This can only be a homopolymer of length 1\n    if(from == (int)m_alignData[rowIdx].padded.size() - 1 || (from == 0 && step < 0))\n        return 1;\n\n    // Get the base of the homopolymer\n    // If it is a padding symbol we use the next non-padded base in the sequence\n    char b = '\\0';\n    int max_position = (int)m_alignData[rowIdx].padded.size() - 1;\n    while(from >= 0 && from <= max_position)\n    {\n        b = getSymbol(rowIdx, from);\n        if(b == '-')\n            from += step;\n        else\n            break;\n    }\n\n    size_t length = 1;\n    do\n    {\n        from += step;\n        if(from < 0 || from > max_position)\n            return length;\n\n        char s = getSymbol(rowIdx, from);\n        if(s == '-')\n            continue;\n        if(s == b)\n            length += 1;\n        else\n            break;\n    }\n    while(from != to);\n    return length;\n}\n\n// Generate simple consensus string from the multiple alignment\nstd::string MultiAlignment::generateConsensus()\n{\n    assert(!m_alignData.empty() && !m_alignData.front().padded.empty());\n\n    std::string consensus;\n    std::string paddedConsensus;\n\n    std::map<char, int> baseMap;\n\n    size_t num_rows = m_alignData.size() - 1; // do not include root\n    size_t num_cols = m_alignData.front().padded.size();\n    for(size_t i = 0; i < num_cols; ++i)\n    {\n        baseMap.clear();\n        for(size_t j = 1; j < num_rows; ++j)\n        {\n            char b = m_alignData[j].padded[i];\n            if(b != '.')\n                baseMap[b]++;\n        }\n\n        int max = 0;\n        char maxBase = '.';\n        for(std::map<char,int>::iterator iter = baseMap.begin(); iter != baseMap.end(); ++iter)\n        {\n            if(iter->second > max)\n            {\n                max = iter->second;\n                maxBase = iter->first;\n            }\n        }\n\n        paddedConsensus.append(1,maxBase);\n\n        if(maxBase == '.' && consensus.empty())\n            continue; // skip no-call at beginning\n        else if(maxBase == '.')\n            break; // non-called position in middle of read, stop consensus generation\n        else if(maxBase != '-') //\n            consensus.append(1, maxBase);\n    }\n\n    if(m_verbose > 0)\n        print(80, &paddedConsensus);\n\n    return consensus;\n}\n\n// Generate a string representing the columns that differ between the strings\nstd::string MultiAlignment::generateMatchString() const\n{\n    assert(!m_alignData.empty() && !m_alignData.front().padded.empty());\n\n    std::string matchString;\n\n    size_t num_rows = m_alignData.size();\n    size_t num_cols = m_alignData.front().padded.size();\n    for(size_t i = 0; i < num_cols; ++i)\n    {\n        char rootChar = m_alignData[0].padded[i];\n        bool allMatch = true;\n        for(size_t j = 1; j < num_rows; ++j)\n        {\n            char b = m_alignData[j].padded[i];\n            if(b != rootChar)\n                allMatch = false;\n        }\n        matchString.append(1, allMatch ? '*' : ' ');\n    }\n\n    return matchString;\n}\n\n//\nvoid MultiAlignment::filterByEditDistance(int max_edit_distance)\n{\n    size_t num_rows = m_alignData.size();\n    assert(num_rows > 0);\n    size_t num_cols = m_alignData.front().padded.size();\n    std::vector<bool> keep_vector(num_rows, true);\n    for(size_t i = 1; i < num_rows; ++i)\n    {\n        int current_edit_distance = 0;\n        for(size_t j = 0; j < num_cols; ++j)\n        {\n            char root_symbol = getSymbol(0, j);\n            char seq_symbol = getSymbol(i, j);\n            if(root_symbol != '.' && seq_symbol != '.' && seq_symbol != '-' && root_symbol != seq_symbol)\n                current_edit_distance++;\n        }\n\n        if(current_edit_distance > max_edit_distance)\n            keep_vector[i] = false;\n    }\n\n    MAlignDataVector tmp_ma;\n    for(size_t i = 0; i < num_rows; ++i)\n    {\n        if(keep_vector[i])\n            tmp_ma.push_back(m_alignData[i]);\n    }\n\n    printf(\"Removed %zu\\n\", m_alignData.size() - tmp_ma.size());\n    m_alignData.swap(tmp_ma);\n}\n\n//\nvoid MultiAlignment::print(int col_size, const std::string* pConsensus, bool sorted, bool masked) const\n{\n    assert(!m_alignData.empty() && !m_alignData.front().padded.empty());\n\n    std::string matchString = generateMatchString();\n\n    // Create a copy of the m_alignData and sort it by position\n    MAlignDataVector sortedAlignments = m_alignData;\n    if(sorted)\n        std::stable_sort(sortedAlignments.begin(), sortedAlignments.end(), MAlignData::sortPosition);\n    col_size = 100000;\n    size_t len = sortedAlignments[0].padded.size();\n    for(size_t l = 0; l < len; l += col_size)\n    {\n        // Print the consensus if requested\n        if(pConsensus != NULL)\n        {\n            int diff = pConsensus->size() - l;\n            int stop = diff < col_size ? diff : col_size;\n            if(stop > 0)\n                printf(\"C\\t%s\\n\", pConsensus->substr(l,stop).c_str());\n            else\n                printf(\"C\\n\");\n        }\n        \n        // Print each row\n        for(size_t i = 0; i < sortedAlignments.size(); ++i)\n        {\n            const MAlignData& mad = sortedAlignments[i];\n            int diff = mad.padded.size() - l;\n            int stop = diff < col_size ? diff : col_size;\n\n            std::string s = mad.padded.substr(l, stop).c_str();\n            if(masked)\n            {\n                for(size_t j = 0; j < s.size(); ++j)\n                {\n                    // get base row symbol\n                    char rb = getSymbol(0, l + j);\n                    if(s[j] == rb && s[j] != '-')\n                        s[j] = '=';\n                }\n            }\n            \n            printf(\"%zu\\t%s\\t%s\\n\", i, s.c_str(), mad.name.c_str());\n        }\n    \n        // Print the matched columns\n        int diff = matchString.size() - l;\n        int stop = diff < col_size ? diff : col_size;\n        \n        printf(\"M\\t%s\\n\", matchString.substr(l, stop).c_str());\n        std::cout << \"\\n\";\n    }\n}\n\n// Construct a multiple alignment of the input strings from global alignments\n// to the first element in the vector\nMultiAlignment MultiAlignmentTools::alignSequencesGlobal(const SeqItemVector& sequences)\n{\n    assert(!sequences.empty());\n    const std::string& base = sequences[0].seq.toString();\n\n    MAlignDataVector madVector;\n    for(size_t i = 1; i < sequences.size(); ++i)\n    {\n        std::string seq = sequences[i].seq.toString();\n        std::string cigar = StdAlnTools::globalAlignmentCigar(seq, base);\n    \n        // Initialize the multiple alignment data\n        MAlignData maData;\n        maData.position = 0;\n        maData.str = seq;\n        maData.expandedCigar = StdAlnTools::expandCigar(cigar);\n\n        maData.name = sequences[i].id;\n        madVector.push_back(maData);\n    }\n\n    return MultiAlignment(base, madVector, sequences[0].id);\n}\n\n// Construct a multiple alignment of the input strings from local alignments\n// to the first element of the vector\nMultiAlignment MultiAlignmentTools::alignSequencesLocal(const SeqItemVector& sequences)\n{\n    assert(!sequences.empty());\n    const std::string& base = sequences[0].seq.toString();\n\n    MAlignDataVector madVector;\n    for(size_t i = 1; i < sequences.size(); ++i)\n    {\n        // The alignment is (slightly counterintuitively) with respect to the \n        // base string as the query so that all the cigar strings used\n        // are based on edit operations to the base.\n        std::string seq = sequences[i].seq.toString();\n        LocalAlignmentResult result = StdAlnTools::localAlignment(seq,base);\n        \n        // Initialize the multiple alignment data\n        MAlignData maData;\n        maData.position = result.queryStartIndex;\n        // If the non-base sequence overhangs the base, clip it\n        if(result.targetStartIndex > 0)\n            maData.str = seq.substr(result.targetStartIndex);\n        else\n            maData.str = seq;\n\n        // Pad out the cigar with reference skip characters\n        maData.expandedCigar = StdAlnTools::expandCigar(result.cigar);\n\n        maData.name = sequences[i].id;\n        madVector.push_back(maData);\n    }\n\n    return MultiAlignment(base, madVector, sequences[0].id);\n}\n"
  },
  {
    "path": "src/SGA/Util/MultiAlignment.h",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// MultiAlignment - Class constructing a multiple\n// alignment between a root sequence and a set of sequences\n//\n#ifndef MULTIALIGNMENT_H\n#define MULTIALIGNMENT_H\n\n#include <string>\n#include <vector>\n#include \"Util.h\"\n\nstruct MAlignData\n{\n    public:\n        std::string str;\n        std::string expandedCigar; // cigar string with symbol counts expanded\n        int position; // start position of the alignment to the root\n        std::string name; // named identifier for this sequence in the MA\n\n    private:\n\n        friend class MultiAlignment;\n        std::string padded;\n\n        // Comparator\n        static bool sortPosition(const MAlignData& a, const MAlignData& b) { return a.position < b.position; }\n};\ntypedef std::vector<MAlignData> MAlignDataVector;\n\nclass MultiAlignment\n{\n    public:\n        MultiAlignment(std::string rootStr, const MAlignDataVector& inData, std::string rootName = \"root\");\n\n        // Experimental function to generate a consensus sequence from the MA\n        std::string generateConsensus();\n\n        // Get the index into the m_alignData vector for a named row\n        size_t getIdxByName(const std::string& name) const;\n        size_t getRootIdx() const { return 0; }\n        \n        // Get the symbol at a particular column and row\n        char getSymbol(size_t rowIdx, size_t colIdx) const;\n\n        // Get the index of the base corresponding to colIdx for sequence at rowIdx\n        size_t getBaseIdx(size_t rowIdx, size_t colIdx) const;\n\n        // Get a substring of the padded string for the given row\n        std::string getPaddedSubstr(size_t rowIdx, size_t start, size_t length) const;\n\n        // Count the length of the homopolymer run in the substring [from, to] inclusive\n        // If to is npos, then it is assumed to be until the end of the string\n        // if to < from, then the count proceeds backwards (towards the beginning of the string.\n        size_t countHomopolymer(size_t rowIdx, int from, int to = -1) const;\n\n        // Return the total number of columns in the MA\n        size_t getNumColumns() const;\n        \n        // Return the cigar string for one of the alignments\n        std::string getCigar(size_t rowIdx) const;\n\n        // Filter the multiple alignment by removing sequences that are more than max_edit_distance from the root sequence\n        void filterByEditDistance(int max_edit_distance);\n\n        // Print the multiple alignment, optionally with a consensus sequence\n        void print(int col_size = 80, const std::string* pConsensus = NULL, bool sorted = true, bool masked = false) const;\n\n    private:\n        \n        // Generate a string representing the columns that differ between the strings\n        std::string generateMatchString() const;\n\n        // data\n        MAlignDataVector m_alignData;\n        int m_verbose;\n};\n\nnamespace MultiAlignmentTools\n{\n    // Construct a multiple alignment of the input strings\n    MultiAlignment alignSequencesGlobal(const SeqItemVector& sequences);\n    MultiAlignment alignSequencesLocal(const SeqItemVector& sequences);\n}\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/MultiOverlap.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// MultiOverlap.h - Data structure containing a set\n// of overlaps for a given read\n//\n#include <algorithm>\n#include <iostream>\n#include \"CorrectionThresholds.h\"\n#include \"MultiOverlap.h\"\n#include \"Alphabet.h\"\n\nMultiOverlap::MultiOverlap(const std::string& rootID, \n                           const std::string& rootSeq,\n                           const std::string rootQual) : m_rootID(rootID), \n                                                         m_rootSeq(rootSeq),\n                                                         m_rootQual(rootQual)\n{\n    \n}\n\n//\nvoid MultiOverlap::add(const std::string& seq, const Overlap& ovr)\n{\n    MOData mod(seq, ovr);\n\n    // Swap root read into first position if necessary\n    if(mod.ovr.id[0] != m_rootID)\n        mod.ovr.swap();\n    assert(mod.ovr.id[0] == m_rootID);\n\n    // RC the sequence if it is different orientation than the root\n    if(mod.ovr.match.isRC())\n    {\n        mod.seq = reverseComplement(mod.seq);\n        mod.ovr.match.canonize();\n    }\n\n    // Initialize the offset value, the amount that a coordinate \n    // for the non-root sequence must be shifted so that\n    // the sequences are aligned\n    mod.offset = mod.ovr.match.inverseTranslate(0);\n    m_overlaps.push_back(mod);\n}\n\n//\nvoid MultiOverlap::add(const MOData& mod)\n{\n    assert(mod.ovr.id[0] == m_rootID);\n    m_overlaps.push_back(mod);\n}\n\n//\nvoid MultiOverlap::updateRootSeq(const std::string& newSeq)\n{\n    m_rootSeq = newSeq;\n}\n\n//\nOverlap MultiOverlap::getOverlap(size_t idx) const\n{\n    assert(idx < m_overlaps.size());\n    return m_overlaps[idx].ovr;\n}\n\n//\nstd::string MultiOverlap::simpleConsensus() const\n{\n    std::string out;\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        Pileup p = getPileup(i);\n        AlphaCount64 ac = p.getAlphaCount();\n        char maxBase;\n        BaseCount maxCount;\n        ac.getMax(maxBase, maxCount);\n        BaseCount rootCount = ac.get(m_rootSeq[i]);\n\n        if(rootCount == maxCount)\n            out.push_back(m_rootSeq[i]);\n        else\n            out.push_back(maxBase);\n    }\n    return out;\n}\n\n//\nint MultiOverlap::countPotentialIncorrect(size_t cutoff) const\n{\n    int count = 0;\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        Pileup p = getPileup(i);\n        AlphaCount64 ac = p.getAlphaCount();\n        char maxBase;\n        BaseCount maxCount;\n        ac.getMax(maxBase, maxCount);\n        BaseCount rootCount = ac.get(m_rootSeq[i]);\n        if(maxBase != m_rootSeq[i] && rootCount < cutoff)\n            ++count;\n    }\n    return count;\n}\n\n//\nint MultiOverlap::countBasesCovered() const\n{\n    int count = 0;\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        Pileup p = getPileup(i);\n        if(p.getDepth() > 1)\n            ++count;\n    }\n    return count;\n}\n\n// Determine if this multi-overlap has a conflicted position,\n// which is a position in the multioverlap where the second-most \n// prevalent base has a frequency greater than cutoff\nbool MultiOverlap::isConflicted(size_t cutoff) const\n{\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        Pileup p = getPileup(i);\n        AlphaCount64 ac = p.getAlphaCount();\n\n        char order[5];\n        ac.getSorted(order, 5);\n    \n        // If the second-most prevalent base is greater than the cutoff\n        // we consider the MO to be conflicted\n        if(ac.get(order[1]) > cutoff)\n            return true;\n    }\n    return false;\n}\n\n// Returns true if the overlap at idx has the include flag set\nint MultiOverlap::getPartition(size_t idx) const\n{\n    assert(idx < m_overlaps.size());\n    return m_overlaps[idx].partitionID;\n}\n\n// Returns true if the overlap at idx has the include flag set\nvoid MultiOverlap::setPartition(size_t idx, int p)\n{\n    assert(idx < m_overlaps.size());\n    m_overlaps[idx].partitionID = p;\n}\n\n// Return the total number of bases in the multioverlap\nsize_t MultiOverlap::getNumBases() const\n{\n    size_t count = 0;\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        Pileup p = getPileup(i);\n        count += p.getDepth();\n    }\n    return count;\n}\n\n// Conflict-aware consensus algorithm\n// For each position of the read, it calculates whether that position is conflicted (there is \n// sufficient support for an alternative base at that position). All reads that differ from the\n// root read at a conflicted position are filtered out. The remaining set of reads match the root read\n// at all the conflicted positions and the consensus is called from this set. Bases that are not conflicted\n// are called from the entire set of overlaps.\nstd::string MultiOverlap::consensusConflict(double /*p_error*/, int conflictCutoff)\n{\n    // Calculate the frequency vector for each base of the read\n    std::vector<AlphaCount64> acVec;\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        AlphaCount64 ac = getAlphaCount(i);\n        acVec.push_back(ac);\n    }\n\n    // Sort the alphacounts by frequency\n    StringVector sortedVec;\n    sortedVec.reserve(acVec.size());\n    for(size_t i = 0; i < acVec.size(); ++i)\n    {\n        char sorted[ALPHABET_SIZE];\n        acVec[i].getSorted(sorted, ALPHABET_SIZE);\n        sortedVec.push_back(std::string(sorted, ALPHABET_SIZE));\n    }\n\n    // Filter out overlaps that do not match the reference\n    // at conflicted positions\n    for(size_t j = 0; j < m_overlaps.size(); ++j)\n    {\n        int numMatch = 0;\n        int numMismatch = 0;\n        int numConflicted = 0;\n        for(size_t i = 0; i < acVec.size(); ++i)\n        {\n            char rootBase = m_rootSeq[i];\n            std::string& sorted = sortedVec[i];\n            int second = acVec[i].get(sorted[1]);\n\n            // If the second-most prevelent base is above the conflict cutoff,\n            // call this position conflicted\n            bool isConflict = second > conflictCutoff;\n\n            // Get the basecall for read j at position i\n            char b = getMODBase(m_overlaps[j], i);\n\n            if(isConflict)\n            {\n                // Check if the read matches the root if:\n                // a) the read contains a basecall at this position (it overlaps\n                //  the read at this position)\n                // b) the root read base is one of the two most frequent bases \n                //  (to filter out sequencing errors at this position in the root).\n                int rootCount = acVec[i].get(rootBase);\n                if(b != '\\0' && rootCount > conflictCutoff)\n                {\n                    if(b == rootBase)\n                        ++numMatch;\n                    else\n                        ++numMismatch;\n                    ++numConflicted;\n                }\n            }\n        }\n\n        // Set the overlap score to be the fraction of conflict bases that this read\n        // matches the root read at. \n        double frac;\n        if(numConflicted == 0)\n            frac = 1.0f;\n        else\n            frac = (double)numMatch/(double)numConflicted;\n        m_overlaps[j].score = frac;\n\n        // Filter out the read if there are any conflicted bases\n        // that this read does not match the root read at\n        if(numConflicted > 0 && numMismatch > 0)\n            m_overlaps[j].partitionID = 1;\n        else\n            m_overlaps[j].partitionID = 0;\n    }\n\n    // Calculate the consensus sequence using all the reads\n    // in partition 1\n\n    std::string consensus;\n    std::vector<int> supportVector;\n\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        Pileup p0;\n        Pileup p1;\n        getPartitionedPileup(i, p0, p1);\n        AlphaCount64 ac = p0.getAlphaCount();\n        \n        size_t minSupport = CorrectionThresholds::Instance().getMinSupportLowQuality();\n        if(!m_rootQual.empty())\n        {\n            int phredScore = Quality::char2phred(m_rootQual[i]);\n            minSupport = CorrectionThresholds::Instance().getRequiredSupport(phredScore);\n        }\n\n        size_t callSupport = ac.get(m_rootSeq[i]);\n        if(callSupport >= minSupport)\n        {\n            // This base does not require correction\n            consensus.push_back(m_rootSeq[i]);\n        }\n        else\n        {\n            // Attempt to correct the base with the most frequent base\n            // in the partitioned pileup if it has been seen more often\n            // than the root base\n            char sorted[ALPHABET_SIZE];\n            ac.getSorted(sorted, ALPHABET_SIZE);\n            size_t bestSupport = ac.get(sorted[0]);\n            bool corrected = false;\n            if(bestSupport > callSupport)\n            {\n                consensus.push_back(sorted[0]);\n                callSupport = bestSupport;\n                corrected = true;\n            }\n            else\n            {\n                // A correction could not be made with the \n                // partitioned pileup, try to use the full pileup\n                // if this base is not conflicted\n                acVec[i].getSorted(sorted, ALPHABET_SIZE);\n                int second = acVec[i].get(sorted[1]);\n                bool isConflict = second > conflictCutoff;\n                if(!isConflict)\n                {\n                    bestSupport = acVec[i].get(sorted[0]);\n                    if(bestSupport > callSupport)\n                    {\n                        consensus.push_back(sorted[0]);\n                        corrected = true;\n                    }\n                }\n            }\n\n            if(!corrected)\n            {\n                consensus.push_back(m_rootSeq[i]);\n            }\n        }\n    }\n\n    return consensus;\n}\n\n//\nbool MultiOverlap::qcCheck() const\n{\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        AlphaCount64 ac = getAlphaCount(i);\n        size_t callSupport = ac.get(m_rootSeq[i]);\n        if(callSupport < 2)\n            return false;\n    }\n    return true;\n}\n\n//\nvoid MultiOverlap::countOverlaps(size_t& prefix_count, size_t& suffix_count) const\n{\n    prefix_count = 0;\n    suffix_count = 0;\n    for(size_t i = 0; i < m_overlaps.size(); ++i)\n    {\n        if(!m_overlaps[i].ovr.match.coord[0].isContained())\n        {\n            if(m_overlaps[i].ovr.match.coord[0].isLeftExtreme())\n                ++prefix_count;\n            if(m_overlaps[i].ovr.match.coord[0].isRightExtreme())\n                ++suffix_count;\n        }\n    }\n}\n\n//\ndouble MultiOverlap::getMeanDepth() const\n{\n    double depth = 0.0f;\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        Pileup p = getPileup(i);\n        depth += p.getDepth();\n    }\n    return depth / m_rootSeq.size();\n}\n\n//\nint MultiOverlap::calculateCoverageOverlap()\n{\n    int rightmost_prefix = -1;\n    int leftmost_suffix = m_rootSeq.length();\n\n    for(size_t i = 0; i < m_overlaps.size(); ++i)\n    {\n        if(!m_overlaps[i].ovr.match.coord[0].isContained())\n        {\n            if(m_overlaps[i].ovr.match.coord[0].isLeftExtreme())\n            {\n                // Prefix overlap\n                int end = m_overlaps[i].ovr.match.coord[0].interval.end;\n                if(end > rightmost_prefix)\n                    rightmost_prefix = end;\n            }\n            else\n            {\n                // Suffix overlap\n                int start = m_overlaps[i].ovr.match.coord[0].interval.start;\n                if(start < leftmost_suffix)\n                    leftmost_suffix = start;\n            }\n        }\n    }\n\n    if(leftmost_suffix > rightmost_prefix)\n        return 0;\n    else\n        return rightmost_prefix - leftmost_suffix + 1;\n}\n\nstd::string MultiOverlap::calculateConsensusFromPartition(double p_error)\n{\n    std::string out;\n    out.reserve(m_rootSeq.size());\n\n    // require the best base call to be above this above to correct it\n    double epsilon = 0.01;\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        Pileup p0;\n        Pileup p1;\n        getPartitionedPileup(i, p0, p1);\n        DNADouble ap = p0.calculateLikelihoodNoQuality(p_error);\n        char best_c;\n        char curr_c = m_rootSeq[i];\n        double max;\n        ap.getMax(best_c, max);\n\n        //printf(\"%zu best: %c curr: %c max: %lf curr_l: %lf\\n\", i, best_c, curr_c, max, ap.get(curr_c));\n        // Require the called value to be substantially better than the\n        // current base\n        if(best_c == curr_c || (best_c != curr_c && max - ap.get(curr_c) < epsilon))\n        {\n            //std::cout << \"using current\\n\";\n            out.push_back(curr_c);\n        }\n        else\n        {\n            //std::cout << \"corrected\\n\";\n            out.push_back(best_c);\n        }\n    }\n    return out;\n}\n\n// Return the base in mod that matches the base at\n// idx in the root seq. If mod does not overlap \n// the root at this position, returns '\\0'\nchar MultiOverlap::getMODBase(const MOData& mod, int idx) const\n{\n    int trans_idx = idx - mod.offset;\n    if(trans_idx >= 0 && size_t(trans_idx) < mod.seq.size())\n        return mod.seq[trans_idx];\n    else\n        return '\\0';\n}\n\n// Get an AlphaCount64 representing the nucleotides\n// observed at the given column\nAlphaCount64 MultiOverlap::getAlphaCount(int idx) const\n{\n    AlphaCount64 ac;\n\n    ac.increment(m_rootSeq[idx]);\n    for(size_t i = 0; i < m_overlaps.size(); ++i)\n    {\n        const MOData& curr = m_overlaps[i];\n        // translate idx into the frame of the current sequence\n        int trans_idx = idx - curr.offset;\n        if(trans_idx >= 0 && size_t(trans_idx) < curr.seq.size())\n        {\n            ac.increment(curr.seq[trans_idx]);\n        }\n    }\n    return ac;\n}\n\n\n// Get the \"stack\" of bases that aligns to\n// a single position of the root seq, including\n// the root base\nPileup MultiOverlap::getPileup(int idx) const\n{\n    size_t max_depth = m_overlaps.size() + 1;\n    Pileup p(max_depth);\n    p.add(m_rootSeq[idx]);\n\n    for(size_t i = 0; i < m_overlaps.size(); ++i)\n    {\n        const MOData& curr = m_overlaps[i];\n        // translate idx into the frame of the current sequence\n        int trans_idx = idx - curr.offset;\n        if(trans_idx >= 0 && size_t(trans_idx) < curr.seq.size())\n        {\n            p.add(curr.seq[trans_idx]);\n        }\n    }\n    return p;\n}\n\n// Get the \"stack\" of bases that aligns to\n// a single position of the root seq, including\n// the root base only including the first numElems items\nPileup MultiOverlap::getPileup(int idx, int numElems) const\n{\n    assert((size_t)numElems < m_overlaps.size());\n    Pileup p;\n    p.add(m_rootSeq[idx]);\n\n    for(int i = 0; i < numElems; ++i)\n    {\n        const MOData& curr = m_overlaps[i];\n        // translate idx into the frame of the current sequence\n        int trans_idx = idx - curr.offset;\n        if(trans_idx >= 0 && (size_t)trans_idx < curr.seq.size())\n        {\n            p.add(curr.seq[trans_idx]);\n        }\n    }\n    return p;\n}\n\n\n// Get the pileup between the root sequence and one of the sequences in the MO\nPileup MultiOverlap::getSingletonPileup(int base_idx, int ovr_idx) const\n{\n    assert(ovr_idx < (int)m_overlaps.size());\n\n    Pileup p;\n    p.add(m_rootSeq[base_idx]);\n\n    const MOData& curr = m_overlaps[ovr_idx];\n    // translate idx into the frame of the current sequence\n    int trans_idx = base_idx - curr.offset;\n    if(trans_idx >= 0 && size_t(trans_idx) < curr.seq.size())\n    {\n        p.add(curr.seq[trans_idx]);\n    }\n    return p;\n}\n\n// Fill in the pileup groups g0 and g1\nvoid MultiOverlap::getPartitionedPileup(int idx, Pileup& g0, Pileup& g1) const\n{\n    g0.add(m_rootSeq[idx]);\n\n    for(size_t i = 0; i < m_overlaps.size(); ++i)\n    {\n        const MOData& curr = m_overlaps[i];\n        // translate idx into the frame of the current sequence\n        int trans_idx = idx - curr.offset;\n        if(trans_idx >= 0 && size_t(trans_idx) < curr.seq.size())\n        {\n            if(curr.partitionID == 0)\n                g0.add(curr.seq[trans_idx]);\n            else\n                g1.add(curr.seq[trans_idx]);\n        }\n    }\n}\n\n\n// Fill in the pileup groups g0 and g1\nPileupVector MultiOverlap::getPartitionedPileup(int idx, int num_parts) const\n{\n    assert(false && \"untested\");\n    PileupVector pv(num_parts);\n    pv.push_back(Pileup());\n    \n    // the root always goes in partition 0\n    pv.back().add(m_rootSeq[idx]);\n\n    for(size_t i = 0; i < m_overlaps.size(); ++i)\n    {\n        const MOData& curr = m_overlaps[i];\n        // translate idx into the frame of the current sequence\n        int trans_idx = idx - curr.offset;\n        if(trans_idx >= 0 && size_t(trans_idx) < curr.seq.size())\n        {\n            assert(curr.partitionID < num_parts);\n            pv[curr.partitionID].add(curr.seq[trans_idx]);\n        }\n    }\n    return pv;\n}\n\n// Print the MultiOverlap groups specified by the IntVec to stdout\nvoid MultiOverlap::printGroups()\n{\n    for(int i = 0; i <= 1; ++i)\n    {\n        MultiOverlap mo_group(m_rootID, m_rootSeq);\n        for(size_t j = 0; j < m_overlaps.size(); ++j)\n        {\n            const MOData& curr = m_overlaps[j];\n            if(curr.partitionID == i)\n                mo_group.add(curr);\n        }\n        std::cout << \"MO GROUP \" << i << \"\\n\";\n        mo_group.print();\n    }\n}\n\n// Print the MultiOverlap to stdout\nvoid MultiOverlap::print(int default_padding, int max_overhang)\n{\n    std::sort(m_overlaps.begin(), m_overlaps.end(), MOData::sortOffset);\n    std::cout << \"\\nDrawing overlaps for read \" << m_rootID << \"\\n\";\n    int root_len = int(m_rootSeq.size());\n    \n    // Print the root row at the bottom\n    printRow(default_padding, max_overhang, root_len, 0, root_len, 0, 0.0f, m_rootSeq, m_rootID);\n\n    for(size_t i = 0; i < m_overlaps.size(); ++i)\n    {\n        const MOData& curr = m_overlaps[i];\n        int overlap_len = curr.ovr.match.getMaxOverlapLength();\n        int nd = curr.ovr.match.countDifferences(m_rootSeq, curr.seq);\n        double score = static_cast<double>(nd) / overlap_len;\n        printRow(default_padding, max_overhang, root_len, \n                 curr.offset, overlap_len, nd, \n                 score, curr.seq, curr.ovr.id[1].c_str());\n    }    \n}\n\n// Print a single row of a multi-overlap to stdout\nvoid MultiOverlap::printRow(int default_padding, int max_overhang, \n                            int root_len, int offset, int overlap_len, int pid, \n                            double score, const std::string& seq, const std::string& id)\n{\n    int c_len = seq.length();\n\n    // This string runs from c_offset to c_offset + len\n    // Clip the string at -max_overhang to root_len + max_overhang\n    int left_clip = std::max(offset, -max_overhang);\n    int right_clip = std::min(offset + c_len, root_len + max_overhang);\n    \n    // translate the clipping coordinates to the string coords\n    int t_left_clip = left_clip - offset;\n    int t_right_clip = right_clip - offset;\n    \n    // Calculate the length of the left padding\n    int padding = default_padding + left_clip;\n    std::string leader = (t_left_clip > 0) ? \"...\" : \"\";\n    std::string trailer = (t_right_clip < c_len) ? \"...\" : \"\"; \n    std::string clipped = seq.substr(t_left_clip, t_right_clip - t_left_clip);\n    padding -= leader.size();\n\n    assert(padding >= 0);\n    std::string padding_str(padding, ' ');\n    std::string outstr = padding_str + leader + clipped + trailer;\n    printf(\"%s\\t%d\\t%d\\t%lf\\tID:%s\\n\", outstr.c_str(), overlap_len, pid, score, id.c_str());\n}\n\nvoid MultiOverlap::printMasked()\n{\n    printf(\"ROOT\\t%s\\t%s\\n\", m_rootSeq.c_str(), m_rootID.c_str());\n\n    for(size_t j = 0; j < m_overlaps.size(); ++j)\n    {\n        std::string out;\n        for(size_t i = 0; i < m_rootSeq.length(); ++i)\n        {\n            char b = getMODBase(m_overlaps[j], i);\n            if(b == '\\0')\n                out.push_back('.');\n            else if(b == m_rootSeq[i])\n                out.push_back('=');\n            else\n                out.push_back(b);\n        }\n        printf(\"OVRL\\t%s\\t%s\\n\", out.c_str(), m_overlaps[j].ovr.id[1].c_str());\n    }\n}\n\n// Print the MultiOverlap horizontally, in a pileup format\nvoid MultiOverlap::printPileup()\n{\n    std::cout << \"\\nDrawing overlap pileup for read \" << m_rootID << \"\\n\";\n    for(size_t i = 0; i < m_rootSeq.size(); ++i)\n    {\n        Pileup p = getPileup(i);\n        printf(\"%zu\\t%s\\n\", i, p.toStr().c_str());\n    }\n}\n\n//\nbool MultiOverlap::MOData::sortOffset(const MOData& a, const MOData& b)\n{\n    return a.offset < b.offset;\n}\n\n// Sort by the ID of the non-root sequence, which is \n// guarenteed to bethe second id in the overlap structure\nbool MultiOverlap::MOData::sortID(const MOData& a, const MOData& b)\n{\n    assert(a.ovr.id[0] == b.ovr.id[0]);\n    return a.ovr.id[1] < b.ovr.id[1];\n}\n\n"
  },
  {
    "path": "src/SGA/Util/MultiOverlap.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// MultiOverlap.h - Data structure containing a set\n// of overlaps for a given read\n//\n#ifndef MULTIOVERLAP_H\n#define MULTIOVERLAP_H\n\n#include \"Match.h\"\n#include \"Pileup.h\"\n#include \"DNADouble.h\"\n\nclass MultiOverlap\n{\n    public:\n    struct MOData\n    {\n        MOData(const std::string& s, const Overlap& o) : seq(s), ovr(o), offset(0), partitionID(0), score(0.0f) {}\n        static bool sortOffset(const MOData& a, const MOData& b);\n        static bool sortID(const MOData& a, const MOData& b);\n        \n        // data\n        std::string seq;\n        Overlap ovr;\n        int offset;\n        int partitionID;\n        double score;\n\n        static bool compareScore(const MOData& a, const MOData& b)\n        {\n            return a.score > b.score;\n        }\n    };\n\n    typedef std::vector<MOData> MODVector;\n\n    public:\n\n        MultiOverlap(const std::string& rootID, \n                     const std::string& rootSeq, \n                     const std::string rootQual = \"\");\n        \n        ///\n        void add(const std::string& seq, const Overlap& ovr);\n        void add(const MOData& mod);\n        void updateRootSeq(const std::string& newSeq);\n\n        //\n        Overlap getOverlap(size_t idx) const;\n        size_t getNumBases() const;\n\n        //\n        bool isConflicted(size_t cutoff) const;\n        std::string simpleConsensus() const;\n\n        // Count the number of bases that are potentially incorrect\n        // A base is considered to be incorrect if it is not the majority in the column\n        // and it has been seen less than cutoff times\n        int countPotentialIncorrect(size_t cutoff) const;\n\n        // Count the number of bases in the read that are covered by an overlap\n        int countBasesCovered() const;\n\n        // Partition the multioverlap into groups\n        int getPartition(size_t idx) const;\n        void setPartition(size_t idx, int p);\n        std::string consensusConflict(double p_error, int conflictCutoff);\n\n        // Returns true if each base of the root sequence has enough support from\n        // other reads in the multioverlap. The level of support is determined by\n        // the quality score.\n        bool qcCheck() const;\n\n        // Count the number of prefix and suffix overlaps\n        void countOverlaps(size_t& prefix_count, size_t& suffix_count) const;\n        double getMeanDepth() const;\n\n        // Calculate the amount of the sequence that is covered\n        // by both prefix and suffix overlaps. For instance:\n        // Read    ---------------\n        // OvrP --------------\n        // OvrX             -----------\n        //                  xx\n        // In this case the function would return 2.\n        // If there is no overlap, zero is returned\n        // Read    ---------------\n        // OvrP ---------\n        // OvrX           -------------\n        int calculateCoverageOverlap();\n        std::string calculateConsensusFromPartition(double p_error);\n\n        char getMODBase(const MOData& mod, int idx) const;\n\n        // IO\n        void print(int default_padding = DEFAULT_PADDING, int max_overhang = DEFAULT_MAX_OVERHANG);\n        void printMasked();\n        void printPileup();\n        void printGroups();\n\n    private:\n\n        AlphaCount64 getAlphaCount(int idx) const;\n        Pileup getPileup(int idx) const;\n        Pileup getPileup(int idx, int numElems) const;\n        Pileup getSingletonPileup(int base_idx, int ovr_idx) const;\n\n        void getPartitionedPileup(int idx, Pileup& g0, Pileup& g1) const;\n        PileupVector getPartitionedPileup(int idx, int num_parts) const;\n\n        void printRow(int default_padding, int max_overhang, int root_len, \n                      int offset, int overlap_len, int pid, double score,\n                      const std::string& seq, const std::string& id);\n\n        // data\n        static const int DEFAULT_PADDING = 20;\n        static const int DEFAULT_MAX_OVERHANG = 3;\n\n        std::string m_rootID;\n        std::string m_rootSeq;\n        std::string m_rootQual;\n\n        MODVector m_overlaps;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/NoCodec.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// NoCodec - Testing codec for EncodedString\n// that does not encode anything - it just returns\n// the numerical value of the char \n//\n#ifndef NOCODEC_H\n#define NOCODEC_H\n\nclass NoCodec\n{\n    public:\n        typedef char UNIT_TYPE;\n        static const int SYMBOLS_PER_UNIT = 1;\n\n        // Encoded the character b into a value\n        inline uint8_t encode(char b) const\n        {\n            return (uint8_t)b;\n        }\n\n        // Decode the value c into a character\n        inline char decode(uint8_t c) const\n        {\n            return (char)c;\n        }\n\n        // Returns the number of units required to encode\n        // a string of length n\n        inline size_t getRequiredUnits(size_t n) const\n        {\n            return (n + SYMBOLS_PER_UNIT - 1) / SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the number of symbols that can be stored\n        // in n units\n        inline size_t getCapacity(size_t n) const\n        {\n            return n * SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the index of the unit to store the\n        // i-th symbol of the string\n        inline size_t getUnitIndex(size_t i) const\n        {\n            return i / SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the position within a unit that the i-th symbol \n        // should be stored in\n        inline size_t getUnitOffset(size_t i) const\n        {\n            // this position is the k-th symbol of the unit\n            return i % SYMBOLS_PER_UNIT;\n        }\n\n        // Return the amount that a value must be shifted to\n        // store a code at a given offset\n        inline uint8_t getOffsetShift(size_t /*offset*/) const\n        {\n            return 0;\n        }\n\n        // Store the value v at the i-th encoded position in the data array\n        inline void store(UNIT_TYPE* pData, size_t i, char b) const\n        {\n            UNIT_TYPE& unit = pData[getUnitIndex(i)];\n            unit = encode(b);\n            \n            size_t offset = getUnitOffset(i);\n            uint8_t shift = getOffsetShift(offset);\n            \n            // Clear the currrent position\n            uint8_t mask = 0xFF;\n            unit &= ~mask;\n\n            // Set position\n            UNIT_TYPE code = encode(b);\n            code <<= shift;\n            unit |= code; \n        }\n\n        // get the character stored at position i\n        inline char get(const UNIT_TYPE* pData, size_t i) const\n        {\n            const UNIT_TYPE& unit = pData[getUnitIndex(i)];\n            size_t offset = getUnitOffset(i);\n            (void)offset;\n            uint8_t mask = 0xFF;\n            UNIT_TYPE code = unit & mask;\n            uint8_t shift = 0;\n            code >>= shift;\n            return decode(code);\n        }\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Pileup.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Pileup - An array of strings containing all the seen\n// bases for a given region/read\n//\n#include \"Pileup.h\"\n#include \"Alphabet.h\"\n#include <math.h>\n#include <iostream>\n\n// Calculate the consensus base at this position\n// using a simple model where all bases are treated equally\nchar Pileup::calculateSimpleConsensus() const\n{\n    assert(!m_data.empty());\n    AlphaCount64 ac;\n    for(size_t i = 0; i < m_data.size(); ++i)\n    {\n        ac.increment(m_data[i].base);\n    }\n    return ac.getMaxBase();\n}\n\n// Returns the number of times each base appears in the \n// pileup string\nAlphaCount64 Pileup::getAlphaCount() const\n{\n    AlphaCount64 ac;\n    for(size_t i = 0; i < m_data.size(); ++i)\n    {\n        ac.increment(m_data[i].base);\n    }\n    return ac;\n}\n\n// Calculate the consensus base at this position\n// using a simple model where all bases are treated equally\nDNADouble Pileup::calculateSimpleAlphaProb() const\n{\n    DNADouble ap;\n    assert(!m_data.empty());\n    WARN_ONCE(\"Fix Pileup::calculateSimpleDNADouble numerical stability\");\n    assert(false);\n    for(size_t i = 0; i < ap.getAlphabetSize(); ++i)\n    {\n        // Calculate the posterior probability of the data given that\n        // b is the true base\n        char b = ALPHABET[i];\n        double posterior = 0.0f;\n        for(size_t i = 0; i < m_data.size(); ++i)\n        {\n            if(m_data[i].base == b)\n                posterior += log(1 - exp(m_data[1].lp));\n            else\n                posterior += m_data[1].lp;\n        }\n        ap.set(b, posterior);\n    }\n\n    // Calculate the marginal probabilty of the data\n    double marginal = 0.0f;\n    for(size_t i = 0; i < DNA_ALPHABET_SIZE; ++i)\n    {\n        char b = ALPHABET[i];\n        marginal += exp(ap.get(b));\n    }\n    \n\n    // Scale the posterior probabilites by the marginal\n    marginal = log(marginal);\n    for(size_t i = 0; i < ap.getAlphabetSize(); ++i)\n    {\n        char b = DNA_ALPHABET::getBase(i);\n        double lp = ap.get(b);\n        //std::cout << \"Marginal: \" << marginal << \" lp: \" << lp << \" scaled: \" << lp - marginal << \"\\n\";\n        ap.set(b, lp - marginal);\n    }\n    return ap;    \n}\n\n// Calculate the likelihood of the data given the base call is \n// {A,C,G,T}. \nDNADouble Pileup::calculateLikelihoodNoQuality(double p_error) const\n{\n    DNADouble ap;\n    assert(!m_data.empty());\n    double p_correct = 1.0 - p_error;\n    \n    double log_error = log(p_error);\n    double log_correct = log(p_correct);\n\n    for(size_t i = 0; i < ap.getAlphabetSize(); ++i)\n    {\n        // Calculate the likelihood of the data given b is the true base\n        char b = ap.getBase(i);\n        double likelihood = 0.0f;\n        for(size_t i = 0; i < m_data.size(); ++i)\n        {\n            if(m_data[i].base == b)\n                likelihood += log_correct;\n            else\n                likelihood += log_error;\n        }\n        ap.set(b, likelihood);\n    }\n    return ap;    \n}\n\n\n//\nchar Pileup::getCount(char base) const\n{\n    AlphaCount64 ac;\n    for(size_t i = 0; i < m_data.size(); ++i)\n    {\n        ac.increment(m_data[i].base);\n    }\n    return ac.get(base);\n}\n\n//\nchar Pileup::getBase(size_t idx) const\n{\n    assert(idx < m_data.size());\n    return m_data[idx].base;\n}\n\n//\nsize_t Pileup::getDepth() const\n{\n    return m_data.size();\n}\n\n//\nstd::string Pileup::toStr() const\n{\n    std::string out;\n    out.reserve(m_data.size());\n    for(size_t i = 0; i < m_data.size(); ++i)\n        out.append(1, m_data[i].base);\n    return out;\n}\n"
  },
  {
    "path": "src/SGA/Util/Pileup.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// Pileup - An array of strings containing all the seen\n// bases for a given region/read\n//\n#ifndef PILEUP_H\n#define PILEUP_H\n#include \"Util.h\"\n#include \"Alphabet.h\"\n#include \"DNADouble.h\"\n\n#define DEFAULT_PROB 0.01\n#define DEFAULT_LOG_PROB -4.605170186f\n\nstruct PUElem\n{\n    PUElem() : base('A'), lp(0) {}\n    PUElem(char b, double l) : base(b), lp(l) {}\n\n    char base;\n\n    // log probability this base is correct\n    double lp; \n};\n\ntypedef std::vector<PUElem> PUElemVector;\n\nclass Pileup\n{\n    public:\n        Pileup() {}\n        Pileup(size_t n) { m_data.reserve(n); }\n\n        char calculateSimpleConsensus() const;\n        AlphaCount64 getAlphaCount() const;\n        DNADouble calculateSimpleAlphaProb() const;\n        DNADouble calculateLikelihoodNoQuality(double p_error) const;\n\n        inline void add(char b) { m_data.push_back(PUElem(b, DEFAULT_LOG_PROB)); }\n        inline void add(char b, double lp) { m_data.push_back(PUElem(b, lp)); }\n\n        char getBase(size_t idx) const;\n        char getCount(char base) const;\n        size_t getDepth() const;\n\n        std::string toStr() const;\n\n    private:\n        PUElemVector m_data;\n};\n\ntypedef std::vector<Pileup> PileupVector;\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/PrimerScreen.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// PrimerScreen - Singleton class to filter sequences \n// that match a database of primer sequences\n//\n#include \"PrimerScreen.h\"\n\n// Hardcoded primer sequences that we wish to filter against\n\n// Primers used in the Sanger's pcr-free library prep\n// See Kozarewa et al. (http://www.nature.com/nmeth/journal/v6/n4/full/nmeth.1311.html)\n// supplemental info. We do not use the whole primer sequences.\n#define ILLUMINA_SANGER_PCR_FREE_A \"AATGATACGGCGACCACCGAGATCTACA\"\n#define ILLUMINA_SANGER_PCR_FREE_B \"GATCGGAAGAGCGGTTCAGCAGGAATGC\"\n\nPrimerScreen::PrimerScreen()\n{\n    m_db.push_back(ILLUMINA_SANGER_PCR_FREE_A);\n    m_db.push_back(ILLUMINA_SANGER_PCR_FREE_B);\n}\n\n// Check seq against the primer database\nbool PrimerScreen::containsPrimer(const std::string& seq)\n{\n    static PrimerScreen screener; // initializes singleton object if necessary\n    \n    // For now we only check if the first 14\n    // bases of seq is a perfect match to any sequence in the db\n    // This is sufficient to get rid of the vast majority of the primer\n    // contamination\n    const size_t check_size = 14;\n    std::string check = seq.substr(0, check_size);\n    for(size_t i = 0; i < screener.m_db.size(); ++i)\n    {\n        if(screener.m_db[i].find(check) != std::string::npos)\n            return true;\n    }\n    return false;\n}\n"
  },
  {
    "path": "src/SGA/Util/PrimerScreen.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// PrimerScreen - Singleton class to filter sequences \n// that match a database of primer sequences\n//\n#ifndef PRIMERSCREEN_H\n#define PRIMERSCREEN_H\n\n#include \"Util.h\"\n\nclass PrimerScreen\n{\n\n    public:\n        \n        // Return true if the sequence fails the primer check\n        static bool containsPrimer(const std::string& seq);\n\n    private:\n        \n        PrimerScreen();\n\n        StringVector m_db;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Profiler.h",
    "content": "///----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Profiler.h -- Lightweight macro-based function profiler.\n//\n#ifndef PROFILER_H\n#define PROFILER_H\n\n#include <time.h>\n#include <iostream>\n#include \"config.h\"\n\n//#define USE_PROFILER 1\n#if defined(HAVE_CLOCK_GETTIME) && defined(USE_PROFILER)\n\n// Change this to determine how often the profile should print\n#define PROFILE_TICKS_BEFORE_PRINT 1000\n\n// This class writes the lifespan of the object\n// to the output variable, in nanoseconds\nclass TimeTracker\n{\n    public:\n        TimeTracker(size_t & output) : m_output(output)\n        {\n             timespec start;\n             clock_gettime(CLOCK_REALTIME, &start);\n             m_start_ns = start.tv_sec * 1000000000 + start.tv_nsec;\n        }\n\n        ~TimeTracker()\n        {\n             timespec end;\n             clock_gettime(CLOCK_REALTIME, &end);\n             size_t end_ns = end.tv_sec * 1000000000 + end.tv_nsec;\n\n             // Update the result using an atomic compare and swap\n             size_t diff = end_ns - m_start_ns;\n             while(!__sync_bool_compare_and_swap(&m_output, m_output, m_output + diff)) {}\n        }\n\n    private:\n        size_t m_start_ns;\n        size_t& m_output;\n};\n\n// Place this macros at the start of the function you wish the profile\n// The static variable updates are done via atomic compare and swaps so\n// the profiling should be threadsafe\n#define PROFILE_FUNC(x) static std::string __profile_name = x; \\\n                        static size_t __profile_iterations = 0; \\\n                        static size_t __profile_total_nanoseconds = 0; \\\n                        double milli_seconds = (double)__profile_total_nanoseconds / 1000000.0f; \\\n                        double avg_per_iteration = milli_seconds / __profile_iterations; \\\n                        while(!__sync_bool_compare_and_swap(&__profile_iterations, __profile_iterations, __profile_iterations + 1)) { } \\\n                        if(__profile_iterations % PROFILE_TICKS_BEFORE_PRINT == 0) \\\n                            printf(\"[Profile] count: %zu time: %.0lf ms avg: %.0lf ms func: %s\\n\", __profile_iterations, milli_seconds, avg_per_iteration, __profile_name.c_str()); \\\n                        TimeTracker __profile_timer(__profile_total_nanoseconds);\n                         \n#else\n\n// Eliminate the macro\n#define PROFILE_FUNC(x)\n\n#endif // #ifdef HAVE_CLOCK_GETTIME\n\n#endif // #ifndef PROFILER_H\n"
  },
  {
    "path": "src/SGA/Util/Quality.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Quality - functions for manipulating quality values\n//\n#include \"Quality.h\"\n\n// Return a uniform log-scaled quality vector of the given size\nDoubleVector Quality::uniformLogProbVector(double p_error, size_t n)\n{\n    double lp = log(p_error);\n    DoubleVector dv;\n    dv.reserve(n);\n    for(size_t i = 0; i < n; ++i)\n        dv.push_back(lp);\n    return dv;\n}\n\n// Return a string which encodes the log-scaled double vector as characters\nstd::string Quality::encodeLogProbVector(const DoubleVector& dv)\n{\n    std::string out;\n    out.reserve(dv.size());\n    for(size_t i = 0; i < dv.size(); ++i)\n        out.push_back(phred2char(lnprob2phred(dv[i])));\n    return out;\n}\n\n"
  },
  {
    "path": "src/SGA/Util/Quality.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Quality - functions for manipulating quality values\n//\n#ifndef QUALITY_H\n#define QUALITY_H\n\n#include <inttypes.h>\n#include <vector>\n#include <math.h>\n#include <assert.h>\n#include <string>\n#include <iostream>\n\nstatic const int DEFAULT_QUAL_SCORE = 15;\nstatic const int PHRED64_DIFF = 31;\n\ntypedef std::vector<double> DoubleVector;\nnamespace Quality\n{\n    // Convert the quality character from phred64 to phred33 encoding\n    inline char phred64toPhred33(char c)\n    {\n        return (int)c - PHRED64_DIFF;\n    }\n\n    // Returns true if the character c is a valid phred 33 encoding\n    // of a quality value in the range [0, 60]\n    inline bool isValidPhred33(char c)\n    {\n        int p = (int)c - 33;\n        return p >= 0 && p <= 60;\n    }\n\n    // Phred score transformations\n    inline int char2phred(char b)\n    {\n        uint8_t v = b;\n        assert(v >= 33);\n        return v - 33;\n    }\n\n    inline char phred2char(int p)\n    {\n        uint8_t v = (p <= 93) ? p : 93;\n        char c = v + 33;\n        return c;\n    }\n\n    inline int prob2phred(double p)\n    {\n        return static_cast<int>(round(-10.0f * log10(p)));\n    }\n\n    inline int lnprob2phred(double lp)\n    {\n        // change base\n        static double transform = log(10);\n        lp /= transform;\n        return static_cast<int>(round(-10.0f * lp));\n    }\n\n    // Return a uniform log-scaled quality vector of the given size\n    DoubleVector uniformLogProbVector(double p_error, size_t n);\n\n    // Return a string which encodes the log-scaled double vector as characters\n    std::string encodeLogProbVector(const DoubleVector& dv);\n};\n\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/QualityCodec.h",
    "content": "//-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// QualityCodec - Encoder/decoder for a quality\n// symbols. Supports downsampling to a small range.\n//\n#ifndef QUALITYCODEC_H\n#define QUALITYCODEC_H\n\n#include <inttypes.h>\n#include <iostream>\n\ntypedef uint8_t QualityStorageUnit;\n\ntemplate<int BITS>\nclass QualityCodec\n{\n    public:\n        typedef QualityStorageUnit UNIT_TYPE;\n        static const int SYMBOLS_PER_UNIT = 8 / BITS;\n\n        // These values are the lowest and highest quality\n        // values that are stored. The other values are interpolated\n        // between these range\n        static const int PHRED_MIN = 0;\n        static const int PHRED_MAX = 40;\n        static const int QUALITY_RANGE = PHRED_MAX - PHRED_MIN;\n        static const int QUALITY_BINS = 1 << BITS;\n        static const int BIN_SIZE = (QUALITY_RANGE + QUALITY_BINS - 1) / QUALITY_BINS; // ceiling\n\n        // Encode the character b into a value\n        inline uint8_t encode(char b) const\n        {\n            // Compute the quality bin to place this value in\n            int phred = Quality::char2phred(b);\n\n            // Clamp values\n            if(phred < 0)\n                phred = 0;\n            UNIT_TYPE bin_idx = (phred - PHRED_MIN) / BIN_SIZE;\n\n            if(bin_idx >= QUALITY_BINS)\n                bin_idx = QUALITY_BINS - 1;\n            //std::cout << \"Q: \" << b << \" phred: \" << phred << \" c: \" << (int)bin_idx << \"\\n\";\n            //decode(bin_idx);\n            return bin_idx;\n        }\n\n        // Decode the value c into a character\n        inline char decode(uint8_t c) const\n        {\n            // Return the midpoint value of the bin\n            int phred = (2 * c + 1) * BIN_SIZE / 2;\n            char b = Quality::phred2char(phred);\n            //std::cout << \"c: \" << (int)c << \" phred: \" << phred << \" Q: \" << b << \"\\n\";\n            return b;\n        }\n\n        // Returns the number of units required to encode\n        // a string of length n\n        inline size_t getRequiredUnits(size_t n) const\n        {\n            return (n + SYMBOLS_PER_UNIT - 1) / SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the number of symbols that can be stored\n        // in n units\n        inline size_t getCapacity(size_t n) const\n        {\n            return n * SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the index of the unit to store the\n        // i-th symbol of the string\n        inline size_t getUnitIndex(size_t i) const\n        {\n            return i / SYMBOLS_PER_UNIT;\n        }\n\n        // Returns the position within a unit that the i-th symbol \n        // should be stored in\n        inline size_t getUnitOffset(size_t i) const\n        {\n            // this position is the k-th symbol of the unit\n            return i % SYMBOLS_PER_UNIT;\n        }\n\n        // Return the amount that a value must be shifted to\n        // store a code at a given offset\n        inline uint8_t getOffsetShift(size_t offset) const\n        {\n            return BITS*(SYMBOLS_PER_UNIT - 1 - offset);\n        }\n\n        // Return a mask that can be used to select a single value by ANDing a storage unit\n        inline uint8_t getOffsetMask(size_t offset) const\n        {\n            return ((1 << BITS) - 1) << getOffsetShift(offset);\n        }\n\n        // Store the value v at the i-th encoded position in the data array\n        inline void store(UNIT_TYPE* pData, size_t i, char b) const\n        {\n            UNIT_TYPE& unit = pData[getUnitIndex(i)];\n            size_t offset = getUnitOffset(i);\n            uint8_t shift = getOffsetShift(offset);\n\n            // Clear the \n            unsigned char mask = getOffsetMask(offset);\n\n\n            // Clear position\n            unit &= ~mask;\n\n            // Set position\n            uint8_t code = encode(b);\n            code <<= shift;\n            unit |= code; \n            \n            /*\n            std::cout << \"E Unit: \" << getUnitIndex(i) << \"\\n\";\n            std::cout << \"E Offset: \" << offset << \"\\n\";\n            std::cout << \"E Shift: \" << (int)shift << \"\\n\";\n            std::cout << \"E Mask: \" << (int)mask << \"\\n\";\n            std::cout << \"E UnitV: \" << (int)unit << \"\\n\";\n            */\n        }\n\n        // get the character stored at position i\n        inline char get(const UNIT_TYPE* pData, size_t i) const\n        {\n            const UNIT_TYPE& unit = pData[getUnitIndex(i)];\n            size_t offset = getUnitOffset(i);\n            unsigned char mask = getOffsetMask(offset);\n            UNIT_TYPE code = unit & mask;\n            uint8_t shift = getOffsetShift(offset);\n            code >>= shift;\n            \n            /*\n            std::cout << \"D Unit: \" << getUnitIndex(i) << \"\\n\";\n            std::cout << \"D Offset: \" << offset << \"\\n\";\n            std::cout << \"D Shift: \" << (int)shift << \"\\n\";\n            std::cout << \"D Mask: \" << (int)mask << \"\\n\";\n            std::cout << \"D UnitV: \" << (int)unit << \"\\n\";\n            */\n            return decode(code);\n        }\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/QualityTable.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// QualityTable - A 0-indexed table of quality strings\n//\n#include <iostream>\n#include <algorithm>\n#include \"QualityTable.h\"\n#include \"QualityCodec.h\"\n#include \"SeqReader.h\"\n\n// Read the sequences from a file\nQualityTable::QualityTable() : m_bytes_used(0)\n{\n    int missing_phred = 20;\n    m_missingQualityChar = Quality::phred2char(missing_phred);\n}\n\n \nQualityTable::~QualityTable()\n{\n    for(size_t i = 0; i < m_table.size(); ++i)\n        delete m_table[i].encoded_data;\n}\n\n//\nvoid QualityTable::loadQualities(const std::string& filename)\n{\n    SeqReader reader(filename);\n    SeqRecord sr;\n    while(reader.get(sr))\n        addQualityString(sr.qual);\n}\n\n//\nvoid QualityTable::addQualityString(const std::string& qual)\n{\n    size_t num_bytes_required = m_codec.getRequiredUnits(qual.size());\n    QualityString incoming;\n    incoming.encoded_data = new QualityStorageUnit[num_bytes_required];\n    incoming.num_encoded_symbols = qual.size();\n    for(size_t i = 0; i < qual.size(); ++i)\n        m_codec.store(incoming.encoded_data, i, qual[i]);\n    m_table.push_back(incoming);\n\n    //std::cout << \"Stored:  \" << qual << \"\\n\";\n    //std::cout << \"Decoded: \" << getQualityString(m_table.size() - 1, qual.size()) << \"\\n\";\n    m_bytes_used += (sizeof(incoming) + num_bytes_required);\n}\n\n//\nstd::string QualityTable::getQualityString(size_t idx, size_t n) const\n{\n    // If there is no quality string for this index, return default qualities\n    if(idx >= m_table.size())\n        return std::string(n, m_missingQualityChar);\n\n    QualityString encoded = m_table[idx];\n    std::string out;\n    out.reserve(encoded.num_encoded_symbols);\n    for(size_t i = 0; i < encoded.num_encoded_symbols; ++i)\n        out.push_back(m_codec.get(encoded.encoded_data, i));\n    assert(out.length() == n);\n    return out;\n}\n\n//\nsize_t QualityTable::getCount() const\n{\n    return m_table.size();\n}\n\n//\nvoid QualityTable::printSize() const\n{\n    printf(\"QualityTable: %.2lfGB\\n\", (double)m_bytes_used / (1000 * 1000 * 1000));\n}\n\n"
  },
  {
    "path": "src/SGA/Util/QualityTable.h",
    "content": "//-----------------------------------------------\n// Copyright 2012 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// QualityTable - A 0-indexed table of quality scores\n//\n#ifndef QUALITYTABLE_H\n#define QUALITYTABLE_H\n#include \"Util.h\"\n#include \"SeqReader.h\"\n#include \"QualityCodec.h\"\n#include <map>\n\nstruct QualityString\n{\n    uint8_t num_encoded_symbols;\n    QualityStorageUnit* encoded_data;\n};\n\ntypedef std::vector<QualityString> QualityStringVector;\n\nclass QualityTable\n{\n    public:\n\n        //\n        QualityTable();\n        ~QualityTable();\n\n        //\n        void loadQualities(const std::string& filename);\n        void addQualityString(const std::string& qual);\n        std::string getQualityString(size_t idx, size_t n) const;\n        size_t getCount() const;\n        void clear();\n\n        //\n        void printSize() const;\n\n    private:\n        QualityCodec<4> m_codec;\n        QualityStringVector m_table;\n        size_t m_bytes_used;\n        char m_missingQualityChar;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/QualityVector.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// QualityVector - Vector of doubles representing\n// log-transformed quality values for a sequence\n//\n#include <assert.h>\n#include <algorithm>\n#include <iostream>\n#include \"QualityVector.h\"\n\n//\nQualityVector::QualityVector()\n{\n\n}\n\n//\nQualityVector::QualityVector(const QualityVector& vec, int start, int size)\n{\n    assert(!vec.empty());\n    assert(size >= 0);\n    assert(size + start <= (int)vec.size());\n    m_data.insert(m_data.end(), vec.m_data.begin() + start, vec.m_data.begin() + start + size);\n}\n\n//\nvoid QualityVector::add(DNADouble v)\n{\n    m_data.push_back(v);\n}\n\n//\nvoid QualityVector::set(size_t idx, DNADouble v)\n{\n    if(m_data.size() < idx)\n        m_data.resize(idx + 1);\n    m_data[idx] = v;\n}\n\n//\nDNADouble QualityVector::get(size_t idx) const\n{\n    assert(idx < m_data.size());\n    return m_data[idx];\n}\n\n//\nsize_t QualityVector::size() const\n{\n    return m_data.size();\n}\n\n// \nbool QualityVector::empty() const\n{\n    return m_data.empty();\n}\n\n//\nvoid QualityVector::reverseComplement()\n{\n    std::reverse(m_data.begin(), m_data.end());\n    for(size_t i = 0; i < m_data.size(); ++i)\n        m_data[i].complement();\n}\n\n\n"
  },
  {
    "path": "src/SGA/Util/QualityVector.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// QualityVector - Vector of doubles representing\n// log-transformed quality values for a sequence\n//\n#ifndef QUALITYVECTOR_H\n#define QUALITYVECTOR_H\n\n#include <vector>\n#include \"Alphabet.h\"\n#include \"DNADouble.h\"\n\ntypedef std::vector<DNADouble> APVec;\n\nclass QualityVector\n{\n    public:\n        \n        // Constructors\n        QualityVector();\n        QualityVector(const QualityVector& vec, int start, int size);\n\n        //\n        void add(DNADouble v);\n        void set(size_t idx, DNADouble v);\n        DNADouble get(size_t idx) const;\n        size_t size() const;\n        bool empty() const;\n\n        //\n        void reverseComplement();\n\n    private:\n        APVec m_data;\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Read2Contig.h",
    "content": "#ifndef READ2CONTIG_H\n#define READ2CONTIG_H\n\n#include <string>\n#include <vector>\n#include \"api/BamReader.h\"\n#include \"api/BamWriter.h\"\n#include <sstream>\n\nstruct Read2Contig {\n\n  // Constructors\n  Read2Contig(std::string tcname, std::string trname, unsigned tpos, std::string tseq) : cname(tcname), rname(trname), pos(tpos), seq(tseq) {}\n  Read2Contig(std::string tcname, std::string trname, unsigned tpos, BamTools::BamAlignment ta, std::string tseq) : cname(tcname), rname(trname), pos(tpos), a(ta), seq(tseq) {}\n  Read2Contig() {}\n\n  ~Read2Contig() {}\n\n  //data\n  std::string cname;\n  std::string rname;\n  int pos;\n  BamTools::BamAlignment a;\n  std::string seq;\n  bool valid = true;\n  double sw_score = -1;\n\n  // set the sort order\n  bool operator < (const Read2Contig& str) const { return (pos < str.pos); }\n\n  // print it out\n  std::string toString() const {\n    std::stringstream ss;\n    std::string sep = \",\";\n    ss << cname << sep << rname << sep << pos << sep << seq << sep << sw_score;\n    return ss.str();\n  }\n\n};\n\ntypedef std::vector<Read2Contig> R2CVec;\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/ReadInfoTable.cpp",
    "content": "//\n//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ReadInfoTable - A 0-indexed table of ID, length pairs\n// Used to convert suffix array hits to overlaps\n//\n#include <iostream>\n#include <algorithm>\n#include \"ReadInfoTable.h\"\n#include \"SeqReader.h\"\n\n//JEREMIAH\nReadInfoTable::ReadInfoTable(ReadTable *pRT) : m_numericIDs(false) {\n  for (size_t i = 0; i < pRT->getCount(); i++) {\n    m_lengths.push_back(pRT->getReadLength(i));\n    m_ids.push_back(pRT->getReadID(i));\n  }\n}\n\n// Read the sequences from a file\nReadInfoTable::ReadInfoTable(std::string filename, \n                             size_t num_expected, \n                             ReadInfoOption option) : m_numericIDs(false)\n{\n    // Do not store actual ids, use a numeric id equal to the table index\n    if(option == RIO_NUMERICID)\n        m_numericIDs = true;\n\n    if(num_expected > 0)\n    {\n        m_lengths.reserve(num_expected);\n        if(!m_numericIDs)\n            m_ids.reserve(num_expected);\n    }\n\n    SeqReader reader(filename);\n    SeqRecord sr;\n\n    // Load the lengths and ids\n    while(reader.get(sr))\n    {\n        m_lengths.push_back(sr.seq.length());\n        if(!m_numericIDs)\n        {\n            m_ids.push_back(sr.id);\n        }\n    }\n}\n\n// \nReadInfoTable::~ReadInfoTable()\n{\n\n}\n\n//\nsize_t ReadInfoTable::getReadLength(size_t idx) const\n{\n    assert(idx < m_lengths.size());\n    return m_lengths[idx];\n}\n\n//\nstd::string ReadInfoTable::getReadID(size_t idx) const\n{\n    if(!m_numericIDs)\n    {\n        assert(idx < m_ids.size());\n        return m_ids[idx];\n    }\n    else\n    {\n        // Build an identified from the idx\n        std::stringstream idss;\n        idss << idx;\n        return idss.str();\n    }\n}\n\n//\nconst ReadInfo ReadInfoTable::getReadInfo(size_t idx) const\n{\n    ReadInfo ri(getReadID(idx), getReadLength(idx));\n    return ri;\n}\n\n//\nsize_t ReadInfoTable::getCount() const\n{\n    return m_lengths.size();\n}\n\n// \nsize_t ReadInfoTable::countSumLengths() const\n{\n    size_t sum = 0;\n    for(size_t i = 0; i < m_lengths.size(); ++i)\n        sum += m_lengths[i];\n    return sum;\n}\n\n//\nvoid ReadInfoTable::clear()\n{\n    m_lengths.clear();\n    m_ids.clear();\n}\n\n"
  },
  {
    "path": "src/SGA/Util/ReadInfoTable.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ReadInfoTable - A 0-indexed table of ID, length pairs\n// Used to convert suffix array hits to overlaps\n//\n#ifndef READINFOTABLE_H\n#define READINFOTABLE_H\n#include \"Util.h\"\n#include \"SeqReader.h\"\n#include \"ReadTable.h\"\n#include <map>\n\nenum ReadInfoOption\n{\n    RIO_NONE,\n    RIO_NUMERICID\n};\n\nstruct ReadInfo\n{\n    ReadInfo() : length(0) {}\n    ReadInfo(const std::string& i, const uint32_t& l) : id(i), length(l) {}\n    std::string id;\n    uint32_t length;\n};\n\ntypedef std::vector<ReadInfo> InfoVector;\n\nclass ReadInfoTable\n{\n    public:\n        //\n        ReadInfoTable() {}\n        ReadInfoTable(ReadTable *pRT);\n\n        // Load the table using the read in filename\n        // If num_expected > 0, reserve room in the table for num_expected reads\n        ReadInfoTable(std::string filename, size_t num_expected = 0, ReadInfoOption options = RIO_NONE);\n        ~ReadInfoTable();\n\n        //\n        const ReadInfo getReadInfo(size_t idx) const;\n        std::string getReadID(size_t idx) const;\n        size_t getReadLength(size_t idx) const;\n        size_t getCount() const;\n        size_t countSumLengths() const;\n        void clear();\n\n    private:\n\n        std::vector<int> m_lengths;\n        std::vector<std::string> m_ids;\n\n        bool m_numericIDs;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/ReadTable.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ReadTable - A 0-indexed table of reads\n//\n#include <iostream>\n#include <algorithm>\n#include \"ReadTable.h\"\n\n//JEREMIAH\nvoid ReadTable::setReadSequence(const std::string& seqr) {\n  assert(m_table[idx-1].seq.length() == seqr.length());\n  m_table[idx-1].seq = seqr;\n}\n\n// JEREMIAH\nReadTable::ReadTable(SeqRecordVector &srv)\n{\n  idx = 0;\n  m_pIndex = NULL; // not built by default\n  for(std::vector<SeqRecord>::size_type i = 0; i != srv.size(); i++) {\n    m_table.push_back(srv[i].toSeqItem());\n  }\n}\n\n// JEREMIAH\nReadTable::ReadTable(const SeqLib::UnalignedSequenceVector &contigs)\n{\n  idx = 0;\n  m_pIndex = NULL; // not built by default\n  for (SeqLib::UnalignedSequenceVector::const_iterator it = contigs.begin(); it != contigs.end(); it++) {\n    SeqItem si;\n    si.seq = it->Seq;\n    si.id = it->Name;\n    m_table.push_back(si);\n  }\n  \n}\n\n\n//\nstd::string ReadTable::getReadID(size_t idx) const\n{\n  return m_table[idx].id;\n}\n\n//JEREMIAH \nvoid ReadTable::setZero() {\n  idx = 0;\n} \n\n// Jeremiah\nbool ReadTable::getRead(SeqItem &si)\n{\n  if (idx >= m_table.size())\n    return false;\n  si = m_table[idx];\n\n  idx++;\n  return true;\n}\n\n// \nReadTable::~ReadTable()\n{\n  if(m_pIndex != NULL)\n    delete m_pIndex;\n}\n\n// Populate this read table with the reverse reads from pRT\nvoid ReadTable::initializeReverse(const ReadTable* pRT)\n{\n  size_t numReads = pRT->getCount();\n  m_table.reserve(numReads);\n  for(size_t i = 0; i < numReads; ++i)\n    {\n      SeqItem read = pRT->getRead(i);\n      read.seq.reverse();\n      addRead(read);\n    }\n}\n\n//\nvoid ReadTable::reverseAll()\n{\n  for(size_t i = 0; i < getCount(); ++i)\n    m_table[i].seq.reverse();\n}\n\n//\nvoid ReadTable::addRead(const SeqItem& r)\n{\n  m_table.push_back(r);\n}\n\n//\nsize_t ReadTable::getReadLength(size_t idx) const\n{\n  return m_table[idx].seq.length();\n}\n\n//\nconst SeqItem& ReadTable::getRead(size_t idx) const\n{\n  if (idx >= m_table.size()) {\n    std::cerr << \"idx \" << idx << \" m_table.size() \" << m_table.size() << std::endl;\n    assert(idx <= m_table.size());\n  }\n  assert(idx < m_table.size());\n  return m_table[idx];\n}\n\n// indexReadsByID must be called before this function can be used\nconst SeqItem& ReadTable::getRead(const std::string& id) const\n{\n  assert(m_pIndex != NULL);\n  if(m_pIndex == NULL)\n    {\n      std::cerr << \"Error: read table is not indexed (did you forget to call ReadTable::buildIndex?)\\n\";\n      assert(false);\n    }\n\n  ReadIndex::const_iterator i = m_pIndex->find(id);\n  if(i == m_pIndex->end())\n    {\n      std::cerr << \"Read with id \" << id << \" not found in table\\n\";\n      assert(false);\n    }\n\n  return *i->second;\n}\n\n// build a read id -> *seqitem index\nvoid ReadTable::indexReadsByID()\n{\n  m_pIndex = new ReadIndex;\n  for(size_t i = 0; i < m_table.size(); ++i)\n    {\n      std::pair<ReadIndex::iterator, bool> result = \n\tm_pIndex->insert(std::make_pair(m_table[i].id, &m_table[i]));\n      if(!result.second)\n        {\n\t  std::cerr << \"Error: Attempted to insert vertex into table with a duplicate id: \" <<\n\t    m_table[i].id << \"\\n\";\n\t  std::cerr << \"All reads must have a unique identifier\\n\";\n\t  exit(1);\n        }\n    }\n}\n\n//\nsize_t ReadTable::getCount() const\n{\n  return m_table.size();\n}\n\n// \nsize_t ReadTable::countSumLengths() const\n{\n  size_t sum = 0;\n  for(size_t i = 0; i < m_table.size(); ++i)\n    sum += m_table[i].seq.length();\n  return sum;\n}\n\n//\nvoid ReadTable::clear()\n{\n  m_table.clear();\n\n  if(m_pIndex != NULL)\n    {\n      delete m_pIndex;\n      m_pIndex = NULL;\n    }\n}\n\n//\nstd::ostream& operator<<(std::ostream& out, const ReadTable& rt)\n{\n  size_t numReads = rt.getCount();\n  for(size_t i = 0; i < numReads; ++i)\n    {\n      const SeqItem& read = rt.getRead(i);\n      out << read.id << \"\\t\" << read.seq.toString() << \"\\n\";\n    }\n  return out;\n}\n\n\n"
  },
  {
    "path": "src/SGA/Util/ReadTable.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// ReadTable - A 0-indexed table of reads\n//\n#ifndef SNOWS_READTABLE_H\n#define SNOWS_READTABLE_H\n\n#include \"Util.h\"\n#include \"SeqReader.h\"\n#include \"SeqLib/UnalignedSequence.h\"\n#include <map>\n\ntypedef std::vector<SeqItem> ReadVector;\ntypedef std::map<std::string, SeqItem*> ReadIndex;\n\nclass ReadTable\n{\n public:\n  //\n  ReadTable() : idx(0), m_pIndex(NULL) {}\n    //ReadTable(std::string* seq, std::string * id, int length);\n    ReadTable(SeqRecordVector &srv);\n    ReadTable(const SeqLib::UnalignedSequenceVector &contigs);\n    ReadTable(std::string filename, uint32_t reader_flags = 0);\n    ~ReadTable();\n\n    // Initialize this read table as the reverse of the passed in read table\n    void initializeReverse(const ReadTable* pRT);\n\n    // Reverse all the reads in this table\n    void reverseAll();\n\n    // Build a readid -> read index\n    void indexReadsByID();\n\n    //\n    void addRead(const SeqItem& r);\n    const SeqItem& getRead(size_t idx) const;\n    const SeqItem& getRead(const std::string& id) const;\n    bool getRead(SeqItem &si); // JEREMIAH\n    size_t getReadLength(size_t idx) const;\n    size_t getCount() const;\n    size_t countSumLengths() const;\n    std::string getReadID(size_t idx) const;\n    void setZero();\n    void clear();\n\n    // Get a particular character for a particular read\n    inline char getChar(size_t str_idx, size_t char_idx) const\n      {\n\tassert(str_idx < m_table.size());\n\treturn m_table[str_idx].seq.get(char_idx);\n      }\n\n    // I/O\n    friend std::ostream& operator<<(std::ostream& out, const ReadTable& rt);\n\n    //Jeremiah\n    void setReadSequence(const std::string& seqr);\n\n private:\n    ReadVector m_table;\n    unsigned int idx = 0;\n    // Index of readid -> SeqItem\n    // It is not build be default to save memory\n    ReadIndex* m_pIndex; \n};\n\n#endif\n\n"
  },
  {
    "path": "src/SGA/Util/ReadTableNew.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ReadTable - A 0-indexed table of reads\n//\n#include <iostream>\n#include <algorithm>\n#include \"ReadTable.h\"\n#include \"SeqReader.h\"\n//#include \"contigs.h\"\n\n// Read the sequences from a file\nReadTable::ReadTable(std::string filename, uint32_t reader_flags)\n{\n    idx = 0;\n    m_pIndex = NULL; // not built by default\n    SeqReader reader(filename, reader_flags);\n    SeqRecord sr;\n    while(reader.get(sr))\n    {\n        addRead(sr.toSeqItem());\n    }\n}\n\n// \nReadTable::~ReadTable()\n{\n    if(m_pIndex != NULL)\n        delete m_pIndex;\n}\n\n// Populate this read table with the reverse reads from pRT\nvoid ReadTable::initializeReverse(const ReadTable* pRT)\n{\n    size_t numReads = pRT->getCount();\n    m_table.reserve(numReads);\n    for(size_t i = 0; i < numReads; ++i)\n    {\n        SeqItem read = pRT->getRead(i);\n        read.seq.reverse();\n        addRead(read);\n    }\n}\n\n//\nvoid ReadTable::reverseAll()\n{\n    for(size_t i = 0; i < getCount(); ++i)\n        m_table[i].seq.reverse();\n}\n\n//\nvoid ReadTable::addRead(const SeqItem& r)\n{\n    m_table.push_back(r);\n}\n\n//\nsize_t ReadTable::getReadLength(size_t idx) const\n{\n    return m_table[idx].seq.length();\n}\n\n//\nstd::string ReadTable::getReadID(size_t idx) const\n{\n  return m_table[idx].id;\n}\n\n\n//\nconst SeqItem& ReadTable::getRead(size_t idx) const\n{\n    assert(idx < m_table.size());\n    return m_table[idx];\n}\n\n// JEREMIAH\nbool ReadTable::getRead(SeqItem &si)\n{\n  if (idx >= m_table.size())\n    return false;\n  si = m_table[idx];\n  idx++;\n  return true;\n}\n\n//JEREMIAH \nvoid ReadTable::setZero() \n{\n  idx = 0;\n} \n\n\n// indexReadsByID must be called before this function can be used\nconst SeqItem& ReadTable::getRead(const std::string& id) const\n{\n    assert(m_pIndex != NULL);\n    if(m_pIndex == NULL)\n    {\n        std::cerr << \"Error: read table is not indexed (did you forget to call ReadTable::buildIndex?)\\n\";\n        assert(false);\n    }\n\n    ReadIndex::const_iterator i = m_pIndex->find(id);\n    if(i == m_pIndex->end())\n    {\n        std::cerr << \"Read with id \" << id << \" not found in table\\n\";\n        assert(false);\n    }\n\n    return *i->second;\n}\n\n// build a read id -> *seqitem index\nvoid ReadTable::indexReadsByID()\n{\n    m_pIndex = new ReadIndex;\n    for(size_t i = 0; i < m_table.size(); ++i)\n    {\n        std::pair<ReadIndex::iterator, bool> result = \n            m_pIndex->insert(std::make_pair(m_table[i].id, &m_table[i]));\n        if(!result.second)\n        {\n            std::cerr << \"Error: Attempted to insert vertex into table with a duplicate id: \" <<\n                         m_table[i].id << \"\\n\";\n            std::cerr << \"All reads must have a unique identifier\\n\";\n            exit(1);\n        }\n    }\n}\n\n//\nsize_t ReadTable::getCount() const\n{\n    return m_table.size();\n}\n\n// \nsize_t ReadTable::countSumLengths() const\n{\n    size_t sum = 0;\n    for(size_t i = 0; i < m_table.size(); ++i)\n    {\n        sum += m_table[i].seq.length();\n    }\n    return sum;\n}\n\n//\nvoid ReadTable::clear()\n{\n    m_table.clear();\n\n    if(m_pIndex != NULL)\n    {\n        delete m_pIndex;\n        m_pIndex = NULL;\n    }\n}\n\n//\nstd::ostream& operator<<(std::ostream& out, const ReadTable& rt)\n{\n    size_t numReads = rt.getCount();\n    for(size_t i = 0; i < numReads; ++i)\n    {\n        const SeqItem& read = rt.getRead(i);\n        out << read.id << \"\\t\" << read.seq.toString() << \"\\n\";\n    }\n    return out;\n}\n"
  },
  {
    "path": "src/SGA/Util/ReadTableNew.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// ReadTable - A 0-indexed table of reads\n//\n#ifndef READTABLE_H\n#define READTABLE_H\n\n#include \"Util.h\"\n#include \"SeqReader.h\"\n#include <map>\n\ntypedef std::vector<SeqItem> ReadVector;\ntypedef std::map<std::string, SeqItem*> ReadIndex;\n\nclass ReadTable\n{\n    public:\n        //JEREMIAH (added idx(0))\n        ReadTable() : idx(0), m_pIndex(NULL) {}\n        ReadTable(std::string filename, uint32_t reader_flags = 0);\n        ~ReadTable();\n\n        // Initialize this read table as the reverse of the passed in read table\n        void initializeReverse(const ReadTable* pRT);\n\n        // Reverse all the reads in this table\n        void reverseAll();\n\n        // Build a readid -> read index\n        void indexReadsByID();\n\n        //\n        void addRead(const SeqItem& r);\n        const SeqItem& getRead(size_t idx) const;\n        const SeqItem& getRead(const std::string& id) const;\n        bool getRead(SeqItem &si); // JEREMIAH\n        size_t getReadLength(size_t idx) const;\n        size_t getCount() const;\n        size_t countSumLengths() const;\n\tstd::string getReadID(size_t idx) const;\n        void setZero();\n        void clear();\n\n        // Get a particular character for a particular read\n        inline char getChar(size_t str_idx, size_t char_idx) const\n        {\n            assert(str_idx < m_table.size());\n            return m_table[str_idx].seq.get(char_idx);\n        }\n\n        // I/O\n        friend std::ostream& operator<<(std::ostream& out, const ReadTable& rt);\n\n\n    private:\n        ReadVector m_table;\n        unsigned int idx;\n        // Index of readid -> SeqItem\n        // It is not build be default to save memory\n        ReadIndex* m_pIndex; \n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/ReadTableS.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// ReadTable - A 0-indexed table of reads\n//\n#ifndef READTABLES_H\n#define READTABLES_H\n\n#include \"Util.h\"\n#include \"SeqReader.h\"\n#include \"contigs.h\"\n#include <map>\n#include \"api/BamReader.h\"\n\ntypedef std::vector<SeqItem> ReadVector;\ntypedef std::map<std::string, SeqItem*> ReadIndex;\ntypedef std::vector<BamTools::BamAlignment> BamAlignmentVector;\n\nclass ReadTable\n{\n    public:\n        //\n        ReadTable() : m_pIndex(NULL) {}\n\t  //ReadTable(std::string* seq, std::string * id, int length);\n\tReadTable(SeqRecordVector srv);\n\tReadTable(const BamAlignmentVector &bav);\n\tReadTable(const vector<Contig> &contigs);\n        ReadTable(std::string filename, uint32_t reader_flags = 0);\n        ~ReadTable();\n\n        // Initialize this read table as the reverse of the passed in read table\n        void initializeReverse(const ReadTable* pRT);\n\n        // Reverse all the reads in this table\n        void reverseAll();\n\n        // Build a readid -> read index\n        void indexReadsByID();\n\n        //\n        void addRead(const SeqItem& r);\n        const SeqItem& getRead(size_t idx) const;\n        const SeqItem& getRead(const std::string& id) const;\n        bool getRead(SeqItem &si); // JEREMIAH\n        size_t getReadLength(size_t idx) const;\n        size_t getCount() const;\n        size_t countSumLengths() const;\n\tstd::string getReadID(size_t idx) const;\n        void setZero();\n        void clear();\n\n        // Get a particular character for a particular read\n        inline char getChar(size_t str_idx, size_t char_idx) const\n        {\n            assert(str_idx < m_table.size());\n            return m_table[str_idx].seq.get(char_idx);\n        }\n\n        // I/O\n        friend std::ostream& operator<<(std::ostream& out, const ReadTable& rt);\n\n\n    private:\n        ReadVector m_table;\n        unsigned int idx;\n        // Index of readid -> SeqItem\n        // It is not build be default to save memory\n        ReadIndex* m_pIndex; \n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/SGAStats.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009-2013 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGAStats - Common statistics functions used \n// throughout the program\n//\n#include \"SGAStats.h\"\n#include <math.h>\n#include <iostream>\n#include <assert.h>\n\n//\n// Poisson in log space\n//\ndouble SGAStats::logPoisson(unsigned int k, double m)\n{\n    double f_k = logFactorial(k);\n    double p = (double)k * log(m) - m - f_k;\n    //std::cout << \"k: \" << k << \" f: \" << f_k << \" m: \" << m << \" p: \" << p << std::endl;\n    return p;\n}\n\n//\n// Factorial in log space\n//\ndouble SGAStats::logFactorial(unsigned int k)\n{\n    double result = 0;\n    while(k > 0)\n        result += log(k--); //slow\n    return result;\n}\n\n// \n// Log binomial pmf \n//\ndouble SGAStats::logBinomial(unsigned int k, unsigned int n, double p)\n{\n    assert(k <= n);\n    double b_coeff = logFactorial(n) - logFactorial(k) - logFactorial(n - k);\n    double lp = k * log(p) + (n - k) * log(1 - p);\n    return b_coeff + lp; \n}\n\n//\n//\n//\ndouble SGAStats::logIntegerBetaDistribution(double x, unsigned int a, unsigned int b)\n{\n    assert(x >= 0.0f && x <= 1.0f);\n    assert(a > 0 && b > 0);\n\n    double log_beta_f = logIntegerBetaFunction(a, b);\n    double n = pow(x, a - 1) * pow(1 - x, b - 1);\n    double log_p = log(n) - log_beta_f;\n    return log_p;\n}\n\n//\n//\n//\ndouble SGAStats::logIntegerBetaFunction(unsigned int a, unsigned int b)\n{\n    assert(a > 0 && b > 0);\n    return logFactorial(a - 1) + logFactorial(b - 1) - logFactorial(a + b - 1);\n}\n\n//\n//\n//\ndouble SGAStats::logIntegerBetaBinomialDistribution(unsigned int k, unsigned int n, \n                                                    unsigned int a, unsigned int b)\n{\n    assert(a > 0 && b > 0 && k <= n);\n    double b_coeff = logFactorial(n) - logFactorial(k) - logFactorial(n - k);\n\n    return b_coeff + \n           logIntegerBetaFunction(k + a, n - k + b) -\n           logIntegerBetaFunction(a, b);\n    \n}\n"
  },
  {
    "path": "src/SGA/Util/SGAStats.h",
    "content": "//-----------------------------------------------\n// Copyright 2009-2013 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SGAStats - Common statistics functions used \n// throughout the program\n//\n\n#ifndef SGASTATS_H\n#define SGASTATS_H\n\nnamespace SGAStats\n{\n//\n// Probability\n//\ndouble logPoisson(unsigned int k, double m);\ndouble logFactorial(unsigned int k);\ndouble logBinomial(unsigned int k, unsigned int n, double p);\n\n// The logarithm of the Beta distribution pdf for the special case\n// that the shape parameters are positive integers\ndouble logIntegerBetaDistribution(double x, unsigned int a, unsigned int b);\n\n// The logarithm of the integer beta function\ndouble logIntegerBetaFunction(unsigned int a, unsigned int b);\n\n// The logarithm of the integer beta binomail PMF\ndouble logIntegerBetaBinomialDistribution(unsigned int k, unsigned int n, \n                                          unsigned int a, unsigned int b);\n\n}\n#endif\n"
  },
  {
    "path": "src/SGA/Util/SeqCoord.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SeqCoord - A data structure holding the coordinate\n// of a substring of a sequence which consists of an interval and\n// the length of the string. Used to build matches and overlaps.\n//\n#include \"SeqCoord.h\"\n\n// Return a seqcoord representing the complement of the interval\n// For example if the seqcoord represents the matched portion of a string, \n// this returns a seqcoord of the unmatched portion\nSeqCoord SeqCoord::complement() const\n{\n    SeqCoord out;\n    out.seqlen = seqlen;\n\n    if(isFull())\n    {\n        out.setEmpty();\n    }\n    else if(isEmpty())\n    {\n        out.setFull();\n    }\n    else if(isLeftExtreme())\n    {\n        out.interval.start = std::max(interval.start, interval.end) + 1;\n        out.interval.end = out.seqlen - 1;\n    }\n    else\n    {\n        assert(isRightExtreme());\n        out.interval.start = 0;\n        out.interval.end = std::min(interval.start, interval.end) - 1;\n    }\n    assert(out.isValid());\n    return out;\n}\n\n// Returns the substring of STR described by this seqcoord\nstd::string SeqCoord::getSubstring(const std::string& str) const\n{\n    assert(isValid());\n    if(isEmpty())\n        return std::string(\"\");\n    else\n        return str.substr(interval.start, length());\n}\n\n// Returns the subvector described by the seqcoord\nQualityVector SeqCoord::getSubvector(const QualityVector& vec) const\n{\n    assert(isValid());\n    if(isEmpty())\n        return QualityVector();\n    else\n        return QualityVector(vec, interval.start, length());\n}\n\n//\nstd::string SeqCoord::getComplementString(const std::string& str) const\n{\n    SeqCoord comp = complement();\n    return comp.getSubstring(str);\n}\n\n\n// Output\nstd::ostream& operator<<(std::ostream& out, const SeqCoord& sc)\n{\n    out << sc.interval << \" \" << sc.seqlen;\n    return out;\n}\n\n// Input\nstd::istream& operator>>(std::istream& in, SeqCoord& sc)\n{\n    in >> sc.interval >> sc.seqlen;\n    return in;\n}\n\n"
  },
  {
    "path": "src/SGA/Util/SeqCoord.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SeqCoord - A data structure holding the coordinate\n// of a substring of a sequence which consists of an interval and\n// the length of the string. Used to build matches and overlaps.\n//\n#ifndef SEQCOORD_H\n#define SEQCOORD_H\n\n#include \"Util.h\"\n#include \"Interval.h\"\n#include \"QualityVector.h\"\n\nstruct SeqCoord\n{\n    // constructor\n    SeqCoord() : seqlen(0) { setEmpty(); }\n    SeqCoord(int s, int e, int l) : interval(s, e), seqlen(l) \n    { \n        assert(isValid()); \n    }\n\n    // functions\n    inline bool isLeftExtreme() const\n    {\n        return (interval.start == 0);\n    }\n\n    inline bool isRightExtreme() const\n    {\n        return (interval.end + 1 == seqlen);\n    }\n\n    inline bool isExtreme() const\n    {\n        return (isLeftExtreme() || isRightExtreme());\n    }\n    \n    inline bool isContained() const\n    {\n        return (isLeftExtreme() && isRightExtreme());\n    }\n\n    inline bool isFull() const\n    {\n        return length() == seqlen;\n    }\n\n    inline bool isEmpty() const\n    {\n        return interval.start == 0 && interval.end == -1;\n    }\n\n    inline bool isValid() const\n    {\n        return isEmpty() || (interval.start <= interval.end && interval.start >= 0 && interval.end < seqlen);\n    }\n\n    // Special coordinate denoting the interval is empty\n    // length() will return 0\n    inline void setEmpty()\n    {\n        interval.start = 0;\n        interval.end = -1;\n    }\n\n    // Set the seqcoord to be a full-length match\n    inline void setFull()\n    {\n        interval.start = 0;\n        interval.end = seqlen - 1;\n    }\n\n    // Return the length of the interval, which is inclusive\n    inline int length() const \n    { \n        return interval.end - interval.start + 1;\n    }\n\n    // Return the distance from the start to the left end\n    inline int getLeftDist() const\n    {\n        return interval.start;\n    }\n\n    // Return the distance to the right end\n    inline int getRightDist() const\n    {\n        return seqlen - interval.end - 1;\n    }\n\n    // Flip mirrors the coordinates so they are on the other strand\n    inline void flip()\n    {\n        int tmp = seqlen - interval.start - 1;\n        interval.start = seqlen - interval.end - 1;\n        interval.end = tmp;\n        assert(interval.start <= interval.end);\n    }\n\n    // Flip a single position p to the reverse strand for a sequence of length l\n    static inline int flip(int p, int l)\n    {\n        return l - p - 1;\n    }\n\n    SeqCoord complement() const;\n\n    // Get the substring described by the interval\n    std::string getSubstring(const std::string& str) const;\n    QualityVector getSubvector(const QualityVector& vec) const;\n\n    // Get the substring described by the complement of the interval\n    std::string getComplementString(const std::string& str) const;\n\n    friend std::ostream& operator<<(std::ostream& out, const SeqCoord& sc);\n    friend std::istream& operator>>(std::istream& in, SeqCoord& sc);    \n\n    // data\n    Interval interval;\n    int seqlen;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/SeqReader.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SeqReader - Reads fasta or fastq sequence files\n//\n#include <iostream>\n#include <algorithm>\n#include \"SeqReader.h\"\n#include \"Util.h\"\n\nSeqReader::SeqReader(std::string filename, uint32_t flags) : m_flags(flags)\n{\n    if(filename == \"-\")\n        m_pHandle = &std::cin;\n    else\n        m_pHandle = createReader(filename);\n}\n    \nSeqReader::~SeqReader()\n{\n    if(m_pHandle != &std::cin)\n        delete m_pHandle;\n}\n\n// Extract an element from the file\n// Return true if successful\nbool SeqReader::get(SeqRecord& sr)\n{\n    static int warn_count = 0;\n    const int MAX_WARN = 10;\n    RecordType rt = RT_UNKNOWN;\n    std::string header;\n    while(m_pHandle->good())\n    {\n        getline(*m_pHandle, header);\n        if(header.empty())\n            continue;\n\n        if(header[0] == '>')\n        {\n            rt = RT_FASTA;\n            break;\n        }\n        else if(header[0] == '@')\n        {\n            rt = RT_FASTQ;\n            break;\n        }\n    }\n\n    if(rt == RT_UNKNOWN)\n    {\n        // No valid start found\n        return false;\n    }\n    \n    // Parse the rest of the record\n    bool validRecord = false;\n    std::string seq;\n    std::string qual;\n\n    if(rt == RT_FASTA)\n    {\n        std::string temp;\n        while(m_pHandle->good() && m_pHandle->peek() != '>' && m_pHandle->peek() != '@')\n        {\n            getline(*m_pHandle, temp);\n            if(m_pHandle->good() && temp.size() > 0)\n                seq.append(temp);\n        }\n\n        // The record is valid if we extracted at least 1 bp for the sequence\n        // at this point the eof may have been hit but we still want the data\n        validRecord = seq.size() > 0; \n    }\n    else if(rt == RT_FASTQ)\n    {\n        std::string temp;\n        getline(*m_pHandle, seq);\n        getline(*m_pHandle, temp); //discard\n        getline(*m_pHandle, qual);\n\n        // FASTQ is required to have 4 fields, we must not have hit the EOF by this point\n        if(seq.size() != qual.size() && warn_count++ < MAX_WARN)\n        {\n            std::cerr << \"Warning, FASTQ quality string is not the same length as the sequence string for read \" << header << \"\\n\";\n        }\n        \n        // Fix [Issue GH-3]: Handle FASTQ records that have no sequence or quality value. We only\n        // emit a warning here as long as the record is properly formed.\n        if(seq.empty() || qual.empty())\n        {\n            std::cerr << \"Warning, read \" << header << \" has no sequence or quality values\\n\";\n        }\n        validRecord = !m_pHandle->eof();\n    }\n\n    if(validRecord)\n    {\n        // Parse the id\n        size_t endPos = std::min(header.find_first_of(' '), header.find_first_of('\\t'));\n        if(endPos != std::string::npos)\n        {\n            assert(endPos > 0);\n            sr.id = header.substr(1, endPos - 1);\n        }\n        else\n        {\n            sr.id = header.substr(1);\n        }\n\n        // Convert the sequence string to upper case\n        if( !(m_flags & SRF_KEEP_CASE) )\n            std::transform(seq.begin(), seq.end(), seq.begin(), ::toupper);\n\n        // If the validation flag is set, ensure that there aren't any non-ACGT bases\n        if( !(m_flags & SRF_NO_VALIDATION) )\n        {\n            if(seq.find_first_not_of(\"ACGT\") != std::string::npos)\n            {\n                std::cerr << \"Error: read \" << sr.id << \" contains non-ACGT characters.\\n\";\n                std::cerr << \"Please run sga preprocess on the data first.\\n\";\n                exit(EXIT_FAILURE);\n            }\n        }\n\n        sr.seq = seq;\n        sr.qual = qual;\n\n    }\n\n    return validRecord;\n}\n"
  },
  {
    "path": "src/SGA/Util/SeqReader.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// SeqReader - Reads fasta or fastq sequence files\n//\n#ifndef SEQREADER_H\n#define SEQREADER_H\n\n#include <fstream>\n#include \"Util.h\"\n\nenum RecordType\n{\n    RT_FASTA,\n    RT_FASTQ,\n    RT_UNKNOWN\n};\n\nstatic const uint32_t SRF_NO_VALIDATION = 1;\nstatic const uint32_t SRF_KEEP_CASE = 2;\n\n//\nclass SeqReader\n{\n    public:\n        SeqReader(std::string filename, uint32_t flags = 0);\n        ~SeqReader();\n        bool get(SeqRecord& sr);\n\n    private:\n        std::istream* m_pHandle;\n        uint32_t m_flags;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/SimpleAllocator.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// SimpleAllocator - High-level manager of SimplePool\n// memory pools. See SimplePool.h for description of allocation\n// strategy\n//\n#ifndef SIMPLEALLOCATOR_H\n#define SIMPLEALLOCATOR_H\n\n#include <list>\n#include \"SimplePool.h\"\n\ntemplate<class T>\nclass SimpleAllocator\n{\n    typedef SimplePool<T> StorageType;\n    typedef std::list<StorageType* > StorageList;\n\n    public:\n        SimpleAllocator() {}\n\n        ~SimpleAllocator()\n        {\n            for(typename StorageList::iterator iter = m_pPoolList.begin(); iter != m_pPoolList.end(); ++iter)\n            {\n                delete *iter;\n            }\n            m_pPoolList.clear();\n        }\n\n        void* alloc()\n        {\n            if(m_pPoolList.empty() || m_pPoolList.back()->isFull())\n            {\n                // new storage must be allocated\n                m_pPoolList.push_back(new StorageType);\n            }\n\n            // allocate from the last pool\n            return m_pPoolList.back()->alloc();\n        }\n\n        void dealloc(void* /*ptr*/)\n        {\n            // deallocation not tracked in this strategy\n        }\n\n    private:\n\n        StorageList m_pPoolList;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/SimplePool.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// SimplePool - Zero-overhead templated memory pool \n// The design is based on the premise that the allocation\n// of the objects have a lifetime the length of the program's\n// execution so they are never freed. Should only be used when\n// the number of objects is bounded so the pool does not constantly grow.\n//\n// Not thread-safe.\n// \n#ifndef SIMPLEPOOL_H\n#define SIMPLEPOOL_H\n\ntemplate<class T>\nclass SimplePool\n{\n    public:\n\n        SimplePool()\n        {\n            size_t bytes_per_object = sizeof(T);\n            size_t total_bytes = NUM_OBJECTS * bytes_per_object;\n            m_pPool = malloc(total_bytes);\n            if(m_pPool == NULL)\n            {\n                std::cerr << \"SimpleStorage failed to allocate \" << total_bytes << \n                \" bytes for memory pool, exiting\\n\";\n                abort();\n            }\n            m_capacity = total_bytes;\n            m_used = 0;\n        }\n\n        ~SimplePool()\n        {\n            free(m_pPool);\n        }\n    \n        // Return a pointer to the next unused block of memory\n        void* alloc()\n        {\n            assert(m_used < m_capacity);\n            void* pNext = (char*)m_pPool + m_used;\n            m_used += sizeof(T);\n            return pNext;\n        }\n\n        // Do not track deallocations\n        void dealloc(void* /*ptr*/)\n        {\n            // does nothing\n        }\n\n        bool isFull()\n        {\n            return m_used >= m_capacity;\n        }\n\n    private:\n\n        void* m_pPool;\n        size_t m_capacity;\n        size_t m_used;\n        static const size_t NUM_OBJECTS = 50*1024;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/StdAlnTools.cpp",
    "content": "///-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// StdAlnTools - Collection of wrappers around the\n// stdaln dynamic programming alignment functions\n#include <assert.h>\n#include \"StdAlnTools.h\"\n#include \"stdaln.h\"\n#include \"Alphabet.h\"\n\n// Perform a global alignment between the given strings\nint StdAlnTools::globalAlignment(const std::string& target, const std::string& query, bool bPrint)\n{\n    path_t* path;\n    int path_len = 0;\n    int score = 0;\n    createGlobalAlignmentPath(target, query, &path, &path_len, &score);\n\n    if(bPrint)\n    {\n        std::string paddedTarget, paddedQuery, paddedMatch;\n        makePaddedStringsFromPath(target, query, path, path_len, paddedTarget, paddedQuery, paddedMatch);\n        printPaddedStrings(paddedTarget, paddedQuery, paddedMatch);\n\n        std::cout << \"CIGAR: \" << makeCigar(path, path_len) << \"\\n\";\n        std::cout << \"Global alignment score: \" << score << \"\\n\";\n    }\n\n    free(path);\n\n    return score;\n}\n\n// Perform a global alignment between the given strings and return the CIGAR string\nstd::string StdAlnTools::globalAlignmentCigar(const std::string& target, const std::string& query)\n{\n    std::string cigar;\n    int score = 0;\n    globalAlignment(target, query, cigar, score);\n    return cigar;\n}\n\n// Perform a global alignment between the given strings and return the CIGAR string and score\nvoid StdAlnTools::globalAlignment(const std::string& target, const std::string& query, std::string& cigar, int& score)\n{\n    path_t* path;\n    int path_len = 0;\n    createGlobalAlignmentPath(target, query, &path, &path_len, &score);\n    cigar = makeCigar(path, path_len);\n    free(path);\n}\n\n\n// Perform a local alignment\nLocalAlignmentResult StdAlnTools::localAlignment(const std::string& target, const std::string& query)\n{\n    // Set up global alignment parameters and data structures\n    GlobalAlnParams params;\n    int max_path_length = target.size() + query.size();\n    path_t *path = (path_t*)calloc(max_path_length, sizeof(path_t));\n    int path_len;\n\n    AlnParam par;\n    int matrix[25];\n    StdAlnTools::setAlnParam(par, matrix, params);\n\n    // Make a packed version of the query and target\n    uint8_t* pQueryT = createPacked(query);\n    uint8_t* pTargetT = createPacked(target);\n    \n    LocalAlignmentResult result;\n    result.score = aln_local_core(pTargetT, target.size(), pQueryT, query.size(), &par, path, &path_len, 1, 0);\n    assert(path_len <= max_path_length);\n\n    result.cigar = makeCigar(path, path_len);\n\n    // Calculate the aligned coordinates\n    // This returns inclusive coordinates of the substrings aligned\n    path_t* p = path + path_len - 1;\n    result.targetStartIndex = (p->i ? p->i : 1) - 1;\n    result.targetEndIndex = path->i - 1;\n    result.queryStartIndex = (p->j ? p->j : 1) - 1;\n    result.queryEndIndex = path->j - 1;\n    \n    // Update cigar\n    if(result.queryStartIndex > 0)\n    {\n        std::stringstream csa;\n        csa << result.queryStartIndex << \"S\";\n        result.cigar.insert(0, csa.str());\n    }\n\n    int query_left_overhang = query.length() - (result.queryEndIndex + 1);\n\n    if(query_left_overhang > 0)\n    {\n        std::stringstream csa;\n        csa << query_left_overhang << \"S\";\n        result.cigar.append(csa.str());\n    }\n\n    // Clean up\n    delete [] pQueryT;\n    delete [] pTargetT;\n    free(path);\n\n    return result;\n}\n\n// Expand a CIGAR string into a character code for each symbol of the alignment\nstd::string StdAlnTools::expandCigar(const std::string& cigar)\n{\n    std::string expanded;\n    std::stringstream parser(cigar);\n    int length;\n    char code;\n    while(parser >> length)\n    {\n        bool success = parser >> code;\n        expanded.append(length, code);\n        assert(success);\n        (void)success;\n    }\n    return expanded;\n}\n\n// Compact an expanded CIGAR string into a regular cigar string\nstd::string StdAlnTools::compactCigar(const std::string& expanded_cigar)\n{\n    if(expanded_cigar.empty())\n        return \"\";\n\n    std::stringstream parser(expanded_cigar);\n    std::stringstream writer;\n\n    char prev_code = '\\0';\n    char curr_code;\n    int curr_length = 0;\n    while(parser >> curr_code)\n    {\n        if(curr_code == prev_code)\n        {\n            curr_length += 1;\n        }\n        else\n        {\n            // write the previous cigar character\n            if(prev_code != '\\0')\n                writer << curr_length << prev_code;\n            prev_code = curr_code;\n            curr_length = 1;\n        }\n    }\n\n    // Write the last symbol\n    writer << curr_length << prev_code;\n\n    return writer.str();\n}\n\n\n// Remove padding characters from str\nstd::string StdAlnTools::unpad(const std::string& str)\n{\n    std::string out;\n    for(size_t i = 0; i < str.size(); ++i)\n    {\n        if(str[i] != '-')\n            out.push_back(str[i]);   \n    }\n    return out;\n}\n\n// Create a path array representing the global alignment between target and query\n// Caller must free the path\nvoid StdAlnTools::createGlobalAlignmentPath(const std::string& target, const std::string& query,\n                                            path_t** path, int* path_len, int* score)\n{\n    // Set up global alignment parameters and data structures\n    GlobalAlnParams params;\n    int max_path_length = target.size() + query.size();\n    *path = (path_t*)calloc(max_path_length, sizeof(path_t));\n\n    AlnParam par;\n    int matrix[25];\n    StdAlnTools::setAlnParam(par, matrix, params);\n\n    // Make a packed version of the query and target\n    uint8_t* pQueryT = createPacked(query);\n    uint8_t* pTargetT = createPacked(target);\n    *score = aln_global_core(pTargetT, target.size(), pQueryT, query.size(), &par, *path, path_len);\n    assert(*path_len <= max_path_length);\n\n    // Clean up\n    delete [] pQueryT;\n    delete [] pTargetT;\n}\n\n// Convert a std::string into the stdaln required packed format.\n// This function allocates memory which the caller must free\nuint8_t* StdAlnTools::createPacked(const std::string& s, size_t start, size_t length)\n{\n    if(length == std::string::npos)\n        length = s.size();\n    assert(length <= s.size());\n\n    uint8_t* pBuffer = new uint8_t[length];\n    for(size_t j = 0; j < length; ++j)\n        pBuffer[j] = DNA_ALPHABET::getBaseRank(s[start + j]);\n    return pBuffer;\n}\n\n\n// Calculate the maximum target length for a query of length ql\nsize_t StdAlnTools::calculateMaxTargetLength(int ql, const GlobalAlnParams& params)\n{\n    size_t mt = ((ql + 1) / 2 * params.match + params.gap_ext) / params.gap_ext + ql;\n    return mt;\n}\n\n// Fill in the stdaln AlnParam data, using GlobalAlnParams\nvoid StdAlnTools::setAlnParam(AlnParam& par, int matrix[25], const GlobalAlnParams& params)\n{\n    par.matrix = matrix;\n\n    // Set matrix\n\tfor (size_t i = 0; i < 25; ++i) par.matrix[i] = -params.mismatch;\n\tfor (size_t i = 0; i < 4; ++i) par.matrix[i*5+i] = params.match; \n\tpar.gap_open = params.gap_open;\n    par.gap_ext = params.gap_ext;\n    par.gap_end = params.gap_ext;\n\tpar.row = 5; \n    par.band_width = params.bandwidth;\n}\n\n// Convert a path to a CIGAR string\nstd::string StdAlnTools::makeCigar(path_t* path, int path_len)\n{\n    int cigarLen = 0;\n\tuint32_t* pCigar = aln_path2cigar32(path, path_len, &cigarLen); \n    std::stringstream cigarSS;\n    for (int j = 0; j != cigarLen; ++j)\n    {\n        cigarSS << (pCigar[j]>>4);\n        cigarSS << \"MID\"[pCigar[j]&0xf];\n    }\n    free(pCigar);\n    return cigarSS.str();\n}\n\n// Make a pair of padded alignment strings from the pair of sequences\nvoid StdAlnTools::makePaddedStrings(const std::string& s1, const std::string& s2, \n                                    std::string& out1, std::string& out2)\n{\n    path_t* path;\n    int path_len = 0;\n    int score = 0;\n    createGlobalAlignmentPath(s1, s2, &path, &path_len, &score);\n    std::string outm;\n    makePaddedStringsFromPath(s1, s2, path, path_len, out1, out2, outm);\n    free(path);\n}\n\n// Convert a dynamic programming path to a set of padded strings\n// Algorithm ported from stdaln.c:aln_stdaln_aux\nvoid StdAlnTools::makePaddedStringsFromPath(const std::string& s1, const std::string& s2, path_t* path, int path_len, \n                                            std::string& out1, std::string& out2, std::string& outm)\n{\n    out1.resize(path_len, 'A');\n    out2.resize(path_len, 'A');\n    outm.resize(path_len, 'A');\n\n    path_t* p = path + path_len - 1;\n\n    for (int l = 0; p >= path; --p, ++l) \n    {\n        assert(l < (int)out1.size());\n        int idx_i = p->i - 1;\n        int idx_j = p->j - 1;\n\n        switch (p->ctype) \n        {\n            // p->i and p->j are indices into the DP matrix, which is\n            // the string coordinate - 1\n            case FROM_M:\n                out1[l] = s1[idx_i]; \n                out2[l] = s2[idx_j];\n                outm[l] = (s1[idx_i] == s2[idx_j] /*&& s1[p->i] != ap->row*/)? '|' : ' ';\n                break;\n            case FROM_I: \n                out1[l] = '-'; \n                out2[l] = s2[idx_j]; \n                outm[l] = ' '; \n                break;\n            case FROM_D: \n                out1[l] = s1[idx_i]; \n                out2[l] = '-'; \n                outm[l] = ' '; \n                break;\n        }\n    }    \n}\n\n// \nvoid StdAlnTools::printPaddedStrings(const std::string& s1, const std::string& s2, const std::string& m, int colSize)\n{\n    assert(s1.size() == s2.size() && s1.size() == m.size());\n    size_t len = s1.size();\n    for(size_t l = 0; l < len; l += colSize)\n    {\n        int diff = len - l;\n        int stop = diff < colSize ? diff : colSize;\n        printf(\"1\\t%s\\n\", s1.substr(l, stop).c_str());   \n        printf(\"2\\t%s\\n\", s2.substr(l, stop).c_str());   \n        printf(\"m\\t%s\\n\\n\", m.substr(l, stop).c_str());\n    }\n}\n"
  },
  {
    "path": "src/SGA/Util/StdAlnTools.h",
    "content": "///-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// StdAlnTools - Collection of wrappers around the\n// stdaln dynamic programming alignment functions\n#ifndef STDALNTOOLS_H\n#define STDALNTOOLS_H\n\n#include <string>\n#include <vector>\n#include <inttypes.h>\n#include <iostream>\n#include \"stdaln.h\"\n\n// Parameters object \nstruct GlobalAlnParams\n{\n    GlobalAlnParams() { setDefaults(); }\n\n    void setDefaults()\n    {\n        gap_open = 5;\n        gap_ext = 2;\n        mismatch = 3;\n        match = 1;\n        gap_open_extend = gap_open + gap_ext;\n        threshold = 30;\n        bandwidth = 50;\n    }\n\n    // PacBio specific parameters\n    void setPacBio()\n    {\n        setDefaults();\n\n        gap_open = 2;\n        gap_ext = 1;\n        mismatch = 5;\n        gap_open_extend = gap_open + gap_ext;\n    }\n\n    int gap_open;\n    int gap_ext;\n    int mismatch;\n    int match;\n    int gap_open_extend;\n    int threshold;\n    int bandwidth;\n};\n\nstruct LocalAlignmentResult\n{\n    // Indices of the start/end base in the aligning\n    // substrings. INCLUSIVE coordinates.\n    int64_t targetStartIndex;\n    int64_t targetEndIndex;\n    int64_t queryStartIndex;\n    int64_t queryEndIndex;\n    std::string cigar;\n    int score;\n\n    friend std::ostream& operator<<(std::ostream& out, const LocalAlignmentResult& a)\n    {\n        out << \"S:\" << a.score << \" [\" << a.targetStartIndex << \" \" << a.targetEndIndex << \"] C:\" << a.cigar;\n        return out;\n    }\n};\ntypedef std::vector<LocalAlignmentResult> LocalAlignmentResultVector;\n\nnamespace StdAlnTools\n{\n    // Perform a global alignment between target and query using stdaln\n    // If bPrint is true, the padded alignment is printed // to stdout.\n    // The alignment score is returned.\n    int globalAlignment(const std::string& target, const std::string& query, bool bPrint = false);\n\n    // Perform a global alignment between the two strings and return a CIGAR string\n    std::string globalAlignmentCigar(const std::string& target, const std::string& query);\n\n    // Perform global alignment and return the cigar and score as out parameters\n    void globalAlignment(const std::string& target, const std::string& query, std::string& cigar, int& score);\n\n    // Perform a local alignment\n    LocalAlignmentResult localAlignment(const std::string& target, const std::string& query);\n\n    // Expand a Cigar string so there is one symbol per code\n    std::string expandCigar(const std::string& cigar);\n    \n    // Compact an expanded cigar string\n    std::string compactCigar(const std::string& cigar);\n\n    // Convert a std::string into the stdAln required packed format.\n    // This function allocates memory which the caller must free.\n    uint8_t* createPacked(const std::string& s, size_t start = 0, size_t length = std::string::npos);\n\n    // Create a path array representing the global alignment between target and query\n    // Caller must free the path\n    void createGlobalAlignmentPath(const std::string& target, const std::string& query,\n                                            path_t** path, int* path_len, int* score);\n\n    // Calculate the maximum aligned target length possible for a query of length ql\n    // under the scoring scheme given by params\n    size_t calculateMaxTargetLength(int ql, const GlobalAlnParams& params);\n\n    // Fill in the stdaln AlnParam data, using GlobalAlnParams\n    void setAlnParam(AlnParam& par, int matrix[25], const GlobalAlnParams& params);\n\n    // Make a padded strings from a global alignment between the pair of sequences\n    void makePaddedStrings(const std::string& s1, const std::string& s2, \n                           std::string& out1, std::string& out2);\n\n    // Convert a stdaln path to a pair of padded strings representing the alignment\n    void makePaddedStringsFromPath(const std::string& s1, const std::string& s2, \n                                   path_t* path, int path_len,\n                                   std::string& out1, std::string& out2, std::string& outm);\n\n    // Returns a new copy of str with padding characters removed\n    std::string unpad(const std::string& str);\n    \n    // Make a cigar string from a path\n    std::string makeCigar(path_t* path, int path_len);\n\n    // Print the padded aligned strings\n    void printPaddedStrings(const std::string& s1, const std::string& s2, const std::string& m, int colSize = 120);\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Timer.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// Timer - Simple object to that prints the wallclock \n// length of its lifetime\n//\n#ifndef TIMER_H\n#define TIMER_H\n\n#include <string>\n#include <sys/time.h>\n\nclass Timer\n{\n    public:\n        Timer(std::string s, bool silent = false) : m_desc(s), m_silent(silent)\n        {\n            reset();\n        }\n\n        ~Timer() \n        {\n            if(!m_silent) \n                fprintf(stderr, \"[timer - %s] wall clock: %.2lfs CPU: %.2lfs\\n\", m_desc.c_str(), getElapsedWallTime(), getElapsedCPUTime()); \n        }\n\n        double getElapsedWallTime() const \n        { \n            timeval now;\n            gettimeofday(&now, NULL);\n            return (now.tv_sec - m_wallStart.tv_sec) + (double(now.tv_usec - m_wallStart.tv_usec) / 1000000);\n        }\n\n        double getElapsedCPUTime() const\n        {\n            double now = clock();\n            return (now - m_cpuStart) / CLOCKS_PER_SEC;\n        }\n\n        void reset() { gettimeofday(&m_wallStart, NULL); m_cpuStart = clock(); }\n\n    private:\n        std::string m_desc;\n        \n        // Track the wall-clock and CPU times\n        // CPU time includes all threads\n        timeval m_wallStart;\n        double m_cpuStart;\n\n        bool m_silent;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Util.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Util - Common data structures and functions\n//\n#include <iostream>\n#include <math.h>\n#include <map>\n#include \"Util.h\"\n\n//\n// Sequence operations\n//\n\n// Reverse complement a sequence\nstd::string reverseComplement(const std::string& seq)\n{\n    std::string out(seq.length(), 'A');\n    size_t last_pos = seq.length() - 1;\n    for(int i = last_pos; i >= 0; --i)\n    {\n        out[last_pos - i] = complement(seq[i]);\n    }\n    return out;\n}\n\n// Reverse complement a sequence using the full iupac alphabet\nstd::string reverseComplementIUPAC(const std::string& seq)\n{\n    std::string out(seq.length(), 'A');\n    size_t last_pos = seq.length() - 1;\n    for(int i = last_pos; i >= 0; --i)\n    {\n        out[last_pos - i] = complementIUPAC(seq[i]);\n    }\n    return out;\n}\n\n// Reverse a sequence\nstd::string reverse(const std::string& seq)\n{\n    return std::string(seq.rbegin(), seq.rend());\n}\n\n// Complement a sequence\nstd::string complement(const std::string& seq)\n{\n    std::string out(seq.length(), 'A');\n    size_t l = seq.length();\n    for(size_t i = 0; i < l; ++i)\n        out[i] = complement(seq[i]);\n    return out;\n}\n\n// Complement a sequence over the IUPAC alphabet\nstd::string complementIUPAC(const std::string& seq)\n{\n    std::string out(seq.length(), 'A');\n    size_t l = seq.length();\n    for(size_t i = 0; i < l; ++i)\n        out[i] = complementIUPAC(seq[i]);\n    return out;\n}\n\n// \nstd::string prefix(const std::string& seq, const unsigned int len)\n{\n    assert(seq.length() >= len);\n    return seq.substr(0, len);\n}\n\n// \nstd::string suffix(const std::string& seq, const unsigned int len)\n{\n    assert(seq.length() >= len);\n    return seq.substr(seq.length() - len);\n}\n\n//\n// Dust scoring scheme as given by:\n// Morgulis A. \"A fast and symmetric DUST implementation to Mask\n// Low-Complexity DNA Sequences\". J Comp Bio.\ndouble calculateDustScore(const std::string& seq)\n{\n    std::map<std::string, int> scoreMap;\n    \n    // Cannot calculate dust scores on very short reads\n    if(seq.size() < 3)\n        return 0.0f;\n\n    // Slide a 3-mer window over the sequence and insert the sequences into the map\n    for(size_t i = 0; i < seq.size() - 3; ++i)\n    {\n        std::string triMer = seq.substr(i, 3);\n        scoreMap[triMer]++;\n    }\n\n    // Calculate the score by summing the square of every element in the map\n    double sum = 0;\n    std::map<std::string, int>::iterator iter = scoreMap.begin();\n    for(; iter != scoreMap.end(); ++iter)\n    {\n        int tc = iter->second;\n        double score = (double)(tc * (tc - 1)) / 2.0f;\n        sum += score;\n    }\n    return sum / (seq.size() - 2);\n}\n\n// Returns the window over seq with the highest dust score\ndouble maxDustWindow(const std::string& seq, size_t windowSize, size_t minWindow)\n{\n    double maxScore = 0.0f;\n    for(size_t i = 0; i < seq.size(); i += 1)\n    {\n        size_t r = seq.size() - i;\n        size_t w = r < windowSize ? r : windowSize;\n        if(w >= minWindow) // don't calculate score for small windows\n        {\n            double s = calculateDustScore(seq.substr(i, w));\n            if(s > maxScore)\n                maxScore = s;\n        }\n    }\n    return maxScore;\n}\n\n// count the differences between s1 and s2 over the first n bases\nint countDifferences(const std::string& s1, const std::string& s2, size_t n)\n{\n    int numDiff = 0;\n    for(size_t i = 0; i < n; ++i)\n    {\n        if(s1[i] != s2[i])\n            numDiff++;\n    }\n    return numDiff;\n}\n\n// count the differences between s1 and s2 over the first n bases\nstd::string getDiffString(const std::string& s1, const std::string& s2)\n{\n    std::string out;\n    size_t stop = std::min(s1.size(), s2.size());\n    for(size_t i = 0; i < stop; ++i)\n        out.push_back(s1[i] == s2[i] ? '.' : s1[i]);\n    return out;\n}\n\n// \nchar randomBase()\n{\n    int i = rand() % 4;\n    switch(i)\n    {\n        case 0:\n            return 'A';\n        case 1:\n            return 'C';\n        case 2:\n            return 'G';\n        case 3:\n            return 'T';\n        default:\n            assert(false);\n    }\n    return 'A';        \n}\n\n// Strip the leading directories and\n// the last trailling suffix from a filename\nstd::string stripFilename(const std::string& filename)\n{\n    std::string out = stripDirectories(filename);\n    // Remove the gzip extension if necessary\n    if(isGzip(out))\n        out = stripExtension(out);\n    return stripExtension(out);\n}\n\n// Remove a single file extension from the filename\nstd::string stripExtension(const std::string& filename)\n{\n    size_t suffixPos = filename.find_last_of('.');\n    if(suffixPos == std::string::npos)\n        return filename; // no suffix\n    else\n        return filename.substr(0, suffixPos);\n}\n\n// Remove an extension from a filename, including the .gz extension\n// file.fastq will return file\n// file.fastq.gz will return file\nstd::string stripGzippedExtension(const std::string& filename)\n{\n    if(isGzip(filename))\n        return stripExtension(stripExtension(filename));\n    else\n        return stripExtension(filename);\n}\n\n\n// Strip the leadering directories from a filename\nstd::string stripDirectories(const std::string& filename)\n{\n    size_t lastDirPos = filename.find_last_of('/');\n    \n    if(lastDirPos == std::string::npos)\n        return filename; // no directories\n    else\n        return filename.substr(lastDirPos + 1);\n}\n\n// Return the file extension\nstd::string getFileExtension(const std::string& filename)\n{\n    size_t suffixPos = filename.find_last_of('.');\n    \n    if(suffixPos == std::string::npos)\n        return \"\";\n    else\n        return filename.substr(suffixPos + 1);\n}\n\n// Write out a fasta record\nvoid writeFastaRecord(std::ostream* pWriter, const std::string& id, const std::string& seq, size_t maxLineLength)\n{\n    *pWriter << \">\" << id << \" \" << seq.length() << \"\\n\";\n    for(size_t i = 0; i < seq.size(); i += maxLineLength)\n    {\n        size_t span = std::min(seq.size() - i, maxLineLength);\n        *pWriter << seq.substr(i, span) << \"\\n\";\n    }\n}\n\n// Returns true if the filename has an extension indicating it is compressed\nbool isGzip(const std::string& filename)\n{\n    size_t suffix_length = sizeof(GZIP_EXT) - 1;\n\n    // Assume files without an extension are not compressed\n    if(filename.length() < suffix_length)\n        return false;\n\n    std::string extension = suffix(filename, suffix_length);\n    return extension == GZIP_EXT;\n}\n\n// Returns true if the filename has an extension indicating it is fastq\nbool isFastq(const std::string& filename)\n{\n    return filename.find(\".fastq\") != std::string::npos || filename.find(\".fq\") != std::string::npos;\n}\n\n\n// Returns the size of the file. Code from stackoverflow.\nstd::ifstream::pos_type getFilesize(const std::string& filename)\n{\n    std::ifstream in(filename.c_str(), std::ifstream::in | std::ifstream::binary);\n    in.seekg(0, std::ifstream::end);\n    return in.tellg();\n}\n\n// Open a file that may or may not be gzipped for reading\n// The caller is responsible for freeing the handle\nstd::istream* createReader(const std::string& filename, std::ios_base::openmode mode)\n{\n    if(isGzip(filename))\n    {\n        igzstream* pGZ = new igzstream(filename.c_str(), mode);\n        assertGZOpen(*pGZ, filename);\n        return pGZ;\n    }\n    else\n    {\n        std::ifstream* pReader = new std::ifstream(filename.c_str(), mode);\n        assertFileOpen(*pReader, filename);\n        return pReader;\n    }\n}\n\n// Open a file that may or may not be gzipped for writing\n// The caller is responsible for freeing the handle\nstd::ostream* createWriter(const std::string& filename,\n                           std::ios_base::openmode mode)\n{\n    if(isGzip(filename))\n    {\n        ogzstream* pGZ = new ogzstream(filename.c_str(), mode);\n        assertGZOpen(*pGZ, filename);\n        return pGZ;\n    }\n    else\n    {\n        std::ofstream* pWriter = new std::ofstream(filename.c_str(), mode);\n        assertFileOpen(*pWriter, filename);\n        return pWriter;\n    }\n}\n\n// Ensure a filehandle is open\nvoid assertFileOpen(std::ifstream& fh, const std::string& fn)\n{\n    if(!fh.is_open())\n    {\n        std::cerr << \"Error: could not open \" << fn << \" for read\\n\";\n        exit(EXIT_FAILURE);\n    }    \n}\n\n// Ensure a filehandle is open\nvoid assertFileOpen(std::ofstream& fh, const std::string& fn)\n{\n    if(!fh.is_open())\n    {\n        std::cerr << \"Error: could not open \" << fn << \" for write\\n\";\n        exit(EXIT_FAILURE);\n    }    \n}\n\n//\nvoid assertGZOpen(gzstreambase& gh, const std::string& fn)\n{\n    if(!gh.good())\n    {\n        std::cerr << \"Error: could not open \" << fn << std::endl;\n        exit(EXIT_FAILURE);\n    }\n}\n\n// Split a string into parts based on the delimiter\nStringVector split(std::string in, char delimiter)\n{\n    StringVector out;\n    size_t lastPos = 0;\n    size_t pos = in.find_first_of(delimiter);\n\n    while(pos != std::string::npos)\n    {\n        out.push_back(in.substr(lastPos, pos - lastPos));\n        lastPos = pos + 1;\n        pos = in.find_first_of(delimiter, lastPos);\n    }\n    out.push_back(in.substr(lastPos));\n    return out;\n}\n\n// Split a key-value pair\nvoid splitKeyValue(std::string in, std::string& key, std::string& value)\n{\n    StringVector parts = split(in, CAF_SEP);\n    if(parts.size() != 2)\n    {\n        std::cerr << \"Invalid key-value pair \" << in << std::endl;\n        assert(false);\n    }\n\n    key = parts[0];\n    value = parts[1];\n\n    assert(key.size() > 0 && value.size() > 0 && \"Invalid key-value pair\");\n}\n\n// Get the shared component of a read pair name\n// This is the part of the name preceding the \"/\"\nstd::string getPairBasename(const std::string& id)\n{\n    assert(!id.empty());\n\n    size_t pos = id.find_last_of('/');\n    if(pos == std::string::npos)\n        return id;\n    else\n        return id.substr(0, pos);\n}\n\n// Get the ID of the pair of a given read\nstd::string getPairID(const std::string& id)\n{\n    assert(!id.empty());\n    std::string pid(id);\n\n    size_t li = id.length() - 1;\n    char last = id[li];\n\n    if(last == 'A')\n        pid[li] = 'B';\n    else if(last == 'B')\n        pid[li] = 'A';\n    else if(last == '1')\n        pid[li] = '2';\n    else if(last == '2')\n        pid[li] = '1';\n    else if(last == 'f')\n        pid[li] = 'r';\n    else if(last == 'r')\n        pid[li] = 'f';\n    else\n        pid = \"\";\n    return pid;\n}\n\n// Return 0 if the id indicates the first read of a pair, 1 otherwise\nint getPairIndex(const std::string& id)\n{\n    size_t li = id.length() - 1;\n    char last = id[li];\n    if(last == 'A' || last == '1' || last == 'f')\n        return 0;\n    else if(last == 'B' || last == '2' || last == 'r')\n        return 1;\n    else\n    {\n        std::cerr << \"Unrecognized pair format: \" << id << \"\\n\";\n        exit(EXIT_FAILURE);\n    }\n}\n\n// Debug function to parse the distance between two reads\n// based on their names\n// This assumes is that the read names are just the positions the reads\n// were sampled from\nsize_t debug_getReadDistFromNames(const std::string& name1, const std::string& name2)\n{\n    std::string id;\n    std::string pos;\n    StringVector parts = split(name1, ':');\n    if(parts.size() != 2)\n        return 0;\n\n    int p1 = atoi(parts[1].c_str());\n    \n    parts = split(name2, ':');\n    if(parts.size() != 2)\n        return 0;\n\n    int p2 = atoi(parts[1].c_str());\n    int dist = int(abs(p1 - p2));\n    return dist;\n}\n\n"
  },
  {
    "path": "src/SGA/Util/Util.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// Util - Common data structures and functions\n//\n#ifndef UTIL_H\n#define UTIL_H\n\n#include <vector>\n#include <list>\n#include <string>\n#include <istream>\n#include <fstream>\n#include <cassert>\n#include <sstream>\n#include <cstring>\n#include <cstdlib>\n#include <stdint.h>\n#include <iostream>\n#include \"DNAString.h\"\n#include \"gzstream.h\"\n#include \"Quality.h\"\n\n#define CAF_SEP ':'\n#define FUNCTION_TIMER Timer functionTimer(__PRETTY_FUNCTION__);\n#define VALIDATION_WARNING(x) static bool validation_warn = true; if(validation_warn) \\\n                               printf(\"[%s] Warning validation is on\\n\", (x)); validation_warn = false;\n\n#define WARN_ONCE(x) static bool _warn_once = true; if(_warn_once) \\\n                     printf(\"WARNING: [%s]\\n\", (x)); _warn_once = false;\n\n#define GZIP_EXT \".gz\"\n\n//\n// Typedef\n//\ntypedef std::string Sequence;\ntypedef std::string ContigID;\ntypedef std::vector<int> IntVec;\ntypedef std::vector<double> DoubleVec;\ntypedef std::vector<std::string> StringVector;\ntypedef std::list<std::string> StringList;\ntypedef std::vector<Sequence> SequenceVector;\n\n// SeqItem is just an id, sequence pair\nstruct SeqItem\n{\n    // data\n    std::string id;\n    DNAString seq;\n\n    void write(std::ostream& out, const std::string& meta = \"\") const\n    {\n        out << \">\" << id << (meta.empty() ? \"\" : \" \") << meta << \"\\n\";\n        out << seq.toString() << \"\\n\";\n    }    \n};\ntypedef std::vector<SeqItem> SeqItemVector;\n\n// SeqRecord is a id,sequence pair with an associated quality value\nstruct SeqRecord\n{\n    SeqItem toSeqItem() const\n    {\n        SeqItem r;\n        r.id = id;\n        r.seq = seq;\n        return r;\n    }\n\n    // Write the sequence to the file handle. If the \n    void write(std::ostream& out, const std::string& meta = \"\") const\n    {\n        // If there is a quality string write the record as fastq, otherwise fasta\n        if(!qual.empty())\n        {\n            out << \"@\" << id << (meta.empty() ? \"\" : \" \") << meta << \"\\n\";\n            out << seq.toString() << \"\\n\";\n            out << \"+\" << \"\\n\";\n            out << qual << \"\\n\";\n        }\n        else\n        {\n            toSeqItem().write(out, meta);\n        }\n    }\n\n    bool hasQuality() const\n    {\n        return !qual.empty();\n    }\n\n    // Get the phred score for base i. If there are no quality string, returns DEFAULT_QUAL_SCORE\n    int getPhredScore(size_t i) const\n    {\n        if(!qual.empty())\n        {\n            assert(i < qual.size());\n            return Quality::char2phred(qual[i]);\n        }\n        else\n        {\n            return DEFAULT_QUAL_SCORE;\n        }\n    }\n\n    // data\n    std::string id;\n    DNAString seq;\n    std::string qual;\n};\ntypedef std::vector<SeqRecord> SeqRecordVector;\n\n//\n// Functions\n//\nstd::string stripFilename(const std::string& filename);\nstd::string stripExtension(const std::string& filename);\nstd::string stripGzippedExtension(const std::string& filename);\nstd::string stripDirectories(const std::string& filename);\nstd::string getFileExtension(const std::string& filename);\nbool isGzip(const std::string& filename);\nbool isFastq(const std::string& filename);\nstd::ifstream::pos_type getFilesize(const std::string& filename);\n\n// Write out a fasta record\nvoid writeFastaRecord(std::ostream* pWriter, const std::string& id, const std::string& seq, size_t maxLength = 80);\n\n// Wrapper function for opening a reader of compressed or uncompressed file\nstd::istream* createReader(const std::string& filename, std::ios_base::openmode mode = std::ios_base::in);\nstd::ostream* createWriter(const std::string& filename, \n                           std::ios_base::openmode mode = std::ios_base::out);\n\nvoid assertFileOpen(std::ifstream& fh, const std::string& fn);\nvoid assertFileOpen(std::ofstream& fh, const std::string& fn);\nvoid assertGZOpen(gzstreambase& gh, const std::string& fn);\n\nchar randomBase();\n\n// Key-value operations\ntemplate <class C>\nstd::string makeKeyValue(std::string key, C value)\n{\n    std::stringstream ss;\n    ss << key << CAF_SEP << value;\n    return ss.str();\n}\n\nStringVector split(std::string in, char delimiter);\nvoid splitKeyValue(std::string in, std::string& key, std::string& value);\n\nstd::string getPairBasename(const std::string& id);\nstd::string getPairID(const std::string& id);\n\n// Returns 0 if the id indicates the first read in a pair, 1 otherwise\nint getPairIndex(const std::string& id);\n\n// Debug function to get the distance between two reads based on their names, which \n// encodes the positions\nsize_t debug_getReadDistFromNames(const std::string& name1, const std::string& name2);\n\n//\n// Return the lexographic value for the given base\n//\nstatic const uint8_t s_lexoRankLUT[256] = {\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,1,0,2,0,0,0,3,0,0,0,0,0,0,0,0,\n    0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n};\n\ninline static uint8_t getBaseRank(char b)\n{\n    return s_lexoRankLUT[static_cast<uint8_t>(b)];\n}\n\n//\n// Sequence operations\n//\nstd::string reverseComplement(const std::string& seq);\nstd::string complement(const std::string& seq);\nstd::string reverse(const std::string& seq);\n\n// Reverse/complement functions, allowing a full IUPAC alphabet\nstd::string reverseComplementIUPAC(const std::string& seq);\nstd::string complementIUPAC(const std::string& seq);\n\n// Return the prefix/suffix of seq of length len \nstd::string prefix(const std::string& seq, const unsigned int len);\nstd::string suffix(const std::string& seq, const unsigned int len);\n\n// Calculate the dust score for the given sequence\ndouble maxDustWindow(const std::string& seq, size_t windowSize = 64, size_t minWindow = 64);\ndouble calculateDustScore(const std::string& seq);\n\n// Count the number of differences between s1 and s2 over the first n chars\nint countDifferences(const std::string& s1, const std::string& s2, size_t n);\n\n// Construct a string encoding the differences between s1 and s2\nstd::string getDiffString(const std::string& s1, const std::string& s2);\n\n// Complement a base\ninline char complement(char base)\n{\n    switch(base)\n    {\n        case 'A':\n            return 'T';\n        case 'C':\n            return 'G';\n        case 'G':\n            return 'C';\n        case 'T':\n            return 'A';\n        case 'N':\n            return 'N';\n        default:\n            assert(false && \"Unknown base!\");\n            return 'N';\n    }\n}\n\n// Complement a base using the full IUPAC alphabet\n// Also allows for lowercase bases\ninline char complementIUPAC(char c)\n{\n    char cmp = '\\0';\n    bool is_lc = std::islower(c);\n\n    switch(std::toupper(c)) {\n        case 'A': cmp = 'T'; break;\n        case 'C': cmp = 'G'; break;\n        case 'G': cmp = 'C'; break;\n        case 'T': cmp = 'A'; break;\n        case 'M': cmp = 'K'; break;\n        case 'R': cmp = 'Y'; break;\n        case 'W': cmp = 'W'; break;\n        case 'S': cmp = 'S'; break;\n        case 'Y': cmp = 'R'; break;\n        case 'K': cmp = 'M'; break;\n        case 'V': cmp = 'B'; break;\n        case 'H': cmp = 'D'; break;\n        case 'D': cmp = 'H'; break;\n        case 'B': cmp = 'V'; break;\n        case 'N': cmp = 'N'; break;\n        default:\n            assert(false);\n    }\n\n    if(is_lc)\n        cmp = std::tolower(cmp);\n    return cmp;\n}\n\n// Wrapper function to determine whether a calculated error rate is within tolerance of a\n// threshold. A fixed tolerance is used as this does not need to be super precise, it only\n// needs to account for small differences in fp calculations\ninline bool isErrorRateAcceptable(double er, double threshold)\n{\n    static double tolerance = 0.000001f;\n    if(er - tolerance <= threshold)\n        return true;\n    else\n        return false;\n}\n\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/VCFUtil.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// VCFUtil - collection of utility functions\n// for producing VCF records.\n//\n#include <iostream>\n#include <stdlib.h>\n#include <iterator>\n#include <sstream>\n#include \"VCFUtil.h\"\n#include \"StdAlnTools.h\"\n#include \"MultiAlignment.h\"\n\n// \n// VCFRecord\n//\nVCFRecord::VCFRecord()\n{\n    passStr = \"PASS\";\n    quality = 20.0f;\n}\n\n// parse from a line\nVCFRecord::VCFRecord(const std::string& line)\n{\n    std::stringstream parser(line);\n\n    parser >> refName;\n    parser >> refPosition;\n    parser >> id;\n    parser >> refStr;\n    parser >> varStr;\n\n    // Non-conformant VCF might represent unknown qualities with '.'\n    std::string quality_str;\n    parser >> quality_str;\n    if(quality_str == \".\")\n    {\n        quality = 255;\n    }\n    else\n    {\n        std::stringstream qparser(quality_str);\n        qparser >> quality;\n    }\n\n    parser >> passStr;\n    \n    std::string tmp;\n    parser >> tmp;\n\n    // Split the comments on the semicolon delimiter\n    comments = split(tmp, ';');\n    \n    parser >> formatStr;\n    if(!formatStr.empty())\n    {\n        // parse genotypes\n        while(parser >> tmp)\n            sampleStr.push_back(tmp);\n    }\n}\n\nvoid VCFRecord::addComment(const std::string& key, const std::string& value)\n{\n    std::string out = key;\n    out.append(1, '=');\n    out.append(value);\n    comments.push_back(out);\n}\n\nvoid VCFRecord::addComment(const std::string& key, const int& value)\n{\n    std::stringstream v_str;\n    v_str << value;\n    addComment(key, v_str.str());\n}\n\nvoid VCFRecord::addComment(const std::string& key, const double& value)\n{\n    std::stringstream v_str;\n    v_str.precision(5);\n    v_str.setf(std::ios::fixed,std::ios::floatfield);\n    v_str << value;\n    addComment(key, v_str.str());\n}\n\n\nvoid VCFRecord::setPassStr(const std::string str)\n{\n    passStr = str;\n}\n\nvoid VCFRecord::setQuality(const double q)\n{\n    quality = q;\n}\n\nvoid VCFRecord::printVerbose() const\n{\n    std::cout << \"RefName: \" << refName << \"\\n\";\n    std::cout << \"Position: \" << refPosition << \"\\n\";\n    std::cout << \"RefStr: \" << refStr << \"\\n\";\n    std::cout << \"VarStr: \" << varStr << \"\\n\";\n}\n\n// Write the VCF record to the stream\nstd::ostream& operator<<(std::ostream& o, const VCFRecord& record)\n{\n    o.precision(5);\n    o.setf(std::ios::fixed,std::ios::floatfield);\n\n    o << record.refName << \"\\t\";\n    o << record.refPosition << \"\\t\",\n    o << (record.id.empty() ? \".\" : record.id) << \"\\t\";\n    o << record.refStr << \"\\t\";\n    o << record.varStr << \"\\t\";\n    o << (int)record.quality << \"\\t\";\n    o << record.passStr << \"\\t\";\n\n    for(size_t i = 0; i < record.comments.size(); ++i)\n    {\n        if(i > 0)\n            o << \";\";\n        o << record.comments[i];\n    }\n\n    if(record.sampleStr.size())\n    {\n        o << \"\\t\" << record.formatStr;\n        for(size_t i = 0; i < record.sampleStr.size(); ++i)\n            o << \"\\t\" << record.sampleStr[i];\n    }\n\n    return o;\n}\n\n\n//\nVCFClassification VCFRecord::classify() const\n{\n    if(refStr.size() == varStr.size())\n        return VCF_SUB;\n    \n    if(refStr.size() > varStr.size())\n    {\n        // If a deletion, varStr should be a prefix of refStr\n        if(refStr.find(varStr) == 0)\n            return VCF_DEL;\n        else\n            return VCF_COMPLEX;\n    }\n\n    if(refStr.size() < varStr.size())\n    {\n        // If an insertion, refStr should be a prefix of refStr\n        if(varStr.find(refStr) == 0)\n            return VCF_INS;\n        else\n            return VCF_COMPLEX;\n    }\n    return VCF_COMPLEX;\n}\n\n//\n// VCFUtil\n//\n\n// See header for description\nVCFReturnCode VCFUtil::generateVCFFromCancerVariant(const std::string& ref,\n                                                    const std::string& base,\n                                                    const std::string& variant,\n                                                    const std::string& refName,\n                                                    size_t refPosition,\n                                                    const std::string& varName,\n                                                    int minExactMatch,\n                                                    double dustThreshold,\n                                                    int verbose,\n                                                    VCFVector& outRecords)\n{\n    VCFVector tempRecords;\n\n    // Construct a multiple alignment from pairwise alignments\n    // of the base and variant strings to the reference\n\n    // We start by constructing a global alignment between the sequences\n    // and representing the alignment as a Cigar string\n    std::string cigarRefBase = StdAlnTools::globalAlignmentCigar(base, ref);\n    std::string cigarRefVariant = StdAlnTools::globalAlignmentCigar(variant, ref);\n    \n    // Initialize the multiple alignment data\n    \n    MAlignData baseMA;\n    baseMA.position = 0;\n    baseMA.str = base;\n    baseMA.expandedCigar = StdAlnTools::expandCigar(cigarRefBase);\n    baseMA.name = \"base\";\n\n    MAlignData varMA;\n    varMA.position = 0;\n    varMA.str = variant;\n    varMA.expandedCigar = StdAlnTools::expandCigar(cigarRefVariant);\n    varMA.name = \"variant\";\n\n    MAlignDataVector maVector;\n    maVector.push_back(baseMA);\n    maVector.push_back(varMA);\n    \n    MultiAlignment ma(ref, maVector);\n\n    /*\n    std::cout << \"\\nMultipleAlignment:\\n\";\n    ma.print();\n    */\n\n    // Get the row index of the variant and base strings\n    size_t baseRow = ma.getIdxByName(\"base\");\n    size_t varRow = ma.getIdxByName(\"variant\");\n    size_t refRow = ma.getRootIdx();\n\n    size_t numCols = ma.getNumColumns();\n\n    // Iterate over every column of the multiple alignment and detect variants\n    int leftExactMatch = 0;\n    int rightExactMatch = 0;\n\n    int eventStart = -1;\n    int eventEnd = -1;\n    bool isIndel = false;\n\n    bool inLeftExact = true;\n\n    for(size_t i = 0; i < numCols; ++i)\n    {\n        char baseSymbol = ma.getSymbol(baseRow, i);\n        char varSymbol = ma.getSymbol(varRow, i);\n        bool isVariant = (varSymbol != baseSymbol);\n\n        // Update the counter of the number of exact matches for the leftmost and rightmost bases\n        if(isVariant)\n        {\n            inLeftExact = false; // stop the count of leftmost exact matches\n            rightExactMatch  = 0; // reset the rightmost count\n        }\n        else // this is a good match\n        {\n            rightExactMatch += 1;\n            if(inLeftExact)\n                leftExactMatch += 1;\n        }\n        \n        // Process variants indicated by this portion of the alignment\n        if(isVariant)\n        {\n            if(eventStart == -1)\n            {\n                // Not currently in a variant event, start a new one\n                eventStart = i;\n                eventEnd = i;\n            }\n            else\n            {\n                // Extend the event\n                assert(eventEnd != -1);\n                eventEnd += 1;\n            }\n\n            isIndel = isIndel || varSymbol == '-' || baseSymbol == '-';\n        }\n        else\n        {\n            // Check if this is the end of a variant\n            if(eventStart != -1)\n            {\n                if(verbose > 0)\n                {\n                    std::cout << \"\\n\\nProcessing variant\\n\";\n                    ma.print();\n                }\n\n                // Extract the substrings of the three sequences describing\n                // this event.\n                // If the event is an indel, we move the start point\n                // of the event backwards until all 3 columns are not padding characters.\n                // This is to avoid the following situation:\n                // AATATTT--CGT ref\n                // AATATTTT-CGT base\n                // AATATTTTTCGT var\n                // or \n                // TTAGGTTTTTTT ref \n                // TTAGG-TTTTTT base \n                // TTAGG--TTTTT var\n                //\n                // In the first case, it is a 1 base insertion wrt base but a 2 base insertion wrt to the ref.\n                // So we need to move the event to the first column with all Ts to properly capture what is happening.\n                // In the second case it is a 1 base deletion wrt base and a 2 base deletion wrt to the ref. \n                // Again, we need to move back to the last full column.\n                if(isIndel)\n                {\n                    // It is impossible to extract a reference string if the indel is at the beginning\n                    // or end of th multiple alignment so we just fail out here\n                    if(eventStart == 0 || eventEnd == (int)numCols - 1)\n                        return VCF_INVALID_MULTIALIGNMENT;\n                    \n                    while(eventStart >= 0)\n                    {\n                        char rc = ma.getSymbol(refRow, eventStart);\n                        char bc = ma.getSymbol(baseRow, eventStart);\n                        char vc = ma.getSymbol(varRow, eventStart);\n                        if(rc == '-' || bc == '-' || vc == '-')\n                            eventStart -= 1;\n                        else\n                            break;\n                    }\n                    assert(eventStart >= 0);\n                }\n\n                size_t eventLength = eventEnd - eventStart + 1;\n                std::string refString = StdAlnTools::unpad(ma.getPaddedSubstr(refRow, eventStart, eventLength));\n                std::string baseString = StdAlnTools::unpad(ma.getPaddedSubstr(baseRow, eventStart, eventLength));\n                std::string varString = StdAlnTools::unpad(ma.getPaddedSubstr(varRow, eventStart, eventLength));\n\n                if(verbose > 0)\n                {\n                    printf(\"Ref start: %d col: %d eventStart: %d eventEnd: %d\\n\", (int)refPosition, (int)i, eventStart, eventEnd);\n                    std::cout << \"RefString \" << refString << \"\\n\";\n                    std::cout << \"baseString \" << baseString << \"\\n\";\n                    std::cout << \"varString \" << varString << \"\\n\";\n                }\n                assert(!refString.empty());\n                //assert(!baseString.empty());\n                assert(!varString.empty());\n                if(baseString.empty())\n                    std::cerr << \"Warning: Empty base string\\n\";\n\n                // Get the base position in the reference string. This is not necessarily the \n                // same as the eventStart column as the reference may be padded\n                int refBaseOffset = ma.getBaseIdx(refRow, eventStart);\n                \n                // Generate VCF Record\n                VCFRecord record;\n                record.refName = refName;\n                record.refPosition = refPosition + refBaseOffset + 1; // VCF uses 1-based coordinates\n\n                record.refStr = refString;\n                record.varStr = varString;\n\n                // Add a comment with the variant name\n                record.addComment(\"id\", varName);\n\n                // If the base string is not the same as the reference string, not it in the comment\n                // This can happen when a het SNP is mutated or we have some other weird site\n                if(refString != baseString)\n                    record.addComment(\"NS\", baseString);\n\n                // Check if the reference context is a homopolymer\n                int preHP = ma.countHomopolymer(refRow, eventStart, 0);\n                int sufHP = ma.countHomopolymer(refRow, eventEnd);\n                int maxHP = std::max(preHP, sufHP);\n                if(maxHP >= HOMOPOLYMER_ANNOTATE_THRESHOLD)\n                {\n                    std::stringstream hps;\n                    hps << maxHP;\n                    record.addComment(\"HP\", hps.str());\n                }\n\n                // Calculate the highest dust score on the reference sequence\n                // using 64-base windows. \n                double globalDustScore = maxDustWindow(ref);\n                if(globalDustScore > dustThreshold)\n                {\n                    std::stringstream dts;\n                    dts.precision(2);\n                    dts << globalDustScore;\n                    record.addComment(\"DT\", dts.str());\n                }\n\n                if(verbose > 0)\n                    std::cout << record << \"\\n\";\n\n                tempRecords.push_back(record);\n\n                // Reset state\n                eventStart = -1;\n                eventEnd = -1;\n                isIndel = false;\n            }\n        }\n    }\n\n    // Perform the start/end exact match sanity check\n    if(leftExactMatch >= minExactMatch && rightExactMatch >= minExactMatch)\n    {\n        outRecords.insert(outRecords.end(), tempRecords.begin(), tempRecords.end());\n        return VCF_OK;\n    }\n    else\n    {\n        return VCF_EXACT_MATCH_FAILED;\n    }\n}\n\n// Write a VCF header to the given file handle\nvoid VCFUtil::writeHeader(std::ostream* pWriter, const std::string& program, const std::string& inputBAM, const std::string& reference)\n{\n    // Get and format the current date\n    time_t rawtime;\n    struct tm * timeinfo;\n    static int MAX_DATE_CHARS = 80;\n    char dateBuffer [MAX_DATE_CHARS];\n    time ( &rawtime );\n    timeinfo = localtime ( &rawtime );\n    int copied = strftime(dateBuffer,MAX_DATE_CHARS,\"%Y%m%d\",timeinfo);\n    assert(copied < MAX_DATE_CHARS);\n\n    *pWriter << \"##fileformat=VCFv4.0\\n\";\n    *pWriter << \"##fileDate=\" << dateBuffer << \"\\n\";\n    *pWriter << \"##command=\" << program << \"\\n\";\n    *pWriter << \"##inputBAM=\" <<  inputBAM << \"\\n\";\n    *pWriter << \"##reference=\" << reference << \"\\n\";\n    *pWriter << \"#CHROM\\tPOS\\tID\\tREF\\tALT\\tQUAL\\tFILTER\\tINFO\\n\";\n}\n"
  },
  {
    "path": "src/SGA/Util/VCFUtil.h",
    "content": "//-----------------------------------------------\n// Copyright 2011 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// VCFUtil - collection of utility functions\n// for producing VCF records.\n//\n#ifndef VCFUTIL_H\n#define VCFUTIL_H\n\n#include <string>\n#include <vector>\n\n// Enums\nenum VCFClassification\n{\n    VCF_SUB,\n    VCF_DEL,\n    VCF_INS,\n    VCF_COMPLEX,\n    VCF_NUM_CLASSIFICATIONS\n};\n\n// \nenum VCFReturnCode\n{\n    VCF_EXACT_MATCH_FAILED, // failed the flanking-base match test\n    VCF_MAP_QUALITY_FAILED, // mapping quality check failed\n    VCF_BASE_MULTIMAP_FAILED, // mapping quality check failed\n    VCF_BASE_PARTIALMAP_FAILED, // the base sequence did not fully align to the reference\n    VCF_INVALID_MULTIALIGNMENT, // failed because the multiple alignment was not valid\n    VCF_OK, // VCF generation succeeded\n    VCF_NUM_RETURN_CODES\n};\n\n// Structs \nstruct VCFRecord\n{\n    // functions\n\n    // initialize an empty record\n    VCFRecord();\n\n    // parse a record from a tab-delimited string\n    VCFRecord(const std::string& line);\n\n    void addComment(const std::string& key, const std::string& value);\n    void addComment(const std::string& key, const int& value);\n    void addComment(const std::string& key, const double& value);\n\n    void setPassStr(const std::string str);\n    void setQuality(const double q);\n\n    void printVerbose() const;\n    VCFClassification classify() const;\n    friend std::ostream& operator<<(std::ostream& o, const VCFRecord& record);\n\n    static bool sort(const VCFRecord& a, const VCFRecord& b) \n    { \n        if(a.refName != b.refName)\n            return a.refName < b.refName;\n        else\n            return a.refPosition < b.refPosition;\n    }\n\n    bool isMultiAllelic() const { return varStr.find(\",\") != std::string::npos; }\n\n    // data\n    std::string refName;\n    size_t refPosition;\n    std::string id;\n    std::string refStr;\n    std::string varStr;\n    double quality;\n    std::string passStr;\n    std::string formatStr;\n    std::vector<std::string> comments;\n    std::vector<std::string> sampleStr;\n};\n\n// Typedefs\ntypedef std::vector<VCFRecord> VCFVector;\ntypedef std::vector<std::string> StringVector;\n\n// A set of VCF records, with sample names in a predefined order\nstruct VCFCollection\n{\n    StringVector samples;\n    VCFVector records;\n};\n\nnamespace VCFUtil\n{\n    // Generate a VCF record from a cancer mutation\n    // Base is the sequence in the individuals normal genome\n    // Variant is the mutated copy of base\n    // Ref is the sequence of the reference that base represents.\n    // Ref will typically be very close to base, but may have some\n    // differences due to SNPs or indels, which we do not want\n    // to call as variants.\n    // The minExactMatch parameter constrains base and variant to have\n    // at least a perfect alignment of minExactMatch at the start \n    // and end of the sequences. This is used as a sanity check for the alignments\n    // If the variants were produced by graph-diff, base and variant\n    // should share exactly k bases at the ends.\n    VCFReturnCode generateVCFFromCancerVariant(const std::string& ref,\n                                               const std::string& base,\n                                               const std::string& variant,\n                                               const std::string& refName,\n                                               size_t refPosition,\n                                               const std::string& varName,\n                                               int minExactMatch,\n                                               double dustThreshold,\n                                               int verbose,\n                                               VCFVector& outRecords);\n\n    // Write a VCF header to the given file handle\n    void writeHeader(std::ostream* pWriter, const std::string& program, \n                     const std::string& bamFile, const std::string& reference);\n\n    // constants\n    static const int HOMOPOLYMER_ANNOTATE_THRESHOLD = 5;\n\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/VariantIndex.cpp",
    "content": "//-----------------------------------------------------\n// Copyright 2014 Ontario Institute for Cancer Research\n// Written by Jared Simpson (jared.simpson@oicr.on.ca)\n// Released under the GPL\n//-----------------------------------------------------\n//\n// Data structure for performing proximity queries\n// against a set of variants\n//\n#include <iostream>\n#include <algorithm>\n#include <assert.h>\n#include \"VariantIndex.h\"\n\nVariantIndex::VariantIndex(const std::string& filename, const ReadTable& refTable)\n{\n    std::ifstream input(filename.c_str());\n    std::string line;\n\n    // Parse the VCF file\n    while(getline(input, line))\n    {\n        if(line.empty())\n            continue;\n\n        if(line[0] == '#')\n            continue;\n        \n        VCFRecord record(line);\n\n        // Do not allow multi-allelic records\n        if(record.isMultiAllelic())\n        {\n            std::cerr << \"Error: multi-allelic Variant found, please run vcfbreakmulti\\n\";\n            exit(EXIT_FAILURE);\n        }\n\n        // Convert to a minimal representation of the change\n        VariantRecord mvf = { record.refName, record.refStr, record.varStr, record.refPosition };\n        m_records.push_back(mvf);\n    }\n\n    buildIndex(refTable);\n}\n\nvoid VariantIndex::buildIndex(const ReadTable& refTable)\n{\n    for(size_t i = 0; i < refTable.getCount(); ++i)\n    {\n        const SeqItem& seq_record = refTable.getRead(i);\n        std::string chromosome = seq_record.id;\n        size_t length = seq_record.seq.length();\n        int buckets = (length / BUCKET_SIZE) + 1;\n\n        m_map[chromosome].resize(buckets);\n    }\n\n    for(size_t i = 0; i < m_records.size(); ++i)\n    {\n        VariantIndexMap::iterator iter = m_map.find(m_records[i].reference);\n        assert(iter != m_map.end());\n\n        int bucket_id = m_records[i].position / BUCKET_SIZE;\n        assert(bucket_id < (int)iter->second.size());\n        IntVector& bucket = iter->second[bucket_id];\n        bucket.push_back(i);\n    }\n}\n\nVariantRecordVector VariantIndex::getNearVariants(const std::string& reference,\n                                                  int position,\n                                                  int distance) const\n{\n    VariantRecordVector out;\n\n    VariantIndexMap::const_iterator iter = m_map.find(reference);\n    assert(iter != m_map.end());\n    const IntVectorVector& chr_buckets = iter->second;\n\n    int lower_index = std::max(position - distance, 0) / BUCKET_SIZE;\n    int upper_index = std::min((position + distance) / BUCKET_SIZE, (int)chr_buckets.size() - 1);\n\n    for(int bi = lower_index; bi <= upper_index; ++bi)\n    {\n        const IntVector& bucket = chr_buckets[bi];\n        for(size_t vi = 0; vi < bucket.size(); ++vi)\n        {\n            const VariantRecord& record = m_records[bucket[vi]];\n            if(abs(record.position - position) < distance)\n                out.push_back(record);\n        }\n    }\n\n    return out;\n}\n\n"
  },
  {
    "path": "src/SGA/Util/VariantIndex.h",
    "content": "//-----------------------------------------------------\n// Copyright 2014 Ontario Institute for Cancer Research\n// Written by Jared Simpson (jared.simpson@oicr.on.ca)\n// Released under the GPL\n//-----------------------------------------------------\n//\n// Data structure for performing proximity queries\n// against a set of variants\n//\n#ifndef VARIANTINDEX_H\n#define VARIANTINDEX_H\n#include \"Util.h\"\n#include \"SeqReader.h\"\n#include \"VCFUtil.h\"\n#include \"ReadTable.h\"\n#include <map>\n\n// To save space we store a vcf-like record\n// with only the required fields\nstruct VariantRecord\n{\n    std::string reference;\n    std::string ref_sequence;\n    std::string alt_sequence;\n    size_t position;\n};\n\ntypedef std::vector<VariantRecord> VariantRecordVector;\ntypedef std::vector<int> IntVector;\ntypedef std::vector<IntVector> IntVectorVector;\n\n// map from chromosome to a vector of buckets, one every 10kbp\ntypedef std::map<std::string, IntVectorVector> VariantIndexMap;\n\nclass VariantIndex\n{\n    public:\n        //\n        VariantIndex(const std::string& filename, const ReadTable& refTable);\n\n        // Return a vector of the variants that are close to the input variant\n        VariantRecordVector getNearVariants(const std::string& reference, \n                                            int position, \n                                            int distance = 30) const;\n\n    private:\n        \n        //\n        void buildIndex(const ReadTable& refTable);\n\n        //\n        VariantRecordVector m_records;\n        VariantIndexMap m_map;\n\n        // \n        static const int BUCKET_SIZE = 10000;\n};\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/Verbosity.h",
    "content": "///----------------------------------------------\n// Copyright 2013 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// Verbosity - Singleton object to only\n// hold the verbosity level for the entire\n// program\n//\n#ifndef VERBOSITY_H\n#define VERBOSITY_H\n\nclass Verbosity\n{\n    public:\n        Verbosity() : m_maxPrintLevel(0) {}\n\n        // Get singleton object\n        static Verbosity& Instance()\n        {\n            static Verbosity instance;\n            return instance;\n        }\n     \n        // Get/set the print level\n        int getPrintLevel() const { return m_maxPrintLevel; }\n        void setPrintLevel(int l) { m_maxPrintLevel = l; }\n\n    private:\n        int m_maxPrintLevel;\n};\n\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/bamreader.h",
    "content": "#ifndef BAMREADER_H\n#define BAMREADER_h\n\n#include \"api/BamReader.h\"\n#include \"api/BamWriter.h\"\n#include \"Util.h\"\n\nclass SVBamReader {\n\n public:\n\n  Bamreader(const std::string filename, const std::string prefix, const int isize = 2000) \n    : m_bam(filename), m_prefix(prefix), m_isize(isize) {}\n  ~Bamreader() { }\n\n  void bamToSeqRecordVector(SeqRecordVector &srv);\n\n  bool setBamRegion(int refid1, int refid2, int pos1, int pos2);\n\n  bool findBamIndex();\n\n private:\n  std::string m_bam;\n  std::string m_prefix;\n  int m_isize;\n  std::string m_index;\n  BamTools::BamReader m_reader;\n  BamTools::BamRegion m_region;\n}\n\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/bucketSort.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// bucketSort - perform a bucket sort over a range of values\n//\n\n"
  },
  {
    "path": "src/SGA/Util/bucketSort.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// bucketSort - perform a bucket sort over a range of values\n//\n\n#ifndef BUCKETSORT_H\n#define BUCKETSORT_H\n#include <list>\n\ntemplate<typename IterType, typename BucketFunctor>\nvoid bucketSort(IterType start, IterType end, BucketFunctor func)\n{\n    // Typedef the base value of the iterator\n    typedef typename std::iterator_traits<IterType>::value_type base_value;\n    typedef std::list<base_value> base_list;\n    typedef typename base_list::iterator list_iterator;\n\n    // Get the number of buckets needed\n    int numBuckets = func.getNumBuckets();\n\n    // Allocate an array of lists\n    base_list* buckets = new base_list[numBuckets];\n\n    // Place the items into buckets\n    for(IterType iter = start; iter != end; ++iter)\n    {\n        int bucket_id = func(*iter);\n        assert(bucket_id < numBuckets);\n        buckets[bucket_id].push_back(*iter);\n    }\n\n    // Place the elements back into the array\n    IterType curr = start;\n    for(int i = 0; i < numBuckets; ++i)\n    {\n        IterType bucket_start = curr;\n        size_t count = 0;\n        for(list_iterator bucket_iter = buckets[i].begin(); bucket_iter != buckets[i].end(); ++bucket_iter)\n        {\n            ++count;\n            *curr++ = *bucket_iter;\n        }\n        std::sort(bucket_start, curr, func);\n    }\n    assert(curr == end);\n\n    // delete lists\n    delete [] buckets;\n}\n\ntemplate<typename T, typename PrimarySorter, typename FinalSorter>\nvoid histogramSort(T* x, size_t n, int depth, PrimarySorter& primarySorter, const FinalSorter& finalSorter)\n{\n    // Get the number of buckets needed\n    int numBuckets = primarySorter.getNumBuckets();\n\n    // Set the functor's offset\n    primarySorter.setBucketDepth(depth);\n\n    // Allocate an array for the bucket start points and the bucket end points\n    // TODO: Could remove at least one of these arrays\n    size_t* bucket_starts = new size_t[numBuckets];\n    size_t* bucket_ends = new size_t[numBuckets];\n    size_t* bucket_counts = new size_t[numBuckets];\n\n    for(int i = 0; i < numBuckets; ++i)\n    {\n        bucket_starts[i] = 0;\n        bucket_ends[i] = 0;\n        bucket_counts[i] = 0;\n    }    \n\n    // Place the items into buckets\n    for(size_t i = 0; i < n; ++i)\n    {\n        int bucket_id = primarySorter.getBucket(x[i]);\n        assert(bucket_id < numBuckets);\n        bucket_counts[bucket_id]++;\n    }\n\n    // Set up the start/end points\n    size_t sum = 0;\n    for(int i = 0; i < numBuckets; ++i)\n    {\n        size_t val = bucket_counts[i];\n        bucket_starts[i] = sum;\n        sum += val;\n        bucket_ends[i] = sum;\n        //std::cout << \"Bucket count: \" << bucket_counts[i] << \" start: \" << bucket_starts[i] << \" end: \" << bucket_ends[i] << \"\\n\";\n        \n    }\n\n    // Now, consider the bucket_starts positions to be the next (potentially) unsorted position\n    // for each bucket. Iterate through these values cycles the elements into place\n    int curr_bucket = 0; // Start on the first bucket that has element\n    while(bucket_starts[curr_bucket] == bucket_ends[curr_bucket])\n        ++curr_bucket;\n\n    while(curr_bucket != numBuckets)\n    {\n        //std::cout << \"Curr Bucket: \" << curr_bucket << \"\\n\";\n        //std::cout << \"CurrIDX: \" << bucket_starts[curr_bucket] << \"\\n\";\n        int elem_offset = bucket_starts[curr_bucket];\n        \n        // Get the bucket for this element\n        int bucket_id = primarySorter.getBucket(x[elem_offset]);\n\n        // if the element is in the correct bucket, just advance the pointer\n        if(bucket_id == curr_bucket)\n            bucket_starts[curr_bucket]++;\n        else\n        {\n            // Cycle the elements until we land back in this bucket, at which point\n            // we have sorted one position further in the current bucket\n\n            // Hold the info for the element that has been displaced\n            T displaced = x[elem_offset];\n            bool stop = false;\n\n            while(!stop)\n            {\n                // Get the offset of the position this element should be in\n                int displaced_bucket = primarySorter.getBucket(displaced);\n\n                if(displaced_bucket == curr_bucket)\n                {\n                    // The displaced element belongs back in the original bucket, place it there\n                    x[elem_offset] = displaced;\n                    bucket_starts[curr_bucket]++;\n                    stop = true;\n                }\n                else\n                {\n                    int cycle_offset = bucket_starts[displaced_bucket];\n\n                    // Make space for the incoming element\n                    T swap = x[cycle_offset];\n                    x[cycle_offset] = displaced;\n                    displaced = swap;\n                    bucket_starts[displaced_bucket]++;\n                }\n            }\n        }\n\n        // At this point, the bucket_start for current bucket \n        // has moved 1 element\n        // Other buckets may have advanced as well\n        //\n        while(curr_bucket < numBuckets && bucket_starts[curr_bucket] == bucket_ends[curr_bucket])\n            ++curr_bucket;\n    }\n\n    // Recompute the start/end points\n    sum = 0;\n    for(int i = 0; i < numBuckets; ++i)\n    {\n        size_t val = bucket_counts[i];\n        bucket_starts[i] = sum;\n        sum += val;\n        bucket_ends[i] = sum;\n    }\n\n    // Finally, sort each bucket\n    for(int i = 0; i < numBuckets; ++i)\n    {\n        T* curr_bucket = x + bucket_starts[i];\n        size_t curr_count = bucket_counts[i];\n\n        if(curr_count < 2)\n            continue;\n\n        assert(curr_count == (bucket_ends[i] - bucket_starts[i]));\n\n        //std::cout << \"Sorting bucket \" << i << \"\\n\";\n        const int max_depth = 100;\n        const size_t min_elements = 1000;\n\n        // terminate the bucket sort under 3 conditions:\n        //  1) the bucket is degenerate (no more histogram sorting can be done) - this comes from the functor\n        //  2) the number of elements in the bucket is low\n        //  3) the max depth has been hit\n        if(primarySorter.isBucketDegenerate(i))\n        {\n            std::sort(curr_bucket, curr_bucket + curr_count, finalSorter);\n        }\n        else if(bucket_counts[i] < min_elements || depth >= max_depth)\n        {\n            int next_char = (depth + 1) * primarySorter.getBucketLen();\n            mkqs2(curr_bucket, curr_count, next_char, primarySorter, finalSorter);\n            //std::sort(curr_bucket, curr_bucket + bucket_counts[i], finalSorter);\n        }\n        else\n        {\n            histogramSort(curr_bucket, curr_count, depth + 1, primarySorter, finalSorter);\n        }\n    }\n\n    // delete arrays\n    delete [] bucket_counts;\n    delete [] bucket_starts;\n    delete [] bucket_ends;\n}\n\n\n\n#endif\n"
  },
  {
    "path": "src/SGA/Util/gzstream.C",
    "content": "// ============================================================================\n// gzstream, C++ iostream classes wrapping the zlib compression library.\n// Copyright (C) 2001  Deepak Bandyopadhyay, Lutz Kettner\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 3 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n//\n// See src/COPYING for the full terms of the license.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n// ============================================================================\n//\n// File          : gzstream.C\n// Revision      : $Revision: 1.7 $\n// Revision_date : $Date: 2003/01/08 14:41:27 $\n// Author(s)     : Deepak Bandyopadhyay, Lutz Kettner\n// Modified      : Jared Simpson 2010/04/16. Converted license notification to\n//                 GPLv3 to be compatible with the rest of the code base as \n//                 allowed by LGPLv2.1. No other changes were made.\n// \n// Standard streambuf implementation following Nicolai Josuttis, \"The \n// Standard C++ Library\".\n// ============================================================================\n\n#include \"gzstream.h\"\n#include <iostream>\n#include <string.h>  // for memcpy\n\n#ifdef GZSTREAM_NAMESPACE\nnamespace GZSTREAM_NAMESPACE {\n#endif\n\n// ----------------------------------------------------------------------------\n// Internal classes to implement gzstream. See header file for user classes.\n// ----------------------------------------------------------------------------\n\n// --------------------------------------\n// class gzstreambuf:\n// --------------------------------------\n\ngzstreambuf* gzstreambuf::open( const char* name, int open_mode) {\n    if ( is_open())\n        return (gzstreambuf*)0;\n    mode = open_mode;\n    // no append nor read/write mode\n    if ((mode & std::ios::ate) || (mode & std::ios::app)\n        || ((mode & std::ios::in) && (mode & std::ios::out)))\n        return (gzstreambuf*)0;\n    char  fmode[10];\n    char* fmodeptr = fmode;\n    if ( mode & std::ios::in)\n        *fmodeptr++ = 'r';\n    else if ( mode & std::ios::out)\n        *fmodeptr++ = 'w';\n    *fmodeptr++ = 'b';\n    *fmodeptr = '\\0';\n    file = gzopen( name, fmode);\n    if (file == 0)\n        return (gzstreambuf*)0;\n    opened = 1;\n    return this;\n}\n\ngzstreambuf * gzstreambuf::close() {\n    if ( is_open()) {\n        sync();\n        opened = 0;\n        if ( gzclose( file) == Z_OK)\n            return this;\n    }\n    return (gzstreambuf*)0;\n}\n\nint gzstreambuf::underflow() { // used for input buffer only\n    if ( gptr() && ( gptr() < egptr()))\n        return * reinterpret_cast<unsigned char *>( gptr());\n\n    if ( ! (mode & std::ios::in) || ! opened)\n        return EOF;\n    // Josuttis' implementation of inbuf\n    int n_putback = gptr() - eback();\n    if ( n_putback > 4)\n        n_putback = 4;\n    memcpy( buffer + (4 - n_putback), gptr() - n_putback, n_putback);\n\n    int num = gzread( file, buffer+4, bufferSize-4);\n    if (num <= 0) // ERROR or EOF\n        return EOF;\n\n    // reset buffer pointers\n    setg( buffer + (4 - n_putback),   // beginning of putback area\n          buffer + 4,                 // read position\n          buffer + 4 + num);          // end of buffer\n\n    // return next character\n    return * reinterpret_cast<unsigned char *>( gptr());    \n}\n\nint gzstreambuf::flush_buffer() {\n    // Separate the writing of the buffer from overflow() and\n    // sync() operation.\n    int w = pptr() - pbase();\n    if ( gzwrite( file, pbase(), w) != w)\n        return EOF;\n    pbump( -w);\n    return w;\n}\n\nint gzstreambuf::overflow( int c) { // used for output buffer only\n    if ( ! ( mode & std::ios::out) || ! opened)\n        return EOF;\n    if (c != EOF) {\n        *pptr() = c;\n        pbump(1);\n    }\n    if ( flush_buffer() == EOF)\n        return EOF;\n    return c;\n}\n\nint gzstreambuf::sync() {\n    // Changed to use flush_buffer() instead of overflow( EOF)\n    // which caused improper behavior with std::endl and flush(),\n    // bug reported by Vincent Ricard.\n    if ( pptr() && pptr() > pbase()) {\n        if ( flush_buffer() == EOF)\n            return -1;\n    }\n    return 0;\n}\n\n// --------------------------------------\n// class gzstreambase:\n// --------------------------------------\n\ngzstreambase::gzstreambase( const char* name, int mode) {\n    init( &buf);\n    open( name, mode);\n}\n\ngzstreambase::~gzstreambase() {\n    buf.close();\n}\n\nvoid gzstreambase::open( const char* name, int open_mode) {\n    if ( ! buf.open( name, open_mode))\n        clear( rdstate() | std::ios::badbit);\n}\n\nvoid gzstreambase::close() {\n    if ( buf.is_open())\n        if ( ! buf.close())\n            clear( rdstate() | std::ios::badbit);\n}\n\n#ifdef GZSTREAM_NAMESPACE\n} // namespace GZSTREAM_NAMESPACE\n#endif\n\n// ============================================================================\n// EOF //\n"
  },
  {
    "path": "src/SGA/Util/gzstream.h",
    "content": "// ============================================================================\n// gzstream, C++ iostream classes wrapping the zlib compression library.\n// Copyright (C) 2001  Deepak Bandyopadhyay, Lutz Kettner\n//\n// This library is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public\n// License as published by the Free Software Foundation; either\n// version 3 of the License, or (at your option) any later version.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n//\n// See src/COPYING for the full terms of the license.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n// ============================================================================\n//\n// File          : gzstream.h\n// Revision      : $Revision: 1.5 $\n// Revision_date : $Date: 2002/04/26 23:30:15 $\n// Author(s)     : Deepak Bandyopadhyay, Lutz Kettner\n// Modified      : Jared Simpson 2010/04/16. Converted license notification to\n//                 GPLv3 to be compatible with the rest of the code base as \n//                 allowed by LGPLv2.1. No other changes were made.\n// \n// \n// Standard streambuf implementation following Nicolai Josuttis, \"The \n// Standard C++ Library\".\n// ============================================================================\n\n#ifndef GZSTREAM_H\n#define GZSTREAM_H 1\n\n// standard C++ with new header file names and std:: namespace\n#include <iostream>\n#include <fstream>\n#include <zlib.h>\n\n#ifdef GZSTREAM_NAMESPACE\nnamespace GZSTREAM_NAMESPACE {\n#endif\n\n// ----------------------------------------------------------------------------\n// Internal classes to implement gzstream. See below for user classes.\n// ----------------------------------------------------------------------------\n\nclass gzstreambuf : public std::streambuf {\nprivate:\n    static const int bufferSize = 47+256;    // size of data buff\n    // totals 512 bytes under g++ for igzstream at the end.\n\n    gzFile           file;               // file handle for compressed file\n    char             buffer[bufferSize]; // data buffer\n    char             opened;             // open/close state of stream\n    int              mode;               // I/O mode\n\n    int flush_buffer();\npublic:\n    gzstreambuf() : opened(0) {\n        setp( buffer, buffer + (bufferSize-1));\n        setg( buffer + 4,     // beginning of putback area\n              buffer + 4,     // read position\n              buffer + 4);    // end position      \n        // ASSERT: both input & output capabilities will not be used together\n    }\n    int is_open() { return opened; }\n    gzstreambuf* open( const char* name, int open_mode);\n    gzstreambuf* close();\n    ~gzstreambuf() { close(); }\n    \n    virtual int     overflow( int c = EOF);\n    virtual int     underflow();\n    virtual int     sync();\n};\n\nclass gzstreambase : virtual public std::ios {\nprotected:\n    gzstreambuf buf;\npublic:\n    gzstreambase() { init(&buf); }\n    gzstreambase( const char* name, int open_mode);\n    ~gzstreambase();\n    void open( const char* name, int open_mode);\n    void close();\n    gzstreambuf* rdbuf() { return &buf; }\n};\n\n// ----------------------------------------------------------------------------\n// User classes. Use igzstream and ogzstream analogously to ifstream and\n// ofstream respectively. They read and write files based on the gz* \n// function interface of the zlib. Files are compatible with gzip compression.\n// ----------------------------------------------------------------------------\n\nclass igzstream : public gzstreambase, public std::istream {\npublic:\n    igzstream() : std::istream( &buf) {} \n    igzstream( const char* name, int open_mode = std::ios::in)\n        : gzstreambase( name, open_mode), std::istream( &buf) {}  \n    gzstreambuf* rdbuf() { return gzstreambase::rdbuf(); }\n    void open( const char* name, int open_mode = std::ios::in) {\n        gzstreambase::open( name, open_mode);\n    }\n};\n\nclass ogzstream : public gzstreambase, public std::ostream {\npublic:\n    ogzstream() : std::ostream( &buf) {}\n    ogzstream( const char* name, int mode = std::ios::out)\n        : gzstreambase( name, mode), std::ostream( &buf) {}  \n    gzstreambuf* rdbuf() { return gzstreambase::rdbuf(); }\n    void open( const char* name, int open_mode = std::ios::out) {\n        gzstreambase::open( name, open_mode);\n    }\n};\n\n#ifdef GZSTREAM_NAMESPACE\n} // namespace GZSTREAM_NAMESPACE\n#endif\n\n#endif // GZSTREAM_H\n// ============================================================================\n// EOF //\n\n"
  },
  {
    "path": "src/SGA/Util/mkqs.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// mkqs - multikey quicksort\n//\n// Perform a ternary quicksort of strings as described in\n// Bentley and Sedgewick, 1997\n//\n// Example code was downloaded from http://www.cs.princeton.edu/~rs/strings/demo.c\n// Modified by JTS to take in a comparator and use a generic type\n//\n\n#ifndef MKQS_H\n#define MKQS_H\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <time.h>\n#include <queue>\n//#include \"MkqsThread.h\"\n\n#define mkqs_swap(a, b) { T tmp = x[a]; x[a] = x[b]; x[b] = tmp; }\n\n// Swap [i..i+n] and [j..j+n] in x\ntemplate<typename T>\ninline void vecswap(int i, int j, int n, T* x)\n{   \n    while (n-- > 0) \n    {\n        mkqs_swap(i, j);\n        i++;\n        j++;\n    }\n}\n\n#define mkqs_swap2(a, b) { T t = *(a); *(a) = *(b); *(b) = t; }\n#define ptr2char(p) (primarySorter.getChar(*(p), depth))\n#define elem2char(e, d) (primarySorter.getChar((e), (d)))\n\ntemplate<typename T>\ninline void vecswap2(T* a, T* b, int n)\n{   while (n-- > 0) \n    {\n        T t = *a;\n        *a++ = *b;\n        *b++ = t;\n    }\n}\n\ntemplate<typename T, typename PrimarySorter>\nT* med3func(T* a, T* b, T* c, int depth, const PrimarySorter& primarySorter)\n{   int va, vb, vc;\n    if ((va=ptr2char(a)) == (vb=ptr2char(b)))\n        return a;\n    if ((vc=ptr2char(c)) == va || vc == vb)\n        return c;       \n    return va < vb ?\n          (vb < vc ? b : (va < vc ? c : a ) )\n        : (vb > vc ? b : (va < vc ? a : c ) );\n}\n#define med3(a, b, c) med3func(a, b, c, depth, primarySorter)\ntemplate<typename T, typename PrimarySorter, typename FinalSorter>\ninline void inssort(T* a, int n, int d, const PrimarySorter& primarySorter, const FinalSorter& finalSorter)\n{   \n    T *pi, *pj, s, t;\n    for (pi = a + 1; --n > 0; pi++)\n    {\n        for (pj = pi; pj > a; pj--) \n        {\n            // Inline strcmp: break if *(pj-1) <= *pj\n            T elem_s = *(pj - 1);\n            T elem_t = *pj;\n            const char* s = primarySorter.getChrPtr(elem_s);\n            const char* t = primarySorter.getChrPtr(elem_t);\n\n            for (s=s+d, t=t+d; *s==*t && *s!=0; s++, t++)\n                ;\n            if (*s < *t || (*s == *t && finalSorter(elem_s, elem_t)))\n                break;\n            mkqs_swap2(pj, pj-1);\n        }\n    }\n}\n\n// \ntemplate<typename T, typename PrimarySorter, typename FinalSorter>\nvoid mkqs2(T* a, int n, int depth, const PrimarySorter& primarySorter, const FinalSorter& finalSorter)\n{   \n    int r, partval;\n    T *pa, *pb, *pc, *pd, *pm, *pn, t;\n   \n    if (n < 10) \n    {\n        inssort(a, n, depth, primarySorter, finalSorter);\n        return;\n    }\n\n    // chatGPT determinisic method\n    pm = med3(a, a + n/2, a + n - 1);   // med3 is already defined above\n\n    // old rand determined, has hidden mutex lock\n    /*    pm = a + (n/2);\n    pn = a + (n-1);\n\n    int mid_idx = rand() % n;\n\n    pm = &a[mid_idx];*/\n    \n    mkqs_swap2(a, pm);\n    partval = ptr2char(a);\n    \n    pa = pb = a + 1;\n    pc = pd = a + n-1;\n    for (;;) \n    {\n        while (pb <= pc && (r = ptr2char(pb)-partval) <= 0) \n        {\n            if (r == 0) { mkqs_swap2(pa, pb); pa++; }\n            pb++;\n        }\n        while (pb <= pc && (r = ptr2char(pc)-partval) >= 0) \n        {\n            if (r == 0) { mkqs_swap2(pc, pd); pd--; }\n            pc--;\n        }\n        if (pb > pc) break;\n        mkqs_swap2(pb, pc);\n        pb++;\n        pc--;\n    }\n    pn = a + n;\n    r = std::min(pa-a, pb-pa);    vecswap2(a,  pb-r, r);\n    r = std::min(pd-pc, pn-pd-1); vecswap2(pb, pn-r, r);\n    if ((r = pb-pa) > 1)\n        mkqs2(a, r, depth, primarySorter, finalSorter);\n    if (ptr2char(a + r) != 0)\n        mkqs2(a + r, pa-a + pn-pd-1, depth+1, primarySorter, finalSorter);\n    else\n    {\n        int n2 = pa - a + pn - pd - 1;\n        std::sort(a + r, a + r + n2, finalSorter);\n    }\n    if ((r = pd-pc) > 1)\n        mkqs2(a + n-r, r, depth, primarySorter, finalSorter);\n}\n\n// Parallel multikey quicksort. It performs mkqs but will\n// subdivide the array to sort into sub jobs which can be sorted using threads.\n/*template<typename T, typename PrimarySorter, typename FinalSorter>\nvoid parallel_mkqs(T* pData, int n, int numThreads, const PrimarySorter& primarySorter, const FinalSorter& finalSorter)\n{\n    typedef MkqsJob<T> Job;\n    typedef std::queue<Job> JobQueue;\n    Job initialJob(pData, n, 0);\n    JobQueue queue;\n    queue.push(initialJob);\n    \n    // Create the mutex that guards the queue\n    pthread_mutex_t queue_mutex;\n    int ret = pthread_mutex_init(&queue_mutex, NULL);\n    if(ret != 0)\n    {\n        std::cerr << \"Mutex initialization failed with error \" << ret << \", aborting\" << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    // Calculate the threshold size for performing serial continuation of the sort. Once the chunks \n    // are below this size, it is better to not subdivide the problem into smaller chunks\n    // to avoid the overhead of locking, adding to the queue, etc. \n    int threshold_size = n / numThreads;\n\n    // Create the semaphore used to signal that data is ready to be processed\n    // Initial value is 1 as there is one item on the queue to start\n    sem_t queue_sem;\n    ret = sem_init( &queue_sem, PTHREAD_PROCESS_PRIVATE, 1 );\n    if(ret != 0)\n    {\n        std::cerr << \"Semaphore initialization failed with error \" << ret << \"\\n\";\n        std::cerr << \"You are probably running on OSX which does not provide unnamed semaphores\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    // Create the semaphore indicating a thread is finished working.\n    // This semaphore is incremented by the threads in their run loop\n    // before waiting for queue items. If the thread takes an item,\n    // this semaphore is decremented. The main thread checks\n    // this semaphore after confirming the queue is empty. If this \n    // semaphore value equals the total number of threads, \n    // no more work can remain the the threads are cleaned up\n    sem_t done_sem;\n    ret = sem_init( &done_sem, PTHREAD_PROCESS_PRIVATE, 0 );\n    if(ret != 0)\n    {\n        std::cerr << \"Semaphore initialization failed with error \" << ret << \"\\n\";\n        std::cerr << \"You are probably running on OSX which does not provide unnamed semaphores\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    // Create and start the threads\n    MkqsThread<T, PrimarySorter, FinalSorter>* threads[numThreads];\n    for(int i = 0; i < numThreads; ++i)\n    {\n        threads[i] = new MkqsThread<T, PrimarySorter, FinalSorter>(i, &queue, &queue_mutex, &queue_sem, &done_sem, threshold_size, &primarySorter, &finalSorter);   \n        threads[i]->start();\n    }\n\n    // Check for the end condition\n    bool done = false;\n    while(!done)\n    {\n      //        sleep(1);\n\n        // Check if the queue is empty\n        // If it is and all threads are finished working (all have posted to\n        // the done semaphore), then the threads can be cleaned up.\n        pthread_mutex_lock(&queue_mutex);\n        if(queue.empty())\n        {\n            int semval;\n            sem_getvalue(&done_sem, &semval);\n            if(semval == numThreads)\n                done = true;\n        }\n        pthread_mutex_unlock(&queue_mutex);\n    }\n\n    // Signal all the threads to stop, then post to the semaphore they are waiting on\n    // All threads will pick up the stop request after the posts and call pthread exit\n    for(int i = 0; i < numThreads; ++i)\n    {\n        threads[i]->stop();\n    }\n\n    for(int i = 0; i < numThreads; ++i)\n    {\n        sem_post(&queue_sem);\n    }\n\n    // Join and destroy the threads\n    for(int i = 0; i < numThreads; ++i)\n    {\n        threads[i]->join();\n        delete threads[i];\n    }\n\n    // Destroy the semaphore\n    sem_destroy(&queue_sem);\n    sem_destroy(&done_sem);\n\n    // Destroy the queue mutex\n    ret = pthread_mutex_destroy(&queue_mutex);\n    if(ret != 0)\n    {\n        std::cerr << \"Mutex destruction failed with error \" << ret << \", aborting\" << std::endl;\n        exit(EXIT_FAILURE);\n    }\n}\n*/\n//\n// Perform a partial sort of the data using the mkqs algorithm\n// Iterative sort jobs are created and added to pQueue which is\n// protected by pQueueMutex. After addition, pQueueSem is updated.\n//\n/*\ntemplate<typename T, class PrimarySorter, class FinalSorter>\nvoid parallel_mkqs_process(MkqsJob<T>& job, \n                           std::queue<MkqsJob<T> >* pQueue, \n                           pthread_mutex_t* pQueueMutex, \n                           sem_t* pQueueSem,\n                           const PrimarySorter& primarySorter, \n                           const FinalSorter& finalSorter)\n{\n    T* a = job.pData;\n    int n = job.n;\n    int depth = job.depth;\n    \n    int r, partval;\n    T *pa, *pb, *pc, *pd, *pm, *pn, t;\n    \n    if(n < 10) \n    {\n        inssort(a, n, depth, primarySorter, finalSorter);\n        return;\n    }\n    \n    pm = a + (n/2);\n    pn = a + (n-1);\n\n    int mid_idx = rand() % n;\n\n    pm = &a[mid_idx];\n    mkqs_swap2(a, pm);\n    partval = ptr2char(a);\n    pa = pb = a + 1;\n    pc = pd = a + n-1;\n    for (;;) \n    {\n        while (pb <= pc && (r = ptr2char(pb)-partval) <= 0) \n        {\n            if (r == 0) { mkqs_swap2(pa, pb); pa++; }\n            pb++;\n        }\n        while (pb <= pc && (r = ptr2char(pc)-partval) >= 0) \n        {\n            if (r == 0) { mkqs_swap2(pc, pd); pd--; }\n            pc--;\n        }\n        if (pb > pc) break;\n        mkqs_swap2(pb, pc);\n        pb++;\n        pc--;\n    }\n    pn = a + n;\n    r = std::min(pa-a, pb-pa);    vecswap2(a,  pb-r, r);\n    r = std::min(pd-pc, pn-pd-1); vecswap2(pb, pn-r, r);\n\n    // Lock the queue and push new items if necessary\n    // If new items are added to the queue, the semaphore is posted to\n    pthread_mutex_lock(pQueueMutex);\n\n    if ((r = pb-pa) > 1)\n    {\n        MkqsJob<T> job(a, r, depth);\n        pQueue->push(job);\n        sem_post(pQueueSem);\n    }\n    \n    if (ptr2char(a + r) != 0)\n    {\n        MkqsJob<T> job(a + r, pa-a + pn-pd-1, depth + 1);\n        pQueue->push(job);\n        sem_post(pQueueSem);\n    }\n    else\n    {\n        // Finalize the sort\n        int n2 = pa - a + pn - pd - 1;\n        std::sort(a + r, a + r + n2, finalSorter);\n    }\n\n    if ((r = pd-pc) > 1)\n    {\n        MkqsJob<T> job(a + n-r, r, depth);\n        pQueue->push(job);\n        sem_post(pQueueSem);\n    }\n\n    // Unlock the mutex\n    pthread_mutex_unlock(pQueueMutex);\n}\n*/\n#endif\n\n"
  },
  {
    "path": "src/SGA/Util/old.AlignedContig.h",
    "content": "#include \"Util.h\"\n#include \"api/BamReader.h\"\n#include \"api/BamWriter.h\"\n#include <vector>\n\nclass AlignedContig {\n\n public:  \n  AlignedContig(const BamTools::BamAlignment align) { m_align.push_back(align); }\n  ~AlignedContig() {}\n\n  void addAlignement(const BamTools::BamAlignment align) { \n        m_align.push_back(align); \n        m_num++;\n  }\n\n  void addRead(const SeqRecord sr) { m_sr.push_back(sr); }\n\n private:\n  std::vector<BamTools::BamAlignment> m_align;\n  std::vector<SeqRecord> m_sr;\n  unsigned m_num;\n \n}\n"
  },
  {
    "path": "src/SGA/Util/stdaln.c",
    "content": "/* The MIT License\n\n   Copyright (c) 2003-2006, 2008, 2009, by Heng Li <lh3lh3@gmail.com>\n\n   Permission is hereby granted, free of charge, to any person obtaining\n   a copy of this software and associated documentation files (the\n   \"Software\"), to deal in the Software without restriction, including\n   without limitation the rights to use, copy, modify, merge, publish,\n   distribute, sublicense, and/or sell copies of the Software, and to\n   permit persons to whom the Software is furnished to do so, subject to\n   the following conditions:\n\n   The above copyright notice and this permission notice shall be\n   included in all copies or substantial portions of the Software.\n\n   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n   SOFTWARE.\n*/\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdint.h>\n#include \"stdaln.h\"\n\n/* char -> 17 (=16+1) nucleotides */\nunsigned char aln_nt16_table[256] = {\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,16 /*'-'*/,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,\n\t15, 1,14, 4, 11,15,15, 2, 13,15,15,10, 15, 5,15,15,\n\t15,15, 3, 6,  8,15, 7, 9,  0,12,15,15, 15,15,15,15,\n\t15, 1,14, 4, 11,15,15, 2, 13,15,15,10, 15, 5,15,15,\n\t15,15, 3, 6,  8,15, 7, 9,  0,12,15,15, 15,15,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,\n\t15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15\n};\nchar *aln_nt16_rev_table = \"XAGRCMSVTWKDYHBN-\";\n\n/* char -> 5 (=4+1) nucleotides */\nunsigned char aln_nt4_table[256] = {\n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 5 /*'-'*/, 4, 4,\n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 0, 4, 2,  4, 4, 4, 1,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  3, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 0, 4, 2,  4, 4, 4, 1,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  3, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4, \n\t4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4,  4, 4, 4, 4\n};\nchar *aln_nt4_rev_table = \"AGCTN-\";\n\n/* char -> 22 (=20+1+1) amino acids */\nunsigned char aln_aa_table[256] = {\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,20,21, 21,22 /*'-'*/,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,\n\t21, 0,21, 4,  3, 6,13, 7,  8, 9,21,11, 10,12, 2,21,\n\t14, 5, 1,15, 16,21,19,17, 21,18,21,21, 21,21,21,21,\n\t21, 0,21, 4,  3, 6,13, 7,  8, 9,21,11, 10,12, 2,21,\n\t14, 5, 1,15, 16,21,19,17, 21,18,21,21, 21,21,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,\n\t21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21\n};\nchar *aln_aa_rev_table = \"ARNDCQEGHILKMFPSTWYV*X-\";\n                       /* 01234567890123456789012 */\n\n/* translation table. They are useless in stdaln.c, but when you realize you need it, you need not write the table again. */\nunsigned char aln_trans_table_eu[66] = {\n\t11,11, 2, 2,  1, 1,15,15, 16,16,16,16,  9,12, 9, 9,\n\t 6, 6, 3, 3,  7, 7, 7, 7,  0, 0, 0, 0, 19,19,19,19,\n\t 5, 5, 8, 8,  1, 1, 1, 1, 14,14,14,14, 10,10,10,10,\n\t20,20,18,18, 20,17, 4, 4, 15,15,15,15, 10,10,13,13, 21, 22\n};\nchar *aln_trans_table_eu_char = \"KKNNRRSSTTTTIMIIEEDDGGGGAAAAVVVVQQHHRRRRPPPPLLLL**YY*WCCSSSSLLFFX\";\n                              /* 01234567890123456789012345678901234567890123456789012345678901234 */\nint aln_sm_blosum62[] = {\n/*\t A  R  N  D  C  Q  E  G  H  I  L  K  M  F  P  S  T  W  Y  V  *  X */\n\t 4,-1,-2,-2, 0,-1,-1, 0,-2,-1,-1,-1,-1,-2,-1, 1, 0,-3,-2, 0,-4, 0,\n\t-1, 5, 0,-2,-3, 1, 0,-2, 0,-3,-2, 2,-1,-3,-2,-1,-1,-3,-2,-3,-4,-1,\n\t-2, 0, 6, 1,-3, 0, 0, 0, 1,-3,-3, 0,-2,-3,-2, 1, 0,-4,-2,-3,-4,-1,\n\t-2,-2, 1, 6,-3, 0, 2,-1,-1,-3,-4,-1,-3,-3,-1, 0,-1,-4,-3,-3,-4,-1,\n\t 0,-3,-3,-3, 9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1,-4,-2,\n\t-1, 1, 0, 0,-3, 5, 2,-2, 0,-3,-2, 1, 0,-3,-1, 0,-1,-2,-1,-2,-4,-1,\n\t-1, 0, 0, 2,-4, 2, 5,-2, 0,-3,-3, 1,-2,-3,-1, 0,-1,-3,-2,-2,-4,-1,\n\t 0,-2, 0,-1,-3,-2,-2, 6,-2,-4,-4,-2,-3,-3,-2, 0,-2,-2,-3,-3,-4,-1,\n\t-2, 0, 1,-1,-3, 0, 0,-2, 8,-3,-3,-1,-2,-1,-2,-1,-2,-2, 2,-3,-4,-1,\n\t-1,-3,-3,-3,-1,-3,-3,-4,-3, 4, 2,-3, 1, 0,-3,-2,-1,-3,-1, 3,-4,-1,\n\t-1,-2,-3,-4,-1,-2,-3,-4,-3, 2, 4,-2, 2, 0,-3,-2,-1,-2,-1, 1,-4,-1,\n\t-1, 2, 0,-1,-3, 1, 1,-2,-1,-3,-2, 5,-1,-3,-1, 0,-1,-3,-2,-2,-4,-1,\n\t-1,-1,-2,-3,-1, 0,-2,-3,-2, 1, 2,-1, 5, 0,-2,-1,-1,-1,-1, 1,-4,-1,\n\t-2,-3,-3,-3,-2,-3,-3,-3,-1, 0, 0,-3, 0, 6,-4,-2,-2, 1, 3,-1,-4,-1,\n\t-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4, 7,-1,-1,-4,-3,-2,-4,-2,\n\t 1,-1, 1, 0,-1, 0, 0, 0,-1,-2,-2, 0,-1,-2,-1, 4, 1,-3,-2,-2,-4, 0,\n\t 0,-1, 0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1, 1, 5,-2,-2, 0,-4, 0,\n\t-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1, 1,-4,-3,-2,11, 2,-3,-4,-2,\n\t-2,-2,-2,-3,-2,-1,-2,-3, 2,-1,-1,-2,-1, 3,-3,-2,-2, 2, 7,-1,-4,-1,\n\t 0,-3,-3,-3,-1,-2,-2,-3,-3, 3, 1,-2, 1,-1,-2,-2, 0,-3,-1, 4,-4,-1,\n\t-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, 1,-4,\n\t 0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2, 0, 0,-2,-1,-1,-4,-1\n};\n\nint aln_sm_blosum45[] = {\n/*\t A  R  N  D  C  Q  E  G  H  I  L  K  M  F  P  S  T  W  Y  V  *  X */\n\t 5,-2,-1,-2,-1,-1,-1, 0,-2,-1,-1,-1,-1,-2,-1, 1, 0,-2,-2, 0,-5, 0,\n\t-2, 7, 0,-1,-3, 1, 0,-2, 0,-3,-2, 3,-1,-2,-2,-1,-1,-2,-1,-2,-5,-1,\n\t-1, 0, 6, 2,-2, 0, 0, 0, 1,-2,-3, 0,-2,-2,-2, 1, 0,-4,-2,-3,-5,-1,\n\t-2,-1, 2, 7,-3, 0, 2,-1, 0,-4,-3, 0,-3,-4,-1, 0,-1,-4,-2,-3,-5,-1,\n\t-1,-3,-2,-3,12,-3,-3,-3,-3,-3,-2,-3,-2,-2,-4,-1,-1,-5,-3,-1,-5,-2,\n\t-1, 1, 0, 0,-3, 6, 2,-2, 1,-2,-2, 1, 0,-4,-1, 0,-1,-2,-1,-3,-5,-1,\n\t-1, 0, 0, 2,-3, 2, 6,-2, 0,-3,-2, 1,-2,-3, 0, 0,-1,-3,-2,-3,-5,-1,\n\t 0,-2, 0,-1,-3,-2,-2, 7,-2,-4,-3,-2,-2,-3,-2, 0,-2,-2,-3,-3,-5,-1,\n\t-2, 0, 1, 0,-3, 1, 0,-2,10,-3,-2,-1, 0,-2,-2,-1,-2,-3, 2,-3,-5,-1,\n\t-1,-3,-2,-4,-3,-2,-3,-4,-3, 5, 2,-3, 2, 0,-2,-2,-1,-2, 0, 3,-5,-1,\n\t-1,-2,-3,-3,-2,-2,-2,-3,-2, 2, 5,-3, 2, 1,-3,-3,-1,-2, 0, 1,-5,-1,\n\t-1, 3, 0, 0,-3, 1, 1,-2,-1,-3,-3, 5,-1,-3,-1,-1,-1,-2,-1,-2,-5,-1,\n\t-1,-1,-2,-3,-2, 0,-2,-2, 0, 2, 2,-1, 6, 0,-2,-2,-1,-2, 0, 1,-5,-1,\n\t-2,-2,-2,-4,-2,-4,-3,-3,-2, 0, 1,-3, 0, 8,-3,-2,-1, 1, 3, 0,-5,-1,\n\t-1,-2,-2,-1,-4,-1, 0,-2,-2,-2,-3,-1,-2,-3, 9,-1,-1,-3,-3,-3,-5,-1,\n\t 1,-1, 1, 0,-1, 0, 0, 0,-1,-2,-3,-1,-2,-2,-1, 4, 2,-4,-2,-1,-5, 0,\n\t 0,-1, 0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-1,-1, 2, 5,-3,-1, 0,-5, 0,\n\t-2,-2,-4,-4,-5,-2,-3,-2,-3,-2,-2,-2,-2, 1,-3,-4,-3,15, 3,-3,-5,-2,\n\t-2,-1,-2,-2,-3,-1,-2,-3, 2, 0, 0,-1, 0, 3,-3,-2,-1, 3, 8,-1,-5,-1,\n\t 0,-2,-3,-3,-1,-3,-3,-3,-3, 3, 1,-2, 1, 0,-3,-1, 0,-3,-1, 5,-5,-1,\n\t-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, 1,-5,\n\t 0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0,-2,-1,-1,-5,-1\n};\n\nint aln_sm_nt[] = {\n/*\t X  A  G  R  C  M  S  V  T  W  K  D  Y  H  B  N */\n\t-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,\n\t-2, 2,-1, 1,-2, 1,-2, 0,-2, 1,-2, 0,-2, 0,-2, 0,\n\t-2,-1, 2, 1,-2,-2, 1, 0,-2,-2, 1, 0,-2,-2, 0, 0,\n\t-2, 1, 1, 1,-2,-1,-1, 0,-2,-1,-1, 0,-2, 0, 0, 0,\n\t-2,-2,-2,-2, 2, 1, 1, 0,-1,-2,-2,-2, 1, 0, 0, 0,\n\t-2, 1,-2,-1, 1, 1,-1, 0,-2,-1,-2, 0,-1, 0, 0, 0,\n\t-2,-2, 1,-1, 1,-1, 1, 0,-2,-2,-1, 0,-1, 0, 0, 0,\n\t-2, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0,\n\t-2,-2,-2,-2,-1,-2,-2,-2, 2, 1, 1, 0, 1, 0, 0, 0,\n\t-2, 1,-2,-1,-2,-1,-2, 0, 1, 1,-1, 0,-1, 0, 0, 0,\n\t-2,-2, 1,-1,-2,-2,-1, 0, 1,-1, 1, 0,-1, 0, 0, 0,\n\t-2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t-2,-2,-2,-2, 1,-1,-1, 0, 1,-1,-1, 0, 1, 0, 0, 0,\n\t-2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t-2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\nint aln_sm_read[] = {\n/*\t  X   A   G   R   C   M   S   V   T   W   K   D   Y   H   B   N  */\n\t-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,\n\t-17,  2,-17,  1,-17,  1,-17,  0,-17,  1,-17,  0,-17,  0,-17,  0,\n\t-17,-17,  2,  1,-17,-17,  1,  0,-17,-17,  1,  0,-17,-17,  0,  0,\n\t-17,  1,  1,  1,-17,-17,-17,  0,-17,-17,-17,  0,-17,  0,  0,  0,\n\t-17,-17,-17,-17,  2,  1,  1,  0,-17,-17,-17,-17,  1,  0,  0,  0,\n\t-17,  1,-17,-17,  1,  1,-17,  0,-17,-17,-17,  0,-17,  0,  0,  0,\n\t-17,-17,  1,-17,  1,-17,  1,  0,-17,-17,-17,  0,-17,  0,  0,  0,\n\t-17,  0,  0,  0,  0,  0,  0,  0,-17,  0,  0,  0,  0,  0,  0,  0,\n\t-17,-17,-17,-17,-17,-17,-17,-17,  2,  1,  1,  0,  1,  0,  0,  0,\n\t-17,  1,-17,-17,-17,-17,-17,  0,  1,  1,-17,  0,-17,  0,  0,  0,\n\t-17,-17,  1,-17,-17,-17,-17,  0,  1,-17,  1,  0,-17,  0,  0,  0,\n\t-17,  0,  0,  0,-17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n\t-17,-17,-17,-17,  1,-17,-17,  0,  1,-17,-17,  0,  1,  0,  0,  0,\n\t-17,  0,-17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n\t-17,-17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n\t-17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0\n};\n\nint aln_sm_hs[] = {\n/*     A    G    C    T    N */\n\t  91, -31,-114,-123, -44,\n\t -31, 100,-125,-114, -42,\n\t-123,-125, 100, -31, -42,\n\t-114,-114, -31,  91, -42,\n\t -44, -42, -42, -42, -43\n};\n\nint aln_sm_maq[] = {\n\t11, -19, -19, -19, -13,\n\t-19, 11, -19, -19, -13,\n\t-19, -19, 11, -19, -13,\n\t-19, -19, -19, 11, -13,\n\t-13, -13, -13, -13, -13\n};\n\nint aln_sm_blast[] = {\n\t1, -3, -3, -3, -2,\n\t-3, 1, -3, -3, -2,\n\t-3, -3, 1, -3, -2,\n\t-3, -3, -3, 1, -2,\n\t-2, -2, -2, -2, -2\n};\n\n/********************/\n/* START OF align.c */\n/********************/\n\nAlnParam aln_param_blast   = {  5,  2,  2, aln_sm_blast, 5, 50 };\nAlnParam aln_param_bwa     = { 26,  9,  5, aln_sm_maq, 5, 50 };\nAlnParam aln_param_nt2nt   = {  8,  2,  2, aln_sm_nt, 16, 75 };\nAlnParam aln_param_rd2rd   = {  1, 19, 19, aln_sm_read, 16, 75 };\nAlnParam aln_param_aa2aa   = { 10,  2,  2, aln_sm_blosum62, 22, 50 };\n\nAlnAln *aln_init_AlnAln()\n{\n\tAlnAln *aa;\n\taa = (AlnAln*)malloc(sizeof(AlnAln));\n\taa->path = 0;\n\taa->out1 = aa->out2 = aa->outm = 0;\n\taa->path_len = 0;\n\treturn aa;\n}\nvoid aln_free_AlnAln(AlnAln *aa)\n{\n\tfree(aa->path); free(aa->cigar32);\n\tfree(aa->out1); free(aa->out2); free(aa->outm);\n\tfree(aa);\n}\n\n/***************************/\n/* START OF common_align.c */\n/***************************/\n\n#define LOCAL_OVERFLOW_THRESHOLD 32000\n#define LOCAL_OVERFLOW_REDUCE 16000\n#define NT_LOCAL_SCORE int\n#define NT_LOCAL_SHIFT 16\n#define NT_LOCAL_MASK 0xffff\n\n#define SET_INF(s) (s).M = (s).I = (s).D = MINOR_INF;\n\n#define set_M(MM, cur, p, sc)\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif ((p)->M >= (p)->I) {\t\t\t\t\t\t\t\t\\\n\t\tif ((p)->M >= (p)->D) {\t\t\t\t\t\t\t\\\n\t\t\t(MM) = (p)->M + (sc); (cur)->Mt = FROM_M;\t\\\n\t\t} else {\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t(MM) = (p)->D + (sc); (cur)->Mt = FROM_D;\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t} else {\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif ((p)->I > (p)->D) {\t\t\t\t\t\t\t\\\n\t\t\t(MM) = (p)->I + (sc); (cur)->Mt = FROM_I;\t\\\n\t\t} else {\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t(MM) = (p)->D + (sc); (cur)->Mt = FROM_D;\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n#define set_I(II, cur, p)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif ((p)->M - gap_open > (p)->I) {\t\t\t\t\t\\\n\t\t(cur)->It = FROM_M;\t\t\t\t\t\t\t\t\\\n\t\t(II) = (p)->M - gap_open - gap_ext;\t\t\t\t\\\n\t} else {\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(cur)->It = FROM_I;\t\t\t\t\t\t\t\t\\\n\t\t(II) = (p)->I - gap_ext;\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n#define set_end_I(II, cur, p)\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif (gap_end >= 0) {\t\t\t\t\t\t\t\t\t\\\n\t\tif ((p)->M - gap_open > (p)->I) {\t\t\t\t\\\n\t\t\t(cur)->It = FROM_M;\t\t\t\t\t\t\t\\\n\t\t\t(II) = (p)->M - gap_open - gap_end;\t\t\t\\\n\t\t} else {\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t(cur)->It = FROM_I;\t\t\t\t\t\t\t\\\n\t\t\t(II) = (p)->I - gap_end;\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t} else set_I(II, cur, p);\t\t\t\t\t\t\t\\\n}\n#define set_D(DD, cur, p)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif ((p)->M - gap_open > (p)->D) {\t\t\t\t\t\\\n\t\t(cur)->Dt = FROM_M;\t\t\t\t\t\t\t\t\\\n\t\t(DD) = (p)->M - gap_open - gap_ext;\t\t\t\t\\\n\t} else {\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(cur)->Dt = FROM_D;\t\t\t\t\t\t\t\t\\\n\t\t(DD) = (p)->D - gap_ext;\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n#define set_end_D(DD, cur, p)\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif (gap_end >= 0) {\t\t\t\t\t\t\t\t\t\\\n\t\tif ((p)->M - gap_open > (p)->D) {\t\t\t\t\\\n\t\t\t(cur)->Dt = FROM_M;\t\t\t\t\t\t\t\\\n\t\t\t(DD) = (p)->M - gap_open - gap_end;\t\t\t\\\n\t\t} else {\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t(cur)->Dt = FROM_D;\t\t\t\t\t\t\t\\\n\t\t\t(DD) = (p)->D - gap_end;\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t} else set_D(DD, cur, p);\t\t\t\t\t\t\t\\\n}\n\ntypedef struct\n{\n\tunsigned char Mt:3, It:2, Dt:2;\n} dpcell_t;\n\ntypedef struct\n{\n\tint M, I, D;\n} dpscore_t;\n\n/* build score profile for accelerating alignment, in theory */\nvoid aln_init_score_array(unsigned char *seq, int len, int row, int *score_matrix, int **s_array)\n{\n\tint *tmp, *tmp2, i, k;\n\tfor (i = 0; i != row; ++i) {\n\t\ttmp = score_matrix + i * row;\n\t\ttmp2 = s_array[i];\n\t\tfor (k = 0; k != len; ++k)\n\t\t\ttmp2[k] = tmp[seq[k]];\n\t}\n}\n/***************************\n * banded global alignment *\n ***************************/\nint aln_global_core(unsigned char *seq1, int len1, unsigned char *seq2, int len2, const AlnParam *ap,\n\t\t\t\t\tpath_t *path, int *path_len)\n{\n\tregister int i, j;\n\tdpcell_t **dpcell, *q;\n\tdpscore_t *curr, *last, *s;\n\tpath_t *p;\n\tint b1, b2, tmp_end;\n\tint *mat, end, max;\n\tunsigned char type, ctype;\n\n\tint gap_open, gap_ext, gap_end, b;\n\tint *score_matrix, N_MATRIX_ROW;\n\n\t/* initialize some align-related parameters. just for compatibility */\n\tgap_open = ap->gap_open;\n\tgap_ext = ap->gap_ext;\n\tgap_end = ap->gap_end;\n\tb = ap->band_width;\n\tscore_matrix = ap->matrix;\n\tN_MATRIX_ROW = ap->row;\n\t\n\tif (len1 == 0 || len2 == 0) {\n\t\t*path_len = 0;\n\t\treturn 0;\n\t}\n\t/* calculate b1 and b2 */\n\tif (len1 > len2) {\n\t\tb1 = len1 - len2 + b;\n\t\tb2 = b;\n\t} else {\n\t\tb1 = b;\n\t\tb2 = len2 - len1 + b;\n\t}\n\tif (b1 > len1) b1 = len1;\n\tif (b2 > len2) b2 = len2;\n\t--seq1; --seq2;\n\n\t/* allocate memory */\n\tend = (b1 + b2 <= len1)? (b1 + b2 + 1) : (len1 + 1);\n\tdpcell = (dpcell_t**)malloc(sizeof(dpcell_t*) * (len2 + 1));\n\tfor (j = 0; j <= len2; ++j)\n\t\tdpcell[j] = (dpcell_t*)malloc(sizeof(dpcell_t) * end);\n\tfor (j = b2 + 1; j <= len2; ++j)\n\t\tdpcell[j] -= j - b2;\n\tcurr = (dpscore_t*)malloc(sizeof(dpscore_t) * (len1 + 1));\n\tlast = (dpscore_t*)malloc(sizeof(dpscore_t) * (len1 + 1));\n\t\n\t/* set first row */\n\tSET_INF(*curr); curr->M = 0;\n\tfor (i = 1, s = curr + 1; i < b1; ++i, ++s) {\n\t\tSET_INF(*s);\n\t\tset_end_D(s->D, dpcell[0] + i, s - 1);\n\t}\n\ts = curr; curr = last; last = s;\n\n\t/* core dynamic programming, part 1 */\n\ttmp_end = (b2 < len2)? b2 : len2 - 1;\n\tfor (j = 1; j <= tmp_end; ++j) {\n\t\tq = dpcell[j]; s = curr; SET_INF(*s);\n\t\tset_end_I(s->I, q, last);\n\t\tend = (j + b1 <= len1 + 1)? (j + b1 - 1) : len1;\n\t\tmat = score_matrix + seq2[j] * N_MATRIX_ROW;\n\t\t++s; ++q;\n\t\tfor (i = 1; i != end; ++i, ++s, ++q) {\n\t\t\tset_M(s->M, q, last + i - 1, mat[seq1[i]]); /* this will change s->M ! */\n\t\t\tset_I(s->I, q, last + i);\n\t\t\tset_D(s->D, q, s - 1);\n\t\t}\n\t\tset_M(s->M, q, last + i - 1, mat[seq1[i]]);\n\t\tset_D(s->D, q, s - 1);\n\t\tif (j + b1 - 1 > len1) { /* bug fixed, 040227 */\n\t\t\tset_end_I(s->I, q, last + i);\n\t\t} else s->I = MINOR_INF;\n\t\ts = curr; curr = last; last = s;\n\t}\n\t/* last row for part 1, use set_end_D() instead of set_D() */\n\tif (j == len2 && b2 != len2 - 1) {\n\t\tq = dpcell[j]; s = curr; SET_INF(*s);\n\t\tset_end_I(s->I, q, last);\n\t\tend = (j + b1 <= len1 + 1)? (j + b1 - 1) : len1;\n\t\tmat = score_matrix + seq2[j] * N_MATRIX_ROW;\n\t\t++s; ++q;\n\t\tfor (i = 1; i != end; ++i, ++s, ++q) {\n\t\t\tset_M(s->M, q, last + i - 1, mat[seq1[i]]); /* this will change s->M ! */\n\t\t\tset_I(s->I, q, last + i);\n\t\t\tset_end_D(s->D, q, s - 1);\n\t\t}\n\t\tset_M(s->M, q, last + i - 1, mat[seq1[i]]);\n\t\tset_end_D(s->D, q, s - 1);\n\t\tif (j + b1 - 1 > len1) { /* bug fixed, 040227 */\n\t\t\tset_end_I(s->I, q, last + i);\n\t\t} else s->I = MINOR_INF;\n\t\ts = curr; curr = last; last = s;\n\t\t++j;\n\t}\n\n\t/* core dynamic programming, part 2 */\n\tfor (; j <= len2 - b2 + 1; ++j) {\n\t\tSET_INF(curr[j - b2]);\n\t\tmat = score_matrix + seq2[j] * N_MATRIX_ROW;\n\t\tend = j + b1 - 1;\n\t\tfor (i = j - b2 + 1, q = dpcell[j] + i, s = curr + i; i != end; ++i, ++s, ++q) {\n\t\t\tset_M(s->M, q, last + i - 1, mat[seq1[i]]);\n\t\t\tset_I(s->I, q, last + i);\n\t\t\tset_D(s->D, q, s - 1);\n\t\t}\n\t\tset_M(s->M, q, last + i - 1, mat[seq1[i]]);\n\t\tset_D(s->D, q, s - 1);\n\t\ts->I = MINOR_INF;\n\t\ts = curr; curr = last; last = s;\n\t}\n\n\t/* core dynamic programming, part 3 */\n\tfor (; j < len2; ++j) {\n\t\tSET_INF(curr[j - b2]);\n\t\tmat = score_matrix + seq2[j] * N_MATRIX_ROW;\n\t\tfor (i = j - b2 + 1, q = dpcell[j] + i, s = curr + i; i < len1; ++i, ++s, ++q) {\n\t\t\tset_M(s->M, q, last + i - 1, mat[seq1[i]]);\n\t\t\tset_I(s->I, q, last + i);\n\t\t\tset_D(s->D, q, s - 1);\n\t\t}\n\t\tset_M(s->M, q, last + len1 - 1, mat[seq1[i]]);\n\t\tset_end_I(s->I, q, last + i);\n\t\tset_D(s->D, q, s - 1);\n\t\ts = curr; curr = last; last = s;\n\t}\n\t/* last row */\n\tif (j == len2) {\n\t\tSET_INF(curr[j - b2]);\n\t\tmat = score_matrix + seq2[j] * N_MATRIX_ROW;\n\t\tfor (i = j - b2 + 1, q = dpcell[j] + i, s = curr + i; i < len1; ++i, ++s, ++q) {\n\t\t\tset_M(s->M, q, last + i - 1, mat[seq1[i]]);\n\t\t\tset_I(s->I, q, last + i);\n\t\t\tset_end_D(s->D, q, s - 1);\n\t\t}\n\t\tset_M(s->M, q, last + len1 - 1, mat[seq1[i]]);\n\t\tset_end_I(s->I, q, last + i);\n\t\tset_end_D(s->D, q, s - 1);\n\t\ts = curr; curr = last; last = s;\n\t}\n\n\t/* backtrace */\n\ti = len1; j = len2;\n\tq = dpcell[j] + i;\n\ts = last + len1;\n\tmax = s->M; type = q->Mt; ctype = FROM_M;\n\tif (s->I > max) { max = s->I; type = q->It; ctype = FROM_I; }\n\tif (s->D > max) { max = s->D; type = q->Dt; ctype = FROM_D; }\n\n\tp = path;\n\tp->ctype = ctype; p->i = i; p->j = j; /* bug fixed 040408 */\n\t++p;\n\tdo {\n\t\tswitch (ctype) {\n\t\t\tcase FROM_M: --i; --j; break;\n\t\t\tcase FROM_I: --j; break;\n\t\t\tcase FROM_D: --i; break;\n\t\t}\n\t\tq = dpcell[j] + i;\n\t\tctype = type;\n\t\tswitch (type) {\n\t\t\tcase FROM_M: type = q->Mt; break;\n\t\t\tcase FROM_I: type = q->It; break;\n\t\t\tcase FROM_D: type = q->Dt; break;\n\t\t}\n\t\tp->ctype = ctype; p->i = i; p->j = j;\n\t\t++p;\n\t} while (i || j);\n\t*path_len = p - path - 1;\n\t/* free memory */\n\tfor (j = b2 + 1; j <= len2; ++j)\n\t\tdpcell[j] += j - b2;\n\tfor (j = 0; j <= len2; ++j)\n\t\tfree(dpcell[j]);\n\tfree(dpcell);\n\tfree(curr); free(last);\n\t\n\treturn max;\n}\n/*************************************************\n * local alignment combined with banded strategy *\n *************************************************/\nint aln_local_core(unsigned char *seq1, int len1, unsigned char *seq2, int len2, const AlnParam *ap,\n\t\t\t\t   path_t *path, int *path_len, int _thres, int *_subo)\n{\n\tregister NT_LOCAL_SCORE *s;\n\tregister int i;\n\tint q, r, qr, tmp_len, qr_shift;\n\tint **s_array, *score_array;\n\tint e, f;\n\tint is_overflow, of_base;\n\tNT_LOCAL_SCORE *eh, curr_h, last_h, curr_last_h;\n\tint j, start_i, start_j, end_i, end_j;\n\tpath_t *p;\n\tint score_f, score_r, score_g;\n\tint start, end, max_score;\n\tint thres, *suba, *ss;\n\n\tint gap_open, gap_ext, b;\n\tint *score_matrix, N_MATRIX_ROW;\n\n\t/* initialize some align-related parameters. just for compatibility */\n\tgap_open = ap->gap_open;\n\tgap_ext = ap->gap_ext;\n\tb = ap->band_width;\n\tscore_matrix = ap->matrix;\n\tN_MATRIX_ROW = ap->row;\n\tthres = _thres > 0? _thres : -_thres;\n\n\tif (len1 == 0 || len2 == 0) return -1;\n\n\t/* allocate memory */\n\tsuba = (int*)malloc(sizeof(int) * (len2 + 1));\n\teh = (NT_LOCAL_SCORE*)malloc(sizeof(NT_LOCAL_SCORE) * (len1 + 1));\n\ts_array = (int**)malloc(sizeof(int*) * N_MATRIX_ROW);\n\tfor (i = 0; i != N_MATRIX_ROW; ++i)\n\t\ts_array[i] = (int*)malloc(sizeof(int) * len1);\n\t/* initialization */\n\taln_init_score_array(seq1, len1, N_MATRIX_ROW, score_matrix, s_array);\n\tq = gap_open;\n\tr = gap_ext;\n\tqr = q + r;\n\tqr_shift = (qr+1) << NT_LOCAL_SHIFT;\n\ttmp_len = len1 + 1;\n\tstart_i = start_j = end_i = end_j = 0;\n\tfor (i = 0, max_score = 0; i != N_MATRIX_ROW * N_MATRIX_ROW; ++i)\n\t\tif (max_score < score_matrix[i]) max_score = score_matrix[i];\n\t/* convert the coordinate */\n\t--seq1; --seq2;\n\tfor (i = 0; i != N_MATRIX_ROW; ++i) --s_array[i];\n\n\t/* forward dynamic programming */\n\tfor (i = 0, s = eh; i != tmp_len; ++i, ++s) *s = 0;\n\tscore_f = 0;\n\tis_overflow = of_base = 0;\n\tsuba[0] = 0;\n\tfor (j = 1, ss = suba + 1; j <= len2; ++j, ++ss) {\n\t\tint subo = 0;\n\t\tlast_h = f = 0;\n\t\tscore_array = s_array[seq2[j]];\n\t\tif (is_overflow) { /* adjust eh[] array if overflow occurs. */\n\t\t\t/* If LOCAL_OVERFLOW_REDUCE is too small, optimal alignment might be missed.\n\t\t\t * If it is too large, this block will be excuted frequently and therefore\n\t\t\t * slow down the whole program.\n\t\t\t * Acually, smaller LOCAL_OVERFLOW_REDUCE might also help to reduce the\n\t\t\t * number of assignments because it sets some cells to zero when overflow\n\t\t\t * happens. */\n\t\t\tint tmp, tmp2;\n\t\t\tscore_f -= LOCAL_OVERFLOW_REDUCE;\n\t\t\tof_base += LOCAL_OVERFLOW_REDUCE;\n\t\t\tis_overflow = 0;\n\t\t\tfor (i = 1, s = eh; i <= tmp_len; ++i, ++s) {\n\t\t\t\ttmp = *s >> NT_LOCAL_SHIFT; tmp2 = *s & NT_LOCAL_MASK;\n\t\t\t\tif (tmp2 < LOCAL_OVERFLOW_REDUCE) tmp2 = 0;\n\t\t\t\telse tmp2 -= LOCAL_OVERFLOW_REDUCE;\n\t\t\t\tif (tmp < LOCAL_OVERFLOW_REDUCE) tmp = 0;\n\t\t\t\telse tmp -= LOCAL_OVERFLOW_REDUCE;\n\t\t\t\t*s = (tmp << NT_LOCAL_SHIFT) | tmp2;\n\t\t\t}\n\t\t}\n\t\tfor (i = 1, s = eh; i != tmp_len; ++i, ++s) {\n\t\t\t/* prepare for calculate current h */\n\t\t\tcurr_h = (*s >> NT_LOCAL_SHIFT) + score_array[i];\n\t\t\tif (curr_h < 0) curr_h = 0;\n\t\t\tif (last_h > 0) { /* initialize f */\n\t\t\t\tf = (f > last_h - q)? f - r : last_h - qr;\n\t\t\t\tif (curr_h < f) curr_h = f;\n\t\t\t}\n\t\t\tif (*(s+1) >= qr_shift) { /* initialize e */\n\t\t\t\tcurr_last_h = *(s+1) >> NT_LOCAL_SHIFT;\n\t\t\t\te = ((*s & NT_LOCAL_MASK) > curr_last_h - q)? (*s & NT_LOCAL_MASK) - r : curr_last_h - qr;\n\t\t\t\tif (curr_h < e) curr_h = e;\n\t\t\t\t*s = (last_h << NT_LOCAL_SHIFT) | e;\n\t\t\t} else *s = last_h << NT_LOCAL_SHIFT; /* e = 0 */\n\t\t\tlast_h = curr_h;\n\t\t\tif (subo < curr_h) subo = curr_h;\n\t\t\tif (score_f < curr_h) {\n\t\t\t\tscore_f = curr_h; end_i = i; end_j = j;\n\t\t\t\tif (score_f > LOCAL_OVERFLOW_THRESHOLD) is_overflow = 1;\n\t\t\t}\n\t\t}\n\t\t*s = last_h << NT_LOCAL_SHIFT;\n\t\t*ss = subo + of_base;\n\t}\n\tscore_f += of_base;\n\n\tif (score_f < thres) { /* no matching residue at all, 090218 */\n\t\t*path_len = 0;\n\t\tgoto end_func;\n\t}\n\tif (path == 0) goto end_func; /* skip path-filling */\n\n\t/* reverse dynamic programming */\n\tfor (i = end_i, s = eh + end_i; i >= 0; --i, --s) *s = 0;\n\tif (end_i == 0 || end_j == 0) goto end_func; /* no local match */\n\tscore_r = score_matrix[seq1[end_i] * N_MATRIX_ROW + seq2[end_j]];\n\tis_overflow = of_base = 0;\n\tstart_i = end_i; start_j = end_j;\n\teh[end_i] = ((NT_LOCAL_SCORE)(qr + score_r)) << NT_LOCAL_SHIFT; /* in order to initialize f and e, 040408 */\n\tstart = end_i - 1;\n\tend = end_i - 3;\n\tif (end <= 0) end = 0;\n\n\t/* second pass DP can be done in a band, speed will thus be enhanced */\n\tfor (j = end_j - 1; j != 0; --j) {\n\t\tlast_h = f = 0;\n\t\tscore_array = s_array[seq2[j]];\n\t\tif (is_overflow) { /* adjust eh[] array if overflow occurs. */\n\t\t\tint tmp, tmp2;\n\t\t\tscore_r -= LOCAL_OVERFLOW_REDUCE;\n\t\t\tof_base += LOCAL_OVERFLOW_REDUCE;\n\t\t\tis_overflow = 0;\n\t\t\tfor (i = start, s = eh + start + 1; i >= end; --i, --s) {\n\t\t\t\ttmp = *s >> NT_LOCAL_SHIFT; tmp2 = *s & NT_LOCAL_MASK;\n\t\t\t\tif (tmp2 < LOCAL_OVERFLOW_REDUCE) tmp2 = 0;\n\t\t\t\telse tmp2 -= LOCAL_OVERFLOW_REDUCE;\n\t\t\t\tif (tmp < LOCAL_OVERFLOW_REDUCE) tmp = 0;\n\t\t\t\telse tmp -= LOCAL_OVERFLOW_REDUCE;\n\t\t\t\t*s = (tmp << NT_LOCAL_SHIFT) | tmp2;\n\t\t\t}\n\t\t}\n\t\tfor (i = start, s = eh + start + 1; i != end; --i, --s) {\n\t\t\t/* prepare for calculate current h */\n\t\t\tcurr_h = (*s >> NT_LOCAL_SHIFT) + score_array[i];\n\t\t\tif (curr_h < 0) curr_h = 0;\n\t\t\tif (last_h > 0) { /* initialize f */\n\t\t\t\tf = (f > last_h - q)? f - r : last_h - qr;\n\t\t\t\tif (curr_h < f) curr_h = f;\n\t\t\t}\n\t\t\tcurr_last_h = *(s-1) >> NT_LOCAL_SHIFT;\n\t\t\te = ((*s & NT_LOCAL_MASK) > curr_last_h - q)? (*s & NT_LOCAL_MASK) - r : curr_last_h - qr;\n\t\t\tif (e < 0) e = 0;\n\t\t\tif (curr_h < e) curr_h = e;\n\t\t\t*s = (last_h << NT_LOCAL_SHIFT) | e;\n\t\t\tlast_h = curr_h;\n\t\t\tif (score_r < curr_h) {\n\t\t\t\tscore_r = curr_h; start_i = i; start_j = j;\n\t\t\t\tif (score_r + of_base - qr == score_f) {\n\t\t\t\t\tj = 1; break;\n\t\t\t\t}\n\t\t\t\tif (score_r > LOCAL_OVERFLOW_THRESHOLD) is_overflow = 1;\n\t\t\t}\n\t\t}\n\t\t*s = last_h << NT_LOCAL_SHIFT;\n\t\t/* recalculate start and end, the boundaries of the band */\n\t\tif ((eh[start] >> NT_LOCAL_SHIFT) <= qr) --start;\n\t\tif (start <= 0) start = 0;\n\t\tend = start_i - (start_j - j) - (score_r + of_base + (start_j - j) * max_score) / r - 1;\n\t\tif (end <= 0) end = 0;\n\t}\n\n\tif (_subo) {\n\t\tint tmp2 = 0, tmp = (int)(start_j - .33 * (end_j - start_j) + .499);\n\t\tfor (j = 1; j <= tmp; ++j)\n\t\t\tif (tmp2 < suba[j]) tmp2 = suba[j];\n\t\ttmp = (int)(end_j + .33 * (end_j - start_j) + .499);\n\t\tfor (j = tmp; j <= len2; ++j)\n\t\t\tif (tmp2 < suba[j]) tmp2 = suba[j];\n\t\t*_subo = tmp2;\n\t}\n\n\tif (path_len == 0) {\n\t\tpath[0].i = start_i; path[0].j = start_j;\n\t\tpath[1].i = end_i; path[1].j = end_j;\n\t\tgoto end_func;\n\t}\n\n\tscore_r += of_base;\n\tscore_r -= qr;\n\n#ifdef DEBUG\n\t/* this seems not a bug */\n\tif (score_f != score_r)\n\t\tfprintf(stderr, \"[aln_local_core] unknown flaw occurs: score_f(%d) != score_r(%d)\\n\", score_f, score_r);\n#endif\n\n\tif (_thres > 0) { /* call global alignment to fill the path */\n\t\tscore_g = 0;\n\t\tj = (end_i - start_i > end_j - start_j)? end_i - start_i : end_j - start_j;\n\t\t++j; /* j is the maximum band_width */\n\t\tfor (i = ap->band_width;; i <<= 1) {\n\t\t\tAlnParam ap_real = *ap;\n\t\t\tap_real.gap_end = -1;\n\t\t\tap_real.band_width = i;\n\t\t\tscore_g = aln_global_core(seq1 + start_i, end_i - start_i + 1, seq2 + start_j,\n\t\t\t\t\t\t\t\t\t  end_j - start_j + 1, &ap_real, path, path_len);\n\t\t\tif (score_g == score_r || score_f == score_g) break;\n\t\t\tif (i > j) break;\n\t\t}\n\t\tif (score_r > score_g && score_f > score_g) {\n\t\t\tfprintf(stderr, \"[aln_local_core] Potential bug: (%d,%d) > %d\\n\", score_f, score_r, score_g);\n\t\t\tscore_f = score_r = -1;\n\t\t} else score_f = score_g;\n\n\t\t/* convert coordinate */\n\t\tfor (p = path + *path_len - 1; p >= path; --p) {\n\t\t\tp->i += start_i - 1;\n\t\t\tp->j += start_j - 1;\n\t\t}\n\t} else { /* just store the start and end */\n\t\t*path_len = 2;\n\t\tpath[1].i = start_i; path[1].j = start_j;\n\t\tpath->i = end_i; path->j = end_j;\n\t}\n\nend_func:\n\t/* free */\n\tfree(eh); free(suba);\n\t/* Suppress -Wfree-nonheap-object locally: the ++s_array[i] below\n\t * UNDOES the earlier --s_array[i] at line ~575 (done so the DP\n\t * code could use 1-based indexing), so after the increment\n\t * s_array[i] points at the original malloc() return. GCC 13+ sees\n\t * the explicit pointer arithmetic next to free() and warns even\n\t * though the math is a round-trip; the runtime behavior is\n\t * correct. Refactoring to avoid the offset trick would touch the\n\t * entire aln_local_core DP body, which isn't worth it for a\n\t * vendored legacy file. */\n#if defined(__GNUC__)\n#  pragma GCC diagnostic push\n#  pragma GCC diagnostic ignored \"-Wfree-nonheap-object\"\n#endif\n\tfor (i = 0; i != N_MATRIX_ROW; ++i) {\n\t\t++s_array[i];\n\t\tfree(s_array[i]);\n\t}\n#if defined(__GNUC__)\n#  pragma GCC diagnostic pop\n#endif\n\tfree(s_array);\n\treturn score_f;\n}\nAlnAln *aln_stdaln_aux(const char *seq1, const char *seq2, const AlnParam *ap,\n\t\t\t\t\t   int type, int thres, int len1, int len2)\n{\n\tunsigned char *seq11, *seq22;\n\tint score;\n\tint i, j, l;\n\tpath_t *p;\n\tchar *out1, *out2, *outm;\n\tAlnAln *aa;\n\n\tif (len1 < 0) len1 = strlen(seq1);\n\tif (len2 < 0) len2 = strlen(seq2);\n\n\taa = aln_init_AlnAln();\n\tseq11 = (unsigned char*)malloc(sizeof(unsigned char) * len1);\n\tseq22 = (unsigned char*)malloc(sizeof(unsigned char) * len2);\n\taa->path = (path_t*)malloc(sizeof(path_t) * (len1 + len2 + 1));\n\n\tif (ap->row < 10) { /* 4-nucleotide alignment */\n\t\tfor (i = 0; i < len1; ++i)\n\t\t\tseq11[i] = aln_nt4_table[(int)seq1[i]];\n\t\tfor (j = 0; j < len2; ++j)\n\t\t\tseq22[j] = aln_nt4_table[(int)seq2[j]];\n\t} else if (ap->row < 20) { /* 16-nucleotide alignment */\n\t\tfor (i = 0; i < len1; ++i)\n\t\t\tseq11[i] = aln_nt16_table[(int)seq1[i]];\n\t\tfor (j = 0; j < len2; ++j)\n\t\t\tseq22[j] = aln_nt16_table[(int)seq2[j]];\n\t} else { /* amino acids */\n\t\tfor (i = 0; i < len1; ++i)\n\t\t\tseq11[i] = aln_aa_table[(int)seq1[i]];\n\t\tfor (j = 0; j < len2; ++j)\n\t\t\tseq22[j] = aln_aa_table[(int)seq2[j]];\n\t}\n\t\n\tif (type == ALN_TYPE_GLOBAL) score = aln_global_core(seq11, len1, seq22, len2, ap, aa->path, &aa->path_len);\n\telse if (type == ALN_TYPE_LOCAL) score = aln_local_core(seq11, len1, seq22, len2, ap, aa->path, &aa->path_len, thres, &aa->subo);\n\telse if (type == ALN_TYPE_EXTEND)  score = aln_extend_core(seq11, len1, seq22, len2, ap, aa->path, &aa->path_len, 1, 0);\n\telse {\n\t\tfree(seq11); free(seq22); free(aa->path);\n\t\taln_free_AlnAln(aa);\n\t\treturn 0;\n\t}\n\taa->score = score;\n\n\tif (thres > 0) {\n\t\tout1 = aa->out1 = (char*)malloc(sizeof(char) * (aa->path_len + 1));\n\t\tout2 = aa->out2 = (char*)malloc(sizeof(char) * (aa->path_len + 1));\n\t\toutm = aa->outm = (char*)malloc(sizeof(char) * (aa->path_len + 1));\n\n\t\t--seq1; --seq2;\n\t\t--seq11; --seq22;\n\n\t\tp = aa->path + aa->path_len - 1;\n\n\t\tfor (l = 0; p >= aa->path; --p, ++l) {\n\t\t\tswitch (p->ctype) {\n\t\t\tcase FROM_M: out1[l] = seq1[p->i]; out2[l] = seq2[p->j];\n\t\t\t\toutm[l] = (seq11[p->i] == seq22[p->j] && seq11[p->i] != ap->row)? '|' : ' ';\n\t\t\t\tbreak;\n\t\t\tcase FROM_I: out1[l] = '-'; out2[l] = seq2[p->j]; outm[l] = ' '; break;\n\t\t\tcase FROM_D: out1[l] = seq1[p->i]; out2[l] = '-'; outm[l] = ' '; break;\n\t\t\t}\n\t\t}\n\t\tout1[l] = out2[l] = outm[l] = '\\0';\n\t\t++seq11; ++seq22;\n\t}\n\n\tfree(seq11);\n\tfree(seq22);\n\n\tp = aa->path + aa->path_len - 1;\n\taa->start1 = p->i? p->i : 1;\n\taa->end1 = aa->path->i;\n\taa->start2 = p->j? p->j : 1;\n\taa->end2 = aa->path->j;\n\taa->cigar32 = aln_path2cigar32(aa->path, aa->path_len, &aa->n_cigar);\n\n\treturn aa;\n}\nAlnAln *aln_stdaln(const char *seq1, const char *seq2, const AlnParam *ap, int type, int thres)\n{\n\treturn aln_stdaln_aux(seq1, seq2, ap, type, thres, -1, -1);\n}\n\n/* for backward compatibility */\nuint16_t *aln_path2cigar(const path_t *path, int path_len, int *n_cigar)\n{\n\tuint32_t *cigar32;\n\tuint16_t *cigar;\n\tint i;\n\tcigar32 = aln_path2cigar32(path, path_len, n_cigar);\n\tcigar = (uint16_t*)cigar32;\n\tfor (i = 0; i < *n_cigar; ++i)\n\t\tcigar[i] = (cigar32[i]&0xf)<<14 | (cigar32[i]>>4&0x3fff);\n\treturn cigar;\n}\n\n/* newly added functions (2009-07-21) */\n\nint aln_extend_core(unsigned char *seq1, int len1, unsigned char *seq2, int len2, const AlnParam *ap,\n\t\t\t\t\tpath_t *path, int *path_len, int G0, uint8_t *_mem)\n{\n\tint q, r, qr, tmp_len;\n\tint32_t **s_array, *score_array;\n\tint is_overflow, of_base;\n\tuint32_t *eh;\n\tint i, j, end_i, end_j;\n\tint score, start, end;\n\tint *score_matrix, N_MATRIX_ROW;\n\tuint8_t *mem, *_p;\n\n\t/* initialize some align-related parameters. just for compatibility */\n\tq = ap->gap_open;\n\tr = ap->gap_ext;\n\tqr = q + r;\n\tscore_matrix = ap->matrix;\n\tN_MATRIX_ROW = ap->row;\n\n\tif (len1 == 0 || len2 == 0) return -1;\n\n\t/* allocate memory */\n\tmem = _mem? _mem : calloc((len1 + 2) * (N_MATRIX_ROW + 1), 4);\n\t_p = mem;\n\teh = (uint32_t*)_p, _p += 4 * (len1 + 2);\n\ts_array = calloc(N_MATRIX_ROW, sizeof(void*));\n\tfor (i = 0; i != N_MATRIX_ROW; ++i)\n\t\ts_array[i] = (int32_t*)_p, _p += 4 * len1;\n\t/* initialization */\n\taln_init_score_array(seq1, len1, N_MATRIX_ROW, score_matrix, s_array);\n\ttmp_len = len1 + 1;\n\tstart = 1; end = 2;\n\tend_i = end_j = 0;\n\tscore = 0;\n\tis_overflow = of_base = 0;\n\t/* convert the coordinate */\n\t--seq1; --seq2;\n\tfor (i = 0; i != N_MATRIX_ROW; ++i) --s_array[i];\n\n\t/* dynamic programming */\n\tmemset(eh, 0, 4 * (len1 + 2));\n\teh[1] = (uint32_t)G0<<16;\n\tfor (j = 1; j <= len2; ++j) {\n\t\tint _start, _end;\n\t\tint h1 = 0, f = 0;\n\t\tscore_array = s_array[seq2[j]];\n\t\t/* set start and end */\n\t\t_start = j - ap->band_width;\n\t\tif (_start < 1) _start = 1;\n\t\tif (_start > start) start = _start;\n\t\t_end = j + ap->band_width;\n\t\tif (_end > len1 + 1) _end = len1 + 1;\n\t\tif (_end < end) end = _end;\n\t\tif (start == end) break;\n\t\t/* adjust eh[] array if overflow occurs. */\n\t\tif (is_overflow) {\n\t\t\tint tmp, tmp2;\n\t\t\tscore -= LOCAL_OVERFLOW_REDUCE;\n\t\t\tof_base += LOCAL_OVERFLOW_REDUCE;\n\t\t\tis_overflow = 0;\n\t\t\tfor (i = start; i <= end; ++i) {\n\t\t\t\tuint32_t *s = &eh[i];\n\t\t\t\ttmp = *s >> 16; tmp2 = *s & 0xffff;\n\t\t\t\tif (tmp2 < LOCAL_OVERFLOW_REDUCE) tmp2 = 0;\n\t\t\t\telse tmp2 -= LOCAL_OVERFLOW_REDUCE;\n\t\t\t\tif (tmp < LOCAL_OVERFLOW_REDUCE) tmp = 0;\n\t\t\t\telse tmp -= LOCAL_OVERFLOW_REDUCE;\n\t\t\t\t*s = (tmp << 16) | tmp2;\n\t\t\t}\n\t\t}\n\t\t_start = _end = 0;\n\t\t/* the inner loop */\n\t\tfor (i = start; i < end; ++i) {\n\t\t\t/* At the beginning of each cycle:\n\t\t\t     eh[i] -> h[j-1,i-1]<<16 | e[j,i]\n\t\t\t\t f     -> f[j,i]\n\t\t\t\t h1    -> h[j,i-1]\n\t\t\t*/\n\t\t\tuint32_t *s = &eh[i];\n\t\t\tint h = (int)(*s >> 16);\n\t\t\tint e = *s & 0xffff; /* this is e[j,i] */\n\t\t\t*s = (uint32_t)h1 << 16; /* eh[i] now stores h[j,i-1]<<16 */\n\t\t\th += h? score_array[i] : 0; /* this is left_core() specific */\n\t\t\t/* calculate h[j,i]; don't need to test 0, as {e,f}>=0 */\n\t\t\th = h > e? h : e;\n\t\t\th = h > f? h : f; /* h now is h[j,i] */\n\t\t\th1 = h;\n\t\t\tif (h > 0) {\n\t\t\t\tif (_start == 0) _start = i;\n\t\t\t\t_end = i;\n\t\t\t\tif (score < h) {\n\t\t\t\t\tscore = h; end_i = i; end_j = j;\n\t\t\t\t\tif (score > LOCAL_OVERFLOW_THRESHOLD) is_overflow = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* calculate e[j+1,i] and f[j,i+1] */\n\t\t\th -= qr;\n\t\t\th = h > 0? h : 0;\n\t\t\te -= r;\n\t\t\te = e > h? e : h;\n\t\t\tf -= r;\n\t\t\tf = f > h? f : h;\n\t\t\t*s |= e;\n\t\t}\t\t\t\n\t\teh[end] = h1 << 16;\n\t\t/* recalculate start and end, the boundaries of the band */\n\t\tif (_end <= 0) break; /* no cell in this row has a positive score */\n\t\tstart = _start;\n\t\tend = _end + 3;\n\t}\n\n\tscore += of_base - 1;\n\tif (score <= 0) {\n\t\tif (path_len) *path_len = 0;\n\t\tgoto end_left_func;\n\t}\n\n\tif (path == 0) goto end_left_func;\n\n\tif (path_len == 0) {\n\t\tpath[0].i = end_i; path[0].j = end_j;\n\t\tgoto end_left_func;\n\t}\n\n\t{ /* call global alignment to fill the path */\n\t\tint score_g = 0;\n\t\tj = (end_i - 1 > end_j - 1)? end_i - 1 : end_j - 1;\n\t\t++j; /* j is the maximum band_width */\n\t\tfor (i = ap->band_width;; i <<= 1) {\n\t\t\tAlnParam ap_real = *ap;\n\t\t\tap_real.gap_end = -1;\n\t\t\tap_real.band_width = i;\n\t\t\tscore_g = aln_global_core(seq1 + 1, end_i, seq2 + 1, end_j, &ap_real, path, path_len);\n\t\t\tif (score == score_g) break;\n\t\t\tif (i > j) break;\n\t\t}\n\t\tif (score > score_g)\n\t\t\tfprintf(stderr, \"[aln_left_core] no suitable bandwidth: %d < %d\\n\", score_g, score);\n\t\tscore = score_g;\n\t}\n\nend_left_func:\n\t/* free */\n\tfree(s_array);\n\tif (!_mem) free(mem);\n\treturn score;\n}\n\nuint32_t *aln_path2cigar32(const path_t *path, int path_len, int *n_cigar)\n{\n\tint i, n;\n\tuint32_t *cigar;\n\tunsigned char last_type;\n\n\tif (path_len == 0 || path == 0) {\n\t\t*n_cigar = 0;\n\t\treturn 0;\n\t}\n\n\tlast_type = path->ctype;\n\tfor (i = n = 1; i < path_len; ++i) {\n\t\tif (last_type != path[i].ctype) ++n;\n\t\tlast_type = path[i].ctype;\n\t}\n\t*n_cigar = n;\n\tcigar = (uint32_t*)malloc(*n_cigar * 4);\n\n\tcigar[0] = 1u << 4 | path[path_len-1].ctype;\n\tlast_type = path[path_len-1].ctype;\n\tfor (i = path_len - 2, n = 0; i >= 0; --i) {\n\t\tif (path[i].ctype == last_type) cigar[n] += 1u << 4;\n\t\telse {\n\t\t\tcigar[++n] = 1u << 4 | path[i].ctype;\n\t\t\tlast_type = path[i].ctype;\n\t\t}\n\t}\n\n\treturn cigar;\n}\n\n#ifdef STDALN_MAIN\nint main()\n{\n\tAlnAln *aln_local, *aln_global, *aln_left;\n\tint i;\n\n\taln_local  = aln_stdaln(\"CGTGCGATGCactgCATACGGCTCGCCTAGATCA\", \"AAGGGATGCTCTGCATCgCTCGGCTAGCTGT\", &aln_param_blast, 0, 1);\n\taln_global = aln_stdaln(\"CGTGCGATGCactgCATACGGCTCGCCTAGATCA\", \"AAGGGATGCTCTGCATCGgCTCGGCTAGCTGT\", &aln_param_blast, 1, 1);\n//\taln_left   = aln_stdaln(     \"GATGCACTGCATACGGCTCGCCTAGATCA\",     \"GATGCTCTGCATCGgCTCGGCTAGCTGT\", &aln_param_blast, 2, 1);\n\taln_left   = aln_stdaln(\"CACCTTCGACTCACGTCTCATTCTCGGAGTCGAGTGGACGGTCCCTCATACACGAACAGGTTC\",\n\t\t\t\t\t\t\t\"CACCTTCGACTTTCACCTCTCATTCTCGGACTCGAGTGGACGGTCCCTCATCCAAGAACAGGGTCTGTGAAA\", &aln_param_blast, 2, 1);\n\n\tprintf(\">%d,%d\\t%d,%d\\n\", aln_local->start1, aln_local->end1, aln_local->start2, aln_local->end2);\n\tprintf(\"%s\\n%s\\n%s\\n\", aln_local->out1, aln_local->outm, aln_local->out2);\n\n\tprintf(\">%d,%d\\t%d,%d\\t\", aln_global->start1, aln_global->end1, aln_global->start2, aln_global->end2);\n\tfor (i = 0; i != aln_global->n_cigar; ++i)\n\t\tprintf(\"%d%c\", aln_global->cigar32[i]>>4, \"MID\"[aln_global->cigar32[i]&0xf]);\n\tprintf(\"\\n%s\\n%s\\n%s\\n\", aln_global->out1, aln_global->outm, aln_global->out2);\n\n\tprintf(\">%d\\t%d,%d\\t%d,%d\\t\", aln_left->score, aln_left->start1, aln_left->end1, aln_left->start2, aln_left->end2);\n\tfor (i = 0; i != aln_left->n_cigar; ++i)\n\t\tprintf(\"%d%c\", aln_left->cigar32[i]>>4, \"MID\"[aln_left->cigar32[i]&0xf]);\n\tprintf(\"\\n%s\\n%s\\n%s\\n\", aln_left->out1, aln_left->outm, aln_left->out2);\n\n\taln_free_AlnAln(aln_local);\n\taln_free_AlnAln(aln_global);\n\taln_free_AlnAln(aln_left);\n\treturn 0;\n}\n#endif\n"
  },
  {
    "path": "src/SGA/Util/stdaln.h",
    "content": "/* The MIT License\n\n   Copyright (c) 2003-2006, 2008, by Heng Li <lh3lh3@gmail.com>\n\n   Permission is hereby granted, free of charge, to any person obtaining\n   a copy of this software and associated documentation files (the\n   \"Software\"), to deal in the Software without restriction, including\n   without limitation the rights to use, copy, modify, merge, publish,\n   distribute, sublicense, and/or sell copies of the Software, and to\n   permit persons to whom the Software is furnished to do so, subject to\n   the following conditions:\n\n   The above copyright notice and this permission notice shall be\n   included in all copies or substantial portions of the Software.\n\n   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n   SOFTWARE.\n*/\n\n/*\n  2009-07-23, 0.10.0\n\n  - Use 32-bit to store CIGAR\n\n  - Report suboptimal aligments\n\n  - Implemented half-fixed-half-open DP\n\n  2009-04-26, 0.9.10\n\n  - Allow to set a threshold for local alignment\n\n  2009-02-18, 0.9.9\n\n  - Fixed a bug when no residue matches\n\n  2008-08-04, 0.9.8\n\n  - Fixed the wrong declaration of aln_stdaln_aux()\n\n  - Avoid 0 coordinate for global alignment\n\n  2008-08-01, 0.9.7\n\n  - Change gap_end penalty to 5 in aln_param_bwa\n\n  - Add function to convert path_t to the CIGAR format\n\n  2008-08-01, 0.9.6\n\n  - The first gap now costs (gap_open+gap_ext), instead of\n    gap_open. Scoring systems are modified accordingly.\n\n  - Gap end is now correctly handled. Previously it is not correct.\n\n  - Change license to MIT.\n\n */\n\n#ifndef LH3_STDALN_H_\n#define LH3_STDALN_H_\n\n\n#define STDALN_VERSION 0.11.0\n\n#include <stdint.h>\n\n#define FROM_M 0\n#define FROM_I 1\n#define FROM_D 2\n#define FROM_S 3\n\n#define ALN_TYPE_LOCAL  0\n#define ALN_TYPE_GLOBAL 1\n#define ALN_TYPE_EXTEND 2\n\n/* This is the smallest integer. It might be CPU-dependent in very RARE cases. */\n#define MINOR_INF -1073741823\n\ntypedef struct\n{\n\tint gap_open;\n\tint gap_ext;\n\tint gap_end;\n\n\tint *matrix;\n\tint row;\n\tint band_width;\n} AlnParam;\n\ntypedef struct\n{\n\tint i, j;\n\tunsigned char ctype;\n} path_t;\n\ntypedef struct\n{\n\tpath_t *path; /* for advanced users... :-) */\n\tint path_len; /* for advanced users... :-) */\n\tint start1, end1; /* start and end of the first sequence, coordinations are 1-based */\n\tint start2, end2; /* start and end of the second sequence, coordinations are 1-based */\n\tint score, subo; /* score */\n\n\tchar *out1, *out2; /* print them, and then you will know */\n\tchar *outm;\n\n\tint n_cigar;\n\tuint32_t *cigar32;\n} AlnAln;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\tAlnAln *aln_stdaln_aux(const char *seq1, const char *seq2, const AlnParam *ap,\n\t\t\t\t\t\t   int type, int do_align, int len1, int len2);\n\tAlnAln *aln_stdaln(const char *seq1, const char *seq2, const AlnParam *ap, int type, int do_align);\n\tvoid aln_free_AlnAln(AlnAln *aa);\n\n\tint aln_global_core(unsigned char *seq1, int len1, unsigned char *seq2, int len2, const AlnParam *ap,\n\t\t\t\t\t\tpath_t *path, int *path_len);\n\tint aln_local_core(unsigned char *seq1, int len1, unsigned char *seq2, int len2, const AlnParam *ap,\n\t\t\t\t\t   path_t *path, int *path_len, int _thres, int *_subo);\n\tint aln_extend_core(unsigned char *seq1, int len1, unsigned char *seq2, int len2, const AlnParam *ap,\n\t\t\t\t\t\tpath_t *path, int *path_len, int G0, uint8_t *_mem);\n\tuint16_t *aln_path2cigar(const path_t *path, int path_len, int *n_cigar);\n\tuint32_t *aln_path2cigar32(const path_t *path, int path_len, int *n_cigar);\n\n#ifdef __cplusplus\n}\n#endif\n\n/********************\n * global variables *\n ********************/\n\nextern AlnParam aln_param_bwa;   /* = { 37,  9,  0, aln_sm_maq, 5, 50 }; */\nextern AlnParam aln_param_blast; /* = {  5,  2,  2, aln_sm_blast, 5, 50 }; */\nextern AlnParam aln_param_nt2nt; /* = { 10,  2,  2, aln_sm_nt, 16, 75 }; */\nextern AlnParam aln_param_aa2aa; /* = { 20, 19, 19, aln_sm_read, 16, 75 }; */\nextern AlnParam aln_param_rd2rd; /* = { 12,  2,  2, aln_sm_blosum62, 22, 50 }; */\n\n/* common nucleotide score matrix for 16 bases */\nextern int           aln_sm_nt[], aln_sm_bwa[];\n\n/* BLOSUM62 and BLOSUM45 */\nextern int           aln_sm_blosum62[], aln_sm_blosum45[];\n\n/* common read for 16 bases. note that read alignment is quite different from common nucleotide alignment */\nextern int           aln_sm_read[];\n\n/* human-mouse score matrix for 4 bases */\nextern int           aln_sm_hs[];\n\n#endif\n"
  },
  {
    "path": "src/svaba/AlignedContig.cpp",
    "content": "#include \"AlignedContig.h\"\n#include \"SvabaUtils.h\"\n#include \"ContigAlignmentScore.h\"\n\n#include <cctype>\n#include <iomanip>\n#include <sstream>\n#include <unordered_set>\n\n// SvABA2.0: the old ASCII emitter (printToAlignmentsFile → alignments.txt.gz)\n// and its support header PlottedRead.h have been removed. All alignment-dump\n// data now goes through the structured r2c TSV (printToR2CTsv /\n// r2cTsvHeader), which viewers parse and re-plot on demand.\n\n// bav is all of the alignments of the contig to the reference\nAlignedContig::AlignedContig(BamRecordPtrVector& bav,\n\t\t\t     const GenomicRegion& region, \n\t\t\t     const SvabaSharedConfig* sc_) : sc(sc_) {\n  \n  if (!bav.size())\n    return;\n  \n  // find the longest sequence, taking the first one.\n  // make sure sequence dir is set to same as first alignment\n  for (const auto& i : bav) {\n    if (i->Sequence().length() > m_seq.length()) {\n      if (i->ReverseFlag() == bav.front()->ReverseFlag()) {\n\tm_seq = i->Sequence();\n      } else {\n\tm_seq = i->Sequence();\n\tSeqLib::rcomplement(m_seq);\n      }\n    }\n  }\n  \n  // set the sequence. Convention is store as it came off\n  // the assembler for first alignment\n  if (bav.front()->ReverseFlag()) \n    SeqLib::rcomplement(m_seq);\n\n  // instantiate coverage of reads on the contig\n  aligned_coverage = std::vector<int>(m_seq.length(), 0);\n  \n  // find the number of primary alignments\n  size_t num_align = 0;\n  for (const auto& i : bav)\n    if (!i->SecondaryFlag())\n      ++num_align;\n  \n  // make the individual alignments and add\n  for (auto& i : bav) {\n    bool flip = (m_seq != i->Sequence()); // if the seq was flipped, need to flip the AlignmentFragment\n    if (!i->SecondaryFlag()) {\n      m_frag_v.emplace_back(AlignmentFragment(i, flip, region, sc));\n      m_frag_v.back().num_align = num_align;\n    } else if (m_frag_v.size()) {\n      m_frag_v.back().secondaries.emplace_back(AlignmentFragment(i, flip, region, sc));\n    } else {\n      throw std::runtime_error(\"Secondary alignment encountered with no primary.\");\n    }\n\n    // set the sequence for the aligned contig in the flipped (or not) orientation\n    //m_frag_v.back().m_seq = m_seq;\n    \n    // set the aligned coverage\n    SeqLib::Cigar cig = i->GetCigar();\n    size_t p = 0;\n    if (!i->SecondaryFlag())\n      for (auto& c : cig) {\n\tfor (size_t j = 0; j < c.Length(); ++j) {\n\t  if (c.Type() == 'M' || c.Type() == 'I')  // consumes contig and not clip\n\t    ++aligned_coverage[p];\n\t  if (c.ConsumesQuery() || c.Type() == 'H') // consumes contig, move iterator\n\t    ++p;\n\t}\n      }\n  }\n  \n  if (!m_frag_v.size())\n    throw std::runtime_error(\"AlignedContig - no AlignmentFragments made\");\n\n  // extract the indels on primary alignments\n  for (auto& f : m_frag_v) \n    f.SetIndels();\n\n  // sort fragments by order on fwd-strand contig\n  // underneath this calls AlignmentFragment::operator<\n  // which is defined based on the \"flip-convention\"\n  // alignment position on the contig, NOT on the genome\n  std::sort(m_frag_v.begin(), m_frag_v.end());\n  \n  // get rearrangement breaks out of it\n  setMultiMapBreakPairs();\n  \n  // filter indels that land too close to a multi-map break\n  //filterIndelsAtMultiMapSites(5);\n}\n\n// void AlignedContig::filterIndelsAtMultiMapSites(size_t buff) {\n  \n//   if (m_frag_v.size() < 2)\n//     return;\n  \n//   // make the ranges ON CONIG for the multimaps\n//   SeqLib::GRC grc;\n//   if (m_global_bp->b1.cpos > m_global_bp->b2.cpos) {\n//     grc.add(SeqLib::GenomicRegion(0, m_global_bp->b2.cpos-buff, m_global_bp->b1.cpos+buff)); // homology\n//   }\n//     else {\n//       grc.add(SeqLib::GenomicRegion(0, m_global_bp->b1.cpos-buff, m_global_bp->b2.cpos+buff)); // insertion\t\n//     }    \n    \n//     for (auto& i : m_local_breaks) {\n//       if (i.b1.cpos > i.b2.cpos) {\n// \tgrc.add(SeqLib::GenomicRegion(0, i.b2.cpos-buff, i.b1.cpos+buff)); // homology\n//       }\n//       else {\n// \tgrc.add(SeqLib::GenomicRegion(0, i.b1.cpos-buff, i.b2.cpos+buff)); // insertion\t\n//       }\n//     }\n//     grc.CreateTreeMap();\n\n//     // check if \n//     for (auto& i : m_frag_v) {\n//       BPVec new_indel_vec;\n//       for (auto& b : i.m_indel_breaks) {\n// \tif (!grc.CountOverlaps(SeqLib::GenomicRegion(0, b.b1.cpos, b.b2.cpos)))\n// \t  new_indel_vec.push_back(b);\n//       }\n//       i.m_indel_breaks = new_indel_vec;\n//     }\n    \n//   }\n  \nSeqLib::GenomicRegionVector AlignedContig::getAsGenomicRegionVector() const {\n  SeqLib::GenomicRegionVector g;\n  for (auto& i : m_frag_v)\n    g.push_back(i.m_align->AsGenomicRegion());\n  return g;\n}\n\n// void AlignedContig::printContigFasta(std::ofstream& os) const {\n//   os << \">\" << getContigName() << std::endl;\n//   os << getSequence() << std::endl;\n// }\n\nvoid AlignedContig::blacklist(SeqLib::GRC &grv) {\n  \n  // loop through the indel breaks and blacklist\n  for (auto& i : m_frag_v) \n    for (auto& j : i.m_indel_breaks) \n      j->checkBlacklist(grv);\n}\n\nvoid AlignedContig::splitCoverage() { \n  \n  // for (auto& i : m_local_breaks_secondaries) \n  //   i.splitCoverage(m_bamreads);\n  \n  // for (auto& i : m_global_bp_secondaries) \n  //   i->splitCoverage(m_bamreads);\n  \n  for (auto& i : m_frag_v) \n    for (auto& j : i.m_indel_breaks) \n      j->splitCoverage(m_bamreads);\n  \n  for (auto& i : m_local_breaks) \n    i->splitCoverage(m_bamreads);\n  \n  if (m_global_bp) \n    m_global_bp->splitCoverage(m_bamreads);\n  \n}\n\n// ---------------------------------------------------------------------------\n// SvABA2.0: structured re-plot format.\n//\n// printToR2CTsv emits this contig's info in a tab-separated form that\n// downstream tools (e.g. viewer/bps_explorer.html) parse and re-plot on\n// demand. It's the successor to the old printToAlignmentsFile() /\n// alignments.txt.gz pre-rendered ASCII output, which has been removed.\n//\n// The schema is record-type discriminated: one \"contig\" row per contig,\n// then one \"read\" row per r2c-aligned read, all sharing a `contig_name`\n// key. Contig-only fields (sequence, fragments, BPs, read count) are\n// populated on the contig row and \"NA\" on read rows; read-only fields\n// are populated on read rows and \"NA\" on the contig row.\n//\n// Anything that was encoded only implicitly in the old ASCII art (e.g.\n// fragment orientation via '>' vs '<', or leading/trailing soft-clip\n// bases via lowercase letters) is here available as an explicit field\n// so viewers don't have to reverse-engineer it.\n// ---------------------------------------------------------------------------\n\nnamespace {\n// TSV-escape: replace tab/CR/LF with spaces so a single column value can't\n// break row parsing. Used everywhere we emit free-form text into a cell.\nstd::string r2cEscape(const std::string& s) {\n  std::string out;\n  out.reserve(s.size());\n  for (char c : s) {\n    if (c == '\\t' || c == '\\n' || c == '\\r') out.push_back(' ');\n    else out.push_back(c);\n  }\n  return out;\n}\n\n// Serialize a SeqLib::Cigar to the standard string form (e.g. \"30M1D15M\")\n// without relying on the overload of operator<< (which is fine but writes\n// through a stream; we want a plain std::string for cell composition).\nstd::string r2cCigarString(const SeqLib::Cigar& c) {\n  std::ostringstream oss;\n  for (auto it = c.begin(); it != c.end(); ++it)\n    oss << it->Length() << static_cast<char>(it->Type());\n  return oss.str();\n}\n}  // namespace\n\n// Header line for the r2c TSV. Callers should write this once before any\n// rows. Not a row itself — do not prefix with a comment char.\nstd::string AlignedContig::r2cTsvHeader() {\n  static const char* const kCols[] = {\n    \"record_type\",        // \"contig\" or \"read\"\n    \"contig_name\",        // shared key: group reads back to their contig\n    \"contig_len\",         // set on both row types for convenience\n    \"contig_seq\",         // assembled sequence     [contig only; NA on read]\n    \"frags\",              // BWA hits of contig vs. ref [contig only]\n    \"bps\",                // breakpoints on this contig  [contig only]\n    \"n_reads\",            // # read rows that follow this contig [contig only]\n    // read-only:\n    \"read_id\",            // svabaRead UniqueName (sample-prefixed qname)\n    \"read_chrom\",         // chromosome the read originally mapped to (BAM)\n    \"read_pos\",           // BAM alignment position\n    \"read_flag\",          // 0 if r2c forward, 16 if reverse-complemented\n    \"r2c_cigar\",          // read-to-contig CIGAR (e.g. \"24M1D15M7I1M7D103M\")\n    \"r2c_start\",          // start_on_contig (0-based)\n    \"r2c_rc\",             // 0/1: was r2c alignment reverse-complemented?\n    \"r2c_nm\",             // NM (mismatch count) from r2c alignment\n    \"support\",            // \"split\" | \"disc\" | \"both\" | \"none\" (categorical)\n    // SvABA2.0: unambiguous per-BP support lists. The categorical\n    // `support` above is the OR over these — use these columns when\n    // you need to know *which* BP(s) a read supports on this contig.\n    // Both are comma-joined lists of bp_id; \"NA\" if no match.\n    \"split_bps\",          // bp_ids where this read is a split-supporter\n    \"disc_bps\",           // bp_ids where this read (or its mate) is in a\n                          // discordant cluster associated with the BP\n    \"r2c_score\",          // alignment score under r2c CIGAR\n    \"native_score\",       // alignment score under BAM CIGAR (or corrected)\n    \"read_seq\"            // raw read sequence (pre-rc, pre-gap-expand)\n  };\n  std::ostringstream oss;\n  for (size_t i = 0; i < sizeof(kCols) / sizeof(kCols[0]); ++i) {\n    if (i) oss << '\\t';\n    oss << kCols[i];\n  }\n  return oss.str();\n}\n\nstd::string AlignedContig::printToR2CTsv(const SeqLib::BamHeader& h) const {\n  std::ostringstream out;\n  const std::string cname = this->getContigName();\n  const std::string NA    = \"NA\";\n\n  // --- per-contig fields ------------------------------------------------\n\n  // frags: \"|\"-separated; within a frag, \":\"-separated:\n  //   chr:pos:strand:cigar:mapq:cpos_break1:cpos_break2:gpos_break1:gpos_break2:flipped\n  std::string frags;\n  for (size_t i = 0; i < m_frag_v.size(); ++i) {\n    const auto& frag = m_frag_v[i];\n    const auto& a = frag.m_align;\n    if (!a) continue;\n    if (!frags.empty()) frags.push_back('|');\n    frags += r2cEscape(a->ChrName(sc->header));\n    frags += ':'; frags += std::to_string(a->Position());\n    frags += ':'; frags += (a->ReverseFlag() ? '-' : '+');\n    frags += ':'; frags += r2cEscape(a->CigarString());\n    frags += ':'; frags += std::to_string(a->MapQuality());\n    frags += ':'; frags += std::to_string(frag.break1);\n    frags += ':'; frags += std::to_string(frag.break2);\n    frags += ':'; frags += std::to_string(frag.gbreak1);\n    frags += ':'; frags += std::to_string(frag.gbreak2);\n    frags += ':'; frags += (frag.flipped ? '1' : '0');\n  }\n  if (frags.empty()) frags = NA;\n\n  // bps: \"|\"-separated; within a bp, \":\"-separated (10 fields):\n  //   kind:bp_id:chr1:pos1:strand1:chr2:pos2:strand2:span:insertion\n  // kind ∈ {global, multi, indel}. bp_id is the unique BP identifier\n  // assigned by svabaThreadUnit::next_bp_id() (\".\" if unset — should\n  // not happen in normal runs). insertion is \".\" if none. All fields\n  // fixed-position so the field count stays at 10 regardless of row.\n  auto bpCell = [&](const char* kind, const BreakPoint& bp) -> std::string {\n    std::ostringstream os;\n    os << kind << ':'\n       << (bp.id.empty() ? std::string(\".\") : r2cEscape(bp.id)) << ':'\n       << r2cEscape(bp.b1.gr.ChrName(h)) << ':' << bp.b1.gr.pos1 << ':'\n       << (bp.b1.gr.strand ? bp.b1.gr.strand : '.') << ':'\n       << r2cEscape(bp.b2.gr.ChrName(h)) << ':' << bp.b2.gr.pos1 << ':'\n       << (bp.b2.gr.strand ? bp.b2.gr.strand : '.') << ':'\n       << bp.getSpan() << ':'\n       << (bp.insertion.empty() ? std::string(\".\") : r2cEscape(bp.insertion));\n    return os.str();\n  };\n\n  std::string bps;\n  auto appendBp = [&](const std::string& cell) {\n    if (!bps.empty()) bps.push_back('|');\n    bps += cell;\n  };\n  if (m_global_bp) appendBp(bpCell(\"global\", *m_global_bp));\n  for (const auto& b : m_local_breaks) if (b) appendBp(bpCell(\"multi\", *b));\n  for (const auto& frag : m_frag_v)\n    for (const auto& b : frag.m_indel_breaks)\n      if (b) appendBp(bpCell(\"indel\", *b));\n  if (bps.empty()) bps = NA;\n\n  const size_t n_reads = m_bamreads.size();\n\n  // --- contig row -------------------------------------------------------\n  //\n  // Fields in order (21 total, mirroring r2cTsvHeader):\n  //   record_type contig_name contig_len contig_seq frags bps n_reads\n  //   read_id read_chrom read_pos read_flag r2c_cigar r2c_start r2c_rc\n  //   r2c_nm support split_bps disc_bps r2c_score native_score read_seq\n  // On the contig row, all read-specific fields are NA.\n  out << \"contig\\t\"\n      << r2cEscape(cname)   << '\\t'\n      << m_seq.length()     << '\\t'\n      << r2cEscape(m_seq)   << '\\t'\n      << frags              << '\\t'\n      << bps                << '\\t'\n      << n_reads            << '\\t'\n      // read-only columns, 14 of them:\n      << NA << '\\t' << NA << '\\t' << NA << '\\t' << NA << '\\t' << NA << '\\t'\n      << NA << '\\t' << NA << '\\t' << NA << '\\t' << NA << '\\t' << NA << '\\t'\n      << NA << '\\t' << NA << '\\t' << NA << '\\t' << NA << '\\n';\n\n  // --- per-BP support tracking -----------------------------------------\n  //\n  // Replaces the older flat split_supporters / disc_supporters sets.\n  // For each BP on this contig we collect:\n  //   - bp_id: the unique identifier (may be \".\" if unset — shouldn't\n  //     happen in a normal svaba run, but we don't block emission on it)\n  //   - split_reads: UniqueNames credited as split-supporters for this\n  //     specific BP by BreakPoint::splitCoverage\n  //   - disc_reads:  UniqueNames (of reads or mates) appearing in this\n  //     BP's own DiscordantCluster (populated by\n  //     CombineWithDiscordantClusterMap). Note the scope is per-BP, not\n  //     per-contig — a contig can have multiple BPs, and a discordant\n  //     cluster may be attributed to only some of them.\n  //\n  // Per-read output then walks this vector and concatenates the bp_ids\n  // this read shows up under into `split_bps` / `disc_bps`. A read\n  // supporting two different BPs on the same contig (e.g. a multi-map\n  // contig with a global + a local BP) will show both ids, comma-\n  // joined, instead of the previous unambiguous \"split\" tag that hid\n  // which BP it actually supported.\n  struct BpSupportEntry {\n    std::string bp_id;\n    std::unordered_set<std::string> split_reads;\n    std::unordered_set<std::string> disc_reads;\n  };\n  std::vector<BpSupportEntry> per_bp_support;\n  per_bp_support.reserve(8);\n  for (const auto& bp : getAllBreakPoints()) {\n    if (!bp) continue;\n    BpSupportEntry e;\n    e.bp_id = bp->id.empty() ? std::string(\".\") : bp->id;\n    for (const auto& un : bp->getAllSupportingReads()) e.split_reads.insert(un);\n    for (const auto& kv : bp->dc.reads) e.disc_reads.insert(kv.first);\n    for (const auto& kv : bp->dc.mates) e.disc_reads.insert(kv.first);\n    per_bp_support.push_back(std::move(e));\n  }\n\n  auto fmt_score = [](double s) {\n    std::ostringstream os;\n    os << std::fixed << std::setprecision(1) << s;\n    return os.str();\n  };\n\n  // --- read rows --------------------------------------------------------\n  for (const auto& i : m_bamreads) {\n    const std::string sr       = i->UniqueName();\n    const r2c         this_r2c = i->GetR2C(getContigName());\n\n    // r2c CIGAR: empty if no r2c alignment (shouldn't happen for reads\n    // listed here, but guard anyway).\n    std::string r2c_cig_str = r2cCigarString(this_r2c.cig);\n    if (r2c_cig_str.empty()) r2c_cig_str = NA;\n\n    // Scores: same source-of-truth precedence BreakPoint::splitCoverage\n    // uses for its \"r2c better than native\" gate — we reproduce it here\n    // so the TSV lets you diagnose split-coverage decisions by field\n    // inspection alone.\n    std::string r2c_score_str = NA;\n    if (this_r2c.cig.size() > 0) {\n      r2c_score_str = fmt_score(\n          svaba::readAlignmentScore(this_r2c.cig, this_r2c.nm));\n    }\n    std::string native_score_str = NA;\n    {\n      SeqLib::Cigar native_cig;\n      int32_t       native_nm = -1;\n      if (i->corrected_native_cig.size() > 0) {\n        native_cig = i->corrected_native_cig;\n        native_nm  = i->corrected_native_nm;\n      } else {\n        native_cig = i->GetCigar();\n        i->GetIntTag(\"NM\", native_nm);\n      }\n      if (native_cig.size() > 0) {\n        native_score_str = fmt_score(\n            svaba::readAlignmentScore(native_cig, native_nm));\n      }\n    }\n\n    // Build the per-BP support lists for this specific read. Comma-\n    // joined bp_ids, \"NA\" if this read doesn't support any BP in that\n    // category on this contig. The categorical `support` is derived\n    // from whether either list is non-empty, so the new columns are\n    // a strict superset of the old info — downstream code keying on\n    // `support == \"split\"` still works.\n    std::string split_bps_str;\n    std::string disc_bps_str;\n    bool any_split = false, any_disc = false;\n    for (const auto& e : per_bp_support) {\n      if (e.split_reads.count(sr)) {\n        if (!split_bps_str.empty()) split_bps_str.push_back(',');\n        split_bps_str += e.bp_id;\n        any_split = true;\n      }\n      if (e.disc_reads.count(sr)) {\n        if (!disc_bps_str.empty()) disc_bps_str.push_back(',');\n        disc_bps_str += e.bp_id;\n        any_disc = true;\n      }\n    }\n    if (split_bps_str.empty()) split_bps_str = NA;\n    if (disc_bps_str.empty())  disc_bps_str  = NA;\n\n    const char* support_kind = any_split && any_disc ? \"both\"\n                             : any_split             ? \"split\"\n                             : any_disc              ? \"disc\"\n                             :                         \"none\";\n\n    // read_chrom: BAM-native chromosome; may be empty for unmapped mates.\n    std::string read_chrom =\n        (i->ChrID() >= 0) ? i->ChrName(h) : std::string(\"*\");\n\n    out << \"read\\t\"\n        << r2cEscape(cname)     << '\\t'\n        << m_seq.length()       << '\\t'\n        << NA                   << '\\t'   // contig_seq\n        << NA                   << '\\t'   // frags\n        << NA                   << '\\t'   // bps\n        << NA                   << '\\t'   // n_reads\n        // read fields:\n        << r2cEscape(sr)            << '\\t'\n        << r2cEscape(read_chrom)    << '\\t'\n        << i->Position()            << '\\t'\n        << (this_r2c.rc ? 16 : 0)   << '\\t'\n        << r2c_cig_str              << '\\t'\n        << this_r2c.start_on_contig << '\\t'\n        << (this_r2c.rc ? 1 : 0)    << '\\t'\n        << this_r2c.nm              << '\\t'\n        << support_kind             << '\\t'\n        << split_bps_str            << '\\t'\n        << disc_bps_str             << '\\t'\n        << r2c_score_str            << '\\t'\n        << native_score_str         << '\\t'\n        << r2cEscape(i->Sequence()) << '\\n';\n  }\n\n  return out.str();\n}\n\nvoid AlignedContig::setMultiMapBreakPairs() {\n  \n  // if single mapped contig, nothing to do here\n  if (m_frag_v.size() == 1)\n    return;\n   \n  // walk along the ordered contig list and make the breakpoint pairs\n  // these are the so called \"local\" breakpoints, meaning they are\n  // AB rearrangemnts without an intervening sequence\n  // so this loop will do AB, BC, CD, etc\n  for (AlignmentFragmentVector::const_iterator it = m_frag_v.begin();\n       it != m_frag_v.end() - 1;\n       it++) {\n    \n    AlignmentFragmentVector bwa_hits_1, bwa_hits_2;\n    \n    // first add the primary alignments\n    bwa_hits_1.push_back(*it);\n    bwa_hits_2.push_back(*(it+1));\n    \n    // then the secondaries \n    // bwa_hits_1.insert(bwa_hits_1.end(),\n    // \t\t      it->secondaries.begin(),\n    // \t\t      it->secondaries.end());\n    \n    // bwa_hits_2.insert(bwa_hits_2.end(),\n    // \t\t      (it+1)->secondaries.begin(),\n    // \t\t      (it+1)->secondaries.end());\n    \n    // make all of the local breakpoints\n    // OK so if we turn off secondary alignments, this will\n    // just be one iteration through each loop (A and B)\n    // but that's OK\n    for (auto& a : bwa_hits_1) {\n      for (auto& b : bwa_hits_2) {\n\t\n\t// initialize the breakpoint\n\tBreakPointPtr bp = std::make_shared<BreakPoint>(sc, &a, &b, this);\n\n\t// add the the vector of breakpoints\n\tm_local_breaks.push_back(bp);\n      }\n    }\n  } // end frag iterator loop\n  \n  // if this is a double mapping, we are done\n  if (m_frag_v.size() == 2) {\n    return;\n  }\n  \n  //////////////\n  // 3+ mappings\n  //////////////\n  \n  // go through alignments and find start and end that reach mapq\n  // bstart and bend are indices of local alignments\n  // that should contribute to a global\n  // e.g. bstart = 0 = A\n  int bstart = -1; //MAX_CONTIG_SIZE; // dummy value to be overwritten\n  int bend = -1; \n  \n  // loop and find contigs with strong support\n  for (size_t i = 0; i < m_frag_v.size(); i++) {\n    if (m_frag_v[i].m_align->MapQuality() >= 50) {\n      // first good alignment fragment, that's the start\n      if (bstart < 0)\n\tbstart = i;\n      bend = i;\n    }\n  }\n  \n  // if nothing good found, then just pick first and last (A-C or whatever)\n  if (bstart == bend || bstart < 0) { \n    bstart = 0;\n    bend = m_frag_v.size() -1;\n  }\n  \n  assert(bend <= m_frag_v.size() && bend > 0);\n  assert(bstart <= m_frag_v.size());\n  assert(bstart >= 0); \n  \n  // if we had ABC but only AB or BC is good connection\n  // then don't treat as complex\n  if (bend - bstart == 1) {\n    return; \n  }\n\n  /////\n  // there are 3+ quality mappings. Set a global break\n  /////\n  // set some values in the breakpoint for this contig\n  m_global_bp = std::make_shared<BreakPoint>(sc,\n\t\t\t\t\t     &m_frag_v[bstart],\n\t\t\t\t\t     &m_frag_v[bend  ],\n\t\t\t\t\t     this);\n  \n  m_global_bp->svtype = SVType::TSI_GLOBAL; // complex=true;\n  \n  // now, each local breakpoint is a TSI local not a simple rearrangement\n  for (auto& i : m_local_breaks) {\n    i->svtype = SVType::TSI_LOCAL;\n  }    \n  \n}\n\nstd::string AlignedContig::printDiscordantClusters(const SeqLib::BamHeader& h) const {\n  \n  std::stringstream out;\n  if (m_dc.size() == 0)\n    return \"none\";\n\n  for (const auto& d : m_dc) {\n    out << d.print(h) << \" \";\n  }\n  return out.str();\n  \n}\n\n// bool AlignedContig::checkLocal(const SeqLib::GenomicRegion& window)\n// {\n//   bool has_loc = false;\n//   for (auto& i : m_frag_v) \n//     if (i.checkLocal(window))\n//       has_loc = true;\n  \n//   // check for all of the breakpoints of non-indels (already handling indels)\n//   for (auto& i : m_local_breaks) \n//     i.checkLocal(window);\n//   // for (auto& i : m_global_bp_secondaries) \n//   //   i.checkLocal(window);\n//   m_global_bp->checkLocal(window);\n  \n//   return has_loc;\n  \n// }\n\n\nBreakPointPtrVector AlignedContig::getAllBreakPoints() const {\n  \n  BreakPointPtrVector out;\n  \n  // get the indel BreakPoints\n  for (auto& i : m_frag_v) {\n    out.insert(out.end(), i.m_indel_breaks.begin(), i.m_indel_breaks.end());\n  }\n  \n  // get the global breakpoint\n  if (m_global_bp) //->isEmpty())\n    out.push_back(m_global_bp);\n  \n  // get the local breakpoints\n  out.insert(out.end(), m_local_breaks.begin(), m_local_breaks.end());\n  \n  return out;\n}\n\n// std::vector<BreakPoint> AlignedContig::getAllBreakPointsSecondary() const {\n\n//   std::vector<BreakPoint> out;\n\n//   for (auto& i : m_global_bp_secondaries)\n//     if (!i.isEmpty())\n// \tout.push_back(i);\n\n//   return out;\n// }\n\n  \nbool AlignedContig::hasVariant() const { \n  \n  if (m_global_bp) //!m_global_bp->isEmpty())\n    return true;\n  \n  if (m_local_breaks.size())\n    return true; \n  \n  // if (m_global_bp_secondaries.size())\n  //   return true; \n  \n  // if (m_local_breaks_secondaries.size())\n  //     return true; \n\n  for (const auto& i : m_frag_v)\n    for (const auto& j : i.m_indel_breaks)\n      if (j->hasMinimal()) \n\treturn true;\n  \n  return false;\n  \n}\n\n// void AlignedContig::addDiscordantCluster(DiscordantClusterMap& dmap)\n// {\n\n//   // loop through the breaks and compare with the map\n//   for (auto& i : m_local_breaks)\n//     i.__combine_with_discordant_cluster(dmap);\n\n//   if (!m_global_bp->isEmpty())\n//     m_global_bp->__combine_with_discordant_cluster(dmap);\n  \n//   if (m_global_bp->hasDiscordant())\n//     m_dc.push_back(m_global_bp->dc);\n  \n//   for (auto& i : m_global_bp_secondaries)\n//     i.__combine_with_discordant_cluster(dmap);\n// }\n\n  // void AlignedContig::assessRepeats() {\n\n  //   for (auto& a : m_frag_v)\n  //     for (auto& i : a.m_indel_breaks)\n  // \ti.repeatFilter();\n    \n  //   for (auto& b : m_local_breaks)\n  //     b.repeatFilter();\n  //   for (auto& b : m_local_breaks_secondaries)\n  //     b.repeatFilter();\n  //   for (auto& b : m_global_bp_secondaries)\n  //     b.repeatFilter();\n\n  // }\n\n\n// void AlignedContig::refilterComplex() {\n  \n//   if (m_global_bp && m_global_bp->num_align <= 2)\n//     return;\n  \n//   // initialize split counts vec\n//   std::vector<int> scounts(m_local_breaks.size(), 0);\n  \n//   for (size_t i = 0; i < scounts.size() ; ++i) {\n//     for (auto& j : m_local_breaks[i]->allele)\n//       scounts[i] += j.second.split;\n//   }\n\n//   // every local BP needs to have 4+ split reads\n//   // to be a quality TSI event\n//   // if not, then forget the global / TSI altogether\n//   for (auto& i : scounts) {\n//     if (i < 4) {\n//       m_global_bp = nullptr;\n//       for (auto& i : m_local_breaks)\n// \ti->svtype = SVType::ASSMB; \n//       return;\n//     }\n//   }\n  \n// }\n\nstd::string AlignedContig::getContigName() const {\n  if (!m_frag_v.size()) \n    return \"\";  \n    return m_frag_v[0].m_align->Qname(); \n  }\n\nint AlignedContig::getMaxMapq() const { \n  int m = -1;\n  for (auto& i : m_frag_v)\n    if (i.m_align->MapQuality() > m)\n      m = i.m_align->MapQuality();\n  return m;\n  \n}\n\nint AlignedContig::getMinMapq() const {\n  int m = 1000;\n  for (auto& i : m_frag_v)\n    if (i.m_align->MapQuality() < m)\n      m = i.m_align->MapQuality();\n  return m;\n}\n\n// bool AlignedContig::hasLocal() const { \n//   for (auto& i : m_frag_v) \n//     if (i.local) \n//       return true; \n//   return false; \n// }\n\n// void AlignedContig::writeAlignedReadsToBAM(SeqLib::BamWriter& bw) { \n//   for (const auto& i : m_bamreads)\n//     bw.WriteRecord(*i);\n// } \n\n// void AlignedContig::writeToBAM(SeqLib::BamWriter& bw) const { \n//   for (auto& i : m_frag_v) {\n//     i.writeToBAM(bw);\n//   }\n// } \n\n// std::string AlignedContig::getSequence() const { \n//   assert(m_seq.length()); \n//   return m_seq; \n// }\n\nvoid AlignedContig::AddAlignedRead(svabaReadPtr& br) {\n  m_bamreads.push_back(br);\n}\n"
  },
  {
    "path": "src/svaba/AlignedContig.h",
    "content": "#pragma once\n\n#include <algorithm>\n\n#include \"SeqLib/BWAAligner.h\"\n#include \"SeqLib/BamReader.h\"\n#include \"SeqLib/BamRecord.h\"\n#include \"SeqLib/BamWriter.h\"\n\n#include \"BreakPoint.h\"\n#include \"DiscordantCluster.h\"\n#include \"AlignmentFragment.h\"\n#include \"SvabaRead.h\"\n\n/*! Contains the mapping of an aligned contig to the reference genome,\n * along with pointer to all of the reads aligned to this contig, and a \n * store of all of the breakpoints associated with this contig\n */\nclass AlignedContig {\n  \n  friend class AlignmentFragment;\n  friend class BreakPoint;\n  \n public:  \n  \n  AlignedContig() = delete; // prevent default construction\n  \n  // make an AlignedContig from a set of contig alignments\n  AlignedContig(BamRecordPtrVector& bav,\n\t\tconst GenomicRegion& region,\n\t\tconst SvabaSharedConfig* sc_);\n  \n  // Return as a genomic region vector\n  SeqLib::GenomicRegionVector getAsGenomicRegionVector() const;\n\n  bool checkLocal(const SeqLib::GenomicRegion& window);\n  \n  // apply repeat filter to each indel break\n  //void assessRepeats();\n  \n  // Loop through the vector of DiscordantCluster objects\n  // associated with this contig and print\n  std::string printDiscordantClusters(const BamHeader& h) const;\n  \n  // return the name of the contig\n  std::string getContigName() const;\n\n  // Debug accessors for compile-time trace (SvabaDebug.h)\n  size_t getFragCount() const { return m_frag_v.size(); }\n  bool hasGlobalBP() const { return m_global_bp != nullptr; }\n  size_t getLocalBreakCount() const { return m_local_breaks.size(); }\n  size_t getIndelBreakCount() const {\n    size_t n = 0;\n    for (const auto& f : m_frag_v) n += f.m_indel_breaks.size();\n    return n;\n  }\n\n  // Return the max mapping quality from all alignments\n  int getMaxMapq() const;\n    \n  // Return the min mapping quality from all alignments\n  int getMinMapq() const;\n  \n  // Loop through all of the breakpoints and\n  // calculate the split read support for each. Requires \n  // alignedReads to have been run first (will error if not run).\n  void splitCoverage();\n  \n  // Checks if any of the indel breaks are in a blacklist. If so, mark the\n  // breakpoints of the indels for skipping. That is, hasMinmal() will return false;\n  void blacklist(SeqLib::GRC& grv);\n  \n  // Dump the contigs to a fasta\n  //void printContigFasta(std::ofstream &os) const;\n  \n  // Set the breakpoints on the reference by combining multi-mapped contigs\n  void setMultiMapBreakPairs();\n  \n  //! return the contig sequence as it came off the assembler\n  //std::string getSequence() const; \n\n  // SvABA2.0: emit this contig's info as a structured TSV that can be\n  // re-plotted later, rather than pre-rendered into ASCII. One \"contig\"\n  // row followed by one \"read\" row per r2c-aligned read. The companion\n  // viewer is bps_explorer.html's r2c re-plot sub-panel. Rows share a\n  // `contig_name` key so reads can be grouped back to their parent contig\n  // without a sorted file.\n  //\n  // Replaced the old printToAlignmentsFile() / alignments.txt.gz output\n  // entirely — same information content, just not pre-formatted. The\n  // header line is emitted once per file by r2cTsvHeader(); for per-thread\n  // streams, only the first worker (threadId == 1; workers are numbered\n  // 1..N by threadpool.h) writes it — see svabaThreadUnit ctor.\n  std::string printToR2CTsv(const SeqLib::BamHeader& h) const;\n\n  // Column header for the r2c TSV; call once per file, before any rows.\n  static std::string r2cTsvHeader();\n  \n  // Return if this contig contains a potential variant (indel or multi-map)\n  bool hasVariant() const;\n  \n  // Write all of the contig alignment records to a BAM file\n  //void writeToBAM(SeqLib::BamWriter& bw) const;\n  \n  // Write all of the sequencing reads as aligned to contig to a BAM file\n  //void writeAlignedReadsToBAM(SeqLib::BamWriter& bw);\n\n  // Remove indels that map extremely close to rearrangement break points \n  //void filterIndelsAtMultiMapSites(size_t buff);\n\n  // returns whether any of the alignments are local to m_window\n  //bool hasLocal() const;\n\n  // Retrieves all of the breakpoints by combining indels with global mutli-map break\n  BreakPointPtrVector getAllBreakPoints() const;\n\n  //std::vector<BreakPoint> getAllBreakPointsSecondary() const;\n\n  //  void refilterComplex();\n\n  std::vector<const BreakPoint*> getAllBreakPointPointers() const ;\n\n  void addDiscordantCluster(DiscordantClusterMap& dmap);\n  \n  std::pair<int, int> getCoverageAtPosition(int pos) const;\n\n  // add a new read aligned to this contig\n  // this is a svabaRead (read to genome), but with an r2c in it\n  void AddAlignedRead(svabaReadPtr& br);\n\n  // return number of bam reads\n  size_t NumBamReads() const { return m_bamreads.size(); }\n\n private:\n\n  // int insertion_against_contig_read_count = 0;\n\n  // int deletion_against_contig_read_count = 0;\n\n  // store all of the reads aligned to contig\n  // these are the same alignments as the BAM, but have an r2c as well\n  svabaReadPtrVector m_bamreads; \n\n  // coverage of each base in contig, whether it has alignment \n  std::vector<int> aligned_coverage; \n\n  AlignmentFragmentVector m_frag_v; // store all of the individual alignment fragments \n\n  std::vector<BreakPointPtr> m_local_breaks; // store all of the multi-map BreakPoints for this contigs \n\n  //std::vector<BreakPoint> m_local_breaks_secondaries; // store all of the multi-map BreakPoints for this contigs \n\n  BreakPointPtr m_global_bp;  // store the single spanning BreakPoing for this contig e\n\n  //size_t m_index_of_stored_seq = 0; // which alignment did mseq come from?\n  \n  //std::vector<BreakPoint> m_global_bp_secondaries;  // store the single spanning BreakPoing for this contig e\n\n  std::string m_seq; // sequence of contig as it came off of assembler\n  \n  std::vector<DiscordantCluster> m_dc; // collection of all discordant clusters that map to same location as this contig\n\n  const SvabaSharedConfig* sc;\n  \n};\n\ntypedef std::unordered_map<std::string, AlignedContig> ContigMap;\ntypedef std::vector<AlignedContig> AlignedContigVec; \n"
  },
  {
    "path": "src/svaba/AlignmentFragment.cpp",
    "content": "#include \"AlignmentFragment.h\"\n#include \"AlignedContig.h\"\n#include \"SvabaDebug.h\"\n\n#define MIN_INDEL_MATCH_BRACKET 0\n#define MAX_INDELS 10000\n#define MAX_INDEL_PER_CONTIG 6 \n\n// write the alignment record to a BAM file\n// void AlignmentFragment::writeToBAM(SeqLib::BamWriter& bw) const { \n//   bw.WriteRecord(*m_align); \n// } \n\nusing SeqLib::CigarField;\n\nbool AlignmentFragment::operator<(const AlignmentFragment& str) const {\n  return (start < str.start);\n}\n\n\n// bool AlignmentFragment::checkLocal() const {\n\n//   assert(region_.pos1 >= 0);\n  \n//   // make a region for this frag\n//   SeqLib::GenomicRegion gfrag(m_align->ChrID(),\n// \t\t\t      m_align->Position(),\n// \t\t\t      m_align->PositionEnd());\n  \n//   if (region_.GetOverlap(gfrag)) {\n//     return true;\n//   }\n  \n//   return false;\n// }\n\nAlignmentFragment::AlignmentFragment(BamRecordPtr &talign,\n\t\t\t\t     bool flip,\n\t\t\t\t     const GenomicRegion& local_region,\n\t\t\t\t     const SvabaSharedConfig* sc_) :\n  region_(local_region), m_align(talign), sc(sc_) {\n  \n  // orient cigar so it is on the contig orientation. \n  // need to do this to get the right ordering of the contig fragments below\n  // We only flip if we flipped the sequence, and that was determined\n  // by the convention set in AlignedContig::AlignedContig, so we need\n  // to pass that information explicitly\n  // if (flip/*m_align->ReverseFlag()*/) {\n  //   m_cigar = m_align->GetReverseCigar();\n  // } else { \n  //   m_cigar = m_align->GetCigar();\n  // }\n\n  flipped = flip;\n  \n  // set the left-right breaks\n  unsigned currlen  = 0; \n  \n  // NB: CPOS is zero based\n  // NB: for break1 and break2, we use these later in the\n  //     for either printing to alignments file, or for\n  //     getting the *contig* coordinate breakpoints\n  //     So this to account for \"flip\" convention across\n  //     AlignmentFragments\n  const auto& cig = flipped ? m_align->GetReverseCigar() : m_align->GetCigar();\n  for (auto& i : cig) { \n    \n    // SET THE CONTIG BREAK (treats deletions and leading S differently)\n    // the first M gets the break1, pos on the left\n    if (i.Type() == 'M' && break1 == -1)\n      break1 = currlen;\n    if (i.Type() != 'D') // m_skip deletions but not leading S, but otherwise update\n      currlen += i.Length();\n    if (i.Type() == 'M') // keeps triggering every M, with pos at the right\n      break2 = currlen;\n  }\n  \n  // assign the genomic coordinates of the break\n  if (m_align->ReverseFlag()) {\n    gbreak2 = m_align->Position() + 1;\n    gbreak1 = m_align->PositionEnd();\n  } else {\n    gbreak1 = m_align->Position() + 1;\n    gbreak2 = m_align->PositionEnd();\n  }\n  \n  // shouldn't hit either of the next two conditions\n  // if (break1 >= MAX_CONTIG_SIZE || break2 >= MAX_CONTIG_SIZE || break1 < 0 || break2 < 0) {\n  //   throw std::runtime_error(\n  // \t\t\t     \"Invalid breakpoints: break1 = \" + std::to_string(break1) +\n  // \t\t\t     \", break2 = \" + std::to_string(break2) +\n  // \t\t\t     \", context = \" + this->print()\n  // \t\t\t     );\n  // }\n  \n  if (break1 < 0 || break2 < 0) {\n    throw std::runtime_error(\"Negative breakpoint detected in AlignmentFragment \"); //  + printToAlignmentsFile());\n  }\n  \n  // find the start position of alignment ON CONTIG\n  start = 0; \n  for (auto& i : cig) { //m_align->GetCigar()) { //m_cigar) {\n    if (i.Type() != 'M')\n      start += i.Length();\n    else\n      break;\n  }\n  \n}\n\nvoid AlignmentFragment::SetIndels() {\n  \n  if (m_align->SecondaryFlag())\n    return; // ignore these\n\n  const auto& cig = m_align->GetCigar();\n  const std::string _cname = m_align->Qname();\n\n  // Build CIGAR string for trace\n#ifdef SVABA_TRACING\n  {\n    std::string cig_str;\n    for (const auto& cf : cig)\n      cig_str += std::to_string(cf.Length()) + std::string(1, cf.Type());\n    SVABA_TRACE(_cname, \"TP4 SetIndels: cigar=\" << cig_str\n                << \" cigar_ops=\" << cig.size()\n                << \" secondary=\" << m_align->SecondaryFlag());\n  }\n#endif\n\n  // loops the alignment fragment to extract indels\n  // start at 1 and end at len-1 because we don't consider indels if they\n  //   start the cigar string e.g. 1D5M, not reliable\n  for (size_t i = 1; i < cig.size() - 1; ++i) {\n    const CigarField& c = cig[i];\n    const CigarField& pre = cig[i-1];\n    const CigarField& post = cig[i+1];\n    if ( (c.Type() == 'D' || c.Type() == 'I')) {\n      bool prev_match = pre.Type() == 'M';\n      bool post_match = post.Type() == 'M';\n\n      SVABA_TRACE(_cname, \"TP4 indel at cigar[\" << i << \"]: \"\n                  << c.Length() << c.Type()\n                  << \" prev=\" << pre.Length() << pre.Type()\n                  << \" post=\" << post.Length() << post.Type()\n                  << \" prev_match=\" << prev_match\n                  << \" post_match=\" << post_match);\n\n      // only consider indels if\n      if (prev_match && post_match) {\n\t// convention is that cpos and gpos for deletions refer to flanking REF sequence.\n\t// eg a deletion of 1 bp of base 66 will have gpos1 = 65 and gpos2 = 67\n\tBreakPointPtr bp = std::make_shared<BreakPoint>(this, i, sc);\n\tassert(bp);\n\t// add the indel\n\tm_indel_breaks.push_back(bp);\n\tSVABA_TRACE(_cname, \"TP4 -> INDEL BP created\");\n      }\n    }\n  }\n}\n\nstd::string AlignmentFragment::printToAlignmentsFile() const {\n  \n  std::stringstream out;\n  // sets the direction to print\n  char jsign = '>'; \n  if (m_align->ReverseFlag())\n    jsign = '<';\n\n  // NB: for printing, this should actually finally\n  //   consider if this fragment is \"flipped\" relative\n  //   to the BWA alignment, since we want to sync\n  //   orientations across all of the fragments.\n  const auto& cig = flipped ? m_align->GetReverseCigar() : m_align->GetCigar(); \n  \n  // print the cigar value per base\n  for (auto& j : cig) {\n    if (j.Type() == 'M')\n      out << std::string(j.Length(), jsign);\n    else if (j.Type() == 'I') \n      out << std::string(j.Length(), 'I');\n    else if (j.Type() == 'S' || j.Type() == 'H')\n      out << std::string(j.Length(), '.');\n  }\n  \n  // print contig and genome breaks\n  out << \"\\tC[\" << break1 << \",\" << break2 << \"] G[\" << gbreak1 << \",\" << gbreak2 << \"]\";\n\n  // print it\n  std::string chr_name = m_align->ChrName(sc->header);\n  assert(chr_name.length());\n  out << \"\\tAligned to: \" <<\n    chr_name << \":\" << m_align->Position() << \"(\" <<\n    (m_align->ReverseFlag() ? \"-\" : \"+\") << \") CIG: \" <<\n    m_align->CigarString() << \" MAPQ: \" <<\n    m_align->MapQuality(); // << \" SUBN \" << sub_n;\n  \n  return out.str();\n}\n\n// void AlignmentFragment::fillRearrangementBreakEnd(bool left,\n// \t\t\t\t\t BreakEnd& b) {\n    \n//     b.transferContigAlignmentData(m_align);\n\n//     if (left) {\n//       b.gr = SeqLib::GenomicRegion(m_align->ChrID(), gbreak2, gbreak2);\n//       b.gr.strand = m_align->ReverseFlag() ? '-' : '+'; \n//       b.cpos = break2; // take the right-most breakpoint of the left  as the first\n//     } else {\n//       b.gr = SeqLib::GenomicRegion(m_align->ChrID(), gbreak1, gbreak1);\n//       b.gr.strand = m_align->ReverseFlag() ? '+' : '-';\n//       b.cpos = break1;  // take the left-most of the next one\n//     }\n\n//     assert(b.cpos < MAX_CONTIG_SIZE);\n\n//   }\n//       assert(i.getSpan() > 0);\n\n//       // get the hash string in same formate as cigar map (eg. pos_3D)\n//       std::string st = i.getHashString();\n\n//       for (auto& c : cmap) {\n// \tSeqLib::CigarMap::const_iterator ff = c.second.find(st);\n// \t// if it is, add it\n// \tif (ff != c.second.end()) {\n// \t  i.allele[c.first].cigar = ff->second;\t  \n// \t}\n//       }\n//     }      \n//   }\n"
  },
  {
    "path": "src/svaba/AlignmentFragment.h",
    "content": "#pragma once\n\n#include <unordered_map>\n#include <string>\n#include <set>\n\n#include \"SeqLib/BamRecord.h\"\n\n#include \"BreakPoint.h\"\n\nusing SeqLib::BamRecordPtr;\nusing SeqLib::Cigar;\nusing SeqLib::CigarMap;\nusing SeqLib::GenomicRegion;\nusing SeqLib::BamHeader;\n\n// forward declare\nclass AlignedContig;\n\n  /*! This class contains a single alignment fragment from a contig to\n   * the reference. For a multi-part mapping of a contig to the reference,\n   * an object of this class represents just a single fragment from that alignment.\n   */\nclass AlignmentFragment {\n  \n  friend class BreakPoint;\n  friend class AlignedContig;\n  \npublic:\n  \n  AlignmentFragment() = delete; // prevent default construction\n  \n  /*! Construct an AlignmentFragment from a BWA alignment\n   * @param flip If the contig sequence was flipped (rev of BAM record), need to track this. This flipping occurs in AlignedContig::AlignedContig\n   */\n  // talign is an alignment of the contig to reference\n  AlignmentFragment(BamRecordPtr &talign,\n\t\t    bool flip,\n\t\t    const GenomicRegion& local_region,\n\t\t    const SvabaSharedConfig* sc_);\n  \n  // sort AlignmentFragment objects by start position\n  bool operator < (const AlignmentFragment& str) const; \n  \n  // print the AlignmentFragment\n  std::string printToAlignmentsFile() const;\n  \n  void fillRearrangementBreakEnd(bool left, BreakEnd& b);\n    \n  // check whether the alignment fragement overlaps with the given windows\n  bool checkLocal() const;\n  \n  //const std::vector<BreakPoint>& getIndelBreaks() const { return m_indel_breaks; }\n  \n  // write the alignment record to a BAM file\n  //void writeToBAM(SeqLib::BamWriter& bw) const;\n  \n  void SetIndels();\n  \n  BamRecordPtr m_align; // BWA alignment of contig to reference\n  \n  std::vector<AlignmentFragment> secondaries;    \n  \n  BreakPointPtrVector m_indel_breaks; // indel variants on this alignment\n  \n  //Cigar m_cigar; //cigar oriented to assembled orientation\n  //std::string m_seq; // seequence, orientated to assembled orientation\n  \n  int break1 = -1; // 0-based breakpoint 1 on contig \n  int break2 = -1; // 0-based breakpoint 2 on contig \n  int gbreak1 = -1; // 0-based breakpoint 1 on reference chr\n  int gbreak2 = -1; // 0-based breakpoint 1 on reference chr \n  \n  const SvabaSharedConfig* sc; //pointer to allow sort later\n  \n  GenomicRegion region_;\n  \n  int start = -1; // where on the contig does this alignment fragment start\n  \n  int num_align = -1;\n\n  bool flipped = false;\n};\n\ntypedef std::vector<AlignmentFragment> AlignmentFragmentVector;\n"
  },
  {
    "path": "src/svaba/BamStats.cpp",
    "content": "#include \"BamStats.h\"\n\n#include <cmath>\n\nusing namespace SeqLib;\n\n"
  },
  {
    "path": "src/svaba/BamStats.h",
    "content": "// #pragma once\n\n// #include <unordered_map>\n// #include <cstdint>\n// #include <iostream>\n\n// #include \"Histogram.h\"\n// #include \"SeqLib/BamRecord.h\"\n\n//   /** Store information pertaining to a given read group *\n//    *\n//    * This class will collect statistics on number of: read, supplementary reads, unmapped reads, qcfail reads, duplicate reads.\n//    * It will also create Histogram objects to store counts of: mapq, nm, isize, clip, mean phred score, length\n//    */\n// class BamReadGroup {\n\n//   friend class BamStats;\n  \n//  public:\n\n//   /** Construct an empty BamReadGroup */\n//   BamReadGroup() {}\n\n//   /** Construct an empty BamReadGroup for the specified read group\n//    * @param name Name of the read group\n//    */\n//   BamReadGroup(const std::string& name);\n\n//   /** Display basic information about this read group\n//    */\n//   friend std::ostream& operator<<(std::ostream& out, const BamReadGroup& rg);\n\n//   /** Add a BamRecord to this read group */\n//   void addRead(SeqLib::BamRecord &r);\n\n//  private:\n\n//   // count number of reads \n//   size_t reads;\n//   size_t supp;\n//   size_t unmap;  \n//   size_t qcfail;\n//   size_t duplicate;\n//   size_t mate_unmap;\n\n//   int mapq_max = 0;\n//   int realen_max = 0;\n//   std::vector<int> isize_vec;\n  \n//   std::string m_name;\n\n// };\n\n// /** Class to store statistics on a BAM file.\n//  *\n//  * BamStats currently stores a map of BamReadGroup objects. Bam statistics\n//  * are collected then on a read-group basis, but can be output in aggregate. See\n//  * BamReadGroup for description of relevant BAM statistics.\n//  */\n// class BamStats\n// {\n\n//  public:\n  \n//   /** Loop through the BamReadGroup objections and print them */\n//   friend std::ostream& operator<<(std::ostream& out, const BamStats& qc);\n\n//   /** Add a read by finding which read group it belongs to and calling the \n//    * addRead function for that BamReadGroup.\n//    */\n//   void addRead(SeqLib::BamRecord &r);\n\n//  private:\n  \n//   std::unordered_map<std::string, BamReadGroup> m_group_map;\n\n// };\n"
  },
  {
    "path": "src/svaba/BreakPoint.cpp",
    "content": "#include \"BreakPoint.h\"\n#include \"SvabaDebug.h\"\n\n#include <getopt.h>\n#include <iomanip>\n#include <cassert>\n#include <tuple>\n#include <optional>\n\n#include <sstream>\n#include <vector>\n#include <stdexcept>\n#include <algorithm>\n#include <cctype>\n\n#include \"gzstream.h\"\n#include \"SvabaUtils.h\"\n#include \"STCoverage.h\"\n#include \"SvabaOptions.h\"\n\n#include \"SeqLib/GenomicRegionCollection.h\"\n#include \"SeqLib/GenomicRegion.h\"\n#include \"SeqLib/BamHeader.h\"\n#include \"AlignmentFragment.h\"\n#include \"AlignedContig.h\"\n#include \"SvabaModels.h\"\n#include \"ContigAlignmentScore.h\"\n\n// n is the max integer given the int size (e.g. 255). x is string with int\n#define INTNSTOI(x,n) std::min((int)n, std::stoi(x));\n\nstatic inline std::string to_string(SVType t) {\n  switch(t) {\n    case SVType::NOTSET:     return \"NOTSET\";\n    case SVType::TSI_LOCAL:  return \"TSI_LOCAL\";\n    case SVType::TSI_GLOBAL: return \"TSI_GLOBAL\";\n    case SVType::ASSMB:      return \"ASSMB\";\n    case SVType::ASDIS:      return \"ASDIS\";\n    case SVType::DSCRD:      return \"DSCRD\";\n    case SVType::INDEL:      return \"INDEL\";\n  }\n  return \"UNKNOWN_SVTYPE\";\n}\n\nstatic inline std::string to_string(SomaticState s) {\n  switch(s) {\n  case SomaticState::NOTSET:       return \"NOTSET\";\n  case SomaticState::NORMAL_LOD:   return \"0\";\n  case SomaticState::SOMATIC_LOD:  return \"1\";\n  case SomaticState::FAILED:       return \"0\";\n  }\n  return \"UNKNOWN_SOMATICSTATE\";\n}\n\nstd::ostream& operator<<(std::ostream& out, const BreakPoint::SampleInfo& a) {\n  out << \" split: \" << a.split << \" cigar \" << a.cigar << \" alt \" << a.alt << \" cov \" << a.cov << \" disc \" << a.disc;\n  return out;\n}\n\nGenomicRegion BreakPoint::BreakEndAsGenomicRegionLeft() const {\n  return b1.gr;\n}\n\nGenomicRegion BreakPoint::BreakEndAsGenomicRegionRight() const {\n  return b2.gr;\n}\n\nbool BreakPoint::isIndel() const {\n  if (svtype == SVType::NOTSET)\n    throw std::runtime_error(\"BreakPoint without an svtype\");\n\n  return svtype == SVType::INDEL;\n}\n\n// SvABA2.0: printDeletionMarksForAlignmentsFile() was removed along with\n// AlignedContig::printToAlignmentsFile / alignments.txt.gz. The deletion-\n// mark info is available in the r2c TSV via the bps field (per-breakpoint\n// span + kind), so downstream viewers can reconstruct the marker\n// positions from structured fields rather than parsing ASCII.\n\nHashVector BreakPoint::getBreakEndHashes() {\n  HashVector vec;\n\n  assert(!confidence.empty());\n  assert(svtype != SVType::NOTSET);\n  \n  if (svtype != SVType::INDEL)\n    return vec;\n\n  if (b1.gr.pos1 > 0) {\n    {\n      vec.push_back(b1.hash(0));\n      vec.push_back(b1.hash(1));\n      vec.push_back(b1.hash(-1));\n    }\n  }\n\n  return vec;\n}\n\nBreakPoint::SampleInfo operator+(const BreakPoint::SampleInfo& a1, const BreakPoint::SampleInfo& a2) {\n\n  BreakPoint::SampleInfo a;\n  \n  a.disc = a1.disc + a2.disc;\n  a.split = a1.split + a2.split;\n  a.cigar = a1.cigar + a2.cigar;\n  a.cigar_near = a1.cigar_near + a2.cigar_near;\n  a.cov = a1.cov + a2.cov;\n  \n  // add the reads\n  for (auto& i : a1.supporting_reads)\n    a.supporting_reads.insert(i);\n  for (auto& i : a2.supporting_reads)\n    a.supporting_reads.insert(i);\n  \n  //a.alt = std::max((int)a.supporting_reads.size(), a.cigar);\n  \n  if (a.supporting_reads.size()) // we have the read names, so do that (non-refilter run)\n    a.UpdateAltCounts();\n  else // no read names stored, so just get directly\n    a.alt = a1.alt + a2.alt;\n  \n  return a;\n}\n\n\nstatic constexpr double scale_factor = 10.0;\nstatic std::unordered_map<int, double> ERROR_RATES =\n  {{0, scale_factor * 1e-4}, {1, scale_factor * 1e-4},\n   {2,  scale_factor * 1e-4}, {3,  scale_factor * 1e-4},\n   {4,  scale_factor * 1e-4}, {5, scale_factor * 2e-4},\n   {6, scale_factor * 5e-4}, {7, scale_factor * 1e-3},\n   {8, scale_factor * 2e-3}, {9, scale_factor * 3e-3},\n   {10, scale_factor * 1e-2}, {11, scale_factor * 2e-2},\n   {12, scale_factor * 3e-2}};\n\ndouble __myround(double x) { return std:: floor(x * 10) / 10; }\n\nBreakPoint::BreakPoint(const SvabaSharedConfig* _sc,\n\t\t       const AlignmentFragment* left,\n\t\t       const AlignmentFragment* right,\n\t\t       const AlignedContig* alc\n\t\t       ) : sc(_sc) {\n\n  // this is at least of type ASSMB (can upgrade later to ASDIS or TSI)\n  svtype = SVType::ASSMB;\n\n  // instantiate the SampleInfo objects for each BAM\n  for (auto const& p : sc->prefixes) {\n    // if p isn't already present, constructs SampleInfo(this) in-place\n    allele.try_emplace(p);\n  }\n\n  assert(alc);\n\n  // transfer AlignedContig level information\n  seq = alc->m_seq;\n  num_align = alc->m_frag_v.size();\n  cname = alc->getContigName();\n\n  // SvABA2.0: record the contig length so splitCoverage can reject r2c\n  // reads that soft-clip in the middle of the contig (as opposed to at\n  // the contig edge, which is a legitimate geometry). m_seq is already\n  // in assembly-native orientation. We don't set flipped_on_contig here\n  // because SV breakpoints are composed of two AlignmentFragments with\n  // independent flip conventions; splitCoverage's m_seq cpos handling\n  // for SVs uses the per-fragment cpos set by transferContigAlignmentData.\n  contig_len = static_cast<int>(seq.length());\n\n  // set the local alignment\n  // int la = 0;\n  // alc->m_frag_v[0].m_align->GetIntTag(\"LA\", la);\n  // if (la > 0)\n  //   local = LocalAlignment::NONVAR_LOCAL_REALIGNMENT;\n  \n  // set the break coordinates \n  bool isleft = true;\n  b1.transferContigAlignmentData(left,    isleft);\n  b2.transferContigAlignmentData(right, !isleft);\n\n  // set the insertion / homology \n  set_homologies_insertions();\n\n  // set seconary flag\n  secondary = left->m_align->SecondaryFlag() ||\n    right->m_align->SecondaryFlag();\n  \n}\n\n// make the file string\nstd::string BreakPoint::toFileString(const BamHeader& header) const {\n  \n  // make sure we already ran scoring\n  assert(confidence.length());\n  assert(svtype != SVType::NOTSET);\n  \n  std::string sep = \"\\t\";\n  std::stringstream ss;\n  \n  double max_lod = 0;\n  for (const auto&  [_,al] : allele) \n    max_lod = std::max(max_lod, al.LO);\n  \n  std::string evidence = to_string(svtype);\n\n  std::string somatic_string = \"NA\";\n  std::string somatic_lod_string = \"NA\";\n  for (const auto& [pref,_] : allele) {\n    if (pref.at(0) == 'n') { // need to have one normal to call somatic\n      somatic_string = to_string(somatic);\n      somatic_lod_string = std::to_string(std::min((double)99,LO_s));\n    }\n  }\n  \n\n  //NB: we are adding +1 to the positions here to be consistent\n  // with SAM/VCF which is 1-indexed, while we are using 0-indexed\n  // positions internally to be consistent with htslib\n  ss << b1.gr.ChrName(header) << sep\n     << (b1.gr.pos1 +1) << sep\n     << b1.gr.strand << sep //1-3\n     << b2.gr.ChrName(header) << sep\n     << (b2.gr.pos1 +1) << sep\n     << b2.gr.strand << sep //4-6\n     << ref << sep << alt << sep //7-8\n     << getSpan() << sep //9 \n     << a.split << sep\n     << a.alt << sep << a.cov << sep\n     << a.cigar << sep << a.cigar_near << sep    \n     << dc.mapq1 << sep << dc.mapq2 << sep\n     << dc.ncount << sep << dc.tcount << sep\n     << b1.mapq << sep << b2.mapq << sep \n     << b1.nm << sep << b2.nm << sep\n     << b1.as << sep << b2.as << sep\n     << b1.sub << sep << b2.sub << sep      \n     << (homology.length() ? homology : \"x\") << sep \n     << (insertion.length() ? insertion : \"x\") << sep\n     << (repeat_seq.length() ? repeat_seq : \"x\") << sep\n     << cname << sep\n     << num_align << sep \n     << confidence << sep\n     << evidence << sep\n     << quality << sep\n     << secondary << sep\n     << somatic_string << sep\n     << somatic_lod_string << sep \n     << max_lod << sep \n    //<< pon << sep\n    // << (repeat_seq.length() ? repeat_seq : \"x\") << sep \n     << (rs.length() ? rs : \"x\") << sep\n     << b1.contig_conf << sep\n     << b2.contig_conf << sep\n    // --- SvABA2.0 additions for refilter round-trip ------------------------\n    // Contig-relative breakend positions. -1 sentinel means \"not set\" (e.g.\n    // DSCRD-only breakpoints with no backing contig alignment).\n     << b1.cpos << sep\n     << b2.cpos << sep\n    // Flanking match lengths at each end (drives SHORTALIGNMENT/LOWMATCHLEN).\n     << left_match << sep\n     << right_match << sep\n    // Extent of split-read coverage on the contig (drives DUPREADS/LOWSUPPORT).\n     << split_cov_bounds.first << sep\n     << split_cov_bounds.second << sep\n    // Per-end LocalAlignment enum, serialized as int to keep the parser\n    // identity-simple. See BreakPoint.h for enum values (0..3).\n     << static_cast<int>(b1.local) << sep\n     << static_cast<int>(b2.local) << sep\n    // Contig orientation metadata for cpos_on_m_seq() reconstruction.\n     << contig_len << sep\n     << (flipped_on_contig ? 1 : 0) << sep\n    // SvABA2.0: unique BP identifier. Unset (shouldn't happen if\n    // SvabaRegionProcessor hooked next_bp_id() properly) emits \".\"\n    // so the column count stays fixed and awk scripts don't skew.\n     << (id.empty() ? \".\" : id);\n\n  for (const auto& [_,al] : allele)\n    ss << sep << al.toFileString(svtype);\n  \n  return ss.str();\n  \n}\n\n// make the file string\nstd::string BreakPoint::printSimple(const SeqLib::BamHeader& h) const {\n  \n  std::stringstream out;\n\n  // make sure we set everything forthis\n  assert(svtype != SVType::NOTSET);\n  assert(!cname.empty());\n  assert(b1.gr.chr >= 0);\n  assert(svtype == SVType::DSCRD || b1.nm >= 0);\n  assert(svtype == SVType::DSCRD || b2.nm >= 0);  \n  assert(svtype == SVType::DSCRD || b1.as >= 0);\n  assert(svtype == SVType::DSCRD || b2.as >= 0);  \n    \n  if (svtype == SVType::INDEL) {\n    out << \">\" << (insertion.size() ? \"INS: \" : \"DEL: \") << getSpan() << \" \" << \n      b1.gr.ToString(h) << \" \" << cname;\n    for (const auto& [pref, al] : allele)\n      out << \" \" << pref << \":\" << al.split;  \n  } else {\n    out << \": \" << b1.gr.PointString(h) << \" to \" << b2.gr.PointString(h) << \" SPAN \" << getSpan() << \" \" << cname;\n    for (const auto& [pref, al] : allele)\n      out << \" \" << pref << \":\" << al.split;  \n  }\n  \n  return out.str();\n  \n}\n  \n\n/*std::ostream& operator<<(std::ostream& out, const BreakPoint& b) {\n  \n  if (b.isindel) {\n\tout << \">\" << (b.insertion.size() ? \"INS: \" : \"DEL: \") << b.getSpan() << \" \" << \n\t  b.b1.gr << \" \" << b.cname << \" \" << b.evidence;\n\t//<< \" T/N split: \" << b.t.split << \"/\" << b.n.split << \" T/N cigar: \" \n          //  << b.t.cigar << \"/\" << b.n.cigar << \" T/N Cov \" << b.t.cov << \"/\" << b.n.cov << \" DBSNP: \" << rs_t;\n\tfor (auto& i : b.allele)\n\t  out << \" \" << i.first << \":\" << i.second.split;  \n      } else {\n\tout << \": \" << b.b1.gr.PointString() << \" to \" << b.b2.gr.PointString() << \" SPAN \" << b.getSpan() << \" \" << b.cname << \" \" << b.evidence;\n\t//<< \" T/N split: \" << b.t.split << \"/\" << b.n.split << \" T/N disc: \" \n\t  //  << b.dc.tcount << \"/\" << b.dc.ncount << \" \" << b.evidence;\n\tfor (auto& i : b.allele)\n\t  out << \" \" << i.first << \":\" << i.second.split;  \n      }\n      \n      return out;\n      \n\n\n      }*/\n\nvoid BreakPoint::splitCoverage(svabaReadPtrVector& bav) {\n\n  // dummy left-most and right-most positions that have an\n  // overlapping read2contig alignment\n  split_cov_bounds = {std::numeric_limits<int>::max(), -1};\n  \n  // track if first and second mate covers same split. fishy and remove them both\n  std::unordered_map<std::string, bool> qname_and_num;\n  \n  // keep track of which reads already added\n  std::unordered_set<std::string> qnames;\n  \n  // keep track of reads to reject\n  std::set<std::string> reject_qnames;\n  \n  // keep track of which SR tags are valid splits\n  std::unordered_set<std::string> valid_reads;\n  \n  // SvABA2.0: b1.cpos/b2.cpos are in BAM/genome-forward coordinates, but\n  // the r2c CIGARs and this_r2c.start_on_contig/end_on_contig that we\n  // compare against below are in assembly-native / m_seq coordinates.\n  // For reverse-aligned contigs these are mirror images and the old code\n  // counted reads at the mirror position as \"supporting\". Use the m_seq\n  // cpos pair everywhere we compare against r2c in this function.\n  const auto [m_b1_cpos, m_b2_cpos] = cpos_on_m_seq();\n\n  // SvABA2.0 (v3): homlen is no longer used as a gate input. The old\n  // logic required both_split when homlen > 0 and one_split only when\n  // homlen == 0. That wiped out legitimate spanning reads when the\n  // junction sat inside a long homology region (a common failure mode\n  // for repeat-junction LOH events — tumor looked clean because all\n  // its split reads fell inside the homology and got rejected).\n  // The comparative r2c-vs-native score gate (with per-sample margin)\n  // replaces it: in a long-homology junction, neither alignment wins\n  // decisively, so such reads fail the gate on their own without\n  // special-casing — no \"both_split\" complication needed.\n\n  // loop all of the read to contig alignments for this contig\n  for (const auto& j : bav) {\n\n    r2c this_r2c = j->GetR2C(cname);\n    SVABA_READ_TRACE(j->Qname(), \"SPLIT_COV enter contig=\" << cname\n                << \" r2c_start=\" << this_r2c.start_on_contig\n                << \" r2c_end=\" << this_r2c.end_on_contig\n                << \" r2c_rc=\" << this_r2c.rc\n                << \" r2c_cigar=\" << this_r2c.cig\n                << \" r2c_nm=\" << this_r2c.nm\n                << \" b1_cpos=\" << m_b1_cpos << \" b2_cpos=\" << m_b2_cpos\n                << \" num_align=\" << num_align);\n\n    bool read_should_be_skipped = false;\n\n    // SvABA2.0: principled \"r2c better than native\" gate.\n    //\n    // The fundamental requirement for a read to support a variant is that\n    // the read-to-contig (r2c) alignment must be a *better* explanation\n    // of the read than the read-to-reference alignment that BWA-MEM gave\n    // it in the input BAM. If both alignments are equally clean (the\n    // classic \"duplicated reference\" trap, where a repeat lets BWA align\n    // the read to a paralogous copy with no clips and no NM, while the\n    // r2c is also clean because the contig was assembled from the same\n    // sequence), then the contig provides no extra explanatory power and\n    // the read should *not* count as a variant supporter.\n    //\n    // svaba::readAlignmentScore() (defined in ContigAlignmentScore.h) is\n    // an SV-focused score that heavily penalizes soft-clips and counts\n    // edit distance, so e.g.\n    //\n    //   80M70S NM=0 -> aligned_bp 80, clip_bp 70 -> score   10\n    //   150M   NM=0 -> aligned_bp 150           -> score  150\n    //   90M60S NM=0 ->                          -> score   30\n    //   75M5I70M NM=5 -> aligned_bp 150, NM 5   -> score  140\n    //\n    // and the gate is a strict r2c > native comparison.\n    //\n    // This replaces an earlier hard cap on non-edge soft-clip length:\n    // the score-based comparison is more principled (it lets big edge\n    // clips be fine when the native alignment is also bad, and rejects\n    // small interior indels in r2c when the native alignment is actually\n    // clean) and works for both interior and edge clip cases without\n    // needing separate tumor/normal thresholds.\n    //\n    // Guard only on the r2c CIGAR being populated; if it isn't, there's\n    // nothing to score and we let the downstream checks decide.\n    //\n    // Compile-time kill-switch: `SVABA_R2C_NATIVE_GATE` (SvabaOptions.h).\n    // When set to 0, this entire block is elided — reads are no longer\n    // compared r2c-vs-native and the old \"any r2c-spanning read credits\"\n    // behavior returns. Reintroduces the homology-trap false-positive\n    // somatic bug; flip only to measure the gate's CPU cost. See the\n    // macro's doc comment in SvabaOptions.h.\n#if SVABA_R2C_NATIVE_GATE\n    if (this_r2c.cig.size() > 0) {\n      // r2c side: use the cached NM on this_r2c (filled in r2c::AddAlignment).\n      // The r2c is computed against the *corrected* read sequence.\n      const double r2c_score =\n        svaba::readAlignmentScore(this_r2c.cig, this_r2c.nm);\n\n      // Native side: STRONGLY prefer the corrected-read realignment that\n      // SvabaRegionProcessor stashed on the svabaRead. That comparison is\n      // apples-to-apples: same corrected sequence and same svaba-internal\n      // BWA-MEM parameters as the r2c step. Falling back to the original\n      // input-BAM CIGAR/NM is a last resort (e.g. for reads with\n      // to_assemble == false that never went through correction) and is\n      // expected to be biased: pre-correction NM includes sequencing\n      // errors that BFC would have fixed, which inflates native edit\n      // distance and lets r2c look artificially \"better\".\n      SeqLib::Cigar native_cig;\n      int32_t       native_nm = -1;\n      if (j->corrected_native_cig.size() > 0) {\n        native_cig = j->corrected_native_cig;\n        native_nm  = j->corrected_native_nm;\n      } else {\n        native_cig = j->GetCigar();\n        j->GetIntTag(\"NM\", native_nm);\n      }\n\n      // If neither path produced a usable native CIGAR, fall back to the\n      // read length as a conservative perfect-native upper bound. This\n      // prevents a read with no recoverable native alignment from\n      // auto-passing the gate just because native_score defaulted to 0.\n      double native_score = svaba::readAlignmentScore(native_cig, native_nm);\n      if (native_cig.size() == 0) {\n        native_score = static_cast<double>(j->Length());\n      }\n\n      // SvABA2.0 (v3.1): strict greater-than gate, no percentage margin.\n      // r2c must beat native — ties don't credit the read. Both tumor\n      // and normal use margin=0.\n      //\n      // v3 originally had a 10% margin for tumor reads to filter\n      // junction-homology borderline cases, but this was read-length-\n      // dependent and killed real small indels (1bp del on 150bp read =\n      // only 4.9% improvement, impossible to clear 10%; on 250bp read\n      // only 2.9%, can't even clear 3%). Junction-homology cases where\n      // both samples credit borderline reads equally are handled\n      // correctly by the downstream LOD model (similar split support\n      // in both → low somlod → not somatic).\n      const double margin = j->Tumor() ? T_R2C_MIN_MARGIN : N_R2C_MIN_MARGIN;\n      const double threshold = native_score * (1.0 + margin);\n      if (r2c_score <= threshold) {\n        read_should_be_skipped = true;\n        SVABA_TRACE(cname, \"TP8 r2c<=native SKIP read=\" << j->UniqueName()\n                    << \" r2c=\" << r2c_score << \" native=\" << native_score\n                    << \" threshold=\" << threshold << \" margin=\" << margin\n                    << \" tumor=\" << j->Tumor());\n        SVABA_READ_TRACE(j->Qname(), \"SPLIT_COV TP8 SKIP r2c<=native\"\n                    << \" contig=\" << cname\n                    << \" r2c_score=\" << r2c_score << \" native_score=\" << native_score\n                    << \" threshold=\" << threshold << \" margin=\" << margin\n                    << \" tumor=\" << j->Tumor()\n                    << \" r2c_cigar=\" << this_r2c.cig\n                    << \" native_cigar=\" << native_cig\n                    << \" r2c_nm=\" << this_r2c.nm << \" native_nm=\" << native_nm);\n      } else {\n        SVABA_TRACE(cname, \"TP8 r2c>native PASS read=\" << j->UniqueName()\n                    << \" r2c=\" << r2c_score << \" native=\" << native_score\n                    << \" threshold=\" << threshold);\n        SVABA_READ_TRACE(j->Qname(), \"SPLIT_COV TP8 PASS r2c>native\"\n                    << \" contig=\" << cname\n                    << \" r2c_score=\" << r2c_score << \" native_score=\" << native_score\n                    << \" r2c_cigar=\" << this_r2c.cig\n                    << \" native_cigar=\" << native_cig\n                    << \" r2c_nm=\" << this_r2c.nm << \" native_nm=\" << native_nm);\n      }\n    }\n#endif  // SVABA_R2C_NATIVE_GATE\n\n    if (num_align == 1) {\n\n      std::vector<int> del_breaks;\n      std::vector<int> ins_breaks;\n\n      // SvABA2.0: pos must be in *absolute contig* (m_seq / r2c) coordinates\n      // because we compare it below against m_b1_cpos / m_b2_cpos, which are\n      // also absolute contig coordinates (cpos_on_m_seq() handles the flip).\n      // The previous code initialized pos = 0, which made it relative to the\n      // start of this read's CIGAR, so for any read that didn't start at\n      // contig position 0 the indel-at-variant-location check could never\n      // fire. That allowed the \"mirror indel\" failure mode through:\n      // a REF-supporting read whose r2c CIGAR has an inserted/deleted base\n      // exactly at the variant locus (because the contig itself carries the\n      // mirror indel) was being credited as variant-supporting.\n      int pos = this_r2c.start_on_contig;\n\n      // if this is a nasty repeat, don't trust non-perfect alignmentx on r2c alignment\n      // if (checkHomopolymer(j->Sequence()))\n      // \tread_should_be_skipped = true;\n\n      // loop through r2c cigar and see positions\n      for(auto& i : this_r2c.cig) {\n\n\tif (i.Type() == 'D')\n\t  del_breaks.push_back(pos);\n\telse if (i.Type() == 'I')\n\t  ins_breaks.push_back(pos);\n\n\t// update position on contig\n\tif (i.ConsumesReference())\n\t  pos += i.Length(); // update position on contig\n\n      }\n\n      size_t buff = std::max((size_t)3, repeat_seq.length() + 3);\n      // SvABA2.0: the old test was `i > X-buff || i < X+buff`, which is a\n      // tautology (for any i, one side is always true), so it would\n      // reject every read with any D or I in its r2c CIGAR. The intent\n      // is: reject the read if one of its r2c indels lands *at* the\n      // breakpoint position +/- buff (indicating its r2c alignment is\n      // fishy right at the junction we care about). Use AND. We also\n      // check both b1 and b2 so deletions/insertions landing on either\n      // side of the (potentially homologous) junction window are caught.\n      //\n      // NB: copy the structured-binding values (m_b1_cpos, m_b2_cpos) into\n      // plain ints before the lambda. Capturing structured bindings is a\n      // C++20 extension; svaba builds at C++17 so we'd otherwise warn on\n      // -Wc++20-extensions.\n      const int b1c    = m_b1_cpos;\n      const int b2c    = m_b2_cpos;\n      const int ibuff  = static_cast<int>(buff);\n      auto near_break = [b1c, b2c, ibuff](int p) {\n        return (p >= b1c - ibuff && p <= b1c + ibuff) ||\n               (p >= b2c - ibuff && p <= b2c + ibuff);\n      };\n      for (auto& i : del_breaks) if (near_break(i)) {\n        read_should_be_skipped = true;\n        SVABA_TRACE(cname, \"TP9 r2c DEL near break SKIP read=\" << j->UniqueName()\n                    << \" del_pos=\" << i << \" b1c=\" << b1c << \" b2c=\" << b2c << \" buff=\" << ibuff);\n        SVABA_READ_TRACE(j->Qname(), \"SPLIT_COV TP9 SKIP r2c DEL near break\"\n                    << \" contig=\" << cname\n                    << \" del_pos=\" << i << \" b1_cpos=\" << b1c << \" b2_cpos=\" << b2c << \" buff=\" << ibuff);\n      }\n      for (auto& i : ins_breaks) if (near_break(i)) {\n        read_should_be_skipped = true;\n        SVABA_TRACE(cname, \"TP9 r2c INS near break SKIP read=\" << j->UniqueName()\n                    << \" ins_pos=\" << i << \" b1c=\" << b1c << \" b2c=\" << b2c << \" buff=\" << ibuff);\n        SVABA_READ_TRACE(j->Qname(), \"SPLIT_COV TP9 SKIP r2c INS near break\"\n                    << \" contig=\" << cname\n                    << \" ins_pos=\" << i << \" b1_cpos=\" << b1c << \" b2_cpos=\" << b2c << \" buff=\" << ibuff);\n      }\n    }\n\n    if (read_should_be_skipped) {  // default is r2c does not support var, so don't amend this_r2c\n      SVABA_READ_TRACE(j->Qname(), \"SPLIT_COV SKIPPED (gate failed) contig=\" << cname);\n      continue;\n    }\n\n    // get read ID\n    std::string sample_id = j->Prefix(); //substr(0,4); // maybe just make this prefix\n    std::string sr = j->UniqueName();\n\n    // SvABA2.0 (v3): small fixed buffer past each breakend on the\n    // contig. The repeat_seq.length() padding on the older code was\n    // part of the homology-era logic and is dropped — the comparative\n    // r2c-vs-native score gate (with per-sample margin) now handles\n    // tandem-repeat ambiguity on its own: when a short indel at the\n    // junction can equally well live anywhere in a tandem repeat,\n    // r2c and native both fit equivalently and neither wins.\n    int this_tbuff = T_SPLIT_BUFF;\n    int this_nbuff = N_SPLIT_BUFF;\n\n    int rightbreak1 = m_b1_cpos + (j->Tumor() ? this_tbuff : this_nbuff); // read must extend this far right of break1\n    int leftbreak1  = m_b1_cpos - (j->Tumor() ? this_tbuff : this_nbuff); // read must extend this far left of break1\n    int rightbreak2 = m_b2_cpos + (j->Tumor() ? this_tbuff : this_nbuff);\n    int leftbreak2  = m_b2_cpos - (j->Tumor() ? this_tbuff : this_nbuff);\n\n    std::string contig_qname; // for sanity checking\n    // get the alignment position on contig\n    int pos = this_r2c.start_on_contig;\n    int te  = this_r2c.end_on_contig;\n\n    int rightend = te;\n    int leftend  = pos;\n    bool issplit1 = (leftend <= leftbreak1) && (rightend >= rightbreak1);\n    bool issplit2 = (leftend <= leftbreak2) && (rightend >= rightbreak2);\n\n    bool one_split  = issplit1 || issplit2;\n    SVABA_TRACE(cname, \"TP10 span check read=\" << j->UniqueName()\n                << \" leftend=\" << leftend << \" rightend=\" << rightend\n                << \" b1_cpos=\" << m_b1_cpos << \" b2_cpos=\" << m_b2_cpos\n                << \" issplit1=\" << issplit1 << \" issplit2=\" << issplit2\n                << \" one_split=\" << one_split);\n    SVABA_READ_TRACE(j->Qname(), \"SPLIT_COV TP10 span check\"\n                << \" contig=\" << cname\n                << \" leftend=\" << leftend << \" rightend=\" << rightend\n                << \" b1_cpos=\" << m_b1_cpos << \" b2_cpos=\" << m_b2_cpos\n                << \" lbreak1=\" << leftbreak1 << \" rbreak1=\" << rightbreak1\n                << \" lbreak2=\" << leftbreak2 << \" rbreak2=\" << rightbreak2\n                << \" issplit1=\" << issplit1 << \" issplit2=\" << issplit2\n                << \" one_split=\" << one_split\n                << \" tumor=\" << j->Tumor());\n    // SvABA2.0 (v3): previously we required both_split when homlen > 0\n    // (tumor *or* normal) and one_split only when homlen == 0. That\n    // gate threw out legitimate split-supporters inside long junction\n    // homology regions (a common LOH false-somatic pattern). The\n    // principled replacement is the per-sample-prefix r2c > native\n    // score gate (applied above, before this read ever reaches the\n    // valid check). If a read makes it here, its r2c alignment is\n    // strictly better than its native alignment (by the tumor margin\n    // for t*** reads, strictly greater for n*** reads). So we only\n    // need to confirm the read actually spans at least one breakend\n    // on the contig — i.e. it's a \"split\" in the physical sense of\n    // crossing a junction — and then credit it.\n    //\n    // Note: the giant insertion case is subsumed by this rule too — a\n    // large insertion usually means one_split on at least one side.\n    bool valid = one_split;\n\n    // check that deletion (in read to contig coords) doesn't cover break point\n    size_t p = pos; // move along on contig, starting at first non-clipped base\n    for (SeqLib::Cigar::const_iterator c = this_r2c.cig.begin(); c != this_r2c.cig.end(); ++c) {\n      if (c->Type() == 'D') {\n\tif ( (p >= leftbreak1 && p <= rightbreak1) || (p >= leftbreak2 && p <= rightbreak2) ) {\n\t  read_should_be_skipped = true;\n\t  SVABA_TRACE(cname, \"TP11 r2c DEL covers break SKIP read=\" << j->UniqueName()\n\t              << \" del_pos=\" << p << \" lb1=\" << leftbreak1 << \" rb1=\" << rightbreak1\n\t              << \" lb2=\" << leftbreak2 << \" rb2=\" << rightbreak2);\n\t  SVABA_READ_TRACE(j->Qname(), \"SPLIT_COV TP11 SKIP r2c DEL covers break\"\n\t              << \" contig=\" << cname\n\t              << \" del_pos=\" << p);\n\t}\n      }\n      if (c->ConsumesReference()) // if it moves it along the contig\n\tp += c->Length();\n    }\n    \n    // add the split reads for each end of the break\n    // a read is split if it is spans both break ends for tumor, one break end for normal (to\n    // be more sensitive to germline) and if it spans both ends for deletion (should be next to \n    // each other), or one end for insertions larger than 10, or this is a complex breakpoint\n    \n    if (!valid) {\n      SVABA_READ_TRACE(j->Qname(), \"SPLIT_COV NOT CREDITED (failed span check)\"\n                  << \" contig=\" << cname << \" one_split=\" << one_split\n                  << \" read_should_be_skipped=\" << read_should_be_skipped);\n    }\n\n    if (valid) {\n      std::string qn = j->Qname();\n      \n      \n      // if read seen and other read was other mate, then reject\n      if (num_align > 1 && qname_and_num.count(qn) && qname_and_num[qn] != j->FirstFlag()) {\n\t\n\t// need to reject all reads of this qname\n\t// because we saw both first and second in pair hit same split\n\t\n\t// 2023 - turning this off -- why? Beacuse for very short\n\t// insert size distributions, this can still be possible\n\t//reject_qnames.insert(qn);\n\t\n      } else {\n\t\n\t// if haven't seen this read, add here. If have, then dont because want to avoid re-setting first/second convention\n\t// e.g. if we see a split read with first designation, we want to reject all reads with same qname if at any time\n\t// we see one with second mate designation. If we don't have this conditional, we can get fooled if the order is \n\t// 1, 2, 1\n\tif (!qname_and_num.count(qn)) \n\t  qname_and_num[qn] = j->FirstFlag();\n\t\n\t// this is a valid read\n\tthis_r2c.supports_var = true;\n\tvalid_reads.insert(sr);\n\tSVABA_TRACE(cname, \"TP10+ CREDITED read=\" << sr\n\t            << \" sample=\" << sample_id << \" tumor=\" << j->Tumor());\n\tSVABA_READ_TRACE(j->Qname(), \"SPLIT_COV CREDITED as variant supporter\"\n\t            << \" contig=\" << cname << \" sample=\" << sample_id\n\t            << \" tumor=\" << j->Tumor()\n\t            << \" issplit1=\" << issplit1 << \" issplit2=\" << issplit2);\n\t\n\t// how much of the contig do these span\n\t// for a given read QNAME, get the coverage that \n\tsplit_cov_bounds.first = std::min(split_cov_bounds.first, pos);\n\tsplit_cov_bounds.second = std::max(split_cov_bounds.second, te);\n      }\n    }\n    \n    // update the counters for each break end\n    if (issplit1 && valid)\n      ++b1.split[sample_id];\n    if (issplit2 && valid)\n      ++b2.split[sample_id];\t\n    \n    // add r2c back, but as amended\n    //j.AddR2C(cname, this_r2c);\n    \n  } // end read loop\n  \n    // process valid reads\n  for (auto& i : bav) {\n    \n    r2c this_r2c = i->GetR2C(cname);\n    if (valid_reads.count(i->UniqueName())) {\n      \n      std::string qn = i->Qname();\n      if (qnames.count(qn))\n\tcontinue; // don't count support if already added and not a short event\n      // check that it's not a bad 1, 2 split\n      if (reject_qnames.count(qn)) {\n\tthis_r2c.supports_var = false;\n\ti->AddR2C(cname, this_r2c); // update that this actually does not support\n\tcontinue; \n      }\n      \n      reads.push_back(i);\n      \n      // keep track of qnames of split reads\n      qnames.insert(qn);\n      auto prefix = i->Prefix();\n      if (auto it = allele.find(prefix); it != allele.end()) {\n\tauto& sample = it->second;\n\tsample.supporting_reads.insert(i->UniqueName());\n\t++sample.split;\n      } else {\n\tthrow std::runtime_error(\"SampleInfo not instantiated with this bam prefix: \" + prefix);\n      }      \n    }\n  }\n  \n  // adjust the alt count\n  for (auto& [_,al] : allele) {\n    al.UpdateAltCounts();\n  }\n\n#ifdef SVABA_TRACING\n  {\n    int total_split = 0;\n    for (const auto& [pref,al] : allele)\n      total_split += al.split;\n    SVABA_TRACE(cname, \"TP_SPLIT_SUMMARY total_split=\" << total_split\n                << \" reads.size=\" << reads.size()\n                << \" valid_reads=\" << valid_reads.size()\n                << \" per_sample:\");\n    for (const auto& [pref,al] : allele) {\n      SVABA_TRACE(cname, \"  \" << pref << \": split=\" << al.split\n                  << \" alt=\" << al.alt << \" cov=\" << al.cov);\n    }\n  }\n#endif\n\n}\n\nvoid BreakPoint::checkBlacklist(GRC &grv) {\n  if (grv.CountOverlaps(b1.gr) || grv.CountOverlaps(b2.gr)) {\n    confidence = \"BLACKLIST\";\n    SVABA_TRACE(cname, \"TP14 BLACKLIST hit\");\n  }\n}\n\nvoid BreakPoint::set_homologies_insertions() {\n  try { \n    if (b1.cpos > b2.cpos)\n      homology = seq.substr(b2.cpos, b1.cpos-b2.cpos);\n    else if (b2.cpos > b1.cpos)\n      insertion = seq.substr(b1.cpos, b2.cpos-b1.cpos);\n    //if (insertion.length() == 0)\n    //\t;//insertion = \"x\";\n    //if (homology.length() == 0)\n    //;//homology = \"x\";\n  } catch (...) {\n    std::cerr << \"cname: \" << cname << \" b1.cpos \" << b1.cpos << \" b2.cpos \" << b2.cpos << \" seq.length \" << seq.length() << std::endl;\n    std::cerr << \"Caught error with contig on global-getBreakPairs: \" << cname << std::endl;\n    std::cerr << b1.cpos << \" \" << b2.cpos << \" seq.length() \" << seq.length() << \" num_align \" << num_align << std::endl;\n  }\n}\n\n// isleft - this is the left-sided AlignmentFragment, so take the right break\n//          as the breakpoint (and vice versa)\nvoid BreakEnd::transferContigAlignmentData(const AlignmentFragment* f,\n\t\t\t\t\t   bool isleft) {\n\n  const BamRecordPtr &r = f->m_align;\n  \n  // get number of suboptimal alignments\n  r->GetIntTag(\"XS\", sub);  \n  // sub could be 0\n  \n  // get number of !SNV! mismatches\n  // this is a svaba internal trick, since we are interested in\n  // indels, so just track number of point mutation differences\n  r->GetIntTag(\"NM\", nm);\n  assert(nm >= 0);\n  nm = std::max(nm\n              - static_cast<int>(r->MaxInsertionBases())\n              - static_cast<int>(r->MaxDeletionBases()),\n              0);\n\n  // get alignment score\n  r->GetIntTag(\"AS\", as);\n  assert(as >= 0);\n\n  // SvABA2.0: pull the contig-alignment confidence tag. If `zc` wasn't\n  // written recompute\n  // from the record directly so behavior is consistent either way.\n  double cc = svaba::readContigConfTag(*r);\n  if (cc < 0.0) cc = svaba::scoreContigAlignment(*r).confidence;\n  contig_conf = cc;  \n  \n  // transfer mapq and match length\n  mapq     = r->MapQuality();\n  matchlen = r->NumMatchBases();\n\n  // set the coordinates as right-most (for an isleft=true fragment)\n  // or left-most (for an isleft = false fragment)\n  if (isleft) {\n    gr = GenomicRegion(r->ChrID(), f->gbreak2, f->gbreak2);\n    gr.strand = r->ReverseFlag() ? '-' : '+';     \n    cpos = f->break2; \n  } else {\n    gr = GenomicRegion(r->ChrID(), f->gbreak1, f->gbreak1);\n    gr.strand = r->ReverseFlag() ? '+' : '-';\n    cpos = f->break1;\n  }\n}\n \n// construct an indel BreakPoint\nBreakPoint::BreakPoint(const AlignmentFragment* f,\n\t\t       const int idx, \n\t\t       const SvabaSharedConfig* _sc) : sc(_sc)\n{\n\n  svtype = SVType::INDEL;\n  \n  // instantiate the SampleInfo objects for each BAM\n  for (auto const& p : sc->prefixes) {\n    allele.try_emplace(p);\n  }\n  \n  b1.transferContigAlignmentData(f, true);\n  b2.transferContigAlignmentData(f, true);\n\n  // re-zero the positions, not set yet\n  b1.gr.pos1 = b1.gr.pos2 = -1;\n  b2.gr.pos1 = b2.gr.pos2 = -1;\n\n  // this alignment fragemnt underlying alignment\n  const BamRecordPtr &r = f->m_align;\n\n  // SvABA2.0: record the flip-convention of this fragment so that\n  // b1.cpos/b2.cpos (which are computed from the un-flipped BAM CIGAR below,\n  // i.e. in BAM / genome-forward orientation) can be converted to m_seq /\n  // r2c (assembly-native) orientation via BreakPoint::cpos_on_m_seq() at\n  // the sites that need it (split-coverage counting and alignments.txt\n  // rendering). This does NOT change the arithmetic done against\n  // r->Sequence() in this constructor (insertion, homology, repeat_seq),\n  // which legitimately lives in BAM/genome-forward coordinates.\n  flipped_on_contig = f->flipped;\n  contig_len        = static_cast<int>(r->Sequence().length());\n\n  // assign the contig-wide properties\n  cname = r->Qname();\n  seq = r->Sequence();\n  assert(cname.length());\n  assert(seq.length());\n  \n  num_align = 1;\n  \n  b1.gr.strand = '+'; // always the case for indels\n  b2.gr.strand = '-';\n  \n  // set seconary flag\n  secondary = r->SecondaryFlag();\n\n  int curr = 0;     // current position on the contig (starting at zero)\n  int gcurrlen = 0; // current position on the genome (starting at zero)\n\n  //debugprint\n  // if (cname == \"c_1_49001_74001_14C\")\n  //   std::cerr << \"...constructing... \" << idx <<\n  //     \" m_align \" << *r << \" flipped \" << f->flipped << std::endl;\n\n  //NB: curr is the counter for number of based traversed on the contig\n  // this is actually 1-based in how we use it, since e.g. if we have\n  // a cigar like 1M... then right away curr is 1 and we are looking at the\n  // first based of the contig. A bit confusing since C is 0-based, but\n  // this is effectively how this is used below. 1-based is good since\n  // this is what we want the output to be for VCF / SAM spec\n\n  // NB: contig position and genome position internally are 0-based\n  // similar to HTSlib\n  size_t count = 0; // count to make sure we are reporting the right indel\n  // NB: don't worry about \"flip\"\" stuff from AlignedContig,\n  // that's only important for comparing across different alignments/\n  // Since we are parsing indels from a single alignment, which is always\n  // referenced to the forward strand, just go with the raw BamRecord data\n  for (auto& i : f->m_align->GetCigar()) { \n\n    // update the left match side\n    if (i.Type() == 'M' && count < idx)\n      left_match += i.Length();\n    \n    // update the right match side\n    if (i.Type() == 'M' && count > idx)\n      right_match += i.Length();\n\n    // std::cerr << \"LM \" << left_match << \" RM \" << right_match << \" count \" <<\n    //   count << \" idx \" << idx << std::endl; //debug\n    \n    //////\n    // set the breakpoint positions on the contig\n    //////\n    \n    // for either insertion or deletion, first base is the one before the\n    // actual variant\n    // NB: recall that curr is the number of bases thus far\n    //     that have consumed the contig/query e.g. for 140M5D, curr will be 140 since\n    //     the 5D does not consume the query/contig. So in a 0-based system like\n    //     we use here internally to be consistent with htslib and C-rules,\n    //     we add a -1 so that we count the last base of the contig before the deletion\n    //     (e.g. the 140th base, or position 139 in 0-based system) as the first\n    //     base on the contig for the deletion (or insertion).\n    if (count == idx && (i.Type() == 'D' || i.Type() == 'I')) {\n      b1.cpos = curr - 1; // 0-based position of first base before the deletion/insertion\n    }\n    \n    // if deletion\n    if (i.Type() == 'D' && count == idx) {\n      b2.cpos = curr;     // 0-based position of first base after the deletion\n    } \n    \n    // if insertion\n    if (i.Type() == 'I' && count == idx) {\n      b2.cpos = b1.cpos + i.Length();\n      // here, we add the +1 to start so that the actual insertion sequence is\n      // at the first base of the insertion. For VCF reporting in the ALT\n      // column, I'll add the leading reference base later\n      // e.g. for a 2 bp insertion, insertion becomes e.g. AG while\n      // in the ALT column of the VCF/bps it is GAG (if G is last reference match)\n      insertion = f->m_align->Sequence().substr(b1.cpos + 1, i.Length()); \n    }\n    \n    // update the contig position traversal -- consumes query\n    // M,I,S\n    if (i.ConsumesQuery()) \n      curr += i.Length();\n    \n    //////\n    // set the breakpoint positions on the genome\n    //////\n    \n    // set the genome breakpoint\n\n    if (b1.cpos >= 0 && count == idx) {\n\n      if (i.Type() != 'I' && i.Type() != 'D')\n\tthrow std::runtime_error(\"BreakPoint indel parsing - unexpected to get non del/ins CIGAR field\");\n      \n      // here again the -1 is to get htslib position 0-based to SAM format (1-based), since e.g. for\n      //        140M5D, we want the genome position of the start based to be the first\n      //        matching base before the deletion, so again have to -1\n      b1.gr.pos1 = r->Position() + gcurrlen - 1;\n\n      // for deletions, it's the opposite to contig, so deletion consumes the genome\n      if (i.Type() == 'D')\n\tb2.gr.pos1 = b1.gr.pos1 + i.Length();\n      \n      if (i.Type() == 'I') \n\tb2.gr.pos1 = b1.gr.pos1 + 1;\n    }\n    \n    // update the position on the genome\n    // D,M\n    if (i.ConsumesReference()) { \n      gcurrlen += i.Length();\n    }\n    \n    // if (cname == \"c_1_122501_141530_11C\") {\n    //   std::cerr << \" count \" << count << \"    curr \" << curr << \" gcurr \" << gcurrlen <<\n    // \t\" C \" << i << \" insertion \" << insertion << \" cname \" << cname << std::endl;\n    //   std::cerr << f->m_seq << std::endl;\n    //   std::cerr << \"FIPPED \" << f->flipped << std::endl;\n    //   std::cerr << \" b1.gr \" << b1.gr << \" b2.gr \" << b2.gr << std::endl;\n    // }\n\n    ++count;\n    \n  } // end cigar loop\n  \n    // set the dummy other end\n  b1.gr.pos2 = b1.gr.pos1; \n  b2.gr.pos2 = b2.gr.pos1;\n  \n  // should have been explicitly ordered in the creation above\n  if (!(b1.gr < b2.gr)) {\n    std::cerr << \"B1 \" << b1.gr << \" - \" << b2.gr << \" \" << cname << \" b1.cpos \" << b1.cpos << \" b2.cpos \" << b2.cpos << std::endl;\n    std::cerr << f->printToAlignmentsFile() << std::endl;\n    throw std::runtime_error(\"invalid BreakPoint creation in indels in AlignmentFragment\");\n  }\n\n\n  //// add the repeat sequence\n  const std::string& seq = f->m_align->Sequence();\n  const int REPBUFF = 3;\n  for (const auto& [start, end, rep] : svabaUtils::find_long_homopolymers(seq)) {\n    bool crosses_breakpoint = start < (b1.cpos + REPBUFF) && (b2.cpos - REPBUFF) < end;\n    if (rep.length() > repeat_seq.length() && crosses_breakpoint) \n      repeat_seq = rep;\n  }\n  \n  for (const auto& [start, end, rep] : svabaUtils::find_long_dinuc_repeats(seq)) {\n    bool crosses_breakpoint = start < (b1.cpos + REPBUFF) && (b2.cpos - REPBUFF) < end;\n    if (rep.length() > repeat_seq.length() && crosses_breakpoint)\n      repeat_seq = rep;\n  }\n  ///////////\n}\n\nvoid BreakPoint::CombineWithDiscordantClusterMap(DiscordantClusterMap& dmap)\n{\n\n  // don't operate on indels\n  if (svtype == SVType::INDEL)\n    return;\n\n  // since discordant clusters are ordered with the\n  // m_reg1 being more left on the genome, we want to\n  // match that convention for the breakpoint. However,\n  // we can't actually change the bp1 and bp2 ordering\n  // since this is set by the alignment orderings on the contig\n  // not on the genome. So can make a dummy swap just for purposes of\n  // finding the matching discorantcluster\n  // on the GENOME\n  const int PAD = 100;\n  GenomicRegion bp1 = (b1.gr < b2.gr) ? b1.gr : b2.gr;\n  GenomicRegion bp2 = (b1.gr < b2.gr) ? b2.gr : b1.gr;\n  bp1.Pad(PAD);\n  bp2.Pad(PAD);\n  assert(! (bp1 > bp2) );\n    \n  for (auto& [_,d] : dmap) {\n\n    // checks basic things about discordant cluster\n    if (!d.valid())\n      continue;\n\n    assert(d.m_reg1 < d.m_reg2);\n      \n    // do either breakends overlap\n    bool bp1reg1 = bp1.GetOverlap(d.m_reg1) > 0;\n    bool bp2reg2 = bp2.GetOverlap(d.m_reg2) > 0;\n    \n    bool s1 = bp1.strand == d.m_reg1.strand;\n    bool s2 = bp2.strand == d.m_reg2.strand;\n    \n    // get the edge of the cluster\n    // if its a forward alignment discordant read, then get \"right\" most\n    // if its a reverse alignment discordant read, then get \"left\" most\n    int pos1 = d.m_reg1.strand == '+' ? d.m_reg1.pos2 : d.m_reg1.pos1;\n    int pos2 = d.m_reg2.strand == '+' ? d.m_reg2.pos2 : d.m_reg2.pos1;\n\n    // both sides overlap and both orientions agree\n    bool pass = bp1reg1 && bp2reg2 && s1 && s2;\n\n    // check that the ends are not way off\n    // if (std::abs(pos1 - b1.gr.pos1) > PAD ||\n    // \tstd::abs(pos2 - b2.gr.pos1) > PAD)\n    //   pass = false;\n\n    // std::cerr << b1.gr << \" - \" << b2.gr << std::endl;\n    // std::cerr << \" cname \" << cname << \" pad \" << PAD << \" pass \" << pass << \" DC pos1 \" << pos1 << \" DC pos2 \" << pos2 << \n    //   \" s1 \" << s1 << \" s2 \" << s2 << \" bp1reg1 \" << bp1reg1 << \" bp2reg2 \" << bp2reg2 << \" diff1 \" << std::abs(pos1 - b1.gr.pos1) <<\n    //   \" diff2 \" << std::abs(pos2 - b2.gr.pos1) << \" bp pos1 \" << b1.gr.pos1 << \" bp pos2 \" << b2.gr.pos1 << \" \" <<\n    //   d.toFileString(sc->header, false) << std::endl;\n    \n    if (!pass)\n      continue;\n    \n    // check that we haven't already added a cluster to this breakpoint\n    // if so, chose the one with more normal support first, then more\n    // tumor support second\n    if (dc.isEmpty() || (dc.ncount < d.ncount) || (dc.ncount==d.ncount && dc.tcount < d.tcount)) {\n\n      dc = d;\n      d.m_contig = cname;\n      \n      // add the read counts from DiscordantCluster to this BreakPoint\n      // the DiscordantCluster \"counts\" are created at DiscordantCluster constructor\n      assert(!d.counts.empty());      \n      for (auto& c : d.counts) {\n\tallele.at(c.first).disc = c.second;\n      }\n\n      // add the discordant reads names to supporting reads for each sampleinfo\n      // reads\n      for (auto& [_, read] : d.reads) {\n\tallele.at(read->Prefix())\n          .supporting_reads\n          .insert(read->UniqueName());\n      }\n      \n      // mates (and fix the typo in your assert)\n      for (auto& [_, mate] : d.mates) {\n\tallele.at(mate->Prefix())\n          .supporting_reads\n          .insert(mate->UniqueName());\n      }      \n\n      // update the variant support read counts per bam\n      // (i.e. per SampleInfo object in our BreakPoint \"alleles\" structure)\n      for (auto& [_,al] : allele)\n       \tal.UpdateAltCounts();\n    }\n  }\n\n\n  // make sure not claiming discordant + assembly for small spans\n  if (  (getSpan() < 2 * sc->insertsize && getSpan() >= 0)  && b1.gr.strand == '+' && b2.gr.strand == '-')\n    svtype = SVType::ASSMB;\n  else\n    svtype = SVType::ASDIS;\n\n}\n\n// void BreakPoint::set_evidence() {\n  \n//   // if we are in refilter, then this is already set\n//   if (!evidence.empty())\n//     return;\n  \n//   bool isdisc = (dc.tcount + dc.ncount) != 0;\n  \n//   if (num_align == 1)\n//     evidence = \"INDEL\";\n//   else if ( isdisc && svtype == SVType::REARRANGEMENT) //!complex && num_align > 0)\n//     evidence = \"ASDIS\";\n//   else if ( isdisc && num_align < 3)\n//     evidence = \"DSCRD\";\n//   else if (svtype == SVType::REARRANGEMENT)\n//     evidence = \"ASSMB\";\n//   else if (svtype == SVType::TSI_GLOBAL) ///complex && !complex_local) // is A-C of an ABC\n//     evidence = \"TSI_G\";\n//   else if (svtype == SVType::TSI_LOCAL)\n//     //else if (complex && complex_local) // is AB or BC of an ABC \n//     evidence = \"TSI_L\";\n  \n//   assert(evidence.length());\n  \n// }\n\n\nvoid BreakPoint::score_assembly_only() {\n\n  assert(local != LocalAlignment::NOTSET);\n  assert(secondary != -1);\n  \n  int span = getSpan();\n  int num_split = t.split + n.split;\n  int cov_span = split_cov_bounds.second - split_cov_bounds.first ;\n\n  // check for high repeats\n  // bool hi_rep = false;\n  // for (auto& rr : hirepr)\n  //   if (seq.find(rr) != std::string::npos)\n  //     hi_rep = true;\n\n  float as_frac1  = static_cast<float>(b1.as)  / static_cast<float>(b1.matchlen);\n  float sub_frac1 = static_cast<float>(b1.sub) / static_cast<float>(b1.matchlen);  \n  float as_frac2  = static_cast<float>(b2.as)  / static_cast<float>(b2.matchlen);\n  float sub_frac2 = static_cast<float>(b2.sub) / static_cast<float>(b2.matchlen);  \n  const double min_cc = std::min(b1.contig_conf, b2.contig_conf);\n    \n  if (local == LocalAlignment::FROM_DISTANT_REGION && svtype != SVType::TSI_LOCAL)  // added this back in v71\n    // issue is that if a read is secondary aligned, it could be \n    // aligned to way off region. Saw cases where this happend in tumor\n    // and not normal, so false-called germline event as somatic.\n    confidence = \"NOLOCAL\";\n  else if (local == LocalAlignment::NONVAR_LOCAL_REALIGNMENT)\n    confidence = \"LOCALMATCH\";\n  else if ( num_split > 1 && ( (cov_span <= (sc->readlen + 5 ) && cov_span > 0) || cov_span < 0) )\n    confidence = \"DUPREADS\"; // the same sequences keep covering the split\n  else if (homology.length() >= 20 && (span > 1500 || span == -1) && std::max(b1.mapq, b2.mapq) < 60)\n    confidence = \"NODISC\";\n  else if ((int)seq.length() < sc->readlen + 30)\n    confidence = \"TOOSHORT\";\n  else if (a.split < 7 && (span > 1500 || span == -1))  // large and inter chrom need 7+\n    confidence = \"NODISC\";\n  else if (std::max(b1.mapq, b2.mapq) <= 40 || std::min(b1.mapq, b2.mapq) <= 10) \n    confidence = \"LOWMAPQ\";\n  else if ( std::min(b1.mapq, b2.mapq) <= 30 && a.split <= 8 ) \n    confidence = \"LOWMAPQ\";\n  else if (std::max(b1.nm, b2.nm) >= 10 || std::min(as_frac1, as_frac2) < 0.8) \n    confidence = \"LOWAS\";\n  else if ( (std::max(b1.nm, b2.nm) >= 3 || std::min(as_frac1, as_frac2) < 0.85) && getSpan() < 0 )\n    confidence = \"LOWAS\";      \n  //else if ((double)aligned_covered / (double)seq.length() < 0.80) // less than 80% of read is covered by some alignment\n  //  confidence = \"LOWAS\";        \n  else if ( (b1.matchlen < 50 && b1.mapq < 60) || (b2.matchlen < 50 && b2.mapq < 60) )\n    confidence = \"LOWMAPQ\";\n  else if ( std::min(b1.nm, b2.nm) >= 10)\n    confidence = \"LOWMAPQ\";\n  else if (a.split <= 3 && span <= 1500 && span != -1) // small with little split\n    confidence = \"LOWSPLITSMALL\";\n  else if (b1.gr.chr != b2.gr.chr && std::min(b1.matchlen, b2.matchlen) < 60) // inter-chr, but no disc reads, weird alignment\n    confidence = \"LOWICSUPPORT\";\n  else if (b1.gr.chr != b2.gr.chr && std::max(b1.nm, b2.nm) >= 3 && std::min(b1.matchlen, b2.matchlen) < 150) // inter-chr, but no disc reads, and too many nm\n    confidence = \"LOWICSUPPORT\";\n  else if (std::min(b1.matchlen, b2.matchlen) < 0.6 * sc->readlen)\n    confidence = \"LOWICSUPPORT\";      \n  else if (std::min(b1.mapq, b2.mapq) < 50 && b1.gr.chr != b2.gr.chr) // interchr need good mapq for assembly only\n    confidence = \"LOWMAPQ\";\n  else if (std::min(b1.matchlen, b2.matchlen) < 40 ||\n\t   (svtype == SVType::TSI_LOCAL && std::min(b1.matchlen, b2.matchlen) < 100)) // not enough evidence\n    confidence = \"LOWMATCHLEN\";    \n  else if (std::min(b1.matchlen - homology.length(), b2.matchlen - homology.length()) < 40)\n    confidence = \"LOWMATCHLEN\";          \n  else if ((/*b1.sub_n && */b1.mapq < 30) || (/*b2.sub_n && */b2.mapq < 30)) \n    confidence = \"LOWMAPQ\";\n  else if (secondary && std::min(b1.mapq, b2.mapq) < 30)\n    confidence = \"SECONDARY\";\n  // else if ((repeat_seq.length() >= 10 && std::max(t.split, n.split) < 7) || hi_rep)\n  //   confidence = \"WEAKSUPPORTHIREP\";\n  else if (num_split < 6 && getSpan() < 300 && b1.gr.strand==b2.gr.strand) \n    confidence = \"LOWQINVERSION\";\n  // else if ( (b1.matchlen - b1.simple < 15 || b2.matchlen - b2.simple < 15) )\n  //   confidence = \"SIMPLESEQUENCE\";\n  else if ((int)homology.length() * HOMOLOGY_FACTOR > sc->readlen) // if homology is too high, tough to tell from mis-assemly\n    confidence = \"HIGHHOMOLOGY\";\n  else if (min_cc < svaba::kContigConfPassThreshold) \n    confidence = \"WEAKCONTIG\";\n  else\n    confidence = \"PASS\";\n  \n  assert(confidence.length());\n  \n}\n\nvoid BreakPoint::score_somatic(double error_fwd) {\n  \n  // this is LOD of normal being REF vs AF = 0.5+\n  // We want this to be high for a somatic call\n  // NB: this is almost the flip of LOD alt vs ref.\n  //     where high log-odds is more likely there is\n  //     a variant. It makes sense, you always think of\n  //     log-odds as \"higher-is-better\", but are asking\n  //     two different things:\n  //        LO - is this variant versus ref\n  //        LO_n - is this ref *in the normal* = somatic\n\n  // this is a fully Bayesian approach -- if all normals strongly support ref, the sum is huge.\n  // Cons: one bad normal (low or negative LO_n) can be overwhelmed by many good normals.\n  // Commented out since favor conservative approach\n  // double somatic_lod = 0.0;\n  // for (const auto& [pref, al] : allele) {\n  //   if (pref[0] == 'n') {\n  //     somatic_lod += al.LO_n;\n  //   }\n  //}\n\n  // this is a more conservative approach - if any normal BAM shows evidence for\n  // variant, then get the somatic score from that\n  int thiscov_n = n.cov;\n  if (n.alt >= n.cov)  \n    thiscov_n = n.alt;\n  int thiscov_t = t.cov;\n  if (t.alt >= t.cov)  \n    thiscov_t = t.alt;\n\n  // now to be conservative, also count normal near-cigar matches\n  // as alt reads\n  int normal_cigar = n.cigar + n.cigar_near;\n  \n  // adjust the alt count\n  if (n.alt < normal_cigar)\n    n.alt = normal_cigar;\n  if (t.alt < t.split)\n    t.alt = t.split;\n  if (t.alt < t.cigar)\n    t.alt = t.cigar;\n  if (t.alt < t.split)\n    t.alt = t.split;\n  \n  double a_cov_n = (double)thiscov_n * (double)(sc->readlen - 2 * T_SPLIT_BUFF)/sc->readlen;\n  double a_cov_t = (double)thiscov_t * (double)(sc->readlen - 2 * T_SPLIT_BUFF)/sc->readlen;  \n  double scaled_alt_n = std::min((double)n.alt, a_cov_n);  \n  double scaled_ref_n = a_cov_n- scaled_alt_n;\n  double scaled_alt_t = std::min((double)t.alt, a_cov_t);  \n  double scaled_ref_t = a_cov_t- scaled_alt_t;\n  double error_rev = 1e-6;\n  \n  LO_s =\n    SvabaModels::SomaticLOD(scaled_alt_n, a_cov_n,\n\t\t\t    scaled_alt_t, a_cov_t,\n\t\t\t    error_fwd, error_rev);\n\n  if (false)\n  std::cerr << std::fixed << std::setprecision(6)\n\t    << \"[DEBUG] somatic_lod=\" << LO_s\n\t    << \" | n.cov=\" << n.cov\n\t    << \" | n.alt=\" << n.alt\n\t    << \" | n.cigar=\" << n.cigar\n\t    << \" | t.cov=\" << t.cov\n\t    << \" | t.alt=\" << t.alt\n\t    << \" | t.cigar=\" << t.cigar\n\t    << \" | t.split=\" << t.split\n\t    << \" | thiscov_n=\" << thiscov_n\n\t    << \" | thiscov_t=\" << thiscov_t\n\t    << \" | readlen=\" << sc->readlen\n\t    << \" | T_SPLIT_BUFF=\" << T_SPLIT_BUFF\n\t    << \" | a_cov_n=\" << a_cov_n\n\t    << \" | a_cov_t=\" << a_cov_t\n\t    << \" | scaled_alt_n=\" << scaled_alt_n\n\t    << \" | scaled_ref_n=\" << scaled_ref_n\n\t    << \" | scaled_alt_t=\" << scaled_alt_t\n\t    << \" | scaled_ref_t=\" << scaled_ref_t\n\t    << \" | error_fwd=\" << error_fwd\n\t    << \" | error_rev=\" << error_rev\n\t    << \" | somatic_LOD=\" << LO_s\n\t    << std::endl;\n  \n  /*for (const auto& [pref, al] : allele) {\n    if (pref[0] == 'n') {\n      LO_s = std::min(somatic_lod, al.LO_n);\n    }\n    }*/\n  \n  // find the somatic to normal ratio\n  double ratio = n.alt > 0 ?\n    (double)t.alt / (double)n.alt : 100;    \n  \n  if (svtype == SVType::INDEL) {\n    \n    // somatic score is just true or false for now\n    // use the specified cutoff for indels, taking into account whether at dbsnp site\n    double cutoff = (rs.empty() || rs==\"x\") ? sc->opts.lodSomatic : sc->opts.lodSomaticDb;\n    somatic = LO_s > cutoff ? SomaticState::SOMATIC_LOD : SomaticState::NORMAL_LOD;\n    \n    // can't call somatic with 5+ normal reads or <5x more tum than norm ALT\n    //if ((ratio <= 12 && n.cov > 10) || n.alt > 5)\n    //if (n.alt > 5)\n    // for SVs, use LOD and then also a hard cutoff\n    // for gauging somatic vs germline\n  } else {\n    \n    // passes\n    somatic = (LO_s > sc->opts.lodSomatic) ? SomaticState::SOMATIC_LOD : SomaticState::NORMAL_LOD;\n    \n    // require no reads in normal or MAX 1 read and tons of tumor reads\n    if (ratio < MIN_SOMATIC_RATIO ||\n\tn.split > 2 && dc.ncount > 1)\n      somatic = SomaticState::FAILED;\n  }\n  \n  // set germline if single normal read in discordant clsuter\n  if (svtype == SVType::DSCRD && n.alt > 0 && somatic == SomaticState::SOMATIC_LOD)\n    somatic = SomaticState::FAILED;\n  \n}\n\nvoid BreakPoint::score_assembly_dscrd() {\n\n  int this_mapq1 = b1.mapq;\n  int this_mapq2 = b2.mapq;\n  int span = getSpan();\n  bool germ = dc.ncount > 0 || n.split > 0;\n  \n  int max_a_mapq = std::max(this_mapq1, dc.mapq1);\n  int max_b_mapq = std::max(this_mapq2, dc.mapq2);\n\n  const double min_cc = std::min(b1.contig_conf, b2.contig_conf);\n  \n  \n  // how much of contig is covered by split reads\n  int cov_span = split_cov_bounds.second - split_cov_bounds.first ;\n  \n  // set the total number of supporting reads for tumor / normal\n  // these alt counts should already be one qname per alt (ie no dupes)\n  int t_reads = 0;\n  int n_reads = 0;\n  for (auto& [pref,al] : allele) {\n    if (pref.at(0) == 't')\n      t_reads += al.alt;\n    else\n      n_reads += al.alt;\n  }\n  \n  int total_count = t_reads + n_reads; //n.split + t.split + dc.ncount + dc.tcount;\n  int disc_count = dc.tcount + dc.ncount;\n  //int hq = dc.tcount_hq + dc.ncount_hq;\n  \n  if ( (max_a_mapq < 30 && b1.local == LocalAlignment::FROM_DISTANT_REGION) ||\n       (max_b_mapq < 30 && b2.local == LocalAlignment::FROM_DISTANT_REGION) ||\n       (/*b1.sub_n > 7 && */b1.mapq < 10 && b1.local == LocalAlignment::FROM_DISTANT_REGION) ||\n       (/*b2.sub_n > 7 && */b2.mapq < 10 && b2.local == LocalAlignment::FROM_DISTANT_REGION) )\n    confidence = \"LOWMAPQ\";\n  else if ( std::min(b1.nm, b2.nm) >= 10)\n    confidence = \"LOWMAPQ\";\n  else if ( std::min(b1.mapq, b2.mapq) < 10/* && std::min(dc.mapq1, dc.mapq2) < 10 */)\n    confidence = \"LOWMAPQ\";      \n  else if ( total_count < 4 || (std::max(t.split, n.split) <= 5 && cov_span < (sc->readlen + 5) && disc_count < 7) )\n    confidence = \"LOWSUPPORT\";\n  else if ( total_count < 15 && germ && span == -1) // be super strict about germline interchrom\n    confidence = \"LOWSUPPORT\";\n  else if ( std::min(b1.matchlen, b2.matchlen) < 50 && b1.gr.chr != b2.gr.chr ) \n    confidence = \"LOWICSUPPORT\";\n  else if (secondary && getSpan() < 1000) // local alignments are more likely to be false for alignemnts with secondary mappings\n    confidence = \"SECONDARY\";\t\n  /*else if (dc.tcount_hq + dc.ncount_hq < 3) { // multimathces are bad if we don't have good disc support too\n    if ( ((b1.sub_n && dc.mapq1 < 1) || (b2.sub_n && dc.mapq2 < 1))  )\n    confidence = \"MULTIMATCH\";\n    else if ( ( (secondary || b1.sub_n > 1) && !b1.local) && ( std::min(max_a_mapq, max_b_mapq) < 30 || std::max(dc.tcount, dc.ncount) < 10)) \n    confidence = \"SECONDARY\";\n    else \n    confidence = \"PASS\";\n    }*/\n  else if (min_cc < svaba::kContigConfPassThreshold) \n    confidence = \"WEAKCONTIG\";\n  else \n    confidence = \"PASS\";\n}\n \nvoid BreakPoint::score_dscrd() { \n  \n  t.alt = dc.tcount;\n  n.alt = dc.ncount;\n\n  int nm_count = std::max(dc.nm1, dc.nm2);\n  int disc_count = dc.ncount + dc.tcount;\n  //int hq_disc_count = dc.ncount_hq + dc.tcount_hq;\n  int disc_cutoff = 8;\n  //int hq_disc_cutoff = disc_count >= 10 ? 3 : 5; // reads with both pair-mates have high MAPQ\n\n  const int min_dscrd_size = 2000;\n  if (getSpan() > 0 && (getSpan() < min_dscrd_size && b1.gr.strand == '+' && b2.gr.strand == '-')) // restrict span for del (FR) type \n    confidence = \"LOWSPANDSCRD\";\n  else if ((disc_count < disc_cutoff || std::min(dc.mapq1, dc.mapq2) < 15))\n    confidence = \"LOWMAPQDISC\";\n  else if (nm_count >= 4)\n    confidence = \"HIGHNM\"; \n  else if (!dc.m_id_competing.empty())\n    confidence = \"COMPETEDISC\";\n  else if ( disc_count < disc_cutoff)\n    confidence = \"WEAKDISC\";\n  else \n    confidence = \"PASS\";\n  \n  assert(confidence.length());\n}\n\nvoid BreakPoint::score_indel() {\n  \n  assert(b1.mapq == b2.mapq);\n  \n  bool is_refilter = !confidence.empty(); // act differently if this is refilter run\n  \n  // for refilter, only consider ones that were low lod or PASS\n  // ie ones that with a different lod threshold may be changed\n  // if confidence is empty, this is original run so keep going\n  if (confidence != \"LOWLOD\" &&\n      confidence != \"PASS\" &&\n      is_refilter)\n    return;\n  \n  double max_lod = 0;\n  for (const auto& [_,al] : allele) \n    max_lod = std::max(max_lod, al.LO);\n\n  const double min_cc = std::min(b1.contig_conf, b2.contig_conf);\n \n  // check if homozygous reference is most likely GT\n  // bool homozygous_ref = true;\n  // for (auto& [_,al] : allele) {\n  //   if (al.genotype_likelihoods[0] > al.genotype_likelihoods[1] ||\n  // \tal.genotype_likelihoods[0] > al.genotype_likelihoods[2])\n  //     homozygous_ref = false;\n  // }\n  \n  // get the allelic ractions, just for VLOWAF filter\n  double af_t = t.cov > 0 ? (double)t.alt / (double)t.cov : 0;\n  double af_n = n.cov > 0 ? (double)n.alt / (double)n.cov : 0;\n  double af = std::max(af_t, af_n);\n\n  assert(b1.local != LocalAlignment::NOTSET);  \n  if (b1.local != LocalAlignment::FROM_LOCAL_REGION)\n    confidence=\"NOLOCAL\";\n  if (b1.mapq < 10) \n    confidence=\"LOWMAPQ\";\n  //else if (!is_refilter && (double)aligned_covered / (double)seq.length() < 0.80) // less than 80% of read is covered by some alignment\n  //  confidence = \"LOWAS\";  \n  else if ((/*b1.sub_n && */b1.mapq < 30) || (/*b2.sub_n && */b2.mapq < 30)) \n    confidence = \"LOWMAPQ\";      \n  else if (max_lod < sc->opts.lod && rs.empty())        // non db snp site\n    confidence = \"LOWLOD\";\n  else if (max_lod < sc->opts.lodDb && !rs.empty()) // be more permissive for dbsnp site\n    confidence = \"LOWLOD\";\n  else if (!is_refilter && std::min(left_match, right_match) < 20) \n    confidence = \"SHORTALIGNMENT\"; // no conf in indel if match on either side is too small\n  else if (min_cc < svaba::kContigConfPassThreshold)\n    confidence = \"WEAKCONTIG\";\n  else\n    confidence=\"PASS\";\n\n  SVABA_TRACE(cname, \"TP16 score_indel: confidence=\" << confidence\n              << \" mapq=\" << b1.mapq << \" max_lod=\" << max_lod\n              << \" left_match=\" << left_match << \" right_match=\" << right_match\n              << \" min_cc=\" << min_cc << \" af_t=\" << af_t << \" af_n=\" << af_n\n              << \" t.split=\" << t.split << \" n.split=\" << n.split\n              << \" t.alt=\" << t.alt << \" t.cov=\" << t.cov\n              << \" n.alt=\" << n.alt << \" n.cov=\" << n.cov);\n  for (const auto& [pref,al] : allele) {\n    SVABA_TRACE(cname, \"  \" << pref << \": LO=\" << al.LO\n                << \" split=\" << al.split << \" alt=\" << al.alt\n                << \" cov=\" << al.cov);\n  }\n\n  //debugprint\n  // std::cerr <<\" MAPQ \" << b1.mapq << \" b1.sub_n \" << b1.sub_n <<\n  //   \" b2.sub_n \" << b2.sub_n << \" max_lod \" << max_lod << \" af \" << af << \" is_refilter \" << is_refilter <<\n  //   std::endl;\n  // for (const auto& [pref,al] : allele) {\n  //   std::cerr << \" LOD SCORES \" << pref << \" - \" << al.LO << std::endl;\n  //   std::cerr << \" PL likelihood 0/0 \" << al.phred_likelihoods[0] <<\n  //     \" PL likelihood 0/1 \" << al.phred_likelihoods[1] <<\n  //     \" PL likelihood 1/1 \" << al.phred_likelihoods[2] << std::endl;\n  // }\n  // std::cerr << \"AF T \" << af_t << \" AF N \" << af_n << \" AF \" << af << std::endl;\n  // std::cerr << \" confidene \" << confidence << std::endl;\n  \n}\n\n// LOD cutoff is just whether this is ref / alt\n// LOD cutoff dbsnp is same, but at DBSNP site (should be lower threshold since we have prior)\n// LOD SOM cutoff is cutoff for whether NORMAL BAM(s) are AF = 0\n// LOD SOM DBSNP cutoff same as above, but at DBSNP site (should be HIGHER threshold,\n//   since we have prior that it's NOT somatic\nvoid BreakPoint::scoreBreakpoint() {\n\n  // some sanity checking\n  assert(svtype != SVType::NOTSET);\n  if (!confidence.empty() && confidence != \"BLACKLIST\")\n    throw std::runtime_error(\"BreakPoint confidence already set (unexpected)\");\n\n  // set the error rate\n  // depends on teh repeat context\n  double error_rate = (repeat_seq.length() > 10) ?\n    MAX_ERROR : ERROR_RATES[repeat_seq.length()];\n\n  // first calculate log-odds and genotype likelihoods for each individual bam\n  std::vector<double> lods;\n  for (auto& [pref,al] : allele) {\n    al.modelSelection(error_rate, sc->readlen);\n    lods.push_back(al.LO);\n  }\n\n  /////\n  // Calculate a site-level quality score\n  ///// \n  // Sum the LODs across all your BAMs (assuming independence) to get a combined log-odds\n  double lod_site = std::accumulate(lods.begin(), lods.end(), 0.0);\n  // Convert that back to an error probability\n  double p_err = 1.0 / (1.0 + std::pow(10.0, lod_site));\n  // Phred-scale (-log10) to get a QUAL score\n  int qual_calc  = static_cast<int>(std::lround(-10.0 * std::log10(p_err)));\n  // Cap at 99 \n  quality = std::min({qual_calc, 99});\n  \n  // combine the all tumor bam support and normal bam support\n  for (auto& [pref, al] : allele) {\n    if (pref.at(0) == 't') {\n      t = t + al;\n    } else {\n      n = n + al;\n    }\n  }\n\n  // combine all read support regardless of tumor / normal\n  a = t + n;\n\n  // std::cerr << \" T MODEL \" << error_rate << std::endl;\n  // t.modelSelection(error_rate, sc->readlen);\n  // std::cerr << \" N MODEL \" << error_rate << std::endl;  \n  // n.modelSelection(error_rate, sc->readlen);\n  \n  // kludge. make sure we have included the DC counts (should have done this arleady...)\n  if (svtype == SVType::DSCRD || svtype == SVType::ASDIS) {\n    t.disc = dc.tcount;\n    n.disc = dc.ncount;\n  }\n  \n  // provide a scaled LOD that accounts for MAPQ. Heuristic, not really used\n  //int mapqr1 = b1.local ? std::max(30, b1.mapq) : b1.mapq; // if local, don't drop below 30\n  //int mapqr2 = b2.local ? std::max(30, b2.mapq) : b2.mapq; // if local (aligns to within window), don't drop below 30\n  //double scale = (double)( std::min(mapqr1, mapqr2) - 2 * b1.nm) / (double)60;\n  //for (auto& i : allele) \n  //  i.second.SLO = i.second.LO * scale;\n  //t.SLO = t.LO * scale;\n  //n.SLO = n.LO * scale;\n  //a.SLO = a.LO * scale;\n  \n  // // sanity check\n  // int split =0;\n  // for (auto& i : allele) \n  //   split += i.second.split;\n  // assert( (split == 0 && t.split == 0 && n.split==0) ||\n  // \t  (split > 0 && (t.split + n.split > 0)));\n\n  SVABA_TRACE(cname, \"TP13 scoreBreakpoint: svtype=\" << (int)svtype\n              << \" confidence=\" << confidence\n              << \" t.split=\" << t.split << \" n.split=\" << n.split\n              << \" dc.t=\" << dc.tcount << \" dc.n=\" << dc.ncount\n              << \" quality=\" << quality);\n\n  // if already overlapping blacklist, then we're done\n  if (confidence == \"BLACKLIST\")\n    return;\n\n  // do the scoring\n  bool iscomplex =\n    svtype == SVType::TSI_LOCAL ||\n    svtype == SVType::TSI_GLOBAL; \n\n  // score rearrangements of various kinds\n  if (svtype == SVType::ASSMB || (iscomplex  && (dc.ncount + dc.tcount)==0))\n    score_assembly_only();\n  \n  else if (svtype == SVType::ASDIS || (iscomplex && (dc.ncount + dc.tcount))) \n    score_assembly_dscrd();\n  \n  else if (svtype == SVType::DSCRD) \n    score_dscrd();\n  \n  // it failed assembly filters, but might pass discordant filters\n  // if (evidence == \"ASDIS\" && confidence != \"PASS\") { \n  //   evidence = \"DSCRD\";\n  //   score_dscrd(min_dscrd_size);\n  // }\n  else if (svtype == SVType::INDEL) \n    score_indel(); \n  else\n    throw std::runtime_error(\"no scoring method called in BreakPoint::score_breakpoints\");\n  \n  // set the somatic_score field to true or false\n  score_somatic(error_rate); \n  \n  // quality score is odds that read is\n  // non-homozygous reference (max 99)\n  // quality = 0;\n  // for (auto& a : allele)\n  //   quality = std::max(a.second.NH_GQ, (double)quality); \n  \n}\n\nvoid BreakPoint::setRefAlt(const RefGenome* main_rg,\n\t\t\t   const BamHeader& header) {\n  \n  assert(!main_rg->IsEmpty());\n  assert(ref.empty());\n  assert(alt.empty());\n  assert(svtype != SVType::NOTSET);\n  \n  if (svtype != SVType::INDEL) {\n    \n    try {\n      // get the reference for BP1\n      ref = main_rg->QueryRegion(b1.gr.ChrName(header), b1.gr.pos1, b1.gr.pos1);\n    } catch (const std::invalid_argument& ia) {}\n    \n    try {\n      alt = main_rg->QueryRegion(b2.gr.ChrName(header), b2.gr.pos1, b2.gr.pos1);\n    } catch (const std::invalid_argument& ia) {}\n    \n    \n  } else {\n\n    // insertion\n    if (!insertion.empty()) {\n      \n      try {\n\t// we store b1.gr internally as zero-indexed,\n\t// to be consistent with htslib, so since this passed\n\t// to htslib query, keep as zero-indexed\n\tref = main_rg->QueryRegion(b1.gr.ChrName(header),\n\t\t\t\t   b1.gr.pos1,\n\t\t\t\t   b1.gr.pos1);\n      } catch (const std::invalid_argument& ia) {\n\tref = \"N\";\n\tstd::cerr << \"Caught exception in BreakPoint:setRefAlt for indel ref: \" << ia.what() << std::endl;\n      }\n\n      // alt \n      alt = ref + insertion;\n      \n    // deletion\n    } else {\t\n      \n      // reference\n      assert(b2.gr.pos1 - b1.gr.pos1 - 1 >= 0);\n      try {\n\n\t// again, 0-based, see above comment\n\tref = main_rg->QueryRegion(b1.gr.ChrName(header),\n\t\t\t\t   b1.gr.pos1,\n\t\t\t\t   b2.gr.pos2);\n\n\t// if (cname == \"c_1_49001_74001_14C\")\n\t//   std::cerr << \" REF : \" << ref << \" b1 \" << b1.gr <<\n\t//     \" b2 \" << b2.gr << \" cname \" << cname << std::endl;\n\t\n      } catch (const std::invalid_argument& ia) {\n\tref = std::string(std::abs(b1.gr.pos1 - b2.gr.pos1), 'N');\n\tstd::cerr << \"Caught exception in BreakPoint:setRefAlt for indel ref: \" << ia.what() << std::endl;\t  \n      }\n      alt = ref.substr(0,1);\n    }\n  }\n  \n  if (ref.empty()) {\n    ref = \"N\";\n  }\n  if (alt.empty()) {\n    alt = \"N\";\n  }\n  \n}\n\nint BreakPoint::getSpan() const {\n\n  assert(svtype != SVType::NOTSET);\n  if (svtype == SVType::INDEL && insertion.empty())\n    return b2.gr.pos1 - b1.gr.pos1;\n\n  if (svtype == SVType::INDEL && !insertion.empty())\n    return insertion.length();\n  \n  if (b1.gr.chr == b2.gr.chr)\n    return abs(b2.gr.pos1-b1.gr.pos1);\n\n  // interchromosomal\n  else\n    return -1;\n}\n\n// ReducedBreakPoint::ReducedBreakPoint(const std::string &line, const SeqLib::BamHeader& h) {\n\n//   if (h.isEmpty()) {\n//     std::cerr << \"ReducedBreakPoint::ReducedBreakPoint - Must supply non-empty header\" << std::endl;\n//     exit(EXIT_FAILURE);\n//   }\n\n//   std::istringstream iss(line);\n//   std::string val;\n//   size_t count = 0;\n  \n//   ref = nullptr;\n//   alt = nullptr;\n//   cname = nullptr;\n//   evidence = nullptr;\n//   confidence = nullptr;\n//   insertion = nullptr;\n//   homology = nullptr;\n  \n//   //float afn, aft;\n//   std::string ref_s, alt_s, cname_s, insertion_s, homology_s, evidence_s, confidence_s, read_names_s, bxtable_s;\n  \n//   std::string chr1, pos1, chr2, pos2, repeat_s; \n//   char strand1 = '*', strand2 = '*';\n//   while (std::getline(iss, val, '\\t')) {\n//     try{\n//       switch(++count) {\n//       case 1: chr1 = val; break;\n//       case 2: pos1 = val; break; \n//       case 3: assert(val.length()); strand1 = val.at(0); break;\n//       case 4: chr2 = val; break;\n//       case 5: pos2 = val; break; \n//       case 6: assert(val.length()); strand2 = val.at(0); break;\n//       case 7: \n// \tref_s = val;\n// \tbreak; \n//       case 8: \n// \talt_s = val;\n// \tbreak;\n//       case 9: break; //span = stoi(val); break; // automatically calculated\n//       case 10: //mapq1\n// \tb1 = ReducedBreakEnd(GenomicRegion(chr1, pos1, pos1, h), std::stoi(val)); b1.gr.strand = strand1; break;\n//       case 11: //mapq2\n// \tb2 = ReducedBreakEnd(GenomicRegion(chr2, pos2, pos2, h), std::stoi(val)); b2.gr.strand = strand2; break;\n//       case 12: b1.nm = INTNSTOI(val,255); break;\n//       case 13: b2.nm = INTNSTOI(val,255); break;\n//       case 14: dc.mapq1 = INTNSTOI(val, 255); break;\n//       case 15: dc.mapq2 = INTNSTOI(val, 255); break;\n//       case 16: break; //split (not needed, since in genotype) \n//       case 17: break; //cigar (not needed, since in genotype) \n//       case 18: break; //alt (not needed, since in genotype)\n//       case 19: cov = INTNSTOI(val,65535); break;\n//       case 20: b1.sub_n = INTNSTOI(val,255); break;\n//       case 21: b2.sub_n = INTNSTOI(val,255); break;\n//       case 22: \n// \thomology_s = val;\n// \tbreak; \n//       case 23: \n// \tinsertion_s = val;\n// \tbreak; \n//       case 24: cname_s = val; break;\n//       case 25: num_align = std::min((int)31, std::stoi(val)); break;\n//       case 26: \n// \tpass = val == \"PASS\";\n// \tconfidence_s = val;\n// \tbreak;\n//       case 27: \n// \tevidence_s = val;\n// \tindel = val == \"INDEL\"; \n// \timprecise = val == \"DSCRD\"; \n// \tbreak; \n//       case 28: quality = std::stod(val); break; //std::min((int)255,std::stoi(val)); break;\n//       case 29: secondary = val == \"1\" ? 1 : 0;\n//       case 30: somatic_score = std::stod(val); break;\n//       case 31: LO_s = std::stod(val); break;\n//       case 32: true_lod = std::stod(val); break;\n//       case 33: pon = std::min(255,std::stoi(val)); break;\n//       case 34: repeat_s = val; break; // repeat_seq\n//       case 35: blacklist = (val==\"1\" ? 1 : 0); break;\n//       case 36: dbsnp = val != \"x\"; break;\n//       case 37: read_names_s = val; break; //reads\n//       case 38: bxtable_s = val; break; //bx tags\n//       default:\n// \tformat_s.push_back(val);\n//       }\n      \n//     } catch(...) {\n//       std::cerr << \"caught stoi/stod/stof error on: \" << val << \" for count \" << count << std::endl;\n//       std::cerr << line << std::endl;\n//       exit(1);\n//     }\n//   }\n  \n//   confidence = __string_alloc2char(confidence_s, confidence);\n//   evidence   = __string_alloc2char(evidence_s, evidence);\n//   insertion  = __string_alloc2char(insertion_s, insertion);\n//   homology   = __string_alloc2char(homology_s, homology);\n//   cname      = __string_alloc2char(cname_s, cname);\n//   ref        = __string_alloc2char(ref_s, ref);\n//   alt        = __string_alloc2char(alt_s, alt);\n//   repeat     = repeat_s.empty() ? nullptr : __string_alloc2char(repeat_s, repeat);\n//   if (somatic_score && confidence_s == \"PASS\")\n//     read_names     = read_names_s; // == \"x\" ? nullptr : __string_alloc2char(read_names_s, read_names);\n//   bxtable = bxtable_s;\n  \n// }\n\n\nvoid BreakPoint::SampleInfo::modelSelection(double er, int readlen) {\n  \n  // can't have more alt reads than total reads\n  // well you can for SVs...\n\n  \n  // adjust the coverage to be more in line with restrictions on ALT.\n  // namely that ALT reads must overlap the variant site by more than T_SPLIT_BUFF\n  // bases, but the raw cov calc does not take this into account. Therefore, adjust here\n  //  if (readlen) {\n  double a_cov = (double)cov * (double)(readlen - 2 * T_SPLIT_BUFF)/readlen;\n  a_cov = a_cov < 0 ? 0 : a_cov;\n  //  } else {\n  //    a_cov = thiscov;\n  //  }\n  af = a_cov > 0 ? (double)alt / (double)a_cov : 1;\n  af = af > 1 ? 1 : af;\n  \n  // mutect log liklihood against error\n  // how likely to see these ALT counts if true AF is af\n  // vs how likely to see these ALT counts if true AF is 0\n  // and all the ALTs are just errors. \n  // The higher the error rate, the more negative ll_alt will go,\n  // which will drive LO lower and decrease our confidence.\n  // A high er will also drive ll_err up (or less negative), since\n  // it will be more likely to see ALT reads generated by errors\n  // As ALT and COV go higher, we should see LO go higher because\n  // the indiviual calcs will have more confidence. Ultimately,\n  // LO will represent the log likeihood that the variant is AF = af\n  // vs AF = 0\n  double scaled_alt = std::min((double)alt, a_cov);  \n  double scaled_ref = a_cov - scaled_alt;\n\n  // assume indels don't back-mutate as a sequencing error back to ref\n  // but it's good to have this non-zero, so that with the scaling\n  // tricks above, if we do get a non-zero ref count but var af = 1\n  // (which technically isn't mathematically allowed), then having some\n  // non-zero chance that the ref is a back-mutate makes the LO not\n  // become uncomputable (which would revert to -1e12 which is not really what we want)\n  double er_back = 0.000001; \n  double ll_alt = SvabaModels::LogLikelihood(scaled_ref, scaled_alt, af, er, er_back);\n  double ll_err = SvabaModels::LogLikelihood(scaled_ref, scaled_alt, 0 , er, er_back); // likelihood that variant is actually true REF\n\n  //std::cerr << \"scaled_ref \" << scaled_ref << \" scaled_alt \" << scaled_alt << \" af \" << af << \" er \" << er << \" er back \" << er_back << \" ll_alt \" << ll_alt << \" ll_err \" << ll_err << std::endl;\n  // std::cerr << \"SCALD REF \" << scaled_ref << \" scaled alt \" <<\n  //   scaled_alt << \" af \" << af << \" ll_ALT \" << ll_alt <<\n  //   \" ll_err \" << ll_err << \" scaled af \" << scaled_af << std::endl;\n  \n  LO = ll_alt - ll_err; \n  \n  // mutetct log likelihood normal\n  // er = 0.0005; // make this low, so that ALT in REF is rare and NORM in TUM gives low somatic prob\n  // actually, dont' worry about it too much. 3+ alt in ref excludes somatic anyways.\n  // so a high LO_n for the normal means that we are very confident that site is REF only in \n  // normal sample. This is why LO_n from the normal can be used as a discriminant for \n  // germline vs somatic. eg if somatic_lod = normal.LO_n is above a threshold X\n  // or above a larger threshold XX if at DBSNP site, then we accept as somatic\n  // LO_n should not be used for setting the confidence that something is real, just the \n  // confidence that it is somatic\n  // NB: the likelihood that the variant is actually a ref, and any alt reads are explained by errors, is ll_err.\n  //     so ll_err = ll_ref_norm\n  // NB: so it's a bit confusing here, but even though we are calculating the LO_n for\n  //     any sample (tumor, normal, combined) that is passed, we are only interested in (and will use)\n  //     normal.LO_n. This becomes the somatic score, as higher LO_n means it is more likely that the\n  //     variant, specifically in the normal, is explained by sequencing errors with a ground-truth of not-present\n  //     than by a germline indel. For the tumor, LO_n is not really meaningful, so we look at LO in general for\n  //     whether the mutation is around AT ALL.\n  double ll_alt_norm = SvabaModels::LogLikelihood(scaled_ref, scaled_alt, std::max(af, 0.5), er, er_back); // likelihood that variant is at AF >= 0.5 (as expected for germline)\n  LO_n = ll_err - ll_alt_norm; // higher number means more likely to be AF = 0 (ref) than AF = 0.5 (alt). \n\n  // genotype calculation as provided in \n  // http://bioinformatics.oxfordjournals.org/content/early/2011/09/08/bioinformatics.btr509.full.pdf+html\n  //int scaled_cov = std::floor((double)cov * 0.90);\n  //int this_alt = std::min(alt, scaled_cov);\n  genotype_likelihoods[0] = SvabaModels::GenotypeLikelihoods(2, er, scaled_alt, a_cov); // 0/0\n  genotype_likelihoods[1] = SvabaModels::GenotypeLikelihoods(1, er, scaled_alt, a_cov); // 0/1\n  genotype_likelihoods[2] = SvabaModels::GenotypeLikelihoods(0, er, scaled_alt, a_cov); // 1/1\n  \n  //debugprint\n  //std::cerr << \" ALT \" << alt << \" scaled alt \" << scaled_alt << \" ER \" << er << \" A_COV \" << a_cov << \n  //  \" 0/0 \" << genotype_likelihoods[0] << \" 0/1 \" << genotype_likelihoods[1] << \n  //  \" 1/1 \" << genotype_likelihoods[2] << \" LOD \" << LO << \" LO_n \" << LO_n << \n  //  \" af \" << af << std::endl;\n\n  double max_likelihood = *std::max_element(genotype_likelihoods.begin(), genotype_likelihoods.end());\n  if (max_likelihood == genotype_likelihoods[0])\n    genotype = \"0/0\";\n  else if (max_likelihood == genotype_likelihoods[1])\n    genotype = \"0/1\";\n  else \n    genotype = \"1/1\";\n  \n  // compute PLs (phred-scaled likelihoods) \n  for(int i = 0; i < 3; ++i) {\n    // PL = 10 * (GL_i  maxGL), rounded to nearest integer\n    phred_likelihoods[i] = int(std::round( -10.0 * (genotype_likelihoods[i] - max_likelihood) ));\n  }\n  \n  //debugprint\n  // std::cerr << \" thiscov \" << thiscov << \" alt \" << alt << \" cigar \" << cigar << \" split \" << split <<\n  //   \" a_cov \" << a_cov << \" af \" << af << \" scaled_alt \" << scaled_alt << \" ll_alt \" << ll_alt <<\n  //   \" ll_err \" << ll_err << \" LO \" << LO << \" ll_alt_norm \" <<\n  //   ll_alt_norm << \" LO_n \" << LO_n << \" GT 0/0 \" <<\n  //   genotype_likelihoods[0] << \" GT 0/1 \" << genotype_likelihoods[1] <<\n  //   \" GT 1/1 \" << genotype_likelihoods[2] << std::endl;\n  \n  // get the genotype quality\n  GQ = SvabaModels::GenotypeQuality(phred_likelihoods);\n  \n  // get the genotype quality that it is not hom ref\n  NH_GQ   = std::min(phred_likelihoods[0], 99);  \n  \n}\n\nvoid BreakPoint::addCovs(const std::unordered_map<std::string, STCoverage*>& covs) {\n  \n  for (auto& [pref,i] : covs)  {\n    int c = 0;\n    for (int j = -COVERAGE_AVG_BUFF; j <= COVERAGE_AVG_BUFF; ++j) {\n      c +=  i->getCoverageAtPosition(b1.gr.chr, b1.gr.pos1 + j);\n      c +=  i->getCoverageAtPosition(b2.gr.chr, b2.gr.pos1 + j);\n    }\n    allele.at(pref).cov = c / 2 / (COVERAGE_AVG_BUFF*2 + 1);\n  }\n  \n}\n\n// std::string BreakEnd::print(const SeqLib::BamHeader& h) const {\n//   return gr.ToString(h) + \" - \" + id + \" mapq \" + std::to_string(mapq) + \" subn \" + std::to_string(sub_n);\n// }\n\n/*  std::ostream& operator<<(std::ostream& out, const BreakEnd& b) {\n    out << b.gr << \" - \" << b.id << \" mapq \" << b.mapq << \" subn \" << b.sub_n << std::endl;\n    return out;\n    }*/\n  \n\nstd::string BreakPoint::SampleInfo::toFileString(SVType svtype) const {\n\n  std::stringstream pl;\n  pl << phred_likelihoods[0] << ',' \n     << phred_likelihoods[1] << ',' \n     << phred_likelihoods[2];\n  \n  // std::stringstream gt;\n  // gt << genotype_likelihoods[0] << ',' \n  //    << genotype_likelihoods[1] << ',' \n  //    << genotype_likelihoods[2];\n  \n  std::stringstream ss;\n\n  //GT:AD:DP:SR:DR:GQ:PL:LO:LO_n\n  if (svtype == SVType::INDEL)\n    ss << std::setprecision(4)\n       << genotype << \":\"\n       << std::max(alt, cigar) << \":\"\n       << cov << \":\"\n       << split << \":\"\n       << cigar << \":\"\n       << GQ << \":\"\n       << pl.str() << \":\"\n       << LO << \":\"\n       << LO_n;\n  else\n    ss << std::setprecision(4)\n       << genotype << \":\"\n       << alt << \":\"\n       << cov << \":\"\n       << split << \":\"\n       << disc << \":\"\n       << GQ << \":\"\n       << pl.str() << \":\"\n       << LO << \":\"\n       << LO_n;\n  \n  return ss.str();\n  \n}\n\nvoid BreakPoint::SampleInfo::FillFromString(const std::string& s,\n\t\t\t\t\t    SVType svtype) { \n  \n  std::string val;\n  int count = 0;\n  std::istringstream input(s);\n\n  while (std::getline(input, val, ':')) {\n    \n    // tmp fix\n    if (val.find(\"nan\") != std::string::npos)\n      val = \"0\";\n    \n    switch(++count) {\n\n    case 1: genotype = val; break;      \n    case 2: alt = std::stoi(val); break;\n    case 3: cov = std::stoi(val); break;\n    case 4: split = std::stoi(val); break;\n    case 5: \n      if (svtype == SVType::INDEL)\n\tcigar = std::stoi(val);\n      else\n\tdisc = std::stoi(val);\n      break;\n    case 6: GQ = std::stod(val);  break;\n    case 7: phred_likelihoods = svabaUtils::parsePLString(val);  break;\n    case 8: LO =   std::stod(val); break;\n    case 9: LO_n = std::stod(val); break;\n    }\n  }\n\n}\n\n// void BreakPoint::__rep(int rep_num, std::string& rseq, bool fwd) {\n  \n//   // move left and right from breakend 1\n//   //int replen = 0;\n//   //int curr_replen = 1;\n//   rseq = \"\";\n  \n//   // return if we are too close to the edge for some reason\n//   if (b1.cpos > (int)seq.length() - 5)\n//     return;\n  \n//   const int REP_BUFF = 50;\n  \n//   std::string sss = seq;\n//   if (!fwd)\n//     std::reverse(sss.begin(), sss.end());\n//   int cpos = b1.cpos + 1;\n//   if (!fwd)\n//     cpos = seq.length() - b1.cpos;\n  \n//   int i = cpos; //b1.cpos + 1;\n//   int stop = std::min((int)seq.length() - 1, cpos + REP_BUFF); //fwd ? std::min((int)seq.length() - 1, b1.cpos + REP_BUFF) : std::max(0, b1.cpos - REP_BUFF);\n//   int end = -1;\n  \n//   bool no_rep = true;\n  \n//   assert(stop - i < 80);\n  \n//   std::string c = sss.substr(cpos, std::min(rep_num, (int)seq.length() -  cpos));\n  \n//   i += rep_num; //*fr;\n  \n//   for (; i < stop; i+= rep_num) {\n    \n//     if (i >= (int)seq.length() - 1 || i + rep_num > (int)seq.length()) // shouldn't happen, but ensures no substr errors\n//       break;\n    \n//     // terminating\n//     if (c != sss.substr(i,rep_num)) { // || i >= (stop - rep_num)) {\n      \n//       end = i;\n//       break;\n      \n//     } else {\n      \n//       no_rep = false;\n//       //curr_replen += rep_num;\n//     }\n//   }\n  \n//   if (end == -1)\n//     end = stop;\n  \n//   if (!no_rep)\n//     rseq = sss.substr(cpos, std::min(end - cpos, (int)seq.length() - cpos));\n// }\n\nstd::string BreakEnd::hash(int offset) const {\n  \n  return (std::to_string(gr.chr) + \":\" + std::to_string(gr.pos1 + offset));\n  \n}\n\nbool BreakPoint::hasMinimal() const {\n  int count;\n  count = dc.tcount + dc.ncount + t.split + n.split;\n  \n  if (local == LocalAlignment::FROM_DISTANT_REGION)\n    return false;\n  \n  if (count >= 2)\n    return true;\n  \n  return false;\n}\n\nstd::string BreakPoint::getHashString() const {\n\n  if (!isIndel())\n    return \"\";\n\n  bool isdel = insertion.length() == 0;\n  std::string st = std::to_string(b1.gr.chr) +\n    \"_\" + std::to_string(b1.gr.pos1) +  \n    \"_\" + std::to_string(this->getSpan()) +\n    (isdel ? \"D\" : \"I\");\n  \n  return st;\n  \n}\n\nvoid BreakPoint::setLocal(const GenomicRegion& window) {\n  \n  b1.setLocal(window);\n  b2.setLocal(window);\n\n  assert(b1.local != LocalAlignment::NOTSET);\n  assert(b2.local != LocalAlignment::NOTSET);\n\n  // if this was already set as a non-variant local re-alignment\n  // during alignedContig construction, then that has precedent\n  if (local == LocalAlignment::NONVAR_LOCAL_REALIGNMENT)\n    return;\n  \n  // set the BreakPoint level local flag\n  if (b1.local == LocalAlignment::FROM_LOCAL_REGION ||\n      b2.local == LocalAlignment::FROM_LOCAL_REGION)\n    local = LocalAlignment::FROM_LOCAL_REGION;\n  else\n    local = LocalAlignment::FROM_DISTANT_REGION;\n}\n\nvoid BreakEnd::setLocal(const GenomicRegion& window) {\n\n  assert(local == LocalAlignment::NOTSET);\n  if (gr.GetOverlap(window))\n    local = LocalAlignment::FROM_LOCAL_REGION;\n  else\n    local = LocalAlignment::FROM_DISTANT_REGION;\n}\n\nvoid BreakPoint::SampleInfo::UpdateAltCounts() {\n  \n  // get unique qnames\n  std::unordered_set<std::string> qn;\n  for (auto& r : supporting_reads) {\n    size_t posr = r.find(\"_\", 5) + 1; // extract the qname from tXXX_XXX_QNAME\n    qn.insert(r.substr(posr, r.length() - posr));\n  }\n  \n  // alt count is max of cigar or unique qnames (includes split and discordant)\n  alt = std::max((int)qn.size(), cigar);\n  \n}\n\n\n// bool ReducedBreakPoint::operator<(const ReducedBreakPoint& bp) const { \n\n//   //ASDIS > ASSMB > COMP > DSCRD\n//   if (std::strcmp(evidence,bp.evidence) < 0) // <\n//     return true;\n//   else if (std::strcmp(evidence, bp.evidence) > 0) // >\n//     return false;\n  \n//   if (cov > bp.cov)\n//     return true;\n//   else if (cov < bp.cov)\n//     return false;\n\n//   //if (nsplit > bp.nsplit) \n//   //  return true;\n//   //else if (nsplit < bp.nsplit)\n//   //  return false;\n  \n//   //if (tsplit > bp.tsplit)\n//   //  return true;\n//   //else if (tsplit < bp.tsplit)\n//   //  return false;\n  \n//   //if (dc.ncount > bp.dc.ncount)\n//   //  return true;\n//   //else if (dc.ncount < bp.dc.ncount)\n//   //  return false;\n  \n//   //if (dc.tcount > bp.dc.tcount)\n//   // return true;\n//   //else if (dc.tcount < bp.dc.tcount)\n//   // return false;\n\n//   // break the tie somehow\n//   if (cname > bp.cname)\n//     return true;\n//   else if (cname < bp.cname)\n//     return false;\n  \n//   return false;\n// }\n\n// std::ostream& operator<<(std::ostream& os, const ReducedBreakEnd& rbe) {\n//     // Example format: [Chr Name: genomic_region (MapQ, SubN, NM)]\n//     // Adjust formatting as needed\n//      os << rbe.gr << \" (\"\n//        << \"MapQ: \" << static_cast<int>(rbe.mapq) << \", \"\n//        << \"SubN: \" << static_cast<int>(rbe.sub_n) << \", \"\n//        << \"NM: \" << static_cast<int>(rbe.nm) << \")]\";\n//     return os;\n// }\n\n// make a breakpoint from a discordant cluster \nBreakPoint::BreakPoint(DiscordantCluster& tdc,\n\t\t       DiscordantClusterMap& dmap, \n\t\t       const GenomicRegion& region,\n\t\t       const SvabaSharedConfig* sc_) : sc(sc_) {\n\n  svtype = SVType::DSCRD;\n\n  // instantiate the SampleInfo objects for each BAM\n  for (auto const& p : sc->prefixes) {\n    allele.try_emplace(p);\n  }  \n  \n  num_align = 0;\n  dc = tdc;\n  \n  std::string chr_name1, chr_name2;\n\n  // not based on aligmnent of contig, so set as NA (-1)\n  secondary = -1;\n  \n  try {\n    // if this throw error, it means that there are more chr in \n    // reads than in reference\n    chr_name1 = sc->header.IDtoName(dc.m_reg1.chr);\n    chr_name2 = sc->header.IDtoName(dc.m_reg2.chr);      \n    //\tchr_name1 = bwa->ChrIDToName(dc.m_reg1.chr); //bwa->ChrIDToName(tdc.reads.begin()->second.ChrID());\n    //      chr_name2 = bwa->ChrIDToName(dc.m_reg2.chr); //bwa->ChrIDToName(tdc.reads.begin()->second.ChrID());\n  } catch (...) {\n    std::cerr << \"Warning: Found mismatch between reference genome and BAM genome for discordant cluster \" <<\n      dc.print(sc->header) << std::endl;\n    chr_name1 = \"Unknown\";\n    chr_name2 = \"Unknown\";\n  }\n  \n  assert(chr_name1.length());\n  assert(chr_name2.length());\n  \n  int pos1 = (dc.m_reg1.strand == '+') ? dc.m_reg1.pos2 : dc.m_reg1.pos1;\n  int pos2 = (dc.m_reg2.strand == '+') ? dc.m_reg2.pos2 : dc.m_reg2.pos1;\n\n  b1.gr = GenomicRegion(dc.m_reg1.chr, pos1, pos1);\n  b2.gr = GenomicRegion(dc.m_reg2.chr, pos2, pos2);\n  b1.mapq = dc.mapq1;\n  b2.mapq = dc.mapq2;\n  b1.gr.strand = dc.m_reg1.strand;\n  b2.gr.strand = dc.m_reg2.strand;\n  \n  // set the alt counts, counting only unique qnames\n  std::unordered_map<std::string, std::unordered_set<std::string>> alt_counts;\n  for (auto const& p : sc->prefixes) {\n    alt_counts.try_emplace(p);\n}\n  \n  // add the supporting read info to alleles\n  auto process = [this, &alt_counts](auto& container){\n    for (auto& [_, rec] : container) {\n      const auto& prefix = rec->Prefix();\n      \n      auto ait = allele.find(prefix);\n      ait->second.supporting_reads.insert(rec->UniqueName());\n      \n      auto act = alt_counts.find(prefix);\n      act->second.insert(rec->Qname());\n    }\n  };\n  process(dc.reads);\n  process(dc.mates);  \n  \n  // add the alt counts\n  for (auto& [pref,al] : allele) {\n    al.disc = alt_counts[pref].size(); //allele[i.first].supporting_reads.size();\n    al.UpdateAltCounts();\n    //i.second.alt = i.second.disc;\n  }\n  \n  // give a unique id (OK to give an empty header here, since used internally)\n  cname = dc.toRegionString(sc->header) + \"__\" + std::to_string(region.chr+1) + \"_\" + std::to_string(region.pos1) + \n    \"_\" + std::to_string(region.pos2) + \"D\";\n  \n  // check if another cluster overlaps, but different strands\n  if (getSpan() > 800 || getSpan() == -1) { // only check for large events.\n    for (auto& [_,d] : dmap) {\n      \n      // don't overlap if on different chr, or same event\n      if (dc.m_reg1.chr != d.m_reg1.chr || dc.m_reg2.chr != d.m_reg2.chr || d.ID() == dc.ID())\n\tcontinue;\n      \n      // isolate and pad\n      GenomicRegion gr1 = d.m_reg1;\n      GenomicRegion gr2 = d.m_reg2;\n      gr1.Pad(100);\n      gr2.Pad(100);\n      \n      if (dc.m_reg1.GetOverlap(gr1) && dc.m_reg2.GetOverlap(gr2))\n\tif (dc.m_reg1.strand != d.m_reg1.strand || dc.m_reg2.strand != d.m_reg2.strand) {\n\t  dc.m_id_competing = d.ID();\n\t  tdc.m_id_competing = d.ID();\n\t  d.m_id_competing = dc.ID();\n\t}\n    }\n  }\n}\n\n\nvoid BreakPoint::indelCigarCheck(const CigarMapMap& cmap) {\n\n  if (!isIndel())\n    return;\n\n  // get the hash count for this\n  std::string hash = getHashString();\n\n  // tally the number of reads that have cigar that support this\n  // NB: the totalling for tumor, normal occur late in scoreBreakpoints\n  for (auto& [sample,si] : allele) {\n    size_t val = cmap.at(sample).count(hash) ? cmap.at(sample).at(hash) : 0;\n    //std::cerr << \" OG HASH VAL \" << val << \" hash \" << hash << \" sample \" << sample << std::endl;\n    si.cigar += val;\n  }\n\n  int span = getSpan();\n  // for somatic, be extra careful and score \"nearby\" cigars\n  // so e.g. if the normal has\n  // this is really weird and inefficient way to do this, but should be so fast it's inconsequential\n  char in_del[2] = {'D', 'I'};\n  const int CIGAR_NEAR_BUFFER = 4;\n  std::string thischr = std::to_string(b1.gr.chr) + \"_\";\n  for (int i = -CIGAR_NEAR_BUFFER; i <= CIGAR_NEAR_BUFFER; i++) {\n    for (int len = 1; len < (span + 5); len++) {\n      std::string lenst = std::to_string(len);\n      for (int ii = 0; ii < 2; ii++) { // loop I or D\n\tchar c = in_del[ii];\n\tstd::string st = thischr + std::to_string(b1.gr.pos1 + i) + \"_\" + lenst + c;\n\t//std::cerr << \" cname \" << cname << \" st \" << st << \" hash \" << hash << \" i \" << i << \" len \" << len << \" ii \" << ii << \" span \" << span << std::endl;\n\n\tif (hash == st)\n\t  continue; // don't redo this\n\tfor (auto& [sample, si] : allele) {\n\t  size_t val = cmap.at(sample).count(st) ? cmap.at(sample).at(st) : 0;\n\t  si.cigar_near += val;\n\t  //\t  std::cerr << \" sample \" << sample << \" cname \" << cname << \" st \" << st << \" hash \" << hash << \" val \" << val << std::endl;\t  \n\t}\n      }\n    }\n  }\n  \n}\n\n\n\n\n\n\n\n\n\n\n\n\n\nnamespace {\n// split a tab-delimited line (keeps empty fields)\ninline std::vector<std::string> split_tabs(const std::string& s) {\n    std::vector<std::string> out;\n    out.reserve(48);\n    std::string cur;\n    cur.reserve(64);\n    for (char c : s) {\n        if (c == '\\t') { out.push_back(cur); cur.clear(); }\n        else if (c != '\\r' && c != '\\n') { cur.push_back(c); }\n    }\n    out.push_back(cur);\n    return out;\n}\n\ninline long to_long(const std::string& s) {\n    if (s.empty()) return 0;\n    return std::stol(s);\n}\ninline int to_int(const std::string& s) {\n    if (s.empty()) return 0;\n    return std::stoi(s);\n}\ninline double to_double(const std::string& s) {\n    if (s.empty()) return 0.0;\n    return std::stod(s);\n}\ninline char parse_strand(const std::string& s) {\n    return s.empty() ? '.' : s[0]; // expect '+' or '-'\n}\n\ninline std::string upper(std::string v){\n    std::transform(v.begin(), v.end(), v.begin(),\n                   [](unsigned char c){ return std::toupper(c); });\n    return v;\n}\n\n// Map type string to SVType enum; adjust cases to match your enum names.\ninline SVType parse_svtype(const std::string& s_in) {\n    const std::string s = upper(s_in);\n    if (s == \"NOTSET\") return SVType::NOTSET;\n    if (s == \"TSI_LOCAL\") return SVType::TSI_LOCAL; \n    if (s == \"TSI_GLOBAL\") return SVType::TSI_GLOBAL;\n    if (s == \"ASSMB\") return SVType::ASSMB;\n    if (s == \"ASDIS\") return SVType::ASDIS;\n    if (s == \"DSCRD\") return SVType::DSCRD;\n    if (s == \"INDEL\") return SVType::INDEL;\n    return SVType::NOTSET;\n}\n\n// Map somatic field to SomaticState enum; tweak to match your enum.\ninline SomaticState parse_somatic(const std::string& s_in) {\n    const std::string s = upper(s_in);\n    if (s_in == \"1\") return SomaticState::SOMATIC_LOD;\n    return SomaticState::NORMAL_LOD;\n}\n\n// stod that tolerates \"NA\", \".\", \"\".\ninline double stod_safe(const std::string& s) {\n    if (s.empty()) return 0.0;\n    std::string u; u.reserve(s.size());\n    for (char c: s) u.push_back(std::toupper(static_cast<unsigned char>(c)));\n    if (u == \"NA\" || u == \".\") return 0.0;\n    return std::stod(s);\n}\n  \n} // namespace\n\n\nBreakPoint::BreakPoint(const std::string& line, const SvabaSharedConfig* _sc)\n: sc(_sc)\n{\n  if (!line.empty() && line[0] == '#') {\n    throw std::invalid_argument(\"BreakPoint: header/comment line cannot be parsed as data\");\n  }\n  \n  const auto tok = split_tabs(line);\n  // Minimum supported = 41 (legacy pre-SvABA2.0 dumps: core columns through\n  // contig_conf2, no refilter-roundtrip additions). When we see >= 51 we\n  // know the file carries the SvABA2.0 cpos/match/cov/local/flip columns\n  // and we parse them in. This keeps the parser backward-compatible with\n  // bps.txt.gz files produced by older svaba builds.\n  if (tok.size() < 41) {\n    throw std::runtime_error(\"BreakPoint parse error: expected at least 41 columns, got \" + std::to_string(tok.size()));\n  }\n  int i = 0;\n  // Lambda to safely parse an int from a token, tolerating empty / \"x\" / non-\n  // numeric values that older dumps sometimes emit for unset sentinels.\n  auto to_int_safe = [](const std::string& s, int def) -> int {\n    if (s.empty() || s == \"x\" || s == \"NA\" || s == \"nan\") return def;\n    try { return std::stoi(s); } catch (...) { return def; }\n  };\n  auto to_double_safe = [](const std::string& s, double def) -> double {\n    if (s.empty() || s == \"x\" || s == \"NA\" || s == \"nan\") return def;\n    try { return std::stod(s); } catch (...) { return def; }\n  };\n  \n  // ---- fixed columns (1..39) ----\n  const std::string chr1 = tok[i++];\n  const long pos1_1idx   = to_long(tok[i++]);\n  const char s1          = tok[i++].empty() ? '.' : tok[i-1][0];\n  \n  const std::string chr2 = tok[i++];\n  const long pos2_1idx   = to_long(tok[i++]);\n  const char s2          = tok[i++].empty() ? '.' : tok[i-1][0];\n  \n  ref = tok[i++];                          // 7\n  alt = tok[i++];                          // 8\n    /* span */ (void)to_int(tok[i++]);       // 9\n\n    a.split      = to_int(tok[i++]);         // 10\n    a.alt        = to_int(tok[i++]);         // 11\n    a.cov        = to_int(tok[i++]);         // 12\n    a.cigar      = to_int(tok[i++]);         // 13\n    a.cigar_near = to_int(tok[i++]);         // 14\n\n    dc.mapq1 = to_int(tok[i++]);             // 15\n    dc.mapq2 = to_int(tok[i++]);             // 16\n    dc.ncount = to_int(tok[i++]);            // 17\n    dc.tcount = to_int(tok[i++]);            // 18\n\n    b1.mapq = to_int(tok[i++]);              // 19\n    b2.mapq = to_int(tok[i++]);              // 20\n    b1.nm   = to_int(tok[i++]);              // 21\n    b2.nm   = to_int(tok[i++]);              // 22\n    b1.as   = to_int(tok[i++]);              // 23\n    b2.as   = to_int(tok[i++]);              // 24\n    b1.sub  = to_int(tok[i++]);              // 25\n    b2.sub  = to_int(tok[i++]);              // 26\n\n    homology   = tok[i++]; if (homology   == \"x\") homology.clear();      // 27\n    insertion  = tok[i++]; if (insertion  == \"x\") insertion.clear();     // 28\n    repeat_seq = tok[i++]; if (repeat_seq == \"x\") repeat_seq.clear();    // 29\n\n    cname      = tok[i++];                    // 30\n    num_align  = to_int(tok[i++]);            // 31\n    confidence = tok[i++];                    // 32\n\n    svtype    = parse_svtype(tok[i++]);       // 33\n    quality   = to_int(tok[i++]);             // 34\n    secondary = to_int(tok[i++]);             // 35\n\n    somatic = parse_somatic(tok[i++]);        // 36\n    LO_s    = stod_safe(tok[i++]);            // 37\n    max_lod = stod_safe(tok[i++]);            // 38\n\n    rs = tok[i++]; if (rs == \"x\") rs.clear(); // 39\n\n    // ---- contig-confidence columns (40..41) -- previously skipped by this\n    // ---- parser, which caused the first two trailing tokens to be misread\n    // ---- as sample blocks. Now round-tripped correctly.\n    b1.contig_conf = to_double_safe(tok[i++], 1.0);  // 40\n    b2.contig_conf = to_double_safe(tok[i++], 1.0);  // 41\n\n    // ---- SvABA2.0 refilter-roundtrip columns (42..51). Optional: only\n    // ---- parse if present, so we remain backward-compatible with older\n    // ---- bps.txt.gz files (which stop at 41 + per-sample blocks).\n    // ----\n    // ---- Detection heuristic: per-sample blocks are colon-delimited\n    // ---- (GT:AD:DP:SR:...). Core columns 42..51 are plain scalars with\n    // ---- no colons. So we use: \"if tok[41] contains no ':' AND there are\n    // ---- at least 10 more tokens, it's the new format\". This is robust\n    // ---- against unusual sample counts and doesn't need to know n_bams\n    // ---- at parse time.\n    const bool has_new_core_cols =\n      (tok.size() >= static_cast<size_t>(i) + 10) &&\n      (tok[static_cast<size_t>(i)].find(':') == std::string::npos);\n\n    if (has_new_core_cols) {\n      b1.cpos                = to_int_safe(tok[i++], -1);  // 42\n      b2.cpos                = to_int_safe(tok[i++], -1);  // 43\n      left_match             = to_int_safe(tok[i++], -1);  // 44\n      right_match            = to_int_safe(tok[i++], -1);  // 45\n      split_cov_bounds.first  = to_int_safe(tok[i++], 0);  // 46\n      split_cov_bounds.second = to_int_safe(tok[i++], 0);  // 47\n      const int l1           = to_int_safe(tok[i++], 0);   // 48\n      const int l2           = to_int_safe(tok[i++], 0);   // 49\n      auto to_local = [](int v) -> LocalAlignment {\n        switch (v) {\n          case 1:  return LocalAlignment::NONVAR_LOCAL_REALIGNMENT;\n          case 2:  return LocalAlignment::FROM_LOCAL_REGION;\n          case 3:  return LocalAlignment::FROM_DISTANT_REGION;\n          default: return LocalAlignment::NOTSET;\n        }\n      };\n      b1.local               = to_local(l1);\n      b2.local               = to_local(l2);\n      contig_len             = to_int_safe(tok[i++], 0);   // 50\n      flipped_on_contig      = (to_int_safe(tok[i++], 0) != 0); // 51\n\n      // SvABA2.0 v3: optional col 52 = bp_id. Same \"no colons\" test used\n      // above for cols 42..51: per-sample blocks are colon-delimited\n      // (GT:AD:DP:SR:...), while bp_id is a plain `bpTTTNNNNNNNN` string.\n      // If the next token is non-colon AND there are >= n_samples_expected\n      // tokens left after it, we treat it as the bp_id column. Older dumps\n      // (pre-v3, 51 core cols) skip this and leave bp->id empty; the VCF\n      // emitter falls back to its legacy hash-based id in that case.\n      if (static_cast<size_t>(i) < tok.size() &&\n          tok[static_cast<size_t>(i)].find(':') == std::string::npos) {\n        const std::string& maybe_bp_id = tok[static_cast<size_t>(i)];\n        // bp_id always starts with \"bp\" or is \".\" (unset sentinel). Guard\n        // against a malformed input that happens to have a non-colon\n        // token here that isn't actually a bp_id.\n        if (maybe_bp_id == \".\" ||\n            (maybe_bp_id.size() >= 2 && maybe_bp_id[0] == 'b' && maybe_bp_id[1] == 'p')) {\n          id = (maybe_bp_id == \".\" ? std::string() : maybe_bp_id);  // 52\n          ++i;\n        }\n      }\n    } else {\n      // Legacy dump: leave the new fields at their defaults. The PASS /\n      // assembly-only filters that depend on these will degrade gracefully\n      // (e.g. local=NOTSET, cpos=-1, split_cov_bounds={0,0}), and the\n      // refilter flow should prefer the dumped `confidence` string in that\n      // case rather than recomputing.\n      b1.cpos = -1; b2.cpos = -1;\n      left_match = -1; right_match = -1;\n      split_cov_bounds = {0, 0};\n      b1.local = LocalAlignment::NOTSET;\n      b2.local = LocalAlignment::NOTSET;\n      contig_len = 0;\n      flipped_on_contig = false;\n    }\n\n    // Genomic regions (file is 1-based; internal is 0-based)\n    b1.gr.chr    = sc->header.Name2ID(chr1); b1.gr.pos1 = static_cast<int>(pos1_1idx - 1);\n    b1.gr.pos2   = b1.gr.pos1; b1.gr.strand = s1;\n    b2.gr.chr    = sc->header.Name2ID(chr2); b2.gr.pos1 = static_cast<int>(pos2_1idx - 1);\n    b2.gr.pos2   = b2.gr.pos1; b2.gr.strand = s2;\n\n    // Top-level `local` is a summary derived from (b1.local, b2.local). The\n    // original scorer sets it as: FROM_LOCAL_REGION if either end is local,\n    // else FROM_DISTANT_REGION (see ~line 2045 in scoreBreakpoint path).\n    // We only set it here if we read a valid per-end local from the dump;\n    // otherwise leave NOTSET so the caller can rescore.\n    if (b1.local != LocalAlignment::NOTSET || b2.local != LocalAlignment::NOTSET) {\n      if (b1.local == LocalAlignment::FROM_LOCAL_REGION ||\n          b2.local == LocalAlignment::FROM_LOCAL_REGION)\n        local = LocalAlignment::FROM_LOCAL_REGION;\n      else\n        local = LocalAlignment::FROM_DISTANT_REGION;\n    } else {\n      local = LocalAlignment::NOTSET;\n    }\n    imprecise = 0;\n    pass      = 0;  // unreliable — downstream code should gate on confidence\n\n    // ---- trailing per-sample fields (map by order to sc->opts.bams) ----\n    const size_t rem = tok.size() - static_cast<size_t>(i);\n    std::vector<std::string> bam_list;\n    for (const auto& [pref,_] : sc->opts.bams)\n      bam_list.push_back(pref);\n    const size_t nsamples_expected = bam_list.size();\n    \n    if (rem < nsamples_expected) {\n      std::cerr << \"Warning: BreakPoint parse: trailing sample fields fewer than expected (\"\n\t\t<< rem << \" < \" << nsamples_expected << \").\\n\";\n    }\n    \n    const size_t nsamples = std::min(rem, nsamples_expected);\n    for (size_t j = 0; j < nsamples; ++j) {\n      // sample key = first 4 chars of sc->opts.bams[j]\n        const std::string& bam = bam_list[j];\n        const size_t key_len = std::min<size_t>(4, bam.size());\n        const std::string key = bam.substr(0, key_len);\n\n        SampleInfo si;\n        si.FillFromString(tok[i + static_cast<int>(j)], svtype);\n        allele[key] = std::move(si);\n    }\n\n    // Optionally warn if there are extra tokens beyond expected samples\n    if (rem > nsamples_expected) {\n        std::cerr << \"Warning: BreakPoint parse: \" << (rem - nsamples_expected)\n                  << \" extra trailing token(s) ignored.\\n\";\n    }\n}\n"
  },
  {
    "path": "src/svaba/BreakPoint.h",
    "content": "#pragma once\n\n#include <cstdlib>\n#include <string>\n#include <map>\n#include <tuple>\n#include <unordered_map>\n#include <unordered_set>\n\n#include \"DiscordantCluster.h\"\n#include \"SeqLib/BamRecord.h\"\n#include \"SvabaRead.h\"\n\nusing CigarMapMap = std::unordered_map<std::string, SeqLib::CigarMap>;\n\nenum class LocalAlignment {\n  NOTSET,          \n  NONVAR_LOCAL_REALIGNMENT,   // contig aligns to local region without variant\n  FROM_LOCAL_REGION,          // at least one end of contig bp maps to assembled region, this is good\n  FROM_DISTANT_REGION          // neither end maps to local assembly region, this is bad\n};\n\nenum class SVType {\n  NOTSET,\n  TSI_LOCAL,          // TSI_LOCAL\n  TSI_GLOBAL,         // TSI_GLOBAL\n  ASSMB,              // SIMPLE ASSEMBLY\n  ASDIS,\n  DSCRD,         // DISCORDANT ONLY\n  INDEL               // INDEL\n};\n\nenum class SomaticState {\n  NOTSET,\n  SOMATIC_LOD,    // somatic by LOD cutoff\n  NORMAL_LOD,     // normal by LOD cutoff\n  FAILED,         // normal - failed hard filter\n};\n\n// forward declares\nclass STCoverage;\nnamespace SeqLib {\n  class RefGenome;\n  class BamHeader;\n}\nclass AlignmentFragment;\nclass AlignedContig;\n\nusing SeqLib::BamHeader;\nusing SeqLib::BamRecord;\nusing SeqLib::RefGenome;\nusing SeqLib::BamRecordPtr;\nusing SeqLib::GenomicRegion;\nusing SeqLib::GRC;\n\nstruct BreakPoint;\nstruct BreakEnd;\n\ntypedef std::vector<std::string> HashVector;\ntypedef std::vector<BreakPoint> BPVec;\ntypedef std::shared_ptr<BreakPoint> BreakPointPtr;\ntypedef std::vector<BreakPointPtr> BreakPointPtrVector;\n\ntypedef std::unordered_set<std::string> ReadNameSet;\n\nstruct BreakEnd {\n  \n  BreakEnd() = default;\n  \n  void transferContigAlignmentData(const AlignmentFragment* f,\n\t\t\t\t   bool isleft);\n  \n  void setLocal(const GenomicRegion& window);\n  \n  std::string printSimple(const BamHeader& h) const;\n  \n  std::string hash(int offset) const;\n  \n  std::string id;\n  GenomicRegion gr;\n  \n  // contig level informaiton set by AlignmentFragment\n  int mapq = -1; ///< mapping quality of alignment\n  int cpos = -1; ///< breakpoint position on the contig (0-based)\n  int nm = -1;   ///< number of mismatching bases/indels bases\n  int matchlen = -1; /// number of matching bases in the alignment\n  int as = -1;  ///< primary alignment score  \n  int sub = -1; ///< best secondary alignment score\n\n  // Svaba2.0: composite reliability of the contig-alignment fragment backing\n  // this breakend, in [0, 1]. For an SV BreakPoint the two ends can come\n  // from different BWA fragments of the same split-aligned contig, so\n  // each side stores its own score. Default 1.0 so legacy code paths\n  // that never set it don't accidentally demote calls.\n  double contig_conf = 1.0;\n  \n  LocalAlignment local = LocalAlignment::NOTSET;\n  \n  // for high-confidence reads\n  std::unordered_map<std::string, int> split;  \n  \n  //   friend std::ostream& operator<<(std::ostream& out, const BreakEnd& b);\n};\n\nclass BreakPoint {\n  \npublic:\n  \n  // for discordant clusters\n  BreakPoint(DiscordantCluster& tdc,\n\t     DiscordantClusterMap& dmap, \n\t     const GenomicRegion& region,\n\t     const SvabaSharedConfig* _sc);\n\n  // for rearrangements (including complex)\n  BreakPoint(const SvabaSharedConfig* _sc,\n\t     const AlignmentFragment* left,\n\t     const AlignmentFragment* right,\n\t     const AlignedContig* alc);\n\n  // for indels\n  BreakPoint(const AlignmentFragment* f,\n\t     const int idx, // index for which indel on this f alignment we are making\n\t     const SvabaSharedConfig* _sc);  \n\n  // for readback from file\n  BreakPoint(const std::string &line,\n\t     const SvabaSharedConfig* _sc);\n\n  // enforce one of above modalities\n  BreakPoint() = delete;\n  \n  // Disable copy\n  BreakPoint(const BreakPoint&) = delete;\n  BreakPoint& operator=(const BreakPoint&) = delete;\n  \n  // Disable move\n  BreakPoint(BreakPoint&&) = delete;\n  BreakPoint& operator=(BreakPoint&&) = delete;\n  \n  static std::string header() {\n    // Columns 1-41 are historical core fields; 42-51 are SvABA2.0 additions\n    // for refilter round-tripping (contig coords, match lengths, split-cov\n    // bounds, per-end LocalAlignment, contig orientation); 52 is bp_id\n    // (unique thread-stable BreakPoint identifier — see BreakPoint::id).\n    // Per-sample blocks follow. All downstream consumers that index by\n    // NAME (viewer, HTML modules) are header-robust; sort scripts that\n    // hardcode -k37,-k38 still work because somlod/maxlod positions\n    // are unchanged.\n    return std::string(\n\t\t       \"#chr1\\tpos1\\tstrand1\\tchr2\\tpos2\\tstrand2\\tref\\talt\\t\"\n\t\t       \"span\\tsplit\\talt\\tcov\\tcigar\\tcigar_near\\t\"\n\t\t       \"dmq1\\tdmq2\\tdcn\\tdct\\t\"\n\t\t       \"mapq1\\tmapq2\\tnm1\\tnm2\\tas1\\tas2\\tsub1\\tsub2\\t\"\n\t\t       \"homol\\tinsert\\trepeat\\t\"\n\t\t       \"contig_and_region\\tnaln\\tconf\\ttype\\tqual\\t2ndary\\t\"\n\t\t       \"somatic\\tsomlod\\tmaxlod\\tdbsnp\\tcontig_conf1\\tcontig_conf2\\t\"\n\t\t       \"cpos1\\tcpos2\\tlmatch\\trmatch\\tscov1\\tscov2\\t\"\n\t\t       \"local1\\tlocal2\\tctglen\\tflipped\\t\"\n\t\t       \"bp_id\"\n\t\t       );\n  }\n  \n  SomaticState somatic = SomaticState::NOTSET;\n\n  std::string seq, cname, rs,\n    insertion, homology, repeat_seq,\n    confidence, ref, alt;\n\n  // SvABA2.0: unique stable identifier for this BreakPoint, assigned\n  // exactly once per BP in SvabaRegionProcessor::process() via\n  // svabaThreadUnit::next_bp_id() right before the pointer is pushed\n  // into unit.m_bps. Format: \"bpTTTNNNNNNNN\" where TTT is the 3-digit\n  // zero-padded thread ID and NNNNNNNN is an 8-digit zero-padded\n  // per-thread running counter. Because AlignedContig holds its BPs\n  // via shared_ptr, setting id through any reference is visible\n  // everywhere — r2c emission later reads it back through\n  // getAllBreakPoints(). Emitted as the final core column of\n  // bps.txt so downstream tools can cross-reference which BP a read\n  // supports (see r2c's split_bps/disc_bps columns).\n  std::string id;\n  \n  // the evidence per break-end\n  BreakEnd b1, b2;\n  \n  int imprecise = -1; //false;\n  \n  // number of matched bases to left and right \n  // dont want indel matches where there is not confidence alignment\n  // because indel is too close to end\n  int left_match = -1, right_match = -1;\n  \n  // reads spanning this breakpoint (these are read-to-genome, but have an r2c)\n  svabaReadPtrVector reads;\n  \n  // discordant reads supporting this aseembly bp\n  DiscordantCluster dc;\n  \n  int quality = -1;   // QUAL score\n  int secondary = -1; // is this a secondary\n  int pass = -1;      //false;\n  int num_align = 0;  // number of alignments for contigs that generated this\n\n  // SvABA2.0: for indels only, track whether the underlying AlignmentFragment\n  // had its contig sequence flipped (i.e. the primary contig alignment is on\n  // the reverse strand of the genome). b1.cpos / b2.cpos are computed from\n  // the un-flipped BAM CIGAR (so they are BAM/genome-forward coordinates),\n  // but m_seq in the AlignedContig and the read-to-contig positions from the\n  // r2c BWA index are both in assembly-native orientation. When flipped is\n  // true, these two coordinate systems are mirror images and we must convert\n  // cpos to m_seq coordinates before comparing with r2c positions or\n  // rendering onto m_seq. Use cpos_on_m_seq() below to get the converted\n  // (b1, b2) pair.\n  int  contig_len        = 0;\n  bool flipped_on_contig = false;\n\n  // Return (b1.cpos, b2.cpos) converted to m_seq / r2c (assembly-native)\n  // orientation. When flipped_on_contig is false this is the identity.\n  // When flipped, the coordinate system reverses and the \"before\" / \"after\"\n  // sense of an indel swaps, so we mirror AND swap.\n  std::pair<int,int> cpos_on_m_seq() const {\n    if (!flipped_on_contig || contig_len <= 0)\n      return {b1.cpos, b2.cpos};\n    const int L = contig_len;\n    return {L - 1 - b2.cpos, L - 1 - b1.cpos};\n  }\n  \n  double LO_s = 0; // log odds of variant being somatic (see svabaModels.cpp - SomaticLOD)\n  double max_lod = 0; // the highest LOD across all samples\n  \n  SVType svtype = SVType::NOTSET;\n  LocalAlignment local = LocalAlignment::NOTSET;\n\n  const SvabaSharedConfig* sc;\n  \n  // keep track of how much of contig is covered by split\n  // first is left-most position on contig that has a read aligned to it\n  // second is right-most\n  std::pair<int,int> split_cov_bounds;\n\n  GenomicRegion BreakEndAsGenomicRegionLeft() const;\n  \n  GenomicRegion BreakEndAsGenomicRegionRight() const;\n\n  // SvABA2.0: union of UniqueNames of split-supporting reads across all\n  // samples. Used by AlignedContig::printToR2CTsv to tag each read row\n  // with its variant-support kind. SampleInfo is a private nested type,\n  // so we expose this method instead of forcing callers to iterate\n  // `allele` and reach into SampleInfo directly.\n  std::unordered_set<std::string> getAllSupportingReads() const {\n    std::unordered_set<std::string> out;\n    for (const auto& kv : allele)\n      for (const auto& un : kv.second.supporting_reads)\n        out.insert(un);\n    return out;\n  }\n\n  bool isIndel() const;\n  \n  HashVector getBreakEndHashes();\n  \n  void __combine_alleles();\n  \n  void __rep(int rep_num, std::string& rseq, bool fwd = true);\n  \n  void setLocal(const GenomicRegion& window);\n  \n  void score_somatic(double error_fwd);\n\n  void indelCigarCheck(const CigarMapMap& cmap);\n  \n  void addCovs(const std::unordered_map<std::string, STCoverage*>& covs);\n\n   /** Retrieve the reference sequence at a breakpoint and determine if \n    * it lands on a repeat */\n   void repeatFilter();\n\n   std::string printSimple(const BamHeader& h) const;\n\n   void CombineWithDiscordantClusterMap(DiscordantClusterMap& dmap);\n   \n   /*! @function determine if the breakpoint has split read support\n    * @param reference to a vector of read smart pointers that have been aligned to a contig\n    * @discussion Note: will cause an error if the AL tag not filled in for the reads. \n    * The AL tag is filled in by AlignedContig::alignReadsToContigs.\n    */\n   void splitCoverage(svabaReadPtrVector& bav);\n   \n   /*! Determines if the BreakPoint overlays a blacklisted region. If \n    * and overlap is found, sets the blacklist bool to true.\n    *\n    * Note that currently this only is set for the pos1 of indels.\n    * If the BreakPoint object is not an indel, no action is taken. \n    * @param grm An interval tree map created from a BED file containing blacklist regions\n    */\n   void checkBlacklist(GRC &grv);\n   \n   /*! Score a breakpoint with a QUAL score, and as somatic or germline\n    */\n  void scoreBreakpoint(); \n   \n   /*! Compute the allelic fraction (tumor and normal) for this BreakPoint.\n    *\n   * The allelic fraction is computed by taking the base-pair level coverage\n   * as the denominator, and the max of number of split reads and number of \n   * cigar supporting reads as the numerator. Note that because, theoretically\n   * but rarely, the number of split reads could be > 0 while the bp-level coverage\n   * at a variant could be exactly zero. This is because unmapped reads could be called split\n   * reads but are not counted in the coverage calculation. In such a case, the allelic fraction is\n   * set to -1. By the same argument, the allelic fraction could rarely be > 1.\n   * @param t_cov Base-pair level Coverage object, with coverage for all reads from Tumor bam(s).\n   * @param n_cov Base-pair level Coverage object, with coverage for all reads from Normal bam(s).\n   */\n   //void addAllelicFraction(STCoverage * t_cov, STCoverage * n_cov);\n  \n  /*! @function get the span of the breakpoints (in bp). -1 for interchrom\n   * @return int distance between breakpoints\n   */\n   int getSpan() const;\n\n   /*! @function get a unique string representation of this breakpoint.\n    * Format for indel is chr_breakpos_type (eg. 0_134134_I)\n    * @return string with breakpoint info\n    */\n  std::string getHashString() const;\n  \n  bool hasMinimal() const;\n  \n  bool sameBreak(BreakPoint &bp) const;\n  \n  bool isEmpty() const { return (b1.gr.pos1 == 0 && b2.gr.pos1 == 0); }\n  \n  std::string toFileString(const BamHeader& header) const;\n  \n  bool hasDiscordant() const;\n  \n  //bool operator==(const BreakPoint& bp) const;\n  \n  // define how to sort these\n  bool operator<(const BreakPoint& o) const {\n    return std::tie(\n\t\t    b1.gr,      // first key\n\t\t    b2.gr,      // then\n\t\t    n.split,\n\t\t    t.split,\n\t\t    dc.ncount,\n\t\t    dc.tcount,\n\t\t    cname       // last key\n\t\t    ) < std::tie(\n\t\t\t\t o.b1.gr,\n\t\t\t\t o.b2.gr,\n\t\t\t\t o.n.split,\n\t\t\t\t o.t.split,\n\t\t\t\t o.dc.ncount,\n\t\t\t\t o.dc.tcount,\n\t\t\t\t o.cname\n\t\t\t\t );\n  }\n  \n  void score_dscrd(); \n  void score_assembly_only();\n  void score_assembly_dscrd();\n  void score_indel(); \n  void set_homologies_insertions();\n  bool valid() const;\n  \n  void setRefAlt(const RefGenome* main_rg,\n\t\t const BamHeader& header);\n  \n  \n  \n  private:\n  \n  struct SampleInfo {\n\n    \n    // no default construction:\n    SampleInfo() = default;\n\n    int split = 0;\n    int cigar = 0;\n    int cigar_near = 0; // cigar matches close (but not same) \n    int alt = 0;\n    int cov = 0;\n    int disc = 0;\n    \n    // genotype info\n    //NB: PL (the Phred-scaled -10*log_10(GL - max(GL))\n    //        rounded to int by convention\n    double GQ = 0; // GQ take, max 99, quality of the genotype tag\n    double NH_GQ = 0; // GQ of 0/0. Higher is more likely to be not hom ref\n    std::string genotype; // GT tag\n    std::vector<double> genotype_likelihoods = {0,0,0}; // GL tag\n    std::vector<int>    phred_likelihoods = {0,0,0}; // PL tag\n    \n    double af = 0;\n\n    // log odds\n    double LO = 0; // log odds of variant vs error\n    double SLO = 0; // MAPQ scaled log odds of variant vs error\n    double LO_n = 0; // log odds of variant at af=0.5 vs ref (af=0) with errors\n    \n    // UniqueName set of supporting reads\n    // not for read tracking but actually needed for breakpoint scoring\n    ReadNameSet supporting_reads; \n    \n    void modelSelection(double err, int readlen);\n     \n    std::string toFileString(SVType svtype) const;\n     \n    void FillFromString(const std::string& s, SVType svtype);\n    \n     void UpdateAltCounts();\n     \n   };\n\n  // Friend declarations so these free functions can see the private nested type\n  friend std::ostream& operator<<(\n\t\t\t\t  std::ostream& out,\n\t\t\t\t  const BreakPoint::SampleInfo& a\n  );\n  friend BreakPoint::SampleInfo operator+(\n\t\t\t\t\t  const BreakPoint::SampleInfo& a1,\n    const BreakPoint::SampleInfo& a2\n  );\n  \npublic:\n\n  \n\n  //tumor allele, normal allele, all allele\n  SampleInfo t, n, a;\n  \n  // ordered to keep in alphabetical order by prefix (e.g. n001)\n  std::map<std::string, SampleInfo> allele; \n  \n};\n\n // struct ReducedDiscordantCluster {\n //   uint32_t mapq1:8, mapq2:8, tcount:8, ncount:8;\n // };\n \n // struct ReducedBreakPoint {\n\n //   // some helper functions\n //   char* __string_alloc2char(const std::string& str, char * p) {\n //     if (!str.empty() && str != \"x\") {\n //       p = (char*)malloc(str.length() + 1);\n //       strcpy(p, str.c_str());\n //       return p;\n //     } else {\n //       return nullptr;\n //     }\n //   }\n   \n //   inline void smart_check_free(char * p) {\n //     if (p)\n //       free(p);\n //   }\n\n //   int getSpan() const {\n //     if (indel && !insertion) // deletion\n //       return (abs((int)b1.gr.pos1 - (int)b2.gr.pos1) - 1);\n //     if (indel) // insertion\n //       return (strlen(insertion)); // insertion\n //     if (b1.gr.chr == b2.gr.chr)\n //       return abs((int)b1.gr.pos1-(int)b2.gr.pos1);\n //     else\n //       return -1;\n\n //   }\n\n //   // define how to sort these  \n //   bool operator<(const ReducedBreakPoint& bp) const;\n\n //   // print it with the correct chromsome string\n //   std::string print(const BreakPoint& b, const SeqLib::BamHeader& h) const;\n\n //   ReducedBreakPoint() {}\n //   ~ReducedBreakPoint() {\n //     smart_check_free(ref);\n //     smart_check_free(alt);\n //     smart_check_free(cname);\n //     smart_check_free(homology);\n //     smart_check_free(insertion);\n //     smart_check_free(evidence);\n //     smart_check_free(confidence);\n //     smart_check_free(repeat);\n //   }\n //   ReducedBreakPoint(const std::string &line, const SeqLib::BamHeader& h);\n\n //   char * ref;\n //   char * alt;\n //   char * cname;\n //   char * evidence;\n //   char * confidence;\n //   char * insertion;\n //   char * homology;\n //   char * repeat;\n\n //   std::string read_names, bxtable;\n\n //   std::vector<std::string> format_s;\n\n //   ReducedBreakEnd b1, b2;\n //   double somatic_score = 0;\n //   double somatic_lod = 0; // LogOdds that variant not in normal\n //   double true_lod = 0;\n\n //   //uint32_t nsplit:8, tsplit:8, \n //   //uint32_t tcov_support:8, ncov_support:8, tcov:8, ncov:8;\n //   uint32_t cov:16, af_n:7, num_align:5, secondary:1, dbsnp:1, pass:1, blacklist:1, indel:1, imprecise:1;\n //   uint32_t tcigar:8, ncigar:8, dummy:8, af_t:8; \n //   float quality;\n //   uint8_t pon;\n\n //   ReducedDiscordantCluster dc;\n\n // };\n\n"
  },
  {
    "path": "src/svaba/ContigAlignmentScore.cpp",
    "content": "// ContigAlignmentScore.cpp\n//\n// See header for what this does and where it plugs into svaba. The scoring\n// rules below map directly to the filter analysis:\n//\n//   Rule A: n_indel_ops >= 3 is almost certainly mis-alignment in a repeat.\n//           Each additional indel beyond 1 adds a 0.20 penalty.\n//   Rule B: 2+ indels with no single big event (<=20 bp) and noisy flanks\n//           (mm_rate > 0.02) is scattered-small-indel pattern. Flat 0.25\n//           penalty. A single large indel exempts the contig from this\n//           rule, so real big SVs/indels pass.\n//   Rule C: non-indel mismatch rate. Threshold 1% (well above per-base\n//           sequencing error ~0.1-0.5%), slope 10 so 3% mm = 0.20,\n//           5% = 0.40, 10% = 0.90. Extra quadratic kicker above 5% so\n//           very noisy alignments crash to zero.\n//   Rule D: as_per_bp < 0.70 means BWA paid a lot of penalties for this\n//           placement. Smooth penalty scaled 2x.\n//\n// confidence = clamp(1 - sum(penalties), 0, 1).\n\n#include \"ContigAlignmentScore.h\"\n\n#include <algorithm>\n#include <cmath>\n#include <cstdint>\n#include <string>\n\nnamespace svaba {\n\nnamespace {\n\ntemplate <class T>\ninline T clip_range(T v, T lo, T hi) {\n  return std::max(lo, std::min(hi, v));\n}\n\n} // anon\n\nContigAlignScore scoreContigAlignment(const SeqLib::BamRecord& r) {\n  ContigAlignScore s;\n\n  if (!r.MappedFlag()) return s;\n  \n  // --- parse CIGAR --------------------------------------------------------\n  const SeqLib::Cigar cig = r.GetCigar();\n  for (const auto& c : cig) {\n    const int len = static_cast<int>(c.Length());\n    const char op = c.Type();\n    switch (op) {\n      case 'M': case '=': case 'X':\n        s.aligned_bp += len;\n        s.ref_span   += len;\n        break;\n      case 'I':\n        s.n_indel_ops++;\n        s.total_indel_bp += len;\n        if (len > s.max_indel_bp) s.max_indel_bp = len;\n        s.aligned_bp += len;\n        break;\n      case 'D':\n        s.n_indel_ops++;\n        s.total_indel_bp += len;\n        if (len > s.max_indel_bp) s.max_indel_bp = len;\n        s.ref_span += len;\n        break;\n      case 'N':\n        s.ref_span += len;\n        break;\n      case 'S':\n        s.clip_bp += len;\n        break;\n      // 'H' and 'P' contribute nothing\n      default: break;\n    }\n  }\n\n  // --- pull NM / AS / XS --------------------------------------------------\n  int32_t v = 0;\n  if (r.GetIntTag(\"NM\", v)) s.NM = v;\n  if (r.GetIntTag(\"AS\", v)) s.AS = v;\n  if (r.GetIntTag(\"XS\", v)) s.XS = v;\n\n  if (s.NM >= 0) {\n    // NM in BWA includes mismatches + inserted + deleted bp\n    s.mm = std::max(0, s.NM - s.total_indel_bp);\n  }\n  if (s.aligned_bp > 0 && s.NM >= 0) {\n    s.mm_rate = static_cast<double>(s.mm) / s.aligned_bp;\n  }\n  if (s.AS >= 0) {\n    const int denom = std::max(s.aligned_bp, s.ref_span);\n    if (denom > 0) s.as_per_bp = static_cast<double>(s.AS) / denom;\n  }\n  if (s.AS >= 0 && s.XS >= 0) {\n    s.as_xs_gap = s.AS - s.XS;\n  }\n\n  // --- composite penalty --------------------------------------------------\n  double pen = 0.0;\n\n  // Rule A: multi-indel\n  if (s.n_indel_ops >= 2) {\n    pen += 0.20 * (s.n_indel_ops - 1);\n    if (s.reason.empty())\n      s.reason = \"multi_indel(\" + std::to_string(s.n_indel_ops) + \")\";\n  }\n\n  // Rule B: scattered small indels with noisy flanks. Threshold lowered to\n  // 0.02 to match the new mm-rate sensitivity in Rule C.\n  if (s.n_indel_ops >= 2 && s.max_indel_bp <= 20 && s.mm_rate > 0.02) {\n    pen += 0.25;\n    if (s.reason.empty()) s.reason = \"small_indel_cluster_noisy\";\n  }\n\n  // Rule C: non-indel mismatch rate. A clean sequencing + assembly pipeline\n  // should have ~0.1-0.5% per-base error; 1% is already suspicious, 3% is\n  // almost always mis-assembly or mis-alignment into a repeat/paralog.\n  //\n  //   linear slope 10 above 0.01:  1% -> 0, 2% -> 0.10, 3% -> 0.20,\n  //                                5% -> 0.40, 10% -> 0.90\n  //   plus quadratic above 0.05:   5% -> +0, 10% -> +0.075, 15% -> +0.30,\n  //                                20% -> +0.675\n  //\n  // Real indels and soft clips are excluded from mm (NM minus indel bp), so\n  // this rule only fires on genuine base mismatches.\n  if (s.mm_rate > 0.01) {\n    pen += 10.0 * (s.mm_rate - 0.01);\n    if (s.mm_rate > 0.05) {\n      pen += 30.0 * (s.mm_rate - 0.05) * (s.mm_rate - 0.05);\n    }\n    if (s.reason.empty() && s.mm_rate > 0.02) s.reason = \"high_mm_rate\";\n  }\n\n  // Rule D: low AS-density (only if AS was actually present)\n  if (s.AS >= 0 && s.as_per_bp < 0.70) {\n    pen += 2.0 * (0.70 - s.as_per_bp);\n    if (s.reason.empty() && s.as_per_bp < 0.60) s.reason = \"low_AS_density\";\n  }\n\n  s.confidence = clip_range(1.0 - pen, 0.0, 1.0);\n  return s;\n}\n\nvoid tagContigAlignment(SeqLib::BamRecord& r, const ContigAlignScore& s) {\n  // zc:i  = round(1000 * confidence), clamped to [0, 1000]\n  // zi:i  = n_indel_ops\n  // zm:i  = max single-indel length\n  // zr:i  = round(1000 * mm_rate), clamped to [0, 1000]\n\n  if (!r.MappedFlag()) return;   // don't touch aux on unmapped/empty records\n   \n  const int32_t zc_val =\n    clip_range(static_cast<int32_t>(std::lround(1000.0 * s.confidence)),\n               int32_t{0}, int32_t{1000});\n  const int32_t zr_val =\n    clip_range(static_cast<int32_t>(std::lround(1000.0 * s.mm_rate)),\n               int32_t{0}, int32_t{1000});\n\n  r.AddIntTag(\"zc\", zc_val);\n  r.AddIntTag(\"zi\", s.n_indel_ops);\n  r.AddIntTag(\"zm\", s.max_indel_bp);\n  r.AddIntTag(\"zr\", zr_val);\n}\n\ndouble readContigConfTag(const SeqLib::BamRecord& r) {\n  int32_t zc = -1;\n  if (!r.GetIntTag(\"zc\", zc)) return -1.0;   // tag truly absent\n  return std::clamp(zc / 1000.0, 0.0, 1.0);\n}\n \n} // namespace svaba\n"
  },
  {
    "path": "src/svaba/ContigAlignmentScore.h",
    "content": "// ContigAlignmentScore.h\n//\n// Composite quantitative reliability score for a single contig-to-genome\n// alignment. The idea is: once a contig has been aligned back to the\n// reference (via BWAWrapper in SvabaRegionProcessor), we want a single\n// float in [0, 1] that summarizes \"is this a clean alignment I should\n// trust\" vs \"is this a wonky multi-indel pile that BWA forced into a\n// repeat region\".\n//\n// The score flows through svaba in three places:\n//   1. Written to the contig BAM record as tag `zc:i` (milli-confidence,\n//      integer in [0, 1000] so it fits SeqLib's AddIntTag API).\n//   2. Mirrored onto the BreakEnd struct (field `contig_conf`) inside\n//      BreakEnd::transferContigAlignmentData so every BreakPoint carries\n//      both sides' scores forward.\n//   3. Emitted as the `contig_conf` column in bps.txt.gz and used as a\n//      co-gate in the PASS/filter logic.\n\n#pragma once\n\n#include \"SeqLib/BamRecord.h\"\n#include <string>\n\nnamespace svaba {\n\n// Raw components + the final composite confidence.\nstruct ContigAlignScore {\n  // CIGAR-derived\n  int n_indel_ops    = 0;   // count of I + D ops\n  int max_indel_bp   = 0;   // largest single I or D length\n  int total_indel_bp = 0;   // sum of I + D bp\n  int clip_bp        = 0;   // total soft-clip bp (S ops)\n  int aligned_bp     = 0;   // query bp in M/I/=/X (excl. clips)\n  int ref_span       = 0;   // reference bp in M/D/=/X/N\n\n  // Tag-derived (may be missing; -1 = not present)\n  int NM             = -1;\n  int AS             = -1;\n  int XS             = -1;\n\n  // Derived metrics\n  int    mm          = 0;   // ~ NM - total_indel_bp (BWA convention)\n  double mm_rate     = 0.0; // mm / aligned_bp\n  double as_per_bp   = 0.0; // AS / max(aligned_bp, ref_span)\n  int    as_xs_gap   = 0;   // AS - XS (0 if XS absent)\n\n  // Composite confidence in [0, 1]. 1.0 = pristine single-event alignment.\n  double confidence  = 1.0;\n\n  // First rule that pushed the score down; empty means nothing tripped.\n  // Purely for logging/debug; not used by downstream filters.\n  std::string reason;\n};\n\n// Pure function: compute the score from a contig alignment record.\n// Does not mutate the record.\nContigAlignScore scoreContigAlignment(const SeqLib::BamRecord& r);\n\n// Write the score back onto the record as integer tag `zc` in\n// milli-confidence units (round(1000 * confidence), clamped to [0, 1000]).\n// Integer tag keeps us within SeqLib's existing AddIntTag API.\n// Also writes `zi` (n_indel_ops), `zm` (max_indel_bp), `zr` (mm_rate*1000)\n// for diagnostic visibility in IGV / samtools view.\nvoid tagContigAlignment(SeqLib::BamRecord& r, const ContigAlignScore& s);\n\n// Inverse of tagContigAlignment's zc: pull the milli-confidence off a\n// record and return it as a double in [0, 1]. Returns 1.0 if tag absent\n// (so legacy records default to \"trusted\").\ndouble readContigConfTag(const SeqLib::BamRecord& r);\n\n// Default PASS threshold. Anything with contig_conf below this is\n// demoted from PASS. 0.50 is a reasonable default; tune via opts later.\ninline constexpr double kContigConfPassThreshold = 0.50;\n\n// ---------------------------------------------------------------------------\n// Per-read SV-focused alignment score\n// ---------------------------------------------------------------------------\n//\n// Used by BreakPoint::splitCoverage to decide whether a read's r2c\n// (read-to-contig) alignment is genuinely \"better than\" the read's\n// corrected-native (read-to-reference) alignment. Only when r2c is\n// strictly better do we credit the read as variant-supporting. Both sides\n// must use the SAME corrected read sequence and the SAME BWA parameters\n// (svaba's internal aligner) — see svabaRead::corrected_native_cig.\n//\n// Scoring philosophy: an indel-bearing alignment should NOT be allowed to\n// approach the same score as a clean ungapped one. We therefore use a\n// BWA-MEM-style gap penalty (gap-open dominant, modest gap-extend) that\n// is much heavier than the per-bp mismatch cost, so a single indel op\n// definitively pushes the score below a clean alignment of the same\n// length. Mismatches are penalized at a smaller per-bp rate. Soft-clips\n// are penalized 1:1 with matched bp (a clipped base contributes nothing\n// AND costs as much as it would have earned, mirroring the intuition that\n// a clip is \"wasted\" query sequence).\n//\n// Penalty schedule (units = \"effective matched bp\"; loosely modeled on\n// BWA-MEM defaults match=+1 / mm=-4 / gapO=-6 / gapE=-1):\n//\n//   score = aligned_bp                                 (M / I / = / X query bp)\n//         - kReadClipPenaltyPerBp       * clip_bp      (S query bp)\n//         - kReadGapOpenPenalty         * indel_ops    (count of I + D ops)\n//         - kReadGapExtendPenaltyPerBp  * indel_bp     (sum of I + D bp)\n//         - kReadMismatchPenaltyPerBp   * mismatches   (NM - indel_bp; >=0)\n//\n// Worked examples (k_clip=1, k_gapO=6, k_gapE=1, k_mm=4):\n//   150M   NM=0    -> 150                              clean baseline\n//   80M70S NM=0    ->  80 - 70                  =  10  big clip\n//   90M60S NM=0    ->  90 - 60                  =  30\n//   38M3I109M NM=3 -> 150 - 6 - 3               = 141  one 3bp indel,\n//                                                       no mismatches\n//   75M5I70M NM=5  -> 150 - 6 - 5               = 139\n//   75M5D75M NM=5  -> 150 - 6 - 5               = 139  D doesn't consume\n//                                                       query but NM counts\n//   150M   NM=4    -> 150 - 4*4                 = 134  4 mismatches, no\n//                                                       indels (still well\n//                                                       above an indel-\n//                                                       bearing alignment\n//                                                       of equal length —\n//                                                       that's the point)\n//\n// Decision rule in splitCoverage: accept iff\n//   r2cScore > correctedNativeScore (apples-to-apples comparison).\n// Strict \">\" so ties don't credit the read.\n//\n// `nm` may be -1 (tag absent); the mismatch term is dropped in that case\n// but the CIGAR-derived gap-open / gap-extend / clip terms still apply.\ninline constexpr double kReadClipPenaltyPerBp       = 1.0;\ninline constexpr double kReadGapOpenPenalty         = 6.0;\ninline constexpr double kReadGapExtendPenaltyPerBp  = 1.0;\ninline constexpr double kReadMismatchPenaltyPerBp   = 4.0;\n\ninline double readAlignmentScore(const SeqLib::Cigar& cig, int nm) {\n  int aligned_bp = 0;  // M / I / = / X (consumes query)\n  int clip_bp    = 0;  // S\n  int indel_ops  = 0;  // count of I + D ops\n  int indel_bp   = 0;  // sum   of I + D bp\n  for (const auto& c : cig) {\n    const int len = static_cast<int>(c.Length());\n    switch (c.Type()) {\n      case 'M': case '=': case 'X':\n        aligned_bp += len;\n        break;\n      case 'I':\n        aligned_bp += len;       // I consumes query\n        indel_ops  += 1;\n        indel_bp   += len;\n        break;\n      case 'D':\n        indel_ops  += 1;\n        indel_bp   += len;       // D doesn't consume query\n        break;\n      case 'S':\n        clip_bp    += len;\n        break;\n      // 'N', 'H', 'P' contribute nothing.\n      default: break;\n    }\n  }\n  double score = static_cast<double>(aligned_bp)\n               - kReadClipPenaltyPerBp      * clip_bp\n               - kReadGapOpenPenalty        * indel_ops\n               - kReadGapExtendPenaltyPerBp * indel_bp;\n  if (nm >= 0) {\n    // BWA convention: NM = mismatches + inserted_bp + deleted_bp. Subtract\n    // out indel_bp to recover the pure mismatch count; clamp at 0 in case\n    // CIGAR and NM disagree (e.g. NM tag absent / stale).\n    const int mm = std::max(0, nm - indel_bp);\n    score -= kReadMismatchPenaltyPerBp * mm;\n  }\n  return score;\n}\n\n} // namespace svaba\n"
  },
  {
    "path": "src/svaba/DBSnpFilter.cpp",
    "content": "#include \"DBSnpFilter.h\"\n#include \"gzstream.h\"\n\n#include \"SvabaLogger.h\"\n#include \"BreakPoint.h\"\n\n#include \"SeqLib/BamHeader.h\"\n#include \"SeqLib/GenomicRegion.h\"\n\nusing SeqLib::BamHeader;\nusing SeqLib::AddCommas;\nusing SeqLib::GenomicRegion;\nusing SeqLib::GRC;\n\nDBSnpSite::DBSnpSite(const std::string& tchr, const std::string& pos, const std::string& rs, const std::string& ref, const std::string& alt, const BamHeader& h) {\n    \n    // make the genomic region\n    try { \n      GenomicRegion gr(tchr, pos, pos, h);\n      chr = gr.chr; \n      pos1 = std::stoi(pos);\n    } catch (...) {\n      //std::cerr << \"DBSnpSite: Error trying to convert \" << tchr << \":\" << pos << \" to number\" << std::endl;\n    }\n\n    //m_rs = rs;\n    //m_ref = ref;\n    //m_alt = alt;\n\n    if (ref.length() == 0 || alt.length() == 0) // || m_rs.length() == 0)\n      std::cerr << \"DBSnpSite: Is the VCF formated correctly for this entry? Ref \" << ref << \" ALT \" << alt << \" rs \" << rs << std::endl;\n\n    // insertion\n    if (ref.length() == 1)\n      pos2 = pos1 + 1;\n    // deletion\n    else\n      pos2 = pos1 + ref.length() + 1;\n    \n  }\n\nDBSnpFilter::DBSnpFilter(const std::string& db,\n                         const SeqLib::BamHeader& header,\n                         SvabaLogger& logger)\n{\n\n  logger.log(true, true, \"...loading the DBsnp database \", db); \n  // First, try opening the file (gzipped or not)\n  igzstream in(db.c_str());\n  if (!in) {\n    logger.log(true,true, //toerr, tolog\n      \"ERROR: Cannot open DBSNP database file '\", db, \"' for reading.\"\n    );\n    throw std::runtime_error(\"Cannot open DBSnp database: \" + db);\n  }\n\n  std::string line;\n  std::ostringstream cig;\n  while (std::getline(in, line)) {\n    if (line.empty() || line[0] == '#')\n      continue;\n\n    std::istringstream  iss(line);\n    std::string        chr, pos, rs, ref, alt;\n    if (!(iss >> chr >> pos >> rs >> ref >> alt)) {\n      logger.log(\n        true, true,\n        \"WARNING: malformed VCF line in \", db, \": '\", line, \"'. Skipping.\"\n      );\n      continue;\n    }\n\n    // we only care about indels (ref+alt length > 2)\n    if (ref.size() + alt.size() <= 2)\n      continue;\n\n    DBSnpSite site(chr, pos, rs, ref, alt, header);\n    m_sites.add(site);\n\n    // build a simple chr_pos hash\n    cig.str(\"\");\n    cig << chr << \"_\" << site.pos1;\n    m_int_hash.insert(hasher(cig.str()));\n  }\n\n  // finalize our index\n  m_sites.CreateTreeMap();\n  logger.log(true,true, \"Loaded \", m_sites.size(),\n\t     \" indel sites from DBSNP file '\", db, \"'.\");\n}\n\n\nstd::ostream& operator<<(std::ostream& out, const DBSnpFilter& d) {\n  out << \"DBSnpFilter with a total of \" << AddCommas<size_t>(d.m_sites.size());\n  return out;\n}\n\nstd::ostream& operator<<(std::ostream& out, const DBSnpSite& d) {\n  //out << d.chr << \":\" << d.pos1 << \"-\" << d.pos2 << \"\\t\" << d.m_rs << \" REF \" << d.m_ref << \" ALT \" << d.m_alt;\n  out << d.chr << \":\" << d.pos1 << \"-\" << d.pos2;;\n  return out;\n}\n\nbool DBSnpFilter::queryHash(const std::string& h) const {\n  //return m_hash.count(h);\n  return m_int_hash.count(hasher(h));\n}\n\nbool DBSnpFilter::queryBreakpoint(BreakPoint& bp) {\n  \n  std::vector<int32_t> sub, que;\n  GenomicRegion gr = bp.b1.gr;\n  gr.Pad(2);\n  GRC subject(gr);\n  GRC out = subject.FindOverlaps(m_sites, sub, que, true); // true = ignore_strand\n  \n  if (que.size()) {\n    //bp.rs = m_sites[sub[0]].m_rs;\n    bp.rs = \"D\"; \n    //for (auto& j : que) {\n    //bp.rs += m_sites[j].m_rs + \"_\";\n    //}\n    //bp.rs.pop_back(); // just drop the last comma\n    return true;\n  }\n  return false;\n}\n"
  },
  {
    "path": "src/svaba/DBSnpFilter.h",
    "content": "#pragma once\n\n#include <vector>\n#include <cstring>\n#include <iostream>\n#include <unordered_set>\n#include <functional> //for std::hash\n\n#include \"SeqLib/GenomicRegionCollection.h\"\n\nclass BreakPoint;\nclass SvabaLogger;\nnamespace SeqLib {\nclass BamHeader;\n}\n\nclass DBSnpSite: public SeqLib::GenomicRegion {\n\n  public:\n\n  DBSnpSite(const std::string& tchr, const std::string& pos, const std::string& rs, const std::string& ref, const std::string& alt, const SeqLib::BamHeader& h);\n\n    //std::string m_rs;\n    //std::string m_ref;\n    //std::string m_alt;\n\n    friend std::ostream& operator<<(std::ostream& out, const DBSnpSite& d);\n    \n  };\n\ntypedef SeqLib::GenomicRegionCollection<DBSnpSite> DBC;\n\n  class DBSnpFilter {\n    \n  public:\n\n    DBSnpFilter() {}\n\n    DBSnpFilter(const std::string& db, const SeqLib::BamHeader& h,\n\t\tSvabaLogger& logger); \n\n    /** Test whether the variant overlaps a DBSnp site \n     * If it does, fill the BreakPoint rs field\n     */\n    bool queryBreakpoint(BreakPoint& bp);\n\n    bool queryRead(const SeqLib::BamRecord& r) const;\n\n    bool queryHash(const std::string& r) const;\n    \n    friend std::ostream& operator<<(std::ostream& out, const DBSnpFilter& d);\n\n  private:\n\n    std::hash<std::string> hasher;\n    \n    // initialize here once\n    std::stringstream cig;\n\n    DBC m_sites;\n    std::unordered_set<std::string> m_hash;\n\n    std::unordered_set<size_t> m_int_hash;\n    \n  };\n\n"
  },
  {
    "path": "src/svaba/DiscordantCluster.cpp",
    "content": "#include \"DiscordantCluster.h\"\n\n#include <set>\n#include <cassert>\n#include <numeric>\n#include <unordered_set>\n\n#include \"SeqLib/BamWalker.h\"\n#include \"SvabaUtils.h\"\n\n#define DISC_PAD 150\n#define MIN_PER_CLUST 2\n#define MAX_CLUSTER_WIDTH 3000\n#define MAX_REGION_WIDTH 5000\n#define DEFAULT_ISIZE_THRESHOLD 2000 // shouldn't be hit if isize was learned\n\n//#define DEBUG_CLUSTER 1\n\nnamespace SeqLib {\n  class BamHeader;\n  class GenomicRegion;\n}\n\nusing SeqLib::GenomicRegion;\n\nDiscordantClusterMap DiscordantCluster::clusterReads(svabaReadPtrVector& bav,\n\t\t\t\t\t\t     const SeqLib::GenomicRegion& interval,\n\t\t\t\t\t\t     const SeqLib::BamHeader& header) {\n  \n  \n  // sort by position\n  std::sort(bav.begin(), bav.end(), SeqLib::BamRecordSort::ByReadPositionSharedPtr());\n  \n  svabaReadClusterVector fwd, rev, fwdfwd, revrev, fwdrev, revfwd;\n\n  //debug\n  // for (const auto& b : bav) {\n  //   if (b->Qname() == \"LH00306:129:227V5CLT4:6:2114:6074:25724\")\n  // \tstd::cerr << \" CLUSTER \" << *b << std::endl;\n  // }\n  \n  // make the fwd and reverse READ clusters. dont consider mate yet\n  __cluster_reads(bav, fwd, rev, SeqLib::Orientation::FR);\n  __cluster_reads(bav, fwd, rev, SeqLib::Orientation::FF);\n  __cluster_reads(bav, fwd, rev, SeqLib::Orientation::RF);\n  __cluster_reads(bav, fwd, rev, SeqLib::Orientation::RR);\n  \n#ifdef DEBUG_CLUSTER\n  for (auto& i : fwd) {\n    std::cerr << \"fwd cluster \" << std::endl;\n    for (auto& j : i)\n      std::cerr << \"fwd \" << *j << std::endl;\n  }\n  for (auto& i : rev) {\n    std::cerr << \"rev cluster \" << std::endl;\n    for (auto& j : i)\n      std::cerr << \"rev \" << *j << std::endl;\n  }\n#endif\n  \n  // within the forward read clusters, cluster mates on fwd and rev\n  __cluster_mate_reads(fwd, fwdfwd, fwdrev);\n  \n  // within the reverse read clusters, cluster mates on fwd and rev\n  __cluster_mate_reads(rev, revfwd, revrev); \n\n  // we have the reads in their clusters. Just convert to discordant reads clusters\n  DiscordantClusterMap dcm;\n  __convertToDiscordantCluster(dcm, fwdfwd, bav, header);\n  __convertToDiscordantCluster(dcm, fwdrev, bav, header);\n  __convertToDiscordantCluster(dcm, revfwd, bav, header);\n  __convertToDiscordantCluster(dcm, revrev, bav, header);\n\n#ifdef DEBUG_CLUSTER\n  std::cerr << \"----fwd cluster count: \" << fwd.size() << std::endl;\n  std::cerr << \"----rev cluster count: \" << rev.size() << std::endl;\n    std::cerr << \"----fwdfwd cluster count: \" << fwdfwd.size() << std::endl;\n    std::cerr << \"----fwdrev cluster count: \" << fwdrev.size() << std::endl;\n    std::cerr << \"----revfwd cluster count: \" << revfwd.size() << std::endl;\n    std::cerr << \"----revrev cluster count: \" << revrev.size() << std::endl;\n\n    for (auto& ii : fwdrev) {\n      std::cerr << \" ____________ CLUSTER ______________\" << std::endl;\n      for (auto& jj : ii)\n\tstd::cerr << \"FWDREV _____ \" << *jj << std::endl;\n    }\n    for (auto& ii : revfwd) {\n      std::cerr << \" ____________ CLUSTER ______________\" << std::endl;\n      for (auto& jj : ii)\n\tstd::cerr << \"FWDREV _____ \" << *jj << std::endl;\n    }\n\n#endif\n\n    // // score by number of maps\n    // for (auto d : dd_clean) {\n    //   for (auto& r : d.second.reads) {\n    // \tdouble rr = r.second.GetDD();\n    // \td.second.read_score += (rr > 0) ? 1/rr : 1;\n    //   }\n    //   for (auto& r : d.second.mates) {\n    // \tdouble rr = r.second.GetDD();\n    // \td.second.mate_score += (rr > 0) ? 1/rr : 1;\n    //   }\n    // }\n\n    return dcm;\n    \n  }\n  \n  // this reads is reads in the cluster. all_reads is big pile where all the clusters came from\n  DiscordantCluster::DiscordantCluster(const svabaReadPtrVector& this_reads,\n\t\t\t\t       const svabaReadPtrVector& all_reads,\n\t\t\t\t       const SeqLib::BamHeader& header) {\n\n    assert(this_reads.size());\n    assert(all_reads.size());\n\n    // check the orientations, fill the reads\n    auto first_read = this_reads.at(0);\n    auto last_read = this_reads.back();\n    bool rev = first_read->ReverseFlag();\n    bool mrev = first_read->MateReverseFlag();\n\n    // loop the reads in this cluster\n    for (auto& i : this_reads) {\n      \n      // double check that we did the clustering correctly. All read orientations should be same\n      assert(rev == i->ReverseFlag() && mrev == i->MateReverseFlag()); \n      \n      // add the read to the read map\n      std::string tmp = i->UniqueName(); // this name like t001_165_qname\n      assert(tmp.length());\n      reads[tmp] = i; \n      \n      // count number of reads per BAM\n      ++counts[i->Prefix()];\n      \n      if (tmp.at(0) == 't') {\n\t++tcount;\n      } else {\n\t++ncount;\n      }\n      \n    }\n\n    // loop through the big stack of reads and find the mates\n    addMateReads(all_reads);\n    assert(reads.size());\n\n    // set the regions\n    m_reg1 = GenomicRegion(-1, -1, -1);\n    m_reg1.pos1 = INT_MAX;\n    m_reg2 = GenomicRegion(-1, -1, -1); // mate region\n    m_reg2.pos1 = INT_MAX;\n    SeqLib::Orientation por;\n    for (const auto& [_, read] : reads) \n      {\n\tpor = read->PairOrientation();\n\tm_reg1.strand = read->ReverseFlag()     ? '-' : '+'; \n\tm_reg2.strand = read->MateReverseFlag() ? '-' : '+'; \t\n\tm_reg1.chr = read->ChrID(); \n\tm_reg2.chr = read->MateChrID();\n\n\t// get left side \n\tif (read->Position() < m_reg1.pos1)\n\t  m_reg1.pos1 = read->Position();\n\tif (read->MatePosition() < m_reg2.pos1)\n\t   m_reg2.pos1 = read->MatePosition();\n\t\n\t// get right side\n\tif (read->PositionEnd() > m_reg1.pos2)\n\t  m_reg1.pos2 = read->PositionEnd();\n\tif (read->MatePosition() > m_reg2.pos2) \n\t  m_reg2.pos2 = read->MatePosition() + read->Length(); // since don't have mate end\n\n\t// Check region width constraints after building regions\n\tif (m_reg1.Width() >= MAX_REGION_WIDTH) {\n\t  std::cerr << \"Warning: Region 1 width (\" << m_reg1.Width() << \"bp) exceeds \"\n\t\t    << MAX_REGION_WIDTH << \"bp limit. Cluster is too large.\" << std::endl;\n\t}\n\tif (m_reg2.Width() >= MAX_REGION_WIDTH) {\n\t  std::cerr << \"Warning: Region 2 width (\" << m_reg2.Width() << \"bp) exceeds \"\n\t\t    << MAX_REGION_WIDTH << \"bp limit. Cluster is too large.\" << std::endl;\n\t}\n      }\n    \n    mapq1 = __getMeanMapq(reads);\n    mapq2 = __getMeanMapq(mates);\n    nm1   = __getMeanNM(reads);\n    nm2   = __getMeanNM(mates);\n    \n    assert(mapq1 >= 0);\n    assert(mapq2 >= -1); // can have -1 as placeholder if no mate reads (bc didnt do lookup)\n    \n    // orient them correctly so that left end is first\n    if (m_reg2 < m_reg1) {\n      std::swap(m_reg1, m_reg2);\n      std::swap(reads, mates);\n      std::swap(mapq1, mapq2);\n    }\n    \n    // set the ID\n    std::string ortid;\n\n    switch (por) {\n    case SeqLib::Orientation::FR: ortid = \"FR\"; break;\n    case SeqLib::Orientation::FF: ortid = \"FF\"; break;\n    case SeqLib::Orientation::RF: ortid = \"RF\"; break;\n    case SeqLib::Orientation::RR: ortid = \"RR\"; break;\n    default: ortid = \"UD\"; break;  // fallback for UD or anything unexpected\n    }    \n\n    int pos1 = m_reg1.strand == '+' ? m_reg1.pos2 : m_reg1.pos1;\n    int pos2 = m_reg2.strand == '+' ? m_reg2.pos2 : m_reg2.pos1;\n    m_id = ortid + \"_\" + m_reg1.ChrName(header) + \"_\" + std::to_string(pos1) +\n      \"___\" + m_reg2.ChrName(header) + \"_\" + std::to_string(pos2);\n\n  }\n\nvoid DiscordantCluster::addMateReads(const svabaReadPtrVector& bav) \n  { \n    \n    if (!reads.size())\n      return;\n    \n    // log the qnames\n    // so qnames is just the same map as reads except:\n    // -- qnames: qname : svabaRead\n    // -- reads: uniquesame : svabaRead\n    // the qnames structure is useful here because when we search the pile\n    // of reads for the mate, the read and mate should have same qname\n    // but then it's good to have the read when we are looking at the mate\n    // to check some things (e.g. read and mate are different members of pair)\n    std::unordered_map<std::string, svabaReadPtr> qnames;\n    for (auto& [_,read] : reads) \n      qnames.insert({read->Qname(), read});\n\n    // OK, so this is necessary because...\n    // we are looping through and trying to fill mate reads by comparing\n    // against qname of reads. BUT this can be problematic if there are secondary \n    // or supplementarty alignments. So use this region to check that mate ALSO agrees\n    // with mate regions\n    auto& first_read = reads.begin()->second;\n    GenomicRegion g(first_read->MateChrID(), first_read->MatePosition(),\n\t\t    first_read->MatePosition()); \n    g.Pad(DISC_PAD + 1000);\n\n    // loop all of the reads and find the mates,\n    // if we have them (don't have to)\n\n    for (const auto& i : bav) {\n      \n      // first check if this read has same name as one already stored in reads\n      auto it_read = qnames.find(i->Qname());\n      if (it_read == qnames.end()) // qname not found, so this read can't be a matching mate\n\tcontinue;\n      \n      // now, check if this is the same read as we already now about (in reads)\n      // or if it is not (the its the mate)\n      std::string tmp = i->UniqueName();\n      auto it = reads.find(tmp);\n      if (it != reads.end()) // shoot, this it just the read as \"read\", so we're done\n\tcontinue;\n      \n      // now check that the read and this one (i = candidate mate) are opposite in pair\n      if (i->FirstFlag() == it_read->second->FirstFlag())\n\tcontinue;\n\n      // check that the orientation \n      if (i->PairOrientation() != it_read->second->PairOrientation())\n\tcontinue;\n\n      // don't want to deal with these\n      if (i->SecondaryFlag() || it_read->second->SecondaryFlag())\n\tcontinue;\n      \n      // agrees with intiial mate orientation and position      \n      if (g.GetOverlap(i->AsGenomicRegion()) > 0)\n\tmates[tmp] = i;\n      \n    }\n  }\n\ndouble DiscordantCluster::__getMeanMapq(const DiscordantReadMap& m) const {\n  if (m.empty()) return -1.0;\n  // sum them up\n  double total = 0.0;\n  for (auto const& kv : m) {\n    total += kv.second->MapQuality();\n  }\n  return total / m.size();\n}\n\ndouble DiscordantCluster::__getMeanNM(const DiscordantReadMap& m) const {\n  if (m.empty()) return -1.0;\n  // sum them up\n  double total = 0.0;\n  for (auto const& kv : m) {\n    int nm = 0;\n    kv.second->GetIntTag(\"NM\", nm);\n    total += nm;\n  }\n  return total / m.size();\n}\n\nvoid DiscordantCluster::labelReads() {\n\n  for (auto& [_, r] : reads) {\n    std::string dcstring;\n    r->GetZTag(\"DC\", dcstring);\n    if (!dcstring.empty())\n      dcstring.append(\"d\");\n    dcstring.append(m_id);\n    r->AddZTag(\"DC\", dcstring);\n  }\n\n  for (auto& [_, r] : mates) {\n    std::string dcstring;\n    r->GetZTag(\"DC\", dcstring);\n    if (!dcstring.empty())\n      dcstring.append(\"d\");\n    dcstring.append(m_id);\n    r->AddZTag(\"DC\", dcstring);\n  }\n  \n  \n}\n\nstd::string DiscordantCluster::toRegionString(const SeqLib::BamHeader& h) const \n{\n  int pos1 = (m_reg1.strand == '+') ? m_reg1.pos2 : m_reg1.pos1;\n  int pos2 = (m_reg2.strand == '+') ? m_reg2.pos2 : m_reg2.pos1;\n  \n  std::stringstream ss;\n  ss << h.IDtoName(m_reg1.chr) << \":\" << pos1 << \"(\" << m_reg1.strand << \")\" << \"-\" << \n    h.IDtoName(m_reg2.chr) << \":\" << pos2 << \"(\" << m_reg2.strand << \")\";\n  return ss.str();\n  \n}\n\n// define how to print this\nstd::string DiscordantCluster::print(const SeqLib::BamHeader& h) const {\n  std::stringstream ss;\n  ss << toRegionString(h) << \" Tcount: \" << tcount << \n    \" Ncount: \"  << ncount << \" Mean MAPQ: \" \n     << mapq1 << \" Mean Mate MAPQ: \" << mapq2 << \" Valid: \" << (valid() ? \"TRUE\" : \"FALSE\");\n  return ss.str();\n}\n\nbool DiscordantCluster::valid() const {\n  \n  // it's OK if the clusters are inter-chromosomal\n  if (m_reg1.chr != m_reg2.chr)\n    return true;\n  \n  // if its RF orientation (<----->) then bc bps are on outside, regions can overlaps\n  if (m_reg1.strand == '-' && m_reg2.strand == '+')\n    return true;\n\n  // the clusters overlap, doesn't make sense for del and inversion type\n  if (m_reg1.pos2 > m_reg2.pos1) \n    return false;\n  \n  return true;\n  \n}\n\n// define how to print to file\nstd::string DiscordantCluster::toFileString(const SeqLib::BamHeader& h, bool with_read_names) const { \n  \n  std::string sep = \"\\t\";\n\n  // get the edge of the cluster\n  int pos1 = m_reg1.strand == '+' ? m_reg1.pos2 : m_reg1.pos1; \n  int pos2 = m_reg2.strand == '+' ? m_reg2.pos2 : m_reg2.pos1;\n\n  std::string chr1 = isEmpty() ? \"NOTSET\" : h.IDtoName(m_reg1.chr);\n  std::string chr2 = isEmpty() ? \"NOTSET\" : h.IDtoName(m_reg2.chr);\n  \n  std::stringstream out;\n  out << chr1 << sep << pos1 << sep << m_reg1.strand << sep \n      << chr2 << sep << pos2 << sep << m_reg2.strand << sep \n      << tcount << sep << ncount\n      << sep << mapq1 << sep << mapq2 << sep\n      << nm1 << sep << nm2 << sep \n      << (m_contig.length() ? m_contig : \"x\") << sep << m_id;\n  \n  return (out.str());\n  \n}\n\n// define how to sort theses\nbool DiscordantCluster::operator<(const DiscordantCluster &b) const \n{\n  if (m_reg1.chr < b.m_reg1.chr)\n    return true;\n  if (m_reg1.pos1 < b.m_reg1.pos1)\n    return true;\n  return false;\n}\n\n/**\n * Cluster reads by alignment position \n * \n * Checks whether a read belongs to a cluster. If so, adds it. If not, ends\n * and stores cluster, adds a new one.\n *\n * @param cvec Stores the vector of clusters, which grows here\n * @param clust The current cluster that is being added to\n * @param a Read to add to cluster\n * @param mate Flag to specify if we should cluster on mate position instead of read position\n * @return Description of the return value\n */\nbool DiscordantCluster::__add_read_to_cluster(svabaReadClusterVector& cvec, \n                                              svabaReadPtrVector& clust,\n                                              svabaReadPtr& a,\n                                              bool ismate)\n{\n\n  // when ismate is false - just look at this read, ignore the mate\n  // when ismate is true - just consider the mate of this read, ignore this pairmate\n  \n  // last info stores the latest position of the \"end\" of this cluster\n  std::pair<int, int> last_info;\n  if (clust.empty()) {\n    last_info = {-1, -1};\n  } else if (ismate) {\n    last_info = {clust.back()->MateChrID(), clust.back()->MatePosition()};\n  } else {\n    last_info = {clust.back()->ChrID(), clust.back()->Position()};\n  }\n\n  // what is the position of the input read\n  std::pair<int, int> this_info;\n  if (ismate)\n    this_info = {a->MateChrID(), a->MatePosition()};\n  else\n    this_info = {a->ChrID(), a->Position()};\n\n  // check if the cluster is getting too wide\n  bool too_wide = !__valid_cluster(clust, ismate);\n\n  // if cluster not too wide, and read is on the same chromosome\n  // and the difference in position is less than the discordant \"coupling\"\n  // parameter, then add it to this cluster\n  if (!too_wide && this_info.first == last_info.first &&\n      (this_info.second - last_info.second) <= DISC_PAD) {\n\n    clust.push_back(a);\n    return true;\n\n  // if not, then we're done with the cluster. The key is that the\n  // input reads are position sorted, so that if this didn't make it, then\n  // the rest won't, and we whould start the next cluster with the given read\n  } else {\n    if (clust.size() >= MIN_PER_CLUST)\n      cvec.push_back(clust);\n    \n    clust.clear();\n    clust.push_back(a);\n    return false;\n  }\n}\n\nvoid DiscordantCluster::__cluster_mate_reads(svabaReadClusterVector& brcv,\n                                             svabaReadClusterVector& fwd,\n                                             svabaReadClusterVector& rev)\n{\n  // loop the nascent \"clustesr\" which are just clustered based on\n  // left read, not on the right read yet\n  for (auto& cluster : brcv) {\n    \n    svabaReadPtrVector this_fwd, this_rev;\n\n    // sort the reads in the cluster\n    std::sort(cluster.begin(), cluster.end(),\n\t      [](const svabaReadPtr& a, const svabaReadPtr& b) {\n\t\treturn (a->MateChrID() < b->MateChrID()) ||\n\t\t  (a->MateChrID() == b->MateChrID() &&\n\t\t   a->MatePosition() < b->MatePosition());\n\t      });\n\n    // loop the reads in the nascent cluster\n    for (svabaReadPtr& r : cluster) {\n\n      assert(r->dd > 0);\n\n      // see __cluster_reads for logic. Exactly the same, just now for mates\n      if ( !r->MateReverseFlag())\n        __add_read_to_cluster(fwd, this_fwd, r, true);\n      else\n        __add_read_to_cluster(rev, this_rev, r, true);\n    }\n\n    // finish the last clusters\n    if (__valid_cluster(this_fwd, true) && this_fwd.size() >= MIN_PER_CLUST)\n      fwd.push_back(this_fwd);\n    if (__valid_cluster(this_rev, true) && this_rev.size() >= MIN_PER_CLUST)\n      rev.push_back(this_rev);\n  }\n}\n\nvoid DiscordantCluster::__cluster_reads(svabaReadPtrVector& brv,\n\t\t\t\t\tsvabaReadClusterVector& fwd,\n\t\t\t\t\tsvabaReadClusterVector& rev,\n\t\t\t\t\tSeqLib::Orientation orientation) \n{\n  \n  // hold the current cluster\n  svabaReadPtrVector this_fwd, this_rev;\n  \n  std::unordered_set<std::string> tmp_set;\n\n  // int pair_orientation = 0;\n  // if (brv.size())\n  //   pair_orientation = brv.front()->PairOrientation();\n  \n  // cluster in the READ direction, separately for fwd and rev\n  for (svabaReadPtr& i : brv) {\n\n    // don't want to deal with secondary alignments (multiple mappings, but not split)\n    if (i->SecondaryFlag())\n      continue;\n    \n    // if (pair_orientation != i->PairOrientation()) {\n    //   std::cerr << *i << std::endl;\n    //   std::cerr << i->PairOrientation() << std::endl;\n    //   std::cerr << pair_orientation << std::endl;\n    // }\n\n    // not a discordant read, ignore it\n    if (i->dd <= 0)\n      continue;\n    \n    // only cluster FR reads together, RF reads together, FF together and RR together\n    // PairOrientation is invariant to if you are looking at read or mate\n    // - that is, if you are FR from read, then the mate is not read as RF.\n    // - it ensures that the left most read (lowest chr and pos) is the index read\n    if (i->PairOrientation() != orientation) {\n      continue;\n    }\n      \n    // only cluster if not seen before (e.g. left-most is READ, right most is MATE)\n    if (i->PairMappedFlag() && tmp_set.count(i->Qname()) == 0) {\n\n      //20250911\n      // right most read acts like the \"mate\".\n      // the reason to do this is that if I have both the read and it's mate, I dont\n      // want to arbitrarily add one of the two to either fwd or reverse\n      if (!i->IsLeftMostAlignment())\n\tcontinue;\n\n      tmp_set.insert(i->Qname());\n\n      // forward clustering -- this_fwd is just the most current cluster and\n      // fwd (or rev) is the collection of clusters that grows here\n      // convention here is that the left-most read acts like the \"index read\" and the\n      if ( !i->ReverseFlag()) \n\t__add_read_to_cluster(fwd, this_fwd, i, false);\n      // reverse clustering \n      else \n\t__add_read_to_cluster(rev, this_rev, i, false);\n    }\n  }\n  \n  // finish the last clusters\n  if (__valid_cluster(this_fwd, false) && this_fwd.size() >= MIN_PER_CLUST)\n    fwd.push_back(this_fwd);\n  if (__valid_cluster(this_rev, false) && this_rev.size() >= MIN_PER_CLUST)\n    rev.push_back(this_rev);\n  \n}\n\nbool DiscordantCluster::__valid_cluster(svabaReadPtrVector& clust, bool ismate) {\n\n  if (clust.size() < 2)\n    return true;\n  \n  // check if getting too wide\n  bool too_wide;\n  if (ismate)\n    too_wide = (clust.size() > 1 && (clust.back()->Position() - clust[0]->Position()) > MAX_CLUSTER_WIDTH);\n  else\n    too_wide = (clust.size() > 1 && (clust.back()->Position() - clust[0]->Position()) > MAX_CLUSTER_WIDTH); \n\n  return !too_wide;\n}\n\nvoid DiscordantCluster::__convertToDiscordantCluster(DiscordantClusterMap &dd,\n\t\t\t\t\t\t     const svabaReadClusterVector& cvec,\n\t\t\t\t\t\t     const svabaReadPtrVector& bav,\n\t\t\t\t\t\t     const SeqLib::BamHeader& header) {\n  \n  // nothign to do if no clusters\n  if (cvec.size() == 0)\n    return; \n\n  // always have to be more input reads than clusters\n  assert(bav.size() > cvec.size());\n  \n  // no reads, nothign to do\n  if (!bav.size())\n    return;\n\n  // loop through the clusters\n  for (auto& v : cvec) {\n    DiscordantCluster d(v, bav, header);\n    dd[d.m_id] = d;\n  }\n}\n\nGenomicRegion DiscordantCluster::GetMateRegionOfOverlap(const GenomicRegion& gr) const {\n  \n  if (gr.GetOverlap(m_reg1))\n    return m_reg2;\n  if (gr.GetOverlap(m_reg2))\n    return m_reg1;\n  return GenomicRegion();\n  \n}\n\nbool DiscordantCluster::isEmpty() const {\n   return m_reg1.IsEmpty() || m_reg2.IsEmpty() || m_reg1.chr == -1 || m_reg2.chr == -1;\n }\n \n"
  },
  {
    "path": "src/svaba/DiscordantCluster.h",
    "content": "#pragma once\n\n#include <string>\n#include <vector>\n#include <cassert>\n#include <iostream>\n#include <unordered_map>\n\n#include \"SvabaRead.h\"\n#include \"SvabaSharedConfig.h\"\n\nclass DiscordantCluster;\n\ntypedef std::unordered_map<std::string, svabaReadPtr> DiscordantReadMap;\ntypedef std::vector<svabaReadPtrVector> svabaReadClusterVector;\ntypedef std::vector<DiscordantCluster> DiscordantClusterVector;\ntypedef std::unordered_map<std::string, DiscordantCluster> DiscordantClusterMap;\n\n/** Class to hold clusters of discordant reads */\nclass DiscordantCluster \n{\n  \n  friend struct BreakPoint;\n  \npublic:\n  \n  /** Create an empty cluster */\n  DiscordantCluster() { \n    m_reg1 = SeqLib::GenomicRegion(); \n    m_reg2 = SeqLib::GenomicRegion(); \n    assert(m_reg1.IsEmpty()); \n    ncount = 0; tcount = 0;\n    mapq1 = -1; mapq2 = -1;\n  }\n  \n  /** Make a cluster from a set of reads (pre-clustered) and look up a larger set to find \n   * their mates \n   * @param this_reads Pre-clustered set of discordant reads (but not their mates)\n   * @param all_reads A pile of reads to search for mates\n   */\n  DiscordantCluster(const svabaReadPtrVector& this_reads,\n\t\t    const svabaReadPtrVector& all_reads,\t\t    \n\t\t    const SeqLib::BamHeader& header);\n  \n  /** Is this discordant cluster empty? */\n  bool isEmpty() const;\n  \n  /** Return a string representing the output file header */\n  static std::string header() { \n    return \"chr1\\tpos1\\tstrand1\\tchr2\\tpos2\\tstrand2\\ttcount\\tncount\\t\\tmapq1\\tmapq2\\tnm1\\tnm2\\tcname\\tid\";\n  }\n  \n  bool hasAssociatedAssemblyContig() const { return m_contig.length(); }\n  \n  void addMateReads(const svabaReadPtrVector& bav); \n  \n  /** Return the discordant cluster as a string with just coordinates */\n  std::string toRegionString(const SeqLib::BamHeader& h) const;\n  \n  /** Return the ID associated with this cluster */\n  std::string ID() const { return m_id; } \n  \n  /** Print this with region string and read counts and mapq */\n  //friend std::ostream& operator<<(std::ostream& out, const DiscordantCluster& dc);\n  \n  /** Print this with region string and read counts and mapq */\n  std::string print(const SeqLib::BamHeader& h) const;\n  \n  /** Return as a string for writing to a file */\n  std::string toFileString(const SeqLib::BamHeader& h, bool with_read_names) const;\n  \n  /** Sort by coordinate */\n  bool operator < (const DiscordantCluster& b) const;\n  \n  /** Is this a valid cluster? */\n  bool valid() const;\n  \n  static std::unordered_map<std::string, DiscordantCluster>\n  clusterReads(svabaReadPtrVector& bav,\n\t       const SeqLib::GenomicRegion& interval,\n\t       const SeqLib::BamHeader& header);\n\n  void labelReads();\n  \n  static bool __add_read_to_cluster(svabaReadClusterVector &cvec,\n\t\t\t\t    svabaReadPtrVector &clust,\n\t\t\t\t    svabaReadPtr&, bool ismate);\n  \n  static void __cluster_reads(svabaReadPtrVector& brv,\n\t\t\t      svabaReadClusterVector& fwd,\n\t\t\t      svabaReadClusterVector& rev,\n\t\t\t      SeqLib::Orientation orientation);\n  \n  static void __cluster_mate_reads(svabaReadClusterVector& brcv,\n\t\t\t\t   svabaReadClusterVector& fwd,\n\t\t\t\t   svabaReadClusterVector& rev);\n  \n  static void __convertToDiscordantCluster(DiscordantClusterMap& dd,\n\t\t\t\t\t   const svabaReadClusterVector& cvec,\n\t\t\t\t\t   const svabaReadPtrVector& bav,\n\t\t\t\t\t   const SeqLib::BamHeader& header);\n\n  static bool __valid_cluster(svabaReadPtrVector& clust, bool ismate);\n  \n  /** Query an interval against the two regions of the cluster. If the region overlaps\n   * with one region, return the other region. This is useful for finding the partner \n   * region give a query region */\n  SeqLib::GenomicRegion GetMateRegionOfOverlap(const SeqLib::GenomicRegion& gr) const; \n  \n  int tcount = 0;\n  int ncount = 0; \n\n  // supporting read counts per sample (e.g. t001 - 4, n001 - 6)  \n  std::unordered_map<std::string, int> counts;\n\n  DiscordantReadMap reads, mates;\n  \n  std::string m_contig = \"\";\n  \n  double read_score = 0;\n  double mate_score = 0;\n  \n  //int rp_orientation = -1; // FR, FF,  RR, RF\n  \n  SeqLib::GenomicRegion m_reg1;\n  SeqLib::GenomicRegion m_reg2;\n  \n  int mapq1;\n  int mapq2;\n  float nm1;\n  float nm2;\n  \n  std::string m_id_competing; // id of discordant cluster with same span, different strands\n  \nprivate:    \n  std::string m_id;\n  \n  // return the mean mapping quality for this cluster\n  double __getMeanMapq(const DiscordantReadMap& m) const;\n\n  // return the mean mismatch score for this cluster\n  double __getMeanNM(const DiscordantReadMap& m) const;\n  \n};\n\n//! vector of AlignmentFragment objects\ntypedef std::vector<DiscordantCluster> DiscordantClusterVector;\n\n//! Store a set of DiscordantCluster objects, indexed by the \"id\" field\ntypedef std::unordered_map<std::string, DiscordantCluster> DiscordantClusterMap;\n\n\n"
  },
  {
    "path": "src/svaba/DiscordantRealigner.cpp",
    "content": "#include \"DiscordantRealigner.h\"\n#include \"SvabaUtils.h\"\n#include \"SeqLib/BWAAligner.h\"\n\n#ifdef QNAME\n#define DEBUG(msg, read)\t\t\t\t\\\n  if (read.Qname() == QNAME && (read.AlignmentFlag() == QFLAG || QFLAG == -1)) { std::cerr << (msg) << \" read \" << r << std::endl; }\n#else\n#define DEBUG(msg, read)\n#endif\n\n//bool DiscordantRealigner::ShouldRealign(const SeqLib::BamRecord& r) const {\nbool DiscordantRealigner::ShouldRealign(const svabaReadPtr& r) const {\n\n  //if (r.SR() == \"t000_147_H01PEALXX140819:3:1219:25827:26572\")\n  //  std::cerr << \" DD \" << r.GetDD() << \" fi \" << r.FullInsertSize() << \" lim \" << min_isize_for_discordant_realignment << std::endl;\n\n  // read was already realigned\n  if (r->GetDD() != 0)\n    return false;\n  \n  // read can't be discordant anyway, since not both mapped\n  if (!r->MappedFlag() || !r->MateMappedFlag())\n    return false;\n  \n  if (r->Interchromosomal())\n    return true;\n\n  // get the insert size\n  int fi = r->FullInsertSize();\n\n  // if too small, don't realign\n  if (fi < min_isize_for_discordant_realignment && !r->Interchromosomal())\n    return false;\n\n  return true;\n}\n\n//bool DiscordantRealigner::RealignRead(SeqLib::BamRecord& r, const SeqLib::BWAWrapper* bwa) const {\nbool DiscordantRealigner::RealignRead(svabaReadPtr& r,\n\t\t\t\t      const std::shared_ptr<SeqLib::BWAAligner> bwa) const {\n\n  DEBUG(\"Realigning original read\", r);\n\n  BamRecordPtrVector als;\n  bwa->alignSequence(r->CorrectedSeq(), r->Qname(), als, false, 0.60, secondary_cap);\n  \n  // no alignments, so label as bad\n  if (!als.size()) {\n    r->SetDD(MAPS_NOWHERE);\n    return false;\n  }\n  \n  // discordant alignments\n  SeqLib::GenomicRegion gr  = r->AsGenomicRegion();\n  SeqLib::GenomicRegion grm = r->AsGenomicRegionMate();\n  grm.Pad(discordant_realign_mate_pad);\n  \n  bool has_orig = false;\n  bool maps_near_mate = false;\n  for (const auto& i : als) {\n\n    DEBUG(\"   Realigned hit (one of) \" + std::to_string(als.size()), *i);\n\n    // if there is another alignment that overlaps with the original\n    // but has a lower MAPQ, take the new mapq\n    if (gr.GetOverlap(i->AsGenomicRegion())) {\n      has_orig = true;\n      r->SetMapQuality(std::min(i->MapQuality(), r->MapQuality()));\n    }\n    \n    DEBUG(\"   Realigned hit has overlap with mate of N bases: \" + std::to_string(r->OverlappingCoverage), i);\n    \n    // if mate is mapped, and read maps to near mate region wo clips, it's not disc\n    if (grm.GetOverlap(i->AsGenomicRegion())) {\n      // if not clipped or overlaps same covered region as original, \n      // then it has a secondary mapping\n      if (r->NumClip() < 20 || r->OverlappingCoverage(*i) >= 20) \n\tmaps_near_mate = true;\n      DEBUG(\"   Found realignment hit near mate\", i);\n    }\n  } // end als loop\n  \n  // add tags\n  if (!has_orig) \n    r->SetDD(MAPS_NOT_NEAR_ORIG);\n  else if (maps_near_mate) \n    r->SetDD(MAPS_NEAR_MATE);\n  else\n    r->SetDD(als.size());\n  \n  return r->GetDD() < 0; // was it realigned?\n}\n\n/*void DiscordantRealigner::ReassignRead(svabaRead& r, const svabaRead& s) const {\n\n  r.Reassign(s);\n  r.SetDD(REASSIGNED_READ);\n  return;\n\n  }*/\n"
  },
  {
    "path": "src/svaba/DiscordantRealigner.h",
    "content": "#pragma once\n\nnamespace SeqLib {\n  class BWAAligner;\n}\n#include \"SvabaRead.h\"\n\n// object that holds functions for re-aligning a discordant read\n// and checking if it is a true discordant read\nclass DiscordantRealigner {\n\n public:\n\n  DiscordantRealigner() {}\n\n  ~DiscordantRealigner() {}\n\n  // check if a read should be realigned\n  //bool ShouldRealign(const SeqLib::BamRecord& r) const;\n  bool ShouldRealign(const svabaReadPtr& r) const;\n\n  // realign read\n  bool RealignRead(svabaReadPtr& r,\n\t\t   const std::shared_ptr<SeqLib::BWAAligner> bwa) const;\n\n  // reassign a read if it has a better mapping\n  // r is the read to be reassigned, s source alignment is the new alignment\n  //void ReassignRead(SeqLib::BamRecord& r, const SeqLib::BamRecord& s) const;\n  //void ReassignRead(svabaRead& r, const svabaRead& s) const;\n\n  static const int MAPS_NOT_NEAR_ORIG = -1;  \n  static const int MAPS_NEAR_MATE = -2;\n  static const int MAPS_NOWHERE = -3;\n  static const int MATE_BAD_DISC = -4;\n  static const int REASSIGNED_READ = -5;\n\n private:\n  \n  // max number of secondary reads to consider\n  int secondary_cap = 20;\n\n  // minimum size to check\n  int min_isize_for_discordant_realignment = 1000;\n\n  // how much to search aroudn mate region for read alignent\n  int discordant_realign_mate_pad = 100;\n  \n};\n"
  },
  {
    "path": "src/svaba/Histogram.cpp",
    "content": "#include \"Histogram.h\"\n#include \"SeqLib/SeqLibUtils.h\"\n#include <fstream>\n#include <cmath>\n#include <algorithm>\n#include <sstream>\n\n#define BINARY_SEARCH 1\n\n#define DEBUG_HISTOGRAM\n\nusing namespace SeqLib;\n\nHistogram::Histogram(const int32_t& start, const int32_t& end, const uint32_t& width)\n{\n  \n  if (end >= start)\n    throw std::invalid_argument(\"Histogram end must be > start\");\n\n  Bin bin;\n  bin.bounds.first = start;\n\n  int32_t next_end = start + width - 1; // -1 because width=1 is bound.first = bounds.second\n\n  while (next_end < end) \n    {\n      // finish this bin\n      bin.bounds.second = next_end;\n      m_bins.push_back(bin);\n      m_ind.push_back(bin.bounds.first); // make the index for the lower bound\n\n      // start a new one\n      bin.bounds.first = next_end+1;\n      next_end += width;\n    }\n  \n  // finish the last bin\n  bin.bounds.second = end;\n  m_bins.push_back(bin);\n  m_ind.push_back(bin.bounds.first);\n\n  // add a final bin\n  //bin.bounds.first = end+1;\n  //bin.bounds.second = INT_MAX;\n  //m_bins.push_back(bin);\n  //m_ind.push_back(bin.bounds.first);\n\n}\n\nvoid Histogram::toCSV(std::ofstream &fs) {\n\n  for (auto& i : m_bins) \n    fs << i << std::endl;\n\n}\nvoid Histogram::removeElem(const int32_t& elem) {\n  --m_bins[retrieveBinID(elem)];\n}\n\nvoid Histogram::addElem(const int32_t& elem) {\n  ++m_bins[retrieveBinID(elem)];\n}\n\nstd::string Histogram::toFileString() const {\n  std::stringstream ss;\n  for (auto& i : m_bins)\n    if (i.m_count)\n      ss << i.bounds.first << \"_\" << i.bounds.second << \"_\" << i.m_count << \",\";\n  std::string out = ss.str();\n  out.pop_back(); // trim off last comma\n  return(out);\n  \n}\n\nsize_t Histogram::retrieveBinID(const int32_t& elem) const {\n\n  if (elem < m_bins[0].bounds.first) \n    {\n#ifdef DEBUG_HISTOGRAM\n      std::cerr << \"removeElem: elem of value \" <<  elem << \" is below min bin \" << m_bins[0] << std::endl;\n      exit(1);\n#endif\n      return 0;\n    }\n\n  if (elem > m_bins.back().bounds.second) \n    {\n#ifdef DEBUG_HISTOGRAM\n      std::cerr << \"removeElem: elem of value \" <<  elem << \" is above max bin \" << m_bins.back() << std::endl;\n      exit(1);\n#endif\n      return m_bins.size();\n    }\n\n\n  if (m_bins[0].contains(elem)) \n    return 0;\n  if (m_bins.back().contains(elem)) \n    return m_bins.size();\n\n#ifdef BINARY_SEARCH\n  // binary search\n  std::vector<int32_t>::const_iterator it = std::upper_bound(m_ind.begin(), m_ind.end(), elem);\n  size_t i = it - m_ind.begin()-1;\n  assert(i < m_ind.size());\n  return i;\n#else\n  for (size_t i = 0; i < m_bins.size(); i++) {\n    if (m_bins[i].contains(elem)) {\n      return i;\n    }\n  }\n#endif\n  std::cerr << \"bin not found for element \" << elem << std::endl;\n  return 0;\n}\n\n/*void Histogram::initialize(size_t num_bins, std::vector<int32_t>* pspanv, size_t min_bin_width) {\n\n  // ensure that they spans are sorted\n  std::sort(pspanv->begin(), pspanv->end());\n\n  // fill the histogram bins with matrix pairs (pre-sorted by distance)\n  Bin bin; \n\n  // get number of inter-chr events\n  size_t intra = 0;\n  for (auto& i : *pspanv)\n    if (i != INTERCHR)\n      intra++;\n\n  int bin_cut = 0;\n  try {\n    bin_cut = floor((double)intra / (double)num_bins);\n    if (bin_cut == 0)\n      throw 1;\n  } catch(...) {\n    std::cerr << \"Error in determining bin cut. Not enought events or too many bins?\" << std::endl;\n    std::cerr << \"Events: \" << pspanv->size() << \" Num Bins \" << num_bins << \" quantile count (hist height) \" << bin_cut << std::endl;\n  }\n\n  std::cout << \"...Events per bin: \" << bin_cut << \" num bins \" << num_bins << std::endl;\n\n  S last_span = 0;\n  size_t tcount = 0; // count events put into bins\n\n  // iterate over spans\n  for (auto& span : *pspanv) {\n    if (span != INTERCHR) {\n      \n      ++tcount;\n      \n      // moved into a new bin? (or done?)\n      if (bin.getCount() > bin_cut && span != last_span && (last_span - bin.bounds.first) >= min_bin_width) { \n\n\t// finalize, save old bin\n\tbin.bounds.second = last_span;\n\tm_bins.push_back(bin);\n\t\n\t// new bin\n\tbin.bounds.first = last_span+1;\n\tbin.m_count = 0;\n\t\n      }\n      ++bin;\n      if (bin.getCount() >= bin_cut) {\n\tlast_span = span;\n      }\n      \n      //update the size of current bin\n      bin.bounds.second = span;\n    }\n  }\n  // add the last bin\n  bin.bounds.second = INTERCHR-1; \n  m_bins.push_back(bin);\n\n  // add a bin for interchr events\n  bin.bounds = {INTERCHR, INTERCHR};\n  bin.m_count = pspanv->size() - intra;\n  m_bins.push_back(bin);\n\n  // make the indices of lower bound\n  for (auto& i : m_bins)\n    m_ind.push_back(i.bounds.first);\n\n  if (m_bins.size() != (num_bins+1)) {\n    //std::cout << \" bin cut \" << bin_cut << std::endl;\n    //std::cout << \" num bins \" << num_bins << \" bins.size() \" << m_bins.size() << std::endl;\n    //assert(bins.size() == (num_bins+1));\n  }\n\n  }*/\n\nbool Bin::operator < (const Bin& b) const {\n  return (bounds.first < b.bounds.first || (bounds.first==b.bounds.first && bounds.second < b.bounds.second));\n\n}\n\nbool Bin::contains(const int32_t& elem) const {\n\n  return (elem >= bounds.first && elem <= bounds.second); \n\n\n}\n\nBin& Bin::operator++()\n{\n  ++m_count;\n  return *this;\n}\n\n\nBin& Bin::operator--() {\n  assert(m_count > 0); \n  --m_count;\n  return *this;\n}\n"
  },
  {
    "path": "src/svaba/Histogram.h",
    "content": "#ifndef SEQLIB_HISTOGRAM_H__\n#define SEQLIB_HISTOGRAM_H__\n\n#include <iostream>\n#include <cassert>\n#include <string>\n#include <utility>\n#include <vector>\n#include <fstream>\n#include <cstdint>\n\n#include \"SeqLib/IntervalTree.h\"\n\nclass Bin;\n\ntypedef SeqLib::TInterval<Bin> BinInterval;\ntypedef SeqLib::TIntervalTree<Bin> BinIntervalTree;\ntypedef std::vector<BinInterval> BinIntervalVector;\n\n#define INTERCHR 250000000\n\n  class Histogram;\n\n/** Stores one bin in a Histogram\n */\nclass Bin {\n\n  friend class Histogram;\n\n public:\n  \n  /** Construct a new object with 0 count and range [0,1]\n   */\n  Bin() : m_count(0) \n  { \n    bounds = {0,1}; \n  }\n    \n    /** Output the bin in format \"start range, end range, count\"\n     */\n    friend std::ostream& operator<<(std::ostream &out, const Bin &b) {\n      out << b.bounds.first << \",\" << b.bounds.second << \",\" << b.m_count;\n      return out;\n    }\n\n    /** Return the number of counts in this histogram bin \n     */\n    int32_t getCount() const { return m_count; }\n    \n    /** Check if a value fits within the range of this bin \n     * @param dist Distance value to check if its in this range\n     * @return true if the value is within the range\n     */\n\n    /** Check if this bin contains a value\n     * @param elem Value to check if its in this range\n     * @return true if the value is within the range\n     */\n    bool contains(const int32_t& elem) const; \n\n    /** Define bin comparison operator by location of left bound, then right */\n    bool operator < (const Bin& b) const;\n    \n    /** Decrement the histogram bin by one. \n     * Note that this is the prefix version only\n     */\n    Bin& operator--();\n\n    /** Increment the histogram bin by one. \n     * Note that this is the prefix version only\n     */\n    Bin& operator++();\n\n private:\n    int32_t m_count;\n    std::pair<int32_t, int32_t> bounds; //@! was\"bin\";\n};\n\n/** Class to store histogram of numeric values.\n *\n * The bins of the Histogram are not uniformly spaced, and their ranges determined \n * by partitioning the spans it tablulates into uniform quantiles when initialized\n * by Histogram::initialSpans(). As elements are added and removed this initial bin\n * definition remains constant.\n */\nclass Histogram { \n\n private:\n\n  std::vector<int32_t> m_ind;\n\n public:\n\n  std::vector<Bin> m_bins;\n  /** Construct an empty histogram\n   */\n  Histogram() {}\n\n  /** Construct a new histogram with bins spaced evenly\n   * @param start Min value covered\n   * @param end Max value covered\n   * @param width Fixed bin width\n   * @exception Throws an invalid_argument if end <= start\n   */\n  Histogram(const int32_t& start, const int32_t& end, const uint32_t& width);\n\n  std::string toFileString() const;\n\n  friend std::ostream& operator<<(std::ostream &out, const Histogram &h) {\n    for (auto& i : h.m_bins)\n      out << i << std::endl;\n    return out;\n  }\n\n  /** Return iterator to the fist bin\n   */\n  std::vector<int32_t>::iterator begin() { return m_ind.begin(); }\n  \n  /** Return iterator to the last bin\n   */\n  std::vector<int32_t>::iterator end() { return m_ind.end(); }\n  \n  /** Initialize histogram from a vector of numeric values\n   */\n  void Initialize(size_t num_bins, std::vector<int32_t>* pspanv, size_t min_bin_width = 0);\n\n  /** Add an element to the histogram\n   * @param elem Length of event to add\n   */\n  void addElem(const int32_t &elem);\n\n  /** Remove a span from the histogram\n   * @param span Length of event to remove\n   */\n  void removeElem(const int32_t &elem);\n\n  /** Output to CSV file like: bin_start,bin_end,count\n   */\n  void toCSV(std::ofstream &fs);\n\n  /** Return the total number of elements in the Histogram\n   */\n  int totalCount() const {\n    int tot = 0;\n    for (auto&  i : m_bins)\n      tot += i.getCount();\n    return tot;\n  }\n  \n  /** Get count for a histogram bin\n   * @param i Bin index\n   * @return number of events in histogram bin\n   */\n  int32_t binCount(size_t i) { return m_bins[i].getCount(); }\n\n  /** Get number of bins in histogram\n   * @return Number of bins in histogram\n   */\n  size_t numBins() { return m_bins.size(); }\n\n  /** Find bin corresponding to a span\n   * @param elem Event length\n   * @return Bin containing event length\n   */\n  size_t retrieveBinID(const int32_t& elem) const;\n\n};\n\n#endif\n"
  },
  {
    "path": "src/svaba/KmerFilter.cpp",
    "content": "#include \"KmerFilter.h\"\n\n#include \"ReadTable.h\"\n\n// int KmerFilter::correctReads(svabaReadVector& vec) {\n\n//   if (!vec.size())\n//     return 0;\n\n//   if (!pBWT)\n//     return 0; // cant correct if didnt learn how\n\n//   int corrected_reads = 0;\n\n//   //int intervalCacheLength = 10; // SGA defaul\n//   //int intervalCacheLength = 1; //vec[0].Length();\n//   BWTIntervalCache* pIntervalCache = nullptr; //new BWTIntervalCache(intervalCacheLength, pBWT);\n//   BWTIndexSet indices; //(pBWT, pRBWT, nullptr, pIntervalCache);\n//   indices.pBWT = pBWT;\n//   indices.pCache = pIntervalCache;\n\n//   KmerCountMap kmerCache;\n\n//   for (auto& r : vec) {\n\n//     // non-clipped mapped reads with no mismatches are OK (nothing to correct)\n//     //if (r.GetIntTag(\"NM\") == 0 && r.NumClip() == 0 && r.MappedFlag()) \n//     //  continue;\n\n//     std::string readSequence = r.CorrectedSeq(); //QualityTrimmedSequence(4, dum);\n\n//     std::string origSequence = readSequence;\n//     int n = readSequence.length();\n//     if (n < m_kmer_len) // can't correct, too short\n//       continue;\n//     int nk = n - m_kmer_len + 1;\n//     std::vector<int> minPhredVector(nk, 25); // 25 is a dummy value\n\n//     // Are all kmers in the read well-represented?\n//     bool allSolid = false;\n//     bool done = false;\n//     int rounds = 0;\n//     int maxAttempts = 3; //m_params.numKmerRounds;\n\n//     while (!done && nk > 0) {\n//       // Compute the kmer counts across the read\n//       // and determine the positions in the read that are not covered by any solid kmers\n//       // These are the candidate incorrect bases\n//       std::vector<int> countVector(nk, 0);\n//       std::vector<int> solidVector(n, 0);\n\n//       for(int i = 0; i < nk; ++i)\n//         {\n// \t  std::string kmer;\n// \t  try { \n// \t    kmer = readSequence.substr(i, 31);\n// \t  } catch (...) {\n// \t    std::cerr << \"KmerFilter substr out of bounds. seqlen \" << readSequence.length() << \n// \t      \" stat \" << i << \" length \" << 31 << std::endl;\n// \t  }\n\n// \t  int count = 0;\n// \t  KmerCountMap::iterator iter = kmerCache.find(kmer);\n// \t  if (iter != kmerCache.end()) {\n// \t    count = iter->second; \n// \t  } else {\n\t    \n// \t    count = BWTAlgorithms::countSequenceOccurrences(kmer, indices);\n// \t    kmerCache.insert(std::make_pair(kmer, count));\n// \t  }\n\t  \n// \t  // Get the phred score for the last base of the kmer\n// \t  int phred = minPhredVector[i];\n// \t  countVector[i] = count;\n\t  \n// \t  // Determine whether the base is solid or not based on phred scores\n// \t  int threshold = CorrectionThresholds::Instance().getRequiredSupport(phred);\n// \t  if(count >= threshold)\n//             {\n// \t      for(int j = i; j < i + 31; ++j)\n// \t\tsolidVector[j] = 1;\n//             }\n// \t}\n  \n\n//       allSolid = true;\n//       for(int i = 0; i < n; ++i) {\n// \tif(solidVector[i] != 1)\n// \t  allSolid = false;\n//       }\n      \n//       // Stop if all kmers are well represented or we have exceeded the number of correction rounds\n//       if(allSolid || rounds++ > maxAttempts)\n// \tbreak; \n      \n//       // Attempt to correct the leftmost potentially incorrect base\n//       bool corrected = false;\n//       for(int i = 0; i < n; ++i)\n//         {\n// \t  if(solidVector[i] != 1)\n//             {\n// \t      // Attempt to correct the base using the leftmost covering kmer\n// \t      int phred = 25; //workItem.read.getPhredScore(i);\n// \t      int threshold = CorrectionThresholds::Instance().getRequiredSupport(phred);\n\t      \n// \t      int left_k_idx = (i + 1 >= 31 ? i + 1 - 31 : 0);\n// \t      corrected = attemptKmerCorrection(i, left_k_idx, std::max(countVector[left_k_idx], threshold), readSequence, indices);\n// \t      if(corrected)\n// \t\tbreak;\n\t      \n// \t      // base was not corrected, try using the rightmost covering kmer\n// \t      size_t right_k_idx = std::min(i, n - 31);\n// \t      corrected = attemptKmerCorrection(i, right_k_idx, std::max(countVector[right_k_idx], threshold), readSequence, indices);\n// \t      if(corrected)\n// \t\tbreak;\n//             }\n//         }\n\n\t\n//       // If no base in the read was corrected, stop the correction process\n//       if(!corrected)\n//         {\n// \t  assert(!allSolid);\n// \t  done = true;\n//         }\n\n//     } // end while    \n    \n//     // if allsolid\n//     if( readSequence != origSequence)\n//       {\n// \t++corrected_reads;\n// \tassert(readSequence.length());\n// \tr.AddZTag(\"KC\", readSequence);\n// \t//std::cerr << ssi.id << std::endl;\n// \t//std::cerr << \"**************Read corrected from\\to \" << std::endl << \"\\t\" << ssi.seq.toString() << std::endl << \"\\t\" << readSequence << std::endl;\n//         //result.correctSequence = readSequence;\n//         //result.kmerQC = true;\n//       }\n//     else\n//       {\n// \t//std::cerr << \"Read NOT corrected from\\to \" << std::endl << \"\\t\" << ssi.seq.toString() << std::endl << \"\\t\" << readSequence << std::endl;\n//         //result.correctSequence = workItem.read.seq.toString();\n//         //result.kmerQC = false;\n//       }\n//   }\n\n//   delete pIntervalCache;\n\n//   return corrected_reads;\n\n//   return 0;\n// }\n\nint KmerFilter::correctReads(svabaReadVector& vec) {\n\n  if (!vec.size())\n    return 0;\n\n  if (!pBWT)\n    return 0; // cant correct if didnt learn how\n\n  int corrected_reads = 0;\n\n  //int intervalCacheLength = 10; // SGA defaul\n  //int intervalCacheLength = 1; //vec[0].Length();\n  BWTIntervalCache* pIntervalCache = nullptr; //new BWTIntervalCache(intervalCacheLength, pBWT);\n  BWTIndexSet indices; //(pBWT, pRBWT, nullptr, pIntervalCache);\n  indices.pBWT = pBWT;\n  indices.pCache = pIntervalCache;\n\n  KmerCountMap kmerCache;\n\n  for (auto& r : vec) {\n\n    // non-clipped mapped reads with no mismatches are OK (nothing to correct)\n    //if (r.GetIntTag(\"NM\") == 0 && r.NumClip() == 0 && r.MappedFlag()) \n    //  continue;\n\n    std::string readSequence = r.CorrectedSeq(); \n\n    std::string origSequence = readSequence;\n    int n = readSequence.length();\n    if (n < m_kmer_len) // can't correct, too short\n      continue;\n    int nk = n - m_kmer_len + 1;\n    std::vector<int> minPhredVector(nk, 25); // 25 is a dummy value\n\n    // Are all kmers in the read well-represented?\n    bool allSolid = false;\n    bool done = false;\n    int rounds = 0;\n    int maxAttempts = 3; //m_params.numKmerRounds;\n\n    while (!done && nk > 0) {\n      // Compute the kmer counts across the read\n      // and determine the positions in the read that are not covered by any solid kmers\n      // These are the candidate incorrect bases\n      std::vector<int> countVector(nk, 0);\n      std::vector<int> solidVector(n, 0);\n\n      for(int i = 0; i < nk; ++i)\n        {\n\t  std::string kmer;\n\t  try { \n\t    kmer = readSequence.substr(i, 31);\n\t  } catch (...) {\n\t    std::cerr << \"KmerFilter substr out of bounds. seqlen \" << readSequence.length() << \n\t      \" stat \" << i << \" length \" << 31 << std::endl;\n\t  }\n\n\t  int count = 0;\n\t  KmerCountMap::iterator iter = kmerCache.find(kmer);\n\t  if (iter != kmerCache.end()) {\n\t    count = iter->second; \n\t  } else {\n\t    \n\t    count = BWTAlgorithms::countSequenceOccurrences(kmer, indices);\n\t    kmerCache.insert(std::make_pair(kmer, count));\n\t  }\n\t  \n\t  // Get the phred score for the last base of the kmer\n\t  int phred = minPhredVector[i];\n\t  countVector[i] = count;\n\t  \n\t  // Determine whether the base is solid or not based on phred scores\n\t  int threshold = CorrectionThresholds::Instance().getRequiredSupport(phred);\n\t  if(count >= threshold)\n            {\n\t      for(int j = i; j < i + 31; ++j)\n\t\tsolidVector[j] = 1;\n            }\n\t}\n  \n\n      allSolid = true;\n      for(int i = 0; i < n; ++i) {\n\tif(solidVector[i] != 1)\n\t  allSolid = false;\n      }\n      \n      // Stop if all kmers are well represented or we have exceeded the number of correction rounds\n      if(allSolid || rounds++ > maxAttempts)\n\tbreak; \n      \n      // Attempt to correct the leftmost potentially incorrect base\n      bool corrected = false;\n      for(int i = 0; i < n; ++i)\n        {\n\t  if(solidVector[i] != 1)\n            {\n\t      // Attempt to correct the base using the leftmost covering kmer\n\t      int phred = 25; //workItem.read.getPhredScore(i);\n\t      int threshold = CorrectionThresholds::Instance().getRequiredSupport(phred);\n\t      \n\t      int left_k_idx = (i + 1 >= 31 ? i + 1 - 31 : 0);\n\t      corrected = attemptKmerCorrection(i, left_k_idx, std::max(countVector[left_k_idx], threshold), readSequence, indices);\n\t      if(corrected)\n\t\tbreak;\n\t      \n\t      // base was not corrected, try using the rightmost covering kmer\n\t      size_t right_k_idx = std::min(i, n - 31);\n\t      corrected = attemptKmerCorrection(i, right_k_idx, std::max(countVector[right_k_idx], threshold), readSequence, indices);\n\t      if(corrected)\n\t\tbreak;\n            }\n        }\n\n\t\n      // If no base in the read was corrected, stop the correction process\n      if(!corrected)\n        {\n\t  assert(!allSolid);\n\t  done = true;\n        }\n\n    } // end while    \n    \n    // if allsolid\n    if( readSequence != origSequence)\n      {\n\t++corrected_reads;\n\tassert(readSequence.length());\n\t//r.AddZTag(\"KC\", readSequence);\n\tr.SetCorrectedSeq(readSequence);\n\t//std::cerr << ssi.id << std::endl;\n\t//std::cerr << \"**************Read corrected from\\to \" << std::endl << \"\\t\" << ssi.seq.toString() << std::endl << \"\\t\" << readSequence << std::endl;\n        //result.correctSequence = readSequence;\n        //result.kmerQC = true;\n      }\n    else\n      {\n\t//std::cerr << \"Read NOT corrected from\\to \" << std::endl << \"\\t\" << ssi.seq.toString() << std::endl << \"\\t\" << readSequence << std::endl;\n        //result.correctSequence = workItem.read.seq.toString();\n        //result.kmerQC = false;\n      }\n  }\n\n  delete pIntervalCache;\n\n  return corrected_reads;\n\n  return 0;\n}\n\n\n// directly from SGA, Jared Simpson\nbool KmerFilter::attemptKmerCorrection(size_t i, size_t k_idx, size_t minCount, std::string& readSequence, BWTIndexSet& inds)\n{\n  assert(i >= k_idx && i < k_idx + m_kmer_len);\n  size_t base_idx = i - k_idx;\n  char originalBase = readSequence[i];\n  std::string kmer;\n  try {\n    kmer = readSequence.substr(k_idx, m_kmer_len);\n  } catch(...) {\n    std::cerr << \"KmerFilter::attemptKmerCorrection substr out of bounds. seqlen \" << readSequence.length() << \n      \" start \" << k_idx << \" length \" << m_kmer_len << std::endl;\n\n  }\n  size_t bestCount = 0;\n  char bestBase = '$';\n\n#if KMER_TESTING\n  std::cout << \"i: \" << i << \" k-idx: \" << k_idx << \" \" << kmer << \" \" << reverseComplement(kmer) << \"\\n\";\n#endif\n\n  for(int j = 0; j < DNA_ALPHABET::size; ++j)\n    {\n      char currBase = ALPHABET[j];\n      if(currBase == originalBase)\n\tcontinue;\n      kmer[base_idx] = currBase;\n      size_t count = BWTAlgorithms::countSequenceOccurrences(kmer, inds);\n\n#if KMER_TESTING\n      printf(\"%c %zu\\n\", currBase, count);\n#endif\n      if(count >= minCount)\n        {\n\t  // Multiple corrections exist, do not correct\n\t  if(bestBase != '$')\n\t    return false;\n\n\t  bestCount = count;\n\t  bestBase = currBase;\n        }\n    }\n\n  if(bestCount >= minCount)\n    {\n      assert(bestBase != '$');\n      readSequence[i] = bestBase;\n      return true;\n    }\n  return false;\n}\n\nvoid KmerFilter::makeIndex(const std::vector<char*>& v) {\n\n  ReadTable pRT;\n  pRT.setZero();\n  \n  int dd = 0;\n  // make the reads tables\n  for (auto& i : v) {\n    \n    SeqItem si;\n    std::string seq(i);\n\n    // if the read is good, add it to the table so we can use for kmer index\n    if (seq.length() >= 40 && seq.find(\"N\") == std::string::npos) {\n      si.id = std::to_string(dd);\n      si.seq = seq;\n      pRT.addRead(si);\n      ++dd;\n    }\n\n  }\n\n  if (pRT.getCount() == 0)\n    return;\n  \n  // make suffix array\n  pSAf = new SuffixArray(&pRT, 1, false);\n  // make BWT\n  pBWT = new RLBWT(pSAf, &pRT);\n\n  return;\n}\n\n//\n/*void KmerFilter::makeIndex(SeqLib::BamRecordVector& vec) {\n\n  ReadTable pRT;\n  pRT.setZero();\n\n  int dd = 0;\n  // make the reads tables\n  for (auto& i : vec) {\n\n    SeqItem si;\n    std::string sr, seq = \"\";\n\n    seq = i.QualitySequence(); //i.QualityTrimmedSequence(4, dum);\n\n    // if the read is good, add it to the table so we can use for kmer index\n    if (seq.length() >= 40 && seq.find(\"N\") == std::string::npos) {\n      si.id = std::to_string(dd);\n      si.seq = seq;\n      std::cerr << \" seq \" << seq << std::endl;\n      pRT.addRead(si);\n      ++dd;\n    }\n\n  }\n\n  if (pRT.getCount() == 0)\n    return;\n  \n  // make suffix array\n  pSAf = new SuffixArray(&pRT, 1, false);\n  // make BWT\n  pBWT= new RLBWT(pSAf, &pRT);\n\n\n}\n\n//\nvoid KmerFilter::makeIndex(svabaReadVector& vec) {\n\n  ReadTable pRT;\n  pRT.setZero();\n\n  int dd = 0;\n  // make the reads tables\n  for (auto& i : vec) {\n\n    SeqItem si;\n    std::string sr;\n    std::string seq = i.Seq(); \n\n    // if the read is good, add it to the table so we can use for kmer index\n    if (seq.length() >= 40 && seq.find(\"N\") == std::string::npos) {\n      si.id = std::to_string(dd);\n      si.seq = seq;\n      pRT.addRead(si);\n      ++dd;\n    }\n\n  }\n\n  if (pRT.getCount() == 0)\n    return;\n  \n  // make suffix array\n  pSAf = new SuffixArray(&pRT, 1, false);\n  // make BWT\n  pBWT= new RLBWT(pSAf, &pRT);\n\n\n}\n\n*/\n"
  },
  {
    "path": "src/svaba/KmerFilter.h",
    "content": "#pragma once\n\n#include <map>\n#include <string>\n\n#include \"SeqLib/BamRecord.h\"\n\n#include \"CorrectionThresholds.h\"\n#include \"OverlapCommon.h\"\n#include \"SvabaRead.h\"\n\ntypedef std::map<std::string, int> KmerCountMap;\n\nclass KmerFilter {\n\n public:\n  \n  KmerFilter() : pBWT(nullptr), pSAf(nullptr) {}\n\n    ~KmerFilter() { delete pBWT; delete pSAf; }\n\n    int correctReads(SeqLib::BamRecordVector& vec);\n\n    int correctReads(svabaReadVector& vec);\n\n    void makeIndex(const std::vector<char*>& v);\n\n    //void makeIndex(SeqLib::BamRecordVector& vec);\n  \n private: \n\n  RLBWT* pBWT;\n  SuffixArray* pSAf;\n\n  int m_kmer_len = 31;\n\n  bool attemptKmerCorrection(size_t i, size_t k_idx, size_t minCount, std::string& readSequence, BWTIndexSet& inds);\n\n\n\n};\n"
  },
  {
    "path": "src/svaba/LearnBamParams.cpp",
    "content": "// LearnBamParams.cpp\n\n#include \"LearnBamParams.h\"\n#include \"SeqLib/BamRecord.h\"\n#include \"SeqLib/BamReader.h\"\n#include \"SeqLib/GenomicRegion.h\"\n#include \"SvabaSharedConfig.h\"\n#include \"SvabaOptions.h\"\n#include \"SvabaLogger.h\"\n#include \"gzstream.h\"\n\n#include <stdexcept>\n#include <sstream>\n#include <vector>\n#include <map>\n#include <algorithm>\n#include <numeric>\n#include <cmath>\n#include <unordered_set>\n\nnamespace {\n\n  // helper to extract read group ids from the header\n  std::vector<std::string> extractReadGroups(const SeqLib::BamHeader& hdr) {\n    std::vector<std::string> groups;\n    std::istringstream lines(hdr.AsString());\n    std::string line;\n    while (std::getline(lines, line)) {\n      if (line.rfind(\"@RG\", 0) != 0) continue;\n      std::istringstream fields(line);\n      std::string field;\n      while (std::getline(fields, field, '\\t')) {\n\tif (field.rfind(\"ID:\", 0) == 0) {\n\t  groups.push_back(field.substr(3));\n\t  break;\n\t}\n      }\n    }\n    return groups;\n  }\n\n} // anonymous namespace\n\n#include <ostream>\n\nstd::ostream& operator<<(std::ostream& os, const BamReadGroup& bg) {\n  os << \"r=\"  << bg.reads\n     << \" s=\"  << bg.supp\n     << \" u=\"  << bg.unmap\n     << \" qc=\" << bg.qcfail\n     << \" d=\"  << bg.duplicate\n     << \" mu=\" << bg.mate_unmap\n     << \" MQ=\" << bg.mapq_max\n     << \" RL=\" << bg.readlen_max\n     << \" mIS=\" << bg.isize_median\n     << \" sdIS=\" << bg.sd_isize\n     << \" n_isize=\" << bg.isize_vec.size();\n  return os;\n}\n\n\nLearnBamParams::LearnBamParams(SvabaSharedConfig& sc_,\n\t\t\t       const std::string& bamPath)\n  : sc(sc_),\n    bam_(bamPath)\n{\n\n  // make the new BamReader\n  reader_ = std::make_shared<SeqLib::BamReader>();\n\n  // open the BAM for learning\n  if (!reader_->Open(bam_)) {\n    throw std::runtime_error(\"Could not open bam file \" + bam_ + \" in LearnBamParams\");\n  }\n}\n\nsize_t LearnBamParams::consumeReads(\n    size_t max_reads,\n    std::unordered_map<std::string, size_t>& rg_count,\n    std::unordered_set<std::string>& satisfied_rgs,\n    const std::vector<std::string>& groups)\n{\n  size_t consumed = 0;\n\n  while (auto r = reader_->Next()) {\n    if (consumed >= max_reads)\n      break;\n\n    // get read group tag\n    std::string rg;\n    if (!r->GetZTag(\"RG\", rg))\n      rg = \"NA\";\n\n    ++consumed;\n\n    // already saturated this RG — skip\n    if (satisfied_rgs.count(rg))\n      continue;\n\n    // check if this read pushes the RG over the limit\n    size_t& cnt = rg_count[rg];\n    if (cnt >= static_cast<size_t>(sc.opts.perRgLearnLimit)) {\n      satisfied_rgs.insert(rg);\n      // check if all header-declared RGs are satisfied\n      if (satisfied_rgs.size() >= groups.size())\n\tbreak;\n      continue;\n    }\n\n    // refer to existing BamReadGroup or make new\n    auto& bstats = bam_read_groups[rg];\n    bstats.addRead(*r);\n    ++cnt;\n  }\n\n  return consumed;\n}\n\nvoid LearnBamParams::learnParams() {\n\n  // gather read group ids from the header\n  auto hdr = reader_->Header();\n  auto groups = extractReadGroups(hdr);\n  int n_contigs = hdr.NumSequences();\n\n  sc.logger.log(true, true, \"......header declares \",\n\t\tgroups.size(), \" read groups across \",\n\t\tn_contigs, \" contigs\");\n\n  // per-RG counts and satisfaction tracking\n  std::unordered_map<std::string, size_t> rg_count;\n  std::unordered_set<std::string> satisfied_rgs;\n  size_t total_reads = 0;\n\n  // --- Phase 1: multi-region sampling ---\n  // Build sampling windows at the midpoint of each reference contig.\n  // This ensures we see reads from every part of the genome, catching\n  // read groups that only appear on later chromosomes.\n  //\n  // For standard contigs (chr1-chrY, ~24 contigs), the 1M-read-per-window\n  // budget means we sample ~24M reads total in the worst case. For BAMs\n  // with many small contigs (alt/decoy/random), we skip contigs shorter\n  // than 1 Mb to avoid wasting time on regions with few reads.\n  //\n  // In human mode (default), we also skip non-standard chromosomes\n  // (chrID > MAX_MATE_CHR_ID, i.e. chrM/alt/decoy/random) to focus\n  // sampling on the primary assembly where isize/coverage stats are\n  // representative. --non-human disables this gate.\n\n  constexpr int32_t MIN_CONTIG_LEN = 1'000'000;   // skip tiny contigs\n  constexpr size_t  READS_PER_WINDOW = 1'000'000;  // reads per sampling window\n  constexpr int32_t WINDOW_HALF = 500'000;          // +/- 500kb around midpoint\n\n  const int max_sample_chr = sc.opts.maxMateChrID; // 23 (through chrY) or -1 if --non-human\n\n  for (int c = 0; c < n_contigs; ++c) {\n    // early exit if all RGs are satisfied\n    if (satisfied_rgs.size() >= groups.size())\n      break;\n\n    // skip non-standard chromosomes in human mode\n    if (max_sample_chr >= 0 && c > max_sample_chr)\n      continue;\n\n    int32_t clen = hdr.GetSequenceLength(c);\n    if (clen < MIN_CONTIG_LEN)\n      continue;\n\n    // sample from the midpoint of the contig\n    int32_t mid = clen / 2;\n    int32_t start = std::max(0, mid - WINDOW_HALF);\n    int32_t end = std::min(clen, mid + WINDOW_HALF);\n\n    SeqLib::GenomicRegion region(c, start, end);\n    if (!reader_->SetRegion(region))\n      continue; // skip if region query fails (no index?)\n\n    size_t consumed = consumeReads(READS_PER_WINDOW, rg_count, satisfied_rgs, groups);\n    total_reads += consumed;\n\n    // log progress every 5 contigs\n    if (c % 5 == 0 || c == n_contigs - 1) {\n      sc.logger.log(sc.opts.verbose > 0, true,\n\t\t    \"......sampling \", hdr.IDtoName(c),\n\t\t    \" - \", SeqLib::AddCommas(total_reads), \" reads, \",\n\t\t    satisfied_rgs.size(), \"/\", groups.size(), \" RGs satisfied\");\n    }\n  }\n\n  // If some header-declared RGs weren't seen during multi-region\n  // sampling, they're likely absent from the BAM entirely (phantom\n  // header entries from upstream merges, etc.). Don't waste time on\n  // a sequential scan — the multi-region pass already covered every\n  // standard chromosome.\n  if (satisfied_rgs.size() < groups.size()) {\n    sc.logger.log(true, true,\n\t\t  \"......\", satisfied_rgs.size(), \"/\", groups.size(),\n\t\t  \" RGs satisfied after multi-region sampling (\",\n\t\t  SeqLib::AddCommas(total_reads), \" reads); \",\n\t\t  \"skipping sequential fallback — missing RGs likely absent from BAM\");\n  }\n\n  sc.logger.log(true, true,\n\t\t\"......learning complete: \", SeqLib::AddCommas(total_reads),\n\t\t\" reads scanned, \",\n\t\tbam_read_groups.size(), \" read groups found, \",\n\t\tsatisfied_rgs.size(), \"/\", groups.size(), \" header RGs satisfied\");\n\n  // log any RGs from the header that we never found reads for\n  for (const auto& g : groups) {\n    if (bam_read_groups.find(g) == bam_read_groups.end()) {\n      sc.logger.log(true, true,\n\t\t    \"......WARNING: read group '\", g,\n\t\t    \"' declared in header but no reads found\");\n    }\n  }\n\n  // dump raw isize data for R plotting BEFORE computeStats clears the vectors.\n  // Use the BAM filename stem in the output name so multiple BAMs don't clobber.\n  if (!sc.opts.analysisId.empty()) {\n    // extract basename: /path/to/foo.bam -> foo\n    std::string stem = bam_;\n    auto slash = stem.rfind('/');\n    if (slash != std::string::npos) stem = stem.substr(slash + 1);\n    auto dot = stem.rfind('.');\n    if (dot != std::string::npos) stem = stem.substr(0, dot);\n    dumpLearnData(sc.opts.analysisId + \".\" + stem);\n  }\n\n  // compute isize stats\n  // store the max readlen and mapq for this entire bam across RGs\n  for (auto& br : bam_read_groups) {\n    br.second.computeStats();\n    readlen_max = std::max(readlen_max, br.second.readlen_max);\n    mapq_max = std::max(mapq_max, br.second.mapq_max);\n    isize_max = std::max(isize_max, br.second.isize_median);\n  }\n\n  // Log per-RG insert size stats and the derived discordant cutoff.\n  //\n  // Method:\n  //   1. Sample up to perRgLearnLimit (default 1000) FR read pairs per\n  //      read group from the midpoint of each standard chromosome.\n  //   2. Discard the top 2% of |isize| values as outliers.\n  //   3. Compute median and population SD on the remaining 98%.\n  //   4. Discordant cutoff = median + SD * sdDiscCutoff\n  //      (sdDiscCutoff defaults to 3.92 for tumor, 3.60 for normal).\n  //   5. A read pair with |isize| > cutoff is classified as discordant.\n  //\n  // The cutoff is applied per-RG in svabaBamWalker::getIsizeCutoff(),\n  // used by both readBam (read extraction) and TagDiscordant (read\n  // tagging).  Normal uses a lower multiplier (sdDiscCutoffNormal)\n  // so it's more sensitive to marginal discordant reads, preventing\n  // germline events from being mis-called as somatic.\n  sc.logger.log(true, true,\n                \"......insert size learning summary (per read group):\");\n  sc.logger.log(true, true,\n                \"......  method: median + SD * sdDiscCutoff on bottom 98% of FR pairs\");\n  sc.logger.log(true, true,\n                \"......  sdDiscCutoff=\", sc.opts.sdDiscCutoff,\n                \" (tumor), sdDiscCutoffNormal=\", sc.opts.sdDiscCutoffNormal,\n                \" (normal); up to \", sc.opts.perRgLearnLimit, \" pairs/RG\");\n  for (const auto& [rg, bp] : bam_read_groups) {\n    double cutoff = bp.isize_median + bp.sd_isize * sc.opts.sdDiscCutoff;\n    sc.logger.log(true, true,\n                  \"......  RG='\", rg,\n                  \"' n_pairs=\", bp.n_isize_pairs,\n                  \" median=\", static_cast<int>(bp.isize_median),\n                  \" sd=\", static_cast<int>(bp.sd_isize),\n                  \" disc_cutoff(tumor)=\", static_cast<int>(cutoff),\n                  \" readlen=\", bp.readlen_max);\n  }\n}\n\nvoid LearnBamParams::dumpLearnData(const std::string& prefix) const {\n\n  std::string fn = prefix + \".learn.tsv.gz\";\n\n  ogzstream out(fn.c_str());\n  if (!out.good()) {\n    sc.logger.log(true, true, \"WARNING: could not open \", fn, \" for writing learn data\");\n    return;\n  }\n\n  // header\n  out << \"bam\\trg\\tisize\\n\";\n\n  // one row per isize observation, per RG\n  for (const auto& [rg, brg] : bam_read_groups) {\n    for (uint32_t is : brg.isize_vec) {\n      out << bam_ << '\\t' << rg << '\\t' << is << '\\n';\n    }\n  }\n\n  out.close();\n  sc.logger.log(true, true, \"......wrote learning data to \", fn);\n}\n\nvoid BamReadGroup::addRead(const SeqLib::BamRecord &r)\n{\n\n  // track the flags\n  ++reads;\n  if (r.SecondaryFlag())\n    ++supp;\n  if (r.QCFailFlag())\n    ++qcfail;\n  if (r.DuplicateFlag())\n    ++duplicate;\n  if (!r.MappedFlag())\n    ++unmap;\n  if (!r.MateMappedFlag())\n    ++mate_unmap;\n\n  // track the mapq\n  mapq_max = std::max(mapq_max, r.MapQuality());\n\n  // track the insert size\n  if (!r.PairMappedFlag() || r.Interchromosomal() || r.PairOrientation() != SeqLib::Orientation::FR)\n    ;\n  else if (!r.Interchromosomal())\n    isize_vec.push_back(std::abs(r.InsertSize()));\n\n  // track the read length\n  readlen_max = std::max(readlen_max, r.Length());\n\n}\n\n void BamReadGroup::computeStats() {\n\n   if (isize_vec.empty()) {\n     isize_median = 0.0;\n     sd_isize     = 0.0;\n     return;\n   }\n\n   // Remove the top 2% of values to filter out extreme outliers\n   std::sort(isize_vec.begin(), isize_vec.end());\n   size_t n = isize_vec.size();\n   size_t keep = static_cast<size_t>(std::floor(n * 0.98));\n   if (keep == 0) {\n     // If 98% rounds down to 0, keep at least one element\n     keep = 1;\n   }\n   isize_vec.resize(keep);\n\n   n_isize_pairs = keep;\n\n   // Calculate median (vector is already sorted)\n   if (keep % 2 == 1) {\n     isize_median = isize_vec[keep / 2];\n   } else {\n     isize_median = (isize_vec[keep / 2 - 1] + isize_vec[keep / 2]) / 2.0;\n   }\n\n    // Calculate population standard deviation around the median\n    double sq_sum = 0.0;\n    for (uint32_t val : isize_vec) {\n      double diff = val - isize_median;\n        sq_sum += diff * diff;\n    }\n    sd_isize = std::sqrt(sq_sum / keep);\n\n    // Clean up memory\n    isize_vec.clear();\n\n }\n"
  },
  {
    "path": "src/svaba/LearnBamParams.h",
    "content": "// LearnBamParams.h\n#pragma once\n\n#include <string>\n#include <map>\n#include <ostream>\n#include <vector>\n#include <unordered_map>\n#include <unordered_set>\n#include <memory>\n\nclass SvabaSharedConfig;\nnamespace SeqLib {\n  class BamRecord;\n  class BamReader;\n}\n\n/** Store information pertaining to a given read group *\n *\n * This class will collect statistics on number of: read, supplementary reads, unmapped reads, qcfail reads, duplicate reads.\n * It will also create Histogram objects to store counts of: mapq, nm, isize, clip, mean phred score, length\n */\nclass BamReadGroup {\n\n public:\n\n  /** Construct an empty BamReadGroup */\n  BamReadGroup() {}\n\n  /** Add a BamRecord to this read group */\n  void addRead(const SeqLib::BamRecord &r);\n\n  void computeStats();\n\n  friend std::ostream& operator<<(std::ostream& os, const BamReadGroup& bg);\n\n  // count number of reads\n  size_t reads = 0;\n  size_t supp = 0;\n  size_t unmap = 0;\n  size_t qcfail = 0;\n  size_t duplicate = 0;\n  size_t mate_unmap = 0;\n\n  int mapq_max = 0;\n  int readlen_max = 0;\n  std::vector<uint32_t> isize_vec;\n\n  // statistics (set by computeStats)\n  size_t n_isize_pairs = 0;  // number of FR pairs used (after 98% trim)\n  double isize_median = 0;\n  double sd_isize = 0;      // SD computed around the median\n\n};\n\n\n/**\n * LearnBamParams encapsulates logic to learn insert-size and related statistics\n * from a single BAM file or across multiple BAM files. It:\n *   - Opens and iterates through each read in the BAM (via SeqLib::BamReader)\n *   - Groups reads by read-group and collects metrics (read length, MAPQ, insert-size distribution)\n *   - Computes per-read-group statistics (mean, median, SD of insert size, coverage, clip fraction, etc.)\n *   - Provides a static helper to run this process on a set of BAM files and\n *     produce both per-file (per RG) and global summary statistics (max read length,\n *     max mapQ, and a discordant read size cutoff).\n *\n * Sampling strategy (SvABA2.0): coordinate-sorted BAMs cluster read groups\n * by genomic position, so scanning from the start only sees RGs present in\n * early chromosomes. To ensure all RGs are represented:\n *   1. Build sampling windows at the midpoint of each reference contig\n *   2. For each window, read up to `reads_per_window` reads (100k default)\n *   3. Track per-RG counts; skip reads from already-saturated RGs\n *   4. Stop early once all header-declared RGs are satisfied\n * This replaces the old sequential-from-start scan that missed 20/21 RGs.\n */\nclass LearnBamParams {\n\npublic:\n\n  /// Learn parameters from a single BAM file\n  LearnBamParams(SvabaSharedConfig& sc_,\n\t\t const std::string& bamPath); // opens the BAM\n\n  // map of RG : params, for a single bam\n  void learnParams();  // learn the RGs\n\n  // this is map of RG-name : BamReadGroup\n  std::unordered_map<std::string, BamReadGroup> bam_read_groups;\n\n  // per BAM readlen / mapq max\n  int readlen_max = 0;\n  int mapq_max = 0;\n  double isize_max = 0;\n\n  /// Write per-RG isize distributions to a TSV for R plotting.\n  /// Called after learnParams() and before computeStats() clears the vectors.\n  /// Output: ${prefix}.learn.tsv.gz with columns: bam, rg, isize\n  void dumpLearnData(const std::string& prefix) const;\n\nprivate:\n\n  /// Process reads from the current reader position, updating rg_count\n  /// and bam_read_groups. Returns number of reads consumed.\n  size_t consumeReads(size_t max_reads,\n\t\t      std::unordered_map<std::string, size_t>& rg_count,\n\t\t      std::unordered_set<std::string>& satisfied_rgs,\n\t\t      const std::vector<std::string>& groups);\n\n std::string       bam_; // file path of the BAM\n SvabaSharedConfig&  sc;\n std::shared_ptr<SeqLib::BamReader> reader_;\n\n};\n"
  },
  {
    "path": "src/svaba/ReadToContigAligner.h",
    "content": "#ifndef SNOWMAN_READ_TO_CONTIG_ALIGNER_H__\n#define SNOWMAN_READ_TO_CONTIG_ALIGNER_H__\n\n#include \"SnowTools/AlignedContig.h\"\n#include \"SnowTools/BamRead.h\"\n#include \"SnowTools/BWAWrapper.h\"\n\nclass ReadToContigAligner {\n\n public: \n\n  ReadToContigAligner() {}\n\n  ReadToContigAligner(const SnowTools::USeqVector& usv, BamReadVector& bav_this, std::vector<SnowTools::AlignedContig>& this_alc) {\n  \n private:\n\n  BamReadVector m_reads;\n\n  SnowTools::USeqVector m_usv;\n\n  SnowTools::BWAWrapper& m_bw;\n\n  std::vector<SnowTools::AlignedContig> m_alc;\n\n};\n\n#endif\n"
  },
  {
    "path": "src/svaba/STCoverage.cpp",
    "content": "#include \"STCoverage.h\"\n#include \"SeqLib/SeqLibCommon.h\"\n#include \"SeqLib/BamRecord.h\"\n#include <stdexcept>\n#include <algorithm>\n\nusing SeqLib::BamRecord;\nusing SeqLib::GenomicRegion;\nusing SeqLib::Cigar;\n\n  void STCoverage::clear() {\n    m_map.clear();\n  }\n  \nvoid STCoverage::addRead(const BamRecord &r, int buff) { //, bool full_length) {\n    \n    int p = -1; \n    int e = -1;\n\n    // old code to also cover soft clips, not needed\n    /*    if (full_length) {\n\t  Cigar c = r.GetCigar();\n\t  // get beginning\n\t  if (c.size() && c[0].RawType() == BAM_CSOFT_CLIP)\n\t  p = std::max((int32_t)0, r.Position() - (int32_t)c[0].Length()); // get prefixing S\n\t  else\n\t  p = r.Position();\n\t  // get end\n\t  if (c.size() && c.back().RawType() == BAM_CSOFT_CLIP)\n\t  e = r.PositionEnd() + c.back().Length();\n\t  else\n\t  e = r.PositionEnd();\n\t  }\n\t  else { */\n    p = r.Position() + buff;\n    e = r.PositionEnd() - buff;\n    //    }\n    \n    if (p < 0 || e < 0)\n      return;\n    \n    assert(e - p < 1e6); // limit on read length\n    assert(r.ChrID() >= 0);\n    \n    try {\n      while (p <= e) {\n\t++m_map[r.ChrID()][p]; // add one to this position\n\t++p;\n      }\n    } catch (std::out_of_range &oor) {\n      std::cerr << \"Position \" << p << \" on tid \" << r.ChrID()\n\t\t<< \" is greater than expected max -- skipping\" << std::endl;\n      \n    }\n    \n  }\n\nuint32_t STCoverage::getCoverageAtPosition(int chr, int pos) const {\n\n  auto chr_it = m_map.find(chr);\n  if (chr_it == m_map.end()) {\n    return 0;\n  }\n  \n  auto pos_it = chr_it->second.find(pos);\n  if (pos_it == chr_it->second.end()) {\n    return 0;\n  }\n  \n  return pos_it->second;\n  \n}\n"
  },
  {
    "path": "src/svaba/STCoverage.h",
    "content": "#pragma once\n\n#include <memory>\n#include <unordered_map>\n#include <vector>\n#include <cstdint>\n#include <vector>\n#include <cassert> \n#include <iostream>\n#include <memory>\n\n#include \"htslib/hts.h\"\n#include \"htslib/sam.h\"\n#include \"htslib/bgzf.h\"\n#include \"htslib/kstring.h\"\n\n#include \"SeqLib/GenomicRegion.h\"\n#include \"SeqLib/GenomicRegionCollection.h\"\n\nnamespace SeqLib {\n  class BamRecord;\n}\n\ntypedef std::unordered_map<int32_t,uint32_t> CovMap;\n\n/** Hold base-pair or binned coverage across an interval or genome\n *\n * Currently stores coverage as an unordered_map.\n */\nclass STCoverage {\n  \nprivate:\n  \n  std::unordered_map<int32_t, CovMap> m_map; //[chr [pos,cov] ] \n\n public:\n\n  STCoverage() = default;\n  \n  /** Clear the coverage map */\n  void clear();\n      \n  /** Add a read to this coverage track \n   * @param reserve_size Upper bound estimate for size of map. Not a hard\n   *   cutoff but improves performance if total number of positions is less than this, \n   *   as it will not rehash. */\n  void addRead(const SeqLib::BamRecord &r, int buff); //, bool full_length);\n\n  /** Print the entire data */\n  friend std::ostream& operator<<(std::ostream &out, const STCoverage &c);\n\n  /** Return the coverage count at a position */\n  uint32_t getCoverageAtPosition(int chr, int pos) const;\n  \n};\n\n"
  },
  {
    "path": "src/svaba/SvabaASQG.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ASQG - Definitions and functions\n// for handling ASGQ files\n//\n#include \"SvabaASQG.h\"\n#include <iterator>\n\nnamespace svabaASQG\n{\n\nconst int HEADER_VERSION = 1;\n\n// Record ID tags\nstatic constexpr int RECORD_TAG_SIZE = 2; // do not include null terminator \nstatic char HEADER_TAG[] = \"HT\";\nstatic char VERTEX_TAG[] = \"VT\";\nstatic char EDGE_TAG[] = \"ED\";\n\n// Header tags\nconst int FIELD_TAG_SIZE = 2;\nstatic char VERSION_TAG[] = \"VN\";\nstatic char OVERLAP_TAG[] = \"OL\";\nstatic char INPUT_FILE_TAG[] = \"IN\";\nstatic char ERROR_RATE_TAG[] = \"ER\";\nstatic char CONTAINMENT_TAG[] = \"CN\"; // 1 if the graph has containment edges/vertices\nstatic char TRANSITIVE_TAG[] = \"TE\"; // 1 if the graph has transitive edges\n\n// Vertex tags\nstatic char SUBSTRING_TAG[] = \"SS\";\n\n//\n// Header Record\n//\nHeaderRecord::HeaderRecord()\n{\n    setVersionTag(HEADER_VERSION);\n}\n\n//\nHeaderRecord::HeaderRecord(const std::string& recordLine)\n{\n    parse(recordLine);\n}\n\n//\nvoid HeaderRecord::setVersionTag(int version)\n{\n    m_versionTag.set(version);\n}\n\n//\nvoid HeaderRecord::setOverlapTag(int overlapLen)\n{\n    m_overlapTag.set(overlapLen);\n}\n\n//\nvoid HeaderRecord::setInputFileTag(const std::string& name)\n{\n    m_infileTag.set(name);\n}\n\n//\nvoid HeaderRecord::setErrorRateTag(float errorRate)\n{\n    m_errorRateTag.set(errorRate);\n}\n\n//\nvoid HeaderRecord::setContainmentTag(int v)\n{\n    m_containmentTag.set(v);\n}\n\n//\nvoid HeaderRecord::setTransitiveTag(int v)\n{\n    m_transitiveTag.set(v);\n}\n\n//\nvoid HeaderRecord::write(std::ostream& out)\n{\n    StringVector fields;\n    fields.push_back(HEADER_TAG);\n\n    // Check for mandatory tags\n    if(!m_versionTag.isInitialized())\n    {\n        std::cerr << \"Error: Header version tag not set, aborting.\" << std::endl;\n        exit(EXIT_FAILURE);\n    }\n    else\n    {\n        fields.push_back(m_versionTag.toTagString(VERSION_TAG));\n    }\n\n    if(m_errorRateTag.isInitialized())\n        fields.push_back(m_errorRateTag.toTagString(ERROR_RATE_TAG));\n\n    if(m_overlapTag.isInitialized())\n        fields.push_back(m_overlapTag.toTagString(OVERLAP_TAG));\n    \n    if(m_infileTag.isInitialized())\n        fields.push_back(m_infileTag.toTagString(INPUT_FILE_TAG));\n    \n    if(m_containmentTag.isInitialized())\n        fields.push_back(m_containmentTag.toTagString(CONTAINMENT_TAG));\n    \n    if(m_transitiveTag.isInitialized())\n        fields.push_back(m_transitiveTag.toTagString(TRANSITIVE_TAG));\n\n    writeFields(out, fields);\n}\n\n//JEREMIAH\nvoid HeaderRecord::write(std::stringstream& out)\n{\n    StringVector fields;\n    fields.push_back(HEADER_TAG);\n\n    // Check for mandatory tags\n    if(!m_versionTag.isInitialized())\n    {\n        std::cerr << \"Error: Header version tag not set, aborting.\" << std::endl;\n        exit(EXIT_FAILURE);\n    }\n    else\n    {\n        fields.push_back(m_versionTag.toTagString(VERSION_TAG));\n    }\n\n    if(m_errorRateTag.isInitialized())\n        fields.push_back(m_errorRateTag.toTagString(ERROR_RATE_TAG));\n\n    if(m_overlapTag.isInitialized())\n        fields.push_back(m_overlapTag.toTagString(OVERLAP_TAG));\n    \n    if(m_infileTag.isInitialized())\n        fields.push_back(m_infileTag.toTagString(INPUT_FILE_TAG));\n    \n    if(m_containmentTag.isInitialized())\n        fields.push_back(m_containmentTag.toTagString(CONTAINMENT_TAG));\n    \n    if(m_transitiveTag.isInitialized())\n        fields.push_back(m_transitiveTag.toTagString(TRANSITIVE_TAG));\n\n    writeFields(out, fields);\n}\n\n\n//\nvoid HeaderRecord::parse(const std::string& record)\n{\n    if(record.size() < 2)\n    {\n        std::cerr << \"Error: Record is not valid\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    // Tokenize record\n    StringVector tokens = SQG::tokenizeRecord(record);\n\n    // Ensure the first token indicates this is a valid header record\n    if(tokens[0].compare(0, RECORD_TAG_SIZE, HEADER_TAG) != 0)\n    {\n        std::cerr << \"Error: Record does not have a header tag\" << std::endl;\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    for(size_t i = 1; i < tokens.size(); ++i)\n    {\n        static char VERSION_TAG[] = \"VN\";\n        static char OVERLAP_TAG[] = \"OL\";\n        static char INPUT_FILE_TAG[] = \"IN\";\n        static char ERROR_RATE_TAG[] = \"ER\";\n        \n        if(tokens[i].compare(0, FIELD_TAG_SIZE, VERSION_TAG) == 0)\n            m_versionTag.fromString(tokens[i]);\n\n        if(tokens[i].compare(0, FIELD_TAG_SIZE, OVERLAP_TAG) == 0)\n            m_overlapTag.fromString(tokens[i]);\n\n        if(tokens[i].compare(0, FIELD_TAG_SIZE, INPUT_FILE_TAG) == 0)\n            m_infileTag.fromString(tokens[i]);\n\n        if(tokens[i].compare(0, FIELD_TAG_SIZE, ERROR_RATE_TAG) == 0)\n            m_errorRateTag.fromString(tokens[i]);\n\n        if(tokens[i].compare(0, FIELD_TAG_SIZE, CONTAINMENT_TAG) == 0)\n            m_containmentTag.fromString(tokens[i]);\n        \n        if(tokens[i].compare(0, FIELD_TAG_SIZE, TRANSITIVE_TAG) == 0)\n            m_transitiveTag.fromString(tokens[i]);\n\n    }\n}\n\n//\n// Vertex Record\n//\n//\nVertexRecord::VertexRecord(const std::string& recordLine)\n{\n    parse(recordLine);\n}\n\n//\nvoid VertexRecord::setSubstringTag(bool b)\n{\n    m_substringTag.set(b);\n}\n\n//\nvoid VertexRecord::write(std::ostream& out)\n{\n    StringVector fields;\n    fields.push_back(VERTEX_TAG);\n    fields.push_back(m_id);\n    fields.push_back(m_seq);\n\n    if(m_substringTag.isInitialized())\n        fields.push_back(m_substringTag.toTagString(SUBSTRING_TAG));\n\n    writeFields(out, fields);\n}\n\n//JEREMIAH\nvoid VertexRecord::write(std::stringstream& out)\n{\n    StringVector fields;\n    fields.push_back(VERTEX_TAG);\n    fields.push_back(m_id);\n    fields.push_back(m_seq);\n\n    if(m_substringTag.isInitialized())\n        fields.push_back(m_substringTag.toTagString(SUBSTRING_TAG));\n\n    writeFields(out, fields);\n}\n\n\n\n//\nvoid VertexRecord::parse(const std::string& record)\n{\n    if(record.size() < 2)\n    {\n        std::cerr << \"Error: Record is not valid\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    // Tokenize record\n    StringVector tokens = SQG::tokenizeRecord(record);\n\n    if(tokens.size() < 3)\n    {\n        std::cerr << \"Error: Vertex record is incomplete.\\n\";\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    // Ensure the first token indicates this is a valid vertex record\n    if(tokens[0].compare(0, RECORD_TAG_SIZE, VERTEX_TAG) != 0)\n    {\n        std::cerr << \"Error: Record does not have a vertex tag\" << std::endl;\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    m_id = tokens[1];\n    m_seq = tokens[2];\n    \n    for(size_t i = 3; i < tokens.size(); ++i)\n    {\n        if(tokens[i].compare(0, FIELD_TAG_SIZE, SUBSTRING_TAG) == 0)\n            m_substringTag.fromString(tokens[i]);\n    }    \n}\n\n\n\n//\n// EdgeRecord\n//\nEdgeRecord::EdgeRecord(const std::string& recordLine)\n{\n    parse(recordLine);\n}\n\n//\nvoid EdgeRecord::write(std::ostream& out)\n{\n    StringVector fields;\n    fields.push_back(EDGE_TAG);\n    std::stringstream ss;\n    ss << m_overlap;\n    fields.push_back(ss.str());\n    writeFields(out, fields);\n}\n\n//\nvoid EdgeRecord::parse(const std::string& record)\n{\n    if(record.size() < 2)\n    {\n        std::cerr << \"Error: Record is not valid\\n\";\n        exit(EXIT_FAILURE);\n    }\n\n    // Tokenize record\n    StringVector tokens = SQG::tokenizeRecord(record);\n\n    if(tokens.size() < 2)\n    {\n        std::cerr << \"Error: Edge record is incomplete.\\n\";\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    // Ensure the first token indicates this is a valid edge record\n    if(tokens[0].compare(EDGE_TAG) != 0)\n    {\n        std::cerr << \"Error: Record does not have an edge tag\" << std::endl;\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    // Parse the overlap\n    std::stringstream ssparser(tokens[1]);\n    ssparser >> m_overlap;\n}\n\n//\n//\n//\nRecordType getRecordType(const std::string& record)\n{\n    // the record type is the first two characters of the record\n    if(record.size() < 2)\n    {\n        std::cerr << \"Error: record does not have a valid record-type tag\" << std::endl;\n        std::cerr << \"Record: \" << record << std::endl;\n        exit(EXIT_FAILURE);\n    }\n\n    char recordTag[RECORD_TAG_SIZE];\n    record.copy(recordTag, RECORD_TAG_SIZE);\n\n    if(strncmp(recordTag, HEADER_TAG, RECORD_TAG_SIZE) == 0)\n    {\n        return RT_HEADER;\n    }\n\n    if(strncmp(recordTag, VERTEX_TAG, RECORD_TAG_SIZE) == 0)\n    {\n        return RT_VERTEX;\n    }\n\n    if(strncmp(recordTag, EDGE_TAG, RECORD_TAG_SIZE) == 0)\n    {\n        return RT_EDGE;\n    }\n\n    // Unknown tag\n    std::cerr << \"Error: Unknown ASQG file record tag: \" << recordTag << std::endl;\n    exit(EXIT_FAILURE);\n}\n\nvoid writeFields(std::ostream& out, const StringVector& fields)\n{\n    for(size_t i = 0; i < fields.size(); ++i)\n    {\n        out << fields[i];\n        if(i != fields.size() - 1)\n            out << SQG::FIELD_SEP;\n    }\n    out << \"\\n\";\n}\n\n}\n\n"
  },
  {
    "path": "src/svaba/SvabaASQG.h",
    "content": "//-----------------------------------------------\n// Copyright 2010 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// ASQG - Definitions and functions\n// for handling ASGQ files\n//\n#ifndef SVABA_ASQG_H\n#define SVABA_ASQG_H\n\n#include \"SQG.h\"\n#include \"Match.h\"\n\nnamespace svabaASQG\n{\n    enum RecordType\n    {\n        RT_HEADER = 0,\n        RT_VERTEX,\n        RT_EDGE\n    };\n\n    // A header record is just a tag:value pairs\n    struct HeaderRecord\n    {\n        public:\n            HeaderRecord();\n            HeaderRecord(const std::string& recordLine);\n            \n            void setOverlapTag(int overlapLen);\n            void setInputFileTag(const std::string& name);\n            void setErrorRateTag(float errorRate);\n            void setContainmentTag(int v);\n            void setTransitiveTag(int v);\n\n            const SQG::IntTag& getVersionTag() const { return m_versionTag; }\n            const SQG::FloatTag& getErrorRateTag() const { return m_errorRateTag; }\n            const SQG::StringTag& getInfileTag() const { return m_infileTag; }\n            const SQG::IntTag& getOverlapTag() const { return m_overlapTag; }\n            const SQG::IntTag& getContainmentTag() const { return m_containmentTag; };\n            const SQG::IntTag& getTransitiveTag() const { return m_transitiveTag; };\n\n            void write(std::ostream& out);\n            void write(std::stringstream& out); // JEREMIAH\n            void parse(const std::string& record);\n\n        private:\n\n            void setVersionTag(int version);\n            \n            SQG::IntTag m_versionTag;\n            SQG::FloatTag m_errorRateTag;\n            SQG::StringTag m_infileTag;\n            SQG::IntTag m_overlapTag;\n            SQG::IntTag m_containmentTag;\n            SQG::IntTag m_transitiveTag;\n    };\n\n    // A vertex record is an id, sequence and an array of\n    // tag:value \n    struct VertexRecord\n    {\n        public:\n            VertexRecord() {}\n            VertexRecord(const std::string& recordLine);\n            VertexRecord(const std::string& i, const std::string& s) : m_id(i), m_seq(s) {}\n\n            void setSubstringTag(bool b);\n            \n            const std::string& getID() const { return m_id; }\n            const std::string& getSeq() const { return m_seq; }\n            const SQG::IntTag& getSubstringTag() const { return m_substringTag; }\n\n            void write(std::ostream& out);\n            void write(std::stringstream& out);\n            void parse(const std::string& record);\n\n        private:\n\n            std::string m_id;\n            std::string m_seq;\n            SQG::IntTag m_substringTag;\n    };\n\n    // An edge record is just an overlap object and tag:values\n    struct EdgeRecord\n    {\n        public:\n            EdgeRecord() {}\n            EdgeRecord(const std::string& recordLine);\n            EdgeRecord(const Overlap& o) : m_overlap(o) {}\n\n            const Overlap& getOverlap() const { return m_overlap; }\n\n            void write(std::ostream& out);\n            void parse(const std::string& record);\n\n        private:\n        \n            Overlap m_overlap;\n    };\n\n    // Parsing functions\n    RecordType getRecordType(const std::string& record);\n    HeaderRecord parseHeaderRecord(const std::string& record);\n    VertexRecord parseVertexRecord(const std::string& record);\n    EdgeRecord parseEdgeRecord(const std::string& record);\n\n    // Writing functions\n    void writeFields(std::ostream& out, const StringVector& fields);\n};\n\n#endif\n"
  },
  {
    "path": "src/svaba/SvabaAssemble.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// assemble - convert read overlaps into contigs\n//\n\n#include <iostream>\n#include <fstream>\n#include \"Util.h\"\n#include \"SvabaAssemble.h\"\n#include \"SGUtil.h\"\n#include \"SGAlgorithms.h\"\n#include \"SGVisitors.h\"\n#include \"EncodedString.h\"\n#include <unistd.h>\n#include <string>\n#include \"SGSearch.h\"\n\n//#define DEBUG_ASSEMBLY 1\n\nvoid walkExtra(StringGraph * pGraph, SGWalkVector& outWalks);\n\nStringGraph* assemble(std::stringstream& asqg_stream, int minOverlap, int maxEdges, bool bExact, \n\t      int trimLengthThreshold, bool bPerformTR, bool bValidate, int numTrimRounds, \n              int resolveSmallRepeatLen, int numBubbleRounds, double maxBubbleGapDivergence, \n              double maxBubbleDivergence, int maxIndelLength, int cutoff, std::string prefix, \n\t\t      SeqLib::UnalignedSequenceVector &contigs, bool get_components)\n{\n\n  AssemblyOptions ao;\n\n  StringGraph * pGraph = SGUtil::loadASQG(asqg_stream, minOverlap, true, maxEdges);\n  pGraph->m_get_components = get_components;\n\n  if(bExact)\n    pGraph->setExactMode(true);\n  \n  // Visitor functors\n  SGTransitiveReductionVisitor trVisit;\n  SGGraphStatsVisitor statsVisit;\n  SGTrimVisitor trimVisit(trimLengthThreshold);\n  SGContainRemoveVisitor containVisit;\n  SGValidateStructureVisitor validationVisit;\n  \n  while(pGraph->hasContainment())\n    pGraph->visit(containVisit);\n\n  // Remove any extraneous transitive edges that may remain in the graph\n  if(bPerformTR)\n    {\n      std::cout << \"Removing transitive edges\\n\";\n      pGraph->visit(trVisit);\n    }\n  \n  // Compact together unbranched chains of vertices\n  pGraph->simplify();\n  \n  if(bValidate)\n    {\n      pGraph->visit(validationVisit);\n    }\n\n  // Remove dead-end branches from the graph\n  if(numTrimRounds > 0) {\n      int numTrims = numTrimRounds;\n      while(numTrims-- > 0)\n\tpGraph->visit(trimVisit);\n    }\n  \n  // Resolve small repeats\n  if(resolveSmallRepeatLen > 0 && false) {\n      SGSmallRepeatResolveVisitor smallRepeatVisit(resolveSmallRepeatLen);\n    }\n  \n  if(numBubbleRounds > 0)\n    {\n      SGSmoothingVisitor smoothingVisit(ao.outVariantsFile, maxBubbleGapDivergence, maxBubbleDivergence, maxIndelLength);\n      int numSmooth = numBubbleRounds;\n      while(numSmooth-- > 0)\n\tpGraph->visit(smoothingVisit);\n      pGraph->simplify(); \n    }\n\n  pGraph->renameVertices(prefix);\n\n  SGVisitorContig av;\n  pGraph->visit(av);\n  \n  SeqLib::UnalignedSequenceVector tmp = av.m_ct;\n  for (SeqLib::UnalignedSequenceVector::const_iterator it = tmp.begin(); it != tmp.end(); it++) {\n    if ((int)(it->Seq.length()) >= cutoff) {\n      contigs.push_back({it->Name + \"C\", it->Seq, std::string()}); //postpend with character to distribugish _2 from _22\n    }\n  }\n  \n  /*  if (walk_all) {\n      SGWalkVector outWalks;\n      walkExtra(pGraph, outWalks);\n      for (auto& i : outWalks) {\n      std::string seqr = i.getString(SGWT_START_TO_END);\n      if ((int)seqr.length() >= cutoff) \n      contigs.push_back(Contig(i.pathSignature(), seqr));\n      }\n      }*/\n  \n\n  return pGraph;\n  //    delete pGraph;\n   \n}\n\nvoid walkExtra(StringGraph * pGraph, SGWalkVector& outWalks) {\n  \n  typedef std::vector<VertexPtrVec> ComponentVector;\n    VertexPtrVec allVertices = pGraph->getAllVertices();\n    ComponentVector components;\n#ifdef DEBUG_ASSEMBLY\n    std::cerr << \"selecting connected componsnet\" << std::endl;\n#endif\n    \n    SGSearchTree::connectedComponents(allVertices, components);\n    \n    // Select the largest component\n    int selectedIdx = -1;\n    size_t largestSize = 0;\n    \n    for(size_t i = 0; i < components.size(); ++i)\n      {\n\tif(components[i].size() > largestSize)\n\t  {\n\t    selectedIdx = i;\n\t    largestSize = components[i].size();\n\t  }\n      }\n    \n#ifdef DEBUG_ASSEMBLY\n    std::cerr << \"looping vertices\" << std::endl;\n#endif\n    \n    assert(selectedIdx != -1);    \n    VertexPtrVec selectedComponent = components[selectedIdx];\n    // Build a vector of the terminal vertices\n    VertexPtrVec terminals;\n    for(size_t i = 0; i < selectedComponent.size(); ++i)\n      {\n\tVertex* pVertex = selectedComponent[i];\n\tsize_t asCount = pVertex->getEdges(ED_ANTISENSE).size();\n\tsize_t sCount = pVertex->getEdges(ED_SENSE).size();\n\t\n\tif(asCount == 0 || sCount == 0)\n\t  terminals.push_back(pVertex);\n      }\n    \n#ifdef DEBUG_ASSEMBLY\n    std::cerr << \"getting walks on \" << terminals.size() << \" vertices \"  << std::endl;\n#endif\n    \n    // Find walks between all-pairs of terminal vertices\n    SGWalkVector tempWalks;\n    if (terminals.size() > 2 && terminals.size() < 10) {\n      for(size_t i = 0; i < terminals.size(); ++i)\n\t{\n\t  for(size_t j = i + 1; j < terminals.size(); j++)\n\t    {\n\t      Vertex* pX = terminals[i];\n\t      Vertex* pY = terminals[j];\n\t      int maxDistance = 2;\n\t      SGSearch::findWalks(pX, pY, ED_SENSE, maxDistance, 1000000, false, tempWalks);\n\t      SGSearch::findWalks(pX, pY, ED_ANTISENSE, maxDistance, 1000000, false, tempWalks);   \n\t    }\n\t}\n    }\n    \n#ifdef DEBUG_ASSEMBLY\n    std::cerr << \"deduping walks on \" << terminals.size() << \" vertices \"  << std::endl;\n#endif\n    \n    // Remove duplicate walks\n    std::map<std::string, SGWalk> walkMap;\n    for(size_t i = 0; i < tempWalks.size(); ++i)\n      {\n\tstd::string walkString = tempWalks[i].getString(SGWT_START_TO_END);\n\twalkMap.insert(std::make_pair(walkString, tempWalks[i]));\n      }\n    // Copy unique walks to the output\n    for(std::map<std::string, SGWalk>::iterator mapIter = walkMap.begin(); mapIter != walkMap.end(); ++mapIter)\n      outWalks.push_back(mapIter->second);\n    \n    // Sort the walks by string length\n    std::sort(outWalks.begin(), outWalks.end(), SGWalk::compareByTotalLength);\n    \n    int numOutputWalks = 10;\n    if(numOutputWalks > 0 && numOutputWalks < (int)outWalks.size())\n      {\n\tassert(outWalks.begin() + numOutputWalks < outWalks.end());\n\toutWalks.erase(outWalks.begin() + numOutputWalks, outWalks.end());\n      }\n  \n}\n"
  },
  {
    "path": "src/svaba/SvabaAssemble.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL license\n//-----------------------------------------------\n//\n// assemble - Assemble reads into contigs\n//\n#ifndef SVABA_ASSEMBLE_H\n#define SVABA_ASSEMBLE_H\n#include <getopt.h>\n//#include \"config.h\"\n#include <iostream>\n#include <fstream>\n#include <sstream>\n#include \"Util.h\"\n#include \"SGUtil.h\"\n\n#include \"SeqLib/UnalignedSequence.h\"\n\n\nstruct AssemblyOptions {\n  \n  unsigned int verbose = 1;\n  std::string asqgFile;\n  std::string outContigsFile;\n  std::string outVariantsFile;\n  std::string outGraphFile;\n  \n  unsigned int minOverlap;\n  bool bEdgeStats = false;\n  bool bSmoothGraph = false;\n  int resolveSmallRepeatLen = -1;\n  size_t maxEdges = 128;\n  \n  // Trim parameters\n  int numTrimRounds = 10;\n  size_t trimLengthThreshold = 300;\n  \n  // Bubble parameters\n  int numBubbleRounds = 3;\n  double maxBubbleDivergence = 0.05f;\n  double maxBubbleGapDivergence = 0.01f;\n  int maxIndelLength = 20;\n  \n  // \n  bool bValidate;\n  bool bExact = true;\n  bool bPerformTR = false;\n  \n};\n\nStringGraph* assemble(std::stringstream& asqg_stream, int minOverlap, int maxEdges, bool bExact, \n\t      int trimLengthThreshold, bool bPerformTR, bool bValidate, int numTrimRounds, \n              int resolveSmallRepeatLen, int numBubbleRounds, double maxBubbleGapDivergence, \n              double maxBubbleDivergence, int maxIndelLength, int cutoff, std::string prefix, \n\t\t      SeqLib::UnalignedSequenceVector &contigs, bool get_components);\n\n\n#endif\n"
  },
  {
    "path": "src/svaba/SvabaAssemblerConfig.h",
    "content": "#pragma once\n\n// ---------------------------------------------------------------------------\n// svabaAssemblerConfig.h\n//\n// Compile-time selection of the local-assembly engine used by svaba.\n//\n//   SVABA_ASSEMBLER_FERMI   (1) -> use fermi2 (ropebwt2-based) assembler\n//   SVABA_ASSEMBLER_FERMI   (0) -> use the vendored SGA String Graph Assembler\n//\n// This used to live as a bare `#define FERMI 1` at the top of\n// SvabaRegionProcessor.cpp, which meant nothing else in the build could see\n// it (so e.g. run_svaba.cpp could not report which assembler was compiled\n// in). Centralizing it here lets any TU `#include \"SvabaAssemblerConfig.h\"`\n// and branch on the same symbol.\n//\n// To switch assemblers at build time without editing this header, pass\n//   -DSVABA_ASSEMBLER_FERMI=0\n// (or =1) via CMake / CXXFLAGS.\n// ---------------------------------------------------------------------------\n\n#ifndef SVABA_ASSEMBLER_FERMI\n#define SVABA_ASSEMBLER_FERMI 1\n#endif\n\n// Back-compat alias: existing code uses `#ifndef FERMI` / `#ifdef FERMI`.\n#if SVABA_ASSEMBLER_FERMI\n  #ifndef FERMI\n    #define FERMI 1\n  #endif\n#else\n  #ifdef FERMI\n    #undef FERMI\n  #endif\n#endif\n\n// Human-readable name of the active assembler, for logging.\nnamespace svaba {\n#if SVABA_ASSEMBLER_FERMI\n  inline constexpr const char* kAssemblerName = \"fermi2\";\n  inline constexpr const char* kAssemblerTag  = \"fermi\";\n#else\n  inline constexpr const char* kAssemblerName = \"SGA\";\n  inline constexpr const char* kAssemblerTag  = \"sga\";\n#endif\n}\n"
  },
  {
    "path": "src/svaba/SvabaAssemblerEngine.cpp",
    "content": "#include \"SvabaAssemblerEngine.h\"\n#include \"SvabaUtils.h\"\n\n#include <map>\n#include <algorithm>\n\n#include \"SGACommon.h\"\n\n#include \"SvabaASQG.h\"\n#include \"SvabaAssemble.h\"\n#include \"SvabaOverlapAlgorithm.h\"\n#include \"SvabaOptions.h\"\n\n#include \"OverlapCommon.h\"\n#include \"CorrectionThresholds.h\"\n\n//#define DEBUG_ENGINE 1\n\nstatic std::string repeat(char base, int count) {\n  return std::string(count, base);\n}\n\nstatic const std::string POLYA  = repeat('A', 30);\nstatic const std::string POLYT  = repeat('T', 30);\nstatic const std::string POLYC  = repeat('C', 30);\nstatic const std::string POLYG  = repeat('G', 30);\nstatic const std::string POLYAT = \"ATATATATATATATATATATATATATATATATATATATAT\";\nstatic const std::string POLYTC = \"TCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTC\";\nstatic const std::string POLYAG = \"AGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAG\";\nstatic const std::string POLYCG = \"CGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCG\";\nstatic const std::string POLYTG = \"TGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTG\";\nstatic const std::string POLYCA = \"CACACACACACACACACACACACACACACACACACACACA\";\n\nvoid svabaAssemblerEngine::fillReadTable(const svabaReadPtrVector& reads) {\n  \n  // make the reads tables\n  for (const auto& i : reads) {\n\n    // skip if not for assembly\n    if (!i->to_assemble)\n      continue;\n    \n    // get the sequence and unique ID\n    std::string sr = std::to_string(++count);\n    std::string seq = i->CorrectedSeq();\n    assert(sr.length());\n    assert(seq.length());\n\n    if (hasRepeat(seq) || seq.length() < m_min_overlap)\n      continue;\n\n    // put onto the foward strand if not\n    if (!i->MappedFlag() && !i->MateReverseFlag())\n      SeqLib::rcomplement(seq);\n\n    SeqItem si;\n    si.id = sr;\n    si.seq = seq;\n    m_pRT.addRead(si);\n    \n  }\n}\n\nbool svabaAssemblerEngine::hasRepeat(const std::string& seq) {\n\n  if (seq.length() < 40)\n    return false;\n\n  static const std::vector<std::string> repeatMotifs = {\n    \"N\", POLYT, POLYA, POLYC, POLYG,\n    POLYCG, POLYAT, POLYTC, POLYAG,\n    POLYCA, POLYTG\n  };\n  \n  return std::any_of(repeatMotifs.begin(), repeatMotifs.end(),\n                     [&seq](const std::string& motif) {\n                       return seq.find(motif) != std::string::npos;\n                     });\n  \n}\n\nbool svabaAssemblerEngine::performAssembly(int num_assembly_rounds) \n{\n  if (m_pRT.getCount() < 2)\n    return false;\n\n#ifdef DEBUG_ENGINE\n  std::cout << \"Doing assembly on: \" << m_id << \" with \" << m_pRT.getCount() << \" reads\" << std::endl; \n#endif\n\n  SeqLib::UnalignedSequenceVector contigs0;\n  //ContigVector contigs0;\n\n#ifdef DEBUG_ENGINE\n  std::cout << \"...round 1\" << std::endl;\n#endif    \n  \n  // do the first round (on raw reads)\n  doAssembly(&m_pRT, m_contigs, 0);\n  \n  for (int yy = 1; yy != num_assembly_rounds; yy++) {\n\n    if (m_contigs.size() < 2) \n      continue; // break because too few contigs to assemle\n    \n#ifdef DEBUG_ENGINE\n    std::cout << \"...round \" << (yy+1) << std::endl;\n#endif    \n    \n    // do the second round (on assembled contigs)\n    SeqLib::UnalignedSequenceVector tmpc;\n    for (auto& j : m_contigs)\n      if (j.Seq.length() > m_readlen)\n\ttmpc.push_back(j);\n    \n    ReadTable pRTc0(tmpc);\n    m_contigs.clear();\n    doAssembly(&pRTc0, m_contigs, yy);      \n    \n  }\n  return true;\n}\n\n\n// call the assembler\nvoid svabaAssemblerEngine::doAssembly(ReadTable *pRT,\n\t\t\t\t      SeqLib::UnalignedSequenceVector &contigs,\n\t\t\t\t      int pass) {\n  \n  if (pRT->getCount() == 0)\n    return;\n\n  // clear the hits stream\n  std::stringstream hits_stream, asqg_stream;\n\n  double errorRate = m_error_rate;\n  int min_overlap = m_min_overlap;\n  int cutoff = 0;\n\n  if (pass > 1) {\n    //errorRate = 0.015f; // up to one bp mismatch\n    errorRate = 0;\n    m_error_rate = errorRate;\n    min_overlap = m_min_overlap * 2;\n  }\n\n  bool exact = errorRate < 0.001f;\n\n  // remove duplicates if running in exact mode\n  ReadTable * pRT_nd = exact ? removeDuplicates(pRT) : pRT;\n  \n  // forward\n  SuffixArray* pSAf_nd = new SuffixArray(pRT_nd, 1, false); //1 is num threads. false is silent/no\n  RLBWT *pBWT_nd = new RLBWT(pSAf_nd, pRT_nd);\n\n  // reverse\n  pRT_nd->reverseAll();\n  SuffixArray * pSAr_nd = new SuffixArray(pRT_nd, 1, false);\n  RLBWT *pRBWT_nd = new RLBWT(pSAr_nd, pRT_nd);\n  pRT_nd->reverseAll(); \n\n  pSAf_nd->writeIndex();\n  pSAr_nd->writeIndex(); \n\n  bool bIrreducibleOnly = true; // default\n  int seedLength = 0;\n  int seedStride = 0;\n  if (!exact) \n    calculateSeedParameters(m_readlen, min_overlap, seedLength, seedStride);\n\n  svabaOverlapAlgorithm* pOverlapper = new svabaOverlapAlgorithm(pBWT_nd, pRBWT_nd, \n\t\t\t\t\t\t\t\t errorRate, seedLength,\n\t\t\t\t\t\t\t\t seedStride, bIrreducibleOnly);\n  \n  pOverlapper->setExactModeOverlap(exact);\n  pOverlapper->setExactModeIrreducible(exact);\n\n  svabaASQG::HeaderRecord headerRecord;\n  headerRecord.setOverlapTag(min_overlap);\n  headerRecord.setErrorRateTag(errorRate);\n  headerRecord.setInputFileTag(\"\");\n  headerRecord.setContainmentTag(true); // containments are always present\n  headerRecord.setTransitiveTag(!bIrreducibleOnly);\n  headerRecord.write(asqg_stream);    \n\n  pRT_nd->setZero();\n\n  size_t workid = 0;\n  SeqItem si;\n\n  size_t ocount = 0;\n  while (pRT_nd->getRead(si) && (++ocount < MAX_OVERLAPS_PER_ASSEMBLY)) {\n    \n    SeqRecord read;\n    read.id = si.id;\n    read.seq = si.seq;\n    OverlapBlockList obl;\n    \n    OverlapResult rr = pOverlapper->overlapRead(read, min_overlap, &obl);\n    pOverlapper->writeOverlapBlocks(hits_stream, workid, rr.isSubstring, &obl);\n\n    svabaASQG::VertexRecord record(read.id, read.seq.toString());\n    record.setSubstringTag(rr.isSubstring);\n    record.write(asqg_stream);\n\n    ++workid;\n\n  }\n\n  std::string line;\n  bool bIsSelfCompare = true;\n  ReadInfoTable* pQueryRIT = new ReadInfoTable(pRT_nd);\n\n  while(std::getline(hits_stream, line)) {\n    size_t readIdx;\n    size_t totalEntries;\n    bool isSubstring; \n    OverlapVector ov;\n    OverlapCommon::parseHitsString(line, pQueryRIT, pQueryRIT, pSAf_nd, pSAr_nd, bIsSelfCompare, readIdx, totalEntries, ov, isSubstring);\n\n    for(OverlapVector::iterator iter = ov.begin(); iter != ov.end(); ++iter) {\n       svabaASQG::EdgeRecord edgeRecord(*iter);\n       edgeRecord.write(asqg_stream);\n    }\n\n  }\n  \n  // Get the number of strings in the BWT, this is used to pre-allocated the read table\n  delete pOverlapper;\n  delete pBWT_nd; \n  delete pRBWT_nd;\n  delete pSAf_nd;\n  delete pSAr_nd;\n  if (exact) // only in exact mode did we actually allocate for pRT_nd, otherwise just pRT which we want to keep\n    delete pRT_nd; \n\n  //#ifdef CLOCK_COUNTER\n  //clock_t ctA_before = clock();\n  //#endif\n  \n  // PERFORM THE ASSMEBLY\n  trimLengthThreshold = 100; \n  numTrimRounds = 1;\n  StringGraph * oGraph = assemble(asqg_stream, min_overlap, maxEdges, bExact, \n\t   trimLengthThreshold, bPerformTR, bValidate, numTrimRounds, \n\t   resolveSmallRepeatLen, numBubbleRounds, gap_divergence, \n\t\t\t\t  divergence, maxIndelLength, cutoff, m_id + \"_\", contigs, m_write_asqg);\n\n  // optionally output the graph structure\n  //if (m_write_asqg) //debug\n  //  write_asqg(oGraph, asqg_stream, hits_stream, pass);\n\n  // this was allocated in assemble\n  delete oGraph;\n  delete pQueryRIT;\n\n  // remove exact dups\n  remove_exact_dups(contigs); \n  \n  // print out some results\n#ifdef DEBUG_ENGINE\n  std::cerr << \" PASS \" << pass << std::endl;\n  print_results(contigs);\n#endif\n  \n  return;\n}\n\n// not totally sure this works...\nReadTable* svabaAssemblerEngine::removeDuplicates(ReadTable* pRT) {\n\n  // forward\n  SuffixArray* pSAf = new SuffixArray(pRT, 1, false); //1 is num threads. false is silent/no\n  RLBWT *pBWT= new RLBWT(pSAf, pRT);\n\n  // reverse\n  pRT->reverseAll();\n  SuffixArray * pSAr = new SuffixArray(pRT, 1, false);\n  RLBWT *pRBWT = new RLBWT(pSAr, pRT);\n  pRT->reverseAll();\n  \n  svabaOverlapAlgorithm* pRmDupOverlapper = new svabaOverlapAlgorithm(pBWT, pRBWT, \n\t\t\t\t\t\t\t\t\t  0, 0, \n\t\t\t\t\t\t\t\t\t  0, false);\n  \n  pRT->setZero();\n  ReadTable * pRT_nd = new ReadTable();\n  SeqItem sir;\n  while (pRT->getRead(sir)) {\n    OverlapBlockList OBout;\n    SeqRecord read;\n    read.id = sir.id;\n    read.seq = sir.seq;\n    OverlapBlockList obl;\n    OverlapResult rr = pRmDupOverlapper->alignReadDuplicate(read, &OBout);\n\n    if (!rr.isSubstring)\n      pRT_nd->addRead(sir);\n  }\n\n  delete pRmDupOverlapper;\n  delete pBWT; \n  delete pRBWT;\n  delete pSAf;\n  delete pSAr;\n\n  return pRT_nd;\n}\n\nvoid svabaAssemblerEngine::write_asqg(const StringGraph* oGraph, std::stringstream& asqg_stream, std::stringstream& hits_stream, int pass) const {\n\n  // write ASQG to file for visualization\n  std::ofstream ofile(m_id + \"pass_\" + std::to_string(pass) + \".asqg\", std::ios::out);\n  ofile << asqg_stream.str();\n  ofile.close();\n  \n  // write the hits stream file\n  std::ofstream ofile_hits(m_id + \"pass_\" + std::to_string(pass) + \".hits\", std::ios::out);\n  ofile_hits << hits_stream.str();\n  ofile_hits.close();\n\n  // write the connected components file\n  std::ofstream ofile_cc(m_id + \"pass_\" + std::to_string(pass) + \".cc\", std::ios::out);\n  for (auto& i : oGraph->m_connected_components)\n    ofile_cc << i.first << \"\\t\" << i.second << std::endl;\n  ofile_cc.close();\n  \n  // write the labels\n  std::ofstream ofile_lb(m_id + \"pass_\" + std::to_string(pass) + \".lb\", std::ios::out);\n  for (auto& i : oGraph->m_reads_on_contigs)\n    for (auto& r : i.second)\n      ofile_lb << i.first << \"\\t\" << r << std::endl;\n  ofile_lb.close();\n\n}\n\nvoid svabaAssemblerEngine::remove_exact_dups(SeqLib::UnalignedSequenceVector& cc) const {\n\n  std::set<std::string> ContigDeDup;\n  SeqLib::UnalignedSequenceVector cvec;\n  for (auto& i : cc) {\n    if (!ContigDeDup.count(i.Seq)) {\n      ContigDeDup.insert(i.Seq);\n      cvec.push_back(i);\n    } else {\n      //std::cerr << \"Filtered out a contig for having exact duplicate with another contig\" << std::endl;\n    }\n  }\n  cc = cvec;\n}\n\nvoid svabaAssemblerEngine::print_results(const SeqLib::UnalignedSequenceVector& cc) const {\n\n  if (cc.size() >= 1) {\n    std::cout << \"Contig Count: \" << cc.size() << \" at \" << m_id << std::endl;\n    for (auto& i : cc) \n    \tstd::cout << \"   \" << i.Name << \" \" << i.Seq.length() << \" \" << i.Seq << std::endl;\n  }\n\n}\n\n// lifted from OverlapAlgorithm\nvoid svabaAssemblerEngine::calculateSeedParameters(int read_len, int minOverlap, int& seed_length, int& seed_stride) const {\n\n    seed_length = 0;\n    \n    // The maximum possible number of differences occurs for a fully-aligned read\n    int max_diff_high = static_cast<int>(m_error_rate * read_len);\n\n    // Calculate the seed length to use\n    // If the error rate is so low that no differences are possible just seed\n    // over the entire minOverlap region\n    if(max_diff_high > 0)\n    {\n        // Calculate the maximum number of differences between two sequences that overlap\n        // by minOverlap\n        int max_diff_low = static_cast<int>(m_error_rate * minOverlap);\n\n         if(max_diff_low == 0)\n            max_diff_low = 1;\n         \n         int seed_region_length = static_cast<int>(ceil(max_diff_low / m_error_rate));\n         int num_seeds_low = max_diff_low + 1;\n         seed_length = static_cast<int>(seed_region_length / num_seeds_low);\n         if(seed_length > static_cast<int>(minOverlap))\n            seed_length = minOverlap;\n    }\n    else\n    {\n        seed_length = minOverlap;\n    }\n    seed_stride = seed_length;    \n\n}\n"
  },
  {
    "path": "src/svaba/SvabaAssemblerEngine.h",
    "content": "#ifndef SVABA_ASSEMBLER_ENGINE_H__\n#define SVABA_ASSEMBLER_ENGINE_H__\n\n#include \"Util.h\"\n//#include \"contigs.h\"\n#include \"SGUtil.h\"\n#include \"ReadTable.h\"\n#include \"SeqLib/BamRecord.h\"\n#include \"SeqLib/UnalignedSequence.h\"\n#include \"SvabaRead.h\"\n\nclass svabaAssemblerEngine\n{\n public:\n\n  svabaAssemblerEngine() {}\n  \n  svabaAssemblerEngine(const std::string& id, double er, size_t mo, size_t rl) : m_id(id), m_error_rate(er), m_min_overlap(mo), m_readlen(rl) {}\n  \n  bool hasRepeat(const std::string& seq);\n  \n  void fillReadTable(const svabaReadPtrVector& reads);\n  \n  //void fillReadTable(const std::vector<std::string>& r);\n  \n  bool performAssembly(int num_assembly_rounds);\n  \n  //void doAssembly(ReadTable *pRT, ContigVector &contigs, int pass);\n  void doAssembly(ReadTable *pRT, SeqLib::UnalignedSequenceVector &contigs, int pass);\n  \n  void setToWriteASQG() { m_write_asqg = true; }\n  \n  SeqLib::UnalignedSequenceVector getContigs() const { return m_contigs; }\n  //ContigVector getContigs() const { return m_contigs; }\n  \n  void clearContigs() { m_contigs.clear(); }\n\n  ReadTable* removeDuplicates(ReadTable* pRT);\n\n  void calculateSeedParameters(int read_len, const int minOverlap, int& seed_length, int& seed_stride) const;\n\n private:\n\n  void print_results(const SeqLib::UnalignedSequenceVector& cc) const;\n\n  // void remove_exact_dups(ContigVector& cc) const;\n  void remove_exact_dups(SeqLib::UnalignedSequenceVector& cc) const;\n\n  void write_asqg(const StringGraph * oGraph, std::stringstream& asqg_stream, std::stringstream& hits_stream, int pass) const;\n  \n  std::string m_id;\n  double m_error_rate;\n  size_t m_min_overlap;\n  size_t m_readlen;\n\n  size_t count = 0; // num sequencecs added\n  \n  size_t numBubbleRounds = 3;\n  float divergence = 0.00; //0.05\n  float gap_divergence = 0.00;\n  int maxEdges = 128;\n  int numTrimRounds = 0; //\n  int trimLengthThreshold = -1; // doesn't matter\n  bool bPerformTR = false; // transitivie edge reducetion\n  bool bValidate = false;\n  int resolveSmallRepeatLen = -1; \n  int maxIndelLength = 100;\n  bool bExact = true;\n  std::string outVariantsFile = \"\"; // dummy\n  \n  bool m_write_asqg = false;\n  \n  ReadTable m_pRT;\n  \n  //ContigVector m_contigs;\n  SeqLib::UnalignedSequenceVector m_contigs;\n\n};\n\n#endif\n"
  },
  {
    "path": "src/svaba/SvabaBamWalker.cpp",
    "content": "#include \"SvabaBamWalker.h\"\n#include \"SvabaRead.h\"\n#include \"SvabaSharedConfig.h\"\n#include \"SvabaOptions.h\"\n#include \"SvabaLogger.h\"\n#include \"SvabaThreadUnit.h\"\n#include \"SvabaDebug.h\"\n#include <string_view>\n\n#define QNAME \"LH00306:129:227V5CLT4:6:1268:41599:27601\"\n#define QFLAG 147\n\nusing SeqLib::AddCommas;\nusing SeqLib::UnalignedSequenceVector;\nusing SeqLib::UnalignedSequence;\n\ninline void debug_read(std::string_view msg,\n                       const svabaReadPtr read,\n                       std::string_view qname_filter = {},\n                       int qflag_filter = -1) {\n\n    if (!read) return;\n    if (!qname_filter.empty() && read->Qname() != qname_filter) return;\n    if (qflag_filter != -1 && read->AlignmentFlag() != qflag_filter) return;\n\n    std::cerr << \"DEBUG: \" << msg << \" read \" << read << '\\n';\n}\n\nstatic const std::string ILLUMINA_PE_PRIMER_2p0 = \"CAAGCAGAAGACGGCAT\";\n\n// Detect adapter read-through: the fragment is shorter than the read\n// length, so the tail of the read sequences into the adapter.  Returns\n// true if the read looks like adapter contamination and should be\n// skipped.  Reads with indels or unmapped mates are exempted — those\n// might genuinely support an SV even if the geometry looks adapter-ish.\nstatic bool hasAdapter(const svabaRead& r) {\n\n  // keep reads with indels or unmapped mate — could be real SV signal\n  if (r.MaxDeletionBases() || r.MaxInsertionBases() || !r.InsertSize())\n    return false;\n\n  // toss if insert size ≈ read length (completely overlapping pair)\n  if (std::abs(r.FullInsertSize() - r.Length()) < 5)\n    return true;\n\n  // from here, only consider reads that have soft-clips\n  if (!r.NumClip())\n    return false;\n\n  // toss if insert size explains the clip length (adapter read-through)\n  int exp_ins_size = r.Length() - r.NumClip();\n  if (std::abs(exp_ins_size - std::abs(r.InsertSize())) <= 6)\n    return true;\n\n  // toss if literal Illumina adapter sequence is present\n  if (r.Sequence().find(ILLUMINA_PE_PRIMER_2p0) != std::string::npos)\n    return true;\n\n  return false;\n}\n//static const std::string REV_ADAPTER = \"GCTCTTCCGATCT\";\n\nsvabaBamWalker::svabaBamWalker(SvabaSharedConfig& sc_) : sc(sc_) {}\n\nvoid svabaBamWalker::addCigar(const svabaReadPtr& r) {\n  \n  if (r->CigarSize() == 1)\n    return;\n\n  // NB: the -1 is NOT a 0- vs 1-based thing.\n  // It's that VCF (and BP) store location of an indel as the base PRIOR to the event.\n  // but accumulating positions here has \"pos\" starting at the first base of the next\n  // position - which would be the first base of the indel, so we minus 1 to keep\n  // convention c/w BPs file. It's all 0-based as usual\n  int pos = r->Position() - 1;  // position ON REFERENCE\n\n  for (const auto& i : r->GetCigar()) {\n    if (i.Type() == 'D' || i.Type() == 'I') {\n      std::string key = std::to_string(r->ChrID()) + \"_\" +\n\tstd::to_string(pos) + \"_\" +\n\tstd::to_string(i.Length()) + i.Type();\n      ++cigmap[key];\n      // //debug\n      // if (pos > 79347219 & pos < 79347403)\n      // \tstd::cerr << r->Qname() << \" pos \" << r->Position() << \" pos \" << pos <<\n      // \t  \" \" << i.Length() << i.Type() << std::endl;\n    }\n    \n    // advance along the reference for alignment types that consume reference\n    if (i.Type() != 'I' && i.Type() != 'S' && i.Type() != 'H')\n      pos += i.Length();\n  }\n}\n\n/*bool svabaBamWalker::isDuplicate(const SeqLib::BamRecord &r) {\n  \n  // deduplicate by query-bases / position\n  std::string key = r.Sequence() + std::to_string(r.Position()) + \"_\" + std::to_string(r.MatePosition()); \n  \n  // its not already add, insert\n  if (!seq_set.count(key)) {\n    seq_set.insert(key);\n    return false;\n  }\n  \n  return true;\n  }*/\n\nSeqLib::GRC svabaBamWalker::readBam(svabaThreadUnit& unit) {\n\n  // keep track of regions where we hit the weird-read limit\n  SeqLib::GRC bad_regions;\n  \n  // buffer to store reads from a region\n  // if we don't hit the limit, then add them to be assembled\n  svabaReadPtrVector read_buffer;\n  UnalignedSequenceVector train_buffer;\n  train_reads.clear();  // member — cleared per readBam call\n  \n  // if we have a LOT of reads (aka whole genome run), keep track for printing\n  size_t countr = 0;\n  size_t seen = 0;\n  \n  // keep track of which region we are in \n  int current_region = this->region_idx_;\n\n  // should just skip regions that have excessive coverage\n  // cov = readlength + reads / region_width. So 150 * X / 25000 = 10000 to set max coverage to 10000\n  // so 25'000 * 10'000 / 150 = 1'666'667 for max cov 10'000\n  const size_t max_coverage_before_ignore_region = 10'000;\n  size_t seen_cutoff = regions_.at(current_region).Width() * max_coverage_before_ignore_region / std::max(1, sc.readlen);\n  sc.logger.log(sc.opts.verbose > 4, false, \"...seen cutoff \", SeqLib::AddCommas(seen_cutoff),\n\t\t\" region width \", regions_.at(current_region), \" read len \", sc.readlen);\n  \n  // loop the reads\n  while ( auto bamrec = this->Next()) {\n    \n    // makes a deep copy. So when bamrec goes out at end of this iteration, s is still safe\n    svabaReadPtr s = std::make_shared<svabaRead>(*bamrec, prefix_);\n\n    ++seen;\n    if (seen % 100'000 == 0)\n      sc.logger.log(sc.opts.verbose > 3, false, \"...bamwlker reading read \",\n\t\t    s->Brief(), \" - \",\n\t\t    SeqLib::AddCommas(seen));\n    \n    // when we move regions, clear the buffer\n    if (this->region_idx_ != current_region) {\n\n      seen = 0;\n      sc.logger.log(sc.opts.verbose > 3, false, \"...svabaBamWalker switched region from \",\n\t\t    regions_.at(current_region), \" to \", regions_.at(region_idx_));\n      \n      current_region = region_idx_;\n      \n      // recalculate seen limit for this region\n      if (current_region < regions_.size()) {\n\tseen_cutoff = regions_.at(current_region).Width() * max_coverage_before_ignore_region / std::max(1, sc.readlen);\n\tsc.logger.log(sc.opts.verbose > 4, false, \"...seen cutoff \", SeqLib::AddCommas(seen_cutoff));\t\n      } else { // shouldn't really get here\n\tseen_cutoff = 0;\n      }\n      \n      // cache the reads from the last region into BamWalker cache\n      reads.insert(reads.end(), read_buffer.begin(), read_buffer.end());\n      read_buffer.clear();\n    }\n\n    // if hit the limit of reads, log it and try next region\n    if ( (read_buffer.size() > m_limit && m_limit > 0) ||\n\t seen > seen_cutoff) { \n      \n      // don't train on these\n      train_buffer.clear();\n\n      // clear the buffer for this region\n      seen = 0;\n      \n      std::string regstr =\n\t(regions_.size() ? regions_[region_idx_].ToString(this->Header()) : \" whole BAM\");\n      sc.logger.log(sc.opts.verbose > 1,\n\t\t    sc.opts.verbose_log,\n\t\t    \"\\tstopping read lookup at \",\n\t\t    s->Brief(), \" in window \", regstr, \n\t\t    \"with \", AddCommas(read_buffer.size()),\n\t\t    \" weird reads. Limit: \",\n\t\t    AddCommas(m_limit));\n      \n      // add this region to the bad regions list\n      if (regions_.size())\n\tbad_regions.add(regions_[region_idx_]);\n      \n      // clear these reads out, not a good region\n      read_buffer.clear();\n      \n      // force it to try the next region, or return if none left\n      ++region_idx_; // increment to next region\n      if (region_idx_ >= regions_.size()) {/// no more regions left and last one was bad\n\treturn bad_regions; // totally done\n      } \n    }\n\n    SVABA_READ_TRACE(s->Qname(),\n      \"SEEN flag=\" << s->AlignmentFlag()\n      << \" mapq=\" << s->MapQuality()\n      << \" pos=\" << s->ChrName(sc.header) << \":\" << s->Position()\n      << \" isize=\" << s->InsertSize()\n      << \" cigar=\" << s->CigarString()\n      << \" len=\" << s->Length());\n\n    // check if this read passes the rules for potential SV reads\n    if (s->DuplicateFlag() ||\n\ts->QCFailFlag() ||\n\ts->NumHardClip() ||\n\tsc.blacklist.CountOverlaps(s->AsGenomicRegionMate()) ||\n\tsc.blacklist.CountOverlaps(s->AsGenomicRegion()))\n      {\n\tSVABA_READ_TRACE(s->Qname(),\n\t  \"SKIP dup=\" << s->DuplicateFlag()\n\t  << \" qcfail=\" << s->QCFailFlag()\n\t  << \" hardclip=\" << s->NumHardClip()\n\t  << \" blacklist_mate=\" << sc.blacklist.CountOverlaps(s->AsGenomicRegionMate())\n\t  << \" blacklist_self=\" << sc.blacklist.CountOverlaps(s->AsGenomicRegion()));\n\tcontinue;\n      }\n\n    // quality score trim read\n    s->QualityTrimRead(); // copies sequence into svabaRead.seq_corrected\n\n    SVABA_READ_TRACE(s->Qname(),\n      \"AFTER_TRIM corrected_len=\" << s->CorrectedSeqLength());\n\n    // this is the main rule check (clips, orientation, unmapped mate, etc.)\n    bool rule_pass = sc.mr.isValid(*s);\n\n    // FR reads with large isize: per-RG discordant cutoff check.\n    // This replaces the old ReadFilterCollection FR isize rule and uses\n    // the same cutoff as TagDiscordant, so the two are always consistent.\n    if (!rule_pass &&\n        s->PairMappedFlag() &&\n        s->PairOrientation() == SeqLib::Orientation::FR) {\n      std::string rg;\n      if (!s->GetZTag(\"RG\", rg)) rg = \"NA\";\n      int cutoff = getIsizeCutoff(rg);\n      if (std::abs(s->FullInsertSize()) >= cutoff)\n        rule_pass = true;\n    }\n\n    SVABA_READ_TRACE(s->Qname(),\n      \"RULE_CHECK rule_pass=\" << rule_pass);\n\n    // special case to also check against high mismatch\n    // --no-nm disables this path entirely for maximum efficiency\n    if (!rule_pass && !sc.opts.noNmSalvage) {\n      int32_t nm_tag = 0;\n      s->GetIntTag(\"NM\", nm_tag);\n      float nm_frac = static_cast<float>(nm_tag) / static_cast<float>(s->Length());\n      bool is_adapter = hasAdapter(*s);\n      SVABA_READ_TRACE(s->Qname(),\n        \"NM_SALVAGE nm=\" << nm_tag\n        << \" nm_frac=\" << nm_frac\n        << \" adapter=\" << is_adapter\n        << \" pass=\" << (nm_frac > 0.02 && !is_adapter));\n      if (nm_frac > 0.02 && !is_adapter) {\n\ts->to_assemble = false;\n\tread_buffer.push_back(s);\n\tSVABA_READ_TRACE(s->Qname(), \"ADDED via NM salvage (to_assemble=false)\");\n      }\n    }\n\n    // if its less than 40, dont even mess with it\n    if (s->CorrectedSeqLength() < 40) {\n      SVABA_READ_TRACE_IF(rule_pass, s->Qname(),\n        \"REJECT corrected_len=\" << s->CorrectedSeqLength() << \" < 40\");\n      rule_pass = false;\n    }\n\n    // special rule to filter \"RF\" \"discordants\" that are just overlaps\n    if (s->PairOrientation() == SeqLib::Orientation::RF &&\n\tstd::abs(s->InsertSize()) < std::max(200, sc.readlen * 2)) {\n      SVABA_READ_TRACE_IF(rule_pass, s->Qname(),\n        \"REJECT RF overlap isize=\" << s->InsertSize()\n        << \" threshold=\" << std::max(200, sc.readlen * 2));\n      rule_pass = false;\n    }\n\n    // for mate regions, be more strict\n    if (!get_mate_regions && s->MapQuality() == 0) {\n      SVABA_READ_TRACE_IF(rule_pass, s->Qname(),\n        \"REJECT mapq=0 in non-mate region\");\n      rule_pass = false;\n    }\n\n    // add to all reads pile for kmer correction\n    if (get_coverage) {\n      cov.addRead(*s, 0);\n    }\n\n    // add to weird coverage\n    if (rule_pass && get_coverage)\n      weird_cov.addRead(*s, 0);\n\n    // add to the cigar map for all non-duplicate reads\n    if (get_mate_regions) // only add cigar for non-mate regions\n      addCigar(s);\n\n    // add all the reads for kmer correction\n    // TODO this will add reads to training even if this entire buffer is rejected, so need to make a training buffer as well before adding them\n    if (!sc.opts.ecCorrectType.empty() && sc.opts.ecCorrectType != \"0\") {\n\n      // if its not a weird read, include for training purposes\n      // but can subsample for speed\n      if (!rule_pass) {\n\tuint32_t hashed  = __ac_Wang_hash(__ac_X31_hash_string(s->Qname().c_str()));\n\tif ((double)(hashed&0xffffff) / 0x1000000 <= kmer_subsample)\n\t  train_buffer.push_back(UnalignedSequence(s->UniqueName(),\n\t\t\t\t\t\t\t   s->CorrectedSeq()));\n      }\n    }\n\n    // if not a weird read, move on\n    if (!rule_pass) {\n      SVABA_READ_TRACE(s->Qname(), \"SKIP not weird (rule_pass=false after all gates)\");\n      continue;\n    }\n\n    // skip adapter read-through (fragment shorter than read length)\n    // unless the read has an indel that could indicate real SV signal\n    if (hasAdapter(*s)) {\n      SVABA_READ_TRACE(s->Qname(),\n        \"SKIP adapter isize=\" << s->InsertSize()\n        << \" len=\" << s->Length()\n        << \" nclip=\" << s->NumClip());\n      continue;\n    }\n\n    // label as discordant or not\n    // modifies r in place\n    TagDiscordant(s);\n\n    // message logging\n    ++countr;\n    if (countr % 25000 == 0) {\n      sc.logger.log(sc.opts.verbose > 1, false,\n\t\t    \"...read in \", AddCommas<size_t>(countr),\n\t\t    \" weird reads for whole genome read-in. At pos \",\n\t\t    s->Brief());\n    }\n\n    // adding first to a temp buffer, in case hit limit and then\n    // just don't add any reads\n    read_buffer.push_back(s);\n    SVABA_READ_TRACE(s->Qname(),\n      \"ADDED as weird read (to_assemble=true) buffer_size=\" << read_buffer.size());\n  } // end the read loop\n  \n    // \"reads\" is total cache for this walker.\n\n    // \"read_buffer\" was temporary cache in readBam for last region\n  /*reads.insert(reads.end(),\n    std::make_move_iterator(read_buffer.begin()),\n    std::make_move_iterator(read_buffer.end()));\n    read_buffer.clear();  */ // shouldn't need to, but avoid \"lingering state\"\n  reads.insert(reads.end(), read_buffer.begin(), read_buffer.end());\n  read_buffer.clear();\n  // stash training reads as member for the pooled BFC in SvabaRegionProcessor\n  train_reads.insert(train_reads.end(), train_buffer.begin(), train_buffer.end());\n  train_buffer.clear();\n  \n  // subsamples reads if too high of coverage\n  //  if (get_coverage)\n  //  subSampleToWeirdCoverage(max_cov);\n\n  // calculate the mate region\n  if (get_mate_regions && \n      regions_.size() /* don't get mate regions if reading whole bam */) \n    calculateMateRegions();\n\n  return bad_regions;\n  \n}\n\nvoid svabaBamWalker::AddBackReadsToCorrect() {\n  for (const auto& r : reads) {\n    if (!r->to_assemble) continue;   // same filter as Train() side\n    bfc.AddSequence(r->CorrectedSeq(), \"\", r->UniqueName());\n  }\n}\n\nvoid svabaBamWalker::ClearTraining() {\n  bfc.ClearReads();\n}\n\nvoid svabaBamWalker::Train() {\n  bfc.Train();\n}\n\nvoid svabaBamWalker::ErrorCorrect() {\n  bfc.ErrorCorrect();\n}\n\n\nvoid svabaBamWalker::subSampleToWeirdCoverage(double max_coverage) {\n  auto keep = [&](const std::shared_ptr<svabaRead>& r) {\n    double cov1 = weird_cov.getCoverageAtPosition(r->ChrID(), r->Position());\n    double cov2 = weird_cov.getCoverageAtPosition(r->ChrID(), r->PositionEnd());\n    double this_cov = std::max(cov1, cov2);\n    \n    if (this_cov <= max_coverage)\n      return true;\n    \n    double sample_rate = 1 - (this_cov - max_coverage) / this_cov;\n    uint32_t k = __ac_Wang_hash(__ac_X31_hash_string(r->Qname().c_str()) ^ m_seed);\n    return ((double)(k & 0xffffff) / 0x1000000) <= sample_rate;\n  };\n  \n  reads.erase(std::remove_if(reads.begin(), reads.end(),\n                             [&](const std::shared_ptr<svabaRead>& r) { return !keep(r); }),\n              reads.end());\n}\n\nvoid svabaBamWalker::calculateMateRegions() {\n\n  assert(regions_.size());\n\n  SeqLib::GenomicRegion main_region = regions_.at(0);\n\n  // hold candidate regions. Later trim based on count\n  MateRegionVector tmp_mate_regions;\n\n  // loop the reads and add mate reads to MateRegionVector\n  for (const auto& r : reads) {\n    \n    int dd = r->GetDD(); \n    \n    // throw away reads that have too many different discordant mappings\n    // or are otherwise bad (dd < 0).\n    //\n    // maxMateChrID gate: skip mates on decoy/alt/mito chroms in\n    // human (default 23 = through chrY). Set to -1 via --non-human\n    // or --max-mate-chr to allow all chromosomes.\n    //\n    // minMateMAPQ gate: skip reads below this MAPQ (default -1 = no\n    // gate). Set via --min-mate-mapq to e.g. 1 to exclude MAPQ=0\n    // multi-mappers from triggering mate lookups.\n    const int maxChr = sc.opts.maxMateChrID;\n    const int minMQ  = sc.opts.minMateMAPQ;\n    if (!r->PairedFlag() ||\n\t(maxChr >= 0 && r->MateChrID() > maxChr) ||\n\t(minMQ  >= 0 && r->MapQuality() < minMQ) ||\n\t(maxChr >= 0 && r->ChrID() > maxChr) ||\n\t!r->MappedFlag() ||\n\t!r->MateMappedFlag() ||\n\tdd < 0 ||\n\tdd > MAX_SECONDARY_HIT_DISC)\n      continue;\n\n    // get the mate region position, will check next if different\n    // from current main region\n    MateRegion mate(r->MateChrID(), r->MatePosition(), r->MatePosition());\n    mate.Pad(MATE_REGION_PAD);\n    mate.partner = main_region;\n\n    // if mate not in main interval, add a padded version\n    if (!main_region.GetOverlap(mate) &&\n\t!local_blacklist.CountOverlaps(mate) &&\n\t!sc.blacklist.CountOverlaps(mate)) {\n      tmp_mate_regions.add(mate);\n    }\n\n  }\n\n  // merge it down to get the mate regions\n  tmp_mate_regions.MergeOverlappingIntervals();\n\n  // get the counts by overlapping mate-reads with the newly defined\n  // mate regions. Same MAPQ gate as above so the count is consistent\n  // with the candidate set.\n  const int minMQ_count = sc.opts.minMateMAPQ;\n  for (const auto& r : reads) {\n\n    SeqLib::GenomicRegion mate(r->MateChrID(), r->MatePosition(), r->MatePosition());\n\n    // if mate not in main interval, check which mate regions it's in\n    if (!main_region.GetOverlap(mate) &&\n        (minMQ_count < 0 || r->MapQuality() >= minMQ_count)) {\n\n      for (auto& k : tmp_mate_regions)\n\tif (k.GetOverlap(mate)) {\n\t  ++k.count;\n\t  continue;\n\t}\n    }\n  }\n\n#ifdef DEBUG_SVABA_BAMWALKER\n  std::cerr << \"SBW: Mate regions are\" << std::endl;\n  for (auto& i : tmp_mate_regions)\n    std::cerr << \"    \" << i << \" count \" << i.count << std::endl;\n#endif\n\n  // keep only ones with enough supporting reads\n  const int minCount = sc.opts.mateRegionMinCount;\n  for (auto& i : tmp_mate_regions) {\n    if (i.count >= minCount)\n      mate_regions.add(i);\n  }\n  \n#ifdef DEBUG_SVABA_BAMWALKER\n  std::cerr << \"SBW: Final mate regions are:\" << std::endl;\n  for (auto& i : mate_regions) \n    std::cerr << \"    \" << i << \" read count \" << i.count << std::endl;\n#endif\n  \n  // hard cutoff on mate regions TODO make more elegant\n  if (mate_regions.size() > 6) {\n    sc.logger.log(sc.opts.verbose > 2, true, \"...cutting off mate lookups for region \",\n\t\t  regions_.at(0), \" with too many mate regions of: \", mate_regions.size());\n    mate_regions.clear();\n  }\n}\n\n// bool svabaBamWalker::hasAdapter(const SeqLib::BamRecord& r) const {\n\n//   // keep it if it has indel or unmapped read\n//   if (r.MaxDeletionBases() || r.MaxInsertionBases() || !r.InsertSize()) // || !r.NumClip())\n//     return false;\n  \n//   // toss if isize is basically read length (completely overlaping)\n//   if (std::abs(r.FullInsertSize() - r.Length()) < 5)\n//     return true;\n\n//   // now only consider reads where clip can be explained by isize\n//   if (!r.NumClip())\n//     return false;\n\n//   // toss it then if isize explans clip\n//   int exp_ins_size = r.Length() - r.NumClip(); // expected isize if has adapter\n//   if ((exp_ins_size - 6) < std::abs(r.InsertSize()) && (exp_ins_size + 6) > std::abs(r.InsertSize()))\n//     return true;\n\n//   std::string seq = r.Sequence();\n//   if (seq.find(ILLUMINA_PE_PRIMER_2p0) != std::string::npos)\n//     return true;\n\n//   return false;\n\n// }\n\nvoid svabaBamWalker::RealignDiscordants(svabaThreadUnit& unit) {\n\n   size_t realigned_count = 0;\n   size_t realign_attempted = 0;\n   std::unordered_set<std::string> bad_discordant;   \n   for (auto& r : reads) {\n     \n     if (!discordantRealigner.ShouldRealign(r))\n       continue;\n\n     ++realign_attempted;\n     if (realign_attempted % 10000 == 0)\n       sc.logger.log(sc.opts.verbose > 3, false, \"Realigning read \",\n\t\t     r->Brief(), \" - \", SeqLib::AddCommas(realign_attempted), \" - \",\n\t\t     realigned_count);\n     \n     // modifies the read in place\n     if(discordantRealigner.RealignRead(r, unit.bwa_aligner)) {\n       ++realigned_count;\n       bad_discordant.insert(r->Qname());\n     }\n   }\n   \n   // loop through and set DD < 0 for all read-pairs that have a bad discordant\n   for (auto& r : reads)\n     if (r->GetDD() >= 0 && bad_discordant.count(r->Qname()))\n       r->SetDD(DiscordantRealigner::MATE_BAD_DISC);\n   \n}\n\nint svabaBamWalker::getIsizeCutoff(const std::string& RG) {\n\n  auto cc = isize_cutoff_per_rg.find(RG);\n  if (cc != isize_cutoff_per_rg.end())\n    return cc->second;\n\n  // not cached yet — look up from learned params\n  const auto it = sc.bamStats.find(this->prefix_);\n\n  if (it == sc.bamStats.end()) {\n    if (!sc.warned.count(this->prefix_)) {\n      sc.logger.log(true, true, \"SBW: Can't find LearnBamParams for \", this->prefix_);\n      sc.warned.insert(this->prefix_);\n    }\n    isize_cutoff_per_rg[RG] = DEFAULT_ISIZE_THRESHOLD;\n    return DEFAULT_ISIZE_THRESHOLD;\n  }\n\n  const auto rgg = it->second.bam_read_groups.find(RG);\n  if (rgg == it->second.bam_read_groups.end()) {\n    if (!sc.warned.count(RG))\n      sc.warned.insert(RG);\n    isize_cutoff_per_rg[RG] = DEFAULT_ISIZE_THRESHOLD;\n    return DEFAULT_ISIZE_THRESHOLD;\n  }\n\n  bool is_normal = (!prefix_.empty() && prefix_[0] == 'n');\n  double sd_mult = is_normal ? sc.opts.sdDiscCutoffNormal : sc.opts.sdDiscCutoff;\n  int cutoff = static_cast<int>(\n    rgg->second.isize_median + rgg->second.sd_isize * sd_mult);\n  isize_cutoff_per_rg[RG] = cutoff;\n  return cutoff;\n}\n\nvoid svabaBamWalker::TagDiscordant(svabaReadPtr& r) {\n\n  std::string RG;\n  if (!r->GetZTag(\"RG\", RG))\n    RG = \"NA\";\n\n  int cutoff = getIsizeCutoff(RG);\n\n  // accept as discordant if not FR, has large enough isize, or is inter-chromosomal\n  bool weird_orientation = r->PairOrientation() != SeqLib::Orientation::FR;\n  if ( weird_orientation ||\n       abs(r->FullInsertSize()) >= cutoff ||\n       r->Interchromosomal()\n       )\n    r->dd = 1; // set as discordant\n\n  // not discordant if read or mate in blacklist\n  if (sc.blacklist.CountOverlaps(r->AsGenomicRegion()) ||\n      sc.blacklist.CountOverlaps(r->AsGenomicRegionMate()) ||\n      local_blacklist.CountOverlaps(r->AsGenomicRegion()) ||\n      local_blacklist.CountOverlaps(r->AsGenomicRegionMate()))\n    r->dd = 0; \n  \n  //debug\n  // if (r->Qname() == \"LH00306:129:227V5CLT4:6:2114:6074:25724\") {\n  //   std::cerr << \" TAG \" << r->dd << \" -- \" << *r << \" weird orientation \" <<\n  //     weird_orientation << \" cutoff \" << cc->second << \" INS \" <<\n  //     abs(r->FullInsertSize()) << std::endl;\n  // }\n      \n  return;\n}\n \n"
  },
  {
    "path": "src/svaba/SvabaBamWalker.h",
    "content": "#pragma once\n\n#include <vector>\n#include <sstream>\n#include <unordered_map>\n#include <unordered_set>\n//#include \"malloc.h\" //debug\n\n#include \"SeqLib/BamReader.h\"\n#include \"SeqLib/ReadFilter.h\"\n#include \"STCoverage.h\"\n#include \"SeqLib/BWAAligner.h\"\n#include \"DiscordantRealigner.h\"\n\n#include \"SeqLib/BFC.h\"\n\nclass svabaThreadUnit;\nclass SvabaSharedConfig;\n\n// storage container for mate lookup-regions\nclass MateRegion: public SeqLib::GenomicRegion\n{\n public:\n  MateRegion() {}\n  MateRegion (int32_t c, uint32_t p1, uint32_t p2, char s = '*') : SeqLib::GenomicRegion(c, p1, p2, s) {}\n  size_t count = 0;// read count\n  SeqLib::GenomicRegion partner;\n\n};\n\ntypedef SeqLib::GenomicRegionCollection<MateRegion> MateRegionVector;\n\nclass svabaBamWalker: public SeqLib::BamReader {\n  \n public:\n  \n  svabaBamWalker(SvabaSharedConfig& sc_);\n\n  // read in the reads\n  SeqLib::GRC readBam(svabaThreadUnit& unit); \n\n  // clear it out\n  void clear() { \n    cov.clear();\n    weird_cov.clear();\n    \n    bfc.ClearReads();\n    cigmap.clear();\n    \n    mate_regions.clear();\n    reads.clear();\n    \n    get_coverage = true;\n    get_mate_regions = true;\n    \n    local_blacklist.clear();\n    train_reads.clear();\n\n    //malloc_trim(0);//debug\n  }\n\n  void AddBackReadsToCorrect();\n  \n  //\n  void Train();\n\n  void ErrorCorrect();\n\n  void ClearTraining();\n  \n  // set the id for this bam e.g. t001\n  void SetPrefix(std::string_view pref) { prefix_ = pref; }\n  \n  void RealignDiscordants(svabaThreadUnit& unit);\n  \n  ///bool hasAdapter(const SeqLib::BamRecord& r) const;\n  \n  void addCigar(const svabaReadPtr& r);\n  \n  //bool isDuplicate(const SeqLib::BamRecord &r);\n  \n  void subSampleToWeirdCoverage(double max_coverage);\n  \n  void calculateMateRegions();\n\n  void TagDiscordant(svabaReadPtr& r);\n\n  /// Return the per-RG isize discordant cutoff, lazily cached.\n  int getIsizeCutoff(const std::string& RG);\n\n  // should we store the mate regions?\n  bool get_mate_regions = true;\n\n  // place to store reads when we get them\n  svabaReadPtrVector reads; //c\n\n  // cov is the all-read coverage tracker\n  // weird-cov just tracks coverage of accepted (clip, disc, etc reads)\n  // buffered cov is coverage minus first 8 and last 8 bp. Why?\n  //    because when looking for variant-supporting reads, we require\n  //    alignment of a read to the variant to overlap it by 8 bp\n  //    to reduce false-positive alt reads. So we use the buffered\n  //    coverage to compare against this buffered alt cov.\n  STCoverage cov, weird_cov; //c\n\n  // hash of cigars for indels\n  SeqLib::CigarMap cigmap; //c\n\n  // mate regions to lookup\n  MateRegionVector mate_regions; //c\n\n  // object for realigning discordant reads\n  DiscordantRealigner discordantRealigner; //c\n  \n  // maximum coverage of accepted reads, before subsampling\n  size_t max_cov = 100;\n\n  // should we keep reads for learning correction \n  double kmer_subsample = 0.5;\n  \n  // should we subsample the learning reads?\n  bool do_kmer_filtering = true;\n\n  // should we get the read coverage\n  bool get_coverage = true;\n\n  // set a hard limit on how many reads to accept\n  size_t m_limit = 0;\n\n  // an extra learned region-specific blacklist\n  SeqLib::GRC local_blacklist;\n  \n  SeqLib::BFC bfc;\n\n  // subsampled non-weird reads kept for BFC training. Populated during\n  // readBam, consumed by the pooled BFC in SvabaRegionProcessor.\n  SeqLib::UnalignedSequenceVector train_reads;\n\n private:\n\n  // for setting the SR tag\n  std::string prefix_; // eg. tumor, normal\n\n  // might want these in case we are looking for duplicates\n  //std::unordered_set<std::string> seq_set; //c\n\n  // seed for the kmer-learning subsampling\n  uint32_t m_seed = 1337;\n\n  // for logging to console, options etc\n  SvabaSharedConfig& sc;\n\n  // cache RG cutoffs so don't have to recalculate\n  std::unordered_map<std::string, int> isize_cutoff_per_rg;\n  \n  \n};\n"
  },
  {
    "path": "src/svaba/SvabaDebug.h",
    "content": "// SvabaDebug.h — compile-time contig and read tracing.\n//\n// Contig tracing:\n//   cmake .. -DSVABA_TRACE_CONTIG='\"c_fermi_chr2_215869501_215894501_11C\"'\n//   make -j\n//\n// This compiles svaba with verbose stderr tracing for every decision\n// point that contig touches: assembly filtering, BP identification,\n// r2c scoring, split coverage, confidence assignment, and output gating.\n//\n// To disable (default): just don't pass -DSVABA_TRACE_CONTIG.\n// To trace ALL contigs (very noisy): -DSVABA_TRACE_ALL=1\n//\n// Read tracing:\n//   cmake .. -DSVABA_TRACE_READ='\"LH00306:235:22NHGWLT4:6:1329:45742:15246\"'\n//   make -j\n//\n// Traces a specific read (by QNAME) through the BamWalker read-filter\n// pipeline: duplicate/QC/blacklist gates, rule_pass, high-NM salvage,\n// adapter filter, quality trim, and final buffer admission.\n//\n// To trace ALL reads (extremely noisy): -DSVABA_TRACE_ALL_READS=1\n//\n#pragma once\n\n#include <iostream>\n#include <string>\n\n// ── Contig tracing ──────────────────────────────────────────────────\n\n#ifdef SVABA_TRACE_CONTIG\n\n  // Match by contig name (cname)\n  inline bool _svaba_trace_match(const std::string& cname) {\n    return cname == SVABA_TRACE_CONTIG;\n  }\n\n  #define SVABA_TRACE(cname, msg) \\\n    do { if (_svaba_trace_match(cname)) { \\\n      std::cerr << \"[TRACE:\" << __FILE__ << \":\" << __LINE__ << \"] \" \\\n                << msg << std::endl; \\\n    } } while(0)\n\n  #define SVABA_TRACE_IF(cond, cname, msg) \\\n    do { if ((cond) && _svaba_trace_match(cname)) { \\\n      std::cerr << \"[TRACE:\" << __FILE__ << \":\" << __LINE__ << \"] \" \\\n                << msg << std::endl; \\\n    } } while(0)\n\n  #define SVABA_TRACING 1\n\n#elif defined(SVABA_TRACE_ALL)\n\n  #define SVABA_TRACE(cname, msg) \\\n    do { std::cerr << \"[TRACE:\" << __FILE__ << \":\" << __LINE__ << \"] \" \\\n                   << \"[\" << (cname) << \"] \" << msg << std::endl; \\\n    } while(0)\n\n  #define SVABA_TRACE_IF(cond, cname, msg) \\\n    do { if (cond) { std::cerr << \"[TRACE:\" << __FILE__ << \":\" << __LINE__ << \"] \" \\\n                               << \"[\" << (cname) << \"] \" << msg << std::endl; } \\\n    } while(0)\n\n  #define SVABA_TRACING 1\n\n#else\n\n  #define SVABA_TRACE(cname, msg) do {} while(0)\n  #define SVABA_TRACE_IF(cond, cname, msg) do {} while(0)\n  // SVABA_TRACING intentionally not defined\n\n#endif\n\n// ── Read tracing ────────────────────────────────────────────────────\n\n#ifdef SVABA_TRACE_READ\n\n  inline bool _svaba_read_trace_match(const std::string& qname) {\n    return qname == SVABA_TRACE_READ;\n  }\n\n  #define SVABA_READ_TRACE(qname, msg) \\\n    do { if (_svaba_read_trace_match(qname)) { \\\n      std::cerr << \"[READ_TRACE:\" << __FILE__ << \":\" << __LINE__ << \"] \" \\\n                << msg << std::endl; \\\n    } } while(0)\n\n  #define SVABA_READ_TRACE_IF(cond, qname, msg) \\\n    do { if ((cond) && _svaba_read_trace_match(qname)) { \\\n      std::cerr << \"[READ_TRACE:\" << __FILE__ << \":\" << __LINE__ << \"] \" \\\n                << msg << std::endl; \\\n    } } while(0)\n\n  #define SVABA_READ_TRACING 1\n\n#elif defined(SVABA_TRACE_ALL_READS)\n\n  #define SVABA_READ_TRACE(qname, msg) \\\n    do { std::cerr << \"[READ_TRACE:\" << __FILE__ << \":\" << __LINE__ << \"] \" \\\n                   << \"[\" << (qname) << \"] \" << msg << std::endl; \\\n    } while(0)\n\n  #define SVABA_READ_TRACE_IF(cond, qname, msg) \\\n    do { if (cond) { std::cerr << \"[READ_TRACE:\" << __FILE__ << \":\" << __LINE__ << \"] \" \\\n                               << \"[\" << (qname) << \"] \" << msg << std::endl; } \\\n    } while(0)\n\n  #define SVABA_READ_TRACING 1\n\n#else\n\n  #define SVABA_READ_TRACE(qname, msg) do {} while(0)\n  #define SVABA_READ_TRACE_IF(cond, qname, msg) do {} while(0)\n  // SVABA_READ_TRACING intentionally not defined\n\n#endif\n\n// ── Kmer restriction ────────────────────────────────────────────────\n//\n// Compile-time read filter: after BFC error correction, only reads\n// whose corrected sequence contains the specified kmer survive into\n// assembly/r2c/corrected.bam. All others get to_assemble = false.\n//\n// Usage:\n//   cmake .. -DCMAKE_CXX_FLAGS='-DSVABA_KMER_RESTRICT=\"\\\"CCATGCAGAGTGTTGAAGAAAAGGC\\\"\"'\n//\n// Also checks the reverse complement so orientation doesn't matter.\n// Zero cost when not compiled in.\n\n#ifdef SVABA_KMER_RESTRICT\n\n  inline std::string _svaba_revcomp(const std::string& s) {\n    std::string rc(s.size(), 'N');\n    for (size_t i = 0; i < s.size(); ++i) {\n      switch (s[s.size() - 1 - i]) {\n        case 'A': case 'a': rc[i] = 'T'; break;\n        case 'T': case 't': rc[i] = 'A'; break;\n        case 'C': case 'c': rc[i] = 'G'; break;\n        case 'G': case 'g': rc[i] = 'C'; break;\n        default:            rc[i] = 'N'; break;\n      }\n    }\n    return rc;\n  }\n\n  inline bool _svaba_kmer_match(const std::string& seq) {\n    static const std::string kmer_fwd(SVABA_KMER_RESTRICT);\n    static const std::string kmer_rc = _svaba_revcomp(kmer_fwd);\n    return seq.find(kmer_fwd) != std::string::npos ||\n           seq.find(kmer_rc)  != std::string::npos;\n  }\n\n  #define SVABA_KMER_RESTRICTING 1\n\n#endif\n"
  },
  {
    "path": "src/svaba/SvabaFileLoader.cpp",
    "content": "// SvabaFileLoader.cpp\n#include <filesystem>\n#include <memory>                           // for std::unique_ptr\n#include <sstream>                          // for std::istringstream\n#include <string>                           // for std::string\n#include <vector>                           // if you use any std::vector in this file\n#include \"SvabaFileLoader.h\"                // your own header\n\n#include \"SvabaSharedConfig.h\"\n#include \"SvabaLogger.h\"\n#include \"SvabaOptions.h\"\n#include \"SeqLib/RefGenome.h\"               // defines SeqLib::RefGenome\n#include \"SeqLib/GenomicRegionCollection.h\" // defines SeqLib::GRC\n#include \"SeqLib/BamHeader.h\"               // if you use SeqLib::BamHeader anywhere\n#include \"SeqLib/BamReader.h\"               // if you invoke any BamReader methods\n\nnamespace fs = std::filesystem;\nusing std::string;\n\nSvabaFileLoader::SvabaFileLoader(SvabaSharedConfig& sc_) : sc(sc_) {}\n\nstd::unique_ptr<SeqLib::RefGenome> SvabaFileLoader::loadReference() {\n  auto rg = std::make_unique<SeqLib::RefGenome>();\n  try {\n    rg->LoadIndex(sc.opts.refGenome);\n  } catch (const std::exception& e) {\n    sc.logger.log(true, true,\n             \"ERROR: Unable to load reference genome '\", sc.opts.refGenome,\n             \"': \", e.what());\n    throw;\n  }\n  sc.logger.log(false, true, \"Loaded reference genome: \", sc.opts.refGenome);\n  return rg;\n}\n\nvoid SvabaFileLoader::loadBedRegions(const std::string& path,\n\t\t\t\t     SeqLib::GRC& gr) {\n  if (path.empty()) return;\n  \n  try {\n    gr  = SeqLib::GRC(path, sc.header);\n    gr.CreateTreeMap();    \n    sc.logger.log(true, true,\n             \"...loaded BED file '\", path, \"' (\", gr.size(), \" regions)\");\n  } catch (const std::exception& e) {\n    sc.logger.log(true, true,\n             \"ERROR: cannot read BED file '\", path, \"': \", e.what());\n    throw;\n  }\n}\n\nvoid SvabaFileLoader::countJobs(\n    SeqLib::GRC& runRegions) {\n\n  SeqLib::GRC fileRegions;\n  const auto& rf = sc.opts.regionFile;\n  // 1) If its a real BED/region file on disk\n  if (!rf.empty() && fs::exists(rf)) {\n    try {\n      fileRegions = SeqLib::GRC(rf, sc.header);\n    } catch (const std::exception& ex) {\n      sc.logger.log(\n\t\t  /*toErr=*/true, /*toLog=*/true,\n\t\t  \"Could not parse region file '\", rf, \"': \", ex.what(),\n\t\t  \".  Skipping region file.\");\n    }\n    \n    // 2) If it looks like chr:start-end\n  } else if (rf.find(':') != string::npos && rf.find('-') != string::npos) {\n    fileRegions.add(SeqLib::GenomicRegion(rf, sc.header));\n    \n    // 3) Bare chromosome name(s), possibly comma-separated (e.g. \"chr1,chr2,chr3\")\n  } else if (!rf.empty()) {\n    // Split on commas to support -k chr1,chr2,chr3\n    std::istringstream ss(rf);\n    std::string token;\n    while (std::getline(ss, token, ',')) {\n      if (token.empty()) continue;\n      // Each token could be \"chr1\" or \"chr1:100-200\"\n      if (token.find(':') != string::npos && token.find('-') != string::npos) {\n        fileRegions.add(SeqLib::GenomicRegion(token, sc.header));\n      } else {\n        SeqLib::GenomicRegion gr(token, \"1\", \"1\", sc.header);\n        if (gr.chr < 0 || gr.chr >= sc.header.NumSequences()) {\n          throw std::runtime_error(\"Region '\" + token +\n                                   \"' failed to match any chromosome in BAM header\");\n        }\n        gr.pos2 = sc.header.GetSequenceLength(gr.chr);\n        fileRegions.add(gr);\n      }\n    }\n    \n    // 4) else: whole genome\n  } else {\n    for (int i = 0; i < sc.header.NumSequences(); ++i) {\n      fileRegions.add(\n\t\t      SeqLib::GenomicRegion(i, 1, sc.header.GetSequenceLength(i))\n\t\t      );\n    }\n  }\n  \n  if (fileRegions.size() == 0) {\n    throw std::runtime_error(\"No regions found\"\n\t\t\t     + (rf.empty() ? string(\"\") : \" in '\" + rf + \"'\"));\n  }\n  \n  // 5) Chunk them up\n  if (sc.opts.chunkSize > 0) {\n    for (auto& r : fileRegions) {\n      // this SeqLib constructor splits a region into windows of size chunkSize with pad\n      SeqLib::GRC pieces(sc.opts.chunkSize, sc.opts.windowpad, r);\n      runRegions.Concat(pieces);\n    }\n  } else {\n    // if chunkSize <= 0, we just do one big pass:\n    runRegions = fileRegions;\n  }\n  \n  // if no explicit regionFile, clear fileRegions to signal whole genome\n  if (rf.empty()) {\n    fileRegions.clear();\n  }\n    \n  return;\n}\n"
  },
  {
    "path": "src/svaba/SvabaFileLoader.h",
    "content": "// SvabaFileLoader.h\n#pragma once\n\n#include <memory>\n#include <string>\n\n#include \"SeqLib/GenomicRegionCollection.h\"\n\nclass SvabaLogger;\nclass SvabaOptions;\nclass SvabaSharedConfig;\nnamespace SeqLib {\n  class RefGenome;\n}\n\n/// A small helper for all the open this file, bail out if it fails logic.\n/// Carries around references to your single SvabaLogger and SvabaOptions.\nclass SvabaFileLoader {\npublic:\n  /// You must give it your one-and-only logger and options.\n  SvabaFileLoader(SvabaSharedConfig& sc_);\n\n  /// Loads a BED style file into a GenomicRegionCollection, or returns empty if no path.\n  void loadBedRegions(const std::string& path,\n\t\t      SeqLib::GRC& gr);\n\n  std::unique_ptr<SeqLib::RefGenome> loadReference();\n  \n  /// load the regions to run file and parese out jobs\n  void countJobs(SeqLib::GRC& runRegions);\n  \nprivate:\n  SvabaSharedConfig& sc;\n};\n"
  },
  {
    "path": "src/svaba/SvabaLogger.cpp",
    "content": "#include \"SvabaLogger.h\"\n#include \"SvabaOptions.h\"\n\nSvabaLogger::~SvabaLogger() {\n  if (logFile_.is_open()) logFile_.close();\n}\n\nvoid SvabaLogger::init(const std::string& filename) {\n  logFile_.open(filename, std::ios::out | std::ios::app);\n  if (!logFile_) {\n    std::cerr << \"ERROR: Unable to open log file: \" << filename << std::endl;\n  }\n}\n\nvoid SvabaLogger::welcome(SvabaOptions& opts) {\n  // write to log\n  this->log(true, true, \n\t    \"-----------------------------------------------------------\\n\",\n\t    \"---  Running svaba SV and indel detection on \",\n\t    \" threads ---\", (opts.numThreads >= 10 ? \"\\n\" : \"-\\n\"),\n\t    \"---  Version: \", SVABA_VERSION, \" - \", SVABA_DATE, \"                           ---\\n\",\n\t    \"---    (inspect *.log for real-time progress updates)   ---\\n\",\n\t    \"-----------------------------------------------------------\");\n  \n  // print the options to console if verbose (handled insize SvabaOptions)\n  //opts.printToLogger(*this);\n}\n"
  },
  {
    "path": "src/svaba/SvabaLogger.h",
    "content": "#pragma once\n#include <fstream>\n#include <iostream>\n#include <mutex>\n#include <sstream>\n#include <string>\n\nclass SvabaOptions;\n\n/// A simple thread safe logger that writes to a file and (optionally) stderr.\nclass SvabaLogger {\npublic:\n  SvabaLogger() = default;\n  ~SvabaLogger();\n\n  /// Must be called once at program startup, before any log() calls.\n  /// Opens (and appends to) the given filename.\n  void init(const std::string& filename);\n\n  /// Log a message.  \n  /// @param toErr if true, also write to std::cerr  \n  /// @param toLog if true, write to the log file  \n  /// @param args  one or more things you can stream into an ostringstream\n  template <typename... Args>\n  void log(bool toErr, bool toLog, Args&&... args) {\n\n    // it no printing at all, just leave\n    if (!toErr && !toLog)\n      return;\n\n    std::lock_guard<std::mutex> lock(mtx_);\n    std::ostringstream oss;\n    // fold expression to stream all args\n    (oss << ... << std::forward<Args>(args));\n    auto msg = oss.str();\n    if (toLog && logFile_.is_open()) logFile_ << msg << \"\\n\";\n    if (toErr) std::cerr << msg << \"\\n\";\n  }\n\n  void welcome(SvabaOptions& opts);\n  \nprivate:\n  std::ofstream   logFile_;\n  std::mutex      mtx_;\n};\n"
  },
  {
    "path": "src/svaba/SvabaModels.cpp",
    "content": "#include \"SvabaModels.h\"\n\n#include <iostream>\n#include <cmath>\n#include <algorithm>\n#include <cstring>\n\nnamespace SvabaModels {\n  \n\n  double LogLikelihood(double ref,\n\t\t       double alt,\n\t\t       double f,\n\t\t       double e_fwd,\n\t\t       double e_back) {\n    \n    // less negative log-likelihoods means more likely\n  // eg for low error rate, odds that you see 5 ALT and 5 REF\n  // if you are testing for AF = 0 is going to be very low (eg -40)\n  // To test if something is true, we want to test the log-likelihood that\n  // it's AF is != 0, so we test LL(ref, alt, AF=0, er). If this is \n  // a large negative number, it means that AF = 0 is very unlikely.\n  // If we use a larger error rate, then it is more likely that we will\n  // see ALT reads even if true AF = 0, so as ER goes up, then \n  // LL(ref, alt, AF=0, er) becomes less negative.\n\n  // Unnormalized log10-likelihood of seeing 'ref' ref-reads and 'alt' alt-reads\n  // under a simple two-state error/mutation model.\n    double ll = 0.0;\n    \n  // Clamp negative counts to zero\n  ref = std::max(0.0, ref);\n  alt = std::max(0.0, alt);\n\n  // P(read = REF):\n  //   (1-f)*(1-e_fwd)    true-ref, no forward error\n  // +  f*e_back          true-alt, mis-read back to ref\n  double p_ref = (1.0 - f) * (1.0 - e_fwd) // prior arg1\n    + f         *       e_back;\n  \n  // std::cerr << \" pref \" << p_ref << \" ref \" << ref << std::endl;\n  if (p_ref > 0.0) {\n    ll += ref * std::log10(p_ref);\n  } else if (ref > 0) {\n    return -1e12;  // zero probability but nonzero observations -> -Inf \n  }\n  \n  // P(read = ALT):\n  //   f*(1-e_back)      true-alt, no back mutation\n  // + (1-f)*e_fwd       true-ref, forward error to alt\n  \n  double p_alt = f         * (1.0 - e_back)\n    + (1.0 - f) *       e_fwd;\n  // std::cerr << \" palt \" << p_alt << \" alt \" << alt << std::endl;    \n  if (p_alt > 0.0) {\n    ll += alt * std::log10(p_alt);\n  } else if (alt > 0) {\n    return -1e12;\n  }  \n  \n  return ll;\n  \n  }\n\n// Forward: keep your public signature e_fwd is the high artifact rate.\nstatic inline double SomaticLOD_withSplitErrors(double aN, double dN, double aT, double dT,\n                                                double e_art_fwd, double e_rev,\n                                                double eN_fwd,   double eT_fwd);\n\ndouble SomaticLOD(double aN, double dN, double aT, double dT,\n                  double e_fwd, double e_rev)\n{\n    // Map old params to split errors:\n    // - e_fwd (caller) is your high artifact rate -> e_art_fwd\n    // - Choose conservative, lower empirical forward error caps for normal/tumor\n    const double e_art_fwd = e_fwd;\n\n    // You can tune these caps globally if you like\n    const double eN_fwd = std::min(e_art_fwd, 0.005);          // 0.5% in NORMAL\n    const double eT_fwd = std::min(std::max(e_art_fwd, 1e-4), 0.02); // 2% in TUMOR\n\n    return SomaticLOD_withSplitErrors(aN, dN, aT, dT, e_art_fwd, e_rev, eN_fwd, eT_fwd);\n}\n\n// Implementation with split errors\nstatic inline double SomaticLOD_withSplitErrors(double aN, double dN, double aT, double dT,\n                                                double e_art_fwd, double e_rev,\n                                                double eN_fwd,   double eT_fwd)\n{\n    const double epsilon = 1e-6;\n    const double dN_safe = std::max(1.0, dN);\n    const double dT_safe = std::max(1.0, dT);\n\n    // MLE tumor AF under H1\n    double fT_hat_raw = aT / dT_safe;\n    double fT_hat     = std::clamp(fT_hat_raw, epsilon, 1.0 - epsilon);\n\n    // Likelihood helpers (use *different* forward error by sample)\n    auto LL_N = [&](double d, double a, double f) {\n        return LogLikelihood(d - a, a, f, eN_fwd, e_rev); // log10\n    };\n    auto LL_T = [&](double d, double a, double f) {\n        return LogLikelihood(d - a, a, f, eT_fwd, e_rev); // log10\n    };\n    // Artifact-branch helper: use the generous artifact forward rate\n    auto LL_art = [&](double d, double a, double f) {\n        return LogLikelihood(d - a, a, f, e_art_fwd, e_rev); // log10\n    };\n\n    // =========================\n    // Artifact allele fraction\n    // =========================\n    // Keep artifact AF small; rate of errors (e_art_fwd) can be high, but true AF under artifact is low.\n    const double f_art = std::clamp(e_art_fwd, 1e-5, 1e-2);\n\n    // =========================\n    // SOMATIC (H1): max of\n    //   (A) True somatic: N~0, T~fT_hat\n    //   (B) Artifact in both: N~f_art, T~f_art\n    // =========================\n    double llN_som_true = LL_N(dN_safe, aN, 0.0);\n    double llT_som_true = LL_T(dT_safe, aT, fT_hat);\n    double ll_som_true  = llN_som_true + llT_som_true;\n\n    double llN_som_art  = LL_art(dN_safe, aN, f_art);\n    double llT_som_art  = LL_art(dT_safe, aT, f_art);\n    double ll_som_art   = llN_som_art + llT_som_art;\n\n    double ll_som = std::max(ll_som_true, ll_som_art);\n\n    // =========================\n    // GERMLINE (H0): max of\n    //   Het (0.5), Hom-alt (1-eps), Shared MLE f, Artifact (low f)\n    // =========================\n    const double f_het = std::clamp(0.5, epsilon, 1.0 - epsilon);\n    const double f_hom = std::clamp(1.0, epsilon, 1.0 - epsilon);\n    // Upper edge of \"looks like a low-level artifact\" VAF band. Anything\n    // above this is either heterozygous (~0.5), homozygous (~1.0), or\n    // an LOH-shifted germline event -- not a low-VAF shared artifact.\n    const double germ_plausible_floor = 0.15;\n    \n// =========================================================================\n    // GERM_shared: pooled-MLE allele fraction across N+T.\n    //\n    // Design goals:\n    //   - aN = 0 (clean normal)  -> GERM_shared must be held back so that a\n    //                               low-VAF tumor signal can win as somatic.\n    //   - aN = 1-2 in a clean normal  -> GERM_shared should compete strongly,\n    //                                    because a shared low-VAF artifact is\n    //                                    exactly what that data looks like.\n    //   - aN >= ~3  -> GERM_shared dominates normally; shared artifact or\n    //                  real (possibly LOH) germline event explains the data.\n    //\n    // We use TWO shaping knobs on top of the raw pooled-MLE log-likelihood:\n    //\n    //   (1) \"Cleanliness\" penalty:  a decaying function of aN relative to\n    //       expected errors in the normal (dN * eN_fwd). Near-maximum penalty\n    //       when the normal looks clean (aN at or below the error floor),\n    //       drops off steeply as excess normal alt reads accumulate.\n    //\n    //   (2) VAF similarity bonus:  when the normal does have real alt\n    //       evidence, *matching* VAFs between normal and tumor are a strong\n    //       \"shared\" fingerprint. Gated by (1 - cleanliness) so this bonus\n    //       only fires once the normal actually has signal -- this prevents\n    //       accidentally penalizing low-VAF-tumor somatic calls where the\n    //       VAF-ratio would be noisy and meaningless.\n    //\n    // f_shared_hat floats to the true pooled MLE (no 0.15 floor). The old\n    // clamp turned the \"free-MLE\" branch into a \"germline-only-MLE\" branch,\n    // which is exactly what we don't want when explaining low-VAF shared\n    // signal.\n    // =========================================================================\n\n    // Pooled MLE across both samples, free to land anywhere in (0,1).\n    const double f_shared_hat_raw = (aN + aT) / (dN_safe + dT_safe);\n    const double f_shared_hat     = std::clamp(f_shared_hat_raw, epsilon, 1.0 - epsilon);\n\n    // Start with the raw pooled-MLE log-likelihood -- never -inf, always let\n    // GERM_shared compete; shaping below decides how strongly.\n    double ll_germ_shared = LL_N(dN_safe, aN, f_shared_hat)\n                          + LL_T(dT_safe, aT, f_shared_hat);\n\n\n    // ----- (1) cleanliness penalty on GERM_shared -----------------------------\n    // Expected normal alt count under pure forward error at the (capped)\n    // normal error rate. Anything at or below this is indistinguishable from\n    // a clean normal.\n    const double expected_errors_N = dN_safe * eN_fwd;\n    const double excess_alt_N      = std::max(0.0, aN - expected_errors_N);\n    // Steep exponential decay: coefficient=3 means a single excess alt read\n    // already drops cleanliness by ~20x. At dN=79, eN_fwd=0.005:\n    //   aN=0 -> cleanliness=1.00  (full hold-back, clean somatic wins)\n    //   aN=1 -> cleanliness~0.16  (penalty already mostly gone)\n    //   aN=2 -> cleanliness~0.008 (essentially no hold-back)\n    // This is the \"even 1-2 normal alt reads should steeply consider shared\"\n    // behavior from the design discussion.\n    const double kCleanDecay   = 3.0;\n    const double cleanliness   = std::exp(-kCleanDecay * excess_alt_N);\n\n    // Max hold-back magnitude at aN=0.\n    const double kCleanPenalty = 2.0;\n    ll_germ_shared -= kCleanPenalty * cleanliness;\n\n    // ----- (2) VAF similarity bonus --------------------------------------------\n    // Matching tumor/normal VAFs are the fingerprint of a shared artifact or\n    // a shared (possibly LOH-shifted) germline event. Gated by (1-cleanliness)\n    // so this bonus only really fires once the normal has alt evidence --\n    // otherwise the ratio is dominated by numerical epsilons.\n    const double f_n_hat = std::clamp(aN / dN_safe, epsilon, 1.0 - epsilon);\n    const double f_t_hat = fT_hat;\n    const double ratio   = (std::max(f_n_hat, f_t_hat) > 0.0)\n                         ? std::min(f_n_hat, f_t_hat) / std::max(f_n_hat, f_t_hat)\n                         : 0.0;\n    const double sim_weight = 1.0 - cleanliness;     // ~0 at aN=0, ~1 at aN>=2\n    const double kSimBonus  = 3.0;                   // log10\n    ll_germ_shared += sim_weight * ratio * kSimBonus;\n\n    // ----- (3) \"both samples low VAF\" shared-artifact bonus --------------------\n    // If both normal and tumor carry nonzero alt evidence AND both VAFs sit\n    // below the germline-plausible band, that is the canonical signature of a\n    // low-level shared artifact (repeat tract, low-complexity region, etc).\n    // We add a bonus proportional to how similar the two VAFs are. This is\n    // independent of (2) -- (2) rewards *matching*, (3) rewards *both-low*.\n    const double low_vaf_cutoff = germ_plausible_floor; // 0.15\n    const bool both_nonzero_alt = (aN > 0.0) && (aT > 0.0);\n    const bool both_low_vaf     = (f_n_hat < low_vaf_cutoff) &&\n                                  (f_t_hat < low_vaf_cutoff);\n    if (both_nonzero_alt && both_low_vaf) {\n        const double kSharedLowVafBonus = 2.0; // log10\n        ll_germ_shared += kSharedLowVafBonus * ratio;\n    }\n\n    // other model options (germline het, germline homozygous, germline artifact)\n    double ll_germ_het    = LL_N(dN_safe, aN, f_het)        + LL_T(dT_safe, aT, f_het);\n    double ll_germ_hom    = LL_N(dN_safe, aN, f_hom)        + LL_T(dT_safe, aT, f_hom);\n    double ll_germ_art    = LL_art(dN_safe, aN, f_art)      + LL_art(dT_safe, aT, f_art);\n\n    // =========================================================================\n    // GERM_free: f_N and f_T MLEd independently (NOT tied like GERM_shared).\n    //\n    // Fills the gap where normal has low-but-real variant evidence while the\n    // tumor is near-clonal: LOH, clonal hematopoiesis, tumor-in-normal\n    // contamination, mosaic germline, etc. GERM_shared forces f_N = f_T, so\n    // e.g. (aN=6/dN=33, aT=84/dT=90) -- normal VAF ~0.18, tumor VAF ~0.93 --\n    // fits NEITHER sample under GERM_shared (pooled f≈0.73 is wrong for\n    // both), GERM_het is also wrong for both, and SOM_true wins despite\n    // clear alt evidence in the normal.\n    //\n    // Parameter count:\n    //   SOM_true has 1 free parameter (f_T).\n    //   GERM_free has 2 free parameters (f_N, f_T).\n    // Charge a BIC penalty of 0.5·log10(dN+dT) for the 1 net extra parameter.\n    //\n    // Activation gate:  aN > expected_errors_N + 1\n    // Rationale: when aN is at or near the expected number of error-driven\n    // alt reads in the normal (dN·eN_fwd), there is no real variant signal\n    // and the MLE f_N pegs at the error floor. Unconditionally enabling\n    // GERM_free in that regime makes it degenerate to \"SOM_true minus BIC\"\n    // on every clean-normal event, artificially capping somlod at ~1 bit\n    // regardless of how strong the tumor signal is. The +1 buffer above the\n    // error floor is Poisson-tail slack so a single stray error read in a\n    // clean normal doesn't trip the gate.\n    // =========================================================================\n    double ll_germ_free = -std::numeric_limits<double>::infinity();\n    double ll_germ_free_LL_N = 0.0, ll_germ_free_LL_T = 0.0; // for debug dump\n    double kGermFreeBIC = 0.0;\n    double f_n_free_dbg = 0.0, f_t_free_dbg = 0.0;\n    bool   germ_free_active = false;\n    if (aN > expected_errors_N + 1.0) {\n        germ_free_active = true;\n        f_n_free_dbg = std::clamp(aN / dN_safe, epsilon, 1.0 - epsilon);\n        f_t_free_dbg = std::clamp(aT / dT_safe, epsilon, 1.0 - epsilon);\n        kGermFreeBIC = 0.5 * std::log10(dN_safe + dT_safe);\n        ll_germ_free_LL_N = LL_N(dN_safe, aN, f_n_free_dbg);\n        ll_germ_free_LL_T = LL_T(dT_safe, aT, f_t_free_dbg);\n        ll_germ_free      = ll_germ_free_LL_N + ll_germ_free_LL_T - kGermFreeBIC;\n    }\n\n    double ll_germ = std::max({ ll_germ_shared, ll_germ_het, ll_germ_hom,\n                                ll_germ_art,    ll_germ_free });\n\n    double lod_somatic_vs_germ = ll_som - ll_germ;\n\n    // --------- DEBUG DUMP ----------\n    if (false) {\n        // SOM/H0 winners (for readability)\n        const bool som_true_better = (ll_som_true >= ll_som_art);\n        const char* som_branch = som_true_better ? \"SOM:true\" : \"SOM:art\";\n\n        double ll_germ_best = ll_germ_het;\n        const char* germ_branch = \"GERM:het\";\n        if (ll_germ_hom    > ll_germ_best) { ll_germ_best = ll_germ_hom;    germ_branch = \"GERM:hom\"; }\n        if (ll_germ_art    > ll_germ_best) { ll_germ_best = ll_germ_art;    germ_branch = \"GERM:art\"; }\n        if (ll_germ_shared > ll_germ_best) { ll_germ_best = ll_germ_shared; germ_branch = \"GERM:shared\"; }\n        if (ll_germ_free   > ll_germ_best) { ll_germ_best = ll_germ_free;   germ_branch = \"GERM:free\"; }\n\n        std::cerr\n            << \"SomaticLOD\"\n            << \" | aN=\" << aN << \" dN=\" << dN\n            << \" aT=\" << aT << \" dT=\" << dT\n            << \" e_art_fwd=\" << e_art_fwd\n            << \" eN_fwd=\" << eN_fwd\n            << \" eT_fwd=\" << eT_fwd\n            << \" e_rev=\" << e_rev\n            << \" eps=\" << epsilon\n            << \" fT_hat_raw=\" << fT_hat_raw << \" fT_hat=\" << fT_hat\n            << \" f_art=\" << f_art\n            << \" f_shared_raw=\" << f_shared_hat_raw << \" f_shared=\" << f_shared_hat\n            << \" expN_err=\" << expected_errors_N << \" excessN=\" << excess_alt_N\n            << \" cleanliness=\" << cleanliness\n            << \" clean_penalty=\" << (kCleanPenalty * cleanliness)\n            << \" f_n_hat=\" << f_n_hat << \" f_t_hat=\" << f_t_hat\n            << \" ratio=\" << ratio << \" sim_weight=\" << sim_weight\n            << \" sim_bonus=\" << (sim_weight * ratio * kSimBonus)\n            << \" both_low=\" << (both_nonzero_alt && both_low_vaf ? 1 : 0)\n            << \" low_vaf_bonus=\" << ((both_nonzero_alt && both_low_vaf) ? (2.0 * ratio) : 0.0)\n            << \" || SOM_TRUE(N,T,sum)=(\" << llN_som_true << \",\" << llT_som_true << \",\" << ll_som_true << \")\"\n            << \" SOM_ART(N,T,sum)=(\"     << llN_som_art  << \",\" << llT_som_art  << \",\" << ll_som_art  << \")\"\n            << \" SOM=\" << ll_som << \" [\" << som_branch << \"]\"\n            << \" || GERM_HET(N,T,sum)=(\"    << (LL_N(dN_safe,aN,f_het))    << \",\" << (LL_T(dT_safe,aT,f_het))    << \",\" << ll_germ_het    << \")\"\n            << \" GERM_HOM(N,T,sum)=(\"       << (LL_N(dN_safe,aN,f_hom))    << \",\" << (LL_T(dT_safe,aT,f_hom))    << \",\" << ll_germ_hom    << \")\"\n            << \" GERM_ART(N,T,sum)=(\"       << (LL_art(dN_safe,aN,f_art))  << \",\" << (LL_art(dT_safe,aT,f_art))  << \",\" << ll_germ_art    << \")\"\n            << \" GERM_SHARED(N,T,sum)=(\"    << (LL_N(dN_safe,aN,f_shared_hat)) << \",\" << (LL_T(dT_safe,aT,f_shared_hat)) << \",\" << ll_germ_shared << \")\"\n            << \" GERM_FREE(active=\" << (germ_free_active ? 1 : 0)\n            << \",fN=\" << f_n_free_dbg << \",fT=\" << f_t_free_dbg\n            << \",N=\" << ll_germ_free_LL_N << \",T=\" << ll_germ_free_LL_T\n            << \",BIC=\" << kGermFreeBIC << \",sum=\" << ll_germ_free << \")\"\n            << \" GERM=\" << ll_germ << \" [\" << germ_branch << \"]\"\n            << \" || LOD10=\" << lod_somatic_vs_germ\n            << std::endl;\n    }\n    // -------------------------------\n\n    return lod_somatic_vs_germ; // log10\n}\n  \n\n  int GenotypeQuality(const std::vector<int>& PLs) {\n    int best = std::numeric_limits<int>::max();\n    int second = std::numeric_limits<int>::max();\n    for (int p : PLs) {\n      if (p < best) {\n\tsecond = best;\n\tbest   = p;\n      }\n      else if (p < second) {\n\tsecond = p;\n      }\n    }\n    return std::min(second, 99);\n  }\n\n  // g is the number of reference alleles (e.g. g = 2 is homozygous reference)\n  // assumes biallelic model\n  // http://bioinformatics.oxfordjournals.org/content/early/2011/09/08/bioinformatics.btr509.full.pdf+html\n  double GenotypeLikelihoods(int g,\n\t\t\t     double er,\n\t\t\t     int alt,\n\t\t\t     int cov)\n  {\n    // g = number of reference alleles: 2 = hom_ref, 1 = het, 0 = hom_alt\n    // er = per-read error rate (0 <= er <= 1)\n    // alt = count of alt reads\n    // cov = total read depth\n    // Returns log10-likelihood under a biallelic model.\n    \n    // Clamp inputs\n    g   = std::min(2, std::max(0, g));\n    alt = std::max(0, alt);\n    cov = std::max(0, cov);\n    er  = std::clamp(er, 0.0, 1.0);\n    if (alt > cov) return -1e12;\n    \n    int ref = cov - alt;\n    double norm = -cov * std::log10(2.0);  // accounts for dividing by 2\n    \n    // Compute numerators (before /2)\n    double num_ref = (2 - g) * er + g * (1.0 - er);\n    double num_alt = (2 - g) * (1.0 - er) + g * er;\n    \n    // True probabilities (divide by 2)\n    double p_ref = num_ref / 2.0;\n    double p_alt = num_alt / 2.0;\n    \n    double ll = norm;\n    \n    // Add ref-read contribution\n    if (p_ref > 0.0) {\n      ll += ref * std::log10(p_ref);\n    } else if (ref > 0) {\n      return -1e12;\n    }\n    \n    // Add alt-read contribution\n    if (p_alt > 0.0) {\n      ll += alt * std::log10(p_alt);\n    } else if (alt > 0) {\n      return -1e12;\n    }\n    \n    return ll;\n  }\n  \n}\n"
  },
  {
    "path": "src/svaba/SvabaModels.h",
    "content": "#pragma once\n\n#include <vector>\n\nnamespace SvabaModels {\n  \n  double LogLikelihood(double ref,\n\t\t       double alt,\n\t\t       double f,\n\t\t       double e_fwd,\n\t\t       double e_back);\n  \n  double SomaticLOD(double aN,\n\t\t    double dN,\n\t\t    double aT,\n\t\t    double dT,\n\t\t    double e_fwd,\n\t\t    double e_rev);\n  \n  double GenotypeLikelihoods(int g, double er, int alt, int cov);\n  \n  int GenotypeQuality(const std::vector<int>& PLs);\n}\n\n"
  },
  {
    "path": "src/svaba/SvabaOptions.cpp",
    "content": "#include \"SvabaOptions.h\"\n\n#include <sstream>           // for std::ostringstream\n#include <iomanip>           // for std::setw and std::setfill\n#include <getopt.h>\n#include <iostream>\n#include <stdexcept>\n\n#include \"SvabaLogger.h\"\n#include \"SvabaAssemblerConfig.h\"  // SVABA_ASSEMBLER_FERMI for SGA guards\n\nvoid SvabaOptions::printUsage() {\n  std::cout << R\"(\nUsage: svaba run [OPTIONS]\n\nGeneral:\n  -h, --help              Show this message\n  -v, --verbose <N>       Verbosity level (0-4), default 0\n  -p, --threads <N>       Number of threads, default 1\n  -a, --analysis-id <ID>  Identifier for this run\n\nInput:\n  -t, --case-bam <FILE>     Tumor BAM; may repeat\n  -n, --control-bam <FILE>  Normal BAM; may repeat\n  -G, --reference-genome <FILE>\n                           Indexed reference FASTA\n  -k, --region-file <FILE>  BED or samtools-style regions\n\nMode:\n      --single-end        Single-end mode (no mate lookup)\n      --all-contigs       Output all assembled contigs\n      --discordant-only   Skip assembly, only discordants\n      --override-ref-check\n                         Skip BAM vs REF compatibility check\n)\"\n#if !SVABA_ASSEMBLER_FERMI\n  // SGA-specific knobs. Only surface them to --help when svaba was\n  // compiled with SGA as the active assembler (see\n  // SvabaAssemblerConfig.h). The option codes themselves still parse\n  // under fermi — they just get ignored.\n            << R\"(\nAssembly (SGA):\n      --min-overlap <bp>  Minimum read overlap for SGA\n      --error-rate <f>    SGA fractional error rate\n      --rounds <N>        Number of assembly rounds\n)\"\n#endif\n            << R\"(\nError-correction:\n      --ec-type <s|f|0>   s=SGA k-mer; f=Fermi BFC; 0=off\n      --ec-subsample <f>  Fraction to sample for EC learning\n\nDiscordant clustering:\n      --disc-sd <f>       SD cutoff, default 3.92\n\nFiltering:\n      --max-cov <N>       Max coverage to assemble, default 100\n      --mate-min <N>      Min reads to trigger somatic mate lookup, default 3\n      --mate-min-count <N>\n                          Min reads to form a candidate mate region, default 2\n      --mate-lim <N>      Max reads in mate lookup, default 400\n      --min-mate-mapq <N> Min MAPQ on primary read for mate-region candidate,\n                          default -1 (no gate). Set to e.g. 1 to exclude\n                          MAPQ=0 multi-mappers from mate lookup.\n      --max-mate-chr <N>  Exclude mate regions on chromosomes with ChrID > N,\n                          default 23 (through chrY; skips chrM/alt/decoy).\n                          Set to -1 for no limit (see --non-human).\n      --non-human         Remove hardcoded human genome assumptions.\n                          Currently sets --max-mate-chr -1 (allow all chroms)\n                          and samples all contigs during insert-size learning.\n      --no-nm             Skip high-NM read salvage (NM/len > 0.02).\n                          Faster: fewer reads enter r2c and correction.\n                          Trades away rare NM-only SV sensitivity.\n\nBWA-MEM tuning:\n      --bw-op <N>         Gap-open pen, default 32\n      --bw-ep <N>         Gap-ext pen, default 1\n      --bw-mm <N>         Mismatch pen, default 18\n      --bw-ms <N>         Match score, default 2\n      --bw-zd <N>         Z-drop, default 100\n      --bw-bw <N>         Bandwidth, default 1000\n      --bw-rt <f>         Reseed trigger, default 1.5\n      --bw-c3 <N>         3' clip pen, default 5\n      --bw-c5 <N>         5' clip pen, default 5\n\nOutput & DBs:\n      --blacklist <FILE>  BED of blacklisted regions\n      --germline-sv <FILE>\n                         BED of known germline SVs\n      --dbsnp <VCF>       DBSNP VCF of known variants\n      --dump-reads        Emit per-read debug/visualization outputs\n                          (off by default; large output on deep samples).\n                          Four files are produced by this flag together:\n                            ${ID}.corrected.bam\n                            ${ID}.discordant.bam\n                            ${ID}.alignments.txt.gz\n                            ${ID}.r2c.txt.gz\n                          Without this flag, svaba writes the bps.txt.gz\n                          / VCF / contigs.bam / runtime.txt summaries but\n                          none of the per-read detail. Weird-reads BAM is\n                          compile-time only; see\n                          SvabaOptions.h::dump_weird_reads.\n      --always-realign-corrected\n                          Force re-alignment of every corrected read to\n                          the reference, even if BFC didn't modify it.\n                          By default, reads whose sequence is unchanged\n                          reuse the input BAM's CIGAR/NM (valid when the\n                          BAM was aligned with BWA). Use this flag when\n                          the input was aligned with a non-BWA aligner.\n)\" << \"\\n\";\n}\n\nSvabaOptions SvabaOptions::parse(int argc, char** argv) {\n  static const char* shortOpts = \"hv:p:a:t:n:G:k:\";\n  static struct option longOpts[] = {\n    {\"help\",                 no_argument,       nullptr, 'h'},\n    {\"verbose\",     required_argument, nullptr, 'v'},\n    {\"threads\",     required_argument, nullptr, 'p'},\n    {\"analysis-id\", required_argument, nullptr, 'a'},\n    {\"case-bam\",    required_argument, nullptr, 't'},\n    {\"control-bam\", required_argument, nullptr, 'n'},\n    {\"reference-genome\", required_argument, nullptr, 'G'},\n    {\"region-file\", required_argument, nullptr, 'k'},\n    {\"single-end\",       no_argument,       nullptr,  1001},\n    {\"all-contigs\",      no_argument,       nullptr,  1002},\n    {\"discordant-only\",  no_argument,       nullptr,  1003},\n    {\"override-ref-check\",no_argument,      nullptr,  1004},\n    {\"min-overlap\", required_argument,     nullptr,  1100},\n    {\"error-rate\", required_argument,      nullptr,  1101},\n    {\"rounds\",     required_argument,      nullptr,  1102},\n    {\"ec-type\",    required_argument,      nullptr,  1200},\n    {\"ec-subsample\",required_argument,     nullptr,  1201},\n    {\"disc-sd\",    required_argument,      nullptr,  1300},\n    {\"max-cov\",    required_argument,      nullptr,  1400},\n    {\"mate-min\",   required_argument,      nullptr,  1401},\n    {\"mate-lim\",   required_argument,      nullptr,  1402},\n    {\"no-nm\",      no_argument,            nullptr,  1403},\n    {\"min-mate-mapq\",   required_argument, nullptr,  1404},\n    {\"max-mate-chr\",    required_argument, nullptr,  1405},\n    {\"non-human\",       no_argument,       nullptr,  1406},\n    {\"mate-min-count\",  required_argument, nullptr,  1407},\n    {\"chunk-size\", required_argument,      nullptr,  1500},\n    {\"bw-op\",      required_argument,      nullptr,  1600},\n    {\"bw-ep\",      required_argument,      nullptr,  1601},\n    {\"bw-mm\",      required_argument,      nullptr,  1602},\n    {\"bw-ms\",      required_argument,      nullptr,  1603},\n    {\"bw-zd\",      required_argument,      nullptr,  1604},\n    {\"bw-bw\",      required_argument,      nullptr,  1605},\n    {\"bw-rt\",      required_argument,      nullptr,  1606},\n    {\"bw-c3\",      required_argument,      nullptr,  1607},\n    {\"bw-c5\",      required_argument,      nullptr,  1608},\n    {\"blacklist\",  required_argument,      nullptr,  1700},\n    {\"germline-sv\",required_argument,      nullptr,  1701},\n    {\"dbsnp\",      required_argument,      nullptr,  1702},\n    // --dump-reads: runtime opt-in for corrected + discordant-reads BAMs.\n    // Single flag, both side effects — see comment in SvabaOptions.h.\n    // Weird-reads BAM is deliberately not on this flag (compile-time only).\n    {\"dump-reads\", no_argument,            nullptr,  1800},\n    {\"always-realign-corrected\", no_argument, nullptr, 1801},\n    {nullptr,0,nullptr,0}\n  };\n\n  SvabaOptions o;\n  int idx, c;\n  while ((c = getopt_long(argc, argv, shortOpts, longOpts, &idx)) != -1) {\n    switch (c) {\n      case 'h':   o.help = true;  return o;\n      case 'v':   o.verbose      = std::stoi(optarg); break;\n      case 'p':   o.numThreads   = std::stoi(optarg); break;\n      case 'a':   o.analysisId   = optarg;            break;\n      case 't':   o.caseBams   .push_back(optarg);    break;\n      case 'n':   o.controlBams.push_back(optarg);    break;\n      case 'G':   o.refGenome    = optarg;            break;\n      case 'k':   o.regionFile   = optarg;            break;\n\n      case 1001: o.singleEnd        = true; break;\n      case 1002: o.allContigs       = true; break;\n      case 1003: o.discClusterOnly  = true; break;\n      case 1004: o.overrideRefCheck = true; break;\n\n      case 1100: o.sgaMinOverlap    = std::stoi(optarg); break;\n      case 1101: o.sgaErrorRate     = std::stof(optarg); break;\n      case 1102: o.sgaNumRounds     = std::stoi(optarg); break;\n\n      case 1200: o.ecCorrectType    = optarg;           break;\n      case 1201: o.ecSubsample      = std::stod(optarg); break;\n\n      case 1300: o.sdDiscCutoff     = std::stod(optarg); break;\n\n      case 1400: o.maxCov           = std::stoi(optarg); break;\n      case 1401: o.mateLookupMin    = std::stoul(optarg);break;\n      case 1402: o.mateRegionLookupLim = std::stoul(optarg); break;\n      case 1403: o.noNmSalvage          = true; break;\n      case 1404: o.minMateMAPQ          = std::stoi(optarg); break;\n      case 1405: o.maxMateChrID         = std::stoi(optarg); break;\n      case 1406: o.nonHuman             = true; break;\n      case 1407: o.mateRegionMinCount   = std::stoi(optarg); break;\n\n      case 1500: o.chunkSize        = std::stoi(optarg); break;\n\n      case 1600: o.bwaGapOpen       = std::stoi(optarg); break;\n      case 1601: o.bwaGapExt        = std::stoi(optarg); break;\n      case 1602: o.bwaMismatch      = std::stoi(optarg); break;\n      case 1603: o.bwaMatchScore    = std::stoi(optarg); break;\n      case 1604: o.bwaZdrop         = std::stoi(optarg); break;\n      case 1605: o.bwaBandwidth     = std::stoi(optarg); break;\n      case 1606: o.bwaReseedTrigger = std::stof(optarg); break;\n      case 1607: o.bwaClip3         = std::stoi(optarg); break;\n      case 1608: o.bwaClip5         = std::stoi(optarg); break;\n\n      case 1700: o.blacklistFile.push_back(optarg); break;\n      case 1701: o.germlineSvFile = optarg; break;\n      case 1702: o.dbsnpVcf       = optarg; break;\n\n      // --dump-reads is the single runtime knob for all per-read detail\n      // outputs. Flip all three flags together here; any call-site\n      // reading these fields after parse() sees a consistent state.\n      // See SvabaOptions.h for the comment on why these are separate\n      // fields instead of a single bool.\n      case 1800:\n        o.dump_discordant_reads = true;\n        o.dump_corrected_reads  = true;\n        o.dump_alignments       = true;\n        break;\n\n      case 1801:\n        o.alwaysRealignCorrected = true;\n        break;\n\n      case '?':\n      default:\n        throw std::runtime_error(\"Unknown or malformed option; see --help\");\n    }\n  }\n\n  // --non-human: remove human-specific assumptions\n  if (o.nonHuman) {\n    o.maxMateChrID = -1;  // allow all chromosomes for mate lookup\n  }\n\n  // post validation\n  if (argc == 1) {\n    o.help = true;\n  } else if (!o.help) {\n    if (o.caseBams.empty())   throw std::runtime_error(\"Need at least one --case-bam\");\n    if (o.refGenome.empty())  throw std::runtime_error(\"Must supply --reference-genome\");\n    if (o.analysisId.empty()) o.analysisId = \"no_id\";\n    if (o.chunkSize <= 0)      o.chunkSize = 25000;\n  }\n\n  // make the bam map from the file names\n  int tumorIdx = 1;\n  for (const auto& path : o.caseBams) {\n    std::ostringstream ss;\n    ss << 't'\n       << std::setw(3) << std::setfill('0')\n       << tumorIdx++;\n    o.bams[ ss.str() ] = path;\n  }\n  \n  int normalIdx = 1;\n  for (const auto& path : o.controlBams) {\n    std::ostringstream ss;\n    ss << 'n'\n       << std::setw(3) << std::setfill('0')\n       << normalIdx++;\n    o.bams[ ss.str() ] = path;\n  }\n  \n  // set the rules to skip read learning if doing stdin\n  //  if (o.bams[\"t001\"] == \"-\" && !o.rulesJson.empty())\n  o.rulesJson = R\"json(\n{\n  \"global\": {\n    \"duplicate\": false,\n    \"qcfail\":   false\n  },\n  \"\": {\n    \"rules\": [\n      { \"rr\":    true },\n      { \"ff\":    true },\n      { \"rf\":    true },\n      { \"ic\":    true },\n      { \"clip\":  5, \"length\": 30 },\n      { \"ins\":   true },\n      { \"del\":   true },\n      { \"mapped\":      true, \"mate_mapped\": false },\n      { \"mate_mapped\": true, \"mapped\":      false }\n    ]\n  }\n}\n)json\";\n  \n  // if read stream, treat as single-end\n  if (o.bams[\"t001\"] == \"-\")\n    o.singleEnd = true;\n  \n  // set the \"main bam\"\n  o.main_bam = o.bams[\"t001\"];\n  \n  return o;\n}\n\nvoid SvabaOptions::printLogger(SvabaLogger& logger) const {\n  logger.log(verbose > 1, true, \"***************************** PARAMS ****************************\");\n  logger.log(verbose > 1, true, \"    DBSNP Database file: \",            dbsnpVcf);\n  logger.log(verbose > 1, true, \"    Max cov to assemble: \",            maxCov);\n  logger.log(verbose > 1, true, \"    Error correction mode: \",          ecCorrectType);\n  logger.log(verbose > 1, true, \"    Subsample-rate for correction learning: \", ecSubsample);\n  logger.log(verbose > 1, true, \"    Assembler: \", svaba::kAssemblerName);\n#if !SVABA_ASSEMBLER_FERMI\n  // SGA-only parameters; don't confuse fermi-build operators with\n  // values they can't tune without recompiling.\n  logger.log(verbose > 1, true, \"    ErrorRate (SGA): \",\n             (sgaErrorRate < 0.001f ? std::string(\"EXACT (0)\")\n                                        : std::to_string(sgaErrorRate)));\n  logger.log(verbose > 1, true, \"    Num assembly rounds (SGA): \",     sgaNumRounds);\n#endif\n  logger.log(verbose > 1, true, \"    Discordant SD cutoff (tumor): \",  sdDiscCutoff);\n  logger.log(verbose > 1, true, \"    Discordant SD cutoff (normal): \", sdDiscCutoffNormal);\n  logger.log(verbose > 1, true, \"    Minimum number of reads for mate lookup: \", mateLookupMin);\n  logger.log(verbose > 1, true, \"    Min reads to form candidate mate region: \", mateRegionMinCount);\n  logger.log(verbose > 1, true, \"    Min MAPQ for mate region candidate: \", minMateMAPQ, (minMateMAPQ < 0 ? \" (no gate)\" : \"\"));\n  logger.log(verbose > 1, true, \"    Max ChrID for mate region: \", maxMateChrID, (maxMateChrID < 0 ? \" (no limit)\" : \"\"));\n  if (nonHuman) logger.log(true, true, \"    Non-human genome mode: chromosome gates disabled\");\n  logger.log(verbose > 1, true, \"    LOD cutoff (non-REF): \",           lod);\n  logger.log(verbose > 1, true, \"    LOD cutoff (non-REF, at DBSNP): \",  lodDb);\n  logger.log(verbose > 1, true, \"    LOD somatic cutoff: \",            lodSomatic);\n  logger.log(verbose > 1, true, \"    LOD somatic cutoff (at DBSNP): \", lodSomaticDb);\n  logger.log(verbose > 1, true, \"    BWA-MEM params:\");\n  logger.log(verbose > 1, true, \"      Gap open penalty: \",           bwaGapOpen);\n  logger.log(verbose > 1, true, \"      Gap extension penalty: \",      bwaGapExt);\n\t     logger.log(verbose > 1, true, \"      Mismatch penalty: \",           bwaMismatch);\n  logger.log(verbose > 1, true, \"      Sequence match score: \",       bwaMatchScore);\n  logger.log(verbose > 1, true, \"      Z-dropoff: \",                  bwaZdrop);\n  logger.log(verbose > 1, true, \"      Alignment bandwidth: \",        bwaBandwidth);\n  logger.log(verbose > 1, true, \"      Clip 3 penalty: \",             bwaClip3);\n  logger.log(verbose > 1, true, \"      Clip 5 penalty: \",             bwaClip5);\n  logger.log(verbose > 1, true, \"      Reseed trigger: \",             bwaReseedTrigger);\n\n  if (discClusterOnly) {\n    logger.log(true, true, \"    ######## ONLY DISCORDANT READ CLUSTERING. NO ASSEMBLY ##############\");\n  }\n}\n"
  },
  {
    "path": "src/svaba/SvabaOptions.h",
    "content": "#pragma once\n\n#include <string>\n#include <vector>\n#include <map>\n#include <cstddef>\n\n// version & date\n//\n// Bumped to 2.0.0 to mark the SvABA2.0 overhaul: v3 bps.txt schema with\n// per-BP bp_id (col 52), r2c.txt.gz structured r2c emission replacing the\n// old alignments.txt.gz, comparative split-coverage gate, standalone\n// `svaba tovcf` + `svaba postprocess` subcommands, VCFv4.5 output, and\n// fermi-lite as the default local-assembly engine. See CLAUDE.md for the\n// full set of changes.\ninline constexpr char SVABA_VERSION[] = \"2.0.0\";\ninline constexpr char SVABA_DATE[]    = \"04/2026\";\n\n// from AlignmentFragment.h\ninline constexpr std::size_t MAX_CONTIG_SIZE = 5'000'000;\n\n// from run_svaba.cpp\ninline constexpr int MIN_CLIP_FOR_LOCAL           = 40;\ninline constexpr int MAX_NM_FOR_LOCAL             = 10;\n\n// from BreakPoint\ninline constexpr double MAX_ERROR                   = 0.08; // for very repetitive regions, what is the maximum expected error rate for an indel\ninline constexpr double MIN_ERROR                   = 0.0005; \ninline constexpr int    T_SPLIT_BUFF                = 5;\ninline constexpr int    N_SPLIT_BUFF                = 5;\ninline constexpr int    INSERT_SIZE_TOO_BIG_SPAN_READS = 16;\n// (Removed in SvABA2.0) R2C_MAX_NONEDGE_SOFTCLIP_{TUMOR,NORMAL} —\n// replaced by the principled per-read score comparison gate in\n// BreakPoint::splitCoverage(). See svaba::readAlignmentScore() in\n// ContigAlignmentScore.h: a read is now credited as a variant supporter\n// only when its r2c alignment scores strictly higher than its native\n// read-to-reference alignment, which subsumes both the interior-clip\n// rejection and the duplicated-reference equally-clean case.\n\n// SvABA2.0 (v3): r2c-better-than-native gate. A read is credited as a\n// split-supporter iff r2c_score > native_score (strict greater-than).\n// Ties don't credit the read — if the contig provides no better\n// explanation than the native alignment, the read is not evidence for\n// the variant.\n//\n// v3 originally used a per-sample percentage margin (10% for tumor,\n// 0% for normal) to filter junction-homology borderline cases on the\n// tumor side. v3.1 removed the margin entirely:\n//\n//   - The 10% margin was read-length-dependent and mathematically\n//     impossible to clear for small indels (a 1bp del on a 150bp read\n//     gives only 4.9% improvement; on a 250bp read only 2.9%).\n//   - Junction-homology cases where r2c barely beats native by 1-2\n//     points: normal already credits these reads (margin was always 0\n//     for normal). If both samples credit borderline reads equally,\n//     the downstream LOD model sees similar split support in both →\n//     low somlod → correctly not called somatic. The somatic/germline\n//     distinction is the LOD model's job, not the split-coverage gate's.\n//   - The margin was belt-and-suspenders with a worse failure mode\n//     (killing real small indels) than the problem it prevented.\n//\n// This replaces the older both_split / one_split / homlen branching\n// gate — when junction homology is on the order of the read length,\n// r2c and native tie and such reads fall out naturally via the strict >\n// comparison, which is the correct conservative behavior.\ninline constexpr double T_R2C_MIN_MARGIN          = 0.0;\ninline constexpr double N_R2C_MIN_MARGIN          = 0.0;\n\n// ---------------------------------------------------------------------------\n// SVABA_R2C_NATIVE_GATE — compile-time kill-switch for the r2c-vs-native\n// alignment-score split-coverage gate in BreakPoint::splitCoverage.\n//\n//   1  (default)  — gate enabled. Correct, recommended. Each candidate\n//                   split-supporting read is scored against both its r2c\n//                   alignment and its native (read→reference) alignment,\n//                   and must win by the per-sample-prefix margin above\n//                   (T_R2C_MIN_MARGIN / N_R2C_MIN_MARGIN). Fixes the\n//                   long-homology false-positive somatic bug.\n//\n//   0  (opt-in)   — gate disabled. Falls back to counting any r2c-spanning\n//                   read as a split supporter regardless of how it\n//                   compares to the native alignment. Reintroduces the\n//                   homology-trap bug (long junction homology + clean\n//                   normal-side reads → spurious somatic calls), so do\n//                   NOT use for real calling. Provided solely to isolate\n//                   the CPU cost of native_score computation on dense\n//                   contigs — flip to 0, rebuild, time a reference\n//                   region. Delta vs default-build tells you what the\n//                   gate costs.\n//\n// Build with:\n//   cmake .. -DCMAKE_CXX_FLAGS='-DSVABA_R2C_NATIVE_GATE=0'\n// ---------------------------------------------------------------------------\n#ifndef SVABA_R2C_NATIVE_GATE\n#define SVABA_R2C_NATIVE_GATE 1\n#endif\ninline constexpr int    HOMOLOGY_FACTOR             = 4;\ninline constexpr int    MIN_SOMATIC_RATIO           = 15;\ninline constexpr int    COVERAGE_AVG_BUFF           = 10;\n\n// from DiscordantCluster\ninline constexpr int DISC_PAD                 = 150;\ninline constexpr int MIN_PER_CLUST            = 3;\ninline constexpr int DEFAULT_ISIZE_THRESHOLD  = 2000;\n\n// from run_svaba\ninline constexpr std::size_t THREAD_READ_LIMIT      = 20'000;\ninline constexpr int         THREAD_CONTIG_LIMIT    =   5'000;\n\n// from svabaAssemblerEngine\ninline constexpr std::size_t MAX_OVERLAPS_PER_ASSEMBLY = 20'000;\ninline constexpr int         MIN_CONTIG_MATCH           =    35;\ninline constexpr int         MATE_LOOKUP_MIN            =     3;\ninline constexpr int         SECONDARY_CAP              =    10;\ninline constexpr int         MAX_MATE_ROUNDS            =     1;\ninline constexpr std::size_t MAX_NUM_MATE_WINDOWS      = 50'000'000;\ninline constexpr int         GERMLINE_CNV_PAD           =    10;\ninline constexpr int         GET_MATES                  =     1;\ninline constexpr int         LARGE_INTRA_LOOKUP_LIMIT   = 50'000;\ninline constexpr double      SECONDARY_FRAC             =  0.90;\n\n// from svabaBamWalker — mate-region lookup\n//\n// A discordant read contributes its mate locus as a candidate mate region\n// iff its own MAPQ >= MIN_MATE_MAPQ AND the mate locus is on a chromosome\n// with ChrID <= MAX_MATE_CHR_ID (set to -1 to disable the chromosome\n// gate, e.g. for non-human genomes; default 23 = through chrY). After\n// candidate regions are merged,\n// a region must have >= MATE_REGION_MIN_COUNT supporting reads to survive\n// the initial BamWalker filter, and then >= mateLookupMin (runtime option,\n// default MATE_LOOKUP_MIN=3) to trigger the actual somatic mate lookup\n// in SvabaRegionProcessor.\n//\n// Defaults:\n//   MIN_MATE_MAPQ          = -1   (no MAPQ gate; any mapped read qualifies)\n//   MAX_MATE_CHR_ID        =  23  (skip chrM/alt/decoy in human; -1 = no limit)\n//                                  0-indexed: 0=chr1 .. 21=chr22, 22=chrX, 23=chrY\n//   MATE_REGION_MIN_COUNT  =   2  (at least 2 reads to form a candidate)\n//   MATE_REGION_PAD        = 250  (bp padding on each side of mate locus)\ninline constexpr int    MIN_MATE_MAPQ                      =    -1;\ninline constexpr int    MAX_MATE_CHR_ID                    =    23;\ninline constexpr int    MATE_REGION_MIN_COUNT              =     2;\ninline constexpr int    MATE_REGION_PAD                    =   250;\n\n// from svabaBamWalker — other\ninline constexpr int MIN_DSCRD_READS_DSCRD_ONLY          = 6;\ninline constexpr int MIN_ISIZE_FOR_DISCORDANT_REALIGNMENT = 1'000;\ninline constexpr int DISC_REALIGN_MATE_PAD                =   100;\ninline constexpr int MAX_SECONDARY_HIT_DISC               =    10;\n\n// coverage buffer\ninline constexpr int INFORMATIVE_COVERAGE_BUFFER = 0;\n\n// from vcf\ninline constexpr int VCF_SECONDARY_CAP = 200;\ninline constexpr int SOMATIC_LOD       =   1;\ninline constexpr int DEDUPEPAD         = 200;\n\nclass SvabaLogger;\n\nclass SvabaOptions {\n\n public:\n  // high-level flags\n  bool   help        = false;\n  int    verbose     = 0;\n  int    numThreads  = 1;\n  std::string analysisId;\n  bool hp            = false;\n  int perRgLearnLimit = 1'000;\n  size_t weird_read_limit = 15'000;\n  size_t mate_region_lookup_limit = 5'000;\n\n  // dumping\n  //\n  // weird reads: compile-time-only toggle. Flip this to `true` here and\n  // rebuild if you really want the weird-reads BAM. Deliberately NOT\n  // exposed on the CLI — it's a large, niche output mostly used for\n  // debugging the read-collection phase, not for routine runs.\n  static constexpr bool dump_weird_reads = false;\n\n  // All three below are opt-in at runtime via a single --dump-reads flag.\n  // Default off so routine runs don't pay the (substantial) I/O and disk\n  // cost of emitting this per-read detail on deep samples:\n  //\n  //   dump_discordant_reads  -> ${ID}.discordant.bam\n  //   dump_corrected_reads   -> ${ID}.corrected.bam\n  //   dump_alignments        -> ${ID}.alignments.txt.gz\n  //                          -> ${ID}.r2c.txt.gz\n  //\n  // All three flip together under --dump-reads. The fields are kept\n  // separate so an individual callsite can still key off its own narrow\n  // concern (e.g. SvabaOutputWriter gates the alignments file streams on\n  // dump_alignments only), but there is intentionally no way to toggle\n  // them individually at runtime — that would bloat the CLI surface\n  // without serving a real workflow.\n  bool dump_discordant_reads = false;\n  bool dump_corrected_reads  = false;\n  bool dump_alignments       = false;\n  \n    // inputs\n  std::vector<std::string> caseBams;\n  std::vector<std::string> controlBams;\n  std::string refGenome;\n  std::string regionFile;\n\n  // make the log verbose, but will invoke a lot of mutex locks\n  bool verbose_log = false;\n\n  int windowpad          = 500;\n\n  std::string main_bam;\n  \n  // mode flags\n  bool singleEnd         = false;\n  bool allContigs        = false;\n  bool discClusterOnly   = false;\n  bool overrideRefCheck  = false;\n\n  // numeric thresholds\n  double sdDiscCutoff       = 3.92;  // SD multiplier for tumor discordant cutoff\n  double sdDiscCutoffNormal = 3.60;  // SD multiplier for normal (lower = more sensitive)\n  int    chunkSize          = 25000;\n  int32_t maxReadsPerAssem  = -1;\n\n  // this is site-level Log-odds cutoff for PASS that is variant \n  double lod                = 1.0; //8.0;\n  // this is site-level Log-odds cuttof for PASS that is variant, if also has supporting DBSNP site\n  double lodDb              = 1.0; //6.0;\n  // this is log-odds that this is REF in the \"worst\" normal (the one with the most potential alt reads)\n  double lodSomatic         = 0.0; //6.0;\n  // same, but be more strict if this somatic variant overlaps a dbsnp site\n  double lodSomaticDb       = 2.0; // 10.0;\n  \n  int    maxCov             = 100;\n\n  // SGA / assembly\n  int    sgaMinOverlap      = 0;\n  float  sgaErrorRate       = 0.0f;\n  int    sgaNumRounds       = 3;\n\n  // error correction\n  std::string ecCorrectType = \"f\";   //s, f, or 0\n  double      ecSubsample   = 0.50;\n\n  // BWA-MEM tuning\n  int   bwaGapOpen       = 32;\n  int   bwaGapExt        = 1;\n  int   bwaMismatch      = 18;\n  int   bwaMatchScore    = 2;\n  int   bwaZdrop         = 100;\n  int   bwaBandwidth     = 1000;\n  float bwaReseedTrigger = 1.5f;\n  int   bwaClip3         = 5;\n  int   bwaClip5         = 5;\n\n  // filtering\n  std::string rulesJson;\n  size_t      mateLookupMin       = MATE_LOOKUP_MIN;\n  size_t      mateRegionLookupLim = 400;\n  bool        noBadAvoid          = true;\n\n  // Mate-region lookup tuning (runtime overrides for compile-time defaults)\n  int         minMateMAPQ          = MIN_MATE_MAPQ;          // --min-mate-mapq\n  int         maxMateChrID         = MAX_MATE_CHR_ID;        // --max-mate-chr (or -1 via --non-human)\n  int         mateRegionMinCount   = MATE_REGION_MIN_COUNT;  // --mate-min-count\n\n  // Non-human genome mode: removes all hardcoded human chromosome\n  // assumptions (currently just the mate-lookup ChrID > 23 gate and\n  // the LearnBamParams chr1-chrY sampling preference).\n  // Sets maxMateChrID = -1 (no limit) and logs a banner.\n  bool        nonHuman            = false;\n\n  // When true, skip the high-NM salvage path that pulls in reads with\n  // NM/len > 0.02 even when they don't pass the normal weird-read rules.\n  // Those reads are useful for catching NM-only SVs (no clips/discordance)\n  // but substantially increase read count and r2c cost. --no-nm disables\n  // the path entirely for maximum efficiency.\n  bool noNmSalvage = false;\n\n  // When false (default), reads whose corrected sequence matches the\n  // original BAM sequence reuse the input BAM's CIGAR/NM for the\n  // native-vs-r2c gate in splitCoverage, skipping the expensive\n  // full-reference BWA re-alignment. This is correct when the input\n  // BAM was aligned with BWA-MEM (same scoring model as svaba's\n  // internal aligner). When the input BAM was aligned with a\n  // different aligner (e.g. bowtie2, STAR, minimap2), the native\n  // CIGAR/NM may not be comparable — set this to true to force\n  // re-alignment of every corrected read against the reference.\n  bool alwaysRealignCorrected = false;\n\n  // external DBs\n  std::vector<std::string> blacklistFile;\n  std::string germlineSvFile;\n  std::string dbsnpVcf;\n\n  // BAM map (idpath)\n  // e.g. t001, /path/to/\n  std::map<std::string,std::string> bams;\n\n  // ----------------------------------------------------\n  // Print help/usage\n  static void printUsage();\n\n  void printLogger(SvabaLogger& logger) const;  \n\n  // Parse argc/argv into an SvabaOptions; throws on error\n  static SvabaOptions parse(int argc, char** argv);\n\n};\n"
  },
  {
    "path": "src/svaba/SvabaOutputWriter.cpp",
    "content": "// svabaOutputWriter.cpp\n\n#include \"SvabaOutputWriter.h\"\n#include \"SvabaThreadUnit.h\"\n#include \"SvabaUtils.h\"\n#include \"BreakPoint.h\"\n#include \"DiscordantCluster.h\"\n#include \"SvabaSharedConfig.h\"\n\n#include <htslib/sam.h>\n\n#include <mutex>\n\nusing namespace std;\n\nnamespace {\n\n  // one mutex to serialize ALL threads writes\n  static mutex writeMutex_;\n\n}\n\n// Build a new BamHeader that prepends an @HD line (with the given sort order)\n// to the @SQ block of `src`. Avoids SeqLib::BamHeader::AsString(), which\n// blindly dereferences h->text; in modern htslib that field is lazy and is\n// often NULL until sam_hdr_str() materializes it, causing a segfault.\nstatic SeqLib::BamHeader make_header_with_hd(const SeqLib::BamHeader& src,\n                                             const std::string& so) {\n  std::string txt = \"@HD\\tVN:1.6\\tSO:\" + so + \"\\n\";\n\n  const bam_hdr_t* h = src.get();\n  if (h) {\n    // sam_hdr_str forces htslib to regenerate the textual form from its\n    // internal representation and caches it in h->text.\n    const char* cur = sam_hdr_str(const_cast<bam_hdr_t*>(h));\n    if (cur) txt += cur;\n  }\n\n  return SeqLib::BamHeader(txt);\n}\n\nSvabaOutputWriter::SvabaOutputWriter(SvabaLogger& logger_, SvabaOptions& opts_)\n  : logger(logger_), opts(opts_)\n{ }\n\n// init(): call once, from run_svaba.cpp immediately after you've parsed\n// your opts and before you shoot off any threads.\nvoid SvabaOutputWriter::init(const string& analysis_id,\n\t\t\t     const SeqLib::BamHeader& b_header) {\n\n  // keep a local reference to the header\n  bam_header_ = b_header;\n\n  // open our gzipped text outputs\n  //\n  // Per-thread r2c.txt.gz streams are opened by svabaThreadUnit itself\n  // (see its ctor) — nothing to open here for that output. What's left\n  // on this shared-writer path is only the small coordination outputs\n  // where mutex contention is a non-issue.\n  svabaUtils::fopen(analysis_id + \".bps.txt.gz\",        os_allbps_);\n  svabaUtils::fopen(analysis_id + \".discordant.txt.gz\",  os_discordant_);\n  svabaUtils::fopen(analysis_id + \".runtime.txt\",  os_runtime_);\n\n  // write the header line for breakpoints file:\n  os_allbps_ << BreakPoint::header();\n  for (auto &p : opts.bams) \n    os_allbps_ << \"\\t\" << p.first << \"_\" << p.second;\n  os_allbps_ << \"\\n\";\n\n  // write the header line for runtime file\n  os_runtime_ <<\n    svabaUtils::svabaTimer::header << \"\\n\";\n  \n  // write the header line for discordant clusters:\n  os_discordant_ << DiscordantCluster::header() << \"\\n\";\n\n  // BAM output for aligned contigs\n  std::string aligned_contigs_bam_path = analysis_id;\n  aligned_contigs_bam_path.append(\".contigs.bam\");\n  b_contig_writer_ = SeqLib::BamWriter(SeqLib::BAM);\n  auto hdr_unsorted = make_header_with_hd(b_header, \"unsorted\");\n  b_contig_writer_.SetHeader(hdr_unsorted);  \n  if (!b_contig_writer_.Open(aligned_contigs_bam_path)) {    \n    std::cerr << \"ERROR: could not open aligned contig writer \" <<\n      aligned_contigs_bam_path << std::endl;\n    exit(EXIT_FAILURE);\n  }\n  b_contig_writer_.WriteHeader();\n  \n  \n}\n\nvoid SvabaOutputWriter::writeUnit(svabaThreadUnit& unit,\n\t\t\t\t  SvabaSharedConfig& sc) {\n\n  // SvABA2.0: stamp a comma-joined aux tag on any record whose\n  // UniqueName (svabaRead) or Qname (bwa-aligned corrected record)\n  // appears in one of the thread-unit maps. The svabaRead pointer\n  // path already tagged weird/discordant records during the r2c and\n  // BP-finalization passes, but the corrected records are newly-\n  // aligned by bwa and need tagging here. We apply uniformly so the\n  // tag is present in every tagged BAM.\n  //\n  //   bi:Z — bp_ids of variants this read supports as ALT (subset,\n  //          v3 — pre-v3 this was cnames; switched to bp_ids so the\n  //          tag matches the per-BP resolution of r2c.txt.gz's\n  //          split_bps / disc_bps columns and bps.txt.gz's col 52\n  //          bp_id. `samtools view | grep bi:Z:<bp_id>` pulls the\n  //          ALT-supporters for exactly that variant row.)\n  //   bz:Z — cnames of contigs this read r2c'd to (superset; the\n  //          contig-level grouping key. A read may r2c to a contig\n  //          yet not support any of its BPs.)\n  //\n  // A read can appear in both maps at the same time (every\n  // ALT-supporter has an r2c alignment to its contig). The two\n  // tags use different identifier namespaces now: bp_id for bi:Z,\n  // cname for bz:Z. Join back to bps.txt.gz via col 30 (cname) or\n  // col 52 (bp_id) as appropriate.\n  auto stamp_tag = [&](auto& rec, const char* tag,\n                       const std::unordered_map<std::string,std::string>& m,\n                       const std::string& key) {\n    auto it = m.find(key);\n    if (it == m.end() || it->second.empty()) return;\n    std::string cur;\n    rec.GetZTag(tag, cur);\n    const std::string& to_add = it->second;\n    if (cur.empty()) {\n      rec.AddZTag(tag, to_add);\n      return;\n    }\n    // boundary-aware merge/dedupe\n    std::string merged = cur;\n    size_t s = 0;\n    while (s <= to_add.size()) {\n      size_t e = to_add.find(',', s);\n      if (e == std::string::npos) e = to_add.size();\n      std::string tok = to_add.substr(s, e - s);\n      if (!tok.empty()) {\n        bool present = false;\n        size_t pos = 0;\n        while ((pos = merged.find(tok, pos)) != std::string::npos) {\n          const bool left_ok  = (pos == 0) || merged[pos-1] == ',';\n          const bool right_ok = (pos + tok.size() == merged.size()) ||\n                                 merged[pos + tok.size()] == ',';\n          if (left_ok && right_ok) { present = true; break; }\n          pos += tok.size();\n        }\n        if (!present) merged += \",\" + tok;\n      }\n      if (e == to_add.size()) break;\n      s = e + 1;\n    }\n    if (merged != cur) {\n      rec.RemoveTag(tag);\n      rec.AddZTag(tag, merged);\n    }\n  };\n  auto stamp_bi = [&](auto& rec, const std::string& key) {\n    stamp_tag(rec, \"bi\", unit.alt_bp_ids_by_name, key);\n  };\n  auto stamp_bz = [&](auto& rec, const std::string& key) {\n    stamp_tag(rec, \"bz\", unit.all_cnames_by_name, key);\n  };\n\n  // write the weird reads\n  if (sc.opts.dump_weird_reads) {\n\n    auto it = unit.writers.find(\"w\");\n    if (it == unit.writers.end()) {\n      std::cerr << \" BAM writer for weird reads not found\" << std::endl;\n      exit(EXIT_FAILURE);\n    }\n\n    for (const auto& r : unit.all_weird_reads) {\n\n      // stamp bi:Z / bz:Z BEFORE SetQname, while UniqueName is still\n      // the map key we indexed under\n      stamp_bi(*r, r->UniqueName());\n      stamp_bz(*r, r->UniqueName());\n\n      // switch out the qname so it indicates also which BAM it was from\n      r->SetQname(r->UniqueName());\n\n      r->RemoveTag(\"RG\");\n      r->RemoveTag(\"PG\");\n      bool ok = it->second->WriteRecord(*r);\n      if (!ok)\n\tstd::cerr << \"...unable to write weird read record\" << std::endl;\n    }\n  }\n\n  // write the discordant reads\n  if (sc.opts.dump_discordant_reads) {\n    auto it = unit.writers.find(\"d\");\n    if (it == unit.writers.end()) {\n      std::cerr << \" BAM writer for discordant reads not found\" << std::endl;\n    }\n\n    for (const auto& r : unit.all_weird_reads) {\n      if (r->dd > 0) {\n\n\t// stamp bi:Z / bz:Z before qname mangling\n\tstamp_bi(*r, r->UniqueName());\n\tstamp_bz(*r, r->UniqueName());\n\n\t// switch out the qname so it indicates also which BAM it was from\n\tr->SetQname(r->UniqueName());\n\n\t// write it\n\tr->RemoveTag(\"RG\");\n\tr->RemoveTag(\"PG\");\n\tbool ok = it->second->WriteRecord(*r);\n\tif (!ok)\n\t  std::cerr << \"...unable to write discordant read record\" << std::endl;\n      }\n    }\n\n  }\n\n  // write the corrected reads\n  if (sc.opts.dump_corrected_reads) {\n    auto it = unit.writers.find(\"c\");\n    if (it == unit.writers.end()) {\n      std::cerr << \" read found with prefix \" << \" c \" <<\n\t\" that is not in the weird read writers\\n\";\n      exit(EXIT_FAILURE);\n    }\n\n    for (const auto& r : unit.all_corrected_reads) {\n      // corrected records are bwa-aligned BamRecords whose Qname was\n      // set to the original svabaRead UniqueName at alignSequence()\n      // time. That's the key both maps are indexed by.\n      stamp_bi(*r, r->Qname());\n      stamp_bz(*r, r->Qname());\n\n      r->RemoveTag(\"RG\");\n      r->RemoveTag(\"PG\");\n      bool ok = it->second->WriteRecord(*r);\n      if (!ok)\n\tstd::cerr << \"...unable to write corrected read record\" << std::endl;\n    }\n  }\n\n  // SvABA2.0: per-thread r2c.txt.gz write path.\n  //\n  // Happens BEFORE writeMutex_ is acquired because unit.r2c_out_ is a\n  // thread-local gzip stream (not shared across threads) — no coordination\n  // needed, and keeping the gzip deflate out from under the shared mutex\n  // lets all 16 threads compress in parallel, which is the whole point of\n  // the per-thread split (see CLAUDE.md for the full rationale). Mirrors\n  // the per-thread BAM writes above, which also run outside the lock.\n  //\n  // Gated on opts.dump_alignments (--dump-reads) — without it no stream\n  // was opened and we skip both the serialization and the write.\n  if (opts.dump_alignments) {\n    for (const auto& alc : unit.master_alc) {\n      if (alc.hasVariant()) {\n        // printToR2CTsv emits a contig row followed by one row per\n        // r2c-aligned read (already newline-terminated internally),\n        // so no trailing newline here.\n        // r2c_out_ is unique_ptr<ogzstream>, so dereference. It's non-null\n        // here because opts.dump_alignments implies ctor already allocated.\n        *unit.r2c_out_ << alc.printToR2CTsv(bam_header_);\n      }\n    }\n  }\n\n  lock_guard<mutex> guard(writeMutex_); // lock the shared writers\n\n  sc.total_regions_done += unit.processed_since_memory_dump;\n  unit.processed_since_memory_dump = 0;\n\n  // discordant clusters\n  // hardcoding \"false\" for readtracking for simplicity\n  for (const auto& kv : unit.m_disc) {\n    const auto& dc = kv.second;\n    if (dc.valid())\n      os_discordant_ << dc.toFileString(bam_header_, false) << \"\\n\";\n  }\n\n  // write contig alignments to BAM\n  for (auto& i : unit.master_contigs) {\n    bool ok = b_contig_writer_.WriteRecord(*i);\n    assert(ok);\n  }\n\n  // breakpoints\n  for (auto& bp : unit.m_bps) {\n    \n    if ( bp->hasMinimal() )\n      //\t && (bp.confidence != \"NOLOCAL\" || bp.complex_local) )\n      {\n\tos_allbps_ << bp->toFileString(sc.header) << \"\\n\";\n      }\n  }\n  \n  // discordant reads\n  //std::cerr << \" DC \" << unit.all_discordant_reads.size() << std::endl;    \n  // if (opts.dump_discordant_reads) {\n  //   for (const auto& r : unit.all_discordant_reads) {\n  //     bool ok = b_discordant_read_writer_.WriteRecord(*r);\n  //     assert(ok);\n  //   }\n  // }\n\n  // weird reads\n  // if (opts.dump_weird_reads) {\n  //   for (const auto& r : unit.all_weird_reads) {\n  //     bool ok = b_weird_read_writer_.WriteRecord(*r);\n  //     assert(ok);\n  //   }\n  // }\n\n  // // corrected reads\n  // if (opts.dump_corrected_reads) {\n  //   for (const auto& r : unit.all_corrected_reads) {\n  //     bool ok = b_corrected_read_writer_.WriteRecord(*r);\n  //     assert(ok);\n  //   }\n  // }\n\n  // runtime\n  os_runtime_ << unit.ss.str();\n}\n\nvoid SvabaOutputWriter::close() {\n\n  // SvABA2.0: alignments.txt.gz is gone entirely; r2c.txt.gz is per-thread\n  // (closed in svabaThreadUnit's destructor). Nothing to close here for\n  // those outputs.\n  os_allbps_.close();\n  os_discordant_.close();\n  \n  // if (opts.dump_discordant_reads) {\n  //   if (!b_discordant_read_writer_.Close()) {\n  //     std::cerr << \"Unable to close discordant read writer\" << std::endl;\n  //   }\n  // }\n  \n  // if (opts.dump_weird_reads) {\n  //   if (!b_weird_read_writer_.Close()) {\n  //     std::cerr << \"Unable to close weird read writer\" << std::endl;\n  //   }\n  // }\n  \n  // if (opts.dump_corrected_reads) {\n  //   if (!b_corrected_read_writer_.Close()) {\n  //     std::cerr << \"Unable to close corrected read writer\" << std::endl;\n  //   }\n  // }\n  \n  if (!b_contig_writer_.Close()) {\n    std::cerr << \"Unable to close contigs bam writer\" << std::endl;\n  }\n  \n}\n"
  },
  {
    "path": "src/svaba/SvabaOutputWriter.h",
    "content": "// svabaOutputWriter.h\n#pragma once\n\n#include <map>\n#include <string>\n#include <fstream>\n#include \"SvabaThreadUnit.h\"\n#include \"SeqLib/BamWriter.h\"\n#include \"gzstream.h\"\n#include \"SvabaLogger.h\"\n#include \"SvabaOptions.h\"\n\n\nusing std::ofstream;\nstruct SvabaSharedConfig;\n\nstruct SvabaOutputWriter {\n\npublic:\n  \n  SvabaOutputWriter(SvabaLogger& logger_, SvabaOptions& opts_);\n  \n  // call this once at startup:\n  void init(const std::string& analysis_id,\n\t    const SeqLib::BamHeader& b_header);\n\n  // call this from any thread under a lock:\n  void writeUnit(svabaThreadUnit& unit,\n\t\t SvabaSharedConfig& sc);\n\n  void close();\n  \nprivate:\n\n  SvabaLogger&        logger;\n  SvabaOptions&       opts;\n  \n  // SvABA2.0: alignments.txt.gz (pre-rendered ASCII) and the shared\n  // r2c.txt.gz stream used to live here. Both are gone:\n  //   - alignments.txt.gz is removed entirely; its re-plot-able successor\n  //     is r2c.txt.gz (AlignedContig::printToR2CTsv + r2cTsvHeader).\n  //   - r2c.txt.gz is now emitted per-thread by svabaThreadUnit::r2c_out_\n  //     and merged at postprocess time (gzip is concatenation-safe).\n  // The remaining shared streams below are small enough that mutex\n  // contention isn't measurable (bps + cluster-level discordant +\n  // runtime are KB-MB per run).\n  ogzstream           os_allbps_;\n  ogzstream           os_discordant_;\n  ofstream            os_runtime_;\n\n  SeqLib::BamWriter   b_contig_writer_;\n  \n  SeqLib::BamWriter   b_weird_read_writer_;\n  SeqLib::BamWriter   b_discordant_read_writer_;\n  SeqLib::BamWriter   b_corrected_read_writer_;  \n  \n  SeqLib::BamHeader bam_header_;\n  bool                disc_cluster_only_ = false;\n};\n\n"
  },
  {
    "path": "src/svaba/SvabaOverlapAlgorithm.cpp",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n\n// This has been modified (slightly) for svaba\n#include \"SvabaOverlapAlgorithm.h\"\n#include \"ASQG.h\"\n#include <math.h>\n\n// Collect the complete set of overlaps in pOBOut\nstatic const AlignFlags sufPreAF(false, false, false);\nstatic const AlignFlags prePreAF(false, true, true);\nstatic const AlignFlags sufSufAF(true, false, true);\nstatic const AlignFlags preSufAF(true, true, false);\n\n//#define DEBUGOVERLAP 2\n\n// Perform the overlap\nOverlapResult svabaOverlapAlgorithm::overlapRead(const SeqRecord& read, int minOverlap, OverlapBlockList* pOutList) const\n{\n    OverlapResult r;\n    if(static_cast<int>(read.seq.length()) < minOverlap)\n        return r;\n    \n    if(!m_exactModeOverlap)\n      r = overlapReadInexact(read, minOverlap, pOutList);\n    else\n      r = overlapReadExact(read, minOverlap, pOutList);\n    return r;\n}\n\n//\nOverlapResult svabaOverlapAlgorithm::overlapReadInexact(const SeqRecord& read, int minOverlap, OverlapBlockList* pOBOut) const\n{\n    OverlapResult result;\n    OverlapBlockList obWorkingList;\n    std::string seq = read.seq.toString();\n\n#ifdef DEBUGOVERLAP\n    std::cout << \"\\n\\n***Overlapping read \" << read.id << \" suffix\\n\";\n    std::cout << \"***Overlapping seq \" << read.seq.toString() << \" suffix\\n\";\n#endif\n\n    // Match the suffix of seq to prefixes\n\n    // findInexact returns false is the maximum search time was exceeded. In this\n    // case we dont run any of the subsequent commands and return no overlaps.\n    bool valid = true;\n\n    valid = findOverlapBlocksInexact(seq, m_pBWT, m_pRevBWT, sufPreAF, \n                                 minOverlap, &obWorkingList, pOBOut, result);\n\n#ifdef DEBUGOR\n    size_t block_size = pOBOut->size();\n    if (block_size != pOBOut->size()) {\n      align1 = true;\n      std::cout << \"1\";//<< std::endl;\n      block_size = pOBOut->size();\n    }\n#endif\n\n    if(valid)\n       valid = findOverlapBlocksInexact(complement(seq), m_pRevBWT, m_pBWT, prePreAF, \n                                      minOverlap, &obWorkingList, pOBOut, result);\n\n#ifdef DEBUGOR\n    if (block_size != pOBOut->size()) {\n      std::cout << \"2\";// << std::endl;\n      block_size = pOBOut->size();\n     }\n#endif\n\n#ifdef DEBUGOVERLAP\n    std::cout << \"WORKING OverlapBlockList Length SUFFIX: \" << obWorkingList.size() << \" VALID \" << valid << std::endl;\n#endif       \n\n    if(valid)\n    {\n        if(m_bIrreducible)\n        {\n            computeIrreducibleBlocks(m_pBWT, m_pRevBWT, &obWorkingList, pOBOut);\n            obWorkingList.clear();\n        }\n        else\n        {\n            pOBOut->splice(pOBOut->end(), obWorkingList);\n            assert(obWorkingList.empty());\n        }\n    }\n\n#ifdef DEBUGOVERLAP\n    std::cout << \"\\n\\n***Overlapping read \" << read.id << \" prefix\\n\";\n#endif\n\n    // Match the prefix of seq to suffixes\n    if(valid)\n        valid = findOverlapBlocksInexact(reverseComplement(seq), m_pBWT, m_pRevBWT, sufSufAF, minOverlap, &obWorkingList, pOBOut, result);\n    \n#ifdef DEBUGOR\n     if (block_size != pOBOut->size()) {\n       std::cout << \"3\";// << std::endl;\n       block_size = pOBOut->size();\n     }\n#endif\n\n    if(valid)\n        valid = findOverlapBlocksInexact(reverse(seq), m_pRevBWT, m_pBWT, preSufAF, minOverlap, &obWorkingList, pOBOut, result);\n\n#ifdef DEBUGOR\n     if (block_size != pOBOut->size()) {\n       std::cout << \"4\";// << std::endl;\n       block_size = pOBOut->size();\n     }\n     std::cout<<std::endl;\n#endif \n\n#ifdef DEBUGOVERLAP\n    std::cout << \"WORKING OverlapBlockList Length PREFIX: \" << obWorkingList.size() << std::endl;\n#endif\n\n    if(valid)\n    {\n        if(m_bIrreducible)\n        {\n            computeIrreducibleBlocks(m_pBWT, m_pRevBWT, &obWorkingList, pOBOut);\n            obWorkingList.clear();\n        }\n        else\n        {\n            pOBOut->splice(pOBOut->end(), obWorkingList);\n            assert(obWorkingList.empty());\n        }\n\t}\n    \n    if(!valid)\n    {\n        pOBOut->clear();\n        result.isSubstring = false;\n        result.searchAborted = true;\n        return result;\n    }\n\n#ifdef DEBUGOVERLAP\n     unsigned N = 1;\n     if (pOBOut->size() > N)\n      {\n\tstd::cout << read.id << \" OverlapBlockList Length: \" << pOBOut->size() << std::endl;\n\tstd::list<OverlapBlock>::iterator it = pOBOut->begin();\n\tstd::advance(it, N);\n        //std::cout << \"Olen: \" << it->overlapLen << \" numDiff: \" << it->numDiff << std::endl;\n        std::cout << \" BWT1L: \" << it->ranges.interval[0].lower;\n        std::cout << \" BWT1U: \" << it->ranges.interval[0].upper;\n        std::cout << \" BWT2L: \" << it->ranges.interval[1].lower;\n        std::cout << \" BWT2U: \" << it->ranges.interval[1].upper;\n        std::cout << \" RBWT1L: \" << it->rawRanges.interval[0].lower;\n        std::cout << \" RBWT1U: \" << it->rawRanges.interval[0].upper;\n        std::cout << \" RBWT2L: \" << it->rawRanges.interval[1].lower;\n        std::cout << \" RBWT2U: \" << it->rawRanges.interval[1].upper << std::endl;\n      }\n#endif\n\n\n    return result;\n}\n\n//\nOverlapResult svabaOverlapAlgorithm::alignReadDuplicate(const SeqRecord& read, OverlapBlockList* pOBOut) const\n{\n    OverlapResult result;\n    OverlapBlockList obWorkingList;\n    std::string seq = read.seq.toString();\n    int readLength = seq.length();\n\n    findOverlapBlocksInexact(seq, m_pBWT, m_pRevBWT, sufPreAF, readLength, &obWorkingList, pOBOut, result);\n    findOverlapBlocksInexact(complement(seq), m_pRevBWT, m_pBWT, prePreAF, readLength, &obWorkingList, pOBOut, result);\n    return result;\n}\n\n\n// Construct the set of blocks describing irreducible overlaps with READ\n// and write the blocks to pOBOut\nOverlapResult svabaOverlapAlgorithm::overlapReadExact(const SeqRecord& read, int minOverlap, OverlapBlockList* pOBOut) const\n{\n    OverlapResult result;\n    // The complete set of overlap blocks are collected in obWorkingList\n    // The filtered set (containing only irreducible overlaps) are placed into pOBOut\n    // by calculateIrreducibleHits\n    OverlapBlockList obWorkingList;\n    std::string seq = read.seq.toString();\n\n    // We store the various overlap blocks using a number of lists, one for the containments\n    // in the forward and reverse index and one for each set of overlap blocks\n    OverlapBlockList oblFwdContain;\n    OverlapBlockList oblRevContain;\n    \n    OverlapBlockList oblSuffixFwd;\n    OverlapBlockList oblSuffixRev;\n    OverlapBlockList oblPrefixFwd;\n    OverlapBlockList oblPrefixRev;\n\n    // Match the suffix of seq to prefixes\n    findOverlapBlocksExact(seq, m_pBWT, m_pRevBWT, sufPreAF, minOverlap, &oblSuffixFwd, &oblFwdContain, result);\n    findOverlapBlocksExact(complement(seq), m_pRevBWT, m_pBWT, prePreAF, minOverlap, &oblSuffixRev, &oblRevContain, result);\n\n    // Match the prefix of seq to suffixes\n    findOverlapBlocksExact(reverseComplement(seq), m_pBWT, m_pRevBWT, sufSufAF, minOverlap, &oblPrefixFwd, &oblFwdContain, result);\n    findOverlapBlocksExact(reverse(seq), m_pRevBWT, m_pBWT, preSufAF, minOverlap, &oblPrefixRev, &oblRevContain, result);\n\n    // Remove submaximal blocks for each block list including fully contained blocks\n    // Copy the containment blocks into the prefix/suffix lists\n    oblSuffixFwd.insert(oblSuffixFwd.end(), oblFwdContain.begin(), oblFwdContain.end());\n    oblPrefixFwd.insert(oblPrefixFwd.end(), oblFwdContain.begin(), oblFwdContain.end());\n    oblSuffixRev.insert(oblSuffixRev.end(), oblRevContain.begin(), oblRevContain.end());\n    oblPrefixRev.insert(oblPrefixRev.end(), oblRevContain.begin(), oblRevContain.end());\n    \n    // Perform the submaximal filter\n    removeSubMaximalBlocks(&oblSuffixFwd, m_pBWT, m_pRevBWT);\n    removeSubMaximalBlocks(&oblPrefixFwd, m_pBWT, m_pRevBWT);\n    removeSubMaximalBlocks(&oblSuffixRev, m_pRevBWT, m_pBWT);\n    removeSubMaximalBlocks(&oblPrefixRev, m_pRevBWT, m_pBWT);\n    \n    // Remove the contain blocks from the suffix/prefix lists\n    removeContainmentBlocks(seq.length(), &oblSuffixFwd);\n    removeContainmentBlocks(seq.length(), &oblPrefixFwd);\n    removeContainmentBlocks(seq.length(), &oblSuffixRev);\n    removeContainmentBlocks(seq.length(), &oblPrefixRev);\n\n    // Join the suffix and prefix lists\n    oblSuffixFwd.splice(oblSuffixFwd.end(), oblSuffixRev);\n    oblPrefixFwd.splice(oblPrefixFwd.end(), oblPrefixRev);\n\n    // Move the containments to the output list\n    pOBOut->splice(pOBOut->end(), oblFwdContain);\n    pOBOut->splice(pOBOut->end(), oblRevContain);\n\n    // Filter out transitive overlap blocks if requested\n    if(m_bIrreducible)\n    {\n        computeIrreducibleBlocks(m_pBWT, m_pRevBWT, &oblSuffixFwd, pOBOut);\n        computeIrreducibleBlocks(m_pBWT, m_pRevBWT, &oblPrefixFwd, pOBOut);\n    }\n    else\n    {\n        pOBOut->splice(pOBOut->end(), oblSuffixFwd);\n        pOBOut->splice(pOBOut->end(), oblPrefixFwd);\n    }\n\n    return result;\n}\n\n// Write overlap results to an ASQG file\nvoid svabaOverlapAlgorithm::writeResultASQG(std::ostream& writer, const SeqRecord& read, const OverlapResult& result) const\n{\n    ASQG::VertexRecord record(read.id, read.seq.toString());\n    record.setSubstringTag(result.isSubstring);\n    record.write(writer);\n}\n\n// Write overlap blocks out to a file\nvoid svabaOverlapAlgorithm::writeOverlapBlocks(std::ostream& writer, size_t readIdx, bool isSubstring, const OverlapBlockList* pList) const\n{\n\n    // Write the header info\n    size_t numBlocks = pList->size();\n    writer << readIdx << \" \" << isSubstring << \" \" << numBlocks << \" \";\n    //std::cout << readIdx << \" \" << isSubstring << \" \" << numBlocks << \" \";\n    //std::cout << \"<Wrote> idx: \" << count << \" count: \" << numBlocks << \"\\n\";\n    for(OverlapBlockList::const_iterator iter = pList->begin(); iter != pList->end(); ++iter)\n    {\n        writer << *iter << \" \";\n\t//std::cout << *iter << \" \";\n    }\n    writer << \"\\n\";\n    //std::cout << \"\\n\";\n}\n\n//JEREMIAH\nvoid svabaOverlapAlgorithm::writeOverlapBlocks(std::stringstream& writer, size_t readIdx, bool isSubstring, const OverlapBlockList* pList) const\n{\n    // Write the header info\n    size_t numBlocks = pList->size();\n    writer << readIdx << \" \" << isSubstring << \" \" << numBlocks << \" \";\n    //std::cout << readIdx << \" \" << isSubstring << \" \" << numBlocks << \" \";\n    for(OverlapBlockList::const_iterator iter = pList->begin(); iter != pList->end(); ++iter)\n    {\n        writer << *iter << \" \";\n\t//std::cout << *iter << \" \";\n    }\n    writer << \"\\n\";\n    //std::cout << \"\\n\";\n}\n\n\n// Calculate the ranges in pBWT that contain a prefix of at least minOverlap basepairs that\n// overlaps with a suffix of w. The ranges are added to the pOBList\nvoid svabaOverlapAlgorithm::findOverlapBlocksExact(const std::string& w, const BWT* pBWT,\n                                              const BWT* pRevBWT, const AlignFlags& af, int minOverlap,\n                                              OverlapBlockList* pOverlapList, OverlapBlockList* pContainList, \n                                              OverlapResult& result) const\n{\n    // The algorithm is as follows:\n    // We perform a backwards search using the FM-index for the string w.\n    // As we perform the search we collect the intervals \n    // of the significant prefixes (len >= minOverlap) that overlap w.\n    BWTIntervalPair ranges;\n    size_t l = w.length();\n    int start = l - 1;\n    BWTAlgorithms::initIntervalPair(ranges, w[start], pBWT, pRevBWT);\n    \n    // Collect the OverlapBlocks\n    for(size_t i = start - 1; i >= 1; --i)\n    {\n        // Compute the range of the suffix w[i, l]\n        BWTAlgorithms::updateBothL(ranges, w[i], pBWT);\n        int overlapLen = l - i;\n        if(overlapLen >= minOverlap)\n        {\n            // Calculate which of the prefixes that match w[i, l] are terminal\n            // These are the proper prefixes (they are the start of a read)\n            BWTIntervalPair probe = ranges;\n            BWTAlgorithms::updateBothL(probe, '$', pBWT);\n            \n            // The probe interval contains the range of proper prefixes\n            if(probe.interval[1].isValid())\n            {\n                assert(probe.interval[1].lower > 0);\n                pOverlapList->push_back(OverlapBlock(probe, ranges, overlapLen, 0, af));\n            }\n        }\n    }\n\n    // Determine if this sequence is contained and should not be processed further\n    BWTAlgorithms::updateBothL(ranges, w[0], pBWT);\n\n    // Ranges now holds the interval for the full-length read\n    // To handle containments, we output the overlapBlock to the final overlap block list\n    // and it will be processed later\n    // Two possible containment cases:\n    // 1) This read is a substring of some other read\n    // 2) This read is identical to some other read\n    \n    // Case 1 is indicated by the existance of a non-$ left or right hand extension\n    // In this case we return no alignments for the string\n    AlphaCount64 left_ext = BWTAlgorithms::getExtCount(ranges.interval[0], pBWT);\n    AlphaCount64 right_ext = BWTAlgorithms::getExtCount(ranges.interval[1], pRevBWT);\n    if(left_ext.hasDNAChar() || right_ext.hasDNAChar())\n    {\n        result.isSubstring = true;\n    }\n    else\n    {\n        BWTIntervalPair probe = ranges;\n        BWTAlgorithms::updateBothL(probe, '$', pBWT);\n        if(probe.isValid())\n        {\n            // terminate the contained block and add it to the contained list\n            BWTAlgorithms::updateBothR(probe, '$', pRevBWT);\n            assert(probe.isValid());\n            pContainList->push_back(OverlapBlock(probe, ranges, w.length(), 0, af));\n        }\n    }\n\n    //OverlapBlockList containedWorkingList;\n    //partitionBlockList(w.length(), &workingList, pOverlapList, &containedWorkingList);\n    \n    // Terminate the contained blocks\n    //terminateContainedBlocks(containedWorkingList);\n    \n    // Move the contained blocks to the final contained list\n    //pContainList->splice(pContainList->end(), containedWorkingList);\n\n    return;\n}\n\n// Seeded blockwise BWT alignment of prefix-suffix for reads\n// Each alignment is given a seed region and a block region\n// The seed region is the terminal portion of w where maxDiff + 1 seeds are created\n// at least 1 of these seeds must align exactly for there to be an alignment with \n// at most maxDiff differences between the prefix/suffix. Only alignments within the\n// range [block_start, block_end] are output. The block_end coordinate is inclusive.\nbool svabaOverlapAlgorithm::findOverlapBlocksInexact(const std::string& w, const BWT* pBWT, \n                                                const BWT* pRevBWT, const AlignFlags& af, int minOverlap,\n                                                OverlapBlockList* pOverlapList, OverlapBlockList* pContainList, \n                                                OverlapResult& result) const\n{\n    int len = w.length();\n    int overlap_region_left = len - minOverlap;\n    SearchSeedVector* pCurrVector = new SearchSeedVector;\n    SearchSeedVector* pNextVector = new SearchSeedVector;\n    OverlapBlockList workingList;\n    SearchSeedVector::iterator iter;\n\n    // Create and extend the initial seeds\n    int actual_seed_length = m_seedLength;\n    int actual_seed_stride = m_seedStride;\n#ifdef DEBUGOVERLAP\n    std::cout << \"SeedLen: \" << m_seedLength << \" SeedStride: \" << m_seedStride << std::endl;\n#endif\n\n    if(actual_seed_length == 0)\n    {\n        // Calculate a seed length and stride that will guarantee all overlaps\n        // with error rate m_errorRate will be found\n        calculateSeedParameters(w, minOverlap, actual_seed_length, actual_seed_stride);\n    }\n\n    assert(actual_seed_stride != 0);\n\n    createSearchSeeds(w, pBWT, pRevBWT, actual_seed_length, actual_seed_stride, pCurrVector);\n#ifdef DEBUGOVERLAP\n    std::cout << \"SeedVectorLen: \" << pCurrVector->size() << std::endl;\n#endif\n    extendSeedsExactRight(w, pBWT, pRevBWT, ED_RIGHT, pCurrVector, pNextVector);\n    pCurrVector->clear();\n    pCurrVector->swap(*pNextVector);\n    assert(pNextVector->empty());\n\n    int num_steps = 0;\n\n    // Perform the inexact extensions\n    bool fail = false;\n    while(!pCurrVector->empty())\n    {\n        if(m_maxSeeds != -1 && (int)pCurrVector->size() > m_maxSeeds)\n        {\n            fail = true;\n            break;\n        }\n\n        iter = pCurrVector->begin();\n        while(iter != pCurrVector->end())\n        {\n            SearchSeed& align = *iter;\n\n            // If the current aligned region is right-terminal\n            // and the overlap is greater than minOverlap, try to find overlaps\n            // or containments\n            if(align.right_index == len - 1)\n            {\n                double align_error = align.calcErrorRate();\n\n                // Check for overlaps\n                if(align.left_index <= overlap_region_left && isErrorRateAcceptable(align_error, m_errorRate))\n                {\n                    int overlapLen = len - align.left_index;\n                    BWTIntervalPair probe = align.ranges;\n                    BWTAlgorithms::updateBothL(probe, '$', pBWT);\n                    \n\n\n                    // The probe interval contains the range of proper prefixes\n                    if(probe.interval[1].isValid())\n                    {\n                        assert(probe.interval[1].lower > 0);\n                        OverlapBlock nBlock(probe, align.ranges, overlapLen, align.z, af, align.historyLink->getHistoryVector());\n                        workingList.push_back(nBlock);\n                    }\n                }\n\n                // Check for containments\n                // If the seed is left-terminal and there are [ACGT] left/right extensions of the sequence\n                // this read must be a substring of another read\n                if(align.left_index == 0)\n                {\n                    AlphaCount64 left_ext = BWTAlgorithms::getExtCount(align.ranges.interval[0], pBWT);\n                    AlphaCount64 right_ext = BWTAlgorithms::getExtCount(align.ranges.interval[1], pRevBWT);\n                    if(left_ext.hasDNAChar() || right_ext.hasDNAChar())\n                        result.isSubstring = true;\n                }\n            }\n\n            // Extend the seed to the right/left\n            if(align.dir == ED_RIGHT)\n                extendSeedInexactRight(align, w, pBWT, pRevBWT, pNextVector);\n            else\n                extendSeedInexactLeft(align, w, pBWT, pRevBWT, pNextVector);\n            ++iter;\n            //pCurrVector->erase(iter++);\n        }\n        pCurrVector->clear();\n        assert(pCurrVector->empty());\n        pCurrVector->swap(*pNextVector);\n\n        // Remove identical seeds after we have performed seed_len steps\n        // as there now might be redundant seeds\n        if(num_steps % actual_seed_stride == 0)\n        {\n            std::sort(pCurrVector->begin(), pCurrVector->end(), SearchSeed::compareLeftRange);\n            SearchSeedVector::iterator end_iter = std::unique(pCurrVector->begin(), pCurrVector->end(), \n                                                                   SearchSeed::equalLeftRange);\n            pCurrVector->resize(end_iter - pCurrVector->begin());\n        }\n        ++num_steps;\n    }\n\n    if(!fail)\n    {\n        // parse the working list to remove any submaximal overlap blocks\n        // these blocks correspond to reads that have multiple valid overlaps. \n        // we only keep the longest\n        removeSubMaximalBlocks(&workingList, pBWT, pRevBWT);\n\n        OverlapBlockList containedWorkingList;\n        partitionBlockList(len, &workingList, pOverlapList, &containedWorkingList);\n        \n        // Terminate the contained blocks\n        terminateContainedBlocks(containedWorkingList);\n        \n        // Move the contained blocks to the final contained list\n        pContainList->splice(pContainList->end(), containedWorkingList);\n    }\n\n    delete pCurrVector;\n    delete pNextVector;\n    return !fail;\n}\n\n// Build forward history for the blocks\nvoid svabaOverlapAlgorithm::buildForwardHistory(OverlapBlockList* pList) const\n{\n    OverlapBlockList terminalList;\n    OverlapBlockList potentialContainedList;\n    while(!pList->empty())\n    {\n        // The terminalBlock list contains all the blocks that became right-terminal\n        // in the current extension round.\n\n        // Perform a single round of extension, any terminal blocks\n        // are moved to the terminated list\n        extendActiveBlocksRight(m_pBWT, m_pRevBWT, *pList, terminalList, potentialContainedList);\n    }\n    *pList = terminalList;\n    pList->splice(pList->end(), potentialContainedList);\n}\n\n// Calculate the single right extension to the '$' for each the contained blocks\n// so that the interval ranges are consistent\nvoid svabaOverlapAlgorithm::terminateContainedBlocks(OverlapBlockList& containedBlocks) const\n{\n    for(OverlapBlockList::iterator iter = containedBlocks.begin(); iter != containedBlocks.end(); ++iter)\n        BWTAlgorithms::updateBothR(iter->ranges, '$', iter->getExtensionBWT(m_pBWT, m_pRevBWT));\n}\n\n// Calculate the seed length and stride to ensure that we will find all \n// all overlaps with error rate at most m_errorRate.\n// To overlap two reads allowing for d errors, we create d+1 seeds so that at least one seed will match\n// exactly. d is a function of the overlap length so we define the seed length using the minimum overlap\n// parameter. We then tile seeds across the read starting from the end such that for every overlap length\n// x, there are at least floor(x * error_rate) + 1 seeds.\nvoid svabaOverlapAlgorithm::calculateSeedParameters(const std::string& w, const int minOverlap, int& seed_length, int& seed_stride) const\n{\n    int read_len = w.length();\n    seed_length = 0;\n    \n    // The maximum possible number of differences occurs for a fully-aligned read\n    int max_diff_high = static_cast<int>(m_errorRate * read_len);\n\n    // Calculate the seed length to use\n    // If the error rate is so low that no differences are possible just seed\n    // over the entire minOverlap region\n    if(max_diff_high > 0)\n    {\n        // Calculate the maximum number of differences between two sequences that overlap\n        // by minOverlap\n        int max_diff_low = static_cast<int>(m_errorRate * minOverlap);\n\n         if(max_diff_low == 0)\n            max_diff_low = 1;\n         \n         int seed_region_length = static_cast<int>(ceil(max_diff_low / m_errorRate));\n         int num_seeds_low = max_diff_low + 1;\n         seed_length = static_cast<int>(seed_region_length / num_seeds_low);\n         if(seed_length > static_cast<int>(minOverlap))\n            seed_length = minOverlap;\n    }\n    else\n    {\n        seed_length = minOverlap;\n    }\n    seed_stride = seed_length;    \n}\n\n// Create and intialize the search seeds\nint svabaOverlapAlgorithm::createSearchSeeds(const std::string& w, const BWT* pBWT, \n                                        const BWT* pRevBWT, int seed_length, int seed_stride,\n                                        SearchSeedVector* pOutVector) const\n{\n    // Start a new chain of history links\n    SearchHistoryLink rootLink = SearchHistoryNode::createRoot();\n\n    // The maximum possible number of differences occurs for a fully-aligned read\n    int read_len = w.length();\n    int max_diff_high = static_cast<int>(m_errorRate * read_len);\n\n    // Start the seeds at the end of the read\n    int seed_start = read_len - seed_length;\n\n    while(seed_start >= 0)\n    {\n        SearchSeed seed;\n        seed.left_index = seed_start;\n        seed.right_index = seed_start;\n        seed.dir = ED_RIGHT;\n        seed.seed_len = seed_length;\n        seed.z = 0;\n        seed.maxDiff = max_diff_high;\n        seed.historyLink = rootLink;\n\n        // Initialize the left and right suffix array intervals\n        char b = w[seed.left_index];\n        BWTAlgorithms::initIntervalPair(seed.ranges, b, pBWT, pRevBWT);        \n        pOutVector->push_back(seed);\n\n        seed_start -= seed_stride;\n        \n        // Only create one seed in the exact case\n        if(max_diff_high == 0)\n            break;\n    }\n    return seed_length;\n}\n\n// Extend all the seeds in pInVector to the right over the entire seed range\nvoid svabaOverlapAlgorithm::extendSeedsExactRightQueue(const std::string& w, const BWT* /*pBWT*/, const BWT* pRevBWT,\n                                             ExtendDirection /*dir*/, const SearchSeedVector* pInVector, \n                                             SearchSeedQueue* pOutQueue) const\n{\n    for(SearchSeedVector::const_iterator iter = pInVector->begin(); iter != pInVector->end(); ++iter)\n    {\n        SearchSeed align = *iter;\n        bool valid = true;\n        while(align.isSeed())\n        {\n            ++align.right_index;\n            char b = w[align.right_index];\n            BWTAlgorithms::updateBothR(align.ranges, b, pRevBWT);\n            if(!align.isIntervalValid(RIGHT_INT_IDX))\n            {\n                valid = false;\n                break;\n            }\n        }\n\n        if(valid)\n            pOutQueue->push(align);\n    }\n}\n\n// Extend all the seeds in pInVector to the right over the entire seed range\nvoid svabaOverlapAlgorithm::extendSeedsExactRight(const std::string& w, const BWT* /*pBWT*/, const BWT* pRevBWT,\n                                             ExtendDirection /*dir*/, const SearchSeedVector* pInVector, \n                                             SearchSeedVector* pOutVector) const\n{\n    for(SearchSeedVector::const_iterator iter = pInVector->begin(); iter != pInVector->end(); ++iter)\n    {\n        SearchSeed align = *iter;\n        bool valid = true;\n        while(align.isSeed())\n        {\n            ++align.right_index;\n            char b = w[align.right_index];\n            BWTAlgorithms::updateBothR(align.ranges, b, pRevBWT);\n            if(!align.isIntervalValid(RIGHT_INT_IDX))\n            {\n                valid = false;\n                break;\n            }\n        }\n\n        //std::cout << \"Initial seed: \";\n        //align.print(w);\n\n        if(valid)\n            pOutVector->push_back(align);\n    }\n}\n\n//\nvoid svabaOverlapAlgorithm::extendSeedInexactRight(SearchSeed& seed, const std::string& w, const BWT* /*pBWT*/, \n                                              const BWT* pRevBWT, SearchSeedVector* pOutVector) const\n{\n    // If this alignment has run all the way to the end of the sequence\n    // switch it to be a left extension sequence\n    if(seed.right_index == int(w.length() - 1))\n    {\n        seed.dir = ED_LEFT;\n        pOutVector->push_back(seed);\n        return;\n    }\n\n    ++seed.right_index;\n    \n    if(!seed.allowMismatches())\n    {\n        char b = w[seed.right_index];\n        BWTAlgorithms::updateBothR(seed.ranges, b, pRevBWT);\n        if(seed.isIntervalValid(RIGHT_INT_IDX))\n            pOutVector->push_back(seed);\n    }\n    else\n    {\n        // Calculating the AlphaCounts is the heavy part of the computation so we cache\n        // the value outside the loop, it is the same for all bases\n        AlphaCount64 lower = pRevBWT->getFullOcc(seed.ranges.interval[1].lower - 1);\n        AlphaCount64 upper = pRevBWT->getFullOcc(seed.ranges.interval[1].upper);\n        for(int i = 0; i < 4; ++i)\n        {\n            char b = ALPHABET[i];    \n            BWTIntervalPair probe = seed.ranges;\n            BWTAlgorithms::updateBothR(probe, b, pRevBWT, lower, upper);\n            if(probe.interval[RIGHT_INT_IDX].isValid())\n            {\n                SearchSeed branched = seed;\n                branched.ranges = probe;\n                if(b != w[seed.right_index])\n                {\n                    ++branched.z;\n                    branched.historyLink = seed.historyLink->createChild(w.length() - seed.right_index, b);\n                }\n                pOutVector->push_back(branched);\n            }\n        }\n    }\n}\n\n//\nvoid svabaOverlapAlgorithm::extendSeedInexactLeft(SearchSeed& seed, const std::string& w, \n                                             const BWT* pBWT, const BWT* /*pRevBWT*/,\n                                             SearchSeedVector* pOutVector) const\n{\n    //printf(\"ProcessingLEFT: \"); align.print(w);\n    --seed.left_index;\n    if(seed.left_index >= 0)\n    {\n        if(!seed.allowMismatches())\n        {\n            // Extend exact\n            char b = w[seed.left_index];\n            BWTAlgorithms::updateBothL(seed.ranges, b, pBWT);\n            if(seed.isIntervalValid(LEFT_INT_IDX))\n                pOutVector->push_back(seed);\n        }\n        else\n        {\n            // Calculating the AlphaCounts is the heavy part of the computation so we cache\n            // the value outside the loop, it is the same for all bases\n            AlphaCount64 lower = pBWT->getFullOcc(seed.ranges.interval[0].lower - 1);\n            AlphaCount64 upper = pBWT->getFullOcc(seed.ranges.interval[0].upper);\n            for(int i = 0; i < 4; ++i)\n            {\n                char b = ALPHABET[i];\n                BWTIntervalPair probe = seed.ranges;\n                BWTAlgorithms::updateBothL(probe, b, pBWT, lower, upper);\n                if(probe.interval[LEFT_INT_IDX].isValid())\n                {\n                    SearchSeed branched = seed;\n                    branched.ranges = probe;\n                    if(b != w[seed.left_index])\n                    {\n                        ++branched.z;\n                        // The history coordinates are wrt the right end of the read\n                        // so that each position corresponds to the length of the overlap\n                        // including that position        \n                        branched.historyLink = seed.historyLink->createChild(w.length() - seed.left_index, b);                \n                        //branched.history.add(w.length() - seed.left_index, b);\n                    }\n                    pOutVector->push_back(branched);\n                }\n            }\n        }\n    }\n}\n\n// Extend the seed to the right, return true if the seed is still a valid range\nbool svabaOverlapAlgorithm::extendSeedExactRight(SearchSeed& seed, const std::string& w, const BWT* /*pBWT*/, const BWT* pRevBWT) const\n{\n    // If this alignment has run all the way to the end of the sequence\n    // switch it to be a left extension sequence\n    if(seed.right_index == int(w.length() - 1))\n    {\n        seed.dir = ED_LEFT;\n        return true;\n    }\n\n    ++seed.right_index;\n    char b = w[seed.right_index];\n    BWTAlgorithms::updateBothR(seed.ranges, b, pRevBWT);\n    if(seed.isIntervalValid(RIGHT_INT_IDX))\n        return true;\n    else\n        return false;\n}\n\n//\nbool svabaOverlapAlgorithm::extendSeedExactLeft(SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* /*pRevBWT*/) const\n{\n    --seed.left_index;\n    if(seed.left_index >= 0)\n    {\n        char b = w[seed.left_index];\n        BWTAlgorithms::updateBothL(seed.ranges, b, pBWT);\n        if(seed.isIntervalValid(LEFT_INT_IDX))\n            return true;\n        else\n            return false;\n    }\n    else\n    {\n        return false;\n    }\n}\n\n// Calculate the irreducible blocks from the vector of OverlapBlocks\nvoid svabaOverlapAlgorithm::computeIrreducibleBlocks(const BWT* pBWT, const BWT* pRevBWT, \n                                                OverlapBlockList* pOBList, \n                                                OverlapBlockList* pOBFinal) const\n{\n    // processIrreducibleBlocks requires the pOBList to be sorted in descending order\n    pOBList->sort(OverlapBlock::sortSizeDescending);\n\n#ifdef DEBUGOVERLAP\n\tstd::cout << \" m_exactModeIrreducible \" << m_exactModeIrreducible << \"\\n\";\n#endif       \n\n    if(m_exactModeIrreducible)\n        _processIrreducibleBlocksExactIterative(pBWT, pRevBWT, *pOBList, pOBFinal);\n    else\n        _processIrreducibleBlocksInexact(pBWT, pRevBWT, *pOBList, pOBFinal);\n    pOBList->clear();\n}\n\n// iterate through obList and determine the overlaps that are irreducible. This function is recursive.\n// The final overlap blocks corresponding to irreducible overlaps are written to pOBFinal.\n// Invariant: the blocks are ordered in descending order of the overlap size so that the longest overlap is first.\n// Invariant: each block corresponds to the same extension of the root sequence w.\nvoid svabaOverlapAlgorithm::_processIrreducibleBlocksExactIterative(const BWT* pBWT, const BWT* pRevBWT, \n                                                               OverlapBlockList& inList, \n                                                               OverlapBlockList* pOBFinal) const\n{\n    if(inList.empty())\n        return;\n    \n    // We store the overlap blocks in groups of blocks that have the same right-extension.\n    // When a branch is found, the groups are split based on the extension\n    typedef std::list<OverlapBlockList> BlockGroups;\n\n    BlockGroups blockGroups;\n    blockGroups.push_back(inList);\n    int numExtensions = 0;\n    int numBranches = 0;\n    while(!blockGroups.empty())\n    {\n        // Perform one extenion round for each group.\n        // If the top-level block has ended, push the result\n        // to the final list and remove the group from processing\n        BlockGroups::iterator groupIter = blockGroups.begin();\n        BlockGroups incomingGroups; // Branched blocks are placed here\n\n        while(groupIter != blockGroups.end())\n        {\n            OverlapBlockList& currList = *groupIter;\n            bool bEraseGroup = false;\n\n            // Count the extensions in the top level (longest) blocks first\n            int topLen = currList.front().overlapLen;\n            AlphaCount64 ext_count;\n            OBLIter blockIter = currList.begin();\n            while(blockIter != currList.end() && blockIter->overlapLen == topLen)\n            {\n                ext_count += blockIter->getCanonicalExtCount(pBWT, pRevBWT);\n                ++blockIter;\n            }\n            \n            // Three cases:\n            // 1) The top level block has ended as it contains the extension $. Output TLB and end.\n            // 2) There is a singular unique extension base for all the blocks. Update the blocks and continue.\n            // 3) There are multiple extension bases, split the block group and continue.\n            // If some block other than the TLB ended, it must be contained within the TLB and it is not output\n            // or considered further. \n            // Likewise if multiple distinct strings in the TLB ended, we only output the top one. The rest\n            // must have the same sequence as the top one and are hence considered to be contained with the top element.\n\n#ifdef DEBUGOVERLAP\n\t    std::cout << \"ext_gcount.get($) \" << ext_count.get('$') << \"\\n\";\n#endif             \n\n            if(ext_count.get('$') > 0)\n            {\n                // An irreducible overlap has been found. It is possible that there are two top level blocks\n                // (one in the forward and reverse direction). Since we can't decide which one\n                // contains the other at this point, we output hits to both. Under a fixed \n                // length string assumption one will be contained within the other and removed later.\n                OBLIter tlbIter = currList.begin();\n                while(tlbIter != currList.end() && tlbIter->overlapLen == topLen)\n                {\n                    // Ensure the tlb is actually terminal and not a substring block\n                    AlphaCount64 test_count = tlbIter->getCanonicalExtCount(pBWT, pRevBWT);\n                    if(test_count.get('$') == 0)\n                    {\n                        std::cerr << \"Error: substring read found during overlap computation.\\n\";\n                        std::cerr << \"Please run sga rmdup before sga overlap\\n\";\n                        exit(EXIT_FAILURE);\n                    }\n                    \n                    // Perform the final right-update to make the block terminal\n                    OverlapBlock branched = *tlbIter;\n                    BWTAlgorithms::updateBothR(branched.ranges, '$', branched.getExtensionBWT(pBWT, pRevBWT));\n                    pOBFinal->push_back(branched);\n#ifdef DEBUGOVERLAP\n                    std::cout << \"[IE] TLB of length \" << branched.overlapLen << \" has ended\\n\";\n                    std::cout << \"[IE]\\tBlock data: \" << branched << \"\\n\";\n#endif             \n                    ++tlbIter;\n                } \n\n                // Set the flag to erase this group, it is finished\n                bEraseGroup = true;\n            }\n            else\n            {\n                // Count the extension for the rest of the blocks\n                while(blockIter != currList.end())\n                {\n                    ext_count += blockIter->getCanonicalExtCount(pBWT, pRevBWT);\n                    ++blockIter;\n                }\n\n                if(ext_count.hasUniqueDNAChar())\n                {\n                    // Update all the blocks using the unique extension character\n                    // This character is in the canonical representation wrt to the query\n                    char b = ext_count.getUniqueDNAChar();\n                    updateOverlapBlockRangesRight(pBWT, pRevBWT, currList, b);\n                    numExtensions++;\n                    bEraseGroup = false;\n                }\n                else\n                {\n                    for(size_t idx = 0; idx < DNA_ALPHABET_SIZE; ++idx)\n                    {\n                        char b = ALPHABET[idx];\n                        if(ext_count.get(b) > 0)\n                        {\n                            numBranches++;\n                            OverlapBlockList branched = currList;\n                            updateOverlapBlockRangesRight(pBWT, pRevBWT, branched, b);\n                            incomingGroups.push_back(branched);\n                            bEraseGroup = true;\n                        }\n                    }\n                }\n            }\n\n            if(bEraseGroup)\n                groupIter = blockGroups.erase(groupIter);\n            else\n                ++groupIter;\n        }\n\n        // Splice in the newly branched blocks, if any\n        blockGroups.splice(blockGroups.end(), incomingGroups);\n    }\n}\n\n// Classify the blocks in obList as irreducible, transitive or substrings. The irreducible blocks are\n// put into pOBFinal. The remaining are discarded.\n// Invariant: the blocks are ordered in descending order of the overlap size so that the longest overlap is first.\nvoid svabaOverlapAlgorithm::_processIrreducibleBlocksInexact(const BWT* pBWT, const BWT* pRevBWT, \n                                                        OverlapBlockList& activeList, \n                                                        OverlapBlockList* pOBFinal) const\n{\n    if(activeList.empty())\n        return;\n\n#ifdef DEBUGOVERLAP\n\tstd::cout << \" activeList.size() \" << activeList.size() << \"\\n\";\n#endif       \n    \n    // The activeList contains all the blocks that are not yet right terminal\n    // Count the extensions in the top level (longest) blocks first\n    bool all_eliminated = false;\n    while(!activeList.empty() && !all_eliminated)\n    {\n        // The terminalBlock list contains all the blocks that became right-terminal\n        // in the current extension round.\n        OverlapBlockList terminalList;\n        OverlapBlockList potentialContainedList;\n\n        // Perform a single round of extension, any terminal blocks\n        // are moved to the terminated list\n        extendActiveBlocksRight(pBWT, pRevBWT, activeList, terminalList, potentialContainedList);\n\n        // Compare the blocks in the contained list against the other terminal and active blocks\n        // If they are a substring match to any of these, discard them\n        OverlapBlockList::iterator containedIter = potentialContainedList.begin();\n        for(; containedIter != potentialContainedList.end(); ++containedIter)\n        {\n           if(!isBlockSubstring(*containedIter, terminalList, m_errorRate) && \n              !isBlockSubstring(*containedIter, activeList, m_errorRate))\n           {\n                // Not a substring, move to terminal list\n                terminalList.push_back(*containedIter);\n                //std::cout << \"Contained block kept: \" << containedIter->overlapLen << \"\\n\";\n           }\n           else\n           {\n                //std::cout << \"Contained block found and removed: \" << containedIter->overlapLen << \"\\n\";\n           }\n        }\n\n        // Using the terminated blocks, mark as eliminated any active blocks\n        // that form a valid overlap to the terminal block. These are transitive edges\n        // We do not compare two terminal blocks, we don't consider these overlaps to be\n        // transitive\n#ifdef DEBUGOVERLAP\n\tstd::cout << \" terminalList.sizee() \" << terminalList.size() << \"\\n\";\n#endif       \n\n        OverlapBlockList::iterator terminalIter = terminalList.begin();\n        for(; terminalIter != terminalList.end(); ++terminalIter)\n        {\n#ifdef DEBUGOVERLAP\n            std::cout << \"[II] ***TLB of length \" << terminalIter->overlapLen << \" has ended\\n\";\n#endif       \n            all_eliminated = true;\n            OverlapBlockList::iterator activeIter = activeList.begin();\n            for(; activeIter != activeList.end(); ++activeIter)\n            {\n                if(activeIter->isEliminated)\n                    continue; // skip previously marked blocks\n                \n                // Two conditions must be met for a block to be transitive wrt terminal:\n                // 1) It must have a strictly shorter overlap than the terminal block\n                // 2) The error rate between the block and terminal must be less than the threshold\n                double inferredErrorRate = calculateBlockErrorRate(*terminalIter, *activeIter);\n                if(activeIter->overlapLen < terminalIter->overlapLen && \n                   isErrorRateAcceptable(inferredErrorRate, m_errorRate))\n                {\n#ifdef DEBUGOVERLAP_2                            \n                    std::cout << \"Marking block of length \" << activeIter->overlapLen << \" as eliminated\\n\";\n#endif\n                    activeIter->isEliminated = true;\n                }\n                else\n                {\n                    all_eliminated = false;\n                }\n            } \n            \n            // Move this block to the final list if it has not been previously marked eliminated\n            if(!terminalIter->isEliminated)\n            {\n#ifdef DEBUGOVERLAP\n                std::cout << \"[II] Adding block \" << *terminalIter << \" to final list\\n\";\n                //std::cout << \"  extension: \" << terminalIter->forwardHistory << \"\\n\";\n#endif                \n                pOBFinal->push_back(*terminalIter);\n            }\n        }\n    }\n\n    activeList.clear();\n}\n\n// Extend all the blocks in activeList by one base to the right\n// Move all right-terminal blocks to the termainl list. If a block \n// is terminal and potentially contained by another block, add it to \n// containedList\nvoid svabaOverlapAlgorithm::extendActiveBlocksRight(const BWT* pBWT, const BWT* pRevBWT, \n                                               OverlapBlockList& activeList, \n                                               OverlapBlockList& terminalList,\n                                               OverlapBlockList& /*containedList*/) const\n{\n    OverlapBlockList::iterator iter = activeList.begin();\n    OverlapBlockList::iterator next;\n    while(iter != activeList.end())\n    {\n        next = iter;\n        ++next;\n\n        // Check if block is terminal\n        AlphaCount64 ext_count = iter->getCanonicalExtCount(pBWT, pRevBWT);\n        if(ext_count.get('$') > 0)\n        {\n            // Only consider this block to be terminal irreducible if it has at least one extension\n            // or else it is a substring block\n            if(iter->forwardHistory.size() > 0)\n            {\n                OverlapBlock branched = *iter;\n                BWTAlgorithms::updateBothR(branched.ranges, '$', branched.getExtensionBWT(pBWT, pRevBWT));\n                terminalList.push_back(branched);\n#ifdef DEBUGOVERLAP_2            \n                std::cout << \"Block of length \" << iter->overlapLen << \" moved to terminal\\n\";\n#endif\n            }\n        }\n\n        int curr_extension = iter->forwardHistory.size();\n\n        // Perform the right extensions\n        \n        // Best case, there is only a single extension character\n        // Handle this case specially so we don't need to copy the potentially\n        // large OverlapBlock structure and its full history\n        if(ext_count.hasUniqueDNAChar())\n        {\n            // Get the extension character with respect to the queried sequence\n            char canonical_base = ext_count.getUniqueDNAChar();\n\n            // Flip the base into the frame of reference for the block\n            char block_base = iter->flags.isQueryComp() ? complement(canonical_base) : canonical_base;\n\n            // Update the block using the base in its frame of reference\n            BWTAlgorithms::updateBothR(iter->ranges, block_base, iter->getExtensionBWT(pBWT, pRevBWT));\n\n            // Add the base to the history in the frame of reference of the query read\n            // This is so the history is consistent when comparing between blocks from different strands\n            iter->forwardHistory.add(curr_extension, canonical_base);\n        }\n        else\n        {\n            for(size_t idx = 0; idx < DNA_ALPHABET_SIZE; ++idx)\n            {\n                char canonical_base = ALPHABET[idx];\n                char block_base = iter->flags.isQueryComp() ? complement(canonical_base) : canonical_base;\n                if(ext_count.get(canonical_base) == 0)\n                    continue;\n\n                // Branch the sequence. This involves copying the entire history which can be large\n                // if the input sequences are very long. This could be avoided by using the SearchHistoyNode/Link\n                // structure but branches are infrequent enough to not have a large impact\n                OverlapBlock branched = *iter;\n                BWTAlgorithms::updateBothR(branched.ranges, block_base, branched.getExtensionBWT(pBWT, pRevBWT));\n                assert(branched.ranges.isValid());\n\n                // Add the base in the canonical frame\n                branched.forwardHistory.add(curr_extension, canonical_base);\n\n                // Insert the new block after the iterator\n                activeList.insert(iter, branched);\n            }\n\n            // Remove the original block, which has been superceded by the branches\n            activeList.erase(iter);\n        }\n\n        iter = next; // this skips the newly-inserted blocks\n    }\n} \n\n// Return true if the terminalBlock is a substring of any member of blockList\nbool svabaOverlapAlgorithm::isBlockSubstring(OverlapBlock& terminalBlock, const OverlapBlockList& blockList, double maxER) const\n{\n    OverlapBlockList::const_iterator iter = blockList.begin();\n    size_t right_extension_length = terminalBlock.forwardHistory.size();\n    for(; iter != blockList.end(); ++iter)\n    {\n        if(terminalBlock.overlapLen == iter->overlapLen && \n           right_extension_length == iter->forwardHistory.size())\n        {\n            continue; // same length, cannot be a substring\n        }\n        \n        // Calculate error rate between blocks\n        double er = calculateBlockErrorRate(terminalBlock, *iter);\n        if(isErrorRateAcceptable(er, maxER))\n            return true;\n    }\n    return false;\n}\n\n// Calculate the error rate between two overlap blocks using their history\ndouble svabaOverlapAlgorithm::calculateBlockErrorRate(const OverlapBlock& terminalBlock, const OverlapBlock& otherBlock) const\n{\n    int back_max = std::min(terminalBlock.overlapLen, otherBlock.overlapLen);\n    int backwards_diff = SearchHistoryVector::countDifferences(terminalBlock.backHistory, otherBlock.backHistory, back_max);\n\n    // We compare the forward (right) extension only up to the last position of the terminated block's extension\n    int forward_len = terminalBlock.forwardHistory.size();\n    int forward_max = forward_len - 1;\n    int forward_diff = SearchHistoryVector::countDifferences(terminalBlock.forwardHistory, otherBlock.forwardHistory, forward_max);\n\n    // Calculate the length of the inferred overlap\n    int trans_overlap_length = back_max + forward_len;\n    double er = static_cast<double>(backwards_diff + forward_diff) / trans_overlap_length;\n            \n#ifdef DEBUGOVERLAP_2\n    std::cout << \"OL: \" << terminalBlock.overlapLen << \"\\n\";\n    std::cout << \"TLB BH: \" << terminalBlock.backHistory << \"\\n\";\n    std::cout << \"TB  BH: \" << otherBlock.backHistory << \"\\n\";\n    std::cout << \"TLB FH: \" << terminalBlock.forwardHistory << \"\\n\";\n    std::cout << \"TB  FH: \" << otherBlock.forwardHistory << \"\\n\";\n    std::cout << \"BM: \" << back_max << \" FM: \" << forward_max << \"\\n\";\n    std::cout << \"IOL: \" << trans_overlap_length << \" TD: \" << (backwards_diff + forward_diff) << \"\\n\";\n    std::cout << \"Block of length \" << otherBlock.overlapLen << \" has ier: \" << er << \"\\n\";\n#endif\n    return er;\n}\n\n// Update the overlap block list with a righthand extension to b, removing ranges that become invalid\nvoid svabaOverlapAlgorithm::updateOverlapBlockRangesRight(const BWT* pBWT, const BWT* pRevBWT, \n                                                     OverlapBlockList& obList, char canonical_base) const\n{\n    OverlapBlockList::iterator iter = obList.begin(); \n    while(iter != obList.end())\n    {\n        char relative_base = iter->flags.isQueryComp() ? complement(canonical_base) : canonical_base;\n        BWTAlgorithms::updateBothR(iter->ranges, relative_base, iter->getExtensionBWT(pBWT, pRevBWT));\n        // remove the block from the list if its no longer valid\n        if(!iter->ranges.isValid())\n        {\n            iter = obList.erase(iter);\n        }\n        else\n        {\n            // Add the base to the extension history\n            int currExtension = iter->forwardHistory.size();\n            iter->forwardHistory.add(currExtension, canonical_base);\n            ++iter;\n        }\n    }\n}\n\n"
  },
  {
    "path": "src/svaba/SvabaOverlapAlgorithm.h",
    "content": "//-----------------------------------------------\n// Copyright 2009 Wellcome Trust Sanger Institute\n// Written by Jared Simpson (js18@sanger.ac.uk)\n// Released under the GPL\n//-----------------------------------------------\n//\n// svabaOverlapAlgorithm - This class implements all the logic\n// for finding and outputting overlaps for sequence reads\n//\n#ifndef SVABA_OVERLAPALGORITHM_H\n#define SVABA_OVERLAPALGORITHM_H\n\n#include \"SuffixTools/BWT.h\"\n#include \"OverlapBlock.h\"\n#include \"OverlapAlgorithm.h\"\n#include \"SearchSeed.h\"\n#include \"BWTAlgorithms.h\"\n#include \"Util.h\"\n\n/*enum OverlapMode\n{\n    OM_OVERLAP,\n    OM_FULLREAD\n};\n\nstruct OverlapResult\n{\n    OverlapResult() : isSubstring(false), searchAborted(false) {}\n    bool isSubstring;\n    bool searchAborted;\n};*/\n\nclass svabaOverlapAlgorithm\n{\n    public:\n\n        svabaOverlapAlgorithm(const BWT* pBWT, const BWT* pRevBWT, \n                         double er, int seedLen, int seedStride,\n                         bool irrOnly, int maxSeeds = -1) : m_pBWT(pBWT), \n                                         m_pRevBWT(pRevBWT),\n                                         m_errorRate(er),\n                                         m_seedLength(seedLen),\n                                         m_seedStride(seedStride),\n                                         m_bIrreducible(irrOnly),\n                                         m_exactModeOverlap(false),\n                                         m_exactModeIrreducible(false),\n                                         m_maxSeeds(maxSeeds) {}\n\n        // Perform the overlap\n        // This function is threaded so everything must be const\n        OverlapResult overlapRead(const SeqRecord& read, int minOverlap, OverlapBlockList* pOutList) const;\n    \n        // Perform an irreducible overlap\n        OverlapResult overlapReadExact(const SeqRecord& read, int minOverlap, OverlapBlockList* pOBOut) const;\n\n        // Find duplicate blocks for this read\n        OverlapResult alignReadDuplicate(const SeqRecord& read, OverlapBlockList* pOBOut) const;\n\n        // Perform an inexact overlap\n        OverlapResult overlapReadInexact(const SeqRecord& read, int minOverlap, OverlapBlockList* pOBOut) const;\n\n        // Write the result of an overlap to an ASQG file\n        void writeResultASQG(std::ostream& writer, const SeqRecord& read, const OverlapResult& result) const;\n\n        // Write all the overlap blocks pList to the filehandle\n        void writeOverlapBlocks(std::ostream& writer, size_t readIdx, bool isSubstring, const OverlapBlockList* pList) const;\n        void writeOverlapBlocks(std::stringstream& writer, size_t readIdx, bool isSubstring, const OverlapBlockList* pList) const; //JEREMIAH\n\n        // Build the forward history structures for the blocks\n        void buildForwardHistory(OverlapBlockList* pList) const;\n\n        // Set flag to use exact-match algorithms only\n        void setExactModeOverlap(bool b) { m_exactModeOverlap = b; }\n        void setExactModeIrreducible(bool b) { m_exactModeIrreducible = b; }\n\n        //\n        const BWT* getBWT() const { return m_pBWT; }\n        const BWT* getRBWT() const { return m_pRevBWT; }\n        \n    private:\n\n        // Calculate the ranges in pBWT that contain a prefix of at least minOverlap basepairs that\n        // overlaps with a suffix of w.\n        void findOverlapBlocksExact(const std::string& w, const BWT* pBWT, const BWT* pRevBWT, \n                                    const AlignFlags& af, const int minOverlap, OverlapBlockList* pOBTemp, \n                                    OverlapBlockList* pOBFinal, OverlapResult& result) const;\n\n        // Same as above while allowing mismatches\n        bool findOverlapBlocksInexact(const std::string& w, const BWT* pBWT, const BWT* pRevBWT, \n                                      const AlignFlags& af, const int minOverlap, OverlapBlockList* pOBList, \n                                      OverlapBlockList* pOBFinal, OverlapResult& result) const;\n\n        //\n        inline bool extendSeedExactRight(SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT) const;\n        inline bool extendSeedExactLeft(SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT) const;\n\n        inline void branchSeedRight(const SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT, SearchSeedQueue* pQueue) const;\n        inline void branchSeedLeft(const SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT, SearchSeedQueue* pQueue) const;\n\n        //\n        inline void extendSeedInexactRight(SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT, \n                                           SearchSeedVector* pOutVector) const;\n\n        //\n        inline void extendSeedInexactLeft(SearchSeed& seed, const std::string& w, const BWT* pBWT, const BWT* pRevBWT,\n                                          SearchSeedVector* pOutVector) const;\n\n\n        //\n        inline void calculateSeedParameters(const std::string& w, const int minOverlap, int& seed_length, int& seed_stride) const;\n        \n        //\n        inline int createSearchSeeds(const std::string& w, const BWT* pBWT, \n                                     const BWT* pRevBWT, int seed_length, int seed_stride, \n                                     SearchSeedVector* pOutVector) const;\n\n        //\n        inline void extendSeedsExactRightQueue(const std::string& w, const BWT* pBWT, const BWT* pRevBWT, \n                                                 ExtendDirection dir, const SearchSeedVector* pInVector, \n                                                 SearchSeedQueue* pOutQueue) const;\n\n        //\n        inline void extendSeedsExactRight(const std::string& w, const BWT* pBWT, const BWT* pRevBWT, \n                                                 ExtendDirection dir, const SearchSeedVector* pInVector, \n                                                 SearchSeedVector* pOutVector) const;\n        \n        // Calculate the terminal extension for the contained blocks to make the intervals consistent\n        void terminateContainedBlocks(OverlapBlockList& containedBlocks) const;\n\n        //                    \n        // Irreducible-only processing algorithms\n        //\n        // Reduce the block list pOBList by removing blocks that correspond to transitive edges\n        void computeIrreducibleBlocks(const BWT* pBWT, const BWT* pRevBWT, \n                                      OverlapBlockList* pOBList, OverlapBlockList* pOBFinal) const;\n        \n        // these recursive functions do the actual work of computing the irreducible blocks\n        void _processIrreducibleBlocksExact(const BWT* pBWT, const BWT* pRevBWT, \n                                            OverlapBlockList& obList, OverlapBlockList* pOBFinal) const;\n\n\n        void _processIrreducibleBlocksExactIterative(const BWT* pBWT, \n                                                     const BWT* pRevBWT, \n                                                     OverlapBlockList& inList, \n                                                     OverlapBlockList* pOBFinal) const;\n        //\n        void _processIrreducibleBlocksInexact(const BWT* pBWT, const BWT* pRevBWT, \n                                              OverlapBlockList& obList, OverlapBlockList* pOBFinal) const;\n\n        // Update the overlap block list with a righthand extension to b, removing ranges that become invalid\n        void updateOverlapBlockRangesRight(const BWT* pBWT, const BWT* pRevBWT, \n                                           OverlapBlockList& obList, char b) const;\n         \n        //                                  \n        void extendActiveBlocksRight(const BWT* pBWT, const BWT* pRevBWT, \n                                     OverlapBlockList& activeList, \n                                     OverlapBlockList& terminalList,\n                                     OverlapBlockList& containedList) const;\n\n        double calculateBlockErrorRate(const OverlapBlock& terminalBlock, const OverlapBlock& otherBlock) const;\n        bool isBlockSubstring(OverlapBlock& terminalBlock, const OverlapBlockList& blockList, double maxER) const;\n\n        // Data\n        const BWT* m_pBWT;\n        const BWT* m_pRevBWT;\n        double m_errorRate;\n        int m_seedLength;\n        int m_seedStride;\n        bool m_bIrreducible;\n        bool m_exactModeOverlap;\n        bool m_exactModeIrreducible;\n        \n        // Optional parameter to limit the amount of branching that is performed\n        int m_maxSeeds; \n};\n\n#endif\n"
  },
  {
    "path": "src/svaba/SvabaPostprocess.cpp",
    "content": "// SvabaPostprocess.cpp — see SvabaPostprocess.h for the design rationale.\n//\n// The flow for each suffix runs in its own std::thread:\n//\n//   [${ID}.${suffix}.bam]\n//        |\n//        |  (unless --dedup-only)\n//        v\n//   samtools sort -@ jthreads -m MEM -o *.sort.tmp.bam ${bam}    # shell out\n//   rename *.sort.tmp.bam -> ${bam}\n//        |\n//        |  (if suffix in DEDUP set, unless --sort-only)\n//        v\n//   native streaming dedup+merge  -> *.dedup.tmp.bam             # htslib\n//     (writer uses a header with our @PG line appended)\n//   rename *.dedup.tmp.bam -> ${bam}                             # PG stamped\n//        |\n//        |  (only if dedup didn't run for this suffix)\n//        v\n//   samtools reheader <hdr+PG> ${bam} > *.reheader.tmp.bam       # shell out\n//   rename *.reheader.tmp.bam -> ${bam}                          # PG stamped\n//        |\n//        v\n//   sam_index_build(${bam}, 0)                                   # htslib\n//     → ${bam}.bai\n//\n// Every final ${ID}.${suffix}.bam therefore ends up sorted, deduped (where\n// applicable), carrying an @PG \"svaba_postprocess\" line chained onto the\n// existing PG chain, and accompanied by a .bai index. The user never has to\n// know the intermediate .postprocess.*.tmp.bam files existed.\n//\n// The dedup step is NOT a straight drop of duplicate (qname, flag) records\n// at a locus: overlapping assembly windows can emit the same read twice\n// with different bi:Z / bz:Z tags naming different supporting contigs.\n// Dropping one would lose that support evidence. Instead we buffer per\n// locus and union the comma-token bi/bz lists into the first record, using\n// the same boundary-aware merge that SvabaOutputWriter.cpp::stamp_tag()\n// performs during `svaba run`.\n//\n// Progress is reported per 1M processed reads, per suffix, serialized through\n// a shared stderr mutex so lines don't interleave. We avoid any per-record\n// system call — stat() is only used for file-existence checks and size-based\n// ETA estimation.\n\n#include \"SvabaPostprocess.h\"\n\n#include <getopt.h>\n#include <sys/stat.h>\n#include <unistd.h>\n\n#include <algorithm>\n#include <cerrno>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <chrono>\n#include <fstream>\n#include <iomanip>\n#include <iostream>\n#include <mutex>\n#include <set>\n#include <sstream>\n#include <string>\n#include <string_view>\n#include <thread>\n#include <unordered_map>\n#include <vector>\n\n#include \"htslib/sam.h\"\n\n#include \"SeqLib/BamHeader.h\"\n#include \"SeqLib/BamReader.h\"\n#include \"SeqLib/BamRecord.h\"\n#include \"SeqLib/BamWriter.h\"\n\n#include \"SvabaOptions.h\"  // SVABA_VERSION\n\nnamespace {\n\n// Serialize progress/log output across the per-suffix threads. We intentionally\n// keep the critical section tiny — just the single ostringstream flush — so\n// workers don't serialize on their own progress prints.\nstd::mutex g_stderr_mu;\n\n// Suffixes eligible for dedup. `contigs` is sorted but never deduped because\n// each contig is emitted exactly once by a single window and there is no\n// overlap-induced duplication to clean up.\nconst std::vector<std::string> kDedupSuffixes = {\n  \"weird\", \"corrected\", \"discordant\"\n};\n\n// Full suffix list to consider, in the same order as sort_output.sh. The\n// contigs suffix goes last so that any shared stderr verbosity from it doesn't\n// bury the (more interesting) dedup stats.\nconst std::vector<std::string> kAllSuffixes = {\n  \"weird\", \"corrected\", \"discordant\", \"contigs\"\n};\n\n// ---------- options ----------\nstruct Opts {\n  std::string id;\n  int         threads   = 4;\n  std::string mem       = \"2G\";  // per samtools sort thread; matches -m flag\n  int         verbose   = 1;\n  bool        sort_only = false;  // skip dedup\n  bool        dedup_only = false; // skip sort (assume sorted)\n};\n\nenum { OPT_SORT_ONLY = 1000, OPT_DEDUP_ONLY, OPT_MEM };\n\nconst char* kShortOpts = \"hi:t:m:v:\";\nconst struct option kLongOpts[] = {\n  { \"help\",       no_argument,       nullptr, 'h' },\n  { \"id\",         required_argument, nullptr, 'i' },\n  { \"threads\",    required_argument, nullptr, 't' },\n  { \"mem\",        required_argument, nullptr, 'm' },\n  { \"verbose\",    required_argument, nullptr, 'v' },\n  { \"sort-only\",  no_argument,       nullptr, OPT_SORT_ONLY  },\n  { \"dedup-only\", no_argument,       nullptr, OPT_DEDUP_ONLY },\n  { nullptr, 0, nullptr, 0 }\n};\n\nvoid printUsage() {\n  std::cerr <<\n    \"Usage: svaba postprocess -i <ID> [options]\\n\"\n    \"\\n\"\n    \"  Coord-sort (via samtools sort) and natively streaming-dedup\\n\"\n    \"  svaba's per-suffix output BAMs. Much faster than the legacy\\n\"\n    \"  samtools-view | awk | samtools-view pipeline.\\n\"\n    \"\\n\"\n    \"  Expects files at ${ID}.${suffix}.bam for suffix in:\\n\"\n    \"    weird corrected discordant contigs\\n\"\n    \"\\n\"\n    \"  -i, --id <str>            Analysis ID (required).\\n\"\n    \"  -t, --threads <n>         Total threads budget, split across concurrent\\n\"\n    \"                            per-suffix jobs. [4]\\n\"\n    \"  -m, --mem <str>           Memory per samtools-sort thread (e.g. 2G). [2G]\\n\"\n    \"      --sort-only           Only sort; skip dedup.\\n\"\n    \"      --dedup-only          Only dedup; skip sort. Assumes input is already\\n\"\n    \"                            coord-sorted; output is undefined otherwise.\\n\"\n    \"  -v, --verbose <0-3>       Verbosity. [1]\\n\"\n    \"  -h, --help                This message.\\n\";\n}\n\nOpts parseOpts(int argc, char** argv) {\n  Opts o;\n  if (argc <= 2) { printUsage(); std::exit(EXIT_FAILURE); }\n\n  for (int c; (c = getopt_long(argc, argv, kShortOpts, kLongOpts, nullptr)) != -1;) {\n    std::istringstream arg(optarg ? optarg : \"\");\n    switch (c) {\n      case 'h': printUsage(); std::exit(EXIT_SUCCESS);\n      case 'i': arg >> o.id; break;\n      case 't': arg >> o.threads; break;\n      case 'm': arg >> o.mem; break;\n      case 'v': arg >> o.verbose; break;\n      case OPT_SORT_ONLY:  o.sort_only  = true; break;\n      case OPT_DEDUP_ONLY: o.dedup_only = true; break;\n      default: printUsage(); std::exit(EXIT_FAILURE);\n    }\n  }\n  if (o.id.empty()) {\n    std::cerr << \"ERROR: --id is required\\n\";\n    printUsage();\n    std::exit(EXIT_FAILURE);\n  }\n  if (o.sort_only && o.dedup_only) {\n    std::cerr << \"ERROR: --sort-only and --dedup-only are mutually exclusive\\n\";\n    std::exit(EXIT_FAILURE);\n  }\n  if (o.threads < 1) o.threads = 1;\n  return o;\n}\n\n// ---------- small utilities ----------\n\nbool fileExists(const std::string& p) {\n  struct stat st{};\n  return ::stat(p.c_str(), &st) == 0 && S_ISREG(st.st_mode);\n}\n\noff_t fileSize(const std::string& p) {\n  struct stat st{};\n  if (::stat(p.c_str(), &st) != 0) return 0;\n  return st.st_size;\n}\n\n// Thread-safe stderr log. Accepts anything streamable into an ostringstream.\ntemplate <typename... Args>\nvoid logLine(Args&&... args) {\n  std::ostringstream oss;\n  (oss << ... << std::forward<Args>(args));\n  std::lock_guard<std::mutex> lg(g_stderr_mu);\n  std::cerr << oss.str() << std::endl;\n}\n\n// Quote a path for use inside a /bin/sh command string. Wraps in single\n// quotes and escapes embedded single quotes as '\\''. This is safe against\n// arbitrary IDs containing spaces or shell metacharacters.\nstd::string shQuote(const std::string& s) {\n  std::string out;\n  out.reserve(s.size() + 2);\n  out.push_back('\\'');\n  for (char c : s) {\n    if (c == '\\'') out += \"'\\\\''\";\n    else out.push_back(c);\n  }\n  out.push_back('\\'');\n  return out;\n}\n\n// Forward decl: defined further down in the \"per-suffix pipeline\" section.\n// Declared here so the reheader helper below can use std::rename via the same\n// diagnostics-rich wrapper the dedup path uses.\nvoid renameOrThrow(const std::string& from, const std::string& to);\n\n// ---------- @PG stamping ----------\n//\n// Every final BAM produced by `svaba postprocess` gets a new @PG line stamped\n// onto its header so downstream tools (and humans) can tell at a glance that\n// postprocess ran and with what arguments. The line chains onto the existing\n// @PG chain via PP: so samtools' `--pg` resolution keeps working.\n//\n// Conventions:\n//   ID: \"svaba_postprocess\" (or \".1\", \".2\", ... if already present — IDs must\n//       be unique within a header)\n//   PN: \"svaba\"\n//   VN: SVABA_VERSION\n//   CL: the original argv reassembled, with \"svaba \" prepended so the CL\n//       matches what the user actually typed\n//   PP: the tail of the existing PG chain (the ID that is nobody's PP pointer)\n\nstruct PgChainInfo {\n  std::vector<std::string> ids;   // all @PG IDs, in file order\n  std::string              tail;  // ID that is nobody else's PP (or \"\" if none)\n};\n\nPgChainInfo scanPgChain(const std::string& hdr_text) {\n  PgChainInfo info;\n  std::set<std::string> is_pp_target;\n  std::istringstream iss(hdr_text);\n  std::string line;\n  while (std::getline(iss, line)) {\n    if (line.rfind(\"@PG\\t\", 0) != 0) continue;\n    std::string id, pp;\n    std::istringstream ls(line);\n    std::string field;\n    while (std::getline(ls, field, '\\t')) {\n      if      (field.rfind(\"ID:\", 0) == 0) id = field.substr(3);\n      else if (field.rfind(\"PP:\", 0) == 0) pp = field.substr(3);\n    }\n    if (!id.empty()) info.ids.push_back(id);\n    if (!pp.empty()) is_pp_target.insert(pp);\n  }\n  // Tail = an ID that no one else's PP points at. If multiple, take the last\n  // one in file order — matches what samtools reheader/markdup do in practice.\n  for (const auto& id : info.ids) {\n    if (is_pp_target.find(id) == is_pp_target.end()) info.tail = id;\n  }\n  return info;\n}\n\n// Idempotency check: has *any* svaba_postprocess @PG line (including\n// uniquified variants svaba_postprocess.1, .2, ...) already been stamped\n// onto this header? Used to auto-skip the dedup/reheader phase on\n// re-runs so `scripts/svaba_postprocess.sh` is safely rerunnable.\n//\n// Matches both the bare \"svaba_postprocess\" ID emitted on the first run\n// and the \"svaba_postprocess.<n>\" variants uniquifyId() would produce if\n// the user deliberately runs postprocess twice in a row. Either form\n// means \"dedup+PG-stamp has already happened at least once.\"\nbool hasSvabaPostprocessPg(const std::string& hdr_text) {\n  const PgChainInfo info = scanPgChain(hdr_text);\n  for (const auto& id : info.ids) {\n    if (id == \"svaba_postprocess\") return true;\n    if (id.rfind(\"svaba_postprocess.\", 0) == 0) return true;\n  }\n  return false;\n}\n\nstd::string uniquifyId(const std::string& base,\n                       const std::vector<std::string>& existing) {\n  auto has = [&](const std::string& s) {\n    return std::find(existing.begin(), existing.end(), s) != existing.end();\n  };\n  if (!has(base)) return base;\n  for (int i = 1; i < 10000; ++i) {\n    std::string cand = base + \".\" + std::to_string(i);\n    if (!has(cand)) return cand;\n  }\n  return base + \".new\";  // extremely unreachable fallback\n}\n\n// Strip tab/newline/CR from a value so it can't break @PG line structure.\nstd::string sanitizeHeaderValue(const std::string& s) {\n  std::string out;\n  out.reserve(s.size());\n  for (char c : s) {\n    if (c == '\\t') out.push_back(' ');\n    else if (c == '\\n' || c == '\\r') continue;\n    else out.push_back(c);\n  }\n  return out;\n}\n\n// Append a single @PG line to hdr_text. Does not otherwise touch the header.\nstd::string appendSvabaPostprocessPg(const std::string& hdr_text,\n                                     const std::string& cl) {\n  const PgChainInfo info = scanPgChain(hdr_text);\n  const std::string id   = uniquifyId(\"svaba_postprocess\", info.ids);\n  const std::string vn   = SVABA_VERSION;\n  const std::string cl_s = sanitizeHeaderValue(cl);\n\n  std::string line = \"@PG\\tID:\" + id + \"\\tPN:svaba\\tVN:\" + vn + \"\\tCL:\" + cl_s;\n  if (!info.tail.empty()) line += \"\\tPP:\" + info.tail;\n  line.push_back('\\n');\n\n  std::string out = hdr_text;\n  if (!out.empty() && out.back() != '\\n') out.push_back('\\n');\n  out += line;\n  return out;\n}\n\n// Build a new SeqLib::BamHeader with our @PG line appended onto `src`.\nSeqLib::BamHeader stampedHeader(const SeqLib::BamHeader& src,\n                                const std::string& cl) {\n  return SeqLib::BamHeader(appendSvabaPostprocessPg(src.AsString(), cl));\n}\n\n// Read the header of `bam` (without walking records) and return it as a\n// SeqLib::BamHeader. The BamReader is closed on scope exit.\nSeqLib::BamHeader readHeaderOnly(const std::string& bam) {\n  SeqLib::BamReader r;\n  if (!r.Open(bam))\n    throw std::runtime_error(\"reheader: cannot open \" + bam);\n  return r.Header();\n}\n\n// Return true iff the BAM's header declares it coordinate-sorted via an\n// @HD line with SO:coordinate. Samtools, SeqLib, and bwa all emit that\n// form when producing a sorted BAM, so a simple substring check on the\n// first @HD line is sufficient.\n//\n// Used by processSuffix() to short-circuit the sort step when it would be\n// a no-op — lets the user rerun postprocess on already-sorted inputs\n// without paying the sort cost again (e.g. after a --skip-dedup rerun).\n//\n// Errors (can't open, no @HD at all, @HD without SO:) conservatively\n// return false so we fall through to running sort, which will produce a\n// correct result regardless.\nbool isCoordinateSorted(const std::string& bam) {\n  try {\n    const SeqLib::BamHeader h = readHeaderOnly(bam);\n    const std::string text = h.AsString();\n    std::istringstream iss(text);\n    std::string line;\n    while (std::getline(iss, line)) {\n      if (line.rfind(\"@HD\\t\", 0) == 0) {\n        // @HD line found; check for the SO:coordinate tag. Tags are\n        // tab-separated, any order — a plain substring search on the\n        // line is accurate enough because \"SO:coordinate\" can't appear\n        // as a substring of any other valid @HD tag value.\n        return line.find(\"SO:coordinate\") != std::string::npos;\n      }\n      // @HD, if present, is required to be the first header line. If\n      // the first non-empty line isn't @HD we can stop looking.\n      if (!line.empty() && line[0] == '@') break;\n    }\n  } catch (...) {\n    // header unreadable — let the sort step run and produce its own\n    // error with better context.\n  }\n  return false;\n}\n\n// Use `samtools reheader` to swap in a new header on an existing BAM. Fast\n// because samtools reheader streams the BGZF body as opaque blocks. We use\n// this for the suffixes whose pipeline doesn't already rewrite the file\n// (i.e. `contigs`, or any suffix when --sort-only is passed).\nint reheaderBamWithPg(const std::string& bam,\n                      const std::string& cl,\n                      const std::string& tag,\n                      int verbose) {\n  const std::string tmp_hdr = bam + \".postprocess.hdr.tmp.sam\";\n  const std::string tmp_bam = bam + \".postprocess.reheader.tmp.bam\";\n\n  try {\n    const SeqLib::BamHeader src = readHeaderOnly(bam);\n    const std::string new_text = appendSvabaPostprocessPg(src.AsString(), cl);\n\n    {\n      std::ofstream ofs(tmp_hdr, std::ios::binary);\n      if (!ofs)\n        throw std::runtime_error(\"cannot write temp header \" + tmp_hdr);\n      ofs << new_text;\n      if (!ofs)\n        throw std::runtime_error(\"short write on \" + tmp_hdr);\n    }\n\n    const std::string cmd = \"samtools reheader \" + shQuote(tmp_hdr) + \" \" +\n                            shQuote(bam) + \" > \" + shQuote(tmp_bam);\n    if (verbose >= 2) logLine(\"[\", tag, \"] exec: \", cmd);\n\n    const auto t0 = std::chrono::steady_clock::now();\n    const int rc = std::system(cmd.c_str());\n    const double elapsed =\n        std::chrono::duration<double>(std::chrono::steady_clock::now() - t0).count();\n\n    ::unlink(tmp_hdr.c_str());\n\n    if (rc != 0) {\n      ::unlink(tmp_bam.c_str());\n      logLine(\"[\", tag, \"] samtools reheader FAILED (exit \", rc, \") after \",\n              std::fixed, std::setprecision(1), elapsed, \"s\");\n      return rc;\n    }\n\n    renameOrThrow(tmp_bam, bam);\n    if (verbose >= 1)\n      logLine(\"[\", tag, \"] PG stamped via reheader in \",\n              std::fixed, std::setprecision(1), elapsed, \"s\");\n    return 0;\n  } catch (const std::exception& e) {\n    ::unlink(tmp_hdr.c_str());\n    ::unlink(tmp_bam.c_str());\n    logLine(\"[\", tag, \"] reheader error: \", e.what());\n    return -1;\n  }\n}\n\n// ---------- BAI indexing ----------\n\n// Build a .bai alongside `bam`. Uses htslib directly rather than shelling out\n// to `samtools index` — one less fork, and we're already linked against\n// htslib through SeqLib. `sam_index_build(fn, 0)` emits BAI; min_shift > 0\n// would emit CSI (which svaba's consumers don't expect).\nint indexBam(const std::string& bam, const std::string& tag, int verbose) {\n  const auto t0 = std::chrono::steady_clock::now();\n  const int rc = sam_index_build(bam.c_str(), 0);\n  const double elapsed =\n      std::chrono::duration<double>(std::chrono::steady_clock::now() - t0).count();\n  if (rc < 0) {\n    logLine(\"[\", tag, \"] indexing FAILED (sam_index_build rc=\", rc, \") after \",\n            std::fixed, std::setprecision(2), elapsed, \"s\");\n    return rc;\n  }\n  if (verbose >= 1)\n    logLine(\"[\", tag, \"] indexed (.bai) in \",\n            std::fixed, std::setprecision(2), elapsed, \"s\");\n  return 0;\n}\n\n// ---------- sort step ----------\n\n// Run samtools sort on in_bam producing out_bam. Returns process exit code.\n// We don't parse samtools' progress output; samtools -v isn't universally\n// respected and its stderr format changes. Caller emits start/end log lines\n// with timing.\nint runSort(const std::string& in_bam,\n            const std::string& out_bam,\n            int sort_threads,\n            const std::string& mem,\n            const std::string& tag,\n            int verbose) {\n  std::string cmd =\n      \"samtools sort -@ \" + std::to_string(std::max(1, sort_threads)) +\n      \" -m \" + shQuote(mem) +\n      \" -o \" + shQuote(out_bam) +\n      \" \"    + shQuote(in_bam);\n\n  if (verbose >= 2)\n    logLine(\"[\", tag, \"] exec: \", cmd);\n\n  const auto t0 = std::chrono::steady_clock::now();\n  const int rc = std::system(cmd.c_str());\n  const double elapsed =\n      std::chrono::duration<double>(std::chrono::steady_clock::now() - t0).count();\n\n  if (rc != 0) {\n    logLine(\"[\", tag, \"] samtools sort FAILED (exit \", rc, \") after \",\n            std::fixed, std::setprecision(1), elapsed, \"s\");\n    return rc;\n  }\n  if (verbose >= 1)\n    logLine(\"[\", tag, \"] sort done in \",\n            std::fixed, std::setprecision(1), elapsed, \"s\");\n  return 0;\n}\n\n// ---------- dedup step ----------\n\nstruct DedupStats {\n  std::size_t in_records = 0;  // records read\n  std::size_t kept       = 0;  // unique (qname, flag) per locus, written out\n  std::size_t merged     = 0;  // duplicates folded into an earlier record's tags\n  std::size_t tag_edits  = 0;  // number of bi/bz merges that actually changed tag\n  double      seconds    = 0;\n};\n\n// Boundary-aware comma-token union: adds any tokens in `incoming` that aren't\n// already in `cur` as comma-separated atoms. Mirrors stamp_tag() in\n// SvabaOutputWriter.cpp so the postprocess dedup produces exactly the same\n// bi:Z / bz:Z strings svaba run would have written if the two contributing\n// windows had been merged in-memory.\n//\n// Returns true iff cur was modified.\nbool mergeCommaTokens(std::string& cur, std::string_view incoming) {\n  if (incoming.empty()) return false;\n  if (cur.empty()) { cur.assign(incoming); return true; }\n\n  bool changed = false;\n  std::size_t s = 0;\n  while (s <= incoming.size()) {\n    std::size_t e = incoming.find(',', s);\n    if (e == std::string_view::npos) e = incoming.size();\n    std::string_view tok = incoming.substr(s, e - s);\n    if (!tok.empty()) {\n      bool present = false;\n      std::size_t pos = 0;\n      while ((pos = cur.find(tok, pos)) != std::string::npos) {\n        const bool left_ok  = (pos == 0) || cur[pos - 1] == ',';\n        const bool right_ok = (pos + tok.size() == cur.size()) ||\n                              cur[pos + tok.size()] == ',';\n        if (left_ok && right_ok) { present = true; break; }\n        pos += tok.size();\n      }\n      if (!present) {\n        cur.push_back(',');\n        cur.append(tok);\n        changed = true;\n      }\n    }\n    if (e == incoming.size()) break;\n    s = e + 1;\n  }\n  return changed;\n}\n\n// Pull `tag` off `incoming` and union it into `existing`'s `tag`. Returns\n// true iff the existing record's tag string actually changed.\nbool mergeZTagInto(SeqLib::BamRecord& existing,\n                   const SeqLib::BamRecord& incoming,\n                   const char* tag) {\n  std::string incoming_val;\n  if (!incoming.GetZTag(tag, incoming_val) || incoming_val.empty())\n    return false;\n\n  std::string cur;\n  existing.GetZTag(tag, cur);\n  if (!mergeCommaTokens(cur, incoming_val))\n    return false;\n\n  existing.RemoveTag(tag);\n  existing.AddZTag(tag, cur);\n  return true;\n}\n\n// Streaming dedup + tag-merge. Reads in_bam, writes out_bam, collapses exact\n// (qname, flag) duplicates at the same (chr, pos). Duplicates are not simply\n// discarded: their bi:Z and bz:Z tags (the comma-joined alt-supporting and\n// all-supporting contig lists) are unioned into the first record's tags\n// using the same boundary-aware merge that stamp_tag() in\n// SvabaOutputWriter.cpp uses during `svaba run`. Since a duplicate record\n// typically comes from an overlapping assembly window, its bi/bz may name\n// a different contig than the first record — dropping it would lose that\n// support evidence. Requires input to be coord-sorted.\n//\n// Memory: O(reads at a single locus). The per-locus index and record buffer\n// are cleared whenever (chr, pos) advances, so even pathological pileups\n// only blow up transiently.\nDedupStats streamDedup(const std::string& in_bam,\n                       const std::string& out_bam,\n                       const SeqLib::BamHeader& out_hdr,\n                       const std::string& tag,\n                       int threads,\n                       int verbose) {\n  using clock = std::chrono::steady_clock;\n  DedupStats st;\n  const auto t0 = clock::now();\n  auto last = t0;\n  const off_t in_size = fileSize(in_bam);\n\n  SeqLib::BamReader r;\n  if (!r.Open(in_bam))\n    throw std::runtime_error(\"dedup: cannot open input \" + in_bam);\n  // Enable BGZF decompression thread pool on the reader. Must happen\n  // after Open() (where fp_ is populated) and before the first Next().\n  // Typical 3–5x end-to-end speedup at threads=4..8 on dense BAMs,\n  // because without it the main thread does every BGZF block inflate\n  // sequentially.\n  const int io_threads = std::max(1, threads);\n  r.SetThreads(io_threads);\n\n  SeqLib::BamWriter w;\n  if (!w.Open(out_bam))\n    throw std::runtime_error(\"dedup: cannot open output \" + out_bam);\n  // Matching BGZF compression thread pool on the write side. The\n  // output is the expensive half of this function — every kept record\n  // goes through deflate — so pooling here matters most.\n  w.SetThreads(io_threads);\n  // Use the caller-supplied header (which already carries our @PG stamp)\n  // rather than blindly mirroring the reader's — that's how postprocess\n  // marks its output without a separate reheader pass for dedup suffixes.\n  w.SetHeader(out_hdr);\n  if (!w.WriteHeader())\n    throw std::runtime_error(\"dedup: cannot write header \" + out_bam);\n\n  // Per-locus buffer. We must hold records in insertion order so flush\n  // preserves the original coord-sort: same (chr, pos) records keep whatever\n  // secondary ordering samtools sort produced (qname-stable tiebreak).\n  //\n  //   keep_buf[i] holds the record we're emitting for the i'th unique key.\n  //   idx_by_key[key] is that buffer index, used to fold duplicate tags into\n  //     the already-buffered record.\n  std::vector<SeqLib::BamRecord> keep_buf;\n  std::unordered_map<std::string, std::size_t> idx_by_key;\n  keep_buf.reserve(64);\n  idx_by_key.reserve(64);\n\n  int32_t cur_chr = -2;  // -2 is a sentinel that won't match any valid ChrID\n  int32_t cur_pos = -2;\n  // Cached display name for cur_chr. ChrName() hits the header every call, so\n  // we resolve it only on (rare) chromosome change, not per record.\n  std::string cur_chr_name = \"*\";\n\n  // When bucket_count() drifts beyond this threshold (after a pileup locus\n  // inflates the map), flushLocus() swaps in a fresh small map instead of\n  // calling clear(). See comment below for why this matters.\n  constexpr std::size_t kBucketResetThreshold = 256;\n\n  // Flush buffered records for the current locus in insertion order.\n  //\n  // Perf note: std::unordered_map::clear() is O(bucket_count), NOT O(size)\n  // — it walks the entire bucket array to zero out each slot, even when\n  // the map currently has 0 elements. The bucket array grows with the\n  // max number of entries ever held and NEVER shrinks. So after one\n  // pileup locus (centromere, simple repeat, HLA, etc.) bloats buckets\n  // to ~130k, every subsequent locus transition — hundreds of millions\n  // of them — pays a full memset of that inflated array. A perf profile\n  // showed 95% of main-thread CPU going to this single memset before\n  // this fix landed, explaining why the BGZF thread pools were starving.\n  //\n  // Fix: when the bucket count has grown past kBucketResetThreshold,\n  // swap the inflated map with a fresh small one. The inflated map's\n  // destructor pays the O(bucket_count) cost ONCE (on pileup exit)\n  // instead of once per locus transition. Subsequent small loci see a\n  // small bucket array and their clear() is fast.\n  auto flushLocus = [&]() {\n    for (auto& kept : keep_buf) {\n      if (!w.WriteRecord(kept))\n        throw std::runtime_error(\"dedup: WriteRecord failed on \" + out_bam);\n    }\n    keep_buf.clear();\n    if (idx_by_key.bucket_count() > kBucketResetThreshold) {\n      std::unordered_map<std::string, std::size_t> fresh;\n      fresh.reserve(64);\n      idx_by_key.swap(fresh);\n      // `fresh` (now holding the inflated map) destructs at end of this\n      // lambda — that's where we pay the one-time big memset.\n    } else {\n      idx_by_key.clear();\n    }\n  };\n\n  while (auto opt = r.Next()) {\n    SeqLib::BamRecord& rec = *opt;\n\n    const int32_t chr = rec.ChrID();\n    const int32_t pos = rec.Position();\n    if (chr != cur_chr || pos != cur_pos) {\n      flushLocus();\n      if (chr != cur_chr) {\n        // Resolve name once per chromosome. Unmapped (chr == -1) stays \"*\".\n        cur_chr_name = (chr >= 0) ? rec.ChrName(r.Header()) : std::string(\"*\");\n      }\n      cur_chr = chr;\n      cur_pos = pos;\n    }\n\n    // Build the dedup key: qname + '\\t' + decimal flag. Decimal keeps keys\n    // ASCII / comparable across platforms; '\\t' as the separator can never\n    // appear inside a BAM qname.\n    std::string key = rec.Qname();\n    key.push_back('\\t');\n    {\n      char buf[16];\n      const int n = std::snprintf(buf, sizeof(buf), \"%u\", rec.AlignmentFlag());\n      key.append(buf, n);\n    }\n\n    auto [it, inserted] = idx_by_key.try_emplace(std::move(key), keep_buf.size());\n    if (inserted) {\n      // BamRecord is move-only (shared_ptr<bam1_t> under the hood); move\n      // it into the buffer so we transfer the htslib pointer without\n      // ref-bumping.\n      keep_buf.emplace_back(std::move(rec));\n      ++st.kept;\n    } else {\n      // Duplicate at same (chr, pos). Fold its bi/bz tags into the kept copy\n      // so we don't drop alt/contig support from the overlapping window. We\n      // read from rec here (still alive — only moved in the other branch).\n      SeqLib::BamRecord& existing = keep_buf[it->second];\n      if (mergeZTagInto(existing, rec, \"bi\")) ++st.tag_edits;\n      if (mergeZTagInto(existing, rec, \"bz\")) ++st.tag_edits;\n      ++st.merged;\n    }\n    ++st.in_records;\n\n    // Progress print every 25M reads. Was 1M originally, then 5M; post\n    // BGZF-threading + bucket-clear fix the dedup runs fast enough that\n    // 5M was firing too often on deep BAMs. 25M gives ~a screenful of\n    // lines for a typical 100–500M-read WGS BAM.\n    constexpr std::size_t PROGRESS_EVERY = 25'000'000ULL;\n    if (verbose >= 1 && (st.in_records % PROGRESS_EVERY) == 0) {\n      const auto now = clock::now();\n      const double elapsed = std::chrono::duration<double>(now - t0).count();\n      const double dt      = std::chrono::duration<double>(now - last).count();\n      const double inst_rps = dt > 0 ? static_cast<double>(PROGRESS_EVERY) / dt : 0.0;\n      const double avg_rps  = elapsed > 0 ? st.in_records / elapsed : 0.0;\n      last = now;\n\n      // Column widths chosen so the line never shifts as counters grow:\n      //   chr:    5 chars right-padded   (\"chr22\" max)\n      //   :\n      //   pos:    left-justified, with thousands separators\n      //             (flush against colon; human chr1 max \"248,956,422\" = 11 chars)\n      //   locus total padded to 17 so subsequent columns stay anchored.\n      //   counts: 11 chars right-aligned with thousands separators\n      //             (fits \"999,999,999\" = 9 figures + 2 commas)\n      //   rps:    6 chars \"%6.2f\"        (up to 999.99 M/s)\n      //   elapsed 8 chars \"%8.1f\"        (up to 99999.9 s ≈ 27 hr)\n      //   MiB:    7 chars                (up to 9,999,999 MiB ≈ 10 TB)\n      auto fmtN = [](std::size_t n) {\n        std::ostringstream oss;\n        oss << std::setw(11) << std::right << SeqLib::AddCommas<std::size_t>(n);\n        return oss.str();\n      };\n\n      // Locus = right-padded chr + ':' + left-justified comma'd pos.\n      // Flush to 17 chars total so \" | \" lands at a fixed column regardless\n      // of chr length or position magnitude.\n      std::ostringstream locus_oss;\n      locus_oss << std::setw(5) << std::right << cur_chr_name\n                << \":\"\n                << SeqLib::AddCommas<int32_t>(cur_pos >= 0 ? cur_pos + 1 : 0);\n      std::string locus_str = locus_oss.str();\n      if (locus_str.size() < 17) locus_str.append(17 - locus_str.size(), ' ');\n\n      // Input-size hint for a coarse \"how far into the job\" feel. A true\n      // ETA would need bytes-read from htslib, which SeqLib doesn't expose.\n      std::string size_hint;\n      if (in_size > 0) {\n        std::ostringstream oss;\n        oss << \" (input \" << std::setw(7) << std::right\n            << (in_size / (1024 * 1024)) << \" MiB)\";\n        size_hint = oss.str();\n      }\n\n      logLine(\"[\", tag, \"] dedup: at \", locus_str, \" | \",\n              fmtN(st.in_records), \" reads | \",\n              fmtN(st.kept),       \" kept, \",\n              fmtN(st.merged),     \" merged (\",\n              fmtN(st.tag_edits),  \" tag-edits) | \",\n              std::fixed, std::setprecision(2),\n              std::setw(6), inst_rps / 1e6, \"M/s last-25M, \",\n              std::setw(6), avg_rps  / 1e6, \"M/s avg, \",\n              std::setprecision(1), std::setw(8), elapsed, \"s elapsed\",\n              size_hint);\n    }\n  }\n\n  // Final locus flush.\n  flushLocus();\n\n  if (!w.Close())\n    throw std::runtime_error(\"dedup: writer Close failed on \" + out_bam);\n\n  st.seconds = std::chrono::duration<double>(clock::now() - t0).count();\n  return st;\n}\n\n// ---------- per-suffix pipeline ----------\n\n// Move one file to another atomically within the same filesystem, via\n// std::rename. Throws on failure so the caller can decide what to do.\nvoid renameOrThrow(const std::string& from, const std::string& to) {\n  if (std::rename(from.c_str(), to.c_str()) != 0) {\n    throw std::runtime_error(\"rename \" + from + \" -> \" + to +\n                             \" failed: \" + std::strerror(errno));\n  }\n}\n\nbool isDedupSuffix(const std::string& s) {\n  for (const auto& d : kDedupSuffixes)\n    if (d == s) return true;\n  return false;\n}\n\n// Run the full sort + dedup + reheader + index pipeline for a single suffix.\n// Safe to invoke from its own thread. Never throws out — caller joins; any\n// failure is logged and the pipeline aborts for this suffix only.\n//\n// End state on success: the file at ${id}.${suffix}.bam is the final output,\n// coord-sorted, dedup-collapsed (for dedup-eligible suffixes), @PG-stamped,\n// and accompanied by a ${id}.${suffix}.bam.bai index. All intermediate\n// filenames use a .postprocess.*.tmp.bam suffix so anything left behind on\n// failure is obviously transient and trivially cleanable.\n// do_finalize controls whether the dedup + reheader + index phase runs.\n// Phase-splitting the driver lets sort run in parallel across suffixes\n// (narrow thread budget each) and dedup run serially with the full thread\n// budget, which is what the user wants since htslib BGZF pools are\n// per-file — sharing them across concurrent workers oversubscribes.\nvoid processSuffix(const std::string& id,\n                   const std::string& suffix,\n                   int  per_job_threads,\n                   const std::string& mem,\n                   bool do_sort,\n                   bool do_dedup,\n                   bool do_finalize,\n                   const std::string& cl,\n                   int  verbose) {\n  const std::string bam       = id + \".\" + suffix + \".bam\";\n  // Intermediate temp files. Named so there's no ambiguity about the step\n  // that produced them — anything matching .postprocess.*.tmp.bam is safe\n  // to remove after the run is done.\n  const std::string sort_tmp  = id + \".\" + suffix + \".postprocess.sort.tmp.bam\";\n  const std::string dedup_tmp = id + \".\" + suffix + \".postprocess.dedup.tmp.bam\";\n\n  auto cleanup_tmps = [&]() {\n    ::unlink(sort_tmp.c_str());\n    ::unlink(dedup_tmp.c_str());\n  };\n\n  if (!fileExists(bam)) {\n    logLine(\"[\", suffix, \"] skipping: \", bam, \" not found\");\n    return;\n  }\n\n  bool pg_stamped = false;\n\n  try {\n    // --- Sort -----------------------------------------------------------\n    // Skip the sort step if the BAM already declares itself coordinate-\n    // sorted. Cheap O(header) check; turns a repeat postprocess run on\n    // an already-postprocessed BAM into an effectively instant no-op\n    // for this suffix. Lets users pass --skip-dedup at the shell layer\n    // (or --sort-only from the C++ CLI) and rerun without paying 30+s\n    // per suffix for a redundant sort.\n    if (do_sort && isCoordinateSorted(bam)) {\n      logLine(\"[\", suffix, \"] already coordinate-sorted (per @HD SO:coordinate); \"\n              \"skipping sort\");\n    } else if (do_sort) {\n      const int rc = runSort(bam, sort_tmp, per_job_threads, mem, suffix, verbose);\n      if (rc != 0)\n        throw std::runtime_error(\"samtools sort exited \" + std::to_string(rc));\n      renameOrThrow(sort_tmp, bam);\n    }\n\n    if (!do_finalize) {\n      // Caller wants sort-only (the parallel Phase 1 of the driver); leave\n      // dedup + reheader + index to the caller's Phase 2 invocation. This\n      // split exists so Phase 2 can run serially with the full thread\n      // budget dedicated to BGZF read/write pooling per BAM, instead of\n      // fragmenting threads across concurrent workers.\n      return;\n    }\n\n    // Read the current header ONCE and reuse it for both the PG-idempotency\n    // check and (if we do run dedup) the stamped output header. Avoids a\n    // second BAM open just to look up PG state.\n    const SeqLib::BamHeader existing_hdr = readHeaderOnly(bam);\n    const std::string       existing_txt = existing_hdr.AsString();\n    const bool already_postprocessed     = hasSvabaPostprocessPg(existing_txt);\n\n    // --- Dedup (also stamps PG on the way) ------------------------------\n    if (do_dedup && isDedupSuffix(suffix) && !already_postprocessed) {\n      if (verbose >= 1)\n        logLine(\"[\", suffix, \"] starting dedup on \", bam);\n\n      // Append our @PG line to the existing header text, then hand the\n      // stamped header to the writer. This is free — dedup is already\n      // rewriting the file, so we avoid a separate reheader pass.\n      const SeqLib::BamHeader stamped =\n          SeqLib::BamHeader(appendSvabaPostprocessPg(existing_txt, cl));\n\n      const DedupStats ds =\n          streamDedup(bam, dedup_tmp, stamped, suffix,\n                      per_job_threads,   // BGZF read/write pool size\n                      verbose);\n      renameOrThrow(dedup_tmp, bam);\n      pg_stamped = true;\n\n      logLine(\"[\", suffix, \"] dedup complete: \",\n              ds.in_records, \" in, \",\n              ds.kept, \" kept, \",\n              ds.merged, \" merged (\",\n              (ds.in_records ?\n                100.0 * ds.merged / static_cast<double>(ds.in_records) : 0.0),\n              \"% dup, \",\n              ds.tag_edits, \" bi/bz tag-edits) in \",\n              std::fixed, std::setprecision(1), ds.seconds, \"s\");\n    } else if (do_dedup && isDedupSuffix(suffix) && already_postprocessed) {\n      // BAM has already been through svaba_postprocess. Skip the expensive\n      // dedup rewrite AND the reheader below — PG is already stamped.\n      logLine(\"[\", suffix, \"] already has svaba_postprocess @PG in header; \"\n              \"skipping dedup (rerun-safe no-op)\");\n      pg_stamped = true;\n    } else if (do_dedup && !isDedupSuffix(suffix)) {\n      if (verbose >= 2)\n        logLine(\"[\", suffix, \"] dedup skipped (not a dedup suffix)\");\n    }\n\n    // --- Reheader to stamp @PG for any suffix that didn't go through -----\n    // --- dedup (e.g. `contigs`, or anything under --sort-only). Also      -----\n    // --- skipped when `already_postprocessed` set `pg_stamped` above      -----\n    // --- (nothing to add to an already-PG-stamped header).                -----\n    if (!pg_stamped && !already_postprocessed) {\n      const int rc = reheaderBamWithPg(bam, cl, suffix, verbose);\n      if (rc != 0)\n        throw std::runtime_error(\"reheader failed with rc \" + std::to_string(rc));\n    }\n\n    // --- Index ----------------------------------------------------------\n    // Index last so the .bai matches the BGZF offsets of the final file.\n    // Any earlier index would be invalidated by the dedup/reheader rewrite.\n    // Always runs — even on a rerun, the .bai may be missing or stale\n    // (e.g. if the user renamed the BAM after a previous run). Cheap op.\n    (void) indexBam(bam, suffix, verbose);\n\n  } catch (const std::exception& e) {\n    logLine(\"[\", suffix, \"] ERROR: \", e.what());\n    cleanup_tmps();\n  }\n}\n\n}  // namespace\n\nvoid runPostprocess(int argc, char** argv) {\n  // Reconstruct the invocation string for the @PG CL: tag BEFORE parseOpts\n  // consumes argv via getopt_long. We prepend \"svaba\" so the CL in the\n  // final BAM headers reads as the user actually typed it (the dispatch in\n  // svaba.cpp strips the \"svaba\" token before calling us).\n  std::string cl = \"svaba\";\n  for (int i = 0; i < argc; ++i) { cl.push_back(' '); cl += argv[i]; }\n\n  const Opts o = parseOpts(argc, argv);\n\n  // Pick active suffixes — only the ones whose BAM actually exists. No point\n  // reserving a thread budget slice for a missing file.\n  std::vector<std::string> active;\n  for (const auto& s : kAllSuffixes) {\n    const std::string bam = o.id + \".\" + s + \".bam\";\n    if (fileExists(bam)) active.push_back(s);\n  }\n\n  if (active.empty()) {\n    std::cerr << \"No BAMs found for ID '\" << o.id << \"' (checked suffixes: \";\n    for (size_t i = 0; i < kAllSuffixes.size(); ++i) {\n      if (i) std::cerr << \", \";\n      std::cerr << kAllSuffixes[i];\n    }\n    std::cerr << \")\" << std::endl;\n    return;\n  }\n\n  // Split the thread budget across concurrent suffix jobs, matching the\n  // shell script's behavior: floor(THREADS / n_active), min 1. If threads <\n  // n_active, cap concurrency to threads so we don't oversubscribe.\n  const int n_active = static_cast<int>(active.size());\n  const int max_parallel   = std::min(o.threads, n_active);\n  const int per_job_sort_t = std::max(1, o.threads / n_active);\n\n  if (o.verbose >= 1) {\n    std::ostringstream act;\n    for (size_t i = 0; i < active.size(); ++i) {\n      if (i) act << \" \";\n      act << active[i];\n    }\n    std::cerr << \"svaba postprocess: id=\" << o.id\n              << \" threads=\" << o.threads\n              << \" mem=\" << o.mem\n              << \" parallel=\" << max_parallel\n              << \" per-job-sort-threads=\" << per_job_sort_t\n              << \" sort=\" << (o.dedup_only ? \"off\" : \"on\")\n              << \" dedup=\" << (o.sort_only  ? \"off\" : \"on\")\n              << \"\\n  active: \" << act.str() << std::endl;\n  }\n\n  // One-shot note so users don't chase the htslib \"[E::idx_find_and_load]\"\n  // lines that will appear below. Those come from SeqLib::BamReader::Open\n  // (called by streamDedup and by readHeaderOnly inside reheaderBamWithPg)\n  // eagerly trying to load a .bai that doesn't exist yet — we sort first,\n  // then rewrite (dedup or reheader), then build the .bai at the very end.\n  // Every read path here is sequential, so the missing index is irrelevant\n  // to correctness. We print this once, before spawning workers, and leave\n  // htslib's own logging alone so genuine warnings (corrupt records,\n  // permission errors, out-of-space, etc.) still surface visibly.\n  std::cerr << \"svaba postprocess: NOTE — the following \"\n               \"\\\"[E::idx_find_and_load] Could not retrieve index file ...\\\" \"\n               \"lines from htslib are expected and can be ignored. \"\n               \".bai files are built as the final step of each suffix's \"\n               \"pipeline, not before the read passes that produce them.\"\n            << std::endl;\n\n  // Two-phase execution:\n  //\n  //   Phase 1 (PARALLEL): run samtools sort across all active suffixes\n  //     concurrently. Sort is disk+CPU bound and perfectly parallelizable\n  //     across files, so each worker gets `per_job_sort_t = o.threads /\n  //     n_active` threads — total thread usage ≈ o.threads.\n  //\n  //   Phase 2 (SERIAL): dedup + reheader + index, one suffix at a time,\n  //     each with the FULL `o.threads` budget for its BGZF read/write\n  //     pool. Running the dedup phase in parallel would fragment the\n  //     thread budget (4 suffixes × 2 threads/pool = 2× oversubscription\n  //     once you count read+write pools per suffix), yielding worse wall\n  //     time than serial-with-wide-pools because BGZF parallelism has\n  //     diminishing returns — 8 threads get ~5x vs single-thread, but 4\n  //     parallel workers with 2 threads each get only 4 × 1.8x / 4 ≈ 1.8x\n  //     effective per-BAM.\n  //\n  // Each phase is itself idempotent: Phase 1 skips sort when the BAM is\n  // already @HD SO:coordinate; Phase 2 skips dedup when the header\n  // already carries a `svaba_postprocess` @PG line. Rerunning a\n  // completed postprocess is essentially instant.\n\n  // --- Phase 1: parallel sort ----------------------------------------\n  if (!o.dedup_only) {\n    if (o.verbose >= 1)\n      std::cerr << \"svaba postprocess: phase 1/2 — parallel sort across \"\n                << active.size() << \" suffixes (\"\n                << per_job_sort_t << \" threads each)\" << std::endl;\n    std::vector<std::thread> workers;\n    workers.reserve(active.size());\n    for (const auto& suffix : active) {\n      workers.emplace_back(\n          processSuffix,\n          o.id,\n          suffix,\n          per_job_sort_t,\n          o.mem,\n          /*do_sort=*/    true,\n          /*do_dedup=*/   false,  // deferred to phase 2\n          /*do_finalize=*/false,  // phase 1 exits right after sort\n          cl,\n          o.verbose);\n    }\n    for (auto& t : workers) t.join();\n  }\n\n  // --- Phase 2: serial dedup + reheader + index ----------------------\n  // `o.threads` per invocation — one BAM at a time gets the whole budget.\n  if (o.verbose >= 1)\n    std::cerr << \"svaba postprocess: phase 2/2 — serial dedup+reheader+index\"\n              << \" (\" << o.threads << \" threads per BAM)\" << std::endl;\n  for (const auto& suffix : active) {\n    processSuffix(\n        o.id,\n        suffix,\n        o.threads,                   // full BGZF pool budget\n        o.mem,\n        /*do_sort=*/    false,       // already sorted in phase 1 (or skipped by --dedup-only)\n        /*do_dedup=*/   !o.sort_only,\n        /*do_finalize=*/true,\n        cl,\n        o.verbose);\n  }\n\n  if (o.verbose >= 1)\n    std::cerr << \"svaba postprocess: all suffixes done (sorted\"\n              << (o.sort_only ? \"\" : \", deduped where applicable\")\n              << \", PG-stamped, indexed)\" << std::endl;\n}\n"
  },
  {
    "path": "src/svaba/SvabaPostprocess.h",
    "content": "#pragma once\n\n// Post-process svaba output BAMs: coordinate-sort via samtools, then run a\n// native streaming dedup on the suffixes that can accumulate exact duplicate\n// records from overlapping assembly windows (weird, corrected, discordant).\n//\n// Replaces the slow path of sort_output.sh, which went through\n// `samtools view | awk | samtools view` — that pipeline decompresses every\n// record to SAM text, maintains a large awk hash, and recompresses on the\n// way out. This module keeps everything in native htslib / SeqLib records\n// and resets the dedup set at every locus boundary, so memory is O(reads\n// per locus) and throughput is close to what the disk+decoder can sustain.\n//\n// Scope:\n//   - Sort      → shell out to `samtools sort` (already highly tuned; htslib\n//                 doesn't expose its sort as a library call).\n//   - Dedup     → native streaming, (qname, flag) keyed, per-locus reset.\n//                 Stamps an @PG line onto the output header as a free\n//                 side-effect of rewriting the file.\n//   - Reheader  → for suffixes that don't go through dedup (e.g. `contigs`,\n//                 or anything under --sort-only), shell out to\n//                 `samtools reheader` to stamp the same @PG line. Streams the\n//                 BGZF body as opaque blocks — cheap.\n//   - Index     → native `sam_index_build` (htslib) producing a .bai\n//                 alongside every final BAM.\n//   - Per-suffix parallelism via std::thread; suffixes run independently.\n//\n// End state: ${ID}.${suffix}.bam is the single authoritative output per\n// suffix — sorted, deduped (where applicable), @PG-stamped, and indexed.\n// Intermediate files use a .postprocess.*.tmp.bam suffix and are cleaned up\n// on both success (rename-over) and failure (best-effort unlink).\n//\n// Explicitly NOT in scope here (still in sort_output.sh):\n//   - thread-BAM merging (pre-svaba-postprocess step)\n//   - SPLIT_BY_SOURCE qname-prefix demultiplexing\n//\n// CLI:  svaba postprocess -i <ID> [-t THREADS] [-m MEM] [-v V]\n//                         [--sort-only | --dedup-only]\nvoid runPostprocess(int argc, char** argv);\n"
  },
  {
    "path": "src/svaba/SvabaRead.cpp",
    "content": "#include \"SvabaRead.h\"\n\n#include <htslib/sam.h>  // bam_get_seq, bam_seqi\n\nsvabaRead::svabaRead() = default;\n\nvoid svabaRead::AddR2C(const std::string& contig_name, const r2c& r) {\n  \n  auto it = m_r2c.find(contig_name);\n  if(it != m_r2c.end()) \n    it->second = r;\n  else\n    m_r2c.insert({contig_name, r});\n\n  // add as a tag to the read\n  //TODO\n}\n\nr2c svabaRead::GetR2C(const std::string& contig_name) const {\n  //assert(m_r2c);\n  R2CMap::const_iterator ff = m_r2c.find(contig_name);\n  assert(ff != m_r2c.end());\n  return m_r2c.find(contig_name)->second;\n}\n\nint svabaRead::CorrectedSeqLength() const {\n  if (seq_corrected.length())\n    return seq_corrected.length();\n  else\n    return Length();\n}\n\nstd::ostream& operator<<(std::ostream& out, const r2c& a) {\n  out << \"[\" << a.start_on_contig << \",\" << a.end_on_contig << \"] -- \" \n      << \"[\" << a.start_on_read << \"]\" \n      << a.cig;\n  return out;\n}\n\nvoid svabaRead::QualityTrimRead() {\n\n  int32_t startpoint = 0, endpoint = 0;\n  QualityTrimmedSequence(3, startpoint, endpoint);\n  int32_t new_len = endpoint - startpoint;\n  if (endpoint != -1 && new_len < Length() &&\n      new_len > 0 &&\n      new_len - startpoint >= 0 &&\n      startpoint + new_len <= Length()) { \n    try { \n      SetCorrectedSeq(Sequence().substr(startpoint, new_len));\n    } catch (...) {\n      std::cerr << \"Subsequence failure with sequence of length \"  \n\t\t<< Sequence().length() << \" and startpoint \"\n\t\t<< startpoint << \" endpoint \" << endpoint \n\t\t<< \" newlen \" << new_len << std::endl;\n    }\n\n  } else {\n    SetCorrectedSeq(Sequence()); // copies the sequence into private \"seq\" char\n  }\n\n  // remove the HTSlib version of qual and sequence\n  // since we store the trimmed sequence in svabaRead\n  //SetSequence(std::string());\n\n}\n\nsvabaRead::svabaRead(const SeqLib::BamRecord& r, std::string_view prefix)\n  : SeqLib::BamRecord()    // base class ctor will init `b` to nullptr\n{\n  // bam_dup1 will allocate-and-copy a new bam1_t for us:\n  bam1_t* dup = bam_dup1(r.raw());\n  if (!dup)\n    throw std::runtime_error(\"svabaRead: failed to duplicate BamRecord\");\n\n  // wrap it in your shared-ptr with the proper deleter\n  b = SeqPointer<bam1_t>(dup, SeqLib::Bam1Deleter());\n\n  // now copy over your svabaRead-specific prefix\n  assert(prefix.size() >= 4);\n  p.assign(prefix);  \n}\n\nstd::string svabaRead::Prefix() const { \n  assert(p.c_str()[0]=='t' || p.c_str()[0] == 'n');\n  return p; //std::string(p, 4); \n}\n\nstd::string svabaRead::CorrectedSeq() const {\n\n  if (!seq_corrected.length())\n    return Sequence();\n  else\n    return seq_corrected;\n\n}\n\nbool svabaRead::CorrectedSeqChanged() const {\n  // If seq_corrected was never set, it's empty → CorrectedSeq() would\n  // return Sequence(), so by definition nothing changed.\n  if (seq_corrected.empty()) return false;\n\n  // Fast path: length mismatch means quality trimming shortened the read.\n  const int32_t bam_len = Length(); // b->core.l_qseq\n  if (static_cast<int32_t>(seq_corrected.size()) != bam_len) return true;\n\n  // Same length: compare seq_corrected against the BAM's 4-bit encoding\n  // character by character, without allocating a Sequence() string.\n  const uint8_t* seq_enc = bam_get_seq(raw());\n  for (int32_t i = 0; i < bam_len; ++i) {\n    if (seq_corrected[i] != BASES[bam_seqi(seq_enc, i)])\n      return true;\n  }\n  return false;\n}\n\nvoid svabaRead::SetCorrectedSeq(std::string_view nseq) {\n  seq_corrected = nseq;\n}\n\nstd::string svabaRead::UniqueName() const {\n  return(p + \"_\" + std::to_string(AlignmentFlag()) + \"_\" + Qname());\n}\n"
  },
  {
    "path": "src/svaba/SvabaRead.h",
    "content": "#pragma once\n\n#include \"SeqLib/BamRecord.h\" \n\n#include <vector>\n#include <string_view>\n#include <unordered_map>\n\nusing SeqLib::BamRecordPtr;\nusing SeqLib::BamRecordPtrVector;\n\n/** Store information about a read to contig alignment */\nstruct r2c {\n\n  int32_t start_on_contig = 0;  // start pos on contig (from r.Position())\n  int32_t end_on_contig   = 0;  // end pos on contig (from r.PositionEnd())\n  int32_t start_on_read    = 0; // start pos on read (from r.AlignmentPosition())\n  int32_t end_on_read     = 0;  // end pos on read (from r.AlignmentPosition())\n  bool rc = false;    // reverse complement wrt contig?\n  SeqLib::Cigar cig; // cigar of read to contig\n  bool supports_var = false; // does this support a variant?\n  bool is_split = false; // is this a split read?\n  int left_or_right = 0; //-1 read aligns on left of contig, 1 on right\n  bool supports_discordant = false; // true if this is part of a discordant pair that supports the break\n\n  // SvABA2.0: NM tag on the r2c alignment (edit distance to contig).\n  // -1 sentinel means \"not set\" (legacy paths that filled r2c without\n  // going through AddAlignment). Surfaced in alignments.txt.gz so the\n  // human-readable dump shows per-read edit distance to the contig.\n  int32_t nm = -1;\n\n  void AddAlignment (const BamRecordPtr& b) {\n    start_on_contig = b->Position();\n    end_on_contig = b->PositionEnd();\n    start_on_read = b->AlignmentPosition();\n    cig = b->GetCigar();\n    int _nm = 0;\n    if (b->GetIntTag(\"NM\", _nm)) nm = _nm;\n  }\n  \n  friend std::ostream& operator<<(std::ostream& out, const r2c& a);\n};\n\ntypedef std::unordered_map<std::string, r2c> R2CMap;\n\nclass svabaRead;\ntypedef std::shared_ptr<svabaRead> svabaReadPtr;\ntypedef std::vector<svabaReadPtr> svabaReadPtrVector;\n\nclass svabaRead : public SeqLib::BamRecord {\n\n public:\n  \n  svabaRead();\n  \n  svabaRead(const SeqLib::BamRecord& r,\n\t    std::string_view prefix);\n\n  // Delete the copy constructor                                                                                                                                                      \n  svabaRead(const svabaRead&) = delete;                                                                                                                                               \n                                                                                                                                                                                      \n  // Optionally also delete copy assignment                                                                                                                                           \n  svabaRead& operator=(const svabaRead&) = delete;                                                                                                                                    \n                                                                                                                                                                                      \n  // Still allow move operations:                                                                                                                                                     \n  svabaRead(svabaRead&&) = default;                                                                                                                                                   \n  svabaRead& operator=(svabaRead&&) = default;  \n  \n  std::string CorrectedSeq() const;\n\n  /// True if BFC correction or quality trimming changed the read sequence\n  /// relative to the original BAM record. When false, the original BAM's\n  /// CIGAR/NM is a valid native alignment (assuming the same aligner).\n  /// Compares the stored seq_corrected against the BAM 4-bit encoding\n  /// without constructing a second string for the original.\n  bool CorrectedSeqChanged() const;\n\n  std::string Prefix() const;\n\n  void SetPrefix(const std::string_view pref) { p = pref; }\n  \n  void SetCorrectedSeq(const std::string_view nseq);  \n  \n  std::string UniqueName() const;\n\n  int GetDD() const { return dd; }\n\n  void SetDD(int d) { dd = d; }\n\n  bool Tumor() const { return p[0] == 't'; }\n\n  int SeqLength() const; \n\n  void AddR2C(const std::string& contig_name, const r2c& r);\n\n  r2c GetR2C(const std::string& contig_name) const;\n\n  /// Does this read have any r2c alignments?\n  bool HasR2C() const { return !m_r2c.empty(); }\n\n  /// Trim the read based on quality score and store seq in char\n  void QualityTrimRead();\n\n  int CorrectedSeqLength() const;\n\n  // discordant read status\n  // < 0 is bad discordant read (see DiscordantRealigner.h)\n  // == 0 not discordant\n  // 1 = good\n  int dd = 0;\n\n  // SvABA2.0: post-BFC re-alignment of the *corrected* read sequence to the\n  // reference, populated by SvabaRegionProcessor before assembly. The point\n  // is to give BreakPoint::splitCoverage's \"r2c better than native\" gate\n  // an apples-to-apples comparison: both sides use the corrected read\n  // sequence and the same BWA-MEM parameters that svaba uses internally,\n  // rather than mixing svaba-corrected r2c against the input BAM's\n  // pre-correction CIGAR/NM (which was the source of an asymmetric gate\n  // letting reads with mirror r2c indels through as variant supporters).\n  //\n  // Sentinel: corrected_native_nm == -1 means \"not populated\" (e.g. read\n  // with to_assemble == false, or empty corrected sequence). In that case\n  // splitCoverage falls back to GetCigar()/GetIntTag(\"NM\",...) on the\n  // original BAM record.\n  SeqLib::Cigar corrected_native_cig;\n  int32_t       corrected_native_nm = -1;\n\n  friend class svabaBamWalker;\n\n  bool to_assemble = true;\n  \n private:\n\n  std::string p; // prefix for file ID (e.g. t001)\n\n  bool train = false;\n  \n  std::string seq_corrected; // quality trimmed and/or error corrected\n\n  // store the r2c alignment information. key is contig name\n  R2CMap m_r2c; \n\n};\n\ntypedef std::vector<svabaRead> svabaReadVector;\n\n"
  },
  {
    "path": "src/svaba/SvabaRegionProcessor.cpp",
    "content": "#include \"SvabaRegionProcessor.h\"\n\nextern \"C\" {\n#include \"fml.h\"\n}\n#include <iomanip>  // For std::setw and std::right\n#include <sstream>  // For std::ostringstream\n#include <chrono>\n#include <cstring>  // For memset\n\n#include \"SvabaDebug.h\"\n#include \"SvabaUtils.h\"\n#include \"SvabaOutputWriter.h\"\n#include \"ContigAlignmentScore.h\"\n\n#include \"SeqLib/BWAAligner.h\"\n#include \"SeqLib/GenomicRegion.h\"\n#include \"SeqLib/GenomicRegionCollection.h\"\n#include \"SeqLib/BFC.h\"\n#include \"SeqLib/BamRecord.h\"\n\n#include \"SvabaRead.h\"\n#include \"SvabaAssemblerEngine.h\"\n\nusing SeqLib::GenomicRegion;\nusing SeqLib::GRC;\nusing SeqLib::AddCommas;\nusing SeqLib::BFC;\nusing SeqLib::BamRecordVector;\nusing SeqLib::CigarMap;\nusing SeqLib::UnalignedSequenceVector;\nusing SeqLib::BWAIndexPtr;\nusing SeqLib::BWAAligner;\nusing SeqLib::BWAIndex;\nusing SeqLib::BamRecordPtr;\nusing SeqLib::BamRecordPtrVector;\n\nusing std::vector;\nusing std::unordered_map;\nusing std::unordered_set;\nusing std::string;\n\n#include \"SvabaAssemblerConfig.h\"\n\n// ---------------------------------------------------------------------------\n// Alt-contig demotion: after BWA aligns a contig, prefer standard-chromosome\n// placements over alt/decoy when the alignment quality is comparable.\n//\n// BWA-MEM sometimes places a contig fragment on an alt contig (e.g.\n// chr11_JH159136v1_alt) when chr11 proper has an equally good alignment.\n// If the alt later gets blacklisted, the real breakpoint is lost. Fix: for\n// each primary/supplementary fragment on a non-standard chr, check if a\n// secondary on a standard chr covers the same query range with comparable\n// AS. If so, swap their SAM flags so the standard-chr placement becomes\n// the active fragment and the alt-chr one becomes a secondary.\n// ---------------------------------------------------------------------------\nnamespace {\n\n// Query interval [start, end) consumed by an alignment, in contig\n// coordinates. Uses the CIGAR to find leading/trailing soft-clip\n// (hardclip=false so all clips are soft).\ninline std::pair<int,int> queryInterval(const SeqLib::BamRecord& r) {\n  const auto cig = r.GetCigar();\n  int lead_clip = 0, trail_clip = 0, qlen = r.Length();\n  if (cig.size() > 0) {\n    if (cig.front().Type() == 'S') lead_clip = cig.front().Length();\n    if (cig.size() > 1 && cig.back().Type() == 'S')\n      trail_clip = cig.back().Length();\n  }\n  return {lead_clip, qlen - trail_clip};\n}\n\n// Reciprocal overlap fraction between two intervals.\ninline double reciprocalOverlap(std::pair<int,int> a, std::pair<int,int> b) {\n  int ov = std::max(0, std::min(a.second, b.second) - std::max(a.first, b.first));\n  int la = a.second - a.first, lb = b.second - b.first;\n  if (la <= 0 || lb <= 0) return 0.0;\n  return std::min(static_cast<double>(ov) / la, static_cast<double>(ov) / lb);\n}\n\n// Number of swaps performed (for logging).\nsize_t preferStandardChromosomes(BamRecordPtrVector& alns, int maxStdChr) {\n  if (maxStdChr < 0) return 0; // --non-human: no preference\n\n  size_t n_swaps = 0;\n  for (size_t i = 0; i < alns.size(); ++i) {\n    auto& aln = alns[i];\n    if (!aln || !aln->MappedFlag()) continue;\n    if (aln->SecondaryFlag())       continue; // only consider primary/supp\n    if (aln->ChrID() <= maxStdChr)  continue; // already on a standard chr\n\n    int32_t orig_as = 0;\n    aln->GetIntTag(\"AS\", orig_as);\n    auto orig_qi = queryInterval(*aln);\n\n    size_t best_j = SIZE_MAX;\n    int32_t best_as = -1;\n\n    for (size_t j = 0; j < alns.size(); ++j) {\n      auto& sec = alns[j];\n      if (!sec || !sec->MappedFlag()) continue;\n      if (!sec->SecondaryFlag())      continue; // must be a secondary\n      if (sec->ChrID() > maxStdChr)   continue; // also non-standard\n\n      int32_t sec_as = 0;\n      sec->GetIntTag(\"AS\", sec_as);\n\n      // Must be within 5% of the non-standard alignment's AS\n      if (orig_as > 0 && sec_as < static_cast<int32_t>(orig_as * 0.95))\n        continue;\n\n      // Must cover similar query range (>= 80% reciprocal overlap)\n      if (reciprocalOverlap(orig_qi, queryInterval(*sec)) < 0.80)\n        continue;\n\n      if (sec_as > best_as) {\n        best_as = sec_as;\n        best_j  = j;\n      }\n    }\n\n    if (best_j != SIZE_MAX) {\n      auto& promoted = alns[best_j];\n\n      SVABA_TRACE(aln->Qname(),\n                  \"ALT_DEMOTION: chr\" << aln->ChrID()\n                  << \" AS=\" << orig_as\n                  << \" -> chr\" << promoted->ChrID()\n                  << \" AS=\" << best_as\n                  << (aln->SupplementaryFlag() ? \" (supp)\" : \" (pri)\"));\n\n      // Swap SAM flags: demote non-standard to secondary,\n      // promote standard to the role the non-standard held.\n      bool was_supp = aln->SupplementaryFlag();\n\n      // Demote: secondary=1, supplementary=0\n      aln->raw()->core.flag |=  BAM_FSECONDARY;\n      aln->raw()->core.flag &= ~BAM_FSUPPLEMENTARY;\n\n      // Promote: secondary=0, supplementary=was_supp\n      promoted->raw()->core.flag &= ~BAM_FSECONDARY;\n      if (was_supp)\n        promoted->raw()->core.flag |= BAM_FSUPPLEMENTARY;\n      else\n        promoted->raw()->core.flag &= ~BAM_FSUPPLEMENTARY;\n\n      ++n_swaps;\n    }\n  }\n  return n_swaps;\n}\n\n} // anon namespace\n\nSvabaRegionProcessor::SvabaRegionProcessor(SvabaSharedConfig& sh_cf) : sc(sh_cf)\n{ }\n\nGRC SvabaRegionProcessor::runMateCollectionLoop(const GenomicRegion& region,\n\t\t\t\t\t\t svabaThreadUnit& stu)\n{\n\n  // store the newly found bad mate regions\n  GRC this_bad_mate_regions; \n\n  MateRegionVector all_somatic_mate_regions;\n  // add the origional, don't want to double back    \n  all_somatic_mate_regions.add(MateRegion(region.chr, region.pos1, region.pos2));\n  \n  // collect together mate regions from control\n  MateRegionVector normal_mate_regions;\n  for (const auto& [key, walker] : stu.walkers) {\n    if (!key.empty() && key[0] == 'n') {\n      normal_mate_regions.Concat(walker->mate_regions);\n    }\n  }  \n  normal_mate_regions.MergeOverlappingIntervals();\n  normal_mate_regions.CreateTreeMap();\n  \n  // get the mates from somatic 3+ mate regions\n  // that don't overlap with normal mate region\n  MateRegionVector somatic_mate_regions;\n  for (const auto& [key, walker] : stu.walkers) {\n    if (!key.empty() && key[0] == 't') {\n      for (const auto& i : walker->mate_regions) {\n\tif (i.count >= sc.opts.mateLookupMin &&\n\t    !normal_mate_regions.CountOverlaps(i) &&\n\t    //!stu.badd.CountOverlaps(i) && //TODO - don't use this anymore\n\t    (sc.blacklist.empty() || !sc.blacklist.CountOverlaps(i)))\n\t  {\n\t    somatic_mate_regions.add(i);\n\t  }\n      }\n    }\n  }  \n  somatic_mate_regions.MergeOverlappingIntervals();\n  \n  // if none, then we're done\n  if (somatic_mate_regions.size() == 0)\n    return GRC();\n  \n  // print out to log\n  for (auto& i : somatic_mate_regions)\n    sc.logger.log(sc.opts.verbose > 1, sc.opts.verbose_log, \n\t\t  \"......mate region \",\n\t\t  i.ToString(sc.header) ,\n\t\t  \" case read count that triggered lookup: \",\n\t\t  i.count);\n  \n  // convert MateRegionVector to GRC\n  GRC somatic_mate_region_collection;\n  for (const auto& s : somatic_mate_regions) \n    somatic_mate_region_collection.add(\n\t\t\t\t       GenomicRegion(s.chr, s.pos1, s.pos2, s.strand));\n  somatic_mate_region_collection.MergeOverlappingIntervals();\n  somatic_mate_region_collection.CreateTreeMap();\n  \n  // convert MateRegionVector to GRC\n  GRC gg;\n  for (auto& s : somatic_mate_regions) \n    gg.add(GenomicRegion(s.chr, s.pos1, s.pos2, s.strand));\n  \n  // collect the reads for this round\n  for (auto& [key, walker] : stu.walkers) {\n    const int before = walker->reads.size();\n    walker->m_limit = sc.opts.mate_region_lookup_limit;\n    \n    if (!walker->SetRegions(gg))\n      continue;\n    \n    walker->get_coverage = false;\n    walker->get_mate_regions = false;\n    walker->mate_regions.clear();\n\n    auto prior_end = walker->reads.end();\n    GRC bad = walker->readBam(stu);\n\n    // reset\n    walker->m_limit = sc.opts.weird_read_limit;\n    walker->get_coverage = true;\n    walker->get_mate_regions = true;\n    \n    //stu.badd.Concat(bad);\n    //stu.badd.MergeOverlappingIntervals();\n    //stu.badd.CreateTreeMap();\n    \n    assert(!key.empty());\n    auto& count = (key[0] == 't') ? stu.st.mate_read_count.first : stu.st.mate_read_count.second;    \n    count += walker->reads.size() - before;\n  }\n  \n  sc.logger.log(sc.opts.verbose > 1, sc.opts.verbose_log,\n\t\t\"......Mate region reads: <case, control>: <\",\n\t\tstu.st.mate_read_count.first, \",\",\n\t\tstu.st.mate_read_count.second, \">\");\n\n  return somatic_mate_region_collection;\n}\n\n\nbool SvabaRegionProcessor::process(const SeqLib::GenomicRegion& region,\n                                   svabaThreadUnit&             unit,\n                                   size_t                       threadId)\n{\n\n  // SvABA2.0: are any dump-reads BAMs going to be written? Used to skip\n  // bi:Z and bz:Z tag bookkeeping on the read hot path when no dump\n  // output is requested — the tags feed only the weird/discordant/\n  // corrected BAM writers in SvabaOutputWriter, so under the default\n  // production command line (no --dump-reads) the tag work is pure\n  // waste. Declared at function scope so both the r2c-alignment\n  // (bz:Z) and BP-finalization (bi:Z) blocks see it.\n  const bool need_read_tags =\n      sc.opts.dump_weird_reads      ||   // compile-time constexpr\n      sc.opts.dump_discordant_reads ||   // both flip together under\n      sc.opts.dump_corrected_reads;      // --dump-reads\n\n  // count for this unit\n  unit.processed_count++;\n  sc.total_regions_done++;\n  if (sc.total_regions_done % 250 == 0) {\n    std::ostringstream msg;\n    msg << \"...processing \"\n\t<< std::right << std::setw(5) << SeqLib::AddCommas(sc.total_regions_done)\n\t<< \" of \"\n\t<< std::right << std::setw(6) << SeqLib::AddCommas(sc.total_regions_to_process)\n\t<< \" for thread \"\n\t<< std::right << std::setw(2) << unit.threadId\n\t<< \" for region \"\n\t<< region;\n    sc.logger.log(true, true, msg.str()); \n  }\n  \n  sc.logger.log(sc.opts.verbose > 1, sc.opts.verbose_log,\n\t\t\"===Running region \", region.ToString(sc.header),\n\t\t\" on thread \", unit.threadId);\n  \n  // start a new timer\n  unit.st = svabaUtils::svabaTimer();\n  unit.st.gr = region;\n  unit.st.start();\n  \n  // get the reference sequence of the local region\n  string lregion;\n  try {\n    lregion = unit.ref_genome->QueryRegion(sc.header.IDtoName(region.chr), region.pos1, region.pos2);\n  } catch (...) {\n    std::cerr << \" Caught exception for lregion with reg \" << region.ToString(sc.header);\n    lregion = \"\";\n  }\n  std::vector<std::pair<int,int>> repeats_to_avoid = svabaUtils::find_repeats(lregion, 20,10);\n  SeqLib::GRC local_blacklist;\n  for (auto& [key, walker] : unit.walkers) {  \n    for (const auto& [st, sp] : repeats_to_avoid) {\n      walker->local_blacklist.add(GenomicRegion(region.chr, region.pos1 + st, region.pos1 + sp));\n    }\n    walker->local_blacklist.MergeOverlappingIntervals();\n    walker->local_blacklist.CreateTreeMap();\n  }\n  if (repeats_to_avoid.size())\n    sc.logger.log(sc.opts.verbose > 1, sc.opts.verbose_log, \"  found ref repeats at\"); //debug\n  for (const auto& [st,sp] : repeats_to_avoid) {\n    sc.logger.log(sc.opts.verbose > 1, sc.opts.verbose_log, \"  \",region.ChrName(sc.header),\n\t\t  \":\",region.pos1 + st, \"-\",region.pos1+sp);    \n  }\n  \n  \n  // holder for Bam: (read : cigar)\n  unordered_map<string, CigarMap> cigmap;\n  \n  // loop all of the BAMs (walkers)\n  CountPair read_counts = {0,0}; //tumor, normal\n  for (auto& [key, walker] : unit.walkers) {\n    \n    // Set regions based on command-line region or file-defined intervals\n    if (!region.IsEmpty())\n      walker->SetRegion(region);\n    else if (!sc.file_regions.empty())\n      walker->SetRegions(sc.file_regions);\n    // else: walk entire BAM (default)\n    \n    sc.logger.log(sc.opts.verbose > 1, sc.opts.verbose_log, \"---running svabaBamWalker\", *walker);\n\n    // reset the walker params\n    walker->m_limit = sc.opts.weird_read_limit;\n    walker->get_coverage = true;\n    walker->get_mate_regions = true;\n    SeqLib::GRC bad = walker->readBam(unit);\n    //unit.badd.Concat(bad);\n\n    sc.logger.log(sc.opts.verbose > 3, false, \"...finished reading, found \", bad.size(), \" bad regions\");\n\n    // TODO - right now we don't do anything with these bad regions\n    //unit.badd.MergeOverlappingIntervals();\n    //unit.badd.CreateTreeMap(); \n    \n    // Update read count based on sample type\n    auto& count = (key[0] == 't') ? unit.st.weird_read_count.first : unit.st.weird_read_count.second;\n    count += walker->reads.size();\n    \n    // Store CIGARs\n    cigmap[key] = walker->cigmap;\n\n    //debug\n    // for (const auto& [walker_name,cm] : cigmap) {\n    //   for (const auto& [key, ccount] : cm) {\n    // \tstd::cerr << \"Walker: \" << walker_name << \" key: \" <<\n    // \t  key << \" count \" << ccount << std::endl;\n    //   }\n    // }\n    \n  } //end BAM loop\n\n  sc.logger.log(sc.opts.verbose > 1, sc.opts.verbose_log,\n\t\t\"...main region reads <case,control> \",\n\t\t\"<\", unit.st.weird_read_count.first, \",\",\n\t\tunit.st.weird_read_count.second, \">\");\n  \n  // adjust counts and timer\n  unit.st.stop(\"r\");\n\n  // get the mate reads, if this is local assembly and has insert-size distro\n  GRC mate_regions_for_native;\n  if (!region.IsEmpty()) {\n    mate_regions_for_native = runMateCollectionLoop(region, unit);\n    unit.st.stop(\"m\");\n  }\n  \n  // do the discordant read clustering\n  sc.logger.log(sc.opts.verbose > 1, false, \n\t\t\"...discordant read clustering\");\n  \n  // tag the reads by discordant status\n  svabaReadPtrVector all_discordant_reads;  \n\n  for (auto& [_, walker] : unit.walkers) {\n    //walker->RealignDiscordants(unit);\n    for (auto& r : walker->reads) {\n      if (r->dd > 0)\n\tall_discordant_reads.push_back(r);\n    }\n  }\n  unit.st.dc_read_count = all_discordant_reads.size();\n\n  // do the discordant read clustering across BAMs\n  DiscordantClusterMap dmap = DiscordantCluster::clusterReads(all_discordant_reads, \n\t\t\t\t\t\t\t      region,\n\t\t\t\t\t\t\t      sc.header);\n\n\t \n  all_discordant_reads.clear();\n  unit.st.dc_cluster_count = dmap.size();\n  \n  // add the discordant clusters to the svabathreadunit for writing later\n  unit.m_disc.insert(dmap.begin(), dmap.end());\n\n  // for dumping all reads (weird BAM and/or discordant BAM)\n  if (sc.opts.dump_weird_reads || sc.opts.dump_discordant_reads) {\n    for (auto& [_, dc] : dmap) {\n      dc.labelReads(); // add the discordantcluster label to the read\n    }\n    for (const auto& [_, walker] : unit.walkers) {\n      unit.all_weird_reads.insert(unit.all_weird_reads.end(),\n\t\t\t\t  walker->reads.begin(),\n\t\t\t\t  walker->reads.end());\n    }\n  }\n  \n  // do the discordant read clustering\n  sc.logger.log(sc.opts.verbose > 1, false, \"...error correcting\");\n  \n  // do kmer correction — pooled across all walkers (tumor + normal)\n  // so BFC sees the combined k-mer spectrum for better error/signal\n  // discrimination. Matches old svaba behavior. Single Train + single\n  // ErrorCorrect instead of per-walker, halving the BFC cost.\n  //\n  // The BFC object lives on the thread unit (unit.pooled_bfc) so its\n  // k-mer hash table (1M sub-tables at l_pre=20) persists across\n  // regions. On the first Train(), fml_count allocates all 1M tables;\n  // on subsequent calls, fml_count_into clears and reuses them via\n  // kh_clear (memset of flags), eliminating ~2M malloc/free calls\n  // per region — measured at 47% of worker time before this fix.\n  if (sc.opts.ecCorrectType == \"f\") {\n\n    // Lazy-init the per-thread BFC on first use\n    if (!unit.pooled_bfc)\n      unit.pooled_bfc = std::make_unique<BFC>();\n\n    BFC& bfc = *unit.pooled_bfc;\n\n    // Phase 1: pool all training reads + weird reads\n    for (auto& [_, walker] : unit.walkers) {\n      for (const auto& u : walker->train_reads)\n        bfc.AddSequence(u.Seq, \"\", u.Name);\n      for (const auto& r : walker->reads) {\n        if (!r->to_assemble) continue;\n        bfc.AddSequence(r->CorrectedSeq(), \"\", r->UniqueName());\n      }\n    }\n\n    // Phase 2: train (reuses hash on 2nd+ call), then re-add\n    // only correctable reads and run error correction\n    bfc.Train();\n    bfc.ClearReads();\n    for (auto& [_, walker] : unit.walkers) {\n      for (const auto& r : walker->reads) {\n        if (!r->to_assemble) continue;\n        bfc.AddSequence(r->CorrectedSeq(), \"\", r->UniqueName());\n      }\n    }\n    bfc.ErrorCorrect();\n\n    // Phase 3: drain corrected sequences and distribute back\n    std::unordered_map<std::string, std::string> corrected_by_name;\n    std::string s, nm;\n    while (bfc.GetSequence(s, nm))\n      corrected_by_name.emplace(std::move(nm), std::move(s));\n\n    // Clear reads from the BFC (hash stays alive for next region)\n    bfc.ClearReads();\n\n    size_t num_reads_corrected = 0;\n    for (auto& [_, walker] : unit.walkers) {\n      for (auto& r : walker->reads) {\n        if (!r->to_assemble) continue;\n        auto it = corrected_by_name.find(r->UniqueName());\n        if (it != corrected_by_name.end()) {\n          SVABA_READ_TRACE(r->Qname(),\n            \"BFC corrected: changed=\" << (r->CorrectedSeq() != it->second ? \"YES\" : \"NO\")\n            << \" orig_len=\" << r->CorrectedSeq().size()\n            << \" corr_len=\" << it->second.size());\n          r->SetCorrectedSeq(it->second);\n          ++num_reads_corrected;\n        } else {\n          SVABA_READ_TRACE(r->Qname(), \"BFC: not in corrected output (lost in hash?)\");\n        }\n      }\n    }\n\n    sc.logger.log(sc.opts.verbose > 0, sc.opts.verbose_log,\n\t\t  \"...BFC corrected \", SeqLib::AddCommas(num_reads_corrected));\n\n#ifdef SVABA_KMER_RESTRICT\n    // Post-correction kmer filter: drop any read whose corrected\n    // sequence doesn't contain the target kmer (or its revcomp).\n    // Dropped reads get to_assemble=false so they won't enter\n    // fermi assembly, r2c alignment, corrected.bam, or scoring.\n    size_t kmer_kept = 0, kmer_dropped = 0;\n    for (auto& [_, walker] : unit.walkers) {\n      for (auto& r : walker->reads) {\n        if (!r->to_assemble) continue;\n        if (_svaba_kmer_match(r->CorrectedSeq())) {\n          ++kmer_kept;\n        } else {\n          r->to_assemble = false;\n          ++kmer_dropped;\n        }\n      }\n    }\n    sc.logger.log(true, true,\n                  \"...KMER_RESTRICT: kept \", kmer_kept,\n                  \" dropped \", kmer_dropped,\n                  \" kmer=\", SVABA_KMER_RESTRICT);\n#endif\n\n    unit.st.stop(\"k\");\n  }\n  \n  // SvABA2.0: realign corrected read sequences to the reference so\n  // BreakPoint::splitCoverage's \"r2c better than native\" gate has an\n  // apples-to-apples comparison: same corrected sequence, same\n  // svaba-internal BWA-MEM parameters, same scoring on both sides.\n  //\n  // Performance optimization: in production mode (no --dump-reads), we\n  // DEFER this to after the r2c alignment loop and only realign reads\n  // that actually hit a contig (HasR2C()). The full-reference BWA call\n  // is the single most expensive operation (~39% of wall time) due to\n  // cache misses on the ~3 GB FM-index, and most reads don't end up\n  // supporting any variant. Reads without r2c hits never enter\n  // splitCoverage, so their native alignment is never consulted.\n  //\n  // In --dump-reads mode we realign ALL reads here (before assembly)\n  // so the corrected.bam output has full reference alignments for IGV.\n  //\n  // Reads that didn't go through correction (to_assemble == false)\n  // keep their default sentinel (corrected_native_nm == -1) and the\n  // gate falls back to the original BAM record for those.\n  if (sc.opts.dump_corrected_reads) {\n    for (const auto& [_, walker] : unit.walkers) {\n      for (const auto& r : walker->reads) {\n        if (!r->to_assemble) continue;\n\n        BamRecordPtrVector aln;\n        unit.bwa_aligner->alignSequence(r->CorrectedSeq(),\n                                        r->UniqueName(),\n                                        aln,\n                                        false,\n                                        0.6,\n                                        SECONDARY_CAP);\n\n        // Alt-contig demotion: if BWA placed the primary on a non-\n        // standard chr but a secondary on a standard chr is comparable,\n        // swap them so the corrected.bam shows standard-chr placements.\n        preferStandardChromosomes(aln, sc.opts.maxMateChrID);\n\n        // Pick the primary (non-supplementary, non-secondary, mapped)\n        // record. If no usable record came back, leave the sentinel.\n        for (const auto& a : aln) {\n          if (!a->MappedFlag())       continue;\n          if ( a->SecondaryFlag())    continue;\n          if ( a->SupplementaryFlag()) continue;\n          int32_t nm = -1;\n          a->GetIntTag(\"NM\", nm);\n          r->corrected_native_cig = a->GetCigar();\n          r->corrected_native_nm  = nm;\n          break;\n        }\n\n        // Only push non-secondary alignments into the corrected BAM\n        // output — secondaries were requested solely for alt-demotion.\n        for (auto& a : aln) {\n          if (!a->SecondaryFlag())\n            unit.all_corrected_reads.push_back(a);\n        }\n      }\n    }\n    sc.logger.log(sc.opts.verbose > 0, sc.opts.verbose_log,\n                  \"...realigned corrected reads to genome (dump mode, all reads)\");\n  }\n  \n  sc.logger.log(sc.opts.verbose > 0, sc.opts.verbose_log,\n\t\t\"...running assemblies for region \",\n\t\tregion); \n  \n  // set the contig prefix\n  // Include the active assembler tag (fermi / sga) so that contig names\n  // carry a record of which engine produced them, e.g.\n  //   c_fermi_chr12_18000000_20000000_0\n  //   c_sga_chr12_18000000_20000000_0\n  string ctg_prefix = string(\"c_\") + svaba::kAssemblerTag + \"_\" +\n    region.ChrName(sc.header) + \"_\" +\n    std::to_string(region.pos1) + \"_\" +\n    std::to_string(region.pos2);\n  \n  // where to store the AlignedContigs for this region \n  std::unordered_map<std::string, AlignedContig> all_AlignedContigs_this_region;\n\n  // setup the engine and peform assembly\n  UnalignedSequenceVector all_unaligned_contigs_this_region;\n#ifndef FERMI  \n  {\n    //    std::cerr << \" SGA\" << std::endl;\n    svabaAssemblerEngine engine(ctg_prefix, sc.opts.sgaErrorRate,\n\t\t\t\tsc.opts.sgaMinOverlap,\n\t\t\t\tsc.readlen);\n\n    size_t dbg = 0;\n    for (const auto& [_, walker] : unit.walkers) {\n\n      //debug\n      // if (region.pos1 == 4287501) {\n      // \tfor (const auto& r : walker->reads)\n      // \t  std::cout << \" RSEQ \" << r->CorrectedSeq() << std::endl;\n      // }\n      \n      engine.fillReadTable(walker->reads);\n      dbg += walker->reads.size();\n    }\n    \n    sc.logger.log(sc.opts.verbose > 1, false, \n\t\t  \"...assembling reads with SGA\");\n    \n    // do the actual assembly\n    engine.performAssembly(1/*sc.opts.num_assembly_rounds*/);\n    \n    // retrieve contigs\n    all_unaligned_contigs_this_region = engine.getContigs();\n\n    // if (region.pos1 == 4287501) \n    //   std::cerr << \" contigs \" <<\n    // \tall_unaligned_contigs_this_region.size() << std::endl;\n  }\n#else\n    {\n      //    std::cerr << \"FERMI\" << std::endl;      \n      // build the reads structure\n      size_t n_reads = 0;\n      for (const auto& [_, walker] : unit.walkers) {\n\tfor (const auto& r : walker->reads)\n\t  n_reads += static_cast<size_t>(r->to_assemble);\n      }\n      fseq1_t *fseq = (fseq1_t*)calloc(n_reads, sizeof(fseq1_t));\n\n      size_t i = 0;\n      for (const auto& [_, walker] : unit.walkers) {\n\tfor (const auto& r : walker->reads) {\n\n\t  // skip reads that we want to track but not assemble\n\t  if (!r->to_assemble)\n\t    continue;\n\t  \n\t  const std::string& cseq = r->CorrectedSeq();\n\t  fseq[i].seq     = strdup(cseq.c_str());\n\t  fseq[i].l_seq   = cseq.length();\n\n\t  // fermi's fml_fltuniq reads qual even when ec_k=-1.\n\t  // Avoid constructing a std::string just to strdup it —\n\t  // malloc + memset directly.\n\t  fseq[i].qual    = (char*)malloc(fseq[i].l_seq + 1);\n\t  memset(fseq[i].qual, 'I', fseq[i].l_seq);\n\t  fseq[i].qual[fseq[i].l_seq] = '\\0';\n\t  ++i;\n\t}\n      }\n\n      \n      fml_opt_t opt;\n      fml_opt_init(&opt);\n\n      // SvABA2.0: loosen fermi-lite defaults for variant-supporting contigs.\n      // Rationale (see fermi-lite/misc.c):\n      //   - We already hand fermi CorrectedSeq(); a second EC pass with\n      //     min_cnt=4 is prone to \"correcting\" low-VAF alt k-mers back to\n      //     reference. Disable EC entirely (ec_k = -1 skips fml_correct).\n      //   - fml_assemble clamps min_ensr/min_insr to [min_cnt, max_cnt].\n      //     Lowering min_cnt lets tips/branches with 2 supporting reads\n      //     survive graph cleaning.\n      //   - MAG_F_POPOPEN enables aggressive trimming of \"open\" tips\n      //     (dead-end branches). A heterozygous indel whose alt bubble\n      //     is shorter than ~2.5x read length reads exactly like an\n      //     open tip and gets trimmed. Clear the flag.\n      //   - fml_opt_adjust sets min_elen = 2.5 * avg_read_len (~375bp for\n      //     150bp reads). We can't override that through fml_assemble\n      //     because it re-runs adjust internally, but disabling POPOPEN\n      //     and lowering min_cnt already do most of the work.\n      opt.ec_k            = -1;                  // skip fermi's EC (svaba pre-corrects)\n      opt.min_cnt         = 2;                   // tolerate rare k-mers\n      opt.max_cnt         = 8;                   // keep headroom for high-cov regions\n      opt.mag_opt.flag   &= ~MAG_F_POPOPEN;      // don't aggressively trim variant tips\n      // optional, very aggressive: opt.mag_opt.flag |= MAG_F_AGGRESSIVE is the\n      // OPPOSITE of what we want (it POPS variant bubbles). Leave it cleared.\n      \n      sc.logger.log(sc.opts.verbose > 1, false, \n\t\t  \"...assembling reads with Fermi-lite\");\n    \n      \n      // 3) Run the assembler\n      int n_utgs = 0;\n      fml_utg_t *utgs = nullptr;\n      if (n_reads > 0)\n\tutgs = fml_assemble(&opt,n_reads,fseq,&n_utgs);\n      \n      // 4) Copy out contig names/sequences into a C++ vector\n      all_unaligned_contigs_this_region.reserve(n_utgs);\n      for (int i = 0; i < n_utgs; i++) {\n\tstd::string name = ctg_prefix + \"_\" + std::to_string(i+1) + \"C\";\n\tstd::string seq = utgs[i].seq;\n\tSeqLib::UnalignedSequence us(name, seq);\n\tall_unaligned_contigs_this_region.push_back(std::move(us));\n      }\n\n      // 5) Clean up\n      fml_utg_destroy(n_utgs, utgs);\n      for (int i = 0; i < n_reads; i++) {\n        free(fseq[i].seq);\n        free(fseq[i].qual);\n      }\n      free(fseq);\n      \n    }\n#endif\n    \n  unit.st.contig_count = all_unaligned_contigs_this_region.size();\n  \n  sc.logger.log(sc.opts.verbose > 0, sc.opts.verbose_log, \"...assembled \",\n\t\tall_unaligned_contigs_this_region.size(),\n\t\t\" contigs for \",\n\t\tctg_prefix);\n  \n  /////////\n  // SETUP FOR LOCAL ALIGNMENT\n  // get the reference sequence of the local region\n  /*  string lregion;\n  try {\n    lregion = unit.ref_genome->QueryRegion(sc.header.IDtoName(region.chr), region.pos1, region.pos2);\n  } catch (...) {\n    std::cerr << \" Caught exception for lregion with reg \" << region.ToString(sc.header);\n    lregion = \"\";\n  }\n  \n  // make a BWA index from the locally retrieved sequence\n  UnalignedSequenceVector local_usv = {{\"local\", lregion, string()}};\n  BWAIndexPtr local_bwa_index = std::make_shared<BWAIndex>();\n  local_bwa_index->ConstructIndex(local_usv);\n  BWAAligner local_bwa_aligner(local_bwa_index);\n  */\n  //////////////\n  \n  // loop and process unaligned contigs\n  //vector<AlignedContig> alc; // where to put the contigs\n  BamRecordPtrVector all_aligned_contigs_this_region; // contig-to-genome alignments\n  size_t count_contigs_of_size = 0;\n  for (auto& i : all_unaligned_contigs_this_region) {\n    \n    // if too short, skip\n    if ((int)i.Seq.length() < (sc.readlen * 1.2)) {\n      SVABA_TRACE(i.Name, \"TP1 SKIP contig too short: len=\" << i.Seq.length()\n                  << \" threshold=\" << (int)(sc.readlen * 1.2));\n      continue;\n    }\n    \n    ++count_contigs_of_size;\n    \n    //// LOCAL REALIGNMENT\n    // align to the local region\n    /*\n      BamRecordVector local_ct_alignments;\n      local_bwa_aligner.alignSequence(i.Seq,\n      i.Name,\n      local_ct_alignments,\n      false,\n      SECONDARY_FRAC,\n      SECONDARY_CAP);\n      \n      // check if it has a non-local alignment\n      bool valid_sv = true;\n      for (auto& aa : local_ct_alignments) {\n      if (aa.NumClip() < MIN_CLIP_FOR_LOCAL) \n      valid_sv = false; // has a non-clipped local alignment. can't be SV. Indel only\n      }*/\n    \n    // do the main realignment of unaligned contigs to the reference genome\n    BamRecordPtrVector human_alignments;\n    unit.bwa_aligner->alignSequence(i.Seq, i.Name,\n\t\t\t\t    human_alignments,\n\t\t\t\t    false, SECONDARY_FRAC,\n\t\t\t\t    SECONDARY_CAP);\n\n    SVABA_TRACE(i.Name, \"TP2 BWA aligned: \" << human_alignments.size()\n                << \" alignments, contig_len=\" << i.Seq.length());\n\n    // Alt-contig demotion: if BWA placed a fragment on a non-standard\n    // chromosome (alt/decoy) but a secondary on a standard chromosome\n    // has a comparable score, swap them so the standard placement wins.\n    // This prevents real breakpoints from being lost when one fragment\n    // of a split-mapped contig lands on e.g. chr11_JH159136v1_alt\n    // instead of chr11 proper.\n    size_t n_demoted = preferStandardChromosomes(human_alignments,\n                                                  sc.opts.maxMateChrID);\n    SVABA_TRACE_IF(n_demoted > 0, i.Name,\n                   \"TP2b alt-demotion: swapped \" << n_demoted\n                   << \" fragment(s) from non-standard to standard chr\");\n\n    // Strip secondaries — they were only needed for alt-demotion above.\n    // AlignedContig's constructor assumes non-secondaries come first;\n    // a stray secondary before the first primary/supp causes a throw.\n    human_alignments.erase(\n      std::remove_if(human_alignments.begin(), human_alignments.end(),\n                     [](const BamRecordPtr& r) {\n                       return r && r->SecondaryFlag();\n                     }),\n      human_alignments.end());\n\n    // provide a svaba-specific continuous \"alignment score\"\n    for (auto& ba : human_alignments) {\n      if (!ba) continue;\n      if (!ba->MappedFlag()) continue;\n      const auto s = svaba::scoreContigAlignment(*ba);\n      svaba::tagContigAlignment(*ba, s);\n    }\n\n    // sort the alignments by position\n    std::sort(human_alignments.begin(),\n\t      human_alignments.end(),\n\t      SeqLib::BamRecordSort::ByReadPositionSharedPtr());\n    \n    // store all contig alignment\n    all_aligned_contigs_this_region.insert(all_aligned_contigs_this_region.end(),\n\t\t\t\t\t   human_alignments.begin(),\n\t\t\t\t\t   human_alignments.end());\n    \n    // add contig alignments to svabaThreadUnit for writing later\n    unit.master_contigs.insert(unit.master_contigs.end(),\n\t\t\t       human_alignments.begin(),\n\t\t\t       human_alignments.end());\n    \n    // make the AlignedContig object for this contig\n    AlignedContig ac(human_alignments, region, &sc);\n\n    SVABA_TRACE(ac.getContigName(), \"TP5 AlignedContig: frags=\" << ac.getFragCount()\n                << \" global_bp=\" << (ac.hasGlobalBP() ? \"YES\" : \"NO\")\n                << \" local_breaks=\" << ac.getLocalBreakCount()\n                << \" hasVariant=\" << (ac.hasVariant() ? \"YES\" : \"NO\"));\n\n    // add this\n    all_AlignedContigs_this_region.insert_or_assign(ac.getContigName(), std::move(ac));\n  }\n  unit.st.aligned_contig_count = all_aligned_contigs_this_region.size(); \n\n  sc.logger.log(sc.opts.verbose > 0, sc.opts.verbose_log, \"...contigs that meet size criteria: \",\n\t\tcount_contigs_of_size);\n\n  // if (region.pos1 == 4287501) {\n  //   std::cerr <<\" ALIGNED CONTIGS \" << \n  //     all_aligned_contigs_this_region.size() << std::endl;\n  //   for (const auto& r : all_unaligned_contigs_this_region)\n  //     std::cout << \"PASSED CONTIG \" << r.Name << \"\\t\" <<\n  // \tr.Seq << std::endl;\n  // }\n\t\n  // didnt get any contigs that made it all the way through\n  if (!all_AlignedContigs_this_region.size()) {\n    unit.flush();\n    return true;\n  }\n\n  // Make a BWA mapper of the contigs themselves\n  BWAIndexPtr contig_bwa_index = std::make_shared<BWAIndex>();\n  contig_bwa_index->ConstructIndex(all_unaligned_contigs_this_region);\n  BWAAligner contig_bwa_aligner(contig_bwa_index);\n  \n  sc.logger.log(sc.opts.verbose > 0, sc.opts.verbose_log, \"...aligning reads to contigs\");\n\n  // align the reads to the contigs\n  BamRecordPtrVector all_read2contigs;\n  size_t seen = 0;\n  size_t n_ref_match_skipped = 0;\n\n  for (auto& [_, walker] : unit.walkers) {\n    for (auto& i : walker->reads) {\n      ++seen;\n      if (seen % 1000 == 0)\n\tsc.logger.log(sc.opts.verbose > 4, sc.opts.verbose_log, \"- r2c \", SeqLib::AddCommas(seen));\n\n      // get the sequence\n      const std::string& seq = i->CorrectedSeq();\n\n      // Fast pre-filter: if the BFC-corrected sequence is an exact\n      // substring of the local reference, this read is a perfect\n      // reference match and cannot support any variant. Skip the\n      // expensive BWA-MEM r2c alignment entirely. This catches the\n      // common case where high-NM reads (salvaged via the NM/len >\n      // 0.02 path) had their sequencing errors corrected by BFC and\n      // now match the reference perfectly. All reads align to the\n      // forward strand so no RC check is needed.\n      if (!seq.empty() &&\n          lregion.find(seq) != std::string::npos) {\n        SVABA_READ_TRACE(i->Qname(), \"R2C SKIP: perfect ref match after BFC (seq_len=\" << seq.size() << \")\");\n        ++n_ref_match_skipped;\n        continue;\n      }\n\n      // do the read to contig alignment for a single read\n      BamRecordPtrVector read2contigs;\n      contig_bwa_aligner.alignSequence(seq,\n\t\t\t\t       i->Qname(),\n\t\t\t\t       read2contigs,\n\t\t\t\t       false,\n\t\t\t\t       0.60,\n\t\t\t\t       1000);\n\n      // make sure we have only one alignment per contig.\n      // Use a small vector + linear scan instead of unordered_set —\n      // typical read hits 1-3 contigs, so hashing overhead dominates.\n      // Store ChrID (int) instead of contig name strings.\n      std::vector<int> seen_chrids;\n      seen_chrids.reserve(4);\n\n      // check which ones pass\n      auto keep = [&](const BamRecordPtr& r) {\n\tint thisas = 0;\n\tr->GetIntTag(\"AS\", thisas);\n\n\t// Inline match-base count from CIGAR to avoid GetCigar()\n\t// vector allocation inside NumMatchBases().\n\tuint32_t match_bases = 0;\n\tconst uint32_t* cig_raw = bam_get_cigar(r->raw());\n\tfor (uint32_t ci = 0; ci < r->raw()->core.n_cigar; ++ci) {\n\t  if (bam_cigar_op(cig_raw[ci]) == BAM_CMATCH)\n\t    match_bases += bam_cigar_oplen(cig_raw[ci]);\n\t}\n\tif ((double)match_bases * 0.5 > thisas)\n\t  return false;\n\n\tint chrid = r->ChrID();\n\tfor (int id : seen_chrids)\n\t  if (id == chrid) return false;\n\n\tseen_chrids.push_back(chrid);\n\treturn true;\n      };\n\t\n      read2contigs.erase(\n\t\t\t std::remove_if(read2contigs.begin(), read2contigs.end(),\n\t\t\t\t\t[&](const BamRecordPtr& r) { return !keep(r); }),\n\t\t\t read2contigs.end());\n\n      if (read2contigs.empty()) {\n        SVABA_READ_TRACE(i->Qname(), \"R2C: no contig hits (0 alignments passed filters)\");\n      } else {\n        for (const auto& rc : read2contigs) {\n          int as = 0; rc->GetIntTag(\"AS\", as);\n          SVABA_READ_TRACE(i->Qname(), \"R2C HIT: contig=\"\n            << all_unaligned_contigs_this_region[rc->ChrID()].Name\n            << \" AS=\" << as\n            << \" rc=\" << rc->ReverseFlag()\n            << \" CIGAR=\" << rc->CigarString());\n        }\n      }\n\n      // SvABA2.0: boundary-aware comma-append helper (matches the\n      // dedupe semantics used for the bi:Z tag at BP finalization).\n      // `need_read_tags` is declared at function scope above and\n      // gates both this block (bz:Z) and the BP-finalization block\n      // (bi:Z) further down.\n      auto append_unique = [](std::string& cur, const std::string& id) {\n\tif (id.empty()) return false;\n\tif (cur.empty()) { cur = id; return true; }\n\tsize_t pos = 0;\n\twhile ((pos = cur.find(id, pos)) != std::string::npos) {\n\t  const bool left_ok  = (pos == 0) || cur[pos-1] == ',';\n\t  const bool right_ok = (pos + id.size() == cur.size()) ||\n\t                         cur[pos + id.size()] == ',';\n\t  if (left_ok && right_ok) return false;\n\t  pos += id.size();\n\t}\n\tcur += \",\" + id;\n\treturn true;\n      };\n\n      // annotate the original read\n      for (auto& r : read2contigs) {\n\tall_read2contigs.push_back(r); // add to total\n\tr2c this_r2c; // alignment of this read to this contig\n\tif (r->ReverseFlag())\n\t  this_r2c.rc = true;\n\n\tthis_r2c.AddAlignment(r); // doesn't copy any memory\n\tconst std::string& contig_name = all_unaligned_contigs_this_region[r->ChrID()].Name;\n\ti->AddR2C(contig_name, this_r2c);\n\n\t// SvABA2.0: stamp the bz:Z aux tag on the svabaRead pointer\n\t// (covers the weird/discordant BAMs, pointer-identity path) and\n\t// register for later stamping onto the corrected BAM via the\n\t// qname-keyed map. bz:Z is the \"aligned to this contig\"\n\t// superset; bi:Z (set later at BP finalization) is the\n\t// \"supports a variant on this contig\" subset.\n\t//\n\t// Gated on need_read_tags — the tags and the per-read map are\n\t// consumed only by the dump-reads BAM writers. Skipping this\n\t// under the default (--dump-reads off) is measurable on\n\t// high-coverage contigs; with --dump-reads on, nothing changes.\n\tif (need_read_tags) {\n\t  std::string cur;\n\t  i->GetZTag(\"bz\", cur);\n\t  if (append_unique(cur, contig_name)) {\n\t    i->RemoveTag(\"bz\");\n\t    i->AddZTag(\"bz\", cur);\n\t  }\n\t  std::string& entry = unit.all_cnames_by_name[i->UniqueName()];\n\t  append_unique(entry, contig_name);\n\t}\n\n\t// if (region.pos1 == 4287501) {\n\t//   std::cout << \"R2C \" << r->Qname() << \" - \" <<\n\t//     r->Sequence() << \" contig \" << r->ChrName(sc.header) <<\n\t//     std::endl;\n\t// }\n\n\t// add the read to the right contig\n\tauto it = all_AlignedContigs_this_region.find(contig_name);\n\tif (it != all_AlignedContigs_this_region.end()) {\n\t  it->second.AddAlignedRead(i); // we are adding the svabaBamRead!! not the cread\n\t}\n      } // read2contig alignment loop (per read)\n    } // short read realignment loop (all reads)  \n  } // short read realignment loop (all bam walkers)\n  \n  sc.logger.log(sc.opts.verbose > 0, sc.opts.verbose_log,\n\t\t\"...done aligning reads to contigs for \",\n\t\tSeqLib::AddCommas(all_read2contigs.size()),\n\t\t\" r2c hits from \", SeqLib::AddCommas(seen), \" reads (\",\n\t\tSeqLib::AddCommas(n_ref_match_skipped),\n\t\t\" skipped as perfect ref matches). Processing variants\");\n\n\n  // Deferred native realignment (production mode only): now that r2c is\n  // done, realign only the reads that actually hit a contig. This avoids\n  // the expensive full-reference BWA call for reads that will never enter\n  // splitCoverage. In --dump-reads mode this was already done above for\n  // ALL reads (before assembly).\n  //\n  // Additional optimization: when --always-realign-corrected is NOT set\n  // (default), reads whose corrected sequence matches the original BAM\n  // sequence skip BWA entirely — the input BAM's CIGAR/NM is directly\n  // comparable because svaba uses the same BWA-MEM scoring internally.\n  // Only reads that BFC actually modified (or that quality trimming\n  // shortened) need re-alignment. The sentinel corrected_native_nm == -1\n  // signals splitCoverage to fall back to the original BAM record, which\n  // is exactly what we want for unchanged reads.\n  if (!sc.opts.dump_corrected_reads) {\n    // Build a local-reference BWA index for native realignment of\n    // BFC-modified reads. The full genome FM-index is ~3 GB and every\n    // bwt_sa/bwt_occ call hits main memory (~L3 miss). A local index\n    // covering just this region's reference + all mate regions fits\n    // in L1/L2 cache, making every BWA operation 10-50× cheaper per call.\n    //\n    // Pad each region by readlen on each side so reads near the\n    // boundaries still find their full native alignment.\n    // --always-realign-corrected forces the full genome index for\n    // all reads (for non-BWA-aligned input BAMs).\n    const int pad = std::max(sc.readlen, 200);\n\n    // Collect reference sequences for the main region + all mate regions.\n    // Each region becomes a separate \"chromosome\" in the local index so\n    // reads from any source region can map back to their origin.\n    UnalignedSequenceVector local_usv;\n    bool local_build_ok = false;\n\n    if (!sc.opts.alwaysRealignCorrected) {\n      // Main region\n      {\n        const int32_t local_start = std::max(0, region.pos1 - pad);\n        const int32_t local_end   = region.pos2 + pad;\n        try {\n          std::string seq = unit.ref_genome->QueryRegion(\n              sc.header.IDtoName(region.chr), local_start, local_end);\n          if (!seq.empty()) {\n            // Name encodes chr:start-end so alignment coords can be\n            // interpreted if needed, but for NM/CIGAR purposes we\n            // only care about the edit distance, not the absolute\n            // position on the genome.\n            local_usv.push_back({\n              sc.header.IDtoName(region.chr) + \":\" +\n                std::to_string(local_start) + \"-\" +\n                std::to_string(local_end),\n              std::move(seq), std::string()\n            });\n          }\n        } catch (...) { /* skip this region */ }\n      }\n\n      // Mate regions — reads from here are in the walkers too and\n      // need their own reference to align against.\n      for (size_t i = 0; i < mate_regions_for_native.size(); ++i) {\n        const auto& mr = mate_regions_for_native[i];\n        const int32_t mr_start = std::max(0, mr.pos1 - pad);\n        const int32_t mr_end   = mr.pos2 + pad;\n        try {\n          std::string seq = unit.ref_genome->QueryRegion(\n              sc.header.IDtoName(mr.chr), mr_start, mr_end);\n          if (!seq.empty()) {\n            local_usv.push_back({\n              sc.header.IDtoName(mr.chr) + \":\" +\n                std::to_string(mr_start) + \"-\" +\n                std::to_string(mr_end),\n              std::move(seq), std::string()\n            });\n          }\n        } catch (...) { /* skip this mate region */ }\n      }\n    }\n\n    // Build the local index. If it fails (e.g. empty ref), fall back\n    // to the full genome aligner.\n    BWAIndexPtr local_native_idx;\n    std::unique_ptr<BWAAligner> local_native_aligner;\n    if (!local_usv.empty()) {\n      try {\n        local_native_idx = std::make_shared<BWAIndex>();\n        local_native_idx->ConstructIndex(local_usv);\n        local_native_aligner = std::make_unique<BWAAligner>(local_native_idx);\n        local_build_ok = true;\n      } catch (...) {\n        local_native_aligner.reset();\n      }\n    }\n\n    // Choose which aligner to use: local (fast, cache-friendly) or\n    // full genome (--always-realign-corrected, or local index failed).\n    BWAAligner* native_aligner =\n        local_native_aligner ? local_native_aligner.get()\n                             : unit.bwa_aligner.get();\n\n    size_t n_realigned = 0;\n    size_t n_reused    = 0;\n    size_t n_skipped   = 0;\n    for (const auto& [_, walker] : unit.walkers) {\n      for (const auto& r : walker->reads) {\n        if (!r->to_assemble) continue;\n        if (!r->HasR2C()) { ++n_skipped; continue; }\n\n        // If --always-realign-corrected is NOT set and the corrected\n        // sequence is identical to the original BAM sequence, the input\n        // BAM's CIGAR/NM is already a valid native alignment (assuming\n        // BWA was used for the input). Leave the sentinel\n        // (corrected_native_nm == -1) so splitCoverage falls back to\n        // GetCigar()/GetIntTag(\"NM\",...) on the original BAM record.\n        // CorrectedSeqChanged() compares against the BAM's 4-bit\n        // encoding without allocating a Sequence() string.\n        if (!sc.opts.alwaysRealignCorrected &&\n            !r->CorrectedSeqChanged()) {\n          SVABA_READ_TRACE(r->Qname(),\n            \"NATIVE_REALIGN: reusing BAM CIGAR (seq unchanged by BFC)\");\n          ++n_reused;\n          continue;\n        }\n\n        BamRecordPtrVector aln;\n        native_aligner->alignSequence(r->CorrectedSeq(),\n                                      r->UniqueName(),\n                                      aln,\n                                      false,\n                                      0.6,\n                                      0);\n\n        bool found_native = false;\n        for (const auto& a : aln) {\n          if (!a->MappedFlag())       continue;\n          if ( a->SecondaryFlag())    continue;\n          if ( a->SupplementaryFlag()) continue;\n          int32_t nm = -1;\n          a->GetIntTag(\"NM\", nm);\n          r->corrected_native_cig = a->GetCigar();\n          r->corrected_native_nm  = nm;\n          SVABA_READ_TRACE(r->Qname(),\n            \"NATIVE_REALIGN: corrected seq realigned to ref\"\n            << \" NM=\" << nm\n            << \" CIGAR=\" << a->CigarString());\n          found_native = true;\n          break;\n        }\n        if (!found_native) {\n          SVABA_READ_TRACE(r->Qname(),\n            \"NATIVE_REALIGN: no mapped primary alignment (unmapped after correction?)\");\n        }\n        ++n_realigned;\n      }\n    }\n    sc.logger.log(sc.opts.verbose > 0, sc.opts.verbose_log,\n                  \"...native realignment: \", SeqLib::AddCommas(n_realigned),\n                  \" re-aligned\",\n                  (local_build_ok\n                    ? std::string(\" (local ref, \") + std::to_string(local_usv.size()) + \" seqs)\"\n                    : std::string(\" (full genome)\")),\n                  \", \", SeqLib::AddCommas(n_reused),\n                  \" reused BAM, \", SeqLib::AddCommas(n_skipped),\n                  \" no r2c hit\");\n  }\n\n  // BPS need a repeat filter\n  // BPS can have addDiscordantFilter(dmap) applied directly\n\n  // Get contig coverage, discordant matching to contigs, etc\n  for (auto& [_, a] : all_AlignedContigs_this_region) {\n\n    // right now all break points are stored in an AlignedContig\n    // this routine calls all internally stored BreakPoint and\n    // checks split read coverage, since all read2contig alignments\n    // for this AlignedContig are stored in this AlignedContig\n    a.splitCoverage();\n    \n    // now that we have all the break support,\n    // check that the complex breaks are OK\n    //a.refilterComplex();\n    \n    // add to the final structure\n    //alc.push_back(std::move(a));\n  }\n  \n  // if (region.pos1 == 4287501) {\n  //   for (const auto& [_, bbb] : all_AlignedContigs_this_region) {\n  //     std::cout << \" ALC \" << bbb.printToAlignmentsFile(sc.header) << std::endl;\n  //   }\n  // }\n  \n  unit.st.stop(\"as\");\n\n  // get the breakpoints\n  BreakPointPtrVector bp_glob;\n  for (auto& [_, i] : all_AlignedContigs_this_region) {\n    BreakPointPtrVector tmp_allbreaks = i.getAllBreakPoints();\n    bp_glob.insert(bp_glob.end(),\n\t\t   tmp_allbreaks.begin(),\n\t\t   tmp_allbreaks.end());\n    //debig\n    for (const auto& bp : bp_glob)\n      assert(bp);\n  }\n\n  // set each interal BreakEnd as to whether it overlaps with the\n  // \"local\" assembly window\n  for (auto& i : bp_glob)\n    i->setLocal(region);\n  \n  //if (dbsnp_filter && opt::dbsnp.length()) {\n  //  WRITELOG(\"...DBSNP filtering\", opt::verbose > 1, false);\n  //  for (auto & i : bp_glob) \n  //   dbsnp_filter->queryBreakpoint(i);\n  //}\n  \n  // filter against blacklist\n  for (auto& i : bp_glob) {\n    i->checkBlacklist(sc.blacklist);\n\n    // remove anything in a high-repeat blacklist\n    for (const auto& [_, walker] : unit.walkers) {\n      if (walker->local_blacklist.CountOverlaps(i->b1.gr) ||\n\t  walker->local_blacklist.CountOverlaps(i->b2.gr))\n\ti->confidence = \"BLACKLIST\";\n    }\n  }\n\n  // add discordant reads\n  for (auto& i : bp_glob) {\n    i->CombineWithDiscordantClusterMap(dmap);\n  }\n\n  \n  // if (region.pos1 == 4287501) {\n  //   for (const auto& bbb : bp_glob) {\n  //     std::cout << \" BPGLOB \" << bbb->printSimple(sc.header) << std::endl;\n  //   }\n  // }\n\n  // add in the discordant clusters as breakpoints\n  for (auto& [_, d] : dmap) {\n\n    // dont send DSCRD if FR and below size\n    /*bool below_size = \ti.second.m_reg1.strand == '+' && i.second.m_reg2.strand == '-' && \n      (i.second.m_reg2.pos1 - i.second.m_reg1.pos2) < min_dscrd_size_for_variant && \n      i.second.m_reg1.chr == i.second.m_reg2.chr;\n    */\n\n    // already associated with an assembly, so don't make a new variant\n    // this information should be added to the DiscordantCluster\n    // during \"BreakPoint::CombineWithDiscordantClusterMap()\"\n    if (d.hasAssociatedAssemblyContig())\n      continue;\n\n    // too little read support, skip\n    if ( (d.tcount + d.ncount) < MIN_DSCRD_READS_DSCRD_ONLY)\n      continue;\n\n    if (!d.valid())\n      continue;\n    \n    // make the Discordant cluster\n    BreakPointPtr tmpbp =\n      std::make_shared<BreakPoint>(d, \n\t\t\t\t   dmap,\n\t\t\t\t   region,\n\t\t\t\t   &sc);\n    assert(tmpbp);\n    bp_glob.push_back(tmpbp);\n  }\n  \n  // de duplicate the breakpoints\n  std::sort(bp_glob.begin(), bp_glob.end(),\n\t    [](auto const& a, auto const& b){\n\t      return *a < *b;\n\t    });\n  auto new_end = std::unique(\n\t\t\t     bp_glob.begin(), \n\t\t\t     bp_glob.end(),\n\t\t\t     [](auto const& a, auto const& b){\n\t\t\t       // return true if *a and *b are \"equal\" in the sense of your operator<\n\t\t\t       return !(*a < *b) && !(*b < *a);\n\t\t\t     });\n  bp_glob.erase(new_end, bp_glob.end()); // remove the duplicates after they are sorted to the back\n  \n  // if (region.pos1 == 4287501) {\n  //   for (const auto& bbb : bp_glob) {\n  //     std::cout << \" AFTER BPGLOB \" << bbb->printSimple(sc.header) << std::endl;\n  //   }\n  // }\n  \n  // add the coverage data to breaks for allelic fraction computation\n  unordered_map<string, STCoverage*> covs;\n  for (auto& [key, walker] : unit.walkers) {\n    covs[key] = &walker->cov;\n  }\n  for (auto& i : bp_glob) {\n    assert(i); \n    i->addCovs(covs);\n  }\n\n  // check the cigar matches\n  for (auto& i : bp_glob) {\n    i->indelCigarCheck(cigmap);\n  }\n  \n  // score the breakpoints\n  for (auto& i : bp_glob) {\n    i->scoreBreakpoint(); \n  }\n  \n  // label somatic breakpoints that intersect directly with normal as NOT somatic\n  unordered_set<string> norm_hash;\n  for (auto& i : bp_glob) { // hash the normals\n    if (i->somatic != SomaticState::SOMATIC_LOD &&\n\ti->confidence == \"PASS\") {\n      for (const auto& h : i->getBreakEndHashes())\n\tnorm_hash.insert(h);\n    }\n  }\n  \n  // find somatic that intersect with norm. Set somatic = 0;\n  for (auto& i : bp_glob) {\n    // don't need to check normal against normal\n    if (i->somatic != SomaticState::SOMATIC_LOD)\n      continue;\n    \n    // if overlaps then turn off somatic\n    for (const auto& h : i->getBreakEndHashes())\n      if (norm_hash.count(h))\n\ti->somatic = SomaticState::FAILED; // not somatic\n  }\n  \n  // remove indels at repeats that have multiple variants\n  // unordered_map<string, size_t> ccc;\n  // for (auto& i : bp_glob) {\n  //   if (i->svtype == SVType::INDEL && i->repeat_seq.length() > 6) {\n  //     ++ccc[i->b1.hash()];\n  //   }\n  // }\n  // for (auto& i : bp_glob) {\n  //   if (i->svtype == SVType::INDEL && ccc[i->b1.hash()] > 1)\n  //     i->confidence = \"REPVAR\";\n  // }\n\n  // remove somatic calls if they have a germline normal SV in\n  // them or indels with \n  // 2+ germline normal in same contig\n  // unordered_set<string> bp_hash;\n  // for (auto& i : bp_glob) { // hash the normals\n  //   if (!i->somatic_score && i->svtype != SVType::INDEL && i->confidence == \"PASS\") {\n  //     bp_hash.insert(i->cname);\n  //   }\n  // }\n  // for (auto& i : bp_glob)  // find somatic that intersect with norm. Set somatic = 0;\n  //   if (i->somatic_score && i->num_align > 1 && bp_hash.count(i->cname)) {\n  //     i->somatic_score = -2;\n  //   }\n  \n  // remove somatic SVs that overlap with germline svs\n  if (sc.germline_svs.size()) {\n    for (auto& i : bp_glob) {\n\n      // don't filter normals or indels\n      if (i->somatic != SomaticState::SOMATIC_LOD || i->isIndel())\n\tcontinue;\n\n      GenomicRegion gr1 = i->BreakEndAsGenomicRegionLeft();\n      GenomicRegion gr2 = i->BreakEndAsGenomicRegionRight();\n      gr1.Pad(GERMLINE_CNV_PAD);\n      gr2.Pad(GERMLINE_CNV_PAD);\n      if (sc.germline_svs.OverlapSameInterval(gr1, gr2)) {\n\ti->somatic = SomaticState::FAILED;\n      }\n    }\n    \n  }\n\n  // add the ref and alt tags\n  for (auto& i : bp_glob)\n    i->setRefAlt(unit.ref_genome.get(), sc.header); \n  \n  // transfer local versions to thread store\n  for (const auto& [_, a] : all_AlignedContigs_this_region) {\n    if (a.hasVariant()) {\n      SVABA_TRACE(a.getContigName(), \"TP6 hasVariant=YES, pushing to master_alc\");\n      unit.master_alc.push_back(a); //std::move(a));\n    } else {\n      SVABA_TRACE(a.getContigName(), \"TP6 hasVariant=NO — contig dropped from output\"\n                  << \" frags=\" << a.getFragCount()\n                  << \" indel_breaks=\" << a.getIndelBreakCount());\n    }\n  }\n  all_AlignedContigs_this_region.clear();\n  //for (const auto& d : dmap)\n  //  unit.m_disc_reads += d.second.reads.size();\n\n  //for (const auto& a : alc)\n  //  unit.m_bamreads_count += a.NumBamReads();\n  for (auto& i : bp_glob) {\n    SVABA_TRACE(i->cname, \"TP23 hasMinimal check: dc.t=\" << i->dc.tcount\n                << \" dc.n=\" << i->dc.ncount << \" t.split=\" << i->t.split\n                << \" n.split=\" << i->n.split << \" local=\" << (int)i->local\n                << \" confidence=\" << i->confidence\n                << \" result=\" << (i->hasMinimal() ? \"PASS\" : \"FAIL\"));\n    if ( i->hasMinimal() ) {\n\n      // SvABA2.0 (v3): assign this BP a unique, thread-stable ID\n      // exactly once in its lifetime. Must happen BEFORE the bi:Z\n      // stamping below, since the tag payload is now the bp_id (not\n      // the cname). The `id.empty()` guard lets this loop be safely\n      // reentered (e.g. across regions) without re-numbering BPs\n      // that were finalized in a prior region. Because i is a\n      // shared_ptr also referenced by the parent AlignedContig's\n      // m_global_bp / m_local_breaks / fragment indel_breaks,\n      // setting id here is immediately visible to printToR2CTsv\n      // when it walks getAllBreakPoints() during writeUnit.\n      if (i->id.empty())\n        i->id = unit.next_bp_id();\n\n      // SvABA2.0 (v3): tag every alt-supporting read with this\n      // breakpoint's bp_id on the `bi:Z` aux tag. bp_id is a\n      // thread-stable per-BP identifier (see SvabaThreadUnit::\n      // next_bp_id) and is the same string emitted as col 52 of\n      // bps.txt.gz and in the r2c.txt.gz `split_bps` / `disc_bps`\n      // columns — so `samtools view | grep bi:Z:<bp_id>` returns\n      // exactly the ALT-supporters for that specific variant row.\n      // Pre-v3 the tag carried cnames (contig-level); a single\n      // contig with multiple BPs (global + multi + indel) couldn't\n      // be disambiguated. bz:Z still carries cnames (contig-level\n      // \"which contigs did this read r2c to\") — see the r2c loop\n      // above where that map is populated.\n      //\n      // Two parallel paths for bi:Z:\n      //   (a) stamp the `bi:Z` aux tag on the original svabaRead\n      //       shared_ptr. This covers weird/discordant BAM outputs,\n      //       which share pointer identity with those records.\n      //   (b) record UniqueName -> bp_ids in\n      //       `unit.alt_bp_ids_by_name` so `writeUnit` can stamp\n      //       the tag on all_corrected_reads (newly-aligned\n      //       BamRecords from bwa that don't share pointer\n      //       identity).\n      // A read can support multiple BPs (split reads crossing\n      // nearby calls; indel + flanking SV on one contig) so the tag\n      // value is a comma-joined list, dedup'd on exact-match\n      // boundaries.\n      auto append_unique = [](std::string& cur, const std::string& id) {\n        if (id.empty()) return false;\n        if (cur.empty()) { cur = id; return true; }\n        size_t pos = 0;\n        while ((pos = cur.find(id, pos)) != std::string::npos) {\n          const bool left_ok  = (pos == 0) || cur[pos-1] == ',';\n          const bool right_ok = (pos + id.size() == cur.size()) ||\n                                 cur[pos + id.size()] == ',';\n          if (left_ok && right_ok) return false;\n          pos += id.size();\n        }\n        cur += \",\" + id;\n        return true;\n      };\n\n      const std::string& this_bp_id = i->id;\n\n      auto tag_with_bp_id = [&](auto& r) {\n        if (!r || this_bp_id.empty()) return;\n        SVABA_READ_TRACE(r->Qname(), \"OUTPUT TAG bi:Z with bp_id=\" << this_bp_id\n                    << \" contig=\" << i->cname\n                    << \" confidence=\" << i->confidence\n                    << \" somatic=\" << (int)i->somatic);\n        // (a) stamp the shared_ptr\n        std::string cur;\n        r->GetZTag(\"bi\", cur);\n        if (append_unique(cur, this_bp_id)) {\n          r->RemoveTag(\"bi\");\n          r->AddZTag(\"bi\", cur);\n        }\n        // (b) register in name->bp_ids map so the corrected BAM can\n        // be tagged at write time\n        std::string& entry = unit.alt_bp_ids_by_name[r->UniqueName()];\n        append_unique(entry, this_bp_id);\n      };\n\n      // Same need_read_tags gate as the bz:Z stamping in the r2c loop\n      // above — the bi:Z tag is consumed only by the dump-reads BAM\n      // emitters in SvabaOutputWriter, so skipping the per-alt-read\n      // GetZTag/RemoveTag/AddZTag triplets under the default (no\n      // --dump-reads) path is a measurable CPU win on SVs with many\n      // alt supporters. Under --dump-reads nothing changes.\n      if (need_read_tags) {\n        for (auto& r : i->reads)\n          tag_with_bp_id(r);\n        for (auto& [_, r] : i->dc.reads)\n          tag_with_bp_id(r);\n        for (auto& [_, r] : i->dc.mates)\n          tag_with_bp_id(r);\n      }\n\n      unit.m_bps.push_back(i);\n    }\n  } // end for bp_glob\n\n  unit.st.bps_count = bp_glob.size();\n\n  // if (region.pos1 == 4287501) {\n  //   for (const auto& bbb : unit.m_bps/*bp_glob*/) {\n  //     std::cout << \" FINAL BPGLOB \" << bbb->printSimple(sc.header) << std::endl;\n  //   }\n  // }\n  \n  // dump if getting to much memory\n  unit.st.stop(\"pp\");\n  unit.ss << unit.st.logRuntime(sc.header) << \"\\n\";\n  unit.flush();\n    \n  // display the run time\n  if (sc.total_regions_done % 1000 == 0) {\n    sc.logger.log(sc.opts.verbose > 0, true,\n\t\t  svabaUtils::runTimeString(read_counts.first,\n\t\t\t\t\t    read_counts.second,\n\t\t\t\t\t    all_AlignedContigs_this_region.size(),\n\t\t\t\t\t    region,\n\t\t\t\t\t    sc.header,\n\t\t\t\t\t    unit.st, sc.start));\n  }\n  \n  sc.logger.log(sc.opts.verbose > 0, sc.opts.verbose_log, \"...done with this region\");\n  return true;\n}\n"
  },
  {
    "path": "src/svaba/SvabaRegionProcessor.h",
    "content": "#pragma once\n\n#include <cstddef>                            // for size_t\n#include \"SvabaThreadUnit.h\"                  // for svabaThreadUnit\n#include \"SvabaUtils.h\"\n#include \"SeqLib/GenomicRegionCollection.h\"   // for GRC return type\n\nclass SvabaLogger;\nclass SvabaOptions;\nclass SvabaOutputWriter;\n\n/// Encapsulates everything needed to process one genomic region:\n///  - shared logger\n///  - shared run-time options\n///  - shared output writer\n/// Its `process()` method is exactly where your old runWorkItem logic goes.\n\nnamespace SeqLib {\n  class BamHeader;\n}\n\nusing svabaUtils::svabaTimer;\n\nclass SvabaRegionProcessor {\npublic:\n  SvabaRegionProcessor(SvabaSharedConfig& sh_cf); \n\n  /// Run the SVABA pipeline on `region` using per-thread state in `unit`.\n  /// Returns true on success, false on error.\n  bool process(const SeqLib::GenomicRegion& region,\n               svabaThreadUnit&             unit,\n               size_t                       threadId);\n\n  /// Run mate-region collection. Returns the merged somatic mate regions\n  /// (as a GRC) so the caller can include their reference in a local BWA\n  /// index for native realignment.\n  SeqLib::GRC runMateCollectionLoop(const SeqLib::GenomicRegion& region,\n\t\t\t\t    svabaThreadUnit& stu);\n    \n\nprivate:\n  SvabaSharedConfig& sc;\n};\n"
  },
  {
    "path": "src/svaba/SvabaSharedConfig.h",
    "content": "#pragma once\n\n#include <set>\n//#include <atomic>\n\n#include \"SeqLib/BWAIndex.h\"\n#include \"SeqLib/BamHeader.h\"\n#include \"SeqLib/GenomicRegionCollection.h\"\n#include \"SeqLib/ReadFilter.h\"\n#include \"LearnBamParams.h\"\n#include <ctime>\n\nclass SvabaOutputWriter;\nclass SvabaLogger;\nclass SvabaOptions;\nclass SvabaOutputWriter;\nclass DBSnpFilter;\n\nclass SvabaSharedConfig {\n  \n public:\n\n SvabaSharedConfig(SvabaLogger&        _logger,\n\t\t   SvabaOptions&       _opts,\n\t\t   SvabaOutputWriter&  _writer)\n   : logger(_logger),\n    opts(_opts),\n    writer(_writer) {}\n\n  // Delete copy constructor and copy assignment\n  SvabaSharedConfig(const SvabaSharedConfig&) = delete;\n  SvabaSharedConfig& operator=(const SvabaSharedConfig&) = delete;\n  \n  // Delete move constructor and move assignment\n  SvabaSharedConfig(SvabaSharedConfig&&) = delete;\n  SvabaSharedConfig& operator=(SvabaSharedConfig&&) = delete;\n  \n  size_t total_regions_to_process = 0;\n  size_t total_regions_done = 0;\n\n  struct timespec start;\n\n  // store which readgroups we already warned about\n  std::unordered_set<std::string> warned; \n  \n  SvabaLogger&          logger;\n\n  SvabaOptions&         opts;\n  \n  SvabaOutputWriter&     writer; \n  \n  SeqLib::BWAIndexPtr   bwa_idx;\n  \n  SeqLib::BamHeader     header;\n\n  SeqLib::GRC           blacklist;\n\n  SeqLib::GRC           file_regions;  \n\n  SeqLib::GRC           germline_svs;\n\n  int readlen = -1;\n  double insertsize = -1;\n  \n  std::shared_ptr<DBSnpFilter>           dbsnp_filter;\n\n  SeqLib::Filter::ReadFilterCollection  mr;\n\n  std::unordered_map<std::string, LearnBamParams> bamStats;\n\n  // needed for aligned contig\n  std::set<std::string> prefixes;\n\n  std::string args = \"svaba\";\n};\n"
  },
  {
    "path": "src/svaba/SvabaThreadUnit.cpp",
    "content": "#include \"SvabaThreadUnit.h\"\n#include \"SvabaOutputWriter.h\"\n\n#if defined(__GLIBC__)\n  #include <malloc.h>\n#endif\n\n// Build a new BamHeader that prepends an @HD line (with the given sort order)\n// to the @SQ block of `src`. Avoids SeqLib::BamHeader::AsString(), which\n// blindly dereferences h->text; in modern htslib that field is lazy and is\n// often NULL until sam_hdr_str() materializes it, causing a segfault.\nstatic SeqLib::BamHeader make_header_with_hd(const SeqLib::BamHeader& src,\n                                             const std::string& so) {\n  std::string txt = \"@HD\\tVN:1.6\\tSO:\" + so + \"\\n\";\n\n  const bam_hdr_t* h = src.get();\n  if (h) {\n    // sam_hdr_str forces htslib to regenerate the textual form from its\n    // internal representation and caches it in h->text.\n    const char* cur = sam_hdr_str(const_cast<bam_hdr_t*>(h));\n    if (cur) txt += cur;\n  }\n\n  return SeqLib::BamHeader(txt);\n}\n\nsvabaThreadUnit::svabaThreadUnit(SvabaSharedConfig& sc_,\n\t\t\t\t int thread) : sc(sc_), threadId(thread) {\n  \n  // load the samtools faidx\n  ref_genome = std::make_unique<SeqLib::RefGenome>();\n  ref_genome->LoadIndex(sc.opts.refGenome);\n  \n  // set the *shared* memory BWAIndex\n  bwa_aligner = std::make_shared<SeqLib::BWAAligner>(sc.bwa_idx);\n  //bwa_aligner->allocBuffer(4096); // longest contig\n\n  // load the .bai files for each bam and set parameters\n  for(const auto& [pref, path] : sc.opts.bams)  {\n    \n    // instantiate a new BAM walker\n    auto [it, inserted] = walkers.try_emplace(pref, std::make_shared<svabaBamWalker>(sc));\n    it->second->Open(path);\n    it->second->SetPrefix(pref);\n  }\n\n  // make the header in case dumping reads for debugging\n  auto hdr_unsorted = make_header_with_hd(sc.header, \"unsorted\");\n  \n  // setup the weird read writers\n  if (sc.opts.dump_weird_reads) {\n    \n    // instantiate a new BAM writer\n    std::string bamname =sc.opts.analysisId +\n      \".thread\" + std::to_string(threadId) + \".weird.bam\";\n    \n    auto [it, inserted] = writers.try_emplace(\"w\", std::make_shared<SeqLib::BamWriter>(SeqLib::BAM));\n    it->second->SetHeader(hdr_unsorted);\n    if (!it->second->Open(bamname)) {\n      std::cerr << \"ERROR: could not open weird read writer for thread \" <<\n\tthreadId << \" at path \" << bamname << \"/n\";\n      exit(EXIT_FAILURE);\n    }\n    it->second->WriteHeader();\n  }\n  \n  // setup the corrected read writers\n  if (sc.opts.dump_corrected_reads) {\n    \n    // instantiate a new BAM writer\n    std::string bamname =sc.opts.analysisId +\n      \".thread\" + std::to_string(threadId) + \".corrected.bam\";\n    \n    auto [it, inserted] = writers.try_emplace(\"c\", std::make_shared<SeqLib::BamWriter>(SeqLib::BAM));\n    it->second->SetHeader(hdr_unsorted);\n    if (!it->second->Open(bamname)) {\n      std::cerr << \"ERROR: could not open corrected read writer for thread \" <<\n\tthreadId << \" at path \" << bamname << \"/n\";\n      exit(EXIT_FAILURE);\n    }\n    it->second->WriteHeader();    \n  }\n\n  // setup the discordant read writers\n  if (sc.opts.dump_discordant_reads) {\n\n    // instantiate a new BAM writer\n    std::string bamname =sc.opts.analysisId +\n      \".thread\" + std::to_string(threadId) + \".discordant.bam\";\n\n    auto [it, inserted] = writers.try_emplace(\"d\", std::make_shared<SeqLib::BamWriter>(SeqLib::BAM));\n    it->second->SetHeader(hdr_unsorted);\n    if (!it->second->Open(bamname)) {\n      std::cerr << \"ERROR: could not open discordant read writer for thread \" <<\n\tthreadId << \" at path \" << bamname << \"/n\";\n      exit(EXIT_FAILURE);\n    }\n    it->second->WriteHeader();\n  }\n\n  // SvABA2.0: setup the per-thread r2c.txt.gz stream. Same pattern as the\n  // per-thread BAM writers — each thread writes its own file with no\n  // coordination, postprocess merges them via cat. Exactly one thread\n  // owns the column-header row so the merged file has one header at\n  // the top. r2c_out_ is unique_ptr<ogzstream> (see header for why);\n  // heap-allocate only when the flag is on, keep null otherwise.\n  //\n  // We key the header-writing thread to threadId == 1 (NOT 0) because\n  // the worker pool in `threadpool.h` constructs units with `i + 1`\n  // where `i` is the 0-based worker index — so the first worker's\n  // threadId is 1, and there is no thread 0. This also matches the\n  // lexicographic / numeric sort order postprocess step-1 imposes via\n  // `awk | sort -k1,1n`, which places `${ID}.thread1.r2c.txt.gz`\n  // first in the cat merge. If the worker numbering convention ever\n  // changes, this line must change with it (there is no reader unit\n  // test that catches a missing header — empirically, ad-hoc runs do).\n  if (sc.opts.dump_alignments) {\n    std::string r2cname = sc.opts.analysisId +\n      \".thread\" + std::to_string(threadId) + \".r2c.txt.gz\";\n    r2c_out_ = std::make_unique<ogzstream>();\n    svabaUtils::fopen(r2cname, *r2c_out_);\n    if (threadId == 1) {\n      *r2c_out_ << AlignedContig::r2cTsvHeader() << \"\\n\";\n    }\n  }\n}\n\nvoid svabaThreadUnit::clear() {\n  \n  master_alc.clear();\n  master_contigs.clear();\n  \n  m_bps.clear();\n  m_disc.clear();\n  //m_bamreads_count = 0;\n  // m_disc_reads     = 0;\n  //badd.clear();\n\n  all_weird_reads.clear();\n  all_corrected_reads.clear();\n\n  // SvABA2.0: drop the bi:Z / bz:Z lookup tables so the next window\n  // doesn't stamp tags derived from the previous window onto reads.\n  // (bi now stores bp_ids, bz still stores cnames — see\n  // SvabaThreadUnit.h for the rationale.)\n  alt_bp_ids_by_name.clear();\n  all_cnames_by_name.clear();\n  \n  ss.str(\"\");       // Clear the string content\n  ss.clear();\n  \n#if defined(__GLIBC__)\n  malloc_trim(0);\n#endif\n}\n\nvoid svabaThreadUnit::flush() {\n  \n  if (MemoryLimit(THREAD_READ_LIMIT, THREAD_CONTIG_LIMIT)) {\n    sc.writer.writeUnit(*this, sc); // mutex and flush are inside this call\n    clear();\n  }\n  \n  // clear out the reads and reset the walkers\n  for (auto& [_, walker] : walkers) {\n    walker->clear();\n  }\n#if defined(__GLIBC__)\n  malloc_trim(0);\n#endif\n}\n\nbool svabaThreadUnit::MemoryLimit(size_t readLimit, size_t contLimit) const {\n  \n  size_t stored_reads = all_weird_reads.size() +\n    all_corrected_reads.size();\n\n  bool mem_exceeded = stored_reads > readLimit ||\n                      master_contigs.size()   > contLimit;\n  \n  if (mem_exceeded) {\n    sc.logger.log(sc.opts.verbose > 1, false, \"...writing files on thread \",\n\t\t  threadId, \" with limit hit of \",\n\t\t  stored_reads, \" reads and \", master_contigs.size(),\n\t\t  \" contigs=========================================================\");\n    \n    size_t all_walker_reads = 0;\n    for (const auto& [_, walker] : walkers) {\n      all_walker_reads += walker->reads.size();\n    }    \n    \n    // more memory mapping\n    /*    sc.logger.log(true, true, \" bad regions: \", badd.size(),\n\t  \" master_alc.size() \", master_alc.size(),\n\t  \" m_disc.size() \", m_disc.size(),\n\t  \" walkers.reads.size() \", all_walker_reads);\n    */\n  } \n  \n  return mem_exceeded;\n}\n\nsvabaThreadUnit::~svabaThreadUnit() {\n\n  //\n  if (sc.opts.dump_weird_reads) {\n    auto it = writers.find(\"w\");\n    it->second->Close();\n  }\n\n  //\n  if (sc.opts.dump_corrected_reads) {\n    auto it = writers.find(\"c\");\n    it->second->Close();\n  }\n\n  //\n  if (sc.opts.dump_discordant_reads) {\n    auto it = writers.find(\"d\");\n    it->second->Close();\n  }\n\n  // SvABA2.0: close the per-thread r2c stream if it was opened. The\n  // unique_ptr is null when dump_alignments was off, so guard on it\n  // rather than only on the flag (belt-and-braces in case the flag's\n  // value ever gets out of sync with what the ctor actually did).\n  if (r2c_out_) {\n    r2c_out_->close();\n  }\n\n}\n"
  },
  {
    "path": "src/svaba/SvabaThreadUnit.h",
    "content": "#pragma once\n\n#include <sstream>\n#include <map>\n#include <memory>\n#include <unordered_map>\n#include <vector>\n#include <mutex>\n#include <cstdio>   // std::snprintf in next_bp_id()\n#include <string>\n\n#include \"SvabaBamWalker.h\"\n#include \"SvabaLogger.h\"\n#include \"SvabaOptions.h\"\n#include \"AlignedContig.h\"\n#include \"DiscordantCluster.h\"\n#include \"BreakPoint.h\"\n#include \"SvabaUtils.h\"\n#include \"gzstream.h\"  // ogzstream for the per-thread r2c.txt.gz\n\n#include \"SeqLib/RefGenome.h\"\n#include \"SeqLib/BFC.h\"\n#include \"SvabaSharedConfig.h\"\n#include \"SeqLib/BWAAligner.h\"\n\nusing SeqLib::BamRecordPtrVector;\n\nclass svabaBamWalker;\nnamespace SeqLib {\n  class BamWriter;\n}\nusing WalkerMap = std::map<std::string, std::shared_ptr<svabaBamWalker>>;\nusing WriterMap = std::map<std::string, std::shared_ptr<SeqLib::BamWriter>>;\n\nclass svabaThreadUnit {\n  \npublic:\n  \n  //svabaThreadUnit() = default;\n  ~svabaThreadUnit();\n  \n  svabaThreadUnit(SvabaSharedConfig& sc_,\n\t\t  int thread);\n\n  void flush();\n\n  // local version of aligner class, but will hold shared memory index\n  std::shared_ptr<SeqLib::BWAAligner> bwa_aligner; //(sc.bwa_idx);\n\n  size_t processed_count = 0;\n  size_t total_count = 0; // total to process\n  size_t processed_since_memory_dump = 0;\n\n  // results\n  std::vector<AlignedContig>                 master_alc;\n  BamRecordPtrVector                         master_contigs;\n  BreakPointPtrVector                        m_bps;\n  DiscordantClusterMap                       m_disc;\n  //size_t                                     m_bamreads_count = 0;\n  //size_t                                     m_disc_reads     = 0;\n  //SeqLib::GRC                                badd; // bad regions\n  int                                        threadId;\n\n  // SvABA2.0 (v3): map from read UniqueName -> comma-separated list\n  // of bp_ids this read supports as ALT. Populated at BP\n  // finalization so `SvabaOutputWriter::writeUnit` can stamp the\n  // `bi:Z:<bp_id,...>` BAM aux tag on records in\n  // `all_corrected_reads` (which are *newly aligned* BamRecords\n  // produced by bwa, so they don't share identity with the original\n  // svabaRead pointers and couldn't have been tagged via pointer).\n  // The same map is used to (re)tag weird and discordant records at\n  // write time for consistency.\n  //\n  // Prior to v3 this carried cnames (deterministic contig-window\n  // identifiers). Switched to bp_ids so the tag matches the\n  // granularity of the r2c.txt.gz `split_bps` / `disc_bps` columns:\n  // a single contig can carry several BPs (global + multi + indel),\n  // and a read may support one, some, or all of them. Keying off the\n  // BP, not the contig, removes the \"which variant on this contig\n  // does this read support?\" ambiguity and makes\n  // `samtools view | grep bi:Z:bp00100000042` return exactly the\n  // ALT-supporting reads for that specific variant row in\n  // bps.txt.gz. cname-level grouping is still available on the\n  // companion `bz:Z` tag (below).\n  std::unordered_map<std::string, std::string> alt_bp_ids_by_name;\n\n  // SvABA2.0: map from read UniqueName -> comma-separated list of\n  // contig cnames this read aligned to (r2c), regardless of whether\n  // the alignment ended up supporting a variant. Populated inside the\n  // r2c alignment loop in SvabaRegionProcessor right alongside\n  // `svabaRead::AddR2C(...)`, and consumed at write time by\n  // `SvabaOutputWriter::writeUnit` to stamp the `bz:Z:<cname>` aux\n  // tag. This stays as cnames because \"which contigs did this read\n  // align to\" is a contig-level concept — unlike `bi:Z` which is the\n  // per-variant ALT-supporter attribution. The set of reads with a\n  // `bz:Z` tag is a superset of the set with `bi:Z` (every\n  // ALT-supporter aligned to the contig; not every r2c alignment\n  // yields ALT support).\n  std::unordered_map<std::string, std::string> all_cnames_by_name;\n\n  // very verbose outpout\n  svabaReadPtrVector                            all_weird_reads;\n  BamRecordPtrVector                            all_corrected_reads;    \n\n  // time and temp log dump until goes to file\n  svabaUtils::svabaTimer                      st;\n  std::stringstream                           ss;\n  \n  // store the BAM .bai indicies for for this thread\n  WalkerMap                            walkers;\n  WriterMap                            writers;\n\n  // SvABA2.0: per-thread counter for generating unique BreakPoint IDs\n  // without cross-thread coordination. Format emitted by next_bp_id()\n  // is \"bpTTTNNNNNNNN\" (3-digit thread + 8-digit counter). Up to\n  // 1000 threads and ~1e8 BPs per thread, far beyond any realistic\n  // svaba run. If either ever overflows, the resulting ID is still a\n  // unique string — just one digit wider — so downstream tools that\n  // treat it opaquely are unaffected.\n  size_t                               bp_id_counter = 0;\n  std::string next_bp_id() {\n    char buf[32];\n    // %03d pads thread ID; %08zu pads the counter. post-increment so\n    // the first BP for thread 1 is bp00100000000 (the worker pool\n    // numbers threads 1..N — see threadpool.h).\n    std::snprintf(buf, sizeof(buf), \"bp%03d%08zu\",\n                  threadId, bp_id_counter++);\n    return std::string(buf);\n  }\n\n  // SvABA2.0: per-thread r2c TSV stream. Mirrors the per-thread BAM\n  // writers above — when --dump-reads is set (opts.dump_alignments),\n  // each thread writes its variant-bearing contigs + r2c-aligned reads\n  // into ${ID}.thread${N}.r2c.txt.gz directly, no shared handle, no\n  // mutex. Postprocess merges the per-thread files via\n  //   cat ${ID}.thread*.r2c.txt.gz > ${ID}.r2c.txt.gz\n  // which produces a valid gzip (gzip is concatenation-safe per\n  // RFC 1952). The first worker (threadId == 1; the pool numbers\n  // workers 1..N) writes the column-header line once at open time\n  // so the merged file has exactly one header at the top.\n  //\n  // Held via unique_ptr because ogzstream inherits from std::ios (which\n  // has deleted copy/move). Embedding it by value would implicitly\n  // delete svabaThreadUnit's move constructor and produce\n  // -Wdefaulted-function-deleted. unique_ptr is trivially movable, so\n  // the `svabaThreadUnit(svabaThreadUnit&&) noexcept = default;`\n  // below stays valid. Same reason the BAM writers live in\n  // shared_ptr<SeqLib::BamWriter> inside the `writers` map above.\n  std::unique_ptr<ogzstream>           r2c_out_;\n  \n  // non-copyable, movable\n  svabaThreadUnit(const svabaThreadUnit&) = delete;\n  svabaThreadUnit& operator=(const svabaThreadUnit&) = delete;\n  svabaThreadUnit(svabaThreadUnit&&) noexcept = default;\n  svabaThreadUnit& operator=(svabaThreadUnit&&) noexcept = delete;\n\n  void clear();\n\n  bool MemoryLimit(size_t readLimit, size_t contLimit) const;\n\n  // Per-thread BFC object, reused across regions. The k-mer hash\n  // (1M sub-tables at l_pre=20) is allocated once on first Train()\n  // and cleared+reused on subsequent calls via fml_count_into(),\n  // avoiding 2M malloc/free calls per region. unique_ptr because\n  // BFC has raw-pointer members — implicit move would double-free.\n  std::unique_ptr<SeqLib::BFC> pooled_bfc;\n\n  // store the faidx index for this thread\n  std::unique_ptr<SeqLib::RefGenome>   ref_genome;\n\n  SvabaSharedConfig& sc;\n\nprivate:\n\n};\n"
  },
  {
    "path": "src/svaba/SvabaUtils.cpp",
    "content": "#include \"SvabaUtils.h\"\n\n#include <iomanip>\n#include <filesystem>  // C++17\nnamespace fs = std::filesystem;\n\nnamespace svabaUtils {\n\nstatic std::string POLYA = \"AAAAAAAAAAAAAAAAAAA\";\nstatic std::string POLYT = \"TTTTTTTTTTTTTTTTTTT\";\nstatic std::string POLYC = \"CCCCCCCCCCCCCCCCCCC\";\nstatic std::string POLYG = \"GGGGGGGGGGGGGGGGGGG\";\nstatic std::string POLYAT = \"ATATATATATATATATATATATAT\";\nstatic std::string POLYCG = \"CGCGCGCGCGCGCGCGCGCGCGCG\";\nstatic std::string POLYTG = \"TGTGTGTGTGTGTGTGTGTGTGTG\";\nstatic std::string POLYCA = \"CACACACACACACACACACACACA\";\nstatic std::string POLYAG = \"AGAGAGAGAGAGAGAGAGAGAGAG\";\nstatic std::string POLYTC = \"TCTCTCTCTCTCTCTCTCTCTCTC\";\n\n\n  const std::string svabaTimer::header =\n  \"chromosome\\tstart\\tend\\t\"\n  \"tumor_weird_reads\\tnormal_weird_reads\\t\"\n  \"tumor_mate_reads\\tnormal_mate_reads\\t\"    \n  \"discordant_reads\\tdiscordant_clusters\\t\"\n  \"contigs\\tcontigs_pass\\tbps\\truntime_seconds\\t\"\n  \"pct_r\\tpct_m\\tpct_k\\tpct_as\";\n\n  std::string svabaTimer::logRuntime(const SeqLib::BamHeader& h) {\n    double total_time = 0;\n    for (const auto& i : times)\n      total_time += i.second;\n    \n    if (total_time == 0)\n      total_time = 1.0;  // Avoid division by zero\n    \n    auto get_pct = [&](const std::string& key) -> int {\n      auto it = times.find(key);\n      return (it != times.end()) ? SeqLib::percentCalc<double>(it->second, total_time) : 0;\n    };\n    \n    // Store percentages\n    pct_r  = get_pct(\"r\");\n    pct_m  = get_pct(\"m\");\n    pct_k  = get_pct(\"k\");\n    pct_as = get_pct(\"as\");\n    //pct_pp = get_pct(\"pp\");\n    \n    std::ostringstream oss;\n    oss << gr.ChrName(h) << \"\\t\"\n\t<< gr.pos1 << \"\\t\" << gr.pos2 << \"\\t\"\n\t<< weird_read_count.first << \"\\t\" << weird_read_count.second << \"\\t\"\n\t<< mate_read_count.first << \"\\t\" << mate_read_count.second << \"\\t\"\n\t<< dc_read_count << \"\\t\" << dc_cluster_count << \"\\t\"\n\t<< contig_count << \"\\t\" << aligned_contig_count << \"\\t\"\n\t<< bps_count << \"\\t\" << total_time << \"\\t\"\n\t<< pct_r  << \"\\t\" << pct_m  << \"\\t\"\n\t<< pct_k  << \"\\t\" << pct_as;\n    \n    return oss.str();\n  }\n  \n  \n  std::string fileDateString() {\n    // set the time string\n    time_t t = time(0);   // get time now\n    struct tm * now = localtime( & t );\n    std::stringstream mdate;\n    mdate << (now->tm_year + 1900) \n\t  << (now->tm_mon + 1 < 10 ? \"0\": \"\") << (now->tm_mon + 1) \n\t  << (now->tm_mday < 10 ? \"0\" : \"\")\n\t  << now->tm_mday;\n    return mdate.str();\n  }\n\n  svabaTimer::svabaTimer() {\n    s = {\"r\", \"m\", \"as\", \"bw\", \"pp\", \"k\"};\n    for (auto& i : s)\n      times[i] = 0;\n  }\n\n  void svabaTimer::stop(const std::string& part) {\n    auto wall_end = std::chrono::steady_clock::now();\n    double elapsed = std::chrono::duration<double>(wall_end - wall_start).count();\n    times[part] += elapsed;\n    wall_elapsed += elapsed;    \n    //times[part] += static_cast<double>(clock() - curr_clock) / CLOCKS_PER_SEC;\n    //curr_clock = clock();\n  }\n\n  void svabaTimer::start() {\n    wall_start = std::chrono::steady_clock::now();\n    //curr_clock = clock(); \n  }\n\n  std::ostream& operator<<(std::ostream &out, const svabaTimer st) {\n\n    double total_time = 0;\n    for (auto& i : st.times)\n      total_time += i.second;\n    if (total_time == 0)\n      return out;\n\n    char buffer[140];\n    \n    auto itr = st.times.find(\"r\");\n    auto itm = st.times.find(\"m\");\n    auto ita = st.times.find(\"as\");\n    auto itk = st.times.find(\"k\");\n    auto itt = st.times.find(\"t\");\n    auto itp = st.times.find(\"pp\");\n\n    if (total_time)\n      snprintf (buffer, 140, \"R: %2d%% M: %2d%% T: %2d%% C: %2d%% A: %2d%% P: %2d%%\", \n\t       SeqLib::percentCalc<double>(itr->second, total_time),\n\t       SeqLib::percentCalc<double>(itm->second, total_time),\n\t       SeqLib::percentCalc<double>(itt->second, total_time),\n\t       SeqLib::percentCalc<double>(itk->second, total_time),\n\t       SeqLib::percentCalc<double>(ita->second, total_time),\n\t       SeqLib::percentCalc<double>(itp->second, total_time));\n    else\n      snprintf (buffer, 140, \"NO TIME\");\n    out << std::string(buffer);\n    return out;\n  }\n\n\n// useful replace function\n  std::string myreplace(std::string &s,\n\t\t\tstd::string toReplace,\n\t\t\tstd::string replaceWith)\n  {\n    return(s.replace(s.find(toReplace), toReplace.length(), replaceWith));\n  }\n  \nbool hasRepeat(const std::string& seq) {\n  \n  if ((seq.find(POLYT) == std::string::npos) && \n      (seq.find(POLYA) == std::string::npos) && \n      (seq.find(POLYC) == std::string::npos) && \n      (seq.find(POLYG) == std::string::npos) && \n      (seq.find(POLYCG) == std::string::npos) && \n      (seq.find(POLYAT) == std::string::npos) && \n      (seq.find(POLYTC) == std::string::npos) && \n      (seq.find(POLYAG) == std::string::npos) && \n      (seq.find(POLYCA) == std::string::npos) && \n      (seq.find(POLYTG) == std::string::npos))\n    return false;\n  return true;\n  \n}\n\nint overlapSize(const SeqLib::BamRecord& query, const SeqLib::BamRecordVector& subject) {\n\n  // get the amount covered by subjet sequences\n  typedef std::pair<int32_t, int32_t> AP;\n  typedef std::pair<AP, std::string> AP_wseq;\n  std::vector<AP_wseq> align_pos;\n  std::string convention_seq = \"\";\n  if (subject.size()) { \n    convention_seq = subject[0].Sequence(); // set the orientation convention\n    for(auto& j : subject) {\n      if (j.Sequence() == convention_seq)\n\talign_pos.push_back(AP_wseq(AP(j.AlignmentPosition(),j.AlignmentEndPosition()), j.Sequence()));\n      else\n\talign_pos.push_back(AP_wseq(AP(j.AlignmentPositionReverse(),j.AlignmentEndPositionReverse()), j.Sequence()));\n    }\n  }\n  \n  bool same_orientation = query.Sequence() == convention_seq; \n  int al1 = same_orientation ? query.AlignmentPosition() : query.AlignmentPositionReverse();\n  int al2 = same_orientation ? query.AlignmentEndPosition() : query.AlignmentEndPositionReverse();\n  \n  int max_overlap = 0;\n  for (auto& k : align_pos) { // check each subject alignment to see if it overlaps query\n    AP kk = k.first;\n    max_overlap = std::max(max_overlap, std::max(0, std::min(kk.second, al2) - std::max(kk.first,al1)));\n    //  out = true;\n    //if (al1 >= kk.first && al2 <= kk.second)\n    //  query_contained = true;\n  }\n  return max_overlap;\n  \n}\n\n  void print(std::stringstream& s, std::ofstream& log, bool cerr) {\n    log << s.str();\n    if (cerr)\n      std::cerr << s.str();\n    s.str(std::string());\n  }\n  \n\n  std::string runTimeString(int num_t_reads, int num_n_reads, int contig_counter, \n\t\t\t    const SeqLib::GenomicRegion& region, const SeqLib::BamHeader& h, const svabaTimer& st,\n\t\t\t    const timespec& start) {\n    \n    std::stringstream ss;\n\n    if ( (num_t_reads + num_n_reads) > 0 && !region.IsEmpty()) {\n      std::string print1 = SeqLib::AddCommas<int>(region.pos1);\n      std::string print2 = SeqLib::AddCommas<int>(region.pos2);\n      char buffer[180];\n      snprintf (buffer, 180, \"***Ran %2s:%11s-%11s | T: %5d N: %5d C: %5d | \", \n\t       h.IDtoName(region.chr).c_str(),\n\t       print1.c_str(),print2.c_str(),\n\t       (int)num_t_reads, (int)num_n_reads, \n\t       (int)contig_counter);\n      ss << std::string(buffer) << st << \" | \";\n      ss << SeqLib::displayRuntime(start);\n    } else if (num_t_reads + num_n_reads > 0) {\n      char buffer[180];\n      snprintf (buffer, 180, \"Ran Whole Genome | T: %5d N: %5d C: %5d | \",\n\t       (int)num_t_reads, (int)num_n_reads,\n\t       (int)contig_counter);\n\n      ss << std::string(buffer) << st << \" | \";\n      ss << SeqLib::displayRuntime(start);\n    }\n    return ss.str();\n  }\n\n  // just get a count of how many jobs to run. Useful for limiting threads. Also set the regions\n  int countJobs(const std::string& regionFile, SeqLib::GRC &file_regions, SeqLib::GRC &run_regions, \n\t\tconst SeqLib::BamHeader& h, int chunk, int window_pad) {\n    \n    // open the region file if it exists\n    if (!regionFile.empty() && fs::exists(regionFile)) {\n      try {\n\tfile_regions = SeqLib::GRC(regionFile, h);\n      }\n      catch (const std::exception &exc) {\n\tstd::cerr\n\t  << \"Found chromosome in region file \" << regionFile\n\t  << \" not in reference genome. Skipping.\\n\"\n\t  << \"    Caught error: \" << exc.what() << \"\\n\";\n      }\n    }\n    \n    // parse as a samtools string eg 1:1,000,000-2,000,000\n    else if (regionFile.find(\":\") != std::string::npos && regionFile.find(\"-\") != std::string::npos) {\n      file_regions.add(SeqLib::GenomicRegion(regionFile, h));\n    }\n    \n    // it's a single chromosome\n    else if (!regionFile.empty()) {\n      SeqLib::GenomicRegion gr(regionFile, \"1\", \"1\", h);\n      if (gr.chr == -1 || gr.chr >= h.NumSequences()) {\n\tstd::cerr << \"ERROR: Trying to match chromosome \" << regionFile << \" to one in header, but no match found\" << std::endl;\n\texit(EXIT_FAILURE);\n      } else {\n\tgr.pos2 = h.GetSequenceLength(gr.chr); //get_()->target_len[gr.chr];\n\tfile_regions.add(gr);\n      }\n    }\n\n    // its empty, so cover whole genome\n    else { \n      // add all chromosomes\n      for (int i = 0; i < h.NumSequences(); i++) {\n\tfile_regions.add(SeqLib::GenomicRegion(i, 1, h.GetSequenceLength(i))); //h.get()_->target_len[i]));\n      }\n    }\n    \n    // check if the mask was successful\n    if (file_regions.size() == 0) {\n      std::cerr << \"ERROR: Cannot read region file: \" << regionFile << \n\t\" or something wrong with bam header ('chr' prefix mismatch?)\" << std::endl;\n      exit(EXIT_FAILURE);\n    }\n    \n    // divide it up\n    if (chunk > 0) { // if <= 0, whole genome at once\n      for (auto& r : file_regions) {\n\tSeqLib::GRC test(chunk, window_pad, r);\n\trun_regions.Concat(test);\n      }\n    }\n\n    // now clear file regions, to signal that it was empty\n    if (regionFile.empty())\n      file_regions.clear(); \n    \n    return run_regions.size();\n      \n  }\n  \n\n  std::string __bamOptParse(std::map<std::string, std::string>& obam, std::istringstream& arg, int sample_number, const std::string& prefix) {\n    std::stringstream ss;\n    std::string bam;\n    arg >> bam;\n    ss.str(std::string());\n    ss << prefix << std::setw(3) << std::setfill('0') << sample_number;\n    obam[ss.str()] = bam;\n    return bam;\n  }\n\n  bool __openWriterBam(const SeqLib::BamHeader& h, const std::string& name, SeqLib::BamWriter& wbam) {\n    \n    if (!wbam.Open(name))\n      return false;\n\n    wbam.SetHeader(h);;\n    if (!wbam.WriteHeader())\n      return false;\n    \n    return true;\n  }\n\n  /*  bool __header_has_chr_prefix(bam_hdr_t * h) {\n    for (int i = 0; i < h.NumSequences()) //->n_targets; ++i) \n      if (h->target_name[i] && std::string(h->target_name[i]).find(\"chr\") != std::string::npos) \n\treturn true;\n    return false;\n  }\n  */\n\n//http://stackoverflow.com/questions/2114797/compute-median-of-values-stored-in-vector-c\ndouble CalcMHWScore(std::vector<int>& scores)\n{\n  double median;\n  size_t size = scores.size();\n\n  std::sort(scores.begin(), scores.end());\n\n  if (size  % 2 == 0)\n    {\n      median = (scores[size / 2 - 1] + scores[size / 2]) / 2;\n    }\n  else \n    {\n      median = scores[size / 2];\n    }\n\n  return median;\n}\n\n  int weightedRandom(const std::vector<double>& cs) {\n    \n    // get a weighted random number\n    size_t al = 0;\n    double rand_val = rand() % 1000;\n    while (al < cs.size()) {\n      if (rand_val <= cs[al] * 1000) \n\treturn al;\n      ++al;\n    }\n    return al;\n  }\n\n  std::vector<std::string> tokenize_delimited(const std::string& str, char delim) {\n    std::vector<std::string> tokens;\n    size_t start = 0;\n    size_t end = str.find(delim);\n    \n    while (end != std::string::npos) {\n      tokens.push_back(str.substr(start, end - start));\n      start = end + 1;\n      end = str.find(delim, start);\n    }\n    \n    // Add the last token\n    tokens.push_back(str.substr(start));\n    \n    return tokens;\n  }\n  \n/// Check that the BAM header and BWA reference header line up.\nvoid checkHeaderCompatibility(const SeqLib::BamHeader& bamHeader,\n\t\t\t      const SeqLib::BamHeader& refHeader,\n\t\t\t      SvabaLogger& logger)  {\n  \n  bool triggerExplain = false;\n\n  if (bamHeader.NumSequences() != refHeader.NumSequences()) {\n    triggerExplain = true;\n    logger.log(\n\t       true, true,  //toerr, tolog\n\t       \"!!!!!!!!!!! WARNING !!!!!!!!!!!\\n\",\n\t       \"!!!!!! Number of sequences in BAM header mismatches reference\\n\",\n\t       \"!!!!!! BAM: \", bamHeader.NumSequences(),\n\t       \" -- Ref: \", refHeader.NumSequences()\n\t       );\n  }\n\n  \n  if (bamHeader.NumSequences() != refHeader.NumSequences()) {\n    triggerExplain = true;\n    logger.log(true, true, //toerr, tolog\n\t       \"!!!!!!!!!!! WARNING !!!!!!!!!!!\\n\",\n\t       \"!!!!!! Number of sequences in BAM header mismatches reference\\n\"\n\t       \"!!!!!! BAM: \", bamHeader.NumSequences(),\n\t       \" -- Ref: \", refHeader.NumSequences());\n  }\n  \n  const int n = std::min(bamHeader.NumSequences(), refHeader.NumSequences());\n  for (int i = 0; i < n; ++i) {\n    auto bamName = bamHeader.IDtoName(i);\n    auto refName = refHeader.IDtoName(i);\n    if (bamName != refName) {\n      triggerExplain = true;\n      logger.log(true, true,\n\t\t \"!!!!!! BAM sequence id \", i, \": \\\"\", bamName, \"\\\"\",\n\t\t \" -- Ref sequence id \", i, \": \\\"\", refName, \"\\\"\");\n    }\n  }\n  \n  if (triggerExplain) { \n    logger.log(true, true, std::string(100, '!'), \"\\n\",\n\t       \"!!! SvABA is being run with different reference genome than the reads were mapped to.\\n\",\n\t       \"!!! This can cause a massive failure in variant detection!\\n\",\n\t       \"!!! If you are *sure* that the two references are functionally equivalent (e.g. chr1 vs 1)\\n\",\n\t       \"!!! and that the order of the chromosomes is equivalent between the two,\\n\",\n\t       \"!!! you can override this error with option \\\"--override-reference-check\\\"\\n\",\n\t       std::string(100, '!'));\n    std::exit(EXIT_FAILURE);\n  }\n}\n\n\n  std::vector<std::pair<int, int>> find_repeats(std::string_view seq, size_t single_repeat_count = 0, size_t dinuc_repeat_count = 0) {\n    std::vector<std::pair<int, int>> result;\n    size_t n = seq.size();\n\n    // Check for single-base repeats (e.g., \"AAAA\")\n    if (single_repeat_count > 0 && n >= single_repeat_count) {\n        for (size_t i = 0; i <= n - single_repeat_count; ++i) {\n            char base = seq[i];\n            size_t j = i + 1;\n            while (j < n && seq[j] == base) ++j;\n\n            size_t len = j - i;\n            if (len >= single_repeat_count) {\n                result.emplace_back(i, j - 1);\n                i = j - 1;  // advance to end of this repeat block\n            }\n        }\n    }\n\n    // Check for dinucleotide repeats (e.g., \"AGAGAG\")\n    if (dinuc_repeat_count > 0 && n >= 2 * dinuc_repeat_count) {\n        for (size_t i = 0; i <= n - 2 * dinuc_repeat_count; ++i) {\n            std::string_view unit = seq.substr(i, 2);\n            size_t j = i + 2;\n            size_t count = 1;\n\n            while (j + 1 < n && seq.substr(j, 2) == unit) {\n                ++count;\n                j += 2;\n            }\n\n            if (count >= dinuc_repeat_count) {\n                result.emplace_back(i, j - 1);\n                i = j - 2;  // advance to end of this repeat block\n            }\n        }\n    }\n\n    return result;\n  }\n  \n  std::vector<int> parsePLString(const std::string& pl_str) {\n    std::vector<int> out;\n    out.reserve(3);\n    std::stringstream ss(pl_str);\n    std::string tok;\n    while (std::getline(ss, tok, ',')) {\n      try {\n\tout.push_back(std::stoi(tok));\n      }\n      catch (const std::exception& e) {\n\tthrow std::runtime_error(\"Invalid integer in PL string: \" + tok);\n      }\n    }\n    if (out.size() != 3) {\n      throw std::runtime_error(\"PL string must have exactly 3 comma-separated values\");\n    }\n    return out;\n  }\n  \n  // thresholds\n  constexpr size_t HOMOPOLYMER_MIN  = 3;  // e.g. 16 the same base\n  constexpr size_t DINUC_REPEAT_MIN = 2;   // e.g. 8 a nt motif\n  \n  SubstringList find_long_homopolymers(const std::string& s) {\n    \n    SubstringList results;\n    \n    if (s.size() < HOMOPOLYMER_MIN) return results;\n    \n    size_t run = 1;\n    for (size_t i = 1; i < s.size(); ++i) {\n        if (s[i] == s[i - 1]) {\n            ++run;\n        } else {\n            if (run >= HOMOPOLYMER_MIN) {\n                size_t end = i - 1;\n                size_t start = end - run + 1;\n                results.emplace_back(start, end, std::string(run, s[i - 1]));\n            }\n            run = 1;\n        }\n    }\n\n    // Catch repeat at end of string\n    if (run >= HOMOPOLYMER_MIN) {\n      size_t end = s.size() - 1;\n      size_t start = end - run + 1;\n      results.emplace_back(start, end, std::string(run, s.back()));\n    }\n    \n    return results;\n  }\n  \n  SubstringList find_long_dinuc_repeats(const std::string& s) {\n    \n    SubstringList results;\n    \n    if (s.size() < 2 * DINUC_REPEAT_MIN) return results;\n    \n    for (size_t i = 0; i + 2 * DINUC_REPEAT_MIN <= s.size(); ++i) {\n        std::string unit = s.substr(i, 2);\n        size_t reps = 1;\n\n        while (i + 2 * (reps + 1) <= s.size() &&\n               s.substr(i + 2 * reps, 2) == unit) {\n            ++reps;\n        }\n\n        if (reps >= DINUC_REPEAT_MIN) {\n            size_t start = i;\n            size_t end = i + 2 * reps - 1;\n\n            std::string repeated_seq;\n            for (size_t r = 0; r < reps; ++r)\n                repeated_seq += unit;\n\n            results.emplace_back(start, end, repeated_seq);\n\n            i = end - 1; // Skip ahead past this repeat\n        }\n    }\n\n    return results;\n}\n\n  \n} // end namespace svabaUtils\n"
  },
  {
    "path": "src/svaba/SvabaUtils.h",
    "content": "#pragma once\n\n#include <ctime>\n#include <sstream>\n#include <unordered_map>\n#include <map>\n#include <chrono>\n#include <tuple>\n\n#include \"SvabaLogger.h\"\n\n#include \"SeqLib/BamReader.h\"\n#include \"SeqLib/BamWriter.h\"\n#include \"SeqLib/RefGenome.h\"\n#include \"SeqLib/GenomicRegion.h\"\n\ntypedef std::pair<size_t, size_t> CountPair; \ntypedef std::tuple<size_t, size_t, std::string> Substring;\ntypedef std::vector<Substring> SubstringList;\n\n#define SRTAG(r) ((r).GetZTag(\"SR\") + \"_\" + std::to_string((r).AlignmentFlag()) + \"_\" + (r).Qname())\n\nnamespace svabaUtils {\n\n  // make a structure to store timing opt\n  struct svabaTimer {\n\n    static const std::string header;\n    \n    svabaTimer();\n    \n    std::vector<std::string> s;\n    \n    //clock_t curr_clock;\n    \n    std::chrono::time_point<std::chrono::steady_clock> wall_start;\n    double wall_elapsed = 0;\n    \n    void stop(const std::string& part);\n    \n    void start();\n    \n    // print it\n    friend std::ostream& operator<<(std::ostream &out, const svabaTimer st);\n\n    CountPair weird_read_count = {0,0}; // tumor/normal weird reads\n    CountPair mate_read_count = {0,0}; // tumor/normal weird reads\n    size_t dc_read_count = 0;\n    size_t dc_cluster_count = 0;\n    size_t contig_count = 0;\n    size_t aligned_contig_count;\n    size_t bps_count;\n\n    std::string logRuntime(const SeqLib::BamHeader& h);\n    \n    // run time\n    std::unordered_map<std::string, double> times;\n    int pct_r = 0, pct_m = 0, pct_k = 0, pct_as = 0; // pct_pp = 0;\n\n    SeqLib::GenomicRegion gr;\n    \n  };\n  \n  std::string myreplace(std::string &s,\n\t\t\tstd::string toReplace,\n\t\t\tstd::string replaceWith);\n  \n  double CalcMHWScore(std::vector<int>& scores);\n  \n  int overlapSize(const SeqLib::BamRecord& query, const SeqLib::BamRecordVector& subject);\n  bool hasRepeat(const std::string& seq);\n  std::string runTimeString(int num_t_reads, int num_n_reads, int contig_counter, \n\t\t\t    const SeqLib::GenomicRegion& region, const SeqLib::BamHeader& h, const svabaTimer& st, \n\t\t\t    const timespec& start);\n  int countJobs(const std::string& regionFile, SeqLib::GRC &file_regions, SeqLib::GRC &run_regions, \n\t\tconst SeqLib::BamHeader& h, int chunk, int window_pad);\n  \n  template <typename T>\n  void fopen(const std::string& s, T& o) {\n    o.open(s.c_str(), std::ios::out);\n\n    if (!o) {\n      std::cerr << \"Failed to open file: \" << s << std::endl;\n      exit(EXIT_FAILURE);\n    }\n    \n  }\n\n  std::string fileDateString();\n  \n  bool __header_has_chr_prefix(bam_hdr_t * h);\n  \n  /** Generate a weighed random integer \n   * @param cs Weighting for each integer (values must sum to one) \n   * @return Random integer bounded on [0,cs.size())\n   */\n  int weightedRandom(const std::vector<double>& cs);\n\n  std::vector<std::string> tokenize_delimited(const std::string& str, char delim);\n\n  void checkHeaderCompatibility(const SeqLib::BamHeader& bamHeader,\n\t\t\t      const SeqLib::BamHeader& refHeader,\n\t\t\t\tSvabaLogger& logger);\n\n  std::vector<std::pair<int, int>> find_repeats(std::string_view seq, size_t single_repeat_count, size_t dinuc_repeat_count);\n\n  std::vector<int> parsePLString(const std::string& pl_str);\n\n  SubstringList find_long_dinuc_repeats(const std::string& s);\n\n  SubstringList find_long_homopolymers(const std::string& s);  \n  \n}\n"
  },
  {
    "path": "src/svaba/refilter.cpp",
    "content": "// refilter.cpp — re-apply LOD / PASS filtering to an existing bps.txt.gz\n//\n// The goal here is to avoid re-running assembly when the user only wants to\n// tweak filtering thresholds. We read bps.txt.gz line-by-line, reconstruct\n// BreakPoint objects via BreakPoint(line, sc*), rescore, redump, and\n// regenerate the VCFs. The `dbsnp` column is round-tripped verbatim from\n// the dump; DBSnp re-querying has been sunset.\n//\n// Requirements on the input file:\n//   - Header line present (tab-delimited). Per-sample columns are expected to\n//     begin with 't' (tumor) or 'n' (normal). Core column count is either 41\n//     (legacy pre-SvABA2.0) or 51 (SvABA2.0 refilter-aware dump). Both are\n//     accepted.\n//   - Column formatting matches BreakPoint::toFileString(). The BreakPoint\n//     parse constructor tolerates sentinel values (\"x\", \"NA\", \"nan\", empty)\n//     for ints/doubles.\n//\n// Caveats:\n//   - Without contigs/reads, assembly-derived gates that re-examine sequence\n//     cannot run. We rely on the dumped split/read counts and the scoring\n//     primitives in svabaModels.\n//   - Older dumps may leave per-end LocalAlignment, cpos, match, split_cov\n//     bounds, and contig_len at defaults; those filters will degrade\n//     gracefully rather than erroring out.\n\n#include \"refilter.h\"\n\n#include <getopt.h>\n#include <sstream>\n#include <iostream>\n#include <memory>\n\n#include \"gzstream.h\"\n#include \"SeqLib/BamReader.h\"\n\n#include \"vcf.h\"\n#include \"BreakPoint.h\"\n#include \"SvabaUtils.h\"\n#include \"SvabaLogger.h\"\n#include \"SvabaOptions.h\"\n#include \"SvabaOutputWriter.h\"\n#include \"SvabaSharedConfig.h\"\n\n\nnamespace opt {\n\n  static std::string input_file;\n  static std::string analysis_id = \"refilter\";\n\n  static std::string bam;  // any BAM; used only for the sequence header\n\n  static int verbose = 1;\n\n  // Indel probability cutoffs (will be pushed into SvabaOptions before\n  // scoring). Defaults mirror the in-tree SvabaOptions defaults so refilter\n  // is non-destructive when no --lod* flags are passed.\n  static double lod            = 1.0;\n  static double lod_db         = 1.0;\n  static double lod_somatic    = 0.0;\n  static double lod_somatic_db = 2.0;\n\n  // Assumed mean read length when the dump lacks it. modelSelection uses this\n  // for per-read error scaling; in practice most short-read BAMs are 101-151.\n  static int readlen = 150;\n}\n\nenum {\n  OPT_LOD,\n  OPT_LOD_DB,\n  OPT_LOD_SOMATIC,\n  OPT_LOD_SOMATIC_DB,\n  OPT_READLEN\n};\n\n\nstatic const char* shortopts = \"hi:a:v:G:b:\";\nstatic const struct option longopts[] = {\n  { \"help\",                    no_argument,       NULL, 'h' },\n  { \"input-bps\",               required_argument, NULL, 'i' },\n  { \"bam\",                     required_argument, NULL, 'b' },\n  { \"analysis-id\",             required_argument, NULL, 'a' },\n  { \"verbose\",                 required_argument, NULL, 'v' },\n  { \"lod\",                     required_argument, NULL, OPT_LOD },\n  { \"lod-dbsnp\",               required_argument, NULL, OPT_LOD_DB },\n  { \"lod-somatic\",             required_argument, NULL, OPT_LOD_SOMATIC },\n  { \"lod-somatic-dbsnp\",       required_argument, NULL, OPT_LOD_SOMATIC_DB },\n  { \"readlen\",                 required_argument, NULL, OPT_READLEN },\n  { NULL, 0, NULL, 0 }\n};\n\nstatic const char *BP_USAGE_MESSAGE =\n\"Usage: svaba refilter [OPTION] -i bps.txt.gz -b <bam>\\n\\n\"\n\"  Description: re-run LOD/PASS filtering against an existing bps.txt.gz\\n\"\n\"  without re-doing assembly. Samples, coverage, split counts, contig\\n\"\n\"  coordinates, and local-alignment flags are read back from the dump.\\n\"\n\"\\n\"\n\"  General options\\n\"\n\"  -v, --verbose                Verbosity level (0-4). Default: 1\\n\"\n\"  -h, --help                   Display this help and exit\\n\"\n\"  -a, --analysis-id            Analysis ID for output filenames. [refilter]\\n\"\n\"  Required input\\n\"\n\"  -i, --input-bps              bps.txt.gz produced by `svaba run`.\\n\"\n\"  -b, --bam                    Any svaba-input BAM (used for sequence header only).\\n\"\n\"  Optional\\n\"\n\"      --lod                    LOD for non-REF PASS. [1.0]\\n\"\n\"      --lod-dbsnp              LOD for non-REF PASS at DBSnp sites. [1.0]\\n\"\n\"      --lod-somatic            LOD for SOMATIC. [0.0]\\n\"\n\"      --lod-somatic-dbsnp      LOD for SOMATIC at DBSnp sites. [2.0]\\n\"\n\"      --readlen                Assumed read length when dump lacks it. [150]\\n\"\n\"\\n\";\n\n// parse the command line options\nstatic void parseBreakOptions(int argc, char** argv) {\n  bool die = false;\n\n  if (argc <= 2)\n    die = true;\n\n  for (char c; (c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1;) {\n    std::istringstream arg(optarg != NULL ? optarg : \"\");\n    switch (c) {\n      case 'h': die = true; break;\n      case 'i': arg >> opt::input_file; break;\n      case 'v': arg >> opt::verbose; break;\n      case 'a': arg >> opt::analysis_id; break;\n      case 'b': arg >> opt::bam; break;\n      case OPT_LOD:             arg >> opt::lod;            break;\n      case OPT_LOD_DB:          arg >> opt::lod_db;         break;\n      case OPT_LOD_SOMATIC:     arg >> opt::lod_somatic;    break;\n      case OPT_LOD_SOMATIC_DB:  arg >> opt::lod_somatic_db; break;\n      case OPT_READLEN:         arg >> opt::readlen;        break;\n    }\n  }\n\n  if (opt::input_file.empty()) {\n    std::cerr << \"ERROR: --input-bps is required\\n\";\n    die = true;\n  }\n  if (opt::bam.empty()) {\n    std::cerr << \"ERROR: --bam is required (for the sequence header)\\n\";\n    die = true;\n  }\n\n  if (die) {\n    std::cerr << \"\\n\" << BP_USAGE_MESSAGE;\n    exit(EXIT_FAILURE);\n  }\n}\n\n// Parse a bps.txt sample-column header token like \"t001_/path/to.bam\" into\n// (prefix, path). If there is no underscore, the whole token is treated as\n// the prefix.\nstatic std::pair<std::string,std::string>\nsplitSampleHeader(const std::string& tok) {\n  const auto us = tok.find('_');\n  if (us == std::string::npos) return { tok, \"\" };\n  return { tok.substr(0, us), tok.substr(us + 1) };\n}\n\nvoid runRefilterBreakpoints(int argc, char** argv) {\n\n  parseBreakOptions(argc, argv);\n\n  if (opt::verbose > 0) {\n    std::cerr << \"Input bps file:  \" << opt::input_file << std::endl\n              << \"Output analysis id: \" << opt::analysis_id << std::endl\n              << \"    LOD cutoff (non-REF):           \" << opt::lod << std::endl\n              << \"    LOD cutoff (non-REF, at DBSNP): \" << opt::lod_db << std::endl\n              << \"    LOD somatic cutoff:             \" << opt::lod_somatic << std::endl\n              << \"    LOD somatic cutoff (at DBSNP):  \" << opt::lod_somatic_db << std::endl;\n  }\n\n  if (!SeqLib::read_access_test(opt::input_file)) {\n    std::cerr << \"ERROR: Cannot read \" << opt::input_file << std::endl;\n    exit(EXIT_FAILURE);\n  }\n\n  // Open the BAM only to grab its header; refilter does not read any reads.\n  SeqLib::BamReader bwalker;\n  if (!bwalker.Open(opt::bam)) {\n    std::cerr << \"ERROR: could not open BAM \" << opt::bam << std::endl;\n    exit(EXIT_FAILURE);\n  }\n  const SeqLib::BamHeader hdr = bwalker.Header();\n\n  // ------------------------------------------------------------------\n  // Read the bps.txt.gz header and recover sample prefixes.\n  //\n  // Layouts supported:\n  //   legacy (41 core cols): ..., contig_conf1, contig_conf2, <samples...>\n  //   svaba2 (51 core cols): ..., contig_conf1, contig_conf2,\n  //                              cpos1, cpos2, lmatch, rmatch, scov1, scov2,\n  //                              local1, local2, ctglen, flipped,\n  //                              <samples...>\n  //\n  // Sample header tokens are of the form \"{prefix}_{bampath}\" where prefix\n  // begins with 't' or 'n'. We locate the sample block by scanning for the\n  // first column whose name starts with 't' or 'n' past the fixed-width\n  // prefix (col 34+ is safe: no core column from there starts t/n).\n  // ------------------------------------------------------------------\n  igzstream infile(opt::input_file.c_str(), std::ios::in);\n\n  std::string headerLine;\n  if (!std::getline(infile, headerLine)) {\n    std::cerr << \"ERROR: bps.txt file is empty or unreadable\" << std::endl;\n    exit(EXIT_FAILURE);\n  }\n\n  const std::vector<std::string> headerv =\n      svabaUtils::tokenize_delimited(headerLine, '\\t');\n\n  if (headerv.size() < 41) {\n    std::cerr << \"ERROR: bps.txt header has only \" << headerv.size()\n              << \" columns; expected at least 41 (legacy) or 51 (svaba2).\"\n              << \" File may be truncated or from an unsupported svaba version.\"\n              << std::endl;\n    exit(EXIT_FAILURE);\n  }\n\n  size_t sample_start = 0;\n  for (size_t i = 34; i < headerv.size(); ++i) {\n    if (!headerv[i].empty() &&\n        (headerv[i].at(0) == 't' || headerv[i].at(0) == 'n')) {\n      sample_start = i;\n      break;\n    }\n  }\n  if (sample_start == 0) {\n    std::cerr << \"ERROR: could not locate sample-name columns in bps.txt header.\"\n              << \" No column starting with 't' or 'n' found after the core block.\"\n              << std::endl;\n    exit(EXIT_FAILURE);\n  }\n\n  // Build a minimal SvabaSharedConfig sufficient to drive BreakPoint parsing\n  // and rescoring. SvabaOutputWriter is constructed but not `init`-ed; no\n  // files are opened by it. We open our own bps output stream below.\n  SvabaLogger       logger;\n  SvabaOptions      opts;\n  SvabaOutputWriter writer(logger, opts);\n\n  // Push CLI-provided cutoffs into opts; score_indel() reads these.\n  opts.lod          = opt::lod;\n  opts.lodDb        = opt::lod_db;\n  opts.lodSomatic   = opt::lod_somatic;\n  opts.lodSomaticDb = opt::lod_somatic_db;\n\n  // Populate opts.bams from the header. The BreakPoint parse constructor\n  // iterates sc->opts.bams (a std::map) in sorted key order, so as long as\n  // the dump also iterated opts.bams in sorted order (which it does), the\n  // per-sample token order is round-trip-safe. Key is the sample prefix\n  // (e.g. \"t001\"); the value (bam path from the header token) is only used\n  // here for the reconstructed header line.\n  std::vector<std::string> allele_names;  // raw header tokens, for info/debug\n  std::vector<std::string> sample_prefixes;\n  for (size_t i = sample_start; i < headerv.size(); ++i) {\n    allele_names.push_back(headerv[i]);\n    auto [pref, path] = splitSampleHeader(headerv[i]);\n    if (pref.empty() ||\n        (pref.at(0) != 't' && pref.at(0) != 'n')) {\n      std::cerr << \"ERROR: unexpected sample header token '\"\n                << headerv[i] << \"' (col \" << i << \"); \"\n                << \"expected to start with 't' or 'n'.\" << std::endl;\n      exit(EXIT_FAILURE);\n    }\n    // Preserve the original bam path from the header (may be empty if the\n    // header token was just a bare prefix). Used only for the re-emitted\n    // header line and (incidentally) as the value in the map iterated by\n    // the BreakPoint parse constructor.\n    opts.bams[pref] = path;\n    sample_prefixes.push_back(pref);\n  }\n\n  if (opt::verbose > 0) {\n    std::cerr << \"...bps.txt has \" << headerv.size() << \" columns; \"\n              << sample_start << \" core, \"\n              << (headerv.size() - sample_start) << \" sample(s): \";\n    for (const auto& p : sample_prefixes) std::cerr << p << \" \";\n    std::cerr << std::endl;\n  }\n\n  // Build the SvabaSharedConfig\n  SvabaSharedConfig sc(logger, opts, writer);\n  sc.header  = hdr;\n  sc.readlen = opt::readlen;\n\n  // (DBSnp filtering has been sunset — refilter no longer supports it. The\n  // `dbsnp` column in bps.txt.gz is round-tripped verbatim from the dump.)\n\n  // VCF header (minimal)\n  VCFHeader vheader;\n  vheader.filedate  = svabaUtils::fileDateString();\n  vheader.source    = \"svaba refilter\";\n  vheader.reference = \"\";\n\n  // Open the rewritten bps file and write its header. We re-emit the current\n  // BreakPoint::header() layout so downstream tooling always sees the\n  // newest column set (the reader above was backward-compatible with the\n  // older 41-col dumps, but we prefer to always emit the modern format).\n  const std::string new_bps_file = opt::analysis_id + \".bps.txt.gz\";\n  ogzstream os_bps;\n  svabaUtils::fopen(new_bps_file, os_bps);\n  os_bps << BreakPoint::header();\n  for (auto& p : opts.bams)\n    os_bps << \"\\t\" << p.first << \"_\" << p.second;\n  os_bps << \"\\n\";\n\n  // --------------------------- main loop ---------------------------\n  size_t line_count = 0;\n  size_t parse_errors = 0;\n  std::string line;\n  while (std::getline(infile, line)) {\n    if (line.empty()) continue;\n    if (line[0] == '#') continue;  // defensive\n\n    if (opt::verbose > 0 && line_count && (line_count % 100000) == 0)\n      std::cerr << \"...read \" << opt::input_file\n                << \" at line \" << SeqLib::AddCommas(line_count) << std::endl;\n\n    std::unique_ptr<BreakPoint> bp;\n    try {\n      bp.reset(new BreakPoint(line, &sc));\n    } catch (const std::exception& e) {\n      ++parse_errors;\n      if (parse_errors <= 5) {\n        std::cerr << \"WARN: parse error at line \" << (line_count + 1)\n                  << \": \" << e.what() << std::endl;\n      }\n      ++line_count;\n      continue;\n    }\n\n    // Roll discordant counts from per-sample disc into dc.{tcount,ncount}.\n    // The original scorer sets these during assembly; they may not be\n    // present in the dump's dc fields, so derive from per-sample `disc`.\n    bp->dc.tcount = 0;\n    bp->dc.ncount = 0;\n    for (auto& [pref, si] : bp->allele) {\n      if (!pref.empty() && pref.at(0) == 't') bp->dc.tcount += si.disc;\n      else                                    bp->dc.ncount += si.disc;\n    }\n\n    // Clear derived fields so scoreBreakpoint() can repopulate from scratch.\n    // The parse sets `confidence` from the dump; scoreBreakpoint() asserts\n    // it's empty (except for BLACKLIST), so blank it here unless already\n    // BLACKLIST (which is a terminal state we want to preserve).\n    if (bp->confidence != \"BLACKLIST\")\n      bp->confidence.clear();\n\n    // Re-score\n    try {\n      bp->scoreBreakpoint();\n    } catch (const std::exception& e) {\n      std::cerr << \"WARN: scoreBreakpoint failed at line \" << (line_count + 1)\n                << \": \" << e.what() << std::endl;\n      ++line_count;\n      continue;\n    }\n\n    // toFileString() needs the BAM header to render chromosome names;\n    // read-tracking is no longer a per-call toggle (supporting-read qnames\n    // are stored or stripped elsewhere in the write path).\n    os_bps << bp->toFileString(hdr) << \"\\n\";\n    ++line_count;\n  }\n  os_bps.close();\n\n  if (opt::verbose > 0) {\n    std::cerr << \"...refilter read \" << line_count << \" lines\"\n              << \" (\" << parse_errors << \" parse error\"\n              << (parse_errors == 1 ? \"\" : \"s\") << \")\" << std::endl;\n  }\n\n  // ---- regenerate VCFs from the refiltered bps ----\n  if (SeqLib::read_access_test(new_bps_file)) {\n\n    if (opt::verbose > 0)\n      std::cerr << \"...making the primary VCFs (unfiltered and filtered) from file \"\n                << new_bps_file << std::endl;\n\n    VCFFile snowvcf(new_bps_file, opt::analysis_id, sc, vheader, true,\n                    opt::verbose > 0);\n\n    const bool onefile = (allele_names.size() == 1);\n\n    std::string basename = opt::analysis_id + \".svaba.unfiltered.\";\n    snowvcf.include_nonpass = true;\n    snowvcf.writeIndels(basename, false, onefile, hdr);\n    snowvcf.writeSVs   (basename, false, onefile, hdr);\n\n    basename = opt::analysis_id + \".svaba.\";\n    snowvcf.include_nonpass = false;\n    snowvcf.writeIndels(basename, false, onefile, hdr);\n    snowvcf.writeSVs   (basename, false, onefile, hdr);\n\n  } else {\n    std::cerr << \"Failed to make VCF. Could not find rewritten bps file \"\n              << new_bps_file << std::endl;\n  }\n}\n"
  },
  {
    "path": "src/svaba/refilter.h",
    "content": "#pragma once\n\n// Re-run LOD / PASS filtering against an existing bps.txt.gz. See refilter.cpp\n// for option parsing and the supported input layouts (41-col legacy and\n// 51-col SvABA2.0). Invoked from svaba.cpp as `svaba refilter ...`.\nvoid runRefilterBreakpoints(int argc, char** argv);\n"
  },
  {
    "path": "src/svaba/run_svaba.cpp",
    "content": "//run_svaba.cpp\n\n#include <thread>\n#include <mutex>\n#include \"threadpool.h\"\n#include <memory>\n\n#include <algorithm>\n#include <getopt.h>\n#include <iostream>\n#include <sstream>\n#include <unordered_map>\n#include <map>\n#include <vector>\n#include <cassert>\n\n#include \"SeqLib/GenomicRegion.h\"\n#include \"SeqLib/UnalignedSequence.h\"\n#include \"SeqLib/ReadFilter.h\"\n#include \"SeqLib/BamHeader.h\"\n#include \"SeqLib/BWAAligner.h\"\n#include \"SeqLib/ReadFilter.h\"\n\n#include \"SvabaRegionProcessor.h\"\n#include \"SvabaLogger.h\"\n#include \"KmerFilter.h\"\n#include \"vcf.h\"\n#include \"DBSnpFilter.h\"\n#include \"SvabaUtils.h\"\n#include \"SeqLib/BFC.h\"\n\n#include \"SvabaFileLoader.h\"\n#include \"SvabaOutputWriter.h\"\n#include \"SvabaAssemblerEngine.h\"\n#include \"SvabaAssemblerConfig.h\"\n\nusing SeqLib::BWAIndex;\nusing SeqLib::BWAAligner;\nusing SeqLib::BamHeader;\nusing SeqLib::Filter::ReadFilterCollection;\nusing SeqLib::GenomicRegion;\nusing SeqLib::GRC;\nusing SeqLib::BWAIndexPtr;\n\nusing std::string;\nusing std::cerr;\nusing std::endl;\nusing std::make_shared;\n\n// 1 is normal logging\n// 2 is heavy\nconstexpr inline int log_level = 1;\n\n// forward declaration, need non-static and not in\n// anonymous namespace to keep external linkage\nvoid  runsvaba       (int argc, char** argv);\n\nstruct SvabaBatchWorkItem {\n  // batch of region + unique region ID pairs\n  std::vector<std::pair<SeqLib::GenomicRegion,int>> items;\n  SvabaRegionProcessor& processor;\n\n  // constructor takes a reference to the shared processor\n  SvabaBatchWorkItem(const std::vector<std::pair<SeqLib::GenomicRegion,int>>& items_,\n                     SvabaRegionProcessor& proc)\n    : items(items_), processor(proc) {}\n\n  // call operator matching SvabaWorkItem signature\n  bool operator()(svabaThreadUnit& unit, size_t threadId) const {\n    for (auto& [region, id] : items) {\n      processor.process(region, unit, threadId);\n    }\n    return true;\n  }\n};\n\n// Modified sendThreads() to submit batches of regions instead of one-by-one jobs\nvoid sendThreads(const SeqLib::GRC& regionsToRun,\n                 SvabaSharedConfig& sc) {\n  \n  // shared processor instance\n  SvabaRegionProcessor proc(sc);\n\n  // thread pool now handles SvabaBatchWorkItem jobs\n  ThreadPool<SvabaBatchWorkItem> pool(sc);\n  \n  size_t batch_size = 1; \n  if (sc.opts.numThreads > 0) {\n    size_t per_thread = sc.total_regions_to_process / sc.opts.numThreads;\n    if (per_thread < batch_size) {\n      batch_size = std::max<size_t>(1, per_thread); // prevent batch_size = 0\n    }\n  }\n  \n  std::vector<std::pair<SeqLib::GenomicRegion,int>> batch;\n  batch.reserve(batch_size);\n\n  int count = 0;\n  for (auto& region : regionsToRun) {\n    batch.emplace_back(region, ++count);\n    if (batch.size() == batch_size) {\n      pool.submit(std::make_unique<SvabaBatchWorkItem>(batch, proc));\n      batch.clear();\n    }\n  }\n  // submit any leftover regions as one final batch\n  if (!batch.empty()) {\n    pool.submit(std::make_unique<SvabaBatchWorkItem>(batch, proc));\n  }\n\n  pool.shutdown();\n}\n  \nvoid makeVCFs(SvabaSharedConfig& sc) {\n\n//   // make the VCF file\n   string file = sc.opts.analysisId + \".bps.txt.gz\";  \n   sc.logger.log(true, true, \"...loading the bps file \", file,\" for conversion to VCF\");\n\n//   // make the header\n   VCFHeader header;\n   header.filedate = svabaUtils::fileDateString();\n   header.source = sc.args;\n   header.reference = sc.opts.refGenome;\n  \n   for (int i = 0; i < sc.header.NumSequences(); ++i)\n     header.addContigField(sc.header.IDtoName(i),sc.header.GetSequenceLength(i));\n\n   for (auto& b : sc.opts.bams) {\n     string fname = b.second; //bpf.filename();\n     header.addSampleField(fname);\n     header.colnames += \"\\t\" + fname; \n   }\n\n   // check if it has a matched control. If so, output \"somatic / germline\" vcfs\n   bool case_control_run = false;\n   for (auto& b : sc.opts.bams)\n     if (b.first.at(0) == 'n')\n       case_control_run = true;\n\n   // primary VCFs\n   sc.logger.log(true, true, \"...making the primary VCFs (unfiltered and filtered) from file \",file);\n   VCFFile snowvcf(file, sc.opts.analysisId, sc, header, false, sc.opts.verbose > 0);\n  \n   string basename = sc.opts.analysisId + \".svaba.unfiltered.\";\n   snowvcf.include_nonpass = true;\n   sc.logger.log(true, true, \"...writing unfiltered VCFs\");\n   snowvcf.writeIndels(basename, false, !case_control_run, sc.header);\n   snowvcf.writeSVs(basename, false,    !case_control_run, sc.header);\n  \n   sc.logger.log(true, true, \"...writing filtered VCFs\");\n   basename = sc.opts.analysisId + \".svaba.\";\n   snowvcf.include_nonpass = false;\n   snowvcf.writeIndels(basename, false, !case_control_run, sc.header);\n   snowvcf.writeSVs(basename, false,    !case_control_run, sc.header);\n\n}\n\nvoid runsvaba(int argc, char** argv) {\n\n  // parse command line\n  SvabaOptions opts;\n  try {\n    opts = SvabaOptions::parse(argc, argv);\n    if (opts.help) {\n      SvabaOptions::printUsage();\n      return;\n    }\n  }\n  catch (const std::exception& e) {\n    std::cerr << \"ERROR: \" << e.what() << \"\\n\";\n    return;\n  }\n\n  // instantiate logger, options, writer here.\n  // its just easier then to store refernce in SvabaSharedConfig\n  // to avoid header dependencies\n  SvabaLogger logger;\n  logger.init(opts.analysisId + \".log\");\n  //logger.welcome(opts); // initial message\n\n  // open the reference genome\n  logger.log(true, true, \"...loading the reference sequence for BWA\");  \n  BWAIndexPtr bwa_idx = make_shared<SeqLib::BWAIndex>();\n  bwa_idx->LoadIndex(opts.refGenome);\n  \n  // get the dictionary from reference\n  BamHeader bwa_header = bwa_idx->HeaderFromIndex();\n  \n  // open the writer\n  SvabaOutputWriter writer(logger, opts);\n  writer.init(opts.analysisId, bwa_header);\n\n  // shared information to be passed around thread units\n  SvabaSharedConfig sc(logger, opts, writer);\n  sc.bwa_idx = bwa_idx;\n  sc.header = bwa_header;\n  \n  // start the timer\n  clock_gettime(CLOCK_MONOTONIC, &sc.start);\n\n  // report which local-assembly engine was compiled in\n  std::cerr << \"...local-assembly engine: \" << svaba::kAssemblerName\n#if SVABA_ASSEMBLER_FERMI\n            << \" (FERMI assembly enabled)\"\n#else\n            << \" (SGA assembly enabled)\"\n#endif\n            << std::endl;\n\n  // check that the two headers are equivalant\n  // open the main bam to get header info\n  SeqLib::BamReader first_tumor_bam_reader;  \n  if (!first_tumor_bam_reader.Open(opts.main_bam)) {\n    cerr << \"ERROR: Cannot open main bam file: \" << opts.main_bam << endl;\n    exit(EXIT_FAILURE);\n  }\n  SeqLib::BamHeader first_header = first_tumor_bam_reader.Header();\n  \n  svabaUtils::checkHeaderCompatibility(first_header, bwa_header, logger);\n\n  // Check input BAM @PG tags for BWA. When --always-realign-corrected is\n  // NOT set, svaba reuses the input BAM's native CIGAR/NM for unchanged\n  // reads in the r2c-vs-native gate. That comparison is only valid if the\n  // input was aligned with BWA (same scoring model as svaba's internal\n  // aligner). If the PG chain doesn't mention \"bwa\", warn loudly.\n  if (!opts.alwaysRealignCorrected) {\n    std::string hdr_text = first_header.AsString();\n    // case-insensitive search: look for \"bwa\" anywhere in @PG lines\n    bool found_bwa = false;\n    std::istringstream hdr_stream(hdr_text);\n    std::string line;\n    while (std::getline(hdr_stream, line)) {\n      if (line.substr(0, 3) != \"@PG\") continue;\n      // case-insensitive: lowercase the line for matching\n      std::string lower_line = line;\n      std::transform(lower_line.begin(), lower_line.end(),\n                     lower_line.begin(), ::tolower);\n      if (lower_line.find(\"bwa\") != std::string::npos) {\n        found_bwa = true;\n        break;\n      }\n    }\n    if (!found_bwa) {\n      logger.log(true, true,\n        \"\");\n      logger.log(true, true,\n        \"************************************************************\");\n      logger.log(true, true,\n        \"* WARNING: No BWA @PG tag found in input BAM header.      *\");\n      logger.log(true, true,\n        \"* svaba reuses the input BAM's CIGAR/NM for reads that    *\");\n      logger.log(true, true,\n        \"* BFC did not modify. This is only valid when the input   *\");\n      logger.log(true, true,\n        \"* was aligned with BWA-MEM (same scoring model as svaba's *\");\n      logger.log(true, true,\n        \"* internal aligner).                                      *\");\n      logger.log(true, true,\n        \"*                                                         *\");\n      logger.log(true, true,\n        \"* If this BAM was NOT aligned with BWA, re-run with:      *\");\n      logger.log(true, true,\n        \"*   --always-realign-corrected                            *\");\n      logger.log(true, true,\n        \"* to force re-alignment of every read to the reference.   *\");\n      logger.log(true, true,\n        \"************************************************************\");\n      logger.log(true, true,\n        \"\");\n    }\n  }\n\n  // open file loader\n  SvabaFileLoader loader(sc); \n  \n  // open the blacklist, load into sc.blacklist\n  for (const auto& path : sc.opts.blacklistFile) {\n    SeqLib::GRC this_blacklist;\n    loader.loadBedRegions(path, this_blacklist);\n    sc.blacklist.Concat(this_blacklist);\n  }\n  sc.blacklist.MergeOverlappingIntervals();\n  sc.blacklist.CreateTreeMap();\n  \n  logger.log(true, true, \"...loaded \", SeqLib::AddCommas(sc.blacklist.size()),\n\t     \" blacklist regions across \", SeqLib::AddCommas(sc.opts.blacklistFile.size()),\n\t     \" files\");\n  \n  // open the germline sv database\n  loader.loadBedRegions(sc.opts.germlineSvFile, sc.germline_svs);\n  \n  // open the DBSnpFilter\n  if (sc.opts.dbsnpVcf.length()) {\n    sc.dbsnp_filter = std::make_shared<DBSnpFilter>(opts.dbsnpVcf, bwa_header, logger);\n  }\n  \n  // needed for aligned contig\n  for (auto& b : opts.bams)\n    sc.prefixes.insert(b.first);\n\n  // parse the region file, count number of jobs\n  SeqLib::GRC regionsToRun;\n  loader.countJobs(regionsToRun);\n\n  // SvABA2.0: drop any queued region that is 100% covered by the blacklist.\n  // svaba already filters reads by blacklist *inside* each region (see\n  // SvabaRegionProcessor.cpp:74), so a chunk that sits entirely in a\n  // blacklisted contig (e.g. the chrUn / *_decoy / *_alt contigs in the\n  // nonstd_chr blacklist) would otherwise still get its full region\n  // pipeline run — open the BAM walker, learn params, attempt local\n  // assembly on a stream of reads that all get dropped — just to produce\n  // zero callable bases. Net behavior is unchanged; this is pure\n  // optimization of the queue.\n  //\n  // The blacklist has had MergeOverlappingIntervals() + CreateTreeMap()\n  // called already (a few lines above), so FindOverlapWidth is an O(k log n)\n  // tree walk over the blacklist intervals that touch each region. Runs\n  // once, pre-queue, so it's off the critical path.\n  if (!sc.blacklist.empty() && regionsToRun.size() > 0) {\n    SeqLib::GRC kept;\n    size_t dropped_n  = 0;\n    size_t dropped_bp = 0;\n    for (const auto& r : regionsToRun) {\n      const int w = r.Width();\n      if (w > 0 &&\n          static_cast<int>(sc.blacklist.FindOverlapWidth(r, /*ignore_strand=*/true)) >= w) {\n        ++dropped_n;\n        dropped_bp += static_cast<size_t>(w);\n        continue;\n      }\n      kept.add(r);\n    }\n    if (dropped_n > 0) {\n      logger.log(true, true,\n        \"...pruned \", SeqLib::AddCommas(dropped_n), \" of \",\n        SeqLib::AddCommas(regionsToRun.size()),\n        \" queued regions (\", SeqLib::AddCommas(dropped_bp),\n        \" bp) that were 100% covered by the blacklist\");\n      regionsToRun = std::move(kept);\n      // No runtime.txt line will be emitted for a pruned region; the\n      // accounting in sc.total_regions_to_process below reflects what\n      // actually gets queued.\n    }\n  }\n\n  sc.total_regions_to_process = regionsToRun.size();\n  if (sc.total_regions_to_process < opts.numThreads) {\n    opts.numThreads = sc.total_regions_to_process;\n  }\n\n  // debug\n  /*  regionsToRun.clear();\n  for (int i = 0; i < 10; i++)\n    regionsToRun.add(GenomicRegion(2,89000000,91500000));\n  */\n  \n  // --- learn the insert-sizes ---\n  logger.log(true, true,\"...learning insert size distribution across all BAMs; this may take a while\");\n  \n  // learn from the BAM files\n  for (const auto& b : opts.bams) {\n    auto [it, inserted] = sc.bamStats.emplace(b.first, LearnBamParams(sc, b.second));\n    logger.log(true,true,\"......learning BAM: \", b.second);\n    it->second.learnParams();\n  }\n\n  // --- report what we learned ---\n  for (const auto& bs : sc.bamStats) {\n    logger.log(opts.verbose > 1, true, \"=====\", bs.first);\n    for (const auto& brg : bs.second.bam_read_groups)\n      logger.log(opts.verbose > 1, true, brg.first, \" - \", brg.second);\n  }\n\n  int globalReadLen = 0;\n  int globalMaxMapQ = 0;\n  double globalInsertSize = 0;\n  for (const auto& [_, learn_bam_param] : sc.bamStats) {\n    globalReadLen = std::max(globalReadLen, learn_bam_param.readlen_max);\n    globalMaxMapQ = std::max(globalMaxMapQ, learn_bam_param.mapq_max);\n    globalInsertSize = std::max(globalInsertSize, learn_bam_param.isize_max);    \n  }\n  sc.readlen = globalReadLen;\n  sc.insertsize = globalInsertSize;\n  \n  // --- set the SGA min overlap if user didn't ---\n  if (opts.sgaMinOverlap == 0) {\n    opts.sgaMinOverlap = std::max(30, int(0.6 * globalReadLen));\n  }\n  \n  logger.log(true, true,\n    \"... found max read length = \", globalReadLen,\n    \"; SGA minOverlap = \", opts.sgaMinOverlap,\n    \"; max MAPQ = \", globalMaxMapQ\n  );\n\n  // --- compute seed parameters ---\n  int seedLength, seedStride;\n  {\n    svabaAssemblerEngine tester(\n      \"test\", opts.sgaErrorRate,\n      opts.sgaMinOverlap,\n      globalReadLen\n    );\n    tester.calculateSeedParameters(\n      globalReadLen,\n      opts.sgaMinOverlap, seedLength, seedStride\n    );\n  }\n  logger.log(opts.verbose > 0, true, \"...seedLength = \", seedLength,\", readlen=\", globalReadLen, \")\" );\n\n  // FR isize discordant cutoff is now applied per-RG directly in\n  // svabaBamWalker::readBam (via getIsizeCutoff), using the same\n  // formula as TagDiscordant: median + SD * sdDiscCutoff.\n  // No more per-RG FR rules in ReadFilterCollection.\n\n  // set the ReadFilterCollection to be applied to each region\n  logger.log(opts.verbose > 1, true, opts.rulesJson);\n  sc.mr = ReadFilterCollection(opts.rulesJson, sc.header);\n  logger.log(opts.verbose > 0, true, sc.mr);\n\n  // put args into string for VCF later\n  sc.args += \"(v\" + string(SVABA_VERSION) + \") \";\n  for (int i = 0; i < argc; ++i)\n    sc.args += string(argv[i]) + \" \";\n\n  if (regionsToRun.size()) {\n    logger.log(true, true, \"...running on \", SeqLib::AddCommas(regionsToRun.size()),\n\t\t\" chunks\"); \n  } else {\n    logger.log(true, true, \"Chunk was <= 0: Reading in whole-genome at once\");\n  }\n\n  // send the jobs to the queue\n  logger.log(true, true, \"Starting detection pipeline\");\n  sendThreads(regionsToRun, sc); \n\n  // close the writer\n  writer.close();\n\n  // make the VCF file\n  //makeVCFs(sc);\n\n  cerr << SeqLib::displayRuntime(sc.start) << endl;\n\n  // suggest postprocess command\n  std::string stars(72, '*');\n  logger.log(true, true, \"\");\n  logger.log(true, true, stars);\n  logger.log(true, true, \"  svaba run complete for: \", opts.analysisId);\n  logger.log(true, true, \"\");\n  logger.log(true, true, \"  Next step — sort, dedup, and filter outputs:\");\n  logger.log(true, true, \"\");\n  logger.log(true, true, \"    svaba_postprocess.sh -t 8 -m 4G \", opts.analysisId);\n  logger.log(true, true, \"\");\n  logger.log(true, true, \"  Then convert to VCF:\");\n  logger.log(true, true, \"\");\n  logger.log(true, true, \"    svaba tovcf -i \", opts.analysisId,\n             \".bps.sorted.dedup.txt.gz -b \",\n             opts.main_bam, \" -a \", opts.analysisId);\n  logger.log(true, true, stars);\n  logger.log(true, true, \"\");\n}\n\n\n"
  },
  {
    "path": "src/svaba/svaba.cpp",
    "content": "/* SvABA - Somatic Structural Variation Dectection\n * Copyright 2014 Broad Institute \n * Written by Jeremiah Wala (jeremiah.wala@gmail.com)\n * Released under the included license detailed below.\n *\n * SvABA incorportes the core of String Graph Assembler, \n * -- String Graph Assembler -- Copyright 2009 Wellcome Trust Sanger Institute\n * -- Written by Jared Simpson\n * -- Released under the GPL\n */\n\n// svaba.cpp\n#include <iostream>\n#include <string_view>\n#include \"SvabaOptions.h\"\n\nvoid runToVCF(int argc, char** argv);\nvoid runsvaba(int argc, char** argv);\nvoid runRefilterBreakpoints(int argc, char** argv);\nvoid runPostprocess(int argc, char** argv);\n// \"Secret\" benchmark subcommand: deliberately NOT listed in printUsage()\n// below so it doesn't show up in the user-facing --help. Invoke with\n// `svaba test -h` to see its own usage. Used to isolate the per-phase\n// CPU cost of the main hot paths (walk / correct / assemble / align)\n// independently of the real pipeline's bookkeeping and scoring.\nvoid runTest(int argc, char** argv);\n\nstatic void printUsage() {\n    constexpr std::string_view header =\n        \"------------------------------------------------------------\\n\"\n        \"-------- SvABA - SV and indel detection by assembly --------\\n\"\n        \"------------------------------------------------------------\\n\";\n    std::cout << header\n              << \"Program: SvABA\\n\"\n              << \"Version: \" << SVABA_VERSION << \" - \" << SVABA_DATE << \"\\n\\n\"\n              << \"Usage: svaba <command> [options]\\n\\n\"\n              << \"Commands:\\n\"\n              << \"  run          Run SV and indel detection on BAM(s)\\n\"\n              << \"  refilter     Re-run LOD/PASS filtering on an existing bps.txt.gz\\n\"\n              << \"  postprocess  Sort + streaming-dedup per-suffix output BAMs\\n\"\n              << \"  tovcf        Convert a deduped bps.txt.gz into VCFv4.5 output\\n\\n\"\n              << \"Report issues at https://github.com/walaj/svaba/issues\\n\";\n}\n\nint main(int argc, char* argv[]) {\n    if (argc < 2) {\n        printUsage();\n        return EXIT_SUCCESS;\n    }\n\n    std::string_view cmd = argv[1];\n\n    if (cmd == \"help\" || cmd == \"--help\") {\n        printUsage();\n        return EXIT_SUCCESS;\n    }\n    else if (cmd == \"run\") {\n        // strip off the run before passing to parser\n        return (runsvaba(argc - 1, argv + 1), EXIT_SUCCESS);\n    }\n    else if (cmd == \"refilter\") {\n        return (runRefilterBreakpoints(argc - 1, argv + 1), EXIT_SUCCESS);\n    }\n    else if (cmd == \"postprocess\") {\n        return (runPostprocess(argc - 1, argv + 1), EXIT_SUCCESS);\n    }\n    else if (cmd == \"tovcf\") {\n        return (runToVCF(argc - 1, argv + 1), EXIT_SUCCESS);\n    }\n    // Secret benchmark subcommand — intentionally not in the user-facing\n    // command list. Entry point: `svaba test -h` for its own usage.\n    else if (cmd == \"test\") {\n        return (runTest(argc - 1, argv + 1), EXIT_SUCCESS);\n    }\n    else {\n        std::cerr << \"Unknown command: \" << cmd << \"\\n\\n\";\n        printUsage();\n        return EXIT_FAILURE;\n    }\n    \n    std::cerr << \"Done with SvABA\" << std::endl;\n    return 0;\n\n}\n"
  },
  {
    "path": "src/svaba/test_svaba.cpp",
    "content": "// test_svaba.cpp\n//\n// `svaba test` — a \"secret\" subcommand (not listed in the top-level help)\n// that runs a minimal microbenchmark of svaba's five main hot paths:\n//\n//   1. walk     — read N reads from a BAM\n//   2. correct  — BFC error-correct those reads\n//   3. realign  — BWA-MEM align each *corrected* read back to the reference.\n//                 This mirrors the per-read native alignment that\n//                 BreakPoint::splitCoverage needs for its r2c-vs-native\n//                 comparative gate (SVABA_R2C_NATIVE_GATE). On a real\n//                 svaba run this is currently an underrated cost: N\n//                 BWA-MEM calls PER WINDOW, where N is a few thousand\n//                 on a typical WGS, times ~120k windows for a full run.\n//   4. assemble — fermi-lite assemble the reads\n//   5. align    — BWA-MEM align the resulting contigs back to a reference\n//\n// Each phase is timed independently across a sweep of N values (default\n// 100, 500, 1 000, 5 000, 10 000, 50 000) so you can eyeball how each\n// phase scales. Results are not checked — the point is wall-clock per-\n// phase, not correctness. Repeat each trial -r times; the median is\n// reported (first-trial cold-cache effects wash out).\n//\n// Designed to isolate the bottleneck profile independently of the real\n// svaba pipeline's bookkeeping, scoring, and BAM writing — so when\n// someone says \"svaba is slow\" we can point at a phase.\n//\n// Usage:\n//   svaba test -i BAM -G REF [-n N ...] [-k REGION] [-r REPEATS] [--skip-*]\n//\n//   -i FILE     input BAM (any BAM with reads; aligned status is irrelevant)\n//   -G FILE     BWA-indexed reference FASTA (needs .bwt / .pac / etc)\n//   -n N        reads-per-trial; may repeat. Default sweep is\n//               100 / 500 / 1000 / 5000 / 10000 / 50000.\n//   -k REGION   samtools-style region (chr:start-end) to restrict the BAM\n//               read. Defaults to the beginning of the file.\n//   -r N        repetitions per trial (default 3). Reports median.\n//   --skip-walk       (benchmark still does the read-gathering;\n//                     just doesn't include it in the phase table)\n//   --skip-ec         skip BFC error correction\n//   --skip-assemble   skip fermi-lite assembly\n//   --skip-align      skip BWA-MEM alignment\n//   -v, --verbose\n//   -h, --help\n\n#include <getopt.h>\n#include <algorithm>\n#include <chrono>\n#include <cstdlib>\n#include <iomanip>\n#include <iostream>\n#include <numeric>\n#include <optional>\n#include <sstream>\n#include <string>\n#include <vector>\n\n#include \"SeqLib/BamReader.h\"\n#include \"SeqLib/BamRecord.h\"\n#include \"SeqLib/BFC.h\"\n#include \"SeqLib/BWAAligner.h\"\n#include \"SeqLib/BWAIndex.h\"\n#include \"SeqLib/FermiAssembler.h\"\n#include \"SeqLib/UnalignedSequence.h\"\n\nnamespace {\n\nstruct TestOpts {\n  std::string         bam;\n  std::string         ref;\n  std::string         region;\n  std::vector<size_t> n_sweep;\n  int                 repeats       = 3;\n  bool                skip_walk     = false;\n  bool                skip_ec       = false;\n  bool                skip_realign  = false;\n  bool                skip_assemble = false;\n  bool                skip_align    = false;\n  int                 verbose       = 0;\n};\n\nconstexpr const char* kUsage =\n\"svaba test — microbenchmark the four main svaba hot paths.\\n\\n\"\n\"Usage:\\n\"\n\"  svaba test -i BAM -G REF [-n N ...] [-k REGION] [-r REPEATS] [options]\\n\\n\"\n\"  -i, --bam FILE        input BAM (reads source)\\n\"\n\"  -G, --reference FILE  BWA-indexed reference (for alignment phase)\\n\"\n\"  -n, --num-reads N     trial size; may be passed multiple times.\\n\"\n\"                        Default sweep: 500, 1000, 2000, 3000, 5000, 10000 —\\n\"\n\"                        the 2k-3k range spans typical svaba 25kb-window loads.\\n\"\n\"  -k, --region REGION   samtools-style region to restrict BAM reading\\n\"\n\"  -r, --repeats N       per-trial repetitions (median reported, default 3)\\n\"\n\"      --skip-walk       exclude walk phase from the table (reads are still fetched)\\n\"\n\"      --skip-ec         skip BFC error correction\\n\"\n\"      --skip-realign    skip BWA-MEM realignment of corrected reads\\n\"\n\"      --skip-assemble   skip fermi-lite assembly\\n\"\n\"      --skip-align      skip BWA-MEM alignment of the produced contigs\\n\"\n\"  -v, --verbose         chatty diagnostics\\n\"\n\"  -h, --help            this message\\n\";\n\nconstexpr int OPT_SKIP_WALK     = 3001;\nconstexpr int OPT_SKIP_EC       = 3002;\nconstexpr int OPT_SKIP_REALIGN  = 3003;\nconstexpr int OPT_SKIP_ASSEMBLE = 3004;\nconstexpr int OPT_SKIP_ALIGN    = 3005;\n\nconst struct option LONGOPTS[] = {\n  { \"bam\",            required_argument, nullptr, 'i' },\n  { \"reference\",      required_argument, nullptr, 'G' },\n  { \"num-reads\",      required_argument, nullptr, 'n' },\n  { \"region\",         required_argument, nullptr, 'k' },\n  { \"repeats\",        required_argument, nullptr, 'r' },\n  { \"skip-walk\",      no_argument,       nullptr, OPT_SKIP_WALK },\n  { \"skip-ec\",        no_argument,       nullptr, OPT_SKIP_EC },\n  { \"skip-realign\",   no_argument,       nullptr, OPT_SKIP_REALIGN },\n  { \"skip-assemble\",  no_argument,       nullptr, OPT_SKIP_ASSEMBLE },\n  { \"skip-align\",     no_argument,       nullptr, OPT_SKIP_ALIGN },\n  { \"verbose\",        no_argument,       nullptr, 'v' },\n  { \"help\",           no_argument,       nullptr, 'h' },\n  { nullptr, 0, nullptr, 0 }\n};\n\nTestOpts parseCli(int argc, char** argv) {\n  TestOpts o;\n  bool die = (argc <= 2);\n  optind = 1;\n  for (int c; (c = getopt_long(argc, argv, \"hvi:G:n:k:r:\", LONGOPTS, nullptr)) != -1;) {\n    switch (c) {\n      case 'h': die = true; break;\n      case 'v': o.verbose = 1; break;\n      case 'i': o.bam     = optarg ? optarg : \"\"; break;\n      case 'G': o.ref     = optarg ? optarg : \"\"; break;\n      case 'k': o.region  = optarg ? optarg : \"\"; break;\n      case 'r': o.repeats = std::max(1, std::atoi(optarg ? optarg : \"3\")); break;\n      case 'n': {\n        try { o.n_sweep.push_back(std::stoull(optarg ? optarg : \"\")); }\n        catch (...) {\n          std::cerr << \"ERROR: -n expects a positive integer\\n\";\n          std::exit(EXIT_FAILURE);\n        }\n        break;\n      }\n      case OPT_SKIP_WALK:     o.skip_walk     = true; break;\n      case OPT_SKIP_EC:       o.skip_ec       = true; break;\n      case OPT_SKIP_REALIGN:  o.skip_realign  = true; break;\n      case OPT_SKIP_ASSEMBLE: o.skip_assemble = true; break;\n      case OPT_SKIP_ALIGN:    o.skip_align    = true; break;\n      default: die = true; break;\n    }\n  }\n  if (!die) {\n    if (o.bam.empty()) { std::cerr << \"ERROR: -i BAM required\\n\"; die = true; }\n    // Reference is needed for both the contig-align AND the corrected-read\n    // realign phase. Require it unless BOTH are skipped.\n    if ((!o.skip_align || !o.skip_realign) && o.ref.empty()) {\n      std::cerr << \"ERROR: -G REF required unless --skip-align AND --skip-realign\\n\";\n      die = true;\n    }\n  }\n  if (die) { std::cerr << \"\\n\" << kUsage; std::exit(1); }\n  if (o.n_sweep.empty())\n    // Default sweep targets the real per-window range (~2k-3k reads/window\n    // on typical WGS) with brackets below and above to show scaling.\n    o.n_sweep = { 500, 1000, 2000, 3000, 5000, 10000 };\n  return o;\n}\n\n// Read up to N BamRecord from the BAM, optionally restricted to `region`.\n// Anything shorter than `min_read_len` (e.g. unmapped stubs) is skipped so\n// the benchmark doesn't get polluted by degenerate records.\nSeqLib::BamRecordVector readNReads(const std::string& bam,\n                                   const std::string& region,\n                                   size_t N,\n                                   int min_read_len = 30) {\n  SeqLib::BamReader r;\n  if (!r.Open(bam)) {\n    std::cerr << \"ERROR: cannot open \" << bam << \"\\n\";\n    std::exit(EXIT_FAILURE);\n  }\n  if (!region.empty()) {\n    SeqLib::GenomicRegion gr(region, r.Header());\n    if (!r.SetRegion(gr)) {\n      std::cerr << \"ERROR: SetRegion failed for '\" << region << \"'\\n\";\n      std::exit(EXIT_FAILURE);\n    }\n  }\n  SeqLib::BamRecordVector out;\n  out.reserve(N);\n  while (auto opt = r.Next()) {\n    SeqLib::BamRecord& rec = *opt;\n    if (rec.Length() < min_read_len) continue;\n    // BamRecord is move-only (holds a shared_ptr<bam1_t>); transfer rather\n    // than copy. r.Next() just handed us ownership via the optional, so\n    // we move out of it and drop it before the next loop iteration.\n    out.push_back(std::move(rec));\n    if (out.size() >= N) break;\n  }\n  return out;\n}\n\n// Per-trial timing result. Fields are wall-clock seconds; 0.0 means the\n// phase was skipped.\nstruct Phase {\n  double walk     = 0.0;\n  double ec       = 0.0;\n  double realign  = 0.0;  // BWA-MEM of corrected reads -> reference\n  double assem    = 0.0;  // \"asm\" is GCC-reserved (inline assembly)\n  double align    = 0.0;  // BWA-MEM of contigs -> reference\n\n  double total() const { return walk + ec + realign + assem + align; }\n};\n\ndouble since(std::chrono::steady_clock::time_point t0) {\n  return std::chrono::duration<double>(std::chrono::steady_clock::now() - t0).count();\n}\n\nPhase oneTrial(const TestOpts& opts,\n               size_t N,\n               SeqLib::BWAIndexPtr& bwa_idx) {\n  Phase p;\n  using clock = std::chrono::steady_clock;\n\n  // ---- Phase 1: walk (always runs; --skip-walk just hides it in the table).\n  auto t0 = clock::now();\n  SeqLib::BamRecordVector reads = readNReads(opts.bam, opts.region, N);\n  p.walk = since(t0);\n\n  if (reads.empty()) {\n    std::cerr << \"WARNING: no reads fetched for N=\" << N << \"\\n\";\n    return p;\n  }\n\n  // ---- Phase 2: BFC error correction ---------------------------------------\n  // Mirrors what SvabaRegionProcessor does: add sequences, train, correct.\n  // Kept alive across phases so we can drain the corrected sequences for\n  // the realign phase below.\n  SeqLib::BFC bfc;\n  if (!opts.skip_ec) {\n    auto t1 = clock::now();\n    for (const auto& rec : reads) {\n      bfc.AddSequence(rec.Sequence(), rec.Qualities(0), rec.Qname());\n    }\n    bfc.Train();\n    bfc.ErrorCorrect();\n    p.ec = since(t1);\n  }\n\n  // ---- Phase 3: realign corrected reads -> reference -----------------------\n  // Feeds BreakPoint::splitCoverage's r2c-vs-native comparative gate. Real\n  // svaba runs ONE BWA-MEM call per corrected read per window, which on a\n  // typical WGS is a few thousand calls per window × ~120k windows. This\n  // is the phase the user was curious about — the \"additional alignment\"\n  // that the comparative split-coverage gate introduced.\n  //\n  // We drain the corrected sequences from BFC via GetSequence() rather\n  // than re-reading the original BAM sequence, so timing reflects the\n  // same payload svaba's gate operates on.\n  if (!opts.skip_realign && !opts.skip_ec) {\n    auto t_r = clock::now();\n    SeqLib::BWAAligner aligner(bwa_idx);\n    aligner.allocBuffer(4096);\n    bfc.ResetGetSequence();\n    std::string s, name;\n    size_t nr = 0;\n    while (bfc.GetSequence(s, name)) {\n      SeqLib::BamRecordPtrVector hits;\n      // Only need the best hit for a native-score comparison, so keep\n      // maxSecondary low and keepSecFrac at 0. Matches the intent of\n      // the SvabaRegionProcessor corrected_native_cig realign.\n      aligner.alignSequence(s, name.empty() ? std::to_string(nr) : name,\n                            hits,\n                            /*hardclip=*/false,\n                            /*keepSecFrac=*/0.0,\n                            /*maxSecondary=*/0);\n      ++nr;\n    }\n    p.realign = since(t_r);\n    if (opts.verbose) {\n      std::cerr << \"  [N=\" << N << \"] realigned \" << nr << \" corrected reads\\n\";\n    }\n  } else if (!opts.skip_realign && opts.skip_ec) {\n    // --skip-ec pre-empts realign (no corrected sequences to align).\n    if (opts.verbose) {\n      std::cerr << \"  [N=\" << N << \"] realign skipped (requires --skip-ec unset)\\n\";\n    }\n  }\n\n  // ---- Phase 4: fermi-lite assembly ----------------------------------------\n  // Feed raw BamRecords; the SeqLib wrapper extracts sequences.\n  std::vector<std::string> contigs;\n  if (!opts.skip_assemble) {\n    auto t2 = clock::now();\n    SeqLib::FermiAssembler fml;\n    fml.AddReads(reads);\n    fml.PerformAssembly();\n    contigs = fml.GetContigs();\n    p.assem = since(t2);\n    if (opts.verbose) {\n      std::cerr << \"  [N=\" << N << \"] assembled \" << contigs.size()\n                << \" contigs\\n\";\n    }\n  }\n\n  // ---- Phase 4: BWA-MEM align the contigs back to the reference ------------\n  // If no contigs were produced (either --skip-assemble was set or fermi\n  // produced nothing), fall back to aligning the raw read sequences so the\n  // phase still exercises BWA. This is deliberately a coarse measure —\n  // svaba's real align phase has a bunch of contig-sanity logic on top.\n  if (!opts.skip_align) {\n    auto t3 = clock::now();\n    SeqLib::BWAAligner aligner(bwa_idx);\n    aligner.allocBuffer(4096);\n    std::vector<std::string>* targets = &contigs;\n    std::vector<std::string> raw_seqs;\n    if (targets->empty()) {\n      raw_seqs.reserve(reads.size());\n      for (const auto& rec : reads) raw_seqs.push_back(rec.Sequence());\n      targets = &raw_seqs;\n    }\n    for (size_t i = 0; i < targets->size(); ++i) {\n      SeqLib::BamRecordPtrVector hits;\n      aligner.alignSequence((*targets)[i], \"t\" + std::to_string(i),\n                            hits, /*hardclip=*/false,\n                            /*keepSecFrac=*/0.9, /*maxSecondary=*/10);\n    }\n    p.align = since(t3);\n  }\n\n  return p;\n}\n\ndouble median(std::vector<double> v) {\n  if (v.empty()) return 0.0;\n  std::sort(v.begin(), v.end());\n  const size_t m = v.size() / 2;\n  return (v.size() % 2) ? v[m] : 0.5 * (v[m-1] + v[m]);\n}\n\n// Compact fixed-width table printer. Each row = one (N, phase) cell with\n// the median timing and a per-read microseconds column so you can eyeball\n// scaling linearity. Scaling column is the ratio vs the smallest N.\nvoid printTable(const TestOpts& opts,\n                const std::vector<std::pair<size_t, std::vector<Phase>>>& results) {\n  std::cout << \"\\n\";\n  std::cout << std::left << std::setw(10) << \"phase\"\n            << std::right << std::setw(10) << \"N\"\n            << std::setw(12) << \"median(s)\"\n            << std::setw(14) << \"per-read(us)\"\n            << std::setw(10) << \"scale\"\n            << \"\\n\";\n  std::cout << std::string(56, '-') << \"\\n\";\n\n  struct PhaseInfo { const char* label; double Phase::*field; bool skipped; };\n  const PhaseInfo phases[] = {\n    { \"walk\",     &Phase::walk,    opts.skip_walk },\n    { \"correct\",  &Phase::ec,      opts.skip_ec },\n    { \"realign\",  &Phase::realign, opts.skip_realign || opts.skip_ec },\n    { \"assemble\", &Phase::assem,   opts.skip_assemble },\n    { \"align\",    &Phase::align,   opts.skip_align },\n  };\n\n  for (const auto& ph : phases) {\n    if (ph.skipped) continue;\n    double base_per_read = -1.0;   // baseline for the scaling column (smallest N)\n    for (const auto& [N, trials] : results) {\n      std::vector<double> v;\n      v.reserve(trials.size());\n      for (const auto& t : trials) v.push_back(t.*ph.field);\n      const double med = median(v);\n      const double us_per_read = (N > 0) ? 1e6 * med / static_cast<double>(N) : 0.0;\n      if (base_per_read < 0) base_per_read = us_per_read;\n      const double scale =\n          (base_per_read > 0) ? us_per_read / base_per_read : 1.0;\n\n      std::cout << std::left  << std::setw(10) << ph.label\n                << std::right << std::setw(10) << N\n                << std::setw(12) << std::fixed << std::setprecision(4) << med\n                << std::setw(14) << std::fixed << std::setprecision(1) << us_per_read\n                << std::setw(10) << std::fixed << std::setprecision(2) << scale\n                << \"\\n\";\n    }\n    std::cout << \"\\n\";\n  }\n\n  // Totals row: sum of non-skipped phases, median across trials.\n  std::cout << std::left << std::setw(10) << \"TOTAL\"\n            << std::right << std::setw(10) << \" \"\n            << std::setw(12) << \"median(s)\"\n            << std::setw(14) << \"per-read(us)\"\n            << \"\\n\";\n  std::cout << std::string(46, '-') << \"\\n\";\n  for (const auto& [N, trials] : results) {\n    std::vector<double> v;\n    for (const auto& t : trials) v.push_back(t.total());\n    const double med = median(v);\n    const double us_per_read = (N > 0) ? 1e6 * med / static_cast<double>(N) : 0.0;\n    std::cout << std::left  << std::setw(10) << \"\"\n              << std::right << std::setw(10) << N\n              << std::setw(12) << std::fixed << std::setprecision(4) << med\n              << std::setw(14) << std::fixed << std::setprecision(1) << us_per_read\n              << \"\\n\";\n  }\n  std::cout << \"\\nScaling column is (per-read us at this N) / (per-read us at smallest N).\\n\"\n            << \"Near 1.00 = linear scaling. >1 means per-read cost grows with N\\n\"\n            << \"(= superlinear algorithm or cache effects). <1 means setup cost\\n\"\n            << \"amortizes as N grows.\\n\";\n}\n\n}  // namespace\n\n// Forward-declared in svaba.cpp dispatch.\nvoid runTest(int argc, char** argv) {\n  const TestOpts opts = parseCli(argc, argv);\n\n  std::cerr << \"svaba test:\\n\"\n            << \"  bam:     \" << opts.bam    << \"\\n\"\n            << \"  ref:     \" << opts.ref    << \"\\n\"\n            << \"  region:  \" << (opts.region.empty() ? \"(all)\" : opts.region) << \"\\n\"\n            << \"  repeats: \" << opts.repeats << \"\\n\"\n            << \"  N sweep:\";\n  for (auto n : opts.n_sweep) std::cerr << \" \" << n;\n  std::cerr << \"\\n\";\n\n  // Load BWA index once up front; it's large and expensive to load\n  // repeatedly. Reuse across every trial and every N.\n  SeqLib::BWAIndexPtr bwa_idx;\n  if (!opts.skip_align) {\n    std::cerr << \"loading BWA index from \" << opts.ref << \" ...\\n\";\n    auto t0 = std::chrono::steady_clock::now();\n    bwa_idx = std::make_shared<SeqLib::BWAIndex>();\n    bwa_idx->LoadIndex(opts.ref);\n    std::cerr << \"  loaded in \" << std::fixed << std::setprecision(1)\n              << since(t0) << \"s\\n\";\n  }\n\n  std::vector<std::pair<size_t, std::vector<Phase>>> results;\n  results.reserve(opts.n_sweep.size());\n\n  for (size_t N : opts.n_sweep) {\n    std::vector<Phase> trials;\n    trials.reserve(opts.repeats);\n    for (int r = 0; r < opts.repeats; ++r) {\n      if (opts.verbose)\n        std::cerr << \"  [N=\" << N << \" trial \" << (r+1) << \"/\" << opts.repeats << \"]\\n\";\n      trials.push_back(oneTrial(opts, N, bwa_idx));\n    }\n    results.emplace_back(N, std::move(trials));\n  }\n\n  printTable(opts, results);\n}\n"
  },
  {
    "path": "src/svaba/threadpool.h",
    "content": "// threadpool.h\n#pragma once\n\n#include <deque>\n#include <memory>\n#include <mutex>\n#include <condition_variable>\n#include <thread>\n#include <vector>\n#include <atomic>\n\n#include \"SvabaSharedConfig.h\"\n#include \"SvabaOutputWriter.h\"\n#include \"SvabaOptions.h\"\n#include \"SvabaThreadUnit.h\"\n\n// A simple thread safe queue for unique_ptr jobs\ntemplate<typename Job>\nclass WorkQueue {\npublic:\n  void push(std::unique_ptr<Job> job) {\n    {\n      std::lock_guard lk(mtx_);\n      queue_.push_back(std::move(job));\n    }\n    cv_.notify_one();\n  }\n\n  // pop one job; blocks until one is available or a nullptr sentinel is received\n  std::unique_ptr<Job> pop() {\n    std::unique_lock lk(mtx_);\n    cv_.wait(lk, [&]{ return !queue_.empty(); });\n    auto job = std::move(queue_.front());\n    queue_.pop_front();\n    return job;\n  }\n\n  // send one nullptr for each worker so they can exit\n  void shutdown(size_t numThreads) {\n    for(size_t i=0;i<numThreads;++i)\n      push(nullptr);\n  }\n\nprivate:\n  std::mutex                mtx_;\n  std::condition_variable   cv_;\n  std::deque<std::unique_ptr<Job>> queue_;\n};\n\n// A fixed-size thread pool that takes Job functors\ntemplate<typename WorkItem>\nclass ThreadPool {\npublic:\n  ThreadPool(SvabaSharedConfig& sc)\n    : queue_(), workers_(), flushMutex_(), sc_(sc)\n  {\n\n    workers_.reserve(sc.opts.numThreads);\n    for(size_t i=0;i<sc.opts.numThreads;++i){\n\n      workers_.emplace_back(\n\t\t\t    [i, this, &flushMutex = this->flushMutex_, &sc = sc_]() mutable {\n\t\t\t      //[=, &flushMutex = this->flushMutex_, &sc_ref = sc_]() mutable {\n\t\t\t      // per-thread setup - each thread gets its own FASTA read and BAM readers\n\t\t\t      // these should not be shared across threads, even if using const functions only\n\n\t\t\t      // this also opens the BAMs too in the svabaThreadUnit constructor\n\t\t\t      svabaThreadUnit unit(sc, i + 1); // give it the shared_ptr to the master index\n\t\t\t      unit.total_count = sc.total_regions_to_process;\n\t\t\t      \t\t\t      \n\t\t\t      // consume jobs\n\t\t\t      while(auto job = queue_.pop()){\n\t\t\t\t(*job)(unit, std::hash<std::thread::id>{}(std::this_thread::get_id()));\n\t\t\t      }\n\t\t\t      \n\t\t\t      // final flush\n\t\t\t      std::cerr << \"...final flush for thread \" << unit.threadId << std::endl;\n\t\t\t      sc_.writer.writeUnit(unit, sc_); // this does the flush and mutex in it\n\t\t\t      unit.clear();\n\t\t\t    });\n    }\n\n  }\n  \n  // submit a new work item\n  void submit(std::unique_ptr<WorkItem> job){\n    queue_.push(std::move(job));\n  }\n  \n  // tell threads no more work, then join\n  void shutdown(){\n    queue_.shutdown(workers_.size());\n    for(auto &t : workers_) t.join();\n  }\n\nprivate:\n  WorkQueue<WorkItem>      queue_;\n  std::vector<std::thread> workers_;\n  std::mutex               flushMutex_;\n  SvabaSharedConfig&       sc_;\n};\n"
  },
  {
    "path": "src/svaba/tovcf.cpp",
    "content": "// tovcf.cpp\n//\n// `svaba tovcf` — convert a deduplicated bps.txt.gz into a pair of VCF\n// files (one for SVs, one for indels). Target spec: VCFv4.5.\n//\n// This is the standalone format-conversion entry point. It assumes the\n// input bps.txt.gz has already been sorted and deduplicated by\n// scripts/svaba_postprocess.sh — so the VCFFile internal dedup pass is\n// skipped. All calls (somatic + germline) land in one SV file and one\n// indel file, with the SOMATIC INFO flag distinguishing somatic rows\n// for downstream `bcftools filter` / grep workflows.\n//\n// Knobs (with defaults chosen for the new pipeline):\n//   --sv-out PATH        output SV VCF (default ${id}.sv.vcf.gz)\n//   --indel-out PATH     output indel VCF (default ${id}.indel.vcf.gz)\n//   --always-bnd         force paired BND records for every SV\n//                        (otherwise intrachrom events collapse into\n//                         <DEL>/<DUP>/<INV> symbolic records).\n//   --qual MODE          missing | maxlod | sum (default: missing).\n//                        Controls the VCF QUAL column. \"missing\" ('.')\n//                        pushes users toward INFO/MAXLOD / INFO/SOMLOD\n//                        for filtering; \"maxlod\" puts 10*MAXLOD there;\n//                        \"sum\" is the legacy behavior.\n//   --include-nonpass    also emit records with FILTER != PASS.\n//   --dedup              opt back in to the legacy interval-tree dedup\n//                        (off by default; the postprocess pipeline\n//                         already dedupes upstream).\n//   --plain              write plain .vcf instead of bgzip'd .vcf.gz.\n//                        (Appends .vcf; by default outputs .vcf.gz.)\n//   -v / --verbose       chatty diagnostics.\n//   -h / --help          show help.\n//\n// Required:\n//   -i, --input-bps      deduped bps.txt.gz (from svaba_postprocess)\n//   -b, --bam            BAM used to recover the chromosome name/length\n//                        table; no reads are actually read.\n//   -a, --id-string      analysis id for output names.\n\n#include <getopt.h>\n#include <iostream>\n#include <memory>\n#include <sstream>\n#include <string>\n#include <vector>\n\n#include \"gzstream.h\"\n#include \"SeqLib/BamReader.h\"\n\n#include \"BreakPoint.h\"\n#include \"SvabaLogger.h\"\n#include \"SvabaOptions.h\"\n#include \"SvabaOutputWriter.h\"\n#include \"SvabaSharedConfig.h\"\n#include \"SvabaUtils.h\"\n#include \"vcf.h\"\n\nnamespace {\n\nstruct ToVcfOpts {\n  std::string input_file;\n  std::string bam;\n  std::string analysis_id;\n  std::string sv_out;       // explicit path; filled from analysis_id if empty\n  std::string indel_out;\n  bool        always_bnd   = false;\n  bool        include_nonpass = false;\n  bool        dedup         = false;\n  bool        gzip          = true;\n  int         verbose       = 0;\n  QualMode    qual_mode     = QualMode::MISSING;\n  // Minimum somlod (INFO/SOMLOD) to mark a record with the SOMATIC\n  // INFO flag. 1.0 is the recommended default — strong enough that\n  // `bcftools view -i 'INFO/SOMATIC'` picks out confident somatic\n  // calls without dragging in marginal ones.\n  double      somlod_cutoff = 1.0;\n};\n\nconstexpr const char* TOVCF_USAGE =\n\"Usage: svaba tovcf -i BPS.txt.gz -b BAM -a ID [options]\\n\"\n\"\\n\"\n\"  Convert a deduplicated bps.txt.gz into VCFv4.5 output. Emits a SV\\n\"\n\"  VCF and an indel VCF; all calls (somatic+germline) go into one file\\n\"\n\"  each, with the SOMATIC INFO flag distinguishing somatic rows.\\n\"\n\"\\n\"\n\"  Required:\\n\"\n\"    -i, --input-bps FILE        deduplicated bps.txt.gz\\n\"\n\"    -b, --bam FILE              BAM used to source the chrom name/length table\\n\"\n\"    -a, --id-string STR         analysis id for default output names\\n\"\n\"\\n\"\n\"  Output:\\n\"\n\"        --sv-out FILE           override SV output path\\n\"\n\"        --indel-out FILE        override indel output path\\n\"\n\"        --plain                 write plain .vcf instead of .vcf.gz\\n\"\n\"\\n\"\n\"  Format knobs:\\n\"\n\"        --always-bnd            force paired BND for every SV\\n\"\n\"        --qual MODE             missing | maxlod | sum (default: missing)\\n\"\n\"        --somlod N              min INFO/SOMLOD to stamp SOMATIC flag (default 1.0)\\n\"\n\"        --include-nonpass       include records with FILTER != PASS\\n\"\n\"        --dedup                 re-run legacy interval-tree dedup on input\\n\"\n\"\\n\"\n\"  Misc:\\n\"\n\"    -v, --verbose\\n\"\n\"    -h, --help\\n\";\n\nconstexpr const char* SHORTOPTS = \"hi:b:va:\";\n\n// Long-only flags are dispatched via the `val` column of longopts; keep\n// these unique across the option surface.\nconstexpr int OPT_SV_OUT          = 2001;\nconstexpr int OPT_INDEL_OUT       = 2002;\nconstexpr int OPT_ALWAYS_BND      = 2003;\nconstexpr int OPT_QUAL            = 2004;\nconstexpr int OPT_INCLUDE_NONPASS = 2005;\nconstexpr int OPT_DEDUP           = 2006;\nconstexpr int OPT_PLAIN           = 2007;\nconstexpr int OPT_SOMLOD          = 2008;\n\nconst struct option LONGOPTS[] = {\n  { \"help\",            no_argument,       nullptr, 'h' },\n  { \"input-bps\",       required_argument, nullptr, 'i' },\n  { \"bam\",             required_argument, nullptr, 'b' },\n  { \"id-string\",       required_argument, nullptr, 'a' },\n  { \"verbose\",         no_argument,       nullptr, 'v' },\n  { \"sv-out\",          required_argument, nullptr, OPT_SV_OUT },\n  { \"indel-out\",       required_argument, nullptr, OPT_INDEL_OUT },\n  { \"always-bnd\",      no_argument,       nullptr, OPT_ALWAYS_BND },\n  { \"qual\",            required_argument, nullptr, OPT_QUAL },\n  { \"include-nonpass\", no_argument,       nullptr, OPT_INCLUDE_NONPASS },\n  { \"dedup\",           no_argument,       nullptr, OPT_DEDUP },\n  { \"plain\",           no_argument,       nullptr, OPT_PLAIN },\n  { \"somlod\",          required_argument, nullptr, OPT_SOMLOD },\n  { nullptr, 0, nullptr, 0 }\n};\n\n// Parse --qual {missing|maxlod|sum}. Case-insensitive prefixes accepted.\nQualMode parse_qual_mode(const std::string& s) {\n  if (s == \"missing\" || s == \".\"   || s == \"none\" ) return QualMode::MISSING;\n  if (s == \"maxlod\"  || s == \"max\" || s == \"mlod\") return QualMode::MAXLOD_PHRED;\n  if (s == \"sum\"     || s == \"legacy\")              return QualMode::SUM_LO_PHRED;\n  std::cerr << \"ERROR: --qual must be one of: missing | maxlod | sum (got '\"\n            << s << \"')\\n\";\n  std::exit(EXIT_FAILURE);\n}\n\nToVcfOpts parse_cli(int argc, char** argv) {\n  ToVcfOpts o;\n  bool die = (argc <= 2);\n\n  optind = 1;  // reset getopt state (svaba.cpp consumes argv[1] before dispatch)\n  for (int c; (c = getopt_long(argc, argv, SHORTOPTS, LONGOPTS, nullptr)) != -1;) {\n    switch (c) {\n      case 'h': die = true; break;\n      case 'i': o.input_file  = optarg ? optarg : \"\"; break;\n      case 'b': o.bam          = optarg ? optarg : \"\"; break;\n      case 'a': o.analysis_id  = optarg ? optarg : \"\"; break;\n      case 'v': o.verbose      = 1; break;\n      case OPT_SV_OUT:          o.sv_out    = optarg ? optarg : \"\"; break;\n      case OPT_INDEL_OUT:       o.indel_out = optarg ? optarg : \"\"; break;\n      case OPT_ALWAYS_BND:      o.always_bnd = true; break;\n      case OPT_QUAL:            o.qual_mode = parse_qual_mode(optarg ? optarg : \"\"); break;\n      case OPT_INCLUDE_NONPASS: o.include_nonpass = true; break;\n      case OPT_DEDUP:           o.dedup = true; break;\n      case OPT_PLAIN:           o.gzip = false; break;\n      case OPT_SOMLOD: {\n        try {\n          o.somlod_cutoff = std::stod(optarg ? optarg : \"\");\n        } catch (const std::exception&) {\n          std::cerr << \"ERROR: --somlod expects a floating-point cutoff (got '\"\n                    << (optarg ? optarg : \"\") << \"')\\n\";\n          std::exit(EXIT_FAILURE);\n        }\n        break;\n      }\n      default: die = true; break;\n    }\n  }\n\n  if (!die) {\n    if (o.input_file.empty()) {\n      std::cerr << \"ERROR: -i / --input-bps is required\\n\"; die = true;\n    }\n    if (o.bam.empty()) {\n      std::cerr << \"ERROR: -b / --bam is required (for chrom name/length table)\\n\";\n      die = true;\n    }\n    if (o.analysis_id.empty()) {\n      std::cerr << \"ERROR: -a / --id-string is required\\n\"; die = true;\n    }\n  }\n\n  if (die) {\n    std::cerr << \"\\n\" << TOVCF_USAGE;\n    std::exit(1);\n  }\n\n  const std::string ext = o.gzip ? \".vcf.gz\" : \".vcf\";\n  if (o.sv_out.empty())    o.sv_out    = o.analysis_id + \".sv\"    + ext;\n  if (o.indel_out.empty()) o.indel_out = o.analysis_id + \".indel\" + ext;\n\n  return o;\n}\n\n// Copy of the refilter.cpp helper — splits \"prefix_/path/to.bam\" header\n// tokens into (prefix, path).\nstd::pair<std::string,std::string> splitSampleHeader(const std::string& tok) {\n  const auto us = tok.find('_');\n  if (us == std::string::npos) return { tok, \"\" };\n  return { tok.substr(0, us), tok.substr(us + 1) };\n}\n\n} // namespace\n\n// Forward declared in svaba.cpp dispatch.\nvoid runToVCF(int argc, char** argv) {\n\n  const ToVcfOpts o = parse_cli(argc, argv);\n\n  if (o.verbose > 0) {\n    std::cerr << \"svaba tovcf:\\n\"\n              << \"  input:       \" << o.input_file  << \"\\n\"\n              << \"  bam:         \" << o.bam         << \"\\n\"\n              << \"  sv-out:      \" << o.sv_out      << \"\\n\"\n              << \"  indel-out:   \" << o.indel_out   << \"\\n\"\n              << \"  qual:        \"\n              << (o.qual_mode == QualMode::MISSING      ? \"missing\"\n                : o.qual_mode == QualMode::MAXLOD_PHRED ? \"maxlod\"\n                :                                          \"sum\")\n              << \"\\n\"\n              << \"  sv-format:   \"\n              << (o.always_bnd ? \"BND_ALWAYS\" : \"SYMBOLIC_WHEN_OBVIOUS\") << \"\\n\"\n              << \"  somlod:      \" << o.somlod_cutoff << \"\\n\"\n              << \"  dedup:       \" << (o.dedup ? \"yes\" : \"no (input assumed pre-deduped)\") << \"\\n\"\n              << \"  nonpass:     \" << (o.include_nonpass ? \"yes\" : \"no\") << \"\\n\";\n  }\n\n  if (!SeqLib::read_access_test(o.input_file)) {\n    std::cerr << \"ERROR: cannot read \" << o.input_file << \"\\n\";\n    std::exit(EXIT_FAILURE);\n  }\n\n  // ---- 1. Open BAM only to grab the reference chromosome header ----------\n  SeqLib::BamReader bwalker;\n  if (!bwalker.Open(o.bam)) {\n    std::cerr << \"ERROR: cannot open BAM \" << o.bam << \"\\n\";\n    std::exit(EXIT_FAILURE);\n  }\n  const SeqLib::BamHeader hdr = bwalker.Header();\n\n  // ---- 2. Read bps.txt.gz header and discover sample prefixes ----------\n  //\n  // Matches the logic in refilter.cpp:runRefilterBreakpoints. The sample\n  // block starts at the first header token whose first char is 't' or 'n'\n  // past the fixed-width prefix (scan from col 34 to be safe on all v1-v3\n  // schemas). Once we know the prefixes, we stuff them into opts.bams so\n  // BreakPoint's line-parser iterates sample tokens in the right order.\n  igzstream infile(o.input_file.c_str(), std::ios::in);\n  std::string headerLine;\n  if (!std::getline(infile, headerLine)) {\n    std::cerr << \"ERROR: \" << o.input_file << \" is empty or unreadable\\n\";\n    std::exit(EXIT_FAILURE);\n  }\n  const auto headerv = svabaUtils::tokenize_delimited(headerLine, '\\t');\n  if (headerv.size() < 41) {\n    std::cerr << \"ERROR: bps.txt header has \" << headerv.size()\n              << \" columns; expected >=41 (legacy) or >=52 (v3).\\n\";\n    std::exit(EXIT_FAILURE);\n  }\n\n  size_t sample_start = 0;\n  for (size_t i = 34; i < headerv.size(); ++i) {\n    if (!headerv[i].empty() &&\n        (headerv[i].at(0) == 't' || headerv[i].at(0) == 'n')) {\n      sample_start = i;\n      break;\n    }\n  }\n  if (sample_start == 0) {\n    std::cerr << \"ERROR: could not locate sample columns in bps.txt header.\\n\";\n    std::exit(EXIT_FAILURE);\n  }\n\n  // ---- 3. Build a minimal SvabaSharedConfig ------------------------------\n  //\n  // Same pattern refilter.cpp uses: logger/opts/writer on the stack (they\n  // wrap a no-op output writer; we never init it or open any BAMs through\n  // it). sc.header carries the BamHeader so BreakPoint parsing can turn\n  // chrom names into IDs.\n  SvabaLogger       logger;\n  SvabaOptions      opts;\n  SvabaOutputWriter writer(logger, opts);\n  SvabaSharedConfig sc(logger, opts, writer);\n  sc.header = hdr;\n\n  // Populate opts.bams (std::map<prefix,path>) and the VCFHeader's\n  // sample + colname state in lockstep, so the per-sample VCF column\n  // order matches the sample block order in bps.txt.\n  VCFHeader base_header;\n  base_header.filedate  = svabaUtils::fileDateString();\n  base_header.source    = \"svaba tovcf \" + o.input_file;\n  base_header.reference = \"\";\n\n  // contig lines: chrom + length from the BAM\n  for (int i = 0; i < hdr.NumSequences(); ++i) {\n    base_header.addContigField(hdr.IDtoName(i), hdr.GetSequenceLength(i));\n  }\n\n  for (size_t i = sample_start; i < headerv.size(); ++i) {\n    auto [pref, path] = splitSampleHeader(headerv[i]);\n    if (pref.empty() || (pref.at(0) != 't' && pref.at(0) != 'n')) {\n      std::cerr << \"ERROR: unexpected sample header token '\" << headerv[i]\n                << \"' (col \" << i << \"); expected t***/n***.\\n\";\n      std::exit(EXIT_FAILURE);\n    }\n    opts.bams[pref] = path;\n    base_header.addSampleField(pref);\n    base_header.colnames += \"\\t\" + pref;\n  }\n\n  if (o.verbose > 0) {\n    std::cerr << \"...bps.txt has \" << headerv.size() << \" columns; \"\n              << sample_start << \" core, \"\n              << (headerv.size() - sample_start) << \" sample(s)\\n\";\n  }\n\n  // ---- 4. Construct VCFFile ---------------------------------------------\n  //\n  // `nopass=true` in the ctor tells VCFFile to RETAIN non-PASS rows while\n  // parsing; whether they're emitted is a separate decision controlled by\n  // `include_nonpass`. We always ingest everything from disk so the knob\n  // surface below can choose later.\n  //\n  // `skip_dedup_in_ctor` is set from the --dedup flag (default on): the\n  // ctor runs deduplicate() internally, and we need skip_dedup=true to\n  // be in effect BEFORE that call fires. Passing it through the ctor\n  // param gets that ordering right in one place.\n  const bool skip_internal_dedup = !o.dedup;\n  VCFFile vcf(o.input_file, o.analysis_id, sc, base_header,\n              /*nopass=*/true,\n              /*verbose=*/o.verbose > 0,\n              /*skip_dedup_in_ctor=*/skip_internal_dedup);\n\n  vcf.qual_mode         = o.qual_mode;\n  vcf.sv_format         = o.always_bnd ? SvFormat::BND_ALWAYS\n                                       : SvFormat::SYMBOLIC_WHEN_OBVIOUS;\n  vcf.include_nonpass   = o.include_nonpass;\n  vcf.somatic_threshold = o.somlod_cutoff;\n  // vcf.skip_dedup is already set from the ctor param above.\n\n  // ---- 5. Emit --------------------------------------------------------\n  if (o.verbose > 0) {\n    std::cerr << \"...writing SV VCF -> \"    << o.sv_out    << \"\\n\"\n              << \"...writing indel VCF -> \" << o.indel_out << \"\\n\";\n  }\n  vcf.writeSvsSingleFile   (o.sv_out,    o.gzip, hdr);\n  vcf.writeIndelsSingleFile(o.indel_out, o.gzip, hdr);\n\n  if (o.verbose > 0) {\n    std::cerr << \"svaba tovcf: done.\\n\";\n  }\n}\n"
  },
  {
    "path": "src/svaba/vcf.cpp",
    "content": "// vcf.cpp\n//\n// Read svaba breakpoints back from `bps.txt.gz`, deduplicate them, and emit\n// VCFs. See vcf.h for the external API. Only ~three things change vs the\n// pre-overhaul vcf.cpp:\n//\n//   1. BreakPoint is non-copyable/non-movable, so everything flows through\n//      std::shared_ptr<BreakPoint>.\n//   2. BreakPoint::SampleInfo is private; we iterate `bp->allele` via\n//      structured bindings (auto) and only use its public data members.\n//   3. The `BreakPoint(line, &sc)` ctor now takes a SvabaSharedConfig*, and\n//      the parsed bps row schema (39 fixed cols + per-sample tail) is\n//      described in BreakPoint.cpp at the parse loop.\n\n#include \"vcf.h\"\n\n#include <algorithm>\n#include <cassert>\n#include <cmath>       // std::lround (QUAL phred-rescaling)\n#include <cstdint>\n#include <cstdlib>\n#include <fstream>\n#include <functional>\n#include <iomanip>\n#include <iostream>\n#include <memory>\n#include <sstream>\n#include <string>\n#include <unordered_map>\n#include <unordered_set>\n#include <vector>\n\n#include \"gzstream.h\"\n\n#include \"SeqLib/GenomicRegion.h\"\n#include \"SeqLib/GenomicRegionCollection.h\"\n\n#include \"BreakPoint.h\"\n#include \"SvabaOptions.h\"\n\n// ---------------------------------------------------------------------------\n// File-local constants and helpers.\n// ---------------------------------------------------------------------------\nnamespace {\n\n// Maximum overlaps one breakend can have before we blacklist the whole\n// region as an SV-pileup and drop it from the output.\nconstexpr int HIGH_OVERLAP_LIMIT = 500;\n\n// How many bp of padding to apply when we blacklist a high-overlap region.\nconstexpr int BAD_REGION_PAD = 200;\n\n// FORMAT column strings — must stay in sync with BreakPoint::SampleInfo::\n// toFileString (see BreakPoint.cpp ~line 1710) and with the ##FORMAT lines\n// we emit below.\nconst std::string kSvFormat    = \"GT:AD:DP:SR:DR:GQ:PL:LO:LO_n\";\nconst std::string kIndelFormat = \"GT:AD:DP:SR:CR:GQ:PL:LO:LO_n\";\n\n// INFO fields that were declared `Type=Flag` in the header — flags are\n// printed without an `=value` tail.\nstd::unordered_set<std::string> g_flag_fields;\n\n// Track hashed VCFEntryPair ids we've already handed out so we can retry on\n// collision. File-scope because the constructor consumes it across all pairs.\nstd::unordered_set<uint32_t> g_hash_avoid;\n\n// Stable 32-bit string hash helper; we avoid pulling in htslib/khash.h just\n// for this and use std::hash truncated to 32 bits.\ninline uint32_t hash_string32(const std::string& s) {\n  const size_t h = std::hash<std::string>{}(s);\n  return static_cast<uint32_t>(h ^ (h >> 32));\n}\n\n// Sort INFO key/value pairs so that READ_ID (if present) always comes last,\n// and everything else is sorted alphabetically. This matches legacy output.\nbool compareInfoFields(const std::pair<std::string, std::string>& lhs,\n                       const std::pair<std::string, std::string>& rhs) {\n  const bool lhs_rid = (lhs.first == \"READ_ID\");\n  const bool rhs_rid = (rhs.first == \"READ_ID\");\n  if (rhs_rid && !lhs_rid) return true;\n  if (lhs_rid && !rhs_rid) return false;\n  return lhs.first < rhs.first;\n}\n\n// For the contig-by-length sort in the header emitter.\nbool pairCompareDesc(\n    const std::pair<int, std::pair<std::string, std::string>>& a,\n    const std::pair<int, std::pair<std::string, std::string>>& b) {\n  return a.first > b.first;\n}\n\n// SVType → short string used in the EVDNC INFO field.\nstd::string svtype_to_string(SVType t) {\n  switch (t) {\n    case SVType::NOTSET:     return \"NOTSET\";\n    case SVType::TSI_LOCAL:  return \"TSI_LOCAL\";\n    case SVType::TSI_GLOBAL: return \"TSI_GLOBAL\";\n    case SVType::ASSMB:      return \"ASSMB\";\n    case SVType::ASDIS:      return \"ASDIS\";\n    case SVType::DSCRD:      return \"DSCRD\";\n    case SVType::INDEL:      return \"INDEL\";\n  }\n  return \"UNKNOWN_SVTYPE\";\n}\n\n// Return the maximum per-sample LO across all alleles on a BreakPoint.\n// Used as the legacy \"LOD\" INFO field for indels.\ndouble max_allele_lo(const BreakPoint& bp) {\n  double m = 0.0;\n  for (const auto& [_, al] : bp.allele)\n    m = std::max(m, al.LO);\n  return m;\n}\n\n} // namespace\n\n// ===========================================================================\n// VCFHeader\n// ===========================================================================\n\nstd::ostream& operator<<(std::ostream& out, const VCFHeader& v) {\n\n  out << \"##fileformat=\" << v.fileformat << '\\n';\n  out << \"##fileDate=\"   << v.filedate   << '\\n';\n  out << \"##source=\"     << v.source     << '\\n';\n  out << \"##reference=\"  << v.reference  << '\\n';\n\n  // Emit contigs sorted by length, largest first (matches legacy output).\n  using CC = std::pair<std::string, std::string>;\n  using CI = std::pair<int, CC>;\n  std::vector<CI> contig_vec;\n  contig_vec.reserve(v.contigfieldmap.size());\n  for (const auto& kv : v.contigfieldmap)\n    contig_vec.emplace_back(std::stoi(kv.second), CC(kv.first, kv.second));\n  std::sort(contig_vec.begin(), contig_vec.end(), pairCompareDesc);\n\n  for (const auto& c : contig_vec)\n    out << \"##contig=<ID=\" << c.second.first\n        << \",length=\" << c.second.second << \">\\n\";\n\n  for (const auto& kv : v.infomap)\n    out << \"##INFO=<ID=\"   << kv.first << ',' << kv.second << \">\\n\";\n  for (const auto& kv : v.filtermap)\n    out << \"##FILTER=<ID=\" << kv.first << ',' << kv.second << \">\\n\";\n  for (const auto& kv : v.formatmap)\n    out << \"##FORMAT=<ID=\" << kv.first << ',' << kv.second << \">\\n\";\n  for (const auto& kv : v.samplemap)\n    out << \"##SAMPLE=<ID=\" << kv.first << \">\\n\";\n\n  out << v.colnames;\n  return out;\n}\n\nvoid VCFHeader::addInfoField(std::string field, std::string number,\n                             std::string type,  std::string description) {\n  if (infomap.find(field) != infomap.end()) {\n    std::cerr << \"Warning: Info field already exists: \" << field << '\\n';\n    return;\n  }\n  if (type == \"Flag\")\n    g_flag_fields.insert(field);\n\n  infomap[field] = \"Number=\" + number +\n                   \",Type=\" + type +\n                   \",Description=\\\"\" + description + \"\\\"\";\n}\n\nvoid VCFHeader::addFilterField(std::string field, std::string description) {\n  if (filtermap.find(field) != filtermap.end()) {\n    std::cerr << \"Warning: Filter field already exists: \" << field << '\\n';\n    return;\n  }\n  filtermap[field] = \"Description=\\\"\" + description + \"\\\"\";\n}\n\nvoid VCFHeader::addFormatField(std::string field, std::string number,\n                               std::string type,  std::string description) {\n  if (formatmap.find(field) != formatmap.end()) {\n    std::cerr << \"Warning: Format field already exists: \" << field << '\\n';\n    return;\n  }\n  formatmap[field] = \"Number=\" + number +\n                     \",Type=\" + type +\n                     \",Description=\\\"\" + description + \"\\\"\";\n}\n\nvoid VCFHeader::addSampleField(std::string field) {\n  if (samplemap.find(field) != samplemap.end()) {\n    std::cerr << \"Warning: Sample field already exists: \" << field << '\\n';\n    return;\n  }\n  samplemap[field] = field;\n}\n\nvoid VCFHeader::addContigField(std::string id, int len) {\n  contigfieldmap[id] = std::to_string(len);\n}\n\n// ===========================================================================\n// VCFEntry\n// ===========================================================================\n\nstd::string VCFEntry::getRefString() const {\n  std::string p = (bp->svtype == SVType::INDEL || id_num == 1) ? bp->ref : bp->alt;\n  if (p.empty()) {\n    std::cerr << \"WARNING: Empty ref/alt field for bp\\n\";\n    return \"N\";\n  }\n  return p;\n}\n\nstd::string VCFEntry::getAltString(const SeqLib::BamHeader& header) const {\n\n  // Indels just use bp->alt as-is (VCF-style insert/delete REF/ALT).\n  if (bp->svtype == SVType::INDEL) {\n    if (bp->alt.empty()) {\n      std::cerr << \"WARNING: Empty alt field for indel bp\\n\";\n      return \"N\";\n    }\n    return bp->alt;\n  }\n\n  // SvABA2.0: symbolic SV emission for SvFormat::SYMBOLIC_WHEN_OBVIOUS.\n  // The writer classifies each pair before calling; when symbolic_rep\n  // is set we emit `<DEL>` / `<DUP>` / `<INV>` as the single-record ALT\n  // and rely on END / SVLEN / SVTYPE INFO to describe the event.\n  if (symbolic_rep)\n    return \"<\" + symbolic_kind + \">\";\n\n  // SV breakends get the BND-style `N]chr:pos]` mate notation.\n  const std::string ref = getRefString();\n\n  std::stringstream ptag;\n  if (id_num == 1) {\n    ptag << bp->b2.gr.ChrName(header) << ':' << bp->b2.gr.pos1;\n  } else {\n    ptag << bp->b1.gr.ChrName(header) << ':' << bp->b1.gr.pos1;\n  }\n\n  std::stringstream alt;\n  const char s1 = bp->b1.gr.strand;\n  const char s2 = bp->b2.gr.strand;\n\n  if (s1 == '+' && s2 == '+') {\n    alt << ref << ']' << ptag.str() << ']';\n  } else if (s1 == '+' && s2 == '-') {\n    if (id_num == 1) alt << ref << '[' << ptag.str() << '[';\n    else             alt << ']' << ptag.str() << ']' << ref;\n  } else if (s1 == '-' && s2 == '+') {\n    if (id_num == 1) alt << ']' << ptag.str() << ']' << ref;\n    else             alt << ref << '[' << ptag.str() << '[';\n  } else {\n    alt << '[' << ptag.str() << '[' << ref;\n  }\n\n  return alt.str();\n}\n\nstd::string VCFEntry::getIdString() const {\n  if (bp->svtype != SVType::INDEL)\n    return std::to_string(id) + ':' + std::to_string(id_num);\n  return std::to_string(id);\n}\n\nstd::unordered_map<std::string, std::string> VCFEntry::fillInfoFields() const {\n\n  std::unordered_map<std::string, std::string> info;\n\n  info[\"SPAN\"] = std::to_string(bp->getSpan());\n  info[\"SCTG\"] = bp->cname;\n\n  // SvABA2.0: common per-record metadata, populated for both SVs and\n  // indels so downstream filters don't need to condition on shape.\n  //\n  // SOMATIC flag: gated on the somlod threshold carried per-entry\n  // (`somatic_threshold`, defaulted 1.0, overridable via `svaba tovcf\n  // --somlod N`). The svaba-run-time SomaticState::FAILED state is\n  // honored as a hard veto — something earlier in the pipeline\n  // explicitly said \"not somatic\", so we don't mark it regardless\n  // of what LO_s looks like.\n  if (bp->LO_s >= somatic_threshold &&\n      bp->somatic != SomaticState::FAILED)\n    info[\"SOMATIC\"] = \"\";   // flag\n\n  if (!bp->id.empty())\n    info[\"EVENT\"] = bp->id; // v3 bp_id (col 52 of bps.txt)\n\n  {\n    std::stringstream ss; ss << std::setprecision(4) << bp->max_lod;\n    info[\"MAXLOD\"] = ss.str();\n  }\n  {\n    std::stringstream ss; ss << std::setprecision(4) << bp->LO_s;\n    info[\"SOMLOD\"] = ss.str();\n  }\n\n  if (bp->svtype != SVType::INDEL) {\n    info[\"EVDNC\"]  = svtype_to_string(bp->svtype);\n\n    // SvABA2.0: SVTYPE is either BND (paired-breakend notation) or a\n    // symbolic type (DEL/DUP/INV) when the writer has opted into\n    // symbolic alleles and this record qualifies. symbolic_rep /\n    // symbolic_kind are set by writeSvsSingleFile before toFileString\n    // runs; when they're unset we fall back to legacy BND.\n    if (symbolic_rep) {\n      info[\"SVTYPE\"] = symbolic_kind;  // \"DEL\" / \"DUP\" / \"INV\"\n      // For symbolic alleles we must set END (SV end position) and\n      // SVLEN (positive for INS/DUP, negative for DEL; absolute length\n      // for INV because the inverted segment length is what matters).\n      const int pos1_1idx = bp->b1.gr.pos1 + 1;\n      const int pos2_1idx = bp->b2.gr.pos1 + 1;\n      const int end_pos   = std::max(pos1_1idx, pos2_1idx);\n      const int length    = std::abs(pos2_1idx - pos1_1idx);\n      info[\"END\"] = std::to_string(end_pos);\n      if      (symbolic_kind == \"DEL\") info[\"SVLEN\"] = std::to_string(-length);\n      else                              info[\"SVLEN\"] = std::to_string(length);\n      // svaba uses primarily junction evidence (+ optional depth via\n      // discordant pairs). \"J\" is the honest claim for assembly-only,\n      // \"DJ\" for ASDIS (assembly+discordant). DSCRD-only is rare for\n      // symbolic-eligible intrachrom events but we'd emit \"D\" there.\n      if      (bp->svtype == SVType::ASSMB) info[\"SVCLAIM\"] = \"J\";\n      else if (bp->svtype == SVType::ASDIS) info[\"SVCLAIM\"] = \"DJ\";\n      else if (bp->svtype == SVType::DSCRD) info[\"SVCLAIM\"] = \"D\";\n      else                                   info[\"SVCLAIM\"] = \"J\";\n    } else {\n      info[\"SVTYPE\"]  = \"BND\";\n      info[\"SVCLAIM\"] = \"J\";\n    }\n  }\n\n  if (!bp->repeat_seq.empty())\n    info[\"REPSEQ\"] = bp->repeat_seq;\n\n  // NM / MATENM / MATEID: only for multi-alignment (BND-style) breakpoints.\n  if (bp->num_align != 1) {\n    info[\"MATEID\"] = std::to_string(id) + ':' +\n                     std::to_string(id_num == 1 ? 2 : 1);\n    if (id_num == 1) {\n      info[\"NM\"]     = std::to_string(bp->b1.nm);\n      info[\"MATENM\"] = std::to_string(bp->b2.nm);\n    } else {\n      info[\"NM\"]     = std::to_string(bp->b2.nm);\n      info[\"MATENM\"] = std::to_string(bp->b1.nm);\n    }\n  } else {\n    info[\"NM\"] = std::to_string(bp->b1.nm);\n  }\n\n  // MAPQ of the breakend this entry represents.\n  info[\"MAPQ\"] = std::to_string(id_num == 1 ? bp->b1.mapq : bp->b2.mapq);\n\n  if (bp->num_align != 1) {\n    // --- SV-only fields ---\n    if (id_num == 1) {\n      if (bp->b1.sub)      info[\"SUBN\"] = std::to_string(bp->b1.sub);\n      else if (bp->b2.sub) info[\"SUBN\"] = std::to_string(bp->b2.sub);\n    }\n\n    if (!bp->homology.empty())  info[\"HOMSEQ\"]    = bp->homology;\n    if (!bp->insertion.empty()) info[\"INSERTION\"] = bp->insertion;\n\n    info[\"NUMPARTS\"] = std::to_string(bp->num_align);\n\n    if (bp->imprecise > 0) info[\"IMPRECISE\"] = \"\";\n    if (bp->secondary > 0) info[\"SECONDARY\"] = \"\";\n\n    if (info[\"EVDNC\"] != \"ASSMB\") {\n      info[\"DISC_MAPQ\"] = std::to_string(\n          id_num == 1 ? bp->dc.mapq1 : bp->dc.mapq2);\n    }\n\n  } else {\n    // --- indel-only fields ---\n    std::stringstream lod_ss;\n    lod_ss << std::setprecision(4) << max_allele_lo(*bp);\n    info[\"LOD\"] = lod_ss.str();\n\n    if (!bp->rs.empty())\n      info[\"DBSNP\"] = bp->rs;\n  }\n\n  return info;\n}\n\nstd::string VCFEntry::toFileString(const SeqLib::BamHeader& header,\n                                   QualMode qual_mode) const {\n\n  std::stringstream out;\n\n  // Sort INFO fields for stable, legacy-compatible output.\n  auto info_map = fillInfoFields();\n  std::vector<std::pair<std::string, std::string>> info_vec(\n      info_map.begin(), info_map.end());\n  std::sort(info_vec.begin(), info_vec.end(), compareInfoFields);\n\n  std::string info;\n  for (const auto& kv : info_vec) {\n    // Don't emit HOMSEQ/HOMLEN/INSERTION when imprecise (legacy behavior).\n    if (bp->imprecise && (kv.first == \"HOMSEQ\" ||\n                          kv.first == \"HOMLEN\" ||\n                          kv.first == \"INSERTION\"))\n      continue;\n\n    const bool is_flag = (g_flag_fields.count(kv.first) > 0);\n    info += kv.first + (is_flag ? \"\" : \"=\") + kv.second + ';';\n  }\n  if (!info.empty())\n    info.pop_back(); // trim trailing ';'\n\n  // SvABA2.0: pick QUAL representation. Legacy (SUM_LO_PHRED) keeps\n  // exactly the pre-2.0 behavior by passing bp->quality through; the\n  // two new modes are for the `svaba tovcf` path, where the canonical\n  // confidence lives in INFO/MAXLOD / INFO/SOMLOD and writing the sum-\n  // of-LOs Phred into QUAL just invites confused downstream filters.\n  std::string qual_str;\n  switch (qual_mode) {\n    case QualMode::MISSING:\n      qual_str = \".\";\n      break;\n    case QualMode::MAXLOD_PHRED: {\n      // maxlod is already log10 — scale by 10 for Phred and cap at 99\n      // to stay inside the conventional VCF QUAL range.\n      const double v = std::max(0.0, bp->max_lod);\n      const long   p = std::lround(10.0 * v);\n      qual_str = std::to_string(std::min<long>(p, 99));\n      break;\n    }\n    case QualMode::SUM_LO_PHRED:\n    default:\n      qual_str = std::to_string(bp->quality);\n      break;\n  }\n\n  // For symbolic SV records, POS is the lower of the two breakend\n  // positions (the event's 5' anchor); the INFO/END field carries the\n  // other boundary. For BND records, POS is just the breakend this\n  // entry represents (legacy behavior).\n  int pos;\n  std::string chr_name;\n  if (symbolic_rep) {\n    const int p1 = bp->b1.gr.pos1;\n    const int p2 = bp->b2.gr.pos1;\n    pos      = std::min(p1, p2);\n    // Both breakends live on the same chrom when symbolic; use b1's.\n    chr_name = bp->b1.gr.ChrName(header);\n  } else {\n    const BreakEnd* be = (id_num == 1) ? &bp->b1 : &bp->b2;\n    pos      = be->gr.pos1;\n    chr_name = be->gr.ChrName(header);\n  }\n\n  const char sep = '\\t';\n  out << chr_name               << sep\n      << pos                     << sep\n      << getIdString()           << sep\n      << getRefString()          << sep\n      << getAltString(header)    << sep\n      << qual_str                << sep\n      << bp->confidence          << sep\n      << info                    << sep\n      << (bp->svtype == SVType::INDEL ? kIndelFormat : kSvFormat);\n\n  // SvABA2.0: per-sample columns (VCF column 10+). Iterating bp->allele\n  // in-order is deterministic because SampleInfo is stored in a\n  // std::map keyed by the 4-char bam prefix (n001, t001, ...). The\n  // header's `colnames` must list samples in the same order for the\n  // VCF to be well-formed — callers that build the header from the\n  // bps.txt.gz row-0 sample list implicitly match this ordering.\n  for (const auto& [_, al] : bp->allele) {\n    out << sep << al.toFileString(bp->svtype);\n  }\n\n  return out.str();\n}\n\nbool VCFEntry::operator<(const VCFEntry& v) const {\n  const BreakEnd* a = (id_num   == 1) ? &bp->b1   : &bp->b2;\n  const BreakEnd* b = (v.id_num == 1) ? &v.bp->b1 : &v.bp->b2;\n  return a->gr < b->gr;\n}\n\nbool VCFEntry::operator==(const VCFEntry& v) const {\n  const BreakEnd* a = (id_num   == 1) ? &bp->b1   : &bp->b2;\n  const BreakEnd* b = (v.id_num == 1) ? &v.bp->b1 : &v.bp->b2;\n  return a->gr == b->gr;\n}\n\n// ===========================================================================\n// VCFEntryPair\n// ===========================================================================\n\nVCFEntryPair::VCFEntryPair(std::shared_ptr<BreakPoint>& b) {\n  bp     = b;\n  e1.bp  = bp;\n  e2.bp  = bp;\n  e1.id_num = 1;\n  e2.id_num = 2;\n\n  // Compose a stable string describing this pair and hash it. Retry on\n  // collision by salting with an increment counter, so ids remain unique\n  // even if two genuinely-distinct pairs happen to collide.\n  uint32_t hashed = 0;\n  int salt = 0;\n  do {\n    const std::string s =\n        std::to_string(bp->b1.gr.pos1) + '-' +\n        std::to_string(bp->b2.gr.pos1) + '-' +\n        std::to_string(bp->b1.gr.chr)  + '_' +\n        std::to_string(bp->b2.gr.chr)  +\n        bp->cname                      +\n        std::to_string(salt);\n    hashed = hash_string32(s);\n    ++salt;\n  } while (g_hash_avoid.find(hashed) != g_hash_avoid.end());\n\n  g_hash_avoid.insert(hashed);\n  e1.id = hashed;\n  e2.id = hashed;\n}\n\nstd::string VCFEntryPair::toFileString(const SeqLib::BamHeader& header,\n                                       QualMode qual_mode) const {\n  std::stringstream out;\n  // If e1 is marked symbolic_rep, only emit it (single-record SV event).\n  // Otherwise emit both breakends as a paired BND event.\n  out << e1.toFileString(header, qual_mode) << '\\n';\n  if (!e1.symbolic_rep)\n    out << e2.toFileString(header, qual_mode) << '\\n';\n  return out.str();\n}\n\n// ===========================================================================\n// VCFFile::VCFFile — read bps.txt.gz, build entries, deduplicate.\n// ===========================================================================\n\nnamespace {\n\n// All of the boilerplate ##INFO/##FILTER/##FORMAT lines for SV and indel\n// headers. Kept here rather than inline in the ctor so the ctor stays\n// readable.\nvoid populate_sv_header(VCFHeader& h) {\n\n  // FILTERs\n  h.addFilterField(\"NOLOCAL\",        \"Contig realigned to region outside of local assembly region, and no disc support.\");\n  h.addFilterField(\"LOCALMATCH\",     \"Contig realigned to assembly region without clipping\");\n  h.addFilterField(\"HIGHHOMOLOGY\",   \"Contig realigns with > 25% of readlength of homology. High probaility of assembly/mapping artifact\");\n  h.addFilterField(\"DUPREADS\",       \"Contig built from what appear to be duplicate reads (split reads all same contig cov))\");\n  h.addFilterField(\"NODISC\",         \"Rearrangement was not detected independently by assembly\");\n  h.addFilterField(\"LOWSUPPORT\",     \"Fewer than 2 split reads or < 4 total alt reads for ASDISC\");\n  h.addFilterField(\"COMPETEDISC\",    \"Discordant cluster found with nearly same breakpoints, but different strands for DSCRD event\");\n  h.addFilterField(\"LOWSPAN\",        \"Discordant read cluster (no split read support), and less than 10kb span and < 12 reads\");\n  h.addFilterField(\"LOWMAPQ\",        \"Assembly contig has non 60/60 mapq and no discordant support\");\n  h.addFilterField(\"LOWMATCHLEN\",    \"Assembly contig has fewer than 40 bases mapping uniquely to a reference locus (<100 if complex mapping or )\");\n  h.addFilterField(\"SINGLEBX\",       \"Variant is supported by only a single BX tag (if run with 10X Genomics data)\");\n  h.addFilterField(\"LOWQINVERSION\",  \"Assembly-only inversion of span < 300 and < 6 split reads. Common artifact in Illumina data\");\n  h.addFilterField(\"LOWMAPQDISC\",    \"Both clusters of reads failed to achieve mean mapq of > 30 for DSCRD\");\n  h.addFilterField(\"LOWSPLITSMALL\",  \"Fewer than 4 split reads for small events ( < 1500 bp)\");\n  h.addFilterField(\"LOWICSUPPORT\",   \"Less than 60bp of contig match on one end of an inter-chromosomal break\");\n  h.addFilterField(\"LOWAS\",          \"Alignment score of one end is less than 80% of contig length, or number of mismatch bases (NM) on one end is >= 10\");\n  h.addFilterField(\"WEAKSUPPORTHIREP\",\"Fewer then 7 split reads for variant with >= 10 bases of repeat sequence (need to be more strict)\");\n  h.addFilterField(\"WEAKDISC\",       \"Fewer than 7 supporting discordant reads and no assembly support\");\n  h.addFilterField(\"TOOSHORT\",       \"Contig alignment for part of this rearrangement has <= 25bp match to reference\");\n  h.addFilterField(\"PASS\",           \"Strong assembly support, strong discordant support, or combined support. Strong MAPQ\");\n  h.addFilterField(\"MULTIMATCH\",     \"Low MAPQ and this contig fragment maps well to multiple locations\");\n  h.addFilterField(\"LOWSPANDSCRD\",   \"Discordant-only cluster is too small given isize distribution to call confidently\");\n  h.addFilterField(\"SIMPLESEQUENCE\", \"Major portion of one contig mapping falls in a simple sequence, as given by -R flag. Assembly-only filter\");\n\n  // INFOs\n  h.addInfoField(\"REPSEQ\",    \"1\", \"String\",  \"Repeat sequence near the event\");\n  h.addInfoField(\"NM\",        \"1\", \"Integer\", \"Number of mismatches of this alignment fragment to reference\");\n  h.addInfoField(\"MATENM\",    \"1\", \"Integer\", \"Number of mismatches of partner alignment fragment to reference\");\n  h.addInfoField(\"SVTYPE\",    \"1\", \"String\",  \"Type of structural variant\");\n  h.addInfoField(\"HOMSEQ\",    \"1\", \"String\",  \"Sequence of base pair identical micro-homology at event breakpoints. Plus strand sequence displayed.\");\n  h.addInfoField(\"IMPRECISE\", \"0\", \"Flag\",    \"Imprecise structural variation\");\n  h.addInfoField(\"SECONDARY\", \"0\", \"Flag\",    \"SV calls comes from a secondary alignment\");\n  h.addInfoField(\"HOMLEN\",    \"1\", \"Integer\", \"Length of base pair identical micro-homology at event breakpoints\");\n  h.addInfoField(\"MAPQ\",      \"1\", \"Integer\", \"Mapping quality (BWA-MEM) of this fragement of the contig (-1 if discordant only)\");\n  h.addInfoField(\"MATEMAPQ\",  \"1\", \"Integer\", \"Mapping quality of the partner fragment of the contig\");\n  h.addInfoField(\"MATEID\",    \"1\", \"String\",  \"ID of mate breakends\");\n  h.addInfoField(\"SUBN\",      \"1\", \"Integer\", \"Number of secondary alignments associated with this contig fragment\");\n  h.addInfoField(\"NUMPARTS\",  \"1\", \"Integer\", \"If detected with assembly, number of parts the contig maps to. Otherwise 0\");\n  h.addInfoField(\"EVDNC\",     \"1\", \"String\",  \"Evidence for variant. ASSMB assembly only, ASDIS assembly+discordant. DSCRD discordant only, TSI_L templated-sequence insertion (local, e.g. AB or BC of an ABC), TSI_G global (e.g. AC of ABC)\");\n  h.addInfoField(\"SCTG\",      \"1\", \"String\",  \"Identifier for the contig assembled by svaba to make the SV call\");\n  h.addInfoField(\"INSERTION\", \"1\", \"String\",  \"Sequence insertion at the breakpoint.\");\n  h.addInfoField(\"SPAN\",      \"1\", \"Integer\", \"Distance between the breakpoints. -1 for interchromosomal\");\n  h.addInfoField(\"DISC_MAPQ\", \"1\", \"Integer\", \"Mean mapping quality of discordant reads mapped here\");\n\n  // SvABA2.0 (v3): VCF 4.5-aligned SV INFO fields.\n  h.addInfoField(\"SOMATIC\",   \"0\", \"Flag\",    \"Somatic call per svaba's somatic LOD model (see BreakPoint::score_somatic)\");\n  h.addInfoField(\"EVENT\",     \"1\", \"String\",  \"ID of the SV event this breakend belongs to. Paired BND records share the same EVENT; a symbolic SV is its own event. Populated from BreakPoint::id (col 52 of bps.txt) when available.\");\n  h.addInfoField(\"END\",       \"1\", \"Integer\", \"End position for symbolic alleles (<DEL>/<DUP>/<INV>). Not set for BND.\");\n  h.addInfoField(\"SVLEN\",     \"1\", \"Integer\", \"Length of the SV in bp. Negative for deletions. Only set on symbolic alleles.\");\n  h.addInfoField(\"SVCLAIM\",   \"1\", \"String\",  \"Evidence type supporting the SV call, per VCFv4.5: J=junction-level (split/assembly), D=depth, DJ=both.\");\n  h.addInfoField(\"MAXLOD\",    \"1\", \"Float\",   \"Maximum per-sample log-odds (variant vs error) across all samples (see BreakPoint::max_lod)\");\n  h.addInfoField(\"SOMLOD\",    \"1\", \"Float\",   \"Somatic log-odds (LLR of somatic vs non-somatic; see SvabaModels::SomaticLOD)\");\n\n  // FORMATs (SV)\n  h.addFormatField(\"GT\",   \"1\", \"String\",  \"Most likely genotype\");\n  h.addFormatField(\"AD\",   \"1\", \"Integer\", \"Allele depth: Number of reads supporting the variant\");\n  h.addFormatField(\"DP\",   \"1\", \"Integer\", \"Depth of coverage: Number of reads covering site.\");\n  h.addFormatField(\"GQ\",   \"1\", \"String\",  \"Genotype quality (currently not supported. Always 0)\");\n  h.addFormatField(\"PL\",   \".\", \"Float\",   \"Normalized likelihood of the current genotype\");\n  h.addFormatField(\"SR\",   \"1\", \"Integer\", \"Number of spanning reads for this variant\");\n  h.addFormatField(\"DR\",   \"1\", \"Integer\", \"Number of discordant-supported reads for this variant\");\n  h.addFormatField(\"LO\",   \"1\", \"Float\",   \"Log-odds that this variant is real vs artifact\");\n  h.addFormatField(\"LO_n\", \"1\", \"Float\",   \"Log-odds that this variant is AF=0 vs AF>=0.5\");\n}\n\nvoid populate_indel_header(VCFHeader& h) {\n\n  // FILTERs\n  h.addFilterField(\"LOWMAPQ\",        \"Assembly contig has less than MAPQ 10\");\n  h.addFilterField(\"SHORTALIGNMENT\", \"Matched (M) contig frag to left or right of indel < 20 bp\");\n  h.addFilterField(\"LOWLOD\",         \"LOD score is less than the cutoff\");\n  h.addFilterField(\"MULTIMATCH\",     \"Low MAPQ and this contig fragment maps well to multiple locations\");\n  h.addFilterField(\"LOWAS\",          \"Less than 80% of contig length is covered by a supporting read\");\n  h.addFilterField(\"NONVAR\",         \"0/0 is the most likely genotype\");\n  h.addFilterField(\"PASS\",           \"LOD score pass\");\n  h.addFilterField(\"VLOWAF\",         \"allelic fraction < 0.05\");\n  h.addFilterField(\"REPVAR\",         \"Multiple conflicting variants at a highly repetitive region\");\n\n  // INFOs\n  h.addInfoField(\"SCTG\",     \"1\", \"String\",  \"Identifier for the contig assembled by svaba to make the indel call\");\n  h.addInfoField(\"MAPQ\",     \"1\", \"Integer\", \"Mapping quality (BWA-MEM) of the assembled contig\");\n  h.addInfoField(\"SPAN\",     \"1\", \"Integer\", \"Size of the indel\");\n  h.addInfoField(\"REPSEQ\",   \"1\", \"String\",  \"Repeat sequence near the variant\");\n  h.addInfoField(\"NM\",       \"1\", \"Integer\", \"Number of mismatches of this alignment fragment to reference\");\n  h.addInfoField(\"READNAMES\",\".\", \"String\",  \"IDs of ALT reads\");\n  h.addInfoField(\"BX\",       \".\", \"String\",  \"Table of BX tag counts for supporting reads\");\n  h.addInfoField(\"DBSNP\",    \"0\", \"Flag\",    \"Variant found in dbSNP\");\n  h.addInfoField(\"LOD\",      \"1\", \"Float\",   \"Log of the odds that variant is real vs artifact\");\n\n  // SvABA2.0 (v3): VCF 4.5-aligned indel INFO fields.\n  h.addInfoField(\"SOMATIC\",  \"0\", \"Flag\",    \"Somatic indel per svaba's somatic LOD model\");\n  h.addInfoField(\"EVENT\",    \"1\", \"String\",  \"Stable indel identifier (populated from BreakPoint::id when available)\");\n  h.addInfoField(\"SVTYPE\",   \"1\", \"String\",  \"INS / DEL for indels emitted with explicit SVTYPE\");\n  h.addInfoField(\"SVLEN\",    \"1\", \"Integer\", \"Length of the indel (negative for deletions)\");\n  h.addInfoField(\"MAXLOD\",   \"1\", \"Float\",   \"Maximum per-sample log-odds (variant vs error) across samples\");\n  h.addInfoField(\"SOMLOD\",   \"1\", \"Float\",   \"Somatic log-odds (LLR of somatic vs non-somatic)\");\n\n  // FORMATs (indel)\n  h.addFormatField(\"GT\",   \"1\", \"String\",  \"Most likely genotype\");\n  h.addFormatField(\"AD\",   \"1\", \"Integer\", \"Allele depth: Number of reads supporting the variant\");\n  h.addFormatField(\"DP\",   \"1\", \"Integer\", \"Depth of coverage: Number of reads covering site.\");\n  h.addFormatField(\"GQ\",   \"1\", \"String\",  \"Genotype quality (currently not supported. Always 0)\");\n  h.addFormatField(\"PL\",   \".\", \"Float\",   \"Normalized likelihood of the current genotype\");\n  h.addFormatField(\"SR\",   \"1\", \"Integer\", \"Number of spanning reads for this variant\");\n  h.addFormatField(\"CR\",   \"1\", \"Integer\", \"Number of cigar-supported reads for this variant\");\n  h.addFormatField(\"LO\",   \"1\", \"Float\",   \"Log-odds that this variant is real vs artifact\");\n  h.addFormatField(\"LO_n\", \"1\", \"Float\",   \"Log-odds that this variant is AF=0 vs AF>=0.5\");\n}\n\n} // namespace\n\nVCFFile::VCFFile(std::string              file,\n                 std::string              id,\n                 const SvabaSharedConfig& sc,\n                 const VCFHeader&         vheader,\n                 bool                     nopass,\n                 bool                     m_verbose,\n                 bool                     skip_dedup_in_ctor) {\n\n  filename        = file;\n  analysis_id     = id;\n  verbose         = m_verbose;\n  include_nonpass = nopass;\n  skip_dedup      = skip_dedup_in_ctor;  // captured before ctor's deduplicate() runs\n\n  // Seed both headers from the caller-provided base (which carries contig\n  // and sample field lines), then layer on the SV- and indel-specific\n  // INFO/FILTER/FORMAT blocks.\n  sv_header    = vheader;\n  indel_header = vheader;\n  populate_sv_header(sv_header);\n  populate_indel_header(indel_header);\n\n  // Open the gzipped bps file stream.\n  igzstream infile(file.c_str(), std::ios::in);\n  if (!infile) {\n    std::cerr << \"Can't read file \" << file << \" for parsing VCF\\n\";\n    std::exit(EXIT_FAILURE);\n  }\n\n  std::cerr << \"...vcf - reading breakpoints: \" << file << '\\n';\n\n  // Per-contig cap: if more than VCF_SECONDARY_CAP pairs share the same\n  // cname, drop additional ones to avoid runaway output at pileups.\n  std::unordered_map<std::string, int> cname_count;\n\n  std::string line;\n  // Skip the first row — it's the column header emitted by BreakPoint::header().\n  std::getline(infile, line, '\\n');\n\n  int line_count = 0;\n  while (std::getline(infile, line, '\\n')) {\n\n    if (line.empty() || line[0] == '#')\n      continue;\n\n    // BreakPoint parser will fail if any chr is unknown. Skip defensively.\n    if (line.find(\"Unknown\") != std::string::npos)\n      continue;\n\n    // Parse one bps.txt.gz row into a heap BreakPoint. Must be shared_ptr\n    // because BreakPoint is non-copyable/non-movable.\n    std::shared_ptr<BreakPoint> bp;\n    try {\n      bp = std::make_shared<BreakPoint>(line, &sc);\n    } catch (const std::exception& e) {\n      std::cerr << \"Warning: failed to parse bps line: \" << e.what() << '\\n';\n      continue;\n    }\n\n    // Honor the unfiltered/filtered flag from the caller. Gate on\n    // `confidence` (the FILTER column string) rather than bp->pass —\n    // the parser doesn't repopulate the `pass` bool from the dump,\n    // and the scorer only updates `confidence`, so `confidence` is\n    // the single source of truth for \"did this record PASS\".\n    if (!include_nonpass && bp->confidence != \"PASS\")\n      continue;\n\n    // Per-contig cap: cap the number of entries per contig name.\n    if (++cname_count[bp->cname] >= VCF_SECONDARY_CAP)\n      continue;\n\n    auto vpair = std::make_shared<VCFEntryPair>(bp);\n\n    if (bp->svtype == SVType::INDEL)\n      indels.emplace(line_count, vpair);\n    else\n      entry_pairs.emplace(line_count, vpair);\n\n    ++line_count;\n  }\n\n  std::cerr << \"...vcf - read in \"\n            << SeqLib::AddCommas(indels.size())      << \" indels and \"\n            << SeqLib::AddCommas(entry_pairs.size()) << \" SVs\\n\";\n  std::cerr << \"...vcf - SV deduplicating \"\n            << SeqLib::AddCommas(entry_pairs.size()) << \" events\\n\";\n\n  deduplicate(sc.header);\n\n  std::cerr << \"...vcf - SV deduplicated down to \"\n            << SeqLib::AddCommas(entry_pairs.size() - dups.size())\n            << \" break pairs\\n\";\n}\n\n// ===========================================================================\n// Dedupe — SVs via paired-breakend interval-tree matching, indels via hash.\n// ===========================================================================\n\nnamespace {\n\n// Extension of GenomicRegion carrying the entry_pairs key and a pass flag.\nclass GenomicRegionWithID : public SeqLib::GenomicRegion {\n public:\n  GenomicRegionWithID(int32_t c, uint32_t p1, uint32_t p2, int i, int p)\n      : SeqLib::GenomicRegion(c, p1, p2), id(i), pass(p) {}\n  uint32_t id   : 30;\n  uint32_t pass : 2;\n};\n\n} // namespace\n\nvoid VCFFile::deduplicate(const SeqLib::BamHeader& header) {\n\n  // SvABA2.0: `svaba tovcf` receives a bps.txt.gz that has already been\n  // sorted + deduped by scripts/svaba_postprocess.sh (step 3). Rerunning\n  // the internal paired-interval-tree dedup on that input is wasted work\n  // and can introduce its own collisions via the high-overlap blacklist\n  // logic below. Short-circuit when the caller opts in.\n  if (skip_dedup) {\n    if (verbose)\n      std::cerr << \"...vcf - skip_dedup set, bypassing internal dedupe\\n\";\n    return;\n  }\n\n\n  // Build separate interval trees for left (b1) and right (b2) breakends.\n  SeqLib::GenomicRegionCollection<GenomicRegionWithID> grv1;\n  SeqLib::GenomicRegionCollection<GenomicRegionWithID> grv2;\n\n  for (const auto& kv : entry_pairs) {\n    const auto& bpp = kv.second->bp;\n    // Use the confidence string (not the stale bp->pass bool) to\n    // decide PASS status for the dedup grouping — see BreakPoint.cpp\n    // parser note: pass never gets repopulated from the dumped\n    // confidence column, so it's 0 across all parsed records.\n    const int bp_pass_int = (bpp->confidence == \"PASS\") ? 1 : 0;\n    grv1.add(GenomicRegionWithID(bpp->b1.gr.chr, bpp->b1.gr.pos1,\n                                 bpp->b1.gr.pos2, kv.first,\n                                 bp_pass_int));\n    grv2.add(GenomicRegionWithID(bpp->b2.gr.chr, bpp->b2.gr.pos1,\n                                 bpp->b2.gr.pos2, kv.first,\n                                 bp_pass_int));\n  }\n  grv1.CreateTreeMap();\n  grv2.CreateTreeMap();\n  assert(grv1.size() == grv2.size());\n\n  // Regions blacklisted mid-pass because they turned out to be SV pileups.\n  SeqLib::GenomicRegionCollection<SeqLib::GenomicRegion> high_overlap_blacklist;\n\n  size_t count = 0;\n\n  for (const auto& kv : entry_pairs) {\n    const int current_key = kv.first;\n    const auto& pair = kv.second;\n    const auto& bpp  = pair->bp;\n\n    // Tighter pad for small intrachrom events, looser for interchrom / large.\n    const int pad =\n        (bpp->b1.gr.chr != bpp->b2.gr.chr ||\n         std::abs(bpp->b1.gr.pos1 - bpp->b2.gr.pos1) > DEDUPEPAD * 2)\n            ? DEDUPEPAD\n            : 10;\n\n    if (verbose && (count % 20000 == 0))\n      std::cerr << \"...deduping at \" << SeqLib::AddCommas(count) << '\\n';\n    ++count;\n\n    // Blacklist check for either breakend.\n    SeqLib::GenomicIntervalVector bad1, bad2;\n    auto fb1 = high_overlap_blacklist.GetTree()->find(bpp->b1.gr.chr);\n    auto fb2 = high_overlap_blacklist.GetTree()->find(bpp->b2.gr.chr);\n    if (fb1 != high_overlap_blacklist.GetTree()->end()) {\n      fb1->second.findOverlapping(bpp->b1.gr.pos1 - pad,\n                                  bpp->b1.gr.pos1 + pad, bad1);\n      if (!bad1.empty()) { dups.insert(current_key); continue; }\n    }\n    if (fb2 != high_overlap_blacklist.GetTree()->end()) {\n      fb2->second.findOverlapping(bpp->b2.gr.pos1 - pad,\n                                  bpp->b2.gr.pos1 + pad, bad2);\n      if (!bad2.empty()) { dups.insert(current_key); continue; }\n    }\n\n    // Find all entries whose b1/b2 fall within pad of this one's b1/b2.\n    SeqLib::GenomicIntervalVector giv1, giv2;\n    auto ff1 = grv1.GetTree()->find(bpp->b1.gr.chr);\n    auto ff2 = grv2.GetTree()->find(bpp->b2.gr.chr);\n    assert(ff1 != grv1.GetTree()->end());\n    assert(ff2 != grv2.GetTree()->end());\n\n    ff1->second.findContained(bpp->b1.gr.pos1 - pad,\n                              bpp->b1.gr.pos1 + pad, giv1);\n    ff2->second.findContained(bpp->b2.gr.pos1 - pad,\n                              bpp->b2.gr.pos1 + pad, giv2);\n\n    // If this breakend is in a region hit by more than HIGH_OVERLAP_LIMIT\n    // other breakends, treat it as an SV pileup: blacklist the region and\n    // drop the current entry.\n    if (giv1.size() > HIGH_OVERLAP_LIMIT) {\n      SeqLib::GenomicRegion gr_bad = bpp->b1.gr;\n      std::cerr << \"...added \" << gr_bad << \" with \" << giv1.size()\n                << \" overlaps to SV-pileup blacklist at dedupe\\n\"\n                << \"NB: Any SV with one breakend occuring more than \"\n                << HIGH_OVERLAP_LIMIT\n                << \" times will be removed. To change this behavior, \"\n                << \"adjust HIGH_OVERLAP_LIMIT in vcf.cpp and recompile/run\\n\";\n      gr_bad.Pad(BAD_REGION_PAD);\n      high_overlap_blacklist.add(gr_bad);\n      high_overlap_blacklist.CreateTreeMap();\n      dups.insert(current_key);\n      continue;\n    }\n    if (giv2.size() > HIGH_OVERLAP_LIMIT) {\n      SeqLib::GenomicRegion gr_bad = bpp->b2.gr;\n      std::cerr << \"...added \" << gr_bad << \" with \" << giv2.size()\n                << \" overlaps to SV-pileup blacklist at dedupe\\n\";\n      gr_bad.Pad(BAD_REGION_PAD);\n      high_overlap_blacklist.add(gr_bad);\n      high_overlap_blacklist.CreateTreeMap();\n      dups.insert(current_key);\n      continue;\n    }\n\n    assert(giv1.size() <= HIGH_OVERLAP_LIMIT);\n    assert(giv2.size() <= HIGH_OVERLAP_LIMIT);\n\n    // A hit is a dup if the same entry_pairs key appears on BOTH sides, with\n    // matching strands and matching pass status. Source of truth for\n    // PASS is confidence == \"PASS\" (see note at top of deduplicate()).\n    const bool   is_pass  = (pair->e1.bp->confidence == \"PASS\");\n    const char   s1_here  = bpp->b1.gr.strand;\n    const char   s2_here  = bpp->b2.gr.strand;\n\n    std::unordered_map<int, std::pair<size_t, size_t>> key_count;\n\n    for (const auto& j : giv1) {\n      const auto& hit = grv1.at(j.value);\n      if (hit.id == current_key) continue;\n      if ((is_pass == static_cast<bool>(hit.pass)) &&\n          entry_pairs[hit.id]->bp->b1.gr.strand == s1_here)\n        ++key_count[hit.id].first;\n    }\n    for (const auto& j : giv2) {\n      const auto& hit = grv2.at(j.value);\n      if (hit.id == current_key) continue;\n      if ((is_pass == static_cast<bool>(hit.pass)) &&\n          entry_pairs[hit.id]->bp->b2.gr.strand == s2_here)\n        ++key_count[hit.id].second;\n    }\n\n    // If this entry has a \"twin\" with a worse (lower) score than ours, mark\n    // the twin — not ours — as a dup. Ties break by `operator<` on BreakPoint.\n    // Exception: TSI_LOCAL/TSI_GLOBAL annotate the same underlying event in\n    // two ways and should NOT dup each other.\n    for (const auto& kc : key_count) {\n      if (kc.second.first == 0 || kc.second.second == 0)\n        continue;\n\n      const auto& other = entry_pairs[kc.first];\n\n      if (*bpp < *other->bp) {\n        const bool local_global_pair =\n            (bpp->svtype          == SVType::TSI_LOCAL  &&\n             other->bp->svtype    == SVType::TSI_GLOBAL) ||\n            (bpp->svtype          == SVType::TSI_GLOBAL &&\n             other->bp->svtype    == SVType::TSI_LOCAL);\n        if (local_global_pair) {\n          // don't dup: intentional double-annotation\n        } else {\n          dups.insert(kc.first);\n        }\n      }\n    }\n  }\n\n  // --- Indel dedupe: cheap hash on (chr, pos, REF, ALT). ---\n  if (verbose)\n    std::cerr << \"...vcf - hashing \" << SeqLib::AddCommas(indels.size())\n              << \" indels for dedupe\\n\";\n\n  std::unordered_set<std::string> seen;\n  VCFEntryPairMap deduped_indels;\n  deduped_indels.reserve(indels.size());\n\n  for (const auto& kv : indels) {\n    std::string key;\n    try {\n      const auto& b1 = kv.second->e1.bp->b1;\n      key = std::to_string(b1.gr.chr) + ':' +\n            std::to_string(b1.gr.pos1) + '_' +\n            kv.second->e1.getRefString() + '_' +\n            kv.second->e1.getAltString(header);\n    } catch (...) {\n      std::cerr << \"indel dedupe: error building hash key for entry \"\n                << kv.first << '\\n';\n      continue;\n    }\n    if (seen.insert(key).second)\n      deduped_indels.emplace(kv.first, kv.second);\n  }\n  indels = std::move(deduped_indels);\n}\n\n// ===========================================================================\n// Writers\n// ===========================================================================\n\nvoid VCFFile::writeIndels(std::string              basename,\n                          bool                     /*zip*/,\n                          bool                     /*onefile*/,\n                          const SeqLib::BamHeader& header) const {\n\n  // The legacy writer emitted a single combined indel VCF regardless of\n  // zip/onefile flags; we preserve that behavior to avoid surprising\n  // downstream consumers.\n  const std::string out_name = basename + \"germline.indel.vcf\";\n\n  std::ofstream out(out_name);\n  if (!out) {\n    std::cerr << \"vcf: failed to open \" << out_name << \" for writing\\n\";\n    return;\n  }\n\n  out << indel_header << '\\n';\n\n  // Collect e1 of every indel pair into a vector, sort by genomic position.\n  VCFEntryVec rows;\n  rows.reserve(indels.size());\n  for (const auto& kv : indels)\n    rows.push_back(kv.second->e1);\n\n  std::sort(rows.begin(), rows.end());\n\n  for (const auto& r : rows) {\n    // PASS/FILTER gate: use the confidence string as source of truth\n    // (bp->pass is a stale bool; see parser note in BreakPoint.cpp).\n    if (r.bp->confidence != \"PASS\" && !include_nonpass)\n      continue;\n    out << r.toFileString(header) << '\\n';\n  }\n}\n\nvoid VCFFile::writeSVs(std::string              basename,\n                       bool                     /*zip*/,\n                       bool                     /*onefile*/,\n                       const SeqLib::BamHeader& header) const {\n\n  const std::string out_name = basename + \"germline.sv.vcf\";\n\n  std::ofstream out(out_name);\n  if (!out) {\n    std::cerr << \"vcf: failed to open \" << out_name << \" for writing\\n\";\n    return;\n  }\n\n  out << sv_header << '\\n';\n\n  // Pull both breakends of each surviving pair into a flat vector, sort,\n  // then emit. Skip entries marked as dups during dedupe.\n  VCFEntryVec rows;\n  rows.reserve(entry_pairs.size() * 2);\n  for (const auto& kv : entry_pairs) {\n    if (dups.count(kv.first)) continue;\n    rows.push_back(kv.second->e1);\n    rows.push_back(kv.second->e2);\n  }\n\n  std::sort(rows.begin(), rows.end());\n\n  for (const auto& r : rows) {\n    // PASS/FILTER gate: use the confidence string as source of truth\n    // (bp->pass is a stale bool; see parser note in BreakPoint.cpp).\n    if (r.bp->confidence != \"PASS\" && !include_nonpass)\n      continue;\n    out << r.toFileString(header) << '\\n';\n  }\n}\n\n// ===========================================================================\n// SvABA2.0: symbolic-allele classifier + single-file writers (tovcf path).\n// ===========================================================================\n\nnamespace {\n\n// Classify a BreakPoint pair to decide whether it can be emitted as a\n// single symbolic-allele record (<DEL>/<DUP>/<INV>) instead of two paired\n// BND records. Conservative:\n//   - both breakends must live on the same chromosome\n//   - INDEL records keep their existing REF/ALT shape (not this path)\n//   - strand pattern determines the symbolic kind:\n//       +/+  or  -/-  -> <DEL>\n//       -/+            -> <DUP>\n//       +/-            -> <INV>\n//   - anything ambiguous / inter-chrom falls through to BND.\n// Returns empty string when the pair should stay as paired BND.\nstd::string classify_symbolic_kind(const BreakPoint& bp) {\n  if (bp.svtype == SVType::INDEL)        return \"\";\n  if (bp.b1.gr.chr != bp.b2.gr.chr)      return \"\";\n  const char s1 = bp.b1.gr.strand;\n  const char s2 = bp.b2.gr.strand;\n  if (s1 == '+' && s2 == '+')            return \"DEL\";\n  if (s1 == '-' && s2 == '-')            return \"DEL\";\n  if (s1 == '-' && s2 == '+')            return \"DUP\";\n  if (s1 == '+' && s2 == '-')            return \"INV\";\n  return \"\";\n}\n\n// Sort key used by the single-file writers: for a BND entry use its\n// represented breakend; for a symbolic entry use the lower of the two\n// endpoints (matching VCF convention for the POS of a symbolic SV).\nbool entry_lt_for_output(const VCFEntry& a, const VCFEntry& b) {\n  const BreakEnd* ba = a.symbolic_rep\n      ? (a.bp->b1.gr.pos1 < a.bp->b2.gr.pos1 ? &a.bp->b1 : &a.bp->b2)\n      : (a.id_num == 1 ? &a.bp->b1 : &a.bp->b2);\n  const BreakEnd* bb = b.symbolic_rep\n      ? (b.bp->b1.gr.pos1 < b.bp->b2.gr.pos1 ? &b.bp->b1 : &b.bp->b2)\n      : (b.id_num == 1 ? &b.bp->b1 : &b.bp->b2);\n  return ba->gr < bb->gr;\n}\n\n// Open path for writing (gzipped or plain). Returns empty unique_ptr on\n// failure, with the error already logged to stderr.\nstd::unique_ptr<std::ostream> open_vcf_out(const std::string& path, bool gzip) {\n  if (gzip) {\n    auto g = std::make_unique<ogzstream>(path.c_str(), std::ios::out);\n    if (!g->good()) {\n      std::cerr << \"vcf: failed to open \" << path << \" for writing\\n\";\n      return {};\n    }\n    return g;\n  }\n  auto f = std::make_unique<std::ofstream>(path);\n  if (!f->good()) {\n    std::cerr << \"vcf: failed to open \" << path << \" for writing\\n\";\n    return {};\n  }\n  return f;\n}\n\n} // namespace\n\nvoid VCFFile::writeSvsSingleFile(const std::string&       path,\n                                 bool                     gzip,\n                                 const SeqLib::BamHeader& header) const {\n\n  auto out_owner = open_vcf_out(path, gzip);\n  if (!out_owner) return;\n  std::ostream& out = *out_owner;\n\n  out << sv_header << '\\n';\n\n  // Build the emit list. For each pair:\n  //   - skip dups (if dedup ran)\n  //   - classify symbolic eligibility when sv_format == SYMBOLIC_WHEN_OBVIOUS\n  //   - emit one e1 (symbolic) or two (BND) entries into rows\n  VCFEntryVec rows;\n  rows.reserve(entry_pairs.size() * 2);\n  for (const auto& kv : entry_pairs) {\n    if (dups.count(kv.first)) continue;\n\n    VCFEntryPair pair_copy = *kv.second;  // shallow copy to stamp symbolic_rep\n    if (sv_format == SvFormat::SYMBOLIC_WHEN_OBVIOUS) {\n      const std::string kind = classify_symbolic_kind(*pair_copy.bp);\n      if (!kind.empty()) {\n        pair_copy.e1.symbolic_rep  = true;\n        pair_copy.e1.symbolic_kind = kind;\n        rows.push_back(pair_copy.e1);\n        continue;\n      }\n    }\n    rows.push_back(pair_copy.e1);\n    rows.push_back(pair_copy.e2);\n  }\n\n  std::sort(rows.begin(), rows.end(), entry_lt_for_output);\n\n  for (auto& r : rows) {\n    // PASS/FILTER gate: use the confidence string as source of truth\n    // (bp->pass is a stale bool; see parser note in BreakPoint.cpp).\n    if (r.bp->confidence != \"PASS\" && !include_nonpass)\n      continue;\n    // Stamp the per-entry somlod threshold so fillInfoFields applies\n    // the right cutoff to the SOMATIC flag.\n    r.somatic_threshold = somatic_threshold;\n    out << r.toFileString(header, qual_mode) << '\\n';\n  }\n}\n\nvoid VCFFile::writeIndelsSingleFile(const std::string&       path,\n                                    bool                     gzip,\n                                    const SeqLib::BamHeader& header) const {\n\n  auto out_owner = open_vcf_out(path, gzip);\n  if (!out_owner) return;\n  std::ostream& out = *out_owner;\n\n  out << indel_header << '\\n';\n\n  // Indels are always a single REF/ALT record per event (no BND pair),\n  // so this is simpler than the SV path: collect e1 of every indel,\n  // sort, emit.\n  VCFEntryVec rows;\n  rows.reserve(indels.size());\n  for (const auto& kv : indels)\n    rows.push_back(kv.second->e1);\n\n  std::sort(rows.begin(), rows.end());\n\n  for (auto& r : rows) {\n    // PASS/FILTER gate: use the confidence string as source of truth\n    // (bp->pass is a stale bool; see parser note in BreakPoint.cpp).\n    if (r.bp->confidence != \"PASS\" && !include_nonpass)\n      continue;\n    r.somatic_threshold = somatic_threshold;\n    out << r.toFileString(header, qual_mode) << '\\n';\n  }\n}\n"
  },
  {
    "path": "src/svaba/vcf.h",
    "content": "#pragma once\n\n// vcf.h\n//\n// Read a svaba `bps.txt.gz` file back in, dedupe the breakpoint pairs,\n// and write out somatic/germline SV and indel VCFs.\n//\n// Design notes:\n// * `BreakPoint` is non-copyable and non-movable (see BreakPoint.h), so we\n//   store every breakpoint as a `std::shared_ptr<BreakPoint>` — both the\n//   `VCFEntry` views and the `VCFEntryPair` aggregate share ownership of\n//   the same underlying object.\n// * `BreakPoint::SampleInfo` is a private nested type. vcf.cpp therefore\n//   iterates `bp->allele` with `auto` and never names the type directly.\n// * The bps.txt.gz file is read one line at a time (memory-efficient); only\n//   parsed records that survive the per-contig secondary cap are retained\n//   in memory.\n// * The external API exposed to `run_svaba.cpp` is preserved verbatim:\n//   `VCFFile(file, id, sc, header, nopass, verbose)` +\n//   `writeIndels / writeSVs(basename, zip, onefile, bam_header)` +\n//   `include_nonpass`.\n\n#include <cstdint>\n#include <memory>\n#include <ostream>\n#include <string>\n#include <unordered_map>\n#include <unordered_set>\n#include <vector>\n\n#include \"SeqLib/BamHeader.h\"\n#include \"SeqLib/GenomicRegion.h\"\n\n#include \"BreakPoint.h\"\n#include \"SvabaSharedConfig.h\"\n\n// ---------------------------------------------------------------------------\n// Header-field dictionaries.\n// ---------------------------------------------------------------------------\nusing InfoMap        = std::unordered_map<std::string, std::string>;\nusing FilterMap      = std::unordered_map<std::string, std::string>;\nusing FormatMap      = std::unordered_map<std::string, std::string>;\nusing SampleMap      = std::unordered_map<std::string, std::string>;\nusing ContigFieldMap = std::unordered_map<std::string, std::string>;\n\n// ---------------------------------------------------------------------------\n// Knobs for the `svaba tovcf` subcommand.\n// ---------------------------------------------------------------------------\n//\n// QualMode — what to put in the VCF QUAL column.\n//   SUM_LO_PHRED (legacy): -10 log10 P(all alt reads are errors), taken from\n//                          BreakPoint::quality (col 34 of bps.txt). Keeps\n//                          behavior compatible with `svaba run` / refilter.\n//   MAXLOD_PHRED:          round(10 * bp->max_lod), cap 99. One-to-one with\n//                          INFO/MAXLOD, meaningful as a VCF QUAL field.\n//   MISSING:               emit '.' (VCF spec-valid missing value). Forces\n//                          users to look at FILTER / INFO for confidence,\n//                          which is usually what you want when somlod and\n//                          maxlod are the canonical scores.\nenum class QualMode { SUM_LO_PHRED, MAXLOD_PHRED, MISSING };\n\n// SvFormat — how to serialize an SV call.\n//   BND_ALWAYS (legacy):          every SV emits as two paired BND records\n//                                 with mate-bracket ALT notation. Matches\n//                                 the current `svaba run` output exactly.\n//   SYMBOLIC_WHEN_OBVIOUS:        intrachromosomal events with unambiguous\n//                                 orientation emit as a single symbolic\n//                                 record (<DEL> / <DUP> / <INV>). Inter-\n//                                 chromosomal and complex events stay BND.\n//                                 Nicer for IGV / samplot / bcftools\n//                                 pipelines that render symbolic alleles\n//                                 natively.\nenum class SvFormat { BND_ALWAYS, SYMBOLIC_WHEN_OBVIOUS };\n\n// ---------------------------------------------------------------------------\n// VCFHeader — the ##-lines that precede a VCF body.\n// ---------------------------------------------------------------------------\nstruct VCFHeader {\n\n  VCFHeader()  = default;\n  ~VCFHeader() = default;\n\n  // VCF spec version this header declares. Defaulted to 4.5 (the most\n  // recent formal spec as of 2024) — backwards-compatible at the record\n  // level with anything accepting 4.2+, and enables the clean symbolic-\n  // SV / EVENT / SVCLAIM idioms the tovcf path uses.\n  std::string fileformat = \"VCFv4.5\";\n  std::string filedate;\n  std::string source;\n  std::string reference = \"hg19\";\n  std::string colnames  = \"#CHROM\\tPOS\\tID\\tREF\\tALT\\tQUAL\\tFILTER\\tINFO\\tFORMAT\";\n\n  InfoMap        infomap;\n  FilterMap      filtermap;\n  FormatMap      formatmap;\n  SampleMap      samplemap;\n  ContigFieldMap contigfieldmap;\n\n  friend std::ostream& operator<<(std::ostream& out, const VCFHeader& v);\n\n  void addInfoField  (std::string field, std::string number,\n                      std::string type,  std::string description);\n  void addFilterField(std::string field, std::string description);\n  void addFormatField(std::string field, std::string number,\n                      std::string type,  std::string description);\n  void addSampleField(std::string field);\n  void addContigField(std::string id, int len);\n};\n\n// ---------------------------------------------------------------------------\n// VCFEntry — a single breakend row (one side of a BreakPoint, or an indel).\n// ---------------------------------------------------------------------------\nstruct VCFEntry {\n\n  VCFEntry()  = default;\n  ~VCFEntry() = default;\n\n  // Shared ownership with the owning VCFEntryPair.\n  std::shared_ptr<BreakPoint> bp;\n\n  // Unique id across all VCFEntryPairs in a VCFFile. `id_num` is 1 for\n  // the left breakend (b1) and 2 for the right (b2); indels always use 1.\n  uint32_t id      = 0;\n  uint8_t  id_num  = 0;\n\n  // Set by VCFFile::writeSvsSingleFile when the SvFormat::\n  // SYMBOLIC_WHEN_OBVIOUS mode decides this pair should be emitted as\n  // a single `<DEL>`/`<DUP>`/`<INV>` record instead of two paired BND\n  // records. When true, only the e1 entry of the pair gets serialized\n  // (the caller skips e2 for that pair). Kind is stashed here so\n  // getAltString / fillInfoFields can key off it without reclassifying.\n  bool        symbolic_rep  = false;\n  std::string symbolic_kind;  // \"DEL\" / \"DUP\" / \"INV\" when symbolic_rep is true\n\n  // Somlod cutoff for stamping the INFO/SOMATIC flag. A record gets the\n  // flag iff bp->LO_s >= somatic_threshold AND bp->somatic != FAILED.\n  // Writers set this per-entry from VCFFile::somatic_threshold before\n  // calling toFileString(); default 1.0 matches the tovcf default.\n  double      somatic_threshold = 1.0;\n\n  std::string getRefString() const;\n  std::string getAltString(const SeqLib::BamHeader& header) const;\n  std::string getIdString () const;\n\n  // Build the full INFO map (keys → values) for this entry.\n  // `somatic_flag` = true adds `SOMATIC` (a flag INFO field).\n  std::unordered_map<std::string, std::string> fillInfoFields() const;\n\n  // Serialize the entry as one VCF body line (no trailing newline).\n  //   qual_mode   — what goes in the QUAL column (see QualMode).\n  //   NB: the symbolic/BND choice is read off this->symbolic_rep,\n  //       which the writer sets before calling.\n  std::string toFileString(const SeqLib::BamHeader& header,\n                           QualMode qual_mode = QualMode::SUM_LO_PHRED) const;\n\n  // Sort primarily by genomic position of the represented breakend.\n  bool operator< (const VCFEntry& v) const;\n  bool operator==(const VCFEntry& v) const;\n};\n\nusing VCFEntryVec = std::vector<VCFEntry>;\n\n// ---------------------------------------------------------------------------\n// VCFEntryPair — holds both sides (e1, e2) of a rearrangement, plus the\n// shared BreakPoint they are built from. Indels still use a pair but only\n// populate e1 as a real record.\n// ---------------------------------------------------------------------------\nstruct VCFEntryPair {\n\n  VCFEntryPair() = default;\n  ~VCFEntryPair() = default;\n\n  // Build both sides from a shared BreakPoint. Assigns a collision-avoided\n  // hash id to e1.id / e2.id.\n  explicit VCFEntryPair(std::shared_ptr<BreakPoint>& b);\n\n  VCFEntry                    e1, e2;\n  std::shared_ptr<BreakPoint> bp;\n\n  std::string toFileString(const SeqLib::BamHeader& header,\n                           QualMode qual_mode = QualMode::SUM_LO_PHRED) const;\n};\n\nusing VCFEntryPairMap = std::unordered_map<int, std::shared_ptr<VCFEntryPair>>;\n\n// ---------------------------------------------------------------------------\n// VCFFile — the top-level object, owning all entry pairs and the two headers.\n// ---------------------------------------------------------------------------\nstruct VCFFile {\n\n  VCFFile()  = default;\n  ~VCFFile() = default;\n\n  // Read a svaba bps.txt.gz file, parse line-by-line into BreakPoints,\n  // build VCFEntryPairs, and deduplicate. `nopass` controls whether\n  // initially non-PASS records are retained (they can still be filtered\n  // later by writeIndels/writeSVs via `include_nonpass`).\n  //\n  // `skip_dedup_in_ctor` = true has the ctor set `this->skip_dedup`\n  // BEFORE the internal `deduplicate()` call fires, so no dedup runs\n  // on input that was already deduped upstream (the `svaba tovcf` path).\n  // Default false keeps backward-compat with run_svaba and refilter.\n  VCFFile(std::string              file,\n          std::string              id,\n          const SvabaSharedConfig& sc,\n          const VCFHeader&         vheader,\n          bool                     nopass,\n          bool                     verbose,\n          bool                     skip_dedup_in_ctor = false);\n\n  std::string filename;\n  std::string analysis_id;\n\n  bool verbose         = false;\n  bool include_nonpass = false;\n\n  // SvABA2.0 tovcf-path knobs. All default to legacy-compatible values so\n  // run_svaba.cpp and refilter.cpp pick up no behavior change. The `svaba\n  // tovcf` entry point flips them to the new defaults (MISSING qual,\n  // SYMBOLIC_WHEN_OBVIOUS sv format, skip_dedup=true).\n  bool     skip_dedup = false;  // deduplicate() returns immediately when set\n  QualMode qual_mode  = QualMode::SUM_LO_PHRED;\n  SvFormat sv_format  = SvFormat::BND_ALWAYS;\n\n  // Minimum somlod (LO_s) to mark a record with the INFO/SOMATIC flag.\n  // Writers stamp this onto each VCFEntry before emission. Default 1.0\n  // is the recommended somatic-call gate; lower it to be permissive,\n  // raise it to be stricter.\n  double   somatic_threshold = 1.0;\n\n  VCFHeader indel_header;\n  VCFHeader sv_header;\n\n  VCFEntryPairMap entry_pairs; // SVs\n  VCFEntryPairMap indels;      // indels\n  std::unordered_set<int> dups; // keys in entry_pairs marked as duplicates\n\n  // Dedupe SVs via paired breakend interval-tree matching; dedupe indels\n  // via (chr,pos,ref,alt) hash set.\n  void deduplicate(const SeqLib::BamHeader& header);\n\n  // Write the body VCFs to disk. `zip` is currently ignored (always writes\n  // plain .vcf); `onefile` merges somatic/germline into one emission.\n  void writeIndels(std::string              basename,\n                   bool                     zip,\n                   bool                     onefile,\n                   const SeqLib::BamHeader& header) const;\n\n  void writeSVs(std::string              basename,\n                bool                     zip,\n                bool                     onefile,\n                const SeqLib::BamHeader& header) const;\n\n  // SvABA2.0: single-file writers used by `svaba tovcf`. Unlike\n  // writeSVs / writeIndels above, these write EVERY record (somatic and\n  // germline together) to one path, with the SOMATIC INFO flag set on\n  // somatic rows for downstream filtering. Honors sv_format, qual_mode,\n  // and include_nonpass set on the VCFFile. `gzip=true` uses ogzstream;\n  // otherwise a plain ofstream is used.\n  void writeSvsSingleFile   (const std::string&       path,\n                             bool                     gzip,\n                             const SeqLib::BamHeader& header) const;\n  void writeIndelsSingleFile(const std::string&       path,\n                             bool                     gzip,\n                             const SeqLib::BamHeader& header) const;\n};\n"
  },
  {
    "path": "src/svabautils/AssemblyBamWalker.cpp",
    "content": "#include \"AssemblyBamWalker.h\"\n#include \"SeqLib/UnalignedSequence.h\"\n#include \"SeqLib/ReadFilter.h\"\n\n#include <chrono>\n#include <thread>\n\n#include \"SnowmanUtils.h\"\n#include \"run_snowman.h\"\n#include <fstream>\n\n//#define QNAME \"5427150\"\n#define MIN_ISIZE_FOR_DISC 700\n\n//static std::vector<ContigElement*> contig_elems;\nstatic int num_to_run;\nstatic pthread_mutex_t snow_lock;\nstatic ogzstream all_align, os_allbps;\n//static std::ofstream all_align, os_allbps;\nstatic std::string tt, nn; // so hacky\nstatic std::shared_ptr<hts_idx_t> ttindex, nnindex;\nstatic faidx_t* f;\nstatic std::set<std::string> prefixes;\n\nstatic SeqLib::Filter::ReadFilterCollection * mr;\n\n//static ofstream os_allbps;\nstatic struct timespec start;\n\nstatic SeqLib::RefGenome * ref_genomeAW, * ref_genome_viral_dummy;\n\nbool __good_contig(const SeqLib::BamRecordVector& brv, const SeqLib::GenomicRegionVector& regions, int max_len, int max_mapq) {\n  // NO INDELS\n  /*  return (brv.size() && regions.size() && brv.size() < 20  && (brv.size() > 1) && \n\t  brv[0].Length() < 20000 && brv[0].CigarSize() < 50 &&\n\t  max_len > 250 && max_mapq >= 0);\n  */\n  \n  // all hard clip?\n  size_t hc = 0;\n  for (auto& i : brv)\n    if (i.NumHardClip())\n      ++hc;\n  \n  return (brv.size() && hc != brv.size() && regions.size() && brv.size() < 20  && (brv.size() > 1 || brv[0].CigarSize() > 1) && \n\t  brv[0].Length() < 20000 && brv[0].CigarSize() < 20 &&\n\t  max_len > 101 && max_mapq >= 0);\n}\n\n//bool runAC(SeqLib::BamRecordVector& brv, faidx_t * f, std::shared_ptr<hts_idx_t> pt, std::shared_ptr<hts_idx_t> pn,\n//\t   const std::string& t, const std::string& n, const SeqLib::GenomicRegionVector& regions) {\nbool runAC(const ContigElement * c) {\n  \n  SeqLib::GRC trimmed_regions;\n  for (auto& r : c->regions)\n    if (r.chr < 24)\n      trimmed_regions.add(r);\n\n  if (!trimmed_regions.size())\n    return true;\n\n  SnowmanBamWalker twalk, nwalk;\n  \n  if (!tt.empty()) {\n    twalk = SnowmanBamWalker(tt);\n    twalk.prefix = \"t000\";\n    twalk.max_cov = 200;\n    twalk.get_mate_regions = false;\n    twalk.SetPreloadedIndex(ttindex);\n    twalk.SetMultipleRegions(trimmed_regions);\n    twalk.readBam();\n  }\n  if (!nn.empty()) {\n    nwalk = SnowmanBamWalker(nn);\n    nwalk.prefix = \"n000\";\n    nwalk.max_cov = 200;\n    nwalk.get_mate_regions = false;\n    nwalk.SetPreloadedIndex(nnindex);\n    nwalk.SetMultipleRegions(trimmed_regions);\n    nwalk.readBam();\n  }\n  SeqLib::BamRecordVector bav_this;\n  for (auto& q : twalk.reads)\n    bav_this.push_back(q);\n  for (auto& q : nwalk.reads)\n    bav_this.push_back(q);\n\n  // cluster the reads\n  // set region to empty, just won't double-check that cluster overlaps regino. No big deal\n  DiscordantClusterMap dmap = DiscordantCluster::clusterReads(bav_this, SeqLib::GenomicRegion(), 37, nullptr);\n\n  std::vector<AlignedContig> this_alc;\n\n  // contruct the index\n  SeqLib::UnalignedSequenceVector usv;\n  assert(c->brv[0].Qname().length());\n  assert(c->brv[0].Sequence().find(\"N\") == std::string::npos);\n  \n  // here we have to flip if it has (-) alignment to reference.\n  // this is because the pipeline assumes it came from a \n  // de novo assembly, which is PRE alignment. Thus, we don't want \n  // to take the i.Sequeunce directly, as this has been reverse-complemented\n  // BY THE ALIGNER.\n  std::string sss = c->brv[0].Sequence();\n  if (c->brv[0].ReverseFlag())\n    SeqLib::rcomplement(sss);\n  usv.push_back({c->brv[0].Qname(), sss, std::string()});\n  \n  SeqLib::BWAWrapper bw;\n  bw.constructIndex(usv);\n  \n  if (!prefixes.size()) {\n    prefixes.insert(\"t000\"); \n    prefixes.insert(\"n000\");\n  }\n\n  this_alc.push_back(AlignedContig(c->brv, prefixes));\n  AlignedContig * ac = &this_alc.back();\n  for (auto& kk : ac->m_frag_v)\n    kk.m_max_indel = 20;\n\n  // align the reads\n  alignReadsToContigs(bw, usv, bav_this, this_alc, ref_genomeAW);\n  ac->assignSupportCoverage(); // dummies\n  ac->splitCoverage(); \n  \n  ac->addDiscordantCluster(dmap);\n\n  // get teh coverages\n  std::unordered_map<std::string, STCoverage*> covs;\n  std::unordered_map<std::string, STCoverage*> clip_covs;\n  covs[\"t000\"] = &twalk.cov;\n  covs[\"n000\"] = &nwalk.cov;\n  clip_covs[\"t000\"] = &twalk.cov;\n  clip_covs[\"n000\"] = &nwalk.cov;\n  \n  std::vector<BreakPoint> allbreaks = ac->getAllBreakPoints(false); // false says dont worry about \"local\"\n  for (auto& i : allbreaks)\n    i.repeatFilter();\n  for (auto& i : allbreaks)\n    i.addCovs(covs, clip_covs);\n  for (auto& i : allbreaks)\n    i.scoreBreakpoint(8, 2.5, 7, 3, 0);\n  for (auto& i : allbreaks)\n    i.setRefAlt(ref_genomeAW, ref_genome_viral_dummy);\n\n  double region_width = 0;\n  for (auto& i : trimmed_regions)\n    region_width += i.width();\n  double cov = (double)bav_this.size() / region_width * 250;\n\n  // print message\n  if (cov > 100 || num_to_run % 1000 == 0) {\n    std::stringstream ss;\n#ifndef __APPLE__\n    ss << SeqLib::displayRuntime(start);\n#endif\n    std::cerr << \"..read \" << SeqLib::AddCommas(bav_this.size()) << \" reads from \" << \n      trimmed_regions.size() << \" region starting at \" << trimmed_regions.at(0) << \" Queue-left \" << \n      SeqLib::AddCommas(num_to_run) << \" \" << ss.str() << std::endl;\n  }\n\n  std::stringstream outr;\n  bool no_reads = true;\n  for (auto& i : allbreaks)\n    outr << i.toFileString(no_reads) << std::endl;\n\n  // MUTEX LOCKED\n  ////////////////////////////////////\n  pthread_mutex_lock(&snow_lock);  \n  --num_to_run;\n  //all_align << (*ac) << std::endl;\n  os_allbps << outr.str();\n  ////////////////////////////////////\n  // MUTEX UNLOCKED\n  ////////////////////////////////////\n  pthread_mutex_unlock(&snow_lock);\n\n  return true;\n\n}\n\n\nvoid AssemblyBamWalker::walkDiscovar()\n{\n\n  //std::string rules = \"global@!hardclip;!duplicate;!qcfail;phred[4,100];length[25,1000]%region@WG%!isize[0,1200];mapq[0,1000]%clip[5,1000]%ins[1,1000];mapq[0,100]%del[1,1000];mapq[1,1000]%mapped;!mate_mapped;mapq[1,1000]%mate_mapped;!mapped\";\n  std::string rules = \"{\\\"global\\\" : {\\\"duplicate\\\" : false, \\\"qcfail\\\" : false}, \\\"\\\" : { \\\"rules\\\" : [{\\\"isize\\\" : [MINS,0]},{\\\"rr\\\" : true},{\\\"ff\\\" : true}, {\\\"rf\\\" : true}, {\\\"ic\\\" : true}, {\\\"clip\\\" : 5, \\\"phred\\\" : 4}, {\\\"ins\\\" : true}, {\\\"del\\\" : true}, {\\\"mapped\\\": true , \\\"mate_mapped\\\" : false}, {\\\"mate_mapped\\\" : true, \\\"mapped\\\" : false}]}}\";\n\n  rules.replace(rules.find(\"MINS\"), 4, std::to_string(MIN_ISIZE_FOR_DISC));\n\n  mr = new SeqLib::Filter::ReadFilterCollection(rules, SeqLib::BamHeader());\n\n  f = findex;\n  tt = tbam;\n  nn = nbam;\n  nnindex = nindex;\n  ttindex = tindex;\n\n  SnowmanUtils::fopen(id + \".alignments.txt.gz\", all_align);\n  SnowmanUtils::fopen(id + \".bps.txt.gz\", os_allbps);\n  os_allbps << BreakPoint::header() << std::endl;\n\n  SeqLib::BamRecord r;\n  std::cerr << \"...starting to walk assembly BAM\" << std::endl;\n\n  std::vector<AlignedContig> ac_vec;\n  \n  std::unordered_map<std::string, SeqLib::BamRecordVector> map;\n\n  SeqLib::BamRecordVector brv;\n\n  SeqLib::GenomicRegionVector regions;\n\n  // start the timer\n#ifndef __APPLE__\n  clock_gettime(CLOCK_MONOTONIC, &start);\n#endif\n\n  // open the mutex\n  if (pthread_mutex_init(&snow_lock, NULL) != 0) {\n      printf(\"\\n mutex init failed\\n\");\n      return;\n  }\n\n  // Create the queue and consumer (worker) threads\n  wqueue<AssemblyWalkerWorkItem*>  queue;\n  std::vector<ConsumerThread<AssemblyWalkerWorkItem>*> threadqueue;\n  for (int i = 0; i < numThreads; i++) {\n    ConsumerThread<AssemblyWalkerWorkItem>* threadr = new ConsumerThread<AssemblyWalkerWorkItem>(queue, true);\n    threadr->start();\n    threadqueue.push_back(threadr);\n  }\n  \n  int count = 0, acc_count = 0;\n  std::string curr_name;\n\n  std::vector<AssemblyWalkerWorkItem*> tmp_queue;\n\n  // open ref genome for extracting sequences\n  ref_genomeAW = new SeqLib::RefGenome(refGenome);\n  \n  int max_mapq = 0, max_len = 0;\n  while(GetNextRecord(r)) {\n\n    if (++count % 200000 == 0) \n      std::cerr << \"...checking contig \" << SeqLib::AddCommas(count) << \" to see if we should parse\" << std::endl;\n\n    // give each contig a unique prefix\n    //r.SetQname(\"contig_\" + r.Qname());\n\n    // first one\n    if (curr_name.empty())\n      curr_name = r.Qname();\n\n    // add the MC tag\n    if (r.ChrID() < br->n_targets && r.ChrID() >= 0) {\n      r.AddZTag(\"MC\", std::string(br->target_name[r.ChrID()]));\n    }\n    else \n      continue;\n\n    // add to existing\n    if (curr_name == r.Qname()) {\n\n      SeqLib::GenomicRegion gr = r.asGenomicRegion();\n      gr.Pad(100);\n      regions.push_back(gr);\n      brv.push_back(r);\n      max_mapq = std::max(r.MapQuality(), max_mapq);\n      max_len = std::max(r.Length(), max_len);\n      \n    } else {\n\n#ifdef QNAME      \n      if (brv.size())\n\tif (brv[0].Qname() == QNAME || true) {\n\t  std::cerr << \" found it here -- checking \" << std::endl;\n\t  std::cerr << \" brv.size() \" << brv.size() << \" regions.size() \" << regions.size() << \" brv.CigarSize() \" << brv[0].CigarSize() << \n\t    \" brv.Length() \" << brv[0].Length() << \" max_len \" << max_len << \" max_mapq \" << max_mapq << std::endl;\n\t}\n#endif\n\n      if (true || __good_contig(brv, regions, max_len, max_mapq)) { \n\n\t++acc_count;\n\t//AssemblyWalkerWorkItem * item = new AssemblyWalkerWorkItem(brv, findex, tindex, nindex, regions, tbam, nbam);\n\tAssemblyWalkerWorkItem * item = new AssemblyWalkerWorkItem(new ContigElement(brv, regions)); \n\t\n#ifdef QNAME      \n\tif (brv[0].Qname() == QNAME)\n\t  std::cerr << \" found it here -- adding \" << std::endl;\n#endif\n\n\ttmp_queue.push_back(item);\n\tregions.clear();\n      }\n\n      // prepare the next one\n      brv.clear();\n      brv.push_back(r);\n      curr_name = r.Qname();\n      regions.clear();\n      SeqLib::GenomicRegion gr = r.asGenomicRegion();\n      gr.Pad(1000);\n      regions.push_back(gr);\n      max_mapq = r.MapQuality();\n      max_len  = r.Length();\n    }\n  }\n\n\n  // add the last one\n  if (__good_contig(brv, regions, max_len, max_mapq)) {\n    AssemblyWalkerWorkItem * item = new AssemblyWalkerWorkItem(new ContigElement(brv, regions)); \n    tmp_queue.push_back(item);\n  }\n\n  std::cerr << \"...done adding \" << SeqLib::AddCommas(tmp_queue.size()) << \" contigs. Firing up \" << \n    numThreads << \" re-alignment threads\" << std::endl;\n  num_to_run = tmp_queue.size();\n  \n  if (!num_to_run)\n    return;\n\n  for (auto& i : tmp_queue) \n    queue.add(i);\n  \n  // wait for the threads to finish\n  for (int i = 0; i < numThreads; i++) \n    threadqueue[i]->join();  \n\n  all_align.close();\n  os_allbps.close();\n\n}\n\n"
  },
  {
    "path": "src/svabautils/AssemblyBamWalker.h",
    "content": "#ifndef SNOWMAN_ASSEMBLY_BAM_WALKER_H__\n#define SNOWMAN_ASSEMBLY_BAM_WALKER_H__\n\n#include \"SeqLib/BamReader.h\"\n\n#include \"AlignedContig2.h\"\n#include \"SnowmanBamWalker.h\"\n\n/** Walk along a BAM file generated from a de novo assembly,\n * realigned to the genome (preferably by BWA-MEM).\n */\nclass AssemblyBamWalker: public SeqLib::BamReader {\n\n public:\n\n  /** Construct a new read-only walker to move along the assembly bam\n   * @param in File path of the assembly BAM\n   */\n  AssemblyBamWalker() {}\n\n    /** Move along a BAM file generated from Discovar and make the AlignedContigs */\n    void walkDiscovar();\n      \n    void sendThread();\n\n    int numThreads = 1;\n\n    faidx_t * findex = nullptr;\n\n};\n\nstruct ContigElement {\n\n  SeqLib::BamRecordVector brv;\n  SeqLib::GenomicRegionVector regions;\n\n  ContigElement(const SeqLib::BamRecordVector& b, const SeqLib::GenomicRegionVector& r) : brv(b), regions(r) {}\n};\n\n\n//bool runAC(SnowTools::BamReadVector& brv, faidx_t * f, std::shared_ptr<hts_idx_t> pt, std::shared_ptr<hts_idx_t> pn,\n//\t   const std::string& t, const std::string& n, const SnowTools::GenomicRegionVector& regions);\nbool runAC(const ContigElement * c);\n\nclass AssemblyWalkerWorkItem {\n\n private:\n  \n  //SnowTools::BamReadVector m_brv;\n  //faidx_t * m_findex;\n  //std::shared_ptr<hts_idx_t> m_tindex, m_nindex;  \n  //SnowTools::GenomicRegionVector m_regions;\n  //std::string m_t, m_n;\n  ContigElement * m_contig;\n\n\n public:\n  //AssemblyWalkerWorkItem(SnowTools::BamReadVector& brv, faidx_t *f, std::shared_ptr<hts_idx_t> pt, std::shared_ptr<hts_idx_t> pn, \n  //\t\tSnowTools::GenomicRegionVector r,\n  //\t\t\tconst std::string& t, const std::string& n)  \n  //: m_brv(brv), m_findex(f), m_tindex(pt), m_nindex(pn), m_regions(r), m_t(t), m_n(n) {}\n    \n   AssemblyWalkerWorkItem(ContigElement* c) : m_contig(c) {}\n\n    //bool run() { return runAC(m_brv, m_findex, m_tindex, m_nindex, m_t, m_n, m_regions); }\n     bool run() { return runAC(m_contig); } \n\n     ~AssemblyWalkerWorkItem() { delete m_contig; }\n    \n};\n\n\n\n#endif\n"
  },
  {
    "path": "src/svabautils/BamSplitter.cpp",
    "content": "#include \"BamSplitter.h\"\n\n#include \"htslib/khash.h\"\n\n#define PRINT_MOD 200000\n\nvoid BamSplitter::splitBam() {\n\n  assert(m_writers.size() == m_frac.size());\n\n  std::vector<double> csum;\n  double cs = 0;\n  for (auto& i : m_frac) {\n    cs += i;\n    csum.push_back(cs);\n  }\n    \n  SeqLib::BamRecord r;\n\n  std::cerr << \"**Starting to split BAM \" << __startMessage(); \n\n  size_t countr = 0;\n  std::vector<size_t> all_counts(m_writers.size(), 0);\n  while (GetNextRecord(r))\n    {\n\n      // print a message\n      ++countr;\n      if (countr % PRINT_MOD == 0) \n\tstd::cerr << \"...splitting BAM at position \" << r.Brief() << \" with sample rate \" << csum[0] << \" on \" << m_writers.size() << \" writers \" << std::endl; \n\n      // put in one BAM or another\n      uint32_t k = __ac_Wang_hash(__ac_X31_hash_string(r.Qname().c_str()) ^ m_seed);\n      double hash_val = (double)(k&0xffffff) / 0x1000000;\n\n      for (size_t i = 0; i < m_writers.size(); ++i) {\n\t// decide whether to keep\n\tif (hash_val <= csum[i]/*sample_rate*/) {\n\t  //r.RemoveAllTags();\n\t  m_writers[i].WriteRecord(r);\n\t  ++all_counts[i];\n\t  break;\n\t}\n      }\n      \n      \n    }\n  \n}\n\nvoid BamSplitter::fractionateBam(const std::string& outbam, Fractions& f) {\n\n  std::cerr << \"...setting up output fractionated BAM \" << outbam << std::endl;\n  \n  SeqLib::BamWriter w;\n  assert(w.Open(outbam));\n  w.SetHeader(Header());\n  w.WriteHeader();\n  //bam_hdr_t * h = bam_hdr_dup(br.get());\n  \n  //w.SetWriteHeader(h);\n  //w.OpenWriteBam(outbam);\n\n  f.m_frc.CreateTreeMap();\n\n  SeqLib::BamRecord r;\n  \n  std::cerr << \"**Starting to fractionate BAM \" << __startMessage(); \n\n  size_t countr = 0;\n  std::vector<size_t> all_counts(m_writers.size(), 0);\n  while (GetNextRecord(r))\n    {\n      \n      // print a message\n      ++countr;\n      if (countr % PRINT_MOD == 0) \n\tstd::cerr << \"...fractionating BAM at position \" << r.Brief();\n      \n      SeqLib::GenomicRegion gr(r.ChrID(), r.Position(), r.Position(), '*');\n      std::vector<int32_t> qid, sid;\n      SeqLib::GRC grc(gr);\n      grc.FindOverlaps(f.m_frc, sid, qid, true);\n      //f.m_frc.findOverlaps(grc, qid, sid, true);\n\n      /*\n      std::cerr << gr << \" qid.size() \" << qid.size() << \" sid.size() \" << sid.size() << std::endl;\n      for (auto& i : qid) \n\tstd::cerr << \"       Q: \" << i << std::endl;\n      for (auto& i : sid) \n\tstd::cerr << \"       S: \" << i << std::endl;\n      */\n\n      if (!qid.size()) {\n\tif (countr % PRINT_MOD == 0)\n\t  std::cerr << \" -- Not in fraction region. Skipping read \" << std::endl; \n\tcontinue;\n      }\n      \n      double sample_rate = f.m_frc.at(qid[0]).frac;\n      \n      if (countr % PRINT_MOD == 0) \n\tstd::cerr << \" -- found frac region \" << f.m_frc.at(qid[0]) << \" w/rate \" << sample_rate << std::endl;\n\n      // put in one BAM or another\n      uint32_t k = __ac_Wang_hash(__ac_X31_hash_string(r.Qname().c_str()) ^ m_seed);\n      double hash_val = (double)(k&0xffffff) / 0x1000000;\n      \n      // keep sampling the read (if sample_rate < 1, just does this once)\n      size_t num_sampled = 0; // how many times has read been sampled\n      std::string qn;\n      while(sample_rate > 0) {\n\t\n\t// decide whether to keep\n\tif (hash_val <= sample_rate) {\n\t  //r.RemoveAllTags();\n\t  \n\t  // if super-sampling, give unique qname\n\t  if (num_sampled) {\n\t    if (qn.empty())\n\t      qn = r.Qname();\n\t    r.SetQname(\"S\" + std::to_string(num_sampled) + \"_\" + qn);\n\t  }\n\n\t  // add tag and remove another, if first time seen read\n\t  if (!num_sampled) {\n\t    r.RemoveTag(\"OQ\"); // just for compactedness\t  \n\t    r.AddZTag(\"RT\", std::to_string(sample_rate));\n\t  }\n\n\t  w.WriteRecord(r);\n\t  ++num_sampled;\n\t}\n\t\n\tsample_rate = sample_rate - 1;\n\t\n      }\n    }\n}\n\nvoid BamSplitter::setWriters(const std::vector<std::string>& writers, const std::vector<double>& fracs) {\n\n  assert(fracs.size() == writers.size());  \n\n  for (auto& i : writers) {\n\n    std::cerr << \"...setting up BAM: \" << i << std::endl;\n    SeqLib::BamWriter w;\n    assert(w.Open(i));\n    w.SetHeader(Header());\n    w.WriteHeader();\n    //    bam_hdr_t * h = bam_hdr_dup(br.get()/*header()*/);\n    //w.SetWriteHeader(h);\n    //w.OpenWriteBam(i);\n    m_writers.push_back(w);\n\n  }\n\n  m_frac = fracs;\n\n\n}\n\nstd::string BamSplitter::__startMessage() const {\n\n  std::stringstream ss;\n  if (m_region.size() == 1)\n    ss << \" on region \" << m_region[0] << std::endl;\n  else if (m_region.size() == 0)\n    ss << \" on WHOLE GENOME\" << std::endl;\n  else\n    ss << \" on \" << m_region.size() << \" regions \" << std::endl;\n  return ss.str();\n\n}\n"
  },
  {
    "path": "src/svabautils/BamSplitter.h",
    "content": "#ifndef SNOWMAN_BAM_SPLITTER_H__\n#define SNOWMAN_BAM_SPLITTER_H__\n\n#include \"SeqLib/BamReader.h\"\n#include \"SeqLib/BamWriter.h\"\n#include \"Fractions.h\"\n\nclass BamSplitter: public SeqLib::BamReader\n{\n\n public:\n\n  BamSplitter() {}\n\n  BamSplitter(uint32_t seed) : m_seed(seed) {}\n    \n    void setWriters(const std::vector<std::string>& writers, const std::vector<double>& fracs);\n\n  void splitBam();\n\n  void fractionateBam(const std::string& outbam, Fractions& f);\n\n private:\n\n  std::string __startMessage() const;\n\n    uint32_t m_seed = 0;\n\n    std::vector<double> m_frac;\n\n    std::vector<SeqLib::BamWriter> m_writers;\n\n};\n\n#endif\n"
  },
  {
    "path": "src/svabautils/Fractions.cpp",
    "content": "#include \"Fractions.h\"\n\nusing namespace SeqLib;\n\nFracRegion::FracRegion(const std::string& c, const std::string& p1, const std::string& p2, const SeqLib::BamHeader& h, const std::string& f) : SeqLib::GenomicRegion(c, p1, p2, h)\n  {\n    // convert frac to double\n    try { \n      frac = std::stod(f);\n    } catch (...) {\n      std::cerr << \"FracRegion::FracRegion - Error converting fraction \" << f << \" to double \"  << std::endl;\n      exit(EXIT_FAILURE);\n    } \n  }\n\n  size_t Fractions::size() const { \n    return m_frc.size();\n  }\n\n\n  std::ostream& operator<<(std::ostream& out, const FracRegion& f) {\n    out << f.chr << \":\" << SeqLib::AddCommas<int32_t>(f.pos1) << \"-\" << \n      SeqLib::AddCommas<int32_t>(f.pos2) << \" Frac: \" << f.frac;\n    return out;\n  }\n\n  void Fractions::readFromBed(const std::string& file, const SeqLib::BamHeader& h) {\n\n  std::ifstream iss(file.c_str());\n  if (!iss || file.length() == 0) { \n    std::cerr << \"BED file does not exist: \" << file << std::endl;\n    exit(EXIT_FAILURE);\n  }\n  \n  std::string line;\n  std::string curr_chr = \"-1\";\n  while (std::getline(iss, line, '\\n')) {\n    \n    size_t counter = 0;\n    std::string chr, pos1, pos2, f;\n    std::istringstream iss_line(line);\n    std::string val;\n    \n    if (line.find(\"#\") == std::string::npos) {\n      while(std::getline(iss_line, val, '\\t')) {\n\tswitch (counter) { \n\tcase 0 : chr = val; break; \n\tcase 1 : pos1 = val; break;\n\tcase 2 : pos2 = val; break;\n\tcase 3 : f = val; break;\n\t}\n\tif (counter >= 3)\n\t  break;\n\t++counter;\n\t\n\tif (chr != curr_chr) {\n\t  //std::cerr << \"...reading from BED - chr\" << chr << std::endl;\n\t  curr_chr = chr;\n\t}\n\t\n      }\n\n      // construct the GenomicRegion\n      FracRegion ff(chr, pos1, pos2, h, f);\n\n      //if (ff.valid()) {\n\t//gr.pad(pad);\n\t//m_grv.push_back(gr);\n\tm_frc.add(ff);\n\t//}\n\t\n\t//}\n    } // end \"keep\" conditional\n  } // end main while\n\n\n}\n"
  },
  {
    "path": "src/svabautils/Fractions.h",
    "content": "#ifndef SNOWMAN_FRACTIONS_H__\n#define SNOWMAN_FRACTIONS_H__\n\n#include \"SeqLib/GenomicRegionCollection.h\"\n#include \"SeqLib/BamHeader.h\"\n#include <string>\n\n  /** @brief Extension of GenomicRegion with a fraction of reads to keep on an interval\n   * \n   * Used in conjunction with Fractions and used for selectively sub-sampling BAM files.\n   */\nclass FracRegion : public SeqLib::GenomicRegion {\n\n public:\n  \n  FracRegion() {}\n\n  FracRegion(const std::string& c, const std::string& p1, const std::string& p2, const SeqLib::BamHeader& h, const std::string& f);\n\n  friend std::ostream& operator<<(std::ostream& out, const FracRegion& f);\n\n  double frac;\n};\n\n  /** @brief Genomic intervals and associated sampling fractions\n   */\nclass Fractions {\n\n public:\n  \n  Fractions() {}\n\n  size_t size() const;\n\n  void readFromBed(const std::string& file, const SeqLib::BamHeader& h) ;\n\n  SeqLib::GenomicRegionCollection<FracRegion> m_frc;\n\n private:\n\n};\n\n#endif\n"
  },
  {
    "path": "src/svabautils/Makefile.am",
    "content": "bin_PROGRAMS = svabautils\n\nsvabautils_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/src/SGA/SuffixTools \\\n\t-I$(top_srcdir)/src/SGA/StringGraph \\\n\t-I$(top_srcdir)/src/SGA/Algorithm \\\n\t-I$(top_srcdir)/src/SGA/SQG \\\n\t-I$(top_srcdir)/src/SGA/SGA \\\n\t-I$(top_srcdir)/src/Svaba \\\n\t-I$(top_srcdir)/SeqLib \\\n\t-I$(top_srcdir)/SeqLib/htslib\n\nsvabautils_LDADD = \\\n\t$(top_builddir)/src/SGA/SGA/libsga.a \\\n\t$(top_builddir)/src/SGA/StringGraph/libstringgraph.a \\\n\t$(top_builddir)/src/SGA/Algorithm/libalgorithm.a \\\n\t$(top_builddir)/src/SGA/SuffixTools/libsuffixtools.a \\\n\t$(top_builddir)/src/SGA/Bigraph/libbigraph.a \\\n\t$(top_builddir)/src/SGA/Util/libutil.a \\\n\t$(top_builddir)/src/SGA/SQG/libsqg.a \\\n\t$(top_builddir)/SeqLib/src/libseqlib.a \\\n\t$(top_builddir)/SeqLib/bwa/libbwa.a \\\n\t$(top_builddir)/SeqLib/htslib/libhts.a \\\n\t$(top_builddir)/SeqLib/fermi-lite/libfml.a\n\nsvabautils_LDFLAGS = -pthread -std=c++11\n\nsvabautils_SOURCES = snowutils.cpp splitcounter.cpp ../Snowman/BreakPoint2.cpp ../Snowman/AlignedContig2.cpp \\\n\t\t../Snowman/DiscordantCluster.cpp ../Snowman/DBSnpFilter.cpp ../Snowman/PONFilter.cpp \\\n\t\t../Snowman/SnowmanUtils.cpp ../Snowman/SnowmanAssemblerEngine.cpp ../Snowman/vcf.cpp ../Snowman/DiscordantRealigner.cpp \\\n\t\t../Snowman/SnowmanOverlapAlgorithm.cpp ../Snowman/SnowmanASQG.cpp \\\n\t\t../Snowman/SnowmanAssemble.cpp \\\n\t\t../Snowman/KmerFilter.cpp ../Snowman/SnowmanBamWalker.cpp  \\\n\t\tSeqFrag.cpp SimGenome.cpp BamSplitter.cpp SimTrainerWalker.cpp \\\n\t\tFractions.cpp ../Snowman/STCoverage.cpp ../Snowman/Histogram.cpp ../Snowman/BamStats.cpp \\\n\t\tPowerLawSim.cpp AssemblyBamWalker.cpp assembly2vcf.cpp\n"
  },
  {
    "path": "src/svabautils/Makefile.in",
    "content": "# Makefile.in generated by automake 1.11.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,\n# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,\n# Inc.\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbin_PROGRAMS = snowmanutils$(EXEEXT)\nsubdir = .\nDIST_COMMON = $(am__configure_deps) $(srcdir)/../../depcomp \\\n\t$(srcdir)/../../install-sh $(srcdir)/../../missing \\\n\t$(srcdir)/Makefile.am $(srcdir)/Makefile.in \\\n\t$(srcdir)/config.h.in $(top_srcdir)/configure\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nam__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \\\n configure.lineno config.status.lineno\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nam__installdirs = \"$(DESTDIR)$(bindir)\"\nPROGRAMS = $(bin_PROGRAMS)\nam_snowmanutils_OBJECTS = snowmanutils-snowutils.$(OBJEXT) \\\n\tsnowmanutils-splitcounter.$(OBJEXT) \\\n\tsnowmanutils-BreakPoint2.$(OBJEXT) \\\n\tsnowmanutils-AlignedContig2.$(OBJEXT) \\\n\tsnowmanutils-DiscordantCluster.$(OBJEXT) \\\n\tsnowmanutils-DBSnpFilter.$(OBJEXT) \\\n\tsnowmanutils-PONFilter.$(OBJEXT) \\\n\tsnowmanutils-SnowmanUtils.$(OBJEXT) \\\n\tsnowmanutils-SnowmanAssemblerEngine.$(OBJEXT) \\\n\tsnowmanutils-vcf.$(OBJEXT) \\\n\tsnowmanutils-DiscordantRealigner.$(OBJEXT) \\\n\tsnowmanutils-SnowmanOverlapAlgorithm.$(OBJEXT) \\\n\tsnowmanutils-SnowmanASQG.$(OBJEXT) \\\n\tsnowmanutils-SnowmanAssemble.$(OBJEXT) \\\n\tsnowmanutils-KmerFilter.$(OBJEXT) \\\n\tsnowmanutils-SnowmanBamWalker.$(OBJEXT) \\\n\tsnowmanutils-SeqFrag.$(OBJEXT) \\\n\tsnowmanutils-SimGenome.$(OBJEXT) \\\n\tsnowmanutils-BamSplitter.$(OBJEXT) \\\n\tsnowmanutils-SimTrainerWalker.$(OBJEXT) \\\n\tsnowmanutils-Fractions.$(OBJEXT) \\\n\tsnowmanutils-STCoverage.$(OBJEXT) \\\n\tsnowmanutils-Histogram.$(OBJEXT) \\\n\tsnowmanutils-BamStats.$(OBJEXT) \\\n\tsnowmanutils-PowerLawSim.$(OBJEXT) \\\n\tsnowmanutils-AssemblyBamWalker.$(OBJEXT) \\\n\tsnowmanutils-assembly2vcf.$(OBJEXT)\nsnowmanutils_OBJECTS = $(am_snowmanutils_OBJECTS)\nsnowmanutils_DEPENDENCIES = $(top_builddir)/src/SGA/SGA/libsga.a \\\n\t$(top_builddir)/src/SGA/StringGraph/libstringgraph.a \\\n\t$(top_builddir)/src/SGA/Algorithm/libalgorithm.a \\\n\t$(top_builddir)/src/SGA/SuffixTools/libsuffixtools.a \\\n\t$(top_builddir)/src/SGA/Bigraph/libbigraph.a \\\n\t$(top_builddir)/src/SGA/Util/libutil.a \\\n\t$(top_builddir)/src/SGA/SQG/libsqg.a \\\n\t$(top_builddir)/SeqLib/src/libseqlib.a \\\n\t$(top_builddir)/SeqLib/bwa/libbwa.a \\\n\t$(top_builddir)/SeqLib/htslib/libhts.a \\\n\t$(top_builddir)/SeqLib/fermi-lite/libfml.a\nsnowmanutils_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \\\n\t$(snowmanutils_LDFLAGS) $(LDFLAGS) -o $@\nDEFAULT_INCLUDES = -I.@am__isrc@\ndepcomp = $(SHELL) $(top_srcdir)/../../depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nCXXLD = $(CXX)\nCXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \\\n\t-o $@\nSOURCES = $(snowmanutils_SOURCES)\nDIST_SOURCES = $(snowmanutils_SOURCES)\nETAGS = etags\nCTAGS = ctags\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\ndistdir = $(PACKAGE)-$(VERSION)\ntop_distdir = $(distdir)\nam__remove_distdir = \\\n  { test ! -d \"$(distdir)\" \\\n    || { find \"$(distdir)\" -type d ! -perm -200 -exec chmod u+w {} ';' \\\n         && rm -fr \"$(distdir)\"; }; }\nDIST_ARCHIVES = $(distdir).tar.gz\nGZIP_ENV = --best\ndistuninstallcheck_listfiles = find . -type f -print\ndistcleancheck_listfiles = find . -type f -print\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_CXXFLAGS = @AM_CXXFLAGS@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nOBJEXT = @OBJEXT@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild_alias = @build_alias@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost_alias = @host_alias@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nsnowmanutils_CPPFLAGS = \\\n\t-I$(top_srcdir)/src/SGA/Util \\\n\t-I$(top_srcdir)/src/SGA/Bigraph \\\n\t-I$(top_srcdir)/src/SGA/SuffixTools \\\n\t-I$(top_srcdir)/src/SGA/StringGraph \\\n\t-I$(top_srcdir)/src/SGA/Algorithm \\\n\t-I$(top_srcdir)/src/SGA/SQG \\\n\t-I$(top_srcdir)/src/SGA/SGA \\\n\t-I$(top_srcdir)/src/Snowman \\\n\t-I$(top_srcdir)/SeqLib \\\n\t-I$(top_srcdir)/SeqLib/htslib\n\nsnowmanutils_LDADD = \\\n\t$(top_builddir)/src/SGA/SGA/libsga.a \\\n\t$(top_builddir)/src/SGA/StringGraph/libstringgraph.a \\\n\t$(top_builddir)/src/SGA/Algorithm/libalgorithm.a \\\n\t$(top_builddir)/src/SGA/SuffixTools/libsuffixtools.a \\\n\t$(top_builddir)/src/SGA/Bigraph/libbigraph.a \\\n\t$(top_builddir)/src/SGA/Util/libutil.a \\\n\t$(top_builddir)/src/SGA/SQG/libsqg.a \\\n\t$(top_builddir)/SeqLib/src/libseqlib.a \\\n\t$(top_builddir)/SeqLib/bwa/libbwa.a \\\n\t$(top_builddir)/SeqLib/htslib/libhts.a \\\n\t$(top_builddir)/SeqLib/fermi-lite/libfml.a\n\nsnowmanutils_LDFLAGS = -pthread -std=c++11\nsnowmanutils_SOURCES = snowutils.cpp splitcounter.cpp ../Snowman/BreakPoint2.cpp ../Snowman/AlignedContig2.cpp \\\n\t\t../Snowman/DiscordantCluster.cpp ../Snowman/DBSnpFilter.cpp ../Snowman/PONFilter.cpp \\\n\t\t../Snowman/SnowmanUtils.cpp ../Snowman/SnowmanAssemblerEngine.cpp ../Snowman/vcf.cpp ../Snowman/DiscordantRealigner.cpp \\\n\t\t../Snowman/SnowmanOverlapAlgorithm.cpp ../Snowman/SnowmanASQG.cpp \\\n\t\t../Snowman/SnowmanAssemble.cpp \\\n\t\t../Snowman/KmerFilter.cpp ../Snowman/SnowmanBamWalker.cpp  \\\n\t\tSeqFrag.cpp SimGenome.cpp BamSplitter.cpp SimTrainerWalker.cpp \\\n\t\tFractions.cpp ../Snowman/STCoverage.cpp ../Snowman/Histogram.cpp ../Snowman/BamStats.cpp \\\n\t\tPowerLawSim.cpp AssemblyBamWalker.cpp assembly2vcf.cpp\n\nall: config.h\n\t$(MAKE) $(AM_MAKEFLAGS) all-am\n\n.SUFFIXES:\n.SUFFIXES: .cpp .o .obj\nam--refresh:\n\t@:\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \\\n\t      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \\\n\t\t&& exit 0; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    echo ' $(SHELL) ./config.status'; \\\n\t    $(SHELL) ./config.status;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\t$(SHELL) ./config.status --recheck\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\t$(am__cd) $(srcdir) && $(AUTOCONF)\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\t$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)\n$(am__aclocal_m4_deps):\n\nconfig.h: stamp-h1\n\t@if test ! -f $@; then \\\n\t  rm -f stamp-h1; \\\n\t  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \\\n\telse :; fi\n\nstamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status\n\t@rm -f stamp-h1\n\tcd $(top_builddir) && $(SHELL) ./config.status config.h\n$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) \n\t($(am__cd) $(top_srcdir) && $(AUTOHEADER))\n\trm -f stamp-h1\n\ttouch $@\n\ndistclean-hdr:\n\t-rm -f config.h stamp-h1\ninstall-binPROGRAMS: $(bin_PROGRAMS)\n\t@$(NORMAL_INSTALL)\n\ttest -z \"$(bindir)\" || $(MKDIR_P) \"$(DESTDIR)$(bindir)\"\n\t@list='$(bin_PROGRAMS)'; test -n \"$(bindir)\" || list=; \\\n\tfor p in $$list; do echo \"$$p $$p\"; done | \\\n\tsed 's/$(EXEEXT)$$//' | \\\n\twhile read p p1; do if test -f $$p; \\\n\t  then echo \"$$p\"; echo \"$$p\"; else :; fi; \\\n\tdone | \\\n\tsed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \\\n\t    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \\\n\tsed 'N;N;N;s,\\n, ,g' | \\\n\t$(AWK) 'BEGIN { files[\".\"] = \"\"; dirs[\".\"] = 1 } \\\n\t  { d=$$3; if (dirs[d] != 1) { print \"d\", d; dirs[d] = 1 } \\\n\t    if ($$2 == $$4) files[d] = files[d] \" \" $$1; \\\n\t    else { print \"f\", $$3 \"/\" $$4, $$1; } } \\\n\t  END { for (d in files) print \"f\", d, files[d] }' | \\\n\twhile read type dir files; do \\\n\t    if test \"$$dir\" = .; then dir=; else dir=/$$dir; fi; \\\n\t    test -z \"$$files\" || { \\\n\t      echo \" $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'\"; \\\n\t      $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files \"$(DESTDIR)$(bindir)$$dir\" || exit $$?; \\\n\t    } \\\n\t; done\n\nuninstall-binPROGRAMS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(bin_PROGRAMS)'; test -n \"$(bindir)\" || list=; \\\n\tfiles=`for p in $$list; do echo \"$$p\"; done | \\\n\t  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \\\n\t      -e 's/$$/$(EXEEXT)/' `; \\\n\ttest -n \"$$list\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(bindir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(bindir)\" && rm -f $$files\n\nclean-binPROGRAMS:\n\t-test -z \"$(bin_PROGRAMS)\" || rm -f $(bin_PROGRAMS)\nsnowmanutils$(EXEEXT): $(snowmanutils_OBJECTS) $(snowmanutils_DEPENDENCIES) \n\t@rm -f snowmanutils$(EXEEXT)\n\t$(snowmanutils_LINK) $(snowmanutils_OBJECTS) $(snowmanutils_LDADD) $(LIBS)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-AlignedContig2.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-AssemblyBamWalker.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-BamSplitter.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-BamStats.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-BreakPoint2.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-DBSnpFilter.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-DiscordantCluster.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-DiscordantRealigner.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-Fractions.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-Histogram.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-KmerFilter.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-PONFilter.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-PowerLawSim.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-STCoverage.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-SeqFrag.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-SimGenome.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-SimTrainerWalker.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-SnowmanASQG.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-SnowmanAssemble.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-SnowmanAssemblerEngine.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-SnowmanBamWalker.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-SnowmanOverlapAlgorithm.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-SnowmanUtils.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-assembly2vcf.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-snowutils.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-splitcounter.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snowmanutils-vcf.Po@am__quote@\n\n.cpp.o:\n@am__fastdepCXX_TRUE@\t$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXXCOMPILE) -c -o $@ $<\n\n.cpp.obj:\n@am__fastdepCXX_TRUE@\t$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\nsnowmanutils-snowutils.o: snowutils.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-snowutils.o -MD -MP -MF $(DEPDIR)/snowmanutils-snowutils.Tpo -c -o snowmanutils-snowutils.o `test -f 'snowutils.cpp' || echo '$(srcdir)/'`snowutils.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-snowutils.Tpo $(DEPDIR)/snowmanutils-snowutils.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='snowutils.cpp' object='snowmanutils-snowutils.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-snowutils.o `test -f 'snowutils.cpp' || echo '$(srcdir)/'`snowutils.cpp\n\nsnowmanutils-snowutils.obj: snowutils.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-snowutils.obj -MD -MP -MF $(DEPDIR)/snowmanutils-snowutils.Tpo -c -o snowmanutils-snowutils.obj `if test -f 'snowutils.cpp'; then $(CYGPATH_W) 'snowutils.cpp'; else $(CYGPATH_W) '$(srcdir)/snowutils.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-snowutils.Tpo $(DEPDIR)/snowmanutils-snowutils.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='snowutils.cpp' object='snowmanutils-snowutils.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-snowutils.obj `if test -f 'snowutils.cpp'; then $(CYGPATH_W) 'snowutils.cpp'; else $(CYGPATH_W) '$(srcdir)/snowutils.cpp'; fi`\n\nsnowmanutils-splitcounter.o: splitcounter.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-splitcounter.o -MD -MP -MF $(DEPDIR)/snowmanutils-splitcounter.Tpo -c -o snowmanutils-splitcounter.o `test -f 'splitcounter.cpp' || echo '$(srcdir)/'`splitcounter.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-splitcounter.Tpo $(DEPDIR)/snowmanutils-splitcounter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='splitcounter.cpp' object='snowmanutils-splitcounter.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-splitcounter.o `test -f 'splitcounter.cpp' || echo '$(srcdir)/'`splitcounter.cpp\n\nsnowmanutils-splitcounter.obj: splitcounter.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-splitcounter.obj -MD -MP -MF $(DEPDIR)/snowmanutils-splitcounter.Tpo -c -o snowmanutils-splitcounter.obj `if test -f 'splitcounter.cpp'; then $(CYGPATH_W) 'splitcounter.cpp'; else $(CYGPATH_W) '$(srcdir)/splitcounter.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-splitcounter.Tpo $(DEPDIR)/snowmanutils-splitcounter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='splitcounter.cpp' object='snowmanutils-splitcounter.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-splitcounter.obj `if test -f 'splitcounter.cpp'; then $(CYGPATH_W) 'splitcounter.cpp'; else $(CYGPATH_W) '$(srcdir)/splitcounter.cpp'; fi`\n\nsnowmanutils-BreakPoint2.o: ../Snowman/BreakPoint2.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-BreakPoint2.o -MD -MP -MF $(DEPDIR)/snowmanutils-BreakPoint2.Tpo -c -o snowmanutils-BreakPoint2.o `test -f '../Snowman/BreakPoint2.cpp' || echo '$(srcdir)/'`../Snowman/BreakPoint2.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-BreakPoint2.Tpo $(DEPDIR)/snowmanutils-BreakPoint2.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/BreakPoint2.cpp' object='snowmanutils-BreakPoint2.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-BreakPoint2.o `test -f '../Snowman/BreakPoint2.cpp' || echo '$(srcdir)/'`../Snowman/BreakPoint2.cpp\n\nsnowmanutils-BreakPoint2.obj: ../Snowman/BreakPoint2.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-BreakPoint2.obj -MD -MP -MF $(DEPDIR)/snowmanutils-BreakPoint2.Tpo -c -o snowmanutils-BreakPoint2.obj `if test -f '../Snowman/BreakPoint2.cpp'; then $(CYGPATH_W) '../Snowman/BreakPoint2.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/BreakPoint2.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-BreakPoint2.Tpo $(DEPDIR)/snowmanutils-BreakPoint2.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/BreakPoint2.cpp' object='snowmanutils-BreakPoint2.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-BreakPoint2.obj `if test -f '../Snowman/BreakPoint2.cpp'; then $(CYGPATH_W) '../Snowman/BreakPoint2.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/BreakPoint2.cpp'; fi`\n\nsnowmanutils-AlignedContig2.o: ../Snowman/AlignedContig2.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-AlignedContig2.o -MD -MP -MF $(DEPDIR)/snowmanutils-AlignedContig2.Tpo -c -o snowmanutils-AlignedContig2.o `test -f '../Snowman/AlignedContig2.cpp' || echo '$(srcdir)/'`../Snowman/AlignedContig2.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-AlignedContig2.Tpo $(DEPDIR)/snowmanutils-AlignedContig2.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/AlignedContig2.cpp' object='snowmanutils-AlignedContig2.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-AlignedContig2.o `test -f '../Snowman/AlignedContig2.cpp' || echo '$(srcdir)/'`../Snowman/AlignedContig2.cpp\n\nsnowmanutils-AlignedContig2.obj: ../Snowman/AlignedContig2.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-AlignedContig2.obj -MD -MP -MF $(DEPDIR)/snowmanutils-AlignedContig2.Tpo -c -o snowmanutils-AlignedContig2.obj `if test -f '../Snowman/AlignedContig2.cpp'; then $(CYGPATH_W) '../Snowman/AlignedContig2.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/AlignedContig2.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-AlignedContig2.Tpo $(DEPDIR)/snowmanutils-AlignedContig2.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/AlignedContig2.cpp' object='snowmanutils-AlignedContig2.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-AlignedContig2.obj `if test -f '../Snowman/AlignedContig2.cpp'; then $(CYGPATH_W) '../Snowman/AlignedContig2.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/AlignedContig2.cpp'; fi`\n\nsnowmanutils-DiscordantCluster.o: ../Snowman/DiscordantCluster.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-DiscordantCluster.o -MD -MP -MF $(DEPDIR)/snowmanutils-DiscordantCluster.Tpo -c -o snowmanutils-DiscordantCluster.o `test -f '../Snowman/DiscordantCluster.cpp' || echo '$(srcdir)/'`../Snowman/DiscordantCluster.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-DiscordantCluster.Tpo $(DEPDIR)/snowmanutils-DiscordantCluster.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/DiscordantCluster.cpp' object='snowmanutils-DiscordantCluster.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-DiscordantCluster.o `test -f '../Snowman/DiscordantCluster.cpp' || echo '$(srcdir)/'`../Snowman/DiscordantCluster.cpp\n\nsnowmanutils-DiscordantCluster.obj: ../Snowman/DiscordantCluster.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-DiscordantCluster.obj -MD -MP -MF $(DEPDIR)/snowmanutils-DiscordantCluster.Tpo -c -o snowmanutils-DiscordantCluster.obj `if test -f '../Snowman/DiscordantCluster.cpp'; then $(CYGPATH_W) '../Snowman/DiscordantCluster.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/DiscordantCluster.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-DiscordantCluster.Tpo $(DEPDIR)/snowmanutils-DiscordantCluster.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/DiscordantCluster.cpp' object='snowmanutils-DiscordantCluster.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-DiscordantCluster.obj `if test -f '../Snowman/DiscordantCluster.cpp'; then $(CYGPATH_W) '../Snowman/DiscordantCluster.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/DiscordantCluster.cpp'; fi`\n\nsnowmanutils-DBSnpFilter.o: ../Snowman/DBSnpFilter.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-DBSnpFilter.o -MD -MP -MF $(DEPDIR)/snowmanutils-DBSnpFilter.Tpo -c -o snowmanutils-DBSnpFilter.o `test -f '../Snowman/DBSnpFilter.cpp' || echo '$(srcdir)/'`../Snowman/DBSnpFilter.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-DBSnpFilter.Tpo $(DEPDIR)/snowmanutils-DBSnpFilter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/DBSnpFilter.cpp' object='snowmanutils-DBSnpFilter.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-DBSnpFilter.o `test -f '../Snowman/DBSnpFilter.cpp' || echo '$(srcdir)/'`../Snowman/DBSnpFilter.cpp\n\nsnowmanutils-DBSnpFilter.obj: ../Snowman/DBSnpFilter.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-DBSnpFilter.obj -MD -MP -MF $(DEPDIR)/snowmanutils-DBSnpFilter.Tpo -c -o snowmanutils-DBSnpFilter.obj `if test -f '../Snowman/DBSnpFilter.cpp'; then $(CYGPATH_W) '../Snowman/DBSnpFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/DBSnpFilter.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-DBSnpFilter.Tpo $(DEPDIR)/snowmanutils-DBSnpFilter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/DBSnpFilter.cpp' object='snowmanutils-DBSnpFilter.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-DBSnpFilter.obj `if test -f '../Snowman/DBSnpFilter.cpp'; then $(CYGPATH_W) '../Snowman/DBSnpFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/DBSnpFilter.cpp'; fi`\n\nsnowmanutils-PONFilter.o: ../Snowman/PONFilter.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-PONFilter.o -MD -MP -MF $(DEPDIR)/snowmanutils-PONFilter.Tpo -c -o snowmanutils-PONFilter.o `test -f '../Snowman/PONFilter.cpp' || echo '$(srcdir)/'`../Snowman/PONFilter.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-PONFilter.Tpo $(DEPDIR)/snowmanutils-PONFilter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/PONFilter.cpp' object='snowmanutils-PONFilter.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-PONFilter.o `test -f '../Snowman/PONFilter.cpp' || echo '$(srcdir)/'`../Snowman/PONFilter.cpp\n\nsnowmanutils-PONFilter.obj: ../Snowman/PONFilter.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-PONFilter.obj -MD -MP -MF $(DEPDIR)/snowmanutils-PONFilter.Tpo -c -o snowmanutils-PONFilter.obj `if test -f '../Snowman/PONFilter.cpp'; then $(CYGPATH_W) '../Snowman/PONFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/PONFilter.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-PONFilter.Tpo $(DEPDIR)/snowmanutils-PONFilter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/PONFilter.cpp' object='snowmanutils-PONFilter.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-PONFilter.obj `if test -f '../Snowman/PONFilter.cpp'; then $(CYGPATH_W) '../Snowman/PONFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/PONFilter.cpp'; fi`\n\nsnowmanutils-SnowmanUtils.o: ../Snowman/SnowmanUtils.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanUtils.o -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanUtils.Tpo -c -o snowmanutils-SnowmanUtils.o `test -f '../Snowman/SnowmanUtils.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanUtils.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanUtils.Tpo $(DEPDIR)/snowmanutils-SnowmanUtils.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanUtils.cpp' object='snowmanutils-SnowmanUtils.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanUtils.o `test -f '../Snowman/SnowmanUtils.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanUtils.cpp\n\nsnowmanutils-SnowmanUtils.obj: ../Snowman/SnowmanUtils.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanUtils.obj -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanUtils.Tpo -c -o snowmanutils-SnowmanUtils.obj `if test -f '../Snowman/SnowmanUtils.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanUtils.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanUtils.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanUtils.Tpo $(DEPDIR)/snowmanutils-SnowmanUtils.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanUtils.cpp' object='snowmanutils-SnowmanUtils.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanUtils.obj `if test -f '../Snowman/SnowmanUtils.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanUtils.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanUtils.cpp'; fi`\n\nsnowmanutils-SnowmanAssemblerEngine.o: ../Snowman/SnowmanAssemblerEngine.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanAssemblerEngine.o -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanAssemblerEngine.Tpo -c -o snowmanutils-SnowmanAssemblerEngine.o `test -f '../Snowman/SnowmanAssemblerEngine.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanAssemblerEngine.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanAssemblerEngine.Tpo $(DEPDIR)/snowmanutils-SnowmanAssemblerEngine.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanAssemblerEngine.cpp' object='snowmanutils-SnowmanAssemblerEngine.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanAssemblerEngine.o `test -f '../Snowman/SnowmanAssemblerEngine.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanAssemblerEngine.cpp\n\nsnowmanutils-SnowmanAssemblerEngine.obj: ../Snowman/SnowmanAssemblerEngine.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanAssemblerEngine.obj -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanAssemblerEngine.Tpo -c -o snowmanutils-SnowmanAssemblerEngine.obj `if test -f '../Snowman/SnowmanAssemblerEngine.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanAssemblerEngine.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanAssemblerEngine.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanAssemblerEngine.Tpo $(DEPDIR)/snowmanutils-SnowmanAssemblerEngine.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanAssemblerEngine.cpp' object='snowmanutils-SnowmanAssemblerEngine.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanAssemblerEngine.obj `if test -f '../Snowman/SnowmanAssemblerEngine.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanAssemblerEngine.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanAssemblerEngine.cpp'; fi`\n\nsnowmanutils-vcf.o: ../Snowman/vcf.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-vcf.o -MD -MP -MF $(DEPDIR)/snowmanutils-vcf.Tpo -c -o snowmanutils-vcf.o `test -f '../Snowman/vcf.cpp' || echo '$(srcdir)/'`../Snowman/vcf.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-vcf.Tpo $(DEPDIR)/snowmanutils-vcf.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/vcf.cpp' object='snowmanutils-vcf.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-vcf.o `test -f '../Snowman/vcf.cpp' || echo '$(srcdir)/'`../Snowman/vcf.cpp\n\nsnowmanutils-vcf.obj: ../Snowman/vcf.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-vcf.obj -MD -MP -MF $(DEPDIR)/snowmanutils-vcf.Tpo -c -o snowmanutils-vcf.obj `if test -f '../Snowman/vcf.cpp'; then $(CYGPATH_W) '../Snowman/vcf.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/vcf.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-vcf.Tpo $(DEPDIR)/snowmanutils-vcf.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/vcf.cpp' object='snowmanutils-vcf.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-vcf.obj `if test -f '../Snowman/vcf.cpp'; then $(CYGPATH_W) '../Snowman/vcf.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/vcf.cpp'; fi`\n\nsnowmanutils-DiscordantRealigner.o: ../Snowman/DiscordantRealigner.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-DiscordantRealigner.o -MD -MP -MF $(DEPDIR)/snowmanutils-DiscordantRealigner.Tpo -c -o snowmanutils-DiscordantRealigner.o `test -f '../Snowman/DiscordantRealigner.cpp' || echo '$(srcdir)/'`../Snowman/DiscordantRealigner.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-DiscordantRealigner.Tpo $(DEPDIR)/snowmanutils-DiscordantRealigner.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/DiscordantRealigner.cpp' object='snowmanutils-DiscordantRealigner.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-DiscordantRealigner.o `test -f '../Snowman/DiscordantRealigner.cpp' || echo '$(srcdir)/'`../Snowman/DiscordantRealigner.cpp\n\nsnowmanutils-DiscordantRealigner.obj: ../Snowman/DiscordantRealigner.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-DiscordantRealigner.obj -MD -MP -MF $(DEPDIR)/snowmanutils-DiscordantRealigner.Tpo -c -o snowmanutils-DiscordantRealigner.obj `if test -f '../Snowman/DiscordantRealigner.cpp'; then $(CYGPATH_W) '../Snowman/DiscordantRealigner.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/DiscordantRealigner.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-DiscordantRealigner.Tpo $(DEPDIR)/snowmanutils-DiscordantRealigner.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/DiscordantRealigner.cpp' object='snowmanutils-DiscordantRealigner.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-DiscordantRealigner.obj `if test -f '../Snowman/DiscordantRealigner.cpp'; then $(CYGPATH_W) '../Snowman/DiscordantRealigner.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/DiscordantRealigner.cpp'; fi`\n\nsnowmanutils-SnowmanOverlapAlgorithm.o: ../Snowman/SnowmanOverlapAlgorithm.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanOverlapAlgorithm.o -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanOverlapAlgorithm.Tpo -c -o snowmanutils-SnowmanOverlapAlgorithm.o `test -f '../Snowman/SnowmanOverlapAlgorithm.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanOverlapAlgorithm.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanOverlapAlgorithm.Tpo $(DEPDIR)/snowmanutils-SnowmanOverlapAlgorithm.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanOverlapAlgorithm.cpp' object='snowmanutils-SnowmanOverlapAlgorithm.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanOverlapAlgorithm.o `test -f '../Snowman/SnowmanOverlapAlgorithm.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanOverlapAlgorithm.cpp\n\nsnowmanutils-SnowmanOverlapAlgorithm.obj: ../Snowman/SnowmanOverlapAlgorithm.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanOverlapAlgorithm.obj -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanOverlapAlgorithm.Tpo -c -o snowmanutils-SnowmanOverlapAlgorithm.obj `if test -f '../Snowman/SnowmanOverlapAlgorithm.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanOverlapAlgorithm.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanOverlapAlgorithm.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanOverlapAlgorithm.Tpo $(DEPDIR)/snowmanutils-SnowmanOverlapAlgorithm.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanOverlapAlgorithm.cpp' object='snowmanutils-SnowmanOverlapAlgorithm.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanOverlapAlgorithm.obj `if test -f '../Snowman/SnowmanOverlapAlgorithm.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanOverlapAlgorithm.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanOverlapAlgorithm.cpp'; fi`\n\nsnowmanutils-SnowmanASQG.o: ../Snowman/SnowmanASQG.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanASQG.o -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanASQG.Tpo -c -o snowmanutils-SnowmanASQG.o `test -f '../Snowman/SnowmanASQG.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanASQG.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanASQG.Tpo $(DEPDIR)/snowmanutils-SnowmanASQG.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanASQG.cpp' object='snowmanutils-SnowmanASQG.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanASQG.o `test -f '../Snowman/SnowmanASQG.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanASQG.cpp\n\nsnowmanutils-SnowmanASQG.obj: ../Snowman/SnowmanASQG.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanASQG.obj -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanASQG.Tpo -c -o snowmanutils-SnowmanASQG.obj `if test -f '../Snowman/SnowmanASQG.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanASQG.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanASQG.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanASQG.Tpo $(DEPDIR)/snowmanutils-SnowmanASQG.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanASQG.cpp' object='snowmanutils-SnowmanASQG.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanASQG.obj `if test -f '../Snowman/SnowmanASQG.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanASQG.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanASQG.cpp'; fi`\n\nsnowmanutils-SnowmanAssemble.o: ../Snowman/SnowmanAssemble.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanAssemble.o -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanAssemble.Tpo -c -o snowmanutils-SnowmanAssemble.o `test -f '../Snowman/SnowmanAssemble.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanAssemble.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanAssemble.Tpo $(DEPDIR)/snowmanutils-SnowmanAssemble.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanAssemble.cpp' object='snowmanutils-SnowmanAssemble.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanAssemble.o `test -f '../Snowman/SnowmanAssemble.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanAssemble.cpp\n\nsnowmanutils-SnowmanAssemble.obj: ../Snowman/SnowmanAssemble.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanAssemble.obj -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanAssemble.Tpo -c -o snowmanutils-SnowmanAssemble.obj `if test -f '../Snowman/SnowmanAssemble.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanAssemble.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanAssemble.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanAssemble.Tpo $(DEPDIR)/snowmanutils-SnowmanAssemble.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanAssemble.cpp' object='snowmanutils-SnowmanAssemble.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanAssemble.obj `if test -f '../Snowman/SnowmanAssemble.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanAssemble.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanAssemble.cpp'; fi`\n\nsnowmanutils-KmerFilter.o: ../Snowman/KmerFilter.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-KmerFilter.o -MD -MP -MF $(DEPDIR)/snowmanutils-KmerFilter.Tpo -c -o snowmanutils-KmerFilter.o `test -f '../Snowman/KmerFilter.cpp' || echo '$(srcdir)/'`../Snowman/KmerFilter.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-KmerFilter.Tpo $(DEPDIR)/snowmanutils-KmerFilter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/KmerFilter.cpp' object='snowmanutils-KmerFilter.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-KmerFilter.o `test -f '../Snowman/KmerFilter.cpp' || echo '$(srcdir)/'`../Snowman/KmerFilter.cpp\n\nsnowmanutils-KmerFilter.obj: ../Snowman/KmerFilter.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-KmerFilter.obj -MD -MP -MF $(DEPDIR)/snowmanutils-KmerFilter.Tpo -c -o snowmanutils-KmerFilter.obj `if test -f '../Snowman/KmerFilter.cpp'; then $(CYGPATH_W) '../Snowman/KmerFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/KmerFilter.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-KmerFilter.Tpo $(DEPDIR)/snowmanutils-KmerFilter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/KmerFilter.cpp' object='snowmanutils-KmerFilter.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-KmerFilter.obj `if test -f '../Snowman/KmerFilter.cpp'; then $(CYGPATH_W) '../Snowman/KmerFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/KmerFilter.cpp'; fi`\n\nsnowmanutils-SnowmanBamWalker.o: ../Snowman/SnowmanBamWalker.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanBamWalker.o -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanBamWalker.Tpo -c -o snowmanutils-SnowmanBamWalker.o `test -f '../Snowman/SnowmanBamWalker.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanBamWalker.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanBamWalker.Tpo $(DEPDIR)/snowmanutils-SnowmanBamWalker.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanBamWalker.cpp' object='snowmanutils-SnowmanBamWalker.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanBamWalker.o `test -f '../Snowman/SnowmanBamWalker.cpp' || echo '$(srcdir)/'`../Snowman/SnowmanBamWalker.cpp\n\nsnowmanutils-SnowmanBamWalker.obj: ../Snowman/SnowmanBamWalker.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SnowmanBamWalker.obj -MD -MP -MF $(DEPDIR)/snowmanutils-SnowmanBamWalker.Tpo -c -o snowmanutils-SnowmanBamWalker.obj `if test -f '../Snowman/SnowmanBamWalker.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanBamWalker.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanBamWalker.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SnowmanBamWalker.Tpo $(DEPDIR)/snowmanutils-SnowmanBamWalker.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/SnowmanBamWalker.cpp' object='snowmanutils-SnowmanBamWalker.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SnowmanBamWalker.obj `if test -f '../Snowman/SnowmanBamWalker.cpp'; then $(CYGPATH_W) '../Snowman/SnowmanBamWalker.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/SnowmanBamWalker.cpp'; fi`\n\nsnowmanutils-SeqFrag.o: SeqFrag.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SeqFrag.o -MD -MP -MF $(DEPDIR)/snowmanutils-SeqFrag.Tpo -c -o snowmanutils-SeqFrag.o `test -f 'SeqFrag.cpp' || echo '$(srcdir)/'`SeqFrag.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SeqFrag.Tpo $(DEPDIR)/snowmanutils-SeqFrag.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='SeqFrag.cpp' object='snowmanutils-SeqFrag.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SeqFrag.o `test -f 'SeqFrag.cpp' || echo '$(srcdir)/'`SeqFrag.cpp\n\nsnowmanutils-SeqFrag.obj: SeqFrag.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SeqFrag.obj -MD -MP -MF $(DEPDIR)/snowmanutils-SeqFrag.Tpo -c -o snowmanutils-SeqFrag.obj `if test -f 'SeqFrag.cpp'; then $(CYGPATH_W) 'SeqFrag.cpp'; else $(CYGPATH_W) '$(srcdir)/SeqFrag.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SeqFrag.Tpo $(DEPDIR)/snowmanutils-SeqFrag.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='SeqFrag.cpp' object='snowmanutils-SeqFrag.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SeqFrag.obj `if test -f 'SeqFrag.cpp'; then $(CYGPATH_W) 'SeqFrag.cpp'; else $(CYGPATH_W) '$(srcdir)/SeqFrag.cpp'; fi`\n\nsnowmanutils-SimGenome.o: SimGenome.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SimGenome.o -MD -MP -MF $(DEPDIR)/snowmanutils-SimGenome.Tpo -c -o snowmanutils-SimGenome.o `test -f 'SimGenome.cpp' || echo '$(srcdir)/'`SimGenome.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SimGenome.Tpo $(DEPDIR)/snowmanutils-SimGenome.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='SimGenome.cpp' object='snowmanutils-SimGenome.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SimGenome.o `test -f 'SimGenome.cpp' || echo '$(srcdir)/'`SimGenome.cpp\n\nsnowmanutils-SimGenome.obj: SimGenome.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SimGenome.obj -MD -MP -MF $(DEPDIR)/snowmanutils-SimGenome.Tpo -c -o snowmanutils-SimGenome.obj `if test -f 'SimGenome.cpp'; then $(CYGPATH_W) 'SimGenome.cpp'; else $(CYGPATH_W) '$(srcdir)/SimGenome.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SimGenome.Tpo $(DEPDIR)/snowmanutils-SimGenome.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='SimGenome.cpp' object='snowmanutils-SimGenome.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SimGenome.obj `if test -f 'SimGenome.cpp'; then $(CYGPATH_W) 'SimGenome.cpp'; else $(CYGPATH_W) '$(srcdir)/SimGenome.cpp'; fi`\n\nsnowmanutils-BamSplitter.o: BamSplitter.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-BamSplitter.o -MD -MP -MF $(DEPDIR)/snowmanutils-BamSplitter.Tpo -c -o snowmanutils-BamSplitter.o `test -f 'BamSplitter.cpp' || echo '$(srcdir)/'`BamSplitter.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-BamSplitter.Tpo $(DEPDIR)/snowmanutils-BamSplitter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='BamSplitter.cpp' object='snowmanutils-BamSplitter.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-BamSplitter.o `test -f 'BamSplitter.cpp' || echo '$(srcdir)/'`BamSplitter.cpp\n\nsnowmanutils-BamSplitter.obj: BamSplitter.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-BamSplitter.obj -MD -MP -MF $(DEPDIR)/snowmanutils-BamSplitter.Tpo -c -o snowmanutils-BamSplitter.obj `if test -f 'BamSplitter.cpp'; then $(CYGPATH_W) 'BamSplitter.cpp'; else $(CYGPATH_W) '$(srcdir)/BamSplitter.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-BamSplitter.Tpo $(DEPDIR)/snowmanutils-BamSplitter.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='BamSplitter.cpp' object='snowmanutils-BamSplitter.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-BamSplitter.obj `if test -f 'BamSplitter.cpp'; then $(CYGPATH_W) 'BamSplitter.cpp'; else $(CYGPATH_W) '$(srcdir)/BamSplitter.cpp'; fi`\n\nsnowmanutils-SimTrainerWalker.o: SimTrainerWalker.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SimTrainerWalker.o -MD -MP -MF $(DEPDIR)/snowmanutils-SimTrainerWalker.Tpo -c -o snowmanutils-SimTrainerWalker.o `test -f 'SimTrainerWalker.cpp' || echo '$(srcdir)/'`SimTrainerWalker.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SimTrainerWalker.Tpo $(DEPDIR)/snowmanutils-SimTrainerWalker.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='SimTrainerWalker.cpp' object='snowmanutils-SimTrainerWalker.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SimTrainerWalker.o `test -f 'SimTrainerWalker.cpp' || echo '$(srcdir)/'`SimTrainerWalker.cpp\n\nsnowmanutils-SimTrainerWalker.obj: SimTrainerWalker.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-SimTrainerWalker.obj -MD -MP -MF $(DEPDIR)/snowmanutils-SimTrainerWalker.Tpo -c -o snowmanutils-SimTrainerWalker.obj `if test -f 'SimTrainerWalker.cpp'; then $(CYGPATH_W) 'SimTrainerWalker.cpp'; else $(CYGPATH_W) '$(srcdir)/SimTrainerWalker.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-SimTrainerWalker.Tpo $(DEPDIR)/snowmanutils-SimTrainerWalker.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='SimTrainerWalker.cpp' object='snowmanutils-SimTrainerWalker.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-SimTrainerWalker.obj `if test -f 'SimTrainerWalker.cpp'; then $(CYGPATH_W) 'SimTrainerWalker.cpp'; else $(CYGPATH_W) '$(srcdir)/SimTrainerWalker.cpp'; fi`\n\nsnowmanutils-Fractions.o: Fractions.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-Fractions.o -MD -MP -MF $(DEPDIR)/snowmanutils-Fractions.Tpo -c -o snowmanutils-Fractions.o `test -f 'Fractions.cpp' || echo '$(srcdir)/'`Fractions.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-Fractions.Tpo $(DEPDIR)/snowmanutils-Fractions.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='Fractions.cpp' object='snowmanutils-Fractions.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-Fractions.o `test -f 'Fractions.cpp' || echo '$(srcdir)/'`Fractions.cpp\n\nsnowmanutils-Fractions.obj: Fractions.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-Fractions.obj -MD -MP -MF $(DEPDIR)/snowmanutils-Fractions.Tpo -c -o snowmanutils-Fractions.obj `if test -f 'Fractions.cpp'; then $(CYGPATH_W) 'Fractions.cpp'; else $(CYGPATH_W) '$(srcdir)/Fractions.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-Fractions.Tpo $(DEPDIR)/snowmanutils-Fractions.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='Fractions.cpp' object='snowmanutils-Fractions.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-Fractions.obj `if test -f 'Fractions.cpp'; then $(CYGPATH_W) 'Fractions.cpp'; else $(CYGPATH_W) '$(srcdir)/Fractions.cpp'; fi`\n\nsnowmanutils-STCoverage.o: ../Snowman/STCoverage.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-STCoverage.o -MD -MP -MF $(DEPDIR)/snowmanutils-STCoverage.Tpo -c -o snowmanutils-STCoverage.o `test -f '../Snowman/STCoverage.cpp' || echo '$(srcdir)/'`../Snowman/STCoverage.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-STCoverage.Tpo $(DEPDIR)/snowmanutils-STCoverage.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/STCoverage.cpp' object='snowmanutils-STCoverage.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-STCoverage.o `test -f '../Snowman/STCoverage.cpp' || echo '$(srcdir)/'`../Snowman/STCoverage.cpp\n\nsnowmanutils-STCoverage.obj: ../Snowman/STCoverage.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-STCoverage.obj -MD -MP -MF $(DEPDIR)/snowmanutils-STCoverage.Tpo -c -o snowmanutils-STCoverage.obj `if test -f '../Snowman/STCoverage.cpp'; then $(CYGPATH_W) '../Snowman/STCoverage.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/STCoverage.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-STCoverage.Tpo $(DEPDIR)/snowmanutils-STCoverage.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/STCoverage.cpp' object='snowmanutils-STCoverage.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-STCoverage.obj `if test -f '../Snowman/STCoverage.cpp'; then $(CYGPATH_W) '../Snowman/STCoverage.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/STCoverage.cpp'; fi`\n\nsnowmanutils-Histogram.o: ../Snowman/Histogram.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-Histogram.o -MD -MP -MF $(DEPDIR)/snowmanutils-Histogram.Tpo -c -o snowmanutils-Histogram.o `test -f '../Snowman/Histogram.cpp' || echo '$(srcdir)/'`../Snowman/Histogram.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-Histogram.Tpo $(DEPDIR)/snowmanutils-Histogram.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/Histogram.cpp' object='snowmanutils-Histogram.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-Histogram.o `test -f '../Snowman/Histogram.cpp' || echo '$(srcdir)/'`../Snowman/Histogram.cpp\n\nsnowmanutils-Histogram.obj: ../Snowman/Histogram.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-Histogram.obj -MD -MP -MF $(DEPDIR)/snowmanutils-Histogram.Tpo -c -o snowmanutils-Histogram.obj `if test -f '../Snowman/Histogram.cpp'; then $(CYGPATH_W) '../Snowman/Histogram.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/Histogram.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-Histogram.Tpo $(DEPDIR)/snowmanutils-Histogram.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/Histogram.cpp' object='snowmanutils-Histogram.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-Histogram.obj `if test -f '../Snowman/Histogram.cpp'; then $(CYGPATH_W) '../Snowman/Histogram.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/Histogram.cpp'; fi`\n\nsnowmanutils-BamStats.o: ../Snowman/BamStats.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-BamStats.o -MD -MP -MF $(DEPDIR)/snowmanutils-BamStats.Tpo -c -o snowmanutils-BamStats.o `test -f '../Snowman/BamStats.cpp' || echo '$(srcdir)/'`../Snowman/BamStats.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-BamStats.Tpo $(DEPDIR)/snowmanutils-BamStats.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/BamStats.cpp' object='snowmanutils-BamStats.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-BamStats.o `test -f '../Snowman/BamStats.cpp' || echo '$(srcdir)/'`../Snowman/BamStats.cpp\n\nsnowmanutils-BamStats.obj: ../Snowman/BamStats.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-BamStats.obj -MD -MP -MF $(DEPDIR)/snowmanutils-BamStats.Tpo -c -o snowmanutils-BamStats.obj `if test -f '../Snowman/BamStats.cpp'; then $(CYGPATH_W) '../Snowman/BamStats.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/BamStats.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-BamStats.Tpo $(DEPDIR)/snowmanutils-BamStats.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='../Snowman/BamStats.cpp' object='snowmanutils-BamStats.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-BamStats.obj `if test -f '../Snowman/BamStats.cpp'; then $(CYGPATH_W) '../Snowman/BamStats.cpp'; else $(CYGPATH_W) '$(srcdir)/../Snowman/BamStats.cpp'; fi`\n\nsnowmanutils-PowerLawSim.o: PowerLawSim.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-PowerLawSim.o -MD -MP -MF $(DEPDIR)/snowmanutils-PowerLawSim.Tpo -c -o snowmanutils-PowerLawSim.o `test -f 'PowerLawSim.cpp' || echo '$(srcdir)/'`PowerLawSim.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-PowerLawSim.Tpo $(DEPDIR)/snowmanutils-PowerLawSim.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='PowerLawSim.cpp' object='snowmanutils-PowerLawSim.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-PowerLawSim.o `test -f 'PowerLawSim.cpp' || echo '$(srcdir)/'`PowerLawSim.cpp\n\nsnowmanutils-PowerLawSim.obj: PowerLawSim.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-PowerLawSim.obj -MD -MP -MF $(DEPDIR)/snowmanutils-PowerLawSim.Tpo -c -o snowmanutils-PowerLawSim.obj `if test -f 'PowerLawSim.cpp'; then $(CYGPATH_W) 'PowerLawSim.cpp'; else $(CYGPATH_W) '$(srcdir)/PowerLawSim.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-PowerLawSim.Tpo $(DEPDIR)/snowmanutils-PowerLawSim.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='PowerLawSim.cpp' object='snowmanutils-PowerLawSim.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-PowerLawSim.obj `if test -f 'PowerLawSim.cpp'; then $(CYGPATH_W) 'PowerLawSim.cpp'; else $(CYGPATH_W) '$(srcdir)/PowerLawSim.cpp'; fi`\n\nsnowmanutils-AssemblyBamWalker.o: AssemblyBamWalker.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-AssemblyBamWalker.o -MD -MP -MF $(DEPDIR)/snowmanutils-AssemblyBamWalker.Tpo -c -o snowmanutils-AssemblyBamWalker.o `test -f 'AssemblyBamWalker.cpp' || echo '$(srcdir)/'`AssemblyBamWalker.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-AssemblyBamWalker.Tpo $(DEPDIR)/snowmanutils-AssemblyBamWalker.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='AssemblyBamWalker.cpp' object='snowmanutils-AssemblyBamWalker.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-AssemblyBamWalker.o `test -f 'AssemblyBamWalker.cpp' || echo '$(srcdir)/'`AssemblyBamWalker.cpp\n\nsnowmanutils-AssemblyBamWalker.obj: AssemblyBamWalker.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-AssemblyBamWalker.obj -MD -MP -MF $(DEPDIR)/snowmanutils-AssemblyBamWalker.Tpo -c -o snowmanutils-AssemblyBamWalker.obj `if test -f 'AssemblyBamWalker.cpp'; then $(CYGPATH_W) 'AssemblyBamWalker.cpp'; else $(CYGPATH_W) '$(srcdir)/AssemblyBamWalker.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-AssemblyBamWalker.Tpo $(DEPDIR)/snowmanutils-AssemblyBamWalker.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='AssemblyBamWalker.cpp' object='snowmanutils-AssemblyBamWalker.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-AssemblyBamWalker.obj `if test -f 'AssemblyBamWalker.cpp'; then $(CYGPATH_W) 'AssemblyBamWalker.cpp'; else $(CYGPATH_W) '$(srcdir)/AssemblyBamWalker.cpp'; fi`\n\nsnowmanutils-assembly2vcf.o: assembly2vcf.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-assembly2vcf.o -MD -MP -MF $(DEPDIR)/snowmanutils-assembly2vcf.Tpo -c -o snowmanutils-assembly2vcf.o `test -f 'assembly2vcf.cpp' || echo '$(srcdir)/'`assembly2vcf.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-assembly2vcf.Tpo $(DEPDIR)/snowmanutils-assembly2vcf.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='assembly2vcf.cpp' object='snowmanutils-assembly2vcf.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-assembly2vcf.o `test -f 'assembly2vcf.cpp' || echo '$(srcdir)/'`assembly2vcf.cpp\n\nsnowmanutils-assembly2vcf.obj: assembly2vcf.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT snowmanutils-assembly2vcf.obj -MD -MP -MF $(DEPDIR)/snowmanutils-assembly2vcf.Tpo -c -o snowmanutils-assembly2vcf.obj `if test -f 'assembly2vcf.cpp'; then $(CYGPATH_W) 'assembly2vcf.cpp'; else $(CYGPATH_W) '$(srcdir)/assembly2vcf.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/snowmanutils-assembly2vcf.Tpo $(DEPDIR)/snowmanutils-assembly2vcf.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='assembly2vcf.cpp' object='snowmanutils-assembly2vcf.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(snowmanutils_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o snowmanutils-assembly2vcf.obj `if test -f 'assembly2vcf.cpp'; then $(CYGPATH_W) 'assembly2vcf.cpp'; else $(CYGPATH_W) '$(srcdir)/assembly2vcf.cpp'; fi`\n\nID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)\n\tlist='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tmkid -fID $$unique\ntags: TAGS\n\nTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tset x; \\\n\there=`pwd`; \\\n\tlist='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: CTAGS\nCTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tlist='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t$(am__remove_distdir)\n\ttest -d \"$(distdir)\" || mkdir \"$(distdir)\"\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t-test -n \"$(am__skip_mode_fix)\" \\\n\t|| find \"$(distdir)\" -type d ! -perm -755 \\\n\t\t-exec chmod u+rwx,go+rx {} \\; -o \\\n\t  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -400 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \\; \\\n\t|| chmod -R a+r \"$(distdir)\"\ndist-gzip: distdir\n\ttardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz\n\t$(am__remove_distdir)\n\ndist-bzip2: distdir\n\ttardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2\n\t$(am__remove_distdir)\n\ndist-lzma: distdir\n\ttardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma\n\t$(am__remove_distdir)\n\ndist-xz: distdir\n\ttardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz\n\t$(am__remove_distdir)\n\ndist-tarZ: distdir\n\ttardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z\n\t$(am__remove_distdir)\n\ndist-shar: distdir\n\tshar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz\n\t$(am__remove_distdir)\n\ndist-zip: distdir\n\t-rm -f $(distdir).zip\n\tzip -rq $(distdir).zip $(distdir)\n\t$(am__remove_distdir)\n\ndist dist-all: distdir\n\ttardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz\n\t$(am__remove_distdir)\n\n# This target untars the dist file and tries a VPATH configuration.  Then\n# it guarantees that the distribution is self-contained by making another\n# tarfile.\ndistcheck: dist\n\tcase '$(DIST_ARCHIVES)' in \\\n\t*.tar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\\\n\t*.tar.bz2*) \\\n\t  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\\\n\t*.tar.lzma*) \\\n\t  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\\\n\t*.tar.xz*) \\\n\t  xz -dc $(distdir).tar.xz | $(am__untar) ;;\\\n\t*.tar.Z*) \\\n\t  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\\\n\t*.shar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\\\n\t*.zip*) \\\n\t  unzip $(distdir).zip ;;\\\n\tesac\n\tchmod -R a-w $(distdir); chmod u+w $(distdir)\n\tmkdir $(distdir)/_build\n\tmkdir $(distdir)/_inst\n\tchmod a-w $(distdir)\n\ttest -d $(distdir)/_build || exit 0; \\\n\tdc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\\\/]:[\\\\/],/,'` \\\n\t  && dc_destdir=\"$${TMPDIR-/tmp}/am-dc-$$$$/\" \\\n\t  && am__cwd=`pwd` \\\n\t  && $(am__cd) $(distdir)/_build \\\n\t  && ../configure --srcdir=.. --prefix=\"$$dc_install_base\" \\\n\t    $(DISTCHECK_CONFIGURE_FLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dvi \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) check \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) install \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) installcheck \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) uninstall \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir=\"$$dc_install_base\" \\\n\t        distuninstallcheck \\\n\t  && chmod -R a-w \"$$dc_install_base\" \\\n\t  && ({ \\\n\t       (cd ../.. && umask 077 && mkdir \"$$dc_destdir\") \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" install \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" uninstall \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" \\\n\t            distuninstallcheck_dir=\"$$dc_destdir\" distuninstallcheck; \\\n\t      } || { rm -rf \"$$dc_destdir\"; exit 1; }) \\\n\t  && rm -rf \"$$dc_destdir\" \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dist \\\n\t  && rm -rf $(DIST_ARCHIVES) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \\\n\t  && cd \"$$am__cwd\" \\\n\t  || exit 1\n\t$(am__remove_distdir)\n\t@(echo \"$(distdir) archives ready for distribution: \"; \\\n\t  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \\\n\t  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'\ndistuninstallcheck:\n\t@$(am__cd) '$(distuninstallcheck_dir)' \\\n\t&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \\\n\t   || { echo \"ERROR: files left after uninstall:\" ; \\\n\t        if test -n \"$(DESTDIR)\"; then \\\n\t          echo \"  (check DESTDIR support)\"; \\\n\t        fi ; \\\n\t        $(distuninstallcheck_listfiles) ; \\\n\t        exit 1; } >&2\ndistcleancheck: distclean\n\t@if test '$(srcdir)' = . ; then \\\n\t  echo \"ERROR: distcleancheck can only run from a VPATH build\" ; \\\n\t  exit 1 ; \\\n\tfi\n\t@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \\\n\t  || { echo \"ERROR: files left in build directory after distclean:\" ; \\\n\t       $(distcleancheck_listfiles) ; \\\n\t       exit 1; } >&2\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(PROGRAMS) config.h\ninstalldirs:\n\tfor dir in \"$(DESTDIR)$(bindir)\"; do \\\n\t  test -z \"$$dir\" || $(MKDIR_P) \"$$dir\"; \\\n\tdone\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\t$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t  install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t  `test -z '$(STRIP)' || \\\n\t    echo \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\"` install\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-binPROGRAMS clean-generic mostlyclean-am\n\ndistclean: distclean-am\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-hdr distclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am: install-binPROGRAMS\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -rf $(top_srcdir)/autom4te.cache\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am: uninstall-binPROGRAMS\n\n.MAKE: all install-am install-strip\n\n.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \\\n\tclean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \\\n\tdist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \\\n\tdistcheck distclean distclean-compile distclean-generic \\\n\tdistclean-hdr distclean-tags distcleancheck distdir \\\n\tdistuninstallcheck dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-binPROGRAMS install-data \\\n\tinstall-data-am install-dvi install-dvi-am install-exec \\\n\tinstall-exec-am install-html install-html-am install-info \\\n\tinstall-info-am install-man install-pdf install-pdf-am \\\n\tinstall-ps install-ps-am install-strip installcheck \\\n\tinstallcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-compile \\\n\tmostlyclean-generic pdf pdf-am ps ps-am tags uninstall \\\n\tuninstall-am uninstall-binPROGRAMS\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/svabautils/PowerLawSim.cpp",
    "content": "#include \"PowerLawSim.h\"\n#include \"SnowmanUtils.h\"\n\n#include <cmath>\n#include <string>\n#include <cassert>\n#include <algorithm>\n#include <unordered_set>\n\n#define MAX_DUP_DEL_INV_SIZE 2000\n#define MAX_RAR_SIZE 35e6\n#define EVENT_BUFFER 4000\n\nvoid PowerLawSim(faidx_t* findex, int num_breaks, double power_law, SeqLib::GRC& grc, std::ofstream& outfasta, std::ofstream& events) {\n\n  double frac_inter = 0.05;\n\n  bool verbose = false;\n\n  // generate the random numbers\n  std::vector<int> rpower = drawFromPower(1, MAX_RAR_SIZE, power_law, num_breaks);\n  // generate again, but for small indels\n  std::vector<int> small_indels2 = drawFromPower(1, 10, -3, num_breaks / 4);\n  // generate inter-chr\n  size_t num_intra = rpower.size() + small_indels2.size();\n  std::vector<int> inter_chr((double)num_intra / (1-frac_inter) - num_intra, -1);\n  rpower.insert(rpower.end(), small_indels2.begin(), small_indels2.end());\n  rpower.insert(rpower.end(), inter_chr.begin(), inter_chr.end());\n  std::random_shuffle(rpower.begin(), rpower.end());\n\n  // check\n  for (auto& i : rpower)\n    assert(i <= MAX_RAR_SIZE);\n\n  const char TCGA[5] = \"TCGA\";\n\n  // get random inserts\n  std::vector<std::string> inserts;\n  std::vector<int> rsize = drawFromPower(1, 20, -2, num_breaks);\n  for (int i = 0; i < num_breaks; ++i) {\n    if (rand() % 2 == 0) {\n      inserts.push_back(std::string());\n      continue;\n    }\n    std::string is(rsize[i], 'N');\n    for (size_t j = 0; j < is.length(); ++j)\n      is[j] = TCGA[rand() % 3];      \n    inserts.push_back(is);\n  }\n\n  SVEvent e;\n  std::string ename, etype;\n  for (int i = 0; i < num_breaks; ++i) {\n\n    e.number = i;\n    if (i % 500 == 0)\n      std::cerr << \"working on \" << i << \" of \" << num_breaks << std::endl;\n    \n    int rval = rand() % 3;\n    std::string frag, outstring;\n\n    if (rpower[i] == -1) {\n\n      etype = \"INT\";\n      ename = \"tumor-\" + std::to_string(i) + \"-\" + etype;\n      if (verbose) std::cerr << \"...generating inter-chr \" << std::endl;\n      genRandomSequence(frag, e.reg1, EVENT_BUFFER, findex, grc);\n      std::string frag_ic;\n      do { \n\tgenRandomSequence(frag_ic, e.reg2, EVENT_BUFFER, findex, grc);\n      } while (e.reg1.chr == e.reg2.chr);\n\n      outstring = frag + inserts[i] + frag_ic;\n\n      events << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << e.reg1.pos2 << \"\\t\" << SeqLib::CHR_NAME[e.reg2.chr] << \"\\t\" << e.reg2.pos1 << \"\\t+\\t-\\t\" << \"N\\t-1\\tINT\\t\" << (inserts[i].empty() ? \"N\" : inserts[i]) << \"\\t\" << ename << std::endl;\n\n    // deletion\n    } else if (rpower[i] <= 50 && rand() % 2) {\n      etype = \"del\";\n      ename = \"tumor-\" + std::to_string(i) + \"-\" + etype;\n      if (verbose) std::cerr << \"...generating deletion of length \" << rpower[i] << std::endl;      \n      genRandomSequence(frag, e.reg1, EVENT_BUFFER * 2 + rpower[i], findex, grc);\n      try {outstring = frag.substr(0, EVENT_BUFFER) + frag.substr(EVENT_BUFFER + rpower[i], frag.length() - rpower[i] - EVENT_BUFFER);} catch (...) { std::cerr << \" len \" << (frag.length() - rpower[i] - EVENT_BUFFER)  << std::endl; } \n      assert(outstring.length() < EVENT_BUFFER * 10);\n      events << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << (e.reg1.pos1+EVENT_BUFFER) << \"\\t\" << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << (e.reg1.pos1 + EVENT_BUFFER + rpower[i]) << \"\\t+\\t-\\tN\\t\" << rpower[i] << \"\\tdel\\tN\\t\" << ename << std::endl;\n    // insertion\n    } else if (rpower[i] <= 50) {\n      etype = \"ins\";\n      ename = \"tumor-\" + std::to_string(i) + \"-\" + etype;\n      if (verbose) std::cerr << \"...generating insertion of length \" << rpower[i] << std::endl;      \n      genRandomSequence(frag, e.reg1, EVENT_BUFFER * 2, findex, grc);\n      std::string ins(rpower[i], 'N');\n      for (int y = 0; y < rpower[i]; ++y) \n\tins[y] = TCGA[rand() % 3];\n      outstring = frag.substr(0, EVENT_BUFFER) + ins + frag.substr(EVENT_BUFFER, frag.length() - EVENT_BUFFER);\n      assert(outstring.length() < EVENT_BUFFER * 10);\n      events << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << (e.reg1.pos1+EVENT_BUFFER) << \"\\t\" << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << (e.reg1.pos1 + EVENT_BUFFER + 1) << \"\\t+\\t-\\t\" << ins << \"\\t\" << rpower[i] << \"\\tins\\tN\\t\" << ename << std::endl;\n    // TANDEM DUPLICATION\n    } else if (rpower[i] < MAX_DUP_DEL_INV_SIZE && rval == 0) {\n      etype = \"DUP\";\n      ename = \"tumor-\" + std::to_string(i) + \"-\" + etype;\n      if (verbose) std::cerr << \"...generating DUP of length \" << rpower[i] << std::endl;      \n      genRandomSequence(frag, e.reg1, EVENT_BUFFER * 2 + rpower[i], findex, grc);\n      outstring = frag.substr(0, EVENT_BUFFER + rpower[i]) + inserts[i] + frag.substr(EVENT_BUFFER, frag.length() - EVENT_BUFFER); //rpower[i]) + frag.substr(EVENT_BUFFER, frag.length() - EVENT_BUFFER);\n      assert(outstring.length() < EVENT_BUFFER * 10);\n      events << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << (e.reg1.pos1+EVENT_BUFFER+rpower[i]) << \"\\t\" << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << (e.reg1.pos1 + EVENT_BUFFER) << \"\\t+\\t-\\t\" << \"N\" << \"\\t\" << rpower[i] << \"\\tDUP\\t\" << (inserts[i].empty() ? \"N\" : inserts[i]) << \"\\t\" << ename << std::endl;\n    // DELETION\n    } else if (rpower[i] < MAX_DUP_DEL_INV_SIZE && rval == 1) {\n      etype = \"DEL\";\n      ename = \"tumor-\" + std::to_string(i) + \"-\" + etype;\n      if (verbose) std::cerr << \"...generating DEL of length \" << rpower[i] << std::endl;      \n      genRandomSequence(frag, e.reg1, rpower[i] + EVENT_BUFFER * 2, findex, grc);\n      outstring = frag.substr(0, EVENT_BUFFER) + inserts[i] + frag.substr(EVENT_BUFFER + rpower[i], frag.length() - EVENT_BUFFER - rpower[i]);\n      assert(outstring.length() < EVENT_BUFFER * 10);\n      events << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << (e.reg1.pos1+EVENT_BUFFER) << \"\\t\" << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << (e.reg1.pos1 + EVENT_BUFFER + rpower[i]) << \"\\t+\\t-\\tN\\t\" << rpower[i] << \"\\tDEL\\t\" << (inserts[i].empty() ? \"N\" : inserts[i]) << \"\\t\" << ename << std::endl;\n    // INV\n    } else if (rpower[i] < MAX_DUP_DEL_INV_SIZE && rval == 2 && false) {\n      etype = \"INV\";\n      ename = \"tumor-\" + std::to_string(i) + \"-\" + etype;\n      if (verbose) std::cerr << \"...generating INV of length \" << rpower[i] << std::endl;      \n      genRandomSequence(frag, e.reg1, rpower[i] + EVENT_BUFFER * 2, findex, grc);\n      std::string inv_frag = frag.substr(EVENT_BUFFER, rpower[i]);\n      std::reverse(inv_frag.begin(), inv_frag.end());\n      outstring = frag.substr(0, EVENT_BUFFER) + inv_frag + frag.substr(EVENT_BUFFER, frag.length() - EVENT_BUFFER - rpower[i]);\n      assert(outstring.length() < EVENT_BUFFER * 10);\n      events << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << (e.reg1.pos1+EVENT_BUFFER) << \"\\t\" << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << (e.reg1.pos1 + EVENT_BUFFER + rpower[i]) << \"\\t+\\t-\\tN\\t\" << rpower[i] << \"\\tINV\\t\" << (inserts[i].empty() ? \"N\" : inserts[i]) << \"\\t\" << ename << std::endl;\n    } else  {\n      etype = \"RAR\";\n      ename = \"tumor-\" + std::to_string(i) + \"-\" + etype;\n      if (verbose) std::cerr << \"...generating RAR of length \" << rpower[i] << std::endl;      \n      genRandomSequence(frag, e.reg1, EVENT_BUFFER, findex, grc);\n      bool leftfit  = e.reg1.pos1 - rpower[i] > 1e6;\n      bool rightfit = e.reg1.pos2 + rpower[i] < SeqLib::CHR_LEN[e.reg1.chr];\n      int rrr = -1;\n      if (leftfit && rightfit)\n\trrr = rand() % 2;\n      else if (leftfit)\n\trrr = 0;\n      else if (rightfit)\n\trrr = 1;\n      \n      // rearrange to left\n      std::string seq2;\n      if (rrr == 0) {\n\n\tif (verbose) \n\t  std::cerr << \"...generating LEFT RAR of length \" << rpower[i] << std::endl;      \n\n\tSeqLib::GenomicRegion gr(e.reg1.chr, e.reg1.pos1 - rpower[i] - EVENT_BUFFER, e.reg1.pos1 - rpower[i]);\n\tstd::string chrstring = SeqLib::CHR_NAME[e.reg1.chr];\n\tint len;\n\tchar * seq = faidx_fetch_seq(findex, const_cast<char*>(chrstring.c_str()), gr.pos1, gr.pos2 - 1, &len);\n\tif (!seq)\n\t  break;\n\telse\n\t  seq2 = std::string(seq);\n\n        outstring = seq2 + inserts[i] + frag;\n\tassert(outstring.length() < EVENT_BUFFER * 10);\n\tevents << SeqLib::CHR_NAME[gr.chr] << \"\\t\" << gr.pos2 << \"\\t\" << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << e.reg1.pos1 << \"\\t+\\t-\\tN\\t\" << rpower[i] << \"\\tRAR\\t\" << (inserts[i].empty() ? \"N\" : inserts[i]) << \"\\t\" << ename << std::endl;\n\t//std::cerr << rpower[i] << \" span \" << (std::abs(gr.pos2 - e.reg1.pos1) - rpower[i]) << std::endl;\n\tassert(rpower[i] == (e.reg1.pos1 - gr.pos2));\n\n\n      // rearrange to right\n      } else if (rrr == 1) {\n\n\tif (verbose) \n\t  std::cerr << \"...generating RIGHT RAR of length \" << rpower[i] << std::endl;      \n\tSeqLib::GenomicRegion gr(e.reg1.chr, e.reg1.pos2 + rpower[i], e.reg1.pos2 + rpower[i] + EVENT_BUFFER);\n\tstd::string chrstring = SeqLib::CHR_NAME[gr.chr];\n\tint len;\n\tchar * seq = faidx_fetch_seq(findex, const_cast<char*>(chrstring.c_str()), gr.pos1, gr.pos2 - 1, &len);\n\tif (!seq)\n\t  break;\n\telse\n\t  seq2 = std::string(seq);\n\n\tevents << SeqLib::CHR_NAME[e.reg1.chr] << \"\\t\" << e.reg1.pos2 << \"\\t\" << SeqLib::CHR_NAME[gr.chr] << \"\\t\" << gr.pos1 << \"\\t+\\t-\\tN\\t\" << rpower[i] << \"\\tRAR\\t\" << (inserts[i].empty() ? \"N\" : inserts[i]) << \"\\t\" << ename << std::endl;\t\n        outstring = frag + inserts[i] + seq2;\n\tassert(outstring.length() < EVENT_BUFFER * 10);\n\t//std::cerr << rpower[i] << \" span \" << (std::abs(gr.pos1 - e.reg1.pos2) - rpower[i]) << std::endl;\n\tassert(rpower[i] == gr.pos1 - e.reg1.pos2);\n\n      // rearrangement doesn't fit\n      } else {\n\tif (verbose) std::cerr << \"FAILED TO FIT RAR of length \" << rpower[i] << \" on break \" << e.reg1 << std::endl;\n      }\n\n      \n    }\n\n    assert(outstring.length() < 50000);\n    if (!outstring.empty())\n      outfasta << \">\" << ename << std::endl << outstring << std::endl;\n    else \n      std::cerr << \"...empty string on rar \" << i << std::endl;\n    \n  }\n\n}\n\nstd::vector<int> drawFromPower(double x0, double x1, double power, int n_draws) {\n\n  assert(power != -1);\n\n  const int PRECISION = 1e6;\n\n  std::vector<int> rpower(n_draws, 0);\n  \n  for (int i = 0; i < n_draws; ++i) {\n    double r = (double)(rand() % PRECISION)/(double)PRECISION;\n    double t1 = std::pow(x1, power+1);\n    double t2 = std::pow(x0, power+1);\n    double tsum = (t1-t2) * r + t2;\n    rpower[i] = std::floor(std::pow(tsum, 1 / (power + 1)));\n  }\n\n  return rpower;\n}\n\nvoid genRandomSequence(std::string& s, SeqLib::GenomicRegion& gr, int width, faidx_t * findex, SeqLib::GRC& grc) {\n\n  gr.chr = SnowmanUtils::weightedRandom(SeqLib::CHR_CUMSUM_WEIGHT_X);\n  std::string chrstring = SeqLib::CHR_NAME[gr.chr];\n  char * seq = nullptr;\n  int len;\n  // get the first sequence\n  do {\n    if (seq)\n      free(seq);\n    seq = nullptr;\n    s = std::string();\n    gr.pos1 = 1e6 + rand() % (int)(SeqLib::CHR_LEN_VEC[gr.chr] - 2e6);\n    gr.pos2 = gr.pos1 + width;\n    seq = faidx_fetch_seq(findex, const_cast<char*>(chrstring.c_str()), gr.pos1, gr.pos2 - 1, &len);\n    if (seq)\n      s = std::string(seq);\n  } while (!seq || s.find(\"N\") != std::string::npos || grc.CountOverlaps(gr));\n\n}\n"
  },
  {
    "path": "src/svabautils/PowerLawSim.h",
    "content": "#ifndef SNOWMAN_POWER_LAW_SIM_HH\n#define SNOWMAN_POWER_LAW_SIM_HH\n\n#include <fstream>\n\n#include \"SeqLib/GenomicRegionCollection.h\"\n#include \"SeqLib/BWAWrapper.h\"\n\nvoid PowerLawSim(faidx_t* findex, int num_breaks, double power_law, SeqLib::GRC& grc, \n\t\t std::ofstream& outfasta, std::ofstream& events);\nstd::vector<int> drawFromPower(double x0, double x1, double power, int n_draws);\nvoid genRandomSequence(std::string& s, SeqLib::GenomicRegion& gr, int width, faidx_t * findex, SeqLib::GRC& grc);\n\nstruct SVEvent {\n  \n  SeqLib::GenomicRegion reg1;\n  SeqLib::GenomicRegion reg2;\n  \n  int break1;\n  int break2;\n\n  std::string ins;\n  std::string r_ins;\n\n  std::string etype;\n\n  int number;\n};\n\n#endif\n"
  },
  {
    "path": "src/svabautils/ReadSim.cpp",
    "content": "#include \"ReadSim.h\"\n\n#include <iostream>\n#include <random>\n#include <cassert>\n\nvoid ReadSim::addAllele(const std::string& s, double af) {\n  \n  if (m_seq.size() && m_seq.back().length() != s.length()) {\n    std::cerr << \"ReadSim::addAllele error. Expecting sequences to be same size\" << std::endl;\n    exit(EXIT_FAILURE);\n  }\n\n  if (af <= 0 || af > 1) {\n    std::cerr << \"ReadSim::addAllele error. Expecting allelic fraction > 0 and <= 1. value is \" << af << std::endl;\n    exit(EXIT_FAILURE);\n  }\n    \n  m_seq.push_back(s);\n  m_frac.push_back(af);\n\n}\n\nint ReadSim::__random_allele(std::vector<double>& cs) const {\n  \n  // get a random allele\n  size_t al = 0;\n  uint32_t rval = rand() % 100000;\n  \n  double rand_allele = rval % 100000;\n  while (al < cs.size()) {\n    if (rand_allele <= cs[al] * 100000) \n      break;\n    ++al;\n  }\n  \n  return al;\n\n}\n\ndouble ReadSim::__get_cumsum(std::vector<double>& cs) const {\n\n  double csum = 0;\n  for (size_t i = 0; i < m_frac.size(); ++i) {\n    csum += m_frac[i];\n    cs.push_back(csum);\n  }\n  \n  if (csum < 0.999 || csum > 1.001) {\n    std::cerr << \"ReadSim::addSequence: Expecting sum of allelic fractions = 1. Sum is \" << csum << std::endl;\n    return csum;\n  }\n  return csum;\n}\n\nvoid ReadSim::sampleReadsToCoverage(std::vector<std::string>& reads, int cov, \n\t\t\t\t    double error_rate, double ins_error_rate, double del_error_rate, \n\t\t\t\t    int readlen) {\n\n  // check validity\n  if (m_seq.size() == 0) {\n    std::cerr << \"ReadSim::sampleReadsToCoverage: No sequences. Add with ReadSim::addSequence\" << std::endl;\n    return;\n  }\n\n  // how many smaples to get desired coverage?\n  size_t seqlen = m_seq[0].length();\n  int ns = cov * seqlen / readlen;\n\n  uint32_t maxstart = seqlen - readlen;\n\n  // get cumulative sum for sampling\n  std::vector<double> m_frac_cumsum;\n  __get_cumsum(m_frac_cumsum);\n\n  // loop through num samples and start sampling\n  for (int i = 0; i < ns; ++i) {\n\n    // random allele\n    int al = __random_allele(m_frac_cumsum);\n\n    // get a random subsequence\n    //uint32_t rstart;\n    uint32_t rstart = rand() % maxstart;\n    std::string s = m_seq[al].substr(rstart, readlen);\n    \n    // add the errors\n    makeSNVErrors(s, error_rate);\n\n    // add the insertion errors\n    if (rand() % 100000 > ins_error_rate*100000)\n      makeInsErrors(s);\n\n    // only make sometimes\n    if (rand() % 100000 > del_error_rate*100000)\n      makeDelErrors(s, rstart, m_seq[al]);\n\n    reads.push_back(s);\n  }\n  \n}\n\nvoid ReadSim::samplePairedEndReadsToCoverage(std::vector<std::string>& reads1, std::vector<std::string>& reads2, \n\t\t\t\t\t     std::vector<std::string>& qual1, std::vector<std::string>& qual2, \n\t\t\t\t\t     int cov, double error_rate, double ins_error_rate, double del_error_rate, \n\t\t\t\t\t     int readlen, \n\t\t\t\t\t     double mean_isize, double sd_isize, const std::vector<std::string>& qual_dist) {\n  // check validity\n  if (m_seq.size() == 0) {\n    std::cerr << \"ReadSim::samplePairedEndReadsToCoverage: No sequences. Add with ReadSim::addSequence\" << std::endl;\n    return;\n  }\n\n  // how many samples to get desired coverage?\n  size_t seqlen = m_seq[0].length();\n  int ns = cov * seqlen / readlen / 2;\n\n  // get cumulative sum for sampling\n  std::vector<double> m_frac_cumsum;\n  __get_cumsum(m_frac_cumsum);\n\n  // setup random number generator for isize\n  std::default_random_engine generator(rand());\n  std::normal_distribution<double> distribution(mean_isize, sd_isize);\n  \n  // loop through num samples and start sampling\n  for (int i = 0; i < ns; ++i) {\n\n    if (i % 100000 == 0)\n      std::cerr << \"...sampling read \" << i << \" of \" << ns << std::endl;\n\n    // get a random isize\n    int isize = distribution(generator);\n\n    uint32_t maxstart = seqlen - readlen*2 - isize;\n\n    // random allele\n    int al = __random_allele(m_frac_cumsum);\n\n    // get random subsequences\n    uint32_t rstart = rand() % maxstart;\n    std::string s1 = m_seq[al].substr(rstart, readlen);\n    std::string s2 = m_seq[al].substr(rstart + readlen + isize, readlen);\n\n    std::string q1, q2;\n    size_t rep_spot = std::min(s1.find(\"AAAAAAAAAA\"), s1.find(\"TTTTTTTTTT\"));\n\n    // homopolymer scrambling\n    if (rep_spot != std::string::npos) {\n      q1 = qual_dist[rand() % qual_dist.size()];\n      for (size_t i = rep_spot; i < q1.length(); ++i)\n\tq1[i] = '#';\n    } else {\n      q1 = qual_dist[rand() % qual_dist.size()];\n    }\n    \n    rep_spot = std::min(s2.find(\"AAAAAAAAAA\"), s2.find(\"TTTTTTTTTT\"));     \n    // homopolymer scrambling\n    if (rep_spot != std::string::npos) {\n      q2 = qual_dist[rand() % qual_dist.size()];\n      for (size_t i = rep_spot; i < q2.length(); ++i)\n\tq2[i] = '#';\n    } else {\n      q2 = qual_dist[rand() % qual_dist.size()];\n    }\n\n    // dont keep reads with N\n    if (s1.find(\"N\") != std::string::npos || s2.find(\"N\") != std::string::npos)\n      continue;\n\n    SeqLib::rcomplement(s2);\n    std::reverse(q2.begin(), q2.end());\n    \n    // add the errors\n    //std::cerr << \"      \" << s1 << \" \" << rstart << \" rlen \" << readlen << \" ms \" << m_seq[al].length() << std::endl;\n    \n    if (error_rate > 0) {\n      makeSNVErrors(s1, error_rate);\n      makeSNVErrors(s2, error_rate);\n    }\n\n    if (ins_error_rate) {\n      if (rand() % 100000 < ins_error_rate*100000)\n\tmakeInsErrors(s1);\n      if (rand() % 100000 < ins_error_rate*100000)\n\tmakeInsErrors(s2);\n    }\n\n    if (del_error_rate) {\n      if (rand() % 100000 < del_error_rate*100000)\n\tmakeDelErrors(s1, rstart, m_seq[al]);\n      if (rand() % 100000 < del_error_rate*100000)\n\tmakeDelErrors(s2, rstart + readlen + isize, m_seq[al]);\n    }\n\n    reads1.push_back(s1);\n    reads2.push_back(s2);\n    qual1.push_back(q1);\n    qual2.push_back(q2);\n  }  \n}\n\nstd::ostream& operator<<(std::ostream& out, const Indel& i) {\n  out << i.len << \"\\t\" << i.type << \"\\t\" << i.gr.chr << \"\\t\" << i.gr.pos1 << \"\\t\" << i.gr.pos2 << \"\\t\" << i.frag_id << \"\\t\" << (i.lead_base + i.ref_seq) << \"\\t\" << (i.lead_base + i.alt_seq);\n  return out;\n}\n\nIndel ReadSim::makeDelErrors(std::string& s, int del_size) {\n\n  std::vector<int> sizer = {del_size}; \n  if (del_size <= 0)\n    sizer = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n\t2,2,2,2,2,2,2,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,6,6,\n\t7,8,9,10,11,12,13,14,15,16,17,18,20,22,24,26};\n\n  uint32_t rpos = s.length() + 1;\n  // get a random size\n  //int ds = getRandomIndelSize();\n  int ds = del_size;\n\n  size_t failsafe = 0;\n  while (rpos + ds > s.length() && failsafe < 1000) {\n    \n    ++failsafe;\n    // get a random position in read\n    rpos = rand() % (s.length() - 5 - ds);\n    rpos += 5;\n\n  }\n\n  // get the replacement sequence\n  //std::cerr << del_size << \" rpos \" << rpos << \" s.length() \" << s.length() << std::endl;\n  s = s.substr(0, rpos) + s.substr(rpos + ds, s.length() - rpos - ds); // + refseq.substr(rpos + s.length(), ds);\n\n  return Indel(); //{ds, 'D', rpos};\n\n\n}\nIndel ReadSim::makeDelErrors(std::string& s, int sstart, const std::string& refseq) {\n  \n  const std::vector<int> sizer = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n\t\t\t\t  2,2,2,2,2,2,2,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,6,6,\n\t\t\t\t  7,8,9,10,11,12,13,14,15,16,17,18,20,22,24,26};\n\n  int ds = getRandomIndelSize();\n\n  // get a random position in read\n  uint32_t rpos = rand() % (s.length() - 5 - ds);\n  rpos += 5;\n\n  // make sure we aren't at end\n  if (sstart + s.length() + ds >= refseq.length())\n    return Indel(); // empty\n\n  // get the replacement sequence\n  s = s.substr(0, rpos) + s.substr(rpos + ds, s.length() - rpos - ds) + refseq.substr(sstart + s.length(), ds);\n\n  //return Indel(ds, 'D', );\n  return Indel();\n  \n}\n\nint ReadSim::getRandomIndelSize() const {\n\n  const std::vector<int> s =      {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n\t\t\t\t   2,2,2,2,2,2,2,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,6,6,\n\t\t\t\t   2,2,2,2,2,2,2,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,6,6,\n\t\t\t\t   7,7,8,8,9,9,10,10,11,11,12,12,13,13,\n\t\t\t\t   14,15,16,17,18,19,20,21,22,23,24,25,26,\n\t\t\t\t   27,28,29,30,31,32,33,34,35,36,37,38,39,\n\t\t\t\t   40,41,42,43,44,45,46,47,48,49,50,\n\t\t\t\t   60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310,320,330,340,350,360,370,380,390,400,410,420,430,440,450,460,470,480,490,500,510,520,530,540,550,560,570,580,590,600,610,620,630,640,650,660,670,680,690,700,710,720,730,740,750,760,770,780,790,800,810,820,830,840,850,860,870,880,890,900,910,920,930,940,950,960,970,980,990,1000,\n\t\t\t\t   1010,1020,1030,1040,1050,100,1070,1080,1090,1100,1110,1120,1130,1140,1150,1160,1170,1180,1190,1200,1210,1220,1230,1240,1250,1260,1270,1280,1290,1300,1320,1340,1360,1380,1400,1420,1440,1460,1480,1500,1520,1540,1560,1580,1600,1620,1640,1660,1680,1700,1720,1740,1760,1780,1800,1820,1840,1860,1880,1900,1920,1940,1960,1980,2000};\n  \n  size_t rr = rand() % s.size();\n  return s[rr];\n}\n\nIndel ReadSim::makeInsErrors(std::string& s, bool keep_size, int indel_size) {\n\n  std::vector<int> sizer = {indel_size};\n\n  if (indel_size <= 0) \n    sizer = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n\t2,2,2,2,2,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,6,6,\n\t7,8,9,10,11,12,13,14,15,16,17,18,20,22,24,26};\n  \n  const char TCGA[5] = \"TCGA\";\n\n  // get a random size\n  //int is = getRandomIndelSize();\n  int is = indel_size;\n\n  // generate the random insertion piece\n  std::string ins(is, 'N');\n  for (int i = 0; i < is; ++i) \n    ins[i] = TCGA[rand() % 3];\n  \n  // get a random position in read\n  uint32_t rpos = rand() % (s.length() - 10);\n  assert(s.length() - 10  > 0);\n\n  rpos += 10;\n\n  if (keep_size) {\n    if (rpos < s.length() / 2) { // trim off back end\n      s = s.substr(0, rpos) + ins + s.substr(rpos, s.length() - rpos - is);\n    } else { // trim off front end\n      s = s.substr(is, rpos - is) + ins + s.substr(rpos, s.length() - rpos + is); \n    }\n  } else {\n    s = s.substr(0, rpos) + ins + s.substr(rpos, s.length() - rpos);\n  }\n\n  return Indel(); //Indel(is, 'I', rpos);\n  \n}\n\nvoid ReadSim::makeSNVErrors(std::string& s, double er) {\n\n  const char T[4] = \"ACG\";\n  const char C[4] = \"ATG\";\n  const char G[4] = \"ACT\";\n  const char A[4] = \"TCG\";\n\n  std::default_random_engine generator(rand());\n  std::binomial_distribution<int> distribution(s.length(), er);\n  size_t num_errors = distribution(generator);\n\n  for (size_t i = 0; i < num_errors; ++i) {\n\n    uint32_t pos = rand() % s.length();\n    size_t w = rand() % 3;\n\n    if (s.at(pos) == 'A')\n      s[pos] = A[w];\n    else if (s.at(pos) == 'T')\n      s[pos] = T[w];\n    else if (s.at(pos) == 'C')\n      s[pos] = C[w];\n    else if (s.at(pos) == 'G')\n      s[pos] = G[w];\n    else if (s.at(pos) == 'N')\n      ;\n    else\n      std::cerr << \"ReadSim::makeSNVErrors: Unexpected character in string. Char: \" << s.at(pos) << \" main seq \" << s <<  std::endl;\n\n    \n  }\n\n}\n\nvoid ReadSim::baseQualityRelevantErrors(std::string& s, const std::string& bq) {\n\n  char TCGA[5] = \"TCGA\";\n\n  assert(s.length() == bq.length());\n  for (size_t i = 0; i < s.length(); ++i) {\n    if (bq.at(i) <= 37) { // low quality-ish\n      s[i] = TCGA[rand() % 4];\n    }\n  }\n}\n\n"
  },
  {
    "path": "src/svabautils/ReadSim.h",
    "content": "#ifndef SNOWMAN_READSIM_H__\n#define SNOWMAN_READSIM_H__\n\n#include <string>\n#include <vector>\n#include <cassert>\n\n#include \"SeqLib/GenomicRegion.h\"\n\nstruct Indel {\n  \n  Indel() : len(0), type('N') {}\n\n  Indel(size_t l, char t, const std::string& rseq, const std::string& aseq, const std::string& lseq) : len(l), type(t) {\n    ref_seq = rseq;\n    alt_seq = aseq;\n    lead_base = lseq;\n    assert(lseq.length() == 1);\n    assert(t == 'D' || alt_seq.length() == l); \n    assert(t == 'I' || ref_seq.length() == l); \n  }\n\n  size_t len;\n  char type;\n  std::string ref_seq, alt_seq, lead_base;\n  SeqLib::GenomicRegion gr;\n  int frag_id;\n\n  friend std::ostream& operator<<(std::ostream& out, const Indel& i);\n\n\n};\n\nclass ReadSim {\n\n\n public:\n\n  ReadSim() : m_error(0), m_imean(350), m_isd(50) {}\n\n  /** Give the sequene string SNP errors at rate of er */\n  void makeSNVErrors(std::string& s, double er);\n\n  Indel placeDel(std::string& s, uint32_t rpos, uint32_t ds, const std::string& refseq);\n\n  void sampleReadsToCoverage(std::vector<std::string>& reads,  int cov, double error_rate, \n\t\t\t     double ins_error_rate, double del_error_rate, int readlen);\n\n  void samplePairedEndReadsToCoverage(std::vector<std::string>& reads1, std::vector<std::string>& reads2, \n\t\t\t\t      std::vector<std::string>& qual1, std::vector<std::string>& qual2, \n\t\t\t\t      int cov, double error_rate, double ins_error_rate, double del_error_rate,\n\t\t\t\t      int readlen, double mean_isize, double sd_isize, const std::vector<std::string>& qual_dist);\n\n\n  int getRandomIndelSize() const;\n\n  void addAllele(const std::string& s, double af);\n\n  Indel makeInsErrors(std::string& s, bool keep_size = true, int ins_size = -1);\n\n  Indel makeDelErrors(std::string& s, int sstart, const std::string& refseq);\n\n  Indel makeDelErrors(std::string& s, int ins_size = -1);\n\n  void makeClipErrors(std::string& s, double er, int min_clip_len, int max_clip_len);\n\n  void baseQualityRelevantErrors(std::string& s, const std::string& bq);\n\n private:\n\n  // get the cumulative sum\n  double __get_cumsum(std::vector<double>& cs) const; \n\n  int __random_allele(std::vector<double>& cs) const;\n\n  // sequences to simulate from\n  std::vector<std::string> m_seq;\n\n  // allelic fractions for each\n  std::vector<double> m_frac;\n\n  // read SNP error rate\n  double m_error;\n\n  // insert size distribution\n  double m_imean;\n  double m_isd;\n\n  \n\n};\n\n#endif\n\n"
  },
  {
    "path": "src/svabautils/SeqFrag.cpp",
    "content": "#include \"SeqFrag.h\"\n\n#include <iostream>\n\nvoid SeqFrag::addScrambledEnds(size_t left_len, size_t right_len) {\n\n  std::vector<std::string> TCGA = {\"T\",\"C\",\"G\",\"A\"};\n  \n  std::string left, right;\n  for (size_t i = 0; i < left_len; ++i) \n    left += TCGA[rand() % 4];\n  for (size_t i = 0; i < right_len; ++i) \n    right += TCGA[rand() % 4];\n  \n  left_scramble = left;\n  right_scramble = right;\n\n  m_seq = left + m_seq + right;\n\n}\n\nvoid SeqFrag::spikeMicrobe() {\n\nconst char* PSUEDO = \"CAAAAAGACATTTTTTTTGGGATATTAAGATTTCCTAGGATAGAAATCAAATTATTAGATAATTTTTGTATATATTTTAA\"\n\"ATATGTCTTAAAAAAATGTCTTTTTGTCTAAATATATTAAGCTTTTCATTTTTACATCGACAAATTTAGATATTTTTAGA\"\n\"CATTTTGGGTATTTTTTTAGACATTTTTAAAATATTTTAGACAGAATTGTATTATGATCCTATTTTTAGACCTAAATATA\"\n\"TGCAAAATTATCATATCGTCGTGGAGTGTTACCAAGTAATTCACTATATTGATACAAATCATTACCTCTATAATCTGGTT\"\n\"TAAAGGGAAGTTCTTTAATTGGTTCTTTCTTATCCTCTTTTTTATCCTCATCATTACCTTTATGAGCATTGTTTCTACAC\"\n\"ATGTATTTGACTAGAAAGAAAAATAATATAAACAATATTATAAGTACTATAAAAGTAAATATACATATTTTGATCATCAT\"\n\"TTTGTTACCAATTTCATTACCAACTTCCTTGCCTATAACGCTGAACGCATTATATGCAATGGGATCCATCGCGAAAGGAT\"\n\"TTTCCATTACTATCTATTATATCATTACATAATTGTTTATTGTTCTATAAATAATAAACAAATATACACTATTAGATAGT\"\n\"TTTTACCATCCAAATTCTTTCATAAACTCATTAATATCTTCTATTGACTTGCATTCTTCTAGTTCAATCCAATATATTGG\"\n\"TGTTTCTGGATCAATTTCTTCGTTTTCCTCTTCTTGTTTATCAAGATATTCTATTAGATCATTCTCTGCTCTGTTTCTCA\"\n\"ATGATTCAAGTTTTTTCTGTTCTTTTTTCAAGAGTTTTTTACTCACACTAAATTTACCATACATTAATATATAATACTAT\"\n\"AAAATACTATATATTAATTATCTTTATATCATTTTATATTAATTTATATTATTTTGATAAATTTTCCACGTATTTATAAT\"\n\"AATCATTAAATGTTCCTGATCTTACCGATTGATATTTGTTACGAACAGATTGTTGTTGTTCTTCAGTAGTTTTATCCCAT\"\n\"TCATCAACCATAATATTTCTAAAATTGGTTTTTGGTGCGACTATTTCTAATTTTTTTTTGTATGAATTAGCTTCTCTTTT\"\n\"GAATTTAGCAATATCACTCAACATAAGATTTTTAAGATCCTTTTCTATGAGTAGTTGTTCTTCCAATTCTGTAACGGTTA\"\n\"ATATTTTTTCCCTAGTCGTTATAAAAGCTTTTTCAAGAGCCATCGCTAATTGATCATATGATACAAAATTTTCATCATCT\"\n\"ATATTTTCTAATACTTCTTCAGCATTTCTTTTAATTTTTTTAGCTTTACTTGCCATTATATATACTATATTTACATATAA\"\n\"TTATTTATCATTATCATTAATAAAAAAATCAACCATTTCTTTTAGATTATTCTTTTTTTTTAGAGTAGATATTAAGTTAT\"\n\"AATTTTGTATAATTTAGGTTGTTTATGGGATTTTTTAGGTTTATTTTCTGTAACAGACATGAACATTGATCCACCATGTT\"\n\"GATCATTATCATCATCAAGAAGATCATCAACATTATCATTATAATTATCGGCCTCATTTAATTCATTTTCATCAGTATTA\"\n\"TAATTTCCAGATGATTGATTATCATCATCACTTTCATTATCACTTTCATCACTGACGTCAAAGATAACTTCTTTTTTTGA\"\n\"TTTAACAATCTTTGGTGTTTTTTTAACCATTTTTTTGCCTCTTTTTGACTTAGATTTGACTGGTTCTATCTCAGTTTCTG\"\n\"ATTCAACTTCCTCATCGGATTCATTATCAGATTCATTATCAGATTCTTCTGATTCACTTGATTCATCTCTAGATTTTGAT\"\n\"ATTTTTTTGGTTGTTCTATTCAATTCCTCTTTCATCATTTTTCTGGTTTTATAAAAAATTGGTTTACTGATTCCAGCTTT\"\n\"CTTACAAGCTTGAACCACTGTCAAACCACCTTTCAAATAATATGATTCGGCTTTTTCATATAATATTTTATTTCGTCGGT\"\n\"ATCTTAGGTTTTCTAGAACAGACATGTCCTTTATTATACCTAAATAATATTATTTTTATACCAAAACAGATCCTTTATCA\"\n\"TATACACATAATTCGGATCCAATCCGATTTTTTACTTTGATAAAAAGGCGAAAAATAATCAAAGTAAAAAGTAAGAAATA\"\n\"TTAAATATATGCATAATATAATATTATAATGTCGCATAATTGTCAAAATAGTAATGAACCTGATACAGTGTATTATGATA\"\n\"TAGTTATCCCATATAATCCCAATGATTCTGGTTTAAGCCCAGCAACATTCCAAGCACAGTTAACACAACCATTGCTTTAT\"\n\"AATCCTGACAAATATTACCTGAGTGTAGTGAGGTTCAGTATTCCGACCCAATATGTACCCTTAATGATACCTGAAATACA\"\n\"ACCTTTTCCAAATACTAATGTTAATAATACCATATATTCAGTTACACTAGAGTATAATGGTGTATTTTCATCTCAAACAT\"\n\"TTGTACAATATGATGTATCTTTAACTAATCCTAATGATACTCCTCCACCTCCTCCAACAATCAATAATAGGACAGTAGAA\"\n\"CCAACAGCCTATTATTATGTTTATAATTTCTCGCCATTTTTACAAATGATCAACAAAGCACTTTCTGATGCTTTTACTGA\"\n\"AATTACTATGCCAGTTGGCGCAGTTGCTCCATATTTTGTATACAGTCCGGTCACACAAAGGATTAGTTTAGTAGCACAGA\"\n\"GGCAATTTTATGATAGAAATTTAGCGCAACCTATTAGAATATATTGTAATGAGGCATTATTCCCATTTTTAGATGGAATA\"\n\"CCATTTGGAGGACTTGATTTTAATAGTGTTGATGGGCGTGATATATTATTCAATGTGGAAAATTTAGGTAATAATTTGGT\"\n\"TCAAAATCAGCTAACGGCTCCAGCATATCCTCCTGAATTTATCCAAATGGAACAAGAATATGCTACACTTTCTAACTGGA\"\n\"ATGCTATAAAAACTATCCAATTAGTATCCAATCTTTTACCTATTAATAGAGAATTTATCCCATCATTTAGAAATACTAAT\"\n\"GTAGGTGTAGTTAATTCACAAGGTATTTTAGCAGACTTTGTACCATTGGTAACACTTGGGCCAGAATCTAGAACCAGTAT\"\n\"AGATTATGTTGCAAATGGTCCTTGGAGATTAATAGATATGTTTGGAGGAGTACCTATAACAATGGTTGATTTATCAGTAT\"\n\"ATTGGACAGATCAAATAGGAAGACGATTTGTGTTAGATGTACCCAGAGGTAGAATAGCAACCTGTAAATTAATATTCATT\"\n\"AAGAAGGATCTGGCAGGTCACACTCTATCTCGGAAATAATAGATAGTTAATGTTTCATCAAAATATAATATAATAATATA\"\n\"GTATATTAAGAATATGTCAAATAGTGCTGTACCTTTAAATGTTGTAGCAATTCAAGAACCCCGTCTTGAACTTAATAATG\"\n\"AAAGAACTTGGGTAGTGGTTAAAGGTGGTCAACAAGTCACCTATTATCCTTTCCCTTCAACTTCTTTCAGCTCTAATCAA\"\n\"TTTAATTTCATTTGTAATCCTCCTTCAGCACAAACTGTATTGGATCGATTAGCATTCATTCAAGTTCCTTATGATATCAC\"\n\"TTTCAATGTTAATCCTGCTCATGCTGGTGTAACTGACAATCTTTTACAACCTGGTCGTGATGCTTTCCGTGCTTTCCCTA\"\n\"TTAGTTCTATTACTAATACTTTAACTGCAACCATTAATGGTTTCCCTGTGAATATTGAATTAGGACAAATTATTCACGCT\"\n\"CTTAGCAGATATCATACTCCTCTTAAACTTAAAAATGGATGGATGTCTATGCAACCTTCTTTTGAAGATAATTATCAATC\"\n\"ATATCGTGATGCTGATGCCACTAATAACAATCCTTTAGGTGATTTTACAAGCGCATCTGGTCTTTCTGAGCTTCCAAGAG\"\n\"GATCATATTCCATGAATGTTGTGTCAAATACTCCTACTACTGCTAGAATTACTGGTGTACTTTATGAACAAGTATTCCTT\"\n\"CCTCCATTTATTTGGGATGAACATCAAGCTGGTGGTCTTGCAAATCTAACCAGTTTAACCTTCAATTGGGTACTAAATAA\"\n\"TAATCTTGCTAGAATATGGTCTCATTCAGATATTACTAATGATGTTTCTGGAAACAGTACTATTGGTTCAATGAATGTCA\"\n\"GCTTCCAACAACCCTCAATGTATCTTGGATTTGTTACTCCTCGATTAAATATTCCTATTCCTCCCAGAATAACTTATCCT\"\n\"TATTTCAAACTTTCAAGATACACTACACAATTCCAAAATACTCTTGCTCCCAATGCAACCAGTACTTACAAATCTAATAT\"\n\"TGTTCAACTTGATTCTATTCCAAGGAAACTTTATGTATTCATGAAACAATCTGATTCAGTGATTTATCAAAATCTCAATA\"\n\"ATCAAATTACCACTCCTGATGTATTCCTACAAATCAATTCTCTCAATTTAACTTGGAACAATCAACAGGGTGTTCTTTCT\"\n\"GGAGCATCTGCACAAAATTTATATGACTTCAGTGTTCAAAATGGTTACAACAAGACTTGGACTGAATTTAATGGTCTTAC\"\n\"ACAACAATTATCAGGAGTCTCTGGATCACCTACCAAAGTAATTGGTCTTGAAGGAGGAATAGTTTGTCTCGAATTAGGTA\"\n\"AAGATGTAGGATTACGTGACGATGAAGCTGAAGGTGTGCTTGGTAATTTCAATTTACAAGTACAAATGACTTGCACTAAT\"\n\"ACTAATCAATATCTCACAATCGTACCTGATATGTATATTATTGCAGTATATGATGGTACTCTTGTTATCTCTAATACTAG\"\n\"TGCTATGGCATCAATTGGTGTTGCCTCTAAAGAAGAAGTATTAAATGCTCCCATTAATCATAGCATGTCATATCACGAAT\"\n\"TACAAACTGTATATGGAGGAGATTTCTTTAGCACATTTAAGAATTTCCTTGGAAAAGCCGCTAATGTAGCCGGAAAGGTA\"\n\"AATAATTTTCTCAAAGATTCAAAAGTAGCTAGTTCTGTGCTAGGAGCTATTCCTCATCCTTATGCTCAAGTTCCTGGACA\"\n\"AATTTTAAGGAATATTGGTTATGGTGAAGGTGGAGTATCTGCTGGTGGTGTTGTTGCTGGATCTGGAAGAAGAAAGAAAG\"\n\"GTGGAGTATTAGTAGGAGGCAGTGAATGTGAAGGTGGAAGATATATGTCCAAAGCTGAATTAAAGAAAGCTTTACGAATG\"\n\"TAAACACTATTAAATATAATATTGGTTAATAATATATTTAATATGAACATCAGAATAAAAGATTATTTCGATCATCCTTT\"\n\"TATTAAATTTGATCCAAGGGAAGTTAAACCAATTGAATCATATACTCAAGAACAAATCAGTAATATCAAATTATTATCTG\"\n\"TTACTTCTGATCCTACACAAATGGCAAGACCTTTTGGATCTGCTACATATCGTATTCAAAAATATCCTGGAGATTTAGAT\"\n\"TTACAAGAGGAATTCATTGATTGTTGTTCCATAAATGAGGTTGTTAAAACATTTGCTAAGAGATTACAAAAAATAGTCAC\"\n\"CAATATCAAAAAAAATAAGTTACATTATTTTTCAGAGGTAAAAGCTGGGATTGATATTAGATACGATATTGATATTGGCA\"\n\"TAATAACTAGTGGAGTGTATATTCCCAGTTTTAATTTGATCCAAAAAATACAATCAATGTATCGAAAAGGATTATTAGAT\"\n\"GATGAAGAATACAATACTTTATCTACAGCATTATCAAAACCTAATTTAGATGGTGATGTATATGACGTCGTTCATCATAT\"\n\"TTTGAGAGAACGTAAAATATTGAGATGGTCACAAGAAGAGGTGTTATTGGGTACAAAAAGTCTTCCTTTAGGGAAAAAAA\"\n\"TAAAGCTATCTGAAGCATTGAAGGCAAAATCACATGTAAAAATAGACATGATATCACTCATTAATAATCAGTTTGTTGAG\"\n\"GTAACTAATTTCTATATTTTGATTTATGTCGATTTGAAGAAAAATACTTTGGAGACTGTTAATTTTAATTTCGATTATCT\"\n\"TGATAACAACATACTTACCAAACAATATGATATGCAAATCAAAGAGGAAGTACAAAAATTGTATTACTCTGATATGTATT\"\n\"ACAGTGCTTTCAAGATGGTCAAAAGAATGTGGGCATATTCAAGAGCTTTTAGAAATATGGAAGATGTCAATATATTATTA\"\n\"CCTATTGTAAGTGGAAATATATCATTATTGTATCAGATTGTGAGTGAATTATCCACTATTGTGAGACTTTATGAAGTCAG\"\n\"TAAATCAACTCCCGAAACAACAATAGATAAAAGATTAGATTCATTAGCCTATAAATTAGCTGATGTAACAGAAATAGATA\"\n\"AAGAATCATTGATACATATCACAGATATAATTGATAGTTTGAAGAATTATAAAGGAATCAACAAAGCAATCCAAATAAAT\"\n\"CAGTTTGTAATTAAACCATTGAAAAGATATATCAATGCTTTAACTATAGATGAATTGGAAGAAATAGGTTTTAATCCTCC\"\n\"TCCTCCTAGATTTTTACCATATCCTTTGAAATATGCTCCTATTGTTAGATATCCTTTTGAGGATGTTGAAAACCCTTTGA\"\n\"AGCAATACTAGAAGTGTTTATTTGTAAAAAAGCCAAAAAACAAATTAAAACAGATCAAAAGACTATTTGTCTAAAATATT\"\n\"TTAAAAATGTCTAAAAAATGTCTAAATTTGTCGATGTAAAAATGAAAAGCTTCATATATTTAGACAAAAAGACATTTTTT\"\n\"AGACATTTTTAAGATATATACAAAAATTATCTAATATTTTGATTTCTATCCTGGAAAATCTTAATATCCCAAAAAAAATG\"\n\"TCTTTTTGTCTAAATTATTAAGCTTTTCATTTTTTACGCCGATATTTTTGACATTTTAGACAAATAATCATCAAAATAAT\"\n\"ATGTGATCAATATGCTAATTTATAATATTTCTTTCTAAGCTTTCTATATTTTGCCTTTAAATGCTCATATTTATTCTCTA\"\n\"ATTTATCCATTGCTTCATTGTGTTTCTTTGATTTCTTGTGATTAGAAGAATTACTTTTGGCATAAACTGCTCCACAAATA\"\n\"GTACATTTCACTTTTTCCTTGTAATATTCCCTTTGTTTTTCCTTATTTGCTTCATAATATTTTTTATGATACTCATTTTT\"\n\"TGATATGTCCATTATATTATAATATATTATTTTATATTAATATAATATTATTTTATATTATTTAGTATTATAGAGTAAAT\"\n\"AATATAAAAAATAATTTACTCTATTAAAATGATGAAACAATAATATAGCTAATCTACCTCAATATCTGCTAGTATATCTA\"\n\"TTTTTTTAATACCCTTCCAGAACCTAAAAGTGGATCTACCTTCCACTAATTTTAGTTCATCGCGGAGTATATCATTGAAT\"\n\"CTGTTTAATGATATATCCTTAAATTCTTTGTGTGAATTTTTAAATTTTTTCATATCAGACACTGGTACTTTATCATTATC\"\n\"TTTACCAGTGATTTCATAGTGCTCTTTAATGGTTTCAATAACAATATCATTTTGTTTTGTTTCAGCAGTCCATTTTTCTT\"\n\"TGACTTCAGGATCAAATTCAGGCATACCATTTTTCAAATAATCTTGGTATGCATCAAGGAAAAGATGTATAAATCCTTTC\"\n\"ATGAAATCTTTGGTCTCAAATTTTGATTCAATATTATTATCTTTGAGTTTGTAATAAGGTTTTTTATCGACATCTTCTTC\"\n\"ATCAACAAAAACATAAGGAAATTCATTATATACTAATCTATTCATTACAGCTTGATCAAAAGGTTCAATATTAGGAACAT\"\n\"CATTGAACATACAAAAAACAGTAAAATTAGGTTTGAAACTTTCTTCTGATTCTTGATGTTCTCTACCTACAATATTATCT\"\n\"CCACCAGATGCAAGTCTTTTTATCATAATACCATCAAGAACAGAACCTTTCATTGGCATTTCATTTGACATTAATATTCT\"\n\"AGTATGTGCAAGTTTATATGCCCATCTAAATTTTGCTGCTTCATCTCTTGAGTCATTCTTTTGATATAATAAATTTGCAC\"\n\"CATTAAAATCACCAATATAACCTCCAAAACAATATTGTAACATCATAATTAAATATGATTTGCCAGCATTTGATCTCCCA\"\n\"GGACAAAAATACATTTTTTTGAGTTTAATATCGCCAGCTAATGCACAAGCTAATGCTGTTATCATAGGTTTTGGATTATC\"\n\"AAACAATTTCTTGAATGATAATCGATATGCTTTTTTGACCAAATCTTTGTCATATTTAGGGAATTTGTACGGCACACCAC\"\n\"ATTTGAAAACTATTTTTGGATCAAATCCCTCAGTAAATGTTCCAGTCTTGAAATTATATATACCATCTTTAAATAAAAGA\"\n\"TATCCTAATGACGATTTTGCAGTTCTTTTTAACCAATTATTATCCTCTGATACGTCTTTAACAAAACCTACAACCTTTTC\"\n\"TCTTAATGTATGATCTGTACCATAATTTTTGGTTTTATGAACACCATTTTTATCAGTGGAAATAATAACATTGAGATACA\"\n\"TTTGATGTTTTCTCAAATAGCGGAAAAGTATATGATTATTATCATCAAACATACCAGTATTTTCATCAAATATGTATAAC\"\n\"TTTTTGTTACAGAATTTGAATTTTTCTGCTCCTTCTAATTCGAACAATTTTTCCTGACAATCACAATCACTGCTAACATA\"\n\"AATACTATGATCTGGTACTTCAAAATCCAATTCATAGTTCATTGGTTTTTCTTCTAGATTAATCTTGTATTCTGTCTTAT\"\n\"CATAGACATATTTTTCACAACCTTTCAATAAAACCTTAATATCCTCATCAAAGGAGTTAATCAACATACCATCAAAGCAT\"\n\"AATGTACTCACTTTAATTTTTTTGCTAGTGAAATAATCATACATTGCCATTAAACACTTATGTTCTAATCGTTGTGCTAA\"\n\"TATGGATAATACTACTGCTAATTTATTCTTACAATCATTATTATCCTTGATTTTCTCATAAAGACTTGTTTCTTTTTTAG\"\n\"CTACTTTTTCAGCTATGTATTCTGCTTCTTCCTTAAATTTTGTGAGGAATTTTAATTTTTTGGTTGGTGTGTAGCTTTCA\"\n\"CCATTATCATTAGTCAATTTATATGAACCAAGATAACATAATTTCAAGATCAGTTCTTTTGCCTTGTCTCTTGATATTTT\"\n\"ATGGAAACTACTTATGTCTTCGAGTATCTTTTCTCTTCTATTGACATAATCAACTAAATATGGACACAATATGTCTTTTT\"\n\"TTTTACAATATTGTGTAATCAATGTAGGATGTGAGTTTTTCATATCAATATCAGTATTAATTCCATTATTGATAAACCCT\"\n\"CTAATACTCTTTTTGAAGGACTGAAGACTTTGTCCCTTCTCAGCATATACCCTACCAGTATCTTCTAATTTATCTGAATA\"\n\"GTAATATTTCACCTTGACATATCCTATTTCATCTCCCTCTTCACGTTTTGTCTTGAACACTTTCTTGTAGTATGCACTTA\"\n\"ATTGTCTCTGAATGTCTTCATCTAAATCTTCTGCTGATAACAATCTCTTCAAGTTTTTCATACTAATTGTTTCTGTCAGT\"\n\"TTAATCACTGGCTTAACCACTTTCTTTTCAATTTTCTTAGTCACTTTCTTCTGTGTCTTACTCATTGTTTACTAGTATAT\"\n\"ATGGTACTAGATATATTATTTTTATATCATTTTATATTATTATATAGTGAAAAAATATTCAATATTATTTCTATAGTTTG\"\n\"AGCGTAATCTTTCGGCCTTACAATCCAACTTATACCCCCTTTTCTACGCTGTCTCAAAAATTTTGTGATGCGAATATATC\"\n\"CGTATCATAAAATTGTCACATGCTCGTTAATGAGCATGTCATGTAAAAATGTCATCAGCTGATTAATAAGCCGCTGAAAA\"\n\"ATACCAATATAATGGGAACTGAACAGCCGAAACTTCGGAAATATGACTGATATTTCCGAACCCTCTCCCTGTTCAGTTCC\"\n\"TACTACAAATCAACTATATCACGTCCTTATCCATATATCATCATACTCTTTCTTATGACCAAATACCATCATATACACAT\"\n\"AATTAAACATACTTATTATATTTGACACTAAATACTCAATCGGATTCATCTTCTTCATCTTCACTAACTAACACTTGATT\"\n\"TTTTTTTACAAAGAATGTCGGATATTCATTCTCTAAATATTTGTATTGTTTTTCGGTGATATTACTTATTTTCTTTAATT\"\n\"CTGACATTTGGTTTTGTAAATCAAGCATTTGTTTGTACATCTCATTCATATTATGTAATTCATAGATTTTTCTCATATAT\"\n\"ATTTGTGTTTGTGATTCATTTTCTTTTTTCAGTTTCTCATTTTCTTTACTGACCTCATTTAATTCCCTTTTCAAATCATT\"\n\"ATTTTCTGATTTAATCTCATTCAATTGTCTATGAAACATAATATTATTATCATTCATACTCGTTTGAAGTGATACTCTTA\"\n\"GATCATTTTTGTTCTTATTGGTTTGATCAATCTCTTGATACAATGTATTAATACAAGATTGTAATTTTTGTTTACAATCT\"\n\"TCGGGTAGCTTTACCAATATTTGTGAGATAATATTATTGATTTCCTCTTTATTTGACATCATATTGATAAGGTTATATTT\"\n\"TATATTATTTTTTCAATCAACGGAATATCTCGTAAATGGTACAAACATTCGGCCTTATAAAAATAATATTATGTAATAAT\"\n\"ATTACAATGGCTAAATTATATAAACTAGAGCTTGATGATTTGTTAAATGAGGACTTAAATGAGGCTGTCAAAATCAAAAA\"\n\"AGGATTTGACAGGAATATTAATTTTATGAAGATTAAGAAAAAATTACTTCGATCATTAAAGGTGAATTGTGCTATTGTCA\"\n\"ATGACAAAGAGGAGAGTGATTATAATAAAAGAATATCAACTACTAGAATAATATACATCATCATTGCACTTTTACAACTC\"\n\"AGAAATTGTTCCAGAATATCAGAAGCTGTTGCTGCTATCAAGAAATTCTCTGTCAAAAAAAATCTAAATGAAAGGGTGTT\"\n\"AGTAAAGATAGCTAAATCTGAAAAAAGAATAGTGGATAGGAAAACAAAGGAAGTATATGAAACTAAGCCAAGATATCGTG\"\n\"AAATGATTTTCCCTCTAGCATGGGTTGATAAGAAACTATTCAAAAAAATCATAAAAGATGATCAATGGGCCAAATTCAAT\"\n\"AACAATAAAGAACCCAGAAAACGTGTGCTTGACTACCTTTTAAATAATTTTGATTGTAATACTCATTCATTAAGATATGC\"\n\"TGGAATTAATTTTATGTTGAATGAAAAAAAGGTTCCTATGAACATTATCGCTAAATTTGTTGGTCATGTTAATACAGAAC\"\n\"AACTTGTTACATATACTCAACATCAAGCATTGGATGATGTTTTTGCTATGGATGTGTAAAAAGGCACCTCGATTATCCGG\"\n\"GGTATGTAGACATTGTCTTATCTTTTTTTATCTTTTTTTATCTTTGTAATTCTGTTGTACAATGTAGGTGTTTTTGCAAA\"\n\"GATAAACATTTTAAATGGTCATCATAGTGATTATCTCGTCTGGCTTGGCTTTATAATATTTACACATCTGATCAATGAAA\"\n\"TTTTTGAACTCATATATACTTAAATGCCTCAAAAGTATCCTAATCACACACCATCTACCACACGTTTTAATATCATTTGC\"\n\"TCTCTTTTGGAATTTAAATTCGTTGTAATGTAATTCATACGGACACTCTAACAGGAGTAATGATAGATATGGATAATATT\"\n\"GGTTTGATATTTTTCTGAAATGTAGAGGAATAAATTTGAGGCTATTATCGGGATATCCTCCATAGCTATTGAAAAATTCT\"\n\"ATGGTATTTTCATCTCTCTTGAATAAGCAACACCAGTGACCAAAGTTCTTTTTAGCTTCAAACAATAATATACATGCACC\"\n\"ATATGGACCTAATACCTCATCAATAGAATTGTAGTTAATCAAATCTGGATACAAAACTATTTGTGCTTTATTATCTAACA\"\n\"TACCTAAAATATCGGTATTTGAAAGGGCTACATTTTCATAATGTTTGATAGTTTTCATTTTATTATAATTATATGATAAT\"\n\"AAAATAAAATACTTCATACAGTTAGACCATATATGTTATGCTAAATGGATTGAATCCAGAACCTCCAATACCAGTAGTAA\"\n\"ATTGACCAAGATTATTGTCTTTGTAAACAACTATTTGACCATTTGATAATAGTGTTATTAATCCAGGATTAACTGGCCTA\"\n\"TTTCCATCATCAATCACAAATATTTCAAAATCTACTTGAATATTGGTGGTTGGTCTTAAATCAGCTGGTAATGCTCCAAT\"\n\"AGCTGAATTTATTACAGCTGATGATGTTGCATTTGCTTGGAAAGGAGGAAATGTTAGATTGACAAGATTATTTATTTTAG\"\n\"TGTATGCAACATTTTGTACTAATGGTGATGCCCATGGACCTGAAAGAGATAGGGAAAATGATCCAGTTGTCAAAGAAATA\"\n\"TTGCTAACTGCTTGAGTAATATCAGAAGCACCATACATTAAATGAGGAGGAGTAAAATTACTATTACTCCAGACTGTATT\"\n\"AGTATTTCCTGTTGGATTTGCTGGAACATTTGTCAGAGTATTAGATTTATTATTAATGTTGTACAGATTTGGTTGTAGTA\"\n\"ATGATGATATTGACATATATTATTATAATTAGATTCTAAATATATTTAGTGTAAATCCGCTTGCATTGGGTTGTATTTCC\"\n\"CCTCCTGAATTTGCAAAAGCGATAAAAATATTGTCTGATGGTGTCATATCAATAATACCATTTAGAGATGCACTCATTTG\"\n\"AATTCCAGCTCCTGAATAAATTACTGCCGTATTATAGACAGCTGTTCCACCATTTTTGAATATAGATATGATTAATGATC\"\n\"CATCTAATGTACCGATTGAGGTACCAATATATGTTACAGCAACATAAAATGGAGCAGTTTCCGTGGTGGTGAACACACCG\"\n\"TCGACATAGGAACAATTACCACCTAATGTTTTTGTGGTAAAAGCAACAGTACCAGTTGATACTTCTGGAATTGATGCTTG\"\n\"CGTGCCACCACTTGTTTCATATGTCGGTAAATCTCCAGAAAAATAAGTTCCTGAACCAACTGTTCCACCTGTATTACCTT\"\n\"TTGGACCCATTTCACCCTTAATTCCAACCCCAATATCACCTTTATCACCCTTTAACCCGTTAGTTCCGGGATCACCTTTG\"\n\"TCACCTTTTGGACCTGATGAACCAGTACCACTATTCAAATCAGCTGAACCAAACATTAAATGAGGCGGATTAAAAGCATT\"\n\"ATTACTCCATAAAGTATTGGATGCTGATGTTGGATTGGTGGGTAAATTTGTGAGAGAATGTGATTTAGAATTAATATTAT\"\n\"ATGTATTTGGTTGCAATAATATTGATACAGACATAATTATATTATCAAGATGATATAATTATTTCTCATAACTAACCAGG\"\n\"AGGAATAAAATATTGTCCTGTTATGTAAATTAAGACTGTTATTGATGTTGATGCTTGTATTTTCATACTTAACACAATCT\"\n\"CTGGTGTAGCTGCTGTAGCTGTTACAATACCATATTGTACAACACCTGTAGATGCACCTGTTATTGAAGCTGTTCCAATC\"\n\"ACATTATTACCATTAAAATCACCACTAGCAACTGGAATAGAAAAATATATTATTCCTTGTGCCATATTAGCAGGAATTGT\"\n\"TGCGTTTGTACAAATACTAAATGTTACAATATTACCTATTCTCGAATAAATAGATGTTGTTGGTGAAACACTTGTAAATA\"\n\"TTTGTGTGAATGAAACTGTTGGTGTCCAAATTCCTGATGATAATACTACTGCTGAACCTACATCACCTTTTAATCCCTTA\"\n\"TCACCCAAATTACCTTTTAATCCATTTGTACCAGTATCTCCTTTTAAACCTTTATCTCCACTTCCTGTTTCCCCTTTTAA\"\n\"ACCATTTATACCTGCATCACCTTTTAATCCTTTATCTCCACTCCCAGGATCTCCCTTTAATCCATTTGATCCAATATCTC\"\n\"CTTTGAGACCATCTAAACCTGCATCACCTTTTAATCCTTTATCGCCACTTCCAGGATCTCCTTTTAATCCATTTGATCCA\"\n\"ATATCTCCTTTTAATCCATTTGATCCAATATCTCCTTTTAATCCATTTGTTCCAGCTTCTCCTTTATCACCCTTTTCCCC\"\n\"TTTGTCTCCACCACCACCACCGCCGTTGGATAAATCTGTGGAACCAAACATTAAATGAGGTGGATTATGAGCATTATTAC\"\n\"TCCATATTGTATTACTCAAATTAGTGGGATTTGATGGTAAATTATTAAGAGTATGTGATTTAGAATTAATATTGTATGTA\"\n\"TTAGGTGAAAATAATGTGGATAACGACATATATTAATATTATATTATTAAATATGATATTAATTATTCTATTTACTTCTT\"\n\"ACTTTTGCATTTTTAATACTTTAAGTATTATTTTTTACCCTTATGATTTTTTCTACTCTGAACAGGTTTTTGCTTAGGTT\"\n\"GTTCCTCTTCTTCTTCATCACTTTCTTGTTCAGTCATAATTTTCAATCGGTGTTTTTGGTTCTCTAATTCTTGTCGGTAT\"\n\"GCTTTAAATTCTCTATTCATTCTTGATTTAATTTTACTTGTTCGATGTGCTCTGAATTCTCTAAGTTTTTTCTCATCATT\"\n\"AATATCTTCAATCAAATCATCTAATTGTTCTGTTGTCATATTGTCAAATAAATTATATAACGCATCCATATCAAATGGTT\"\n\"TTTCTACTCGTGGCATACCTCCACTATTGATCACTATCTCATTATTTTCATTATTGAATGGTGTGTAATTCATTATTATA\"\n\"TTATATATACATATATTTTTATCCTATTTTGACACATAATAGATACTTAATCTATCCATAAATCATAATATCACGAAGTT\"\n\"TTTTATTCATTTTTTGATAGACTTGACATACTTCTGTTTTTCTATGTTTAGGTCTATTGGATCTTGTGTATGTTTTTCCA\"\n\"CAAAATTCACAAATCAATACATCATTTGGATGTGCTTTAACTTTTTCTTCACCATATGTTCTCCCATTGTACGAATCTTT\"\n\"GTACACATTTTGACCATTTTTTTTCCCAATTGGACCTGGTCTTTGATTGAATCTTAATACACAAGTTGGTTGTCCAGCAT\"\n\"CCTCATTACGAATAACTTTATTTTTATATACTGCTTTTGGTACTGGTGTTTGTATATATTTCAATTCTTTTCTATTCATT\"\n\"CGAGTTAATTCTTTTTCTTCTGCGAAATCATATGGTATATCTCTTTTTAGCATTTAATATTACCTATAATATTTTTTTAC\"\n\"TAGTTACTGACGGAATAGAATTAGTATTAGAATTACTCTCAAATAATAAATATATACATAGGAATTTAATTTATCAACTT\"\n\"TTTATATAAAATAAATGTTATCCTACATAAAATATGATAAATTTAGCAAGCCTTTTGCCAAAATCAGTGGAGGGAAATAC\"\n\"AAGGGAAAAATGGCATATGTGAATGAAGAAAATGATAAAGGACGTAATGAATTAAAGCTACCCGAGGGTAAATTTGTACC\"\n\"ATATCCTAATCCTTTAACTAGAGAAGTAGTTTATGTAGCCGGACAAAGTGGTAGTGGTAAATCTACCTACGCAGCACAAT\"\n\"ATATCTACAACTACAAGAAATTATTTCCAGCTAACAAGGTGTTTGTGTTTTCAAGGTTAGAAATGGATCAAATATTAGCA\"\n\"TCACTTGGATGTATTCAAATACCTATTGATGAAGAACTATCAGAAATGGACGCAATTAGGGATATAAAGAATGCATTATG\"\n\"TTTGTTTGACGATATTGATACAATCAAAGACAAGAATCTAAAGAATTGTGTTTATGATATTCAAAATGATATTCTTGAAA\"\n\"CTGGACGTCATAAAAATATATATATTCTTGTCACATCCCATTTGATTAATGGTAATGATAAAAAAAATTCTAGAACTATC\"\n\"CTCAATGAAGCCCATAAAGTGACATTCTTTCCAAAGAGTGGTTCGTATGCCATAAATTATTTCCTCAAAAACTACATTGG\"\n\"AATACCTAAAAAAGACATAGATGAGATCTTAAAGATAAAATCAAGGTGGATCACTATCAATAAAGGTTATCCTTTGTACA\"\n\"TATTTTATGAAACGGGGGCAAAAACTATATAAATTTTATCTTATTATTTACCCCCAACAATCTTGGGGTCGAACAATCTT\"\n\"CGGGTATTTAATTGTCTAAAAAAAGGAATTTCGCGCCATTTAACTGATAAACAATCATAATTGATGATATTTTTACTATT\"\n\"TACTTTGATGAAATTTCCACTAATAGTAGTAAAAATTTATATTGGACAGAAATCTAGCCAACCCTTTTCTTCTTGGTAGG\"\n\"TTTCTTTTTGGATTTCTTCTTGGCCTTTTCTATCTCTTTCTCAGCCTTTTCTGCTTCATTCTCTAGCTTGGTAACAATTT\"\n\"TCTTTTGAGCAAGCATTTTCTTAACTAGTTTGTCTTTTTTAACCAATAATGCCTTTAATTTTACCTGTGATGCTTTGATC\"\n\"AATGATTTTTTCATAGTATCATCATCGACAATTAATTTAAGGTTTTTATATTGTTTAATCAATATTTTAGCATCATCCTG\"\n\"TAATTTCTTATATTTGAGTATTTCTTTGGTCAAATCGAGTTTCTTTTTACCAGCATTCTCCAATAATTTTGGATCAACAC\"\n\"TATATCTACCATACATCCTGACTTGATTTGCCTTAAGACACTGCTCTGGAGTACCAGCTTTTTTACCTTTCGGTATCTTT\"\n\"CCTATACCACAATACATTTTTAAGATATAATTAGATCATAAAAATGTATAAAGATTACATATTCATTAATTCTTCCAAAA\"\n\"TTCTTTGATCATTATTGGACATTTTGGGTGATCGTTTAGTTCTTTTGGATCCTCCTTTCAAAGATTTCTTGACAGGTTTT\"\n\"TTCTTAGTAATTTTCTTGGTTTTACTACCAGAACTCTTTTTCTTGGTTGTTTTACCAGATTTCTTTTTCAAAGCTTCATA\"\n\"TTGTTTCTTGGCTTTGGGACTTTGCATAGCTTCACCATATTTCATACCATGTTCTTTAGCAAATTTCTGTAAAAATGCTA\"\n\"CCCATGGTGATTTCTTAGCACCAGCTTTTGTACCAATACCACCTTTCTTAACCCTACGTTTGACCGTTCTACCACCTGAT\"\n\"AATACACCTGCTAAAACACCTCCTACTTCAGTGCCACAATTGGGACAAAAACATCCTCCTCTTGGAGCAGTTCCAGATAA\"\n  \"TAATACTTTCTTAGACATAATAATATTATATGATATTATTAATAATCACGCATTTACATAATTATGATCATAATTATTGT\";\n\n\n std::string phage(PSUEDO);\n\n int start = rand() % (phage.length() - 1000) + 500; \n int width = 300;\n\n std::string to_insert = phage.substr(start, width);\n\n // get the center point\n int center = m_gr.Width() / 2;\n phage_site = center;\n phage_string = to_insert;\n\n m_seq = m_seq.substr(0, center + left_scramble.length()) + to_insert + \n   m_seq.substr(center + left_scramble.length(), m_seq.length() - center - left_scramble.length());\n \n}\n\nvoid SeqFrag::addIndels(size_t n) {\n\n  if (n == 0 || m_seq.length() < 5000)\n    return;\n\n  size_t spacing = m_seq.length() / (n+1);\n  spacing = std::max((size_t)5000, spacing);\n  std::vector<int> breaks;\n  for (size_t i = spacing; i < m_seq.length() - 5000; i += spacing) {\n    breaks.push_back(i);\n  }  \n  breaks.push_back(m_seq.length() - 1);\n\n  if (spacing <= 30) {\n    std::cerr << \"Simulated indel spacing < 30. Should be > 30, reduce number of indels\" << std::endl;\n    exit(EXIT_FAILURE);\n  }\n\n  if (breaks.size() < 2)\n    return;\n\n  if (m_gr.strand == '-') // flip it back to process, then flip at end\n    SeqLib::rcomplement(m_seq);\n\n  std::vector<std::string> TCGA = {\"T\",\"C\",\"G\",\"A\"};\n\n  // make a read sim to get random sized del\n  ReadSim rs;\n\n  // set up for the loop\n  int del_cumsum = 0;\n  int ins_cumsum = 0;\n  std::vector<std::string> frags;\n  frags.push_back(m_seq.substr(0, spacing));\n\n  for (size_t i = 0; i < breaks.size() - 1; ++i) {\n\n    // random size for events\n    int ds = rs.getRandomIndelSize();\n    \n    char etype = (rand() % 2 ? 'D' : 'I');\n    //etype = ds >= 50 ? 'D' ? 'I'; // events above 50 are always dels\n    //char etype = 'D';\n\n    // get the bounds\n    int start = etype == 'D' ? breaks[i] + ds : breaks[i];\n    int end = breaks[i+1];\n\n    std::string ins_string = \"\";\n    if (etype == 'I') {\n      if (ds < 50) { // random sequences for small insertions\n\tfor (int i = 0; i < ds; ++i) \n\t  ins_string += TCGA[rand() % 4];\n      } else { // tandem duplications for large\n\tint len;\n\tstd::string chrstring = m_gr.ChrName(SeqLib::BamHeader());\n\tchar * seq = faidx_fetch_seq(m_index, const_cast<char*>(chrstring.c_str()), m_gr.pos1 + breaks[i], m_gr.pos1 + breaks[i] + ds -1, &len);\n\tins_string = std::string(seq);\n\t//std::cerr << ins_string.length() << \" \" << ds << std::endl;\n      }\n    }\n    \n    \n    std::string lead_base = m_seq.substr(breaks[i]-1,1);\n    std::string ref_seq = (etype == 'D' ? m_seq.substr(breaks[i], ds) : \"\");\n    std::string alt_seq = (etype == 'D' ? \"\" : ins_string);\n\n    // make the indel object\n    Indel ind(ds, etype, ref_seq, alt_seq, lead_base);\n    if (etype == 'D')\n      ind.gr = SeqLib::GenomicRegion(m_gr.chr, m_gr.pos1 + breaks[i]-1, m_gr.pos1 + breaks[i] + ds-1);\n    else\n      ind.gr = SeqLib::GenomicRegion(m_gr.chr, m_gr.pos1 + breaks[i], m_gr.pos1 + breaks[i] + 1);\n    ind.frag_id = frag_id;\n\n    // check that it's not on a blank region\n    if (breaks[i] < 101 || m_seq.substr(breaks[i] - 100, 200).find(\"N\") != std::string::npos) {\n      start = breaks[i]; // don't put in the del or insert\n      etype = 'D';\n    } else {\n      // store the indel and update reference counter\n      m_indels.push_back(ind);\n      if (etype == 'D')\n\tdel_cumsum += ds;\n      else\n\tins_cumsum += ds;\n    }\n\n    // cut the sequence out\n    if (etype == 'D') {\n      frags.push_back(m_seq.substr(start, end - start));\n    } else {\n      // make the random insertion\n      frags.push_back(ins_string + m_seq.substr(start, end - start));\n    }\n\n  }\n\n  std::string new_seq;\n  for (auto& i : frags) {\n    new_seq += i;\n  }\n\n  if (m_gr.strand == '-') // flip back if need be\n    SeqLib::rcomplement(new_seq);\n  \n  m_seq = new_seq;\n\n}\n\nvoid SeqFrag::getSeqFromRef(faidx_t * findex) {\n\n  int len;\n  std::string chrstring = m_gr.ChrName(SeqLib::BamHeader());\n  char * seq = faidx_fetch_seq(findex, const_cast<char*>(chrstring.c_str()), m_gr.pos1-1, m_gr.pos2/*-1*/, &len);\n  \n  if (!seq) {\n    std::cerr << \"Failed to get reference sequence at \" << m_gr << std::endl;\n    return;\n  }\n  \n  m_seq = std::string(seq);\n\n  // reverse complement if need\n  if (m_gr.strand == '-') {\n    SeqLib::rcomplement(m_seq); \n  }\n}\n\nint SeqFrag::getLeftSide() const {\n\n  if (m_gr.strand == '-')\n    return m_gr.pos2;\n  return m_gr.pos1;\n\n}\n\nint SeqFrag::getRightSide() const {\n\n  if (m_gr.strand == '-')\n    return m_gr.pos1;\n  return m_gr.pos2;\n\n\n}\n\nstd::ostream& operator<<(std::ostream& out, const SeqFrag& s) {\n  \n  out << s.m_gr << \"\\t\" << \n      s.m_seq.length() << \"\\t\"\n      << (s.right_scramble.length() ? s.right_scramble : \"N\");\n  return out;\n}\n"
  },
  {
    "path": "src/svabautils/SeqFrag.h",
    "content": "#ifndef SNOWMAN_SEQFRAG_H__\n#define SNOWMAN_SEQFRAG_H__\n\n#include <string>\n\n#include \"SeqLib/BWAWrapper.h\"\n\n#include \"ReadSim.h\"\n\nusing SeqLib::GenomicRegion;\n\nclass SeqFrag {\n\n public:\n\n SeqFrag(const GenomicRegion& gr, faidx_t * findex) : m_gr(gr), m_index(findex) {}\n\n  void getSeqFromRef(faidx_t * findex);\n\n  int getLeftSide() const;\n\n  int getRightSide() const;\n\n  friend std::ostream& operator<<(std::ostream& out, const SeqFrag& s);\n\n  std::string m_seq;\n\n  void addScrambledEnds(size_t left_len, size_t right_len);\n\n  char getStrand() const { return m_gr.strand; }\n\n  void addIndels(size_t n);\n\n  void addIns();\n\n  void spikeMicrobe();\n\n  std::vector<Indel> m_indels;  \n\n  int frag_id;\n\n  std::string left_scramble = \"\";\n  std::string right_scramble = \"\";\n \n  GenomicRegion m_gr;   \n  \n  int32_t phage_site = -1;\n  std::string phage_string = \"\";\n\n private:\n\n  faidx_t * m_index;\n\n};\n\n\n#endif\n"
  },
  {
    "path": "src/svabautils/SimGenome.cpp",
    "content": "#include \"SimGenome.h\"\n\n#include \"SeqLib/GenomicRegionCollection.h\"\n\nSimGenome::SimGenome(const SeqLib::GenomicRegion& gr, int nbreaks, int ndels, faidx_t * findex, bool scramble, int viral_count) : m_gr(gr) {\n  \n  std::vector<size_t> index = {0};\n  size_t ii = 1;\n\n  double viral_prob = viral_count ? (double)viral_count/((double)(nbreaks+1)) * 2 * 1000: 0;\n\n  // int\n  size_t avg_width  = std::max((size_t)(m_gr.Width() / nbreaks  ), (size_t)1000);\n  size_t max_breaks = std::min((size_t)(m_gr.Width() / avg_width), (size_t)nbreaks);\n  std::cerr << \"avg width: \" << avg_width << \" max breaks: \" << max_breaks << std::endl;\n  size_t real_vcount = 0;\n\n  // choose a set of random break points \n  SeqLib::GRC grc;\n  grc.add(SeqLib::GenomicRegion(m_gr.chr, m_gr.pos1, m_gr.pos1, '+'));\n  size_t exp_break = 0;\n  while(grc.size() < (size_t)(nbreaks)) {\n  \n    exp_break += avg_width;\n    uint32_t r = exp_break + (rand() % 400) - 200; //m_gr.Width();\n    r += m_gr.pos1; \n\n    char strand = (rand() % 2) ? '+' : '-';\n    grc.add(SeqLib::GenomicRegion(0, r, r, strand));\n    index.push_back(ii++);\n  }\n\n  // setup the scramble probability distribution\n  std::vector<size_t> scramble_size;\n  for (size_t i = 1; i <= 200; ++i) {\n    if (i <= 100)\n      scramble_size.push_back(0);\n    else \n      scramble_size.push_back(i - 100);\n  }\n\n  grc.SortAndStretchRight(m_gr.pos2);\n  //grc.sendToBED(\"segments.bed\");\n  \n  // shuffle the indices\n  if (index.size() > 2)\n    std::random_shuffle(index.begin() + 1, index.end() - 1); // seeded by srand\n  \n  //debug\n  //for (auto& i : index)\n  //  std::cerr << i << \"\\t\";\n  //std::cerr << std::endl;\n  \n  // get the sequence and add insertions / deletions\n  double grcwidth = grc.TotalWidth();\n  size_t id = 0;\n  for (auto& i : index) {\n    SeqFrag sf(grc.at(i), findex);\n    sf.frag_id = id;\n    ++id;\n    sf.getSeqFromRef(findex);\n\n    if (rand() % 1000 < viral_prob && grc.at(i).strand == '+') {\n      sf.spikeMicrobe();\n      ++real_vcount;\n    } else {\n      int nd = ceil((double)sf.m_seq.length() / grcwidth * (double)ndels);\n      sf.addIndels(nd);\n    }\n\n    // scramble the ends\n    if (scramble) {\n      size_t right = 0;\n      //if (i != 0 && sf.m_gr.strand != '+') // don't scramble left side of +\n      //left = scramble_size[rand() % 200];\n      //else if (i != index.size() && sf.m_gr.strand != '-') // dont' scramble right side - \n      if (i != index.size())\n\tright = scramble_size[rand() % 200];\n      sf.addScrambledEnds(0, right);\n    }\n\n    m_sfv.push_back(sf);\n    m_indels.insert(m_indels.end(), sf.m_indels.begin(), sf.m_indels.end());\n\n  }\n\n  //debug\n  std::ofstream sg;\n  sg.open(\"segments.tsv\", std::ios::out);\n  for (auto& i : m_sfv) {\n    sg << i << std::endl;\n  }\n  sg.close();\n  \n  //debug\n  size_t mmm = 0;\n  for (auto& i : m_sfv)\n    mmm += i.m_indels.size();\n  std::cerr << \"TOTAL NUMBER OF INDELS IS \" << mmm << \" AND VIRAL INTEGRATION IS \" << real_vcount << std::endl;\n\n}\n\nstd::string SimGenome::printBreaks() const {\n\n  std::stringstream ss;\n\n  // MARCIN strand convention here. Left side strand for revComp frag is \"-\". \n  // right side strand for non-revcomp is \"-\"\n\n  for (size_t i = 1; i < m_sfv.size(); ++i) {\n    //ss << m_sfv[i-1].m_gr.chr << \"\\t\" << \n      //      m_sfv[i-1].getRightSide() << \"\\t\" << (m_sfv[i-1].getStrand() == '+' ? '-' : '+')  << \"\\t\" << m_sfv[i-1].left_scramble << \"\\t\" << \n      //m_sfv[i].getLeftSide()    << \"\\t\" << (m_sfv[i].getStrand())                       << \"\\t\" << m_sfv[i].right_scramble << std::endl;\n    ss << m_sfv[i-1].m_gr.chr << \"\\t\" << \n      m_sfv[i-1].getRightSide() << \"\\t\" << (m_sfv[i-1].getStrand() == '+' ? '-' : '+')  << \"\\t\" << \n      m_sfv[i].getLeftSide()    << \"\\t\" << (m_sfv[i].getStrand())                       << \"\\t\" << m_sfv[i-1].right_scramble << std::endl;\n  }\n\n  // loop through the tandem duplications and indels\n  for (auto& i : m_indels) {\n    //if (i.len >= 50 && i.type == 'D') \n    //  ss << i.gr.chr << \"\\t\" << i.gr.pos1 << \"\\t-\" << i.gr.pos2 << \"\\t+\" << std::endl;\n    if (i.len >= 50 && i.type == 'I') // tandem dup\n      ss << i.gr.chr << \"\\t\" << i.gr.pos2 << \"\\t-\\t\" << i.gr.pos1 << \"\\t+\" << std::endl;      \n  }\n  return ss.str();\n\n}\n\nstd::string SimGenome::printMicrobeSpikes() const {\n\n  std::stringstream ss;\n  for (auto& i : m_sfv) {\n    if (i.phage_string.length()) {\n      ss << i.m_gr.chr << \"\\t\" << (i.m_gr.pos1 + i.phage_site) << \"\\t\" << i.phage_string << std::endl;\n    }\n  }\n  return ss.str();\n\n}\nstd::string SimGenome::getSequence() const {\n\n  std::string s;\n  for (auto& i : m_sfv)\n    s += i.m_seq;\n  return s;\n}\n\nstd::ostream& operator<<(std::ostream& out, const SimGenome& s) {\n  \n  //for (auto& i : s.m_sfv) {\n  //  out << i << std::endl;\n  //}\n \n  return out;\n}\n"
  },
  {
    "path": "src/svabautils/SimGenome.h",
    "content": "#ifndef SNOWMAN_SIMGENOME_H__\n#define SNOWMAN_SIMGENOME_H__\n\n#include \"SeqFrag.h\"\n\n#include \"ReadSim.h\"\n\nclass SimGenome {\n\n public:\n\n  SimGenome(const SeqLib::GenomicRegion& gr, int nbreaks, int nindels, faidx_t * findex, bool scramble, int viral_count); \n\n  void addBreak(int b);\n\n  friend std::ostream& operator<<(std::ostream& out, const SimGenome& s);\n\n  std::string getSequence() const;\n\n  std::string printBreaks() const;\n\n  std::vector<Indel> m_indels;\n\n  std::string printMicrobeSpikes() const;\n private:\n  \n  SeqLib::GenomicRegion m_gr;\n\n  std::vector<SeqFrag> m_sfv;\n\n};\n\n#endif\n"
  },
  {
    "path": "src/svabautils/SimTrainerWalker.cpp",
    "content": "#include \"SimTrainerWalker.h\"\n\nvoid SimTrainerWalker::train() {\n\n  SeqLib::BamRecord r;\n  size_t count = 0;\n  while (GetNextRecord(r)) {\n   \n    ++count;\n    \n    // check occasionally that we still have read groups\n    if (count % 10000 == 0)\n      assert(r.GetZTag(\"RG\").length());\n\n    if (count % 1000000 == 0)\n      std::cerr << \"...training on read \" << SeqLib::AddCommas(count) << \" at read at \" << r.Brief() << std::endl;\n\n    m_bam_stats.addRead(r);\n    \n  }\n   \n\n}\n\nstd::string SimTrainerWalker::printBamStats() const {\n\n  std::stringstream ss;\n  ss << m_bam_stats;\n  return ss.str();\n}\n"
  },
  {
    "path": "src/svabautils/SimTrainerWalker.h",
    "content": "#ifndef SNOWMAN_SIMTRAINER_WALKER_H__\n#define SNOWMAN_SIMTRAINER_WALKER_H__\n\n#include \"SeqLib/BamReader.h\"\n#include \"BamStats.h\"\n\nclass SimTrainerWalker : public SeqLib::BamReader {\n\n public:\n  \n  SimTrainerWalker() {}\n\n  void train();\n\n  std::string printBamStats() const;\n \n private:\n\n  BamStats m_bam_stats;\n    \n};\n\n\n#endif\n"
  },
  {
    "path": "src/svabautils/assembly2vcf.cpp",
    "content": "#include \"assembly2vcf.h\"\n\n#include <getopt.h>\n#include <string>\n#include <sstream>\n#include <iostream>\n\n#include \"vcf.h\"\n#include \"AssemblyBamWalker.h\"\n#include \"SnowmanBamWalker.h\"\n#include \"SnowmanUtils.h\"\n\n#define MIN_ISIZE_FOR_DISC 700 \n\nfaidx_t * findex;\n\nenum { \n  OPT_NO_READS\n};\n\nstruct bidx_delete {\n  void operator()(void* x) { hts_idx_destroy((hts_idx_t*)x); }\n};\n\nstatic const char* shortopts = \"hi:m:q:p:v:k:z:x:a:r:t:n:G:\";\nstatic const struct option longopts[] = {\n  { \"help\",                    no_argument, NULL, 'h' },\n  { \"assembly-bam\",            required_argument, NULL, 'i' },\n  { \"tumor-reads-bam\",         required_argument, NULL, 't' },\n  { \"normal-reads-bam\",        required_argument, NULL, 'n' },\n  { \"indel-mask\",              required_argument, NULL, 'm' },\n  { \"panel-of-normals\",        required_argument, NULL, 'q' },\n  { \"id-string\",               required_argument, NULL, 'a' },\n  { \"normal-bam\",              required_argument, NULL, 'n' },\n  { \"threads\",                 required_argument, NULL, 'p' },\n  { \"region-file\",             required_argument, NULL, 'k' },\n  { \"rules\",                   required_argument, NULL, 'r' },\n  { \"no-zip\",                  no_argument, NULL, 'z' },\n  { \"no-read-tracking\",        no_argument, NULL, OPT_NO_READS },\n  { \"no-r2c-bam\",              no_argument, NULL, 'x' },\n  { \"threads\",                 required_argument, NULL, 'p' },\n  { \"verbose\",                 required_argument, NULL, 'v' },\n  { \"reference-genome\",        required_argument, NULL, 'G' },\n  { NULL, 0, NULL, 0 }\n};\n\n\nstatic const char *ASSEMBLY2VCF_USAGE_MESSAGE =\n\"Usage: snowman assembly2vcf -i <assembly_bam> -r <reads_bam>\\n\\n\"\n\"  Description: Take a BAM (from de novo assembly) and aligned reads --> Call variants\\n\"\n\"\\n\"\n\"  General options\\n\"\n\"  -v, --verbose                        Select verbosity level (0-4). Default: 1 \\n\"\n\"  -h, --help                           Display this help and exit\\n\"\n\"  -p, --threads                        Use NUM threads to run snowman. Default: 1\\n\"\n\"  Required input\\n\"\n\"  -i, --assembly-bam                   BAM from aligned de-novo assembly\\n\"\n\"  -t, --tumor-reads-bam                BAM from tumor reads\\n\"\n\"  -n, --normal-reads-bam               BAM from normal reads\\n\"\n\"  -G, --reference-genome               Path to indexed reference genome to be used by BWA-MEM. Default is Broad hg19 (/seq/reference/...)\\n\"\n\"  Optional input\\n\"                       \n\"  -a, --id-string                      String specifying the analysis ID to be used as part of ID common.\\n\"\n\"  -r, --rules                          VariantBam style rules string to determine which reads to do assembly on. See documentation for default.\\n\"\n\"  -k, --region-file                    Set a region txt file. Format: one region per line, Ex: 1,10000000,11000000\\n\"\n\"  -q, --panel-of-normals               Panel of normals gzipped txt file generated from snowman pon\\n\"\n\"  -m, --indel-mask                     BED-file with blacklisted regions for indel calling. Default /xchip/gistic/Jeremiah/Projects/HengLiMask/um75-hs37d5.bed.gz\\n\"\n\"      --no-read-tracking               Don't track supporting reads. Reduces file size.\\n\"\n\"      --no-zip                         Don't tabix and gzip the output vcf files.\\n\"\n\"\\n\";\n\nnamespace opt {\n\n  static std::string args = \"snowman \";\n  static std::string assembly_bam;\n  static std::string tumor_reads_bam;\n  static std::string normal_reads_bam;\n  static std::string analysis_id = \"assembly2vcf_noid\";\n  static size_t verbose = 1;\n  static std::string rules = \"{\\\"global\\\" : {\\\"duplicate\\\" : false, \\\"qcfail\\\" : false}, \\\"\\\" : { \\\"rules\\\" : [{\\\"isize\\\" : [MINS,0]},{\\\"rr\\\" : true},{\\\"ff\\\" : true}, {\\\"rf\\\" : true}, {\\\"ic\\\" : true}, {\\\"clip\\\" : 5, \\\"phred\\\" : 4}, {\\\"ins\\\" : true}, {\\\"del\\\" : true}, {\\\"mapped\\\": true , \\\"mate_mapped\\\" : false}, {\\\"mate_mapped\\\" : true, \\\"mapped\\\" : false}]}}\"; \n  static std::string indel_mask = \"\";\n  static std::string pon = \"\";\n  static bool no_reads = false;\n  static bool zip = true;\n  static size_t numThreads = 1;\n  static bool no_r2c = false;\n  static std::string regionFile = \"\";\n  static std::string refgenome = SnowTools::REFHG19;  \n}\n\n\n\nvoid runAssembly2VCF(int argc, char** argv)\n{\n\n  // parse the options\n  parseAssembly2VCFOptions(argc, argv);\n\n  // load the reference\n  findex = fai_load(opt::refgenome.c_str());  // load the reference\n\n  // set the min isize for FR discordants\n  opt::rules.replace(opt::rules.find(\"MINS\"), 4, std::to_string(MIN_ISIZE_FOR_DISC));\n\n  SnowmanBamWalker twalk, nwalk;\n  SnowTools::MiniRulesCollection * mr;\n  if (SnowTools::read_access_test(opt::tumor_reads_bam)) {\n    twalk = SnowmanBamWalker(opt::tumor_reads_bam);\n    twalk.prefix= \"t000\";  \n    twalk.max_cov = 500;\n    mr = new SnowTools::MiniRulesCollection(opt::rules, twalk.header());\n    twalk.SetMiniRulesCollection(*mr);\n  } \n  if (SnowTools::read_access_test(opt::normal_reads_bam)) {\n    nwalk = SnowmanBamWalker(opt::normal_reads_bam);\n    nwalk.prefix= \"n000\";\n    nwalk.max_cov = 500;\n    mr = new SnowTools::MiniRulesCollection(opt::rules, twalk.header());\n    nwalk.SetMiniRulesCollection(*mr);    \n  }\n    \n\n\n  // read in the assembly bam file\n  AssemblyBamWalker awalk(opt::assembly_bam);\n  awalk.twalk = twalk;\n  awalk.nwalk = nwalk;\n  awalk.findex = findex;\n  awalk.id = opt::analysis_id;\n  if (SnowTools::read_access_test(opt::tumor_reads_bam))\n    awalk.tindex = std::shared_ptr<hts_idx_t>(hts_idx_load(opt::tumor_reads_bam.c_str(), HTS_FMT_BAI), bidx_delete());\n  if (SnowTools::read_access_test(opt::normal_reads_bam))\n    awalk.nindex = std::shared_ptr<hts_idx_t>(hts_idx_load(opt::normal_reads_bam.c_str(), HTS_FMT_BAI), bidx_delete());\n  else\n    opt::normal_reads_bam = std::string();\n\n  std::cerr << awalk << std::endl;\n\n  awalk.tbam = opt::tumor_reads_bam;\n  awalk.nbam = opt::normal_reads_bam;\n  awalk.numThreads = opt::numThreads;\n  awalk.refGenome = opt::refgenome;\n  awalk.walkDiscovar();\n\n  // make the VCFs\n  std::cerr << \"...loading the bps files for conversion to VCF\" << std::endl;\n  std::string file = opt::analysis_id + \".bps.txt.gz\";\n  if (!SnowTools::read_access_test(file))\n    file = opt::analysis_id + \".bps.txt\";\n\n  // put args into string for VCF later\n  for (int i = 0; i < argc; ++i)\n    opt::args += std::string(argv[i]) + \" \";\n\n  // make the header\n  VCFHeader header;\n  header.filedate = SnowmanUtils::fileDateString();\n  header.source = opt::args;\n  header.reference = opt::refgenome;\n  \n  //boost::filesystem::path tfp(opt::tumor_reads_bam);\n  //boost::filesystem::path nfp(opt::normal_reads_bam);\n\n  // TODO fix this\n  header.addSampleField(opt::tumor_reads_bam);\n  header.colnames += \"\\t\" + opt::tumor_reads_bam;\n  header.addSampleField(opt::normal_reads_bam);\n  header.colnames += \"\\t\" + opt::normal_reads_bam;\n  //header.addSampleField(nfp.filename().string());\n  //header.colnames += \"\\t\" + nfp.filename().string(); \n  //header.addSampleField(tfp.filename().string());\n  //header.colnames += \"\\t\" + tfp.filename().string(); \n  \n  bool zip = false;\n  VCFFile snowvcf(file, opt::analysis_id, twalk.header(), header);\n  std::string basename = opt::analysis_id + \".unfiltered.\";\n  snowvcf.include_nonpass = true;\n  snowvcf.writeIndels(basename, zip, false);\n  snowvcf.writeSVs(basename, zip, false);\n  \n  basename = opt::analysis_id + \".assembly.\"; //\"assembly.\";\n  snowvcf.include_nonpass = false;\n  snowvcf.writeIndels(basename, zip, false);\n  snowvcf.writeSVs(basename, zip, false);\n\n}\n\n// parse the command line options\nvoid parseAssembly2VCFOptions(int argc, char** argv) {\n\n  bool die = false;\n\n  if (argc <= 2) \n    die = true;\n\n  for (char c; (c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1;) {\n    std::istringstream arg(optarg != NULL ? optarg : \"\");\n    switch (c) {\n      case 'p': arg >> opt::numThreads; break;\n      case 'a': arg >> opt::analysis_id; break;\n      case 'm': arg >> opt::indel_mask; break;\n      case 'q': arg >> opt::pon; break;\n      case 'z': opt::zip = false; break;\n      case 'h': die = true; break;\n      case 'x': opt::no_r2c = true; break;\n      case OPT_NO_READS: opt::no_reads = true; break;\n      case 'i': arg >> opt::assembly_bam; break;\n      case 't': arg >> opt::tumor_reads_bam; break;\n      case 'n': arg >> opt::normal_reads_bam; break;\n      case 'k': arg >> opt::regionFile; break;\n      case 'r': arg >> opt::rules; break;\n      case 'v': arg >> opt::verbose; break;\n      case 'G': arg >> opt::refgenome; break;\n      default: die= true; \n    }\n  }\n\n  if (die) \n    {\n      std::cout << \"\\n\" << ASSEMBLY2VCF_USAGE_MESSAGE;\n      exit(EXIT_FAILURE);\n    }\n}\n"
  },
  {
    "path": "src/svabautils/assembly2vcf.h",
    "content": "#ifndef SNOWMAN_ASSEMBLY2VCF_H__\n#define SNOWMAN_ASSEMBLY2VCF_H__\n\nvoid parseAssembly2VCFOptions(int argc, char** argv);\n\nvoid runAssembly2VCF(int argc, char** argv);\n\n\n#endif\n"
  },
  {
    "path": "src/svabautils/benchmark.cpp",
    "content": " #include \"benchmark.h\"\n\n #include <getopt.h>\n #include <string>\n #include <sstream>\n #include <fstream>\n #include <iostream>\n #include <cstdlib>\n #include <algorithm>\n\n #include \"vcf.h\"\n #include \"Fractions.h\"\n #include \"SeqLib/BWAWrapper.h\"\n #include \"SeqLib/SeqLibCommon.h\"\n #include \"SeqLib/GenomicRegion.h\"\n\n #include \"ReadSim.h\"\n #include \"SeqFrag.h\"\n #include \"SimGenome.h\"\n #include \"KmerFilter.h\"\n #include \"PowerLawSim.h\"\n #include \"BamSplitter.h\"\n #include \"SnowmanUtils.h\"\n #include \"AlignedContig2.h\"\n #include \"SimTrainerWalker.h\"\n #include \"SnowmanAssemblerEngine.h\"\n\n\n static std::vector<double> snv_error_rates;\n static std::vector<double> del_error_rates;\n static std::vector<double> ins_error_rates;\n static std::vector<double> coverages;\n static std::vector<double> fractions;\n\n static SeqLib::GRC regions;\n static Fractions fractions_bed;\n static SeqLib::BamReader bwalker;\n static faidx_t * findex;\n\n #define DEFAULT_SNV_RATE 0.01\n #define DEFAULT_DEL_RATE 0.05\n #define DEFAULT_INS_RATE 0.05\n #define DEFAULT_COV 10\n\n namespace opt {\n\n   static std::string refgenome = \"/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta\";\n   static int mode = -1;\n   static size_t readlen = 101;\n   static int num_runs = 100;\n   static uint32_t seed = 0;\n   static std::string regionFile = \"\";\n   static std::string bam = \"\";\n   static int isize_mean = 250;\n   static int isize_sd = 50;\n\n   static int nbreaks = 10;\n   static int nindels = 10;\n\n   static std::string string_id = \"noid\";\n\n   static std::string frac_bed_file;\n\n   static bool scramble = false;\n\n   static int viral_count = 0;\n\n   static std::string blacklist;\n\n   static std::set<std::string> prefixes;\n }\n\n enum { \n   OPT_ASSEMBLY,\n   OPT_SIMBREAKS,\n   OPT_ISIZE_MEAN,\n   OPT_ISIZE_SD,\n   OPT_SPLITBAM,\n   OPT_SCRAMBLE,\n   OPT_POWERSIM,\n   OPT_REALIGN,\n   OPT_BLACKLIST, \n   OPT_REALIGN_SV\n };\n\n\n static const char *BENCHMARK_USAGE_MESSAGE =\n \"Usage: snowman benchmark\\n\\n\"\n \"  Description: Various benchmarking tests for Snowman\\n\"\n \"\\n\"\n \"  General options\\n\"\n \"  -v, --verbose                        Select verbosity level (0-4). Default: 1 \\n\"\n \"  -G, --reference-genome               Indexed ref genome for BWA-MEM. Default (Broad): /seq/reference/...)\\n\"\n \"  -s, --seed                           Seed for the random number generator\\n\"\n \"  -A, --string-id                      String to name output files with (e.g. <string-id>_0_01.bam\\n\"\n \"  Choose one of the following:\\n\"     \n \"      --test-assembly                  Generate single-end reads from small contigs to test assembly/remapping\\n\"\n \"      --sim-breaks-power               Simulate rearrangements and indels and output paired-end reads\\n\"\n \"      --split-bam                      Divide up a BAM file into smaller sub-sampled files, with no read overlaps between files. Preserves read-pairs\\n\"\n \"      --realign-test                   Randomly sample the reference genome and test ability of BWA-MEM to realign to reference for different sizes / error rates\\n\"\n \"      --realign-sv-test                Make an SV (rearrangment) and simulate contigs from it. Test size of contigs vs alignment accuracy for SVs\\n\"\n \"  Shared Options for Test and Simulate:\\n\"\n \"  -c, --read-covearge                  Desired coverage. Input as comma-separated to test multiple (test assembly)\\n\"\n \"  -b, --bam                            BAM file to train the simulation with\\n\"\n \"  -k, --regions                        Regions to simulate breaks or test assembly\\n\"\n \"  -E, --snv-error-rate                 The random SNV error rate per base. Input as comma-separated to test multiple (test assembly)\\n\"\n \"  -I, --ins-error-rate                 The random insertion error rate per read. Input as comma-separated to test multiple (test assembly)\\n\"\n \"  -D, --del-error-rate                 The random deletion error rate per read. Input as comma-separated to test multiple (test assembly)\\n\"\n \"  Test Assembly (--test-assembly) Options:\\n\"\n \"  -n, --num-runs                       Number of random trials to run\\n\"\n   // \"  Simulate Breaks (--sim-breaks)  Options:\\n\"\n   //\"      --isize-mean                     Desired mean insert size for the simulated reads\\n\"\n   //\"      --isize-sd                       Desired std. dev. forinsert size for the simulated reads\\n\"\n   //\"  -M, --viral-integration              Number of segments to integrate viruses into. (Reduces amount of space for indels)\\n\"\n   //\"      --add-scrambled-inserts          Add scrambled inserts at junctions, randomly between 0 and 100 bp with p(0) = 50% and p(1-100) = 50%;\\n\"\n \"  Simulate Breaks with Power Law(--sim-breaks-power)  Options:\\n\"\n \"      --blacklist                      BED file specifying blacklist regions not to put breaks in\\n\"\n \"  -R, --num-rearrangements             Number of rearrangements to simulate\\n\"\n \"  -X, --num-indels                     Number of indels to simulate\\n\"\n \"  Split Bam (--split-bam)  Options:\\n\"\n \"  -f, --fractions                      Fractions to split the bam into\\n\"\n \"\\n\";\n\n\n static const char* shortopts = \"haG:c:n:s:k:b:E:I:D:R:X:A:f:M:\";\n static const struct option longopts[] = {\n   { \"help\",                 no_argument, NULL, 'h' },\n   { \"reference-genome\",     required_argument, NULL, 'G' },\n   { \"string-id\",            required_argument, NULL, 'A' },\n   { \"seed\",                 required_argument, NULL, 's' },\n   { \"num-runs\",             required_argument, NULL, 'n' },\n   { \"regions\",              required_argument, NULL, 'k' },\n   { \"bam\",                  required_argument, NULL, 'b' },\n   { \"read-coverage\",        required_argument, NULL, 'c' },\n   { \"snv-error-rate\",       required_argument, NULL, 'E' },\n   { \"del-error-rate\",       required_argument, NULL, 'D' },\n   { \"ins-error-rate\",       required_argument, NULL, 'I' },\n   { \"num-rearrangements\",   required_argument, NULL, 'R' },\n   { \"fractions\",            required_argument, NULL, 'f' },\n   { \"num-indels\",           required_argument, NULL, 'X' },\n   { \"viral-integration\",    required_argument, NULL, 'M' },\n   { \"isize-mean\",           required_argument, NULL, OPT_ISIZE_MEAN},\n   { \"isize-sd\",             required_argument, NULL, OPT_ISIZE_SD},\n   { \"test-assembly\",        no_argument, NULL, OPT_ASSEMBLY},\n   { \"blacklist\",            required_argument, NULL, OPT_BLACKLIST},\n   { \"sim-breaks-power\",     no_argument, NULL, OPT_POWERSIM},\n   { \"sim-breaks\",           no_argument, NULL, OPT_SIMBREAKS},\n   { \"split-bam\",            no_argument, NULL, OPT_SPLITBAM},\n   { \"realign-sv-test\",      no_argument, NULL, OPT_REALIGN_SV},\n   { \"add-scrambled-inserts\",no_argument, NULL, OPT_SCRAMBLE},\n   { \"realign-test\",no_argument, NULL, OPT_REALIGN},\n   { NULL, 0, NULL, 0 }\n };\n\n void runBenchmark(int argc, char** argv) {\n\n   parseBenchmarkOptions(argc, argv);\n\n   opt::prefixes.insert(opt::bam);\n\n   std::cerr << \n     \"-----------------------------------------\" << std::endl << \n     \"--- Running Snowman Benchmarking Test ---\" << std::endl <<\n     \"-----------------------------------------\" << std::endl;\n   if (opt::mode == OPT_ASSEMBLY)\n     std::cerr << \"********* RUNNING ASSEMBLY TEST ***********\" << std::endl;\n   else if (opt::mode == OPT_SIMBREAKS)\n     std::cerr << \"********* RUNNING SIMULATE BREAKS ***********\" << std::endl;\n   else if (opt::mode == OPT_SPLITBAM)\n     std::cerr << \"********* RUNNING SPLIT BAM ***********\" << std::endl;\n   else if (opt::mode == OPT_REALIGN)\n     std::cerr << \"********* RUNNING REALIGN TEST ***********\" << std::endl;    \n   else if (opt::mode == OPT_REALIGN_SV)\n     std::cerr << \"********* RUNNING REALIGN SV TEST ***********\" << std::endl;    \n\n   if (opt::mode == OPT_ASSEMBLY || opt::mode == OPT_SIMBREAKS) {\n     std::cerr << \"    Error rates:\" << std::endl;\n     std::cerr << errorRateString(snv_error_rates, \"SNV\") << std::endl;\n     std::cerr << errorRateString(ins_error_rates, \"Del\") << std::endl;\n     std::cerr << errorRateString(del_error_rates, \"Ins\") << std::endl;\n     std::cerr << errorRateString(coverages, \"Coverages\") << std::endl;\n     std::cerr << \"    Insert size: \" << opt::isize_mean << \"(\" << opt::isize_sd << \")\" << std::endl;\n   } else if (opt::mode == OPT_SPLITBAM) {\n     std::cerr << errorRateString(fractions, \"Fractions\") << std::endl;\n   }\n\n   // open the BAM\n   if (opt::bam.length() && SeqLib::read_access_test(opt::bam)) {\n     assert(bwalker.Open(opt::bam));\n   }\n   else if (opt::mode == OPT_REALIGN || opt::mode == OPT_SPLITBAM || opt::mode == OPT_REALIGN_SV) {\n     std::cerr << \"NEED TO INPUT VALID BAM (perhaps just to get header info)\" << std::endl;\n     exit(EXIT_FAILURE);\n  }\n    // parse the region file\n  if (opt::regionFile.length()) {\n    if (SeqLib::read_access_test(opt::regionFile)) {\n      regions = SeqLib::GRC(opt::regionFile, bwalker.Header());\n      regions.MergeOverlappingIntervals();\n    }\n    // samtools format\n    else if (opt::regionFile.find(\":\") != std::string::npos && opt::regionFile.find(\"-\") != std::string::npos) {\n      if (bwalker.Header().isEmpty()) {\n\tstd::cerr << \"Error: To parse a samtools style string, need a BAM header. Input bam with -b\" << std::endl;\n\texit(EXIT_FAILURE);\n      }\n      regions.add(SeqLib::GenomicRegion(opt::regionFile, bwalker.Header()));    \n    } else {\n      std::cerr << \"Can't parse the regions. Input as BED file or Samtools style string (requires BAM with -b to for header info)\" << std::endl;\n      exit(EXIT_FAILURE);\n    }\n    if (!regions.size()) {\n      std::cerr << \"ERROR: Must input a region to run on \" << std::endl;\n      exit(EXIT_FAILURE);\n    }\n  }\n\n  // seed the RNG\n  if (opt::mode != OPT_SPLITBAM) {\n    if (opt::seed == 0)\n      opt::seed = (unsigned)time(NULL);\n    srand(opt::seed);\n    std::cerr << \"   Seed: \" << opt::seed << std::endl;\n  }\n\n  // read the fractions file\n  if (opt::frac_bed_file.length() && opt::mode == OPT_SPLITBAM) {\n    fractions_bed.readFromBed(opt::frac_bed_file, bwalker.Header());\n    //  fractions_bed.readBEDfile(opt::frac_bed_file.length(), 0, bwalker.header());\n  }\n\n  findex = fai_load(opt::refgenome.c_str());  // load the reference\n\n  SeqLib::GRC blacklist;\n  if (opt::mode == OPT_POWERSIM && !opt::blacklist.empty()) {\n    std::cerr << \"...reading blacklist file \" << opt::blacklist << std::endl;\n    blacklist = SeqLib::GRC(opt::blacklist, bwalker.Header());\n    blacklist.CreateTreeMap();\n    std::cerr << \"...read in \" << blacklist.size() << \" blacklist regions \" << std::endl;\n  }\n\n  // \n  if (opt::mode == OPT_ASSEMBLY)\n    assemblyTest();\n  else if (opt::mode == OPT_SIMBREAKS)\n    genBreaks();\n  else if (opt::mode == OPT_SPLITBAM)\n    splitBam();\n  else if (opt::mode == OPT_REALIGN)\n    realignRandomSegments();\n  else if (opt::mode == OPT_REALIGN_SV)\n    realignBreaks();\n  else if (opt::mode == OPT_POWERSIM)  {\n\n    std::cerr << \"...opening output\" << std::endl;\n    std::ofstream outfasta;\n    SnowmanUtils::fopen(\"tumor_seq.fa\", outfasta);\n    \n    std::ofstream events;\n    SnowmanUtils::fopen(\"events.txt\", events);\n    \n    PowerLawSim(findex, opt::nbreaks, -1.0001, blacklist, outfasta, events);\n    outfasta.close();\n    events.close();\n  }\n  else \n    std::cerr << \"Mode not recognized. Chose from: --test-assembly, --sim-breaks, --split-bam\" << std::endl;\n\n}\n\nstd::string genBreaks() {\n\n  // train on the input BAM\n  std::vector<std::string> quality_scores;\n  SeqLib::GenomicRegion v(0, 1000000,2000000);\n    /*  std::vector<SeqLib::GenomicRegion> v = {\n    SeqLib::GenomicRegion(0, 1000000, 2000000)\n    SeqLib::GenomicRegion(0, 60000000,70000000),\n    SeqLib::GenomicRegion(1, 1000000, 10000000), \n    SeqLib::GenomicRegion(1, 60000000,70000000),\n    SeqLib::GenomicRegion(2, 1000000, 10000000), \n    SeqLib::GenomicRegion(3, 60000000,70000000),\n    SeqLib::GenomicRegion(16, 1000000,1110000),\n    SeqLib::GenomicRegion(17, 1000000,1110000),\n    SeqLib::GenomicRegion(21, 1000000,1110000) \n    };*/\n  \n  /*\n  SimTrainerWalker stw(opt::bam);\n  stw.setBamWalkerRegions(v);\n\n  stw.train();\n  std::ofstream bamstats(\"bam_stats.txt\");\n  bamstats << stw.printBamStats() << std::endl;\n  bamstats.close();\n  */\n\n  bwalker.SetRegion(v);\n  SeqLib::BamRecord r; \n  std::cerr << \"...sampling reads to learn quality scores\" << std::endl;\n  while (bwalker.GetNextRecord(r)) {\n    std::string ss = r.Sequence();\n    if (ss.find(\"AAAAAAAA\") == std::string::npos && ss.find(\"TTTTTTTT\") == std::string::npos) // already handle homopolymers\n      quality_scores.push_back(r.Qualities());\n  }\n  \n  std::cerr << \"...loading the reference genome\" << std::endl;\n\n\n  SeqLib::GenomicRegion gg = regions[0];\n  std::cerr << \"--Generating breaks on: \" << gg << std::endl; \n  std::cerr << \"--Total number of rearrangement breaks: \" << opt::nbreaks << std::endl; \n  std::cerr << \"--Total (approx) number of indels: \" << opt::nindels << std::endl; \n\n  SimGenome sg(gg, opt::nbreaks, opt::nindels, findex, opt::scramble, opt::viral_count);\n  \n  std::string final_seq = sg.getSequence();\n  \n  // write the final seq to a file\n  std::ofstream fseq;\n  fseq.open(\"tumor_seq.fa\", std::ios::out);\n  fseq << \">tumor\\n\" << final_seq << std::endl;\n  fseq.close();\n  //exit(1);\n\n  ReadSim rs;\n\n  std::ofstream ind;\n  ind.open(\"indels.tsv\", std::ios::out);\n  for (auto& i : sg.m_indels)\n    ind << i << std::endl;\n  ind.close();\n\n\n  std::ofstream con;\n  con.open(\"connections.tsv\", std::ios::out);\n  con << sg.printBreaks();\n  con.close();\n\n  std::ofstream mic;\n  mic.open(\"microbe_spikes.tsv\", std::ios::out);\n  mic << sg.printMicrobeSpikes();\n  mic.close();\n  \n  exit(0);\n\n  rs.addAllele(final_seq, 1);\n\n  // sample paired reads\n  std::vector<std::string> reads1;\n  std::vector<std::string> reads2;\n  std::vector<std::string> qual1;\n  std::vector<std::string> qual2;\n  std::cerr << \"Simulating reads at coverage of \" << coverages[0] << \" del rate \" << del_error_rates[0] << \n    \" ins rate \" << ins_error_rates[0] << \" snv-rate \" << snv_error_rates[0] << \n    \" isize \" << opt::isize_mean << \"(\" << opt::isize_sd << \")\" << std::endl;\n  rs.samplePairedEndReadsToCoverage(reads1, reads2, qual1, qual2, coverages[0], snv_error_rates[0], ins_error_rates[0], del_error_rates[0], \n\t\t\t\t    opt::readlen, opt::isize_mean, opt::isize_sd, quality_scores);\n  assert(reads1.size() == reads2.size());\n  \n  // write the paired end fastq. Give random errors\n  std::cerr << \"...writing/errorring reads 1\" << std::endl;\n  std::ofstream pe1;\n  pe1.open(\"paired_end1.fastq\", std::ios::out);\n  size_t ccc= 0;\n  for (size_t i = 0; i < reads1.size(); ++i) {\n    rs.baseQualityRelevantErrors(reads1[i], qual1[i]);\n    pe1 << \"@r\" << ccc++ << std::endl << reads1[i] << std::endl << \"+\\n\" << qual1[i] << std::endl;\n  }\n  pe1.close();\n\n  std::cerr << \"...writing/erroring reads 2\" << std::endl;  \n  std::ofstream pe2;\n  pe2.open(\"paired_end2.fastq\", std::ios::out);\n  ccc= 0;\n  for (size_t i = 0; i < reads2.size(); ++i) { \n    //std::string qs = quality_scores[rand() % quality_scores.size()];\n    rs.baseQualityRelevantErrors(reads2[i], qual2[i]);\n    pe2 << \"@r\" << ccc++ << std::endl << reads2[i] << std::endl << \"+\\n\" << qual2[i] << std::endl;\n  }\n  pe2.close();\n\n  std::cerr << \"********************************\" << std::endl;\n  std::cerr << \"Suggest running: \" << std::endl;\n  std::cerr << \"bwa mem -t 10 $REFHG19 paired_end1.fastq paired_end2.fastq | samtools sort -O bam -T /tmp -l 9 -m 16G > sim.bam && samtools index sim.bam\" << std::endl;\n  std::cerr << \"snowman benchmark --split-bam -f 0.3,0.6 -b $n11 -k <region> -A norm\" << std::endl;\n  std::cerr << \"samtools merge sim_wnormal.bam sim.bam norm_0.30_subsampled.bam\" << std::endl;\n  std::cerr << \"samtools index norm_0.60_subsampled.bam && samtools index sim_wnormal.bam\" << std::endl;\n  //std::cerr << \"bwa mem $REFHG19 paired_end1.fastq paired_end2.fastq | samtools sort -O bam -T /tmp -l 9 -m 16G > sim.bam && samtools sort sim.bam\" << std::endl;\n  //std::cerr << \"bwa mem $REFHG19 paired_end1.fastq paired_end2.fastq > sim.sam && samtools view sim.sam -Sb > tmp.bam && \" << \n  //  \"samtools sort -m 4G tmp.bam sim && rm sim.sam tmp.bam && samtools index sim.bam\" << std::endl;\n  std::cerr << \"********************************\" << std::endl;\n\n  return \"\";\n}\n\nvoid splitBam() {\n\n  BamSplitter bs(opt::seed);\n  assert(bs.Open(opt::bam));\n\n  // set the regions to split on\n  if (regions.size()) \n    bs.SetMultipleRegions(regions);\n\n  std::cerr << \"...set \" << regions.size() << \" walker regions \" << std::endl;\n\n  if (fractions_bed.size()) {\n    bs.fractionateBam(opt::string_id + \".fractioned.bam\", fractions_bed);\n  } else {\n\n    // set the output bams\n    std::vector<std::string> fnames;\n    for (auto& i : fractions) {\n      std::stringstream ss;\n      ss.precision(2);\n      ss << opt::string_id << \"_\" << i << \"_subsampled.bam\";\n      fnames.push_back(ss.str());\n    }\n    \n    bs.setWriters(fnames, fractions);\n    bs.splitBam();\n  }\n\n}\n\nvoid assemblyTest() {\n\n  SeqLib::GenomicRegion gr(16, 7565720, 7575000); //\"chr17:7,569,720-7,592,868\");\n \n  std::cerr << \"...loading the reference genome\" << std::endl;\n  findex = fai_load(opt::refgenome.c_str());  // load the reference\n  std::string local_ref = \"\"; // debug // getRefSequence(\"16\", gr, findex);\n\n  size_t seqlen = local_ref.length();\n  if (seqlen * 2 <= opt::readlen) {\n    std::cerr << \"**** Read length must be > 2 * sequence length\" << std::endl;\n    exit(EXIT_FAILURE);\n  }\n\n  // make the BWA Wrapper\n  std::cerr << \"...constructing local_seq index\" << std::endl;\n  SeqLib::BWAWrapper local_bwa; \n  local_bwa.ConstructIndex({{\"local_ref\", local_ref, std::string()}});\n\n  // align local_seq to itself\n  SeqLib::BamRecordVector self_align;\n  local_bwa.AlignSequence(local_ref, \"local_ref\", self_align, false, false, 0);\n\n  // write out the index\n  local_bwa.WriteIndex(\"local_ref.fa\");\n  std::ofstream fa;\n  fa.open(\"local_ref.fa\");\n  fa << \">local_ref\" << std::endl << local_ref << std::endl;\n  fa.close();\n\n  std::cout << \"coverage\\tnumreads\\tnumcontigs\\tnumfinal\\tcontig_coverage\\tkmer_corr\\terror_rate\" << std::endl;\n  for (int rep = 0; rep < opt::num_runs; ++rep) {\n    std::cerr << \"...assembly test. Working on iteration \" << rep << \" of \" << opt::num_runs << std::endl;\n    for (int k = 1; k <= 1; ++k) {\n      for (auto& c : coverages) {\n\tfor (auto& E : snv_error_rates) {\n\t  for (auto& D : del_error_rates) {\n\t    for (auto& I : ins_error_rates) {\n\t  \t  \n\t      // make the read vector\n\t      ReadSim rs;\n\t      rs.addAllele(local_ref, 1);\n\t      \n\t      // sample reads randomly\n\t      //std::cerr << \"...making read vector\" << std::endl;\n\t      std::vector<std::string> reads;  \n\t      rs.sampleReadsToCoverage(reads, c, E, I, D, opt::readlen);\n\t      \n\t      // sample paired reads\n\t      //std::cerr << \"...making paired-end read vector\" << std::endl;\n\t      std::vector<std::string> reads1;\n\t      std::vector<std::string> reads2;\n\t      std::vector<std::string> qual1;\n\t      std::vector<std::string> qual2;\n\t      std::vector<std::string> qual = {std::string('I',opt::readlen)};\n\t      rs.samplePairedEndReadsToCoverage(qual1, qual2, reads1, reads2, c, E, I, D, opt::readlen, 350, 50, qual);\n\t      assert(reads1.size() == reads2.size());\n\t      \n\t      // align these reads to the local_seq\n\t      //std::cerr << \"...realigned to local_seq\" << std::endl;\n\t      SeqLib::BamRecordVector reads_to_local;\n\t      int count = 0;\n\t      for (auto& i : reads) {\n\t\tif (i.find(\"N\") == std::string::npos) {\n\t\t  SeqLib::BamRecordVector read_hits;\n\t\t  local_bwa.AlignSequence(i, \"read_\" + std::to_string(++count), read_hits, false,false, 0);\n\t\t  if (read_hits.size())\n\t\t    reads_to_local.push_back(read_hits[0]);\n\t\t}\n\t      }\n\t      \n\t      // kmer filter the reads\n\t      KmerFilter kmer;\n\t      if (k == 1)\n\t\tkmer.correctReads(reads_to_local, reads_to_local);\n\t      \n\t      //std::cerr << \" Attempted align of \" << reads.size() << \" to local_seq. Got hits on \" << reads_to_local.size() << std::endl;\n\t  \n\t  // make plot of reads to contig\n\t  //AlignedContig sa(self_align);  \n\t  //sa.alignReads(reads_to_local);\n\t  \n\t  // assemble them\n\t  //std::cerr << \"...assembling\" << std::endl;\n\t  double error_rate = 0;\n\t  if (k == 0)\n\t    error_rate = 0.05;\n\t  int min_overlap = 35;\n\t  SnowmanAssemblerEngine engine(\"test\", error_rate, min_overlap, opt::readlen);\n\t  engine.fillReadTable(reads_to_local);\n\t  engine.performAssembly(2);\n\t  \n\t  // align them back\n\t  SeqLib::BamRecordVector contigs_to_local;\n\t  for (auto& i : engine.getContigs()) {\n\t    SeqLib::BamRecordVector ct_alignments;\n\t    local_bwa.AlignSequence(i.Seq, i.Name, ct_alignments, false, false, 0);\n\t    AlignedContig ac(ct_alignments, opt::prefixes);\n\t    //ac.alignReads(reads_to_local);\n\t    //std::cout << ac;\n\t    contigs_to_local.insert(contigs_to_local.begin(), ct_alignments.begin(), ct_alignments.end());\n\t  }\n\t  \n\t  // write the results\n\t  SeqLib::GRC grc(contigs_to_local);\n\t  grc.MergeOverlappingIntervals();\n\t  double width = 0;\n\t  for (auto& i : grc)\n\t    width = std::max(width, (double)i.Width());\n\t  width = width / local_ref.length();\n\t  std::cout << c << \"\\t\" << reads_to_local.size() << \"\\t\" << engine.getContigs().size() << \n\t    \"\\t\" << grc.size() << \"\\t\" << width << \"\\t\" << k << \"\\t\" << E << std::endl;\n\t  \n\t  if (k == 1 && c == 20 && E == 0.01) {\n\t    // write out the contig to local ref bam\n\t    SeqLib::BamWriter bw2;\n\t    bw2.Open(\"contigs_to_ref.bam\");\n\t    bw2.SetHeader(local_bwa.HeaderFromIndex());\n\t    bw2.WriteHeader();\n\t    for (auto& i : contigs_to_local)\n\t      bw2.WriteRecord(i);\n\t    \n\t    // write the paired end fasta\n\t    std::ofstream pe1;\n\t    pe1.open(\"paired_end1.fa\", std::ios::out);\n\t    size_t ccc= 0;\n\t    for (auto& i : reads1)\n\t      pe1 << \">r\" << ccc++ << std::endl << i << std::endl;\n\t    pe1.close();\n\n\t    std::ofstream pe2;\n\t    pe2.open(\"paired_end2.fa\", std::ios::out);\n\t    ccc= 0;\n\t    for (auto& i : reads2)\n\t      pe2 << \">r\" << ccc++ << std::endl << i << std::endl;\n\t    pe2.close();\n\t    \n\t    // write out the read to local ref aligned bam\n\t    SeqLib::BamWriter bw;\n\t    bw.Open(\"reads_to_ref_\" + std::to_string(c) + \".bam\");\n\t    bw.SetHeader(local_bwa.HeaderFromIndex());\n\t    bw.WriteHeader();\n\t    for (auto& i : reads_to_local)\n\t      bw.WriteRecord(i);\n\t    \n\t    SeqLib::BamWriter bwk;\n\t    bwk.Open(\"k.bam\");\n\t    bwk.SetHeader(local_bwa.HeaderFromIndex());\n\t    bwk.WriteHeader();\n\t    for (auto& i : reads_to_local) {\n\t      std::string kc = i.GetZTag(\"KC\");\n\t      if (kc.length())\n\t\ti.SetSequence(kc);\n\t      bwk.WriteRecord(i);\n\t    }\n\t    \n\t  }\n\t    } // end kmer loop\n\t  } // end error loop\n\t} // end coverage\n      }\n    }\n  }\n}\n\n  \n    void parseBenchmarkOptions(int argc, char** argv) {\n    \n    bool die = false;\n\n  if (argc < 2) \n    die = true;\n\n  std::string del_er;\n  std::string snv_er;\n  std::string ins_er;\n  std::string covs;\n  std::string frac;\n\n  std::string t;\n\n  for (char c; (c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1;) {\n    std::istringstream arg(optarg != NULL ? optarg : \"\");\n    switch (c) {\n    case 'h': die = true; break;\n    case OPT_ASSEMBLY: opt::mode = OPT_ASSEMBLY; break;\n    case OPT_REALIGN: opt::mode = OPT_REALIGN; break;\n    case OPT_REALIGN_SV: opt::mode = OPT_REALIGN_SV; break;\n    case OPT_POWERSIM: opt::mode = OPT_POWERSIM; break;\n    case OPT_BLACKLIST: arg >> opt::blacklist; break;\n    case 'G': arg >> opt::refgenome; break;\n    case 'n': arg >> opt::num_runs; break;\n    case 's': arg >> opt::seed; break;\n    case 'c': arg >> covs; break;\n    case 'k': arg >> opt::regionFile; break;\n    case 'b': arg >> opt::bam; break;\n    case 'E': arg >> snv_er; break;\n    case 'R': arg >> opt::nbreaks; break;\n    case 'X': arg >> opt::nindels; break;\n    case 'D': arg >> del_er; break;\n    case 'I': arg >> ins_er; break;\n    case 'A': arg >> opt::string_id; break;\n    case 'f': arg >> frac; break;\n    case 'M': arg >> opt::viral_count; break;\n    case OPT_SIMBREAKS: opt::mode = OPT_SIMBREAKS; break;\n    case OPT_SPLITBAM: opt::mode = OPT_SPLITBAM; break;\n    case OPT_ISIZE_MEAN: arg >> opt::isize_mean; break;\n    case OPT_ISIZE_SD: arg >> opt::isize_sd; break;\n    case OPT_SCRAMBLE: opt::scramble = true; break;\n    default: die= true; \n    }\n  }\n\n  if (die) {\n    std::cerr << \"\\n\" << BENCHMARK_USAGE_MESSAGE;\n    exit(EXIT_FAILURE);\n  }\n\n  // parse the error rates\n  snv_error_rates = parseErrorRates(snv_er);\n  del_error_rates = parseErrorRates(del_er);\n  ins_error_rates = parseErrorRates(ins_er);\n  coverages = parseErrorRates(covs);\n\n  // parse the fractions string or read file\n  if (!SeqLib::read_access_test(frac))\n    fractions = parseErrorRates(frac);\n  else\n    opt::frac_bed_file = frac;\n\n  // check that the bam is valid\n  if (opt::mode == OPT_SIMBREAKS && !SeqLib::read_access_test(opt::bam)) {\n    std::cerr << \"ERROR: Input BAM required for --sim-breaks\" << std::endl;\n    exit(EXIT_FAILURE);\n  }\n\n  // set the default error rates\n  if (!snv_error_rates.size())\n    snv_error_rates.push_back(DEFAULT_SNV_RATE);\n  if (!del_error_rates.size())\n    del_error_rates.push_back(DEFAULT_DEL_RATE);\n  if (!ins_error_rates.size())\n    ins_error_rates.push_back(DEFAULT_INS_RATE);\n  if (!coverages.size())\n    coverages.push_back(DEFAULT_COV);\n  if ((!fractions.size() && !opt::frac_bed_file.length()) && opt::mode == OPT_SPLITBAM) {\n    std::cerr << \"Error: Must specify fractions to split into with -f (e.g. -f 0.1,0.8), or as BED file\" << std::endl;\n    exit(EXIT_FAILURE);\n  }\n  \n    }\n\n// parse the error rates string from the options\n  std::vector<double> parseErrorRates(const std::string& s) {\n    \n    std::vector<double> out;\n  \n  std::istringstream is(s);\n  std::string val;\n  while(std::getline(is, val, ',')) {\n    try {\n      out.push_back(std::stod(val));\n    } catch (...) {\n      std::cerr << \"Could not convert \" << val << \" to number. If you're inputting a file not CSV, then check file exists\" << std::endl;\n      exit(EXIT_FAILURE);\n    }\n  }\n    \n  return out;\n}\n \n std::string errorRateString(const std::vector<double>& v, const std::string& name) {\n  \n  std::stringstream ss;\n  ss << \"        \" << name << \":\";\n  for (auto& i : v)\n    ss << \" \" << i << \",\";\n  \n  std::string out = ss.str();\n  out.pop_back();\n  return out;\n  \n}\n\nvoid realignBreaks() {\n  \n  ReadSim rs;\n  \n  std::cerr << \"...loading reference genome\" << std::endl;\n  SeqLib::BWAWrapper bwa; \n  bwa.LoadIndex(opt::refgenome);\n\n  std::ofstream results;\n  SnowmanUtils::fopen(\"realign.sv.results.csv\", results);\n  \n  results << \"id\\tsize\\tAlign1\\tAlign2\\tAlignBoth\" << std::endl;\n  const int RUN_NUM = 1000;\n  //size_t count = 0;\n\n  std::string chrstring1, chrstring2;\n  for (int k = 0; k < RUN_NUM; ++k) {\n  for (int i = 30; i < 500; i += 10) {\n\n    SeqLib::GenomicRegion gr1, gr2;\n    gr1.Random();\n    gr2.Random();\n    gr1.pos2 = gr1.pos1 + i/2; ; //+ k - 1 + (ins == 0 ? iii : 0); // add sequence to deletion ones, because it gets removed later\n    gr2.pos2 = gr2.pos2 + i/2;\n    chrstring1 = bwalker.Header().IDtoName(gr1.chr); //std::to_string(gr.chr+1);\n    chrstring2 = bwalker.Header().IDtoName(gr2.chr); //std::to_string(gr.chr+1);\n\t\n    int len;\n    char * seq1 = faidx_fetch_seq(findex, const_cast<char*>(chrstring1.c_str()), gr1.pos1, gr1.pos2 - 1, &len);\n    char * seq2 = faidx_fetch_seq(findex, const_cast<char*>(chrstring2.c_str()), gr2.pos1, gr2.pos2 - 1, &len);\n    \n    std::string s1, s2;\n    if (seq1)\n      s1 = std::string(seq1);\n    else \n      continue;\n    if (s1.find(\"N\") != std::string::npos)\n      continue;\n\n    if (seq2)\n      s2 = std::string(seq2);\n    else \n      continue;\n    if (s2.find(\"N\") != std::string::npos)\n      continue;\n\n    \n    if (rand() % 2)\n      SeqLib::rcomplement(s2);\n    std::string ss = s1 + s2;\n\n    SeqLib::BamRecordVector aligns;\n    bwa.AlignSequence(ss, std::to_string(i), aligns, false, 0.90, 2);\n    \n    bool a1 = false; bool a2 = false;\n    for (auto& jj : aligns) {\n      if (gr1.GetOverlap(jj.asGenomicRegion())) \n\ta1 = true;\n      if (gr2.GetOverlap(jj.asGenomicRegion()))       \n\ta2 = true;\n    }\n\n    results << k << \"\\t\" << i << \"\\t\" << a1 << \"\\t\" << a2 << \"\\t\" << (a1 && a2) << std::endl;\n\t    \n  }\n  }\n    \n}\n\nvoid realignRandomSegments() {\n  \n  ReadSim rs;\n\n  std::cerr << \"...loading reference genome\" << std::endl;\n  SeqLib::BWAWrapper bwa; \n  bwa.LoadIndex(opt::refgenome);\n\n  std::ofstream results;\n  SnowmanUtils::fopen(\"realign.results.csv\", results);\n\n  results << \"ID\" << \"\\t\" << \"chr\" << \"\\t\" << \"pos1\" << \"\\t\" << \"pos2\" << \"\\t\" << \"width\" << \"\\t\" << \"num_aligns\" << \"\\t\" << \"correct_hit_num\" << \"\\t\" << \"snv_rate\" << \"\\t\" << \"del_size\" << \"\\t\" << \"ins_size\" << std::endl;\n  \n  const int RUN_NUM = 1000;\n\n  size_t tcount = 0;\n    \n\n  std::string chrstring;\n\n  std::vector<int> widths = {70, 101, 250};\n  std::vector<double> snv_rate = {0, 0.01, 0.05};\n  std::vector<int> indel_size = {0, 1, 5, 20, 50};\n\n  for (size_t ins = 0; ins < 2; ++ins) { //insertion or del\n    for (auto& iii : indel_size) {\n      for (auto& snv : snv_rate) {\n\tfor (auto& k : widths) {\n\t  ++tcount;\n\t  for (size_t i = 0; i < RUN_NUM; ++i) {\n\t    if (i == 0)\n\t      std::cerr << \"...working on width \" << k << \" and SNV rate \" << snv << \"\\t\" << (ins == 1 ? \"INS\" : \"DEL\") << \"\\t\" << iii << \". \" << tcount << \" of \" << (2 * widths.size() * snv_rate.size() * indel_size.size()) << std::endl;\n\t    \n\t    SeqLib::GenomicRegion gr;\n\t    gr.Random();\n\t    gr.pos2 = gr.pos1 + k - 1 + (ins == 0 ? iii : 0); // add sequence to deletion ones, because it gets removed later\n\t    chrstring = bwalker.Header().IDtoName(gr.chr); //bwalker.header()->target_name[gr.chr]; //std::to_string(gr.chr+1);\n\t    \n\t    int len;\n\t    char * seq = faidx_fetch_seq(findex, const_cast<char*>(chrstring.c_str()), gr.pos1, gr.pos2 - 1, &len);\n\t    \n\t    std::string s;\n\t    if (seq)\n\t      s = std::string(seq);\n\t    else \n\t      continue;\n\t    \n\t    if (s.find(\"N\") != std::string::npos)\n\t      continue;\n\t    \n\t    rs.makeSNVErrors(s, snv);\n\t    \n\t    if (gr.Width() < iii + 10)\n\t      continue;\n\n\t    if (ins == 1 && iii > 0)\n\t      rs.makeInsErrors(s, true, iii);\n\t    else if (iii > 0)\n\t      rs.makeDelErrors(s, iii);      \n\t    \n\t    SeqLib::BamRecordVector aligns;\n\t    bwa.AlignSequence(s, std::to_string(i), aligns, false, 0.90, 50);\n\n\t    int align_num = -1;\n\t    for (size_t j = 0; j < aligns.size(); ++j) {\n\t      \n\t      SeqLib::GenomicRegion gr_this = aligns[j].asGenomicRegion();\n\t      gr_this.Pad(100);\n\t      if (gr.GetOverlap(gr_this)) {\n\t\t\n\t\tif (iii == 0) { \n\t\t  align_num = j;\n\t\t  break;\n\t\t} else {\n\t\t  if (ins == 1) {\n\t\t    int g = aligns[j].MaxInsertionBases();\n\t\t    if (g && g - 2 < iii && g + 2 > iii) {\n\t\t      align_num = j;\n\t\t      break;\n\t\t    }\n\t\t  } else {\n\t\t    int d = aligns[j].MaxDeletionBases();\n\t\t    if (d && d - 2 < iii && d + 2 > iii) {\n\t\t      align_num = j;\n\t\t      break;\n\t\t    }\n\t\t  }\n\t\t}\n\t      }\n\t      \n\t    }\n\t    \n\t    results << i << \"\\t\" << chrstring << \"\\t\" << gr.pos1 << \"\\t\" << gr.pos2 << \"\\t\" << k << \"\\t\" << aligns.size() << \"\\t\" << align_num << \"\\t\" << snv << \"\\t\" << (ins == 0 ? iii : 0) << \"\\t\" << (ins == 1 ? iii : 0) << std::endl;\n\t    \n\t  }\n\t}\n      }\n    }\n  }\n  results.close();\n  \n}\n"
  },
  {
    "path": "src/svabautils/benchmark.h",
    "content": "#ifndef SNOWMAN_BENCHMARK_H__\n#define SNOWMAN_BENCHMARK_H__\n\n#include <string>\n#include <vector>\n\nvoid parseBenchmarkOptions(int argc, char** argv);\nvoid runBenchmark(int argc, char** argv);\nvoid assemblyTest();\nvoid sampleReads(const std::string& seq, std::vector<std::string>& reads, int cov, double error_rate);\nvoid realignRandomSegments();\nvoid realignBreaks();\nstd::string genBreaks();\nstd::vector<double> parseErrorRates(const std::string& s);\nstd::string errorRateString(const std::vector<double>& v, const std::string& name);\nvoid splitBam();\n\n#endif\n"
  },
  {
    "path": "src/svabautils/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.63 for snowman 1.0.\n#\n# Report bugs to <jwala@broadinstitute.org>.\n#\n# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,\n# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## --------------------- ##\n## M4sh Initialization.  ##\n## --------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in\n  *posix*) set -o posix ;;\nesac\n\nfi\n\n\n\n\n# PATH needs CR\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\nif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n# Support unset when possible.\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  as_unset=unset\nelse\n  as_unset=false\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\ncase $0 in\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\ndone\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  { (exit 1); exit 1; }\nfi\n\n# Work around bugs in pre-3.0 UWIN ksh.\nfor as_var in ENV MAIL MAILPATH\ndo ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# Required to use basename.\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\n\n# Name of the executable.\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# CDPATH.\n$as_unset CDPATH\n\n\nif test \"x$CONFIG_SHELL\" = x; then\n  if (eval \":\") 2>/dev/null; then\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n\n  if test $as_have_required = yes &&\t (eval \":\n(as_func_return () {\n  (exit \\$1)\n}\nas_func_success () {\n  as_func_return 0\n}\nas_func_failure () {\n  as_func_return 1\n}\nas_func_ret_success () {\n  return 0\n}\nas_func_ret_failure () {\n  return 1\n}\n\nexitcode=0\nif as_func_success; then\n  :\nelse\n  exitcode=1\n  echo as_func_success failed.\nfi\n\nif as_func_failure; then\n  exitcode=1\n  echo as_func_failure succeeded.\nfi\n\nif as_func_ret_success; then\n  :\nelse\n  exitcode=1\n  echo as_func_ret_success failed.\nfi\n\nif as_func_ret_failure; then\n  exitcode=1\n  echo as_func_ret_failure succeeded.\nfi\n\nif ( set x; as_func_ret_success y && test x = \\\"\\$1\\\" ); then\n  :\nelse\n  exitcode=1\n  echo positional parameters were not saved.\nfi\n\ntest \\$exitcode = 0) || { (exit 1); exit 1; }\n\n(\n  as_lineno_1=\\$LINENO\n  as_lineno_2=\\$LINENO\n  test \\\"x\\$as_lineno_1\\\" != \\\"x\\$as_lineno_2\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1 + 1\\`\\\" = \\\"x\\$as_lineno_2\\\") || { (exit 1); exit 1; }\n\") 2> /dev/null; then\n  :\nelse\n  as_candidate_shells=\n    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  case $as_dir in\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     as_candidate_shells=\"$as_candidate_shells $as_dir/$as_base\"\n\t   done;;\n       esac\ndone\nIFS=$as_save_IFS\n\n\n      for as_shell in $as_candidate_shells $SHELL; do\n\t # Try only shells that exist, to save several forks.\n\t if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t{ (\"$as_shell\") 2> /dev/null <<\\_ASEOF\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in\n  *posix*) set -o posix ;;\nesac\n\nfi\n\n\n:\n_ASEOF\n}; then\n  CONFIG_SHELL=$as_shell\n\t       as_have_required=yes\n\t       if { \"$as_shell\" 2> /dev/null <<\\_ASEOF\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in\n  *posix*) set -o posix ;;\nesac\n\nfi\n\n\n:\n(as_func_return () {\n  (exit $1)\n}\nas_func_success () {\n  as_func_return 0\n}\nas_func_failure () {\n  as_func_return 1\n}\nas_func_ret_success () {\n  return 0\n}\nas_func_ret_failure () {\n  return 1\n}\n\nexitcode=0\nif as_func_success; then\n  :\nelse\n  exitcode=1\n  echo as_func_success failed.\nfi\n\nif as_func_failure; then\n  exitcode=1\n  echo as_func_failure succeeded.\nfi\n\nif as_func_ret_success; then\n  :\nelse\n  exitcode=1\n  echo as_func_ret_success failed.\nfi\n\nif as_func_ret_failure; then\n  exitcode=1\n  echo as_func_ret_failure succeeded.\nfi\n\nif ( set x; as_func_ret_success y && test x = \"$1\" ); then\n  :\nelse\n  exitcode=1\n  echo positional parameters were not saved.\nfi\n\ntest $exitcode = 0) || { (exit 1); exit 1; }\n\n(\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x`expr $as_lineno_1 + 1`\" = \"x$as_lineno_2\") || { (exit 1); exit 1; }\n\n_ASEOF\n}; then\n  break\nfi\n\nfi\n\n      done\n\n      if test \"x$CONFIG_SHELL\" != x; then\n  for as_var in BASH_ENV ENV\n\tdo ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var\n\tdone\n\texport CONFIG_SHELL\n\texec \"$CONFIG_SHELL\" \"$as_myself\" ${1+\"$@\"}\nfi\n\n\n    if test $as_have_required = no; then\n  echo This script requires a shell more modern than all the\n      echo shells that I found on your system.  Please install a\n      echo modern shell, or manually run the script under such a\n      echo shell if you do have one.\n      { (exit 1); exit 1; }\nfi\n\n\nfi\n\nfi\n\n\n\n(eval \"as_func_return () {\n  (exit \\$1)\n}\nas_func_success () {\n  as_func_return 0\n}\nas_func_failure () {\n  as_func_return 1\n}\nas_func_ret_success () {\n  return 0\n}\nas_func_ret_failure () {\n  return 1\n}\n\nexitcode=0\nif as_func_success; then\n  :\nelse\n  exitcode=1\n  echo as_func_success failed.\nfi\n\nif as_func_failure; then\n  exitcode=1\n  echo as_func_failure succeeded.\nfi\n\nif as_func_ret_success; then\n  :\nelse\n  exitcode=1\n  echo as_func_ret_success failed.\nfi\n\nif as_func_ret_failure; then\n  exitcode=1\n  echo as_func_ret_failure succeeded.\nfi\n\nif ( set x; as_func_ret_success y && test x = \\\"\\$1\\\" ); then\n  :\nelse\n  exitcode=1\n  echo positional parameters were not saved.\nfi\n\ntest \\$exitcode = 0\") || {\n  echo No shell found that supports shell functions.\n  echo Please tell bug-autoconf@gnu.org about your system,\n  echo including any error possibly output before this message.\n  echo This can help us improve future autoconf versions.\n  echo Configuration will now proceed without shell functions.\n}\n\n\n\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x`expr $as_lineno_1 + 1`\" = \"x$as_lineno_2\" || {\n\n  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO\n  # uniformly replaced by the line number.  The first 'sed' inserts a\n  # line-number line after each line using $LINENO; the second 'sed'\n  # does the real work.  The second script uses 'N' to pair each\n  # line-number line with the line containing $LINENO, and appends\n  # trailing '-' during substitution so that $LINENO is not a special\n  # case at line end.\n  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the\n  # scripts with optimization help from Paolo Bonzini.  Blame Lee\n  # E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2\n   { (exit 1); exit 1; }; }\n\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in\n-n*)\n  case `echo 'x\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  *)   ECHO_C='\\c';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -p'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -p'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -p'\n  fi\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p=:\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nif test -x / >/dev/null 2>&1; then\n  as_test_x='test -x'\nelse\n  if ls -dL / >/dev/null 2>&1; then\n    as_ls_L_option=L\n  else\n    as_ls_L_option=\n  fi\n  as_test_x='\n    eval sh -c '\\''\n      if test -d \"$1\"; then\n\ttest -d \"$1/.\";\n      else\n\tcase $1 in\n\t-*)set \"./$1\";;\n\tesac;\n\tcase `ls -ld'$as_ls_L_option' \"$1\" 2>/dev/null` in\n\t???[sx]*):;;*)false;;esac;fi\n    '\\'' sh\n  '\nfi\nas_executable_p=$as_test_x\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\n\nexec 7<&0 </dev/null 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\nSHELL=${CONFIG_SHELL-/bin/sh}\n\n# Identity of this package.\nPACKAGE_NAME='snowman'\nPACKAGE_TARNAME='snowman'\nPACKAGE_VERSION='1.0'\nPACKAGE_STRING='snowman 1.0'\nPACKAGE_BUGREPORT='jwala@broadinstitute.org'\n\nac_unique_file=\"snowmanutils.cpp\"\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stdio.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined STDC_HEADERS && defined HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_subst_vars='am__EXEEXT_FALSE\nam__EXEEXT_TRUE\nLTLIBOBJS\nLIBOBJS\nAM_CXXFLAGS\nEGREP\nGREP\nCXXCPP\nRANLIB\nam__fastdepCC_FALSE\nam__fastdepCC_TRUE\nCCDEPMODE\nac_ct_CC\nCFLAGS\nCC\nam__fastdepCXX_FALSE\nam__fastdepCXX_TRUE\nCXXDEPMODE\nAMDEPBACKSLASH\nAMDEP_FALSE\nAMDEP_TRUE\nam__quote\nam__include\nDEPDIR\nOBJEXT\nEXEEXT\nac_ct_CXX\nCPPFLAGS\nLDFLAGS\nCXXFLAGS\nCXX\nMAINT\nMAINTAINER_MODE_FALSE\nMAINTAINER_MODE_TRUE\nam__untar\nam__tar\nAMTAR\nam__leading_dot\nSET_MAKE\nAWK\nmkdir_p\nMKDIR_P\nINSTALL_STRIP_PROGRAM\nSTRIP\ninstall_sh\nMAKEINFO\nAUTOHEADER\nAUTOMAKE\nAUTOCONF\nACLOCAL\nVERSION\nPACKAGE\nCYGPATH_W\nam__isrc\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nenable_maintainer_mode\nenable_dependency_tracking\nenable_development\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCXX\nCXXFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS\nCCC\nCC\nCFLAGS\nCXXCPP'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE_TARNAME}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=*)\tac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *)\tac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      { $as_echo \"$as_me: error: invalid feature name: $ac_useropt\" >&2\n   { (exit 1); exit 1; }; }\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      { $as_echo \"$as_me: error: invalid feature name: $ac_useropt\" >&2\n   { (exit 1); exit 1; }; }\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      { $as_echo \"$as_me: error: invalid package name: $ac_useropt\" >&2\n   { (exit 1); exit 1; }; }\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      { $as_echo \"$as_me: error: invalid package name: $ac_useropt\" >&2\n   { (exit 1); exit 1; }; }\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) { $as_echo \"$as_me: error: unrecognized option: $ac_option\nTry \\`$0 --help' for more information.\" >&2\n   { (exit 1); exit 1; }; }\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_envvar\" : \".*[^_$as_cr_alnum]\" >/dev/null &&\n      { $as_echo \"$as_me: error: invalid variable name: $ac_envvar\" >&2\n   { (exit 1); exit 1; }; }\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  { $as_echo \"$as_me: error: missing argument to $ac_option\" >&2\n   { (exit 1); exit 1; }; }\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) { $as_echo \"$as_me: error: unrecognized options: $ac_unrecognized_opts\" >&2\n   { (exit 1); exit 1; }; } ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  { $as_echo \"$as_me: error: expected an absolute directory name for --$ac_var: $ac_val\" >&2\n   { (exit 1); exit 1; }; }\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n    $as_echo \"$as_me: WARNING: If you wanted to set the --build type, don't use --host.\n    If a cross compiler is detected then cross compile mode will be used.\" >&2\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  { $as_echo \"$as_me: error: working directory cannot be determined\" >&2\n   { (exit 1); exit 1; }; }\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  { $as_echo \"$as_me: error: pwd does not report name of working directory\" >&2\n   { (exit 1); exit 1; }; }\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  { $as_echo \"$as_me: error: cannot find sources ($ac_unique_file) in $srcdir\" >&2\n   { (exit 1); exit 1; }; }\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || { $as_echo \"$as_me: error: $ac_msg\" >&2\n   { (exit 1); exit 1; }; }\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures snowman 1.0 to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/snowman]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nProgram names:\n  --program-prefix=PREFIX            prepend PREFIX to installed program names\n  --program-suffix=SUFFIX            append SUFFIX to installed program names\n  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n  case $ac_init_help in\n     short | recursive ) echo \"Configuration of snowman 1.0:\";;\n   esac\n  cat <<\\_ACEOF\n\nOptional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --enable-maintainer-mode  enable make rules and dependencies not useful\n\t\t\t  (and sometimes confusing) to the casual installer\n  --disable-dependency-tracking  speeds up one-time build\n  --enable-dependency-tracking   do not reject slow dependency extractors\n  --enable-development    Turn on development options, like failing\n                          compilation on warnings\n\nSome influential environment variables:\n  CXX         C++ compiler command\n  CXXFLAGS    C++ compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  CXXCPP      C++ preprocessor\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to <jwala@broadinstitute.org>.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nsnowman configure 1.0\ngenerated by GNU Autoconf 2.63\n\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,\n2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by snowman $as_me 1.0, which was\ngenerated by GNU Autoconf 2.63.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  $as_echo \"PATH: $as_dir\"\ndone\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) ac_configure_args0=\"$ac_configure_args0 '$ac_arg'\" ;;\n    2)\n      ac_configure_args1=\"$ac_configure_args1 '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      ac_configure_args=\"$ac_configure_args '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n$as_unset ac_configure_args0 || test \"${ac_configure_args0+set}\" != set || { ac_configure_args0=; export ac_configure_args0; }\n$as_unset ac_configure_args1 || test \"${ac_configure_args1+set}\" != set || { ac_configure_args1=; export ac_configure_args1; }\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    cat <<\\_ASBOX\n## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\n_ASBOX\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) $as_unset $ac_var ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    cat <<\\_ASBOX\n## ----------------- ##\n## Output variables. ##\n## ----------------- ##\n_ASBOX\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      cat <<\\_ASBOX\n## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\n_ASBOX\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      cat <<\\_ASBOX\n## ----------- ##\n## confdefs.h. ##\n## ----------- ##\n_ASBOX\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  ac_site_file1=$CONFIG_SITE\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:$LINENO: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\"\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special\n  # files actually), so we avoid doing that.\n  if test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:$LINENO: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:$LINENO: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:$LINENO: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:$LINENO: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:$LINENO: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:$LINENO: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:$LINENO:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:$LINENO:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) ac_configure_args=\"$ac_configure_args '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:$LINENO: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:$LINENO: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  { { $as_echo \"$as_me:$LINENO: error: run \\`make distclean' and/or \\`rm $cache_file' and start over\" >&5\n$as_echo \"$as_me: error: run \\`make distclean' and/or \\`rm $cache_file' and start over\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\nam__api_version='1.11'\n\nac_aux_dir=\nfor ac_dir in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"; do\n  if test -f \"$ac_dir/install-sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f \"$ac_dir/install.sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f \"$ac_dir/shtool\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  { { $as_echo \"$as_me:$LINENO: error: cannot find install-sh or install.sh in \\\"$srcdir\\\" \\\"$srcdir/..\\\" \\\"$srcdir/../..\\\"\" >&5\n$as_echo \"$as_me: error: cannot find install-sh or install.sh in \\\"$srcdir\\\" \\\"$srcdir/..\\\" \\\"$srcdir/../..\\\"\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:$LINENO: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif test \"${ac_cv_path_install+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in\n  ./ | .// | /cC/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:\\\\/os2\\\\/install\\\\/* | ?:\\\\/OS2\\\\/INSTALL\\\\/* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif { test -f \"$as_dir/$ac_prog$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_prog$ac_exec_ext\"; }; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\ndone\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:$LINENO: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n{ $as_echo \"$as_me:$LINENO: checking whether build environment is sane\" >&5\n$as_echo_n \"checking whether build environment is sane... \" >&6; }\n# Just in case\nsleep 1\necho timestamp > conftest.file\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]*)\n    { { $as_echo \"$as_me:$LINENO: error: unsafe absolute working directory name\" >&5\n$as_echo \"$as_me: error: unsafe absolute working directory name\" >&2;}\n   { (exit 1); exit 1; }; };;\nesac\ncase $srcdir in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]*)\n    { { $as_echo \"$as_me:$LINENO: error: unsafe srcdir value: \\`$srcdir'\" >&5\n$as_echo \"$as_me: error: unsafe srcdir value: \\`$srcdir'\" >&2;}\n   { (exit 1); exit 1; }; };;\nesac\n\n# Do `set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n   if test \"$*\" = \"X\"; then\n      # -L didn't work.\n      set X `ls -t \"$srcdir/configure\" conftest.file`\n   fi\n   rm -f conftest.file\n   if test \"$*\" != \"X $srcdir/configure conftest.file\" \\\n      && test \"$*\" != \"X conftest.file $srcdir/configure\"; then\n\n      # If neither matched, then we have a broken ls.  This can happen\n      # if, for instance, CONFIG_SHELL is bash and it inherits a\n      # broken ls alias from the environment.  This has actually\n      # happened.  Such a system could not be considered \"sane\".\n      { { $as_echo \"$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken\nalias in your environment\" >&5\n$as_echo \"$as_me: error: ls -t appears to fail.  Make sure there is not a broken\nalias in your environment\" >&2;}\n   { (exit 1); exit 1; }; }\n   fi\n\n   test \"$2\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   { { $as_echo \"$as_me:$LINENO: error: newly created file is older than distributed files!\nCheck your system clock\" >&5\n$as_echo \"$as_me: error: newly created file is older than distributed files!\nCheck your system clock\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n{ $as_echo \"$as_me:$LINENO: result: yes\" >&5\n$as_echo \"yes\" >&6; }\ntest \"$program_prefix\" != NONE &&\n  program_transform_name=\"s&^&$program_prefix&;$program_transform_name\"\n# Use a double $ so make ignores it.\ntest \"$program_suffix\" != NONE &&\n  program_transform_name=\"s&\\$&$program_suffix&;$program_transform_name\"\n# Double any \\ or $.\n# By default was `s,x,x', remove it if useless.\nac_script='s/[\\\\$]/&&/g;s/;s,x,x,$//'\nprogram_transform_name=`$as_echo \"$program_transform_name\" | sed \"$ac_script\"`\n\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --run true\"; then\n  am_missing_run=\"$MISSING --run \"\nelse\n  am_missing_run=\n  { $as_echo \"$as_me:$LINENO: WARNING: \\`missing' script is too old or missing\" >&5\n$as_echo \"$as_me: WARNING: \\`missing' script is too old or missing\" >&2;}\nfi\n\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\n\n# Installed binaries are usually stripped using `strip' when the user\n# run `make install-strip'.  However `strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the `STRIP' environment variable to overrule this program.\nif test \"$cross_compiling\" != no; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_STRIP+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:$LINENO: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_STRIP+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:$LINENO: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\n\n{ $as_echo \"$as_me:$LINENO: checking for a thread-safe mkdir -p\" >&5\n$as_echo_n \"checking for a thread-safe mkdir -p... \" >&6; }\nif test -z \"$MKDIR_P\"; then\n  if test \"${ac_cv_path_mkdir+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_prog in mkdir gmkdir; do\n\t for ac_exec_ext in '' $ac_executable_extensions; do\n\t   { test -f \"$as_dir/$ac_prog$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_prog$ac_exec_ext\"; } || continue\n\t   case `\"$as_dir/$ac_prog$ac_exec_ext\" --version 2>&1` in #(\n\t     'mkdir (GNU coreutils) '* | \\\n\t     'mkdir (coreutils) '* | \\\n\t     'mkdir (fileutils) '4.1*)\n\t       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext\n\t       break 3;;\n\t   esac\n\t done\n       done\ndone\nIFS=$as_save_IFS\n\nfi\n\n  if test \"${ac_cv_path_mkdir+set}\" = set; then\n    MKDIR_P=\"$ac_cv_path_mkdir -p\"\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for MKDIR_P within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    test -d ./--version && rmdir ./--version\n    MKDIR_P=\"$ac_install_sh -d\"\n  fi\nfi\n{ $as_echo \"$as_me:$LINENO: result: $MKDIR_P\" >&5\n$as_echo \"$MKDIR_P\" >&6; }\n\nmkdir_p=\"$MKDIR_P\"\ncase $mkdir_p in\n  [\\\\/$]* | ?:[\\\\/]*) ;;\n  */*) mkdir_p=\"\\$(top_builddir)/$mkdir_p\" ;;\nesac\n\nfor ac_prog in gawk mawk nawk awk\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_AWK+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AWK\"; then\n  ac_cv_prog_AWK=\"$AWK\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_AWK=\"$ac_prog\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nAWK=$ac_cv_prog_AWK\nif test -n \"$AWK\"; then\n  { $as_echo \"$as_me:$LINENO: result: $AWK\" >&5\n$as_echo \"$AWK\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$AWK\" && break\ndone\n\n{ $as_echo \"$as_me:$LINENO: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif { as_var=ac_cv_prog_make_${ac_make}_set; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:$LINENO: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\nrm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\n\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  am__isrc=' -I$(srcdir)'\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    { { $as_echo \"$as_me:$LINENO: error: source directory already configured; run \\\"make distclean\\\" there first\" >&5\n$as_echo \"$as_me: error: source directory already configured; run \\\"make distclean\\\" there first\" >&2;}\n   { (exit 1); exit 1; }; }\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\n\n\n# Define the identity of the package.\n PACKAGE='snowman'\n VERSION='1.0'\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE \"$PACKAGE\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define VERSION \"$VERSION\"\n_ACEOF\n\n# Some tools Automake needs.\n\nACLOCAL=${ACLOCAL-\"${am_missing_run}aclocal-${am__api_version}\"}\n\n\nAUTOCONF=${AUTOCONF-\"${am_missing_run}autoconf\"}\n\n\nAUTOMAKE=${AUTOMAKE-\"${am_missing_run}automake-${am__api_version}\"}\n\n\nAUTOHEADER=${AUTOHEADER-\"${am_missing_run}autoheader\"}\n\n\nMAKEINFO=${MAKEINFO-\"${am_missing_run}makeinfo\"}\n\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\n# Always define AMTAR for backward compatibility.\n\nAMTAR=${AMTAR-\"${am_missing_run}tar\"}\n\nam__tar='${AMTAR} chof - \"$$tardir\"'; am__untar='${AMTAR} xf -'\n\n\n\n\n\n\nac_config_headers=\"$ac_config_headers config.h\"\n\n\n{ $as_echo \"$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles\" >&5\n$as_echo_n \"checking whether to enable maintainer-specific portions of Makefiles... \" >&6; }\n    # Check whether --enable-maintainer-mode was given.\nif test \"${enable_maintainer_mode+set}\" = set; then\n  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval\nelse\n  USE_MAINTAINER_MODE=no\nfi\n\n  { $as_echo \"$as_me:$LINENO: result: $USE_MAINTAINER_MODE\" >&5\n$as_echo \"$USE_MAINTAINER_MODE\" >&6; }\n   if test $USE_MAINTAINER_MODE = yes; then\n  MAINTAINER_MODE_TRUE=\n  MAINTAINER_MODE_FALSE='#'\nelse\n  MAINTAINER_MODE_TRUE='#'\n  MAINTAINER_MODE_FALSE=\nfi\n\n  MAINT=$MAINTAINER_MODE_TRUE\n\n\n\n# Checks for programs.\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\nif test -z \"$CXX\"; then\n  if test -n \"$CCC\"; then\n    CXX=$CCC\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CXX+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CXX\"; then\n  ac_cv_prog_CXX=\"$CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CXX=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nCXX=$ac_cv_prog_CXX\nif test -n \"$CXX\"; then\n  { $as_echo \"$as_me:$LINENO: result: $CXX\" >&5\n$as_echo \"$CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CXX\" && break\n  done\nfi\nif test -z \"$CXX\"; then\n  ac_ct_CXX=$CXX\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_CXX+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CXX\"; then\n  ac_cv_prog_ac_ct_CXX=\"$ac_ct_CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CXX=\"$ac_prog\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CXX=$ac_cv_prog_ac_ct_CXX\nif test -n \"$ac_ct_CXX\"; then\n  { $as_echo \"$as_me:$LINENO: result: $ac_ct_CXX\" >&5\n$as_echo \"$ac_ct_CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CXX\" && break\ndone\n\n  if test \"x$ac_ct_CXX\" = x; then\n    CXX=\"g++\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CXX=$ac_ct_CXX\n  fi\nfi\n\n  fi\nfi\n# Provide some information about the compiler.\n$as_echo \"$as_me:$LINENO: checking for C++ compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\n{ (ac_try=\"$ac_compiler --version >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compiler --version >&5\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n{ (ac_try=\"$ac_compiler -v >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compiler -v >&5\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n{ (ac_try=\"$ac_compiler -V >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compiler -V >&5\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n\ncat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:$LINENO: checking for C++ compiler default output file name\" >&5\n$as_echo_n \"checking for C++ compiler default output file name... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { (ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; then\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n        if test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\n\n{ $as_echo \"$as_me:$LINENO: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nif test -z \"$ac_file\"; then\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:$LINENO: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ { $as_echo \"$as_me:$LINENO: error: C++ compiler cannot create executables\nSee \\`config.log' for more details.\" >&5\n$as_echo \"$as_me: error: C++ compiler cannot create executables\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 77); exit 77; }; }; }\nfi\n\nac_exeext=$ac_cv_exeext\n\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:$LINENO: checking whether the C++ compiler works\" >&5\n$as_echo_n \"checking whether the C++ compiler works... \" >&6; }\n# FIXME: These cross compiler hacks should be removed for Autoconf 3.0\n# If not cross compiling, check that we can run a simple program.\nif test \"$cross_compiling\" != yes; then\n  if { ac_try='./$ac_file'\n  { (case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:$LINENO: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ { $as_echo \"$as_me:$LINENO: error: cannot run C++ compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details.\" >&5\n$as_echo \"$as_me: error: cannot run C++ compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:$LINENO: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:$LINENO: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\n{ $as_echo \"$as_me:$LINENO: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\n{ $as_echo \"$as_me:$LINENO: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { (ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; then\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:$LINENO: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ { $as_echo \"$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details.\" >&5\n$as_echo \"$as_me: error: cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }; }\nfi\n\nrm -f conftest$ac_cv_exeext\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\n{ $as_echo \"$as_me:$LINENO: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif test \"${ac_cv_objext+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; then\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:$LINENO: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ { $as_echo \"$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details.\" >&5\n$as_echo \"$as_me: error: cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }; }\nfi\n\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:$LINENO: checking whether we are using the GNU C++ compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C++ compiler... \" >&6; }\nif test \"${ac_cv_cxx_compiler_gnu+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  ac_compiler_gnu=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_compiler_gnu=no\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_cxx_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu\" >&5\n$as_echo \"$ac_cv_cxx_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GXX=yes\nelse\n  GXX=\nfi\nac_test_CXXFLAGS=${CXXFLAGS+set}\nac_save_CXXFLAGS=$CXXFLAGS\n{ $as_echo \"$as_me:$LINENO: checking whether $CXX accepts -g\" >&5\n$as_echo_n \"checking whether $CXX accepts -g... \" >&6; }\nif test \"${ac_cv_prog_cxx_g+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_cxx_werror_flag=$ac_cxx_werror_flag\n   ac_cxx_werror_flag=yes\n   ac_cv_prog_cxx_g=no\n   CXXFLAGS=\"-g\"\n   cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  ac_cv_prog_cxx_g=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tCXXFLAGS=\"\"\n      cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  :\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_cxx_werror_flag=$ac_save_cxx_werror_flag\n\t CXXFLAGS=\"-g\"\n\t cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  ac_cv_prog_cxx_g=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_cxx_werror_flag=$ac_save_cxx_werror_flag\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_prog_cxx_g\" >&5\n$as_echo \"$ac_cv_prog_cxx_g\" >&6; }\nif test \"$ac_test_CXXFLAGS\" = set; then\n  CXXFLAGS=$ac_save_CXXFLAGS\nelif test $ac_cv_prog_cxx_g = yes; then\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-g -O2\"\n  else\n    CXXFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-O2\"\n  else\n    CXXFLAGS=\n  fi\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nDEPDIR=\"${am__leading_dot}deps\"\n\nac_config_commands=\"$ac_config_commands depfiles\"\n\n\nam_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\n{ $as_echo \"$as_me:$LINENO: checking for style of include used by $am_make\" >&5\n$as_echo_n \"checking for style of include used by $am_make... \" >&6; }\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from `make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\n\n\n{ $as_echo \"$as_me:$LINENO: result: $_am_result\" >&5\n$as_echo \"$_am_result\" >&6; }\nrm -f confinc confmf\n\n# Check whether --enable-dependency-tracking was given.\nif test \"${enable_dependency_tracking+set}\" = set; then\n  enableval=$enable_dependency_tracking;\nfi\n\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\nfi\n if test \"x$enable_dependency_tracking\" != xno; then\n  AMDEP_TRUE=\n  AMDEP_FALSE='#'\nelse\n  AMDEP_TRUE='#'\n  AMDEP_FALSE=\nfi\n\n\n\ndepcc=\"$CXX\"  am_compiler_list=\n\n{ $as_echo \"$as_me:$LINENO: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif test \"${am_cv_CXX_dependencies_compiler_type+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CXX_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CXX_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CXX_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CXX_dependencies_compiler_type\" >&6; }\nCXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CXX_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCXX_TRUE=\n  am__fastdepCXX_FALSE='#'\nelse\n  am__fastdepCXX_TRUE='#'\n  am__fastdepCXX_FALSE=\nfi\n\n ## test for cpp compiler\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:$LINENO: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:$LINENO: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:$LINENO: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:$LINENO: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:$LINENO: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:$LINENO: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:$LINENO: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ { $as_echo \"$as_me:$LINENO: error: no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details.\" >&5\n$as_echo \"$as_me: error: no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:$LINENO: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\n{ (ac_try=\"$ac_compiler --version >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compiler --version >&5\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n{ (ac_try=\"$ac_compiler -v >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compiler -v >&5\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n{ (ac_try=\"$ac_compiler -V >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compiler -V >&5\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n\n{ $as_echo \"$as_me:$LINENO: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif test \"${ac_cv_c_compiler_gnu+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  ac_compiler_gnu=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_compiler_gnu=no\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:$LINENO: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif test \"${ac_cv_prog_cc_g+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  ac_cv_prog_cc_g=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tCFLAGS=\"\"\n      cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  :\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  ac_cv_prog_cc_g=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:$LINENO: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif test \"${ac_cv_prog_cc_c89+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  rm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  ac_cv_prog_cc_c89=$ac_arg\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\nfi\n\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:$LINENO: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:$LINENO: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:$LINENO: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\ndepcc=\"$CC\"   am_compiler_list=\n\n{ $as_echo \"$as_me:$LINENO: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif test \"${am_cv_CC_dependencies_compiler_type+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CC_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CC_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CC_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CC_dependencies_compiler_type\" >&6; }\nCCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CC_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCC_TRUE=\n  am__fastdepCC_FALSE='#'\nelse\n  am__fastdepCC_TRUE='#'\n  am__fastdepCC_FALSE=\nfi\n\n ## test for C compiler\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_RANLIB+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:$LINENO: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:$LINENO: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_RANLIB+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:$LINENO: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:$LINENO: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n ## required if libraries are built in package\n\n# Check for headers\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n{ $as_echo \"$as_me:$LINENO: checking how to run the C++ preprocessor\" >&5\n$as_echo_n \"checking how to run the C++ preprocessor... \" >&6; }\nif test -z \"$CXXCPP\"; then\n  if test \"${ac_cv_prog_CXXCPP+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CXXCPP needs to be expanded\n    for CXXCPP in \"$CXX -E\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif { (ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } >/dev/null && {\n\t test -z \"$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then\n  :\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n  # Broken: fails on valid input.\ncontinue\nfi\n\nrm -f conftest.err conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif { (ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } >/dev/null && {\n\t test -z \"$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then\n  # Broken: success on invalid input.\ncontinue\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\n\nrm -f conftest.err conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then\n  break\nfi\n\n    done\n    ac_cv_prog_CXXCPP=$CXXCPP\n\nfi\n  CXXCPP=$ac_cv_prog_CXXCPP\nelse\n  ac_cv_prog_CXXCPP=$CXXCPP\nfi\n{ $as_echo \"$as_me:$LINENO: result: $CXXCPP\" >&5\n$as_echo \"$CXXCPP\" >&6; }\nac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif { (ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } >/dev/null && {\n\t test -z \"$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then\n  :\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n  # Broken: fails on valid input.\ncontinue\nfi\n\nrm -f conftest.err conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif { (ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } >/dev/null && {\n\t test -z \"$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then\n  # Broken: success on invalid input.\ncontinue\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\n\nrm -f conftest.err conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then\n  :\nelse\n  { { $as_echo \"$as_me:$LINENO: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ { $as_echo \"$as_me:$LINENO: error: C++ preprocessor \\\"$CXXCPP\\\" fails sanity check\nSee \\`config.log' for more details.\" >&5\n$as_echo \"$as_me: error: C++ preprocessor \\\"$CXXCPP\\\" fails sanity check\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }; }\nfi\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\n{ $as_echo \"$as_me:$LINENO: checking for grep that handles long lines and -e\" >&5\n$as_echo_n \"checking for grep that handles long lines and -e... \" >&6; }\nif test \"${ac_cv_path_GREP+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_prog in grep ggrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_GREP\" && $as_test_x \"$ac_path_GREP\"; } || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    ac_count=`expr $ac_count + 1`\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\ndone\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    { { $as_echo \"$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" >&5\n$as_echo \"$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" >&2;}\n   { (exit 1); exit 1; }; }\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_path_GREP\" >&5\n$as_echo \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n{ $as_echo \"$as_me:$LINENO: checking for egrep\" >&5\n$as_echo_n \"checking for egrep... \" >&6; }\nif test \"${ac_cv_path_EGREP+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_prog in egrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_EGREP\" && $as_test_x \"$ac_path_EGREP\"; } || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    ac_count=`expr $ac_count + 1`\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\ndone\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    { { $as_echo \"$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" >&5\n$as_echo \"$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" >&2;}\n   { (exit 1); exit 1; }; }\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_path_EGREP\" >&5\n$as_echo \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n{ $as_echo \"$as_me:$LINENO: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif test \"${ac_cv_header_stdc+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  ac_cv_header_stdc=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_cv_header_stdc=no\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then\n  :\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then\n  :\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then\n  :\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nrm -f conftest$ac_exeext\nif { (ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'\n  { (case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  :\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n( exit $ac_status )\nac_cv_header_stdc=no\nfi\nrm -rf conftest.dSYM\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext\nfi\n\n\nfi\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define STDC_HEADERS 1\n_ACEOF\n\nfi\n\n# On IRIX 5.3, sys/types and inttypes.h are conflicting.\n\n\n\n\n\n\n\n\n\nfor ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \\\n\t\t  inttypes.h stdint.h unistd.h\ndo\nas_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\n{ $as_echo \"$as_me:$LINENO: checking for $ac_header\" >&5\n$as_echo_n \"checking for $ac_header... \" >&6; }\nif { as_var=$as_ac_Header; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n$ac_includes_default\n\n#include <$ac_header>\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  eval \"$as_ac_Header=yes\"\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\teval \"$as_ac_Header=no\"\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nac_res=`eval 'as_val=${'$as_ac_Header'}\n\t\t $as_echo \"$as_val\"'`\n\t       { $as_echo \"$as_me:$LINENO: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nas_val=`eval 'as_val=${'$as_ac_Header'}\n\t\t $as_echo \"$as_val\"'`\n   if test \"x$as_val\" = x\"\"yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\nif test \"${ac_cv_header_zlib_h+set}\" = set; then\n  { $as_echo \"$as_me:$LINENO: checking for zlib.h\" >&5\n$as_echo_n \"checking for zlib.h... \" >&6; }\nif test \"${ac_cv_header_zlib_h+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_header_zlib_h\" >&5\n$as_echo \"$ac_cv_header_zlib_h\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:$LINENO: checking zlib.h usability\" >&5\n$as_echo_n \"checking zlib.h usability... \" >&6; }\ncat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n$ac_includes_default\n#include <zlib.h>\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  ac_header_compiler=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_header_compiler=no\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:$LINENO: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:$LINENO: checking zlib.h presence\" >&5\n$as_echo_n \"checking zlib.h presence... \" >&6; }\ncat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <zlib.h>\n_ACEOF\nif { (ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } >/dev/null && {\n\t test -z \"$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then\n  ac_header_preproc=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n  ac_header_preproc=no\nfi\n\nrm -f conftest.err conftest.$ac_ext\n{ $as_echo \"$as_me:$LINENO: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in\n  yes:no: )\n    { $as_echo \"$as_me:$LINENO: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: zlib.h: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: zlib.h: proceeding with the compiler's result\" >&2;}\n    ac_header_preproc=yes\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:$LINENO: WARNING: zlib.h: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: zlib.h: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: zlib.h:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: zlib.h:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: zlib.h: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: zlib.h: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: zlib.h:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: zlib.h:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: zlib.h: proceeding with the preprocessor's result\" >&5\n$as_echo \"$as_me: WARNING: zlib.h: proceeding with the preprocessor's result\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: zlib.h: in the future, the compiler will take precedence\" >&5\n$as_echo \"$as_me: WARNING: zlib.h: in the future, the compiler will take precedence\" >&2;}\n    ( cat <<\\_ASBOX\n## --------------------------------------- ##\n## Report this to jwala@broadinstitute.org ##\n## --------------------------------------- ##\n_ASBOX\n     ) | sed \"s/^/$as_me: WARNING:     /\" >&2\n    ;;\nesac\n{ $as_echo \"$as_me:$LINENO: checking for zlib.h\" >&5\n$as_echo_n \"checking for zlib.h... \" >&6; }\nif test \"${ac_cv_header_zlib_h+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_header_zlib_h=$ac_header_preproc\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_header_zlib_h\" >&5\n$as_echo \"$ac_cv_header_zlib_h\" >&6; }\n\nfi\n\n\n\n# Check for libraries\n{ $as_echo \"$as_me:$LINENO: checking for library containing gzopen\" >&5\n$as_echo_n \"checking for library containing gzopen... \" >&6; }\nif test \"${ac_cv_search_gzopen+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_func_search_save_LIBS=$LIBS\ncat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar gzopen ();\nint\nmain ()\n{\nreturn gzopen ();\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_lib in '' z; do\n  if test -z \"$ac_lib\"; then\n    ac_res=\"none required\"\n  else\n    ac_res=-l$ac_lib\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n  fi\n  rm -f conftest.$ac_objext conftest$ac_exeext\nif { (ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_link\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t $as_test_x conftest$ac_exeext\n       }; then\n  ac_cv_search_gzopen=$ac_res\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\nfi\n\nrm -rf conftest.dSYM\nrm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \\\n      conftest$ac_exeext\n  if test \"${ac_cv_search_gzopen+set}\" = set; then\n  break\nfi\ndone\nif test \"${ac_cv_search_gzopen+set}\" = set; then\n  :\nelse\n  ac_cv_search_gzopen=no\nfi\nrm conftest.$ac_ext\nLIBS=$ac_func_search_save_LIBS\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_search_gzopen\" >&5\n$as_echo \"$ac_cv_search_gzopen\" >&6; }\nac_res=$ac_cv_search_gzopen\nif test \"$ac_res\" != no; then\n  test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n\nelse\n  { { $as_echo \"$as_me:$LINENO: error: libz not found, please install zlib (http://www.zlib.net/)\" >&5\n$as_echo \"$as_me: error: libz not found, please install zlib (http://www.zlib.net/)\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\n{ $as_echo \"$as_me:$LINENO: checking for library containing clock_gettime\" >&5\n$as_echo_n \"checking for library containing clock_gettime... \" >&6; }\nif test \"${ac_cv_search_clock_gettime+set}\" = set; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_func_search_save_LIBS=$LIBS\ncat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar clock_gettime ();\nint\nmain ()\n{\nreturn clock_gettime ();\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_lib in '' rt; do\n  if test -z \"$ac_lib\"; then\n    ac_res=\"none required\"\n  else\n    ac_res=-l$ac_lib\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n  fi\n  rm -f conftest.$ac_objext conftest$ac_exeext\nif { (ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_link\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t $as_test_x conftest$ac_exeext\n       }; then\n  ac_cv_search_clock_gettime=$ac_res\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\nfi\n\nrm -rf conftest.dSYM\nrm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \\\n      conftest$ac_exeext\n  if test \"${ac_cv_search_clock_gettime+set}\" = set; then\n  break\nfi\ndone\nif test \"${ac_cv_search_clock_gettime+set}\" = set; then\n  :\nelse\n  ac_cv_search_clock_gettime=no\nfi\nrm conftest.$ac_ext\nLIBS=$ac_func_search_save_LIBS\nfi\n{ $as_echo \"$as_me:$LINENO: result: $ac_cv_search_clock_gettime\" >&5\n$as_echo \"$ac_cv_search_clock_gettime\" >&6; }\nac_res=$ac_cv_search_clock_gettime\nif test \"$ac_res\" != no; then\n  test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n\ncat >>confdefs.h <<\\_ACEOF\n#define HAVE_CLOCK_GETTIME 1\n_ACEOF\n\nfi\n\n\n# Check whether --enable-development was given.\nif test \"${enable_development+set}\" = set; then\n  enableval=$enable_development;\nfi\n\nif test \"$enable_development\"; then\n    fail_on_warning=\"-Werror\"\nfi\n\n# Set compiler flags.\nAM_CXXFLAGS=\"-g -Wall -Wextra $fail_on_warning -Wno-unknown-pragmas -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0\"\n\n\n# Check for hash table headers\n\n\n\n\n\n\n\n\nfor ac_header in  \\\n\t\t   google/sparse_hash_set google/sparse_hash_map \\\n\t\t   unordered_map tr1/unordered_map ext/hash_map \\\n\t\t   unordered_set tr1/unordered_set ext/hash_set \\\n\ndo\nas_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nif { as_var=$as_ac_Header; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then\n  { $as_echo \"$as_me:$LINENO: checking for $ac_header\" >&5\n$as_echo_n \"checking for $ac_header... \" >&6; }\nif { as_var=$as_ac_Header; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then\n  $as_echo_n \"(cached) \" >&6\nfi\nac_res=`eval 'as_val=${'$as_ac_Header'}\n\t\t $as_echo \"$as_val\"'`\n\t       { $as_echo \"$as_me:$LINENO: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:$LINENO: checking $ac_header usability\" >&5\n$as_echo_n \"checking $ac_header usability... \" >&6; }\ncat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n$ac_includes_default\n#include <$ac_header>\n_ACEOF\nrm -f conftest.$ac_objext\nif { (ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_compile\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then\n  ac_header_compiler=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_header_compiler=no\nfi\n\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:$LINENO: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:$LINENO: checking $ac_header presence\" >&5\n$as_echo_n \"checking $ac_header presence... \" >&6; }\ncat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <$ac_header>\n_ACEOF\nif { (ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:$LINENO: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\") >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  $as_echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } >/dev/null && {\n\t test -z \"$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then\n  ac_header_preproc=yes\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n  ac_header_preproc=no\nfi\n\nrm -f conftest.err conftest.$ac_ext\n{ $as_echo \"$as_me:$LINENO: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in\n  yes:no: )\n    { $as_echo \"$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $ac_header: proceeding with the compiler's result\" >&2;}\n    ac_header_preproc=yes\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $ac_header: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $ac_header:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $ac_header: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: $ac_header:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $ac_header:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result\" >&5\n$as_echo \"$as_me: WARNING: $ac_header: proceeding with the preprocessor's result\" >&2;}\n    { $as_echo \"$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence\" >&5\n$as_echo \"$as_me: WARNING: $ac_header: in the future, the compiler will take precedence\" >&2;}\n    ( cat <<\\_ASBOX\n## --------------------------------------- ##\n## Report this to jwala@broadinstitute.org ##\n## --------------------------------------- ##\n_ASBOX\n     ) | sed \"s/^/$as_me: WARNING:     /\" >&2\n    ;;\nesac\n{ $as_echo \"$as_me:$LINENO: checking for $ac_header\" >&5\n$as_echo_n \"checking for $ac_header... \" >&6; }\nif { as_var=$as_ac_Header; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$as_ac_Header=\\$ac_header_preproc\"\nfi\nac_res=`eval 'as_val=${'$as_ac_Header'}\n\t\t $as_echo \"$as_val\"'`\n\t       { $as_echo \"$as_me:$LINENO: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n\nfi\nas_val=`eval 'as_val=${'$as_ac_Header'}\n\t\t $as_echo \"$as_val\"'`\n   if test \"x$as_val\" = x\"\"yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\nac_config_files=\"$ac_config_files Makefile\"\n\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) $as_unset $ac_var ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes (double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\).\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    test \"x$cache_file\" != \"x/dev/null\" &&\n      { $as_echo \"$as_me:$LINENO: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n    cat confcache >$cache_file\n  else\n    { $as_echo \"$as_me:$LINENO: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\nDEFS=-DHAVE_CONFIG_H\n\nac_libobjs=\nac_ltlibobjs=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  ac_libobjs=\"$ac_libobjs \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  ac_ltlibobjs=\"$ac_ltlibobjs \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n if test -n \"$EXEEXT\"; then\n  am__EXEEXT_TRUE=\n  am__EXEEXT_FALSE='#'\nelse\n  am__EXEEXT_TRUE='#'\n  am__EXEEXT_FALSE=\nfi\n\nif test -z \"${MAINTAINER_MODE_TRUE}\" && test -z \"${MAINTAINER_MODE_FALSE}\"; then\n  { { $as_echo \"$as_me:$LINENO: error: conditional \\\"MAINTAINER_MODE\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" >&5\n$as_echo \"$as_me: error: conditional \\\"MAINTAINER_MODE\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\nif test -z \"${AMDEP_TRUE}\" && test -z \"${AMDEP_FALSE}\"; then\n  { { $as_echo \"$as_me:$LINENO: error: conditional \\\"AMDEP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" >&5\n$as_echo \"$as_me: error: conditional \\\"AMDEP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\nif test -z \"${am__fastdepCXX_TRUE}\" && test -z \"${am__fastdepCXX_FALSE}\"; then\n  { { $as_echo \"$as_me:$LINENO: error: conditional \\\"am__fastdepCXX\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" >&5\n$as_echo \"$as_me: error: conditional \\\"am__fastdepCXX\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\nif test -z \"${am__fastdepCC_TRUE}\" && test -z \"${am__fastdepCC_FALSE}\"; then\n  { { $as_echo \"$as_me:$LINENO: error: conditional \\\"am__fastdepCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" >&5\n$as_echo \"$as_me: error: conditional \\\"am__fastdepCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\n: ${CONFIG_STATUS=./config.status}\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:$LINENO: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\ncat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\nSHELL=\\${CONFIG_SHELL-$SHELL}\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n## --------------------- ##\n## M4sh Initialization.  ##\n## --------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in\n  *posix*) set -o posix ;;\nesac\n\nfi\n\n\n\n\n# PATH needs CR\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\nif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n# Support unset when possible.\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  as_unset=unset\nelse\n  as_unset=false\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\ncase $0 in\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\ndone\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  { (exit 1); exit 1; }\nfi\n\n# Work around bugs in pre-3.0 UWIN ksh.\nfor as_var in ENV MAIL MAILPATH\ndo ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# Required to use basename.\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\n\n# Name of the executable.\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# CDPATH.\n$as_unset CDPATH\n\n\n\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x`expr $as_lineno_1 + 1`\" = \"x$as_lineno_2\" || {\n\n  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO\n  # uniformly replaced by the line number.  The first 'sed' inserts a\n  # line-number line after each line using $LINENO; the second 'sed'\n  # does the real work.  The second script uses 'N' to pair each\n  # line-number line with the line containing $LINENO, and appends\n  # trailing '-' during substitution so that $LINENO is not a special\n  # case at line end.\n  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the\n  # scripts with optimization help from Paolo Bonzini.  Blame Lee\n  # E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2\n   { (exit 1); exit 1; }; }\n\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in\n-n*)\n  case `echo 'x\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  *)   ECHO_C='\\c';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -p'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -p'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -p'\n  fi\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p=:\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nif test -x / >/dev/null 2>&1; then\n  as_test_x='test -x'\nelse\n  if ls -dL / >/dev/null 2>&1; then\n    as_ls_L_option=L\n  else\n    as_ls_L_option=\n  fi\n  as_test_x='\n    eval sh -c '\\''\n      if test -d \"$1\"; then\n\ttest -d \"$1/.\";\n      else\n\tcase $1 in\n\t-*)set \"./$1\";;\n\tesac;\n\tcase `ls -ld'$as_ls_L_option' \"$1\" 2>/dev/null` in\n\t???[sx]*):;;*)false;;esac;fi\n    '\\'' sh\n  '\nfi\nas_executable_p=$as_test_x\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n\n# Save the log message, to keep $[0] and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by snowman $as_me 1.0, which was\ngenerated by GNU Autoconf 2.63.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\ncase $ac_config_headers in *\"\n\"*) set x $ac_config_headers; shift; ac_config_headers=$*;;\nesac\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_headers=\"$ac_config_headers\"\nconfig_commands=\"$ac_config_commands\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files from templates according to the\ncurrent configuration.\n\nUsage: $0 [OPTION]... [FILE]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n      --header=FILE[:TEMPLATE]\n                   instantiate the configuration header FILE\n\nConfiguration files:\n$config_files\n\nConfiguration headers:\n$config_headers\n\nConfiguration commands:\n$config_commands\n\nReport bugs to <bug-autoconf@gnu.org>.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_version=\"\\\\\nsnowman config.status 1.0\nconfigured by $0, generated by GNU Autoconf 2.63,\n  with options \\\\\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\\\\\"\n\nCopyright (C) 2008 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\nMKDIR_P='$MKDIR_P'\nAWK='$AWK'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    CONFIG_FILES=\"$CONFIG_FILES '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    CONFIG_HEADERS=\"$CONFIG_HEADERS '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h)\n    # Conflict between --help and --header\n    { $as_echo \"$as_me: error: ambiguous option: $1\nTry \\`$0 --help' for more information.\" >&2\n   { (exit 1); exit 1; }; };;\n  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) { $as_echo \"$as_me: error: unrecognized option: $1\nTry \\`$0 --help' for more information.\" >&2\n   { (exit 1); exit 1; }; } ;;\n\n  *) ac_config_targets=\"$ac_config_targets $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X '$SHELL' '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n#\n# INIT-COMMANDS\n#\nAMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"config.h\") CONFIG_HEADERS=\"$CONFIG_HEADERS config.h\" ;;\n    \"depfiles\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS depfiles\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n\n  *) { { $as_echo \"$as_me:$LINENO: error: invalid argument: $ac_config_target\" >&5\n$as_echo \"$as_me: error: invalid argument: $ac_config_target\" >&2;}\n   { (exit 1); exit 1; }; };;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_HEADERS+set}\" = set || CONFIG_HEADERS=$config_headers\n  test \"${CONFIG_COMMANDS+set}\" = set || CONFIG_COMMANDS=$config_commands\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp=\n  trap 'exit_status=$?\n  { test -z \"$tmp\" || test ! -d \"$tmp\" || rm -fr \"$tmp\"; } && exit $exit_status\n' 0\n  trap '{ (exit 1); exit 1; }' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -n \"$tmp\" && test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} ||\n{\n   $as_echo \"$as_me: cannot create a temporary directory in .\" >&2\n   { (exit 1); exit 1; }\n}\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr='\r'\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  { { $as_echo \"$as_me:$LINENO: error: could not make $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: error: could not make $CONFIG_STATUS\" >&2;}\n   { (exit 1); exit 1; }; }\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '$'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    { { $as_echo \"$as_me:$LINENO: error: could not make $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: error: could not make $CONFIG_STATUS\" >&2;}\n   { (exit 1); exit 1; }; }\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    { { $as_echo \"$as_me:$LINENO: error: could not make $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: error: could not make $CONFIG_STATUS\" >&2;}\n   { (exit 1); exit 1; }; }\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\).*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\).*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$tmp/subs1.awk\" > \"$tmp/subs.awk\" \\\n  || { { $as_echo \"$as_me:$LINENO: error: could not setup config files machinery\" >&5\n$as_echo \"$as_me: error: could not setup config files machinery\" >&2;}\n   { (exit 1); exit 1; }; }\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove $(srcdir),\n# ${srcdir} and @srcdir@ from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=/{\ns/:*\\$(srcdir):*/:/\ns/:*\\${srcdir}:*/:/\ns/:*@srcdir@:*/:/\ns/^\\([^=]*=[\t ]*\\):*/\\1/\ns/:*$//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n# Set up the scripts for CONFIG_HEADERS section.\n# No need to generate them if there are no CONFIG_HEADERS.\n# This happens for instance with `./config.status Makefile'.\nif test -n \"$CONFIG_HEADERS\"; then\ncat >\"$tmp/defines.awk\" <<\\_ACAWK ||\nBEGIN {\n_ACEOF\n\n# Transform confdefs.h into an awk script `defines.awk', embedded as\n# here-document in config.status, that substitutes the proper values into\n# config.h.in to produce config.h.\n\n# Create a delimiter string that does not exist in confdefs.h, to ease\n# handling of long lines.\nac_delim='%!_!# '\nfor ac_last_try in false false :; do\n  ac_t=`sed -n \"/$ac_delim/p\" confdefs.h`\n  if test -z \"$ac_t\"; then\n    break\n  elif $ac_last_try; then\n    { { $as_echo \"$as_me:$LINENO: error: could not make $CONFIG_HEADERS\" >&5\n$as_echo \"$as_me: error: could not make $CONFIG_HEADERS\" >&2;}\n   { (exit 1); exit 1; }; }\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\n\n# For the awk script, D is an array of macro values keyed by name,\n# likewise P contains macro parameters if any.  Preserve backslash\n# newline sequences.\n\nac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*\nsed -n '\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt rset\n:rset\ns/^[\t ]*#[\t ]*define[\t ][\t ]*/ /\nt def\nd\n:def\ns/\\\\$//\nt bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\"/p\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\"/p\nd\n:bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\\\\\\\\\\\\n\"\\\\/p\nt cont\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\\\\\\\\\\\\n\"\\\\/p\nt cont\nd\n:cont\nn\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt clear\n:clear\ns/\\\\$//\nt bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/p\nd\n:bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\\\\\\\\\n\"\\\\/p\nb cont\n' <confdefs.h | sed '\ns/'\"$ac_delim\"'/\"\\\\\\\n\"/g' >>$CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  for (key in D) D_is_set[key] = 1\n  FS = \"\u0007\"\n}\n/^[\\t ]*#[\\t ]*(define|undef)[\\t ]+$ac_word_re([\\t (]|\\$)/ {\n  line = \\$ 0\n  split(line, arg, \" \")\n  if (arg[1] == \"#\") {\n    defundef = arg[2]\n    mac1 = arg[3]\n  } else {\n    defundef = substr(arg[1], 2)\n    mac1 = arg[2]\n  }\n  split(mac1, mac2, \"(\") #)\n  macro = mac2[1]\n  prefix = substr(line, 1, index(line, defundef) - 1)\n  if (D_is_set[macro]) {\n    # Preserve the white space surrounding the \"#\".\n    print prefix \"define\", macro P[macro] D[macro]\n    next\n  } else {\n    # Replace #undef with comments.  This is necessary, for example,\n    # in the case of _POSIX_SOURCE, which is predefined and required\n    # on some systems where configure will not decide to define it.\n    if (defundef == \"undef\") {\n      print \"/*\", prefix defundef, macro, \"*/\"\n      next\n    }\n  }\n}\n{ print }\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n  { { $as_echo \"$as_me:$LINENO: error: could not setup config headers machinery\" >&5\n$as_echo \"$as_me: error: could not setup config headers machinery\" >&2;}\n   { (exit 1); exit 1; }; }\nfi # test -n \"$CONFIG_HEADERS\"\n\n\neval set X \"  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS\"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) { { $as_echo \"$as_me:$LINENO: error: invalid tag $ac_tag\" >&5\n$as_echo \"$as_me: error: invalid tag $ac_tag\" >&2;}\n   { (exit 1); exit 1; }; };;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   { { $as_echo \"$as_me:$LINENO: error: cannot find input file: $ac_f\" >&5\n$as_echo \"$as_me: error: cannot find input file: $ac_f\" >&2;}\n   { (exit 1); exit 1; }; };;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      ac_file_inputs=\"$ac_file_inputs '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:$LINENO: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$tmp/stdin\" \\\n      || { { $as_echo \"$as_me:$LINENO: error: could not create $ac_file\" >&5\n$as_echo \"$as_me: error: could not create $ac_file\" >&2;}\n   { (exit 1); exit 1; }; } ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  { as_dir=\"$ac_dir\"\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || { $as_mkdir_p && mkdir -p \"$as_dir\"; } || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || { { $as_echo \"$as_me:$LINENO: error: cannot create directory $as_dir\" >&5\n$as_echo \"$as_me: error: cannot create directory $as_dir\" >&2;}\n   { (exit 1); exit 1; }; }; }\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n  ac_MKDIR_P=$MKDIR_P\n  case $MKDIR_P in\n  [\\\\/$]* | ?:[\\\\/]* ) ;;\n  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\n\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p\n'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n    s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\ns&@MKDIR_P@&$ac_MKDIR_P&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$tmp/subs.awk\" >$tmp/out \\\n  || { { $as_echo \"$as_me:$LINENO: error: could not create $ac_file\" >&5\n$as_echo \"$as_me: error: could not create $ac_file\" >&2;}\n   { (exit 1); exit 1; }; }\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \"$tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined.\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined.\" >&2;}\n\n  rm -f \"$tmp/stdin\"\n  case $ac_file in\n  -) cat \"$tmp/out\" && rm -f \"$tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$tmp/out\" \"$ac_file\";;\n  esac \\\n  || { { $as_echo \"$as_me:$LINENO: error: could not create $ac_file\" >&5\n$as_echo \"$as_me: error: could not create $ac_file\" >&2;}\n   { (exit 1); exit 1; }; }\n ;;\n  :H)\n  #\n  # CONFIG_HEADER\n  #\n  if test x\"$ac_file\" != x-; then\n    {\n      $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$tmp/defines.awk\"' \"$ac_file_inputs\"\n    } >\"$tmp/config.h\" \\\n      || { { $as_echo \"$as_me:$LINENO: error: could not create $ac_file\" >&5\n$as_echo \"$as_me: error: could not create $ac_file\" >&2;}\n   { (exit 1); exit 1; }; }\n    if diff \"$ac_file\" \"$tmp/config.h\" >/dev/null 2>&1; then\n      { $as_echo \"$as_me:$LINENO: $ac_file is unchanged\" >&5\n$as_echo \"$as_me: $ac_file is unchanged\" >&6;}\n    else\n      rm -f \"$ac_file\"\n      mv \"$tmp/config.h\" \"$ac_file\" \\\n\t|| { { $as_echo \"$as_me:$LINENO: error: could not create $ac_file\" >&5\n$as_echo \"$as_me: error: could not create $ac_file\" >&2;}\n   { (exit 1); exit 1; }; }\n    fi\n  else\n    $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$tmp/defines.awk\"' \"$ac_file_inputs\" \\\n      || { { $as_echo \"$as_me:$LINENO: error: could not create -\" >&5\n$as_echo \"$as_me: error: could not create -\" >&2;}\n   { (exit 1); exit 1; }; }\n  fi\n# Compute \"$ac_file\"'s index in $config_headers.\n_am_arg=\"$ac_file\"\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`$as_dirname -- \"$_am_arg\" ||\n$as_expr X\"$_am_arg\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)$' \\| \\\n\t X\"$_am_arg\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$_am_arg\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`/stamp-h$_am_stamp_count\n ;;\n\n  :C)  { $as_echo \"$as_me:$LINENO: executing $ac_file commands\" >&5\n$as_echo \"$as_me: executing $ac_file commands\" >&6;}\n ;;\n  esac\n\n\n  case $ac_file$ac_mode in\n    \"depfiles\":C) test x\"$AMDEP_TRUE\" != x\"\" || {\n  # Autoconf 2.62 quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named `Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`$as_dirname -- \"$mf\" ||\n$as_expr X\"$mf\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$mf\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$mf\" : 'X\\(//\\)$' \\| \\\n\t X\"$mf\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$mf\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running `make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # When using ansi2knr, U may be empty or an underscore; expand it\n    U=`sed -n 's/^U = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g' -e 's/\\$U/'\"$U\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`$as_dirname -- \"$file\" ||\n$as_expr X\"$file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$file\" : 'X\\(//\\)$' \\| \\\n\t X\"$file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      { as_dir=$dirpart/$fdir\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || { $as_mkdir_p && mkdir -p \"$as_dir\"; } || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || { { $as_echo \"$as_me:$LINENO: error: cannot create directory $as_dir\" >&5\n$as_echo \"$as_me: error: cannot create directory $as_dir\" >&2;}\n   { (exit 1); exit 1; }; }; }\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n ;;\n\n  esac\ndone # for ac_tag\n\n\n{ (exit 0); exit 0; }\n_ACEOF\nchmod +x $CONFIG_STATUS\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  { { $as_echo \"$as_me:$LINENO: error: write failure creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: error: write failure creating $CONFIG_STATUS\" >&2;}\n   { (exit 1); exit 1; }; }\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || { (exit 1); exit 1; }\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n"
  },
  {
    "path": "src/svabautils/configure.ac",
    "content": "# Process this file with autoconf to produce a configure script.\nAC_PREREQ(2.59) ## specificy version of autoconf\nAC_INIT(snowman, 1.0, jwala@broadinstitute.org)\nAM_INIT_AUTOMAKE(foreign)\nAC_CONFIG_SRCDIR([snowmanutils.cpp])\nAC_CONFIG_HEADER([config.h])\nAM_MAINTAINER_MODE([disable])\n\n# Checks for programs.\nAC_PROG_CXX ## test for cpp compiler\nAC_PROG_CC ## test for C compiler\nAC_PROG_RANLIB ## required if libraries are built in package\n\n# Check for headers\nAC_LANG([C++])\nAC_CHECK_HEADER([zlib.h])\n\n# Check for libraries\nAC_SEARCH_LIBS([gzopen],[z],,[AC_MSG_ERROR([libz not found, please install zlib (http://www.zlib.net/)])])\nAC_SEARCH_LIBS([clock_gettime], [rt], [AC_DEFINE([HAVE_CLOCK_GETTIME], [1], [clock_getttime found])], )\n\nAC_ARG_ENABLE(development, AS_HELP_STRING([--enable-development],\n\t[Turn on development options, like failing compilation on warnings]))\nif test \"$enable_development\"; then\n    fail_on_warning=\"-Werror\"\nfi\n\n# Set compiler flags.\nAC_SUBST(AM_CXXFLAGS, \"-g -Wall -Wextra $fail_on_warning -Wno-unknown-pragmas -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0\")\n\n# Check for hash table headers\nAC_CHECK_HEADERS([ \\\n\t\t   google/sparse_hash_set google/sparse_hash_map \\\n\t\t   unordered_map tr1/unordered_map ext/hash_map \\\n\t\t   unordered_set tr1/unordered_set ext/hash_set \\\n])\n\nAC_CONFIG_FILES([Makefile])\n\nAC_OUTPUT\n"
  },
  {
    "path": "src/svabautils/snowmanutils.cpp",
    "content": "#include \"benchmark.h\"\n#include \"assembly2vcf.h\"\n#include \"splitcounter.h\"\n\n#define AUTHOR \"Jeremiah Wala <jwala@broadinstitute.org>\"\n\nstatic const char *SUTILS_USAGE_MESSAGE =\n\"-----------------------------------------------------------------------\\n\"\n\"--- Snowman Utils - Utililty methods for analyzing/benchmarking SVs ---\\n\"\n\"-----------------------------------------------------------------------\\n\"\n\"Program: SnowmanUtils \\n\"\n\"Contact: Jeremiah Wala [ jwala@broadinstitute.org ]\\n\"\n\"Usage: snowmanutils <command> [options]\\n\\n\"\n\"Commands:\\n\"\n\"           benchmark      Run benchmarking tests for Snowman\\n\"\n\"           assembly2vcf   Run Snowman filtering on BWA-MEM aligned assembly (eg Discovar, SGA, etc) and aligned reads\\n\"\n\"           splitcounter   Simple utility to count locations of split-alignment breakpoints (eg for PacBio)\\n\"\n\"           splitfasta     Simple utility to split a fasta into smaller subsequences, splitting seq in the middle\\n\"\n\"\\nReport bugs to jwala@broadinstitute.org \\n\\n\";\n\nint main(int argc, char** argv) {\n  \n  if (argc <= 1) {\n    std::cerr << SUTILS_USAGE_MESSAGE;\n    return 0;\n  } else {\n    std::string command(argv[1]);\n    if (command == \"help\" || command == \"--help\") {\n      std::cerr << SUTILS_USAGE_MESSAGE;\n      return 0;\n    } else if (command == \"benchmark\") {\n      runBenchmark(argc-1, argv+1);\n    } else if (command == \"splitfasta\") {\n      runSplitFasta(argc-1, argv+1);\n    }\n    else if (command == \"assembly2vcf\") {\n      runAssembly2VCF(argc-1, argv+1);\n    } else if (command == \"splitcounter\") {\n      runSplitCounter(argc-1, argv+1);\n    }\n    else {\n      std::cerr << SUTILS_USAGE_MESSAGE;\n      return 0;\n    }\n  } \n  \n  std::cerr << \"Done with snowman utils\" << std::endl;\n  return 0;\n\n}\n"
  },
  {
    "path": "src/svabautils/snowtools.cpp",
    "content": "#include \"json/json.h\"\n#include \"json/json-forwards.h\"\n\n#include \"SeqLib/MiniRules2.h\"\n\n#include <cstdio>\n#include <fstream>\n#include <iostream>\n#include <sstream>\n#include <string>\n#include <vector>\nusing namespace std;\n\nconst std::vector<std::string> m_propertyNames = {\"reference\", \"mapQuality\", \"isReverseStrand\"};\n\nbool ParseFilterObject(const string& filterName, const Json::Value& filterObject) {\n  \n  // filter object parsing variables\n  Json::Value null(Json::nullValue);\n  Json::Value propertyValue;\n    \n  // store results\n  map<string, string> propertyTokens;\n    \n  // iterate over known properties\n  vector<string>::const_iterator propertyNameIter = m_propertyNames.begin();\n  vector<string>::const_iterator propertyNameEnd  = m_propertyNames.end();\n  for ( ; propertyNameIter != propertyNameEnd; ++propertyNameIter ) {\n    const string& propertyName = (*propertyNameIter);\n\n    // if property defined in filter, add to token list\n    propertyValue = filterObject.get(propertyName, null);\n    if ( propertyValue != null ) {\n      std::cerr << \"[\" << propertyName << \"] -- \" << propertyValue.asString() << std::endl;\n      propertyTokens.insert( make_pair(propertyName, propertyValue.asString()) );\n    }\n  }\n  \n  // add this filter to engin\n  //m_filterEngine.addFilter(filterName);\n  \n  // add token list to this filter\n  //return AddPropertyTokensToFilter(filterName, propertyTokens);\n  return true;\n}\n\nconst string GetScriptContents(string script) {\n  \n  // open script for reading\n  FILE* inFile = fopen(script.c_str(), \"rb\");\n  if ( !inFile ) {\n    cerr << \"bamtools filter ERROR: could not open script: \"\n\t << script << \" for reading\" << endl;\n    return string();\n  }\n    \n  // read in entire script contents  \n  char buffer[1024];\n  ostringstream docStream(\"\");\n  while ( true ) {\n        \n    // peek ahead, make sure there is data available\n    char ch = fgetc(inFile);\n    ungetc(ch, inFile);\n    if( feof(inFile) )\n      break;\n        \n    // read next block of data\n    if ( fgets(buffer, 1024, inFile) == 0 ) {\n      cerr << \"bamtools filter ERROR: could not read script contents\" << endl;\n      return string();\n    }\n        \n    docStream << buffer;\n  }\n    \n  // close script file\n  fclose(inFile);\n    \n  // import buffer contents to document, return\n  return docStream.str();\n}\n\nint main(int argc, char** argv) {\n\n  std::string script = \"/xchip/gistic/Jeremiah/GIT/SeqLib/test.json\";\n  const string document = GetScriptContents(script);\n\n  // set up JsonCPP reader and attempt to parse script\n  Json::Value root;\n  Json::Reader reader;\n  if ( !reader.parse(document, root) ) {\n    // use built-in error reporting mechanism to alert user what was wrong with the script\n    cerr  << \"bamtools filter ERROR: failed to parse script - see error message(s) below\" << endl;\n    return false;     \n  }\n\n  // see if root object contains multiple filters\n  const Json::Value filters = root[\"filters\"];\n\n  cerr << \" root size \" << root.size() << std::endl;\n  cerr << \" filters size \" << filters.size() << std::endl;\n\n  // iterate over any filters found\n  int filterIndex = 0;\n  Json::Value::const_iterator filtersIter = filters.begin();\n  Json::Value::const_iterator filtersEnd  = filters.end();\n  for ( ; filtersIter != filtersEnd; ++filtersIter, ++filterIndex ) {\n    Json::Value filter = (*filtersIter);\n            \n    // convert filter index to string\n    string filterName;\n      \n    // if id tag supplied\n    const Json::Value id = filter[\"id\"];\n    if ( !id.isNull() ) \n      filterName = id.asString();\n\n\n    // use array index \n    else {\n      stringstream convert;\n      convert << filterIndex;\n      filterName = convert.str();\n    }\n\n    cerr << \"filter \" << filterName << std::endl;            \n    // create & parse filter \n    bool success = true;\n    success &= ParseFilterObject(filterName, filter);\n  }\n\n  /// make mini rules\n  cerr << \" ... maing mini rules \" << endl;\n  \n  SeqLib::MiniRulesCollection mrc(script);\n\n\n}\n"
  },
  {
    "path": "src/svabautils/splitcounter.cpp",
    "content": "#include \"splitcounter.h\"\n\n#include <getopt.h>\n#include <iostream>\n#include <sstream>\n#include <cassert>\n#include \"gzstream.h\"\n\n#include \"SnowmanUtils.h\"\n#include \"SeqLib/BamReader.h\"\n#include \"SeqLib/ReadFilter.h\"\n\n\n#define MIN_CLIP_FACTOR 2\n#define MIN_MATCH_FACTOR 4\n#define MIN_MAPQ 10\n#define READ_LEN 151\n\nSeqLib::GRC bks;\n\nnamespace opt {\n  static std::string bam;\n  static std::string breaks_file;\n  static std::string header;\n  static std::string fasta;\n  static int split_num = 1000;\n}\n\nstatic const char* shortopts = \"hb:B:H:f:n:o:\";\nstatic const struct option longopts[] = {\n  { \"help\",                    no_argument, NULL, 'h' },\n  { \"bam\",               required_argument, NULL, 'b' },\n  { \"fasta\",               required_argument, NULL, 'f' },\n  { \"breaks\",               required_argument, NULL, 'B' },\n  { \"breaks-header\",               required_argument, NULL, 'H' },\n  { \"num-bases\",               required_argument, NULL, 'n' },\n  { \"out-fasta\",               required_argument, NULL, 'o' },\n  { NULL, 0, NULL, 0 }\n};\n\nstatic const char *RUN_SPLITCOUNTER_MESSAGE =\n\"Usage: snowman splitcounter [OPTION] -b BAM\\n\\n\"\n\"  Description: Simple utility to count locations of split-alignment breakpoints (eg for PacBio)\\n\"\n\"\\n\"\n\"  General options\\n\"\n\"  -h, --help                          Display this help and exit\\n\"\n\"  Required input\\n\"\n\"  -b, --bam                           BAM file containing split alignments to count\\n\"\n\"  Optional input\\n\"\n\"  -B, --breaks                        BED file containing regions to limit analysis to\\n\"\n\"  -H, --breaks-header                 BAM file to pair with the BED file (to get header from)\\n\"\n\"\\n\";\n\nstatic const char *RUN_FASTASPLIT_MESSAGE =\n\"Usage: snowman fastasplit -f fasta -n num_bases > outfile.fa\\n\\n\"\n\"  Description: Divide a fasta into smaller sub-sequences, splitting some seqs in the middle\\n\"\n\"\\n\"\n\"  General options\\n\"\n\"  -h, --help                          Display this help and exit\\n\"\n\"  Required input\\n\"\n\"  -f, --fasta                         BAM file containing split alignments to count\\n\"\n\"  -n, --num-bases                     Number of bases to split into\\n\"\n\"\\n\";\n\n\nvoid parseFastaSplitOptions(int argc, char** argv);\n\nvoid runSplitFasta(int argc, char** argv) {\n\n  parseFastaSplitOptions(argc, argv);\n\n  std::cerr << \" SPLITTING: \" << opt::fasta << \"\\n\" <<\n    \" NUM: \" << SeqLib::AddCommas(opt::split_num) << std::endl;\n  \n  // open the fasta\n  igzstream infile(opt::fasta.c_str(), std::ios::in);\n  \n  // confirm that it is open\n  if (!infile) {\n    std::cerr << \"Can't read file \" << opt::fasta << \" for parsing fasta\" << std::endl;\n    exit(EXIT_FAILURE);\n  }\n  \n  int line_count = 0;\n\n  //\n  std::string line;\n  std::string curr_line;\n  size_t this_line_count = 0; // new line count\n  while (std::getline(infile, line, '\\n')) {\n    \n    ++this_line_count;\n    if (this_line_count % 20000)\n      std::cerr << \"...on fasta file line (new-line separated) \" << SeqLib::AddCommas(this_line_count) << std::endl;\n\n    if (line.empty() || line.find(\">\") != std::string::npos)\n      continue;\n    \n    // doesn't hit limit\n    if ((int)(line.length() + curr_line.length()) < opt::split_num)\n      curr_line = curr_line + line;\n    \n    // hits limit, but only if adding the new line\n    else if ((int)line.length() <= opt::split_num) {\n      std::cout << \">\" << line_count << std::endl;\n      ++line_count;\n      std::cout << curr_line << std::endl;\n      curr_line = line;\n    }\n      \n    // the line itself is too big, split up\n    else if ((int)line.length() > opt::split_num) {\n      int lsize = line.size();\n      int lstart = 0;\n      while (lstart < (int)line.size()) {\n\tstd::cout << \">\" << line_count << std::endl; \n\t++line_count;\n\tstd::cout << line.substr(lstart, std::min(opt::split_num, lsize - lstart)) << std::endl;\n\tlstart += opt::split_num;\n      }\n\n    }\n    \n    \n  }\n\n}\n\nvoid runSplitCounter(int argc, char** argv) {\n\n  parseSplitCounterOptions(argc, argv);\n\n  // open the header BAM\n  std::cerr << \"...opening the header BAM \" << opt::header << std::endl;\n  SeqLib::BamReader bwh;\n  assert(bwh.Open(opt::header));\n\n  // open the breaks\n  std::cerr << \"...reading \" << opt::breaks_file << std::endl;\n  SnowmanUtils::__open_bed(opt::breaks_file, bks, bwh.Header());\n  std::cerr << \"...read in \" << SeqLib::AddCommas(bks.size()) << \" break regions \" << std::endl;\n\n  // open the BAM\n  SeqLib::BamReader walk;\n  assert(walk.Open(opt::bam));\n\n  SeqLib::BamRecord r;\n\t\n  std::string rules_string = \"{\\\"\\\" : {\\\"rules\\\" : [{\\\"mapq\\\" : 10}]}}\";\n\n  std::cerr << \"Rules: \" << rules_string << std::endl;\n  SeqLib::Filter::ReadFilterCollection mr(rules_string, walk.Header());\n\n  // convert qname (big) to in (small)\n  std::unordered_map<std::string, int> qname_set;\n\n  size_t countr = 0;\n  while(walk.GetNextRecord(r)) {\n\n    if (r.ChrID() > 23)\n      break;\n\n    if (!mr.isValid(r))\n      continue;\n    \n    ++countr;\n\n    SeqLib::Cigar cig = r.GetCigar();\n    \n    if (cig.size() <= 1)\n      continue;\n    \n    int matchlen = 0;\n    for (auto& c : cig)\n      if (c.Type() == 'M')\n\tmatchlen += c.Length();\n    if (matchlen < MIN_MATCH_FACTOR * READ_LEN)\n      continue;\n\n    if (!qname_set.count(r.Qname()))\n      qname_set[r.Qname()] = qname_set.size();\n    std::string QN = std::to_string(qname_set[r.Qname()]);\n\n    if (countr % 100000 == 0 )\n      std::cerr << \"...at split read \" << SeqLib::AddCommas(countr) << \" at position \" << r.Brief() << std::endl;\n\n    if ( (cig[0].Type() == 'H' || cig[0].Type() == 'S') && cig[0].Length() >= MIN_CLIP_FACTOR * READ_LEN)  // split on left\n      std::cout << \"L\\t\" << r.ChrName(walk.Header()) << \"\\t\" << r.Position() << \n\t\"\\t\" << (r.ReverseFlag() ? \"-\" : \"+\") << \"\\t\" << QN << \"\\t\" << r.MapQuality() << \"\\t\" << (r.SecondaryFlag() ? \"SEC\" : \"PRI\") << \"\\t\" << (bks.CountOverlaps(r.asGenomicRegion()) ? \"BK\" : \"NBK\") << \"\\t0\" << std::endl;\n    \n    if ( (cig.back().Type() == 'H' || cig.back().Type() == 'S') && cig.back().Length() >= MIN_CLIP_FACTOR * READ_LEN)  // split on right\n      std::cout << \"R\\t\" << r.ChrName(walk.Header()) << \"\\t\" << r.PositionEnd() \n\t\t<<  \"\\t\" << (r.ReverseFlag() ? \"-\" : \"+\") << \"\\t\" << QN << \"\\t\" << r.MapQuality() << \"\\t\" << (r.SecondaryFlag() ? \"SEC\" : \"PRI\") << \"\\t\" << (bks.CountOverlaps(r.asGenomicRegion()) ? \"BK\" : \"NBK\") << \"\\t0\" << std::endl;\n\n    // look for indels\n    int pos = r.Position();\n    for (auto& c : cig) {\n      if ((c.Type() == 'D' || c.Type() == 'I') && c.Length() >= 30) \n\tstd::cout << c.Type() << \"\\t\" << r.ChrName(walk.Header()) << \"\\t\" << pos << \"\\t+\\t\" \n\t\t  << QN << \"\\t\" << r.MapQuality() << \"\\t\" << (r.SecondaryFlag() ? \"SEC\" : \"PRI\") << \"\\t\" \n\t\t  << (bks.CountOverlaps(r.asGenomicRegion()) ? \"BK\" : \"NBK\") << \"\\t\" << c.Length() << std::endl;\n      if (c.ConsumesReference())\n\tpos += c.Length();\n    }\n\n    // try BLAT realignment\n    //SeqLib::BamReadVector brv;\n    //blat.querySequence(r.Qname(), r.Sequence(), brv);\n    \n    //for(auto& a : brv)\n    // w.writeAlignment(a);\n  }\n\n  std::cerr << \"...done\" << std::endl;\n\n}\n\nvoid parseSplitCounterOptions(int argc, char** argv) {\n\n  bool die = false;\n\n  if (argc <= 2) \n    die = true;\n\n  bool help = false;\n  std::stringstream ss;\n\n  std::string tmp;\n  for (char c; (c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1;) {\n    std::istringstream arg(optarg != NULL ? optarg : \"\");\n    switch (c) {\n    case 'b': arg >> opt::bam; break;\n    case 'B': arg >> opt::breaks_file; break;\n    case 'H': arg >> opt::header; break;\n    case 'h': help = true; break;\n    }\n  }\n\n  if (die || help) \n    {\n      std::cerr << \"\\n\" << RUN_SPLITCOUNTER_MESSAGE;\n      die ? exit(EXIT_FAILURE) : exit(EXIT_SUCCESS);\n    }\n\n\n}\n\n\nvoid parseFastaSplitOptions(int argc, char** argv) {\n\n  bool die = false;\n\n  if (argc <= 2) \n    die = true;\n\n  bool help = false;\n  std::stringstream ss;\n\n  std::string tmp;\n  for (char c; (c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1;) {\n    std::istringstream arg(optarg != NULL ? optarg : \"\");\n    switch (c) {\n    case 'f': arg >> opt::fasta; break;\n    case 'n': arg >> opt::split_num; break;\n    case 'h': help = true; break;\n    }\n  }\n\n  if (die || help) \n    {\n      std::cerr << \"\\n\" << RUN_FASTASPLIT_MESSAGE;\n      die ? exit(EXIT_FAILURE) : exit(EXIT_SUCCESS);\n    }\n\n\n}\n"
  },
  {
    "path": "src/svabautils/splitcounter.h",
    "content": "#ifndef SNOWMAN_SPLITCOUNTER_H__\n#define SNOWMAN_SPLITCOUNTER_H__\n\nvoid runSplitCounter(int argc,char** argv);\nvoid parseSplitCounterOptions(int argc, char** argv);\nvoid runSplitFasta(int argc, char** argv);\n\n#endif\n"
  },
  {
    "path": "svaba_jemalloc",
    "content": "#!/usr/bin/env bash\n#\n# svaba_jemalloc — run svaba with jemalloc forced as the allocator via\n# LD_PRELOAD. Recommended for Linux workloads at high thread counts\n# (~12+ threads): jemalloc's thread-local arenas relieve lock\n# contention the glibc allocator suffers under heavy malloc/free\n# traffic from the per-thread assembly pipeline. Typical wall-time\n# win: 10–20 % at -p 16 on a WGS region; less at low -p, sometimes a\n# wash under -p 4.\n#\n# *Do not use this on macOS.* Apple's libmalloc (nanomalloc fast path)\n# plus DYLD_INSERT_LIBRARIES overhead has empirically run 5–10× SLOWER\n# than the default allocator on the same BAM. Stick with system malloc\n# there.\n#\n# Usage:\n#   svaba_jemalloc run -t tumor.bam -n normal.bam -G ref.fa ...\n#     # or any other svaba subcommand — args are passed through.\n#\n# Optional environment overrides:\n#   JEMALLOC_LIB=/path/to/libjemalloc.so.2    # skip auto-detection\n#   SVABA=/path/to/svaba                      # skip $PATH lookup\n#\n# MALLOC_CONF is passed through if the caller sets it; a reasonable\n# default for high-concurrency svaba runs is:\n#   MALLOC_CONF=background_thread:true,narenas:24,dirty_decay_ms:10000\n# Tune `narenas` to match -p if you go above 24 threads.\n\nset -euo pipefail\n\n# Refuse to run on macOS — jemalloc loses badly there.\ncase \"$(uname -s)\" in\n  Darwin)\n    echo \"svaba_jemalloc: Linux only. On macOS, Apple's libmalloc is\" >&2\n    echo \"                faster than jemalloc for this workload.\" >&2\n    echo \"                Just run svaba directly.\" >&2\n    exit 1\n    ;;\nesac\n\n# 1) Resolve libjemalloc path.\nJEMALLOC_LIB=${JEMALLOC_LIB:-}\nif [[ -z \"$JEMALLOC_LIB\" ]]; then\n  for cand in \\\n      /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 \\\n      /usr/lib64/libjemalloc.so.2 \\\n      /usr/lib/libjemalloc.so.2 \\\n      /usr/local/lib/libjemalloc.so.2 \\\n      /opt/homebrew/lib/libjemalloc.so.2\n  do\n    if [[ -f \"$cand\" ]]; then JEMALLOC_LIB=$cand; break; fi\n  done\nfi\nif [[ -z \"$JEMALLOC_LIB\" ]]; then\n  # last-ditch: ask ldconfig for a cached match\n  JEMALLOC_LIB=$(ldconfig -p 2>/dev/null | awk '/libjemalloc\\.so\\.2/ {print $NF; exit}')\nfi\nif [[ -z \"$JEMALLOC_LIB\" || ! -f \"$JEMALLOC_LIB\" ]]; then\n  echo \"svaba_jemalloc: could not find libjemalloc.so.2.\" >&2\n  echo \"  Install it (e.g. 'apt install libjemalloc2' or 'yum install jemalloc')\" >&2\n  echo \"  or set JEMALLOC_LIB=/path/to/libjemalloc.so.2.\" >&2\n  exit 1\nfi\n\n# 2) Resolve svaba binary.\nSVABA=${SVABA:-}\nif [[ -z \"$SVABA\" ]]; then\n  # Prefer $PATH; fall back to a build/svaba next to this script.\n  if command -v svaba >/dev/null 2>&1; then\n    SVABA=$(command -v svaba)\n  else\n    here=$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\n    for cand in \"$here/build/svaba\" \"$here/bin/svaba\"; do\n      if [[ -x \"$cand\" ]]; then SVABA=$cand; break; fi\n    done\n  fi\nfi\nif [[ -z \"$SVABA\" || ! -x \"$SVABA\" ]]; then\n  echo \"svaba_jemalloc: could not find the svaba binary.\" >&2\n  echo \"  Put svaba on \\$PATH, or set SVABA=/path/to/svaba.\" >&2\n  exit 1\nfi\n\nexec env LD_PRELOAD=\"$JEMALLOC_LIB\" \"$SVABA\" \"$@\"\n"
  },
  {
    "path": "tracks/README.md",
    "content": "# svaba tracks/\n\nThis directory holds the BED files consumed by `svaba run --blacklist`\n(and by the scripts that build the combined blacklist from component\nfiles). Everything here is a regeneratable artifact — don't hand-edit\n`hg38.combined_blacklist.bed` or `lowmap*perc.bed`; edit the upstream\ncomponent or re-run the generator script.\n\n## `hg38.combined_blacklist.bed` — the master blacklist\n\nThis is the file you point svaba at. It is the union of several\ncomponent blacklists, produced by `scripts/combine_blacklists.sh` from\nthe components in this same directory. The three primary content\nsources are the manual blacklist (`hg38.manual.blacklist.bed`),\nempirically-slow-to-assemble regions (`hg38.high_runtime.bed`), and\nUCSC RepeatMasker simple repeats (`hg38.rmsk.simple_repeat.bed`). The\nnon-standard-contig file (`hg38.nonstd_chr.blacklist.bed`) and the\nENCODE-style high-signal blacklist (`hg38.blacklist.sorted.bed`) are\ntypically folded in as well.\n\nTo refresh the combined file after editing any component:\n\n```bash\n./scripts/combine_blacklists.sh --merge --clip tracks/chr \\\n    -o tracks/hg38.combined_blacklist.bed \\\n    tracks/hg38.manual.blacklist.bed \\\n    tracks/hg38.high_runtime.bed \\\n    tracks/hg38.rmsk.simple_repeat.bed\n```\n\n`--merge` runs `bedtools merge` to collapse overlapping intervals,\nwith a comma-separated list of contributing source tags in col 4.\n`--clip` clips any oversize-end sentinels (e.g. synthetic\n`end=250000000` rows in some BED files) to real contig lengths.\nSee the header comment in `combine_blacklists.sh` for the full flag\nsurface.\n\n## `lowmap{30,50}perc.bed` — low-mappability blacklists\n\nThese are blacklists of regions where the vast majority of reads at a\nlocus fail a mapping-quality threshold — i.e. the locus is effectively\n\"unmapped\" for any caller that only trusts uniquely-placed reads.\nThey're derived from paired `mosdepth` runs over known-non-tumor BAMs\nusing `scripts/mosdepth_lowmapq_blacklist.sh`, then intersected across\ntwo independent non-tumor samples so only regions confirmed as low-\nmappability in both samples survive.\n\nThe number in the filename is the ratio cutoff used: `lowmap30perc.bed`\nkeeps bins where fewer than 30% of reads pass MAPQ (stricter), and\n`lowmap50perc.bed` keeps bins below 50% (the default). The generation\nrecipe has three steps per sample, plus a final intersection.\n\n### Step 1 — mosdepth coverage per sample, unfiltered vs MAPQ-filtered\n\nRun mosdepth twice per BAM, differing only in `--mapq`. The\nunfiltered pass (`--mapq 0`) counts every alignment; the filtered pass\n(`--mapq 20`) counts only uniquely-placed reads. `--by 300` bins the\ncoverage into 300 bp windows, which is finer than the svaba\nblacklist's natural resolution and gives us room to merge later.\n\n```bash\nmosdepth --by 300 --fast-mode --mapq  0 unf_T0  NP_WGS_Normal_DNA.recal.bam\nmosdepth --by 300 --fast-mode --mapq 20 filt_T0 NP_WGS_Normal_DNA.recal.bam\nmosdepth --by 300 --fast-mode --mapq  0 unf_T2  <second_non_tumor>.recal.bam\nmosdepth --by 300 --fast-mode --mapq 20 filt_T2 <second_non_tumor>.recal.bam\n```\n\nEach mosdepth invocation produces a `<prefix>.regions.bed.gz` with\n`chrom, start, end, mean_depth` columns.\n\n### Step 2 — per-sample ratio + flagging\n\n`mosdepth_lowmapq_blacklist.sh` joins the two mosdepth outputs bin by\nbin, computes `filt/unf` (the fraction of reads that pass MAPQ), and\nflags bins below a threshold where `unf` is high enough to be\nstatistically meaningful. `--max-ratio` controls strictness: `0.5`\nmeans \"flag bins where fewer than half of reads pass MAPQ\" (default),\n`0.3` is stricter, `0.7` is looser.\n\n```bash\n~/git/svaba/scripts/mosdepth_lowmapq_blacklist.sh --max-ratio 0.5 --out lowmap0.5_T0 unf_T0.regions.bed.gz filt_T0.regions.bed.gz\n~/git/svaba/scripts/mosdepth_lowmapq_blacklist.sh --max-ratio 0.5 --out lowmap0.5_T2 unf_T2.regions.bed.gz filt_T2.regions.bed.gz\n~/git/svaba/scripts/mosdepth_lowmapq_blacklist.sh --max-ratio 0.7 --out lowmap0.7_T2 unf_T2.regions.bed.gz filt_T2.regions.bed.gz\n```\n\nEach run emits `<prefix>.flagged.bed` (raw per-bin flags),\n`<prefix>.flagged.merged.bed` (intervals merged within 1 kb), and a\n`<prefix>.summary.txt` with totals.\n\n### Step 3 — cross-sample intersection\n\nThe per-sample `lowmap0.Xp_T*.flagged.merged.bed` files are noisier\nthan we want as a blacklist input. Taking the `bedtools intersect` of\ntwo independent non-tumor samples gives a more conservative result:\nonly regions flagged as low-mappability in BOTH samples survive.\n\n```bash\nbedtools intersect -a lowmap0.5_T0.flagged.merged.bed -b lowmap0.5_T2.flagged.merged.bed > lowmap50perc.bed\nbedtools intersect -a lowmap0.3_T0.flagged.merged.bed -b lowmap0.3_T2.flagged.merged.bed > lowmap30perc.bed\n```\n\nBoth samples must be non-tumor — tumor BAMs have structural variation\nthat can pile up multi-mappers at real break sites, which we don't\nwant mistaken for low-mappability and blacklisted.\n\nIntersecting two independent non-tumor samples gets you a much smaller\n(and more trustworthy) blacklist than either sample's raw output. Per\nthe v3 mosdepth helper's summary: typical single-sample flagged volume\non hg38 WGS is 200-400 Mb; after intersection with a second non-tumor\nsample, the `lowmap50perc.bed` settles in the ~30-50 Mb range, and\n`lowmap30perc.bed` shrinks further.\n\n## Other component files\n\n`hg38.blacklist.sorted.bed` is the ENCODE-style high-signal blacklist.\n`hg38.high_runtime.bed` is a list of regions empirically slow to\nassemble; curated from svaba runtime.txt tails. `hg38.manual.blacklist.bed`\nis the curated ad-hoc bad-list. `hg38.nonstd_chr.blacklist.bed` is\nfull-contig entries for every chrUn/*_decoy/*_alt/*_random/chrEBV/HLA-*\ncontig in the reference (regenerated from `tracks/chr` which is a\nGRCh38 fasta-header dump). `hg38.rmsk.simple_repeat.bed` is UCSC\nRepeatMasker simple-repeat regions.\n\n`genome.hg38.sorted.bed`, `hg38.bed`, and\n`hg38_arms_excl_centromeres.bed` are reference-coordinate helpers used\nby downstream analysis scripts, not by `svaba run` directly.\n`region_generator.R` is an R script used to regenerate some of the\nabove.\n\n## Adding a new component to the combined blacklist\n\nPut the new `.bed` file in this directory, then re-run\n`combine_blacklists.sh` with it added to the argument list. The script\ntolerates any well-formed 3-column BED. If the new file has a 4th\ncolumn with per-interval labels, those get preserved in the merged\noutput's label column.\n"
  },
  {
    "path": "tracks/genome.hg38.sorted.bed",
    "content": "chr1\t0\t248956422\nchr10\t0\t133797422\nchr11\t0\t135086622\nchr12\t0\t133275309\nchr13\t0\t114364328\nchr14\t0\t107043718\nchr15\t0\t101991189\nchr16\t0\t90338345\nchr17\t0\t83257441\nchr18\t0\t80373285\nchr19\t0\t58617616\nchr2\t0\t32865900\nchr2\t32918400\t242193529\nchr20\t0\t64444167\nchr21\t0\t46709983\nchr22\t0\t50818468\nchr3\t0\t198295559\nchr4\t0\t190214555\nchr5\t0\t181538259\nchr6\t0\t170805979\nchr7\t0\t159345973\nchr8\t0\t145138636\nchr9\t0\t138394717\nchrX\t0\t156040895\nchrY\t0\t57227415\n"
  },
  {
    "path": "tracks/hg38.bed",
    "content": "chr1\t0\t248956422\nchr2\t0\t32928000\nchr2\t32953000\t242193529\nchr3\t0\t198295559\nchr4\t0\t190214555\nchr5\t0\t181538259\nchr6\t0\t170805979\nchr7\t0\t159345973\nchr8\t0\t145138636\nchr9\t0\t138394717\nchr10\t0\t133797422\nchr11\t0\t135086622\nchr12\t0\t133275309\nchr13\t0\t114364328\nchr14\t0\t107043718\nchr15\t0\t101991189\nchr16\t0\t90338345\nchr17\t0\t83257441\nchr18\t0\t80373285\nchr19\t0\t58617616\nchr20\t0\t64444167\nchr21\t0\t46709983\nchr22\t0\t50818468\nchrX\t0\t156040895\n"
  },
  {
    "path": "tracks/hg38.blacklist.sorted.bed",
    "content": "chr1\t0\t792500\tHigh Signal Region\nchr1\t91386300\t91388400\tLow Mappability\nchr1\t103594400\t103760600\tHigh Signal Region\nchr1\t121605200\t124938900\tHigh Signal Region\nchr1\t125067600\t125086000\tHigh Signal Region\nchr1\t125130200\t143562200\tHigh Signal Region\nchr1\t161423100\t161472400\tHigh Signal Region\nchr1\t168348600\t168349900\tHigh Signal Region\nchr1\t224010800\t224017000\tHigh Signal Region\nchr1\t230872006\t230872168\tHigh Signal Region\nchr1\t236713000\t236715600\tLow Mappability\nchr1\t248932700\t248956400\tHigh Signal Region\nchr10\t0\t45700\tLow Mappability\nchr10\t38481300\t38596500\tHigh Signal Region\nchr10\t38782600\t38967900\tHigh Signal Region\nchr10\t39901300\t41712900\tHigh Signal Region\nchr10\t41838900\t42107300\tHigh Signal Region\nchr10\t42279400\t42322500\tHigh Signal Region\nchr10\t126946300\t126953400\tLow Mappability\nchr10\t133625800\t133797400\tHigh Signal Region\nchr11\t0\t194500\tLow Mappability\nchr11\t518900\t520700\tLow Mappability\nchr11\t584400\t586500\tHigh Signal Region\nchr11\t964100\t966000\tLow Mappability\nchr11\t1015700\t1019300\tHigh Signal Region\nchr11\t1091000\t1098200\tLow Mappability\nchr11\t3652800\t3655600\tHigh Signal Region\nchr11\t10506900\t10511100\tHigh Signal Region\nchr11\t28206300\t28236700\tHigh Signal Region\nchr11\t50813600\t54383000\tHigh Signal Region\nchr11\t61084500\t61130400\tHigh Signal Region\nchr11\t70370400\t70372400\tHigh Signal Region\nchr11\t73509800\t73511700\tHigh Signal Region\nchr11\t77885600\t77887600\tHigh Signal Region\nchr11\t93417500\t93427700\tHigh Signal Region\nchr11\t94232700\t94240400\tHigh Signal Region\nchr11\t103408700\t103410600\tHigh Signal Region\nchr11\t121175000\t121187000\tHigh Signal Region\nchr11\t131679500\t131681500\tHigh Signal Region\nchr11\t135075600\t135086600\tHigh Signal Region\nchr12\t0\t77800\tHigh Signal Region\nchr12\t371800\t422400\tHigh Signal Region\nchr12\t2254900\t2257000\tHigh Signal Region\nchr12\t2519800\t2540500\tLow Mappability\nchr12\t5928900\t5933000\tLow Mappability\nchr12\t20550500\t20552400\tLow Mappability\nchr12\t20768400\t20770300\tHigh Signal Region\nchr12\t29790400\t29834600\tHigh Signal Region\nchr12\t34715400\t37269100\tHigh Signal Region\nchr12\t41362700\t41364600\tHigh Signal Region\nchr12\t61471100\t61473000\tHigh Signal Region\nchr12\t66473900\t66475800\tHigh Signal Region\nchr12\t101147000\t101155000\tHigh Signal Region\nchr12\t113079600\t113081500\tHigh Signal Region\nchr12\t124430500\t124440300\tHigh Signal Region\nchr12\t124905900\t124941800\tHigh Signal Region\nchr12\t130386400\t130394100\tHigh Signal Region\nchr12\t131475300\t131478600\tHigh Signal Region\nchr12\t131576000\t131589700\tHigh Signal Region\nchr12\t132223300\t132243400\tHigh Signal Region\nchr12\t132455100\t132465200\tHigh Signal Region\nchr12\t133249000\t133275300\tHigh Signal Region\nchr13\t16087600\t16165300\tHigh Signal Region\nchr13\t16226300\t18171400\tHigh Signal Region\nchr13\t18211000\t18216100\tHigh Signal Region\nchr13\t57140500\t57172500\tHigh Signal Region\nchr13\t109423200\t109425200\tHigh Signal Region\nchr13\t114353300\t114364300\tLow Mappability\nchr14\t0\t18670900\tHigh Signal Region\nchr14\t18695400\t19724300\tHigh Signal Region\nchr14\t23033300\t23098600\tHigh Signal Region\nchr14\t26629300\t26634900\tHigh Signal Region\nchr14\t31793800\t31798100\tHigh Signal Region\nchr14\t32483400\t32486000\tHigh Signal Region\nchr14\t34537100\t34562600\tHigh Signal Region\nchr14\t35947200\t35950000\tHigh Signal Region\nchr14\t37351000\t37356700\tHigh Signal Region\nchr14\t44025100\t44027200\tHigh Signal Region\nchr14\t44705100\t44709900\tHigh Signal Region\nchr14\t45477100\t45482500\tHigh Signal Region\nchr14\t46865300\t46866500\tHigh Signal Region\nchr14\t54235600\t54240000\tHigh Signal Region\nchr14\t57112100\t57118100\tHigh Signal Region\nchr14\t74711700\t74729000\tHigh Signal Region\nchr14\t86074000\t86076000\tHigh Signal Region\nchr14\t86593300\t86595200\tHigh Signal Region\nchr14\t88443700\t88458100\tHigh Signal Region\nchr14\t100525900\t100527800\tHigh Signal Region\nchr14\t101267600\t101272200\tHigh Signal Region\nchr14\t101674400\t101676400\tHigh Signal Region\nchr14\t104288100\t104290200\tHigh Signal Region\nchr14\t105215000\t105240900\tHigh Signal Region\nchr14\t105568500\t105583900\tHigh Signal Region\nchr14\t105616500\t105618600\tHigh Signal Region\nchr14\t106326900\t106367700\tHigh Signal Region\nchr15\t0\t17035000\tHigh Signal Region\nchr15\t17058500\t19790100\tHigh Signal Region\nchr15\t20005600\t22606300\tHigh Signal Region\nchr15\t23125400\t23357400\tHigh Signal Region\nchr15\t25757700\t25759100\tLow Mappability\nchr15\t28304900\t28683400\tHigh Signal Region\nchr15\t30066300\t30627500\tHigh Signal Region\nchr15\t30844100\t30859900\tHigh Signal Region\nchr15\t32153700\t32626200\tHigh Signal Region\nchr15\t54925700\t54932200\tHigh Signal Region\nchr15\t56311200\t56314600\tHigh Signal Region\nchr15\t72635200\t72687100\tHigh Signal Region\nchr15\t74068100\t74102000\tHigh Signal Region\nchr15\t75254100\t75299800\tHigh Signal Region\nchr15\t77698600\t77700600\tHigh Signal Region\nchr15\t82321000\t82374600\tHigh Signal Region\nchr15\t82421200\t82541700\tHigh Signal Region\nchr15\t84405300\t84524700\tHigh Signal Region\nchr15\t101752300\t101764800\tLow Mappability\nchr15\t101892700\t101991100\tHigh Signal Region\nchr16\t29430800\t29566900\tLow Mappability\nchr16\t34061400\t34121400\tHigh Signal Region\nchr16\t34272000\t34633100\tHigh Signal Region\nchr16\t34657200\t34672500\tHigh Signal Region\nchr16\t34694600\t34772000\tHigh Signal Region\nchr16\t34832600\t34922100\tHigh Signal Region\nchr16\t34945600\t35072500\tLow Mappability\nchr16\t36166300\t36202400\tHigh Signal Region\nchr16\t36225200\t46423000\tHigh Signal Region\nchr16\t46449700\t46467000\tHigh Signal Region\nchr16\t90100500\t90338300\tLow Mappability\nchr17\t0\t137600\tHigh Signal Region\nchr17\t294900\t317900\tHigh Signal Region\nchr17\t448200\t510900\tHigh Signal Region\nchr17\t1061500\t1066100\tHigh Signal Region\nchr17\t1307700\t1312000\tLow Mappability\nchr17\t19025700\t19237400\tHigh Signal Region\nchr17\t21783300\t22054000\tHigh Signal Region\nchr17\t22520400\t22527300\tHigh Signal Region\nchr17\t22745200\t26629800\tHigh Signal Region\nchr17\t26766800\t26987200\tHigh Signal Region\nchr17\t43227600\t43324300\tHigh Signal Region\nchr17\t45511500\t45641300\tLow Mappability\nchr17\t53104900\t53107300\tHigh Signal Region\nchr18\t0\t64600\tHigh Signal Region\nchr18\t105200\t113200\tHigh Signal Region\nchr18\t971000\t976500\tHigh Signal Region\nchr18\t2841300\t2861500\tHigh Signal Region\nchr18\t15367200\t20940300\tHigh Signal Region\nchr18\t46961600\t47031700\tHigh Signal Region\nchr18\t47852300\t47854300\tLow Mappability\nchr18\t52791800\t52793800\tHigh Signal Region\nchr18\t74615900\t74618100\tHigh Signal Region\nchr18\t76966200\t76968500\tHigh Signal Region\nchr18\t78436900\t78438700\tLow Mappability\nchr18\t79013800\t79040300\tHigh Signal Region\nchr18\t79617800\t79621500\tHigh Signal Region\nchr18\t80257400\t80373200\tHigh Signal Region\nchr19\t0\t271200\tHigh Signal Region\nchr19\t7019100\t7061300\tHigh Signal Region\nchr19\t7449400\t7452000\tHigh Signal Region\nchr19\t8740100\t8800500\tHigh Signal Region\nchr19\t24330100\t27274500\tHigh Signal Region\nchr19\t27337600\t27427400\tHigh Signal Region\nchr19\t34386800\t34393500\tHigh Signal Region\nchr19\t34860600\t34866200\tHigh Signal Region\nchr19\t36267900\t36313700\tHigh Signal Region\nchr19\t37264900\t37304300\tHigh Signal Region\nchr19\t44393300\t44416700\tHigh Signal Region\nchr19\t47903000\t47959700\tHigh Signal Region\nchr19\t50090500\t50140400\tHigh Signal Region\nchr19\t58538700\t58617600\tHigh Signal Region\nchr2\t1221700\t1223900\tHigh Signal Region\nchr2\t1594700\t1605200\tHigh Signal Region\nchr2\t3179600\t3182100\tHigh Signal Region\nchr2\t4643800\t4648800\tHigh Signal Region\nchr2\t10952800\t10955000\tHigh Signal Region\nchr2\t13718700\t13737700\tHigh Signal Region\nchr2\t21903500\t21906400\tHigh Signal Region\nchr2\t32865900\t32869900\tHigh Signal Region\nchr2\t32915300\t32918400\tHigh Signal Region\nchr2\t33766500\t33768400\tHigh Signal Region\nchr2\t36183000\t36184500\tHigh Signal Region\nchr2\t49228700\t49230700\tHigh Signal Region\nchr2\t64359300\t64377000\tHigh Signal Region\nchr2\t86655300\t86661100\tHigh Signal Region\nchr2\t86900700\t87078100\tLow Mappability\nchr2\t87119300\t87189800\tLow Mappability\nchr2\t87217000\t87866200\tHigh Signal Region\nchr2\t88771000\t88806500\tHigh Signal Region\nchr2\t89235300\t89947100\tHigh Signal Region\nchr2\t90246300\t91735500\tHigh Signal Region\nchr2\t91783000\t91924800\tLow Mappability\nchr2\t91969000\t94569500\tHigh Signal Region\nchr2\t95849400\t96067900\tHigh Signal Region\nchr2\t97106300\t97615800\tHigh Signal Region\nchr2\t109198400\t109200700\tHigh Signal Region\nchr2\t109744600\t110095200\tHigh Signal Region\nchr2\t110229200\t110633400\tLow Mappability\nchr2\t111253600\t111500500\tLow Mappability\nchr2\t112346200\t112441300\tLow Mappability\nchr2\t113370100\t113662700\tHigh Signal Region\nchr2\t130496800\t130716400\tHigh Signal Region\nchr2\t132201000\t132288900\tHigh Signal Region\nchr2\t132353600\t132364500\tHigh Signal Region\nchr2\t148880800\t148882800\tHigh Signal Region\nchr2\t161277700\t161283400\tHigh Signal Region\nchr2\t181274800\t181276800\tHigh Signal Region\nchr2\t226108500\t226110400\tHigh Signal Region\nchr2\t234889800\t234894400\tHigh Signal Region\nchr2\t239642200\t239645600\tHigh Signal Region\nchr2\t240308100\t240310300\tHigh Signal Region\nchr2\t241589300\t241591800\tHigh Signal Region\nchr2\t242005900\t242011100\tHigh Signal Region\nchr2\t242110100\t242193500\tHigh Signal Region\nchr20\t0\t67900\tHigh Signal Region\nchr20\t26364200\t28916900\tHigh Signal Region\nchr20\t28939400\t29264700\tHigh Signal Region\nchr20\t30995400\t31246000\tHigh Signal Region\nchr20\t47893800\t47900200\tHigh Signal Region\nchr21\t0\t8679600\tHigh Signal Region\nchr21\t9159900\t9735300\tHigh Signal Region\nchr21\t10013900\t10069600\tHigh Signal Region\nchr21\t10094700\t10505100\tHigh Signal Region\nchr21\t10650900\t12965800\tHigh Signal Region\nchr21\t43212400\t43280900\tHigh Signal Region\nchr21\t46682700\t46709900\tHigh Signal Region\nchr22\t10687700\t11428100\tHigh Signal Region\nchr22\t11496900\t11873100\tHigh Signal Region\nchr22\t11976900\t15154400\tHigh Signal Region\nchr22\t16258000\t16385800\tHigh Signal Region\nchr22\t18175900\t18947300\tHigh Signal Region\nchr22\t20337400\t20343300\tHigh Signal Region\nchr22\t21113500\t21554000\tHigh Signal Region\nchr22\t49972700\t49975300\tHigh Signal Region\nchr22\t50642800\t50644900\tHigh Signal Region\nchr22\t50786600\t50818400\tHigh Signal Region\nchr3\t0\t11600\tHigh Signal Region\nchr3\t3895200\t3896700\tHigh Signal Region\nchr3\t4916700\t4922500\tHigh Signal Region\nchr3\t14091000\t14092500\tHigh Signal Region\nchr3\t15187200\t15207800\tHigh Signal Region\nchr3\t15592100\t15603300\tHigh Signal Region\nchr3\t16176800\t16179200\tHigh Signal Region\nchr3\t16679700\t16682500\tHigh Signal Region\nchr3\t19499700\t19504000\tHigh Signal Region\nchr3\t19624000\t19627100\tHigh Signal Region\nchr3\t21983200\t21988100\tHigh Signal Region\nchr3\t24053500\t24054900\tHigh Signal Region\nchr3\t26384800\t26404100\tHigh Signal Region\nchr3\t29993900\t29999900\tHigh Signal Region\nchr3\t36987500\t36995000\tHigh Signal Region\nchr3\t38083400\t38085400\tHigh Signal Region\nchr3\t38406100\t38430900\tHigh Signal Region\nchr3\t39366700\t39386000\tHigh Signal Region\nchr3\t40219400\t40240500\tHigh Signal Region\nchr3\t49671000\t49696700\tHigh Signal Region\nchr3\t51457800\t51462000\tHigh Signal Region\nchr3\t57326800\t57328500\tHigh Signal Region\nchr3\t65124100\t65126100\tHigh Signal Region\nchr3\t65510000\t65513900\tHigh Signal Region\nchr3\t65697400\t65699300\tHigh Signal Region\nchr3\t66273800\t66275200\tHigh Signal Region\nchr3\t68076400\t68077800\tHigh Signal Region\nchr3\t69047300\t69053600\tHigh Signal Region\nchr3\t69475300\t69479700\tHigh Signal Region\nchr3\t75630100\t75707800\tHigh Signal Region\nchr3\t75736400\t75754600\tHigh Signal Region\nchr3\t78948800\t78950500\tHigh Signal Region\nchr3\t80876000\t80894000\tHigh Signal Region\nchr3\t89345600\t89370500\tHigh Signal Region\nchr3\t90156400\t90175500\tHigh Signal Region\nchr3\t90455400\t91297100\tHigh Signal Region\nchr3\t91516200\t93749200\tHigh Signal Region\nchr3\t96616300\t96619300\tHigh Signal Region\nchr3\t97905100\t97923200\tHigh Signal Region\nchr3\t101674800\t101698400\tHigh Signal Region\nchr3\t103224300\t103236500\tHigh Signal Region\nchr3\t106665700\t106669700\tHigh Signal Region\nchr3\t106975900\t106979600\tHigh Signal Region\nchr3\t108751100\t108755100\tHigh Signal Region\nchr3\t111019500\t111024600\tHigh Signal Region\nchr3\t121933800\t121936400\tHigh Signal Region\nchr3\t122414300\t122417500\tHigh Signal Region\nchr3\t122735500\t122796600\tHigh Signal Region\nchr3\t122837000\t122838700\tHigh Signal Region\nchr3\t133177100\t133179800\tHigh Signal Region\nchr3\t133551500\t133579500\tHigh Signal Region\nchr3\t135437200\t135439100\tHigh Signal Region\nchr3\t136954600\t136969200\tHigh Signal Region\nchr3\t137168400\t137169900\tHigh Signal Region\nchr3\t138575800\t138595900\tHigh Signal Region\nchr3\t139190800\t139194700\tHigh Signal Region\nchr3\t153236200\t153241300\tHigh Signal Region\nchr3\t155544100\t155546700\tHigh Signal Region\nchr3\t156279000\t156283500\tHigh Signal Region\nchr3\t157080800\t157093400\tHigh Signal Region\nchr3\t158511300\t158513100\tHigh Signal Region\nchr3\t160941200\t160948700\tHigh Signal Region\nchr3\t161001900\t161014100\tHigh Signal Region\nchr3\t165573100\t165591000\tHigh Signal Region\nchr3\t166228200\t166232400\tHigh Signal Region\nchr3\t168012100\t168016800\tHigh Signal Region\nchr3\t170567000\t170569900\tHigh Signal Region\nchr3\t170864300\t170881400\tHigh Signal Region\nchr3\t171626600\t171637700\tHigh Signal Region\nchr3\t174829200\t174831800\tHigh Signal Region\nchr3\t176828700\t176833000\tHigh Signal Region\nchr3\t177660600\t177664000\tHigh Signal Region\nchr3\t178926800\t178941300\tHigh Signal Region\nchr3\t183016900\t183019100\tHigh Signal Region\nchr3\t183955400\t183958700\tHigh Signal Region\nchr3\t187893900\t187896100\tHigh Signal Region\nchr3\t192739300\t192742700\tHigh Signal Region\nchr3\t194323600\t194334900\tHigh Signal Region\nchr3\t195477900\t195507300\tHigh Signal Region\nchr3\t195616000\t195750100\tHigh Signal Region\nchr3\t195775500\t195791400\tHigh Signal Region\nchr3\t195914100\t196028300\tHigh Signal Region\nchr3\t196249400\t196251900\tHigh Signal Region\nchr3\t196897800\t196899800\tHigh Signal Region\nchr3\t197030600\t197035800\tHigh Signal Region\nchr3\t197383400\t197428800\tHigh Signal Region\nchr3\t197454700\t197460800\tHigh Signal Region\nchr3\t197598400\t197680900\tHigh Signal Region\nchr3\t198099800\t198295500\tHigh Signal Region\nchr4\t0\t69200\tHigh Signal Region\nchr4\t554100\t556500\tHigh Signal Region\nchr4\t1427000\t1468900\tHigh Signal Region\nchr4\t6002700\t6005700\tHigh Signal Region\nchr4\t7863000\t7865000\tHigh Signal Region\nchr4\t9212700\t9369600\tHigh Signal Region\nchr4\t40291700\t40318200\tHigh Signal Region\nchr4\t49077200\t51816100\tHigh Signal Region\nchr4\t55327200\t55329200\tHigh Signal Region\nchr4\t77994000\t78009600\tHigh Signal Region\nchr4\t119274400\t119301700\tHigh Signal Region\nchr4\t146285100\t146305300\tHigh Signal Region\nchr4\t162420500\t162422400\tHigh Signal Region\nchr4\t166554300\t166581300\tLow Mappability\nchr4\t181238800\t181242300\tLow Mappability\nchr4\t189232500\t189236300\tHigh Signal Region\nchr4\t189834900\t189849700\tHigh Signal Region\nchr4\t189877500\t190023700\tHigh Signal Region\nchr4\t190048600\t190214500\tHigh Signal Region\nchr5\t0\t44100\tHigh Signal Region\nchr5\t548300\t564100\tHigh Signal Region\nchr5\t647600\t651700\tHigh Signal Region\nchr5\t1326100\t1334600\tHigh Signal Region\nchr5\t2144600\t2147800\tHigh Signal Region\nchr5\t2489800\t2491700\tHigh Signal Region\nchr5\t3322100\t3325100\tHigh Signal Region\nchr5\t6967700\t6971700\tHigh Signal Region\nchr5\t17516800\t17600200\tHigh Signal Region\nchr5\t21477600\t21497600\tHigh Signal Region\nchr5\t25381400\t25384300\tHigh Signal Region\nchr5\t34177900\t34244800\tHigh Signal Region\nchr5\t45522900\t45525200\tHigh Signal Region\nchr5\t45743000\t45744800\tHigh Signal Region\nchr5\t46433900\t46687700\tHigh Signal Region\nchr5\t46708100\t50165300\tHigh Signal Region\nchr5\t60759700\t60762500\tHigh Signal Region\nchr5\t63320900\t63335500\tHigh Signal Region\nchr5\t69540700\t71359500\tHigh Signal Region\nchr5\t71850000\t71852800\tHigh Signal Region\nchr5\t74685400\t74712400\tHigh Signal Region\nchr5\t78452400\t78457600\tHigh Signal Region\nchr5\t78848400\t78872800\tHigh Signal Region\nchr5\t80649100\t80653100\tHigh Signal Region\nchr5\t85641800\t85662700\tHigh Signal Region\nchr5\t93947500\t93948900\tHigh Signal Region\nchr5\t94567100\t94570400\tHigh Signal Region\nchr5\t100045500\t100076300\tHigh Signal Region\nchr5\t106425500\t106429500\tHigh Signal Region\nchr5\t109259500\t109265400\tHigh Signal Region\nchr5\t111302100\t111308300\tHigh Signal Region\nchr5\t114156700\t114158300\tHigh Signal Region\nchr5\t119904000\t119905600\tHigh Signal Region\nchr5\t123760300\t123762200\tHigh Signal Region\nchr5\t134922500\t134929400\tHigh Signal Region\nchr5\t139005500\t139011600\tHigh Signal Region\nchr5\t146610000\t146615500\tHigh Signal Region\nchr5\t153071100\t153077000\tHigh Signal Region\nchr5\t156658300\t156665400\tHigh Signal Region\nchr5\t161606000\t161611700\tHigh Signal Region\nchr5\t171083900\t171090200\tHigh Signal Region\nchr5\t175904500\t176118000\tHigh Signal Region\nchr5\t176590700\t176593000\tHigh Signal Region\nchr5\t177636700\t177684700\tHigh Signal Region\nchr5\t177960500\t177981400\tHigh Signal Region\nchr5\t178584600\t178586600\tHigh Signal Region\nchr5\t181172600\t181538200\tHigh Signal Region\nchr6\t256500\t382800\tHigh Signal Region\nchr6\t861500\t864200\tHigh Signal Region\nchr6\t1052800\t1054800\tHigh Signal Region\nchr6\t26669200\t26832300\tHigh Signal Region\nchr6\t33484600\t33486400\tHigh Signal Region\nchr6\t34070600\t34074000\tHigh Signal Region\nchr6\t38262000\t38301600\tHigh Signal Region\nchr6\t39455800\t39460500\tHigh Signal Region\nchr6\t44043600\t44080000\tHigh Signal Region\nchr6\t44180600\t44182900\tHigh Signal Region\nchr6\t51874900\t51901300\tHigh Signal Region\nchr6\t54961900\t54967400\tHigh Signal Region\nchr6\t58432200\t60242300\tHigh Signal Region\nchr6\t61321800\t61493000\tHigh Signal Region\nchr6\t61573200\t61575100\tLow Mappability\nchr6\t61661900\t61673400\tHigh Signal Region\nchr6\t103709000\t103715100\tHigh Signal Region\nchr6\t115254900\t115256800\tHigh Signal Region\nchr6\t143799900\t143801800\tHigh Signal Region\nchr6\t156035300\t156040100\tHigh Signal Region\nchr6\t157309500\t157324800\tHigh Signal Region\nchr6\t160611700\t160647400\tHigh Signal Region\nchr6\t170145300\t170147200\tHigh Signal Region\nchr6\t170376900\t170401000\tHigh Signal Region\nchr6\t170465400\t170468400\tHigh Signal Region\nchr7\t0\t49600\tHigh Signal Region\nchr7\t224500\t241300\tHigh Signal Region\nchr7\t904700\t907100\tLow Mappability\nchr7\t1271400\t1273500\tHigh Signal Region\nchr7\t45251000\t45253000\tHigh Signal Region\nchr7\t56369500\t56375600\tHigh Signal Region\nchr7\t57485300\t57497800\tHigh Signal Region\nchr7\t57611600\t57637700\tLow Mappability\nchr7\t58031800\t60997400\tHigh Signal Region\nchr7\t61017800\t61075200\tHigh Signal Region\nchr7\t61102900\t61725200\tLow Mappability\nchr7\t62265700\t62409500\tHigh Signal Region\nchr7\t62430000\t62520600\tHigh Signal Region\nchr7\t65488000\t65496500\tHigh Signal Region\nchr7\t100951400\t100968300\tHigh Signal Region\nchr7\t100991500\t101004600\tHigh Signal Region\nchr7\t102474700\t102686400\tHigh Signal Region\nchr7\t142665100\t142668500\tHigh Signal Region\nchr7\t144180800\t144377300\tLow Mappability\nchr7\t145996400\t146018600\tHigh Signal Region\nchr7\t152375800\t152435100\tHigh Signal Region\nchr7\t158131400\t158156200\tHigh Signal Region\nchr7\t158594300\t158596200\tHigh Signal Region\nchr7\t158893100\t158918100\tHigh Signal Region\nchr7\t159334900\t159345900\tHigh Signal Region\nchr8\t7209800\t7914700\tHigh Signal Region\nchr8\t7940500\t8075700\tHigh Signal Region\nchr8\t8128200\t8204600\tHigh Signal Region\nchr8\t12136900\t12614300\tHigh Signal Region\nchr8\t43236700\t43262600\tHigh Signal Region\nchr8\t43937900\t45969600\tHigh Signal Region\nchr8\t46829400\t46832000\tHigh Signal Region\nchr8\t57204900\t57216100\tHigh Signal Region\nchr8\t59168700\t59170400\tHigh Signal Region\nchr8\t67584500\t67592700\tHigh Signal Region\nchr8\t69688400\t69691100\tHigh Signal Region\nchr8\t71406700\t71412400\tHigh Signal Region\nchr8\t75444100\t75448200\tHigh Signal Region\nchr8\t81841500\t81851900\tHigh Signal Region\nchr8\t85642100\t85829300\tHigh Signal Region\nchr8\t88685900\t88691700\tHigh Signal Region\nchr8\t96171200\t96173100\tHigh Signal Region\nchr8\t99494900\t99496800\tHigh Signal Region\nchr8\t105789200\t105793800\tHigh Signal Region\nchr8\t141491400\t141493500\tHigh Signal Region\nchr8\t141871100\t141875200\tHigh Signal Region\nchr8\t143641400\t143670500\tHigh Signal Region\nchr8\t144124800\t144137600\tHigh Signal Region\nchr9\t319900\t322400\tHigh Signal Region\nchr9\t33656600\t33660000\tHigh Signal Region\nchr9\t35912600\t35915300\tHigh Signal Region\nchr9\t38824200\t39089400\tHigh Signal Region\nchr9\t39846200\t40771100\tHigh Signal Region\nchr9\t40792500\t41323100\tHigh Signal Region\nchr9\t41492300\t41635600\tHigh Signal Region\nchr9\t41661300\t42119600\tLow Mappability\nchr9\t42364000\t42410600\tHigh Signal Region\nchr9\t42899400\t42901300\tHigh Signal Region\nchr9\t43263100\t61518900\tHigh Signal Region\nchr9\t61735300\t63548000\tHigh Signal Region\nchr9\t63761400\t64027300\tHigh Signal Region\nchr9\t64135000\t65390600\tHigh Signal Region\nchr9\t65579400\t66874600\tHigh Signal Region\nchr9\t66959000\t68398100\tHigh Signal Region\nchr9\t70037200\t70039600\tHigh Signal Region\nchr9\t76174300\t76176200\tHigh Signal Region\nchr9\t83222900\t83226900\tHigh Signal Region\nchr9\t85071600\t85075100\tHigh Signal Region\nchr9\t85164800\t85166100\tHigh Signal Region\nchr9\t108502000\t108506600\tHigh Signal Region\nchr9\t134164500\t134185500\tHigh Signal Region\nchr9\t137326800\t137330600\tHigh Signal Region\nchr9\t137715200\t137722200\tLow Mappability\nchr9\t137841200\t137846800\tLow Mappability\nchr9\t138222000\t138394700\tHigh Signal Region\nchrX\t0\t329300\tHigh Signal Region\nchrX\t362400\t388500\tHigh Signal Region\nchrX\t456500\t531800\tHigh Signal Region\nchrX\t723800\t739500\tHigh Signal Region\nchrX\t864500\t930400\tHigh Signal Region\nchrX\t1049100\t1054300\tHigh Signal Region\nchrX\t1085100\t1175500\tHigh Signal Region\nchrX\t1200600\t1209400\tHigh Signal Region\nchrX\t1249200\t1269000\tHigh Signal Region\nchrX\t1289500\t1298900\tHigh Signal Region\nchrX\t1365300\t1458700\tHigh Signal Region\nchrX\t1480900\t1492800\tHigh Signal Region\nchrX\t1816200\t1820600\tHigh Signal Region\nchrX\t2223900\t2521900\tHigh Signal Region\nchrX\t2580600\t2751300\tHigh Signal Region\nchrX\t3966700\t3968700\tHigh Signal Region\nchrX\t5481200\t5486100\tHigh Signal Region\nchrX\t6933400\t6938700\tHigh Signal Region\nchrX\t7587600\t7591800\tHigh Signal Region\nchrX\t9403600\t9415100\tHigh Signal Region\nchrX\t10785000\t10809700\tHigh Signal Region\nchrX\t10966600\t10976800\tHigh Signal Region\nchrX\t11218800\t11221100\tLow Mappability\nchrX\t11840900\t11848000\tHigh Signal Region\nchrX\t14085100\t14109500\tHigh Signal Region\nchrX\t14286500\t14289300\tHigh Signal Region\nchrX\t16361200\t16366000\tHigh Signal Region\nchrX\t16498100\t16503400\tHigh Signal Region\nchrX\t19940200\t19946300\tHigh Signal Region\nchrX\t21340600\t21345700\tHigh Signal Region\nchrX\t25773300\t25776000\tHigh Signal Region\nchrX\t26176400\t26181400\tHigh Signal Region\nchrX\t30767800\t30772600\tHigh Signal Region\nchrX\t31077600\t31082600\tHigh Signal Region\nchrX\t31511400\t31535800\tHigh Signal Region\nchrX\t34416800\t34425900\tHigh Signal Region\nchrX\t36465200\t36471200\tHigh Signal Region\nchrX\t37628400\t37633500\tHigh Signal Region\nchrX\t42872300\t42910700\tHigh Signal Region\nchrX\t49317500\t49623500\tHigh Signal Region\nchrX\t50019400\t50033700\tHigh Signal Region\nchrX\t50056700\t50066100\tHigh Signal Region\nchrX\t51202300\t51268100\tHigh Signal Region\nchrX\t51427500\t51432400\tHigh Signal Region\nchrX\t52175000\t52228100\tHigh Signal Region\nchrX\t52442800\t52538100\tHigh Signal Region\nchrX\t53761700\t53789500\tHigh Signal Region\nchrX\t55180400\t55184500\tHigh Signal Region\nchrX\t56754900\t56781100\tLow Mappability\nchrX\t57712300\t57719700\tHigh Signal Region\nchrX\t58467900\t62522800\tHigh Signal Region\nchrX\t63129600\t63290600\tLow Mappability\nchrX\t67311800\t67323800\tHigh Signal Region\nchrX\t67626800\t67632300\tHigh Signal Region\nchrX\t68217300\t68230200\tHigh Signal Region\nchrX\t70600000\t70603800\tHigh Signal Region\nchrX\t70640600\t70645000\tHigh Signal Region\nchrX\t70963600\t70964900\tHigh Signal Region\nchrX\t71978800\t71980500\tHigh Signal Region\nchrX\t72489400\t72490800\tHigh Signal Region\nchrX\t72743200\t73035800\tHigh Signal Region\nchrX\t73381000\t73387000\tHigh Signal Region\nchrX\t73887000\t73891300\tHigh Signal Region\nchrX\t74660000\t74718100\tHigh Signal Region\nchrX\t74789000\t74794000\tHigh Signal Region\nchrX\t74952200\t74995200\tHigh Signal Region\nchrX\t78802400\t78804500\tHigh Signal Region\nchrX\t79765500\t79789600\tHigh Signal Region\nchrX\t80534100\t80537000\tHigh Signal Region\nchrX\t82849700\t82859300\tLow Mappability\nchrX\t83752100\t83756900\tHigh Signal Region\nchrX\t86046600\t86076600\tHigh Signal Region\nchrX\t86395500\t86398100\tHigh Signal Region\nchrX\t86970000\t86975600\tHigh Signal Region\nchrX\t87220500\t87222100\tHigh Signal Region\nchrX\t89060200\t89062700\tHigh Signal Region\nchrX\t89202500\t89208400\tHigh Signal Region\nchrX\t91332900\t91336600\tHigh Signal Region\nchrX\t93618000\t93633400\tHigh Signal Region\nchrX\t94863600\t94868300\tHigh Signal Region\nchrX\t97509600\t97515000\tHigh Signal Region\nchrX\t100135800\t100141000\tHigh Signal Region\nchrX\t100257100\t100261600\tHigh Signal Region\nchrX\t101471700\t101474900\tHigh Signal Region\nchrX\t102188700\t102489200\tHigh Signal Region\nchrX\t103851800\t103897800\tHigh Signal Region\nchrX\t106755500\t106769400\tHigh Signal Region\nchrX\t106813900\t106830900\tHigh Signal Region\nchrX\t107515800\t107517200\tHigh Signal Region\nchrX\t109034800\t109069100\tHigh Signal Region\nchrX\t109114900\t109119400\tHigh Signal Region\nchrX\t109520800\t109525700\tHigh Signal Region\nchrX\t109985900\t109987300\tHigh Signal Region\nchrX\t110816700\t110833400\tHigh Signal Region\nchrX\t111416100\t111418000\tHigh Signal Region\nchrX\t113141700\t113143600\tHigh Signal Region\nchrX\t114701600\t114724300\tHigh Signal Region\nchrX\t115725600\t115889600\tHigh Signal Region\nchrX\t116557600\t116595600\tHigh Signal Region\nchrX\t117874100\t117880000\tHigh Signal Region\nchrX\t118009000\t118037800\tHigh Signal Region\nchrX\t118070900\t118072700\tHigh Signal Region\nchrX\t121263700\t121268100\tHigh Signal Region\nchrX\t121299200\t121300600\tHigh Signal Region\nchrX\t122528400\t122550000\tHigh Signal Region\nchrX\t124584300\t124588400\tHigh Signal Region\nchrX\t125927600\t125937100\tHigh Signal Region\nchrX\t126463700\t126474200\tHigh Signal Region\nchrX\t127116700\t127122600\tHigh Signal Region\nchrX\t127362200\t127368300\tHigh Signal Region\nchrX\t128785000\t128788700\tHigh Signal Region\nchrX\t129337600\t129357900\tHigh Signal Region\nchrX\t129388400\t129408400\tHigh Signal Region\nchrX\t130567700\t130572000\tHigh Signal Region\nchrX\t131152200\t131157400\tHigh Signal Region\nchrX\t131378300\t131383300\tHigh Signal Region\nchrX\t131664300\t131670000\tHigh Signal Region\nchrX\t132284600\t132320400\tHigh Signal Region\nchrX\t133108600\t133116500\tHigh Signal Region\nchrX\t135718600\t135888700\tHigh Signal Region\nchrX\t137074700\t137079100\tHigh Signal Region\nchrX\t137436600\t137439300\tHigh Signal Region\nchrX\t138300600\t138302200\tHigh Signal Region\nchrX\t139437600\t139446800\tHigh Signal Region\nchrX\t139621500\t139622800\tHigh Signal Region\nchrX\t140722400\t140726100\tHigh Signal Region\nchrX\t141000400\t141108300\tHigh Signal Region\nchrX\t142478000\t142483800\tHigh Signal Region\nchrX\t142892300\t142911600\tHigh Signal Region\nchrX\t143352000\t143356500\tHigh Signal Region\nchrX\t144404500\t144475900\tLow Mappability\nchrX\t147281700\t147287100\tHigh Signal Region\nchrX\t147653800\t147659900\tHigh Signal Region\nchrX\t148123500\t148129000\tHigh Signal Region\nchrX\t148347100\t148378700\tHigh Signal Region\nchrX\t149437900\t149441900\tHigh Signal Region\nchrX\t150024800\t150026200\tHigh Signal Region\nchrX\t152173800\t152175100\tHigh Signal Region\nchrX\t153251200\t153316400\tHigh Signal Region\nchrX\t154870000\t154890200\tHigh Signal Region\nchrX\t154938900\t154945100\tHigh Signal Region\nchrX\t155299600\t155305100\tHigh Signal Region\nchrX\t155454000\t155522000\tHigh Signal Region\nchrX\t155700400\t155727500\tHigh Signal Region\nchrX\t155983500\t156040800\tHigh Signal Region\nchrY\t4343800\t4345800\tHigh Signal Region\nchrY\t10246200\t11041200\tHigh Signal Region\nchrY\t11072100\t11335300\tHigh Signal Region\nchrY\t11486600\t11757800\tHigh Signal Region\nchrY\t26637300\t57227400\tHigh Signal Region\n"
  },
  {
    "path": "tracks/hg38.high_runtime.bed",
    "content": "chr13\t16660000\t16685001\t200.31\nchr13\t16807000\t16832001\t201.53\nchr17\t24304000\t24329001\t201.567\nchr13\t17125500\t17150501\t201.762\nchr7\t62303500\t62328501\t201.929\nchr17\t25235000\t25260001\t203.82\nchr18\t2940000\t2965001\t203.9\nchr1\t44565500\t44590501\t203.916\nchr3\t174807500\t174832501\t204.578\nchr12\t0\t25001\t204.931\nchr5\t49686000\t49711001\t204.978\nchr10\t39984000\t40009001\t205.314\nchr16\t14479500\t14504501\t205.502\nchr22\t12348000\t12373001\t206.143\nchr19\t24402000\t24427001\t206.715\nchr17\t26092500\t26117501\t206.936\nchr16\t46403000\t46428001\t207.242\nchr16\t34202000\t34227001\t207.518\nchr17\t25431000\t25456001\t207.796\nchr13\t16635500\t16660501\t209.095\nchr3\t91140000\t91165001\t209.463\nchr20\t30821000\t30846001\t210.483\nchr16\t34692000\t34717001\t210.521\nchr3\t90380500\t90405501\t210.567\nchr16\t34177500\t34202501\t210.946\nchr10\t21486500\t21511501\t211.286\nchr13\t17395000\t17420001\t214.498\nchr3\t91507500\t91532501\t214.602\nchr16\t35966000\t35991001\t214.865\nchr7\t57942500\t57967501\t215.161\nchr13\t17223500\t17248501\t216.611\nchr13\t16586500\t16611501\t216.675\nchrX\t62622000\t62647001\t219.136\nchr13\t16464000\t16489001\t219.855\nchr13\t17076500\t17101501\t220.742\nchr20\t28934500\t28959501\t221.317\nchr13\t17297000\t17322001\t221.517\nchr9\t64949500\t64974501\t221.872\nchr13\t17052000\t17077001\t222.058\nchr19\t48020000\t48045001\t223.192\nchr13\t17101000\t17126001\t223.703\nchrX\t111181000\t111206001\t223.762\nchr8\t43904000\t43929001\t224.069\nchr17\t25088000\t25113001\t224.519\nchr21\t37534000\t37559001\t224.775\nchr17\t23324000\t23349001\t225.98\nchr17\t25847500\t25872501\t226.549\nchr19\t24377500\t24402501\t226.678\nchr19\t41037500\t41062501\t226.944\nchr9\t40841500\t40866501\t227.104\nchr1\t123896500\t123921501\t227.236\nchr13\t17346000\t17371001\t228.012\nchr12\t37264500\t37289501\t228.042\nchr11\t48926500\t48951501\t228.062\nchr8\t141757000\t141782001\t228.354\nchr2\t94521000\t94546001\t230.376\nchr15\t19820500\t19845501\t231.707\nchr20\t30943500\t30968501\t231.795\nchr12\t37583000\t37608001\t232.21\nchr5\t46378500\t46403501\t232.363\nchr8\t63112000\t63137001\t232.69\nchr16\t36333500\t36358501\t233.1\nchr5\t49612500\t49637501\t233.398\nchr17\t23030000\t23055001\t235.789\nchr17\t26705000\t26730001\t236.673\nchr20\t45300500\t45325501\t237.331\nchr7\t62548500\t62573501\t237.92\nchr13\t17174500\t17199501\t238.275\nchr17\t24059000\t24084001\t238.855\nchr13\t17027500\t17052501\t239.493\nchr10\t40596500\t40621501\t240.047\nchr8\t20359500\t20384501\t241.755\nchr11\t133402500\t133427501\t241.807\nchr22\t30110500\t30135501\t241.826\nchr17\t22736000\t22761001\t243.31\nchr21\t5267500\t5292501\t244.005\nchrX\t1274000\t1299001\t245.393\nchr5\t50176000\t50201001\t246.429\nchr3\t90968500\t90993501\t246.493\nchr17\t25970000\t25995001\t246.697\nchr16\t34888000\t34913001\t246.932\nchr9\t60515000\t60540001\t248.008\nchr15\t18963000\t18988001\t248.104\nchr3\t71393000\t71418001\t248.789\nchr17\t23128000\t23153001\t249.727\nchr4\t136734500\t136759501\t249.946\nchr9\t129409000\t129434001\t250.297\nchr7\t69212500\t69237501\t251.108\nchr10\t98686000\t98711001\t251.677\nchr17\t24769500\t24794501\t253.302\nchr13\t16831500\t16856501\t254.866\nchrX\t62548500\t62573501\t254.876\nchr22\t35623000\t35648001\t255.42\nchr3\t91091000\t91116001\t255.86\nchr10\t40376000\t40401001\t255.977\nchr11\t36260000\t36285001\t256.304\nchr1\t124778500\t124803501\t258.491\nchr3\t93761500\t93786501\t260.847\nchr13\t20947500\t20972501\t260.865\nchr2\t94545500\t94570501\t261.352\nchr11\t37411500\t37436501\t262.848\nchr15\t19771500\t19796501\t263.259\nchr14\t93467500\t93492501\t264.017\nchrX\t62646500\t62671501\t264.527\nchr7\t29498000\t29523001\t265.054\nchr13\t17321500\t17346501\t265.43\nchr22\t12519500\t12544501\t265.502\nchr8\t45986500\t46011501\t266.334\nchr10\t42091000\t42116001\t266.418\nchr7\t13524000\t13549001\t266.577\nchr7\t58016000\t58041001\t266.774\nchrX\t6296500\t6321501\t266.966\nchr7\t61054000\t61079001\t267.185\nchr2\t87416000\t87441001\t267.503\nchr5\t46305000\t46330001\t268.071\nchr17\t25676000\t25701001\t268.485\nchr5\t50200500\t50225501\t268.525\nchr3\t164174500\t164199501\t269.743\nchr17\t25651500\t25676501\t273.071\nchr14\t71393000\t71418001\t273.418\nchr12\t19943000\t19968001\t273.8\nchr16\t35990500\t36015501\t274.607\nchr3\t91066500\t91091501\t279.274\nchr3\t164199000\t164224001\t279.682\nchr14\t29032500\t29057501\t279.882\nchr10\t39469500\t39494501\t279.934\nchr6\t61397000\t61422001\t279.949\nchr5\t50225000\t50250001\t280.28\nchr7\t117918500\t117943501\t280.661\nchr17\t25480000\t25505001\t281.583\nchr11\t48902000\t48927001\t282.222\nchr7\t57967000\t57992001\t283.033\nchr4\t74700500\t74725501\t283.796\nchr4\t136759000\t136784001\t284.07\nchr2\t89768000\t89793001\t284.453\nchr14\t93443000\t93468001\t285.54\nchr17\t25578000\t25603001\t287.048\nchr10\t40278000\t40303001\t288.179\nchr3\t90454000\t90479001\t288.855\nchr3\t90429500\t90454501\t289.34\nchr9\t40523000\t40548001\t289.548\nchr1\t242599000\t242624001\t290.312\nchr19\t24892000\t24917001\t296.548\nchr16\t36039500\t36064501\t297.066\nchr7\t151140500\t151165501\t297.899\nchr7\t38587500\t38612501\t298.055\nchr6\t134211000\t134236001\t298.086\nchr22\t16047500\t16072501\t298.991\nchr17\t24794000\t24819001\t301.577\nchr3\t91189000\t91214001\t301.757\nchr20\t30968000\t30993001\t301.781\nchr8\t137984000\t138009001\t301.868\nchr12\t37607500\t37632501\t302.578\nchrX\t62573000\t62598001\t302.737\nchr15\t17027500\t17052501\t303.545\nchr7\t61029500\t61054501\t304.059\nchrX\t58506000\t58531001\t304.24\nchr17\t24328500\t24353501\t305.166\nchr3\t99935500\t99960501\t306.639\nchr19\t27244000\t27269001\t306.656\nchr12\t44516500\t44541501\t308.333\nchr17\t24573500\t24598501\t309.115\nchr16\t6811000\t6836001\t310.179\nchr7\t62524000\t62549001\t310.584\nchr1\t123651500\t123676501\t310.677\nchr3\t90895000\t90920001\t311.556\nchr5\t46329500\t46354501\t311.939\nchr17\t26068000\t26093001\t312.042\nchr4\t148127000\t148152001\t313.351\nchr16\t36015000\t36040001\t313.439\nchr20\t28861000\t28886001\t313.486\nchr1\t60441500\t60466501\t314.444\nchr11\t48853000\t48878001\t314.983\nchr19\t27366500\t27391501\t316.626\nchr3\t138645500\t138670501\t317.366\nchr22\t16023000\t16048001\t318.266\nchr19\t55933500\t55958501\t321.472\nchr17\t23961000\t23986001\t321.797\nchr19\t27317500\t27342501\t322.544\nchrX\t62597500\t62622501\t322.871\nchr17\t25284000\t25309001\t324.135\nchr1\t125023500\t125048501\t324.204\nchr2\t1568000\t1593001\t324.249\nchr21\t5292000\t5317001\t325.173\nchr3\t93737000\t93762001\t325.465\nchr1\t123455500\t123480501\t327.116\nchr12\t37681000\t37706001\t328.439\nchr19\t39788000\t39813001\t330.563\nchr17\t25014500\t25039501\t331.211\nchr17\t48510000\t48535001\t331.514\nchr20\t2793000\t2818001\t333.462\nchr1\t125146000\t125171001\t338.905\nchr19\t27268500\t27293501\t339.482\nchr20\t30135000\t30160001\t339.511\nchr1\t124068000\t124093001\t341.457\nchr15\t83937000\t83962001\t344.74\nchr19\t35353500\t35378501\t345.557\nchr6\t4532500\t4557501\t345.974\nchr1\t121740500\t121765501\t346.376\nchr20\t29890000\t29915001\t346.749\nchr17\t23275000\t23300001\t346.882\nchr11\t50739500\t50764501\t348.598\nchr19\t7080500\t7105501\t349.683\nchr12\t37632000\t37657001\t350.202\nchr7\t57893500\t57918501\t351.03\nchr8\t45962000\t45987001\t351.113\nchr20\t26337500\t26362501\t352.135\nchr17\t26680500\t26705501\t353.691\nchr16\t68208000\t68233001\t354.501\nchr3\t90405000\t90430001\t359.17\nchr17\t25406500\t25431501\t360.321\nchr17\t26558000\t26583001\t361.779\nchr3\t91017500\t91042501\t362.511\nchr3\t90846000\t90871001\t366.113\nchr14\t58775500\t58800501\t366.88\nchr10\t39445000\t39470001\t370.361\nchr4\t53483500\t53508501\t372.44\nchr7\t153909000\t153934001\t372.703\nchr17\t23593500\t23618501\t379.342\nchr17\t25872000\t25897001\t380.73\nchr3\t6100500\t6125501\t381.269\nchr17\t23397500\t23422501\t382.927\nchr17\t23152500\t23177501\t383.837\nchr20\t29694000\t29719001\t388.212\nchr17\t26117000\t26142001\t391.745\nchr21\t10755500\t10780501\t391.925\nchr1\t123186000\t123211001\t392.881\nchr15\t19796000\t19821001\t398.054\nchr10\t39420500\t39445501\t407.36\nchr12\t128943500\t128968501\t408.665\nchr17\t23863000\t23888001\t412.522\nchr22\t12372500\t12397501\t414.248\nchr17\t25994500\t26019501\t414.398\nchr5\t46354000\t46379001\t417.498\nchr12\t37705500\t37730501\t421.705\nchr11\t50764000\t50789001\t426.272\nchr17\t24524500\t24549501\t426.316\nchr3\t90919500\t90944501\t426.88\nchr12\t34692000\t34717001\t427.559\nchr3\t91164500\t91189501\t428.718\nchr3\t90821500\t90846501\t437.099\nchr17\t23422000\t23447001\t439.72\nchr17\t24353000\t24378001\t442.273\nchr17\t23814000\t23839001\t443.762\nchr6\t109760000\t109785001\t449.68\nchr3\t90797000\t90822001\t450.559\nchr17\t23226000\t23251001\t454.185\nchr17\t25455500\t25480501\t454.479\nchr2\t89792500\t89817501\t455.229\nchr19\t27293000\t27318001\t457.811\nchr6\t61372500\t61397501\t458.538\nchr7\t57991500\t58016501\t458.619\nchrX\t32291000\t32316001\t459.006\nchr3\t93712500\t93737501\t464.049\nchr17\t26435500\t26460501\t470.504\nchr9\t43169000\t43194001\t471.608\nchr1\t122769500\t122794501\t472.473\nchr7\t57918000\t57943001\t477.493\nchr17\t26215000\t26240001\t478.255\nchr10\t39518500\t39543501\t478.275\nchr1\t122990000\t123015001\t482.532\nchr3\t91238000\t91263001\t484.823\nchr10\t39494000\t39519001\t484.901\nchr1\t123627000\t123652001\t485.318\nchr17\t23201500\t23226501\t495.189\nchr9\t43193500\t43218501\t498.249\nchr12\t52332000\t52357001\t508.451\nchr17\t23054500\t23079501\t511.199\nchr3\t90772500\t90797501\t514.17\nchr17\t26043500\t26068501\t514.786\nchr1\t123333000\t123358001\t515.578\nchr12\t34667500\t34692501\t515.955\nchr17\t25137000\t25162001\t519.668\nchr17\t24279500\t24304501\t520.46\nchr11\t50788500\t50813501\t522.116\nchr17\t26190500\t26215501\t523.419\nchr17\t26509000\t26534001\t524.167\nchr1\t123039000\t123064001\t526.052\nchr7\t7962500\t7987501\t526.69\nchr5\t55786500\t55811501\t534.781\nchr17\t22760500\t22785501\t539.536\nchr3\t90870500\t90895501\t543.466\nchr17\t25823000\t25848001\t544.589\nchr17\t24671500\t24696501\t546.987\nchr17\t24181500\t24206501\t558.639\nchr13\t61862500\t61887501\t559.708\nchr17\t23985500\t24010501\t559.938\nchr13\t56791000\t56816001\t561.631\nchr10\t65096500\t65121501\t565.917\nchr17\t25945500\t25970501\t567.872\nchr7\t3258500\t3283501\t570.751\nchr6\t30429000\t30454001\t572.075\nchr4\t112479500\t112504501\t578.068\nchr15\t65954000\t65979001\t580.993\nchr17\t24034500\t24059501\t581.008\nchr19\t54659500\t54684501\t588.398\nchr1\t124460000\t124485001\t589.356\nchr1\t124337500\t124362501\t595.291\nchr17\t24108000\t24133001\t598.498\nchr1\t122720500\t122745501\t606.913\nchr17\t26337500\t26362501\t609.154\nchr7\t157535000\t157560001\t621.593\nchr17\t23103500\t23128501\t622.043\nchr1\t16660000\t16685001\t629.674\nchr17\t25039000\t25064001\t630.891\nchr1\t123308500\t123333501\t632.928\nchr1\t123259500\t123284501\t641.023\nchr1\t123063500\t123088501\t642.245\nchr7\t62499500\t62524501\t643.386\nchr17\t23936500\t23961501\t644.727\nchr17\t23177000\t23202001\t645.466\nchr17\t23740500\t23765501\t660.114\nchr1\t123357500\t123382501\t666.049\nchr3\t91532000\t91557001\t668.738\nchr17\t26533500\t26558501\t670.338\nchr17\t26141500\t26166501\t672.135\nchr1\t122941000\t122966001\t678.844\nchr17\t23765000\t23790001\t680.082\nchr10\t39543000\t39568001\t682.513\nchr17\t24230500\t24255501\t695.284\nchr1\t123235000\t123260001\t703.32\nchr1\t123578000\t123603001\t703.85\nchr17\t26166000\t26191001\t715.287\nchr1\t124239500\t124264501\t726.574\nchr17\t26460000\t26485001\t732.662\nchr17\t25774000\t25799001\t748.934\nchr20\t29841000\t29866001\t763.551\nchr9\t110421500\t110446501\t768.529\nchr1\t123284000\t123309001\t769.27\nchr17\t25627000\t25652001\t801.529\nchr17\t26386500\t26411501\t802.085\nchr17\t24083500\t24108501\t803.179\nchr3\t52944500\t52969501\t806.148\nchr17\t26631500\t26656501\t807.831\nchr17\t23250500\t23275501\t817.027\nchr1\t122573500\t122598501\t835.932\nchr3\t90993000\t91018001\t865.716\nchr1\t123872000\t123897001\t870.956\nchr1\t122696000\t122721001\t872.648\nchr17\t24255000\t24280001\t879.328\nchr13\t26558000\t26583001\t898.345\nchr1\t123823000\t123848001\t903.328\nchr3\t90478500\t90503501\t910.833\nchr17\t25259500\t25284501\t923.172\nchr1\t123921000\t123946001\t923.626\nchr17\t23667000\t23692001\t927.039\nchr1\t122745000\t122770001\t931.06\nchr2\t32928000\t32953001\t935.33\nchr3\t90944000\t90969001\t964.885\nchr1\t123480000\t123505001\t980.457\nchr17\t24818500\t24843501\t987.73\nchr17\t25529000\t25554001\t995.266\nchr17\t26239500\t26264501\t999.115\nchr17\t23373000\t23398001\t1004.48\nchr17\t23789500\t23814501\t1010.05\nchr17\t26288500\t26313501\t1067.03\nchr17\t24132500\t24157501\t1086.69\nchr10\t41821500\t41846501\t1101.6\nchr1\t122598000\t122623001\t1114.25\nchr17\t25921000\t25946001\t1120.98\nchr1\t122965500\t122990501\t1189.6\nchr17\t25798500\t25823501\t1266.34\nchr1\t123602500\t123627501\t1280.69\nchr17\t26019000\t26044001\t1289.26\nchr3\t153884500\t153909501\t1298.94\nchr7\t4410000\t4435001\t1382.17\nchr17\t24377500\t24402501\t1383.77\nchr17\t26264000\t26289001\t1446.1\nchr12\t66057578\t66057693\nchr10\t12774633\t12776503\nchr2\t231841130\t231844516\nchr11\t71065440\t71066328\nchr13\t16170001\t16195001\nchrY\t12372051\t12372250\nchr3\t40203820\t40204166\nchr4\t5315982\t\t5317621\nchrX\t29356345\t29356480\nchr17\t66798345\t66799800\nchr14\t99420871\t99421057\nchrY\t20054000\t20350000\nchr2\t231822656\t231849781\nchr13\t112283501\t112308501\nchr7\t107770167\t107770305\nchr19\t34196708\t34196809\nchr18\t79200605\t79200885\nchr4\t5316133\t\t5317662\nchr21\t46292368\t46294980\nchr17\t198345\t\t198635\nchr17\t201442\t\t201916\nchr7\t158360007\t158361373\nchr5\t181088730\t181091752\nchr12\t131626424\t131627943\nchr12\t132134582\t132136546\nchr12\t129855139\t129859249\nchr12\t132148859\t132150810\nchr4\t186957707\t186975063\nchr10\t1234835\t\t1240738\nchr7\t156154000\t156156042\nchr17\t253178\t\t258774\nchr7\t159202609\t159203816\nchr6\t6261565\t\t6262270\nchr7\t158319001\t158344001\nchr17\t198259\t\t198748\nchr21\t9800001\t\t9825001\nchr13\t19137402\t19138405\nchr20\t48503485\t48517235\nchr1\t228609501\t228634501\nchr17\t940715\t\t943201\nchr2\t134606947\t134609908\nchr16\t21829501\t21854501\nchr20\t64173482\t64176583\nchr16\t846582\t\t847249\nchr16\t857416\t\t860062\nchr20\t64173406\t64176518\nchr14\t106752045\t106753688\nchr2\t1342157\t\t1346404\nchr5\t897094\t\t900022\nchr2\t240976089\t240981263\nchr20\t48503544\t48516784\nchr11\t1429393\t\t1433293\nchr6\t519038\t\t521502\nchr1\t2121226\t\t2124501\nchr6\t168592129\t168595461\nchr6\t168571688\t168573551\nchr6\t168560449\t168562450\nchr6\t168592071\t168595531\nchr15\t23040256\t23050545\nchr16\t960212\t\t962387\nchr4\t1397195\t\t1398698\nchr1\t2651908\t\t2778079\nchr1\t4077191\t\t4078805\nchr1\t1382158\t\t1382843\nchr1\t7114675\t\t7115557\nchr1\t1248679\t\t1249662\nchr1\t46240247\t46242976\nchr1\t2280688\t\t2282526\nchr1\t3475094\t\t3475793\nchr1\t53713139\t53713413\nchr1\t819786\t\t823964\nchr1\t29723204\t29724020\nchr1\t1288154\t\t1290208\nchr1\t1075830\t\t1079411\n"
  },
  {
    "path": "tracks/hg38.manual.blacklist.bed",
    "content": "chr10\t0\t45700\tLow Mappability\nchr10\t38481300\t38596500\tHigh Signal Region\nchr10\t38782600\t38967900\tHigh Signal Region\nchr10\t39901300\t41712900\tHigh Signal Region\nchr10\t41838900\t42107300\tHigh Signal Region\nchr10\t42279400\t42322500\tHigh Signal Region\nchr10\t126946300\t126953400\tLow Mappability\nchr10\t133625800\t133797400\tHigh Signal Region\nchr11\t0\t194500\tLow Mappability\nchr11\t518900\t520700\tLow Mappability\nchr11\t584400\t586500\tHigh Signal Region\nchr11\t964100\t966000\tLow Mappability\nchr11\t1015700\t1019300\tHigh Signal Region\nchr11\t1091000\t1098200\tLow Mappability\nchr11\t3652800\t3655600\tHigh Signal Region\nchr11\t10506900\t10511100\tHigh Signal Region\nchr11\t28206300\t28236700\tHigh Signal Region\nchr11\t50813600\t54383000\tHigh Signal Region\nchr11\t61084500\t61130400\tHigh Signal Region\nchr11\t70370400\t70372400\tHigh Signal Region\nchr11\t73509800\t73511700\tHigh Signal Region\nchr11\t77885600\t77887600\tHigh Signal Region\nchr11\t93417500\t93427700\tHigh Signal Region\nchr11\t94232700\t94240400\tHigh Signal Region\nchr11\t103408700\t103410600\tHigh Signal Region\nchr11\t121175000\t121187000\tHigh Signal Region\nchr11\t131679500\t131681500\tHigh Signal Region\nchr11\t135075600\t135086600\tHigh Signal Region\nchr12\t0\t77800\tHigh Signal Region\nchr12\t371800\t422400\tHigh Signal Region\nchr12\t2254900\t2257000\tHigh Signal Region\nchr12\t2519800\t2540500\tLow Mappability\nchr12\t5928900\t5933000\tLow Mappability\nchr12\t20550500\t20552400\tLow Mappability\nchr12\t20768400\t20770300\tHigh Signal Region\nchr12\t29790400\t29834600\tHigh Signal Region\nchr12\t34715400\t37269100\tHigh Signal Region\nchr12\t41362700\t41364600\tHigh Signal Region\nchr12\t61471100\t61473000\tHigh Signal Region\nchr12\t66473900\t66475800\tHigh Signal Region\nchr12\t101147000\t101155000\tHigh Signal Region\nchr12\t113079600\t113081500\tHigh Signal Region\nchr12\t124430500\t124440300\tHigh Signal Region\nchr12\t124905900\t124941800\tHigh Signal Region\nchr12\t130386400\t130394100\tHigh Signal Region\nchr12\t131475300\t131478600\tHigh Signal Region\nchr12\t131576000\t131589700\tHigh Signal Region\nchr12\t132223300\t132243400\tHigh Signal Region\nchr12\t132455100\t132465200\tHigh Signal Region\nchr12\t133249000\t133275300\tHigh Signal Region\nchr13\t16087600\t16165300\tHigh Signal Region\nchr13\t16226300\t18171400\tHigh Signal Region\nchr13\t18211000\t18216100\tHigh Signal Region\nchr13\t57140500\t57172500\tHigh Signal Region\nchr13\t109423200\t109425200\tHigh Signal Region\nchr13\t114353300\t114364300\tLow Mappability\nchr14\t0\t18670900\tHigh Signal Region\nchr14\t18695400\t19724300\tHigh Signal Region\nchr14\t23033300\t23098600\tHigh Signal Region\nchr14\t26629300\t26634900\tHigh Signal Region\nchr14\t31793800\t31798100\tHigh Signal Region\nchr14\t32483400\t32486000\tHigh Signal Region\nchr14\t34537100\t34562600\tHigh Signal Region\nchr14\t35947200\t35950000\tHigh Signal Region\nchr14\t37351000\t37356700\tHigh Signal Region\nchr14\t44025100\t44027200\tHigh Signal Region\nchr14\t44705100\t44709900\tHigh Signal Region\nchr14\t45477100\t45482500\tHigh Signal Region\nchr14\t46865300\t46866500\tHigh Signal Region\nchr14\t54235600\t54240000\tHigh Signal Region\nchr14\t57112100\t57118100\tHigh Signal Region\nchr14\t74711700\t74729000\tHigh Signal Region\nchr14\t86074000\t86076000\tHigh Signal Region\nchr14\t86593300\t86595200\tHigh Signal Region\nchr14\t88443700\t88458100\tHigh Signal Region\nchr14\t100525900\t100527800\tHigh Signal Region\nchr14\t101267600\t101272200\tHigh Signal Region\nchr14\t101674400\t101676400\tHigh Signal Region\nchr14\t104288100\t104290200\tHigh Signal Region\nchr14\t105215000\t105240900\tHigh Signal Region\nchr14\t105568500\t105583900\tHigh Signal Region\nchr14\t105616500\t105618600\tHigh Signal Region\nchr14\t106326900\t106367700\tHigh Signal Region\nchr15\t0\t17035000\tHigh Signal Region\nchr15\t17058500\t19790100\tHigh Signal Region\nchr15\t20005600\t22606300\tHigh Signal Region\nchr15\t23125400\t23357400\tHigh Signal Region\nchr15\t25757700\t25759100\tLow Mappability\nchr15\t28304900\t28683400\tHigh Signal Region\nchr15\t30066300\t30627500\tHigh Signal Region\nchr15\t30844100\t30859900\tHigh Signal Region\nchr15\t32153700\t32626200\tHigh Signal Region\nchr15\t54925700\t54932200\tHigh Signal Region\nchr15\t56311200\t56314600\tHigh Signal Region\nchr15\t72635200\t72687100\tHigh Signal Region\nchr15\t74068100\t74102000\tHigh Signal Region\nchr15\t75254100\t75299800\tHigh Signal Region\nchr15\t77698600\t77700600\tHigh Signal Region\nchr15\t82321000\t82374600\tHigh Signal Region\nchr15\t82421200\t82541700\tHigh Signal Region\nchr15\t84405300\t84524700\tHigh Signal Region\nchr15\t101752300\t101764800\tLow Mappability\nchr15\t101892700\t101991100\tHigh Signal Region\nchr16\t29430800\t29566900\tLow Mappability\nchr16\t34061400\t34121400\tHigh Signal Region\nchr16\t34272000\t34633100\tHigh Signal Region\nchr16\t34657200\t34672500\tHigh Signal Region\nchr16\t34694600\t34772000\tHigh Signal Region\nchr16\t34832600\t34922100\tHigh Signal Region\nchr16\t34945600\t35072500\tLow Mappability\nchr16\t36166300\t36202400\tHigh Signal Region\nchr16\t36225200\t46423000\tHigh Signal Region\nchr16\t46449700\t46467000\tHigh Signal Region\nchr16\t90100500\t90338300\tLow Mappability\nchr17\t0\t137600\tHigh Signal Region\nchr17\t294900\t317900\tHigh Signal Region\nchr17\t448200\t510900\tHigh Signal Region\nchr17\t1061500\t1066100\tHigh Signal Region\nchr17\t1307700\t1312000\tLow Mappability\nchr17\t19025700\t19237400\tHigh Signal Region\nchr17\t21783300\t22054000\tHigh Signal Region\nchr17\t22520400\t22527300\tHigh Signal Region\nchr17\t22745200\t26629800\tHigh Signal Region\nchr17\t26766800\t26987200\tHigh Signal Region\nchr17\t43227600\t43324300\tHigh Signal Region\nchr17\t45511500\t45641300\tLow Mappability\nchr17\t53104900\t53107300\tHigh Signal Region\nchr18\t0\t64600\tHigh Signal Region\nchr18\t105200\t113200\tHigh Signal Region\nchr18\t971000\t976500\tHigh Signal Region\nchr18\t2841300\t2861500\tHigh Signal Region\nchr18\t15367200\t20940300\tHigh Signal Region\nchr18\t46961600\t47031700\tHigh Signal Region\nchr18\t47852300\t47854300\tLow Mappability\nchr18\t52791800\t52793800\tHigh Signal Region\nchr18\t74615900\t74618100\tHigh Signal Region\nchr18\t76966200\t76968500\tHigh Signal Region\nchr18\t78436900\t78438700\tLow Mappability\nchr18\t79013800\t79040300\tHigh Signal Region\nchr18\t79617800\t79621500\tHigh Signal Region\nchr18\t80257400\t80373200\tHigh Signal Region\nchr19\t0\t271200\tHigh Signal Region\nchr19\t7019100\t7061300\tHigh Signal Region\nchr19\t7449400\t7452000\tHigh Signal Region\nchr19\t8740100\t8800500\tHigh Signal Region\nchr19\t24330100\t27274500\tHigh Signal Region\nchr19\t27337600\t27427400\tHigh Signal Region\nchr19\t34386800\t34393500\tHigh Signal Region\nchr19\t34860600\t34866200\tHigh Signal Region\nchr19\t36267900\t36313700\tHigh Signal Region\nchr19\t37264900\t37304300\tHigh Signal Region\nchr19\t44393300\t44416700\tHigh Signal Region\nchr19\t47903000\t47959700\tHigh Signal Region\nchr19\t50090500\t50140400\tHigh Signal Region\nchr19\t58538700\t58617600\tHigh Signal Region\nchr1\t0\t792500\tHigh Signal Region\nchr1\t91386300\t91388400\tLow Mappability\nchr1\t103594400\t103760600\tHigh Signal Region\nchr1\t121605200\t124938900\tHigh Signal Region\nchr1\t125067600\t125086000\tHigh Signal Region\nchr1\t125130200\t143562200\tHigh Signal Region\nchr1\t161423100\t161472400\tHigh Signal Region\nchr1\t168348600\t168349900\tHigh Signal Region\nchr1\t224010800\t224017000\tHigh Signal Region\nchr1\t236713000\t236715600\tLow Mappability\nchr1\t248932700\t248956400\tHigh Signal Region\nchr20\t0\t67900\tHigh Signal Region\nchr20\t26364200\t28916900\tHigh Signal Region\nchr20\t28939400\t29264700\tHigh Signal Region\nchr20\t30995400\t31246000\tHigh Signal Region\nchr20\t47893800\t47900200\tHigh Signal Region\nchr21\t0\t8679600\tHigh Signal Region\nchr21\t9159900\t9735300\tHigh Signal Region\nchr21\t10013900\t10069600\tHigh Signal Region\nchr21\t10094700\t10505100\tHigh Signal Region\nchr21\t10650900\t12965800\tHigh Signal Region\nchr21\t43212400\t43280900\tHigh Signal Region\nchr21\t46682700\t46709900\tHigh Signal Region\nchr22\t10687700\t11428100\tHigh Signal Region\nchr22\t11496900\t11873100\tHigh Signal Region\nchr22\t11976900\t15154400\tHigh Signal Region\nchr22\t16258000\t16385800\tHigh Signal Region\nchr22\t18175900\t18947300\tHigh Signal Region\nchr22\t20337400\t20343300\tHigh Signal Region\nchr22\t21113500\t21554000\tHigh Signal Region\nchr22\t49972700\t49975300\tHigh Signal Region\nchr22\t50642800\t50644900\tHigh Signal Region\nchr22\t50786600\t50818400\tHigh Signal Region\nchr2\t1221700\t1223900\tHigh Signal Region\nchr2\t1594700\t1605200\tHigh Signal Region\nchr2\t3179600\t3182100\tHigh Signal Region\nchr2\t4643800\t4648800\tHigh Signal Region\nchr2\t10952800\t10955000\tHigh Signal Region\nchr2\t13718700\t13737700\tHigh Signal Region\nchr2\t21903500\t21906400\tHigh Signal Region\nchr2\t32865900\t32869900\tHigh Signal Region\nchr2\t32915300\t32918400\tHigh Signal Region\nchr2\t33766500\t33768400\tHigh Signal Region\nchr2\t36183000\t36184500\tHigh Signal Region\nchr2\t49228700\t49230700\tHigh Signal Region\nchr2\t64359300\t64377000\tHigh Signal Region\nchr2\t86655300\t86661100\tHigh Signal Region\nchr2\t86900700\t87078100\tLow Mappability\nchr2\t87119300\t87189800\tLow Mappability\nchr2\t87217000\t87866200\tHigh Signal Region\nchr2\t88771000\t88806500\tHigh Signal Region\nchr2\t89235300\t89947100\tHigh Signal Region\nchr2\t90246300\t91735500\tHigh Signal Region\nchr2\t91783000\t91924800\tLow Mappability\nchr2\t91969000\t94569500\tHigh Signal Region\nchr2\t95849400\t96067900\tHigh Signal Region\nchr2\t97106300\t97615800\tHigh Signal Region\nchr2\t109198400\t109200700\tHigh Signal Region\nchr2\t109744600\t110095200\tHigh Signal Region\nchr2\t110229200\t110633400\tLow Mappability\nchr2\t111253600\t111500500\tLow Mappability\nchr2\t112346200\t112441300\tLow Mappability\nchr2\t113370100\t113662700\tHigh Signal Region\nchr2\t130496800\t130716400\tHigh Signal Region\nchr2\t132201000\t132288900\tHigh Signal Region\nchr2\t132353600\t132364500\tHigh Signal Region\nchr2\t148880800\t148882800\tHigh Signal Region\nchr2\t161277700\t161283400\tHigh Signal Region\nchr2\t181274800\t181276800\tHigh Signal Region\nchr2\t226108500\t226110400\tHigh Signal Region\nchr2\t234889800\t234894400\tHigh Signal Region\nchr2\t239642200\t239645600\tHigh Signal Region\nchr2\t240308100\t240310300\tHigh Signal Region\nchr2\t241589300\t241591800\tHigh Signal Region\nchr2\t242005900\t242011100\tHigh Signal Region\nchr2\t242110100\t242193500\tHigh Signal Region\nchr3\t0\t11600\tHigh Signal Region\nchr3\t3895200\t3896700\tHigh Signal Region\nchr3\t4916700\t4922500\tHigh Signal Region\nchr3\t14091000\t14092500\tHigh Signal Region\nchr3\t15187200\t15207800\tHigh Signal Region\nchr3\t15592100\t15603300\tHigh Signal Region\nchr3\t16176800\t16179200\tHigh Signal Region\nchr3\t16679700\t16682500\tHigh Signal Region\nchr3\t19499700\t19504000\tHigh Signal Region\nchr3\t19624000\t19627100\tHigh Signal Region\nchr3\t21983200\t21988100\tHigh Signal Region\nchr3\t24053500\t24054900\tHigh Signal Region\nchr3\t26384800\t26404100\tHigh Signal Region\nchr3\t29993900\t29999900\tHigh Signal Region\nchr3\t36987500\t36995000\tHigh Signal Region\nchr3\t38083400\t38085400\tHigh Signal Region\nchr3\t38406100\t38430900\tHigh Signal Region\nchr3\t39366700\t39386000\tHigh Signal Region\nchr3\t40219400\t40240500\tHigh Signal Region\nchr3\t49671000\t49696700\tHigh Signal Region\nchr3\t51457800\t51462000\tHigh Signal Region\nchr3\t57326800\t57328500\tHigh Signal Region\nchr3\t65124100\t65126100\tHigh Signal Region\nchr3\t65510000\t65513900\tHigh Signal Region\nchr3\t65697400\t65699300\tHigh Signal Region\nchr3\t66273800\t66275200\tHigh Signal Region\nchr3\t68076400\t68077800\tHigh Signal Region\nchr3\t69047300\t69053600\tHigh Signal Region\nchr3\t69475300\t69479700\tHigh Signal Region\nchr3\t75630100\t75707800\tHigh Signal Region\nchr3\t75736400\t75754600\tHigh Signal Region\nchr3\t78948800\t78950500\tHigh Signal Region\nchr3\t80876000\t80894000\tHigh Signal Region\nchr3\t89345600\t89370500\tHigh Signal Region\nchr3\t90156400\t90175500\tHigh Signal Region\nchr3\t90455400\t91297100\tHigh Signal Region\nchr3\t91516200\t93749200\tHigh Signal Region\nchr3\t96616300\t96619300\tHigh Signal Region\nchr3\t97905100\t97923200\tHigh Signal Region\nchr3\t101674800\t101698400\tHigh Signal Region\nchr3\t103224300\t103236500\tHigh Signal Region\nchr3\t106665700\t106669700\tHigh Signal Region\nchr3\t106975900\t106979600\tHigh Signal Region\nchr3\t108751100\t108755100\tHigh Signal Region\nchr3\t111019500\t111024600\tHigh Signal Region\nchr3\t121933800\t121936400\tHigh Signal Region\nchr3\t122414300\t122417500\tHigh Signal Region\nchr3\t122735500\t122796600\tHigh Signal Region\nchr3\t122837000\t122838700\tHigh Signal Region\nchr3\t133177100\t133179800\tHigh Signal Region\nchr3\t133551500\t133579500\tHigh Signal Region\nchr3\t135437200\t135439100\tHigh Signal Region\nchr3\t136954600\t136969200\tHigh Signal Region\nchr3\t137168400\t137169900\tHigh Signal Region\nchr3\t138575800\t138595900\tHigh Signal Region\nchr3\t139190800\t139194700\tHigh Signal Region\nchr3\t153236200\t153241300\tHigh Signal Region\nchr3\t155544100\t155546700\tHigh Signal Region\nchr3\t156279000\t156283500\tHigh Signal Region\nchr3\t157080800\t157093400\tHigh Signal Region\nchr3\t158511300\t158513100\tHigh Signal Region\nchr3\t160941200\t160948700\tHigh Signal Region\nchr3\t161001900\t161014100\tHigh Signal Region\nchr3\t165573100\t165591000\tHigh Signal Region\nchr3\t166228200\t166232400\tHigh Signal Region\nchr3\t168012100\t168016800\tHigh Signal Region\nchr3\t170567000\t170569900\tHigh Signal Region\nchr3\t170864300\t170881400\tHigh Signal Region\nchr3\t171626600\t171637700\tHigh Signal Region\nchr3\t174829200\t174831800\tHigh Signal Region\nchr3\t176828700\t176833000\tHigh Signal Region\nchr3\t177660600\t177664000\tHigh Signal Region\nchr3\t178926800\t178941300\tHigh Signal Region\nchr3\t183016900\t183019100\tHigh Signal Region\nchr3\t183955400\t183958700\tHigh Signal Region\nchr3\t187893900\t187896100\tHigh Signal Region\nchr3\t192739300\t192742700\tHigh Signal Region\nchr3\t194323600\t194334900\tHigh Signal Region\nchr3\t195477900\t195507300\tHigh Signal Region\nchr3\t195616000\t195750100\tHigh Signal Region\nchr3\t195775500\t195791400\tHigh Signal Region\nchr3\t195914100\t196028300\tHigh Signal Region\nchr3\t196249400\t196251900\tHigh Signal Region\nchr3\t196897800\t196899800\tHigh Signal Region\nchr3\t197030600\t197035800\tHigh Signal Region\nchr3\t197383400\t197428800\tHigh Signal Region\nchr3\t197454700\t197460800\tHigh Signal Region\nchr3\t197598400\t197680900\tHigh Signal Region\nchr3\t198099800\t198295500\tHigh Signal Region\nchr4\t0\t69200\tHigh Signal Region\nchr4\t554100\t556500\tHigh Signal Region\nchr4\t1427000\t1468900\tHigh Signal Region\nchr4\t6002700\t6005700\tHigh Signal Region\nchr4\t7863000\t7865000\tHigh Signal Region\nchr4\t9212700\t9369600\tHigh Signal Region\nchr4\t40291700\t40318200\tHigh Signal Region\nchr4\t49077200\t51816100\tHigh Signal Region\nchr4\t55327200\t55329200\tHigh Signal Region\nchr4\t77994000\t78009600\tHigh Signal Region\nchr4\t119274400\t119301700\tHigh Signal Region\nchr4\t146285100\t146305300\tHigh Signal Region\nchr4\t162420500\t162422400\tHigh Signal Region\nchr4\t166554300\t166581300\tLow Mappability\nchr4\t181238800\t181242300\tLow Mappability\nchr4\t189232500\t189236300\tHigh Signal Region\nchr4\t189834900\t189849700\tHigh Signal Region\nchr4\t189877500\t190023700\tHigh Signal Region\nchr4\t190048600\t190214500\tHigh Signal Region\nchr5\t0\t44100\tHigh Signal Region\nchr5\t548300\t564100\tHigh Signal Region\nchr5\t647600\t651700\tHigh Signal Region\nchr5\t1326100\t1334600\tHigh Signal Region\nchr5\t2144600\t2147800\tHigh Signal Region\nchr5\t2489800\t2491700\tHigh Signal Region\nchr5\t3322100\t3325100\tHigh Signal Region\nchr5\t6967700\t6971700\tHigh Signal Region\nchr5\t17516800\t17600200\tHigh Signal Region\nchr5\t21477600\t21497600\tHigh Signal Region\nchr5\t25381400\t25384300\tHigh Signal Region\nchr5\t34177900\t34244800\tHigh Signal Region\nchr5\t45522900\t45525200\tHigh Signal Region\nchr5\t45743000\t45744800\tHigh Signal Region\nchr5\t46433900\t46687700\tHigh Signal Region\nchr5\t46708100\t50165300\tHigh Signal Region\nchr5\t60759700\t60762500\tHigh Signal Region\nchr5\t63320900\t63335500\tHigh Signal Region\nchr5\t69540700\t71359500\tHigh Signal Region\nchr5\t71850000\t71852800\tHigh Signal Region\nchr5\t74685400\t74712400\tHigh Signal Region\nchr5\t78452400\t78457600\tHigh Signal Region\nchr5\t78848400\t78872800\tHigh Signal Region\nchr5\t80649100\t80653100\tHigh Signal Region\nchr5\t85641800\t85662700\tHigh Signal Region\nchr5\t93947500\t93948900\tHigh Signal Region\nchr5\t94567100\t94570400\tHigh Signal Region\nchr5\t100045500\t100076300\tHigh Signal Region\nchr5\t106425500\t106429500\tHigh Signal Region\nchr5\t109259500\t109265400\tHigh Signal Region\nchr5\t111302100\t111308300\tHigh Signal Region\nchr5\t114156700\t114158300\tHigh Signal Region\nchr5\t119904000\t119905600\tHigh Signal Region\nchr5\t123760300\t123762200\tHigh Signal Region\nchr5\t134922500\t134929400\tHigh Signal Region\nchr5\t139005500\t139011600\tHigh Signal Region\nchr5\t146610000\t146615500\tHigh Signal Region\nchr5\t153071100\t153077000\tHigh Signal Region\nchr5\t156658300\t156665400\tHigh Signal Region\nchr5\t161606000\t161611700\tHigh Signal Region\nchr5\t171083900\t171090200\tHigh Signal Region\nchr5\t175904500\t176118000\tHigh Signal Region\nchr5\t176590700\t176593000\tHigh Signal Region\nchr5\t177636700\t177684700\tHigh Signal Region\nchr5\t177960500\t177981400\tHigh Signal Region\nchr5\t178584600\t178586600\tHigh Signal Region\nchr5\t181172600\t181538200\tHigh Signal Region\nchr6\t256500\t382800\tHigh Signal Region\nchr6\t861500\t864200\tHigh Signal Region\nchr6\t1052800\t1054800\tHigh Signal Region\nchr6\t26669200\t26832300\tHigh Signal Region\nchr6\t33484600\t33486400\tHigh Signal Region\nchr6\t34070600\t34074000\tHigh Signal Region\nchr6\t38262000\t38301600\tHigh Signal Region\nchr6\t39455800\t39460500\tHigh Signal Region\nchr6\t44043600\t44080000\tHigh Signal Region\nchr6\t44180600\t44182900\tHigh Signal Region\nchr6\t51874900\t51901300\tHigh Signal Region\nchr6\t54961900\t54967400\tHigh Signal Region\nchr6\t58432200\t60242300\tHigh Signal Region\nchr6\t61321800\t61493000\tHigh Signal Region\nchr6\t61573200\t61575100\tLow Mappability\nchr6\t61661900\t61673400\tHigh Signal Region\nchr6\t103709000\t103715100\tHigh Signal Region\nchr6\t115254900\t115256800\tHigh Signal Region\nchr6\t143799900\t143801800\tHigh Signal Region\nchr6\t156035300\t156040100\tHigh Signal Region\nchr6\t157309500\t157324800\tHigh Signal Region\nchr6\t160611700\t160647400\tHigh Signal Region\nchr6\t170145300\t170147200\tHigh Signal Region\nchr6\t170376900\t170401000\tHigh Signal Region\nchr6\t170465400\t170468400\tHigh Signal Region\nchr7\t0\t49600\tHigh Signal Region\nchr7\t224500\t241300\tHigh Signal Region\nchr7\t904700\t907100\tLow Mappability\nchr7\t1271400\t1273500\tHigh Signal Region\nchr7\t45251000\t45253000\tHigh Signal Region\nchr7\t56369500\t56375600\tHigh Signal Region\nchr7\t57485300\t57497800\tHigh Signal Region\nchr7\t57611600\t57637700\tLow Mappability\nchr7\t58031800\t60997400\tHigh Signal Region\nchr7\t61017800\t61075200\tHigh Signal Region\nchr7\t61102900\t61725200\tLow Mappability\nchr7\t62265700\t62409500\tHigh Signal Region\nchr7\t62430000\t62520600\tHigh Signal Region\nchr7\t65488000\t65496500\tHigh Signal Region\nchr7\t100951400\t100968300\tHigh Signal Region\nchr7\t100991500\t101004600\tHigh Signal Region\nchr7\t102474700\t102686400\tHigh Signal Region\nchr7\t142665100\t142668500\tHigh Signal Region\nchr7\t144180800\t144377300\tLow Mappability\nchr7\t145996400\t146018600\tHigh Signal Region\nchr7\t152375800\t152435100\tHigh Signal Region\nchr7\t158131400\t158156200\tHigh Signal Region\nchr7\t158594300\t158596200\tHigh Signal Region\nchr7\t158893100\t158918100\tHigh Signal Region\nchr7\t159334900\t159345900\tHigh Signal Region\nchr8\t7209800\t7914700\tHigh Signal Region\nchr8\t7940500\t8075700\tHigh Signal Region\nchr8\t8128200\t8204600\tHigh Signal Region\nchr8\t12136900\t12614300\tHigh Signal Region\nchr8\t43236700\t43262600\tHigh Signal Region\nchr8\t43937900\t45969600\tHigh Signal Region\nchr8\t46829400\t46832000\tHigh Signal Region\nchr8\t57204900\t57216100\tHigh Signal Region\nchr8\t59168700\t59170400\tHigh Signal Region\nchr8\t67584500\t67592700\tHigh Signal Region\nchr8\t69688400\t69691100\tHigh Signal Region\nchr8\t71406700\t71412400\tHigh Signal Region\nchr8\t75444100\t75448200\tHigh Signal Region\nchr8\t81841500\t81851900\tHigh Signal Region\nchr8\t85642100\t85829300\tHigh Signal Region\nchr8\t88685900\t88691700\tHigh Signal Region\nchr8\t96171200\t96173100\tHigh Signal Region\nchr8\t99494900\t99496800\tHigh Signal Region\nchr8\t105789200\t105793800\tHigh Signal Region\nchr8\t141491400\t141493500\tHigh Signal Region\nchr8\t141871100\t141875200\tHigh Signal Region\nchr8\t143641400\t143670500\tHigh Signal Region\nchr8\t144124800\t144137600\tHigh Signal Region\nchr9\t319900\t322400\tHigh Signal Region\nchr9\t33656600\t33660000\tHigh Signal Region\nchr9\t35912600\t35915300\tHigh Signal Region\nchr9\t38824200\t39089400\tHigh Signal Region\nchr9\t39846200\t40771100\tHigh Signal Region\nchr9\t40792500\t41323100\tHigh Signal Region\nchr9\t41492300\t41635600\tHigh Signal Region\nchr9\t41661300\t42119600\tLow Mappability\nchr9\t42364000\t42410600\tHigh Signal Region\nchr9\t42899400\t42901300\tHigh Signal Region\nchr9\t43263100\t61518900\tHigh Signal Region\nchr9\t61735300\t63548000\tHigh Signal Region\nchr9\t63761400\t64027300\tHigh Signal Region\nchr9\t64135000\t65390600\tHigh Signal Region\nchr9\t65579400\t66874600\tHigh Signal Region\nchr9\t66959000\t68398100\tHigh Signal Region\nchr9\t70037200\t70039600\tHigh Signal Region\nchr9\t76174300\t76176200\tHigh Signal Region\nchr9\t83222900\t83226900\tHigh Signal Region\nchr9\t85071600\t85075100\tHigh Signal Region\nchr9\t85164800\t85166100\tHigh Signal Region\nchr9\t108502000\t108506600\tHigh Signal Region\nchr9\t134164500\t134185500\tHigh Signal Region\nchr9\t137326800\t137330600\tHigh Signal Region\nchr9\t137715200\t137722200\tLow Mappability\nchr9\t137841200\t137846800\tLow Mappability\nchr9\t138222000\t138394700\tHigh Signal Region\nchrX\t0\t329300\tHigh Signal Region\nchrX\t362400\t388500\tHigh Signal Region\nchrX\t456500\t531800\tHigh Signal Region\nchrX\t723800\t739500\tHigh Signal Region\nchrX\t864500\t930400\tHigh Signal Region\nchrX\t1049100\t1054300\tHigh Signal Region\nchrX\t1085100\t1175500\tHigh Signal Region\nchrX\t1200600\t1209400\tHigh Signal Region\nchrX\t1249200\t1269000\tHigh Signal Region\nchrX\t1289500\t1298900\tHigh Signal Region\nchrX\t1365300\t1458700\tHigh Signal Region\nchrX\t1480900\t1492800\tHigh Signal Region\nchrX\t1816200\t1820600\tHigh Signal Region\nchrX\t2223900\t2521900\tHigh Signal Region\nchrX\t2580600\t2751300\tHigh Signal Region\nchrX\t3966700\t3968700\tHigh Signal Region\nchrX\t5481200\t5486100\tHigh Signal Region\nchrX\t6933400\t6938700\tHigh Signal Region\nchrX\t7587600\t7591800\tHigh Signal Region\nchrX\t9403600\t9415100\tHigh Signal Region\nchrX\t10785000\t10809700\tHigh Signal Region\nchrX\t10966600\t10976800\tHigh Signal Region\nchrX\t11218800\t11221100\tLow Mappability\nchrX\t11840900\t11848000\tHigh Signal Region\nchrX\t14085100\t14109500\tHigh Signal Region\nchrX\t14286500\t14289300\tHigh Signal Region\nchrX\t16361200\t16366000\tHigh Signal Region\nchrX\t16498100\t16503400\tHigh Signal Region\nchrX\t19940200\t19946300\tHigh Signal Region\nchrX\t21340600\t21345700\tHigh Signal Region\nchrX\t25773300\t25776000\tHigh Signal Region\nchrX\t26176400\t26181400\tHigh Signal Region\nchrX\t30767800\t30772600\tHigh Signal Region\nchrX\t31077600\t31082600\tHigh Signal Region\nchrX\t31511400\t31535800\tHigh Signal Region\nchrX\t34416800\t34425900\tHigh Signal Region\nchrX\t36465200\t36471200\tHigh Signal Region\nchrX\t37628400\t37633500\tHigh Signal Region\nchrX\t42872300\t42910700\tHigh Signal Region\nchrX\t49317500\t49623500\tHigh Signal Region\nchrX\t50019400\t50033700\tHigh Signal Region\nchrX\t50056700\t50066100\tHigh Signal Region\nchrX\t51202300\t51268100\tHigh Signal Region\nchrX\t51427500\t51432400\tHigh Signal Region\nchrX\t52175000\t52228100\tHigh Signal Region\nchrX\t52442800\t52538100\tHigh Signal Region\nchrX\t53761700\t53789500\tHigh Signal Region\nchrX\t55180400\t55184500\tHigh Signal Region\nchrX\t56754900\t56781100\tLow Mappability\nchrX\t57712300\t57719700\tHigh Signal Region\nchrX\t58467900\t62522800\tHigh Signal Region\nchrX\t63129600\t63290600\tLow Mappability\nchrX\t67311800\t67323800\tHigh Signal Region\nchrX\t67626800\t67632300\tHigh Signal Region\nchrX\t68217300\t68230200\tHigh Signal Region\nchrX\t70600000\t70603800\tHigh Signal Region\nchrX\t70640600\t70645000\tHigh Signal Region\nchrX\t70963600\t70964900\tHigh Signal Region\nchrX\t71978800\t71980500\tHigh Signal Region\nchrX\t72489400\t72490800\tHigh Signal Region\nchrX\t72743200\t73035800\tHigh Signal Region\nchrX\t73381000\t73387000\tHigh Signal Region\nchrX\t73887000\t73891300\tHigh Signal Region\nchrX\t74660000\t74718100\tHigh Signal Region\nchrX\t74789000\t74794000\tHigh Signal Region\nchrX\t74952200\t74995200\tHigh Signal Region\nchrX\t78802400\t78804500\tHigh Signal Region\nchrX\t79765500\t79789600\tHigh Signal Region\nchrX\t80534100\t80537000\tHigh Signal Region\nchrX\t82849700\t82859300\tLow Mappability\nchrX\t83752100\t83756900\tHigh Signal Region\nchrX\t86046600\t86076600\tHigh Signal Region\nchrX\t86395500\t86398100\tHigh Signal Region\nchrX\t86970000\t86975600\tHigh Signal Region\nchrX\t87220500\t87222100\tHigh Signal Region\nchrX\t89060200\t89062700\tHigh Signal Region\nchrX\t89202500\t89208400\tHigh Signal Region\nchrX\t91332900\t91336600\tHigh Signal Region\nchrX\t93618000\t93633400\tHigh Signal Region\nchrX\t94863600\t94868300\tHigh Signal Region\nchrX\t97509600\t97515000\tHigh Signal Region\nchrX\t100135800\t100141000\tHigh Signal Region\nchrX\t100257100\t100261600\tHigh Signal Region\nchrX\t101471700\t101474900\tHigh Signal Region\nchrX\t102188700\t102489200\tHigh Signal Region\nchrX\t103851800\t103897800\tHigh Signal Region\nchrX\t106755500\t106769400\tHigh Signal Region\nchrX\t106813900\t106830900\tHigh Signal Region\nchrX\t107515800\t107517200\tHigh Signal Region\nchrX\t109034800\t109069100\tHigh Signal Region\nchrX\t109114900\t109119400\tHigh Signal Region\nchrX\t109520800\t109525700\tHigh Signal Region\nchrX\t109985900\t109987300\tHigh Signal Region\nchrX\t110816700\t110833400\tHigh Signal Region\nchrX\t111416100\t111418000\tHigh Signal Region\nchrX\t113141700\t113143600\tHigh Signal Region\nchrX\t114701600\t114724300\tHigh Signal Region\nchrX\t115725600\t115889600\tHigh Signal Region\nchrX\t116557600\t116595600\tHigh Signal Region\nchrX\t117874100\t117880000\tHigh Signal Region\nchrX\t118009000\t118037800\tHigh Signal Region\nchrX\t118070900\t118072700\tHigh Signal Region\nchrX\t121263700\t121268100\tHigh Signal Region\nchrX\t121299200\t121300600\tHigh Signal Region\nchrX\t122528400\t122550000\tHigh Signal Region\nchrX\t124584300\t124588400\tHigh Signal Region\nchrX\t125927600\t125937100\tHigh Signal Region\nchrX\t126463700\t126474200\tHigh Signal Region\nchrX\t127116700\t127122600\tHigh Signal Region\nchrX\t127362200\t127368300\tHigh Signal Region\nchrX\t128785000\t128788700\tHigh Signal Region\nchrX\t129337600\t129357900\tHigh Signal Region\nchrX\t129388400\t129408400\tHigh Signal Region\nchrX\t130567700\t130572000\tHigh Signal Region\nchrX\t131152200\t131157400\tHigh Signal Region\nchrX\t131378300\t131383300\tHigh Signal Region\nchrX\t131664300\t131670000\tHigh Signal Region\nchrX\t132284600\t132320400\tHigh Signal Region\nchrX\t133108600\t133116500\tHigh Signal Region\nchrX\t135718600\t135888700\tHigh Signal Region\nchrX\t137074700\t137079100\tHigh Signal Region\nchrX\t137436600\t137439300\tHigh Signal Region\nchrX\t138300600\t138302200\tHigh Signal Region\nchrX\t139437600\t139446800\tHigh Signal Region\nchrX\t139621500\t139622800\tHigh Signal Region\nchrX\t140722400\t140726100\tHigh Signal Region\nchrX\t141000400\t141108300\tHigh Signal Region\nchrX\t142478000\t142483800\tHigh Signal Region\nchrX\t142892300\t142911600\tHigh Signal Region\nchrX\t143352000\t143356500\tHigh Signal Region\nchrX\t144404500\t144475900\tLow Mappability\nchrX\t147281700\t147287100\tHigh Signal Region\nchrX\t147653800\t147659900\tHigh Signal Region\nchrX\t148123500\t148129000\tHigh Signal Region\nchrX\t148347100\t148378700\tHigh Signal Region\nchrX\t149437900\t149441900\tHigh Signal Region\nchrX\t150024800\t150026200\tHigh Signal Region\nchrX\t152173800\t152175100\tHigh Signal Region\nchrX\t153251200\t153316400\tHigh Signal Region\nchrX\t154870000\t154890200\tHigh Signal Region\nchrX\t154938900\t154945100\tHigh Signal Region\nchrX\t155299600\t155305100\tHigh Signal Region\nchrX\t155454000\t155522000\tHigh Signal Region\nchrX\t155700400\t155727500\tHigh Signal Region\nchrX\t155983500\t156040800\tHigh Signal Region\nchrY\t4343800\t4345800\tHigh Signal Region\nchrY\t10246200\t11041200\tHigh Signal Region\nchrY\t11072100\t11335300\tHigh Signal Region\nchrY\t11486600\t11757800\tHigh Signal Region\nchrY\t26637300\t57227400\tHigh Signal Region\nchr1\t230872006\t230872168\tHigh Signal Region\nchr1\t230872009\t230872119\nchr2\t32928000\t32953000\n"
  },
  {
    "path": "tracks/hg38.nonstd_chr.blacklist.bed",
    "content": "chr1_KI270706v1_random\t0\t175055\tUnplaced random\nchr1_KI270707v1_random\t0\t32032\tUnplaced random\nchr1_KI270708v1_random\t0\t127682\tUnplaced random\nchr1_KI270709v1_random\t0\t66860\tUnplaced random\nchr1_KI270710v1_random\t0\t40176\tUnplaced random\nchr1_KI270711v1_random\t0\t42210\tUnplaced random\nchr1_KI270712v1_random\t0\t176043\tUnplaced random\nchr1_KI270713v1_random\t0\t40745\tUnplaced random\nchr1_KI270714v1_random\t0\t41717\tUnplaced random\nchr2_KI270715v1_random\t0\t161471\tUnplaced random\nchr2_KI270716v1_random\t0\t153799\tUnplaced random\nchr3_GL000221v1_random\t0\t155397\tUnplaced random\nchr4_GL000008v2_random\t0\t209709\tUnplaced random\nchr5_GL000208v1_random\t0\t92689\tUnplaced random\nchr9_KI270717v1_random\t0\t40062\tUnplaced random\nchr9_KI270718v1_random\t0\t38054\tUnplaced random\nchr9_KI270719v1_random\t0\t176845\tUnplaced random\nchr9_KI270720v1_random\t0\t39050\tUnplaced random\nchr11_KI270721v1_random\t0\t100316\tUnplaced random\nchr14_GL000009v2_random\t0\t201709\tUnplaced random\nchr14_GL000225v1_random\t0\t211173\tUnplaced random\nchr14_KI270722v1_random\t0\t194050\tUnplaced random\nchr14_GL000194v1_random\t0\t191469\tUnplaced random\nchr14_KI270723v1_random\t0\t38115\tUnplaced random\nchr14_KI270724v1_random\t0\t39555\tUnplaced random\nchr14_KI270725v1_random\t0\t172810\tUnplaced random\nchr14_KI270726v1_random\t0\t43739\tUnplaced random\nchr15_KI270727v1_random\t0\t448248\tUnplaced random\nchr16_KI270728v1_random\t0\t1872759\tUnplaced random\nchr17_GL000205v2_random\t0\t185591\tUnplaced random\nchr17_KI270729v1_random\t0\t280839\tUnplaced random\nchr17_KI270730v1_random\t0\t112551\tUnplaced random\nchr22_KI270731v1_random\t0\t150754\tUnplaced random\nchr22_KI270732v1_random\t0\t41543\tUnplaced random\nchr22_KI270733v1_random\t0\t179772\tUnplaced random\nchr22_KI270734v1_random\t0\t165050\tUnplaced random\nchr22_KI270735v1_random\t0\t42811\tUnplaced random\nchr22_KI270736v1_random\t0\t181920\tUnplaced random\nchr22_KI270737v1_random\t0\t103838\tUnplaced random\nchr22_KI270738v1_random\t0\t99375\tUnplaced random\nchr22_KI270739v1_random\t0\t73985\tUnplaced random\nchrY_KI270740v1_random\t0\t37240\tUnplaced random\nchrUn_KI270302v1\t0\t2274\tUnplaced\nchrUn_KI270304v1\t0\t2165\tUnplaced\nchrUn_KI270303v1\t0\t1942\tUnplaced\nchrUn_KI270305v1\t0\t1472\tUnplaced\nchrUn_KI270322v1\t0\t21476\tUnplaced\nchrUn_KI270320v1\t0\t4416\tUnplaced\nchrUn_KI270310v1\t0\t1201\tUnplaced\nchrUn_KI270316v1\t0\t1444\tUnplaced\nchrUn_KI270315v1\t0\t2276\tUnplaced\nchrUn_KI270312v1\t0\t998\tUnplaced\nchrUn_KI270311v1\t0\t12399\tUnplaced\nchrUn_KI270317v1\t0\t37690\tUnplaced\nchrUn_KI270412v1\t0\t1179\tUnplaced\nchrUn_KI270411v1\t0\t2646\tUnplaced\nchrUn_KI270414v1\t0\t2489\tUnplaced\nchrUn_KI270419v1\t0\t1029\tUnplaced\nchrUn_KI270418v1\t0\t2145\tUnplaced\nchrUn_KI270420v1\t0\t2321\tUnplaced\nchrUn_KI270424v1\t0\t2140\tUnplaced\nchrUn_KI270417v1\t0\t2043\tUnplaced\nchrUn_KI270422v1\t0\t1445\tUnplaced\nchrUn_KI270423v1\t0\t981\tUnplaced\nchrUn_KI270425v1\t0\t1884\tUnplaced\nchrUn_KI270429v1\t0\t1361\tUnplaced\nchrUn_KI270442v1\t0\t392061\tUnplaced\nchrUn_KI270466v1\t0\t1233\tUnplaced\nchrUn_KI270465v1\t0\t1774\tUnplaced\nchrUn_KI270467v1\t0\t3920\tUnplaced\nchrUn_KI270435v1\t0\t92983\tUnplaced\nchrUn_KI270438v1\t0\t112505\tUnplaced\nchrUn_KI270468v1\t0\t4055\tUnplaced\nchrUn_KI270510v1\t0\t2415\tUnplaced\nchrUn_KI270509v1\t0\t2318\tUnplaced\nchrUn_KI270518v1\t0\t2186\tUnplaced\nchrUn_KI270508v1\t0\t1951\tUnplaced\nchrUn_KI270516v1\t0\t1300\tUnplaced\nchrUn_KI270512v1\t0\t22689\tUnplaced\nchrUn_KI270519v1\t0\t138126\tUnplaced\nchrUn_KI270522v1\t0\t5674\tUnplaced\nchrUn_KI270511v1\t0\t8127\tUnplaced\nchrUn_KI270515v1\t0\t6361\tUnplaced\nchrUn_KI270507v1\t0\t5353\tUnplaced\nchrUn_KI270517v1\t0\t3253\tUnplaced\nchrUn_KI270529v1\t0\t1899\tUnplaced\nchrUn_KI270528v1\t0\t2983\tUnplaced\nchrUn_KI270530v1\t0\t2168\tUnplaced\nchrUn_KI270539v1\t0\t993\tUnplaced\nchrUn_KI270538v1\t0\t91309\tUnplaced\nchrUn_KI270544v1\t0\t1202\tUnplaced\nchrUn_KI270548v1\t0\t1599\tUnplaced\nchrUn_KI270583v1\t0\t1400\tUnplaced\nchrUn_KI270587v1\t0\t2969\tUnplaced\nchrUn_KI270580v1\t0\t1553\tUnplaced\nchrUn_KI270581v1\t0\t7046\tUnplaced\nchrUn_KI270579v1\t0\t31033\tUnplaced\nchrUn_KI270589v1\t0\t44474\tUnplaced\nchrUn_KI270590v1\t0\t4685\tUnplaced\nchrUn_KI270584v1\t0\t4513\tUnplaced\nchrUn_KI270582v1\t0\t6504\tUnplaced\nchrUn_KI270588v1\t0\t6158\tUnplaced\nchrUn_KI270593v1\t0\t3041\tUnplaced\nchrUn_KI270591v1\t0\t5796\tUnplaced\nchrUn_KI270330v1\t0\t1652\tUnplaced\nchrUn_KI270329v1\t0\t1040\tUnplaced\nchrUn_KI270334v1\t0\t1368\tUnplaced\nchrUn_KI270333v1\t0\t2699\tUnplaced\nchrUn_KI270335v1\t0\t1048\tUnplaced\nchrUn_KI270338v1\t0\t1428\tUnplaced\nchrUn_KI270340v1\t0\t1428\tUnplaced\nchrUn_KI270336v1\t0\t1026\tUnplaced\nchrUn_KI270337v1\t0\t1121\tUnplaced\nchrUn_KI270363v1\t0\t1803\tUnplaced\nchrUn_KI270364v1\t0\t2855\tUnplaced\nchrUn_KI270362v1\t0\t3530\tUnplaced\nchrUn_KI270366v1\t0\t8320\tUnplaced\nchrUn_KI270378v1\t0\t1048\tUnplaced\nchrUn_KI270379v1\t0\t1045\tUnplaced\nchrUn_KI270389v1\t0\t1298\tUnplaced\nchrUn_KI270390v1\t0\t2387\tUnplaced\nchrUn_KI270387v1\t0\t1537\tUnplaced\nchrUn_KI270395v1\t0\t1143\tUnplaced\nchrUn_KI270396v1\t0\t1880\tUnplaced\nchrUn_KI270388v1\t0\t1216\tUnplaced\nchrUn_KI270394v1\t0\t970\tUnplaced\nchrUn_KI270386v1\t0\t1788\tUnplaced\nchrUn_KI270391v1\t0\t1484\tUnplaced\nchrUn_KI270383v1\t0\t1750\tUnplaced\nchrUn_KI270393v1\t0\t1308\tUnplaced\nchrUn_KI270384v1\t0\t1658\tUnplaced\nchrUn_KI270392v1\t0\t971\tUnplaced\nchrUn_KI270381v1\t0\t1930\tUnplaced\nchrUn_KI270385v1\t0\t990\tUnplaced\nchrUn_KI270382v1\t0\t4215\tUnplaced\nchrUn_KI270376v1\t0\t1136\tUnplaced\nchrUn_KI270374v1\t0\t2656\tUnplaced\nchrUn_KI270372v1\t0\t1650\tUnplaced\nchrUn_KI270373v1\t0\t1451\tUnplaced\nchrUn_KI270375v1\t0\t2378\tUnplaced\nchrUn_KI270371v1\t0\t2805\tUnplaced\nchrUn_KI270448v1\t0\t7992\tUnplaced\nchrUn_KI270521v1\t0\t7642\tUnplaced\nchrUn_GL000195v1\t0\t182896\tUnplaced\nchrUn_GL000219v1\t0\t179198\tUnplaced\nchrUn_GL000220v1\t0\t161802\tUnplaced\nchrUn_GL000224v1\t0\t179693\tUnplaced\nchrUn_KI270741v1\t0\t157432\tUnplaced\nchrUn_GL000226v1\t0\t15008\tUnplaced\nchrUn_GL000213v1\t0\t164239\tUnplaced\nchrUn_KI270743v1\t0\t210658\tUnplaced\nchrUn_KI270744v1\t0\t168472\tUnplaced\nchrUn_KI270745v1\t0\t41891\tUnplaced\nchrUn_KI270746v1\t0\t66486\tUnplaced\nchrUn_KI270747v1\t0\t198735\tUnplaced\nchrUn_KI270748v1\t0\t93321\tUnplaced\nchrUn_KI270749v1\t0\t158759\tUnplaced\nchrUn_KI270750v1\t0\t148850\tUnplaced\nchrUn_KI270751v1\t0\t150742\tUnplaced\nchrUn_KI270752v1\t0\t27745\tUnplaced\nchrUn_KI270753v1\t0\t62944\tUnplaced\nchrUn_KI270754v1\t0\t40191\tUnplaced\nchrUn_KI270755v1\t0\t36723\tUnplaced\nchrUn_KI270756v1\t0\t79590\tUnplaced\nchrUn_KI270757v1\t0\t71251\tUnplaced\nchrUn_GL000214v1\t0\t137718\tUnplaced\nchrUn_KI270742v1\t0\t186739\tUnplaced\nchrUn_GL000216v2\t0\t176608\tUnplaced\nchrUn_GL000218v1\t0\t161147\tUnplaced\nchr1_KI270762v1_alt\t0\t354444\tAlt haplotype\nchr1_KI270766v1_alt\t0\t256271\tAlt haplotype\nchr1_KI270760v1_alt\t0\t109528\tAlt haplotype\nchr1_KI270765v1_alt\t0\t185285\tAlt haplotype\nchr1_GL383518v1_alt\t0\t182439\tAlt haplotype\nchr1_GL383519v1_alt\t0\t110268\tAlt haplotype\nchr1_GL383520v2_alt\t0\t366580\tAlt haplotype\nchr1_KI270764v1_alt\t0\t50258\tAlt haplotype\nchr1_KI270763v1_alt\t0\t911658\tAlt haplotype\nchr1_KI270759v1_alt\t0\t425601\tAlt haplotype\nchr1_KI270761v1_alt\t0\t165834\tAlt haplotype\nchr2_KI270770v1_alt\t0\t136240\tAlt haplotype\nchr2_KI270773v1_alt\t0\t70887\tAlt haplotype\nchr2_KI270774v1_alt\t0\t223625\tAlt haplotype\nchr2_KI270769v1_alt\t0\t120616\tAlt haplotype\nchr2_GL383521v1_alt\t0\t143390\tAlt haplotype\nchr2_KI270772v1_alt\t0\t133041\tAlt haplotype\nchr2_KI270775v1_alt\t0\t138019\tAlt haplotype\nchr2_KI270771v1_alt\t0\t110395\tAlt haplotype\nchr2_KI270768v1_alt\t0\t110099\tAlt haplotype\nchr2_GL582966v2_alt\t0\t96131\tAlt haplotype\nchr2_GL383522v1_alt\t0\t123821\tAlt haplotype\nchr2_KI270776v1_alt\t0\t174166\tAlt haplotype\nchr2_KI270767v1_alt\t0\t161578\tAlt haplotype\nchr3_JH636055v2_alt\t0\t173151\tAlt haplotype\nchr3_KI270783v1_alt\t0\t109187\tAlt haplotype\nchr3_KI270780v1_alt\t0\t224108\tAlt haplotype\nchr3_GL383526v1_alt\t0\t180671\tAlt haplotype\nchr3_KI270777v1_alt\t0\t173649\tAlt haplotype\nchr3_KI270778v1_alt\t0\t248252\tAlt haplotype\nchr3_KI270781v1_alt\t0\t113034\tAlt haplotype\nchr3_KI270779v1_alt\t0\t205312\tAlt haplotype\nchr3_KI270782v1_alt\t0\t162429\tAlt haplotype\nchr3_KI270784v1_alt\t0\t184404\tAlt haplotype\nchr4_KI270790v1_alt\t0\t220246\tAlt haplotype\nchr4_GL383528v1_alt\t0\t376187\tAlt haplotype\nchr4_KI270787v1_alt\t0\t111943\tAlt haplotype\nchr4_GL000257v2_alt\t0\t586476\tAlt haplotype\nchr4_KI270788v1_alt\t0\t158965\tAlt haplotype\nchr4_GL383527v1_alt\t0\t164536\tAlt haplotype\nchr4_KI270785v1_alt\t0\t119912\tAlt haplotype\nchr4_KI270789v1_alt\t0\t205944\tAlt haplotype\nchr4_KI270786v1_alt\t0\t244096\tAlt haplotype\nchr5_KI270793v1_alt\t0\t126136\tAlt haplotype\nchr5_KI270792v1_alt\t0\t179043\tAlt haplotype\nchr5_KI270791v1_alt\t0\t195710\tAlt haplotype\nchr5_GL383532v1_alt\t0\t82728\tAlt haplotype\nchr5_GL949742v1_alt\t0\t226852\tAlt haplotype\nchr5_KI270794v1_alt\t0\t164558\tAlt haplotype\nchr5_GL339449v2_alt\t0\t1612928\tAlt haplotype\nchr5_GL383530v1_alt\t0\t101241\tAlt haplotype\nchr5_KI270796v1_alt\t0\t172708\tAlt haplotype\nchr5_GL383531v1_alt\t0\t173459\tAlt haplotype\nchr5_KI270795v1_alt\t0\t131892\tAlt haplotype\nchr6_GL000250v2_alt\t0\t4672374\tAlt haplotype\nchr6_KI270800v1_alt\t0\t175808\tAlt haplotype\nchr6_KI270799v1_alt\t0\t152148\tAlt haplotype\nchr6_GL383533v1_alt\t0\t124736\tAlt haplotype\nchr6_KI270801v1_alt\t0\t870480\tAlt haplotype\nchr6_KI270802v1_alt\t0\t75005\tAlt haplotype\nchr6_KB021644v2_alt\t0\t185823\tAlt haplotype\nchr6_KI270797v1_alt\t0\t197536\tAlt haplotype\nchr6_KI270798v1_alt\t0\t271782\tAlt haplotype\nchr7_KI270804v1_alt\t0\t157952\tAlt haplotype\nchr7_KI270809v1_alt\t0\t209586\tAlt haplotype\nchr7_KI270806v1_alt\t0\t158166\tAlt haplotype\nchr7_GL383534v2_alt\t0\t119183\tAlt haplotype\nchr7_KI270803v1_alt\t0\t1111570\tAlt haplotype\nchr7_KI270808v1_alt\t0\t271455\tAlt haplotype\nchr7_KI270807v1_alt\t0\t126434\tAlt haplotype\nchr7_KI270805v1_alt\t0\t209988\tAlt haplotype\nchr8_KI270818v1_alt\t0\t145606\tAlt haplotype\nchr8_KI270812v1_alt\t0\t282736\tAlt haplotype\nchr8_KI270811v1_alt\t0\t292436\tAlt haplotype\nchr8_KI270821v1_alt\t0\t985506\tAlt haplotype\nchr8_KI270813v1_alt\t0\t300230\tAlt haplotype\nchr8_KI270822v1_alt\t0\t624492\tAlt haplotype\nchr8_KI270814v1_alt\t0\t141812\tAlt haplotype\nchr8_KI270810v1_alt\t0\t374415\tAlt haplotype\nchr8_KI270819v1_alt\t0\t133535\tAlt haplotype\nchr8_KI270820v1_alt\t0\t36640\tAlt haplotype\nchr8_KI270817v1_alt\t0\t158983\tAlt haplotype\nchr8_KI270816v1_alt\t0\t305841\tAlt haplotype\nchr8_KI270815v1_alt\t0\t132244\tAlt haplotype\nchr9_GL383539v1_alt\t0\t162988\tAlt haplotype\nchr9_GL383540v1_alt\t0\t71551\tAlt haplotype\nchr9_GL383541v1_alt\t0\t171286\tAlt haplotype\nchr9_GL383542v1_alt\t0\t60032\tAlt haplotype\nchr9_KI270823v1_alt\t0\t439082\tAlt haplotype\nchr10_GL383545v1_alt\t0\t179254\tAlt haplotype\nchr10_KI270824v1_alt\t0\t181496\tAlt haplotype\nchr10_GL383546v1_alt\t0\t309802\tAlt haplotype\nchr10_KI270825v1_alt\t0\t188315\tAlt haplotype\nchr11_KI270832v1_alt\t0\t210133\tAlt haplotype\nchr11_KI270830v1_alt\t0\t177092\tAlt haplotype\nchr11_KI270831v1_alt\t0\t296895\tAlt haplotype\nchr11_KI270829v1_alt\t0\t204059\tAlt haplotype\nchr11_GL383547v1_alt\t0\t154407\tAlt haplotype\nchr11_JH159136v1_alt\t0\t200998\tAlt haplotype\nchr11_JH159137v1_alt\t0\t191409\tAlt haplotype\nchr11_KI270827v1_alt\t0\t67707\tAlt haplotype\nchr11_KI270826v1_alt\t0\t186169\tAlt haplotype\nchr12_GL877875v1_alt\t0\t167313\tAlt haplotype\nchr12_GL877876v1_alt\t0\t408271\tAlt haplotype\nchr12_KI270837v1_alt\t0\t40090\tAlt haplotype\nchr12_GL383549v1_alt\t0\t120804\tAlt haplotype\nchr12_KI270835v1_alt\t0\t238139\tAlt haplotype\nchr12_GL383550v2_alt\t0\t169178\tAlt haplotype\nchr12_GL383552v1_alt\t0\t138655\tAlt haplotype\nchr12_GL383553v2_alt\t0\t152874\tAlt haplotype\nchr12_KI270834v1_alt\t0\t119498\tAlt haplotype\nchr12_GL383551v1_alt\t0\t184319\tAlt haplotype\nchr12_KI270833v1_alt\t0\t76061\tAlt haplotype\nchr12_KI270836v1_alt\t0\t56134\tAlt haplotype\nchr13_KI270840v1_alt\t0\t191684\tAlt haplotype\nchr13_KI270839v1_alt\t0\t180306\tAlt haplotype\nchr13_KI270843v1_alt\t0\t103832\tAlt haplotype\nchr13_KI270841v1_alt\t0\t169134\tAlt haplotype\nchr13_KI270838v1_alt\t0\t306913\tAlt haplotype\nchr13_KI270842v1_alt\t0\t37287\tAlt haplotype\nchr14_KI270844v1_alt\t0\t322166\tAlt haplotype\nchr14_KI270847v1_alt\t0\t1511111\tAlt haplotype\nchr14_KI270845v1_alt\t0\t180703\tAlt haplotype\nchr14_KI270846v1_alt\t0\t1351393\tAlt haplotype\nchr15_KI270852v1_alt\t0\t478999\tAlt haplotype\nchr15_KI270851v1_alt\t0\t263054\tAlt haplotype\nchr15_KI270848v1_alt\t0\t327382\tAlt haplotype\nchr15_GL383554v1_alt\t0\t296527\tAlt haplotype\nchr15_KI270849v1_alt\t0\t244917\tAlt haplotype\nchr15_GL383555v2_alt\t0\t388773\tAlt haplotype\nchr15_KI270850v1_alt\t0\t430880\tAlt haplotype\nchr16_KI270854v1_alt\t0\t134193\tAlt haplotype\nchr16_KI270856v1_alt\t0\t63982\tAlt haplotype\nchr16_KI270855v1_alt\t0\t232857\tAlt haplotype\nchr16_KI270853v1_alt\t0\t2659700\tAlt haplotype\nchr16_GL383556v1_alt\t0\t192462\tAlt haplotype\nchr16_GL383557v1_alt\t0\t89672\tAlt haplotype\nchr17_GL383563v3_alt\t0\t375691\tAlt haplotype\nchr17_KI270862v1_alt\t0\t391357\tAlt haplotype\nchr17_KI270861v1_alt\t0\t196688\tAlt haplotype\nchr17_KI270857v1_alt\t0\t2877074\tAlt haplotype\nchr17_JH159146v1_alt\t0\t278131\tAlt haplotype\nchr17_JH159147v1_alt\t0\t70345\tAlt haplotype\nchr17_GL383564v2_alt\t0\t133151\tAlt haplotype\nchr17_GL000258v2_alt\t0\t1821992\tAlt haplotype\nchr17_GL383565v1_alt\t0\t223995\tAlt haplotype\nchr17_KI270858v1_alt\t0\t235827\tAlt haplotype\nchr17_KI270859v1_alt\t0\t108763\tAlt haplotype\nchr17_GL383566v1_alt\t0\t90219\tAlt haplotype\nchr17_KI270860v1_alt\t0\t178921\tAlt haplotype\nchr18_KI270864v1_alt\t0\t111737\tAlt haplotype\nchr18_GL383567v1_alt\t0\t289831\tAlt haplotype\nchr18_GL383570v1_alt\t0\t164789\tAlt haplotype\nchr18_GL383571v1_alt\t0\t198278\tAlt haplotype\nchr18_GL383568v1_alt\t0\t104552\tAlt haplotype\nchr18_GL383569v1_alt\t0\t167950\tAlt haplotype\nchr18_GL383572v1_alt\t0\t159547\tAlt haplotype\nchr18_KI270863v1_alt\t0\t167999\tAlt haplotype\nchr19_KI270868v1_alt\t0\t61734\tAlt haplotype\nchr19_KI270865v1_alt\t0\t52969\tAlt haplotype\nchr19_GL383573v1_alt\t0\t385657\tAlt haplotype\nchr19_GL383575v2_alt\t0\t170222\tAlt haplotype\nchr19_GL383576v1_alt\t0\t188024\tAlt haplotype\nchr19_GL383574v1_alt\t0\t155864\tAlt haplotype\nchr19_KI270866v1_alt\t0\t43156\tAlt haplotype\nchr19_KI270867v1_alt\t0\t233762\tAlt haplotype\nchr19_GL949746v1_alt\t0\t987716\tAlt haplotype\nchr20_GL383577v2_alt\t0\t128386\tAlt haplotype\nchr20_KI270869v1_alt\t0\t118774\tAlt haplotype\nchr20_KI270871v1_alt\t0\t58661\tAlt haplotype\nchr20_KI270870v1_alt\t0\t183433\tAlt haplotype\nchr21_GL383578v2_alt\t0\t63917\tAlt haplotype\nchr21_KI270874v1_alt\t0\t166743\tAlt haplotype\nchr21_KI270873v1_alt\t0\t143900\tAlt haplotype\nchr21_GL383579v2_alt\t0\t201197\tAlt haplotype\nchr21_GL383580v2_alt\t0\t74653\tAlt haplotype\nchr21_GL383581v2_alt\t0\t116689\tAlt haplotype\nchr21_KI270872v1_alt\t0\t82692\tAlt haplotype\nchr22_KI270875v1_alt\t0\t259914\tAlt haplotype\nchr22_KI270878v1_alt\t0\t186262\tAlt haplotype\nchr22_KI270879v1_alt\t0\t304135\tAlt haplotype\nchr22_KI270876v1_alt\t0\t263666\tAlt haplotype\nchr22_KI270877v1_alt\t0\t101331\tAlt haplotype\nchr22_GL383583v2_alt\t0\t96924\tAlt haplotype\nchr22_GL383582v2_alt\t0\t162811\tAlt haplotype\nchrX_KI270880v1_alt\t0\t284869\tAlt haplotype\nchrX_KI270881v1_alt\t0\t144206\tAlt haplotype\nchr19_KI270882v1_alt\t0\t248807\tAlt haplotype\nchr19_KI270883v1_alt\t0\t170399\tAlt haplotype\nchr19_KI270884v1_alt\t0\t157053\tAlt haplotype\nchr19_KI270885v1_alt\t0\t171027\tAlt haplotype\nchr19_KI270886v1_alt\t0\t204239\tAlt haplotype\nchr19_KI270887v1_alt\t0\t209512\tAlt haplotype\nchr19_KI270888v1_alt\t0\t155532\tAlt haplotype\nchr19_KI270889v1_alt\t0\t170698\tAlt haplotype\nchr19_KI270890v1_alt\t0\t184499\tAlt haplotype\nchr19_KI270891v1_alt\t0\t170680\tAlt haplotype\nchr1_KI270892v1_alt\t0\t162212\tAlt haplotype\nchr2_KI270894v1_alt\t0\t214158\tAlt haplotype\nchr2_KI270893v1_alt\t0\t161218\tAlt haplotype\nchr3_KI270895v1_alt\t0\t162896\tAlt haplotype\nchr4_KI270896v1_alt\t0\t378547\tAlt haplotype\nchr5_KI270897v1_alt\t0\t1144418\tAlt haplotype\nchr5_KI270898v1_alt\t0\t130957\tAlt haplotype\nchr6_GL000251v2_alt\t0\t4795265\tAlt haplotype\nchr7_KI270899v1_alt\t0\t190869\tAlt haplotype\nchr8_KI270901v1_alt\t0\t136959\tAlt haplotype\nchr8_KI270900v1_alt\t0\t318687\tAlt haplotype\nchr11_KI270902v1_alt\t0\t106711\tAlt haplotype\nchr11_KI270903v1_alt\t0\t214625\tAlt haplotype\nchr12_KI270904v1_alt\t0\t572349\tAlt haplotype\nchr15_KI270906v1_alt\t0\t196384\tAlt haplotype\nchr15_KI270905v1_alt\t0\t5161414\tAlt haplotype\nchr17_KI270907v1_alt\t0\t137721\tAlt haplotype\nchr17_KI270910v1_alt\t0\t157099\tAlt haplotype\nchr17_KI270909v1_alt\t0\t325800\tAlt haplotype\nchr17_JH159148v1_alt\t0\t88070\tAlt haplotype\nchr17_KI270908v1_alt\t0\t1423190\tAlt haplotype\nchr18_KI270912v1_alt\t0\t174061\tAlt haplotype\nchr18_KI270911v1_alt\t0\t157710\tAlt haplotype\nchr19_GL949747v2_alt\t0\t729520\tAlt haplotype\nchr22_KB663609v1_alt\t0\t74013\tAlt haplotype\nchrX_KI270913v1_alt\t0\t274009\tAlt haplotype\nchr19_KI270914v1_alt\t0\t205194\tAlt haplotype\nchr19_KI270915v1_alt\t0\t170665\tAlt haplotype\nchr19_KI270916v1_alt\t0\t184516\tAlt haplotype\nchr19_KI270917v1_alt\t0\t190932\tAlt haplotype\nchr19_KI270918v1_alt\t0\t123111\tAlt haplotype\nchr19_KI270919v1_alt\t0\t170701\tAlt haplotype\nchr19_KI270920v1_alt\t0\t198005\tAlt haplotype\nchr19_KI270921v1_alt\t0\t282224\tAlt haplotype\nchr19_KI270922v1_alt\t0\t187935\tAlt haplotype\nchr19_KI270923v1_alt\t0\t189352\tAlt haplotype\nchr3_KI270924v1_alt\t0\t166540\tAlt haplotype\nchr4_KI270925v1_alt\t0\t555799\tAlt haplotype\nchr6_GL000252v2_alt\t0\t4604811\tAlt haplotype\nchr8_KI270926v1_alt\t0\t229282\tAlt haplotype\nchr11_KI270927v1_alt\t0\t218612\tAlt haplotype\nchr19_GL949748v2_alt\t0\t1064304\tAlt haplotype\nchr22_KI270928v1_alt\t0\t176103\tAlt haplotype\nchr19_KI270929v1_alt\t0\t186203\tAlt haplotype\nchr19_KI270930v1_alt\t0\t200773\tAlt haplotype\nchr19_KI270931v1_alt\t0\t170148\tAlt haplotype\nchr19_KI270932v1_alt\t0\t215732\tAlt haplotype\nchr19_KI270933v1_alt\t0\t170537\tAlt haplotype\nchr19_GL000209v2_alt\t0\t177381\tAlt haplotype\nchr3_KI270934v1_alt\t0\t163458\tAlt haplotype\nchr6_GL000253v2_alt\t0\t4677643\tAlt haplotype\nchr19_GL949749v2_alt\t0\t1091841\tAlt haplotype\nchr3_KI270935v1_alt\t0\t197351\tAlt haplotype\nchr6_GL000254v2_alt\t0\t4827813\tAlt haplotype\nchr19_GL949750v2_alt\t0\t1066390\tAlt haplotype\nchr3_KI270936v1_alt\t0\t164170\tAlt haplotype\nchr6_GL000255v2_alt\t0\t4606388\tAlt haplotype\nchr19_GL949751v2_alt\t0\t1002683\tAlt haplotype\nchr3_KI270937v1_alt\t0\t165607\tAlt haplotype\nchr6_GL000256v2_alt\t0\t4929269\tAlt haplotype\nchr19_GL949752v1_alt\t0\t987100\tAlt haplotype\nchr6_KI270758v1_alt\t0\t76752\tAlt haplotype\nchr19_GL949753v2_alt\t0\t796479\tAlt haplotype\nchr19_KI270938v1_alt\t0\t1066800\tAlt haplotype\nchrEBV\t0\t171823\tEBV\nchrUn_KN707606v1_decoy\t0\t2200\tDecoy\nchrUn_KN707607v1_decoy\t0\t3033\tDecoy\nchrUn_KN707608v1_decoy\t0\t3112\tDecoy\nchrUn_KN707609v1_decoy\t0\t1642\tDecoy\nchrUn_KN707610v1_decoy\t0\t1393\tDecoy\nchrUn_KN707611v1_decoy\t0\t1103\tDecoy\nchrUn_KN707612v1_decoy\t0\t1039\tDecoy\nchrUn_KN707613v1_decoy\t0\t1619\tDecoy\nchrUn_KN707614v1_decoy\t0\t3122\tDecoy\nchrUn_KN707615v1_decoy\t0\t1934\tDecoy\nchrUn_KN707616v1_decoy\t0\t3111\tDecoy\nchrUn_KN707617v1_decoy\t0\t2545\tDecoy\nchrUn_KN707618v1_decoy\t0\t2295\tDecoy\nchrUn_KN707619v1_decoy\t0\t1551\tDecoy\nchrUn_KN707620v1_decoy\t0\t2046\tDecoy\nchrUn_KN707621v1_decoy\t0\t1222\tDecoy\nchrUn_KN707622v1_decoy\t0\t1535\tDecoy\nchrUn_KN707623v1_decoy\t0\t3784\tDecoy\nchrUn_KN707624v1_decoy\t0\t1329\tDecoy\nchrUn_KN707625v1_decoy\t0\t1238\tDecoy\nchrUn_KN707626v1_decoy\t0\t5623\tDecoy\nchrUn_KN707627v1_decoy\t0\t5821\tDecoy\nchrUn_KN707628v1_decoy\t0\t2960\tDecoy\nchrUn_KN707629v1_decoy\t0\t1848\tDecoy\nchrUn_KN707630v1_decoy\t0\t2315\tDecoy\nchrUn_KN707631v1_decoy\t0\t1945\tDecoy\nchrUn_KN707632v1_decoy\t0\t1424\tDecoy\nchrUn_KN707633v1_decoy\t0\t1274\tDecoy\nchrUn_KN707634v1_decoy\t0\t1007\tDecoy\nchrUn_KN707635v1_decoy\t0\t1414\tDecoy\nchrUn_KN707636v1_decoy\t0\t1725\tDecoy\nchrUn_KN707637v1_decoy\t0\t5354\tDecoy\nchrUn_KN707638v1_decoy\t0\t2189\tDecoy\nchrUn_KN707639v1_decoy\t0\t1294\tDecoy\nchrUn_KN707640v1_decoy\t0\t1831\tDecoy\nchrUn_KN707641v1_decoy\t0\t1647\tDecoy\nchrUn_KN707642v1_decoy\t0\t2943\tDecoy\nchrUn_KN707643v1_decoy\t0\t2857\tDecoy\nchrUn_KN707644v1_decoy\t0\t1030\tDecoy\nchrUn_KN707645v1_decoy\t0\t1070\tDecoy\nchrUn_KN707646v1_decoy\t0\t1735\tDecoy\nchrUn_KN707647v1_decoy\t0\t1982\tDecoy\nchrUn_KN707648v1_decoy\t0\t1564\tDecoy\nchrUn_KN707649v1_decoy\t0\t1775\tDecoy\nchrUn_KN707650v1_decoy\t0\t1540\tDecoy\nchrUn_KN707651v1_decoy\t0\t2013\tDecoy\nchrUn_KN707652v1_decoy\t0\t1176\tDecoy\nchrUn_KN707653v1_decoy\t0\t1890\tDecoy\nchrUn_KN707654v1_decoy\t0\t3644\tDecoy\nchrUn_KN707655v1_decoy\t0\t2785\tDecoy\nchrUn_KN707656v1_decoy\t0\t1017\tDecoy\nchrUn_KN707657v1_decoy\t0\t1068\tDecoy\nchrUn_KN707658v1_decoy\t0\t1007\tDecoy\nchrUn_KN707659v1_decoy\t0\t2605\tDecoy\nchrUn_KN707660v1_decoy\t0\t8410\tDecoy\nchrUn_KN707661v1_decoy\t0\t5534\tDecoy\nchrUn_KN707662v1_decoy\t0\t2173\tDecoy\nchrUn_KN707663v1_decoy\t0\t1065\tDecoy\nchrUn_KN707664v1_decoy\t0\t8683\tDecoy\nchrUn_KN707665v1_decoy\t0\t2670\tDecoy\nchrUn_KN707666v1_decoy\t0\t2420\tDecoy\nchrUn_KN707667v1_decoy\t0\t2189\tDecoy\nchrUn_KN707668v1_decoy\t0\t2093\tDecoy\nchrUn_KN707669v1_decoy\t0\t1184\tDecoy\nchrUn_KN707670v1_decoy\t0\t1205\tDecoy\nchrUn_KN707671v1_decoy\t0\t2786\tDecoy\nchrUn_KN707672v1_decoy\t0\t2794\tDecoy\nchrUn_KN707673v1_decoy\t0\t19544\tDecoy\nchrUn_KN707674v1_decoy\t0\t2848\tDecoy\nchrUn_KN707675v1_decoy\t0\t10556\tDecoy\nchrUn_KN707676v1_decoy\t0\t9066\tDecoy\nchrUn_KN707677v1_decoy\t0\t7267\tDecoy\nchrUn_KN707678v1_decoy\t0\t2462\tDecoy\nchrUn_KN707679v1_decoy\t0\t1774\tDecoy\nchrUn_KN707680v1_decoy\t0\t1297\tDecoy\nchrUn_KN707681v1_decoy\t0\t4379\tDecoy\nchrUn_KN707682v1_decoy\t0\t4208\tDecoy\nchrUn_KN707683v1_decoy\t0\t4068\tDecoy\nchrUn_KN707684v1_decoy\t0\t2940\tDecoy\nchrUn_KN707685v1_decoy\t0\t3938\tDecoy\nchrUn_KN707686v1_decoy\t0\t2072\tDecoy\nchrUn_KN707687v1_decoy\t0\t1136\tDecoy\nchrUn_KN707688v1_decoy\t0\t4248\tDecoy\nchrUn_KN707689v1_decoy\t0\t5823\tDecoy\nchrUn_KN707690v1_decoy\t0\t3715\tDecoy\nchrUn_KN707691v1_decoy\t0\t4885\tDecoy\nchrUn_KN707692v1_decoy\t0\t4813\tDecoy\nchrUn_KN707693v1_decoy\t0\t2899\tDecoy\nchrUn_KN707694v1_decoy\t0\t1228\tDecoy\nchrUn_KN707695v1_decoy\t0\t3119\tDecoy\nchrUn_KN707696v1_decoy\t0\t3828\tDecoy\nchrUn_KN707697v1_decoy\t0\t1186\tDecoy\nchrUn_KN707698v1_decoy\t0\t1908\tDecoy\nchrUn_KN707699v1_decoy\t0\t2795\tDecoy\nchrUn_KN707700v1_decoy\t0\t3703\tDecoy\nchrUn_KN707701v1_decoy\t0\t6722\tDecoy\nchrUn_KN707702v1_decoy\t0\t6466\tDecoy\nchrUn_KN707703v1_decoy\t0\t2235\tDecoy\nchrUn_KN707704v1_decoy\t0\t2871\tDecoy\nchrUn_KN707705v1_decoy\t0\t4632\tDecoy\nchrUn_KN707706v1_decoy\t0\t4225\tDecoy\nchrUn_KN707707v1_decoy\t0\t4339\tDecoy\nchrUn_KN707708v1_decoy\t0\t2305\tDecoy\nchrUn_KN707709v1_decoy\t0\t3273\tDecoy\nchrUn_KN707710v1_decoy\t0\t5701\tDecoy\nchrUn_KN707711v1_decoy\t0\t4154\tDecoy\nchrUn_KN707712v1_decoy\t0\t1243\tDecoy\nchrUn_KN707713v1_decoy\t0\t1308\tDecoy\nchrUn_KN707714v1_decoy\t0\t2922\tDecoy\nchrUn_KN707715v1_decoy\t0\t3044\tDecoy\nchrUn_KN707716v1_decoy\t0\t2888\tDecoy\nchrUn_KN707717v1_decoy\t0\t1742\tDecoy\nchrUn_KN707718v1_decoy\t0\t4969\tDecoy\nchrUn_KN707719v1_decoy\t0\t3270\tDecoy\nchrUn_KN707720v1_decoy\t0\t6028\tDecoy\nchrUn_KN707721v1_decoy\t0\t1105\tDecoy\nchrUn_KN707722v1_decoy\t0\t2884\tDecoy\nchrUn_KN707723v1_decoy\t0\t1124\tDecoy\nchrUn_KN707724v1_decoy\t0\t1454\tDecoy\nchrUn_KN707725v1_decoy\t0\t2565\tDecoy\nchrUn_KN707726v1_decoy\t0\t2149\tDecoy\nchrUn_KN707727v1_decoy\t0\t2630\tDecoy\nchrUn_KN707728v1_decoy\t0\t14625\tDecoy\nchrUn_KN707729v1_decoy\t0\t7431\tDecoy\nchrUn_KN707730v1_decoy\t0\t5776\tDecoy\nchrUn_KN707731v1_decoy\t0\t4820\tDecoy\nchrUn_KN707732v1_decoy\t0\t1227\tDecoy\nchrUn_KN707733v1_decoy\t0\t7503\tDecoy\nchrUn_KN707734v1_decoy\t0\t9652\tDecoy\nchrUn_KN707735v1_decoy\t0\t1091\tDecoy\nchrUn_KN707736v1_decoy\t0\t2467\tDecoy\nchrUn_KN707737v1_decoy\t0\t1270\tDecoy\nchrUn_KN707738v1_decoy\t0\t4365\tDecoy\nchrUn_KN707739v1_decoy\t0\t4284\tDecoy\nchrUn_KN707740v1_decoy\t0\t10282\tDecoy\nchrUn_KN707741v1_decoy\t0\t5601\tDecoy\nchrUn_KN707742v1_decoy\t0\t4758\tDecoy\nchrUn_KN707743v1_decoy\t0\t1624\tDecoy\nchrUn_KN707744v1_decoy\t0\t4024\tDecoy\nchrUn_KN707745v1_decoy\t0\t1276\tDecoy\nchrUn_KN707746v1_decoy\t0\t5083\tDecoy\nchrUn_KN707747v1_decoy\t0\t2075\tDecoy\nchrUn_KN707748v1_decoy\t0\t3553\tDecoy\nchrUn_KN707749v1_decoy\t0\t7010\tDecoy\nchrUn_KN707750v1_decoy\t0\t4718\tDecoy\nchrUn_KN707751v1_decoy\t0\t3546\tDecoy\nchrUn_KN707752v1_decoy\t0\t2873\tDecoy\nchrUn_KN707753v1_decoy\t0\t2144\tDecoy\nchrUn_KN707754v1_decoy\t0\t2243\tDecoy\nchrUn_KN707755v1_decoy\t0\t5343\tDecoy\nchrUn_KN707756v1_decoy\t0\t4877\tDecoy\nchrUn_KN707757v1_decoy\t0\t3034\tDecoy\nchrUn_KN707758v1_decoy\t0\t2826\tDecoy\nchrUn_KN707759v1_decoy\t0\t1221\tDecoy\nchrUn_KN707760v1_decoy\t0\t1169\tDecoy\nchrUn_KN707761v1_decoy\t0\t2319\tDecoy\nchrUn_KN707762v1_decoy\t0\t3450\tDecoy\nchrUn_KN707763v1_decoy\t0\t2674\tDecoy\nchrUn_KN707764v1_decoy\t0\t3912\tDecoy\nchrUn_KN707765v1_decoy\t0\t6020\tDecoy\nchrUn_KN707766v1_decoy\t0\t2303\tDecoy\nchrUn_KN707767v1_decoy\t0\t2552\tDecoy\nchrUn_KN707768v1_decoy\t0\t3656\tDecoy\nchrUn_KN707769v1_decoy\t0\t1591\tDecoy\nchrUn_KN707770v1_decoy\t0\t1209\tDecoy\nchrUn_KN707771v1_decoy\t0\t3176\tDecoy\nchrUn_KN707772v1_decoy\t0\t8915\tDecoy\nchrUn_KN707773v1_decoy\t0\t4902\tDecoy\nchrUn_KN707774v1_decoy\t0\t3324\tDecoy\nchrUn_KN707775v1_decoy\t0\t5997\tDecoy\nchrUn_KN707776v1_decoy\t0\t2618\tDecoy\nchrUn_KN707777v1_decoy\t0\t10311\tDecoy\nchrUn_KN707778v1_decoy\t0\t2440\tDecoy\nchrUn_KN707779v1_decoy\t0\t12444\tDecoy\nchrUn_KN707780v1_decoy\t0\t5691\tDecoy\nchrUn_KN707781v1_decoy\t0\t2717\tDecoy\nchrUn_KN707782v1_decoy\t0\t5277\tDecoy\nchrUn_KN707783v1_decoy\t0\t4373\tDecoy\nchrUn_KN707784v1_decoy\t0\t3224\tDecoy\nchrUn_KN707785v1_decoy\t0\t2631\tDecoy\nchrUn_KN707786v1_decoy\t0\t5385\tDecoy\nchrUn_KN707787v1_decoy\t0\t3678\tDecoy\nchrUn_KN707788v1_decoy\t0\t1412\tDecoy\nchrUn_KN707789v1_decoy\t0\t1443\tDecoy\nchrUn_KN707790v1_decoy\t0\t1098\tDecoy\nchrUn_KN707791v1_decoy\t0\t3240\tDecoy\nchrUn_KN707792v1_decoy\t0\t1915\tDecoy\nchrUn_KN707793v1_decoy\t0\t4667\tDecoy\nchrUn_KN707794v1_decoy\t0\t7219\tDecoy\nchrUn_KN707795v1_decoy\t0\t3277\tDecoy\nchrUn_KN707796v1_decoy\t0\t3473\tDecoy\nchrUn_KN707797v1_decoy\t0\t4243\tDecoy\nchrUn_KN707798v1_decoy\t0\t17599\tDecoy\nchrUn_KN707799v1_decoy\t0\t5095\tDecoy\nchrUn_KN707800v1_decoy\t0\t2237\tDecoy\nchrUn_KN707801v1_decoy\t0\t2901\tDecoy\nchrUn_KN707802v1_decoy\t0\t2666\tDecoy\nchrUn_KN707803v1_decoy\t0\t5336\tDecoy\nchrUn_KN707804v1_decoy\t0\t4383\tDecoy\nchrUn_KN707805v1_decoy\t0\t5446\tDecoy\nchrUn_KN707806v1_decoy\t0\t6252\tDecoy\nchrUn_KN707807v1_decoy\t0\t4616\tDecoy\nchrUn_KN707808v1_decoy\t0\t3021\tDecoy\nchrUn_KN707809v1_decoy\t0\t3667\tDecoy\nchrUn_KN707810v1_decoy\t0\t4563\tDecoy\nchrUn_KN707811v1_decoy\t0\t1120\tDecoy\nchrUn_KN707812v1_decoy\t0\t3845\tDecoy\nchrUn_KN707813v1_decoy\t0\t2272\tDecoy\nchrUn_KN707814v1_decoy\t0\t4764\tDecoy\nchrUn_KN707815v1_decoy\t0\t5410\tDecoy\nchrUn_KN707816v1_decoy\t0\t7150\tDecoy\nchrUn_KN707817v1_decoy\t0\t1762\tDecoy\nchrUn_KN707818v1_decoy\t0\t1207\tDecoy\nchrUn_KN707819v1_decoy\t0\t1331\tDecoy\nchrUn_KN707820v1_decoy\t0\t8307\tDecoy\nchrUn_KN707821v1_decoy\t0\t2276\tDecoy\nchrUn_KN707822v1_decoy\t0\t2575\tDecoy\nchrUn_KN707823v1_decoy\t0\t3970\tDecoy\nchrUn_KN707824v1_decoy\t0\t1352\tDecoy\nchrUn_KN707825v1_decoy\t0\t3040\tDecoy\nchrUn_KN707826v1_decoy\t0\t2070\tDecoy\nchrUn_KN707827v1_decoy\t0\t2913\tDecoy\nchrUn_KN707828v1_decoy\t0\t2389\tDecoy\nchrUn_KN707829v1_decoy\t0\t1835\tDecoy\nchrUn_KN707830v1_decoy\t0\t4807\tDecoy\nchrUn_KN707831v1_decoy\t0\t2201\tDecoy\nchrUn_KN707832v1_decoy\t0\t1265\tDecoy\nchrUn_KN707833v1_decoy\t0\t1961\tDecoy\nchrUn_KN707834v1_decoy\t0\t1064\tDecoy\nchrUn_KN707835v1_decoy\t0\t1932\tDecoy\nchrUn_KN707836v1_decoy\t0\t3213\tDecoy\nchrUn_KN707837v1_decoy\t0\t1178\tDecoy\nchrUn_KN707838v1_decoy\t0\t2926\tDecoy\nchrUn_KN707839v1_decoy\t0\t1038\tDecoy\nchrUn_KN707840v1_decoy\t0\t3298\tDecoy\nchrUn_KN707841v1_decoy\t0\t8992\tDecoy\nchrUn_KN707842v1_decoy\t0\t6698\tDecoy\nchrUn_KN707843v1_decoy\t0\t4880\tDecoy\nchrUn_KN707844v1_decoy\t0\t1766\tDecoy\nchrUn_KN707845v1_decoy\t0\t3532\tDecoy\nchrUn_KN707846v1_decoy\t0\t2297\tDecoy\nchrUn_KN707847v1_decoy\t0\t1234\tDecoy\nchrUn_KN707848v1_decoy\t0\t1205\tDecoy\nchrUn_KN707849v1_decoy\t0\t2790\tDecoy\nchrUn_KN707850v1_decoy\t0\t2006\tDecoy\nchrUn_KN707851v1_decoy\t0\t4593\tDecoy\nchrUn_KN707852v1_decoy\t0\t1579\tDecoy\nchrUn_KN707853v1_decoy\t0\t9597\tDecoy\nchrUn_KN707854v1_decoy\t0\t10451\tDecoy\nchrUn_KN707855v1_decoy\t0\t3219\tDecoy\nchrUn_KN707856v1_decoy\t0\t2300\tDecoy\nchrUn_KN707857v1_decoy\t0\t5985\tDecoy\nchrUn_KN707858v1_decoy\t0\t2959\tDecoy\nchrUn_KN707859v1_decoy\t0\t1340\tDecoy\nchrUn_KN707860v1_decoy\t0\t3148\tDecoy\nchrUn_KN707861v1_decoy\t0\t2242\tDecoy\nchrUn_KN707862v1_decoy\t0\t16513\tDecoy\nchrUn_KN707863v1_decoy\t0\t7821\tDecoy\nchrUn_KN707864v1_decoy\t0\t2159\tDecoy\nchrUn_KN707865v1_decoy\t0\t2114\tDecoy\nchrUn_KN707866v1_decoy\t0\t4109\tDecoy\nchrUn_KN707867v1_decoy\t0\t1544\tDecoy\nchrUn_KN707868v1_decoy\t0\t1005\tDecoy\nchrUn_KN707869v1_decoy\t0\t8632\tDecoy\nchrUn_KN707870v1_decoy\t0\t1012\tDecoy\nchrUn_KN707871v1_decoy\t0\t4728\tDecoy\nchrUn_KN707872v1_decoy\t0\t2165\tDecoy\nchrUn_KN707873v1_decoy\t0\t7591\tDecoy\nchrUn_KN707874v1_decoy\t0\t5202\tDecoy\nchrUn_KN707875v1_decoy\t0\t4241\tDecoy\nchrUn_KN707876v1_decoy\t0\t4131\tDecoy\nchrUn_KN707877v1_decoy\t0\t2272\tDecoy\nchrUn_KN707878v1_decoy\t0\t2085\tDecoy\nchrUn_KN707879v1_decoy\t0\t4346\tDecoy\nchrUn_KN707880v1_decoy\t0\t1208\tDecoy\nchrUn_KN707881v1_decoy\t0\t4543\tDecoy\nchrUn_KN707882v1_decoy\t0\t2772\tDecoy\nchrUn_KN707883v1_decoy\t0\t2490\tDecoy\nchrUn_KN707884v1_decoy\t0\t4568\tDecoy\nchrUn_KN707885v1_decoy\t0\t1776\tDecoy\nchrUn_KN707886v1_decoy\t0\t2699\tDecoy\nchrUn_KN707887v1_decoy\t0\t3534\tDecoy\nchrUn_KN707888v1_decoy\t0\t2424\tDecoy\nchrUn_KN707889v1_decoy\t0\t1747\tDecoy\nchrUn_KN707890v1_decoy\t0\t1088\tDecoy\nchrUn_KN707891v1_decoy\t0\t1143\tDecoy\nchrUn_KN707892v1_decoy\t0\t2530\tDecoy\nchrUn_KN707893v1_decoy\t0\t8049\tDecoy\nchrUn_KN707894v1_decoy\t0\t1366\tDecoy\nchrUn_KN707895v1_decoy\t0\t4284\tDecoy\nchrUn_KN707896v1_decoy\t0\t33125\tDecoy\nchrUn_KN707897v1_decoy\t0\t2137\tDecoy\nchrUn_KN707898v1_decoy\t0\t3840\tDecoy\nchrUn_KN707899v1_decoy\t0\t3087\tDecoy\nchrUn_KN707900v1_decoy\t0\t2041\tDecoy\nchrUn_KN707901v1_decoy\t0\t3344\tDecoy\nchrUn_KN707902v1_decoy\t0\t2921\tDecoy\nchrUn_KN707903v1_decoy\t0\t6581\tDecoy\nchrUn_KN707904v1_decoy\t0\t3968\tDecoy\nchrUn_KN707905v1_decoy\t0\t2339\tDecoy\nchrUn_KN707906v1_decoy\t0\t1243\tDecoy\nchrUn_KN707907v1_decoy\t0\t7776\tDecoy\nchrUn_KN707908v1_decoy\t0\t19837\tDecoy\nchrUn_KN707909v1_decoy\t0\t1737\tDecoy\nchrUn_KN707910v1_decoy\t0\t1098\tDecoy\nchrUn_KN707911v1_decoy\t0\t1893\tDecoy\nchrUn_KN707912v1_decoy\t0\t1281\tDecoy\nchrUn_KN707913v1_decoy\t0\t1527\tDecoy\nchrUn_KN707914v1_decoy\t0\t2055\tDecoy\nchrUn_KN707915v1_decoy\t0\t2527\tDecoy\nchrUn_KN707916v1_decoy\t0\t3275\tDecoy\nchrUn_KN707917v1_decoy\t0\t1265\tDecoy\nchrUn_KN707918v1_decoy\t0\t2623\tDecoy\nchrUn_KN707919v1_decoy\t0\t4850\tDecoy\nchrUn_KN707920v1_decoy\t0\t3584\tDecoy\nchrUn_KN707921v1_decoy\t0\t2561\tDecoy\nchrUn_KN707922v1_decoy\t0\t3041\tDecoy\nchrUn_KN707923v1_decoy\t0\t1409\tDecoy\nchrUn_KN707924v1_decoy\t0\t4596\tDecoy\nchrUn_KN707925v1_decoy\t0\t11555\tDecoy\nchrUn_KN707926v1_decoy\t0\t1266\tDecoy\nchrUn_KN707927v1_decoy\t0\t1079\tDecoy\nchrUn_KN707928v1_decoy\t0\t1087\tDecoy\nchrUn_KN707929v1_decoy\t0\t1226\tDecoy\nchrUn_KN707930v1_decoy\t0\t1131\tDecoy\nchrUn_KN707931v1_decoy\t0\t1199\tDecoy\nchrUn_KN707932v1_decoy\t0\t1084\tDecoy\nchrUn_KN707933v1_decoy\t0\t2038\tDecoy\nchrUn_KN707934v1_decoy\t0\t1070\tDecoy\nchrUn_KN707935v1_decoy\t0\t1312\tDecoy\nchrUn_KN707936v1_decoy\t0\t4031\tDecoy\nchrUn_KN707937v1_decoy\t0\t7445\tDecoy\nchrUn_KN707938v1_decoy\t0\t1770\tDecoy\nchrUn_KN707939v1_decoy\t0\t5600\tDecoy\nchrUn_KN707940v1_decoy\t0\t1882\tDecoy\nchrUn_KN707941v1_decoy\t0\t1170\tDecoy\nchrUn_KN707942v1_decoy\t0\t1300\tDecoy\nchrUn_KN707943v1_decoy\t0\t5325\tDecoy\nchrUn_KN707944v1_decoy\t0\t2043\tDecoy\nchrUn_KN707945v1_decoy\t0\t1072\tDecoy\nchrUn_KN707946v1_decoy\t0\t2463\tDecoy\nchrUn_KN707947v1_decoy\t0\t1010\tDecoy\nchrUn_KN707948v1_decoy\t0\t1432\tDecoy\nchrUn_KN707949v1_decoy\t0\t1162\tDecoy\nchrUn_KN707950v1_decoy\t0\t1095\tDecoy\nchrUn_KN707951v1_decoy\t0\t1118\tDecoy\nchrUn_KN707952v1_decoy\t0\t1383\tDecoy\nchrUn_KN707953v1_decoy\t0\t2289\tDecoy\nchrUn_KN707954v1_decoy\t0\t1648\tDecoy\nchrUn_KN707955v1_decoy\t0\t2203\tDecoy\nchrUn_KN707956v1_decoy\t0\t3270\tDecoy\nchrUn_KN707957v1_decoy\t0\t11499\tDecoy\nchrUn_KN707958v1_decoy\t0\t2474\tDecoy\nchrUn_KN707959v1_decoy\t0\t2294\tDecoy\nchrUn_KN707960v1_decoy\t0\t1238\tDecoy\nchrUn_KN707961v1_decoy\t0\t3410\tDecoy\nchrUn_KN707962v1_decoy\t0\t1523\tDecoy\nchrUn_KN707963v1_decoy\t0\t62955\tDecoy\nchrUn_KN707964v1_decoy\t0\t6282\tDecoy\nchrUn_KN707965v1_decoy\t0\t3836\tDecoy\nchrUn_KN707966v1_decoy\t0\t6486\tDecoy\nchrUn_KN707967v1_decoy\t0\t15368\tDecoy\nchrUn_KN707968v1_decoy\t0\t9572\tDecoy\nchrUn_KN707969v1_decoy\t0\t6413\tDecoy\nchrUn_KN707970v1_decoy\t0\t4104\tDecoy\nchrUn_KN707971v1_decoy\t0\t12943\tDecoy\nchrUn_KN707972v1_decoy\t0\t4650\tDecoy\nchrUn_KN707973v1_decoy\t0\t3080\tDecoy\nchrUn_KN707974v1_decoy\t0\t3134\tDecoy\nchrUn_KN707975v1_decoy\t0\t6211\tDecoy\nchrUn_KN707976v1_decoy\t0\t1126\tDecoy\nchrUn_KN707977v1_decoy\t0\t1101\tDecoy\nchrUn_KN707978v1_decoy\t0\t1101\tDecoy\nchrUn_KN707979v1_decoy\t0\t2648\tDecoy\nchrUn_KN707980v1_decoy\t0\t2973\tDecoy\nchrUn_KN707981v1_decoy\t0\t2520\tDecoy\nchrUn_KN707982v1_decoy\t0\t2318\tDecoy\nchrUn_KN707983v1_decoy\t0\t2606\tDecoy\nchrUn_KN707984v1_decoy\t0\t2205\tDecoy\nchrUn_KN707985v1_decoy\t0\t2929\tDecoy\nchrUn_KN707986v1_decoy\t0\t3869\tDecoy\nchrUn_KN707987v1_decoy\t0\t1117\tDecoy\nchrUn_KN707988v1_decoy\t0\t2960\tDecoy\nchrUn_KN707989v1_decoy\t0\t1009\tDecoy\nchrUn_KN707990v1_decoy\t0\t4048\tDecoy\nchrUn_KN707991v1_decoy\t0\t2193\tDecoy\nchrUn_KN707992v1_decoy\t0\t1830\tDecoy\nchrUn_JTFH01000001v1_decoy\t0\t25139\tDecoy\nchrUn_JTFH01000002v1_decoy\t0\t18532\tDecoy\nchrUn_JTFH01000003v1_decoy\t0\t15240\tDecoy\nchrUn_JTFH01000004v1_decoy\t0\t13739\tDecoy\nchrUn_JTFH01000005v1_decoy\t0\t11297\tDecoy\nchrUn_JTFH01000006v1_decoy\t0\t10074\tDecoy\nchrUn_JTFH01000007v1_decoy\t0\t9891\tDecoy\nchrUn_JTFH01000008v1_decoy\t0\t9774\tDecoy\nchrUn_JTFH01000009v1_decoy\t0\t9727\tDecoy\nchrUn_JTFH01000010v1_decoy\t0\t9358\tDecoy\nchrUn_JTFH01000011v1_decoy\t0\t8920\tDecoy\nchrUn_JTFH01000012v1_decoy\t0\t8479\tDecoy\nchrUn_JTFH01000013v1_decoy\t0\t8312\tDecoy\nchrUn_JTFH01000014v1_decoy\t0\t8261\tDecoy\nchrUn_JTFH01000015v1_decoy\t0\t8131\tDecoy\nchrUn_JTFH01000016v1_decoy\t0\t8051\tDecoy\nchrUn_JTFH01000017v1_decoy\t0\t7832\tDecoy\nchrUn_JTFH01000018v1_decoy\t0\t7710\tDecoy\nchrUn_JTFH01000019v1_decoy\t0\t7702\tDecoy\nchrUn_JTFH01000020v1_decoy\t0\t7479\tDecoy\nchrUn_JTFH01000021v1_decoy\t0\t7368\tDecoy\nchrUn_JTFH01000022v1_decoy\t0\t7162\tDecoy\nchrUn_JTFH01000023v1_decoy\t0\t7065\tDecoy\nchrUn_JTFH01000024v1_decoy\t0\t7019\tDecoy\nchrUn_JTFH01000025v1_decoy\t0\t6997\tDecoy\nchrUn_JTFH01000026v1_decoy\t0\t6994\tDecoy\nchrUn_JTFH01000027v1_decoy\t0\t6979\tDecoy\nchrUn_JTFH01000028v1_decoy\t0\t6797\tDecoy\nchrUn_JTFH01000029v1_decoy\t0\t6525\tDecoy\nchrUn_JTFH01000030v1_decoy\t0\t6246\tDecoy\nchrUn_JTFH01000031v1_decoy\t0\t5926\tDecoy\nchrUn_JTFH01000032v1_decoy\t0\t5914\tDecoy\nchrUn_JTFH01000033v1_decoy\t0\t5898\tDecoy\nchrUn_JTFH01000034v1_decoy\t0\t5879\tDecoy\nchrUn_JTFH01000035v1_decoy\t0\t5834\tDecoy\nchrUn_JTFH01000036v1_decoy\t0\t5743\tDecoy\nchrUn_JTFH01000037v1_decoy\t0\t5577\tDecoy\nchrUn_JTFH01000038v1_decoy\t0\t5413\tDecoy\nchrUn_JTFH01000039v1_decoy\t0\t5250\tDecoy\nchrUn_JTFH01000040v1_decoy\t0\t5246\tDecoy\nchrUn_JTFH01000041v1_decoy\t0\t5118\tDecoy\nchrUn_JTFH01000042v1_decoy\t0\t5058\tDecoy\nchrUn_JTFH01000043v1_decoy\t0\t4959\tDecoy\nchrUn_JTFH01000044v1_decoy\t0\t4853\tDecoy\nchrUn_JTFH01000045v1_decoy\t0\t4828\tDecoy\nchrUn_JTFH01000046v1_decoy\t0\t4819\tDecoy\nchrUn_JTFH01000047v1_decoy\t0\t4809\tDecoy\nchrUn_JTFH01000048v1_decoy\t0\t4710\tDecoy\nchrUn_JTFH01000049v1_decoy\t0\t4680\tDecoy\nchrUn_JTFH01000050v1_decoy\t0\t4645\tDecoy\nchrUn_JTFH01000051v1_decoy\t0\t4514\tDecoy\nchrUn_JTFH01000052v1_decoy\t0\t4439\tDecoy\nchrUn_JTFH01000053v1_decoy\t0\t4416\tDecoy\nchrUn_JTFH01000054v1_decoy\t0\t4409\tDecoy\nchrUn_JTFH01000055v1_decoy\t0\t4392\tDecoy\nchrUn_JTFH01000056v1_decoy\t0\t4359\tDecoy\nchrUn_JTFH01000057v1_decoy\t0\t4319\tDecoy\nchrUn_JTFH01000058v1_decoy\t0\t4290\tDecoy\nchrUn_JTFH01000059v1_decoy\t0\t4242\tDecoy\nchrUn_JTFH01000060v1_decoy\t0\t4228\tDecoy\nchrUn_JTFH01000061v1_decoy\t0\t4222\tDecoy\nchrUn_JTFH01000062v1_decoy\t0\t4216\tDecoy\nchrUn_JTFH01000063v1_decoy\t0\t4210\tDecoy\nchrUn_JTFH01000064v1_decoy\t0\t4206\tDecoy\nchrUn_JTFH01000065v1_decoy\t0\t4102\tDecoy\nchrUn_JTFH01000066v1_decoy\t0\t4101\tDecoy\nchrUn_JTFH01000067v1_decoy\t0\t4083\tDecoy\nchrUn_JTFH01000068v1_decoy\t0\t3967\tDecoy\nchrUn_JTFH01000069v1_decoy\t0\t3955\tDecoy\nchrUn_JTFH01000070v1_decoy\t0\t3945\tDecoy\nchrUn_JTFH01000071v1_decoy\t0\t3930\tDecoy\nchrUn_JTFH01000072v1_decoy\t0\t3929\tDecoy\nchrUn_JTFH01000073v1_decoy\t0\t3924\tDecoy\nchrUn_JTFH01000074v1_decoy\t0\t3919\tDecoy\nchrUn_JTFH01000075v1_decoy\t0\t3908\tDecoy\nchrUn_JTFH01000076v1_decoy\t0\t3892\tDecoy\nchrUn_JTFH01000077v1_decoy\t0\t3890\tDecoy\nchrUn_JTFH01000078v1_decoy\t0\t3859\tDecoy\nchrUn_JTFH01000079v1_decoy\t0\t3846\tDecoy\nchrUn_JTFH01000080v1_decoy\t0\t3835\tDecoy\nchrUn_JTFH01000081v1_decoy\t0\t3830\tDecoy\nchrUn_JTFH01000082v1_decoy\t0\t3828\tDecoy\nchrUn_JTFH01000083v1_decoy\t0\t3825\tDecoy\nchrUn_JTFH01000084v1_decoy\t0\t3821\tDecoy\nchrUn_JTFH01000085v1_decoy\t0\t3809\tDecoy\nchrUn_JTFH01000086v1_decoy\t0\t3801\tDecoy\nchrUn_JTFH01000087v1_decoy\t0\t3799\tDecoy\nchrUn_JTFH01000088v1_decoy\t0\t3737\tDecoy\nchrUn_JTFH01000089v1_decoy\t0\t3701\tDecoy\nchrUn_JTFH01000090v1_decoy\t0\t3698\tDecoy\nchrUn_JTFH01000091v1_decoy\t0\t3692\tDecoy\nchrUn_JTFH01000092v1_decoy\t0\t3686\tDecoy\nchrUn_JTFH01000093v1_decoy\t0\t3677\tDecoy\nchrUn_JTFH01000094v1_decoy\t0\t3664\tDecoy\nchrUn_JTFH01000095v1_decoy\t0\t3613\tDecoy\nchrUn_JTFH01000096v1_decoy\t0\t3611\tDecoy\nchrUn_JTFH01000097v1_decoy\t0\t3606\tDecoy\nchrUn_JTFH01000098v1_decoy\t0\t3584\tDecoy\nchrUn_JTFH01000099v1_decoy\t0\t3581\tDecoy\nchrUn_JTFH01000100v1_decoy\t0\t3543\tDecoy\nchrUn_JTFH01000101v1_decoy\t0\t3528\tDecoy\nchrUn_JTFH01000102v1_decoy\t0\t3527\tDecoy\nchrUn_JTFH01000103v1_decoy\t0\t3496\tDecoy\nchrUn_JTFH01000104v1_decoy\t0\t3493\tDecoy\nchrUn_JTFH01000105v1_decoy\t0\t3484\tDecoy\nchrUn_JTFH01000106v1_decoy\t0\t3435\tDecoy\nchrUn_JTFH01000107v1_decoy\t0\t3391\tDecoy\nchrUn_JTFH01000108v1_decoy\t0\t3374\tDecoy\nchrUn_JTFH01000109v1_decoy\t0\t3371\tDecoy\nchrUn_JTFH01000110v1_decoy\t0\t3361\tDecoy\nchrUn_JTFH01000111v1_decoy\t0\t3351\tDecoy\nchrUn_JTFH01000112v1_decoy\t0\t3340\tDecoy\nchrUn_JTFH01000113v1_decoy\t0\t3320\tDecoy\nchrUn_JTFH01000114v1_decoy\t0\t3282\tDecoy\nchrUn_JTFH01000115v1_decoy\t0\t3278\tDecoy\nchrUn_JTFH01000116v1_decoy\t0\t3260\tDecoy\nchrUn_JTFH01000117v1_decoy\t0\t3258\tDecoy\nchrUn_JTFH01000118v1_decoy\t0\t3253\tDecoy\nchrUn_JTFH01000119v1_decoy\t0\t3247\tDecoy\nchrUn_JTFH01000120v1_decoy\t0\t3230\tDecoy\nchrUn_JTFH01000121v1_decoy\t0\t3224\tDecoy\nchrUn_JTFH01000122v1_decoy\t0\t3216\tDecoy\nchrUn_JTFH01000123v1_decoy\t0\t3212\tDecoy\nchrUn_JTFH01000124v1_decoy\t0\t3194\tDecoy\nchrUn_JTFH01000125v1_decoy\t0\t3189\tDecoy\nchrUn_JTFH01000126v1_decoy\t0\t3177\tDecoy\nchrUn_JTFH01000127v1_decoy\t0\t3176\tDecoy\nchrUn_JTFH01000128v1_decoy\t0\t3173\tDecoy\nchrUn_JTFH01000129v1_decoy\t0\t3170\tDecoy\nchrUn_JTFH01000130v1_decoy\t0\t3166\tDecoy\nchrUn_JTFH01000131v1_decoy\t0\t3163\tDecoy\nchrUn_JTFH01000132v1_decoy\t0\t3143\tDecoy\nchrUn_JTFH01000133v1_decoy\t0\t3137\tDecoy\nchrUn_JTFH01000134v1_decoy\t0\t3116\tDecoy\nchrUn_JTFH01000135v1_decoy\t0\t3106\tDecoy\nchrUn_JTFH01000136v1_decoy\t0\t3093\tDecoy\nchrUn_JTFH01000137v1_decoy\t0\t3079\tDecoy\nchrUn_JTFH01000138v1_decoy\t0\t3053\tDecoy\nchrUn_JTFH01000139v1_decoy\t0\t3051\tDecoy\nchrUn_JTFH01000140v1_decoy\t0\t3015\tDecoy\nchrUn_JTFH01000141v1_decoy\t0\t3012\tDecoy\nchrUn_JTFH01000142v1_decoy\t0\t3009\tDecoy\nchrUn_JTFH01000143v1_decoy\t0\t2997\tDecoy\nchrUn_JTFH01000144v1_decoy\t0\t2997\tDecoy\nchrUn_JTFH01000145v1_decoy\t0\t2983\tDecoy\nchrUn_JTFH01000146v1_decoy\t0\t2979\tDecoy\nchrUn_JTFH01000147v1_decoy\t0\t2967\tDecoy\nchrUn_JTFH01000148v1_decoy\t0\t2967\tDecoy\nchrUn_JTFH01000149v1_decoy\t0\t2966\tDecoy\nchrUn_JTFH01000150v1_decoy\t0\t2954\tDecoy\nchrUn_JTFH01000151v1_decoy\t0\t2952\tDecoy\nchrUn_JTFH01000152v1_decoy\t0\t2934\tDecoy\nchrUn_JTFH01000153v1_decoy\t0\t2918\tDecoy\nchrUn_JTFH01000154v1_decoy\t0\t2895\tDecoy\nchrUn_JTFH01000155v1_decoy\t0\t2887\tDecoy\nchrUn_JTFH01000156v1_decoy\t0\t2879\tDecoy\nchrUn_JTFH01000157v1_decoy\t0\t2878\tDecoy\nchrUn_JTFH01000158v1_decoy\t0\t2872\tDecoy\nchrUn_JTFH01000159v1_decoy\t0\t2868\tDecoy\nchrUn_JTFH01000160v1_decoy\t0\t2866\tDecoy\nchrUn_JTFH01000161v1_decoy\t0\t2865\tDecoy\nchrUn_JTFH01000162v1_decoy\t0\t2864\tDecoy\nchrUn_JTFH01000163v1_decoy\t0\t2859\tDecoy\nchrUn_JTFH01000164v1_decoy\t0\t2854\tDecoy\nchrUn_JTFH01000165v1_decoy\t0\t2830\tDecoy\nchrUn_JTFH01000166v1_decoy\t0\t2828\tDecoy\nchrUn_JTFH01000167v1_decoy\t0\t2824\tDecoy\nchrUn_JTFH01000168v1_decoy\t0\t2819\tDecoy\nchrUn_JTFH01000169v1_decoy\t0\t2813\tDecoy\nchrUn_JTFH01000170v1_decoy\t0\t2809\tDecoy\nchrUn_JTFH01000171v1_decoy\t0\t2802\tDecoy\nchrUn_JTFH01000172v1_decoy\t0\t2791\tDecoy\nchrUn_JTFH01000173v1_decoy\t0\t2783\tDecoy\nchrUn_JTFH01000174v1_decoy\t0\t2778\tDecoy\nchrUn_JTFH01000175v1_decoy\t0\t2777\tDecoy\nchrUn_JTFH01000176v1_decoy\t0\t2770\tDecoy\nchrUn_JTFH01000177v1_decoy\t0\t2769\tDecoy\nchrUn_JTFH01000178v1_decoy\t0\t2767\tDecoy\nchrUn_JTFH01000179v1_decoy\t0\t2763\tDecoy\nchrUn_JTFH01000180v1_decoy\t0\t2745\tDecoy\nchrUn_JTFH01000181v1_decoy\t0\t2742\tDecoy\nchrUn_JTFH01000182v1_decoy\t0\t2736\tDecoy\nchrUn_JTFH01000183v1_decoy\t0\t2729\tDecoy\nchrUn_JTFH01000184v1_decoy\t0\t2726\tDecoy\nchrUn_JTFH01000185v1_decoy\t0\t2719\tDecoy\nchrUn_JTFH01000186v1_decoy\t0\t2715\tDecoy\nchrUn_JTFH01000187v1_decoy\t0\t2708\tDecoy\nchrUn_JTFH01000188v1_decoy\t0\t2704\tDecoy\nchrUn_JTFH01000189v1_decoy\t0\t2692\tDecoy\nchrUn_JTFH01000190v1_decoy\t0\t2691\tDecoy\nchrUn_JTFH01000191v1_decoy\t0\t2690\tDecoy\nchrUn_JTFH01000192v1_decoy\t0\t2687\tDecoy\nchrUn_JTFH01000193v1_decoy\t0\t2677\tDecoy\nchrUn_JTFH01000194v1_decoy\t0\t2668\tDecoy\nchrUn_JTFH01000195v1_decoy\t0\t2668\tDecoy\nchrUn_JTFH01000196v1_decoy\t0\t2663\tDecoy\nchrUn_JTFH01000197v1_decoy\t0\t2655\tDecoy\nchrUn_JTFH01000198v1_decoy\t0\t2644\tDecoy\nchrUn_JTFH01000199v1_decoy\t0\t2642\tDecoy\nchrUn_JTFH01000200v1_decoy\t0\t2632\tDecoy\nchrUn_JTFH01000201v1_decoy\t0\t2632\tDecoy\nchrUn_JTFH01000202v1_decoy\t0\t2628\tDecoy\nchrUn_JTFH01000203v1_decoy\t0\t2623\tDecoy\nchrUn_JTFH01000204v1_decoy\t0\t2622\tDecoy\nchrUn_JTFH01000205v1_decoy\t0\t2619\tDecoy\nchrUn_JTFH01000206v1_decoy\t0\t2605\tDecoy\nchrUn_JTFH01000207v1_decoy\t0\t2603\tDecoy\nchrUn_JTFH01000208v1_decoy\t0\t2601\tDecoy\nchrUn_JTFH01000209v1_decoy\t0\t2598\tDecoy\nchrUn_JTFH01000210v1_decoy\t0\t2597\tDecoy\nchrUn_JTFH01000211v1_decoy\t0\t2596\tDecoy\nchrUn_JTFH01000212v1_decoy\t0\t2594\tDecoy\nchrUn_JTFH01000213v1_decoy\t0\t2586\tDecoy\nchrUn_JTFH01000214v1_decoy\t0\t2585\tDecoy\nchrUn_JTFH01000215v1_decoy\t0\t2583\tDecoy\nchrUn_JTFH01000216v1_decoy\t0\t2578\tDecoy\nchrUn_JTFH01000217v1_decoy\t0\t2569\tDecoy\nchrUn_JTFH01000218v1_decoy\t0\t2569\tDecoy\nchrUn_JTFH01000219v1_decoy\t0\t2551\tDecoy\nchrUn_JTFH01000220v1_decoy\t0\t2548\tDecoy\nchrUn_JTFH01000221v1_decoy\t0\t2548\tDecoy\nchrUn_JTFH01000222v1_decoy\t0\t2546\tDecoy\nchrUn_JTFH01000223v1_decoy\t0\t2545\tDecoy\nchrUn_JTFH01000224v1_decoy\t0\t2534\tDecoy\nchrUn_JTFH01000225v1_decoy\t0\t2533\tDecoy\nchrUn_JTFH01000226v1_decoy\t0\t2522\tDecoy\nchrUn_JTFH01000227v1_decoy\t0\t2522\tDecoy\nchrUn_JTFH01000228v1_decoy\t0\t2515\tDecoy\nchrUn_JTFH01000229v1_decoy\t0\t2513\tDecoy\nchrUn_JTFH01000230v1_decoy\t0\t2507\tDecoy\nchrUn_JTFH01000231v1_decoy\t0\t2504\tDecoy\nchrUn_JTFH01000232v1_decoy\t0\t2497\tDecoy\nchrUn_JTFH01000233v1_decoy\t0\t2471\tDecoy\nchrUn_JTFH01000234v1_decoy\t0\t2465\tDecoy\nchrUn_JTFH01000235v1_decoy\t0\t2464\tDecoy\nchrUn_JTFH01000236v1_decoy\t0\t2459\tDecoy\nchrUn_JTFH01000237v1_decoy\t0\t2457\tDecoy\nchrUn_JTFH01000238v1_decoy\t0\t2450\tDecoy\nchrUn_JTFH01000239v1_decoy\t0\t2435\tDecoy\nchrUn_JTFH01000240v1_decoy\t0\t2434\tDecoy\nchrUn_JTFH01000241v1_decoy\t0\t2432\tDecoy\nchrUn_JTFH01000242v1_decoy\t0\t2427\tDecoy\nchrUn_JTFH01000243v1_decoy\t0\t2421\tDecoy\nchrUn_JTFH01000244v1_decoy\t0\t2420\tDecoy\nchrUn_JTFH01000245v1_decoy\t0\t2414\tDecoy\nchrUn_JTFH01000246v1_decoy\t0\t2404\tDecoy\nchrUn_JTFH01000247v1_decoy\t0\t2403\tDecoy\nchrUn_JTFH01000248v1_decoy\t0\t2402\tDecoy\nchrUn_JTFH01000249v1_decoy\t0\t2397\tDecoy\nchrUn_JTFH01000250v1_decoy\t0\t2395\tDecoy\nchrUn_JTFH01000251v1_decoy\t0\t2394\tDecoy\nchrUn_JTFH01000252v1_decoy\t0\t2388\tDecoy\nchrUn_JTFH01000253v1_decoy\t0\t2382\tDecoy\nchrUn_JTFH01000254v1_decoy\t0\t2381\tDecoy\nchrUn_JTFH01000255v1_decoy\t0\t2380\tDecoy\nchrUn_JTFH01000256v1_decoy\t0\t2368\tDecoy\nchrUn_JTFH01000257v1_decoy\t0\t2364\tDecoy\nchrUn_JTFH01000258v1_decoy\t0\t2363\tDecoy\nchrUn_JTFH01000259v1_decoy\t0\t2348\tDecoy\nchrUn_JTFH01000260v1_decoy\t0\t2339\tDecoy\nchrUn_JTFH01000261v1_decoy\t0\t2335\tDecoy\nchrUn_JTFH01000262v1_decoy\t0\t2332\tDecoy\nchrUn_JTFH01000263v1_decoy\t0\t2331\tDecoy\nchrUn_JTFH01000264v1_decoy\t0\t2330\tDecoy\nchrUn_JTFH01000265v1_decoy\t0\t2323\tDecoy\nchrUn_JTFH01000266v1_decoy\t0\t2319\tDecoy\nchrUn_JTFH01000267v1_decoy\t0\t2314\tDecoy\nchrUn_JTFH01000268v1_decoy\t0\t2308\tDecoy\nchrUn_JTFH01000269v1_decoy\t0\t2306\tDecoy\nchrUn_JTFH01000270v1_decoy\t0\t2296\tDecoy\nchrUn_JTFH01000271v1_decoy\t0\t2287\tDecoy\nchrUn_JTFH01000272v1_decoy\t0\t2279\tDecoy\nchrUn_JTFH01000273v1_decoy\t0\t2276\tDecoy\nchrUn_JTFH01000274v1_decoy\t0\t2273\tDecoy\nchrUn_JTFH01000275v1_decoy\t0\t2262\tDecoy\nchrUn_JTFH01000276v1_decoy\t0\t2254\tDecoy\nchrUn_JTFH01000277v1_decoy\t0\t2252\tDecoy\nchrUn_JTFH01000278v1_decoy\t0\t2245\tDecoy\nchrUn_JTFH01000279v1_decoy\t0\t2239\tDecoy\nchrUn_JTFH01000280v1_decoy\t0\t2223\tDecoy\nchrUn_JTFH01000281v1_decoy\t0\t2220\tDecoy\nchrUn_JTFH01000282v1_decoy\t0\t2218\tDecoy\nchrUn_JTFH01000283v1_decoy\t0\t2215\tDecoy\nchrUn_JTFH01000284v1_decoy\t0\t2213\tDecoy\nchrUn_JTFH01000285v1_decoy\t0\t2203\tDecoy\nchrUn_JTFH01000286v1_decoy\t0\t2200\tDecoy\nchrUn_JTFH01000287v1_decoy\t0\t2197\tDecoy\nchrUn_JTFH01000288v1_decoy\t0\t2194\tDecoy\nchrUn_JTFH01000289v1_decoy\t0\t2183\tDecoy\nchrUn_JTFH01000290v1_decoy\t0\t2179\tDecoy\nchrUn_JTFH01000291v1_decoy\t0\t2177\tDecoy\nchrUn_JTFH01000292v1_decoy\t0\t2177\tDecoy\nchrUn_JTFH01000293v1_decoy\t0\t2177\tDecoy\nchrUn_JTFH01000294v1_decoy\t0\t2168\tDecoy\nchrUn_JTFH01000295v1_decoy\t0\t2160\tDecoy\nchrUn_JTFH01000296v1_decoy\t0\t2155\tDecoy\nchrUn_JTFH01000297v1_decoy\t0\t2144\tDecoy\nchrUn_JTFH01000298v1_decoy\t0\t2143\tDecoy\nchrUn_JTFH01000299v1_decoy\t0\t2136\tDecoy\nchrUn_JTFH01000300v1_decoy\t0\t2134\tDecoy\nchrUn_JTFH01000301v1_decoy\t0\t2129\tDecoy\nchrUn_JTFH01000302v1_decoy\t0\t2128\tDecoy\nchrUn_JTFH01000303v1_decoy\t0\t2125\tDecoy\nchrUn_JTFH01000304v1_decoy\t0\t2125\tDecoy\nchrUn_JTFH01000305v1_decoy\t0\t2122\tDecoy\nchrUn_JTFH01000306v1_decoy\t0\t2111\tDecoy\nchrUn_JTFH01000307v1_decoy\t0\t2106\tDecoy\nchrUn_JTFH01000308v1_decoy\t0\t2094\tDecoy\nchrUn_JTFH01000309v1_decoy\t0\t2093\tDecoy\nchrUn_JTFH01000310v1_decoy\t0\t2088\tDecoy\nchrUn_JTFH01000311v1_decoy\t0\t2086\tDecoy\nchrUn_JTFH01000312v1_decoy\t0\t2086\tDecoy\nchrUn_JTFH01000313v1_decoy\t0\t2084\tDecoy\nchrUn_JTFH01000314v1_decoy\t0\t2080\tDecoy\nchrUn_JTFH01000315v1_decoy\t0\t2079\tDecoy\nchrUn_JTFH01000316v1_decoy\t0\t2076\tDecoy\nchrUn_JTFH01000317v1_decoy\t0\t2071\tDecoy\nchrUn_JTFH01000318v1_decoy\t0\t2066\tDecoy\nchrUn_JTFH01000319v1_decoy\t0\t2061\tDecoy\nchrUn_JTFH01000320v1_decoy\t0\t2055\tDecoy\nchrUn_JTFH01000321v1_decoy\t0\t2053\tDecoy\nchrUn_JTFH01000322v1_decoy\t0\t2040\tDecoy\nchrUn_JTFH01000323v1_decoy\t0\t2036\tDecoy\nchrUn_JTFH01000324v1_decoy\t0\t2035\tDecoy\nchrUn_JTFH01000325v1_decoy\t0\t2034\tDecoy\nchrUn_JTFH01000326v1_decoy\t0\t2032\tDecoy\nchrUn_JTFH01000327v1_decoy\t0\t2029\tDecoy\nchrUn_JTFH01000328v1_decoy\t0\t2025\tDecoy\nchrUn_JTFH01000329v1_decoy\t0\t2021\tDecoy\nchrUn_JTFH01000330v1_decoy\t0\t2018\tDecoy\nchrUn_JTFH01000331v1_decoy\t0\t2015\tDecoy\nchrUn_JTFH01000332v1_decoy\t0\t2009\tDecoy\nchrUn_JTFH01000333v1_decoy\t0\t2007\tDecoy\nchrUn_JTFH01000334v1_decoy\t0\t2005\tDecoy\nchrUn_JTFH01000335v1_decoy\t0\t2003\tDecoy\nchrUn_JTFH01000336v1_decoy\t0\t2001\tDecoy\nchrUn_JTFH01000337v1_decoy\t0\t2001\tDecoy\nchrUn_JTFH01000338v1_decoy\t0\t2000\tDecoy\nchrUn_JTFH01000339v1_decoy\t0\t1996\tDecoy\nchrUn_JTFH01000340v1_decoy\t0\t1992\tDecoy\nchrUn_JTFH01000341v1_decoy\t0\t1985\tDecoy\nchrUn_JTFH01000342v1_decoy\t0\t1981\tDecoy\nchrUn_JTFH01000343v1_decoy\t0\t1977\tDecoy\nchrUn_JTFH01000344v1_decoy\t0\t1971\tDecoy\nchrUn_JTFH01000345v1_decoy\t0\t1968\tDecoy\nchrUn_JTFH01000346v1_decoy\t0\t1962\tDecoy\nchrUn_JTFH01000347v1_decoy\t0\t1961\tDecoy\nchrUn_JTFH01000348v1_decoy\t0\t1960\tDecoy\nchrUn_JTFH01000349v1_decoy\t0\t1960\tDecoy\nchrUn_JTFH01000350v1_decoy\t0\t1954\tDecoy\nchrUn_JTFH01000351v1_decoy\t0\t1952\tDecoy\nchrUn_JTFH01000352v1_decoy\t0\t1947\tDecoy\nchrUn_JTFH01000353v1_decoy\t0\t1944\tDecoy\nchrUn_JTFH01000354v1_decoy\t0\t1943\tDecoy\nchrUn_JTFH01000355v1_decoy\t0\t1941\tDecoy\nchrUn_JTFH01000356v1_decoy\t0\t1937\tDecoy\nchrUn_JTFH01000357v1_decoy\t0\t1934\tDecoy\nchrUn_JTFH01000358v1_decoy\t0\t1929\tDecoy\nchrUn_JTFH01000359v1_decoy\t0\t1924\tDecoy\nchrUn_JTFH01000360v1_decoy\t0\t1924\tDecoy\nchrUn_JTFH01000361v1_decoy\t0\t1923\tDecoy\nchrUn_JTFH01000362v1_decoy\t0\t1921\tDecoy\nchrUn_JTFH01000363v1_decoy\t0\t1918\tDecoy\nchrUn_JTFH01000364v1_decoy\t0\t1915\tDecoy\nchrUn_JTFH01000365v1_decoy\t0\t1915\tDecoy\nchrUn_JTFH01000366v1_decoy\t0\t1914\tDecoy\nchrUn_JTFH01000367v1_decoy\t0\t1912\tDecoy\nchrUn_JTFH01000368v1_decoy\t0\t1910\tDecoy\nchrUn_JTFH01000369v1_decoy\t0\t1907\tDecoy\nchrUn_JTFH01000370v1_decoy\t0\t1904\tDecoy\nchrUn_JTFH01000371v1_decoy\t0\t1897\tDecoy\nchrUn_JTFH01000372v1_decoy\t0\t1891\tDecoy\nchrUn_JTFH01000373v1_decoy\t0\t1890\tDecoy\nchrUn_JTFH01000374v1_decoy\t0\t1888\tDecoy\nchrUn_JTFH01000375v1_decoy\t0\t1888\tDecoy\nchrUn_JTFH01000376v1_decoy\t0\t1885\tDecoy\nchrUn_JTFH01000377v1_decoy\t0\t1881\tDecoy\nchrUn_JTFH01000378v1_decoy\t0\t1879\tDecoy\nchrUn_JTFH01000379v1_decoy\t0\t1877\tDecoy\nchrUn_JTFH01000380v1_decoy\t0\t1876\tDecoy\nchrUn_JTFH01000381v1_decoy\t0\t1876\tDecoy\nchrUn_JTFH01000382v1_decoy\t0\t1874\tDecoy\nchrUn_JTFH01000383v1_decoy\t0\t1872\tDecoy\nchrUn_JTFH01000384v1_decoy\t0\t1869\tDecoy\nchrUn_JTFH01000385v1_decoy\t0\t1866\tDecoy\nchrUn_JTFH01000386v1_decoy\t0\t1865\tDecoy\nchrUn_JTFH01000387v1_decoy\t0\t1865\tDecoy\nchrUn_JTFH01000388v1_decoy\t0\t1865\tDecoy\nchrUn_JTFH01000389v1_decoy\t0\t1862\tDecoy\nchrUn_JTFH01000390v1_decoy\t0\t1862\tDecoy\nchrUn_JTFH01000391v1_decoy\t0\t1859\tDecoy\nchrUn_JTFH01000392v1_decoy\t0\t1856\tDecoy\nchrUn_JTFH01000393v1_decoy\t0\t1856\tDecoy\nchrUn_JTFH01000394v1_decoy\t0\t1854\tDecoy\nchrUn_JTFH01000395v1_decoy\t0\t1850\tDecoy\nchrUn_JTFH01000396v1_decoy\t0\t1849\tDecoy\nchrUn_JTFH01000397v1_decoy\t0\t1849\tDecoy\nchrUn_JTFH01000398v1_decoy\t0\t1847\tDecoy\nchrUn_JTFH01000399v1_decoy\t0\t1839\tDecoy\nchrUn_JTFH01000400v1_decoy\t0\t1834\tDecoy\nchrUn_JTFH01000401v1_decoy\t0\t1821\tDecoy\nchrUn_JTFH01000402v1_decoy\t0\t1815\tDecoy\nchrUn_JTFH01000403v1_decoy\t0\t1811\tDecoy\nchrUn_JTFH01000404v1_decoy\t0\t1808\tDecoy\nchrUn_JTFH01000405v1_decoy\t0\t1808\tDecoy\nchrUn_JTFH01000406v1_decoy\t0\t1807\tDecoy\nchrUn_JTFH01000407v1_decoy\t0\t1807\tDecoy\nchrUn_JTFH01000408v1_decoy\t0\t1802\tDecoy\nchrUn_JTFH01000409v1_decoy\t0\t1801\tDecoy\nchrUn_JTFH01000410v1_decoy\t0\t1800\tDecoy\nchrUn_JTFH01000411v1_decoy\t0\t1795\tDecoy\nchrUn_JTFH01000412v1_decoy\t0\t1794\tDecoy\nchrUn_JTFH01000413v1_decoy\t0\t1792\tDecoy\nchrUn_JTFH01000414v1_decoy\t0\t1788\tDecoy\nchrUn_JTFH01000415v1_decoy\t0\t1786\tDecoy\nchrUn_JTFH01000416v1_decoy\t0\t1782\tDecoy\nchrUn_JTFH01000417v1_decoy\t0\t1782\tDecoy\nchrUn_JTFH01000418v1_decoy\t0\t1781\tDecoy\nchrUn_JTFH01000419v1_decoy\t0\t1781\tDecoy\nchrUn_JTFH01000420v1_decoy\t0\t1779\tDecoy\nchrUn_JTFH01000421v1_decoy\t0\t1777\tDecoy\nchrUn_JTFH01000422v1_decoy\t0\t1764\tDecoy\nchrUn_JTFH01000423v1_decoy\t0\t1762\tDecoy\nchrUn_JTFH01000424v1_decoy\t0\t1755\tDecoy\nchrUn_JTFH01000425v1_decoy\t0\t1749\tDecoy\nchrUn_JTFH01000426v1_decoy\t0\t1747\tDecoy\nchrUn_JTFH01000427v1_decoy\t0\t1746\tDecoy\nchrUn_JTFH01000428v1_decoy\t0\t1745\tDecoy\nchrUn_JTFH01000429v1_decoy\t0\t1744\tDecoy\nchrUn_JTFH01000430v1_decoy\t0\t1742\tDecoy\nchrUn_JTFH01000431v1_decoy\t0\t1740\tDecoy\nchrUn_JTFH01000432v1_decoy\t0\t1740\tDecoy\nchrUn_JTFH01000433v1_decoy\t0\t1736\tDecoy\nchrUn_JTFH01000434v1_decoy\t0\t1735\tDecoy\nchrUn_JTFH01000435v1_decoy\t0\t1732\tDecoy\nchrUn_JTFH01000436v1_decoy\t0\t1732\tDecoy\nchrUn_JTFH01000437v1_decoy\t0\t1730\tDecoy\nchrUn_JTFH01000438v1_decoy\t0\t1727\tDecoy\nchrUn_JTFH01000439v1_decoy\t0\t1722\tDecoy\nchrUn_JTFH01000440v1_decoy\t0\t1718\tDecoy\nchrUn_JTFH01000441v1_decoy\t0\t1716\tDecoy\nchrUn_JTFH01000442v1_decoy\t0\t1710\tDecoy\nchrUn_JTFH01000443v1_decoy\t0\t1708\tDecoy\nchrUn_JTFH01000444v1_decoy\t0\t1707\tDecoy\nchrUn_JTFH01000445v1_decoy\t0\t1706\tDecoy\nchrUn_JTFH01000446v1_decoy\t0\t1705\tDecoy\nchrUn_JTFH01000447v1_decoy\t0\t1704\tDecoy\nchrUn_JTFH01000448v1_decoy\t0\t1699\tDecoy\nchrUn_JTFH01000449v1_decoy\t0\t1698\tDecoy\nchrUn_JTFH01000450v1_decoy\t0\t1697\tDecoy\nchrUn_JTFH01000451v1_decoy\t0\t1697\tDecoy\nchrUn_JTFH01000452v1_decoy\t0\t1695\tDecoy\nchrUn_JTFH01000453v1_decoy\t0\t1695\tDecoy\nchrUn_JTFH01000454v1_decoy\t0\t1693\tDecoy\nchrUn_JTFH01000455v1_decoy\t0\t1687\tDecoy\nchrUn_JTFH01000456v1_decoy\t0\t1686\tDecoy\nchrUn_JTFH01000457v1_decoy\t0\t1680\tDecoy\nchrUn_JTFH01000458v1_decoy\t0\t1679\tDecoy\nchrUn_JTFH01000459v1_decoy\t0\t1679\tDecoy\nchrUn_JTFH01000460v1_decoy\t0\t1678\tDecoy\nchrUn_JTFH01000461v1_decoy\t0\t1674\tDecoy\nchrUn_JTFH01000462v1_decoy\t0\t1674\tDecoy\nchrUn_JTFH01000463v1_decoy\t0\t1671\tDecoy\nchrUn_JTFH01000464v1_decoy\t0\t1669\tDecoy\nchrUn_JTFH01000465v1_decoy\t0\t1665\tDecoy\nchrUn_JTFH01000466v1_decoy\t0\t1663\tDecoy\nchrUn_JTFH01000467v1_decoy\t0\t1657\tDecoy\nchrUn_JTFH01000468v1_decoy\t0\t1653\tDecoy\nchrUn_JTFH01000469v1_decoy\t0\t1652\tDecoy\nchrUn_JTFH01000470v1_decoy\t0\t1650\tDecoy\nchrUn_JTFH01000471v1_decoy\t0\t1649\tDecoy\nchrUn_JTFH01000472v1_decoy\t0\t1649\tDecoy\nchrUn_JTFH01000473v1_decoy\t0\t1640\tDecoy\nchrUn_JTFH01000474v1_decoy\t0\t1638\tDecoy\nchrUn_JTFH01000475v1_decoy\t0\t1636\tDecoy\nchrUn_JTFH01000476v1_decoy\t0\t1632\tDecoy\nchrUn_JTFH01000477v1_decoy\t0\t1631\tDecoy\nchrUn_JTFH01000478v1_decoy\t0\t1630\tDecoy\nchrUn_JTFH01000479v1_decoy\t0\t1627\tDecoy\nchrUn_JTFH01000480v1_decoy\t0\t1624\tDecoy\nchrUn_JTFH01000481v1_decoy\t0\t1617\tDecoy\nchrUn_JTFH01000482v1_decoy\t0\t1616\tDecoy\nchrUn_JTFH01000483v1_decoy\t0\t1615\tDecoy\nchrUn_JTFH01000484v1_decoy\t0\t1611\tDecoy\nchrUn_JTFH01000485v1_decoy\t0\t1611\tDecoy\nchrUn_JTFH01000486v1_decoy\t0\t1606\tDecoy\nchrUn_JTFH01000487v1_decoy\t0\t1605\tDecoy\nchrUn_JTFH01000488v1_decoy\t0\t1605\tDecoy\nchrUn_JTFH01000489v1_decoy\t0\t1600\tDecoy\nchrUn_JTFH01000490v1_decoy\t0\t1598\tDecoy\nchrUn_JTFH01000491v1_decoy\t0\t1598\tDecoy\nchrUn_JTFH01000492v1_decoy\t0\t1597\tDecoy\nchrUn_JTFH01000493v1_decoy\t0\t1596\tDecoy\nchrUn_JTFH01000494v1_decoy\t0\t1595\tDecoy\nchrUn_JTFH01000495v1_decoy\t0\t1592\tDecoy\nchrUn_JTFH01000496v1_decoy\t0\t1589\tDecoy\nchrUn_JTFH01000497v1_decoy\t0\t1585\tDecoy\nchrUn_JTFH01000498v1_decoy\t0\t1579\tDecoy\nchrUn_JTFH01000499v1_decoy\t0\t1578\tDecoy\nchrUn_JTFH01000500v1_decoy\t0\t1577\tDecoy\nchrUn_JTFH01000501v1_decoy\t0\t1577\tDecoy\nchrUn_JTFH01000502v1_decoy\t0\t1577\tDecoy\nchrUn_JTFH01000503v1_decoy\t0\t1576\tDecoy\nchrUn_JTFH01000504v1_decoy\t0\t1575\tDecoy\nchrUn_JTFH01000505v1_decoy\t0\t1574\tDecoy\nchrUn_JTFH01000506v1_decoy\t0\t1572\tDecoy\nchrUn_JTFH01000507v1_decoy\t0\t1571\tDecoy\nchrUn_JTFH01000508v1_decoy\t0\t1563\tDecoy\nchrUn_JTFH01000509v1_decoy\t0\t1561\tDecoy\nchrUn_JTFH01000510v1_decoy\t0\t1561\tDecoy\nchrUn_JTFH01000511v1_decoy\t0\t1560\tDecoy\nchrUn_JTFH01000512v1_decoy\t0\t1560\tDecoy\nchrUn_JTFH01000513v1_decoy\t0\t1554\tDecoy\nchrUn_JTFH01000514v1_decoy\t0\t1552\tDecoy\nchrUn_JTFH01000515v1_decoy\t0\t1548\tDecoy\nchrUn_JTFH01000516v1_decoy\t0\t1546\tDecoy\nchrUn_JTFH01000517v1_decoy\t0\t1541\tDecoy\nchrUn_JTFH01000518v1_decoy\t0\t1536\tDecoy\nchrUn_JTFH01000519v1_decoy\t0\t1533\tDecoy\nchrUn_JTFH01000520v1_decoy\t0\t1532\tDecoy\nchrUn_JTFH01000521v1_decoy\t0\t1532\tDecoy\nchrUn_JTFH01000522v1_decoy\t0\t1530\tDecoy\nchrUn_JTFH01000523v1_decoy\t0\t1527\tDecoy\nchrUn_JTFH01000524v1_decoy\t0\t1526\tDecoy\nchrUn_JTFH01000525v1_decoy\t0\t1524\tDecoy\nchrUn_JTFH01000526v1_decoy\t0\t1523\tDecoy\nchrUn_JTFH01000527v1_decoy\t0\t1523\tDecoy\nchrUn_JTFH01000528v1_decoy\t0\t1522\tDecoy\nchrUn_JTFH01000529v1_decoy\t0\t1522\tDecoy\nchrUn_JTFH01000530v1_decoy\t0\t1519\tDecoy\nchrUn_JTFH01000531v1_decoy\t0\t1513\tDecoy\nchrUn_JTFH01000532v1_decoy\t0\t1508\tDecoy\nchrUn_JTFH01000533v1_decoy\t0\t1508\tDecoy\nchrUn_JTFH01000534v1_decoy\t0\t1505\tDecoy\nchrUn_JTFH01000535v1_decoy\t0\t1503\tDecoy\nchrUn_JTFH01000536v1_decoy\t0\t1496\tDecoy\nchrUn_JTFH01000537v1_decoy\t0\t1491\tDecoy\nchrUn_JTFH01000538v1_decoy\t0\t1490\tDecoy\nchrUn_JTFH01000539v1_decoy\t0\t1490\tDecoy\nchrUn_JTFH01000540v1_decoy\t0\t1487\tDecoy\nchrUn_JTFH01000541v1_decoy\t0\t1486\tDecoy\nchrUn_JTFH01000542v1_decoy\t0\t1485\tDecoy\nchrUn_JTFH01000543v1_decoy\t0\t1484\tDecoy\nchrUn_JTFH01000544v1_decoy\t0\t1483\tDecoy\nchrUn_JTFH01000545v1_decoy\t0\t1479\tDecoy\nchrUn_JTFH01000546v1_decoy\t0\t1479\tDecoy\nchrUn_JTFH01000547v1_decoy\t0\t1476\tDecoy\nchrUn_JTFH01000548v1_decoy\t0\t1475\tDecoy\nchrUn_JTFH01000549v1_decoy\t0\t1472\tDecoy\nchrUn_JTFH01000550v1_decoy\t0\t1469\tDecoy\nchrUn_JTFH01000551v1_decoy\t0\t1468\tDecoy\nchrUn_JTFH01000552v1_decoy\t0\t1467\tDecoy\nchrUn_JTFH01000553v1_decoy\t0\t1465\tDecoy\nchrUn_JTFH01000554v1_decoy\t0\t1464\tDecoy\nchrUn_JTFH01000555v1_decoy\t0\t1463\tDecoy\nchrUn_JTFH01000556v1_decoy\t0\t1463\tDecoy\nchrUn_JTFH01000557v1_decoy\t0\t1459\tDecoy\nchrUn_JTFH01000558v1_decoy\t0\t1459\tDecoy\nchrUn_JTFH01000559v1_decoy\t0\t1458\tDecoy\nchrUn_JTFH01000560v1_decoy\t0\t1458\tDecoy\nchrUn_JTFH01000561v1_decoy\t0\t1454\tDecoy\nchrUn_JTFH01000562v1_decoy\t0\t1449\tDecoy\nchrUn_JTFH01000563v1_decoy\t0\t1449\tDecoy\nchrUn_JTFH01000564v1_decoy\t0\t1448\tDecoy\nchrUn_JTFH01000565v1_decoy\t0\t1446\tDecoy\nchrUn_JTFH01000566v1_decoy\t0\t1442\tDecoy\nchrUn_JTFH01000567v1_decoy\t0\t1441\tDecoy\nchrUn_JTFH01000568v1_decoy\t0\t1440\tDecoy\nchrUn_JTFH01000569v1_decoy\t0\t1439\tDecoy\nchrUn_JTFH01000570v1_decoy\t0\t1437\tDecoy\nchrUn_JTFH01000571v1_decoy\t0\t1436\tDecoy\nchrUn_JTFH01000572v1_decoy\t0\t1429\tDecoy\nchrUn_JTFH01000573v1_decoy\t0\t1429\tDecoy\nchrUn_JTFH01000574v1_decoy\t0\t1427\tDecoy\nchrUn_JTFH01000575v1_decoy\t0\t1426\tDecoy\nchrUn_JTFH01000576v1_decoy\t0\t1425\tDecoy\nchrUn_JTFH01000577v1_decoy\t0\t1424\tDecoy\nchrUn_JTFH01000578v1_decoy\t0\t1424\tDecoy\nchrUn_JTFH01000579v1_decoy\t0\t1423\tDecoy\nchrUn_JTFH01000580v1_decoy\t0\t1423\tDecoy\nchrUn_JTFH01000581v1_decoy\t0\t1423\tDecoy\nchrUn_JTFH01000582v1_decoy\t0\t1414\tDecoy\nchrUn_JTFH01000583v1_decoy\t0\t1414\tDecoy\nchrUn_JTFH01000584v1_decoy\t0\t1413\tDecoy\nchrUn_JTFH01000585v1_decoy\t0\t1413\tDecoy\nchrUn_JTFH01000586v1_decoy\t0\t1410\tDecoy\nchrUn_JTFH01000587v1_decoy\t0\t1409\tDecoy\nchrUn_JTFH01000588v1_decoy\t0\t1409\tDecoy\nchrUn_JTFH01000589v1_decoy\t0\t1406\tDecoy\nchrUn_JTFH01000590v1_decoy\t0\t1405\tDecoy\nchrUn_JTFH01000591v1_decoy\t0\t1405\tDecoy\nchrUn_JTFH01000592v1_decoy\t0\t1404\tDecoy\nchrUn_JTFH01000593v1_decoy\t0\t1404\tDecoy\nchrUn_JTFH01000594v1_decoy\t0\t1402\tDecoy\nchrUn_JTFH01000595v1_decoy\t0\t1402\tDecoy\nchrUn_JTFH01000596v1_decoy\t0\t1402\tDecoy\nchrUn_JTFH01000597v1_decoy\t0\t1402\tDecoy\nchrUn_JTFH01000598v1_decoy\t0\t1400\tDecoy\nchrUn_JTFH01000599v1_decoy\t0\t1398\tDecoy\nchrUn_JTFH01000600v1_decoy\t0\t1396\tDecoy\nchrUn_JTFH01000601v1_decoy\t0\t1395\tDecoy\nchrUn_JTFH01000602v1_decoy\t0\t1394\tDecoy\nchrUn_JTFH01000603v1_decoy\t0\t1393\tDecoy\nchrUn_JTFH01000604v1_decoy\t0\t1391\tDecoy\nchrUn_JTFH01000605v1_decoy\t0\t1389\tDecoy\nchrUn_JTFH01000606v1_decoy\t0\t1389\tDecoy\nchrUn_JTFH01000607v1_decoy\t0\t1388\tDecoy\nchrUn_JTFH01000608v1_decoy\t0\t1387\tDecoy\nchrUn_JTFH01000609v1_decoy\t0\t1384\tDecoy\nchrUn_JTFH01000610v1_decoy\t0\t1381\tDecoy\nchrUn_JTFH01000611v1_decoy\t0\t1381\tDecoy\nchrUn_JTFH01000612v1_decoy\t0\t1379\tDecoy\nchrUn_JTFH01000613v1_decoy\t0\t1377\tDecoy\nchrUn_JTFH01000614v1_decoy\t0\t1376\tDecoy\nchrUn_JTFH01000615v1_decoy\t0\t1376\tDecoy\nchrUn_JTFH01000616v1_decoy\t0\t1375\tDecoy\nchrUn_JTFH01000617v1_decoy\t0\t1374\tDecoy\nchrUn_JTFH01000618v1_decoy\t0\t1372\tDecoy\nchrUn_JTFH01000619v1_decoy\t0\t1371\tDecoy\nchrUn_JTFH01000620v1_decoy\t0\t1370\tDecoy\nchrUn_JTFH01000621v1_decoy\t0\t1370\tDecoy\nchrUn_JTFH01000622v1_decoy\t0\t1366\tDecoy\nchrUn_JTFH01000623v1_decoy\t0\t1363\tDecoy\nchrUn_JTFH01000624v1_decoy\t0\t1360\tDecoy\nchrUn_JTFH01000625v1_decoy\t0\t1356\tDecoy\nchrUn_JTFH01000626v1_decoy\t0\t1355\tDecoy\nchrUn_JTFH01000627v1_decoy\t0\t1355\tDecoy\nchrUn_JTFH01000628v1_decoy\t0\t1352\tDecoy\nchrUn_JTFH01000629v1_decoy\t0\t1345\tDecoy\nchrUn_JTFH01000630v1_decoy\t0\t1344\tDecoy\nchrUn_JTFH01000631v1_decoy\t0\t1344\tDecoy\nchrUn_JTFH01000632v1_decoy\t0\t1342\tDecoy\nchrUn_JTFH01000633v1_decoy\t0\t1342\tDecoy\nchrUn_JTFH01000634v1_decoy\t0\t1336\tDecoy\nchrUn_JTFH01000635v1_decoy\t0\t1334\tDecoy\nchrUn_JTFH01000636v1_decoy\t0\t1334\tDecoy\nchrUn_JTFH01000637v1_decoy\t0\t1333\tDecoy\nchrUn_JTFH01000638v1_decoy\t0\t1332\tDecoy\nchrUn_JTFH01000639v1_decoy\t0\t1328\tDecoy\nchrUn_JTFH01000640v1_decoy\t0\t1328\tDecoy\nchrUn_JTFH01000641v1_decoy\t0\t1328\tDecoy\nchrUn_JTFH01000642v1_decoy\t0\t1327\tDecoy\nchrUn_JTFH01000643v1_decoy\t0\t1325\tDecoy\nchrUn_JTFH01000644v1_decoy\t0\t1322\tDecoy\nchrUn_JTFH01000645v1_decoy\t0\t1320\tDecoy\nchrUn_JTFH01000646v1_decoy\t0\t1319\tDecoy\nchrUn_JTFH01000647v1_decoy\t0\t1318\tDecoy\nchrUn_JTFH01000648v1_decoy\t0\t1315\tDecoy\nchrUn_JTFH01000649v1_decoy\t0\t1314\tDecoy\nchrUn_JTFH01000650v1_decoy\t0\t1313\tDecoy\nchrUn_JTFH01000651v1_decoy\t0\t1313\tDecoy\nchrUn_JTFH01000652v1_decoy\t0\t1312\tDecoy\nchrUn_JTFH01000653v1_decoy\t0\t1310\tDecoy\nchrUn_JTFH01000654v1_decoy\t0\t1309\tDecoy\nchrUn_JTFH01000655v1_decoy\t0\t1309\tDecoy\nchrUn_JTFH01000656v1_decoy\t0\t1307\tDecoy\nchrUn_JTFH01000657v1_decoy\t0\t1307\tDecoy\nchrUn_JTFH01000658v1_decoy\t0\t1305\tDecoy\nchrUn_JTFH01000659v1_decoy\t0\t1304\tDecoy\nchrUn_JTFH01000660v1_decoy\t0\t1303\tDecoy\nchrUn_JTFH01000661v1_decoy\t0\t1302\tDecoy\nchrUn_JTFH01000662v1_decoy\t0\t1302\tDecoy\nchrUn_JTFH01000663v1_decoy\t0\t1301\tDecoy\nchrUn_JTFH01000664v1_decoy\t0\t1301\tDecoy\nchrUn_JTFH01000665v1_decoy\t0\t1300\tDecoy\nchrUn_JTFH01000666v1_decoy\t0\t1299\tDecoy\nchrUn_JTFH01000667v1_decoy\t0\t1297\tDecoy\nchrUn_JTFH01000668v1_decoy\t0\t1295\tDecoy\nchrUn_JTFH01000669v1_decoy\t0\t1294\tDecoy\nchrUn_JTFH01000670v1_decoy\t0\t1293\tDecoy\nchrUn_JTFH01000671v1_decoy\t0\t1291\tDecoy\nchrUn_JTFH01000672v1_decoy\t0\t1291\tDecoy\nchrUn_JTFH01000673v1_decoy\t0\t1289\tDecoy\nchrUn_JTFH01000674v1_decoy\t0\t1288\tDecoy\nchrUn_JTFH01000675v1_decoy\t0\t1288\tDecoy\nchrUn_JTFH01000676v1_decoy\t0\t1287\tDecoy\nchrUn_JTFH01000677v1_decoy\t0\t1287\tDecoy\nchrUn_JTFH01000678v1_decoy\t0\t1287\tDecoy\nchrUn_JTFH01000679v1_decoy\t0\t1286\tDecoy\nchrUn_JTFH01000680v1_decoy\t0\t1283\tDecoy\nchrUn_JTFH01000681v1_decoy\t0\t1281\tDecoy\nchrUn_JTFH01000682v1_decoy\t0\t1277\tDecoy\nchrUn_JTFH01000683v1_decoy\t0\t1274\tDecoy\nchrUn_JTFH01000684v1_decoy\t0\t1270\tDecoy\nchrUn_JTFH01000685v1_decoy\t0\t1267\tDecoy\nchrUn_JTFH01000686v1_decoy\t0\t1266\tDecoy\nchrUn_JTFH01000687v1_decoy\t0\t1260\tDecoy\nchrUn_JTFH01000688v1_decoy\t0\t1259\tDecoy\nchrUn_JTFH01000689v1_decoy\t0\t1258\tDecoy\nchrUn_JTFH01000690v1_decoy\t0\t1258\tDecoy\nchrUn_JTFH01000691v1_decoy\t0\t1258\tDecoy\nchrUn_JTFH01000692v1_decoy\t0\t1256\tDecoy\nchrUn_JTFH01000693v1_decoy\t0\t1255\tDecoy\nchrUn_JTFH01000694v1_decoy\t0\t1254\tDecoy\nchrUn_JTFH01000695v1_decoy\t0\t1254\tDecoy\nchrUn_JTFH01000696v1_decoy\t0\t1253\tDecoy\nchrUn_JTFH01000697v1_decoy\t0\t1250\tDecoy\nchrUn_JTFH01000698v1_decoy\t0\t1249\tDecoy\nchrUn_JTFH01000699v1_decoy\t0\t1248\tDecoy\nchrUn_JTFH01000700v1_decoy\t0\t1248\tDecoy\nchrUn_JTFH01000701v1_decoy\t0\t1247\tDecoy\nchrUn_JTFH01000702v1_decoy\t0\t1242\tDecoy\nchrUn_JTFH01000703v1_decoy\t0\t1242\tDecoy\nchrUn_JTFH01000704v1_decoy\t0\t1241\tDecoy\nchrUn_JTFH01000705v1_decoy\t0\t1241\tDecoy\nchrUn_JTFH01000706v1_decoy\t0\t1241\tDecoy\nchrUn_JTFH01000707v1_decoy\t0\t1239\tDecoy\nchrUn_JTFH01000708v1_decoy\t0\t1238\tDecoy\nchrUn_JTFH01000709v1_decoy\t0\t1237\tDecoy\nchrUn_JTFH01000710v1_decoy\t0\t1236\tDecoy\nchrUn_JTFH01000711v1_decoy\t0\t1235\tDecoy\nchrUn_JTFH01000712v1_decoy\t0\t1234\tDecoy\nchrUn_JTFH01000713v1_decoy\t0\t1234\tDecoy\nchrUn_JTFH01000714v1_decoy\t0\t1234\tDecoy\nchrUn_JTFH01000715v1_decoy\t0\t1233\tDecoy\nchrUn_JTFH01000716v1_decoy\t0\t1232\tDecoy\nchrUn_JTFH01000717v1_decoy\t0\t1232\tDecoy\nchrUn_JTFH01000718v1_decoy\t0\t1231\tDecoy\nchrUn_JTFH01000719v1_decoy\t0\t1230\tDecoy\nchrUn_JTFH01000720v1_decoy\t0\t1228\tDecoy\nchrUn_JTFH01000721v1_decoy\t0\t1227\tDecoy\nchrUn_JTFH01000722v1_decoy\t0\t1227\tDecoy\nchrUn_JTFH01000723v1_decoy\t0\t1226\tDecoy\nchrUn_JTFH01000724v1_decoy\t0\t1224\tDecoy\nchrUn_JTFH01000725v1_decoy\t0\t1224\tDecoy\nchrUn_JTFH01000726v1_decoy\t0\t1220\tDecoy\nchrUn_JTFH01000727v1_decoy\t0\t1220\tDecoy\nchrUn_JTFH01000728v1_decoy\t0\t1219\tDecoy\nchrUn_JTFH01000729v1_decoy\t0\t1217\tDecoy\nchrUn_JTFH01000730v1_decoy\t0\t1216\tDecoy\nchrUn_JTFH01000731v1_decoy\t0\t1215\tDecoy\nchrUn_JTFH01000732v1_decoy\t0\t1214\tDecoy\nchrUn_JTFH01000733v1_decoy\t0\t1214\tDecoy\nchrUn_JTFH01000734v1_decoy\t0\t1214\tDecoy\nchrUn_JTFH01000735v1_decoy\t0\t1213\tDecoy\nchrUn_JTFH01000736v1_decoy\t0\t1212\tDecoy\nchrUn_JTFH01000737v1_decoy\t0\t1209\tDecoy\nchrUn_JTFH01000738v1_decoy\t0\t1208\tDecoy\nchrUn_JTFH01000739v1_decoy\t0\t1207\tDecoy\nchrUn_JTFH01000740v1_decoy\t0\t1207\tDecoy\nchrUn_JTFH01000741v1_decoy\t0\t1207\tDecoy\nchrUn_JTFH01000742v1_decoy\t0\t1206\tDecoy\nchrUn_JTFH01000743v1_decoy\t0\t1206\tDecoy\nchrUn_JTFH01000744v1_decoy\t0\t1205\tDecoy\nchrUn_JTFH01000745v1_decoy\t0\t1205\tDecoy\nchrUn_JTFH01000746v1_decoy\t0\t1204\tDecoy\nchrUn_JTFH01000747v1_decoy\t0\t1204\tDecoy\nchrUn_JTFH01000748v1_decoy\t0\t1204\tDecoy\nchrUn_JTFH01000749v1_decoy\t0\t1203\tDecoy\nchrUn_JTFH01000750v1_decoy\t0\t1201\tDecoy\nchrUn_JTFH01000751v1_decoy\t0\t1201\tDecoy\nchrUn_JTFH01000752v1_decoy\t0\t1200\tDecoy\nchrUn_JTFH01000753v1_decoy\t0\t1200\tDecoy\nchrUn_JTFH01000754v1_decoy\t0\t1199\tDecoy\nchrUn_JTFH01000755v1_decoy\t0\t1198\tDecoy\nchrUn_JTFH01000756v1_decoy\t0\t1197\tDecoy\nchrUn_JTFH01000757v1_decoy\t0\t1196\tDecoy\nchrUn_JTFH01000758v1_decoy\t0\t1195\tDecoy\nchrUn_JTFH01000759v1_decoy\t0\t1194\tDecoy\nchrUn_JTFH01000760v1_decoy\t0\t1194\tDecoy\nchrUn_JTFH01000761v1_decoy\t0\t1191\tDecoy\nchrUn_JTFH01000762v1_decoy\t0\t1189\tDecoy\nchrUn_JTFH01000763v1_decoy\t0\t1186\tDecoy\nchrUn_JTFH01000764v1_decoy\t0\t1186\tDecoy\nchrUn_JTFH01000765v1_decoy\t0\t1184\tDecoy\nchrUn_JTFH01000766v1_decoy\t0\t1183\tDecoy\nchrUn_JTFH01000767v1_decoy\t0\t1183\tDecoy\nchrUn_JTFH01000768v1_decoy\t0\t1182\tDecoy\nchrUn_JTFH01000769v1_decoy\t0\t1181\tDecoy\nchrUn_JTFH01000770v1_decoy\t0\t1181\tDecoy\nchrUn_JTFH01000771v1_decoy\t0\t1181\tDecoy\nchrUn_JTFH01000772v1_decoy\t0\t1181\tDecoy\nchrUn_JTFH01000773v1_decoy\t0\t1179\tDecoy\nchrUn_JTFH01000774v1_decoy\t0\t1178\tDecoy\nchrUn_JTFH01000775v1_decoy\t0\t1178\tDecoy\nchrUn_JTFH01000776v1_decoy\t0\t1177\tDecoy\nchrUn_JTFH01000777v1_decoy\t0\t1177\tDecoy\nchrUn_JTFH01000778v1_decoy\t0\t1171\tDecoy\nchrUn_JTFH01000779v1_decoy\t0\t1171\tDecoy\nchrUn_JTFH01000780v1_decoy\t0\t1171\tDecoy\nchrUn_JTFH01000781v1_decoy\t0\t1170\tDecoy\nchrUn_JTFH01000782v1_decoy\t0\t1170\tDecoy\nchrUn_JTFH01000783v1_decoy\t0\t1167\tDecoy\nchrUn_JTFH01000784v1_decoy\t0\t1167\tDecoy\nchrUn_JTFH01000785v1_decoy\t0\t1167\tDecoy\nchrUn_JTFH01000786v1_decoy\t0\t1165\tDecoy\nchrUn_JTFH01000787v1_decoy\t0\t1165\tDecoy\nchrUn_JTFH01000788v1_decoy\t0\t1162\tDecoy\nchrUn_JTFH01000789v1_decoy\t0\t1157\tDecoy\nchrUn_JTFH01000790v1_decoy\t0\t1156\tDecoy\nchrUn_JTFH01000791v1_decoy\t0\t1156\tDecoy\nchrUn_JTFH01000792v1_decoy\t0\t1154\tDecoy\nchrUn_JTFH01000793v1_decoy\t0\t1154\tDecoy\nchrUn_JTFH01000794v1_decoy\t0\t1151\tDecoy\nchrUn_JTFH01000795v1_decoy\t0\t1151\tDecoy\nchrUn_JTFH01000796v1_decoy\t0\t1150\tDecoy\nchrUn_JTFH01000797v1_decoy\t0\t1150\tDecoy\nchrUn_JTFH01000798v1_decoy\t0\t1147\tDecoy\nchrUn_JTFH01000799v1_decoy\t0\t1147\tDecoy\nchrUn_JTFH01000800v1_decoy\t0\t1146\tDecoy\nchrUn_JTFH01000801v1_decoy\t0\t1144\tDecoy\nchrUn_JTFH01000802v1_decoy\t0\t1144\tDecoy\nchrUn_JTFH01000803v1_decoy\t0\t1143\tDecoy\nchrUn_JTFH01000804v1_decoy\t0\t1142\tDecoy\nchrUn_JTFH01000805v1_decoy\t0\t1141\tDecoy\nchrUn_JTFH01000806v1_decoy\t0\t1141\tDecoy\nchrUn_JTFH01000807v1_decoy\t0\t1140\tDecoy\nchrUn_JTFH01000808v1_decoy\t0\t1138\tDecoy\nchrUn_JTFH01000809v1_decoy\t0\t1134\tDecoy\nchrUn_JTFH01000810v1_decoy\t0\t1134\tDecoy\nchrUn_JTFH01000811v1_decoy\t0\t1132\tDecoy\nchrUn_JTFH01000812v1_decoy\t0\t1131\tDecoy\nchrUn_JTFH01000813v1_decoy\t0\t1131\tDecoy\nchrUn_JTFH01000814v1_decoy\t0\t1130\tDecoy\nchrUn_JTFH01000815v1_decoy\t0\t1127\tDecoy\nchrUn_JTFH01000816v1_decoy\t0\t1126\tDecoy\nchrUn_JTFH01000817v1_decoy\t0\t1124\tDecoy\nchrUn_JTFH01000818v1_decoy\t0\t1122\tDecoy\nchrUn_JTFH01000819v1_decoy\t0\t1122\tDecoy\nchrUn_JTFH01000820v1_decoy\t0\t1121\tDecoy\nchrUn_JTFH01000821v1_decoy\t0\t1119\tDecoy\nchrUn_JTFH01000822v1_decoy\t0\t1119\tDecoy\nchrUn_JTFH01000823v1_decoy\t0\t1119\tDecoy\nchrUn_JTFH01000824v1_decoy\t0\t1119\tDecoy\nchrUn_JTFH01000825v1_decoy\t0\t1118\tDecoy\nchrUn_JTFH01000826v1_decoy\t0\t1116\tDecoy\nchrUn_JTFH01000827v1_decoy\t0\t1116\tDecoy\nchrUn_JTFH01000828v1_decoy\t0\t1115\tDecoy\nchrUn_JTFH01000829v1_decoy\t0\t1115\tDecoy\nchrUn_JTFH01000830v1_decoy\t0\t1115\tDecoy\nchrUn_JTFH01000831v1_decoy\t0\t1114\tDecoy\nchrUn_JTFH01000832v1_decoy\t0\t1113\tDecoy\nchrUn_JTFH01000833v1_decoy\t0\t1113\tDecoy\nchrUn_JTFH01000834v1_decoy\t0\t1110\tDecoy\nchrUn_JTFH01000835v1_decoy\t0\t1110\tDecoy\nchrUn_JTFH01000836v1_decoy\t0\t1109\tDecoy\nchrUn_JTFH01000837v1_decoy\t0\t1108\tDecoy\nchrUn_JTFH01000838v1_decoy\t0\t1107\tDecoy\nchrUn_JTFH01000839v1_decoy\t0\t1107\tDecoy\nchrUn_JTFH01000840v1_decoy\t0\t1107\tDecoy\nchrUn_JTFH01000841v1_decoy\t0\t1107\tDecoy\nchrUn_JTFH01000842v1_decoy\t0\t1106\tDecoy\nchrUn_JTFH01000843v1_decoy\t0\t1103\tDecoy\nchrUn_JTFH01000844v1_decoy\t0\t1103\tDecoy\nchrUn_JTFH01000845v1_decoy\t0\t1103\tDecoy\nchrUn_JTFH01000846v1_decoy\t0\t1100\tDecoy\nchrUn_JTFH01000847v1_decoy\t0\t1099\tDecoy\nchrUn_JTFH01000848v1_decoy\t0\t1098\tDecoy\nchrUn_JTFH01000849v1_decoy\t0\t1097\tDecoy\nchrUn_JTFH01000850v1_decoy\t0\t1096\tDecoy\nchrUn_JTFH01000851v1_decoy\t0\t1096\tDecoy\nchrUn_JTFH01000852v1_decoy\t0\t1094\tDecoy\nchrUn_JTFH01000853v1_decoy\t0\t1093\tDecoy\nchrUn_JTFH01000854v1_decoy\t0\t1090\tDecoy\nchrUn_JTFH01000855v1_decoy\t0\t1088\tDecoy\nchrUn_JTFH01000856v1_decoy\t0\t1087\tDecoy\nchrUn_JTFH01000857v1_decoy\t0\t1086\tDecoy\nchrUn_JTFH01000858v1_decoy\t0\t1085\tDecoy\nchrUn_JTFH01000859v1_decoy\t0\t1084\tDecoy\nchrUn_JTFH01000860v1_decoy\t0\t1084\tDecoy\nchrUn_JTFH01000861v1_decoy\t0\t1084\tDecoy\nchrUn_JTFH01000862v1_decoy\t0\t1084\tDecoy\nchrUn_JTFH01000863v1_decoy\t0\t1083\tDecoy\nchrUn_JTFH01000864v1_decoy\t0\t1083\tDecoy\nchrUn_JTFH01000865v1_decoy\t0\t1082\tDecoy\nchrUn_JTFH01000866v1_decoy\t0\t1082\tDecoy\nchrUn_JTFH01000867v1_decoy\t0\t1081\tDecoy\nchrUn_JTFH01000868v1_decoy\t0\t1081\tDecoy\nchrUn_JTFH01000869v1_decoy\t0\t1079\tDecoy\nchrUn_JTFH01000870v1_decoy\t0\t1076\tDecoy\nchrUn_JTFH01000871v1_decoy\t0\t1074\tDecoy\nchrUn_JTFH01000872v1_decoy\t0\t1073\tDecoy\nchrUn_JTFH01000873v1_decoy\t0\t1073\tDecoy\nchrUn_JTFH01000874v1_decoy\t0\t1071\tDecoy\nchrUn_JTFH01000875v1_decoy\t0\t1069\tDecoy\nchrUn_JTFH01000876v1_decoy\t0\t1067\tDecoy\nchrUn_JTFH01000877v1_decoy\t0\t1067\tDecoy\nchrUn_JTFH01000878v1_decoy\t0\t1067\tDecoy\nchrUn_JTFH01000879v1_decoy\t0\t1066\tDecoy\nchrUn_JTFH01000880v1_decoy\t0\t1065\tDecoy\nchrUn_JTFH01000881v1_decoy\t0\t1065\tDecoy\nchrUn_JTFH01000882v1_decoy\t0\t1065\tDecoy\nchrUn_JTFH01000883v1_decoy\t0\t1065\tDecoy\nchrUn_JTFH01000884v1_decoy\t0\t1065\tDecoy\nchrUn_JTFH01000885v1_decoy\t0\t1064\tDecoy\nchrUn_JTFH01000886v1_decoy\t0\t1064\tDecoy\nchrUn_JTFH01000887v1_decoy\t0\t1064\tDecoy\nchrUn_JTFH01000888v1_decoy\t0\t1063\tDecoy\nchrUn_JTFH01000889v1_decoy\t0\t1062\tDecoy\nchrUn_JTFH01000890v1_decoy\t0\t1062\tDecoy\nchrUn_JTFH01000891v1_decoy\t0\t1062\tDecoy\nchrUn_JTFH01000892v1_decoy\t0\t1061\tDecoy\nchrUn_JTFH01000893v1_decoy\t0\t1060\tDecoy\nchrUn_JTFH01000894v1_decoy\t0\t1057\tDecoy\nchrUn_JTFH01000895v1_decoy\t0\t1057\tDecoy\nchrUn_JTFH01000896v1_decoy\t0\t1056\tDecoy\nchrUn_JTFH01000897v1_decoy\t0\t1055\tDecoy\nchrUn_JTFH01000898v1_decoy\t0\t1055\tDecoy\nchrUn_JTFH01000899v1_decoy\t0\t1055\tDecoy\nchrUn_JTFH01000900v1_decoy\t0\t1055\tDecoy\nchrUn_JTFH01000901v1_decoy\t0\t1054\tDecoy\nchrUn_JTFH01000902v1_decoy\t0\t1051\tDecoy\nchrUn_JTFH01000903v1_decoy\t0\t1050\tDecoy\nchrUn_JTFH01000904v1_decoy\t0\t1050\tDecoy\nchrUn_JTFH01000905v1_decoy\t0\t1049\tDecoy\nchrUn_JTFH01000906v1_decoy\t0\t1048\tDecoy\nchrUn_JTFH01000907v1_decoy\t0\t1047\tDecoy\nchrUn_JTFH01000908v1_decoy\t0\t1046\tDecoy\nchrUn_JTFH01000909v1_decoy\t0\t1046\tDecoy\nchrUn_JTFH01000910v1_decoy\t0\t1046\tDecoy\nchrUn_JTFH01000911v1_decoy\t0\t1045\tDecoy\nchrUn_JTFH01000912v1_decoy\t0\t1045\tDecoy\nchrUn_JTFH01000913v1_decoy\t0\t1045\tDecoy\nchrUn_JTFH01000914v1_decoy\t0\t1044\tDecoy\nchrUn_JTFH01000915v1_decoy\t0\t1042\tDecoy\nchrUn_JTFH01000916v1_decoy\t0\t1041\tDecoy\nchrUn_JTFH01000917v1_decoy\t0\t1039\tDecoy\nchrUn_JTFH01000918v1_decoy\t0\t1039\tDecoy\nchrUn_JTFH01000919v1_decoy\t0\t1038\tDecoy\nchrUn_JTFH01000920v1_decoy\t0\t1036\tDecoy\nchrUn_JTFH01000921v1_decoy\t0\t1036\tDecoy\nchrUn_JTFH01000922v1_decoy\t0\t1035\tDecoy\nchrUn_JTFH01000923v1_decoy\t0\t1035\tDecoy\nchrUn_JTFH01000924v1_decoy\t0\t1033\tDecoy\nchrUn_JTFH01000925v1_decoy\t0\t1032\tDecoy\nchrUn_JTFH01000926v1_decoy\t0\t1031\tDecoy\nchrUn_JTFH01000927v1_decoy\t0\t1031\tDecoy\nchrUn_JTFH01000928v1_decoy\t0\t1031\tDecoy\nchrUn_JTFH01000929v1_decoy\t0\t1027\tDecoy\nchrUn_JTFH01000930v1_decoy\t0\t1027\tDecoy\nchrUn_JTFH01000931v1_decoy\t0\t1026\tDecoy\nchrUn_JTFH01000932v1_decoy\t0\t1026\tDecoy\nchrUn_JTFH01000933v1_decoy\t0\t1024\tDecoy\nchrUn_JTFH01000934v1_decoy\t0\t1024\tDecoy\nchrUn_JTFH01000935v1_decoy\t0\t1022\tDecoy\nchrUn_JTFH01000936v1_decoy\t0\t1022\tDecoy\nchrUn_JTFH01000937v1_decoy\t0\t1021\tDecoy\nchrUn_JTFH01000938v1_decoy\t0\t1020\tDecoy\nchrUn_JTFH01000939v1_decoy\t0\t1019\tDecoy\nchrUn_JTFH01000940v1_decoy\t0\t1018\tDecoy\nchrUn_JTFH01000941v1_decoy\t0\t1018\tDecoy\nchrUn_JTFH01000942v1_decoy\t0\t1018\tDecoy\nchrUn_JTFH01000943v1_decoy\t0\t1016\tDecoy\nchrUn_JTFH01000944v1_decoy\t0\t1010\tDecoy\nchrUn_JTFH01000945v1_decoy\t0\t1010\tDecoy\nchrUn_JTFH01000946v1_decoy\t0\t1009\tDecoy\nchrUn_JTFH01000947v1_decoy\t0\t1008\tDecoy\nchrUn_JTFH01000948v1_decoy\t0\t1007\tDecoy\nchrUn_JTFH01000949v1_decoy\t0\t1006\tDecoy\nchrUn_JTFH01000950v1_decoy\t0\t1005\tDecoy\nchrUn_JTFH01000951v1_decoy\t0\t1005\tDecoy\nchrUn_JTFH01000952v1_decoy\t0\t1004\tDecoy\nchrUn_JTFH01000953v1_decoy\t0\t1004\tDecoy\nchrUn_JTFH01000954v1_decoy\t0\t1003\tDecoy\nchrUn_JTFH01000955v1_decoy\t0\t1003\tDecoy\nchrUn_JTFH01000956v1_decoy\t0\t1003\tDecoy\nchrUn_JTFH01000957v1_decoy\t0\t1003\tDecoy\nchrUn_JTFH01000958v1_decoy\t0\t1002\tDecoy\nchrUn_JTFH01000959v1_decoy\t0\t1002\tDecoy\nchrUn_JTFH01000960v1_decoy\t0\t1000\tDecoy\nchrUn_JTFH01000961v1_decoy\t0\t1000\tDecoy\nchrUn_JTFH01000962v1_decoy\t0\t8358\tDecoy\nchrUn_JTFH01000963v1_decoy\t0\t7932\tDecoy\nchrUn_JTFH01000964v1_decoy\t0\t6846\tDecoy\nchrUn_JTFH01000965v1_decoy\t0\t4591\tDecoy\nchrUn_JTFH01000966v1_decoy\t0\t4041\tDecoy\nchrUn_JTFH01000967v1_decoy\t0\t3841\tDecoy\nchrUn_JTFH01000968v1_decoy\t0\t3754\tDecoy\nchrUn_JTFH01000969v1_decoy\t0\t3743\tDecoy\nchrUn_JTFH01000970v1_decoy\t0\t3702\tDecoy\nchrUn_JTFH01000971v1_decoy\t0\t3625\tDecoy\nchrUn_JTFH01000972v1_decoy\t0\t3529\tDecoy\nchrUn_JTFH01000973v1_decoy\t0\t3508\tDecoy\nchrUn_JTFH01000974v1_decoy\t0\t3359\tDecoy\nchrUn_JTFH01000975v1_decoy\t0\t3320\tDecoy\nchrUn_JTFH01000976v1_decoy\t0\t3231\tDecoy\nchrUn_JTFH01000977v1_decoy\t0\t3220\tDecoy\nchrUn_JTFH01000978v1_decoy\t0\t3212\tDecoy\nchrUn_JTFH01000979v1_decoy\t0\t3192\tDecoy\nchrUn_JTFH01000980v1_decoy\t0\t3092\tDecoy\nchrUn_JTFH01000981v1_decoy\t0\t3087\tDecoy\nchrUn_JTFH01000982v1_decoy\t0\t3048\tDecoy\nchrUn_JTFH01000983v1_decoy\t0\t3005\tDecoy\nchrUn_JTFH01000984v1_decoy\t0\t3004\tDecoy\nchrUn_JTFH01000985v1_decoy\t0\t2959\tDecoy\nchrUn_JTFH01000986v1_decoy\t0\t2934\tDecoy\nchrUn_JTFH01000987v1_decoy\t0\t2933\tDecoy\nchrUn_JTFH01000988v1_decoy\t0\t2827\tDecoy\nchrUn_JTFH01000989v1_decoy\t0\t2794\tDecoy\nchrUn_JTFH01000990v1_decoy\t0\t2749\tDecoy\nchrUn_JTFH01000991v1_decoy\t0\t2745\tDecoy\nchrUn_JTFH01000992v1_decoy\t0\t2733\tDecoy\nchrUn_JTFH01000993v1_decoy\t0\t2698\tDecoy\nchrUn_JTFH01000994v1_decoy\t0\t2665\tDecoy\nchrUn_JTFH01000995v1_decoy\t0\t2634\tDecoy\nchrUn_JTFH01000996v1_decoy\t0\t2492\tDecoy\nchrUn_JTFH01000997v1_decoy\t0\t2489\tDecoy\nchrUn_JTFH01000998v1_decoy\t0\t2468\tDecoy\nchrUn_JTFH01000999v1_decoy\t0\t2414\tDecoy\nchrUn_JTFH01001000v1_decoy\t0\t2395\tDecoy\nchrUn_JTFH01001001v1_decoy\t0\t2356\tDecoy\nchrUn_JTFH01001002v1_decoy\t0\t2339\tDecoy\nchrUn_JTFH01001003v1_decoy\t0\t2310\tDecoy\nchrUn_JTFH01001004v1_decoy\t0\t2288\tDecoy\nchrUn_JTFH01001005v1_decoy\t0\t2285\tDecoy\nchrUn_JTFH01001006v1_decoy\t0\t2269\tDecoy\nchrUn_JTFH01001007v1_decoy\t0\t2253\tDecoy\nchrUn_JTFH01001008v1_decoy\t0\t2203\tDecoy\nchrUn_JTFH01001009v1_decoy\t0\t2176\tDecoy\nchrUn_JTFH01001010v1_decoy\t0\t2159\tDecoy\nchrUn_JTFH01001011v1_decoy\t0\t2155\tDecoy\nchrUn_JTFH01001012v1_decoy\t0\t2149\tDecoy\nchrUn_JTFH01001013v1_decoy\t0\t2129\tDecoy\nchrUn_JTFH01001014v1_decoy\t0\t2116\tDecoy\nchrUn_JTFH01001015v1_decoy\t0\t2113\tDecoy\nchrUn_JTFH01001016v1_decoy\t0\t2098\tDecoy\nchrUn_JTFH01001017v1_decoy\t0\t2066\tDecoy\nchrUn_JTFH01001018v1_decoy\t0\t2066\tDecoy\nchrUn_JTFH01001019v1_decoy\t0\t2059\tDecoy\nchrUn_JTFH01001020v1_decoy\t0\t2047\tDecoy\nchrUn_JTFH01001021v1_decoy\t0\t2040\tDecoy\nchrUn_JTFH01001022v1_decoy\t0\t2030\tDecoy\nchrUn_JTFH01001023v1_decoy\t0\t2024\tDecoy\nchrUn_JTFH01001024v1_decoy\t0\t2001\tDecoy\nchrUn_JTFH01001025v1_decoy\t0\t1992\tDecoy\nchrUn_JTFH01001026v1_decoy\t0\t1981\tDecoy\nchrUn_JTFH01001027v1_decoy\t0\t1979\tDecoy\nchrUn_JTFH01001028v1_decoy\t0\t1957\tDecoy\nchrUn_JTFH01001029v1_decoy\t0\t1953\tDecoy\nchrUn_JTFH01001030v1_decoy\t0\t1944\tDecoy\nchrUn_JTFH01001031v1_decoy\t0\t1936\tDecoy\nchrUn_JTFH01001032v1_decoy\t0\t1932\tDecoy\nchrUn_JTFH01001033v1_decoy\t0\t1882\tDecoy\nchrUn_JTFH01001034v1_decoy\t0\t1878\tDecoy\nchrUn_JTFH01001035v1_decoy\t0\t1870\tDecoy\nchrUn_JTFH01001036v1_decoy\t0\t1821\tDecoy\nchrUn_JTFH01001037v1_decoy\t0\t1813\tDecoy\nchrUn_JTFH01001038v1_decoy\t0\t1809\tDecoy\nchrUn_JTFH01001039v1_decoy\t0\t1804\tDecoy\nchrUn_JTFH01001040v1_decoy\t0\t1797\tDecoy\nchrUn_JTFH01001041v1_decoy\t0\t1791\tDecoy\nchrUn_JTFH01001042v1_decoy\t0\t1781\tDecoy\nchrUn_JTFH01001043v1_decoy\t0\t1766\tDecoy\nchrUn_JTFH01001044v1_decoy\t0\t1764\tDecoy\nchrUn_JTFH01001045v1_decoy\t0\t1743\tDecoy\nchrUn_JTFH01001046v1_decoy\t0\t1741\tDecoy\nchrUn_JTFH01001047v1_decoy\t0\t1709\tDecoy\nchrUn_JTFH01001048v1_decoy\t0\t1706\tDecoy\nchrUn_JTFH01001049v1_decoy\t0\t1701\tDecoy\nchrUn_JTFH01001050v1_decoy\t0\t1689\tDecoy\nchrUn_JTFH01001051v1_decoy\t0\t1646\tDecoy\nchrUn_JTFH01001052v1_decoy\t0\t1641\tDecoy\nchrUn_JTFH01001053v1_decoy\t0\t1639\tDecoy\nchrUn_JTFH01001054v1_decoy\t0\t1636\tDecoy\nchrUn_JTFH01001055v1_decoy\t0\t1632\tDecoy\nchrUn_JTFH01001056v1_decoy\t0\t1629\tDecoy\nchrUn_JTFH01001057v1_decoy\t0\t1623\tDecoy\nchrUn_JTFH01001058v1_decoy\t0\t1622\tDecoy\nchrUn_JTFH01001059v1_decoy\t0\t1622\tDecoy\nchrUn_JTFH01001060v1_decoy\t0\t1619\tDecoy\nchrUn_JTFH01001061v1_decoy\t0\t1606\tDecoy\nchrUn_JTFH01001062v1_decoy\t0\t1593\tDecoy\nchrUn_JTFH01001063v1_decoy\t0\t1592\tDecoy\nchrUn_JTFH01001064v1_decoy\t0\t1558\tDecoy\nchrUn_JTFH01001065v1_decoy\t0\t1545\tDecoy\nchrUn_JTFH01001066v1_decoy\t0\t1542\tDecoy\nchrUn_JTFH01001067v1_decoy\t0\t1540\tDecoy\nchrUn_JTFH01001068v1_decoy\t0\t1529\tDecoy\nchrUn_JTFH01001069v1_decoy\t0\t1518\tDecoy\nchrUn_JTFH01001070v1_decoy\t0\t1515\tDecoy\nchrUn_JTFH01001071v1_decoy\t0\t1513\tDecoy\nchrUn_JTFH01001072v1_decoy\t0\t1507\tDecoy\nchrUn_JTFH01001073v1_decoy\t0\t1504\tDecoy\nchrUn_JTFH01001074v1_decoy\t0\t1499\tDecoy\nchrUn_JTFH01001075v1_decoy\t0\t1495\tDecoy\nchrUn_JTFH01001076v1_decoy\t0\t1495\tDecoy\nchrUn_JTFH01001077v1_decoy\t0\t1492\tDecoy\nchrUn_JTFH01001078v1_decoy\t0\t1492\tDecoy\nchrUn_JTFH01001079v1_decoy\t0\t1489\tDecoy\nchrUn_JTFH01001080v1_decoy\t0\t1485\tDecoy\nchrUn_JTFH01001081v1_decoy\t0\t1483\tDecoy\nchrUn_JTFH01001082v1_decoy\t0\t1473\tDecoy\nchrUn_JTFH01001083v1_decoy\t0\t1470\tDecoy\nchrUn_JTFH01001084v1_decoy\t0\t1463\tDecoy\nchrUn_JTFH01001085v1_decoy\t0\t1460\tDecoy\nchrUn_JTFH01001086v1_decoy\t0\t1458\tDecoy\nchrUn_JTFH01001087v1_decoy\t0\t1456\tDecoy\nchrUn_JTFH01001088v1_decoy\t0\t1453\tDecoy\nchrUn_JTFH01001089v1_decoy\t0\t1443\tDecoy\nchrUn_JTFH01001090v1_decoy\t0\t1441\tDecoy\nchrUn_JTFH01001091v1_decoy\t0\t1426\tDecoy\nchrUn_JTFH01001092v1_decoy\t0\t1425\tDecoy\nchrUn_JTFH01001093v1_decoy\t0\t1418\tDecoy\nchrUn_JTFH01001094v1_decoy\t0\t1413\tDecoy\nchrUn_JTFH01001095v1_decoy\t0\t1413\tDecoy\nchrUn_JTFH01001096v1_decoy\t0\t1412\tDecoy\nchrUn_JTFH01001097v1_decoy\t0\t1407\tDecoy\nchrUn_JTFH01001098v1_decoy\t0\t1406\tDecoy\nchrUn_JTFH01001099v1_decoy\t0\t1396\tDecoy\nchrUn_JTFH01001100v1_decoy\t0\t1390\tDecoy\nchrUn_JTFH01001101v1_decoy\t0\t1382\tDecoy\nchrUn_JTFH01001102v1_decoy\t0\t1376\tDecoy\nchrUn_JTFH01001103v1_decoy\t0\t1375\tDecoy\nchrUn_JTFH01001104v1_decoy\t0\t1371\tDecoy\nchrUn_JTFH01001105v1_decoy\t0\t1367\tDecoy\nchrUn_JTFH01001106v1_decoy\t0\t1364\tDecoy\nchrUn_JTFH01001107v1_decoy\t0\t1356\tDecoy\nchrUn_JTFH01001108v1_decoy\t0\t1355\tDecoy\nchrUn_JTFH01001109v1_decoy\t0\t1352\tDecoy\nchrUn_JTFH01001110v1_decoy\t0\t1350\tDecoy\nchrUn_JTFH01001111v1_decoy\t0\t1346\tDecoy\nchrUn_JTFH01001112v1_decoy\t0\t1345\tDecoy\nchrUn_JTFH01001113v1_decoy\t0\t1340\tDecoy\nchrUn_JTFH01001114v1_decoy\t0\t1330\tDecoy\nchrUn_JTFH01001115v1_decoy\t0\t1329\tDecoy\nchrUn_JTFH01001116v1_decoy\t0\t1324\tDecoy\nchrUn_JTFH01001117v1_decoy\t0\t1316\tDecoy\nchrUn_JTFH01001118v1_decoy\t0\t1307\tDecoy\nchrUn_JTFH01001119v1_decoy\t0\t1304\tDecoy\nchrUn_JTFH01001120v1_decoy\t0\t1304\tDecoy\nchrUn_JTFH01001121v1_decoy\t0\t1303\tDecoy\nchrUn_JTFH01001122v1_decoy\t0\t1301\tDecoy\nchrUn_JTFH01001123v1_decoy\t0\t1300\tDecoy\nchrUn_JTFH01001124v1_decoy\t0\t1297\tDecoy\nchrUn_JTFH01001125v1_decoy\t0\t1296\tDecoy\nchrUn_JTFH01001126v1_decoy\t0\t1290\tDecoy\nchrUn_JTFH01001127v1_decoy\t0\t1284\tDecoy\nchrUn_JTFH01001128v1_decoy\t0\t1282\tDecoy\nchrUn_JTFH01001129v1_decoy\t0\t1281\tDecoy\nchrUn_JTFH01001130v1_decoy\t0\t1280\tDecoy\nchrUn_JTFH01001131v1_decoy\t0\t1279\tDecoy\nchrUn_JTFH01001132v1_decoy\t0\t1272\tDecoy\nchrUn_JTFH01001133v1_decoy\t0\t1267\tDecoy\nchrUn_JTFH01001134v1_decoy\t0\t1267\tDecoy\nchrUn_JTFH01001135v1_decoy\t0\t1266\tDecoy\nchrUn_JTFH01001136v1_decoy\t0\t1264\tDecoy\nchrUn_JTFH01001137v1_decoy\t0\t1264\tDecoy\nchrUn_JTFH01001138v1_decoy\t0\t1264\tDecoy\nchrUn_JTFH01001139v1_decoy\t0\t1263\tDecoy\nchrUn_JTFH01001140v1_decoy\t0\t1249\tDecoy\nchrUn_JTFH01001141v1_decoy\t0\t1240\tDecoy\nchrUn_JTFH01001142v1_decoy\t0\t1239\tDecoy\nchrUn_JTFH01001143v1_decoy\t0\t1235\tDecoy\nchrUn_JTFH01001144v1_decoy\t0\t1235\tDecoy\nchrUn_JTFH01001145v1_decoy\t0\t1233\tDecoy\nchrUn_JTFH01001146v1_decoy\t0\t1232\tDecoy\nchrUn_JTFH01001147v1_decoy\t0\t1230\tDecoy\nchrUn_JTFH01001148v1_decoy\t0\t1226\tDecoy\nchrUn_JTFH01001149v1_decoy\t0\t1223\tDecoy\nchrUn_JTFH01001150v1_decoy\t0\t1214\tDecoy\nchrUn_JTFH01001151v1_decoy\t0\t1213\tDecoy\nchrUn_JTFH01001152v1_decoy\t0\t1211\tDecoy\nchrUn_JTFH01001153v1_decoy\t0\t1209\tDecoy\nchrUn_JTFH01001154v1_decoy\t0\t1202\tDecoy\nchrUn_JTFH01001155v1_decoy\t0\t1199\tDecoy\nchrUn_JTFH01001156v1_decoy\t0\t1197\tDecoy\nchrUn_JTFH01001157v1_decoy\t0\t1193\tDecoy\nchrUn_JTFH01001158v1_decoy\t0\t1191\tDecoy\nchrUn_JTFH01001159v1_decoy\t0\t1187\tDecoy\nchrUn_JTFH01001160v1_decoy\t0\t1186\tDecoy\nchrUn_JTFH01001161v1_decoy\t0\t1184\tDecoy\nchrUn_JTFH01001162v1_decoy\t0\t1184\tDecoy\nchrUn_JTFH01001163v1_decoy\t0\t1182\tDecoy\nchrUn_JTFH01001164v1_decoy\t0\t1179\tDecoy\nchrUn_JTFH01001165v1_decoy\t0\t1173\tDecoy\nchrUn_JTFH01001166v1_decoy\t0\t1169\tDecoy\nchrUn_JTFH01001167v1_decoy\t0\t1167\tDecoy\nchrUn_JTFH01001168v1_decoy\t0\t1166\tDecoy\nchrUn_JTFH01001169v1_decoy\t0\t1165\tDecoy\nchrUn_JTFH01001170v1_decoy\t0\t1164\tDecoy\nchrUn_JTFH01001171v1_decoy\t0\t1163\tDecoy\nchrUn_JTFH01001172v1_decoy\t0\t1158\tDecoy\nchrUn_JTFH01001173v1_decoy\t0\t1158\tDecoy\nchrUn_JTFH01001174v1_decoy\t0\t1157\tDecoy\nchrUn_JTFH01001175v1_decoy\t0\t1157\tDecoy\nchrUn_JTFH01001176v1_decoy\t0\t1157\tDecoy\nchrUn_JTFH01001177v1_decoy\t0\t1155\tDecoy\nchrUn_JTFH01001178v1_decoy\t0\t1154\tDecoy\nchrUn_JTFH01001179v1_decoy\t0\t1149\tDecoy\nchrUn_JTFH01001180v1_decoy\t0\t1148\tDecoy\nchrUn_JTFH01001181v1_decoy\t0\t1148\tDecoy\nchrUn_JTFH01001182v1_decoy\t0\t1146\tDecoy\nchrUn_JTFH01001183v1_decoy\t0\t1144\tDecoy\nchrUn_JTFH01001184v1_decoy\t0\t1140\tDecoy\nchrUn_JTFH01001185v1_decoy\t0\t1136\tDecoy\nchrUn_JTFH01001186v1_decoy\t0\t1134\tDecoy\nchrUn_JTFH01001187v1_decoy\t0\t1133\tDecoy\nchrUn_JTFH01001188v1_decoy\t0\t1129\tDecoy\nchrUn_JTFH01001189v1_decoy\t0\t1127\tDecoy\nchrUn_JTFH01001190v1_decoy\t0\t1127\tDecoy\nchrUn_JTFH01001191v1_decoy\t0\t1118\tDecoy\nchrUn_JTFH01001192v1_decoy\t0\t1110\tDecoy\nchrUn_JTFH01001193v1_decoy\t0\t1104\tDecoy\nchrUn_JTFH01001194v1_decoy\t0\t1104\tDecoy\nchrUn_JTFH01001195v1_decoy\t0\t1101\tDecoy\nchrUn_JTFH01001196v1_decoy\t0\t1098\tDecoy\nchrUn_JTFH01001197v1_decoy\t0\t1096\tDecoy\nchrUn_JTFH01001198v1_decoy\t0\t1094\tDecoy\nchrUn_JTFH01001199v1_decoy\t0\t1091\tDecoy\nchrUn_JTFH01001200v1_decoy\t0\t1089\tDecoy\nchrUn_JTFH01001201v1_decoy\t0\t1086\tDecoy\nchrUn_JTFH01001202v1_decoy\t0\t1085\tDecoy\nchrUn_JTFH01001203v1_decoy\t0\t1084\tDecoy\nchrUn_JTFH01001204v1_decoy\t0\t1083\tDecoy\nchrUn_JTFH01001205v1_decoy\t0\t1083\tDecoy\nchrUn_JTFH01001206v1_decoy\t0\t1079\tDecoy\nchrUn_JTFH01001207v1_decoy\t0\t1076\tDecoy\nchrUn_JTFH01001208v1_decoy\t0\t1069\tDecoy\nchrUn_JTFH01001209v1_decoy\t0\t1068\tDecoy\nchrUn_JTFH01001210v1_decoy\t0\t1067\tDecoy\nchrUn_JTFH01001211v1_decoy\t0\t1067\tDecoy\nchrUn_JTFH01001212v1_decoy\t0\t1067\tDecoy\nchrUn_JTFH01001213v1_decoy\t0\t1063\tDecoy\nchrUn_JTFH01001214v1_decoy\t0\t1062\tDecoy\nchrUn_JTFH01001215v1_decoy\t0\t1059\tDecoy\nchrUn_JTFH01001216v1_decoy\t0\t1058\tDecoy\nchrUn_JTFH01001217v1_decoy\t0\t1058\tDecoy\nchrUn_JTFH01001218v1_decoy\t0\t1055\tDecoy\nchrUn_JTFH01001219v1_decoy\t0\t1054\tDecoy\nchrUn_JTFH01001220v1_decoy\t0\t1054\tDecoy\nchrUn_JTFH01001221v1_decoy\t0\t1053\tDecoy\nchrUn_JTFH01001222v1_decoy\t0\t1053\tDecoy\nchrUn_JTFH01001223v1_decoy\t0\t1052\tDecoy\nchrUn_JTFH01001224v1_decoy\t0\t1051\tDecoy\nchrUn_JTFH01001225v1_decoy\t0\t1049\tDecoy\nchrUn_JTFH01001226v1_decoy\t0\t1047\tDecoy\nchrUn_JTFH01001227v1_decoy\t0\t1044\tDecoy\nchrUn_JTFH01001228v1_decoy\t0\t1043\tDecoy\nchrUn_JTFH01001229v1_decoy\t0\t1043\tDecoy\nchrUn_JTFH01001230v1_decoy\t0\t1042\tDecoy\nchrUn_JTFH01001231v1_decoy\t0\t1042\tDecoy\nchrUn_JTFH01001232v1_decoy\t0\t1041\tDecoy\nchrUn_JTFH01001233v1_decoy\t0\t1040\tDecoy\nchrUn_JTFH01001234v1_decoy\t0\t1039\tDecoy\nchrUn_JTFH01001235v1_decoy\t0\t1038\tDecoy\nchrUn_JTFH01001236v1_decoy\t0\t1037\tDecoy\nchrUn_JTFH01001237v1_decoy\t0\t1037\tDecoy\nchrUn_JTFH01001238v1_decoy\t0\t1035\tDecoy\nchrUn_JTFH01001239v1_decoy\t0\t1027\tDecoy\nchrUn_JTFH01001240v1_decoy\t0\t1021\tDecoy\nchrUn_JTFH01001241v1_decoy\t0\t1021\tDecoy\nchrUn_JTFH01001242v1_decoy\t0\t1019\tDecoy\nchrUn_JTFH01001243v1_decoy\t0\t1019\tDecoy\nchrUn_JTFH01001244v1_decoy\t0\t1016\tDecoy\nchrUn_JTFH01001245v1_decoy\t0\t1014\tDecoy\nchrUn_JTFH01001246v1_decoy\t0\t1013\tDecoy\nchrUn_JTFH01001247v1_decoy\t0\t1009\tDecoy\nchrUn_JTFH01001248v1_decoy\t0\t1008\tDecoy\nchrUn_JTFH01001249v1_decoy\t0\t1007\tDecoy\nchrUn_JTFH01001250v1_decoy\t0\t1004\tDecoy\nchrUn_JTFH01001251v1_decoy\t0\t1004\tDecoy\nchrUn_JTFH01001252v1_decoy\t0\t1003\tDecoy\nchrUn_JTFH01001253v1_decoy\t0\t1001\tDecoy\nchrUn_JTFH01001254v1_decoy\t0\t1000\tDecoy\nchrUn_JTFH01001255v1_decoy\t0\t1000\tDecoy\nchrUn_JTFH01001256v1_decoy\t0\t1000\tDecoy\nchrUn_JTFH01001257v1_decoy\t0\t17929\tDecoy\nchrUn_JTFH01001258v1_decoy\t0\t9749\tDecoy\nchrUn_JTFH01001259v1_decoy\t0\t8053\tDecoy\nchrUn_JTFH01001260v1_decoy\t0\t7826\tDecoy\nchrUn_JTFH01001261v1_decoy\t0\t7768\tDecoy\nchrUn_JTFH01001262v1_decoy\t0\t5691\tDecoy\nchrUn_JTFH01001263v1_decoy\t0\t5444\tDecoy\nchrUn_JTFH01001264v1_decoy\t0\t5077\tDecoy\nchrUn_JTFH01001265v1_decoy\t0\t4990\tDecoy\nchrUn_JTFH01001266v1_decoy\t0\t4545\tDecoy\nchrUn_JTFH01001267v1_decoy\t0\t4544\tDecoy\nchrUn_JTFH01001268v1_decoy\t0\t4202\tDecoy\nchrUn_JTFH01001269v1_decoy\t0\t4195\tDecoy\nchrUn_JTFH01001270v1_decoy\t0\t3807\tDecoy\nchrUn_JTFH01001271v1_decoy\t0\t3741\tDecoy\nchrUn_JTFH01001272v1_decoy\t0\t3699\tDecoy\nchrUn_JTFH01001273v1_decoy\t0\t3640\tDecoy\nchrUn_JTFH01001274v1_decoy\t0\t3531\tDecoy\nchrUn_JTFH01001275v1_decoy\t0\t3455\tDecoy\nchrUn_JTFH01001276v1_decoy\t0\t3411\tDecoy\nchrUn_JTFH01001277v1_decoy\t0\t3387\tDecoy\nchrUn_JTFH01001278v1_decoy\t0\t3358\tDecoy\nchrUn_JTFH01001279v1_decoy\t0\t3285\tDecoy\nchrUn_JTFH01001280v1_decoy\t0\t3273\tDecoy\nchrUn_JTFH01001281v1_decoy\t0\t3262\tDecoy\nchrUn_JTFH01001282v1_decoy\t0\t3259\tDecoy\nchrUn_JTFH01001283v1_decoy\t0\t3222\tDecoy\nchrUn_JTFH01001284v1_decoy\t0\t3127\tDecoy\nchrUn_JTFH01001285v1_decoy\t0\t3110\tDecoy\nchrUn_JTFH01001286v1_decoy\t0\t3104\tDecoy\nchrUn_JTFH01001287v1_decoy\t0\t3071\tDecoy\nchrUn_JTFH01001288v1_decoy\t0\t3063\tDecoy\nchrUn_JTFH01001289v1_decoy\t0\t3059\tDecoy\nchrUn_JTFH01001290v1_decoy\t0\t2990\tDecoy\nchrUn_JTFH01001291v1_decoy\t0\t2986\tDecoy\nchrUn_JTFH01001292v1_decoy\t0\t2928\tDecoy\nchrUn_JTFH01001293v1_decoy\t0\t2922\tDecoy\nchrUn_JTFH01001294v1_decoy\t0\t2875\tDecoy\nchrUn_JTFH01001295v1_decoy\t0\t2859\tDecoy\nchrUn_JTFH01001296v1_decoy\t0\t2850\tDecoy\nchrUn_JTFH01001297v1_decoy\t0\t2813\tDecoy\nchrUn_JTFH01001298v1_decoy\t0\t2785\tDecoy\nchrUn_JTFH01001299v1_decoy\t0\t2736\tDecoy\nchrUn_JTFH01001300v1_decoy\t0\t2688\tDecoy\nchrUn_JTFH01001301v1_decoy\t0\t2658\tDecoy\nchrUn_JTFH01001302v1_decoy\t0\t2643\tDecoy\nchrUn_JTFH01001303v1_decoy\t0\t2618\tDecoy\nchrUn_JTFH01001304v1_decoy\t0\t2605\tDecoy\nchrUn_JTFH01001305v1_decoy\t0\t2583\tDecoy\nchrUn_JTFH01001306v1_decoy\t0\t2534\tDecoy\nchrUn_JTFH01001307v1_decoy\t0\t2512\tDecoy\nchrUn_JTFH01001308v1_decoy\t0\t2500\tDecoy\nchrUn_JTFH01001309v1_decoy\t0\t2481\tDecoy\nchrUn_JTFH01001310v1_decoy\t0\t2478\tDecoy\nchrUn_JTFH01001311v1_decoy\t0\t2473\tDecoy\nchrUn_JTFH01001312v1_decoy\t0\t2467\tDecoy\nchrUn_JTFH01001313v1_decoy\t0\t2442\tDecoy\nchrUn_JTFH01001314v1_decoy\t0\t2430\tDecoy\nchrUn_JTFH01001315v1_decoy\t0\t2417\tDecoy\nchrUn_JTFH01001316v1_decoy\t0\t2408\tDecoy\nchrUn_JTFH01001317v1_decoy\t0\t2395\tDecoy\nchrUn_JTFH01001318v1_decoy\t0\t2352\tDecoy\nchrUn_JTFH01001319v1_decoy\t0\t2337\tDecoy\nchrUn_JTFH01001320v1_decoy\t0\t2322\tDecoy\nchrUn_JTFH01001321v1_decoy\t0\t2307\tDecoy\nchrUn_JTFH01001322v1_decoy\t0\t2306\tDecoy\nchrUn_JTFH01001323v1_decoy\t0\t2292\tDecoy\nchrUn_JTFH01001324v1_decoy\t0\t2271\tDecoy\nchrUn_JTFH01001325v1_decoy\t0\t2265\tDecoy\nchrUn_JTFH01001326v1_decoy\t0\t2260\tDecoy\nchrUn_JTFH01001327v1_decoy\t0\t2240\tDecoy\nchrUn_JTFH01001328v1_decoy\t0\t2238\tDecoy\nchrUn_JTFH01001329v1_decoy\t0\t2228\tDecoy\nchrUn_JTFH01001330v1_decoy\t0\t2215\tDecoy\nchrUn_JTFH01001331v1_decoy\t0\t2205\tDecoy\nchrUn_JTFH01001332v1_decoy\t0\t2191\tDecoy\nchrUn_JTFH01001333v1_decoy\t0\t2191\tDecoy\nchrUn_JTFH01001334v1_decoy\t0\t2190\tDecoy\nchrUn_JTFH01001335v1_decoy\t0\t2184\tDecoy\nchrUn_JTFH01001336v1_decoy\t0\t2166\tDecoy\nchrUn_JTFH01001337v1_decoy\t0\t2165\tDecoy\nchrUn_JTFH01001338v1_decoy\t0\t2162\tDecoy\nchrUn_JTFH01001339v1_decoy\t0\t2146\tDecoy\nchrUn_JTFH01001340v1_decoy\t0\t2116\tDecoy\nchrUn_JTFH01001341v1_decoy\t0\t2112\tDecoy\nchrUn_JTFH01001342v1_decoy\t0\t2108\tDecoy\nchrUn_JTFH01001343v1_decoy\t0\t2106\tDecoy\nchrUn_JTFH01001344v1_decoy\t0\t2106\tDecoy\nchrUn_JTFH01001345v1_decoy\t0\t2106\tDecoy\nchrUn_JTFH01001346v1_decoy\t0\t2097\tDecoy\nchrUn_JTFH01001347v1_decoy\t0\t2081\tDecoy\nchrUn_JTFH01001348v1_decoy\t0\t2058\tDecoy\nchrUn_JTFH01001349v1_decoy\t0\t2055\tDecoy\nchrUn_JTFH01001350v1_decoy\t0\t2054\tDecoy\nchrUn_JTFH01001351v1_decoy\t0\t2037\tDecoy\nchrUn_JTFH01001352v1_decoy\t0\t2032\tDecoy\nchrUn_JTFH01001353v1_decoy\t0\t2032\tDecoy\nchrUn_JTFH01001354v1_decoy\t0\t2020\tDecoy\nchrUn_JTFH01001355v1_decoy\t0\t2018\tDecoy\nchrUn_JTFH01001356v1_decoy\t0\t2014\tDecoy\nchrUn_JTFH01001357v1_decoy\t0\t2001\tDecoy\nchrUn_JTFH01001358v1_decoy\t0\t2001\tDecoy\nchrUn_JTFH01001359v1_decoy\t0\t1991\tDecoy\nchrUn_JTFH01001360v1_decoy\t0\t1990\tDecoy\nchrUn_JTFH01001361v1_decoy\t0\t1983\tDecoy\nchrUn_JTFH01001362v1_decoy\t0\t1981\tDecoy\nchrUn_JTFH01001363v1_decoy\t0\t1981\tDecoy\nchrUn_JTFH01001364v1_decoy\t0\t1979\tDecoy\nchrUn_JTFH01001365v1_decoy\t0\t1963\tDecoy\nchrUn_JTFH01001366v1_decoy\t0\t1932\tDecoy\nchrUn_JTFH01001367v1_decoy\t0\t1929\tDecoy\nchrUn_JTFH01001368v1_decoy\t0\t1881\tDecoy\nchrUn_JTFH01001369v1_decoy\t0\t1874\tDecoy\nchrUn_JTFH01001370v1_decoy\t0\t1849\tDecoy\nchrUn_JTFH01001371v1_decoy\t0\t1849\tDecoy\nchrUn_JTFH01001372v1_decoy\t0\t1833\tDecoy\nchrUn_JTFH01001373v1_decoy\t0\t1832\tDecoy\nchrUn_JTFH01001374v1_decoy\t0\t1826\tDecoy\nchrUn_JTFH01001375v1_decoy\t0\t1814\tDecoy\nchrUn_JTFH01001376v1_decoy\t0\t1814\tDecoy\nchrUn_JTFH01001377v1_decoy\t0\t1791\tDecoy\nchrUn_JTFH01001378v1_decoy\t0\t1789\tDecoy\nchrUn_JTFH01001379v1_decoy\t0\t1786\tDecoy\nchrUn_JTFH01001380v1_decoy\t0\t1778\tDecoy\nchrUn_JTFH01001381v1_decoy\t0\t1776\tDecoy\nchrUn_JTFH01001382v1_decoy\t0\t1762\tDecoy\nchrUn_JTFH01001383v1_decoy\t0\t1758\tDecoy\nchrUn_JTFH01001384v1_decoy\t0\t1757\tDecoy\nchrUn_JTFH01001385v1_decoy\t0\t1754\tDecoy\nchrUn_JTFH01001386v1_decoy\t0\t1752\tDecoy\nchrUn_JTFH01001387v1_decoy\t0\t1751\tDecoy\nchrUn_JTFH01001388v1_decoy\t0\t1749\tDecoy\nchrUn_JTFH01001389v1_decoy\t0\t1738\tDecoy\nchrUn_JTFH01001390v1_decoy\t0\t1729\tDecoy\nchrUn_JTFH01001391v1_decoy\t0\t1726\tDecoy\nchrUn_JTFH01001392v1_decoy\t0\t1716\tDecoy\nchrUn_JTFH01001393v1_decoy\t0\t1712\tDecoy\nchrUn_JTFH01001394v1_decoy\t0\t1711\tDecoy\nchrUn_JTFH01001395v1_decoy\t0\t1703\tDecoy\nchrUn_JTFH01001396v1_decoy\t0\t1702\tDecoy\nchrUn_JTFH01001397v1_decoy\t0\t1699\tDecoy\nchrUn_JTFH01001398v1_decoy\t0\t1686\tDecoy\nchrUn_JTFH01001399v1_decoy\t0\t1684\tDecoy\nchrUn_JTFH01001400v1_decoy\t0\t1680\tDecoy\nchrUn_JTFH01001401v1_decoy\t0\t1678\tDecoy\nchrUn_JTFH01001402v1_decoy\t0\t1678\tDecoy\nchrUn_JTFH01001403v1_decoy\t0\t1677\tDecoy\nchrUn_JTFH01001404v1_decoy\t0\t1676\tDecoy\nchrUn_JTFH01001405v1_decoy\t0\t1672\tDecoy\nchrUn_JTFH01001406v1_decoy\t0\t1669\tDecoy\nchrUn_JTFH01001407v1_decoy\t0\t1668\tDecoy\nchrUn_JTFH01001408v1_decoy\t0\t1663\tDecoy\nchrUn_JTFH01001409v1_decoy\t0\t1660\tDecoy\nchrUn_JTFH01001410v1_decoy\t0\t1660\tDecoy\nchrUn_JTFH01001411v1_decoy\t0\t1658\tDecoy\nchrUn_JTFH01001412v1_decoy\t0\t1656\tDecoy\nchrUn_JTFH01001413v1_decoy\t0\t1656\tDecoy\nchrUn_JTFH01001414v1_decoy\t0\t1652\tDecoy\nchrUn_JTFH01001415v1_decoy\t0\t1647\tDecoy\nchrUn_JTFH01001416v1_decoy\t0\t1645\tDecoy\nchrUn_JTFH01001417v1_decoy\t0\t1641\tDecoy\nchrUn_JTFH01001418v1_decoy\t0\t1638\tDecoy\nchrUn_JTFH01001419v1_decoy\t0\t1633\tDecoy\nchrUn_JTFH01001420v1_decoy\t0\t1626\tDecoy\nchrUn_JTFH01001421v1_decoy\t0\t1614\tDecoy\nchrUn_JTFH01001422v1_decoy\t0\t1612\tDecoy\nchrUn_JTFH01001423v1_decoy\t0\t1605\tDecoy\nchrUn_JTFH01001424v1_decoy\t0\t1603\tDecoy\nchrUn_JTFH01001425v1_decoy\t0\t1599\tDecoy\nchrUn_JTFH01001426v1_decoy\t0\t1589\tDecoy\nchrUn_JTFH01001427v1_decoy\t0\t1588\tDecoy\nchrUn_JTFH01001428v1_decoy\t0\t1585\tDecoy\nchrUn_JTFH01001429v1_decoy\t0\t1584\tDecoy\nchrUn_JTFH01001430v1_decoy\t0\t1584\tDecoy\nchrUn_JTFH01001431v1_decoy\t0\t1580\tDecoy\nchrUn_JTFH01001432v1_decoy\t0\t1572\tDecoy\nchrUn_JTFH01001433v1_decoy\t0\t1570\tDecoy\nchrUn_JTFH01001434v1_decoy\t0\t1569\tDecoy\nchrUn_JTFH01001435v1_decoy\t0\t1568\tDecoy\nchrUn_JTFH01001436v1_decoy\t0\t1567\tDecoy\nchrUn_JTFH01001437v1_decoy\t0\t1565\tDecoy\nchrUn_JTFH01001438v1_decoy\t0\t1559\tDecoy\nchrUn_JTFH01001439v1_decoy\t0\t1559\tDecoy\nchrUn_JTFH01001440v1_decoy\t0\t1556\tDecoy\nchrUn_JTFH01001441v1_decoy\t0\t1554\tDecoy\nchrUn_JTFH01001442v1_decoy\t0\t1549\tDecoy\nchrUn_JTFH01001443v1_decoy\t0\t1542\tDecoy\nchrUn_JTFH01001444v1_decoy\t0\t1541\tDecoy\nchrUn_JTFH01001445v1_decoy\t0\t1538\tDecoy\nchrUn_JTFH01001446v1_decoy\t0\t1537\tDecoy\nchrUn_JTFH01001447v1_decoy\t0\t1535\tDecoy\nchrUn_JTFH01001448v1_decoy\t0\t1530\tDecoy\nchrUn_JTFH01001449v1_decoy\t0\t1528\tDecoy\nchrUn_JTFH01001450v1_decoy\t0\t1522\tDecoy\nchrUn_JTFH01001451v1_decoy\t0\t1514\tDecoy\nchrUn_JTFH01001452v1_decoy\t0\t1509\tDecoy\nchrUn_JTFH01001453v1_decoy\t0\t1507\tDecoy\nchrUn_JTFH01001454v1_decoy\t0\t1500\tDecoy\nchrUn_JTFH01001455v1_decoy\t0\t1499\tDecoy\nchrUn_JTFH01001456v1_decoy\t0\t1499\tDecoy\nchrUn_JTFH01001457v1_decoy\t0\t1497\tDecoy\nchrUn_JTFH01001458v1_decoy\t0\t1496\tDecoy\nchrUn_JTFH01001459v1_decoy\t0\t1488\tDecoy\nchrUn_JTFH01001460v1_decoy\t0\t1486\tDecoy\nchrUn_JTFH01001461v1_decoy\t0\t1485\tDecoy\nchrUn_JTFH01001462v1_decoy\t0\t1481\tDecoy\nchrUn_JTFH01001463v1_decoy\t0\t1479\tDecoy\nchrUn_JTFH01001464v1_decoy\t0\t1472\tDecoy\nchrUn_JTFH01001465v1_decoy\t0\t1472\tDecoy\nchrUn_JTFH01001466v1_decoy\t0\t1470\tDecoy\nchrUn_JTFH01001467v1_decoy\t0\t1466\tDecoy\nchrUn_JTFH01001468v1_decoy\t0\t1465\tDecoy\nchrUn_JTFH01001469v1_decoy\t0\t1461\tDecoy\nchrUn_JTFH01001470v1_decoy\t0\t1458\tDecoy\nchrUn_JTFH01001471v1_decoy\t0\t1457\tDecoy\nchrUn_JTFH01001472v1_decoy\t0\t1448\tDecoy\nchrUn_JTFH01001473v1_decoy\t0\t1447\tDecoy\nchrUn_JTFH01001474v1_decoy\t0\t1444\tDecoy\nchrUn_JTFH01001475v1_decoy\t0\t1443\tDecoy\nchrUn_JTFH01001476v1_decoy\t0\t1443\tDecoy\nchrUn_JTFH01001477v1_decoy\t0\t1438\tDecoy\nchrUn_JTFH01001478v1_decoy\t0\t1432\tDecoy\nchrUn_JTFH01001479v1_decoy\t0\t1430\tDecoy\nchrUn_JTFH01001480v1_decoy\t0\t1430\tDecoy\nchrUn_JTFH01001481v1_decoy\t0\t1429\tDecoy\nchrUn_JTFH01001482v1_decoy\t0\t1429\tDecoy\nchrUn_JTFH01001483v1_decoy\t0\t1429\tDecoy\nchrUn_JTFH01001484v1_decoy\t0\t1426\tDecoy\nchrUn_JTFH01001485v1_decoy\t0\t1426\tDecoy\nchrUn_JTFH01001486v1_decoy\t0\t1420\tDecoy\nchrUn_JTFH01001487v1_decoy\t0\t1416\tDecoy\nchrUn_JTFH01001488v1_decoy\t0\t1416\tDecoy\nchrUn_JTFH01001489v1_decoy\t0\t1415\tDecoy\nchrUn_JTFH01001490v1_decoy\t0\t1415\tDecoy\nchrUn_JTFH01001491v1_decoy\t0\t1414\tDecoy\nchrUn_JTFH01001492v1_decoy\t0\t1413\tDecoy\nchrUn_JTFH01001493v1_decoy\t0\t1410\tDecoy\nchrUn_JTFH01001494v1_decoy\t0\t1405\tDecoy\nchrUn_JTFH01001495v1_decoy\t0\t1402\tDecoy\nchrUn_JTFH01001496v1_decoy\t0\t1398\tDecoy\nchrUn_JTFH01001497v1_decoy\t0\t1397\tDecoy\nchrUn_JTFH01001498v1_decoy\t0\t1395\tDecoy\nchrUn_JTFH01001499v1_decoy\t0\t1392\tDecoy\nchrUn_JTFH01001500v1_decoy\t0\t1388\tDecoy\nchrUn_JTFH01001501v1_decoy\t0\t1386\tDecoy\nchrUn_JTFH01001502v1_decoy\t0\t1382\tDecoy\nchrUn_JTFH01001503v1_decoy\t0\t1381\tDecoy\nchrUn_JTFH01001504v1_decoy\t0\t1379\tDecoy\nchrUn_JTFH01001505v1_decoy\t0\t1376\tDecoy\nchrUn_JTFH01001506v1_decoy\t0\t1374\tDecoy\nchrUn_JTFH01001507v1_decoy\t0\t1374\tDecoy\nchrUn_JTFH01001508v1_decoy\t0\t1373\tDecoy\nchrUn_JTFH01001509v1_decoy\t0\t1373\tDecoy\nchrUn_JTFH01001510v1_decoy\t0\t1372\tDecoy\nchrUn_JTFH01001511v1_decoy\t0\t1370\tDecoy\nchrUn_JTFH01001512v1_decoy\t0\t1367\tDecoy\nchrUn_JTFH01001513v1_decoy\t0\t1365\tDecoy\nchrUn_JTFH01001514v1_decoy\t0\t1364\tDecoy\nchrUn_JTFH01001515v1_decoy\t0\t1361\tDecoy\nchrUn_JTFH01001516v1_decoy\t0\t1361\tDecoy\nchrUn_JTFH01001517v1_decoy\t0\t1355\tDecoy\nchrUn_JTFH01001518v1_decoy\t0\t1355\tDecoy\nchrUn_JTFH01001519v1_decoy\t0\t1354\tDecoy\nchrUn_JTFH01001520v1_decoy\t0\t1353\tDecoy\nchrUn_JTFH01001521v1_decoy\t0\t1349\tDecoy\nchrUn_JTFH01001522v1_decoy\t0\t1345\tDecoy\nchrUn_JTFH01001523v1_decoy\t0\t1344\tDecoy\nchrUn_JTFH01001524v1_decoy\t0\t1343\tDecoy\nchrUn_JTFH01001525v1_decoy\t0\t1338\tDecoy\nchrUn_JTFH01001526v1_decoy\t0\t1338\tDecoy\nchrUn_JTFH01001527v1_decoy\t0\t1338\tDecoy\nchrUn_JTFH01001528v1_decoy\t0\t1336\tDecoy\nchrUn_JTFH01001529v1_decoy\t0\t1333\tDecoy\nchrUn_JTFH01001530v1_decoy\t0\t1333\tDecoy\nchrUn_JTFH01001531v1_decoy\t0\t1332\tDecoy\nchrUn_JTFH01001532v1_decoy\t0\t1324\tDecoy\nchrUn_JTFH01001533v1_decoy\t0\t1323\tDecoy\nchrUn_JTFH01001534v1_decoy\t0\t1323\tDecoy\nchrUn_JTFH01001535v1_decoy\t0\t1320\tDecoy\nchrUn_JTFH01001536v1_decoy\t0\t1320\tDecoy\nchrUn_JTFH01001537v1_decoy\t0\t1317\tDecoy\nchrUn_JTFH01001538v1_decoy\t0\t1316\tDecoy\nchrUn_JTFH01001539v1_decoy\t0\t1304\tDecoy\nchrUn_JTFH01001540v1_decoy\t0\t1304\tDecoy\nchrUn_JTFH01001541v1_decoy\t0\t1303\tDecoy\nchrUn_JTFH01001542v1_decoy\t0\t1302\tDecoy\nchrUn_JTFH01001543v1_decoy\t0\t1301\tDecoy\nchrUn_JTFH01001544v1_decoy\t0\t1300\tDecoy\nchrUn_JTFH01001545v1_decoy\t0\t1298\tDecoy\nchrUn_JTFH01001546v1_decoy\t0\t1297\tDecoy\nchrUn_JTFH01001547v1_decoy\t0\t1295\tDecoy\nchrUn_JTFH01001548v1_decoy\t0\t1284\tDecoy\nchrUn_JTFH01001549v1_decoy\t0\t1283\tDecoy\nchrUn_JTFH01001550v1_decoy\t0\t1283\tDecoy\nchrUn_JTFH01001551v1_decoy\t0\t1279\tDecoy\nchrUn_JTFH01001552v1_decoy\t0\t1278\tDecoy\nchrUn_JTFH01001553v1_decoy\t0\t1271\tDecoy\nchrUn_JTFH01001554v1_decoy\t0\t1271\tDecoy\nchrUn_JTFH01001555v1_decoy\t0\t1268\tDecoy\nchrUn_JTFH01001556v1_decoy\t0\t1264\tDecoy\nchrUn_JTFH01001557v1_decoy\t0\t1263\tDecoy\nchrUn_JTFH01001558v1_decoy\t0\t1262\tDecoy\nchrUn_JTFH01001559v1_decoy\t0\t1261\tDecoy\nchrUn_JTFH01001560v1_decoy\t0\t1260\tDecoy\nchrUn_JTFH01001561v1_decoy\t0\t1259\tDecoy\nchrUn_JTFH01001562v1_decoy\t0\t1259\tDecoy\nchrUn_JTFH01001563v1_decoy\t0\t1258\tDecoy\nchrUn_JTFH01001564v1_decoy\t0\t1256\tDecoy\nchrUn_JTFH01001565v1_decoy\t0\t1253\tDecoy\nchrUn_JTFH01001566v1_decoy\t0\t1248\tDecoy\nchrUn_JTFH01001567v1_decoy\t0\t1248\tDecoy\nchrUn_JTFH01001568v1_decoy\t0\t1246\tDecoy\nchrUn_JTFH01001569v1_decoy\t0\t1246\tDecoy\nchrUn_JTFH01001570v1_decoy\t0\t1244\tDecoy\nchrUn_JTFH01001571v1_decoy\t0\t1238\tDecoy\nchrUn_JTFH01001572v1_decoy\t0\t1238\tDecoy\nchrUn_JTFH01001573v1_decoy\t0\t1236\tDecoy\nchrUn_JTFH01001574v1_decoy\t0\t1234\tDecoy\nchrUn_JTFH01001575v1_decoy\t0\t1234\tDecoy\nchrUn_JTFH01001576v1_decoy\t0\t1231\tDecoy\nchrUn_JTFH01001577v1_decoy\t0\t1231\tDecoy\nchrUn_JTFH01001578v1_decoy\t0\t1230\tDecoy\nchrUn_JTFH01001579v1_decoy\t0\t1230\tDecoy\nchrUn_JTFH01001580v1_decoy\t0\t1228\tDecoy\nchrUn_JTFH01001581v1_decoy\t0\t1227\tDecoy\nchrUn_JTFH01001582v1_decoy\t0\t1222\tDecoy\nchrUn_JTFH01001583v1_decoy\t0\t1222\tDecoy\nchrUn_JTFH01001584v1_decoy\t0\t1221\tDecoy\nchrUn_JTFH01001585v1_decoy\t0\t1221\tDecoy\nchrUn_JTFH01001586v1_decoy\t0\t1220\tDecoy\nchrUn_JTFH01001587v1_decoy\t0\t1218\tDecoy\nchrUn_JTFH01001588v1_decoy\t0\t1218\tDecoy\nchrUn_JTFH01001589v1_decoy\t0\t1216\tDecoy\nchrUn_JTFH01001590v1_decoy\t0\t1216\tDecoy\nchrUn_JTFH01001591v1_decoy\t0\t1212\tDecoy\nchrUn_JTFH01001592v1_decoy\t0\t1210\tDecoy\nchrUn_JTFH01001593v1_decoy\t0\t1209\tDecoy\nchrUn_JTFH01001594v1_decoy\t0\t1208\tDecoy\nchrUn_JTFH01001595v1_decoy\t0\t1208\tDecoy\nchrUn_JTFH01001596v1_decoy\t0\t1206\tDecoy\nchrUn_JTFH01001597v1_decoy\t0\t1205\tDecoy\nchrUn_JTFH01001598v1_decoy\t0\t1205\tDecoy\nchrUn_JTFH01001599v1_decoy\t0\t1202\tDecoy\nchrUn_JTFH01001600v1_decoy\t0\t1200\tDecoy\nchrUn_JTFH01001601v1_decoy\t0\t1199\tDecoy\nchrUn_JTFH01001602v1_decoy\t0\t1198\tDecoy\nchrUn_JTFH01001603v1_decoy\t0\t1198\tDecoy\nchrUn_JTFH01001604v1_decoy\t0\t1198\tDecoy\nchrUn_JTFH01001605v1_decoy\t0\t1195\tDecoy\nchrUn_JTFH01001606v1_decoy\t0\t1194\tDecoy\nchrUn_JTFH01001607v1_decoy\t0\t1191\tDecoy\nchrUn_JTFH01001608v1_decoy\t0\t1189\tDecoy\nchrUn_JTFH01001609v1_decoy\t0\t1188\tDecoy\nchrUn_JTFH01001610v1_decoy\t0\t1180\tDecoy\nchrUn_JTFH01001611v1_decoy\t0\t1180\tDecoy\nchrUn_JTFH01001612v1_decoy\t0\t1179\tDecoy\nchrUn_JTFH01001613v1_decoy\t0\t1172\tDecoy\nchrUn_JTFH01001614v1_decoy\t0\t1168\tDecoy\nchrUn_JTFH01001615v1_decoy\t0\t1166\tDecoy\nchrUn_JTFH01001616v1_decoy\t0\t1157\tDecoy\nchrUn_JTFH01001617v1_decoy\t0\t1156\tDecoy\nchrUn_JTFH01001618v1_decoy\t0\t1156\tDecoy\nchrUn_JTFH01001619v1_decoy\t0\t1155\tDecoy\nchrUn_JTFH01001620v1_decoy\t0\t1154\tDecoy\nchrUn_JTFH01001621v1_decoy\t0\t1154\tDecoy\nchrUn_JTFH01001622v1_decoy\t0\t1149\tDecoy\nchrUn_JTFH01001623v1_decoy\t0\t1143\tDecoy\nchrUn_JTFH01001624v1_decoy\t0\t1143\tDecoy\nchrUn_JTFH01001625v1_decoy\t0\t1140\tDecoy\nchrUn_JTFH01001626v1_decoy\t0\t1137\tDecoy\nchrUn_JTFH01001627v1_decoy\t0\t1135\tDecoy\nchrUn_JTFH01001628v1_decoy\t0\t1135\tDecoy\nchrUn_JTFH01001629v1_decoy\t0\t1135\tDecoy\nchrUn_JTFH01001630v1_decoy\t0\t1127\tDecoy\nchrUn_JTFH01001631v1_decoy\t0\t1127\tDecoy\nchrUn_JTFH01001632v1_decoy\t0\t1126\tDecoy\nchrUn_JTFH01001633v1_decoy\t0\t1123\tDecoy\nchrUn_JTFH01001634v1_decoy\t0\t1123\tDecoy\nchrUn_JTFH01001635v1_decoy\t0\t1123\tDecoy\nchrUn_JTFH01001636v1_decoy\t0\t1122\tDecoy\nchrUn_JTFH01001637v1_decoy\t0\t1122\tDecoy\nchrUn_JTFH01001638v1_decoy\t0\t1121\tDecoy\nchrUn_JTFH01001639v1_decoy\t0\t1121\tDecoy\nchrUn_JTFH01001640v1_decoy\t0\t1119\tDecoy\nchrUn_JTFH01001641v1_decoy\t0\t1119\tDecoy\nchrUn_JTFH01001642v1_decoy\t0\t1119\tDecoy\nchrUn_JTFH01001643v1_decoy\t0\t1118\tDecoy\nchrUn_JTFH01001644v1_decoy\t0\t1115\tDecoy\nchrUn_JTFH01001645v1_decoy\t0\t1106\tDecoy\nchrUn_JTFH01001646v1_decoy\t0\t1106\tDecoy\nchrUn_JTFH01001647v1_decoy\t0\t1104\tDecoy\nchrUn_JTFH01001648v1_decoy\t0\t1102\tDecoy\nchrUn_JTFH01001649v1_decoy\t0\t1101\tDecoy\nchrUn_JTFH01001650v1_decoy\t0\t1098\tDecoy\nchrUn_JTFH01001651v1_decoy\t0\t1098\tDecoy\nchrUn_JTFH01001652v1_decoy\t0\t1096\tDecoy\nchrUn_JTFH01001653v1_decoy\t0\t1096\tDecoy\nchrUn_JTFH01001654v1_decoy\t0\t1095\tDecoy\nchrUn_JTFH01001655v1_decoy\t0\t1093\tDecoy\nchrUn_JTFH01001656v1_decoy\t0\t1090\tDecoy\nchrUn_JTFH01001657v1_decoy\t0\t1089\tDecoy\nchrUn_JTFH01001658v1_decoy\t0\t1087\tDecoy\nchrUn_JTFH01001659v1_decoy\t0\t1087\tDecoy\nchrUn_JTFH01001660v1_decoy\t0\t1085\tDecoy\nchrUn_JTFH01001661v1_decoy\t0\t1085\tDecoy\nchrUn_JTFH01001662v1_decoy\t0\t1085\tDecoy\nchrUn_JTFH01001663v1_decoy\t0\t1083\tDecoy\nchrUn_JTFH01001664v1_decoy\t0\t1080\tDecoy\nchrUn_JTFH01001665v1_decoy\t0\t1080\tDecoy\nchrUn_JTFH01001666v1_decoy\t0\t1079\tDecoy\nchrUn_JTFH01001667v1_decoy\t0\t1079\tDecoy\nchrUn_JTFH01001668v1_decoy\t0\t1079\tDecoy\nchrUn_JTFH01001669v1_decoy\t0\t1075\tDecoy\nchrUn_JTFH01001670v1_decoy\t0\t1074\tDecoy\nchrUn_JTFH01001671v1_decoy\t0\t1073\tDecoy\nchrUn_JTFH01001672v1_decoy\t0\t1070\tDecoy\nchrUn_JTFH01001673v1_decoy\t0\t1068\tDecoy\nchrUn_JTFH01001674v1_decoy\t0\t1067\tDecoy\nchrUn_JTFH01001675v1_decoy\t0\t1066\tDecoy\nchrUn_JTFH01001676v1_decoy\t0\t1066\tDecoy\nchrUn_JTFH01001677v1_decoy\t0\t1066\tDecoy\nchrUn_JTFH01001678v1_decoy\t0\t1063\tDecoy\nchrUn_JTFH01001679v1_decoy\t0\t1063\tDecoy\nchrUn_JTFH01001680v1_decoy\t0\t1063\tDecoy\nchrUn_JTFH01001681v1_decoy\t0\t1062\tDecoy\nchrUn_JTFH01001682v1_decoy\t0\t1058\tDecoy\nchrUn_JTFH01001683v1_decoy\t0\t1056\tDecoy\nchrUn_JTFH01001684v1_decoy\t0\t1052\tDecoy\nchrUn_JTFH01001685v1_decoy\t0\t1051\tDecoy\nchrUn_JTFH01001686v1_decoy\t0\t1051\tDecoy\nchrUn_JTFH01001687v1_decoy\t0\t1050\tDecoy\nchrUn_JTFH01001688v1_decoy\t0\t1048\tDecoy\nchrUn_JTFH01001689v1_decoy\t0\t1046\tDecoy\nchrUn_JTFH01001690v1_decoy\t0\t1046\tDecoy\nchrUn_JTFH01001691v1_decoy\t0\t1045\tDecoy\nchrUn_JTFH01001692v1_decoy\t0\t1043\tDecoy\nchrUn_JTFH01001693v1_decoy\t0\t1038\tDecoy\nchrUn_JTFH01001694v1_decoy\t0\t1036\tDecoy\nchrUn_JTFH01001695v1_decoy\t0\t1035\tDecoy\nchrUn_JTFH01001696v1_decoy\t0\t1035\tDecoy\nchrUn_JTFH01001697v1_decoy\t0\t1035\tDecoy\nchrUn_JTFH01001698v1_decoy\t0\t1033\tDecoy\nchrUn_JTFH01001699v1_decoy\t0\t1032\tDecoy\nchrUn_JTFH01001700v1_decoy\t0\t1031\tDecoy\nchrUn_JTFH01001701v1_decoy\t0\t1026\tDecoy\nchrUn_JTFH01001702v1_decoy\t0\t1026\tDecoy\nchrUn_JTFH01001703v1_decoy\t0\t1026\tDecoy\nchrUn_JTFH01001704v1_decoy\t0\t1023\tDecoy\nchrUn_JTFH01001705v1_decoy\t0\t1022\tDecoy\nchrUn_JTFH01001706v1_decoy\t0\t1020\tDecoy\nchrUn_JTFH01001707v1_decoy\t0\t1020\tDecoy\nchrUn_JTFH01001708v1_decoy\t0\t1020\tDecoy\nchrUn_JTFH01001709v1_decoy\t0\t1019\tDecoy\nchrUn_JTFH01001710v1_decoy\t0\t1018\tDecoy\nchrUn_JTFH01001711v1_decoy\t0\t1018\tDecoy\nchrUn_JTFH01001712v1_decoy\t0\t1017\tDecoy\nchrUn_JTFH01001713v1_decoy\t0\t1015\tDecoy\nchrUn_JTFH01001714v1_decoy\t0\t1015\tDecoy\nchrUn_JTFH01001715v1_decoy\t0\t1015\tDecoy\nchrUn_JTFH01001716v1_decoy\t0\t1014\tDecoy\nchrUn_JTFH01001717v1_decoy\t0\t1014\tDecoy\nchrUn_JTFH01001718v1_decoy\t0\t1013\tDecoy\nchrUn_JTFH01001719v1_decoy\t0\t1013\tDecoy\nchrUn_JTFH01001720v1_decoy\t0\t1013\tDecoy\nchrUn_JTFH01001721v1_decoy\t0\t1012\tDecoy\nchrUn_JTFH01001722v1_decoy\t0\t1011\tDecoy\nchrUn_JTFH01001723v1_decoy\t0\t1011\tDecoy\nchrUn_JTFH01001724v1_decoy\t0\t1009\tDecoy\nchrUn_JTFH01001725v1_decoy\t0\t1008\tDecoy\nchrUn_JTFH01001726v1_decoy\t0\t1008\tDecoy\nchrUn_JTFH01001727v1_decoy\t0\t1007\tDecoy\nchrUn_JTFH01001728v1_decoy\t0\t1007\tDecoy\nchrUn_JTFH01001729v1_decoy\t0\t1007\tDecoy\nchrUn_JTFH01001730v1_decoy\t0\t1006\tDecoy\nchrUn_JTFH01001731v1_decoy\t0\t1005\tDecoy\nchrUn_JTFH01001732v1_decoy\t0\t1003\tDecoy\nchrUn_JTFH01001733v1_decoy\t0\t1001\tDecoy\nchrUn_JTFH01001734v1_decoy\t0\t1000\tDecoy\nchrUn_JTFH01001735v1_decoy\t0\t19311\tDecoy\nchrUn_JTFH01001736v1_decoy\t0\t11713\tDecoy\nchrUn_JTFH01001737v1_decoy\t0\t11263\tDecoy\nchrUn_JTFH01001738v1_decoy\t0\t9779\tDecoy\nchrUn_JTFH01001739v1_decoy\t0\t9568\tDecoy\nchrUn_JTFH01001740v1_decoy\t0\t9344\tDecoy\nchrUn_JTFH01001741v1_decoy\t0\t9188\tDecoy\nchrUn_JTFH01001742v1_decoy\t0\t9100\tDecoy\nchrUn_JTFH01001743v1_decoy\t0\t8771\tDecoy\nchrUn_JTFH01001744v1_decoy\t0\t8690\tDecoy\nchrUn_JTFH01001745v1_decoy\t0\t8566\tDecoy\nchrUn_JTFH01001746v1_decoy\t0\t8058\tDecoy\nchrUn_JTFH01001747v1_decoy\t0\t7759\tDecoy\nchrUn_JTFH01001748v1_decoy\t0\t7585\tDecoy\nchrUn_JTFH01001749v1_decoy\t0\t7471\tDecoy\nchrUn_JTFH01001750v1_decoy\t0\t7461\tDecoy\nchrUn_JTFH01001751v1_decoy\t0\t7342\tDecoy\nchrUn_JTFH01001752v1_decoy\t0\t7223\tDecoy\nchrUn_JTFH01001753v1_decoy\t0\t7064\tDecoy\nchrUn_JTFH01001754v1_decoy\t0\t6916\tDecoy\nchrUn_JTFH01001755v1_decoy\t0\t6897\tDecoy\nchrUn_JTFH01001756v1_decoy\t0\t6880\tDecoy\nchrUn_JTFH01001757v1_decoy\t0\t6857\tDecoy\nchrUn_JTFH01001758v1_decoy\t0\t6840\tDecoy\nchrUn_JTFH01001759v1_decoy\t0\t6728\tDecoy\nchrUn_JTFH01001760v1_decoy\t0\t6688\tDecoy\nchrUn_JTFH01001761v1_decoy\t0\t6553\tDecoy\nchrUn_JTFH01001762v1_decoy\t0\t6396\tDecoy\nchrUn_JTFH01001763v1_decoy\t0\t6345\tDecoy\nchrUn_JTFH01001764v1_decoy\t0\t6295\tDecoy\nchrUn_JTFH01001765v1_decoy\t0\t6266\tDecoy\nchrUn_JTFH01001766v1_decoy\t0\t6173\tDecoy\nchrUn_JTFH01001767v1_decoy\t0\t6171\tDecoy\nchrUn_JTFH01001768v1_decoy\t0\t6120\tDecoy\nchrUn_JTFH01001769v1_decoy\t0\t6105\tDecoy\nchrUn_JTFH01001770v1_decoy\t0\t6099\tDecoy\nchrUn_JTFH01001771v1_decoy\t0\t5893\tDecoy\nchrUn_JTFH01001772v1_decoy\t0\t5829\tDecoy\nchrUn_JTFH01001773v1_decoy\t0\t5793\tDecoy\nchrUn_JTFH01001774v1_decoy\t0\t5776\tDecoy\nchrUn_JTFH01001775v1_decoy\t0\t5759\tDecoy\nchrUn_JTFH01001776v1_decoy\t0\t5716\tDecoy\nchrUn_JTFH01001777v1_decoy\t0\t5708\tDecoy\nchrUn_JTFH01001778v1_decoy\t0\t5590\tDecoy\nchrUn_JTFH01001779v1_decoy\t0\t5566\tDecoy\nchrUn_JTFH01001780v1_decoy\t0\t5558\tDecoy\nchrUn_JTFH01001781v1_decoy\t0\t5418\tDecoy\nchrUn_JTFH01001782v1_decoy\t0\t5375\tDecoy\nchrUn_JTFH01001783v1_decoy\t0\t5300\tDecoy\nchrUn_JTFH01001784v1_decoy\t0\t5255\tDecoy\nchrUn_JTFH01001785v1_decoy\t0\t5157\tDecoy\nchrUn_JTFH01001786v1_decoy\t0\t5130\tDecoy\nchrUn_JTFH01001787v1_decoy\t0\t4978\tDecoy\nchrUn_JTFH01001788v1_decoy\t0\t4957\tDecoy\nchrUn_JTFH01001789v1_decoy\t0\t4947\tDecoy\nchrUn_JTFH01001790v1_decoy\t0\t4897\tDecoy\nchrUn_JTFH01001791v1_decoy\t0\t4867\tDecoy\nchrUn_JTFH01001792v1_decoy\t0\t4845\tDecoy\nchrUn_JTFH01001793v1_decoy\t0\t4678\tDecoy\nchrUn_JTFH01001794v1_decoy\t0\t4641\tDecoy\nchrUn_JTFH01001795v1_decoy\t0\t4592\tDecoy\nchrUn_JTFH01001796v1_decoy\t0\t4543\tDecoy\nchrUn_JTFH01001797v1_decoy\t0\t4532\tDecoy\nchrUn_JTFH01001798v1_decoy\t0\t4503\tDecoy\nchrUn_JTFH01001799v1_decoy\t0\t4495\tDecoy\nchrUn_JTFH01001800v1_decoy\t0\t4444\tDecoy\nchrUn_JTFH01001801v1_decoy\t0\t4414\tDecoy\nchrUn_JTFH01001802v1_decoy\t0\t4409\tDecoy\nchrUn_JTFH01001803v1_decoy\t0\t4302\tDecoy\nchrUn_JTFH01001804v1_decoy\t0\t4300\tDecoy\nchrUn_JTFH01001805v1_decoy\t0\t4277\tDecoy\nchrUn_JTFH01001806v1_decoy\t0\t4173\tDecoy\nchrUn_JTFH01001807v1_decoy\t0\t4169\tDecoy\nchrUn_JTFH01001808v1_decoy\t0\t4136\tDecoy\nchrUn_JTFH01001809v1_decoy\t0\t4101\tDecoy\nchrUn_JTFH01001810v1_decoy\t0\t4089\tDecoy\nchrUn_JTFH01001811v1_decoy\t0\t4015\tDecoy\nchrUn_JTFH01001812v1_decoy\t0\t4000\tDecoy\nchrUn_JTFH01001813v1_decoy\t0\t3973\tDecoy\nchrUn_JTFH01001814v1_decoy\t0\t3732\tDecoy\nchrUn_JTFH01001815v1_decoy\t0\t3709\tDecoy\nchrUn_JTFH01001816v1_decoy\t0\t3686\tDecoy\nchrUn_JTFH01001817v1_decoy\t0\t3676\tDecoy\nchrUn_JTFH01001818v1_decoy\t0\t3673\tDecoy\nchrUn_JTFH01001819v1_decoy\t0\t3672\tDecoy\nchrUn_JTFH01001820v1_decoy\t0\t3633\tDecoy\nchrUn_JTFH01001821v1_decoy\t0\t3633\tDecoy\nchrUn_JTFH01001822v1_decoy\t0\t3613\tDecoy\nchrUn_JTFH01001823v1_decoy\t0\t3605\tDecoy\nchrUn_JTFH01001824v1_decoy\t0\t3592\tDecoy\nchrUn_JTFH01001825v1_decoy\t0\t3586\tDecoy\nchrUn_JTFH01001826v1_decoy\t0\t3584\tDecoy\nchrUn_JTFH01001827v1_decoy\t0\t3577\tDecoy\nchrUn_JTFH01001828v1_decoy\t0\t3537\tDecoy\nchrUn_JTFH01001829v1_decoy\t0\t3510\tDecoy\nchrUn_JTFH01001830v1_decoy\t0\t3509\tDecoy\nchrUn_JTFH01001831v1_decoy\t0\t3488\tDecoy\nchrUn_JTFH01001832v1_decoy\t0\t3473\tDecoy\nchrUn_JTFH01001833v1_decoy\t0\t3445\tDecoy\nchrUn_JTFH01001834v1_decoy\t0\t3427\tDecoy\nchrUn_JTFH01001835v1_decoy\t0\t3395\tDecoy\nchrUn_JTFH01001836v1_decoy\t0\t3367\tDecoy\nchrUn_JTFH01001837v1_decoy\t0\t3337\tDecoy\nchrUn_JTFH01001838v1_decoy\t0\t3324\tDecoy\nchrUn_JTFH01001839v1_decoy\t0\t3315\tDecoy\nchrUn_JTFH01001840v1_decoy\t0\t3313\tDecoy\nchrUn_JTFH01001841v1_decoy\t0\t3283\tDecoy\nchrUn_JTFH01001842v1_decoy\t0\t3250\tDecoy\nchrUn_JTFH01001843v1_decoy\t0\t3247\tDecoy\nchrUn_JTFH01001844v1_decoy\t0\t3237\tDecoy\nchrUn_JTFH01001845v1_decoy\t0\t3235\tDecoy\nchrUn_JTFH01001846v1_decoy\t0\t3200\tDecoy\nchrUn_JTFH01001847v1_decoy\t0\t3195\tDecoy\nchrUn_JTFH01001848v1_decoy\t0\t3175\tDecoy\nchrUn_JTFH01001849v1_decoy\t0\t3158\tDecoy\nchrUn_JTFH01001850v1_decoy\t0\t3143\tDecoy\nchrUn_JTFH01001851v1_decoy\t0\t3139\tDecoy\nchrUn_JTFH01001852v1_decoy\t0\t3138\tDecoy\nchrUn_JTFH01001853v1_decoy\t0\t3136\tDecoy\nchrUn_JTFH01001854v1_decoy\t0\t3132\tDecoy\nchrUn_JTFH01001855v1_decoy\t0\t3132\tDecoy\nchrUn_JTFH01001856v1_decoy\t0\t3095\tDecoy\nchrUn_JTFH01001857v1_decoy\t0\t3094\tDecoy\nchrUn_JTFH01001858v1_decoy\t0\t3093\tDecoy\nchrUn_JTFH01001859v1_decoy\t0\t3059\tDecoy\nchrUn_JTFH01001860v1_decoy\t0\t2985\tDecoy\nchrUn_JTFH01001861v1_decoy\t0\t2975\tDecoy\nchrUn_JTFH01001862v1_decoy\t0\t2967\tDecoy\nchrUn_JTFH01001863v1_decoy\t0\t2961\tDecoy\nchrUn_JTFH01001864v1_decoy\t0\t2955\tDecoy\nchrUn_JTFH01001865v1_decoy\t0\t2935\tDecoy\nchrUn_JTFH01001866v1_decoy\t0\t2933\tDecoy\nchrUn_JTFH01001867v1_decoy\t0\t2909\tDecoy\nchrUn_JTFH01001868v1_decoy\t0\t2904\tDecoy\nchrUn_JTFH01001869v1_decoy\t0\t2892\tDecoy\nchrUn_JTFH01001870v1_decoy\t0\t2886\tDecoy\nchrUn_JTFH01001871v1_decoy\t0\t2885\tDecoy\nchrUn_JTFH01001872v1_decoy\t0\t2878\tDecoy\nchrUn_JTFH01001873v1_decoy\t0\t2875\tDecoy\nchrUn_JTFH01001874v1_decoy\t0\t2861\tDecoy\nchrUn_JTFH01001875v1_decoy\t0\t2856\tDecoy\nchrUn_JTFH01001876v1_decoy\t0\t2838\tDecoy\nchrUn_JTFH01001877v1_decoy\t0\t2801\tDecoy\nchrUn_JTFH01001878v1_decoy\t0\t2797\tDecoy\nchrUn_JTFH01001879v1_decoy\t0\t2788\tDecoy\nchrUn_JTFH01001880v1_decoy\t0\t2773\tDecoy\nchrUn_JTFH01001881v1_decoy\t0\t2755\tDecoy\nchrUn_JTFH01001882v1_decoy\t0\t2754\tDecoy\nchrUn_JTFH01001883v1_decoy\t0\t2743\tDecoy\nchrUn_JTFH01001884v1_decoy\t0\t2725\tDecoy\nchrUn_JTFH01001885v1_decoy\t0\t2722\tDecoy\nchrUn_JTFH01001886v1_decoy\t0\t2682\tDecoy\nchrUn_JTFH01001887v1_decoy\t0\t2669\tDecoy\nchrUn_JTFH01001888v1_decoy\t0\t2663\tDecoy\nchrUn_JTFH01001889v1_decoy\t0\t2652\tDecoy\nchrUn_JTFH01001890v1_decoy\t0\t2647\tDecoy\nchrUn_JTFH01001891v1_decoy\t0\t2635\tDecoy\nchrUn_JTFH01001892v1_decoy\t0\t2633\tDecoy\nchrUn_JTFH01001893v1_decoy\t0\t2629\tDecoy\nchrUn_JTFH01001894v1_decoy\t0\t2612\tDecoy\nchrUn_JTFH01001895v1_decoy\t0\t2599\tDecoy\nchrUn_JTFH01001896v1_decoy\t0\t2566\tDecoy\nchrUn_JTFH01001897v1_decoy\t0\t2556\tDecoy\nchrUn_JTFH01001898v1_decoy\t0\t2551\tDecoy\nchrUn_JTFH01001899v1_decoy\t0\t2551\tDecoy\nchrUn_JTFH01001900v1_decoy\t0\t2538\tDecoy\nchrUn_JTFH01001901v1_decoy\t0\t2538\tDecoy\nchrUn_JTFH01001902v1_decoy\t0\t2525\tDecoy\nchrUn_JTFH01001903v1_decoy\t0\t2498\tDecoy\nchrUn_JTFH01001904v1_decoy\t0\t2496\tDecoy\nchrUn_JTFH01001905v1_decoy\t0\t2483\tDecoy\nchrUn_JTFH01001906v1_decoy\t0\t2475\tDecoy\nchrUn_JTFH01001907v1_decoy\t0\t2469\tDecoy\nchrUn_JTFH01001908v1_decoy\t0\t2455\tDecoy\nchrUn_JTFH01001909v1_decoy\t0\t2444\tDecoy\nchrUn_JTFH01001910v1_decoy\t0\t2437\tDecoy\nchrUn_JTFH01001911v1_decoy\t0\t2435\tDecoy\nchrUn_JTFH01001912v1_decoy\t0\t2427\tDecoy\nchrUn_JTFH01001913v1_decoy\t0\t2419\tDecoy\nchrUn_JTFH01001914v1_decoy\t0\t2413\tDecoy\nchrUn_JTFH01001915v1_decoy\t0\t2412\tDecoy\nchrUn_JTFH01001916v1_decoy\t0\t2400\tDecoy\nchrUn_JTFH01001917v1_decoy\t0\t2399\tDecoy\nchrUn_JTFH01001918v1_decoy\t0\t2396\tDecoy\nchrUn_JTFH01001919v1_decoy\t0\t2393\tDecoy\nchrUn_JTFH01001920v1_decoy\t0\t2386\tDecoy\nchrUn_JTFH01001921v1_decoy\t0\t2384\tDecoy\nchrUn_JTFH01001922v1_decoy\t0\t2382\tDecoy\nchrUn_JTFH01001923v1_decoy\t0\t2382\tDecoy\nchrUn_JTFH01001924v1_decoy\t0\t2367\tDecoy\nchrUn_JTFH01001925v1_decoy\t0\t2366\tDecoy\nchrUn_JTFH01001926v1_decoy\t0\t2362\tDecoy\nchrUn_JTFH01001927v1_decoy\t0\t2361\tDecoy\nchrUn_JTFH01001928v1_decoy\t0\t2353\tDecoy\nchrUn_JTFH01001929v1_decoy\t0\t2349\tDecoy\nchrUn_JTFH01001930v1_decoy\t0\t2348\tDecoy\nchrUn_JTFH01001931v1_decoy\t0\t2340\tDecoy\nchrUn_JTFH01001932v1_decoy\t0\t2339\tDecoy\nchrUn_JTFH01001933v1_decoy\t0\t2336\tDecoy\nchrUn_JTFH01001934v1_decoy\t0\t2333\tDecoy\nchrUn_JTFH01001935v1_decoy\t0\t2330\tDecoy\nchrUn_JTFH01001936v1_decoy\t0\t2327\tDecoy\nchrUn_JTFH01001937v1_decoy\t0\t2318\tDecoy\nchrUn_JTFH01001938v1_decoy\t0\t2293\tDecoy\nchrUn_JTFH01001939v1_decoy\t0\t2292\tDecoy\nchrUn_JTFH01001940v1_decoy\t0\t2287\tDecoy\nchrUn_JTFH01001941v1_decoy\t0\t2274\tDecoy\nchrUn_JTFH01001942v1_decoy\t0\t2274\tDecoy\nchrUn_JTFH01001943v1_decoy\t0\t2267\tDecoy\nchrUn_JTFH01001944v1_decoy\t0\t2260\tDecoy\nchrUn_JTFH01001945v1_decoy\t0\t2257\tDecoy\nchrUn_JTFH01001946v1_decoy\t0\t2240\tDecoy\nchrUn_JTFH01001947v1_decoy\t0\t2239\tDecoy\nchrUn_JTFH01001948v1_decoy\t0\t2232\tDecoy\nchrUn_JTFH01001949v1_decoy\t0\t2230\tDecoy\nchrUn_JTFH01001950v1_decoy\t0\t2230\tDecoy\nchrUn_JTFH01001951v1_decoy\t0\t2222\tDecoy\nchrUn_JTFH01001952v1_decoy\t0\t2216\tDecoy\nchrUn_JTFH01001953v1_decoy\t0\t2214\tDecoy\nchrUn_JTFH01001954v1_decoy\t0\t2210\tDecoy\nchrUn_JTFH01001955v1_decoy\t0\t2203\tDecoy\nchrUn_JTFH01001956v1_decoy\t0\t2197\tDecoy\nchrUn_JTFH01001957v1_decoy\t0\t2196\tDecoy\nchrUn_JTFH01001958v1_decoy\t0\t2196\tDecoy\nchrUn_JTFH01001959v1_decoy\t0\t2179\tDecoy\nchrUn_JTFH01001960v1_decoy\t0\t2178\tDecoy\nchrUn_JTFH01001961v1_decoy\t0\t2178\tDecoy\nchrUn_JTFH01001962v1_decoy\t0\t2172\tDecoy\nchrUn_JTFH01001963v1_decoy\t0\t2170\tDecoy\nchrUn_JTFH01001964v1_decoy\t0\t2167\tDecoy\nchrUn_JTFH01001965v1_decoy\t0\t2167\tDecoy\nchrUn_JTFH01001966v1_decoy\t0\t2157\tDecoy\nchrUn_JTFH01001967v1_decoy\t0\t2153\tDecoy\nchrUn_JTFH01001968v1_decoy\t0\t2151\tDecoy\nchrUn_JTFH01001969v1_decoy\t0\t2147\tDecoy\nchrUn_JTFH01001970v1_decoy\t0\t2145\tDecoy\nchrUn_JTFH01001971v1_decoy\t0\t2142\tDecoy\nchrUn_JTFH01001972v1_decoy\t0\t2142\tDecoy\nchrUn_JTFH01001973v1_decoy\t0\t2136\tDecoy\nchrUn_JTFH01001974v1_decoy\t0\t2130\tDecoy\nchrUn_JTFH01001975v1_decoy\t0\t2128\tDecoy\nchrUn_JTFH01001976v1_decoy\t0\t2126\tDecoy\nchrUn_JTFH01001977v1_decoy\t0\t2126\tDecoy\nchrUn_JTFH01001978v1_decoy\t0\t2119\tDecoy\nchrUn_JTFH01001979v1_decoy\t0\t2107\tDecoy\nchrUn_JTFH01001980v1_decoy\t0\t2091\tDecoy\nchrUn_JTFH01001981v1_decoy\t0\t2087\tDecoy\nchrUn_JTFH01001982v1_decoy\t0\t2086\tDecoy\nchrUn_JTFH01001983v1_decoy\t0\t2083\tDecoy\nchrUn_JTFH01001984v1_decoy\t0\t2075\tDecoy\nchrUn_JTFH01001985v1_decoy\t0\t2075\tDecoy\nchrUn_JTFH01001986v1_decoy\t0\t2072\tDecoy\nchrUn_JTFH01001987v1_decoy\t0\t2068\tDecoy\nchrUn_JTFH01001988v1_decoy\t0\t2067\tDecoy\nchrUn_JTFH01001989v1_decoy\t0\t2055\tDecoy\nchrUn_JTFH01001990v1_decoy\t0\t2051\tDecoy\nchrUn_JTFH01001991v1_decoy\t0\t2050\tDecoy\nchrUn_JTFH01001992v1_decoy\t0\t2033\tDecoy\nchrUn_JTFH01001993v1_decoy\t0\t2024\tDecoy\nchrUn_JTFH01001994v1_decoy\t0\t2016\tDecoy\nchrUn_JTFH01001995v1_decoy\t0\t2011\tDecoy\nchrUn_JTFH01001996v1_decoy\t0\t2009\tDecoy\nchrUn_JTFH01001997v1_decoy\t0\t2003\tDecoy\nchrUn_JTFH01001998v1_decoy\t0\t2001\tDecoy\n"
  },
  {
    "path": "tracks/hg38_arms_excl_centromeres.bed",
    "content": "chr1\t0\t121700000\nchr1\t14300000\t12000000\nchr1\t15400000\t58000000\nchr1\t18700000\t24400000\nchr1\t19000000\t17000000\nchr1\t19500000\t16000000\nchr1\t20500000\t35300000\nchr1\t25800000\t15400000\nchr1\t28000000\t25800000\nchr1\t30000000\t10900000\nchr1\t38200000\t22100000\nchr1\t38600000\t16000000\nchr1\t42900000\t51400000\nchr1\t48100000\t47100000\nchr1\t50700000\t46100000\nchr1\t50700000\t58600000\nchr1\t50700000\t39100000\nchr1\t55800000\t34700000\nchr1\t61900000\t248956422\nchr1\t62700000\t43900000\nchr1\t63400000\t58000000\nchr1\t94000000\t87800000\nchr1\t94000000\t48200000\nchr1\t124600000\t91800000\nchr2\t0\t121700000\nchr2\t14300000\t12000000\nchr2\t15400000\t58000000\nchr2\t18700000\t24400000\nchr2\t19000000\t17000000\nchr2\t19500000\t16000000\nchr2\t20500000\t35300000\nchr2\t25800000\t15400000\nchr2\t28000000\t25800000\nchr2\t30000000\t10900000\nchr2\t38200000\t22100000\nchr2\t38600000\t16000000\nchr2\t42900000\t51400000\nchr2\t48100000\t47100000\nchr2\t50700000\t46100000\nchr2\t50700000\t58600000\nchr2\t50700000\t39100000\nchr2\t55800000\t34700000\nchr2\t61900000\t242193529\nchr2\t62700000\t43900000\nchr2\t63400000\t58000000\nchr2\t94000000\t87800000\nchr2\t94000000\t48200000\nchr2\t124600000\t91800000\nchr3\t0\t121700000\nchr3\t14300000\t12000000\nchr3\t15400000\t58000000\nchr3\t18700000\t24400000\nchr3\t19000000\t17000000\nchr3\t19500000\t16000000\nchr3\t20500000\t35300000\nchr3\t25800000\t15400000\nchr3\t28000000\t25800000\nchr3\t30000000\t10900000\nchr3\t38200000\t22100000\nchr3\t38600000\t16000000\nchr3\t42900000\t51400000\nchr3\t48100000\t47100000\nchr3\t50700000\t46100000\nchr3\t50700000\t58600000\nchr3\t50700000\t39100000\nchr3\t55800000\t34700000\nchr3\t61900000\t198295559\nchr3\t62700000\t43900000\nchr3\t63400000\t58000000\nchr3\t94000000\t87800000\nchr3\t94000000\t48200000\nchr3\t124600000\t91800000\nchr4\t0\t121700000\nchr4\t14300000\t12000000\nchr4\t15400000\t58000000\nchr4\t18700000\t24400000\nchr4\t19000000\t17000000\nchr4\t19500000\t16000000\nchr4\t20500000\t35300000\nchr4\t25800000\t15400000\nchr4\t28000000\t25800000\nchr4\t30000000\t10900000\nchr4\t38200000\t22100000\nchr4\t38600000\t16000000\nchr4\t42900000\t51400000\nchr4\t48100000\t47100000\nchr4\t50700000\t46100000\nchr4\t50700000\t58600000\nchr4\t50700000\t39100000\nchr4\t55800000\t34700000\nchr4\t61900000\t190214555\nchr4\t62700000\t43900000\nchr4\t63400000\t58000000\nchr4\t94000000\t87800000\nchr4\t94000000\t48200000\nchr4\t124600000\t91800000\nchr5\t0\t121700000\nchr5\t14300000\t12000000\nchr5\t15400000\t58000000\nchr5\t18700000\t24400000\nchr5\t19000000\t17000000\nchr5\t19500000\t16000000\nchr5\t20500000\t35300000\nchr5\t25800000\t15400000\nchr5\t28000000\t25800000\nchr5\t30000000\t10900000\nchr5\t38200000\t22100000\nchr5\t38600000\t16000000\nchr5\t42900000\t51400000\nchr5\t48100000\t47100000\nchr5\t50700000\t46100000\nchr5\t50700000\t58600000\nchr5\t50700000\t39100000\nchr5\t55800000\t34700000\nchr5\t61900000\t181538259\nchr5\t62700000\t43900000\nchr5\t63400000\t58000000\nchr5\t94000000\t87800000\nchr5\t94000000\t48200000\nchr5\t124600000\t91800000\nchr6\t0\t121700000\nchr6\t14300000\t12000000\nchr6\t15400000\t58000000\nchr6\t18700000\t24400000\nchr6\t19000000\t17000000\nchr6\t19500000\t16000000\nchr6\t20500000\t35300000\nchr6\t25800000\t15400000\nchr6\t28000000\t25800000\nchr6\t30000000\t10900000\nchr6\t38200000\t22100000\nchr6\t38600000\t16000000\nchr6\t42900000\t51400000\nchr6\t48100000\t47100000\nchr6\t50700000\t46100000\nchr6\t50700000\t58600000\nchr6\t50700000\t39100000\nchr6\t55800000\t34700000\nchr6\t61900000\t170805979\nchr6\t62700000\t43900000\nchr6\t63400000\t58000000\nchr6\t94000000\t87800000\nchr6\t94000000\t48200000\nchr6\t124600000\t91800000\nchr7\t0\t121700000\nchr7\t14300000\t12000000\nchr7\t15400000\t58000000\nchr7\t18700000\t24400000\nchr7\t19000000\t17000000\nchr7\t19500000\t16000000\nchr7\t20500000\t35300000\nchr7\t25800000\t15400000\nchr7\t28000000\t25800000\nchr7\t30000000\t10900000\nchr7\t38200000\t22100000\nchr7\t38600000\t16000000\nchr7\t42900000\t51400000\nchr7\t48100000\t47100000\nchr7\t50700000\t46100000\nchr7\t50700000\t58600000\nchr7\t50700000\t39100000\nchr7\t55800000\t34700000\nchr7\t61900000\t159345973\nchr7\t62700000\t43900000\nchr7\t63400000\t58000000\nchr7\t94000000\t87800000\nchr7\t94000000\t48200000\nchr7\t124600000\t91800000\nchr8\t0\t121700000\nchr8\t14300000\t12000000\nchr8\t15400000\t58000000\nchr8\t18700000\t24400000\nchr8\t19000000\t17000000\nchr8\t19500000\t16000000\nchr8\t20500000\t35300000\nchr8\t25800000\t15400000\nchr8\t28000000\t25800000\nchr8\t30000000\t10900000\nchr8\t38200000\t22100000\nchr8\t38600000\t16000000\nchr8\t42900000\t51400000\nchr8\t48100000\t47100000\nchr8\t50700000\t46100000\nchr8\t50700000\t58600000\nchr8\t50700000\t39100000\nchr8\t55800000\t34700000\nchr8\t61900000\t145138636\nchr8\t62700000\t43900000\nchr8\t63400000\t58000000\nchr8\t94000000\t87800000\nchr8\t94000000\t48200000\nchr8\t124600000\t91800000\nchr9\t0\t121700000\nchr9\t14300000\t12000000\nchr9\t15400000\t58000000\nchr9\t18700000\t24400000\nchr9\t19000000\t17000000\nchr9\t19500000\t16000000\nchr9\t20500000\t35300000\nchr9\t25800000\t15400000\nchr9\t28000000\t25800000\nchr9\t30000000\t10900000\nchr9\t38200000\t22100000\nchr9\t38600000\t16000000\nchr9\t42900000\t51400000\nchr9\t48100000\t47100000\nchr9\t50700000\t46100000\nchr9\t50700000\t58600000\nchr9\t50700000\t39100000\nchr9\t55800000\t34700000\nchr9\t61900000\t138394717\nchr9\t62700000\t43900000\nchr9\t63400000\t58000000\nchr9\t94000000\t87800000\nchr9\t94000000\t48200000\nchr9\t124600000\t91800000\nchr10\t0\t121700000\nchr10\t14300000\t12000000\nchr10\t15400000\t58000000\nchr10\t18700000\t24400000\nchr10\t19000000\t17000000\nchr10\t19500000\t16000000\nchr10\t20500000\t35300000\nchr10\t25800000\t15400000\nchr10\t28000000\t25800000\nchr10\t30000000\t10900000\nchr10\t38200000\t22100000\nchr10\t38600000\t16000000\nchr10\t42900000\t51400000\nchr10\t48100000\t47100000\nchr10\t50700000\t46100000\nchr10\t50700000\t58600000\nchr10\t50700000\t39100000\nchr10\t55800000\t34700000\nchr10\t61900000\t133797422\nchr10\t62700000\t43900000\nchr10\t63400000\t58000000\nchr10\t94000000\t87800000\nchr10\t94000000\t48200000\nchr10\t124600000\t91800000\nchr11\t0\t121700000\nchr11\t14300000\t12000000\nchr11\t15400000\t58000000\nchr11\t18700000\t24400000\nchr11\t19000000\t17000000\nchr11\t19500000\t16000000\nchr11\t20500000\t35300000\nchr11\t25800000\t15400000\nchr11\t28000000\t25800000\nchr11\t30000000\t10900000\nchr11\t38200000\t22100000\nchr11\t38600000\t16000000\nchr11\t42900000\t51400000\nchr11\t48100000\t47100000\nchr11\t50700000\t46100000\nchr11\t50700000\t58600000\nchr11\t50700000\t39100000\nchr11\t55800000\t34700000\nchr11\t61900000\t135086622\nchr11\t62700000\t43900000\nchr11\t63400000\t58000000\nchr11\t94000000\t87800000\nchr11\t94000000\t48200000\nchr11\t124600000\t91800000\nchr12\t0\t121700000\nchr12\t14300000\t12000000\nchr12\t15400000\t58000000\nchr12\t18700000\t24400000\nchr12\t19000000\t17000000\nchr12\t19500000\t16000000\nchr12\t20500000\t35300000\nchr12\t25800000\t15400000\nchr12\t28000000\t25800000\nchr12\t30000000\t10900000\nchr12\t38200000\t22100000\nchr12\t38600000\t16000000\nchr12\t42900000\t51400000\nchr12\t48100000\t47100000\nchr12\t50700000\t46100000\nchr12\t50700000\t58600000\nchr12\t50700000\t39100000\nchr12\t55800000\t34700000\nchr12\t61900000\t133275309\nchr12\t62700000\t43900000\nchr12\t63400000\t58000000\nchr12\t94000000\t87800000\nchr12\t94000000\t48200000\nchr12\t124600000\t91800000\nchr13\t0\t121700000\nchr13\t14300000\t12000000\nchr13\t15400000\t58000000\nchr13\t18700000\t24400000\nchr13\t19000000\t17000000\nchr13\t19500000\t16000000\nchr13\t20500000\t35300000\nchr13\t25800000\t15400000\nchr13\t28000000\t25800000\nchr13\t30000000\t10900000\nchr13\t38200000\t22100000\nchr13\t38600000\t16000000\nchr13\t42900000\t51400000\nchr13\t48100000\t47100000\nchr13\t50700000\t46100000\nchr13\t50700000\t58600000\nchr13\t50700000\t39100000\nchr13\t55800000\t34700000\nchr13\t61900000\t114364328\nchr13\t62700000\t43900000\nchr13\t63400000\t58000000\nchr13\t94000000\t87800000\nchr13\t94000000\t48200000\nchr13\t124600000\t91800000\nchr14\t0\t121700000\nchr14\t14300000\t12000000\nchr14\t15400000\t58000000\nchr14\t18700000\t24400000\nchr14\t19000000\t17000000\nchr14\t19500000\t16000000\nchr14\t20500000\t35300000\nchr14\t25800000\t15400000\nchr14\t28000000\t25800000\nchr14\t30000000\t10900000\nchr14\t38200000\t22100000\nchr14\t38600000\t16000000\nchr14\t42900000\t51400000\nchr14\t48100000\t47100000\nchr14\t50700000\t46100000\nchr14\t50700000\t58600000\nchr14\t50700000\t39100000\nchr14\t55800000\t34700000\nchr14\t61900000\t107043718\nchr14\t62700000\t43900000\nchr14\t63400000\t58000000\nchr14\t94000000\t87800000\nchr14\t94000000\t48200000\nchr14\t124600000\t91800000\nchr15\t0\t121700000\nchr15\t14300000\t12000000\nchr15\t15400000\t58000000\nchr15\t18700000\t24400000\nchr15\t19000000\t17000000\nchr15\t19500000\t16000000\nchr15\t20500000\t35300000\nchr15\t25800000\t15400000\nchr15\t28000000\t25800000\nchr15\t30000000\t10900000\nchr15\t38200000\t22100000\nchr15\t38600000\t16000000\nchr15\t42900000\t51400000\nchr15\t48100000\t47100000\nchr15\t50700000\t46100000\nchr15\t50700000\t58600000\nchr15\t50700000\t39100000\nchr15\t55800000\t34700000\nchr15\t61900000\t101991189\nchr15\t62700000\t43900000\nchr15\t63400000\t58000000\nchr15\t94000000\t87800000\nchr15\t94000000\t48200000\nchr15\t124600000\t91800000\nchr16\t0\t121700000\nchr16\t14300000\t12000000\nchr16\t15400000\t58000000\nchr16\t18700000\t24400000\nchr16\t19000000\t17000000\nchr16\t19500000\t16000000\nchr16\t20500000\t35300000\nchr16\t25800000\t15400000\nchr16\t28000000\t25800000\nchr16\t30000000\t10900000\nchr16\t38200000\t22100000\nchr16\t38600000\t16000000\nchr16\t42900000\t51400000\nchr16\t48100000\t47100000\nchr16\t50700000\t46100000\nchr16\t50700000\t58600000\nchr16\t50700000\t39100000\nchr16\t55800000\t34700000\nchr16\t61900000\t90338345\nchr16\t62700000\t43900000\nchr16\t63400000\t58000000\nchr16\t94000000\t87800000\nchr16\t94000000\t48200000\nchr16\t124600000\t91800000\nchr17\t0\t121700000\nchr17\t14300000\t12000000\nchr17\t15400000\t58000000\nchr17\t18700000\t24400000\nchr17\t19000000\t17000000\nchr17\t19500000\t16000000\nchr17\t20500000\t35300000\nchr17\t25800000\t15400000\nchr17\t28000000\t25800000\nchr17\t30000000\t10900000\nchr17\t38200000\t22100000\nchr17\t38600000\t16000000\nchr17\t42900000\t51400000\nchr17\t48100000\t47100000\nchr17\t50700000\t46100000\nchr17\t50700000\t58600000\nchr17\t50700000\t39100000\nchr17\t55800000\t34700000\nchr17\t61900000\t83257441\nchr17\t62700000\t43900000\nchr17\t63400000\t58000000\nchr17\t94000000\t87800000\nchr17\t94000000\t48200000\nchr17\t124600000\t91800000\nchr18\t0\t121700000\nchr18\t14300000\t12000000\nchr18\t15400000\t58000000\nchr18\t18700000\t24400000\nchr18\t19000000\t17000000\nchr18\t19500000\t16000000\nchr18\t20500000\t35300000\nchr18\t25800000\t15400000\nchr18\t28000000\t25800000\nchr18\t30000000\t10900000\nchr18\t38200000\t22100000\nchr18\t38600000\t16000000\nchr18\t42900000\t51400000\nchr18\t48100000\t47100000\nchr18\t50700000\t46100000\nchr18\t50700000\t58600000\nchr18\t50700000\t39100000\nchr18\t55800000\t34700000\nchr18\t61900000\t80373285\nchr18\t62700000\t43900000\nchr18\t63400000\t58000000\nchr18\t94000000\t87800000\nchr18\t94000000\t48200000\nchr18\t124600000\t91800000\nchr19\t0\t121700000\nchr19\t14300000\t12000000\nchr19\t15400000\t58000000\nchr19\t18700000\t24400000\nchr19\t19000000\t17000000\nchr19\t19500000\t16000000\nchr19\t20500000\t35300000\nchr19\t25800000\t15400000\nchr19\t28000000\t25800000\nchr19\t30000000\t10900000\nchr19\t38200000\t22100000\nchr19\t38600000\t16000000\nchr19\t42900000\t51400000\nchr19\t48100000\t47100000\nchr19\t50700000\t46100000\nchr19\t50700000\t58600000\nchr19\t50700000\t39100000\nchr19\t55800000\t34700000\nchr19\t61900000\t58617616\nchr19\t62700000\t43900000\nchr19\t63400000\t58000000\nchr19\t94000000\t87800000\nchr19\t94000000\t48200000\nchr19\t124600000\t91800000\nchr20\t0\t121700000\nchr20\t14300000\t12000000\nchr20\t15400000\t58000000\nchr20\t18700000\t24400000\nchr20\t19000000\t17000000\nchr20\t19500000\t16000000\nchr20\t20500000\t35300000\nchr20\t25800000\t15400000\nchr20\t28000000\t25800000\nchr20\t30000000\t10900000\nchr20\t38200000\t22100000\nchr20\t38600000\t16000000\nchr20\t42900000\t51400000\nchr20\t48100000\t47100000\nchr20\t50700000\t46100000\nchr20\t50700000\t58600000\nchr20\t50700000\t39100000\nchr20\t55800000\t34700000\nchr20\t61900000\t64444167\nchr20\t62700000\t43900000\nchr20\t63400000\t58000000\nchr20\t94000000\t87800000\nchr20\t94000000\t48200000\nchr20\t124600000\t91800000\nchr21\t0\t121700000\nchr21\t14300000\t12000000\nchr21\t15400000\t58000000\nchr21\t18700000\t24400000\nchr21\t19000000\t17000000\nchr21\t19500000\t16000000\nchr21\t20500000\t35300000\nchr21\t25800000\t15400000\nchr21\t28000000\t25800000\nchr21\t30000000\t10900000\nchr21\t38200000\t22100000\nchr21\t38600000\t16000000\nchr21\t42900000\t51400000\nchr21\t48100000\t47100000\nchr21\t50700000\t46100000\nchr21\t50700000\t58600000\nchr21\t50700000\t39100000\nchr21\t55800000\t34700000\nchr21\t61900000\t46709983\nchr21\t62700000\t43900000\nchr21\t63400000\t58000000\nchr21\t94000000\t87800000\nchr21\t94000000\t48200000\nchr21\t124600000\t91800000\nchr22\t0\t121700000\nchr22\t14300000\t12000000\nchr22\t15400000\t58000000\nchr22\t18700000\t24400000\nchr22\t19000000\t17000000\nchr22\t19500000\t16000000\nchr22\t20500000\t35300000\nchr22\t25800000\t15400000\nchr22\t28000000\t25800000\nchr22\t30000000\t10900000\nchr22\t38200000\t22100000\nchr22\t38600000\t16000000\nchr22\t42900000\t51400000\nchr22\t48100000\t47100000\nchr22\t50700000\t46100000\nchr22\t50700000\t58600000\nchr22\t50700000\t39100000\nchr22\t55800000\t34700000\nchr22\t61900000\t50818468\nchr22\t62700000\t43900000\nchr22\t63400000\t58000000\nchr22\t94000000\t87800000\nchr22\t94000000\t48200000\nchr22\t124600000\t91800000\nchrX\t0\t121700000\nchrX\t14300000\t12000000\nchrX\t15400000\t58000000\nchrX\t18700000\t24400000\nchrX\t19000000\t17000000\nchrX\t19500000\t16000000\nchrX\t20500000\t35300000\nchrX\t25800000\t15400000\nchrX\t28000000\t25800000\nchrX\t30000000\t10900000\nchrX\t38200000\t22100000\nchrX\t38600000\t16000000\nchrX\t42900000\t51400000\nchrX\t48100000\t47100000\nchrX\t50700000\t46100000\nchrX\t50700000\t58600000\nchrX\t50700000\t39100000\nchrX\t55800000\t34700000\nchrX\t61900000\t156040895\nchrX\t62700000\t43900000\nchrX\t63400000\t58000000\nchrX\t94000000\t87800000\nchrX\t94000000\t48200000\nchrX\t124600000\t91800000\n"
  },
  {
    "path": "tracks/lowmap30perc.bed",
    "content": "chr1\t10800\t12900\t0\t127\nchr1\t14100\t15300\t0\t127\nchr1\t17100\t51300\t0\t191\nchr1\t53400\t54000\t0\t191\nchr1\t59700\t60000\t0.0233\t68\nchr1\t64200\t66000\t0\t104\nchr1\t67800\t72000\t0\t93\nchr1\t73500\t75600\t0.0072\t95\nchr1\t78300\t78900\t0\t32\nchr1\t80700\t81000\t0.1405\t65\nchr1\t90300\t92400\t0\t119\nchr1\t93600\t97500\t0\t119\nchr1\t99900\t100500\t0.0114\t95\nchr1\t104400\t105000\t0.0051\t104\nchr1\t106200\t106500\t0.0051\t104\nchr1\t107700\t108000\t0.0051\t104\nchr1\t109800\t115500\t0\t124\nchr1\t116700\t128400\t0\t124\nchr1\t130500\t132900\t0\t58\nchr1\t134400\t135900\t0\t52\nchr1\t137100\t137400\t0.2235\t73\nchr1\t140100\t180900\t0\t80\nchr1\t184800\t186000\t0.1444\t135\nchr1\t187800\t190500\t0\t154\nchr1\t192000\t207300\t0\t114\nchr1\t258600\t259800\t0\t150\nchr1\t262800\t267300\t0\t150\nchr1\t270000\t270300\t0.0833\t110\nchr1\t271800\t273600\t0.0011\t101\nchr1\t274800\t275100\t0.0011\t101\nchr1\t276600\t277200\t0.0011\t101\nchr1\t278700\t279000\t0.1531\t94\nchr1\t280800\t284100\t0.0114\t105\nchr1\t288000\t288300\t0.2193\t85\nchr1\t289500\t296700\t0\t99\nchr1\t348000\t532800\t0\t120\nchr1\t534000\t535800\t0\t120\nchr1\t587700\t589500\t0\t29\nchr1\t593700\t594300\t0.0444\t60\nchr1\t596100\t596700\t0.0468\t66\nchr1\t597900\t598800\t0.0018\t109\nchr1\t602400\t608400\t0\t65\nchr1\t609600\t610500\t0\t17\nchr1\t611700\t612300\t0\t73\nchr1\t613500\t623100\t0\t73\nchr1\t624600\t625500\t0\t750\nchr1\t627000\t630000\t0\t750\nchr1\t631800\t632100\t0\t750\nchr1\t635700\t636900\t0\t88\nchr1\t638100\t644700\t0\t88\nchr1\t648000\t664500\t0\t86\nchr1\t669000\t676500\t0\t71\nchr1\t678300\t682200\t0\t56\nchr1\t683400\t700500\t0\t110\nchr1\t702600\t722100\t0\t110\nchr1\t723900\t726900\t0\t83\nchr1\t728100\t729300\t0\t81\nchr1\t731100\t732600\t0\t100\nchr1\t734400\t738600\t0\t100\nchr1\t739800\t752100\t0\t100\nchr1\t753600\t757500\t0\t100\nchr1\t758700\t761700\t0\t67\nchr1\t764100\t764400\t0.0015\t55\nchr1\t765900\t766200\t0.1199\t75\nchr1\t767700\t769800\t0\t86\nchr1\t772800\t774600\t0\t89\nchr1\t791400\t791700\t0.2643\t739\nchr1\t808800\t809100\t0.1351\t68\nchr1\t813900\t814200\t0.0238\t43\nchr1\t817500\t817800\t0.0781\t83\nchr1\t934200\t934500\t0.0843\t24\nchr1\t976800\t977100\t0.2936\t18\nchr1\t1076700\t1077000\t0.0176\t18\nchr1\t1078500\t1078800\t0.1732\t48\nchr1\t1139400\t1140300\t0.0455\t40\nchr1\t1201800\t1202100\t0.1474\t43\nchr1\t1248900\t1249500\t0.0008\t77\nchr1\t1478700\t1479000\t0.0834\t63\nchr1\t1481400\t1481700\t0.0206\t70\nchr1\t1517400\t1517700\t0.0632\t67\nchr1\t1519500\t1519800\t0.0705\t55\nchr1\t1632600\t1633800\t0\t65\nchr1\t1635000\t1636200\t0.0131\t61\nchr1\t1642200\t1644600\t0\t71\nchr1\t1657500\t1657800\t0.0599\t62\nchr1\t1661700\t1662000\t0.0691\t72\nchr1\t1675500\t1677300\t0.0404\t71\nchr1\t1690800\t1692300\t0.0417\t71\nchr1\t1693500\t1693800\t0.0427\t56\nchr1\t1695600\t1695900\t0.0864\t44\nchr1\t1698600\t1703400\t0\t63\nchr1\t1709400\t1711800\t0\t74\nchr1\t1722900\t1723200\t0.0836\t47\nchr1\t1727700\t1728000\t0.0666\t56\nchr1\t1738500\t1738800\t0.0382\t82\nchr1\t1745100\t1745400\t0.0108\t71\nchr1\t1746600\t1748100\t0.068\t54\nchr1\t1751100\t1751400\t0.0595\t53\nchr1\t2281500\t2282400\t0.0113\t114\nchr1\t2655300\t2657100\t0\t596\nchr1\t2658300\t2682900\t0\t596\nchr1\t2686800\t2687100\t0.1498\t313\nchr1\t2688600\t2698200\t0\t1101\nchr1\t2700900\t2702700\t0.0203\t56\nchr1\t2746500\t2747400\t0\t209\nchr1\t2749800\t2750100\t0.187\t163\nchr1\t2753700\t2759100\t0\t949\nchr1\t2762100\t2767200\t0\t949\nchr1\t2768700\t2775000\t0\t82\nchr1\t2776500\t2777100\t0.0034\t100\nchr1\t3162900\t3163200\t0.1753\t82\nchr1\t3475200\t3475800\t0\t98\nchr1\t3583500\t3583800\t0.0758\t51\nchr1\t3643800\t3644100\t0\t22\nchr1\t3694200\t3694800\t0.1974\t65\nchr1\t3892200\t3892500\t0.0354\t23\nchr1\t4077300\t4077900\t0.1175\t60\nchr1\t4302900\t4303200\t0.2549\t348\nchr1\t5334300\t5334600\t0\t103\nchr1\t6304500\t6304800\t0.1027\t54\nchr1\t7114800\t7115400\t0\t60\nchr1\t12825300\t12825600\t0.1179\t91\nchr1\t12832800\t12833100\t0.2072\t59\nchr1\t12866700\t12867000\t0\t24\nchr1\t12868500\t12868800\t0.0613\t65\nchr1\t12871800\t12872700\t0\t51\nchr1\t12875100\t12876600\t0.0488\t44\nchr1\t12879000\t12879300\t0.0419\t41\nchr1\t12889200\t12889500\t0.0228\t61\nchr1\t12891900\t12892500\t0.0118\t43\nchr1\t12894600\t12897300\t0.0047\t63\nchr1\t12899400\t12900000\t0.0126\t60\nchr1\t12903000\t12906000\t0\t75\nchr1\t12908400\t12908700\t0.056\t39\nchr1\t12912900\t12919200\t0\t81\nchr1\t12920400\t12924600\t0\t73\nchr1\t12926100\t12932100\t0\t77\nchr1\t12934200\t12934800\t0.0065\t63\nchr1\t12939000\t12947400\t0\t91\nchr1\t12951000\t12954300\t0\t66\nchr1\t13005000\t13005300\t0.0151\t44\nchr1\t13007700\t13012200\t0\t56\nchr1\t13013400\t13015800\t0\t56\nchr1\t13017600\t13017900\t0.0177\t46\nchr1\t13020300\t13023000\t0\t42\nchr1\t13026000\t13026300\t0.1354\t51\nchr1\t13030500\t13030800\t0.1259\t43\nchr1\t13032600\t13034100\t0.0234\t50\nchr1\t13035600\t13037100\t0\t67\nchr1\t13038300\t13043100\t0\t67\nchr1\t13044600\t13045200\t0\t44\nchr1\t13047900\t13048200\t0.0072\t68\nchr1\t13049400\t13049700\t0.0072\t68\nchr1\t13053000\t13055400\t0\t69\nchr1\t13059300\t13067100\t0\t54\nchr1\t13069500\t13069800\t0.0824\t49\nchr1\t13071900\t13104000\t0\t86\nchr1\t13122600\t13155000\t0\t92\nchr1\t13156500\t13167600\t0\t92\nchr1\t13173000\t13199400\t0\t67\nchr1\t13200600\t13202400\t0\t67\nchr1\t13203900\t13222200\t0\t67\nchr1\t13223400\t13224300\t0\t67\nchr1\t13247700\t13251000\t0\t72\nchr1\t13254300\t13262700\t0\t72\nchr1\t13264200\t13265400\t0.0031\t70\nchr1\t13266900\t13267500\t0\t75\nchr1\t13268700\t13270500\t0\t75\nchr1\t13271700\t13275900\t0\t75\nchr1\t13277400\t13277700\t0.136\t66\nchr1\t13280400\t13281300\t0\t74\nchr1\t13282800\t13285500\t0\t72\nchr1\t13287000\t13287900\t0\t78\nchr1\t13295700\t13296900\t0\t69\nchr1\t13302000\t13302300\t0.0003\t66\nchr1\t13304700\t13305300\t0.0028\t53\nchr1\t13312200\t13312800\t0.092\t70\nchr1\t13327500\t13328700\t0\t57\nchr1\t13335600\t13336200\t0\t59\nchr1\t13363200\t13363800\t0.0261\t40\nchr1\t14029200\t14029500\t0.0111\t86\nchr1\t16495200\t16495800\t0.01\t91\nchr1\t16515000\t16515300\t0.1887\t87\nchr1\t16548000\t16548900\t0.0779\t19\nchr1\t16551300\t16551600\t0.0233\t80\nchr1\t16554300\t16557000\t0\t85\nchr1\t16558200\t16567500\t0\t292\nchr1\t16568700\t16569000\t0\t292\nchr1\t16572900\t16574400\t0.0665\t122\nchr1\t16590600\t16595100\t0\t122\nchr1\t16596300\t16599000\t0\t111\nchr1\t16600500\t16601100\t0.0003\t111\nchr1\t16602300\t16602600\t0.0027\t110\nchr1\t16604100\t16604400\t0.0027\t110\nchr1\t16619400\t16619700\t0.111\t143\nchr1\t16653300\t16653600\t0.0963\t139\nchr1\t16655400\t16657200\t0\t142\nchr1\t16659000\t16673700\t0\t164\nchr1\t16682100\t16682400\t0.0749\t78\nchr1\t16688400\t16691100\t0\t81\nchr1\t16694100\t16695900\t0\t74\nchr1\t16698900\t16699200\t0.0385\t92\nchr1\t16700400\t16702200\t0\t93\nchr1\t16703700\t16704000\t0.0943\t33\nchr1\t16706700\t16707300\t0.0009\t77\nchr1\t16708500\t16709100\t0\t83\nchr1\t16711200\t16711500\t0\t83\nchr1\t16713900\t16715700\t0\t98\nchr1\t16729500\t16729800\t0.054\t122\nchr1\t16731000\t16731600\t0\t162\nchr1\t16733700\t16753200\t0\t155\nchr1\t16754400\t16755000\t0\t155\nchr1\t16756800\t16758000\t0.0529\t123\nchr1\t16761900\t16764000\t0.0038\t94\nchr1\t16768500\t16769100\t0.0208\t117\nchr1\t16778400\t16778700\t0.0466\t126\nchr1\t16783800\t16785600\t0.0011\t99\nchr1\t16850700\t16853700\t0\t72\nchr1\t16866000\t16866300\t0.1518\t141\nchr1\t16917600\t16918200\t0.0114\t75\nchr1\t16953600\t16954200\t0.0577\t140\nchr1\t16974000\t16974900\t0\t34\nchr1\t20814900\t20815200\t0.056\t31\nchr1\t20832900\t20833200\t0.0494\t70\nchr1\t21388800\t21389700\t0.0859\t47\nchr1\t21425100\t21425700\t0.0351\t65\nchr1\t21482400\t21483000\t0.0104\t73\nchr1\t21485400\t21485700\t0.1315\t57\nchr1\t21968100\t21968400\t0.0698\t54\nchr1\t21990300\t21991200\t0\t78\nchr1\t22013400\t22014300\t0\t72\nchr1\t23992800\t23993400\t0.0688\t50\nchr1\t23994600\t23994900\t0.1722\t41\nchr1\t24799800\t24800100\t0.1913\t19\nchr1\t24832500\t24834900\t0\t36\nchr1\t25264800\t25266000\t0.0078\t53\nchr1\t25316700\t25317900\t0\t42\nchr1\t25323000\t25329000\t0\t56\nchr1\t25335000\t25336200\t0.0015\t52\nchr1\t25362600\t25367400\t0\t57\nchr1\t25374600\t25375200\t0.0553\t51\nchr1\t25509000\t25511100\t0.1838\t123\nchr1\t26163300\t26163600\t0.1266\t39\nchr1\t26640600\t26640900\t0.0034\t67\nchr1\t26646900\t26647500\t0.0017\t65\nchr1\t27065100\t27065400\t0.0868\t81\nchr1\t27852300\t27855000\t0.0671\t75\nchr1\t30439200\t30439800\t0.0665\t92\nchr1\t30441900\t30442500\t0.1204\t109\nchr1\t30443700\t30444000\t0.1204\t109\nchr1\t30498600\t30498900\t0.096\t84\nchr1\t30567900\t30568800\t0.011\t182\nchr1\t30579000\t30579300\t0.0551\t71\nchr1\t30935700\t30936000\t0.1235\t68\nchr1\t33051300\t33053400\t0.0135\t70\nchr1\t33834600\t33834900\t0.0253\t26\nchr1\t34095000\t34095300\t0.0948\t80\nchr1\t34096500\t34098300\t0.0234\t194\nchr1\t34253400\t34253700\t0.0393\t93\nchr1\t34256100\t34256400\t0.0393\t93\nchr1\t34566300\t34572000\t0\t101\nchr1\t38667000\t38667300\t0.1822\t126\nchr1\t39511200\t39513300\t0\t68\nchr1\t39515100\t39516300\t0.0618\t68\nchr1\t39518400\t39518700\t0.0919\t66\nchr1\t39520500\t39522000\t0.0408\t60\nchr1\t39765300\t39765600\t0.1933\t61\nchr1\t39767700\t39768000\t0.2489\t78\nchr1\t39770700\t39774900\t0\t87\nchr1\t40366500\t40370700\t0\t136\nchr1\t41208000\t41208300\t0.0326\t56\nchr1\t41854500\t41855100\t0.0947\t97\nchr1\t42064800\t42065100\t0.1743\t69\nchr1\t42494700\t42495000\t0.0235\t166\nchr1\t42708900\t42709200\t0.2458\t185\nchr1\t42751200\t42751500\t0.0401\t50\nchr1\t43117500\t43117800\t0.1024\t75\nchr1\t45710700\t45711000\t0.1354\t61\nchr1\t45725400\t45726000\t0.0421\t51\nchr1\t45741600\t45741900\t0.1112\t25\nchr1\t46240500\t46240800\t0.1027\t82\nchr1\t46242300\t46242900\t0.1027\t82\nchr1\t46505100\t46505400\t0.0383\t90\nchr1\t46874700\t46875000\t0.1614\t58\nchr1\t46876800\t46877100\t0.1271\t51\nchr1\t46886400\t46887600\t0\t67\nchr1\t46891800\t46896900\t0\t63\nchr1\t47070600\t47072700\t0\t78\nchr1\t47075100\t47075400\t0.0639\t72\nchr1\t47080200\t47081400\t0\t62\nchr1\t48153000\t48156000\t0\t148\nchr1\t48381900\t48383700\t0.0287\t99\nchr1\t49007100\t49007400\t0.1349\t64\nchr1\t49283700\t49284000\t0.1117\t102\nchr1\t49287000\t49287300\t0.0645\t79\nchr1\t49800600\t49800900\t0.1283\t52\nchr1\t49876200\t49876800\t0.0302\t78\nchr1\t49878900\t49879200\t0.0602\t65\nchr1\t50918400\t50918700\t0.0081\t89\nchr1\t52797300\t52797600\t0.1032\t134\nchr1\t53283600\t53284200\t0.0752\t36\nchr1\t53713200\t53713500\t0.2647\t120\nchr1\t55666800\t55667100\t0.1833\t21\nchr1\t56365500\t56369100\t0\t135\nchr1\t58115100\t58115700\t0.0732\t84\nchr1\t58254600\t58255200\t0.0951\t82\nchr1\t58269600\t58273500\t0.0006\t87\nchr1\t58376700\t58377000\t0.0548\t82\nchr1\t58378200\t58378800\t0.0548\t82\nchr1\t59650500\t59650800\t0.156\t63\nchr1\t60278700\t60279000\t0.1995\t87\nchr1\t60550800\t60551400\t0.0955\t109\nchr1\t60645000\t60645300\t0.1929\t88\nchr1\t61925100\t61925400\t0.2659\t103\nchr1\t63239700\t63242400\t0.0028\t102\nchr1\t63927000\t63927300\t0.0432\t49\nchr1\t64373400\t64373700\t0\t23\nchr1\t64798200\t64798500\t0.0889\t106\nchr1\t65558700\t65563800\t0\t94\nchr1\t65778300\t65778600\t0.0289\t74\nchr1\t67079100\t67084200\t0\t91\nchr1\t67158900\t67159200\t0.1275\t56\nchr1\t68735100\t68739000\t0\t110\nchr1\t69116100\t69116700\t0.1179\t84\nchr1\t69887100\t69887400\t0.1147\t82\nchr1\t70646700\t70647600\t0.0059\t26\nchr1\t71514300\t71519700\t0\t114\nchr1\t71888700\t71894100\t0\t122\nchr1\t73194000\t73194300\t0.0125\t112\nchr1\t74447700\t74448900\t0.0093\t104\nchr1\t75377400\t75378000\t0.0004\t71\nchr1\t75381300\t75383400\t0\t75\nchr1\t75387300\t75387900\t0.0728\t125\nchr1\t75885900\t75886200\t0.095\t25\nchr1\t77002800\t77003400\t0.1473\t71\nchr1\t77870100\t77870400\t0.1259\t72\nchr1\t78243900\t78245400\t0\t95\nchr1\t78845700\t78846600\t0.0015\t100\nchr1\t78847800\t78850800\t0.0015\t100\nchr1\t79571700\t79572000\t0.2215\t28\nchr1\t79940700\t79941000\t0.1225\t58\nchr1\t80136900\t80137200\t0.13\t32\nchr1\t80939400\t80944800\t0\t105\nchr1\t80950800\t80951100\t0.0219\t59\nchr1\t82251300\t82252500\t0.1129\t63\nchr1\t82253700\t82255800\t0.0333\t97\nchr1\t82660500\t82661700\t0\t91\nchr1\t83184000\t83184300\t0.1363\t78\nchr1\t83230800\t83231100\t0.1165\t100\nchr1\t83266500\t83266800\t0.0975\t59\nchr1\t83303400\t83303700\t0.0442\t53\nchr1\t83339400\t83341200\t0.0207\t89\nchr1\t83351100\t83352300\t0.0666\t69\nchr1\t83392800\t83393100\t0.1258\t34\nchr1\t84052500\t84058200\t0\t92\nchr1\t84233400\t84234000\t0.0408\t126\nchr1\t85521900\t85522500\t0.0134\t63\nchr1\t85535400\t85535700\t0.0181\t57\nchr1\t85748700\t85754400\t0\t148\nchr1\t85927500\t85932900\t0\t117\nchr1\t85940100\t85940400\t0.1448\t27\nchr1\t86216400\t86217300\t0.0235\t57\nchr1\t86275500\t86275800\t0.0005\t64\nchr1\t86679300\t86685000\t0\t111\nchr1\t88343100\t88345800\t0.0481\t82\nchr1\t89414700\t89415300\t0.0016\t89\nchr1\t89416800\t89417100\t0.1599\t66\nchr1\t89561400\t89561700\t0.0317\t76\nchr1\t89747400\t89752500\t0.0414\t89\nchr1\t91212600\t91216800\t0.0107\t104\nchr1\t91301400\t91302000\t0.0469\t23\nchr1\t91371300\t91371600\t0.0807\t37\nchr1\t91387200\t91387500\t0.035\t950\nchr1\t93276900\t93277500\t0.0049\t74\nchr1\t93791400\t93796200\t0.0157\t98\nchr1\t95292900\t95295600\t0.0647\t100\nchr1\t96052500\t96052800\t0.1288\t41\nchr1\t96606900\t96607200\t0.0775\t84\nchr1\t96853500\t96853800\t0.2118\t106\nchr1\t97320600\t97322100\t0.0018\t85\nchr1\t98983200\t98983500\t0.1537\t60\nchr1\t99213600\t99213900\t0.0136\t54\nchr1\t99388800\t99390600\t0.0085\t93\nchr1\t103020300\t103020900\t0.1192\t58\nchr1\t103356000\t103356300\t0.065\t65\nchr1\t103594500\t103610700\t0\t80\nchr1\t103621200\t103623000\t0\t61\nchr1\t103624200\t103627500\t0\t85\nchr1\t103629600\t103667700\t0\t85\nchr1\t103668900\t103713300\t0\t85\nchr1\t103715700\t103760400\t0\t85\nchr1\t104036100\t104036400\t0.0083\t116\nchr1\t104127000\t104127300\t0.0189\t25\nchr1\t104770500\t104775600\t0\t95\nchr1\t104844000\t104849100\t0\t87\nchr1\t104885700\t104886000\t0.0026\t12\nchr1\t105214500\t105215700\t0.0011\t57\nchr1\t105575400\t105575700\t0.0908\t94\nchr1\t105659700\t105660300\t0.0251\t131\nchr1\t106089900\t106090200\t0.2428\t184\nchr1\t108224100\t108224400\t0\t81\nchr1\t108225600\t108225900\t0\t81\nchr1\t108227400\t108228300\t0\t81\nchr1\t108229800\t108247200\t0\t96\nchr1\t108248400\t108255600\t0\t72\nchr1\t108258600\t108264000\t0\t79\nchr1\t108265200\t108310500\t0\t79\nchr1\t108375000\t108437400\t0\t105\nchr1\t108438600\t108447300\t0\t74\nchr1\t108448800\t108464700\t0\t86\nchr1\t108465900\t108467100\t0\t76\nchr1\t108468600\t108468900\t0.1449\t70\nchr1\t108470100\t108470400\t0.1449\t70\nchr1\t108577200\t108579300\t0\t57\nchr1\t109055100\t109055400\t0.0225\t35\nchr1\t109680600\t109683900\t0\t58\nchr1\t109693500\t109693800\t0.043\t45\nchr1\t109698900\t109702200\t0\t42\nchr1\t109843200\t109843500\t0.1528\t96\nchr1\t110845800\t110846100\t0.0597\t64\nchr1\t111544800\t111545100\t0.1185\t104\nchr1\t111800100\t111800400\t0.0574\t56\nchr1\t112159200\t112159500\t0.0432\t72\nchr1\t112226400\t112227300\t0.1008\t100\nchr1\t112293300\t112294800\t0.007\t48\nchr1\t112773600\t112773900\t0.0854\t17\nchr1\t112898700\t112899300\t0.0505\t69\nchr1\t113068800\t113070900\t0.0582\t92\nchr1\t113344200\t113344800\t0.0688\t69\nchr1\t113360700\t113362500\t0.0147\t129\nchr1\t113497200\t113503200\t0\t132\nchr1\t113509500\t113509800\t0.0614\t69\nchr1\t115152300\t115153200\t0.0435\t98\nchr1\t115627200\t115627500\t0.1056\t100\nchr1\t116136900\t116137200\t0.0484\t83\nchr1\t116718000\t116719500\t0\t134\nchr1\t117430500\t117430800\t0.0103\t78\nchr1\t118575900\t118576200\t0.1012\t50\nchr1\t118852800\t118858200\t0\t122\nchr1\t119990100\t119994900\t0\t70\nchr1\t119998800\t119999100\t0.1029\t78\nchr1\t120005700\t120006000\t0.0593\t53\nchr1\t120008100\t120008700\t0\t61\nchr1\t120016200\t120017100\t0\t78\nchr1\t120018300\t120022800\t0\t78\nchr1\t120026700\t120028200\t0.0459\t74\nchr1\t120029700\t120032100\t0.054\t71\nchr1\t120035700\t120036600\t0\t63\nchr1\t120039900\t120040200\t0.0153\t66\nchr1\t120044100\t120047400\t0\t88\nchr1\t120048900\t120053400\t0\t75\nchr1\t120055200\t120060000\t0\t70\nchr1\t120061800\t120062700\t0\t84\nchr1\t120068400\t120068700\t0.1178\t64\nchr1\t120069900\t120070200\t0.0076\t66\nchr1\t120075300\t120075600\t0\t75\nchr1\t120077100\t120081000\t0\t75\nchr1\t120084000\t120084600\t0.0148\t104\nchr1\t120087000\t120087900\t0.03\t81\nchr1\t120096600\t120096900\t0.0659\t70\nchr1\t120099000\t120099300\t0.0801\t65\nchr1\t120103500\t120104100\t0.0156\t63\nchr1\t120111900\t120112200\t0.0942\t73\nchr1\t120126600\t120127500\t0\t70\nchr1\t120158400\t120159000\t0.0749\t57\nchr1\t120162000\t120162600\t0.1222\t74\nchr1\t120172200\t120175500\t0\t88\nchr1\t120181800\t120182100\t0.0917\t68\nchr1\t120185100\t120185400\t0.0064\t71\nchr1\t120189000\t120189300\t0.0328\t53\nchr1\t120194100\t120195900\t0.0341\t81\nchr1\t120198300\t120198600\t0.1837\t45\nchr1\t120201000\t120202200\t0.0213\t72\nchr1\t120203700\t120204000\t0.1404\t48\nchr1\t120205200\t120215100\t0\t84\nchr1\t120216300\t120217200\t0\t84\nchr1\t120220500\t120220800\t0.2565\t62\nchr1\t120222000\t120225900\t0\t96\nchr1\t120227400\t120257700\t0\t96\nchr1\t120259200\t120269700\t0\t96\nchr1\t120270900\t120315300\t0\t79\nchr1\t120316500\t120321900\t0\t79\nchr1\t120323700\t120324000\t0.0083\t65\nchr1\t120325800\t120329100\t0\t63\nchr1\t120330300\t120332100\t0.0032\t50\nchr1\t120336000\t120340800\t0\t76\nchr1\t120343200\t120343500\t0.1314\t20\nchr1\t120352200\t120354600\t0\t67\nchr1\t120356700\t120357000\t0\t71\nchr1\t120358200\t120362400\t0\t71\nchr1\t120364500\t120364800\t0.034\t42\nchr1\t120372300\t120372600\t0.126\t54\nchr1\t120376800\t120377700\t0.0155\t55\nchr1\t120383100\t120383400\t0.0832\t41\nchr1\t120387000\t120388500\t0.0217\t68\nchr1\t120390000\t120390300\t0.0217\t68\nchr1\t120392400\t120392700\t0.1272\t54\nchr1\t120396300\t120397500\t0.0043\t65\nchr1\t120398700\t120400500\t0.0545\t63\nchr1\t120405300\t120405600\t0.0051\t67\nchr1\t120408300\t120408900\t0.0051\t67\nchr1\t120410700\t120411300\t0\t77\nchr1\t120413700\t120414000\t0.0311\t51\nchr1\t120417900\t120418500\t0.1528\t49\nchr1\t120419700\t120420000\t0.0741\t63\nchr1\t120425700\t120426000\t0.1013\t69\nchr1\t120427500\t120427800\t0.044\t53\nchr1\t120434700\t120435000\t0.1322\t55\nchr1\t120436800\t120449100\t0\t86\nchr1\t120457200\t120459300\t0\t98\nchr1\t120461400\t120465300\t0\t155\nchr1\t120466800\t120467400\t0\t155\nchr1\t120479100\t120479400\t0.1279\t56\nchr1\t120493800\t120494400\t0.1489\t70\nchr1\t120499200\t120499800\t0.0473\t63\nchr1\t120503100\t120503400\t0.0006\t86\nchr1\t120504600\t120505800\t0.0644\t56\nchr1\t120507600\t120508800\t0.0128\t76\nchr1\t120510300\t120510900\t0.0015\t57\nchr1\t120513900\t120514800\t0\t67\nchr1\t120516900\t120521100\t0\t80\nchr1\t120526800\t120527400\t0.022\t72\nchr1\t120528900\t120529200\t0.022\t72\nchr1\t120531300\t120534000\t0.0004\t75\nchr1\t120536100\t120537000\t0\t59\nchr1\t120538200\t120538500\t0.1929\t55\nchr1\t120544800\t120545100\t0.0209\t55\nchr1\t120548100\t120548400\t0.0838\t71\nchr1\t120550200\t120551100\t0\t62\nchr1\t120553500\t120554100\t0.0076\t53\nchr1\t120558000\t120558300\t0.0004\t33\nchr1\t120563400\t120563700\t0.0454\t67\nchr1\t120565500\t120565800\t0.0454\t67\nchr1\t120567000\t120567900\t0\t72\nchr1\t120569100\t120570000\t0\t72\nchr1\t120574500\t120575400\t0\t67\nchr1\t120576900\t120580200\t0\t58\nchr1\t120583200\t120590100\t0\t72\nchr1\t120592800\t120631200\t0\t86\nchr1\t120632700\t120633300\t0\t86\nchr1\t120634500\t120636300\t0\t69\nchr1\t120638100\t120638400\t0\t69\nchr1\t120640800\t120644100\t0\t98\nchr1\t120645300\t120647700\t0\t98\nchr1\t120648900\t120651300\t0\t98\nchr1\t120652500\t120659100\t0\t85\nchr1\t120660300\t120660600\t0\t85\nchr1\t120661800\t120663900\t0\t68\nchr1\t120665400\t120667800\t0\t99\nchr1\t120669000\t120670200\t0\t99\nchr1\t120672900\t120673200\t0.1198\t70\nchr1\t120674700\t120676200\t0.0344\t60\nchr1\t120678300\t120678600\t0.0688\t59\nchr1\t120680100\t120681600\t0\t81\nchr1\t120683400\t120695100\t0\t81\nchr1\t120696300\t120704400\t0\t66\nchr1\t120708000\t120709500\t0.1096\t87\nchr1\t120710700\t120711000\t0\t66\nchr1\t120712500\t120718200\t0\t66\nchr1\t120724800\t120725700\t0.024\t67\nchr1\t120730800\t120731700\t0\t69\nchr1\t120733800\t120734100\t0\t85\nchr1\t120735600\t120744900\t0\t85\nchr1\t120746100\t120750000\t0\t85\nchr1\t120751200\t120753900\t0\t85\nchr1\t120755100\t120755400\t0.0988\t50\nchr1\t120756900\t120757800\t0\t73\nchr1\t120760500\t120762900\t0.0732\t67\nchr1\t120765300\t120767100\t0\t75\nchr1\t120771000\t120777300\t0\t80\nchr1\t120780300\t120781500\t0.0221\t68\nchr1\t120783000\t120783600\t0.0221\t68\nchr1\t120785400\t120787800\t0.0213\t73\nchr1\t120789000\t120789300\t0.0213\t73\nchr1\t120792000\t120792300\t0.0172\t21\nchr1\t120795000\t120801000\t0\t71\nchr1\t120812400\t120812700\t0.0709\t32\nchr1\t120815700\t120816000\t0.0424\t40\nchr1\t120819900\t120821700\t0\t74\nchr1\t120824700\t120829200\t0\t283\nchr1\t120830400\t120840000\t0\t283\nchr1\t120841200\t120841800\t0\t76\nchr1\t120848700\t120849000\t0.0282\t67\nchr1\t120864000\t120864300\t0.0718\t56\nchr1\t120868500\t120870000\t0.0233\t76\nchr1\t120871200\t120871500\t0.0196\t69\nchr1\t120873000\t120873300\t0.0196\t69\nchr1\t120876300\t120876600\t0.081\t52\nchr1\t120885900\t120887400\t0.0421\t50\nchr1\t120890400\t120891300\t0.0071\t45\nchr1\t120894600\t120895800\t0.035\t59\nchr1\t120912300\t120918900\t0\t78\nchr1\t120922800\t120924600\t0\t61\nchr1\t120926400\t120927900\t0\t70\nchr1\t120936000\t120936300\t0.208\t58\nchr1\t120945900\t120946200\t0.0478\t44\nchr1\t120948900\t120949200\t0.0849\t60\nchr1\t120965700\t120966600\t0.0662\t49\nchr1\t120984300\t120984600\t0.016\t50\nchr1\t120986400\t120988800\t0.0187\t68\nchr1\t120990900\t120991200\t0.1214\t75\nchr1\t120992400\t120992700\t0.1214\t75\nchr1\t120995400\t120997800\t0.0039\t62\nchr1\t120999000\t120999300\t0.0221\t66\nchr1\t121001400\t121002600\t0.0221\t66\nchr1\t121004400\t121005000\t0.0034\t77\nchr1\t121011000\t121012200\t0.0123\t63\nchr1\t121014600\t121016400\t0.0043\t65\nchr1\t121019400\t121020600\t0.0495\t77\nchr1\t121023600\t121023900\t0.0799\t58\nchr1\t121025400\t121026600\t0\t65\nchr1\t121029300\t121030200\t0.0648\t78\nchr1\t121032000\t121032300\t0.0648\t78\nchr1\t121036800\t121037100\t0.0458\t58\nchr1\t121049100\t121049400\t0.1196\t78\nchr1\t121071600\t121071900\t0.0224\t66\nchr1\t121073400\t121073700\t0.0224\t66\nchr1\t121076700\t121078500\t0.0023\t65\nchr1\t121083600\t121083900\t0.0916\t25\nchr1\t121088400\t121088700\t0\t34\nchr1\t121092000\t121092600\t0.047\t62\nchr1\t121099200\t121100700\t0.0352\t57\nchr1\t121104000\t121104300\t0.0699\t56\nchr1\t121113300\t121113600\t0.0302\t68\nchr1\t121116000\t121116300\t0.0006\t64\nchr1\t121128600\t121128900\t0.0048\t68\nchr1\t121134300\t121134600\t0.0274\t61\nchr1\t121138200\t121138500\t0.0774\t51\nchr1\t121140000\t121142400\t0.0003\t67\nchr1\t121144200\t121146300\t0.0003\t67\nchr1\t121148700\t121150200\t0\t53\nchr1\t121152000\t121152900\t0.0726\t68\nchr1\t121156800\t121159200\t0\t71\nchr1\t121161900\t121162200\t0.0653\t49\nchr1\t121167900\t121171500\t0\t67\nchr1\t121173600\t121174200\t0\t67\nchr1\t121175400\t121176600\t0.036\t66\nchr1\t121177800\t121178400\t0.036\t66\nchr1\t121179900\t121180200\t0.036\t66\nchr1\t121182900\t121183500\t0.036\t66\nchr1\t121185300\t121187700\t0\t68\nchr1\t121188900\t121189800\t0.0036\t66\nchr1\t121193400\t121199700\t0\t73\nchr1\t121203600\t121206000\t0\t71\nchr1\t121209000\t121209300\t0.0605\t67\nchr1\t121210500\t121212000\t0.0181\t55\nchr1\t121214400\t121215600\t0\t57\nchr1\t121218000\t121221000\t0\t79\nchr1\t121223400\t121223700\t0\t60\nchr1\t121224900\t121225500\t0\t60\nchr1\t121229100\t121229400\t0\t75\nchr1\t121231800\t121234200\t0\t75\nchr1\t121235400\t121237200\t0\t75\nchr1\t121241100\t121243200\t0\t74\nchr1\t121244700\t121253400\t0\t74\nchr1\t121255800\t121257000\t0.0006\t72\nchr1\t121258800\t121259100\t0.0006\t72\nchr1\t121260600\t121262100\t0\t61\nchr1\t121264200\t121264500\t0.1657\t56\nchr1\t121267500\t121269300\t0.0007\t67\nchr1\t121271700\t121272000\t0.0248\t50\nchr1\t121275300\t121277100\t0.0486\t64\nchr1\t121280700\t121282200\t0.0008\t75\nchr1\t121284300\t121285800\t0.0353\t62\nchr1\t121287000\t121287300\t0.0215\t54\nchr1\t121289700\t121290900\t0.012\t62\nchr1\t121292700\t121293000\t0.012\t62\nchr1\t121296300\t121299000\t0.0057\t70\nchr1\t121300500\t121302900\t0.0546\t63\nchr1\t121305300\t121306500\t0.0782\t71\nchr1\t121309500\t121313400\t0\t107\nchr1\t121316400\t121322700\t0\t69\nchr1\t121325700\t121326900\t0.0186\t56\nchr1\t121330500\t121334400\t0\t70\nchr1\t121336800\t121338000\t0\t71\nchr1\t121341600\t121342800\t0\t67\nchr1\t121344300\t121346400\t0\t66\nchr1\t121348800\t121350000\t0.0421\t73\nchr1\t121351800\t121352400\t0\t68\nchr1\t121353600\t121356300\t0\t68\nchr1\t121357800\t121360800\t0\t68\nchr1\t121362000\t121365300\t0\t75\nchr1\t121368600\t121370100\t0.0023\t66\nchr1\t121371300\t121373700\t0.0008\t58\nchr1\t121376400\t121377600\t0.0251\t64\nchr1\t121379700\t121380300\t0.0047\t71\nchr1\t121382700\t121390500\t0\t72\nchr1\t121392600\t121393500\t0\t85\nchr1\t121532700\t121538100\t0\t125\nchr1\t121604400\t121608300\t0\t37\nchr1\t121609500\t121615800\t0\t44\nchr1\t121619400\t121620000\t0\t21\nchr1\t121621500\t121622700\t0\t81\nchr1\t121624200\t121624500\t0.0028\t60\nchr1\t121625700\t121627200\t0.0826\t62\nchr1\t121628700\t121629000\t0\t40\nchr1\t121630200\t121631400\t0\t40\nchr1\t121633200\t121639800\t0.0035\t306\nchr1\t121641600\t121644000\t0\t157\nchr1\t121645200\t121685700\t0\t157\nchr1\t121688400\t121689000\t0\t40\nchr1\t121692600\t121692900\t0.1119\t53\nchr1\t121694700\t121696800\t0\t29\nchr1\t121698000\t121698900\t0\t29\nchr1\t121700100\t121700700\t0\t29\nchr1\t121701900\t121706700\t0\t41\nchr1\t121707900\t121710000\t0\t62\nchr1\t121711200\t121718100\t0\t61\nchr1\t121719300\t121722000\t0\t26\nchr1\t121725600\t121727400\t0\t27\nchr1\t121731300\t121731900\t0\t51\nchr1\t121739100\t121739400\t0\t34\nchr1\t121741800\t121742100\t0.0718\t30\nchr1\t121743600\t121756800\t0\t2648\nchr1\t121758000\t121758300\t0.0599\t16\nchr1\t121760400\t121788000\t0\t3380\nchr1\t121790100\t121791300\t0\t32\nchr1\t121793400\t121796400\t0\t131\nchr1\t121797600\t121798200\t0\t97\nchr1\t121799400\t121804800\t0\t97\nchr1\t121806000\t121806300\t0\t140\nchr1\t121808400\t121809900\t0\t140\nchr1\t121811100\t121822500\t0\t140\nchr1\t121823700\t121838400\t0\t140\nchr1\t121839900\t121840500\t0\t140\nchr1\t121842300\t121843200\t0\t140\nchr1\t121846200\t121846800\t0\t162\nchr1\t121848300\t121863000\t0\t115\nchr1\t121865100\t121869300\t0\t74\nchr1\t121870500\t121879500\t0\t80\nchr1\t121881300\t121882200\t0\t20\nchr1\t121883700\t121884000\t0\t25\nchr1\t121888200\t121893000\t0\t79\nchr1\t121894500\t121898100\t0\t81\nchr1\t121899600\t121901100\t0\t25\nchr1\t121903500\t121909200\t0\t122\nchr1\t121911600\t121911900\t0\t15\nchr1\t121914300\t121924200\t0\t144\nchr1\t121925700\t121929900\t0\t92\nchr1\t121931700\t121932000\t0\t13\nchr1\t121940700\t121942800\t0\t66\nchr1\t121944600\t121946100\t0\t31\nchr1\t121948500\t121948800\t0\t17\nchr1\t121952400\t121952700\t0\t34\nchr1\t121953900\t121957800\t0\t40\nchr1\t121959300\t121965300\t0\t84\nchr1\t121966800\t121968900\t0\t42\nchr1\t121970100\t121973100\t0\t404\nchr1\t122032800\t122047200\t0\t105\nchr1\t122050500\t122050800\t0\t197\nchr1\t122053500\t122054700\t0\t197\nchr1\t122056500\t122056800\t0\t35\nchr1\t122058600\t122063700\t0\t60\nchr1\t122064900\t122070000\t0\t415\nchr1\t122073000\t122085000\t0\t116\nchr1\t122087400\t122089500\t0\t83\nchr1\t122090700\t122097600\t0\t130\nchr1\t122101500\t122102100\t0.1373\t20\nchr1\t122105100\t122109000\t0\t97\nchr1\t122111400\t122124300\t0\t104\nchr1\t122126100\t122130300\t0\t389\nchr1\t122131800\t122132100\t0\t21\nchr1\t122134500\t122137200\t0\t53\nchr1\t122138700\t122139000\t0\t53\nchr1\t122141100\t122141700\t0\t53\nchr1\t122143800\t122159700\t0\t118\nchr1\t122161800\t122169600\t0\t98\nchr1\t122172000\t122175000\t0\t412\nchr1\t122176200\t122176800\t0\t412\nchr1\t122178000\t122178300\t0\t412\nchr1\t122179500\t122182500\t0\t412\nchr1\t122183700\t122184300\t0\t412\nchr1\t122185800\t122186400\t0\t412\nchr1\t122187600\t122189100\t0\t22\nchr1\t122191200\t122195400\t0\t82\nchr1\t122196600\t122203200\t0\t111\nchr1\t122204400\t122204700\t0\t111\nchr1\t122207100\t122208300\t0\t111\nchr1\t122211000\t122214900\t0\t98\nchr1\t122216700\t122219100\t0\t29\nchr1\t122224800\t122225400\t0\t200\nchr1\t122226600\t122229000\t0\t200\nchr1\t122230500\t122236500\t0\t200\nchr1\t122238000\t122269200\t0\t464\nchr1\t122271600\t122368800\t0\t838\nchr1\t122370000\t122390100\t0\t838\nchr1\t122391300\t122397300\t0\t838\nchr1\t122398500\t122449800\t0\t838\nchr1\t122452200\t122453100\t0\t838\nchr1\t122454300\t122490900\t0\t838\nchr1\t122492100\t122495700\t0\t3359\nchr1\t122497500\t122548200\t0\t3359\nchr1\t122550000\t122550300\t0.2431\t120\nchr1\t122551500\t122552100\t0.1195\t73\nchr1\t122553300\t122555100\t0.0053\t2215\nchr1\t122556300\t122562000\t0.0053\t2215\nchr1\t122564100\t122573400\t0\t631\nchr1\t122575500\t122583000\t0\t2358\nchr1\t122584500\t122598000\t0\t2358\nchr1\t122599500\t122633100\t0\t2578\nchr1\t122634300\t122647200\t0\t2449\nchr1\t122649300\t122655000\t0\t797\nchr1\t122656500\t122658900\t0\t797\nchr1\t122660100\t122661600\t0.0877\t65\nchr1\t122662800\t122676300\t0\t1237\nchr1\t122677800\t122688600\t0\t1708\nchr1\t122690100\t122694900\t0\t1708\nchr1\t122696100\t122699400\t0\t216\nchr1\t122700600\t122700900\t0.0758\t35\nchr1\t122703000\t122712000\t0.0072\t1373\nchr1\t122713800\t122733600\t0\t1321\nchr1\t122734800\t122739900\t0\t2814\nchr1\t122741100\t122752500\t0\t1369\nchr1\t122754300\t122768700\t0\t1534\nchr1\t122769900\t122830800\t0\t1534\nchr1\t122832000\t122836800\t0\t1336\nchr1\t122839200\t122840700\t0\t307\nchr1\t122842500\t122844900\t0\t3523\nchr1\t122846400\t122868900\t0\t3523\nchr1\t122870700\t122872500\t0.0617\t1353\nchr1\t122874000\t122874900\t0\t543\nchr1\t122876700\t122919900\t0\t3575\nchr1\t122923200\t122923500\t0.1824\t21\nchr1\t122925000\t122950500\t0\t5163\nchr1\t122951700\t122952900\t0\t2437\nchr1\t122954100\t122964000\t0\t2437\nchr1\t122965200\t122967600\t0\t84\nchr1\t122968800\t122970600\t0.0661\t472\nchr1\t122973300\t122976000\t0.0926\t1292\nchr1\t122977200\t122990100\t0\t2034\nchr1\t122991300\t123001500\t0\t1118\nchr1\t123002700\t123009600\t0\t371\nchr1\t123011400\t123012000\t0.1283\t401\nchr1\t123013800\t123016800\t0.0075\t669\nchr1\t123018000\t123019500\t0.0075\t669\nchr1\t123020700\t123058200\t0\t2197\nchr1\t123059700\t123066300\t0\t1739\nchr1\t123067800\t123094200\t0\t1739\nchr1\t123095400\t123095700\t0.1164\t40\nchr1\t123097500\t123098400\t0.0079\t1825\nchr1\t123100500\t123113700\t0\t3618\nchr1\t123114900\t123122400\t0\t3618\nchr1\t123123600\t123139500\t0\t3618\nchr1\t123141000\t123150900\t0.0083\t1230\nchr1\t123152400\t123178500\t0\t2320\nchr1\t123179700\t123210000\t0\t2048\nchr1\t123211500\t123219000\t0\t1181\nchr1\t123220200\t123227100\t0\t1181\nchr1\t123229500\t123235800\t0\t1045\nchr1\t123237600\t123237900\t0.0425\t59\nchr1\t123239100\t123240300\t0\t1264\nchr1\t123241500\t123258000\t0\t1264\nchr1\t123259200\t123276900\t0\t1060\nchr1\t123280800\t123301200\t0\t1378\nchr1\t123302400\t123312600\t0\t1002\nchr1\t123313800\t123314400\t0\t1002\nchr1\t123315900\t123319500\t0\t457\nchr1\t123321300\t123326700\t0\t2034\nchr1\t123327900\t123341400\t0\t2034\nchr1\t123343500\t123349500\t0\t424\nchr1\t123350700\t123373200\t0\t2092\nchr1\t123374700\t123386100\t0\t528\nchr1\t123387600\t123390000\t0.0174\t594\nchr1\t123391500\t123397500\t0\t1241\nchr1\t123398700\t123405900\t0.0139\t1482\nchr1\t123407100\t123428100\t0\t952\nchr1\t123429300\t123443100\t0\t1686\nchr1\t123444300\t123444900\t0.1602\t633\nchr1\t123446700\t123468000\t0\t4862\nchr1\t123469800\t123484800\t0\t1745\nchr1\t123486000\t123507300\t0\t1745\nchr1\t123508800\t123531300\t0\t3361\nchr1\t123534900\t123537900\t0.0134\t818\nchr1\t123539100\t123540300\t0\t443\nchr1\t123541500\t123541800\t0\t270\nchr1\t123543000\t123548100\t0\t270\nchr1\t123549300\t123559800\t0\t2837\nchr1\t123561000\t123581400\t0\t2837\nchr1\t123582600\t123593100\t0\t418\nchr1\t123596100\t123613200\t0\t825\nchr1\t123614700\t123618000\t0\t1874\nchr1\t123619500\t123622200\t0\t1874\nchr1\t123624000\t123633300\t0\t1874\nchr1\t123634500\t123636000\t0.0015\t1723\nchr1\t123637200\t123639900\t0.0015\t1723\nchr1\t123641400\t123644100\t0.0015\t1723\nchr1\t123645300\t123648000\t0.0124\t1009\nchr1\t123649200\t123652800\t0\t214\nchr1\t123655200\t123675900\t0\t1546\nchr1\t123677400\t123695100\t0\t1445\nchr1\t123697500\t123706500\t0\t951\nchr1\t123708000\t123714300\t0\t951\nchr1\t123715800\t123716700\t0.0578\t72\nchr1\t123717900\t123720000\t0.0161\t1028\nchr1\t123721500\t123724800\t0\t105\nchr1\t123726000\t123726300\t0.0693\t22\nchr1\t123727800\t123755400\t0\t2290\nchr1\t123756600\t123756900\t0.2447\t254\nchr1\t123758400\t123762600\t0.0422\t501\nchr1\t123764100\t123774600\t0\t1512\nchr1\t123776700\t123795300\t0\t6466\nchr1\t123796500\t123801300\t0\t6466\nchr1\t123803400\t123804000\t0\t1093\nchr1\t123805500\t123815100\t0\t1093\nchr1\t123816300\t123832200\t0\t1093\nchr1\t123833700\t123837300\t0\t154\nchr1\t123838500\t123840900\t0.0244\t104\nchr1\t123842100\t123873000\t0\t2786\nchr1\t123874500\t123881400\t0\t714\nchr1\t123882600\t123918600\t0\t1543\nchr1\t123921300\t123933000\t0\t1846\nchr1\t123934800\t123938700\t0\t158\nchr1\t123940200\t123942000\t0.0141\t62\nchr1\t123944100\t123945000\t0\t421\nchr1\t123946200\t123948000\t0\t421\nchr1\t123949200\t123963600\t0\t5034\nchr1\t123965100\t123966900\t0\t5034\nchr1\t123968100\t123976200\t0\t5034\nchr1\t123977400\t123996900\t0\t4893\nchr1\t123998100\t124004100\t0\t894\nchr1\t124005300\t124011600\t0\t894\nchr1\t124013100\t124045200\t0\t2651\nchr1\t124046400\t124078800\t0\t2651\nchr1\t124080000\t124085700\t0\t2163\nchr1\t124087200\t124095000\t0\t1039\nchr1\t124096200\t124100400\t0\t2235\nchr1\t124101900\t124111200\t0\t2235\nchr1\t124112400\t124119000\t0\t2235\nchr1\t124120200\t124138200\t0\t2235\nchr1\t124140000\t124142400\t0\t2235\nchr1\t124143600\t124149600\t0\t2474\nchr1\t124150800\t124173000\t0\t2474\nchr1\t124174800\t124175100\t0.2184\t82\nchr1\t124176300\t124194000\t0\t3302\nchr1\t124195200\t124205700\t0\t3302\nchr1\t124206900\t124224600\t0\t5543\nchr1\t124225800\t124231800\t0\t5543\nchr1\t124233000\t124256100\t0\t5543\nchr1\t124257300\t124269300\t0\t1857\nchr1\t124270500\t124278600\t0\t1615\nchr1\t124281000\t124281300\t0\t6138\nchr1\t124282500\t124294800\t0\t6138\nchr1\t124296000\t124300500\t0\t6138\nchr1\t124301700\t124316700\t0\t3456\nchr1\t124317900\t124326000\t0.0019\t2182\nchr1\t124328400\t124363200\t0\t1781\nchr1\t124364700\t124383900\t0\t2260\nchr1\t124385100\t124392600\t0\t2260\nchr1\t124394100\t124396500\t0\t2260\nchr1\t124397700\t124401600\t0\t2260\nchr1\t124402800\t124410300\t0\t1178\nchr1\t124411500\t124414800\t0.0154\t1251\nchr1\t124416000\t124420500\t0.0071\t967\nchr1\t124421700\t124422300\t0.0071\t967\nchr1\t124423800\t124454400\t0\t4455\nchr1\t124455600\t124468200\t0\t4455\nchr1\t124469400\t124474200\t0\t4455\nchr1\t124475400\t124499400\t0\t4455\nchr1\t124501800\t124510200\t0\t1179\nchr1\t124511400\t124513800\t0.0271\t2017\nchr1\t124515300\t124527000\t0\t3236\nchr1\t124528200\t124543800\t0\t1337\nchr1\t124545000\t124565100\t0\t4870\nchr1\t124566300\t124586400\t0\t3979\nchr1\t124588800\t124614000\t0\t2276\nchr1\t124615500\t124636800\t0\t8877\nchr1\t124638300\t124655100\t0\t8877\nchr1\t124656300\t124698300\t0\t8877\nchr1\t124699800\t124735800\t0\t7429\nchr1\t124737000\t124740900\t0\t7429\nchr1\t124742400\t124779300\t0\t8694\nchr1\t124781100\t124788600\t0\t2430\nchr1\t124794900\t124795500\t0.0724\t75\nchr1\t124797000\t124797300\t0\t170\nchr1\t124798500\t124801500\t0\t170\nchr1\t124803600\t124805400\t0\t788\nchr1\t124807500\t124814700\t0\t305\nchr1\t124815900\t124820100\t0\t161\nchr1\t124821600\t124822200\t0.0215\t80\nchr1\t124823700\t124826700\t0\t672\nchr1\t124827900\t124834800\t0\t672\nchr1\t124836000\t124848900\t0\t672\nchr1\t124850100\t124850400\t0\t672\nchr1\t124851900\t124852500\t0\t672\nchr1\t124853700\t124857600\t0\t672\nchr1\t124858800\t124860900\t0\t80\nchr1\t124863000\t124872600\t0\t446\nchr1\t124874100\t124883700\t0\t446\nchr1\t124884900\t124896300\t0\t446\nchr1\t124898100\t124898400\t0\t446\nchr1\t124899900\t124900500\t0\t105\nchr1\t124901700\t124902000\t0\t105\nchr1\t124903800\t124907700\t0\t342\nchr1\t124909200\t124909500\t0.0324\t407\nchr1\t124911600\t124914300\t0.0324\t407\nchr1\t124915800\t124920900\t0\t233\nchr1\t124922700\t124925400\t0\t308\nchr1\t124926900\t124928700\t0.0328\t411\nchr1\t124931100\t124931700\t0.0951\t101\nchr1\t124932900\t124936500\t0\t212\nchr1\t124937700\t124939500\t0\t212\nchr1\t125103000\t125103300\t0.0666\t53\nchr1\t125171100\t125171400\t0.0748\t228\nchr1\t125175300\t125175600\t0.0222\t36986\nchr1\t125178000\t125183400\t0.0222\t36986\nchr1\t143184600\t143188200\t0.0145\t10765\nchr1\t143190600\t143194500\t0.0326\t16765\nchr1\t143195700\t143196000\t0.0326\t16765\nchr1\t143199600\t143207400\t0\t30628\nchr1\t143211600\t143221800\t0.0141\t31526\nchr1\t143223000\t143224200\t0.0141\t31526\nchr1\t143226300\t143228100\t0\t36167\nchr1\t143229300\t143230800\t0\t36167\nchr1\t143232300\t143233800\t0\t36167\nchr1\t143235300\t143242800\t0\t15648\nchr1\t143245200\t143245500\t0.1933\t580\nchr1\t143246700\t143247600\t0\t28191\nchr1\t143249400\t143259900\t0\t28191\nchr1\t143261100\t143264400\t0\t28191\nchr1\t143266500\t143268000\t0.0408\t6626\nchr1\t143273700\t143274900\t0\t78\nchr1\t143288700\t143292600\t0\t106\nchr1\t143295000\t143295300\t0\t106\nchr1\t143296500\t143296800\t0.1137\t71\nchr1\t143298900\t143305800\t0\t117\nchr1\t143307900\t143308800\t0\t90\nchr1\t143312700\t143313000\t0\t113\nchr1\t143315400\t143320200\t0\t113\nchr1\t143322000\t143326500\t0\t75\nchr1\t143327700\t143355900\t0\t86\nchr1\t143357100\t143385000\t0\t86\nchr1\t143386200\t143403300\t0\t86\nchr1\t143405400\t143411100\t0\t77\nchr1\t143412300\t143414100\t0\t73\nchr1\t143415600\t143419200\t0\t73\nchr1\t143420400\t143435100\t0\t114\nchr1\t143437500\t143449200\t0\t114\nchr1\t143452200\t143452500\t0\t96\nchr1\t143454000\t143466600\t0\t96\nchr1\t143468100\t143472300\t0\t96\nchr1\t143474100\t143480100\t0\t118\nchr1\t143481300\t143482200\t0\t118\nchr1\t143484000\t143486100\t0.0004\t77\nchr1\t143487600\t143488500\t0\t135\nchr1\t143490300\t143493300\t0\t135\nchr1\t143495400\t143496600\t0.0846\t74\nchr1\t143499300\t143500200\t0.0072\t109\nchr1\t143506500\t143508600\t0\t111\nchr1\t143510100\t143515200\t0\t111\nchr1\t143518200\t143519100\t0\t111\nchr1\t143520300\t143523300\t0\t111\nchr1\t143524500\t143526600\t0\t79\nchr1\t143535000\t143535300\t0.1113\t46\nchr1\t143561400\t143561700\t0.1804\t80\nchr1\t143639100\t143639400\t0.1444\t78\nchr1\t143728500\t143728800\t0.0254\t62\nchr1\t143739000\t143739300\t0.2757\t63\nchr1\t143740500\t143741100\t0.0001\t79\nchr1\t143767200\t143767500\t0.0097\t70\nchr1\t143770200\t143770800\t0\t65\nchr1\t143773200\t143773500\t0.1258\t63\nchr1\t143776200\t143776800\t0.0046\t86\nchr1\t143780100\t143803800\t0\t92\nchr1\t143805600\t143808600\t0\t88\nchr1\t143810400\t143811000\t0\t88\nchr1\t143812500\t143813700\t0\t88\nchr1\t143815200\t143817300\t0\t79\nchr1\t143818800\t143820300\t0.0055\t75\nchr1\t143822100\t143822400\t0.0687\t65\nchr1\t143823600\t143824200\t0.0129\t74\nchr1\t143826900\t143830200\t0.001\t76\nchr1\t143833800\t143834400\t0.0073\t57\nchr1\t143842200\t143842500\t0.1864\t52\nchr1\t143847000\t143847900\t0\t60\nchr1\t143855100\t143856300\t0.0317\t71\nchr1\t143859000\t143860500\t0.0014\t67\nchr1\t143865300\t143865900\t0.0432\t48\nchr1\t143868000\t143868300\t0.1066\t73\nchr1\t143871300\t143872800\t0.1018\t61\nchr1\t143875200\t143875800\t0\t73\nchr1\t143879400\t143879700\t0.1272\t65\nchr1\t143886900\t143888100\t0.0303\t59\nchr1\t143891100\t143891700\t0.0015\t48\nchr1\t143895000\t143895600\t0.0335\t70\nchr1\t143900700\t143901300\t0.0217\t67\nchr1\t143903400\t143903700\t0.004\t72\nchr1\t143916000\t143916300\t0.0135\t72\nchr1\t143921700\t143922600\t0.0016\t70\nchr1\t143929800\t143930100\t0.0044\t65\nchr1\t143932200\t143932500\t0.0044\t65\nchr1\t143939100\t143953800\t0\t83\nchr1\t143955900\t143958600\t0\t81\nchr1\t143960100\t143964900\t0\t81\nchr1\t143968200\t143973900\t0\t81\nchr1\t143975100\t143976900\t0\t81\nchr1\t143979600\t143985600\t0\t80\nchr1\t143988000\t143992800\t0\t77\nchr1\t143995200\t144000600\t0\t77\nchr1\t144001800\t144003300\t0\t77\nchr1\t144004800\t144005400\t0\t55\nchr1\t144006600\t144008400\t0\t91\nchr1\t144010200\t144020700\t0\t91\nchr1\t144022200\t144022500\t0\t91\nchr1\t144024000\t144026400\t0\t91\nchr1\t144027600\t144030300\t0\t91\nchr1\t144033600\t144045600\t0\t98\nchr1\t144046800\t144047100\t0.1331\t58\nchr1\t144049200\t144049800\t0.0124\t74\nchr1\t144051900\t144052200\t0.0124\t74\nchr1\t144053400\t144054300\t0\t85\nchr1\t144057300\t144060300\t0\t85\nchr1\t144062100\t144076500\t0\t85\nchr1\t144078300\t144100800\t0\t100\nchr1\t144102900\t144103200\t0.1806\t316\nchr1\t144105300\t144322500\t0\t125\nchr1\t144323700\t144394200\t0\t141\nchr1\t144397200\t144399900\t0\t89\nchr1\t144401400\t144401700\t0\t89\nchr1\t144406500\t144406800\t0.0787\t63\nchr1\t144408900\t144409200\t0.025\t59\nchr1\t144411300\t144411600\t0.1675\t76\nchr1\t144417000\t144418500\t0\t57\nchr1\t144422400\t144422700\t0.0699\t77\nchr1\t144424800\t144426000\t0.1352\t114\nchr1\t144429600\t144429900\t0.0884\t69\nchr1\t144433500\t144433800\t0.103\t91\nchr1\t144448800\t144450300\t0.0401\t67\nchr1\t144460200\t144460500\t0.1037\t62\nchr1\t144469500\t144469800\t0.0778\t74\nchr1\t144473100\t144475200\t0\t84\nchr1\t144477600\t144479400\t0.0061\t57\nchr1\t144481200\t144481500\t0.0564\t71\nchr1\t144482700\t144483000\t0.0564\t71\nchr1\t144486600\t144488400\t0.0535\t73\nchr1\t144490200\t144490500\t0.0535\t73\nchr1\t144501300\t144502200\t0.0077\t65\nchr1\t144509100\t144509700\t0.1452\t57\nchr1\t144519300\t144519600\t0.1686\t62\nchr1\t144524400\t144525300\t0.01\t69\nchr1\t144535500\t144535800\t0.1094\t56\nchr1\t144537000\t144537300\t0.0797\t59\nchr1\t144559800\t144560100\t0.0426\t65\nchr1\t144561300\t144561600\t0.0426\t65\nchr1\t144568500\t144569700\t0.001\t61\nchr1\t144573000\t144642600\t0\t126\nchr1\t144644100\t144825900\t0\t174\nchr1\t144827400\t144881700\t0\t105\nchr1\t144884100\t144898200\t0\t88\nchr1\t144900000\t144903600\t0\t88\nchr1\t144910800\t144911100\t0.0008\t75\nchr1\t144913500\t144913800\t0\t88\nchr1\t144916500\t144919800\t0\t88\nchr1\t144921900\t144922500\t0.1547\t61\nchr1\t144923700\t144924000\t0.0308\t64\nchr1\t144925800\t144926400\t0.0106\t59\nchr1\t144927600\t144928200\t0.0093\t62\nchr1\t144930000\t144930300\t0.0093\t62\nchr1\t144932700\t144933000\t0.1679\t94\nchr1\t144934800\t144935700\t0\t70\nchr1\t144937500\t144939300\t0\t85\nchr1\t144942900\t144943200\t0.0931\t62\nchr1\t144945900\t144949500\t0\t69\nchr1\t144958500\t144963600\t0\t77\nchr1\t144966900\t144970500\t0.002\t115\nchr1\t144973500\t144973800\t0.0404\t65\nchr1\t144976800\t144979500\t0.0114\t76\nchr1\t144981300\t144981600\t0.0114\t76\nchr1\t144983400\t144983700\t0.0114\t76\nchr1\t144989100\t144990600\t0\t93\nchr1\t144995100\t144995700\t0.0146\t78\nchr1\t144997800\t144998400\t0.0146\t78\nchr1\t145000200\t145000500\t0.1074\t68\nchr1\t145002000\t145002300\t0.1074\t68\nchr1\t145004100\t145005000\t0.0318\t59\nchr1\t145008000\t145008300\t0.0171\t73\nchr1\t145011000\t145011300\t0.0171\t73\nchr1\t145012500\t145012800\t0.1464\t45\nchr1\t145014600\t145016700\t0.0369\t78\nchr1\t145018200\t145019700\t0\t59\nchr1\t145021200\t145021500\t0.0396\t53\nchr1\t145023900\t145029300\t0\t76\nchr1\t145030800\t145031100\t0\t76\nchr1\t145032600\t145040400\t0\t90\nchr1\t145042800\t145044000\t0\t79\nchr1\t145045500\t145057800\t0\t95\nchr1\t145059300\t145063500\t0\t95\nchr1\t145065600\t145066200\t0.0003\t73\nchr1\t145067400\t145068000\t0\t78\nchr1\t145070400\t145072500\t0\t78\nchr1\t145073700\t145075500\t0\t78\nchr1\t145077300\t145079700\t0\t69\nchr1\t145082700\t145083900\t0.0022\t70\nchr1\t145085400\t145088400\t0.0022\t70\nchr1\t145089600\t145099800\t0\t85\nchr1\t145101300\t145106400\t0\t85\nchr1\t145107600\t145128900\t0\t87\nchr1\t145131000\t145131300\t0\t79\nchr1\t145132500\t145135200\t0\t79\nchr1\t145136700\t145137300\t0\t79\nchr1\t145138800\t145139100\t0\t79\nchr1\t145140900\t145142100\t0\t78\nchr1\t145143600\t145146000\t0\t78\nchr1\t145147500\t145148700\t0\t78\nchr1\t145150200\t145150500\t0.0417\t64\nchr1\t145151700\t145152000\t0.0417\t64\nchr1\t145154100\t145155900\t0\t68\nchr1\t145157400\t145167900\t0\t78\nchr1\t145170900\t145171500\t0.0158\t57\nchr1\t145173900\t145176300\t0\t75\nchr1\t145177500\t145178700\t0\t75\nchr1\t145180200\t145181100\t0\t75\nchr1\t145182300\t145182600\t0\t75\nchr1\t145184400\t145185600\t0.0127\t68\nchr1\t145187400\t145187700\t0.0087\t85\nchr1\t145195800\t145196400\t0.0264\t56\nchr1\t145199400\t145203300\t0\t83\nchr1\t145205700\t145206000\t0.0244\t65\nchr1\t145208400\t145208700\t0.0244\t65\nchr1\t145211100\t145212300\t0\t72\nchr1\t145213800\t145214100\t0.064\t75\nchr1\t145216800\t145217100\t0.0187\t98\nchr1\t145220700\t145221000\t0.0044\t63\nchr1\t145236300\t145236600\t0.0146\t77\nchr1\t145239900\t145240500\t0\t64\nchr1\t145242000\t145246800\t0\t74\nchr1\t145250100\t145254300\t0\t74\nchr1\t145257900\t145258200\t0.0084\t71\nchr1\t145264800\t145266000\t0.0146\t66\nchr1\t145267500\t145268400\t0\t49\nchr1\t145274700\t145275900\t0.0002\t64\nchr1\t145277400\t145277700\t0.0003\t75\nchr1\t145279500\t145280100\t0.0003\t75\nchr1\t145283100\t145283400\t0.0278\t62\nchr1\t145284900\t145286100\t0.0671\t61\nchr1\t145292700\t145393200\t0\t183\nchr1\t145401300\t145401600\t0.0593\t71\nchr1\t145406700\t145407000\t0.1795\t70\nchr1\t145411800\t145414800\t0.0278\t62\nchr1\t145416300\t145416600\t0\t73\nchr1\t145418100\t145419000\t0\t73\nchr1\t145420500\t145421100\t0.0886\t69\nchr1\t145433400\t145433700\t0.163\t69\nchr1\t145441800\t145442100\t0.1154\t59\nchr1\t145443600\t145443900\t0.0222\t64\nchr1\t145447500\t145447800\t0.1832\t43\nchr1\t145449000\t145449300\t0.0808\t66\nchr1\t145451100\t145451400\t0.1246\t72\nchr1\t145456500\t145457700\t0\t73\nchr1\t145467900\t145468200\t0.147\t54\nchr1\t145480800\t145481100\t0.0663\t73\nchr1\t145483500\t145483800\t0.2127\t61\nchr1\t145488600\t145488900\t0.0826\t66\nchr1\t145491600\t145492500\t0.0486\t70\nchr1\t145497900\t145511700\t0\t76\nchr1\t145514400\t145514700\t0\t65\nchr1\t145521600\t145522500\t0\t63\nchr1\t145527300\t145527600\t0.0329\t71\nchr1\t145540500\t145541100\t0.0182\t52\nchr1\t145550400\t145551300\t0\t60\nchr1\t145573200\t145573500\t0.0852\t83\nchr1\t145581600\t145581900\t0.033\t79\nchr1\t145584600\t145584900\t0.1095\t65\nchr1\t145589700\t145590000\t0.1279\t90\nchr1\t145618500\t145618800\t0.0216\t56\nchr1\t145622400\t145622700\t0.04\t55\nchr1\t145630800\t145632000\t0.0113\t48\nchr1\t145633200\t145633800\t0.0039\t49\nchr1\t145643700\t145644300\t0.0306\t53\nchr1\t145678200\t145678500\t0.0067\t55\nchr1\t145682100\t145682400\t0.0805\t69\nchr1\t145810200\t145811700\t0.0086\t45\nchr1\t145816200\t145817400\t0.0075\t72\nchr1\t145821600\t145823100\t0.128\t71\nchr1\t145924800\t145925100\t0.1376\t56\nchr1\t146060400\t146061000\t0.0965\t60\nchr1\t146063700\t146066700\t0\t93\nchr1\t146067900\t146069100\t0.0321\t84\nchr1\t146070300\t146125500\t0\t219\nchr1\t146126700\t146128500\t0\t90\nchr1\t146129700\t146133900\t0\t90\nchr1\t146137200\t146141100\t0\t79\nchr1\t146143500\t146157900\t0\t85\nchr1\t146159700\t146161500\t0\t70\nchr1\t146162700\t146170500\t0\t82\nchr1\t146173200\t146174100\t0\t82\nchr1\t146175900\t146179200\t0\t77\nchr1\t146181000\t146184900\t0\t77\nchr1\t146188500\t146228100\t0\t99\nchr1\t146229300\t146250300\t0\t84\nchr1\t146252100\t146317800\t0\t87\nchr1\t146319000\t146319600\t0\t71\nchr1\t146321100\t146321400\t0.0861\t64\nchr1\t146327100\t146327400\t0.0992\t55\nchr1\t146330100\t146330400\t0\t61\nchr1\t146332800\t146333100\t0.0016\t64\nchr1\t146334300\t146335200\t0.0016\t64\nchr1\t146337000\t146340900\t0\t94\nchr1\t146342400\t146343900\t0.0013\t79\nchr1\t146346000\t146349000\t0.0013\t79\nchr1\t146350200\t146356500\t0\t90\nchr1\t146358000\t146358300\t0\t90\nchr1\t146359800\t146362200\t0.0242\t74\nchr1\t146367300\t146367600\t0.0482\t69\nchr1\t146369100\t146369700\t0.0331\t78\nchr1\t146396700\t146397000\t0.2819\t60\nchr1\t146398200\t146398500\t0.176\t57\nchr1\t146403000\t146403600\t0.0445\t83\nchr1\t146414400\t146414700\t0.0188\t67\nchr1\t146417100\t146417400\t0.0834\t87\nchr1\t146421900\t146422200\t0.0834\t87\nchr1\t146423400\t146424600\t0.0446\t60\nchr1\t146428800\t146429100\t0.1077\t70\nchr1\t146430300\t146430600\t0.1077\t70\nchr1\t146433600\t146433900\t0.0839\t73\nchr1\t146439300\t146440800\t0\t81\nchr1\t146442300\t146442600\t0.0403\t83\nchr1\t146444400\t146446200\t0.0403\t83\nchr1\t146451300\t146452200\t0\t99\nchr1\t146453700\t146454000\t0\t99\nchr1\t146456100\t146456400\t0.0019\t49\nchr1\t146460000\t146461200\t0.0015\t81\nchr1\t146465100\t146465700\t0.0348\t67\nchr1\t146479800\t146480100\t0.111\t77\nchr1\t146485500\t146485800\t0.0831\t48\nchr1\t146487600\t146488200\t0\t75\nchr1\t146492400\t146494800\t0\t72\nchr1\t146496000\t146497800\t0\t72\nchr1\t146502900\t146503200\t0.0958\t62\nchr1\t146506500\t146528100\t0\t79\nchr1\t146532300\t146533200\t0\t68\nchr1\t146535300\t146538600\t0\t67\nchr1\t146543400\t146543700\t0.044\t65\nchr1\t146545500\t146545800\t0.0104\t69\nchr1\t146549100\t146549400\t0.0295\t71\nchr1\t146550600\t146551200\t0.0006\t51\nchr1\t146553900\t146554500\t0.016\t65\nchr1\t146563200\t146564700\t0\t53\nchr1\t146567100\t146567400\t0.1105\t66\nchr1\t146570700\t146571000\t0.0033\t58\nchr1\t146578800\t146580300\t0.0192\t71\nchr1\t146587500\t146588400\t0.1401\t73\nchr1\t146593500\t146593800\t0.0848\t63\nchr1\t146599800\t146600100\t0.0795\t74\nchr1\t146605200\t146605500\t0.0207\t69\nchr1\t146607300\t146607600\t0.0207\t69\nchr1\t146609700\t146610000\t0.0055\t74\nchr1\t146611200\t146611800\t0.1235\t63\nchr1\t146619000\t146619900\t0\t74\nchr1\t146625600\t146625900\t0.0312\t76\nchr1\t146634000\t146634300\t0.0184\t58\nchr1\t146652900\t146653200\t0.029\t78\nchr1\t146664900\t146665200\t0.0097\t69\nchr1\t146675400\t146676000\t0.1243\t63\nchr1\t146677800\t146678400\t0.1994\t68\nchr1\t146681400\t146681700\t0.0547\t54\nchr1\t146685600\t146687700\t0.0119\t64\nchr1\t146692800\t146693400\t0.0772\t56\nchr1\t146697300\t146697600\t0.1814\t52\nchr1\t146709900\t146710200\t0.0394\t55\nchr1\t146717400\t146722800\t0\t97\nchr1\t146728800\t146731500\t0\t73\nchr1\t146733900\t146734200\t0.1305\t62\nchr1\t146741400\t146741700\t0.0276\t68\nchr1\t146743800\t146744100\t0.0276\t68\nchr1\t146747100\t146747400\t0.0523\t56\nchr1\t146749200\t146749500\t0.1701\t67\nchr1\t146753700\t146754000\t0.0431\t59\nchr1\t146759400\t146759700\t0.029\t48\nchr1\t146763000\t146763600\t0.0019\t63\nchr1\t146765100\t146765700\t0.0088\t65\nchr1\t146779500\t146779800\t0.0045\t83\nchr1\t146786400\t146786700\t0.1849\t67\nchr1\t146787900\t146788200\t0.1222\t71\nchr1\t146790600\t146791200\t0.006\t57\nchr1\t146795100\t146795400\t0.0102\t50\nchr1\t146801400\t146801700\t0.1394\t65\nchr1\t146802900\t146804700\t0.0291\t66\nchr1\t146807700\t146808000\t0.1566\t58\nchr1\t146811300\t146811600\t0.06\t76\nchr1\t146823600\t146823900\t0.1536\t65\nchr1\t146826000\t146826600\t0.0111\t51\nchr1\t146835600\t146835900\t0.1777\t66\nchr1\t146838900\t146839200\t0.0609\t46\nchr1\t146841900\t146842500\t0.0061\t64\nchr1\t146846400\t146846700\t0.0968\t58\nchr1\t146853600\t146855100\t0.0375\t73\nchr1\t146859000\t146859900\t0.0726\t59\nchr1\t146862900\t146863200\t0.0559\t63\nchr1\t146868900\t146871900\t0\t121\nchr1\t146876400\t146876700\t0.0883\t52\nchr1\t146886300\t146886600\t0.0558\t63\nchr1\t146888100\t146889600\t0.0087\t71\nchr1\t146892000\t146892600\t0.0233\t60\nchr1\t146905200\t146905500\t0.1882\t47\nchr1\t146908200\t146909100\t0\t74\nchr1\t146913900\t146914200\t0.0586\t57\nchr1\t146916000\t146919600\t0\t69\nchr1\t146922300\t146923800\t0.0007\t69\nchr1\t146931600\t146931900\t0.0414\t71\nchr1\t146933700\t146934000\t0.0414\t71\nchr1\t146955000\t146955600\t0.0453\t74\nchr1\t146958600\t146960100\t0\t66\nchr1\t146979000\t146979900\t0\t72\nchr1\t146983500\t146983800\t0.0211\t370\nchr1\t146985000\t146985300\t0.0211\t370\nchr1\t146986800\t146990400\t0\t408\nchr1\t146991900\t146994300\t0\t408\nchr1\t146998500\t146998800\t0.1668\t73\nchr1\t147015300\t147015900\t0.0178\t58\nchr1\t147942600\t147942900\t0.146\t45\nchr1\t147953400\t147953700\t0.0072\t67\nchr1\t147955800\t147956100\t0.0111\t52\nchr1\t147966600\t147966900\t0.0044\t61\nchr1\t147982500\t147982800\t0.2361\t61\nchr1\t148001100\t148001400\t0.0119\t59\nchr1\t148003800\t148005300\t0.0765\t60\nchr1\t148016100\t148016400\t0.0537\t67\nchr1\t148026000\t148026600\t0.0217\t60\nchr1\t148029600\t148031400\t0\t65\nchr1\t148053900\t148054200\t0.0623\t59\nchr1\t148056900\t148057200\t0.1885\t50\nchr1\t148061700\t148062000\t0.0579\t66\nchr1\t148065000\t148065300\t0.1211\t69\nchr1\t148070400\t148084800\t0\t77\nchr1\t148087500\t148088700\t0.0148\t60\nchr1\t148095300\t148095600\t0.0414\t52\nchr1\t148097700\t148098000\t0.1184\t49\nchr1\t148104600\t148105200\t0.022\t267\nchr1\t148107000\t148107300\t0.022\t267\nchr1\t148109700\t148110000\t0.1315\t92\nchr1\t148113600\t148114200\t0.0149\t84\nchr1\t148127100\t148128600\t0.0047\t64\nchr1\t148131600\t148131900\t0.0182\t64\nchr1\t148156800\t148157100\t0.1456\t67\nchr1\t148167900\t148168200\t0.1117\t64\nchr1\t148169700\t148170000\t0.1117\t64\nchr1\t148176300\t148177800\t0\t75\nchr1\t148180200\t148183800\t0\t75\nchr1\t148185600\t148185900\t0.0853\t48\nchr1\t148187700\t148188900\t0\t68\nchr1\t148195200\t148197900\t0\t74\nchr1\t148200300\t148202400\t0\t65\nchr1\t148205100\t148226700\t0\t77\nchr1\t148238700\t148239300\t0\t66\nchr1\t148240500\t148241100\t0\t66\nchr1\t148243800\t148244100\t0.0782\t70\nchr1\t148245300\t148245900\t0.006\t72\nchr1\t148252500\t148253400\t0.033\t67\nchr1\t148256700\t148257000\t0.0851\t71\nchr1\t148281000\t148282800\t0.0041\t68\nchr1\t148284600\t148285800\t0.0286\t71\nchr1\t148298400\t148299600\t0.0017\t62\nchr1\t148301400\t148302600\t0.0213\t80\nchr1\t148419300\t148419600\t0.0753\t51\nchr1\t148442700\t148444800\t0\t76\nchr1\t148446000\t148447500\t0\t76\nchr1\t148448700\t148449000\t0.0706\t38\nchr1\t148450500\t148450800\t0.1534\t50\nchr1\t148455300\t148456500\t0.0538\t71\nchr1\t148460100\t148461900\t0\t92\nchr1\t148463100\t148463400\t0.233\t55\nchr1\t148470900\t148471800\t0.0692\t68\nchr1\t148473300\t148473600\t0.0089\t78\nchr1\t148476300\t148476600\t0.1192\t55\nchr1\t148479000\t148479300\t0.113\t41\nchr1\t148482000\t148482300\t0.0386\t62\nchr1\t148484400\t148484700\t0.0797\t69\nchr1\t148486500\t148487100\t0.0758\t44\nchr1\t148491600\t148494000\t0\t60\nchr1\t148495500\t148496100\t0.0107\t80\nchr1\t148499100\t148499400\t0.0744\t70\nchr1\t148506900\t148508700\t0.0632\t72\nchr1\t148511100\t148512300\t0.091\t66\nchr1\t148516200\t148517400\t0.0211\t64\nchr1\t148518900\t148519800\t0.0341\t78\nchr1\t148521000\t148521300\t0.0341\t78\nchr1\t148531500\t148531800\t0.0027\t45\nchr1\t148533000\t148533300\t0.0583\t117\nchr1\t148535400\t148559100\t0\t215\nchr1\t148560300\t148584900\t0\t142\nchr1\t148588200\t148590900\t0\t86\nchr1\t148594500\t148600200\t0\t91\nchr1\t148601700\t148604400\t0\t91\nchr1\t148605900\t148607400\t0\t91\nchr1\t148609200\t148609500\t0.1503\t56\nchr1\t148611000\t148620600\t0\t80\nchr1\t148623300\t148627200\t0\t80\nchr1\t148628400\t148629000\t0\t80\nchr1\t148630500\t148632000\t0\t85\nchr1\t148633500\t148636500\t0\t85\nchr1\t148639200\t148659600\t0\t81\nchr1\t148662000\t148701000\t0\t87\nchr1\t148702500\t148712400\t0\t110\nchr1\t148713600\t148716900\t0\t110\nchr1\t148718700\t148819800\t0\t110\nchr1\t148822200\t148823400\t0\t107\nchr1\t148824600\t148876500\t0\t107\nchr1\t148877700\t148909800\t0\t107\nchr1\t148911300\t148911600\t0.0032\t93\nchr1\t148912800\t148914900\t0.0032\t93\nchr1\t148916400\t148916700\t0\t69\nchr1\t148918200\t148919100\t0\t69\nchr1\t148920300\t148922100\t0\t69\nchr1\t148924500\t148924800\t0.0768\t66\nchr1\t148926000\t148926300\t0.0731\t69\nchr1\t148928100\t148929000\t0\t52\nchr1\t148930800\t148932300\t0.0017\t81\nchr1\t148935300\t148936500\t0\t57\nchr1\t148938900\t148939200\t0.0573\t60\nchr1\t148941000\t148941300\t0.0033\t69\nchr1\t148942500\t148943700\t0.0033\t69\nchr1\t148956900\t148957500\t0\t53\nchr1\t148960500\t148960800\t0.044\t55\nchr1\t148965600\t148966200\t0.1428\t60\nchr1\t148974000\t148974900\t0\t53\nchr1\t148977000\t148977600\t0.0278\t50\nchr1\t148988400\t148988700\t0.0032\t68\nchr1\t148990800\t148991100\t0.0577\t59\nchr1\t148993200\t148994100\t0.0331\t62\nchr1\t149004600\t149004900\t0.012\t70\nchr1\t149006700\t149008500\t0\t76\nchr1\t149011200\t149012100\t0\t72\nchr1\t149013300\t149014500\t0.0204\t69\nchr1\t149018700\t149020500\t0.0099\t77\nchr1\t149027700\t149028000\t0.0352\t65\nchr1\t149042400\t149042700\t0.1815\t72\nchr1\t149050800\t149051100\t0.0303\t99\nchr1\t149052900\t149053500\t0.0303\t99\nchr1\t149056200\t149058600\t0\t104\nchr1\t149061600\t149061900\t0.1676\t92\nchr1\t149063100\t149063400\t0.2959\t94\nchr1\t149083200\t149083500\t0.1371\t85\nchr1\t149090700\t149091000\t0.1207\t65\nchr1\t149093700\t149094600\t0.098\t73\nchr1\t149096400\t149096700\t0.0002\t65\nchr1\t149107200\t149110200\t0\t69\nchr1\t149112300\t149112900\t0.0019\t79\nchr1\t149116800\t149117100\t0.0055\t90\nchr1\t149119200\t149119500\t0.0055\t90\nchr1\t149121300\t149121900\t0.0258\t72\nchr1\t149128200\t149130000\t0.0593\t75\nchr1\t149132400\t149133900\t0\t74\nchr1\t149140800\t149141100\t0.1027\t61\nchr1\t149142600\t149143500\t0.0121\t78\nchr1\t149145300\t149145900\t0.0539\t88\nchr1\t149148900\t149149500\t0.0236\t78\nchr1\t149155500\t149155800\t0.0145\t50\nchr1\t149161800\t149162100\t0.0566\t69\nchr1\t149163900\t149164200\t0.0135\t87\nchr1\t149165400\t149165700\t0.0135\t87\nchr1\t149169300\t149169600\t0.0383\t58\nchr1\t149174100\t149174700\t0.0296\t84\nchr1\t149177700\t149178300\t0.0919\t77\nchr1\t149179800\t149180700\t0.022\t68\nchr1\t149187300\t149190300\t0\t77\nchr1\t149192100\t149192700\t0\t61\nchr1\t149193900\t149194200\t0\t61\nchr1\t149198700\t149199300\t0.0314\t89\nchr1\t149201400\t149202300\t0\t59\nchr1\t149204700\t149205000\t0.1865\t62\nchr1\t149207700\t149209800\t0\t89\nchr1\t149211900\t149214600\t0.0194\t73\nchr1\t149216100\t149217300\t0.0363\t68\nchr1\t149220600\t149222400\t0\t72\nchr1\t149223600\t149230500\t0\t84\nchr1\t149232600\t149250000\t0\t92\nchr1\t149251200\t149259000\t0\t92\nchr1\t149261100\t149264400\t0\t92\nchr1\t149267100\t149274000\t0\t97\nchr1\t149275200\t149293200\t0\t97\nchr1\t149294700\t149303400\t0\t107\nchr1\t149304600\t149305800\t0\t107\nchr1\t149307000\t149308200\t0.0284\t62\nchr1\t149310000\t149313600\t0\t90\nchr1\t149315700\t149363400\t0\t90\nchr1\t149366700\t149368200\t0.03\t62\nchr1\t149372400\t149376600\t0\t95\nchr1\t149379300\t149380500\t0.088\t69\nchr1\t149389800\t149392500\t0.0123\t66\nchr1\t149394000\t149394300\t0.0659\t68\nchr1\t149397000\t149397900\t0\t95\nchr1\t149399400\t149399700\t0\t69\nchr1\t149401500\t149403900\t0\t69\nchr1\t149405700\t149408400\t0\t70\nchr1\t149411700\t149412000\t0.0258\t73\nchr1\t149416200\t149416500\t0.0192\t60\nchr1\t149420700\t149422200\t0.0004\t74\nchr1\t149426100\t149426400\t0.023\t52\nchr1\t149427600\t149428200\t0.0048\t57\nchr1\t149430900\t149431500\t0.0126\t68\nchr1\t149434500\t149444400\t0\t100\nchr1\t149448000\t149448300\t0.0018\t68\nchr1\t149450700\t149459700\t0\t82\nchr1\t149463600\t149463900\t0\t71\nchr1\t149465100\t149467800\t0\t71\nchr1\t149469300\t149470800\t0\t71\nchr1\t149473200\t149476500\t0\t94\nchr1\t149481900\t149484300\t0.0102\t94\nchr1\t149485500\t149486400\t0\t83\nchr1\t149488500\t149554200\t0\t169\nchr1\t149559000\t149559300\t0\t75\nchr1\t149566800\t149567400\t0.0996\t70\nchr1\t149568600\t149569200\t0\t82\nchr1\t149570400\t149577600\t0\t82\nchr1\t149580000\t149581500\t0\t82\nchr1\t149583600\t149585100\t0\t82\nchr1\t149587800\t149589900\t0.0121\t83\nchr1\t149591100\t149591400\t0.0121\t83\nchr1\t149593200\t149593500\t0.0338\t69\nchr1\t149595000\t149598300\t0.0299\t63\nchr1\t149606700\t149607000\t0.0856\t38\nchr1\t149609100\t149609700\t0.0467\t94\nchr1\t149614500\t149614800\t0.068\t72\nchr1\t149617800\t149618400\t0.0256\t47\nchr1\t149621100\t149621700\t0\t72\nchr1\t149623200\t149623800\t0.0024\t82\nchr1\t149625000\t149625300\t0.0024\t82\nchr1\t149640000\t149640300\t0.1317\t47\nchr1\t149643000\t149643300\t0.1219\t55\nchr1\t149649300\t149649600\t0.1598\t60\nchr1\t149651100\t149651700\t0.0245\t70\nchr1\t149654700\t149655000\t0.1604\t47\nchr1\t149659800\t149660100\t0.0868\t61\nchr1\t149675700\t149676300\t0.0045\t67\nchr1\t149678100\t149679600\t0.0632\t58\nchr1\t149681100\t149683200\t0.0022\t85\nchr1\t149684700\t149685000\t0.0022\t85\nchr1\t149687100\t149687400\t0.0465\t65\nchr1\t149688600\t149689500\t0.0124\t67\nchr1\t149696400\t149708400\t0\t81\nchr1\t149710800\t149712000\t0\t66\nchr1\t149714400\t149715600\t0.0123\t61\nchr1\t149717100\t149719200\t0\t69\nchr1\t149722800\t149725200\t0.0459\t69\nchr1\t149728500\t149728800\t0.0634\t61\nchr1\t149734200\t149734500\t0.025\t63\nchr1\t149736000\t149737200\t0.0703\t68\nchr1\t149740800\t149741100\t0.1155\t64\nchr1\t149742300\t149742900\t0\t59\nchr1\t149755800\t149756100\t0.0518\t64\nchr1\t149758200\t149758500\t0.1983\t64\nchr1\t149767800\t149769000\t0.0156\t59\nchr1\t149772000\t149773500\t0\t66\nchr1\t149775900\t149776200\t0.1227\t62\nchr1\t149783100\t149784000\t0\t70\nchr1\t149791800\t149792100\t0.1275\t68\nchr1\t149794500\t149795700\t0.0063\t68\nchr1\t149822100\t149843400\t0\t81\nchr1\t149850600\t149871900\t0\t83\nchr1\t150728100\t150728700\t0.1538\t55\nchr1\t151599900\t151601700\t0.0506\t78\nchr1\t151647300\t151647600\t0.1975\t85\nchr1\t152213700\t152214000\t0.008\t175\nchr1\t152216700\t152218200\t0\t306\nchr1\t152269500\t152271300\t0\t52\nchr1\t152305800\t152307000\t0.0842\t68\nchr1\t152490300\t152491500\t0.0011\t78\nchr1\t153278700\t153279000\t0.0491\t78\nchr1\t155189100\t155190000\t0\t43\nchr1\t155213100\t155214300\t0\t70\nchr1\t155233800\t155235000\t0\t70\nchr1\t155610900\t155611200\t0.0376\t66\nchr1\t155618700\t155619000\t0.0209\t63\nchr1\t155626800\t155629800\t0.028\t81\nchr1\t155633100\t155635500\t0\t95\nchr1\t155701200\t155701500\t0.0394\t97\nchr1\t155746500\t155746800\t0.1094\t65\nchr1\t155757600\t155758200\t0.1238\t63\nchr1\t156179700\t156180000\t0.2474\t63\nchr1\t156558600\t156559200\t0\t53\nchr1\t158240700\t158241000\t0.1121\t67\nchr1\t158761800\t158763000\t0.008\t69\nchr1\t158954100\t158954400\t0.0501\t74\nchr1\t158955600\t158955900\t0.116\t74\nchr1\t159456900\t159457200\t0.0873\t57\nchr1\t159526800\t159527100\t0.0794\t61\nchr1\t161440800\t161444100\t0\t377\nchr1\t161445300\t161458500\t0\t377\nchr1\t161460300\t161471700\t0\t345\nchr1\t161573400\t161578200\t0\t85\nchr1\t161579700\t161586300\t0\t85\nchr1\t161588100\t161589000\t0\t67\nchr1\t161613600\t161613900\t0.0164\t68\nchr1\t161640000\t161640600\t0.0063\t22\nchr1\t161641800\t161642100\t0.0081\t48\nchr1\t161651100\t161651700\t0.0038\t55\nchr1\t161653800\t161670900\t0\t75\nchr1\t161673900\t161674200\t0.0272\t58\nchr1\t162738300\t162739200\t0.006\t91\nchr1\t163262400\t163262700\t0.0263\t67\nchr1\t163641000\t163641900\t0.0168\t90\nchr1\t163643700\t163644300\t0.0168\t90\nchr1\t164463300\t164464800\t0.0346\t121\nchr1\t165971100\t165974100\t0\t114\nchr1\t166243200\t166248000\t0.0348\t137\nchr1\t168055500\t168055800\t0.0323\t67\nchr1\t168349200\t168349500\t0.0521\t72\nchr1\t168351600\t168352200\t0.0612\t93\nchr1\t171377700\t171378000\t0.165\t85\nchr1\t171690600\t171690900\t0.0756\t91\nchr1\t172059300\t172061100\t0.0333\t74\nchr1\t172981800\t172982100\t0.0321\t64\nchr1\t172983300\t172986000\t0.0044\t73\nchr1\t172987800\t172988100\t0.1298\t59\nchr1\t174235500\t174237600\t0.0112\t95\nchr1\t174350400\t174351000\t0.0576\t73\nchr1\t174379500\t174380100\t0.0021\t93\nchr1\t174381900\t174382800\t0.0021\t93\nchr1\t174590700\t174595500\t0\t101\nchr1\t174630300\t174630600\t0.0423\t85\nchr1\t174633900\t174634200\t0.2314\t92\nchr1\t174843600\t174848400\t0\t111\nchr1\t176132700\t176133000\t0.0024\t21\nchr1\t176256300\t176261100\t0\t116\nchr1\t176751300\t176752200\t0.0162\t87\nchr1\t177638400\t177639300\t0.0236\t114\nchr1\t178315800\t178317000\t0\t81\nchr1\t178778400\t178778700\t0.0172\t137\nchr1\t178804500\t178805100\t0.1071\t117\nchr1\t178841400\t178842600\t0\t101\nchr1\t180699300\t180702300\t0\t95\nchr1\t180867000\t180872700\t0\t120\nchr1\t181225500\t181226700\t0.0592\t58\nchr1\t182508900\t182510400\t0.0063\t70\nchr1\t184846200\t184851300\t0.0009\t121\nchr1\t185004300\t185004600\t0.1429\t165\nchr1\t185253900\t185254200\t0.1867\t66\nchr1\t185255400\t185255700\t0.1867\t66\nchr1\t185380200\t185380500\t0.0792\t95\nchr1\t185890500\t185891100\t0.0936\t83\nchr1\t186641100\t186642000\t0.156\t133\nchr1\t186795600\t186796200\t0.0239\t24\nchr1\t187344000\t187348500\t0\t116\nchr1\t187598700\t187603500\t0\t112\nchr1\t189025800\t189026100\t0.1147\t26\nchr1\t189469500\t189471000\t0.0753\t88\nchr1\t190730700\t190731000\t0.2258\t59\nchr1\t190732500\t190732800\t0.148\t92\nchr1\t191064000\t191064300\t0.2471\t44\nchr1\t191069700\t191070000\t0.0579\t58\nchr1\t192501600\t192502800\t0.0418\t95\nchr1\t192504600\t192506100\t0.0418\t95\nchr1\t193718400\t193723500\t0\t103\nchr1\t195925500\t195928800\t0\t92\nchr1\t196219500\t196225200\t0\t114\nchr1\t196753200\t196754400\t0\t45\nchr1\t196757100\t196757400\t0.0483\t64\nchr1\t196758900\t196759200\t0.0483\t64\nchr1\t196796100\t196796400\t0.0089\t63\nchr1\t196819500\t196819800\t0.0346\t59\nchr1\t196821300\t196821600\t0.0774\t66\nchr1\t196838100\t196839300\t0\t49\nchr1\t196842300\t196844100\t0\t54\nchr1\t196847100\t196847700\t0.0188\t26\nchr1\t196920900\t196921200\t0.0221\t70\nchr1\t196943700\t196944000\t0.0128\t63\nchr1\t197531400\t197534100\t0\t102\nchr1\t197708100\t197713800\t0\t111\nchr1\t198250500\t198250800\t0.1148\t93\nchr1\t199023600\t199025400\t0\t102\nchr1\t199469700\t199470900\t0\t78\nchr1\t200797500\t200797800\t0.0506\t95\nchr1\t200914800\t200915400\t0\t72\nchr1\t202391700\t202392000\t0.007\t11\nchr1\t204471300\t204471600\t0\t59\nchr1\t205854300\t205854600\t0.0894\t60\nchr1\t206153400\t206153700\t0.0215\t56\nchr1\t206158800\t206160300\t0\t63\nchr1\t206171100\t206172000\t0\t77\nchr1\t206175900\t206176200\t0.1206\t59\nchr1\t206180100\t206180700\t0.0179\t63\nchr1\t206183400\t206183700\t0.0664\t42\nchr1\t206185200\t206190000\t0\t75\nchr1\t206192100\t206192700\t0.0039\t68\nchr1\t206194800\t206196600\t0\t63\nchr1\t206199300\t206202900\t0.0004\t63\nchr1\t206204400\t206205600\t0.0846\t76\nchr1\t206207700\t206208300\t0.0846\t76\nchr1\t206211300\t206212800\t0.0649\t64\nchr1\t206216700\t206217000\t0\t71\nchr1\t206218800\t206219700\t0\t71\nchr1\t206223300\t206225100\t0\t67\nchr1\t206232600\t206234100\t0\t83\nchr1\t206235300\t206236800\t0\t83\nchr1\t206238000\t206238600\t0\t83\nchr1\t206242500\t206242800\t0.1018\t68\nchr1\t206244000\t206244300\t0.1018\t68\nchr1\t206245800\t206247900\t0\t90\nchr1\t206251800\t206253000\t0.0913\t74\nchr1\t206256900\t206257200\t0.1776\t66\nchr1\t206259900\t206261400\t0.0109\t59\nchr1\t206264700\t206265600\t0\t71\nchr1\t206269800\t206272200\t0\t70\nchr1\t206274900\t206275500\t0.0163\t75\nchr1\t206277300\t206277600\t0.0163\t75\nchr1\t206279100\t206279400\t0.0233\t73\nchr1\t206282100\t206282700\t0.0233\t73\nchr1\t206287500\t206289000\t0.1385\t56\nchr1\t206293500\t206294400\t0.0004\t71\nchr1\t206297100\t206297400\t0.0907\t68\nchr1\t206299200\t206300700\t0.0907\t68\nchr1\t206302800\t206303100\t0.126\t55\nchr1\t206308200\t206308500\t0.0012\t60\nchr1\t206314800\t206315100\t0.1434\t61\nchr1\t206316900\t206317500\t0.0083\t77\nchr1\t206320200\t206321700\t0.0165\t60\nchr1\t206323800\t206324100\t0.0013\t68\nchr1\t206328300\t206332200\t0\t105\nchr1\t206336100\t206338800\t0.0168\t83\nchr1\t206349000\t206349900\t0.0757\t67\nchr1\t206352000\t206352600\t0.0307\t51\nchr1\t206359200\t206359800\t0.0382\t92\nchr1\t206361000\t206361300\t0.0783\t69\nchr1\t206364900\t206365200\t0.203\t62\nchr1\t206366700\t206367000\t0.1319\t99\nchr1\t206368200\t206368500\t0.0188\t64\nchr1\t206372100\t206373600\t0.0019\t73\nchr1\t206374800\t206375100\t0.0019\t73\nchr1\t206377500\t206378100\t0.0199\t54\nchr1\t206379300\t206382000\t0\t81\nchr1\t206387400\t206388900\t0.0047\t85\nchr1\t206391300\t206393400\t0.1159\t69\nchr1\t206400300\t206400900\t0.0119\t59\nchr1\t206402700\t206403000\t0.1806\t71\nchr1\t206405100\t206409300\t0\t83\nchr1\t207526800\t207544200\t0\t69\nchr1\t207545700\t207563700\t0\t69\nchr1\t207568500\t207572100\t0\t58\nchr1\t207721800\t207722400\t0.0686\t81\nchr1\t207732900\t207733500\t0.0835\t77\nchr1\t207735600\t207735900\t0.0169\t113\nchr1\t209913900\t209919600\t0\t82\nchr1\t210443700\t210444300\t0\t69\nchr1\t212849700\t212850900\t0.0009\t84\nchr1\t213806700\t213807000\t0.2221\t110\nchr1\t214868700\t214870500\t0.0419\t51\nchr1\t215209500\t215209800\t0.0394\t45\nchr1\t217691400\t217695600\t0\t83\nchr1\t218009400\t218014800\t0\t76\nchr1\t218072400\t218073000\t0.0039\t75\nchr1\t219455700\t219456600\t0.0698\t109\nchr1\t219610200\t219611100\t0.1811\t68\nchr1\t219866400\t219867000\t0.016\t40\nchr1\t220246500\t220246800\t0.034\t59\nchr1\t220995900\t220996800\t0\t136\nchr1\t222481200\t222481800\t0.0281\t40\nchr1\t222489000\t222489300\t0.0386\t80\nchr1\t222668400\t222668700\t0.0095\t26\nchr1\t223317900\t223319400\t0.0166\t101\nchr1\t223397100\t223397400\t0.0647\t62\nchr1\t223398600\t223399500\t0.1019\t72\nchr1\t223451100\t223451700\t0.0266\t79\nchr1\t223635600\t223636800\t0\t122\nchr1\t223890000\t223890300\t0.0632\t68\nchr1\t223927800\t223929300\t0.0213\t66\nchr1\t223930800\t223931100\t0.0213\t66\nchr1\t223932600\t223934700\t0\t68\nchr1\t223941300\t223941600\t0.0039\t36\nchr1\t223950900\t223951200\t0.1232\t36\nchr1\t223981200\t223981500\t0.0585\t53\nchr1\t223988100\t223988400\t0.0625\t68\nchr1\t224011800\t224012100\t0.2964\t325\nchr1\t224015100\t224016600\t0.2077\t439\nchr1\t224034000\t224034300\t0.1403\t64\nchr1\t224059500\t224059800\t0\t30\nchr1\t224340000\t224340300\t0.0779\t41\nchr1\t224799600\t224800200\t0.076\t141\nchr1\t226071600\t226071900\t0.1224\t46\nchr1\t226114500\t226114800\t0.0645\t36\nchr1\t226797900\t226798200\t0.0165\t27\nchr1\t227493300\t227496000\t0.01\t75\nchr1\t227497800\t227499000\t0.0059\t72\nchr1\t227502300\t227504100\t0\t71\nchr1\t227505300\t227508000\t0\t71\nchr1\t227981400\t227981700\t0.1635\t56\nchr1\t227985300\t227985600\t0.0849\t52\nchr1\t228556500\t228558300\t0\t325\nchr1\t228608400\t228646800\t0\t773\nchr1\t231047400\t231047700\t0.2172\t36\nchr1\t231780600\t231780900\t0.0081\t36\nchr1\t232823700\t232824000\t0.065\t83\nchr1\t234788100\t234789300\t0.065\t70\nchr1\t234797100\t234798300\t0.0313\t116\nchr1\t234804000\t234804300\t0.1416\t99\nchr1\t234812400\t234812700\t0.1051\t105\nchr1\t234814500\t234814800\t0.0623\t123\nchr1\t234818400\t234818700\t0.152\t74\nchr1\t235384200\t235384500\t0.2121\t59\nchr1\t236035200\t236035500\t0.0302\t105\nchr1\t236097000\t236097300\t0.2783\t390\nchr1\t236386500\t236388000\t0\t59\nchr1\t236713500\t236715000\t0\t414\nchr1\t236756400\t236756700\t0.1186\t14\nchr1\t237019800\t237025200\t0\t110\nchr1\t237075600\t237081300\t0.0036\t103\nchr1\t238689300\t238689900\t0.0431\t109\nchr1\t239623800\t239626800\t0\t103\nchr1\t239628900\t239629200\t0\t103\nchr1\t239732400\t239732700\t0.0195\t57\nchr1\t242045700\t242051100\t0\t82\nchr1\t243030600\t243031200\t0.0389\t74\nchr1\t243040500\t243040800\t0.0656\t63\nchr1\t243045900\t243046500\t0.0178\t50\nchr1\t243081600\t243081900\t0.0109\t79\nchr1\t245103300\t245103600\t0.1551\t58\nchr1\t245280900\t245281200\t0.0573\t90\nchr1\t245819400\t245820000\t0.0105\t118\nchr1\t245975400\t245976600\t0\t18\nchr1\t245991900\t245992200\t0.0023\t22\nchr1\t246388200\t246389400\t0\t83\nchr1\t246484800\t246485100\t0.2527\t74\nchr1\t246620100\t246620400\t0.1052\t15\nchr1\t246818100\t246819300\t0\t30\nchr1\t246864600\t246864900\t0.1618\t14\nchr1\t247116000\t247118700\t0\t47\nchr1\t247126200\t247127400\t0\t57\nchr1\t247129200\t247129800\t0.0482\t71\nchr1\t247170900\t247172100\t0\t55\nchr1\t247219200\t247219500\t0.069\t67\nchr1\t247354800\t247355100\t0.0551\t45\nchr1\t247687500\t247693200\t0\t97\nchr1\t247809600\t247809900\t0.0101\t46\nchr1\t247870500\t247870800\t0.2659\t175\nchr1\t247888500\t247891200\t0\t100\nchr1\t247892400\t247893900\t0\t100\nchr1\t248167200\t248168400\t0.0061\t105\nchr1\t248169600\t248170800\t0.0061\t105\nchr1\t248187900\t248188800\t0\t64\nchr1\t248221200\t248221800\t0.0667\t81\nchr1\t248408100\t248409000\t0.0298\t129\nchr1\t248448300\t248448900\t0\t72\nchr1\t248451000\t248452500\t0\t72\nchr1\t248454000\t248457000\t0\t65\nchr1\t248474700\t248476500\t0\t74\nchr1\t248479800\t248480100\t0.1043\t67\nchr1\t248483700\t248484600\t0\t67\nchr1\t248486100\t248493900\t0\t88\nchr1\t248495700\t248498400\t0\t66\nchr1\t248499600\t248500500\t0\t65\nchr1\t248502000\t248519100\t0\t65\nchr1\t248529000\t248543400\t0\t65\nchr1\t248544900\t248546100\t0\t47\nchr1\t248547600\t248548200\t0.0118\t60\nchr1\t248549400\t248551500\t0\t68\nchr1\t248554200\t248554500\t0\t72\nchr1\t248555700\t248556000\t0\t72\nchr1\t248557200\t248561700\t0\t72\nchr1\t248563800\t248564400\t0\t77\nchr1\t248568000\t248568300\t0.0747\t73\nchr1\t248571600\t248573700\t0\t69\nchr1\t248636400\t248637900\t0.0007\t68\nchr1\t248639700\t248641500\t0\t68\nchr1\t248643300\t248643900\t0\t68\nchr1\t248654100\t248655000\t0\t55\nchr1\t248676600\t248676900\t0.0569\t12\nchr1\t248747100\t248748000\t0.0083\t29\nchr1\t248931300\t248931600\t0.1102\t88\nchr1\t248932800\t248933100\t0.0485\t68\nchr1\t248937900\t248938200\t0.0069\t103\nchr1\t248939700\t248943000\t0.0069\t103\nchr1\t248944500\t248944800\t0.0069\t103\nchr1\t248946300\t248946600\t0.0337\t14\nchr10\t9900\t35400\t0\t302\nchr10\t36600\t39000\t0\t302\nchr10\t40200\t47100\t0\t302\nchr10\t321600\t323100\t0.0504\t107\nchr10\t345600\t346200\t0.2067\t46\nchr10\t465000\t465300\t0.1919\t59\nchr10\t717900\t718200\t0.0922\t41\nchr10\t735900\t736200\t0.2104\t37\nchr10\t757200\t757500\t0.0324\t40\nchr10\t777600\t777900\t0.1577\t41\nchr10\t783900\t784200\t0.0562\t47\nchr10\t952500\t953400\t0.0013\t77\nchr10\t1046700\t1047600\t0\t22\nchr10\t1235400\t1240200\t0.0942\t172\nchr10\t1260900\t1261200\t0.2213\t60\nchr10\t1460100\t1460400\t0.2983\t44\nchr10\t1592400\t1593000\t0.2122\t120\nchr10\t2522700\t2523000\t0.286\t31\nchr10\t4815600\t4815900\t0.0423\t12\nchr10\t4975800\t4976100\t0.0906\t56\nchr10\t4991700\t4992000\t0.0362\t58\nchr10\t5245500\t5251200\t0\t90\nchr10\t6369600\t6375600\t0\t69\nchr10\t7059000\t7060200\t0.0358\t69\nchr10\t7061700\t7062600\t0.0385\t84\nchr10\t7138500\t7138800\t0.0586\t79\nchr10\t7140300\t7141800\t0.0586\t79\nchr10\t8984400\t8984700\t0.0844\t105\nchr10\t10692600\t10692900\t0.0684\t95\nchr10\t11731800\t11736900\t0\t107\nchr10\t12519600\t12520800\t0.0017\t29\nchr10\t12775200\t12776100\t0\t253\nchr10\t13155300\t13155600\t0.1149\t70\nchr10\t13217700\t13218600\t0\t62\nchr10\t15915900\t15919200\t0\t75\nchr10\t15920400\t15921000\t0\t75\nchr10\t17631000\t17631300\t0.0536\t47\nchr10\t18031500\t18032400\t0.0421\t76\nchr10\t19088700\t19093800\t0\t101\nchr10\t19160400\t19160700\t0.0143\t67\nchr10\t19238100\t19238400\t0\t52\nchr10\t19285800\t19286100\t0.1409\t64\nchr10\t19582500\t19583100\t0.0125\t39\nchr10\t20538600\t20539800\t0.1201\t63\nchr10\t20752800\t20754300\t0\t89\nchr10\t20756100\t20757000\t0\t89\nchr10\t21322800\t21323100\t0.0582\t87\nchr10\t21430500\t21431100\t0.0126\t73\nchr10\t22124400\t22127100\t0.0533\t74\nchr10\t22404000\t22404600\t0.0084\t80\nchr10\t23154000\t23154600\t0.0388\t98\nchr10\t24656700\t24657900\t0.22\t59\nchr10\t25516500\t25516800\t0.1065\t77\nchr10\t25518600\t25520400\t0.0086\t81\nchr10\t26893500\t26894100\t0.108\t98\nchr10\t27281700\t27282000\t0.2201\t47\nchr10\t29423400\t29423700\t0\t28\nchr10\t29697300\t29697600\t0.1826\t44\nchr10\t30945600\t30945900\t0.089\t79\nchr10\t30952500\t30953100\t0.0273\t86\nchr10\t31445700\t31446000\t0.1115\t61\nchr10\t31448100\t31448400\t0.0917\t82\nchr10\t31969200\t31971600\t0\t184\nchr10\t32416800\t32417100\t0.2795\t16\nchr10\t33510900\t33516300\t0\t74\nchr10\t37066200\t37066500\t0.1362\t70\nchr10\t37103700\t37104300\t0.0031\t48\nchr10\t37111800\t37112400\t0.0005\t61\nchr10\t37163100\t37163700\t0.0044\t62\nchr10\t37167900\t37177200\t0\t79\nchr10\t37179600\t37182600\t0\t68\nchr10\t37184400\t37189200\t0\t78\nchr10\t38263500\t38265000\t0.0095\t74\nchr10\t38418600\t38418900\t0.0213\t63\nchr10\t38424600\t38424900\t0.1032\t44\nchr10\t38464500\t38465100\t0.0115\t61\nchr10\t38469900\t38470200\t0.2354\t46\nchr10\t38485500\t38485800\t0.2089\t557\nchr10\t38487300\t38487600\t0.241\t381\nchr10\t38489100\t38490600\t0.1539\t3073\nchr10\t38494800\t38495100\t0.2795\t223\nchr10\t38496600\t38496900\t0.2124\t437\nchr10\t38501400\t38501700\t0.2659\t829\nchr10\t38510100\t38510400\t0.2608\t375\nchr10\t38513400\t38513700\t0.2334\t291\nchr10\t38515200\t38515500\t0.2561\t320\nchr10\t38517300\t38517600\t0.2203\t432\nchr10\t38524200\t38524500\t0.2788\t291\nchr10\t38525700\t38526000\t0.2237\t424\nchr10\t38573100\t38573700\t0.1381\t2536\nchr10\t38577600\t38579700\t0.1536\t2263\nchr10\t38786100\t38787600\t0.2239\t322\nchr10\t38791800\t38792100\t0.1933\t317\nchr10\t38794800\t38795100\t0.2562\t285\nchr10\t38817900\t38818200\t0.2173\t323\nchr10\t38826300\t38826600\t0.277\t242\nchr10\t38836800\t38862300\t0\t206\nchr10\t38864100\t38864400\t0.1683\t134\nchr10\t38867100\t38867400\t0.1683\t134\nchr10\t38872500\t38873400\t0.0112\t175\nchr10\t38876400\t38876700\t0\t131\nchr10\t38877900\t38878200\t0\t131\nchr10\t38879400\t38879700\t0\t131\nchr10\t38880900\t38882400\t0.0935\t132\nchr10\t38884200\t38884500\t0.0935\t132\nchr10\t38886000\t38886300\t0.0935\t132\nchr10\t38888100\t38888400\t0.238\t94\nchr10\t38893800\t38894100\t0.1111\t78\nchr10\t38896200\t38901000\t0\t1407\nchr10\t38902500\t38905200\t0\t1407\nchr10\t38911500\t38911800\t0.0971\t150\nchr10\t38919600\t38920500\t0.2128\t2075\nchr10\t39466500\t39467700\t0.0265\t26\nchr10\t39469200\t39470100\t0.0005\t60\nchr10\t39508800\t39513900\t0\t79\nchr10\t39575700\t39576300\t0.1422\t83\nchr10\t39606300\t39607500\t0\t49\nchr10\t39609600\t39609900\t0.1253\t16\nchr10\t39619800\t39620100\t0\t58\nchr10\t39625500\t39625800\t0\t22\nchr10\t39636000\t39636300\t0.0225\t44\nchr10\t39701700\t39702000\t0\t16\nchr10\t39708300\t39708600\t0.0349\t11\nchr10\t39711300\t39712500\t0\t127\nchr10\t39717600\t39717900\t0\t14\nchr10\t39719100\t39720600\t0\t145\nchr10\t39721800\t39722400\t0\t16\nchr10\t39725700\t39728400\t0\t103\nchr10\t39735000\t39735300\t0\t19\nchr10\t39738600\t39738900\t0\t24\nchr10\t39744900\t39745800\t0\t79\nchr10\t39751800\t39752100\t0.0262\t25\nchr10\t39757500\t39758400\t0.0437\t78\nchr10\t39762600\t39763800\t0\t24\nchr10\t39771300\t39771900\t0\t60\nchr10\t39774300\t39777900\t0\t60\nchr10\t39779700\t39780000\t0\t18\nchr10\t39786300\t39786900\t0\t52\nchr10\t39795000\t39795300\t0\t25\nchr10\t39802500\t39802800\t0.1813\t11\nchr10\t39804000\t39805200\t0\t19\nchr10\t39809700\t39810000\t0.2306\t59\nchr10\t39812700\t39813300\t0\t44\nchr10\t39819900\t39820200\t0\t16\nchr10\t39825900\t39826200\t0.2293\t26\nchr10\t39828900\t39829200\t0\t11\nchr10\t39830700\t39831000\t0.1286\t15\nchr10\t39834300\t39836400\t0\t150\nchr10\t39837600\t39837900\t0\t34\nchr10\t39843900\t39844200\t0\t13\nchr10\t39849900\t39851400\t0\t10\nchr10\t39856200\t39856500\t0.0614\t76\nchr10\t39859800\t39860400\t0\t54\nchr10\t39861900\t39863400\t0\t19\nchr10\t39869700\t39870600\t0\t37\nchr10\t39871800\t39872100\t0\t31\nchr10\t39874200\t39874500\t0\t40\nchr10\t39876300\t39876900\t0\t40\nchr10\t39882600\t39882900\t0\t12\nchr10\t39884400\t39884700\t0\t17\nchr10\t39897300\t39898200\t0\t53\nchr10\t39900600\t39900900\t0\t14\nchr10\t39904200\t39906300\t0\t70\nchr10\t39912600\t39912900\t0\t28\nchr10\t39915900\t39916500\t0.0485\t69\nchr10\t39918000\t39918300\t0\t15\nchr10\t39921000\t39921300\t0\t27\nchr10\t39927000\t39927300\t0\t26\nchr10\t39928500\t39930300\t0\t36\nchr10\t39933900\t39934200\t0\t17\nchr10\t39936000\t39939000\t0\t840\nchr10\t39940800\t39941100\t0.1451\t60\nchr10\t39946200\t39946500\t0\t14\nchr10\t39953400\t39955200\t0\t263\nchr10\t39961200\t39969900\t0\t3165\nchr10\t39980100\t39980700\t0\t47\nchr10\t39983100\t39987600\t0\t1012\nchr10\t39989700\t39993900\t0\t465\nchr10\t39996900\t40002300\t0\t465\nchr10\t40004400\t40005900\t0\t294\nchr10\t40019400\t40020900\t0\t1990\nchr10\t40024500\t40025100\t0.0024\t289\nchr10\t40029300\t40029900\t0\t57\nchr10\t40046700\t40048200\t0\t280\nchr10\t40059600\t40061100\t0\t74\nchr10\t40065300\t40074000\t0\t887\nchr10\t40076100\t40087800\t0\t773\nchr10\t40090500\t40090800\t0\t27\nchr10\t40097700\t40102200\t0\t1747\nchr10\t40104600\t40105800\t0.0047\t137\nchr10\t40107300\t40107600\t0.2694\t146\nchr10\t40117800\t40118100\t0\t36\nchr10\t40127400\t40129800\t0\t2060\nchr10\t40134600\t40139100\t0\t1903\nchr10\t40141800\t40142400\t0\t203\nchr10\t40145100\t40145700\t0\t46\nchr10\t40147500\t40150200\t0\t267\nchr10\t40157400\t40159200\t0.0003\t846\nchr10\t40162800\t40163100\t0\t11\nchr10\t40167000\t40167600\t0\t82\nchr10\t40169700\t40170000\t0\t19\nchr10\t40183500\t40188000\t0\t311\nchr10\t40191900\t40193400\t0\t248\nchr10\t40200600\t40209000\t0\t2419\nchr10\t40213200\t40213800\t0.0559\t46\nchr10\t40216200\t40224300\t0\t377\nchr10\t40227600\t40228800\t0\t254\nchr10\t40232400\t40232700\t0.0308\t32\nchr10\t40241700\t40242000\t0.0163\t56\nchr10\t40246200\t40248900\t0\t329\nchr10\t40262400\t40263600\t0\t516\nchr10\t40265700\t40269000\t0\t1958\nchr10\t40270800\t40271100\t0\t12\nchr10\t40276800\t40280700\t0\t1970\nchr10\t40283100\t40291500\t0\t683\nchr10\t40294500\t40294800\t0.0148\t32\nchr10\t40301100\t40302900\t0\t73\nchr10\t40314600\t40316100\t0\t479\nchr10\t40318500\t40319100\t0\t55\nchr10\t40325400\t40326900\t0.0012\t142\nchr10\t40332900\t40334700\t0\t445\nchr10\t40335900\t40338600\t0\t445\nchr10\t40344600\t40347300\t0\t564\nchr10\t40364400\t40369200\t0\t1934\nchr10\t40370700\t40379400\t0\t552\nchr10\t40387500\t40401000\t0\t991\nchr10\t40407900\t40409700\t0.0092\t738\nchr10\t40412400\t40416000\t0\t2950\nchr10\t40420800\t40422600\t0.0088\t247\nchr10\t40425600\t40426200\t0\t186\nchr10\t40428300\t40428900\t0\t177\nchr10\t40435500\t40437600\t0\t319\nchr10\t40441200\t40442700\t0\t686\nchr10\t40445700\t40446000\t0.0311\t58\nchr10\t40448100\t40448400\t0\t30\nchr10\t40453200\t40456500\t0\t404\nchr10\t40461000\t40463400\t0\t904\nchr10\t40465200\t40467900\t0\t907\nchr10\t40476000\t40480500\t0\t710\nchr10\t40483200\t40487400\t0\t965\nchr10\t40488600\t40491600\t0\t201\nchr10\t40492800\t40494600\t0\t249\nchr10\t40495800\t40498200\t0\t255\nchr10\t40502400\t40518900\t0\t615\nchr10\t40524600\t40525200\t0\t239\nchr10\t40532100\t40532700\t0.001\t110\nchr10\t40537500\t40538700\t0\t125\nchr10\t40539900\t40547400\t0\t634\nchr10\t40550700\t40551000\t0.1311\t22\nchr10\t40555200\t40558500\t0\t3094\nchr10\t40567500\t40568100\t0.0021\t321\nchr10\t40574700\t40576500\t0\t226\nchr10\t40578300\t40580700\t0\t169\nchr10\t40582200\t40582800\t0\t120\nchr10\t40584000\t40584300\t0.1375\t50\nchr10\t40586400\t40587600\t0\t244\nchr10\t40588800\t40613100\t0\t3793\nchr10\t40614900\t40615500\t0.0054\t246\nchr10\t40616700\t40620600\t0\t309\nchr10\t40626900\t40627200\t0.0556\t155\nchr10\t40633200\t40633800\t0\t316\nchr10\t40639800\t40641000\t0\t191\nchr10\t40642800\t40651200\t0\t674\nchr10\t40652400\t40653300\t0\t143\nchr10\t40658100\t40671600\t0\t400\nchr10\t40673100\t40674000\t0.0118\t431\nchr10\t40676100\t40676700\t0\t759\nchr10\t40677900\t40683900\t0\t759\nchr10\t40685400\t40686300\t0\t188\nchr10\t40687800\t40689300\t0\t222\nchr10\t40691100\t40691700\t0\t82\nchr10\t40704600\t40705500\t0.0041\t275\nchr10\t40709700\t40710000\t0.0914\t28\nchr10\t40711500\t40714200\t0\t422\nchr10\t40715400\t40717800\t0\t422\nchr10\t40720500\t40721400\t0\t215\nchr10\t40722900\t40723500\t0\t20\nchr10\t40726800\t40730100\t0\t738\nchr10\t40733400\t40737300\t0\t633\nchr10\t40739100\t40740900\t0\t158\nchr10\t40743300\t40743600\t0\t26\nchr10\t40744800\t40745700\t0\t157\nchr10\t40748700\t40749300\t0\t178\nchr10\t40751100\t40753500\t0\t412\nchr10\t40755900\t40758300\t0\t340\nchr10\t40759800\t40766400\t0\t483\nchr10\t40767900\t40771800\t0\t599\nchr10\t40773300\t40775400\t0\t229\nchr10\t40781400\t40785000\t0\t262\nchr10\t40786500\t40787400\t0.0001\t181\nchr10\t40790400\t40790700\t0\t112\nchr10\t40792200\t40794000\t0\t666\nchr10\t40795500\t40807800\t0\t513\nchr10\t40810800\t40812000\t0\t646\nchr10\t40814400\t40818600\t0\t373\nchr10\t40821600\t40823400\t0\t400\nchr10\t40827300\t40828800\t0\t752\nchr10\t40830000\t40839600\t0\t752\nchr10\t40841400\t40842300\t0\t752\nchr10\t40843800\t40855500\t0\t1015\nchr10\t40862100\t40864200\t0\t231\nchr10\t40866300\t40867500\t0\t102\nchr10\t40869900\t40871400\t0\t504\nchr10\t40873200\t40873500\t0\t34\nchr10\t40874700\t40876200\t0\t213\nchr10\t40878000\t40881000\t0\t525\nchr10\t40882500\t40883700\t0\t273\nchr10\t40886100\t40886400\t0\t10\nchr10\t40888500\t40889700\t0.008\t184\nchr10\t40891800\t40898700\t0\t1252\nchr10\t40900200\t40901100\t0\t116\nchr10\t40903200\t40907100\t0\t359\nchr10\t40908300\t40908900\t0.1968\t182\nchr10\t40911600\t40912800\t0\t261\nchr10\t40917900\t40920900\t0\t308\nchr10\t40923900\t40927200\t0\t1318\nchr10\t40928700\t40929000\t0\t1318\nchr10\t40931400\t40936500\t0\t803\nchr10\t40937700\t40943400\t0\t803\nchr10\t40944900\t40949100\t0\t241\nchr10\t40954200\t40958400\t0\t267\nchr10\t40960800\t40969200\t0\t548\nchr10\t40970400\t40972200\t0\t624\nchr10\t40973400\t40984500\t0\t2674\nchr10\t40986000\t40989300\t0\t571\nchr10\t40990800\t40992900\t0\t782\nchr10\t40994100\t40994700\t0\t135\nchr10\t40998600\t41001900\t0\t473\nchr10\t41004900\t41007000\t0\t244\nchr10\t41008200\t41009700\t0.001\t259\nchr10\t41010900\t41014200\t0\t379\nchr10\t41015400\t41018400\t0\t357\nchr10\t41019900\t41022000\t0\t357\nchr10\t41025300\t41026500\t0\t260\nchr10\t41027700\t41030400\t0\t260\nchr10\t41031600\t41033400\t0\t260\nchr10\t41035800\t41036400\t0\t822\nchr10\t41037600\t41037900\t0.0009\t606\nchr10\t41039100\t41039400\t0.0009\t606\nchr10\t41042100\t41048700\t0\t356\nchr10\t41049900\t41055600\t0\t356\nchr10\t41056800\t41057400\t0\t105\nchr10\t41060700\t41063100\t0\t160\nchr10\t41066400\t41079300\t0\t541\nchr10\t41080800\t41081100\t0.127\t80\nchr10\t41082300\t41084700\t0\t465\nchr10\t41088600\t41090700\t0\t1383\nchr10\t41096400\t41096700\t0\t130\nchr10\t41098500\t41099400\t0\t130\nchr10\t41100600\t41101800\t0\t143\nchr10\t41104500\t41106000\t0.0015\t530\nchr10\t41107500\t41107800\t0\t23\nchr10\t41109300\t41112900\t0\t337\nchr10\t41114700\t41115000\t0\t36\nchr10\t41117400\t41119500\t0\t474\nchr10\t41120700\t41121600\t0\t474\nchr10\t41124300\t41125800\t0\t765\nchr10\t41128200\t41134200\t0\t2057\nchr10\t41135700\t41138100\t0\t410\nchr10\t41139900\t41140500\t0\t410\nchr10\t41143800\t41145300\t0\t506\nchr10\t41148900\t41152800\t0\t248\nchr10\t41154000\t41158800\t0\t435\nchr10\t41160600\t41160900\t0\t29\nchr10\t41162400\t41164800\t0\t286\nchr10\t41166600\t41166900\t0\t180\nchr10\t41169600\t41171100\t0.0085\t151\nchr10\t41172300\t41175300\t0\t517\nchr10\t41176500\t41180700\t0\t500\nchr10\t41181900\t41183400\t0\t174\nchr10\t41186400\t41189100\t0\t569\nchr10\t41190600\t41198700\t0\t569\nchr10\t41199900\t41203500\t0\t263\nchr10\t41204700\t41207700\t0\t263\nchr10\t41209200\t41212500\t0\t268\nchr10\t41214900\t41216400\t0\t188\nchr10\t41217600\t41220000\t0\t188\nchr10\t41222100\t41224200\t0\t114\nchr10\t41225400\t41226300\t0\t66\nchr10\t41228700\t41229300\t0.0051\t68\nchr10\t41231400\t41232300\t0\t468\nchr10\t41235000\t41237700\t0\t437\nchr10\t41239200\t41240700\t0\t114\nchr10\t41243400\t41251200\t0\t437\nchr10\t41255400\t41258700\t0\t109\nchr10\t41260800\t41264400\t0\t396\nchr10\t41266800\t41268900\t0\t396\nchr10\t41270100\t41273400\t0\t194\nchr10\t41274900\t41277300\t0\t629\nchr10\t41279400\t41293500\t0\t629\nchr10\t41295600\t41296500\t0\t500\nchr10\t41299500\t41301300\t0\t213\nchr10\t41302800\t41306100\t0\t456\nchr10\t41307600\t41309100\t0\t456\nchr10\t41310300\t41312700\t0\t456\nchr10\t41313900\t41314500\t0\t276\nchr10\t41315700\t41316600\t0\t53\nchr10\t41319900\t41323200\t0\t491\nchr10\t41326200\t41327700\t0\t265\nchr10\t41328900\t41336400\t0\t327\nchr10\t41338500\t41342700\t0\t197\nchr10\t41344500\t41356200\t0\t189\nchr10\t41358900\t41360100\t0\t117\nchr10\t41364300\t41368500\t0\t204\nchr10\t41370300\t41374500\t0\t341\nchr10\t41376000\t41376300\t0\t499\nchr10\t41377500\t41378700\t0\t499\nchr10\t41379900\t41384700\t0\t499\nchr10\t41387400\t41391000\t0\t207\nchr10\t41395200\t41395800\t0\t85\nchr10\t41397000\t41397900\t0\t85\nchr10\t41399400\t41404500\t0\t287\nchr10\t41405700\t41406900\t0\t2845\nchr10\t41408700\t41419800\t0\t2845\nchr10\t41422500\t41422800\t0\t539\nchr10\t41424300\t41430900\t0\t539\nchr10\t41432700\t41433000\t0\t539\nchr10\t41436300\t41441400\t0\t990\nchr10\t41442600\t41448300\t0\t990\nchr10\t41449500\t41450400\t0\t73\nchr10\t41454600\t41456700\t0\t310\nchr10\t41460600\t41461800\t0\t275\nchr10\t41466600\t41466900\t0\t89\nchr10\t41468700\t41469000\t0\t89\nchr10\t41470800\t41474400\t0\t285\nchr10\t41475900\t41478300\t0\t218\nchr10\t41481900\t41484000\t0\t495\nchr10\t41488800\t41490000\t0\t78\nchr10\t41493900\t41496000\t0\t567\nchr10\t41497800\t41508300\t0\t480\nchr10\t41510100\t41518500\t0\t480\nchr10\t41520000\t41524500\t0\t480\nchr10\t41525700\t41528700\t0\t407\nchr10\t41530500\t41533800\t0\t422\nchr10\t41535600\t41543700\t0\t402\nchr10\t41544900\t41546100\t0\t98\nchr10\t41548200\t41550000\t0.0249\t81\nchr10\t41551200\t41552400\t0.0463\t119\nchr10\t41556600\t41557800\t0.1901\t161\nchr10\t41564100\t41564400\t0.0067\t741\nchr10\t41565900\t41566200\t0.0067\t741\nchr10\t41573100\t41573400\t0.125\t70\nchr10\t41575200\t41576100\t0.0643\t324\nchr10\t41585400\t41585700\t0.1571\t238\nchr10\t41589000\t41589600\t0.1606\t245\nchr10\t41693700\t41706300\t0\t126\nchr10\t41713500\t41713800\t0.216\t97\nchr10\t41857200\t41857800\t0.1456\t3061\nchr10\t41859000\t41881200\t0.0388\t15646\nchr10\t41883000\t41883900\t0.2488\t17851\nchr10\t41885100\t41889600\t0.2151\t11089\nchr10\t41890800\t41904300\t0.1308\t10736\nchr10\t41905800\t41906700\t0.2274\t3527\nchr10\t41908500\t41911200\t0.1887\t3654\nchr10\t41915400\t41916300\t0.1021\t1068\nchr10\t42066000\t42066300\t0.0398\t1036\nchr10\t42069300\t42069600\t0.0862\t746\nchr10\t42071100\t42073200\t0.0028\t3747\nchr10\t42076500\t42077400\t0.0028\t3747\nchr10\t42082200\t42082800\t0.0194\t2415\nchr10\t42085200\t42085800\t0.1727\t540\nchr10\t42212400\t42212700\t0.0506\t54\nchr10\t42299100\t42299700\t0.1305\t710\nchr10\t42301500\t42301800\t0.2785\t329\nchr10\t42304200\t42304800\t0.0708\t1830\nchr10\t42309000\t42309300\t0.2675\t332\nchr10\t42312600\t42312900\t0.2649\t268\nchr10\t42315000\t42315300\t0.2574\t271\nchr10\t42318600\t42318900\t0.2499\t345\nchr10\t42436500\t42436800\t0.2156\t62\nchr10\t42995100\t42995400\t0.0872\t60\nchr10\t43422600\t43423200\t0.0068\t44\nchr10\t44222400\t44223300\t0\t58\nchr10\t45010200\t45011100\t0.0283\t67\nchr10\t45680100\t45680400\t0.0685\t44\nchr10\t45685500\t45685800\t0.0787\t70\nchr10\t45689400\t45690600\t0.0541\t82\nchr10\t45692700\t45693300\t0.0174\t55\nchr10\t45698400\t45699000\t0.0073\t65\nchr10\t45703500\t45703800\t0.1367\t70\nchr10\t45737100\t45737400\t0.0786\t69\nchr10\t45740100\t45740400\t0.2701\t69\nchr10\t45747900\t45748200\t0.1064\t41\nchr10\t45752700\t45753000\t0.1883\t64\nchr10\t45760200\t45760800\t0.0297\t59\nchr10\t45767700\t45768000\t0.0579\t61\nchr10\t45773100\t45775200\t0\t74\nchr10\t45777600\t45778500\t0\t74\nchr10\t45781800\t45782100\t0.0717\t51\nchr10\t45827700\t45829200\t0.0441\t62\nchr10\t45833100\t45834000\t0.1129\t85\nchr10\t45835500\t45835800\t0.0591\t89\nchr10\t45840600\t45840900\t0.0303\t77\nchr10\t45845700\t45846000\t0.1667\t51\nchr10\t45886200\t45886500\t0.0823\t67\nchr10\t45888600\t45888900\t0.2514\t48\nchr10\t45894300\t45894600\t0.1445\t57\nchr10\t45902400\t45904200\t0\t68\nchr10\t45906000\t45906600\t0\t66\nchr10\t45908400\t45908700\t0.0764\t72\nchr10\t45961500\t45961800\t0.0997\t55\nchr10\t46108500\t46110000\t0.0624\t71\nchr10\t46111800\t46112100\t0.0834\t44\nchr10\t46114500\t46115100\t0.0286\t72\nchr10\t46116300\t46116600\t0.1355\t82\nchr10\t46117800\t46118100\t0.1856\t25\nchr10\t46121400\t46122300\t0\t62\nchr10\t46123500\t46124400\t0\t62\nchr10\t46129800\t46130100\t0.0475\t70\nchr10\t46135200\t46137000\t0.0398\t76\nchr10\t46139400\t46143600\t0\t98\nchr10\t46144800\t46145700\t0\t98\nchr10\t46146900\t46147200\t0.0516\t56\nchr10\t46149900\t46150200\t0.0516\t56\nchr10\t46151700\t46153200\t0.0024\t64\nchr10\t46158600\t46159500\t0.0528\t69\nchr10\t46205700\t46215300\t0\t72\nchr10\t46333500\t46334100\t0.0563\t66\nchr10\t46344300\t46345800\t0.1533\t56\nchr10\t46348800\t46350300\t0\t76\nchr10\t46351800\t46352400\t0\t76\nchr10\t46362000\t46362300\t0.0265\t66\nchr10\t46369500\t46370100\t0.0126\t81\nchr10\t46377000\t46389300\t0\t100\nchr10\t46400400\t46401000\t0.0137\t59\nchr10\t46402800\t46403400\t0.0969\t51\nchr10\t46405800\t46406100\t0.0236\t48\nchr10\t46411800\t46413000\t0.0321\t67\nchr10\t46416900\t46417200\t0.0398\t52\nchr10\t46418700\t46421700\t0\t80\nchr10\t46423500\t46423800\t0\t80\nchr10\t46428300\t46428600\t0.127\t53\nchr10\t46434300\t46434600\t0.2225\t38\nchr10\t46436100\t46437600\t0.0192\t53\nchr10\t46446300\t46446600\t0.0089\t64\nchr10\t46447800\t46450800\t0\t77\nchr10\t46452600\t46458000\t0\t75\nchr10\t46459500\t46461900\t0\t84\nchr10\t46463400\t46467300\t0\t84\nchr10\t46468500\t46472700\t0\t84\nchr10\t46474200\t46474500\t0\t79\nchr10\t46475700\t46476600\t0\t79\nchr10\t46477800\t46482300\t0\t79\nchr10\t46485900\t46487700\t0\t71\nchr10\t46488900\t46489200\t0\t71\nchr10\t46491300\t46514100\t0\t84\nchr10\t46562100\t46562700\t0.0403\t73\nchr10\t46566000\t46568400\t0.0801\t75\nchr10\t46570500\t46572300\t0.0045\t70\nchr10\t46574400\t46575600\t0.0102\t75\nchr10\t46577100\t46577400\t0.1294\t74\nchr10\t46579200\t46580100\t0\t73\nchr10\t46581300\t46583700\t0\t73\nchr10\t46584900\t46593000\t0\t73\nchr10\t46594200\t46595100\t0\t73\nchr10\t46599000\t46600500\t0\t75\nchr10\t46603200\t46605900\t0\t75\nchr10\t46607700\t46608300\t0\t75\nchr10\t46609500\t46616700\t0\t75\nchr10\t46618200\t46618500\t0\t75\nchr10\t46620900\t46629900\t0\t68\nchr10\t46631700\t46632000\t0\t68\nchr10\t46633200\t46633500\t0\t68\nchr10\t46635000\t46636500\t0.019\t59\nchr10\t46643100\t46644000\t0.02\t68\nchr10\t46649100\t46649700\t0.0014\t56\nchr10\t46659600\t46659900\t0.0876\t52\nchr10\t46662600\t46664700\t0\t67\nchr10\t46677300\t46679400\t0.0599\t63\nchr10\t46685100\t46685700\t0\t62\nchr10\t46691400\t46692000\t0\t43\nchr10\t46696200\t46707000\t0\t66\nchr10\t46710300\t46711500\t0\t50\nchr10\t46715700\t46716000\t0.1993\t54\nchr10\t46728900\t46733700\t0.0038\t65\nchr10\t46734900\t46739400\t0\t66\nchr10\t46741800\t46742100\t0.0525\t55\nchr10\t46748400\t46748700\t0.0795\t77\nchr10\t46754400\t46757400\t0\t74\nchr10\t46761600\t46761900\t0.0623\t47\nchr10\t46764300\t46764600\t0.0332\t79\nchr10\t46776900\t46777500\t0.1498\t72\nchr10\t46792500\t46792800\t0.1416\t56\nchr10\t46821300\t46821900\t0.0053\t62\nchr10\t46827900\t46828500\t0.0012\t76\nchr10\t46830600\t46830900\t0.1294\t45\nchr10\t46832100\t46833000\t0.0579\t62\nchr10\t46842000\t46842300\t0.0393\t85\nchr10\t46845600\t46845900\t0.0007\t88\nchr10\t46847400\t46847700\t0.0007\t88\nchr10\t46849800\t46850100\t0.0007\t88\nchr10\t46851600\t46851900\t0\t76\nchr10\t46853400\t46853700\t0.0013\t82\nchr10\t46854900\t46858800\t0.0013\t82\nchr10\t46864500\t46865700\t0.0408\t70\nchr10\t46884300\t46884600\t0.0026\t67\nchr10\t46886700\t46887000\t0.0524\t66\nchr10\t46895400\t46895700\t0.1415\t65\nchr10\t46899600\t46900500\t0\t51\nchr10\t46901700\t46905600\t0\t61\nchr10\t46907400\t46910400\t0\t83\nchr10\t46911600\t46918500\t0\t83\nchr10\t46919700\t46920300\t0\t83\nchr10\t46924200\t46924500\t0.0282\t68\nchr10\t46928700\t46929300\t0.0428\t67\nchr10\t46932900\t46933200\t0.0478\t65\nchr10\t46938300\t46938900\t0.0021\t68\nchr10\t46941900\t46944600\t0\t68\nchr10\t46945800\t46946400\t0.0177\t60\nchr10\t46949700\t46950000\t0.0119\t48\nchr10\t46951800\t46952100\t0.0652\t58\nchr10\t46955700\t46958700\t0\t58\nchr10\t46959900\t46966800\t0\t73\nchr10\t46968900\t46976400\t0\t73\nchr10\t46977600\t46978500\t0\t82\nchr10\t46980300\t46982100\t0.0085\t82\nchr10\t46984500\t46987800\t0\t73\nchr10\t46989000\t46991700\t0\t62\nchr10\t47461800\t47463000\t0.0635\t75\nchr10\t47470500\t47476200\t0\t80\nchr10\t47477400\t47481300\t0\t80\nchr10\t47490600\t47491500\t0\t80\nchr10\t47493900\t47494200\t0.053\t79\nchr10\t47499600\t47499900\t0.152\t99\nchr10\t47505000\t47505300\t0.1\t73\nchr10\t47508300\t47509500\t0.1562\t71\nchr10\t47511600\t47512800\t0.0224\t66\nchr10\t47514600\t47518200\t0\t67\nchr10\t47519700\t47520300\t0\t69\nchr10\t47522700\t47523000\t0.021\t71\nchr10\t47524500\t47525100\t0\t80\nchr10\t47526900\t47527200\t0.0407\t66\nchr10\t47530800\t47534100\t0\t76\nchr10\t47535600\t47536500\t0\t76\nchr10\t47537700\t47539200\t0\t76\nchr10\t47542200\t47546100\t0\t76\nchr10\t47562300\t47564400\t0.079\t67\nchr10\t47567100\t47570100\t0.0268\t45\nchr10\t47574600\t47576400\t0\t65\nchr10\t47577600\t47579700\t0.004\t59\nchr10\t47582700\t47584800\t0\t69\nchr10\t47591700\t47592000\t0.1187\t45\nchr10\t47596200\t47596500\t0.2591\t47\nchr10\t47597700\t47598600\t0.0711\t49\nchr10\t47601000\t47603100\t0\t65\nchr10\t47605200\t47605500\t0.0156\t44\nchr10\t47607600\t47611200\t0\t67\nchr10\t47613300\t47615100\t0\t64\nchr10\t47616300\t47616900\t0\t64\nchr10\t47618100\t47618400\t0\t28\nchr10\t47619600\t47621400\t0\t28\nchr10\t47623500\t47625300\t0\t47\nchr10\t47628900\t47630100\t0\t56\nchr10\t47633400\t47636100\t0\t74\nchr10\t47638200\t47638800\t0.0035\t72\nchr10\t47640300\t47644200\t0\t72\nchr10\t47648700\t47649000\t0.0095\t67\nchr10\t47654700\t47655300\t0.0026\t65\nchr10\t47656500\t47656800\t0.1503\t49\nchr10\t47661000\t47661600\t0.0922\t55\nchr10\t47662800\t47663100\t0.0922\t55\nchr10\t47677500\t47678400\t0\t69\nchr10\t47691900\t47692500\t0\t56\nchr10\t47697600\t47697900\t0.0789\t64\nchr10\t47706300\t47706600\t0.0532\t63\nchr10\t47709600\t47709900\t0.1272\t69\nchr10\t47711700\t47715300\t0\t63\nchr10\t47716800\t47719800\t0\t68\nchr10\t47723100\t47723400\t0.0296\t57\nchr10\t47725200\t47726400\t0.0069\t62\nchr10\t47727600\t47728500\t0\t69\nchr10\t47730000\t47730300\t0.0158\t80\nchr10\t47731500\t47732400\t0\t65\nchr10\t47736000\t47736300\t0.0385\t65\nchr10\t47739300\t47739600\t0.0227\t57\nchr10\t47741100\t47742300\t0.0227\t57\nchr10\t47746200\t47747100\t0.0544\t76\nchr10\t47748900\t47749200\t0.0238\t61\nchr10\t47750400\t47754900\t0\t70\nchr10\t47756100\t47760300\t0\t76\nchr10\t47764500\t47764800\t0.0697\t75\nchr10\t47766300\t47766600\t0.0011\t63\nchr10\t47770200\t47771400\t0.0231\t74\nchr10\t47772900\t47775000\t0.0015\t65\nchr10\t47779200\t47780400\t0\t72\nchr10\t47870400\t47894100\t0\t81\nchr10\t47897100\t47898600\t0\t72\nchr10\t47902500\t47904900\t0\t79\nchr10\t47906100\t47906700\t0\t79\nchr10\t47907900\t47908800\t0\t79\nchr10\t47910000\t47920200\t0\t79\nchr10\t47922000\t47924400\t0\t79\nchr10\t47926200\t47929500\t0\t79\nchr10\t47931600\t47936700\t0\t75\nchr10\t47937900\t47938500\t0.0375\t54\nchr10\t47945700\t47946000\t0.0863\t64\nchr10\t47948100\t47948400\t0.1963\t68\nchr10\t47955900\t47956500\t0.1099\t52\nchr10\t47961600\t47966100\t0\t72\nchr10\t47967600\t47967900\t0.0629\t65\nchr10\t47971500\t47972700\t0.0257\t68\nchr10\t47978400\t47978700\t0.0155\t51\nchr10\t47981400\t47981700\t0.0235\t48\nchr10\t47983500\t47984100\t0\t58\nchr10\t47987100\t47991300\t0\t70\nchr10\t47996400\t47996700\t0.1188\t59\nchr10\t47999100\t48000300\t0.0029\t61\nchr10\t48002100\t48002400\t0.1506\t63\nchr10\t48006600\t48006900\t0.0019\t53\nchr10\t48008700\t48009000\t0.0734\t64\nchr10\t48013200\t48013500\t0.054\t68\nchr10\t48016200\t48017700\t0.054\t68\nchr10\t48020100\t48021000\t0\t72\nchr10\t48022500\t48026400\t0\t64\nchr10\t48027600\t48029100\t0\t54\nchr10\t48030900\t48031200\t0\t89\nchr10\t48032400\t48033300\t0\t89\nchr10\t48035100\t48035400\t0.0027\t71\nchr10\t48036600\t48037200\t0.0027\t71\nchr10\t48039000\t48042300\t0\t77\nchr10\t48043800\t48048900\t0\t77\nchr10\t48050400\t48054000\t0\t77\nchr10\t48056100\t48056400\t0\t77\nchr10\t48058500\t48058800\t0\t54\nchr10\t48060900\t48067200\t0\t68\nchr10\t48069900\t48072000\t0\t78\nchr10\t48073500\t48074400\t0\t81\nchr10\t48076500\t48082800\t0\t81\nchr10\t48084900\t48096300\t0\t81\nchr10\t48099600\t48100200\t0.0899\t46\nchr10\t48101700\t48102000\t0.0088\t62\nchr10\t48105300\t48105900\t0\t60\nchr10\t48107100\t48110700\t0\t60\nchr10\t48113100\t48113700\t0\t56\nchr10\t48114900\t48117300\t0.0701\t58\nchr10\t48118500\t48119100\t0.0701\t58\nchr10\t48120600\t48120900\t0.0602\t59\nchr10\t48122400\t48123000\t0.0044\t59\nchr10\t48124500\t48124800\t0.0311\t55\nchr10\t48127200\t48127500\t0.0689\t57\nchr10\t48130500\t48132300\t0\t83\nchr10\t48133500\t48144600\t0\t83\nchr10\t48148200\t48150000\t0.0049\t64\nchr10\t48151500\t48152100\t0.0058\t43\nchr10\t48167100\t48167400\t0.0128\t81\nchr10\t48179100\t48179400\t0.191\t65\nchr10\t49855200\t49855500\t0.0404\t61\nchr10\t49857900\t49858200\t0.0456\t57\nchr10\t49863300\t49863600\t0.0504\t46\nchr10\t49870800\t49873200\t0\t70\nchr10\t49875000\t49875600\t0.0026\t71\nchr10\t50000100\t50001000\t0\t101\nchr10\t50002500\t50003400\t0\t101\nchr10\t50080500\t50080800\t0.1558\t46\nchr10\t50085300\t50085600\t0.1311\t48\nchr10\t50093400\t50093700\t0.1842\t84\nchr10\t50096100\t50096400\t0.0409\t73\nchr10\t50106900\t50108700\t0\t65\nchr10\t50113800\t50115300\t0.0106\t70\nchr10\t50117100\t50119200\t0\t70\nchr10\t50122500\t50122800\t0.0541\t57\nchr10\t50160900\t50161200\t0.1113\t46\nchr10\t50164200\t50164800\t0.0345\t35\nchr10\t50172300\t50172600\t0.0083\t14\nchr10\t50181900\t50184000\t0.0045\t54\nchr10\t50187300\t50188200\t0\t77\nchr10\t50189400\t50193000\t0\t77\nchr10\t50708700\t50710200\t0.0217\t55\nchr10\t50745000\t50745600\t0.0951\t58\nchr10\t50749200\t50755500\t0\t67\nchr10\t50758200\t50758500\t0.0236\t61\nchr10\t50759700\t50760000\t0.1771\t57\nchr10\t51512400\t51513900\t0.1026\t74\nchr10\t52181700\t52182300\t0.0267\t64\nchr10\t52235700\t52236900\t0.0148\t74\nchr10\t52238100\t52238400\t0.0148\t74\nchr10\t53497200\t53497500\t0.1425\t93\nchr10\t53762100\t53762400\t0.2137\t31\nchr10\t54622500\t54622800\t0.2745\t39\nchr10\t54735600\t54735900\t0.074\t26\nchr10\t55542600\t55542900\t0.2313\t45\nchr10\t55686300\t55688100\t0.1379\t65\nchr10\t58654500\t58655700\t0.0362\t58\nchr10\t60180300\t60180600\t0.0413\t1226\nchr10\t62677500\t62677800\t0.1159\t41\nchr10\t64371900\t64372200\t0.2402\t65\nchr10\t64925400\t64926600\t0.1022\t70\nchr10\t64929000\t64929300\t0.0592\t79\nchr10\t67233300\t67233600\t0.1944\t92\nchr10\t67561200\t67561500\t0.2682\t53\nchr10\t67582200\t67582500\t0.2308\t64\nchr10\t67692300\t67692600\t0.0638\t69\nchr10\t69992400\t69993900\t0.0011\t114\nchr10\t70686600\t70688100\t0.0127\t64\nchr10\t73680900\t73681200\t0.1582\t61\nchr10\t73683000\t73685400\t0\t72\nchr10\t75480000\t75480300\t0.2357\t52\nchr10\t76587000\t76591500\t0\t73\nchr10\t77041200\t77041500\t0.1875\t23\nchr10\t78089400\t78094200\t0\t85\nchr10\t79332600\t79332900\t0.0906\t81\nchr10\t79338300\t79338600\t0.1724\t69\nchr10\t79504200\t79504500\t0.2228\t49\nchr10\t79519500\t79519800\t0.0108\t63\nchr10\t79703100\t79703700\t0\t72\nchr10\t79706400\t79706700\t0.0575\t78\nchr10\t79707900\t79708500\t0.0262\t97\nchr10\t79710000\t79710300\t0.0813\t91\nchr10\t79713000\t79714500\t0\t100\nchr10\t79716900\t79717200\t0.0751\t69\nchr10\t79741800\t79742100\t0.0661\t63\nchr10\t79770300\t79771800\t0.0149\t77\nchr10\t79774800\t79775100\t0.0376\t59\nchr10\t79777800\t79778100\t0.1135\t54\nchr10\t79780200\t79780500\t0.09\t58\nchr10\t79794600\t79794900\t0.1117\t54\nchr10\t79797600\t79797900\t0.1138\t42\nchr10\t79814100\t79814400\t0.0701\t29\nchr10\t79841100\t79852800\t0\t102\nchr10\t79965900\t79966500\t0.0689\t105\nchr10\t80240400\t80240700\t0.014\t74\nchr10\t80255100\t80255400\t0.1454\t59\nchr10\t80722800\t80723400\t0.0092\t68\nchr10\t81711300\t81714900\t0.0058\t78\nchr10\t83781600\t83781900\t0.0662\t31\nchr10\t84071100\t84071400\t0.0542\t69\nchr10\t84282000\t84282300\t0.2335\t68\nchr10\t84283800\t84284400\t0.0289\t82\nchr10\t84774600\t84775200\t0.0719\t65\nchr10\t85355700\t85361400\t0\t83\nchr10\t85744500\t85745400\t0.0079\t77\nchr10\t87224700\t87228300\t0\t77\nchr10\t87229800\t87234300\t0\t77\nchr10\t87236100\t87236700\t0.0056\t63\nchr10\t87239100\t87239400\t0.0634\t58\nchr10\t87249900\t87250500\t0\t52\nchr10\t87255300\t87256800\t0.0095\t51\nchr10\t87262800\t87263100\t0\t66\nchr10\t87264300\t87265500\t0\t66\nchr10\t87270000\t87275100\t0\t69\nchr10\t87276300\t87276600\t0\t69\nchr10\t87277800\t87290700\t0\t81\nchr10\t87292200\t87298500\t0\t81\nchr10\t87301200\t87303900\t0.0278\t65\nchr10\t87305100\t87306300\t0.0165\t61\nchr10\t87316800\t87317100\t0.0401\t62\nchr10\t87357600\t87360600\t0\t77\nchr10\t87362100\t87364500\t0\t81\nchr10\t87368400\t87369000\t0.0093\t76\nchr10\t87431100\t87435300\t0\t73\nchr10\t87436500\t87436800\t0\t73\nchr10\t87439500\t87439800\t0.1751\t61\nchr10\t87441300\t87445800\t0\t67\nchr10\t87447900\t87448500\t0\t83\nchr10\t87449700\t87465300\t0\t83\nchr10\t87467400\t87467700\t0.0074\t61\nchr10\t87472500\t87475500\t0\t74\nchr10\t87481200\t87482700\t0.0033\t52\nchr10\t88977600\t88978200\t0.0107\t87\nchr10\t91440600\t91443300\t0\t71\nchr10\t91446300\t91449000\t0\t69\nchr10\t91752300\t91752600\t0.0854\t70\nchr10\t92140800\t92141100\t0.0016\t69\nchr10\t92375100\t92377800\t0\t108\nchr10\t92673900\t92674200\t0.0133\t64\nchr10\t94819200\t94819800\t0.1191\t80\nchr10\t94825500\t94825800\t0.1081\t66\nchr10\t95948400\t95949600\t0\t71\nchr10\t96940500\t96942000\t0.0897\t112\nchr10\t97275300\t97277400\t0\t67\nchr10\t98697900\t98698200\t0.1378\t98\nchr10\t98700900\t98701200\t0.0443\t17\nchr10\t98781900\t98788200\t0\t85\nchr10\t98961000\t98962200\t0.0242\t61\nchr10\t98988600\t98988900\t0.0926\t70\nchr10\t99155100\t99155400\t0.1318\t78\nchr10\t99156900\t99158400\t0.0367\t66\nchr10\t99771600\t99773400\t0\t84\nchr10\t99823800\t99824100\t0.1567\t95\nchr10\t99837300\t99840600\t0.0049\t79\nchr10\t100092300\t100094400\t0.0109\t57\nchr10\t100422600\t100422900\t0.0078\t59\nchr10\t100425900\t100426500\t0.1282\t59\nchr10\t103128600\t103128900\t0.0436\t64\nchr10\t104859900\t104860200\t0.015\t35\nchr10\t105377400\t105383100\t0\t76\nchr10\t105776100\t105780900\t0\t76\nchr10\t106845300\t106848600\t0.0057\t74\nchr10\t107466300\t107467200\t0.0714\t48\nchr10\t108114900\t108115200\t0.0128\t80\nchr10\t108117300\t108117600\t0.0224\t89\nchr10\t108119100\t108119700\t0.0703\t75\nchr10\t108310500\t108315000\t0\t73\nchr10\t108572700\t108573000\t0.0237\t89\nchr10\t109241700\t109242900\t0.0663\t75\nchr10\t109812300\t109818300\t0\t435\nchr10\t109830300\t109830900\t0.0733\t80\nchr10\t111584700\t111587100\t0\t63\nchr10\t111588900\t111589800\t0\t63\nchr10\t111797400\t111797700\t0.0628\t59\nchr10\t111814800\t111815400\t0.0526\t96\nchr10\t112066500\t112067400\t0.0027\t120\nchr10\t112204800\t112206600\t0.0037\t75\nchr10\t112398000\t112398300\t0.2865\t16\nchr10\t114935400\t114935700\t0.1033\t99\nchr10\t114998400\t114998700\t0.074\t20\nchr10\t115202700\t115203000\t0.1519\t75\nchr10\t115367100\t115367400\t0.1015\t48\nchr10\t117079500\t117081600\t0.0051\t75\nchr10\t117833700\t117834600\t0.0563\t100\nchr10\t117836700\t117838500\t0.0563\t100\nchr10\t117874800\t117875100\t0.1025\t19\nchr10\t120214800\t120215100\t0.2672\t44\nchr10\t120234900\t120235800\t0.0507\t75\nchr10\t120237300\t120237600\t0.0507\t75\nchr10\t120238800\t120239100\t0.0507\t75\nchr10\t120913800\t120914100\t0.1701\t71\nchr10\t120921000\t120921600\t0.0064\t76\nchr10\t122581800\t122584500\t0\t78\nchr10\t122594400\t122597100\t0\t74\nchr10\t122601000\t122616900\t0\t50\nchr10\t122681700\t122682000\t0.1662\t61\nchr10\t125616300\t125616900\t0.0698\t90\nchr10\t126056700\t126057000\t0.1579\t53\nchr10\t126417900\t126418200\t0.1469\t16\nchr10\t126672600\t126672900\t0.1737\t96\nchr10\t126681900\t126682200\t0.0498\t74\nchr10\t126885900\t126886200\t0.1854\t79\nchr10\t126947400\t126948300\t0.1753\t826\nchr10\t129735600\t129735900\t0.0759\t79\nchr10\t130051800\t130052100\t0.2618\t19\nchr10\t130316400\t130316700\t0.049\t82\nchr10\t130572300\t130572900\t0.2549\t98\nchr10\t130650900\t130651200\t0.061\t61\nchr10\t130759500\t130760100\t0\t25\nchr10\t131042100\t131042400\t0.1692\t15\nchr10\t131376900\t131377200\t0.0746\t54\nchr10\t131592600\t131601600\t0\t36\nchr10\t131625900\t131626200\t0.2329\t34\nchr10\t131705100\t131706000\t0.0515\t61\nchr10\t131939100\t131939400\t0.2061\t43\nchr10\t132158700\t132159000\t0.147\t78\nchr10\t132622500\t132622800\t0\t118\nchr10\t132914100\t132914400\t0.128\t20\nchr10\t133111500\t133111800\t0.2972\t90\nchr10\t133425900\t133427700\t0\t75\nchr10\t133433100\t133435500\t0\t72\nchr10\t133477800\t133480200\t0\t54\nchr10\t133503600\t133504800\t0.0796\t64\nchr10\t133569300\t133571100\t0\t77\nchr10\t133575000\t133575300\t0\t77\nchr10\t133576500\t133579500\t0\t77\nchr10\t133624800\t133626300\t0.0214\t76\nchr10\t133629900\t133630800\t0.0995\t56\nchr10\t133637400\t133637700\t0.1837\t73\nchr10\t133640700\t133641300\t0.0151\t46\nchr10\t133651800\t133652100\t0.158\t71\nchr10\t133655100\t133655400\t0.0849\t69\nchr10\t133656600\t133656900\t0.2031\t58\nchr10\t133664400\t133690500\t0\t15197\nchr10\t133740600\t133764000\t0\t3268\nchr10\t133766700\t133785300\t0\t145\nchr11\t60000\t102600\t0\t91\nchr11\t103800\t122700\t0\t91\nchr11\t124200\t125100\t0.0176\t57\nchr11\t126300\t130500\t0\t91\nchr11\t132900\t133200\t0\t91\nchr11\t135900\t137100\t0\t117\nchr11\t138600\t146400\t0\t84\nchr11\t149100\t159300\t0\t87\nchr11\t160800\t161400\t0\t87\nchr11\t162900\t174600\t0\t87\nchr11\t176400\t177300\t0\t66\nchr11\t178800\t179100\t0.0861\t40\nchr11\t180900\t185100\t0.0118\t58\nchr11\t188700\t189300\t0.0238\t88\nchr11\t191100\t191700\t0.0238\t88\nchr11\t193800\t194100\t0.1728\t59\nchr11\t195300\t195900\t0\t67\nchr11\t310800\t311400\t0.0133\t57\nchr11\t318300\t318600\t0.1034\t55\nchr11\t321600\t322500\t0.269\t76\nchr11\t374700\t375000\t0.2425\t46\nchr11\t384900\t385500\t0\t86\nchr11\t390600\t390900\t0.0787\t26\nchr11\t483000\t483300\t0.2595\t44\nchr11\t519300\t520200\t0\t174\nchr11\t585300\t585600\t0.0569\t988\nchr11\t664500\t665100\t0.0223\t94\nchr11\t735600\t735900\t0.1133\t26\nchr11\t964800\t965400\t0.0303\t307\nchr11\t980100\t980400\t0.0302\t83\nchr11\t1080600\t1081200\t0.1681\t36\nchr11\t1412100\t1412400\t0.0186\t10\nchr11\t1429800\t1433100\t0\t78\nchr11\t1663800\t1664100\t0.1095\t71\nchr11\t1666500\t1667100\t0\t50\nchr11\t1683600\t1683900\t0.1836\t56\nchr11\t1687500\t1687800\t0.0614\t59\nchr11\t1945500\t1950600\t0\t47\nchr11\t1952100\t1953000\t0\t37\nchr11\t1954800\t1959000\t0\t44\nchr11\t1960500\t1966500\t0\t44\nchr11\t1968900\t1978200\t0\t43\nchr11\t1980000\t2043000\t0\t51\nchr11\t3252600\t3256800\t0\t51\nchr11\t3258900\t3261300\t0\t44\nchr11\t3263100\t3264600\t0\t41\nchr11\t3265800\t3270600\t0\t41\nchr11\t3272100\t3276000\t0\t41\nchr11\t3277200\t3281100\t0\t41\nchr11\t3282300\t3282900\t0\t43\nchr11\t3284100\t3289500\t0\t43\nchr11\t3291000\t3293100\t0\t44\nchr11\t3294300\t3294600\t0\t25\nchr11\t3298200\t3303000\t0\t37\nchr11\t3304500\t3306600\t0\t32\nchr11\t3308700\t3323100\t0\t44\nchr11\t3324300\t3324600\t0\t44\nchr11\t3326100\t3327000\t0\t44\nchr11\t3328200\t3335400\t0\t44\nchr11\t3336900\t3337200\t0\t44\nchr11\t3653700\t3654900\t0.0399\t2367\nchr11\t4171800\t4172400\t0.07\t56\nchr11\t4173600\t4174800\t0.1246\t68\nchr11\t4230300\t4230600\t0.1257\t63\nchr11\t4245000\t4245900\t0\t63\nchr11\t4256400\t4256700\t0.0308\t60\nchr11\t4270200\t4274100\t0\t79\nchr11\t4278600\t4279500\t0\t80\nchr11\t4282500\t4284300\t0.0038\t60\nchr11\t4287900\t4288200\t0.0195\t87\nchr11\t4290300\t4298100\t0\t103\nchr11\t4303500\t4303800\t0.1486\t51\nchr11\t4320000\t4320300\t0.1191\t50\nchr11\t4326900\t4327500\t0.1304\t63\nchr11\t4335000\t4336200\t0\t75\nchr11\t4341300\t4342800\t0\t89\nchr11\t4354800\t4355100\t0.0906\t57\nchr11\t4620300\t4620600\t0.0321\t22\nchr11\t5249400\t5250000\t0.0181\t61\nchr11\t5481000\t5482500\t0.0179\t70\nchr11\t6186000\t6187800\t0.1553\t69\nchr11\t7233600\t7233900\t0.142\t62\nchr11\t7325400\t7327800\t0\t90\nchr11\t7359300\t7359600\t0.0143\t68\nchr11\t7658400\t7659000\t0.0386\t64\nchr11\t7719600\t7720200\t0.0841\t45\nchr11\t7737900\t7738200\t0.259\t45\nchr11\t7739400\t7740300\t0.0654\t39\nchr11\t7768800\t7769100\t0.0363\t43\nchr11\t8977800\t8978100\t0.1116\t110\nchr11\t10391700\t10392000\t0.001\t62\nchr11\t12719700\t12720000\t0.2036\t168\nchr11\t13544400\t13544700\t0\t16\nchr11\t13794900\t13795500\t0.0568\t89\nchr11\t13867200\t13867500\t0.1499\t49\nchr11\t14716500\t14717400\t0\t70\nchr11\t14718900\t14720700\t0\t70\nchr11\t14848200\t14848500\t0.2086\t75\nchr11\t16515600\t16515900\t0.1735\t53\nchr11\t16720200\t16720500\t0.1373\t74\nchr11\t17028900\t17029800\t0.0379\t63\nchr11\t18920700\t18921900\t0\t70\nchr11\t18942600\t18944100\t0\t75\nchr11\t20549100\t20549400\t0.0767\t60\nchr11\t22019400\t22020900\t0.0216\t92\nchr11\t22523400\t22523700\t0.0432\t37\nchr11\t22910700\t22911000\t0.0685\t69\nchr11\t23176500\t23178000\t0.1303\t52\nchr11\t23193900\t23194200\t0.2034\t44\nchr11\t23298300\t23298900\t0.0131\t72\nchr11\t23302800\t23303100\t0.1344\t58\nchr11\t24328200\t24333900\t0\t83\nchr11\t24387600\t24389100\t0.0042\t50\nchr11\t25428900\t25429200\t0\t51\nchr11\t26968800\t26969400\t0\t88\nchr11\t27221700\t27222300\t0.2589\t69\nchr11\t28029900\t28030200\t0.0713\t69\nchr11\t28206600\t28206900\t0.0925\t50\nchr11\t29154600\t29156100\t0\t71\nchr11\t30966000\t30967200\t0\t78\nchr11\t31316400\t31321200\t0\t83\nchr11\t33626700\t33627000\t0.0226\t76\nchr11\t34687500\t34687800\t0.207\t48\nchr11\t34760700\t34761000\t0.0272\t69\nchr11\t35053800\t35054100\t0.1557\t59\nchr11\t35396100\t35396400\t0.088\t88\nchr11\t35698500\t35698800\t0.1344\t33\nchr11\t36481800\t36482100\t0.0038\t50\nchr11\t36552000\t36557400\t0\t113\nchr11\t36615000\t36615600\t0.0734\t74\nchr11\t36894000\t36894600\t0.1697\t51\nchr11\t40587300\t40587600\t0.2644\t70\nchr11\t42215100\t42215700\t0.0064\t54\nchr11\t42431700\t42432000\t0.0258\t73\nchr11\t42791700\t42792300\t0.0353\t71\nchr11\t42798000\t42798300\t0.0136\t51\nchr11\t43346400\t43350300\t0.0133\t81\nchr11\t44664000\t44664300\t0.288\t79\nchr11\t45101700\t45102000\t0.0428\t65\nchr11\t45738000\t45738300\t0.1596\t91\nchr11\t47097600\t47098200\t0.0115\t61\nchr11\t48848100\t48852900\t0\t76\nchr11\t48854100\t48854400\t0.1964\t51\nchr11\t48859500\t48859800\t0.1468\t11\nchr11\t48880800\t48888000\t0\t76\nchr11\t48892500\t48899700\t0\t78\nchr11\t48944100\t48944400\t0.1148\t36\nchr11\t49104300\t49105800\t0\t74\nchr11\t49713900\t49714500\t0.0042\t66\nchr11\t49728600\t49729200\t0\t68\nchr11\t49792500\t49797300\t0\t79\nchr11\t50114400\t50134500\t0\t73\nchr11\t50343900\t50364300\t0\t78\nchr11\t50588400\t50588700\t0.1506\t37\nchr11\t51078600\t51090000\t0\t31\nchr11\t51091500\t51146100\t0\t1061\nchr11\t51147300\t51430200\t0\t1061\nchr11\t51431400\t51477600\t0\t1061\nchr11\t51478800\t51830100\t0\t1061\nchr11\t51831600\t51994200\t0\t1061\nchr11\t51995400\t52020900\t0\t1061\nchr11\t52022700\t52128000\t0\t1061\nchr11\t52129500\t52154100\t0\t666\nchr11\t52155600\t52303500\t0\t666\nchr11\t52304700\t52599600\t0\t595\nchr11\t52601100\t52632300\t0\t595\nchr11\t52633500\t52652100\t0\t595\nchr11\t52653300\t52701300\t0\t595\nchr11\t52703100\t52707000\t0\t1026\nchr11\t52708200\t53015400\t0\t1026\nchr11\t53016600\t53097000\t0\t1026\nchr11\t53098200\t53107500\t0\t1026\nchr11\t53108700\t53158500\t0\t1802\nchr11\t53159700\t53215500\t0\t1802\nchr11\t53216700\t53240400\t0\t1107\nchr11\t53241600\t53283300\t0\t1107\nchr11\t53284500\t53400000\t0\t1107\nchr11\t53401200\t53470200\t0\t863\nchr11\t53471700\t53504400\t0\t863\nchr11\t53505600\t53507100\t0\t863\nchr11\t53508600\t53518200\t0\t863\nchr11\t53519400\t53592600\t0\t863\nchr11\t53593800\t53639700\t0\t863\nchr11\t53640900\t53716200\t0\t785\nchr11\t53717400\t53798400\t0\t785\nchr11\t53799600\t53818200\t0\t785\nchr11\t53820300\t53840400\t0\t207\nchr11\t53842200\t53935500\t0\t663\nchr11\t53936700\t53948100\t0\t663\nchr11\t53949300\t53964000\t0\t663\nchr11\t53965200\t53989500\t0\t663\nchr11\t53990700\t54006000\t0\t663\nchr11\t54007200\t54084000\t0\t568\nchr11\t54086100\t54090300\t0\t568\nchr11\t54091500\t54097800\t0\t568\nchr11\t54099300\t54177300\t0\t729\nchr11\t54178500\t54326100\t0\t729\nchr11\t54327600\t54330900\t0\t729\nchr11\t54332100\t54342600\t0\t729\nchr11\t54349500\t54350400\t0.0624\t91\nchr11\t54352200\t54353100\t0.0235\t68\nchr11\t54355800\t54356100\t0.0308\t30\nchr11\t54359400\t54360000\t0.2643\t78\nchr11\t54362100\t54363600\t0.0264\t74\nchr11\t54367500\t54368100\t0.0497\t50\nchr11\t54371700\t54372300\t0.0303\t80\nchr11\t54376200\t54376500\t0.1802\t28\nchr11\t54383100\t54383400\t0\t120\nchr11\t54388800\t54389100\t0.0029\t162\nchr11\t54390900\t54393900\t0.0029\t162\nchr11\t54399300\t54400200\t0.0858\t127\nchr11\t54401400\t54402000\t0.0766\t82\nchr11\t54404400\t54405300\t0\t62\nchr11\t54409800\t54410400\t0.0893\t57\nchr11\t54411600\t54412500\t0.0098\t88\nchr11\t54413700\t54414000\t0.0098\t88\nchr11\t54419100\t54419700\t0.0975\t226\nchr11\t54421800\t54422700\t0.0975\t226\nchr11\t54423900\t54425100\t0.0975\t226\nchr11\t54528600\t54532800\t0\t187\nchr11\t54534000\t54536700\t0\t187\nchr11\t54541800\t54542100\t0.008\t50\nchr11\t54545400\t54546900\t0.0128\t68\nchr11\t54549900\t54550200\t0.0942\t34\nchr11\t57995700\t57996300\t0.0851\t85\nchr11\t58048800\t58052400\t0\t49\nchr11\t60048900\t60049500\t0.0007\t81\nchr11\t60439200\t60439800\t0.0161\t85\nchr11\t60532800\t60537900\t0.0012\t76\nchr11\t61084500\t61086300\t0\t83\nchr11\t61205700\t61218900\t0\t58\nchr11\t61220100\t61220700\t0\t57\nchr11\t61221900\t61239600\t0\t57\nchr11\t61240800\t61246200\t0\t52\nchr11\t62096700\t62099400\t0\t64\nchr11\t62277900\t62280300\t0\t58\nchr11\t64170900\t64172400\t0.0477\t86\nchr11\t67222200\t67222500\t0.0016\t70\nchr11\t67603500\t67604100\t0.0413\t90\nchr11\t67868100\t67868700\t0.0194\t70\nchr11\t68892300\t68892600\t0.0738\t30\nchr11\t69068400\t69068700\t0.0596\t127\nchr11\t71578800\t71579100\t0.066\t59\nchr11\t74527800\t74528100\t0.1867\t57\nchr11\t74757600\t74758200\t0.0372\t78\nchr11\t74760900\t74761200\t0.182\t52\nchr11\t75749100\t75749700\t0.1869\t75\nchr11\t75751200\t75751500\t0.146\t73\nchr11\t75754200\t75754500\t0.1132\t42\nchr11\t77097600\t77099400\t0.0194\t102\nchr11\t78678000\t78683100\t0\t81\nchr11\t79557300\t79557600\t0.1057\t60\nchr11\t82156200\t82161300\t0.001\t80\nchr11\t82625100\t82625700\t0.0127\t40\nchr11\t83394900\t83395200\t0.1948\t25\nchr11\t83396400\t83397000\t0.0199\t77\nchr11\t83591400\t83591700\t0.1023\t61\nchr11\t85325700\t85330500\t0\t83\nchr11\t86756400\t86756700\t0.167\t67\nchr11\t87048000\t87053100\t0\t90\nchr11\t87164400\t87165300\t0.0021\t65\nchr11\t87340200\t87345000\t0\t102\nchr11\t87698400\t87698700\t0.107\t57\nchr11\t89314500\t89315700\t0.0524\t51\nchr11\t89746200\t89746500\t0.1111\t65\nchr11\t89759100\t89759400\t0.0032\t32\nchr11\t89763300\t89764200\t0\t64\nchr11\t89766300\t89766600\t0.1044\t63\nchr11\t89771100\t89772000\t0.067\t51\nchr11\t89778600\t89781300\t0\t70\nchr11\t89788200\t89790300\t0\t71\nchr11\t89795100\t89795700\t0.0638\t60\nchr11\t89797800\t89799600\t0\t60\nchr11\t89801700\t89802000\t0.0218\t59\nchr11\t89809500\t89809800\t0.0132\t43\nchr11\t89811300\t89811600\t0.0114\t60\nchr11\t89817300\t89817900\t0.0529\t70\nchr11\t89819400\t89820900\t0.0046\t55\nchr11\t89824200\t89826000\t0\t68\nchr11\t89828100\t89829000\t0\t57\nchr11\t89830500\t89830800\t0\t57\nchr11\t89838000\t89845800\t0\t79\nchr11\t89847000\t89862300\t0\t79\nchr11\t89865000\t89866200\t0\t72\nchr11\t89868600\t89869500\t0\t72\nchr11\t89871600\t89872200\t0.0237\t62\nchr11\t89873400\t89874600\t0.0146\t60\nchr11\t89877000\t89877300\t0.1076\t61\nchr11\t89879100\t89880900\t0\t66\nchr11\t89882400\t89883000\t0\t66\nchr11\t89885400\t89888400\t0\t68\nchr11\t89889600\t89891100\t0\t68\nchr11\t89893800\t89897400\t0\t77\nchr11\t89900100\t89908200\t0\t98\nchr11\t89909700\t89910000\t0\t98\nchr11\t89911500\t89920500\t0\t98\nchr11\t89924100\t90000300\t0\t84\nchr11\t90001500\t90006600\t0\t84\nchr11\t90008100\t90008400\t0.083\t36\nchr11\t90013500\t90014100\t0.0539\t69\nchr11\t90015600\t90016500\t0.0539\t69\nchr11\t90018600\t90020100\t0\t65\nchr11\t90023700\t90025200\t0\t63\nchr11\t90026700\t90028500\t0\t63\nchr11\t90029700\t90030300\t0.0148\t54\nchr11\t90037500\t90038100\t0.0196\t66\nchr11\t90039900\t90042000\t0\t53\nchr11\t90044100\t90045600\t0\t67\nchr11\t90050100\t90051600\t0\t68\nchr11\t90056400\t90056700\t0.029\t58\nchr11\t90058500\t90061500\t0\t68\nchr11\t90068100\t90069000\t0.1042\t64\nchr11\t90073500\t90073800\t0.005\t50\nchr11\t90075900\t90076500\t0\t54\nchr11\t90080400\t90081000\t0.0076\t53\nchr11\t90088200\t90088500\t0.1023\t34\nchr11\t90400200\t90405600\t0\t124\nchr11\t90966600\t90971700\t0\t76\nchr11\t90976500\t90976800\t0.0914\t24\nchr11\t91579200\t91579800\t0.0623\t75\nchr11\t93136800\t93142500\t0\t93\nchr11\t93421200\t93426900\t0\t81\nchr11\t93946500\t93948000\t0.0661\t68\nchr11\t94038300\t94042200\t0.0365\t112\nchr11\t94233000\t94234200\t0.0079\t186\nchr11\t94341000\t94341300\t0.2757\t56\nchr11\t95320500\t95320800\t0.0873\t60\nchr11\t95436300\t95442300\t0\t87\nchr11\t95626800\t95627100\t0.1101\t153\nchr11\t95629800\t95630100\t0.1597\t57\nchr11\t96406500\t96408300\t0.0637\t79\nchr11\t96775200\t96775500\t0.1356\t40\nchr11\t96935100\t96936900\t0.0617\t72\nchr11\t97040400\t97040700\t0.2104\t65\nchr11\t98325600\t98325900\t0.0984\t50\nchr11\t99603000\t99606300\t0\t90\nchr11\t99607500\t99607800\t0.1916\t60\nchr11\t99783300\t99783600\t0.0073\t60\nchr11\t100412100\t100412400\t0.1118\t63\nchr11\t100413900\t100414200\t0.0793\t48\nchr11\t100452600\t100452900\t0.0472\t124\nchr11\t100478700\t100479600\t0.096\t75\nchr11\t101546100\t101546400\t0.1184\t25\nchr11\t101695500\t101695800\t0.0064\t55\nchr11\t101697000\t101698200\t0\t60\nchr11\t101700000\t101704500\t0\t104\nchr11\t102370800\t102371400\t0.0663\t90\nchr11\t102372600\t102372900\t0.0663\t90\nchr11\t102743700\t102744300\t0.0473\t101\nchr11\t103038900\t103039200\t0.1829\t62\nchr11\t104195100\t104195400\t0.1095\t56\nchr11\t104675700\t104676600\t0.0116\t80\nchr11\t106710000\t106710300\t0.0914\t15\nchr11\t107366100\t107367000\t0\t70\nchr11\t107376600\t107377800\t0\t67\nchr11\t108264600\t108264900\t0.0641\t85\nchr11\t109177800\t109183200\t0\t71\nchr11\t109404600\t109404900\t0.0788\t77\nchr11\t109878900\t109879200\t0.2008\t68\nchr11\t110212500\t110214900\t0.0064\t71\nchr11\t112325400\t112326000\t0.0761\t62\nchr11\t112680000\t112680300\t0.0917\t68\nchr11\t114840000\t114841800\t0.0083\t87\nchr11\t114843300\t114843600\t0.1597\t85\nchr11\t116571300\t116573100\t0.0033\t79\nchr11\t116574600\t116575200\t0.0033\t79\nchr11\t117135300\t117138000\t0\t66\nchr11\t118721100\t118721400\t0.0937\t66\nchr11\t119848800\t119849100\t0.2419\t15\nchr11\t120082800\t120083700\t0\t27\nchr11\t121185600\t121185900\t0.0418\t214\nchr11\t121601100\t121601400\t0.0673\t86\nchr11\t121821600\t121827000\t0.0009\t74\nchr11\t122477100\t122478300\t0\t50\nchr11\t122826900\t122827200\t0.0961\t74\nchr11\t123896100\t123896400\t0.1068\t98\nchr11\t124236300\t124236600\t0.0556\t43\nchr11\t124392000\t124392600\t0.1833\t21\nchr11\t124505700\t124506000\t0.0746\t88\nchr11\t125036100\t125036400\t0.0091\t34\nchr11\t125537700\t125542200\t0\t72\nchr11\t125863500\t125863800\t0.2613\t71\nchr11\t126226200\t126226500\t0.0767\t142\nchr11\t127079400\t127079700\t0.104\t35\nchr11\t127287300\t127288800\t0.0416\t84\nchr11\t127364400\t127364700\t0.0819\t80\nchr11\t127367700\t127368000\t0.2057\t70\nchr11\t127776900\t127779000\t0.0549\t104\nchr11\t127869000\t127869600\t0.0227\t85\nchr11\t129175500\t129175800\t0\t77\nchr11\t129342300\t129342900\t0.0071\t64\nchr11\t129563400\t129564000\t0.0104\t62\nchr11\t130092300\t130092600\t0.1845\t81\nchr11\t131342100\t131342400\t0.2844\t131\nchr11\t132322500\t132322800\t0.2171\t61\nchr11\t132324000\t132324300\t0.0414\t81\nchr11\t133644300\t133645800\t0.141\t88\nchr11\t134000100\t134000700\t0.1891\t59\nchr11\t134296200\t134296500\t0.087\t66\nchr11\t134839500\t134840100\t0.0162\t83\nchr11\t134928600\t134928900\t0.157\t39\nchr12\t9900\t10500\t0.0749\t68\nchr12\t23700\t38100\t0\t124\nchr12\t41400\t43200\t0\t66\nchr12\t419700\t421800\t0.0632\t58\nchr12\t529800\t530100\t0.1478\t69\nchr12\t1079400\t1079700\t0.1105\t44\nchr12\t1085100\t1086000\t0.0027\t44\nchr12\t2130600\t2135100\t0\t70\nchr12\t2520300\t2520600\t0.0416\t129\nchr12\t2539200\t2539800\t0.0621\t251\nchr12\t3499500\t3505200\t0\t91\nchr12\t4511700\t4513200\t0.0296\t100\nchr12\t5117400\t5118900\t0.0353\t65\nchr12\t6022500\t6022800\t0.1418\t65\nchr12\t7335900\t7336200\t0.1421\t75\nchr12\t7819800\t7820100\t0.003\t61\nchr12\t7924500\t7924800\t0.1292\t49\nchr12\t7972200\t7972500\t0.0996\t44\nchr12\t8387700\t8388300\t0.0124\t87\nchr12\t8394900\t8395500\t0.0024\t102\nchr12\t8626200\t8626500\t0.0719\t70\nchr12\t8787900\t8788500\t0.0007\t56\nchr12\t8795100\t8795700\t0\t67\nchr12\t8940600\t8940900\t0.0036\t68\nchr12\t9285300\t9286200\t0\t54\nchr12\t9287700\t9288300\t0.0392\t69\nchr12\t9291600\t9292800\t0.0451\t62\nchr12\t9298200\t9300000\t0.0022\t90\nchr12\t9401400\t9401700\t0.0543\t36\nchr12\t9414900\t9415200\t0.0933\t38\nchr12\t9431700\t9433500\t0.0241\t66\nchr12\t9438600\t9439500\t0.0026\t65\nchr12\t9441300\t9442200\t0\t55\nchr12\t9443700\t9444000\t0.0006\t70\nchr12\t9446100\t9446400\t0.178\t66\nchr12\t9467700\t9468000\t0.0138\t21\nchr12\t9496800\t9497100\t0.0659\t18\nchr12\t9523200\t9525600\t0\t80\nchr12\t9559800\t9560100\t0\t14\nchr12\t9561300\t9561600\t0\t14\nchr12\t9563100\t9563400\t0\t29\nchr12\t9570600\t9572100\t0\t38\nchr12\t9573600\t9574200\t0\t22\nchr12\t9577500\t9578100\t0\t15\nchr12\t9580500\t9581700\t0\t67\nchr12\t10345800\t10346100\t0.1088\t40\nchr12\t10424100\t10425300\t0\t38\nchr12\t10427100\t10427400\t0.0031\t45\nchr12\t10437000\t10437900\t0\t21\nchr12\t10440300\t10440900\t0.078\t49\nchr12\t10442400\t10443000\t0.0028\t48\nchr12\t11034300\t11034600\t0.0808\t28\nchr12\t11088300\t11088600\t0.065\t38\nchr12\t11095200\t11095500\t0\t19\nchr12\t11148600\t11148900\t0.1286\t43\nchr12\t11298900\t11300700\t0\t67\nchr12\t11301900\t11303400\t0.0833\t60\nchr12\t11352300\t11353200\t0\t75\nchr12\t11391900\t11392800\t0\t67\nchr12\t11937900\t11938500\t0.0281\t70\nchr12\t13392000\t13399500\t0\t101\nchr12\t15477000\t15477300\t0.0936\t67\nchr12\t16707600\t16707900\t0.0475\t118\nchr12\t16709400\t16709700\t0.2017\t73\nchr12\t17177400\t17177700\t0.0388\t56\nchr12\t17769900\t17770200\t0.0281\t42\nchr12\t17773500\t17773800\t0.0984\t103\nchr12\t17859600\t17859900\t0.0218\t32\nchr12\t18369600\t18369900\t0.212\t60\nchr12\t20553300\t20553600\t0.1403\t65\nchr12\t20709600\t20709900\t0\t16\nchr12\t21284700\t21285000\t0.0055\t66\nchr12\t21286200\t21287700\t0.1211\t72\nchr12\t21397800\t21398100\t0.039\t83\nchr12\t21399300\t21399600\t0.039\t83\nchr12\t21423000\t21423900\t0\t31\nchr12\t21622500\t21622800\t0\t11\nchr12\t21976800\t21978000\t0\t35\nchr12\t22419000\t22431600\t0\t40\nchr12\t23073600\t23073900\t0.0609\t39\nchr12\t25540200\t25540500\t0.2104\t71\nchr12\t26035200\t26035800\t0.1413\t142\nchr12\t26216700\t26217600\t0.1756\t61\nchr12\t26784900\t26786100\t0.03\t33\nchr12\t27281100\t27281400\t0.1179\t22\nchr12\t28764300\t28764600\t0.1306\t74\nchr12\t29932200\t29932800\t0.0067\t98\nchr12\t32099700\t32100300\t0.0421\t56\nchr12\t32810700\t32811000\t0.173\t25\nchr12\t33738000\t33738600\t0.0824\t66\nchr12\t34669800\t34670100\t0.0392\t65\nchr12\t34770000\t34773000\t0\t63\nchr12\t34776000\t34778400\t0\t85\nchr12\t34779600\t34786200\t0\t85\nchr12\t34787700\t34795200\t0\t85\nchr12\t34797900\t34799700\t0\t36\nchr12\t34802700\t34803600\t0\t24\nchr12\t34805700\t34812000\t0\t64\nchr12\t34813200\t34816500\t0\t31\nchr12\t34820400\t34820700\t0\t15\nchr12\t34821900\t34822200\t0.0427\t50\nchr12\t34832100\t34832400\t0.0065\t34\nchr12\t34834800\t34841400\t0\t95\nchr12\t34842600\t34849500\t0\t87\nchr12\t34851000\t34852500\t0\t81\nchr12\t34854000\t34857300\t0\t57\nchr12\t34858800\t34860900\t0.0407\t58\nchr12\t34862700\t34863000\t0\t75\nchr12\t34865700\t34870200\t0\t140\nchr12\t34871700\t34872900\t0\t140\nchr12\t34874100\t34878600\t0\t140\nchr12\t34881000\t34882800\t0.0099\t149\nchr12\t34884000\t34887600\t0\t1117\nchr12\t34889700\t35090700\t0\t1117\nchr12\t35092200\t35141700\t0\t1117\nchr12\t35142900\t35199300\t0\t1117\nchr12\t35201100\t35208600\t0\t297\nchr12\t35210700\t35250600\t0\t297\nchr12\t35252100\t35274000\t0\t208\nchr12\t35275500\t35319600\t0\t1097\nchr12\t35320800\t35332500\t0\t338\nchr12\t35334600\t35389500\t0\t338\nchr12\t35391000\t35402400\t0\t178\nchr12\t35403600\t35429400\t0\t221\nchr12\t35430900\t35439000\t0\t221\nchr12\t35440500\t35467800\t0\t221\nchr12\t35469000\t35482800\t0\t165\nchr12\t35484000\t35522100\t0\t185\nchr12\t35523300\t35615700\t0\t2138\nchr12\t35616900\t35650500\t0\t2138\nchr12\t35651700\t35682900\t0\t2138\nchr12\t35684100\t35725500\t0\t2138\nchr12\t35726700\t35780400\t0\t2138\nchr12\t35781600\t35787900\t0\t2138\nchr12\t35789100\t35809800\t0\t1323\nchr12\t35811300\t35987700\t0\t1323\nchr12\t35988900\t35995500\t0\t1323\nchr12\t35996700\t36125400\t0\t1323\nchr12\t36126600\t36141300\t0\t237\nchr12\t36143100\t36170400\t0\t237\nchr12\t36171900\t36183600\t0\t167\nchr12\t36184800\t36189600\t0\t167\nchr12\t36191400\t36193200\t0\t213\nchr12\t36194700\t36268500\t0\t213\nchr12\t36270000\t36318600\t0\t213\nchr12\t36320100\t36331500\t0\t213\nchr12\t36332700\t36336600\t0\t213\nchr12\t36338400\t36390000\t0\t176\nchr12\t36391500\t36450900\t0\t201\nchr12\t36452400\t36467400\t0\t201\nchr12\t36469200\t36480600\t0\t201\nchr12\t36481800\t36487800\t0\t201\nchr12\t36489000\t36496200\t0\t132\nchr12\t36497400\t36499500\t0\t132\nchr12\t36500700\t36513300\t0\t138\nchr12\t36514800\t36582000\t0\t185\nchr12\t36583200\t36624000\t0\t162\nchr12\t36625200\t36639000\t0\t304\nchr12\t36640200\t36671100\t0\t479\nchr12\t36672300\t36693000\t0\t194\nchr12\t36694200\t36699900\t0\t194\nchr12\t36701100\t36733800\t0\t194\nchr12\t36735000\t36735900\t0\t194\nchr12\t36737400\t36778800\t0\t225\nchr12\t36780300\t36796200\t0\t225\nchr12\t36798900\t36830400\t0\t364\nchr12\t36831900\t36840600\t0\t364\nchr12\t36842100\t36872700\t0\t364\nchr12\t36873900\t36965100\t0\t364\nchr12\t36966300\t36966600\t0\t364\nchr12\t36967800\t37010400\t0\t364\nchr12\t37011600\t37039200\t0\t270\nchr12\t37041000\t37102500\t0\t182\nchr12\t37104300\t37111800\t0\t232\nchr12\t37113000\t37175700\t0\t232\nchr12\t37176900\t37185000\t0\t120\nchr12\t37235700\t37240200\t0\t144\nchr12\t37246200\t37246500\t0\t82\nchr12\t37247700\t37248900\t0\t82\nchr12\t37251300\t37251600\t0\t29\nchr12\t37333200\t37334700\t0\t50\nchr12\t37339800\t37340100\t0.1009\t46\nchr12\t37705800\t37706100\t0.0472\t60\nchr12\t37736700\t37737000\t0.1871\t65\nchr12\t37815300\t37815600\t0.1457\t72\nchr12\t38211900\t38212200\t0.0059\t36\nchr12\t38226900\t38227200\t0.276\t44\nchr12\t38313300\t38313600\t0.0745\t41\nchr12\t38800200\t38805600\t0\t84\nchr12\t39791400\t39792300\t0.0042\t41\nchr12\t39800400\t39801000\t0\t66\nchr12\t39836700\t39837000\t0.0357\t60\nchr12\t39901500\t39901800\t0.0425\t97\nchr12\t39981900\t39982200\t0.0268\t79\nchr12\t41640300\t41640600\t0.2166\t61\nchr12\t41673900\t41674200\t0.1789\t71\nchr12\t41844300\t41844900\t0\t24\nchr12\t42228900\t42229200\t0.0121\t49\nchr12\t43473000\t43476600\t0.0213\t66\nchr12\t43532700\t43533900\t0.0058\t49\nchr12\t43583700\t43585200\t0\t55\nchr12\t43790700\t43791000\t0.1281\t61\nchr12\t43910700\t43911300\t0.0416\t65\nchr12\t44108700\t44113800\t0\t92\nchr12\t44577000\t44577300\t0.1435\t70\nchr12\t44953200\t44954700\t0.0842\t80\nchr12\t44956200\t44956800\t0.0622\t84\nchr12\t45374100\t45374700\t0.0559\t77\nchr12\t45376200\t45376500\t0.0817\t101\nchr12\t48277800\t48278100\t0.2469\t65\nchr12\t48331800\t48333000\t0.0234\t65\nchr12\t51454800\t51455100\t0.0491\t68\nchr12\t51563100\t51568200\t0\t73\nchr12\t51719100\t51719700\t0.0474\t43\nchr12\t52289100\t52291200\t0.001\t82\nchr12\t52302300\t52304400\t0.0202\t75\nchr12\t54779700\t54780000\t0.1159\t41\nchr12\t54789000\t54794400\t0\t80\nchr12\t55083900\t55084500\t0.2909\t78\nchr12\t55096500\t55099800\t0\t85\nchr12\t55345500\t55346100\t0\t41\nchr12\t55349100\t55349700\t0.0144\t60\nchr12\t55410000\t55410600\t0.0049\t62\nchr12\t55413000\t55413300\t0.0233\t69\nchr12\t55489500\t55489800\t0.1927\t57\nchr12\t56400900\t56401200\t0.1159\t79\nchr12\t56940300\t56940900\t0.0362\t63\nchr12\t56984700\t56985300\t0.0146\t69\nchr12\t57648600\t57651000\t0.0052\t106\nchr12\t58110000\t58110300\t0.0552\t62\nchr12\t58327800\t58328400\t0.0014\t108\nchr12\t58331700\t58332000\t0.0233\t71\nchr12\t58336200\t58336800\t0.0272\t66\nchr12\t60008700\t60009600\t0.0024\t167\nchr12\t61942500\t61943100\t0.0109\t88\nchr12\t61944600\t61944900\t0.0109\t88\nchr12\t61946400\t61947000\t0.0109\t88\nchr12\t64197900\t64201500\t0.0108\t80\nchr12\t64287600\t64292700\t0\t89\nchr12\t65550600\t65550900\t0.1118\t74\nchr12\t66057600\t66057900\t0.1246\t480\nchr12\t66135600\t66135900\t0.0581\t39\nchr12\t67903800\t67905300\t0.083\t72\nchr12\t68660100\t68660400\t0.1348\t51\nchr12\t68994600\t68994900\t0.0871\t46\nchr12\t69773700\t69778800\t0\t85\nchr12\t69940800\t69941700\t0.0987\t72\nchr12\t70013700\t70016700\t0.0004\t98\nchr12\t70017900\t70018500\t0.0636\t60\nchr12\t70201200\t70203300\t0.0008\t120\nchr12\t71098800\t71099400\t0.121\t54\nchr12\t71102100\t71103300\t0.0198\t69\nchr12\t71119200\t71120100\t0\t60\nchr12\t71122500\t71124000\t0.0488\t54\nchr12\t71564100\t71564400\t0\t57\nchr12\t72515100\t72515400\t0.1046\t76\nchr12\t73148700\t73149000\t0.0165\t83\nchr12\t73284000\t73288800\t0\t75\nchr12\t73398900\t73400400\t0.1866\t88\nchr12\t73983000\t73983300\t0.0185\t137\nchr12\t74875500\t74880000\t0\t81\nchr12\t75730200\t75730500\t0.1438\t97\nchr12\t77174100\t77178300\t0.0997\t72\nchr12\t77656200\t77656500\t0.1887\t39\nchr12\t78072300\t78072900\t0.0636\t84\nchr12\t79177200\t79177500\t0.0212\t32\nchr12\t80245200\t80247900\t0.0059\t80\nchr12\t80451300\t80452200\t0\t56\nchr12\t80453700\t80454000\t0\t54\nchr12\t80464500\t80465100\t0\t59\nchr12\t80482800\t80483100\t0.0841\t63\nchr12\t82899900\t82900500\t0.0784\t88\nchr12\t83394000\t83394300\t0.0496\t19\nchr12\t83450400\t83450700\t0.1169\t54\nchr12\t83524500\t83524800\t0.0431\t45\nchr12\t83672100\t83676000\t0\t68\nchr12\t83902500\t83902800\t0.1238\t47\nchr12\t85193100\t85194300\t0.0472\t82\nchr12\t85315500\t85316100\t0.0178\t95\nchr12\t86845500\t86846100\t0.0051\t76\nchr12\t86859300\t86859900\t0.0199\t59\nchr12\t87102000\t87102300\t0.1538\t54\nchr12\t87192000\t87194100\t0.0215\t67\nchr12\t87747900\t87749400\t0\t72\nchr12\t88621800\t88622700\t0.0283\t74\nchr12\t90537600\t90542400\t0\t69\nchr12\t92315100\t92319900\t0\t85\nchr12\t92916600\t92918400\t0.0157\t63\nchr12\t92919600\t92920200\t0.0157\t63\nchr12\t93399300\t93399600\t0.0799\t48\nchr12\t93401700\t93402000\t0.1436\t57\nchr12\t93492900\t93494100\t0\t63\nchr12\t93498000\t93499200\t0\t56\nchr12\t95839800\t95842500\t0\t59\nchr12\t95946600\t95947500\t0.0013\t67\nchr12\t95948700\t95949000\t0.1775\t52\nchr12\t96317400\t96317700\t0.1049\t70\nchr12\t96320700\t96321600\t0\t63\nchr12\t96827400\t96827700\t0.1323\t25\nchr12\t97161000\t97161300\t0.0607\t40\nchr12\t97704900\t97705500\t0.1293\t73\nchr12\t97707000\t97708500\t0\t53\nchr12\t97718100\t97718400\t0.0631\t77\nchr12\t97725300\t97727700\t0\t72\nchr12\t98278500\t98279100\t0.0287\t65\nchr12\t98655000\t98655300\t0.1204\t68\nchr12\t101146800\t101147100\t0.1883\t82\nchr12\t101149500\t101151900\t0\t58\nchr12\t101509500\t101511300\t0.0433\t70\nchr12\t101586900\t101587200\t0.1689\t60\nchr12\t101704800\t101705700\t0.054\t45\nchr12\t102308100\t102308400\t0.1209\t69\nchr12\t102828900\t102829200\t0.1071\t72\nchr12\t103321500\t103321800\t0.153\t95\nchr12\t103899600\t103899900\t0.1547\t45\nchr12\t105630600\t105631200\t0.0854\t87\nchr12\t105632700\t105633000\t0.0854\t87\nchr12\t105777300\t105781500\t0\t70\nchr12\t106473300\t106474500\t0\t77\nchr12\t106476300\t106476600\t0.1328\t66\nchr12\t108348000\t108348600\t0.0384\t26\nchr12\t109000500\t109000800\t0.0171\t75\nchr12\t110570400\t110570700\t0.023\t49\nchr12\t112623300\t112626900\t0\t89\nchr12\t113872800\t113873700\t0.065\t103\nchr12\t115287300\t115288800\t0.0159\t106\nchr12\t120928500\t120928800\t0.1222\t34\nchr12\t121747500\t121748100\t0.0484\t46\nchr12\t121994400\t121994700\t0.2093\t58\nchr12\t122696100\t122696400\t0.0165\t69\nchr12\t122709600\t122709900\t0.0322\t64\nchr12\t122713500\t122713800\t0.0144\t49\nchr12\t125409900\t125410200\t0.1004\t11\nchr12\t126151800\t126152100\t0.1364\t38\nchr12\t126299100\t126304800\t0\t97\nchr12\t126583500\t126584100\t0\t69\nchr12\t127095000\t127097100\t0.1113\t86\nchr12\t127099500\t127100100\t0.049\t85\nchr12\t127545300\t127545900\t0.0013\t39\nchr12\t127871400\t127871700\t0.0355\t70\nchr12\t128844900\t128845200\t0.2808\t35\nchr12\t129018000\t129018300\t0.1703\t46\nchr12\t129303300\t129303600\t0.0859\t76\nchr12\t129804000\t129804300\t0.0327\t52\nchr12\t129806100\t129806400\t0.0327\t52\nchr12\t129855900\t129858300\t0\t53\nchr12\t130386600\t130387500\t0.0245\t62\nchr12\t130586700\t130587600\t0.0468\t69\nchr12\t130843800\t130844100\t0.1047\t100\nchr12\t130882200\t130882500\t0.1945\t66\nchr12\t131195100\t131195400\t0.038\t61\nchr12\t131201100\t131202300\t0\t81\nchr12\t131206200\t131206500\t0.1545\t44\nchr12\t131225400\t131225700\t0.0162\t76\nchr12\t131278200\t131278500\t0.2476\t56\nchr12\t131298600\t131300100\t0.0045\t71\nchr12\t131301600\t131307000\t0\t78\nchr12\t131393100\t131393400\t0.2243\t33\nchr12\t131433300\t131434200\t0.0373\t49\nchr12\t131439900\t131440200\t0.042\t62\nchr12\t131470500\t131470800\t0.0808\t49\nchr12\t131475600\t131476200\t0\t76\nchr12\t131481300\t131481600\t0.0311\t62\nchr12\t131588400\t131588700\t0.1747\t439\nchr12\t131626500\t131627700\t0.1268\t196\nchr12\t131656500\t131656800\t0.0791\t66\nchr12\t131661000\t131662200\t0\t68\nchr12\t131701200\t131701500\t0.111\t18\nchr12\t132149100\t132150600\t0.0006\t206\nchr12\t132212400\t132212700\t0.0779\t21\nchr12\t132232200\t132234600\t0\t72\nchr12\t132235800\t132236100\t0.1418\t44\nchr12\t132241200\t132243300\t0.1538\t199\nchr12\t132362100\t132362400\t0.2446\t44\nchr12\t132378000\t132378300\t0.1995\t12\nchr12\t132684300\t132684900\t0.1793\t92\nchr12\t132793200\t132793500\t0.009\t21\nchr12\t132836100\t132836400\t0.2755\t33\nchr12\t133264800\t133265400\t0\t201\nchr13\t16004100\t16004400\t0.2736\t47\nchr13\t16005900\t16006200\t0.1347\t44\nchr13\t16024800\t16025400\t0.0067\t75\nchr13\t16028400\t16028700\t0.0437\t15\nchr13\t16030800\t16032600\t0.1502\t55\nchr13\t16033800\t16034100\t0.1502\t55\nchr13\t16038600\t16040100\t0\t141\nchr13\t16041600\t16042200\t0\t141\nchr13\t16043400\t16044900\t0\t23\nchr13\t16047000\t16047300\t0\t23\nchr13\t16052700\t16055700\t0\t52\nchr13\t16057200\t16058400\t0\t52\nchr13\t16060500\t16061700\t0.0444\t88\nchr13\t16062900\t16063800\t0.0444\t88\nchr13\t16069200\t16069500\t0.0464\t74\nchr13\t16071000\t16074000\t0\t59\nchr13\t16075200\t16077000\t0.0197\t69\nchr13\t16080600\t16089600\t0\t105\nchr13\t16090800\t16091100\t0\t105\nchr13\t16093800\t16098900\t0.008\t256\nchr13\t16100700\t16105200\t0\t179\nchr13\t16106700\t16110000\t0\t116\nchr13\t16116000\t16118100\t0.1139\t407\nchr13\t16124400\t16125000\t0.0406\t118\nchr13\t16132200\t16132500\t0.1927\t124\nchr13\t16137600\t16137900\t0.2841\t141\nchr13\t16139100\t16140300\t0.0646\t516\nchr13\t16162200\t16162500\t0.1312\t366\nchr13\t16165200\t16165800\t0.2584\t164\nchr13\t16167300\t16169100\t0.1796\t87\nchr13\t16171800\t16177500\t0.046\t366\nchr13\t16179000\t16183500\t0\t219\nchr13\t16184700\t16185000\t0.2291\t381\nchr13\t16186500\t16186800\t0.2956\t484\nchr13\t16189200\t16191000\t0.2306\t104\nchr13\t16192800\t16194600\t0.2\t352\nchr13\t16195800\t16197000\t0.1094\t310\nchr13\t16200000\t16202100\t0.1231\t279\nchr13\t16203300\t16205700\t0.13\t48\nchr13\t16206900\t16207500\t0.2164\t138\nchr13\t16209600\t16210500\t0.1559\t327\nchr13\t16213200\t16214400\t0.1395\t257\nchr13\t16216200\t16221900\t0.0549\t427\nchr13\t16223700\t16224000\t0.0737\t105\nchr13\t16227000\t16228500\t0.1044\t449\nchr13\t16231200\t16231500\t0.1753\t283\nchr13\t16235400\t16235700\t0.1336\t478\nchr13\t16242300\t16243200\t0.0761\t556\nchr13\t16244700\t16245000\t0.2375\t148\nchr13\t16250100\t16256100\t0\t805\nchr13\t16262100\t16263300\t0\t71\nchr13\t16266300\t16266900\t0.0026\t127\nchr13\t16268100\t16269900\t0\t83\nchr13\t16272000\t16272300\t0\t69\nchr13\t16273800\t16275600\t0\t69\nchr13\t16278300\t16278900\t0\t51\nchr13\t16282200\t16294200\t0\t685\nchr13\t16295400\t16303800\t0\t685\nchr13\t16305000\t16305900\t0\t685\nchr13\t16307100\t16311300\t0\t1318\nchr13\t16312500\t16354500\t0\t1318\nchr13\t16355700\t16358100\t0.0023\t813\nchr13\t16359300\t16368900\t0.0119\t1444\nchr13\t16370400\t16381800\t0.0006\t1930\nchr13\t16383000\t16400100\t0.0006\t1930\nchr13\t16401600\t16415400\t0\t914\nchr13\t16416900\t16425600\t0.0028\t673\nchr13\t16428900\t16440600\t0\t1381\nchr13\t16441800\t16460400\t0\t1381\nchr13\t16461600\t16501200\t0\t2672\nchr13\t16502700\t16504200\t0\t1909\nchr13\t16505400\t16550400\t0\t1909\nchr13\t16551600\t16570800\t0\t1494\nchr13\t16572000\t16589100\t0\t2701\nchr13\t16590300\t16593900\t0\t2321\nchr13\t16595100\t16615800\t0\t2321\nchr13\t16618200\t16653300\t0\t1438\nchr13\t16654500\t16709700\t0\t2648\nchr13\t16711200\t16812300\t0\t2648\nchr13\t16813500\t16824900\t0\t2648\nchr13\t16826100\t16835100\t0\t2648\nchr13\t16836900\t16839900\t0\t2648\nchr13\t16841100\t16844400\t0.006\t445\nchr13\t16845600\t16905900\t0\t2376\nchr13\t16908300\t16928100\t0\t1873\nchr13\t16929300\t16954200\t0\t1873\nchr13\t16955400\t16983000\t0\t1873\nchr13\t16984200\t16992600\t0.0128\t773\nchr13\t16993800\t17028000\t0\t1149\nchr13\t17029500\t17077800\t0\t2220\nchr13\t17079000\t17088300\t0\t2220\nchr13\t17089500\t17095200\t0\t917\nchr13\t17097600\t17098200\t0.0092\t194\nchr13\t17099700\t17103600\t0\t2768\nchr13\t17104800\t17107200\t0\t2768\nchr13\t17108400\t17124000\t0\t1680\nchr13\t17125200\t17143800\t0\t1680\nchr13\t17145000\t17169300\t0\t1316\nchr13\t17170800\t17185800\t0\t2082\nchr13\t17187000\t17191200\t0\t2082\nchr13\t17192700\t17210400\t0.0003\t1874\nchr13\t17211900\t17218500\t0.0047\t999\nchr13\t17219700\t17235900\t0\t1184\nchr13\t17237100\t17253600\t0\t3917\nchr13\t17254800\t17311800\t0\t3917\nchr13\t17313000\t17334300\t0\t3450\nchr13\t17335500\t17338800\t0\t3450\nchr13\t17340000\t17418600\t0\t3450\nchr13\t17419800\t17431200\t0\t714\nchr13\t17432400\t17447100\t0\t536\nchr13\t17448900\t17449500\t0\t155\nchr13\t17451000\t17451600\t0\t155\nchr13\t17452800\t17454300\t0\t155\nchr13\t17455500\t17465700\t0\t1822\nchr13\t17466900\t17539200\t0\t1822\nchr13\t17541000\t17541600\t0\t1822\nchr13\t17542800\t17573700\t0\t1292\nchr13\t17574900\t17592600\t0\t1292\nchr13\t17594100\t17636400\t0\t1370\nchr13\t17637600\t17644200\t0\t941\nchr13\t17646600\t17742300\t0\t1868\nchr13\t17743500\t17753700\t0\t1868\nchr13\t17754900\t17768100\t0\t1868\nchr13\t17769300\t17880900\t0\t2954\nchr13\t17882700\t17907900\t0\t2954\nchr13\t17909400\t17912400\t0\t2111\nchr13\t17913600\t17970600\t0\t3185\nchr13\t17972100\t18051300\t0\t3185\nchr13\t18193800\t18194100\t0.2344\t114\nchr13\t18196500\t18196800\t0.1706\t83\nchr13\t18214800\t18215100\t0.104\t2140\nchr13\t18339300\t18345900\t0\t78\nchr13\t18347100\t18348900\t0\t78\nchr13\t18350400\t18352500\t0\t73\nchr13\t18356700\t18357300\t0.0385\t78\nchr13\t18415500\t18416100\t0.0038\t42\nchr13\t18417600\t18418200\t0\t59\nchr13\t18419700\t18420000\t0.131\t45\nchr13\t18424800\t18425100\t0.0884\t27\nchr13\t18428400\t18428700\t0.0787\t59\nchr13\t18434100\t18434700\t0.0002\t53\nchr13\t18457500\t18457800\t0.0576\t234\nchr13\t18459000\t18459300\t0.016\t37\nchr13\t18464100\t18464400\t0.1352\t42\nchr13\t18493800\t18494100\t0.1381\t66\nchr13\t18509700\t18510300\t0.0224\t46\nchr13\t18546900\t18548400\t0.1235\t53\nchr13\t18552000\t18552600\t0.0009\t67\nchr13\t18554400\t18554700\t0\t71\nchr13\t18556200\t18557700\t0\t71\nchr13\t18565500\t18565800\t0.1572\t52\nchr13\t18571500\t18572700\t0.005\t62\nchr13\t18574500\t18574800\t0.0945\t27\nchr13\t18576000\t18576300\t0.0091\t61\nchr13\t18580500\t18581100\t0.025\t46\nchr13\t18588300\t18588600\t0.0826\t50\nchr13\t18604200\t18604800\t0\t58\nchr13\t18608400\t18608700\t0.0796\t38\nchr13\t18671400\t18672000\t0.0407\t48\nchr13\t18675900\t18676200\t0.0903\t50\nchr13\t18770400\t18771300\t0\t36\nchr13\t18784800\t18785400\t0.0495\t61\nchr13\t18789900\t18790800\t0\t32\nchr13\t18801600\t18801900\t0.0124\t56\nchr13\t18902700\t18903000\t0.1139\t20\nchr13\t19107000\t19107300\t0.1192\t79\nchr13\t19137600\t19138500\t0.028\t168\nchr13\t19274700\t19275000\t0.0816\t12\nchr13\t19276200\t19276500\t0.0817\t50\nchr13\t19278300\t19278600\t0.1208\t38\nchr13\t19500900\t19501500\t0.1444\t71\nchr13\t21377100\t21377700\t0.2003\t347\nchr13\t21448200\t21448800\t0.0983\t34\nchr13\t22481100\t22481400\t0.1837\t33\nchr13\t24808500\t24808800\t0.0331\t48\nchr13\t25004700\t25005000\t0.1223\t48\nchr13\t26072700\t26073000\t0.015\t43\nchr13\t26472600\t26472900\t0.1739\t61\nchr13\t28265700\t28266000\t0.1351\t28\nchr13\t29413500\t29414400\t0.0105\t48\nchr13\t29641800\t29647500\t0\t97\nchr13\t29670300\t29670600\t0.0612\t49\nchr13\t31302600\t31308300\t0\t118\nchr13\t32868000\t32868900\t0\t75\nchr13\t34482000\t34485900\t0\t78\nchr13\t35088900\t35089800\t0.0432\t101\nchr13\t36009000\t36011100\t0.0115\t78\nchr13\t36012900\t36013200\t0.0115\t78\nchr13\t36056100\t36056400\t0.0321\t53\nchr13\t36488100\t36488400\t0.1019\t49\nchr13\t37152900\t37153200\t0.2093\t99\nchr13\t37314600\t37314900\t0.0514\t70\nchr13\t37317900\t37318200\t0.0828\t59\nchr13\t37826100\t37826400\t0.1076\t68\nchr13\t39003000\t39005700\t0\t73\nchr13\t39986700\t39987300\t0.0174\t58\nchr13\t40357200\t40358400\t0.0813\t81\nchr13\t40361700\t40362000\t0.1835\t69\nchr13\t40832100\t40833900\t0.0962\t55\nchr13\t42425700\t42430500\t0.0284\t101\nchr13\t42966900\t42967200\t0.0579\t50\nchr13\t43967100\t43967400\t0.0966\t70\nchr13\t43971900\t43974900\t0.0096\t74\nchr13\t45381600\t45381900\t0.1471\t27\nchr13\t45485400\t45486000\t0.0078\t112\nchr13\t45645600\t45645900\t0.0862\t100\nchr13\t45647100\t45647700\t0.0862\t100\nchr13\t45649200\t45649500\t0.0275\t73\nchr13\t45664200\t45664500\t0.0498\t58\nchr13\t47222400\t47224200\t0.0241\t164\nchr13\t48427200\t48428400\t0\t81\nchr13\t48466800\t48471300\t0\t100\nchr13\t49014000\t49014600\t0.1873\t73\nchr13\t49153800\t49155900\t0.0493\t73\nchr13\t49157700\t49158000\t0.0493\t73\nchr13\t49378800\t49379700\t0.0521\t77\nchr13\t49592700\t49593000\t0.0893\t62\nchr13\t49799400\t49800000\t0.1249\t108\nchr13\t50180400\t50184000\t0\t68\nchr13\t50185500\t50185800\t0.0324\t45\nchr13\t51774600\t51775500\t0\t52\nchr13\t52059000\t52059300\t0.0246\t63\nchr13\t52218900\t52219200\t0.0815\t60\nchr13\t52230600\t52231500\t0\t70\nchr13\t52233000\t52233600\t0\t70\nchr13\t52237500\t52239000\t0\t59\nchr13\t52247400\t52248000\t0.0506\t66\nchr13\t52252500\t52254000\t0.0297\t63\nchr13\t52257000\t52257300\t0.0279\t89\nchr13\t52259400\t52260000\t0\t65\nchr13\t52261800\t52262100\t0.0749\t61\nchr13\t52267500\t52268100\t0.0113\t59\nchr13\t52269900\t52270500\t0\t96\nchr13\t52271700\t52274400\t0\t96\nchr13\t52278300\t52278600\t0.0963\t53\nchr13\t52296900\t52299300\t0.0143\t60\nchr13\t52304100\t52304400\t0.013\t59\nchr13\t52305600\t52306500\t0.0385\t64\nchr13\t52332300\t52332600\t0.1184\t67\nchr13\t52334100\t52334400\t0.0475\t71\nchr13\t52488900\t52489200\t0.0201\t61\nchr13\t52490700\t52491000\t0.0965\t60\nchr13\t52506000\t52508400\t0.0371\t71\nchr13\t52513200\t52515900\t0.0249\t56\nchr13\t52528200\t52528500\t0.0209\t60\nchr13\t52533900\t52534200\t0.0378\t35\nchr13\t52538400\t52539000\t0.0252\t51\nchr13\t52544400\t52544700\t0.0845\t66\nchr13\t52546500\t52547100\t0.0056\t54\nchr13\t52552500\t52554000\t0.0412\t64\nchr13\t52558800\t52559100\t0.0588\t51\nchr13\t52567500\t52569300\t0\t70\nchr13\t52573200\t52573500\t0.0352\t53\nchr13\t52575000\t52575900\t0\t66\nchr13\t52587300\t52587600\t0.0679\t59\nchr13\t53094000\t53094300\t0.2227\t53\nchr13\t53096400\t53097300\t0.0213\t73\nchr13\t57140700\t57173400\t0\t168\nchr13\t57358200\t57358500\t0.2095\t75\nchr13\t57401400\t57401700\t0\t22\nchr13\t58512600\t58513800\t0.0032\t80\nchr13\t58672800\t58676700\t0\t72\nchr13\t59028900\t59029200\t0.2111\t69\nchr13\t59848500\t59849700\t0\t85\nchr13\t59984700\t59986500\t0\t73\nchr13\t60741900\t60743700\t0.0011\t48\nchr13\t63717000\t63726600\t0\t72\nchr13\t63747300\t63748200\t0.0098\t64\nchr13\t63749700\t63755700\t0\t79\nchr13\t63759600\t63769200\t0\t70\nchr13\t63824100\t63830100\t0\t81\nchr13\t63831600\t63832500\t0.0082\t50\nchr13\t64231500\t64232100\t0.0331\t58\nchr13\t66741000\t66743400\t0\t53\nchr13\t67527900\t67528200\t0.0451\t903\nchr13\t67682100\t67682400\t0.01\t65\nchr13\t70854600\t70854900\t0.0547\t573\nchr13\t71734200\t71734800\t0.0263\t34\nchr13\t73641300\t73641600\t0.1976\t62\nchr13\t74236200\t74237100\t0.0851\t71\nchr13\t74239200\t74240700\t0.0149\t80\nchr13\t74427300\t74431800\t0\t71\nchr13\t74539800\t74540100\t0.1065\t78\nchr13\t74541300\t74541900\t0.1065\t78\nchr13\t76545300\t76547400\t0.0325\t77\nchr13\t76613100\t76618500\t0\t88\nchr13\t77704500\t77705100\t0\t34\nchr13\t79820100\t79822500\t0\t86\nchr13\t79840800\t79844100\t0\t57\nchr13\t81173100\t81173400\t0.1137\t35\nchr13\t82049100\t82049700\t0.0017\t69\nchr13\t83523000\t83523300\t0.19\t61\nchr13\t83961900\t83966100\t0\t76\nchr13\t85124400\t85125000\t0.0396\t93\nchr13\t85127400\t85128000\t0.0279\t71\nchr13\t85395300\t85395600\t0\t12\nchr13\t85926300\t85927800\t0.0696\t80\nchr13\t86253000\t86258100\t0\t32\nchr13\t86259600\t86264100\t0\t43\nchr13\t86266200\t86268600\t0\t43\nchr13\t88199700\t88200600\t0.1504\t66\nchr13\t89090700\t89091000\t0.2359\t101\nchr13\t90325500\t90325800\t0.1218\t69\nchr13\t91605600\t91605900\t0\t70\nchr13\t92685900\t92690100\t0\t70\nchr13\t93491100\t93491400\t0.0208\t53\nchr13\t93492900\t93494400\t0.0707\t60\nchr13\t94375800\t94376100\t0.0044\t88\nchr13\t94732200\t94732500\t0.1758\t82\nchr13\t94819200\t94819500\t0.011\t58\nchr13\t97155900\t97156200\t0.0602\t63\nchr13\t97668600\t97671900\t0.0087\t58\nchr13\t97734300\t97734600\t0.1516\t71\nchr13\t100699800\t100700100\t0.0868\t83\nchr13\t100701900\t100702800\t0.0757\t66\nchr13\t104051400\t104051700\t0.0469\t67\nchr13\t104508900\t104509200\t0.1496\t27\nchr13\t104654100\t104655000\t0.0483\t65\nchr13\t105299700\t105300000\t0.0526\t28\nchr13\t105382200\t105382500\t0.0517\t24\nchr13\t105386700\t105387000\t0.1546\t88\nchr13\t106216500\t106217700\t0.062\t76\nchr13\t106779900\t106780500\t0.091\t75\nchr13\t107921700\t107922000\t0.1425\t56\nchr13\t107935200\t107935500\t0.1467\t82\nchr13\t108237900\t108238200\t0.1092\t76\nchr13\t108510600\t108516000\t0\t76\nchr13\t109218000\t109218600\t0.0024\t58\nchr13\t109569300\t109569600\t0.1459\t13\nchr13\t110252700\t110253000\t0.1655\t32\nchr13\t111254700\t111255000\t0.0128\t42\nchr13\t111340200\t111341700\t0\t145\nchr13\t111591900\t111592200\t0.0828\t64\nchr13\t111669600\t111703800\t0\t47\nchr13\t111753900\t111757200\t0\t38\nchr13\t111759600\t111781500\t0\t50\nchr13\t111783000\t111789000\t0\t46\nchr13\t112015200\t112015800\t0.0327\t67\nchr13\t112279200\t112279500\t0.1247\t37\nchr13\t112281000\t112284000\t0\t106\nchr13\t112290900\t112292100\t0\t123\nchr13\t112294500\t112296600\t0.0104\t180\nchr13\t112298100\t112301100\t0.0076\t133\nchr13\t112302300\t112308000\t0\t104\nchr13\t113067600\t113069400\t0.0076\t144\nchr13\t113136600\t113136900\t0.1049\t28\nchr13\t113162100\t113162700\t0.1165\t42\nchr13\t113262900\t113263200\t0.2145\t195\nchr13\t113371500\t113371800\t0.2113\t91\nchr13\t113375400\t113375700\t0.2898\t42\nchr13\t113541900\t113542200\t0\t83\nchr13\t113726100\t113726400\t0.1697\t18\nchr13\t113899500\t113900100\t0.0088\t38\nchr13\t113940600\t113941200\t0\t26\nchr13\t113985900\t113986200\t0\t16\nchr13\t113987400\t113988600\t0\t15\nchr13\t114008100\t114009000\t0.0363\t69\nchr13\t114083700\t114086700\t0\t56\nchr13\t114113700\t114114000\t0.0602\t176\nchr13\t114351900\t114352200\t0.1106\t121\nchr13\t114354000\t114354600\t0.0536\t244\nchr14\t16023600\t16024500\t0\t125\nchr14\t16026300\t16030500\t0\t125\nchr14\t16031700\t16034700\t0\t114\nchr14\t16036500\t16036800\t0\t185\nchr14\t16038000\t16053900\t0\t185\nchr14\t16055100\t16055700\t0\t37\nchr14\t16056900\t16063800\t0\t68\nchr14\t16065600\t16086600\t0\t68\nchr14\t16090200\t16091700\t0\t31\nchr14\t16096200\t16096500\t0.236\t544\nchr14\t16103400\t16103700\t0.2427\t4332\nchr14\t16134300\t16135200\t0\t154\nchr14\t16404000\t16404300\t0.0118\t47\nchr14\t18227100\t18227700\t0.0089\t77\nchr14\t18229200\t18229800\t0.0089\t77\nchr14\t18231000\t18231600\t0\t72\nchr14\t18232800\t18234900\t0\t72\nchr14\t18239400\t18240000\t0.1002\t64\nchr14\t18242100\t18244500\t0.0041\t87\nchr14\t18248100\t18249900\t0\t86\nchr14\t18252600\t18252900\t0.0329\t69\nchr14\t18254100\t18254400\t0.0329\t69\nchr14\t18255600\t18255900\t0.1636\t56\nchr14\t18259800\t18261000\t0.0601\t74\nchr14\t18264900\t18268800\t0\t83\nchr14\t18270300\t18270900\t0\t83\nchr14\t18273300\t18273900\t0.0048\t64\nchr14\t18276300\t18276900\t0.0104\t53\nchr14\t18281400\t18283200\t0.0413\t69\nchr14\t18284400\t18288600\t0.0013\t97\nchr14\t18290400\t18290700\t0.0316\t47\nchr14\t18297900\t18298200\t0.1094\t63\nchr14\t18299700\t18301800\t0\t87\nchr14\t18306000\t18310200\t0\t77\nchr14\t18312900\t18315000\t0\t68\nchr14\t18316500\t18316800\t0.0024\t37\nchr14\t18319800\t18321000\t0.016\t65\nchr14\t18323100\t18324300\t0\t57\nchr14\t18326100\t18329100\t0\t53\nchr14\t18331800\t18332100\t0.0073\t74\nchr14\t18334200\t18334800\t0.0057\t58\nchr14\t18336600\t18339600\t0\t60\nchr14\t18341400\t18342900\t0\t64\nchr14\t18344700\t18346200\t0\t62\nchr14\t18348900\t18349800\t0.0652\t70\nchr14\t18351600\t18357600\t0\t73\nchr14\t18358800\t18364500\t0\t73\nchr14\t18366300\t18370800\t0\t71\nchr14\t18372600\t18375000\t0\t56\nchr14\t18376500\t18384000\t0\t75\nchr14\t18385500\t18386100\t0\t75\nchr14\t18387600\t18387900\t0.0085\t60\nchr14\t18390600\t18391800\t0.0085\t60\nchr14\t18393300\t18393600\t0.1776\t52\nchr14\t18395400\t18396600\t0\t60\nchr14\t18398100\t18398400\t0.0939\t54\nchr14\t18401700\t18404400\t0.0252\t61\nchr14\t18411000\t18411300\t0.017\t47\nchr14\t18415500\t18417000\t0.0061\t70\nchr14\t18418800\t18420600\t0.0635\t65\nchr14\t18424200\t18425400\t0.0097\t96\nchr14\t18434400\t18434700\t0.0064\t64\nchr14\t18435900\t18436200\t0.0951\t71\nchr14\t18438000\t18438900\t0\t82\nchr14\t18441300\t18441600\t0.0383\t74\nchr14\t18443100\t18443400\t0.0383\t74\nchr14\t18444900\t18445200\t0.0383\t74\nchr14\t18452400\t18452700\t0.0907\t65\nchr14\t18455100\t18456000\t0.0541\t74\nchr14\t18463500\t18465300\t0\t83\nchr14\t18469500\t18471000\t0.0477\t69\nchr14\t18473400\t18475200\t0.0324\t85\nchr14\t18476700\t18477000\t0.0979\t65\nchr14\t18484500\t18486000\t0.0243\t78\nchr14\t18487200\t18487500\t0.0589\t58\nchr14\t18492600\t18493200\t0\t64\nchr14\t18495600\t18495900\t0.2261\t69\nchr14\t18498300\t18500400\t0.0166\t82\nchr14\t18502500\t18503100\t0\t78\nchr14\t18504900\t18508200\t0\t83\nchr14\t18513600\t18513900\t0.0517\t61\nchr14\t18517800\t18520200\t0\t71\nchr14\t18522600\t18522900\t0.0432\t71\nchr14\t18524700\t18526200\t0.026\t67\nchr14\t18527700\t18528300\t0.0005\t73\nchr14\t18531000\t18534300\t0\t88\nchr14\t18535800\t18537300\t0.0021\t79\nchr14\t18541200\t18541800\t0.0006\t39\nchr14\t18543600\t18546300\t0\t63\nchr14\t18549000\t18553800\t0\t63\nchr14\t18555600\t18556500\t0.0304\t51\nchr14\t18558600\t18558900\t0.0309\t68\nchr14\t18564000\t18567600\t0.0032\t64\nchr14\t18569400\t18572700\t0.0027\t77\nchr14\t18573900\t18576600\t0\t70\nchr14\t18577800\t18579300\t0\t58\nchr14\t18584700\t18585600\t0\t66\nchr14\t18588600\t18589500\t0.0653\t84\nchr14\t18596400\t18596700\t0.139\t76\nchr14\t18598800\t18605400\t0.002\t91\nchr14\t18606900\t18608400\t0\t118\nchr14\t18610200\t18610500\t0\t149\nchr14\t18611700\t18624000\t0\t149\nchr14\t18626400\t18627000\t0.1322\t66\nchr14\t18628200\t18630000\t0\t151\nchr14\t18632400\t18633300\t0\t138\nchr14\t18634500\t18635100\t0\t145\nchr14\t18638100\t18638700\t0\t145\nchr14\t18639900\t18642600\t0\t145\nchr14\t18644100\t18649500\t0\t145\nchr14\t18696600\t18697500\t0.0241\t140\nchr14\t18703500\t18704700\t0.0185\t80\nchr14\t18709200\t18710700\t0.0011\t70\nchr14\t18711900\t18712200\t0.0506\t78\nchr14\t18862500\t18881700\t0\t127\nchr14\t18882900\t18883500\t0\t127\nchr14\t18885000\t18903600\t0\t127\nchr14\t18905100\t18928800\t0\t151\nchr14\t18931500\t18939600\t0\t150\nchr14\t18941100\t18947100\t0\t150\nchr14\t18951900\t18952500\t0.0283\t140\nchr14\t18954600\t18957900\t0\t144\nchr14\t18959700\t18962400\t0\t144\nchr14\t18964800\t18967500\t0\t179\nchr14\t18969300\t18974400\t0\t179\nchr14\t18975900\t18976800\t0\t179\nchr14\t18978300\t18981000\t0\t179\nchr14\t18982800\t19014300\t0\t179\nchr14\t19015500\t19016400\t0\t179\nchr14\t19017600\t19025100\t0\t127\nchr14\t19026300\t19026600\t0.2565\t92\nchr14\t19028100\t19044000\t0\t160\nchr14\t19045200\t19046400\t0\t160\nchr14\t19047600\t19058100\t0\t160\nchr14\t19059900\t19077600\t0\t160\nchr14\t19078800\t19081500\t0\t160\nchr14\t19084800\t19086300\t0\t125\nchr14\t19087800\t19096500\t0\t161\nchr14\t19099800\t19102200\t0.1031\t124\nchr14\t19103400\t19105200\t0\t95\nchr14\t19110300\t19110600\t0.0796\t114\nchr14\t19112400\t19113900\t0\t66\nchr14\t19116000\t19117800\t0\t92\nchr14\t19119600\t19120200\t0.0736\t82\nchr14\t19121700\t19123200\t0\t104\nchr14\t19124700\t19125300\t0.145\t100\nchr14\t19131600\t19134600\t0\t116\nchr14\t19137300\t19138200\t0\t96\nchr14\t19140900\t19155600\t0\t96\nchr14\t19179300\t19179900\t0.0928\t75\nchr14\t19183800\t19184400\t0.002\t98\nchr14\t19190700\t19191000\t0.0762\t67\nchr14\t19208400\t19210200\t0.0074\t54\nchr14\t19211700\t19215300\t0\t69\nchr14\t19218000\t19223400\t0\t67\nchr14\t19224600\t19237500\t0\t110\nchr14\t19239000\t19239600\t0\t62\nchr14\t19242000\t19255800\t0\t92\nchr14\t19257600\t19259700\t0\t92\nchr14\t19261500\t19264200\t0\t124\nchr14\t19265700\t19266900\t0.0565\t133\nchr14\t19268700\t19279500\t0\t131\nchr14\t19282200\t19284300\t0.0005\t105\nchr14\t19285800\t19286400\t0\t71\nchr14\t19290300\t19290900\t0.0308\t130\nchr14\t19293600\t19297200\t0\t126\nchr14\t19298700\t19299300\t0\t126\nchr14\t19301700\t19307400\t0\t176\nchr14\t19308600\t19309800\t0\t176\nchr14\t19314000\t19317000\t0.0038\t121\nchr14\t19319100\t19319400\t0.125\t48\nchr14\t19320900\t19321200\t0\t148\nchr14\t19323000\t19340100\t0\t148\nchr14\t19341900\t19342500\t0\t132\nchr14\t19344900\t19350600\t0\t132\nchr14\t19351800\t19352100\t0\t132\nchr14\t19353900\t19356300\t0\t132\nchr14\t19357500\t19361700\t0\t163\nchr14\t19364700\t19371000\t0\t163\nchr14\t19375500\t19376100\t0\t63\nchr14\t19383600\t19383900\t0.0174\t84\nchr14\t19385100\t19386900\t0.0524\t175\nchr14\t19389300\t19389900\t0.0524\t175\nchr14\t19391100\t19413900\t0\t158\nchr14\t19416600\t19426200\t0\t158\nchr14\t19427700\t19433700\t0\t158\nchr14\t19435800\t19441500\t0\t148\nchr14\t19444200\t19444500\t0\t128\nchr14\t19446300\t19449900\t0\t128\nchr14\t19452900\t19453200\t0\t150\nchr14\t19455000\t19486200\t0\t150\nchr14\t19491000\t19497000\t0\t98\nchr14\t19498200\t19498500\t0\t98\nchr14\t19500000\t19500300\t0\t98\nchr14\t19501500\t19505700\t0\t105\nchr14\t19612500\t19615200\t0\t85\nchr14\t19617600\t19643700\t0\t92\nchr14\t19645200\t19658100\t0\t118\nchr14\t19659600\t19663500\t0\t118\nchr14\t19665600\t19666200\t0.1605\t76\nchr14\t19672200\t19672800\t0.181\t123\nchr14\t19682100\t19686900\t0\t119\nchr14\t19688100\t19688400\t0.0413\t36\nchr14\t19690800\t19693800\t0.0057\t105\nchr14\t19695300\t19700400\t0\t122\nchr14\t19704300\t19704600\t0.1937\t96\nchr14\t19707000\t19708200\t0.0783\t132\nchr14\t19709700\t19711200\t0\t108\nchr14\t19712400\t19713000\t0\t108\nchr14\t19714200\t19714800\t0.0506\t97\nchr14\t19716900\t19717500\t0.0941\t84\nchr14\t19718700\t19719300\t0.0394\t61\nchr14\t19720500\t19721100\t0.1038\t81\nchr14\t19722600\t19722900\t0.0248\t88\nchr14\t20505900\t20507400\t0.1021\t110\nchr14\t20882100\t20883000\t0\t69\nchr14\t20946300\t20946900\t0.058\t68\nchr14\t22674600\t22676100\t0\t65\nchr14\t22680000\t22681200\t0\t75\nchr14\t23920500\t23921400\t0.0207\t62\nchr14\t23967600\t23968200\t0.04\t59\nchr14\t23979900\t23980500\t0.002\t59\nchr14\t23997300\t23997600\t0.2518\t51\nchr14\t24002400\t24005100\t0.0144\t88\nchr14\t24022500\t24023100\t0.0151\t54\nchr14\t24111900\t24113100\t0\t67\nchr14\t24486300\t24489900\t0\t68\nchr14\t25207800\t25208100\t0.1799\t50\nchr14\t26297100\t26297400\t0.2404\t71\nchr14\t26631600\t26634000\t0.0271\t84\nchr14\t26675700\t26676000\t0.0353\t38\nchr14\t27459900\t27460800\t0.0721\t60\nchr14\t27678300\t27678900\t0.0171\t96\nchr14\t28193700\t28194000\t0.0309\t65\nchr14\t29478600\t29480100\t0.0364\t83\nchr14\t30364800\t30367500\t0.001\t102\nchr14\t30477600\t30477900\t0.2039\t75\nchr14\t30685200\t30690300\t0\t90\nchr14\t31249200\t31249500\t0.1281\t54\nchr14\t31794000\t31797600\t0\t59\nchr14\t32269200\t32269500\t0.0992\t52\nchr14\t34205400\t34205700\t0.0684\t48\nchr14\t34294800\t34296900\t0\t57\nchr14\t34540800\t34547700\t0\t75\nchr14\t34555500\t34562100\t0\t73\nchr14\t35039700\t35040000\t0.0803\t60\nchr14\t35949300\t35949600\t0.2264\t59\nchr14\t36144600\t36144900\t0.0506\t89\nchr14\t36188400\t36190200\t0.0573\t84\nchr14\t37352100\t37352700\t0.0379\t46\nchr14\t37354500\t37354800\t0.1613\t36\nchr14\t39512100\t39512400\t0.0904\t46\nchr14\t39517500\t39517800\t0.1035\t73\nchr14\t39629400\t39630900\t0.0139\t77\nchr14\t39936000\t39936300\t0.2272\t58\nchr14\t40327800\t40328700\t0.038\t87\nchr14\t40331100\t40331700\t0.0309\t42\nchr14\t40349400\t40349700\t0.1715\t79\nchr14\t40351800\t40352100\t0.1455\t57\nchr14\t40719000\t40720200\t0.0394\t92\nchr14\t40728900\t40729500\t0.0047\t68\nchr14\t40952100\t40952700\t0.1698\t84\nchr14\t43065900\t43066200\t0\t51\nchr14\t43372500\t43372800\t0.0537\t66\nchr14\t43405800\t43406100\t0.1321\t60\nchr14\t43601700\t43602000\t0.0716\t57\nchr14\t44643300\t44644200\t0.0137\t72\nchr14\t44705400\t44710800\t0\t87\nchr14\t45389100\t45389400\t0.1786\t95\nchr14\t45477600\t45482100\t0.0554\t83\nchr14\t45844500\t45844800\t0.1236\t72\nchr14\t45884400\t45886500\t0.042\t67\nchr14\t46726800\t46727400\t0\t52\nchr14\t47795400\t47795700\t0.2082\t71\nchr14\t47796900\t47797200\t0.2621\t74\nchr14\t47902500\t47903700\t0.0766\t33\nchr14\t48188100\t48189000\t0\t79\nchr14\t48190500\t48192300\t0.0247\t63\nchr14\t48453900\t48454200\t0.1625\t65\nchr14\t48938700\t48939000\t0.1145\t14\nchr14\t49100100\t49100400\t0.1257\t96\nchr14\t49535100\t49535400\t0.1554\t38\nchr14\t49821300\t49821600\t0.2819\t13\nchr14\t50074200\t50074800\t0.0177\t31\nchr14\t51795000\t51799800\t0\t76\nchr14\t52256100\t52257000\t0.0272\t71\nchr14\t53270100\t53270400\t0.2175\t67\nchr14\t53909400\t53910900\t0.0289\t81\nchr14\t55024800\t55025100\t0.0474\t36\nchr14\t55988400\t55991400\t0.0342\t88\nchr14\t56017500\t56017800\t0.1232\t78\nchr14\t56442000\t56444400\t0.0011\t64\nchr14\t56445600\t56447100\t0.0249\t89\nchr14\t56667900\t56669100\t0.0055\t113\nchr14\t56673000\t56673300\t0.0055\t113\nchr14\t57552300\t57552600\t0.15\t36\nchr14\t58033200\t58038300\t0\t93\nchr14\t58962600\t58962900\t0.0797\t34\nchr14\t59948700\t59951400\t0.0203\t67\nchr14\t60399000\t60399300\t0.0385\t54\nchr14\t60604800\t60606000\t0\t70\nchr14\t60612000\t60612900\t0\t76\nchr14\t61055400\t61060800\t0\t88\nchr14\t62284800\t62285100\t0.031\t24\nchr14\t62286600\t62287200\t0.04\t38\nchr14\t62536200\t62541600\t0\t65\nchr14\t63117000\t63122700\t0\t86\nchr14\t63870300\t63870600\t0.0846\t59\nchr14\t64893900\t64896600\t0\t65\nchr14\t64978800\t64979100\t0.0101\t86\nchr14\t67870500\t67870800\t0.1586\t52\nchr14\t67872300\t67872600\t0.229\t105\nchr14\t70424400\t70425000\t0.0128\t70\nchr14\t70476300\t70476600\t0.0531\t95\nchr14\t70481100\t70482000\t0.0077\t57\nchr14\t70547400\t70552800\t0\t94\nchr14\t71037900\t71038200\t0.0972\t63\nchr14\t71368200\t71369700\t0\t69\nchr14\t71843700\t71844000\t0.0058\t35\nchr14\t71979900\t71980200\t0.1087\t78\nchr14\t73543500\t73543800\t0.0094\t19\nchr14\t73549500\t73549800\t0.2293\t44\nchr14\t74994900\t74995800\t0\t99\nchr14\t77269800\t77270100\t0.285\t178\nchr14\t79128000\t79128300\t0.2353\t91\nchr14\t79309200\t79314600\t0\t73\nchr14\t81117000\t81118500\t0\t87\nchr14\t81861300\t81861600\t0.0365\t130\nchr14\t82349400\t82351200\t0\t76\nchr14\t82352400\t82352700\t0.0465\t62\nchr14\t83169600\t83169900\t0.0379\t40\nchr14\t83202300\t83202600\t0.0635\t71\nchr14\t85846800\t85847700\t0\t19\nchr14\t85886100\t85890600\t0\t80\nchr14\t86107200\t86107500\t0.1489\t47\nchr14\t86246100\t86246400\t0.1277\t69\nchr14\t86473200\t86473500\t0.1164\t67\nchr14\t89361000\t89361900\t0.2027\t24\nchr14\t90246300\t90246600\t0.1611\t42\nchr14\t91433100\t91435800\t0.0086\t102\nchr14\t91640400\t91645800\t0\t88\nchr14\t92640300\t92640600\t0.2054\t38\nchr14\t92910900\t92911500\t0.0165\t78\nchr14\t93722100\t93722400\t0.1243\t50\nchr14\t99420900\t99421200\t0.067\t549\nchr14\t99927900\t99928200\t0.2305\t571\nchr14\t100685700\t100686000\t0.1916\t12\nchr14\t100869900\t100870500\t0\t36\nchr14\t101268300\t101268600\t0.0209\t77\nchr14\t101271300\t101271600\t0.1025\t75\nchr14\t101572200\t101572500\t0.2652\t43\nchr14\t102677400\t102677700\t0.09\t137\nchr14\t104217000\t104217300\t0.2782\t47\nchr14\t104251200\t104251800\t0.009\t155\nchr14\t105110700\t105112800\t0.0016\t79\nchr14\t105229800\t105240600\t0\t254\nchr14\t105276300\t105277500\t0.1955\t58\nchr14\t105459600\t105459900\t0.2065\t14\nchr14\t105520800\t105521100\t0.1125\t92\nchr14\t105559800\t105560100\t0.0357\t58\nchr14\t105561900\t105562200\t0.1869\t50\nchr14\t105566100\t105566400\t0.0228\t49\nchr14\t105572400\t105572700\t0.0632\t15\nchr14\t105574800\t105575400\t0.0043\t74\nchr14\t105578700\t105579300\t0.005\t80\nchr14\t105594900\t105596400\t0.0089\t69\nchr14\t105645300\t105645600\t0.0995\t53\nchr14\t105680400\t105680700\t0.0597\t59\nchr14\t105682200\t105682500\t0.109\t70\nchr14\t105686100\t105686400\t0.0652\t64\nchr14\t105692700\t105693300\t0.0008\t75\nchr14\t105696000\t105696900\t0.0199\t60\nchr14\t105715800\t105717000\t0.0048\t60\nchr14\t105735300\t105735900\t0.0126\t38\nchr14\t105756000\t105756300\t0.1898\t42\nchr14\t105867600\t105867900\t0.0144\t20\nchr14\t106001100\t106001400\t0.1507\t27\nchr14\t106335600\t106335900\t0.0259\t83\nchr14\t106337400\t106337700\t0.0161\t111\nchr14\t106341900\t106342200\t0.0211\t69\nchr14\t106360200\t106360500\t0.0232\t98\nchr14\t106362000\t106362600\t0.0154\t94\nchr14\t106471800\t106473300\t0\t32\nchr14\t106476600\t106481700\t0\t42\nchr14\t106701900\t106703100\t0\t56\nchr14\t106716300\t106716900\t0.0848\t71\nchr14\t106720500\t106721100\t0.0229\t68\nchr14\t106748100\t106749600\t0\t55\nchr14\t106752300\t106752600\t0.2945\t347\nchr14\t106763700\t106764300\t0.1501\t81\nchr14\t106767600\t106768200\t0.0711\t64\nchr15\t17001000\t17009100\t0\t102\nchr15\t17080500\t17081700\t0.1526\t2089\nchr15\t17082900\t17107200\t0\t967\nchr15\t17108400\t17288100\t0\t967\nchr15\t17289300\t17391600\t0\t967\nchr15\t17393100\t17446200\t0\t967\nchr15\t17447400\t17457900\t0\t69\nchr15\t17459400\t17498400\t0\t345\nchr15\t17500500\t17502600\t0\t100\nchr15\t17504700\t17506200\t0\t43\nchr15\t17507400\t17681100\t0\t139\nchr15\t17682300\t17744400\t0\t125\nchr15\t17745900\t17766600\t0\t125\nchr15\t17767800\t17826300\t0\t125\nchr15\t17827500\t17913900\t0\t125\nchr15\t17915100\t18046500\t0\t129\nchr15\t18048600\t18217800\t0\t140\nchr15\t18219300\t18316200\t0\t140\nchr15\t18317400\t18341100\t0\t97\nchr15\t18343200\t18354900\t0\t94\nchr15\t18357000\t18801900\t0\t301\nchr15\t18804000\t18910500\t0\t180\nchr15\t18912600\t19344900\t0\t324\nchr15\t19346400\t19467300\t0\t275\nchr15\t19468500\t19563300\t0\t275\nchr15\t19564800\t19724700\t0\t289\nchr15\t19775400\t19782600\t0\t125\nchr15\t19789200\t19789500\t0\t27\nchr15\t19817100\t19818600\t0\t60\nchr15\t19993500\t19993800\t0.0591\t36\nchr15\t19995900\t19996200\t0.1375\t55\nchr15\t20005800\t20006700\t0\t52\nchr15\t20007900\t20008200\t0\t52\nchr15\t20013900\t20016300\t0\t60\nchr15\t20019300\t20019600\t0.0104\t52\nchr15\t20022600\t20028000\t0\t68\nchr15\t20030100\t20031000\t0\t53\nchr15\t20035200\t20036400\t0\t56\nchr15\t20040000\t20041800\t0\t54\nchr15\t20043600\t20046000\t0\t53\nchr15\t20047800\t20048100\t0.129\t59\nchr15\t20050800\t20053800\t0.0025\t52\nchr15\t20063700\t20064300\t0\t65\nchr15\t20066700\t20095200\t0\t65\nchr15\t20096700\t20104500\t0\t253\nchr15\t20106900\t20108400\t0.0499\t46\nchr15\t20109600\t20113800\t0\t64\nchr15\t20116500\t20116800\t0.0004\t47\nchr15\t20118000\t20121900\t0\t86\nchr15\t20123700\t20134500\t0\t86\nchr15\t20136300\t20136600\t0\t63\nchr15\t20138100\t20142300\t0\t63\nchr15\t20143500\t20144400\t0\t68\nchr15\t20145900\t20147100\t0\t52\nchr15\t20149800\t20152800\t0\t61\nchr15\t20154600\t20155800\t0.0539\t53\nchr15\t20158500\t20166000\t0\t62\nchr15\t20170800\t20171100\t0\t62\nchr15\t20172300\t20174100\t0\t62\nchr15\t20175300\t20175600\t0\t62\nchr15\t20178300\t20179800\t0.0005\t52\nchr15\t20181900\t20182200\t0\t51\nchr15\t20183700\t20185500\t0\t51\nchr15\t20330400\t20330700\t0.01\t70\nchr15\t20332200\t20332500\t0.0422\t61\nchr15\t20423400\t20424000\t0\t57\nchr15\t20425200\t20436300\t0\t57\nchr15\t20437500\t20437800\t0\t57\nchr15\t20439900\t20440500\t0.0229\t46\nchr15\t20443200\t20446800\t0\t97\nchr15\t20448600\t20466300\t0\t97\nchr15\t20467800\t20484600\t0\t97\nchr15\t20486100\t20491800\t0\t97\nchr15\t20493000\t20504100\t0\t97\nchr15\t20506500\t20534400\t0\t97\nchr15\t20535600\t20537100\t0\t86\nchr15\t20538300\t20547000\t0\t86\nchr15\t20548200\t20550900\t0\t102\nchr15\t20552100\t20562000\t0\t102\nchr15\t20563500\t20566200\t0\t102\nchr15\t20567400\t20572200\t0\t102\nchr15\t20573400\t20577300\t0\t102\nchr15\t20578800\t20579100\t0\t102\nchr15\t20581800\t20582100\t0\t102\nchr15\t20583600\t20585400\t0\t102\nchr15\t20589000\t20591700\t0\t61\nchr15\t20593200\t20604000\t0\t61\nchr15\t20605800\t20611800\t0\t55\nchr15\t20613300\t20614500\t0\t60\nchr15\t20615700\t20616000\t0.0576\t35\nchr15\t20617200\t20623500\t0\t60\nchr15\t20626500\t20627400\t0\t54\nchr15\t20630100\t20640300\t0\t61\nchr15\t20674200\t20675100\t0\t51\nchr15\t20678400\t20678700\t0.1311\t31\nchr15\t20680200\t20680500\t0.1508\t39\nchr15\t20682000\t20682300\t0.0999\t32\nchr15\t20685000\t20685300\t0.06\t34\nchr15\t20730600\t20733300\t0.009\t42\nchr15\t20736000\t20742600\t0\t45\nchr15\t20743800\t20754000\t0\t42\nchr15\t20755200\t20757300\t0\t27\nchr15\t20760000\t20762100\t0\t43\nchr15\t20763900\t20791800\t0\t48\nchr15\t20793300\t20793600\t0\t20\nchr15\t20796000\t20801700\t0\t54\nchr15\t20802900\t20803200\t0\t54\nchr15\t20804400\t20806800\t0\t54\nchr15\t20808000\t20812500\t0\t54\nchr15\t20814000\t20823000\t0\t54\nchr15\t20824200\t20844000\t0\t54\nchr15\t20845200\t20848200\t0\t51\nchr15\t20849400\t20859600\t0\t51\nchr15\t20860800\t20867700\t0\t51\nchr15\t20868900\t20878500\t0\t51\nchr15\t20880300\t20880600\t0\t51\nchr15\t20881800\t20909700\t0\t51\nchr15\t20911500\t20915100\t0\t51\nchr15\t20916600\t20932800\t0\t51\nchr15\t20934300\t20935500\t0\t34\nchr15\t20937900\t20943000\t0\t36\nchr15\t20944200\t20946600\t0\t36\nchr15\t20947800\t20950200\t0\t33\nchr15\t20952600\t20954100\t0\t29\nchr15\t20955600\t20957100\t0\t29\nchr15\t20963700\t20967300\t0\t29\nchr15\t20968500\t20976000\t0\t38\nchr15\t20977200\t20986200\t0\t43\nchr15\t20989800\t20990100\t0\t25\nchr15\t20997000\t20999100\t0\t40\nchr15\t21000300\t21000600\t0\t40\nchr15\t21002400\t21003600\t0.005\t43\nchr15\t21006000\t21009000\t0.005\t43\nchr15\t21012300\t21013200\t0\t56\nchr15\t21014400\t21015900\t0\t56\nchr15\t21020400\t21023700\t0\t53\nchr15\t21025200\t21026400\t0.0158\t58\nchr15\t21028200\t21038400\t0\t64\nchr15\t21041100\t21043200\t0\t49\nchr15\t21046500\t21052800\t0\t67\nchr15\t21054600\t21055500\t0.0034\t43\nchr15\t21056700\t21060600\t0\t49\nchr15\t21068700\t21069000\t0.1026\t33\nchr15\t21070800\t21102300\t0\t62\nchr15\t21103800\t21109800\t0\t367\nchr15\t21111600\t21111900\t0.1734\t164\nchr15\t21115200\t21115500\t0.0375\t44\nchr15\t21117300\t21120300\t0\t88\nchr15\t21123000\t21123300\t0\t88\nchr15\t21124500\t21130500\t0\t88\nchr15\t21131700\t21141300\t0\t88\nchr15\t21142800\t21143400\t0\t88\nchr15\t21144600\t21150600\t0\t88\nchr15\t21152400\t21154200\t0\t55\nchr15\t21155400\t21159600\t0\t55\nchr15\t21161100\t21162300\t0.0002\t48\nchr15\t21165000\t21172800\t0\t53\nchr15\t21174000\t21174300\t0\t54\nchr15\t21177300\t21188700\t0\t54\nchr15\t21189900\t21192900\t0\t54\nchr15\t21243300\t21244200\t0\t36\nchr15\t21247500\t21247800\t0.0867\t33\nchr15\t21275100\t21275700\t0\t39\nchr15\t21277200\t21281700\t0\t46\nchr15\t21283200\t21283500\t0\t46\nchr15\t21285000\t21285300\t0.0013\t38\nchr15\t21286500\t21291300\t0\t47\nchr15\t21293100\t21301500\t0\t62\nchr15\t21302700\t21314700\t0\t37\nchr15\t21316200\t21317100\t0\t37\nchr15\t21318600\t21319200\t0\t26\nchr15\t21323700\t21326100\t0\t39\nchr15\t21330000\t21331800\t0\t25\nchr15\t21333000\t21351300\t0\t57\nchr15\t21352500\t21354600\t0\t57\nchr15\t21356400\t21360600\t0\t57\nchr15\t21362400\t21362700\t0\t30\nchr15\t21364500\t21372300\t0\t46\nchr15\t21373500\t21378900\t0\t46\nchr15\t21381600\t21390600\t0\t65\nchr15\t21391800\t21396300\t0\t65\nchr15\t21398100\t21408600\t0\t60\nchr15\t21410400\t21413400\t0\t44\nchr15\t21415200\t21417000\t0\t44\nchr15\t21418200\t21419700\t0\t36\nchr15\t21420900\t21421200\t0\t30\nchr15\t21423300\t21424500\t0\t30\nchr15\t21426600\t21426900\t0.0275\t30\nchr15\t21429600\t21430200\t0\t31\nchr15\t21431400\t21432900\t0.055\t25\nchr15\t21434400\t21441300\t0\t43\nchr15\t21443400\t21445500\t0\t35\nchr15\t21447000\t21449100\t0\t35\nchr15\t21450900\t21456600\t0\t36\nchr15\t21458100\t21458400\t0.022\t30\nchr15\t21460200\t21469200\t0\t66\nchr15\t21471000\t21471900\t0\t66\nchr15\t21473100\t21474600\t0\t66\nchr15\t21476100\t21483000\t0\t66\nchr15\t21484800\t21486900\t0\t33\nchr15\t21488100\t21493500\t0\t36\nchr15\t21494700\t21509400\t0\t36\nchr15\t21510600\t21514500\t0\t24\nchr15\t21515700\t21516300\t0\t24\nchr15\t21517800\t21526200\t0\t24\nchr15\t21527400\t21529800\t0\t24\nchr15\t21539100\t21540300\t0.2484\t36\nchr15\t21542400\t21542700\t0.0041\t39\nchr15\t21543900\t21544200\t0.0041\t39\nchr15\t21546600\t21547200\t0.0134\t55\nchr15\t21551100\t21559800\t0\t32\nchr15\t21562200\t21565200\t0\t40\nchr15\t21567600\t21568200\t0\t40\nchr15\t21570300\t21573600\t0.0009\t35\nchr15\t21576300\t21578400\t0\t38\nchr15\t21580500\t21584400\t0\t38\nchr15\t21585600\t21586800\t0\t23\nchr15\t21588600\t21592200\t0\t55\nchr15\t21593400\t21593700\t0\t36\nchr15\t21594900\t21596400\t0\t36\nchr15\t21597900\t21598200\t0\t36\nchr15\t21601800\t21603300\t0\t33\nchr15\t21604500\t21608400\t0\t33\nchr15\t21610800\t21611100\t0.056\t28\nchr15\t21612600\t21612900\t0.0576\t18\nchr15\t21615000\t21616200\t0\t24\nchr15\t21617700\t21620400\t0.0058\t26\nchr15\t21624000\t21627300\t0\t33\nchr15\t21629100\t21630600\t0\t51\nchr15\t21631800\t21634200\t0\t51\nchr15\t21637800\t21640500\t0\t28\nchr15\t21641700\t21642000\t0.0318\t13\nchr15\t21644700\t21651900\t0\t41\nchr15\t21654300\t21747600\t0\t45\nchr15\t21749400\t21750300\t0\t37\nchr15\t21751500\t21763500\t0\t49\nchr15\t21764700\t21777000\t0\t41\nchr15\t21828900\t21839700\t0\t44\nchr15\t21840900\t21854100\t0\t40\nchr15\t21855600\t21858600\t0\t44\nchr15\t21859800\t21869700\t0\t44\nchr15\t21871500\t21889500\t0\t43\nchr15\t21891000\t21920400\t0\t43\nchr15\t21922200\t21924900\t0\t43\nchr15\t21926400\t21928500\t0\t43\nchr15\t21929700\t21940800\t0\t37\nchr15\t21942000\t21946500\t0\t37\nchr15\t21948000\t21951900\t0\t37\nchr15\t21953100\t21953400\t0\t37\nchr15\t21956100\t21963600\t0\t30\nchr15\t21964800\t21978300\t0\t47\nchr15\t21979800\t21986400\t0\t47\nchr15\t21988500\t21997500\t0\t58\nchr15\t21998700\t21999000\t0\t58\nchr15\t22000200\t22002900\t0\t35\nchr15\t22005900\t22035600\t0\t35\nchr15\t22037100\t22042800\t0\t27\nchr15\t22044900\t22048200\t0\t30\nchr15\t22050600\t22050900\t0\t14\nchr15\t22055400\t22056000\t0\t30\nchr15\t22057200\t22058400\t0\t30\nchr15\t22059900\t22079400\t0\t54\nchr15\t22080600\t22094700\t0\t39\nchr15\t22096500\t22101000\t0\t39\nchr15\t22102500\t22120200\t0\t27\nchr15\t22122600\t22124700\t0.0024\t21\nchr15\t22128300\t22190700\t0\t52\nchr15\t22192200\t22202100\t0\t52\nchr15\t22203300\t22218300\t0\t42\nchr15\t22219500\t22220400\t0\t42\nchr15\t22303800\t22305300\t0\t58\nchr15\t22306500\t22307100\t0\t49\nchr15\t22359300\t22365000\t0\t64\nchr15\t22366200\t22370400\t0\t64\nchr15\t22373100\t22383000\t0\t55\nchr15\t22384500\t22384800\t0.1\t34\nchr15\t22386000\t22386900\t0\t53\nchr15\t22390500\t22394700\t0\t48\nchr15\t22396500\t22405800\t0\t68\nchr15\t22408800\t22411500\t0\t53\nchr15\t22414800\t22416600\t0.0024\t54\nchr15\t22418100\t22418700\t0.0024\t54\nchr15\t22423500\t22436100\t0\t94\nchr15\t22437600\t22441200\t0\t107\nchr15\t22442700\t22443600\t0\t107\nchr15\t22445400\t22448400\t0\t107\nchr15\t22449900\t22451400\t0\t92\nchr15\t22453800\t22462800\t0\t92\nchr15\t22464900\t22465500\t0.1186\t77\nchr15\t22466700\t22476600\t0\t98\nchr15\t22477800\t22482300\t0\t98\nchr15\t22484100\t22485600\t0.038\t57\nchr15\t22487400\t22494000\t0\t87\nchr15\t22496400\t22496700\t0.1487\t42\nchr15\t22498200\t22499100\t0\t44\nchr15\t22500600\t22502700\t0.0153\t86\nchr15\t22503900\t22505100\t0.0738\t66\nchr15\t22508700\t22511700\t0\t70\nchr15\t22513800\t22515300\t0\t70\nchr15\t22516800\t22518300\t0\t70\nchr15\t22519500\t22529700\t0\t70\nchr15\t22531200\t22531500\t0\t75\nchr15\t22534200\t22539000\t0\t75\nchr15\t22540200\t22546200\t0\t75\nchr15\t22547700\t22549800\t0.0098\t71\nchr15\t22551300\t22551900\t0.0079\t59\nchr15\t22554000\t22557900\t0\t78\nchr15\t22560300\t22560600\t0.02\t53\nchr15\t22562100\t22563000\t0.0483\t68\nchr15\t22565700\t22568400\t0.0052\t82\nchr15\t22575600\t22577400\t0\t76\nchr15\t22578600\t22580400\t0\t76\nchr15\t22586400\t22587000\t0.018\t70\nchr15\t22588500\t22588800\t0.0171\t67\nchr15\t22593600\t22593900\t0.1487\t67\nchr15\t22602600\t22602900\t0.0145\t49\nchr15\t22605900\t22606200\t0.0749\t63\nchr15\t22609800\t22610100\t0.0307\t67\nchr15\t22673100\t22673400\t0.1243\t66\nchr15\t22676100\t22677600\t0.0653\t52\nchr15\t22704600\t22704900\t0.0952\t29\nchr15\t22770300\t22770600\t0.0054\t28\nchr15\t23124300\t23163000\t0\t101\nchr15\t23164200\t23173500\t0\t100\nchr15\t23178300\t23178600\t0.0341\t77\nchr15\t23182800\t23183400\t0\t66\nchr15\t23192100\t23192400\t0.2023\t103\nchr15\t23197500\t23198100\t0\t51\nchr15\t23199300\t23200200\t0.15\t138\nchr15\t23202000\t23202300\t0.1363\t60\nchr15\t23206500\t23206800\t0.0152\t83\nchr15\t23210100\t23210400\t0.0447\t68\nchr15\t23212500\t23212800\t0.1098\t77\nchr15\t23217600\t23218800\t0.0409\t100\nchr15\t23221500\t23221800\t0.2066\t50\nchr15\t23277000\t23294700\t0\t87\nchr15\t23296500\t23296800\t0.0437\t45\nchr15\t23299200\t23299500\t0.0422\t56\nchr15\t23303400\t23303700\t0.1532\t69\nchr15\t23313000\t23334000\t0\t94\nchr15\t23335200\t23357400\t0\t98\nchr15\t23358900\t23359200\t0.1229\t72\nchr15\t23363700\t23364000\t0.0399\t90\nchr15\t23428500\t23433900\t0\t71\nchr15\t23445000\t23445300\t0.089\t11\nchr15\t24134400\t24135000\t0.0002\t61\nchr15\t24138000\t24138600\t0.0207\t59\nchr15\t24191700\t24192300\t0.0057\t58\nchr15\t25758000\t25758600\t0.0241\t98\nchr15\t27852900\t27853200\t0.1756\t142\nchr15\t28202700\t28203300\t0.0054\t65\nchr15\t28205400\t28205700\t0.1991\t71\nchr15\t28213200\t28213500\t0.0468\t44\nchr15\t28322100\t28336200\t0\t104\nchr15\t28337400\t28372500\t0\t104\nchr15\t28374900\t28376100\t0\t106\nchr15\t28377300\t28415400\t0\t106\nchr15\t28417500\t28429500\t0\t145\nchr15\t28431000\t28437000\t0\t102\nchr15\t28438200\t28440000\t0\t102\nchr15\t28441200\t28445100\t0\t94\nchr15\t28446600\t28452000\t0\t94\nchr15\t28465500\t28470900\t0\t93\nchr15\t28472700\t28475400\t0\t73\nchr15\t28478700\t28479300\t0.0058\t74\nchr15\t28480800\t28484100\t0\t97\nchr15\t28485300\t28485900\t0\t97\nchr15\t28488600\t28488900\t0\t130\nchr15\t28490400\t28491300\t0\t130\nchr15\t28495800\t28496100\t0\t136\nchr15\t28497600\t28497900\t0\t136\nchr15\t28499100\t28505700\t0\t136\nchr15\t28507200\t28508400\t0\t54\nchr15\t28510500\t28510800\t0.037\t59\nchr15\t28512300\t28512900\t0.0033\t98\nchr15\t28515600\t28541100\t0\t114\nchr15\t28542300\t28542900\t0.0577\t56\nchr15\t28545000\t28545600\t0\t97\nchr15\t28546800\t28564200\t0\t97\nchr15\t28565700\t28568400\t0\t97\nchr15\t28569600\t28573200\t0\t97\nchr15\t28574700\t28581000\t0\t83\nchr15\t28582800\t28589400\t0\t83\nchr15\t28592400\t28596000\t0.0313\t73\nchr15\t28597500\t28598100\t0.0313\t73\nchr15\t28599300\t28600200\t0.0299\t66\nchr15\t28603800\t28605600\t0\t71\nchr15\t28608600\t28609500\t0.0029\t54\nchr15\t28614900\t28628100\t0\t70\nchr15\t28629600\t28633200\t0\t70\nchr15\t28635900\t28638900\t0\t75\nchr15\t28640700\t28641000\t0\t75\nchr15\t28642200\t28644600\t0\t62\nchr15\t28646100\t28646400\t0.0199\t53\nchr15\t28649100\t28651800\t0\t93\nchr15\t28654800\t28655100\t0.0581\t48\nchr15\t28658400\t28658700\t0.1973\t42\nchr15\t28659900\t28661700\t0\t62\nchr15\t28662900\t28664100\t0.0023\t74\nchr15\t28665300\t28665600\t0.189\t75\nchr15\t28670100\t28674600\t0\t75\nchr15\t28679700\t28681500\t0\t64\nchr15\t28682700\t28683300\t0\t64\nchr15\t28697100\t28697400\t0.0291\t59\nchr15\t28747800\t28748100\t0.1696\t59\nchr15\t30082800\t30089400\t0\t104\nchr15\t30090900\t30091200\t0\t104\nchr15\t30097200\t30103500\t0\t85\nchr15\t30105300\t30108300\t0\t85\nchr15\t30110100\t30119400\t0\t76\nchr15\t30120600\t30122400\t0\t76\nchr15\t30125400\t30135900\t0\t93\nchr15\t30137700\t30139800\t0\t93\nchr15\t30141600\t30142200\t0\t68\nchr15\t30143700\t30144600\t0\t68\nchr15\t30146100\t30147900\t0\t68\nchr15\t30150000\t30150300\t0.134\t69\nchr15\t30152400\t30153000\t0.0782\t59\nchr15\t30158400\t30160800\t0\t53\nchr15\t30163500\t30172500\t0\t61\nchr15\t30173700\t30174900\t0.0354\t51\nchr15\t30177000\t30180600\t0\t64\nchr15\t30183600\t30189300\t0\t58\nchr15\t30190500\t30191100\t0.0137\t47\nchr15\t30193500\t30195600\t0\t47\nchr15\t30197700\t30200400\t0\t51\nchr15\t30202200\t30207900\t0\t51\nchr15\t30210000\t30210300\t0\t51\nchr15\t30212700\t30224100\t0\t66\nchr15\t30225900\t30227400\t0\t37\nchr15\t30229200\t30237600\t0\t82\nchr15\t30238800\t30245400\t0\t82\nchr15\t30246600\t30247200\t0.0182\t30\nchr15\t30248400\t30248700\t0\t60\nchr15\t30249900\t30252300\t0\t60\nchr15\t30253800\t30254700\t0\t47\nchr15\t30255900\t30256200\t0.1702\t21\nchr15\t30257400\t30261000\t0\t60\nchr15\t30262200\t30291000\t0\t60\nchr15\t30292200\t30302400\t0\t55\nchr15\t30303600\t30317700\t0\t60\nchr15\t30319200\t30321300\t0\t49\nchr15\t30323400\t30325200\t0\t49\nchr15\t30326700\t30327000\t0.0097\t48\nchr15\t30328800\t30329100\t0\t52\nchr15\t30330600\t30333300\t0\t52\nchr15\t30334500\t30334800\t0.0095\t40\nchr15\t30336000\t30341100\t0\t57\nchr15\t30342900\t30344100\t0.0339\t71\nchr15\t30348000\t30354900\t0\t52\nchr15\t30356700\t30366600\t0\t71\nchr15\t30367800\t30370800\t0\t57\nchr15\t30374100\t30374400\t0.1125\t54\nchr15\t30376200\t30407400\t0\t96\nchr15\t30408600\t30438000\t0\t96\nchr15\t30439200\t30442200\t0\t96\nchr15\t30445800\t30453900\t0\t55\nchr15\t30455400\t30457800\t0\t55\nchr15\t30459000\t30477300\t0\t55\nchr15\t30480300\t30483300\t0\t46\nchr15\t30494100\t30503400\t0\t64\nchr15\t30506700\t30511200\t0\t54\nchr15\t30513300\t30515100\t0\t48\nchr15\t30516600\t30519300\t0\t48\nchr15\t30520500\t30520800\t0\t48\nchr15\t30523200\t30525900\t0.0359\t62\nchr15\t30528000\t30558900\t0\t96\nchr15\t30561000\t30567000\t0\t96\nchr15\t30568200\t30585000\t0\t79\nchr15\t30586200\t30587700\t0\t80\nchr15\t30590700\t30591600\t0\t80\nchr15\t30594900\t30595500\t0\t71\nchr15\t30598200\t30602400\t0\t75\nchr15\t30604500\t30604800\t0.0275\t80\nchr15\t30607200\t30607500\t0.0299\t72\nchr15\t30610800\t30611100\t0.0315\t61\nchr15\t30640200\t30640500\t0.0549\t63\nchr15\t30652800\t30653100\t0.1413\t48\nchr15\t30681600\t30681900\t0.1024\t67\nchr15\t30693000\t30693300\t0.2152\t69\nchr15\t30699300\t30700800\t0\t68\nchr15\t30703500\t30703800\t0.2091\t51\nchr15\t30751500\t30751800\t0.0428\t56\nchr15\t30755400\t30755700\t0.1171\t55\nchr15\t31511400\t31511700\t0.0627\t28\nchr15\t31650000\t31650300\t0.0981\t55\nchr15\t31653900\t31654200\t0.1252\t58\nchr15\t31692000\t31692300\t0.0084\t58\nchr15\t31696200\t31696500\t0.125\t59\nchr15\t31701900\t31702200\t0.1716\t59\nchr15\t31704000\t31704300\t0\t84\nchr15\t31705800\t31707300\t0\t84\nchr15\t31712400\t31712700\t0.2852\t50\nchr15\t31723500\t31724100\t0.1813\t57\nchr15\t32154000\t32154600\t0\t55\nchr15\t32156400\t32156700\t0\t55\nchr15\t32157900\t32158200\t0\t74\nchr15\t32159700\t32165400\t0\t74\nchr15\t32168400\t32173500\t0\t50\nchr15\t32175000\t32176800\t0\t64\nchr15\t32178300\t32178600\t0\t64\nchr15\t32180100\t32183100\t0\t64\nchr15\t32186700\t32187000\t0.0097\t72\nchr15\t32188800\t32195700\t0\t61\nchr15\t32196900\t32200200\t0\t61\nchr15\t32202600\t32206800\t0\t61\nchr15\t32208900\t32214900\t0\t62\nchr15\t32226600\t32238900\t0\t58\nchr15\t32240400\t32240700\t0\t58\nchr15\t32242500\t32246400\t0\t58\nchr15\t32248500\t32251200\t0\t55\nchr15\t32252400\t32259300\t0\t61\nchr15\t32260800\t32271300\t0\t61\nchr15\t32272500\t32278200\t0\t61\nchr15\t32280300\t32290200\t0\t56\nchr15\t32291700\t32292300\t0\t61\nchr15\t32293500\t32309700\t0\t61\nchr15\t32311200\t32312400\t0.0211\t60\nchr15\t32314500\t32314800\t0.1334\t46\nchr15\t32316600\t32320800\t0\t62\nchr15\t32322000\t32323200\t0\t62\nchr15\t32324400\t32325300\t0\t54\nchr15\t32328300\t32328600\t0.048\t35\nchr15\t32331000\t32335800\t0\t59\nchr15\t32338500\t32339400\t0\t51\nchr15\t32340600\t32340900\t0\t51\nchr15\t32343300\t32346000\t0\t50\nchr15\t32347500\t32348100\t0.0036\t44\nchr15\t32349300\t32355600\t0\t69\nchr15\t32358000\t32362500\t0\t60\nchr15\t32363700\t32372100\t0\t65\nchr15\t32373300\t32374800\t0\t65\nchr15\t32377500\t32379900\t0\t60\nchr15\t32382600\t32382900\t0.0022\t39\nchr15\t32385600\t32385900\t0.087\t54\nchr15\t32389200\t32394000\t0\t85\nchr15\t32396100\t32396400\t0\t85\nchr15\t32399100\t32404800\t0\t92\nchr15\t32406600\t32407200\t0.0042\t70\nchr15\t32408400\t32409600\t0\t77\nchr15\t32410800\t32412900\t0.0065\t56\nchr15\t32416200\t32418000\t0\t81\nchr15\t32419500\t32420100\t0\t81\nchr15\t32422800\t32425800\t0\t66\nchr15\t32427000\t32430600\t0\t62\nchr15\t32432400\t32439600\t0\t82\nchr15\t32441700\t32450400\t0\t110\nchr15\t32451900\t32458500\t0\t87\nchr15\t32460000\t32464800\t0\t87\nchr15\t32466300\t32479800\t0\t87\nchr15\t32481300\t32484600\t0\t87\nchr15\t32485800\t32486400\t0\t58\nchr15\t32487600\t32491200\t0\t58\nchr15\t32492700\t32500800\t0\t58\nchr15\t32504100\t32513400\t0\t58\nchr15\t32524500\t32545500\t0\t56\nchr15\t32546700\t32551500\t0\t55\nchr15\t32552700\t32562000\t0\t55\nchr15\t32563500\t32564400\t0\t63\nchr15\t32565600\t32572800\t0\t63\nchr15\t32576700\t32578200\t0\t74\nchr15\t32579700\t32585700\t0\t74\nchr15\t32587200\t32606400\t0\t74\nchr15\t32630100\t32630400\t0.0579\t56\nchr15\t34381800\t34385400\t0\t81\nchr15\t34387200\t34392600\t0\t85\nchr15\t34393800\t34397100\t0\t85\nchr15\t34399500\t34408500\t0\t85\nchr15\t34410000\t34410300\t0.0021\t63\nchr15\t34413000\t34416900\t0\t75\nchr15\t34419300\t34419600\t0.0139\t85\nchr15\t34422000\t34422600\t0.0005\t78\nchr15\t34523700\t34524000\t0.1112\t24\nchr15\t34527900\t34558800\t0\t80\nchr15\t34560300\t34563300\t0\t80\nchr15\t34565100\t34567200\t0\t79\nchr15\t34568400\t34568700\t0.0031\t62\nchr15\t34570500\t34571100\t0.1148\t51\nchr15\t34716900\t34717200\t0.2083\t57\nchr15\t36199200\t36199500\t0.1263\t76\nchr15\t36683400\t36683700\t0.013\t53\nchr15\t37430100\t37430400\t0.1018\t90\nchr15\t37515000\t37515300\t0.1829\t48\nchr15\t38787300\t38787600\t0.1148\t47\nchr15\t38974800\t38975100\t0.2043\t15\nchr15\t39421800\t39423600\t0.0216\t100\nchr15\t39424800\t39425100\t0.0216\t100\nchr15\t39522900\t39523200\t0.1763\t59\nchr15\t40681800\t40684200\t0.0075\t57\nchr15\t41382300\t41384100\t0.0484\t107\nchr15\t43561500\t43596300\t0\t81\nchr15\t43599600\t43599900\t0.0334\t55\nchr15\t43605600\t43606200\t0\t73\nchr15\t43610400\t43619100\t0\t89\nchr15\t43642500\t43642800\t0.0971\t49\nchr15\t43661100\t43696200\t0\t81\nchr15\t43699500\t43699800\t0.1456\t65\nchr15\t43705200\t43705800\t0\t71\nchr15\t43709700\t43718700\t0\t81\nchr15\t44253300\t44257200\t0\t104\nchr15\t44823900\t44826900\t0\t80\nchr15\t44922900\t44923200\t0.1014\t50\nchr15\t44936400\t44936700\t0.0814\t76\nchr15\t45031800\t45032100\t0.0398\t53\nchr15\t45072000\t45072300\t0\t47\nchr15\t45074700\t45076800\t0\t76\nchr15\t45598500\t45599400\t0.0008\t71\nchr15\t46107000\t46107300\t0.0961\t61\nchr15\t46368600\t46368900\t0.1938\t47\nchr15\t46746000\t46746300\t0.1709\t105\nchr15\t46748100\t46748400\t0.1353\t75\nchr15\t46998300\t46998900\t0.0076\t67\nchr15\t47133600\t47134200\t0.0728\t60\nchr15\t47170200\t47170500\t0.1953\t56\nchr15\t49356600\t49356900\t0.0694\t77\nchr15\t49398600\t49400400\t0.0046\t77\nchr15\t51174900\t51176700\t0.0619\t95\nchr15\t51178500\t51178800\t0.0619\t95\nchr15\t51417600\t51423000\t0\t85\nchr15\t51583500\t51585000\t0\t41\nchr15\t52233000\t52233300\t0\t18\nchr15\t52907100\t52908000\t0.0082\t43\nchr15\t53136900\t53139000\t0\t94\nchr15\t53156100\t53157000\t0\t63\nchr15\t53495100\t53495700\t0.0242\t77\nchr15\t53541600\t53542800\t0.1294\t84\nchr15\t54926100\t54932100\t0\t121\nchr15\t55068300\t55068600\t0.0837\t64\nchr15\t55987200\t55987800\t0.0034\t62\nchr15\t56311500\t56313000\t0.0787\t119\nchr15\t56575800\t56576100\t0.1565\t72\nchr15\t57687900\t57688200\t0.061\t20\nchr15\t58126500\t58127100\t0.0111\t81\nchr15\t58129200\t58129500\t0.0387\t71\nchr15\t58131000\t58131300\t0.0387\t71\nchr15\t59420700\t59421000\t0\t21\nchr15\t60367800\t60368100\t0.1586\t24\nchr15\t60816300\t60816600\t0.0718\t21\nchr15\t61899000\t61899300\t0.1187\t72\nchr15\t64327800\t64331700\t0.0716\t102\nchr15\t66450000\t66452100\t0\t73\nchr15\t68133900\t68136000\t0\t30\nchr15\t68691300\t68691600\t0.17\t20\nchr15\t70729800\t70735200\t0\t87\nchr15\t71095500\t71095800\t0.2187\t53\nchr15\t71175000\t71179800\t0\t93\nchr15\t71593200\t71593500\t0.2442\t36\nchr15\t71769300\t71769600\t0.0654\t72\nchr15\t71907300\t71907600\t0.1512\t63\nchr15\t72631800\t72632400\t0.0012\t66\nchr15\t72634800\t72636300\t0\t136\nchr15\t72637500\t72663300\t0\t136\nchr15\t72665400\t72668700\t0.0057\t102\nchr15\t73219500\t73219800\t0.0949\t76\nchr15\t73512300\t73512600\t0.0215\t78\nchr15\t73533000\t73533300\t0.0238\t81\nchr15\t74068800\t74070600\t0\t145\nchr15\t74073900\t74092200\t0\t158\nchr15\t74093700\t74098800\t0\t89\nchr15\t74100900\t74101800\t0\t89\nchr15\t74103600\t74105400\t0.0009\t68\nchr15\t74977200\t74977500\t0.0438\t19\nchr15\t75255900\t75268800\t0\t147\nchr15\t75270600\t75272400\t0\t147\nchr15\t75276600\t75295200\t0\t134\nchr15\t75480900\t75481200\t0.1983\t67\nchr15\t75702900\t75703200\t0.0784\t55\nchr15\t75708000\t75708300\t0.1157\t60\nchr15\t77618400\t77618700\t0.1664\t260\nchr15\t77883000\t77883300\t0.0744\t58\nchr15\t77948400\t77948700\t0.0715\t73\nchr15\t77949900\t77950200\t0\t86\nchr15\t77952300\t77952900\t0\t86\nchr15\t78742800\t78746100\t0\t72\nchr15\t78747300\t78747600\t0.0502\t34\nchr15\t79273200\t79275300\t0.1157\t94\nchr15\t79648800\t79649100\t0.0739\t74\nchr15\t81091500\t81091800\t0.079\t49\nchr15\t81655800\t81656100\t0.1239\t63\nchr15\t81669000\t81669300\t0.061\t74\nchr15\t81671400\t81671700\t0.061\t74\nchr15\t81699900\t81701100\t0.1251\t75\nchr15\t81799200\t81799500\t0.0528\t82\nchr15\t81801900\t81803400\t0.0368\t90\nchr15\t81996300\t81997500\t0.0239\t90\nchr15\t81999300\t82000200\t0.0239\t90\nchr15\t82242600\t82243500\t0\t72\nchr15\t82250100\t82250400\t0.1592\t73\nchr15\t82318800\t82319400\t0.002\t69\nchr15\t82320600\t82320900\t0\t68\nchr15\t82322400\t82324200\t0\t68\nchr15\t82329300\t82331100\t0\t44\nchr15\t82341300\t82341900\t0\t89\nchr15\t82348800\t82352100\t0\t75\nchr15\t82355400\t82360500\t0.0007\t62\nchr15\t82361700\t82364700\t0\t69\nchr15\t82366500\t82367100\t0\t69\nchr15\t82421700\t82423800\t0\t86\nchr15\t82425300\t82426800\t0\t86\nchr15\t82428600\t82428900\t0\t86\nchr15\t82430100\t82431600\t0\t73\nchr15\t82433700\t82434000\t0.0858\t90\nchr15\t82435800\t82436100\t0.0858\t90\nchr15\t82437300\t82438800\t0.0757\t74\nchr15\t82440300\t82448700\t0\t107\nchr15\t82450200\t82452600\t0\t93\nchr15\t82455000\t82471800\t0\t141\nchr15\t82485000\t82487100\t0\t46\nchr15\t82489500\t82491900\t0.1002\t56\nchr15\t82493400\t82497300\t0\t74\nchr15\t82502100\t82506600\t0\t65\nchr15\t82508700\t82523100\t0\t77\nchr15\t82883100\t82888800\t0\t77\nchr15\t82990200\t82990500\t0.0062\t50\nchr15\t82998600\t82998900\t0.035\t77\nchr15\t83386200\t83386800\t0.0745\t82\nchr15\t83451000\t83456100\t0\t75\nchr15\t84099600\t84101100\t0\t66\nchr15\t84165900\t84173100\t0\t81\nchr15\t84174300\t84197400\t0\t81\nchr15\t84198900\t84246300\t0\t84\nchr15\t84247800\t84252000\t0\t38\nchr15\t84253200\t84270000\t0\t43\nchr15\t84320100\t84360300\t0\t77\nchr15\t84362100\t84384000\t0\t52\nchr15\t84403800\t84425400\t0\t110\nchr15\t84426600\t84474300\t0\t96\nchr15\t84476100\t84493800\t0\t75\nchr15\t84495000\t84516600\t0\t95\nchr15\t84519900\t84522000\t0\t79\nchr15\t84523200\t84525300\t0\t66\nchr15\t84564300\t84564600\t0.1583\t40\nchr15\t85188900\t85192500\t0\t153\nchr15\t85193700\t85200900\t0\t153\nchr15\t85202100\t85224300\t0\t153\nchr15\t85226100\t85229700\t0\t82\nchr15\t85231500\t85232100\t0\t82\nchr15\t85233300\t85233600\t0\t82\nchr15\t85237800\t85238400\t0.0088\t66\nchr15\t85240800\t85241100\t0\t107\nchr15\t85242300\t85242900\t0\t107\nchr15\t85265700\t85267200\t0.011\t76\nchr15\t85270500\t85271100\t0.0043\t68\nchr15\t85435500\t85436400\t0.081\t68\nchr15\t85881900\t85882200\t0.2256\t100\nchr15\t86528700\t86529300\t0.0177\t90\nchr15\t86531100\t86531700\t0.0024\t71\nchr15\t87000000\t87001200\t0.1134\t65\nchr15\t87510600\t87515700\t0\t96\nchr15\t88855800\t88856700\t0\t130\nchr15\t88941000\t88942500\t0.0017\t78\nchr15\t89637000\t89637300\t0.1499\t78\nchr15\t89639400\t89639700\t0.0974\t49\nchr15\t89853600\t89853900\t0.1086\t81\nchr15\t91763100\t91763400\t0.0205\t71\nchr15\t93678900\t93679800\t0.013\t88\nchr15\t97266000\t97268100\t0\t41\nchr15\t97270500\t97270800\t0.1382\t18\nchr15\t98089200\t98089500\t0.027\t62\nchr15\t99013800\t99014100\t0.057\t69\nchr15\t100422000\t100422600\t0.0474\t57\nchr15\t100557300\t100557600\t0.2726\t23\nchr15\t100719300\t100720200\t0\t60\nchr15\t101311800\t101312100\t0.2267\t22\nchr15\t101627400\t101627700\t0.1895\t35\nchr15\t101630100\t101630700\t0.133\t96\nchr15\t101745600\t101747100\t0.0732\t62\nchr15\t101752800\t101753700\t0.0496\t122\nchr15\t101754900\t101762700\t0\t148\nchr15\t101860200\t101860500\t0.0281\t76\nchr15\t101862000\t101862300\t0\t34\nchr15\t101863800\t101864100\t0.0626\t84\nchr15\t101868900\t101869200\t0.0212\t71\nchr15\t101873100\t101873400\t0.0081\t84\nchr15\t101893500\t101893800\t0.1042\t86\nchr15\t101896500\t101897400\t0\t52\nchr15\t101911200\t101912700\t0.0101\t61\nchr15\t101918400\t101918700\t0.035\t79\nchr15\t101921100\t101921400\t0.1487\t61\nchr15\t101922600\t101923200\t0.0217\t83\nchr15\t101926200\t101928000\t0\t80\nchr15\t101929500\t101932200\t0\t92\nchr15\t101933400\t101934900\t0\t92\nchr15\t101937000\t101937900\t0\t92\nchr15\t101939700\t101940300\t0.0152\t80\nchr15\t101943000\t101944500\t0\t117\nchr15\t101948700\t101949000\t0.0611\t115\nchr15\t101950200\t101953500\t0.0017\t115\nchr15\t101954700\t101955000\t0.0668\t104\nchr15\t101956200\t101961900\t0\t141\nchr15\t101963400\t101963700\t0.0811\t171\nchr15\t101969100\t101969700\t0.0608\t148\nchr15\t101971800\t101972400\t0.0148\t120\nchr15\t101976600\t101976900\t0.0736\t159\nchr15\t101978100\t101979900\t0\t109\nchr16\t14700\t16800\t0\t148\nchr16\t20100\t21600\t0.001\t70\nchr16\t25500\t26700\t0.0452\t63\nchr16\t28800\t29400\t0.0172\t67\nchr16\t153600\t153900\t0.0066\t66\nchr16\t164100\t164700\t0.0017\t53\nchr16\t172500\t173100\t0\t35\nchr16\t458400\t458700\t0.2609\t175\nchr16\t481800\t482100\t0.259\t55\nchr16\t585000\t585300\t0.1015\t21\nchr16\t599700\t600000\t0.1702\t77\nchr16\t846900\t847200\t0.2419\t501\nchr16\t953700\t954000\t0.2527\t39\nchr16\t960900\t962100\t0\t91\nchr16\t1228800\t1229400\t0.0084\t60\nchr16\t1231800\t1232700\t0\t68\nchr16\t1234200\t1237800\t0.0015\t68\nchr16\t1241700\t1242000\t0.0034\t64\nchr16\t1248600\t1250100\t0.0021\t61\nchr16\t1251900\t1252500\t0.066\t61\nchr16\t1253700\t1254600\t0\t66\nchr16\t1599000\t1599300\t0.23\t55\nchr16\t2543100\t2543400\t0.0002\t63\nchr16\t2547300\t2551200\t0\t72\nchr16\t2554500\t2557800\t0\t74\nchr16\t2561400\t2562000\t0\t80\nchr16\t2563200\t2575500\t0\t80\nchr16\t2578800\t2579100\t0\t69\nchr16\t2580600\t2584200\t0\t69\nchr16\t2607000\t2609400\t0\t84\nchr16\t2612400\t2613900\t0\t81\nchr16\t2616000\t2621400\t0\t69\nchr16\t2624700\t2638800\t0\t73\nchr16\t2642400\t2645700\t0\t73\nchr16\t2650800\t2654700\t0\t87\nchr16\t2658000\t2658300\t0.0019\t73\nchr16\t2679000\t2679300\t0.0326\t67\nchr16\t2686200\t2686800\t0.0055\t94\nchr16\t2688600\t2689500\t0\t71\nchr16\t2694600\t2696100\t0\t85\nchr16\t3886800\t3887100\t0.1546\t83\nchr16\t5754600\t5755200\t0.0229\t89\nchr16\t7008900\t7009200\t0.1654\t112\nchr16\t8058000\t8060100\t0\t84\nchr16\t8953800\t8954100\t0.0121\t32\nchr16\t9584700\t9590100\t0\t83\nchr16\t11928300\t11931000\t0\t88\nchr16\t11939700\t11940000\t0.0555\t70\nchr16\t14688300\t14768400\t0\t103\nchr16\t14773500\t14774100\t0.0295\t69\nchr16\t14776500\t14777100\t0\t80\nchr16\t14780400\t14783700\t0\t81\nchr16\t14785200\t14786700\t0\t81\nchr16\t14788200\t14788500\t0\t81\nchr16\t14789700\t14800200\t0\t83\nchr16\t14801700\t14802000\t0.0946\t56\nchr16\t14803200\t14803800\t0.0169\t64\nchr16\t14808300\t14810400\t0.0143\t73\nchr16\t14813100\t14813400\t0.0783\t53\nchr16\t14819400\t14820000\t0\t63\nchr16\t14826600\t14827200\t0.0038\t77\nchr16\t14833800\t14834400\t0.0158\t60\nchr16\t14837700\t14838000\t0.0638\t57\nchr16\t14840100\t14840400\t0.0299\t68\nchr16\t14844600\t14844900\t0.0299\t68\nchr16\t14846400\t14847600\t0\t68\nchr16\t14848800\t14849400\t0\t68\nchr16\t14853000\t14853300\t0.203\t69\nchr16\t14857800\t14858100\t0.1174\t64\nchr16\t14863500\t14864100\t0.01\t81\nchr16\t14872200\t14872800\t0.1178\t72\nchr16\t14881800\t14882400\t0.0151\t50\nchr16\t14896500\t14897100\t0.0098\t65\nchr16\t14898600\t14899200\t0\t73\nchr16\t14905500\t14912700\t0\t88\nchr16\t14916300\t14922300\t0\t97\nchr16\t14923800\t14924400\t0\t97\nchr16\t14925600\t14930400\t0\t97\nchr16\t14933400\t14934600\t0.007\t88\nchr16\t14935800\t14937600\t0.0098\t94\nchr16\t14938800\t14943600\t0.0004\t95\nchr16\t14945700\t14946300\t0.007\t80\nchr16\t14948700\t14953200\t0\t101\nchr16\t15103800\t15104100\t0.0059\t53\nchr16\t15105300\t15105600\t0.0498\t90\nchr16\t15108600\t15108900\t0.0458\t64\nchr16\t15112800\t15114000\t0\t95\nchr16\t15115500\t15118500\t0\t95\nchr16\t15120000\t15121800\t0\t95\nchr16\t15123600\t15123900\t0.0771\t75\nchr16\t15138300\t15139500\t0\t84\nchr16\t15150600\t15151200\t0\t67\nchr16\t15152400\t15153300\t0\t67\nchr16\t15155700\t15156000\t0.0143\t69\nchr16\t15166200\t15166800\t0.0558\t72\nchr16\t15179100\t15179400\t0.0101\t61\nchr16\t15183600\t15183900\t0\t72\nchr16\t15185100\t15185700\t0\t72\nchr16\t15186900\t15188400\t0\t72\nchr16\t15195900\t15196200\t0.0928\t65\nchr16\t15197700\t15198000\t0.0007\t66\nchr16\t15200100\t15200400\t0.0007\t66\nchr16\t15208200\t15208800\t0.0287\t62\nchr16\t15210600\t15213600\t0.0077\t68\nchr16\t15215400\t15215700\t0.0077\t68\nchr16\t15222000\t15222300\t0.1207\t74\nchr16\t15224400\t15226800\t0\t76\nchr16\t15234600\t15235200\t0.0289\t68\nchr16\t15236400\t15241800\t0\t82\nchr16\t15243000\t15244200\t0\t78\nchr16\t15245700\t15256800\t0\t78\nchr16\t15258300\t15261900\t0\t78\nchr16\t15266100\t15266700\t0.0344\t46\nchr16\t15268800\t15269100\t0.086\t74\nchr16\t15273000\t15273600\t0\t88\nchr16\t15276600\t15276900\t0.0789\t67\nchr16\t15279600\t15280500\t0.0339\t72\nchr16\t15295500\t15297300\t0.0208\t74\nchr16\t15310200\t15310500\t0.0206\t58\nchr16\t15315600\t15315900\t0.1591\t70\nchr16\t15320100\t15320400\t0\t70\nchr16\t15325200\t15325800\t0.0124\t68\nchr16\t15328800\t15340800\t0\t103\nchr16\t15342000\t15349200\t0\t103\nchr16\t15350700\t15356400\t0\t103\nchr16\t15357900\t15366600\t0\t103\nchr16\t15367800\t15368100\t0.0195\t71\nchr16\t15369600\t15369900\t0.1143\t89\nchr16\t15373500\t15375000\t0.0568\t78\nchr16\t15378600\t15378900\t0.0139\t81\nchr16\t16218300\t16218900\t0.0083\t63\nchr16\t16225500\t16226100\t0\t63\nchr16\t16232700\t16233900\t0.015\t70\nchr16\t16239600\t16239900\t0.0714\t44\nchr16\t16244400\t16248000\t0\t77\nchr16\t16250700\t16251000\t0.0273\t56\nchr16\t16252500\t16254000\t0.0273\t56\nchr16\t16256400\t16257300\t0.0004\t71\nchr16\t16259700\t16260300\t0\t58\nchr16\t16261800\t16262400\t0.0131\t58\nchr16\t16263600\t16264500\t0.0171\t69\nchr16\t16270500\t16357500\t0\t111\nchr16\t16359300\t16362600\t0\t74\nchr16\t16364100\t16364700\t0.0016\t46\nchr16\t16368300\t16370700\t0\t89\nchr16\t16372500\t16386300\t0\t83\nchr16\t16387500\t16404300\t0\t99\nchr16\t16405500\t16418700\t0\t99\nchr16\t16421700\t16422000\t0.0039\t67\nchr16\t16423200\t16423500\t0.0039\t67\nchr16\t16426500\t16429800\t0\t91\nchr16\t16431000\t16431300\t0.0597\t59\nchr16\t16433700\t16434000\t0.0298\t68\nchr16\t16435800\t16437900\t0.0298\t68\nchr16\t16439700\t16441200\t0.0371\t68\nchr16\t16442400\t16443000\t0.0371\t68\nchr16\t16444500\t16445700\t0.0032\t81\nchr16\t16450500\t16450800\t0.0813\t58\nchr16\t16455300\t16456200\t0.0994\t73\nchr16\t16458600\t16460400\t0\t80\nchr16\t16464600\t16465200\t0.0063\t54\nchr16\t16475400\t16477500\t0.0694\t69\nchr16\t16479300\t16479600\t0.0137\t63\nchr16\t16482900\t16483800\t0\t65\nchr16\t16486200\t16488000\t0.0054\t61\nchr16\t16489500\t16490100\t0\t68\nchr16\t16493700\t16528500\t0\t86\nchr16\t16531200\t16534500\t0\t59\nchr16\t16557300\t16557900\t0.0459\t69\nchr16\t16559700\t16560000\t0.0627\t70\nchr16\t16565400\t16567500\t0\t69\nchr16\t16589700\t16590000\t0.005\t48\nchr16\t16592400\t16592700\t0.0203\t40\nchr16\t16595100\t16595400\t0.0716\t68\nchr16\t16604700\t16605000\t0.1116\t74\nchr16\t16614900\t16615200\t0.0431\t49\nchr16\t16616700\t16617300\t0\t54\nchr16\t16620900\t16621800\t0.058\t63\nchr16\t16623900\t16624200\t0.1416\t65\nchr16\t16626000\t16626300\t0.0009\t29\nchr16\t16639500\t16642800\t0\t66\nchr16\t16646700\t16650600\t0\t74\nchr16\t16656300\t16656900\t0.0055\t65\nchr16\t16659300\t16662600\t0\t78\nchr16\t16664400\t16683600\t0\t74\nchr16\t16684800\t16686300\t0.0248\t71\nchr16\t16688400\t16689300\t0.0635\t51\nchr16\t16690800\t16691700\t0\t81\nchr16\t16694400\t16699500\t0\t77\nchr16\t16701000\t16702500\t0\t75\nchr16\t16704600\t16735200\t0\t75\nchr16\t16737300\t16737600\t0.1306\t60\nchr16\t16758000\t16758900\t0.0516\t67\nchr16\t16840800\t16846200\t0\t91\nchr16\t18077400\t18078300\t0.0126\t54\nchr16\t18090600\t18091200\t0.1442\t56\nchr16\t18095100\t18097500\t0\t66\nchr16\t18098700\t18099600\t0\t66\nchr16\t18101100\t18101400\t0.1613\t60\nchr16\t18105300\t18105600\t0.0458\t59\nchr16\t18107400\t18107700\t0.0334\t63\nchr16\t18109200\t18113100\t0.0133\t68\nchr16\t18120000\t18120300\t0.007\t59\nchr16\t18122100\t18126300\t0\t65\nchr16\t18131100\t18131400\t0.0611\t66\nchr16\t18133500\t18133800\t0\t73\nchr16\t18135000\t18138600\t0\t73\nchr16\t18146100\t18147300\t0\t71\nchr16\t18154500\t18155100\t0.0567\t56\nchr16\t18178800\t18179100\t0.0542\t74\nchr16\t18183600\t18183900\t0.0096\t74\nchr16\t18185100\t18185700\t0.0096\t74\nchr16\t18186900\t18189600\t0\t63\nchr16\t18193200\t18193800\t0.1008\t93\nchr16\t18205500\t18205800\t0.0972\t74\nchr16\t18225600\t18226200\t0.0183\t65\nchr16\t18228300\t18229500\t0\t65\nchr16\t18239100\t18240300\t0.0608\t59\nchr16\t18246900\t18247200\t0\t58\nchr16\t18251400\t18255000\t0\t78\nchr16\t18256500\t18256800\t0.074\t49\nchr16\t18264900\t18266400\t0.055\t60\nchr16\t18268200\t18273300\t0\t76\nchr16\t18274800\t18278100\t0\t76\nchr16\t18280500\t18280800\t0\t62\nchr16\t18282000\t18285900\t0\t62\nchr16\t18288900\t18291000\t0.0211\t73\nchr16\t18293400\t18304800\t0\t80\nchr16\t18306600\t18340200\t0\t100\nchr16\t18342300\t18347700\t0\t100\nchr16\t18348900\t18354000\t0\t96\nchr16\t18355200\t18382500\t0\t107\nchr16\t18384000\t18393000\t0\t81\nchr16\t18394800\t18435900\t0\t81\nchr16\t18486600\t18524100\t0\t79\nchr16\t18530100\t18531000\t0.0485\t95\nchr16\t18534600\t18535200\t0.0133\t56\nchr16\t18537600\t18538200\t0.0377\t59\nchr16\t18542700\t18543000\t0.0257\t67\nchr16\t18545700\t18547200\t0\t61\nchr16\t18549600\t18550200\t0.0601\t63\nchr16\t18551400\t18552600\t0.1213\t71\nchr16\t18554700\t18556200\t0.0142\t56\nchr16\t18600300\t18600600\t0.1043\t57\nchr16\t18603000\t18603300\t0.1615\t70\nchr16\t18624000\t18648600\t0\t84\nchr16\t18649800\t18654600\t0\t84\nchr16\t18655800\t18658200\t0\t84\nchr16\t18660000\t18663900\t0\t71\nchr16\t18667200\t18668400\t0\t70\nchr16\t18672600\t18673200\t0\t76\nchr16\t18675600\t18678900\t0\t76\nchr16\t18680100\t18687900\t0\t71\nchr16\t18689400\t18691800\t0\t72\nchr16\t18693000\t18694200\t0\t72\nchr16\t18696600\t18697200\t0\t77\nchr16\t18699000\t18699600\t0\t66\nchr16\t18702300\t18702600\t0.0075\t64\nchr16\t18705600\t18705900\t0.1123\t34\nchr16\t18707400\t18713400\t0\t76\nchr16\t18716700\t18719700\t0\t65\nchr16\t18720900\t18722400\t0.034\t36\nchr16\t18729000\t18729600\t0\t54\nchr16\t18736500\t18736800\t0.108\t72\nchr16\t18740400\t18740700\t0.081\t44\nchr16\t18761100\t18761400\t0.0162\t54\nchr16\t18763800\t18764100\t0.0397\t54\nchr16\t18821400\t18826800\t0\t68\nchr16\t19003500\t19003800\t0.0875\t69\nchr16\t19786800\t19800900\t0\t37\nchr16\t19802100\t19802400\t0.0318\t30\nchr16\t20185800\t20186100\t0.0047\t89\nchr16\t20443200\t20451300\t0\t71\nchr16\t20484300\t20484600\t0.1726\t53\nchr16\t20490000\t20501100\t0\t83\nchr16\t20522400\t20532900\t0\t77\nchr16\t20539200\t20539500\t0.0782\t62\nchr16\t20576400\t20584800\t0\t73\nchr16\t21043500\t21044700\t0.0282\t76\nchr16\t21381600\t21384900\t0\t62\nchr16\t21386100\t21386700\t0.0244\t69\nchr16\t21389100\t21389400\t0.081\t82\nchr16\t21390600\t21390900\t0\t67\nchr16\t21393600\t21395700\t0\t67\nchr16\t21399600\t21400200\t0\t115\nchr16\t21401400\t21475200\t0\t115\nchr16\t21476400\t21480900\t0\t115\nchr16\t21482700\t21486900\t0\t115\nchr16\t21489000\t21498900\t0\t115\nchr16\t21500700\t21501300\t0.0555\t94\nchr16\t21732900\t21733200\t0.0122\t75\nchr16\t21738300\t21738600\t0.2123\t89\nchr16\t21739800\t21748500\t0\t97\nchr16\t21749700\t21755400\t0\t97\nchr16\t21756900\t21757200\t0.0298\t62\nchr16\t21761100\t21762600\t0\t75\nchr16\t21765600\t21766500\t0.0241\t74\nchr16\t21768900\t21769200\t0.0157\t75\nchr16\t21776700\t21783300\t0\t95\nchr16\t21784500\t21793200\t0\t93\nchr16\t21794400\t21794700\t0.095\t68\nchr16\t21798000\t21799500\t0\t70\nchr16\t21831600\t21832800\t0\t84\nchr16\t21834600\t21840300\t0\t122\nchr16\t21842100\t21863400\t0\t122\nchr16\t21864600\t21873300\t0\t122\nchr16\t21876900\t21884700\t0\t97\nchr16\t21887100\t21890700\t0\t83\nchr16\t21892200\t21893400\t0\t76\nchr16\t21894900\t21897000\t0\t92\nchr16\t21900300\t21906900\t0\t92\nchr16\t21908100\t21917400\t0\t92\nchr16\t21918600\t21919200\t0.0148\t87\nchr16\t21920400\t21931800\t0\t89\nchr16\t22433700\t22434600\t0\t73\nchr16\t22437900\t22462500\t0\t131\nchr16\t22464000\t22468800\t0\t131\nchr16\t22470900\t22537200\t0\t131\nchr16\t22538400\t22539300\t0\t88\nchr16\t22555200\t22559400\t0\t85\nchr16\t22560600\t22563000\t0\t91\nchr16\t22564200\t22567500\t0\t91\nchr16\t22570800\t22571100\t0.0133\t87\nchr16\t22573200\t22573500\t0.0133\t87\nchr16\t22577400\t22578600\t0\t90\nchr16\t22584900\t22586400\t0.0111\t91\nchr16\t22593000\t22593300\t0\t87\nchr16\t22594500\t22599000\t0\t87\nchr16\t22600500\t22601400\t0\t89\nchr16\t22603200\t22611000\t0\t89\nchr16\t22700100\t22700400\t0.055\t38\nchr16\t23599800\t23600100\t0.112\t73\nchr16\t25337400\t25337700\t0.1374\t58\nchr16\t26811900\t26812500\t0.021\t32\nchr16\t28334100\t28334400\t0.0656\t59\nchr16\t28340400\t28341600\t0.0177\t81\nchr16\t28343400\t28347300\t0\t88\nchr16\t28348800\t28349400\t0\t90\nchr16\t28350600\t28359600\t0\t90\nchr16\t28360800\t28361400\t0\t75\nchr16\t28362900\t28367700\t0\t75\nchr16\t28370700\t28372800\t0\t76\nchr16\t28374000\t28374300\t0\t76\nchr16\t28375800\t28376100\t0\t76\nchr16\t28378200\t28391700\t0\t81\nchr16\t28393200\t28402200\t0\t81\nchr16\t28403400\t28410300\t0\t81\nchr16\t28411800\t28413900\t0\t81\nchr16\t28415100\t28416600\t0.0068\t77\nchr16\t28419600\t28421700\t0\t87\nchr16\t28423200\t28441200\t0\t87\nchr16\t28442400\t28461000\t0\t103\nchr16\t28462500\t28463100\t0\t110\nchr16\t28465200\t28468200\t0\t110\nchr16\t28470900\t28471800\t0\t110\nchr16\t28599000\t28600800\t0\t71\nchr16\t28611900\t28614000\t0\t85\nchr16\t28637100\t28637400\t0.1802\t70\nchr16\t28643700\t28661100\t0\t99\nchr16\t28662300\t28665300\t0\t88\nchr16\t28667400\t28672200\t0\t82\nchr16\t28673400\t28691700\t0\t82\nchr16\t28692900\t28699200\t0\t82\nchr16\t28701300\t28722300\t0\t80\nchr16\t28723800\t28729500\t0\t80\nchr16\t28730700\t28737600\t0\t80\nchr16\t28739400\t28740300\t0.058\t49\nchr16\t28741800\t28743000\t0\t54\nchr16\t28744200\t28745700\t0\t78\nchr16\t28747500\t28752300\t0\t78\nchr16\t28753500\t28758000\t0\t110\nchr16\t28759500\t28793400\t0\t110\nchr16\t28794600\t28802100\t0\t83\nchr16\t28804200\t28809300\t0\t76\nchr16\t29040300\t29044800\t0\t94\nchr16\t29046000\t29048100\t0\t94\nchr16\t29050800\t29054100\t0\t97\nchr16\t29057100\t29058000\t0.0636\t106\nchr16\t29061900\t29062800\t0\t102\nchr16\t29064000\t29064300\t0\t102\nchr16\t29065500\t29065800\t0\t102\nchr16\t29067900\t29068800\t0.0024\t102\nchr16\t29070600\t29070900\t0.1187\t60\nchr16\t29332800\t29333100\t0.0055\t49\nchr16\t29361300\t29364000\t0\t77\nchr16\t29365200\t29365800\t0.0379\t62\nchr16\t29368200\t29370000\t0.0408\t80\nchr16\t29371500\t29374800\t0\t73\nchr16\t29378700\t29382900\t0.0005\t87\nchr16\t29384400\t29388900\t0\t101\nchr16\t29395200\t29395500\t0.0283\t64\nchr16\t29397900\t29398500\t0.0916\t86\nchr16\t29403900\t29404200\t0.1263\t92\nchr16\t29430900\t29435400\t0\t89\nchr16\t29437500\t29457600\t0\t138\nchr16\t29459100\t29544900\t0\t138\nchr16\t29547900\t29549700\t0\t110\nchr16\t29551200\t29552700\t0.0267\t65\nchr16\t29554500\t29555100\t0.0267\t65\nchr16\t29559300\t29559600\t0.1066\t60\nchr16\t29561400\t29561700\t0.171\t50\nchr16\t29562900\t29563500\t0.0007\t67\nchr16\t29565600\t29568600\t0\t72\nchr16\t30188700\t30244200\t0\t143\nchr16\t30245400\t30276000\t0\t143\nchr16\t30277500\t30280800\t0\t110\nchr16\t30285000\t30290700\t0\t102\nchr16\t30291900\t30292800\t0\t102\nchr16\t30294300\t30295500\t0\t67\nchr16\t30298800\t30299100\t0.1584\t46\nchr16\t30301200\t30308100\t0\t65\nchr16\t31104000\t31104600\t0\t109\nchr16\t31308900\t31309500\t0.0376\t59\nchr16\t31340400\t31341000\t0.0006\t49\nchr16\t31596000\t31596600\t0.013\t65\nchr16\t31760100\t31760400\t0\t59\nchr16\t31955700\t31956000\t0.1682\t54\nchr16\t31964400\t31964700\t0.0202\t41\nchr16\t31970700\t31971000\t0.1348\t80\nchr16\t31972500\t31973100\t0\t52\nchr16\t31989000\t31989300\t0.1739\t66\nchr16\t32017800\t32018400\t0.0647\t61\nchr16\t32024100\t32024400\t0.116\t47\nchr16\t32028900\t32036100\t0\t84\nchr16\t32037300\t32044200\t0\t84\nchr16\t32046300\t32046900\t0.0014\t63\nchr16\t32048100\t32059800\t0\t104\nchr16\t32062500\t32064900\t0\t83\nchr16\t32066700\t32069100\t0.0266\t77\nchr16\t32070900\t32071200\t0.0238\t72\nchr16\t32074800\t32077500\t0.0052\t97\nchr16\t32078700\t32079000\t0.0052\t97\nchr16\t32080200\t32081100\t0.0052\t97\nchr16\t32084400\t32084700\t0.1264\t152\nchr16\t32086500\t32089500\t0.014\t245\nchr16\t32091000\t32091300\t0.014\t245\nchr16\t32092500\t32093100\t0\t179\nchr16\t32094600\t32096100\t0\t179\nchr16\t32099400\t32102700\t0.0218\t175\nchr16\t32104800\t32106600\t0.0918\t122\nchr16\t32112000\t32112300\t0.1591\t110\nchr16\t32132100\t32134200\t0.0016\t87\nchr16\t32136000\t32151600\t0\t97\nchr16\t32153700\t32178000\t0\t98\nchr16\t32181600\t32188800\t0\t84\nchr16\t32190900\t32191200\t0\t86\nchr16\t32193000\t32197800\t0\t86\nchr16\t32199000\t32200800\t0\t86\nchr16\t32202000\t32203500\t0\t86\nchr16\t32204700\t32208900\t0\t78\nchr16\t32212500\t32213100\t0.0257\t73\nchr16\t32214300\t32215500\t0\t88\nchr16\t32216700\t32223000\t0\t88\nchr16\t32224500\t32234100\t0\t88\nchr16\t32235600\t32254200\t0\t88\nchr16\t32255400\t32256300\t0\t71\nchr16\t32257500\t32261400\t0\t71\nchr16\t32265300\t32265900\t0\t67\nchr16\t32267100\t32269200\t0\t56\nchr16\t32270400\t32282700\t0\t64\nchr16\t32288400\t32290200\t0\t98\nchr16\t32291400\t32381700\t0\t98\nchr16\t32395500\t32396100\t0\t56\nchr16\t32398500\t32398800\t0.0467\t37\nchr16\t32413800\t32414100\t0.1102\t83\nchr16\t32424300\t32424600\t0.1355\t48\nchr16\t32429400\t32442600\t0\t87\nchr16\t32457000\t32457300\t0.0862\t53\nchr16\t32465400\t32467800\t0\t56\nchr16\t32473500\t32473800\t0.0233\t46\nchr16\t32476800\t32477100\t0.0446\t59\nchr16\t32479800\t32480100\t0.0023\t136\nchr16\t32481900\t32483700\t0.0023\t136\nchr16\t32488500\t32489700\t0\t74\nchr16\t32502300\t32503200\t0\t44\nchr16\t32506500\t32506800\t0.0022\t40\nchr16\t32508900\t32509200\t0\t43\nchr16\t32510400\t32511300\t0\t43\nchr16\t32521800\t32524500\t0\t44\nchr16\t32526600\t32526900\t0.0882\t54\nchr16\t32528100\t32542500\t0\t51\nchr16\t32545800\t32546700\t0.0135\t53\nchr16\t32547900\t32548800\t0\t44\nchr16\t32551500\t32552100\t0\t40\nchr16\t32553300\t32553900\t0.0061\t54\nchr16\t32555400\t32565300\t0\t60\nchr16\t32568900\t32569200\t0.0011\t57\nchr16\t32570700\t32571000\t0.0011\t57\nchr16\t32574000\t32575800\t0\t59\nchr16\t32580300\t32580900\t0\t59\nchr16\t32582100\t32582700\t0.001\t60\nchr16\t32583900\t32585400\t0\t68\nchr16\t32588100\t32599200\t0\t82\nchr16\t32602200\t32604000\t0\t72\nchr16\t32608800\t32609700\t0\t77\nchr16\t32611500\t32612400\t0\t81\nchr16\t32613900\t32614200\t0.0109\t76\nchr16\t32615700\t32617200\t0.0109\t76\nchr16\t32619000\t32619600\t0.0233\t67\nchr16\t32623200\t32623800\t0\t68\nchr16\t32628300\t32628600\t0.157\t66\nchr16\t32635800\t32638800\t0\t69\nchr16\t32641200\t32643000\t0\t70\nchr16\t32647200\t32648400\t0.0138\t65\nchr16\t32651700\t32654100\t0\t132\nchr16\t32655300\t32688000\t0\t132\nchr16\t32689200\t32798700\t0\t132\nchr16\t32800500\t32805600\t0\t135\nchr16\t32808000\t32809200\t0.0068\t70\nchr16\t32810400\t32811300\t0\t140\nchr16\t32818200\t32818500\t0.0395\t38\nchr16\t32820900\t32821800\t0\t91\nchr16\t32823000\t32824200\t0\t64\nchr16\t32829900\t32830200\t0.0432\t64\nchr16\t32834400\t32835900\t0\t146\nchr16\t32837100\t32838900\t0\t146\nchr16\t32847000\t32865900\t0\t97\nchr16\t32867400\t32867700\t0\t88\nchr16\t32869500\t32877000\t0\t88\nchr16\t32878800\t32879100\t0.0348\t81\nchr16\t32881500\t32884500\t0\t85\nchr16\t32886300\t32887800\t0\t85\nchr16\t32921100\t32921400\t0.0811\t48\nchr16\t32924400\t32924700\t0.0126\t70\nchr16\t32926200\t32928000\t0\t88\nchr16\t32929800\t32930100\t0.0961\t65\nchr16\t32939700\t32940300\t0.0262\t62\nchr16\t32951400\t32958600\t0\t92\nchr16\t32960700\t32963400\t0\t92\nchr16\t32964900\t32986500\t0\t93\nchr16\t32987700\t32988000\t0\t93\nchr16\t32991600\t32992200\t0.0999\t93\nchr16\t32994300\t32997300\t0\t72\nchr16\t32999400\t33000000\t0.0314\t89\nchr16\t33003900\t33004500\t0.01\t62\nchr16\t33005700\t33008400\t0.0035\t96\nchr16\t33009900\t33011400\t0.0035\t96\nchr16\t33013200\t33014700\t0.0035\t96\nchr16\t33018000\t33020100\t0.0043\t78\nchr16\t33022200\t33024600\t0.0026\t90\nchr16\t33027600\t33027900\t0.1773\t131\nchr16\t33030000\t33032700\t0.0104\t166\nchr16\t33034200\t33034500\t0.0281\t84\nchr16\t33035700\t33036600\t0\t162\nchr16\t33038100\t33039600\t0\t124\nchr16\t33042600\t33042900\t0.1447\t136\nchr16\t33045600\t33045900\t0.0967\t80\nchr16\t33048300\t33048600\t0.092\t67\nchr16\t33049800\t33050100\t0.1276\t100\nchr16\t33065700\t33079500\t0\t128\nchr16\t33081300\t33214500\t0\t129\nchr16\t33264600\t33336000\t0\t240\nchr16\t33340200\t33392400\t0\t83\nchr16\t33442500\t33491400\t0\t70\nchr16\t33492600\t33506400\t0\t86\nchr16\t33507900\t33508200\t0.0261\t68\nchr16\t33510300\t33512100\t0.048\t64\nchr16\t33513900\t33514800\t0.0735\t53\nchr16\t33518700\t33525600\t0\t87\nchr16\t33528000\t33528300\t0.019\t51\nchr16\t33529500\t33531300\t0\t86\nchr16\t33532500\t33602700\t0\t86\nchr16\t33605700\t33607200\t0\t75\nchr16\t33609000\t33609300\t0\t75\nchr16\t33619800\t33620100\t0.0137\t57\nchr16\t33645300\t33645600\t0.0102\t41\nchr16\t33648900\t33657900\t0\t54\nchr16\t33659400\t33660000\t0\t52\nchr16\t33688200\t33688500\t0.1271\t59\nchr16\t33690600\t33692100\t0.0383\t57\nchr16\t33698700\t33699000\t0.0307\t53\nchr16\t33705000\t33705300\t0.1372\t44\nchr16\t33717900\t33718200\t0.2753\t85\nchr16\t33727500\t33730200\t0.004\t134\nchr16\t33735900\t33736200\t0.141\t61\nchr16\t33740700\t33741300\t0.075\t129\nchr16\t33758400\t33759000\t0\t40\nchr16\t33762000\t33762300\t0.1801\t34\nchr16\t33766500\t33766800\t0.076\t20\nchr16\t33768000\t33768300\t0.1462\t28\nchr16\t33778200\t33797400\t0\t66\nchr16\t33798900\t33801900\t0\t57\nchr16\t33803100\t33821100\t0\t57\nchr16\t33826200\t33826800\t0.0012\t40\nchr16\t33829200\t33830400\t0.019\t47\nchr16\t33831900\t33832500\t0\t111\nchr16\t33833700\t33835200\t0\t111\nchr16\t33845400\t33845700\t0.1581\t68\nchr16\t33848100\t33848400\t0.2668\t51\nchr16\t33856800\t33857400\t0.0029\t63\nchr16\t33866700\t33883200\t0\t85\nchr16\t33884700\t33889200\t0\t85\nchr16\t33890400\t33894000\t0\t85\nchr16\t33895200\t33903600\t0\t81\nchr16\t33907200\t33907500\t0.0507\t33\nchr16\t33909000\t33909300\t0.1278\t52\nchr16\t33921000\t33921300\t0.1406\t70\nchr16\t33924000\t33924600\t0.0152\t63\nchr16\t33925800\t33927600\t0\t90\nchr16\t33929100\t33930600\t0.0391\t71\nchr16\t33935400\t33935700\t0.1171\t48\nchr16\t33939300\t33940500\t0.0007\t55\nchr16\t33942000\t33942900\t0.0843\t70\nchr16\t33944100\t33945300\t0.0046\t52\nchr16\t33947400\t33947700\t0.0167\t66\nchr16\t33950700\t33951000\t0.0985\t62\nchr16\t33952800\t33958500\t0\t111\nchr16\t33961800\t33962400\t0.0393\t54\nchr16\t33965700\t33966300\t0\t53\nchr16\t33967500\t33969300\t0\t64\nchr16\t33971400\t33972000\t0\t86\nchr16\t33974100\t33980700\t0\t86\nchr16\t33982500\t33982800\t0\t86\nchr16\t33984300\t33984900\t0.0193\t100\nchr16\t33987900\t33991500\t0.0039\t82\nchr16\t33996300\t34000200\t0\t97\nchr16\t34001700\t34008600\t0\t97\nchr16\t34009800\t34013100\t0\t97\nchr16\t34063800\t34064400\t0.1839\t2127\nchr16\t34065900\t34068000\t0.0047\t1141\nchr16\t34072800\t34073700\t0.0061\t873\nchr16\t34085100\t34086300\t0.2121\t3841\nchr16\t34096200\t34098300\t0.1597\t2317\nchr16\t34186200\t34189200\t0\t63\nchr16\t34267800\t34268100\t0.1283\t28\nchr16\t34273800\t34274400\t0\t44\nchr16\t34275900\t34276200\t0.0129\t37\nchr16\t34278900\t34279200\t0\t80\nchr16\t34280700\t34281600\t0\t80\nchr16\t34283700\t34284600\t0\t80\nchr16\t34286100\t34289400\t0\t116\nchr16\t34339500\t34494300\t0\t400\nchr16\t34495500\t34506600\t0\t400\nchr16\t34507800\t34517100\t0\t400\nchr16\t34518600\t34520700\t0\t28\nchr16\t34574700\t34575900\t0.0918\t597\nchr16\t34589400\t34590600\t0.0383\t6369\nchr16\t34745100\t34745700\t0\t48\nchr16\t34831500\t34831800\t0.0074\t24\nchr16\t34834200\t34836000\t0\t36\nchr16\t34838700\t34839900\t0\t37\nchr16\t34842300\t34842600\t0.0539\t27\nchr16\t34844700\t34847100\t0\t52\nchr16\t34848900\t34850700\t0\t31\nchr16\t34851900\t34852800\t0\t29\nchr16\t34854600\t34856100\t0\t48\nchr16\t34859100\t34859700\t0.0023\t52\nchr16\t34860900\t34862400\t0.0023\t52\nchr16\t34864200\t34896600\t0\t389\nchr16\t34902300\t34902600\t0.1957\t1295\nchr16\t34911300\t34913100\t0\t53\nchr16\t34960200\t35072400\t0\t55\nchr16\t35609400\t35613000\t0\t71\nchr16\t35804100\t35804400\t0.0053\t64\nchr16\t35806800\t35807100\t0.1439\t54\nchr16\t35945400\t35946000\t0.0206\t56\nchr16\t35957100\t35957700\t0.006\t61\nchr16\t36009600\t36009900\t0\t72\nchr16\t36011700\t36012600\t0\t124\nchr16\t36016500\t36017700\t0\t108\nchr16\t36019200\t36019800\t0\t59\nchr16\t36246600\t36249000\t0\t50\nchr16\t36260700\t36261000\t0\t33\nchr16\t36315000\t36315300\t0.089\t37\nchr16\t36317700\t36321300\t0\t122\nchr16\t36323700\t36324900\t0\t40\nchr16\t36327600\t36328800\t0\t146\nchr16\t36330000\t36330300\t0\t146\nchr16\t36333600\t36333900\t0\t32\nchr16\t36337800\t36338100\t0\t51\nchr16\t36339900\t36340800\t0\t51\nchr16\t36343800\t36347400\t0\t79\nchr16\t36348600\t36714300\t0\t314\nchr16\t36716400\t36747600\t0\t115\nchr16\t36749400\t36907200\t0\t199\nchr16\t36909600\t36975000\t0\t199\nchr16\t36977700\t36993900\t0\t129\nchr16\t36995400\t37725300\t0\t346\nchr16\t37727100\t37782000\t0\t182\nchr16\t37783200\t37922100\t0\t475\nchr16\t37923300\t37945200\t0\t475\nchr16\t37946400\t38048100\t0\t194\nchr16\t38049300\t38109900\t0\t115\nchr16\t38111100\t38253900\t0\t195\nchr16\t38255100\t38267100\t0\t154\nchr16\t38275800\t38276400\t0\t51\nchr16\t46382700\t46383000\t0.0077\t8715\nchr16\t46385100\t46385700\t0.0077\t8715\nchr16\t46397100\t46398300\t0.0285\t5604\nchr16\t46624200\t46624800\t0.0124\t67\nchr16\t46694100\t46694400\t0.0533\t61\nchr16\t47646000\t47646300\t0.0435\t54\nchr16\t47864700\t47865000\t0.1111\t79\nchr16\t48017100\t48018900\t0.0438\t90\nchr16\t48769800\t48770100\t0.1145\t76\nchr16\t48772200\t48772500\t0.0103\t110\nchr16\t48773700\t48774000\t0.0103\t110\nchr16\t48917400\t48918000\t0.059\t31\nchr16\t49135800\t49136100\t0.1108\t80\nchr16\t49945500\t49945800\t0.0069\t29\nchr16\t51014400\t51014700\t0.2881\t69\nchr16\t52175100\t52175400\t0.0968\t92\nchr16\t54042300\t54048000\t0\t81\nchr16\t55170600\t55170900\t0.018\t212\nchr16\t55761900\t55762200\t0.0262\t25\nchr16\t55788600\t55808100\t0\t79\nchr16\t56739000\t56739600\t0.1617\t76\nchr16\t59559900\t59560500\t0.2137\t51\nchr16\t59562300\t59564100\t0.0027\t103\nchr16\t59980500\t59980800\t0.0476\t63\nchr16\t59982000\t59982300\t0.0664\t61\nchr16\t59998200\t59998500\t0.021\t24\nchr16\t60196500\t60197400\t0.0701\t74\nchr16\t60527700\t60528000\t0.0116\t69\nchr16\t60876300\t60879600\t0\t79\nchr16\t61785300\t61787100\t0\t69\nchr16\t61802100\t61803000\t0.0651\t79\nchr16\t61804800\t61806900\t0\t79\nchr16\t61920000\t61920900\t0.149\t76\nchr16\t63390300\t63390600\t0.0196\t79\nchr16\t65361900\t65362200\t0.1462\t77\nchr16\t65692200\t65695800\t0\t67\nchr16\t67712400\t67712700\t0.0656\t87\nchr16\t68583600\t68586000\t0\t76\nchr16\t68587200\t68589000\t0\t110\nchr16\t69665700\t69666300\t0.1256\t74\nchr16\t69948000\t69949500\t0.0238\t87\nchr16\t69950700\t69952200\t0.0238\t87\nchr16\t69957900\t69962700\t0\t91\nchr16\t69967800\t69969300\t0\t73\nchr16\t69973500\t69974700\t0.0269\t79\nchr16\t70052400\t70052700\t0.1102\t93\nchr16\t70146900\t70147200\t0.1116\t61\nchr16\t70172400\t70172700\t0.133\t96\nchr16\t70175100\t70179000\t0\t107\nchr16\t70180200\t70185600\t0\t107\nchr16\t70190100\t70191900\t0\t83\nchr16\t70200900\t70201200\t0.0037\t46\nchr16\t70812000\t70812300\t0.0825\t49\nchr16\t70814400\t70815300\t0.0186\t63\nchr16\t70816500\t70816800\t0.0186\t63\nchr16\t70823100\t70823400\t0.0033\t61\nchr16\t70825800\t70827300\t0.0016\t73\nchr16\t70839000\t70839300\t0.1608\t41\nchr16\t70845000\t70846800\t0.0338\t78\nchr16\t70848600\t70848900\t0.0635\t59\nchr16\t70852200\t70852500\t0.0943\t52\nchr16\t70856100\t70857300\t0.0376\t46\nchr16\t70860600\t70860900\t0.0457\t62\nchr16\t70862400\t70862700\t0.0457\t62\nchr16\t70869000\t70869300\t0.0859\t51\nchr16\t70872900\t70873500\t0.0006\t63\nchr16\t70879800\t70880100\t0.0233\t68\nchr16\t70889100\t70889700\t0.0154\t52\nchr16\t70903500\t70903800\t0\t74\nchr16\t70910700\t70912500\t0.0068\t64\nchr16\t70913700\t70915800\t0.0068\t64\nchr16\t70918800\t70920300\t0.0113\t62\nchr16\t70924200\t70924800\t0.0026\t53\nchr16\t70927200\t70927500\t0.0938\t61\nchr16\t70928700\t70929000\t0.1164\t54\nchr16\t70935600\t70935900\t0.0007\t76\nchr16\t70951800\t70952400\t0.0064\t64\nchr16\t70953900\t70954200\t0.0037\t70\nchr16\t70963500\t70963800\t0.0461\t68\nchr16\t70968000\t70968300\t0.0524\t51\nchr16\t70969800\t70970400\t0.0649\t53\nchr16\t70972200\t70973700\t0.0648\t64\nchr16\t70983000\t70983300\t0.0851\t50\nchr16\t70986000\t70988400\t0\t78\nchr16\t71001000\t71001300\t0.1278\t52\nchr16\t71008800\t71009100\t0.0678\t90\nchr16\t71013600\t71013900\t0.1351\t62\nchr16\t71018100\t71018400\t0.0786\t51\nchr16\t71023500\t71023800\t0.0075\t76\nchr16\t71025300\t71025600\t0.0075\t76\nchr16\t71032800\t71033100\t0.1181\t73\nchr16\t71034900\t71035500\t0.0631\t69\nchr16\t71045700\t71046300\t0.0059\t59\nchr16\t71058000\t71058300\t0.0426\t76\nchr16\t71076600\t71076900\t0.0403\t45\nchr16\t71085000\t71085300\t0.0776\t66\nchr16\t71088000\t71088300\t0\t76\nchr16\t71091000\t71091900\t0\t76\nchr16\t71095800\t71096100\t0.1614\t73\nchr16\t71099400\t71099700\t0.0056\t52\nchr16\t71100900\t71101500\t0.014\t74\nchr16\t71103300\t71106000\t0.0079\t69\nchr16\t71110800\t71111100\t0.0408\t69\nchr16\t71119200\t71119500\t0.0763\t76\nchr16\t71121000\t71121300\t0.1309\t65\nchr16\t71130900\t71132700\t0.0188\t73\nchr16\t71140200\t71140500\t0.0006\t63\nchr16\t71146500\t71148000\t0\t57\nchr16\t71155500\t71156100\t0.0723\t63\nchr16\t71159100\t71161200\t0\t65\nchr16\t71164200\t71164800\t0.0316\t62\nchr16\t71603100\t71604000\t0\t75\nchr16\t72056700\t72057000\t0.0061\t63\nchr16\t72058500\t72058800\t0.1223\t72\nchr16\t72077100\t72077400\t0.1899\t42\nchr16\t72342900\t72343200\t0.1431\t73\nchr16\t72584100\t72585600\t0.015\t64\nchr16\t72629700\t72633000\t0.028\t79\nchr16\t73824600\t73830300\t0\t80\nchr16\t74334300\t74334600\t0.0882\t67\nchr16\t74382000\t74382300\t0.0194\t116\nchr16\t74384100\t74384400\t0.0503\t89\nchr16\t74385600\t74385900\t0.0503\t89\nchr16\t74405100\t74406600\t0\t83\nchr16\t74415000\t74415300\t0.1726\t107\nchr16\t74417400\t74418600\t0.0416\t107\nchr16\t74420400\t74420700\t0.12\t120\nchr16\t74428500\t74428800\t0.196\t73\nchr16\t74799600\t74800200\t0.0101\t91\nchr16\t75204900\t75206100\t0.0006\t71\nchr16\t75222900\t75224100\t0.0292\t67\nchr16\t75504900\t75505200\t0.0606\t81\nchr16\t75545400\t75545700\t0.1318\t64\nchr16\t75824400\t75824700\t0.0041\t73\nchr16\t76610700\t76611000\t0.051\t77\nchr16\t76757700\t76758000\t0.0543\t89\nchr16\t78651900\t78652500\t0.059\t903\nchr16\t79696200\t79696500\t0.0539\t61\nchr16\t80089500\t80089800\t0.0509\t56\nchr16\t81082500\t81082800\t0.0282\t73\nchr16\t81086100\t81086400\t0.1958\t174\nchr16\t82139700\t82141800\t0.0116\t102\nchr16\t82275600\t82276200\t0.1766\t97\nchr16\t83637600\t83643000\t0\t75\nchr16\t84456000\t84458100\t0\t66\nchr16\t85405500\t85406700\t0.0517\t20\nchr16\t85412100\t85412400\t0.0371\t72\nchr16\t85972500\t85974000\t0\t220\nchr16\t87162900\t87163200\t0.2199\t44\nchr16\t87726300\t87726600\t0.0758\t17\nchr16\t88000500\t88001100\t0.0985\t28\nchr16\t88217700\t88218000\t0.1439\t45\nchr16\t88547100\t88547400\t0.1313\t12\nchr16\t88728600\t88728900\t0.1513\t36\nchr16\t88831500\t88831800\t0.2077\t22\nchr16\t88894200\t88894500\t0.1518\t97\nchr16\t88950600\t88950900\t0.2773\t52\nchr16\t89083800\t89084100\t0.1601\t19\nchr16\t89400000\t89400600\t0.0438\t44\nchr16\t89598600\t89598900\t0.198\t36\nchr16\t89647800\t89648400\t0.0279\t42\nchr16\t89901600\t89902500\t0.0381\t44\nchr16\t90003600\t90004200\t0.0977\t27\nchr16\t90100800\t90101400\t0.0448\t89\nchr16\t90107400\t90121200\t0\t242\nchr16\t90122700\t90150900\t0\t107\nchr16\t90152100\t90161700\t0\t107\nchr16\t90164100\t90166200\t0.0138\t72\nchr16\t90170400\t90172500\t0.0117\t63\nchr16\t90174600\t90174900\t0.0055\t70\nchr16\t90176100\t90177000\t0.0055\t70\nchr16\t90178200\t90180900\t0.0445\t87\nchr16\t90183300\t90185400\t0.0019\t89\nchr16\t90186900\t90187800\t0\t93\nchr16\t90189000\t90189300\t0\t93\nchr16\t90191100\t90193800\t0\t93\nchr16\t90195000\t90197100\t0\t93\nchr16\t90198900\t90200100\t0.0149\t97\nchr16\t90202200\t90202500\t0.0527\t101\nchr16\t90204600\t90206700\t0.0012\t83\nchr16\t90208500\t90211800\t0.0011\t126\nchr16\t90214500\t90214800\t0.0011\t126\nchr16\t90216300\t90225300\t0\t78\nchr16\t90226500\t90228000\t0.0054\t112\nchr17\t60000\t63300\t0\t34\nchr17\t66900\t89700\t0\t93\nchr17\t90900\t114000\t0\t93\nchr17\t115800\t129000\t0\t1057\nchr17\t132600\t133800\t0\t67\nchr17\t135600\t136500\t0\t84\nchr17\t140400\t141000\t0.0151\t57\nchr17\t166800\t168600\t0\t28\nchr17\t192000\t192300\t0.1814\t12\nchr17\t201600\t201900\t0.1127\t270\nchr17\t220800\t221100\t0.1\t23\nchr17\t254700\t257100\t0.0473\t165\nchr17\t303600\t304200\t0.0886\t84\nchr17\t356100\t356400\t0.2301\t79\nchr17\t402900\t404400\t0\t86\nchr17\t510000\t510300\t0.2472\t44\nchr17\t618000\t618300\t0.1027\t30\nchr17\t649200\t649500\t0.26\t123\nchr17\t727500\t727800\t0.2188\t75\nchr17\t894300\t894600\t0.2535\t31\nchr17\t952200\t952800\t0.1667\t81\nchr17\t1006800\t1007100\t0.1411\t21\nchr17\t1117200\t1117500\t0.2792\t77\nchr17\t1118700\t1119300\t0.087\t46\nchr17\t1308300\t1311600\t0\t137\nchr17\t2052600\t2052900\t0.0024\t29\nchr17\t2355000\t2356500\t0.225\t110\nchr17\t2448300\t2448600\t0.0066\t62\nchr17\t3052800\t3053100\t0.1206\t83\nchr17\t3054300\t3056400\t0\t61\nchr17\t3059700\t3060300\t0.0029\t45\nchr17\t3062100\t3062400\t0.1005\t71\nchr17\t3064800\t3065100\t0.0055\t49\nchr17\t3067200\t3068700\t0\t72\nchr17\t3072900\t3073500\t0.003\t66\nchr17\t3150300\t3150600\t0.0706\t68\nchr17\t3179400\t3179700\t0.0593\t70\nchr17\t3181500\t3181800\t0.1083\t74\nchr17\t3230700\t3231300\t0.0241\t64\nchr17\t3235500\t3237600\t0\t64\nchr17\t3241800\t3242100\t0\t61\nchr17\t3243900\t3244500\t0\t48\nchr17\t3248100\t3248700\t0\t61\nchr17\t3252300\t3252900\t0.0076\t63\nchr17\t3274500\t3275100\t0.2808\t46\nchr17\t3328200\t3328500\t0.1286\t52\nchr17\t3329700\t3330000\t0.1003\t98\nchr17\t3351300\t3351600\t0.0243\t45\nchr17\t3687000\t3687900\t0.0149\t18\nchr17\t4089900\t4090200\t0.0791\t41\nchr17\t4462200\t4462500\t0.1108\t17\nchr17\t9616200\t9621900\t0\t89\nchr17\t11478000\t11478900\t0.1305\t88\nchr17\t12443100\t12443400\t0.1107\t18\nchr17\t12450300\t12453600\t0.0097\t115\nchr17\t12651900\t12652200\t0.0466\t21\nchr17\t13782600\t13782900\t0.1405\t17\nchr17\t14022300\t14023800\t0\t69\nchr17\t14177400\t14177700\t0.0564\t60\nchr17\t14234400\t14234700\t0.1659\t78\nchr17\t14237700\t14238900\t0.0018\t61\nchr17\t15792600\t15792900\t0.1253\t65\nchr17\t15960300\t15960600\t0.1668\t24\nchr17\t16726800\t16727100\t0.1659\t85\nchr17\t16730100\t16730400\t0.0928\t58\nchr17\t16731600\t16732200\t0.0253\t65\nchr17\t16752600\t16752900\t0.0771\t70\nchr17\t16764900\t16765200\t0.0449\t63\nchr17\t16779000\t16779300\t0.0851\t71\nchr17\t16800600\t16800900\t0.0492\t60\nchr17\t16828800\t16829400\t0.0014\t59\nchr17\t16845600\t16846200\t0\t47\nchr17\t16848300\t16848900\t0.0217\t73\nchr17\t16864500\t16866000\t0.0524\t73\nchr17\t18393000\t18393600\t0\t69\nchr17\t18394800\t18397500\t0\t69\nchr17\t18399900\t18400200\t0.0617\t69\nchr17\t18401400\t18401700\t0\t30\nchr17\t18402900\t18404400\t0\t43\nchr17\t18406500\t18407400\t0\t57\nchr17\t18412200\t18412800\t0\t61\nchr17\t18417900\t18418200\t0\t28\nchr17\t18420600\t18420900\t0.1002\t43\nchr17\t18426000\t18429000\t0\t91\nchr17\t18430200\t18446100\t0\t91\nchr17\t18447600\t18447900\t0.1186\t29\nchr17\t18452700\t18453600\t0\t45\nchr17\t18456600\t18458100\t0\t28\nchr17\t18460200\t18461400\t0\t35\nchr17\t18471000\t18471900\t0\t28\nchr17\t18474000\t18474300\t0\t25\nchr17\t18477600\t18479100\t0\t29\nchr17\t18480300\t18481800\t0\t29\nchr17\t18483600\t18483900\t0\t29\nchr17\t18485400\t18489900\t0\t31\nchr17\t18491700\t18493200\t0\t31\nchr17\t18498000\t18504600\t0\t37\nchr17\t18505800\t18506700\t0\t63\nchr17\t18513600\t18516300\t0\t32\nchr17\t18517500\t18517800\t0\t32\nchr17\t18520500\t18521100\t0\t44\nchr17\t18522300\t18522900\t0\t44\nchr17\t18526200\t18527100\t0\t54\nchr17\t18528300\t18528600\t0\t54\nchr17\t18533400\t18534300\t0\t47\nchr17\t18536100\t18536700\t0\t47\nchr17\t18538200\t18538800\t0\t38\nchr17\t18540900\t18541800\t0\t43\nchr17\t18544500\t18545100\t0.0475\t28\nchr17\t18550200\t18550800\t0\t66\nchr17\t18552600\t18552900\t0\t66\nchr17\t18554100\t18555300\t0\t43\nchr17\t18562800\t18563100\t0.0031\t84\nchr17\t18584700\t18585300\t0.0455\t78\nchr17\t18603600\t18603900\t0.0801\t44\nchr17\t18605700\t18606600\t0\t59\nchr17\t18619500\t18619800\t0.0758\t59\nchr17\t18623100\t18623400\t0.1554\t55\nchr17\t18826200\t18826800\t0.007\t49\nchr17\t18839400\t18840300\t0\t72\nchr17\t18842100\t18842400\t0.0523\t58\nchr17\t18888000\t18888600\t0.0037\t64\nchr17\t19026000\t19081800\t0\t110\nchr17\t19083000\t19092900\t0\t110\nchr17\t19094100\t19110900\t0\t94\nchr17\t19112700\t19142100\t0\t96\nchr17\t19143300\t19148700\t0\t115\nchr17\t19149900\t19237200\t0\t115\nchr17\t19627200\t19628700\t0.0305\t67\nchr17\t20323200\t20323500\t0.0892\t49\nchr17\t20332500\t20332800\t0.0882\t57\nchr17\t20356200\t20356500\t0.0365\t54\nchr17\t20361900\t20362500\t0.0909\t65\nchr17\t20391000\t20391300\t0.0911\t44\nchr17\t20406000\t20406300\t0.1207\t71\nchr17\t20414400\t20415900\t0.1379\t69\nchr17\t20429100\t20429400\t0.0529\t62\nchr17\t20437800\t20438100\t0.0503\t68\nchr17\t20442300\t20442900\t0.0024\t38\nchr17\t20445000\t20446500\t0\t42\nchr17\t20452200\t20453700\t0.0132\t31\nchr17\t20456400\t20457300\t0\t29\nchr17\t20459700\t20460000\t0\t21\nchr17\t20462100\t20463900\t0.0427\t43\nchr17\t20465400\t20465700\t0.1435\t24\nchr17\t20472600\t20472900\t0.2213\t28\nchr17\t20483100\t20483400\t0.1466\t40\nchr17\t20500800\t20501400\t0.0351\t58\nchr17\t20505000\t20513400\t0\t69\nchr17\t20516400\t20516700\t0.02\t37\nchr17\t20517900\t20518500\t0.0023\t81\nchr17\t20531700\t20532600\t0.1001\t57\nchr17\t20537100\t20538600\t0\t60\nchr17\t20544300\t20544600\t0.0072\t64\nchr17\t20546100\t20546400\t0.0388\t61\nchr17\t20548800\t20549100\t0\t85\nchr17\t20551200\t20551800\t0\t85\nchr17\t20984100\t20986200\t0.0122\t55\nchr17\t21342600\t21342900\t0.061\t81\nchr17\t21345900\t21346500\t0.0109\t111\nchr17\t21348000\t21348300\t0.0969\t105\nchr17\t21413100\t21413400\t0.0025\t90\nchr17\t21438600\t21438900\t0.0282\t60\nchr17\t21700200\t21701100\t0.0117\t82\nchr17\t21738600\t21738900\t0.0373\t82\nchr17\t21741300\t21741900\t0.0042\t107\nchr17\t21882000\t21882300\t0.2719\t436\nchr17\t21884700\t21909300\t0\t257\nchr17\t21910500\t21992100\t0\t9754\nchr17\t22044000\t22044300\t0.1515\t202\nchr17\t22047000\t22047300\t0.127\t173\nchr17\t22080000\t22080300\t0.0679\t50\nchr17\t22375800\t22407600\t0\t350\nchr17\t22746300\t22746900\t0.0039\t168\nchr17\t22748400\t22748700\t0.0005\t61\nchr17\t22749900\t22750200\t0.0005\t61\nchr17\t22753500\t22754100\t0\t205\nchr17\t22755300\t22755900\t0\t205\nchr17\t22757100\t22761600\t0\t205\nchr17\t22814100\t22817100\t0\t158\nchr17\t22818600\t22821600\t0\t78\nchr17\t22823400\t22868100\t0\t228\nchr17\t22869300\t22912200\t0\t228\nchr17\t22913400\t22949100\t0\t240\nchr17\t22950300\t22990200\t0\t2064\nchr17\t22991400\t23016000\t0\t2064\nchr17\t23017200\t23027700\t0\t334\nchr17\t23028900\t23031000\t0\t81\nchr17\t23032200\t23047200\t0\t223\nchr17\t23048400\t23067300\t0\t148\nchr17\t23069400\t23081400\t0\t158\nchr17\t23082600\t23093700\t0\t177\nchr17\t23094900\t23099700\t0\t177\nchr17\t23101200\t23108700\t0\t177\nchr17\t23109900\t23157900\t0\t205\nchr17\t23159100\t23161200\t0\t67\nchr17\t23162700\t23169300\t0\t113\nchr17\t23170500\t23175600\t0\t101\nchr17\t23177100\t23178600\t0\t152\nchr17\t23179800\t23192100\t0\t152\nchr17\t23194200\t23213400\t0\t606\nchr17\t23214900\t23219700\t0\t59\nchr17\t23221200\t23221800\t0.0017\t766\nchr17\t23223900\t23226000\t0\t29\nchr17\t23227500\t23227800\t0\t35\nchr17\t23229000\t23231100\t0\t35\nchr17\t23235300\t23235600\t0\t10\nchr17\t23238900\t23242500\t0\t121\nchr17\t23243700\t23247900\t0\t70\nchr17\t23249700\t23251500\t0\t19\nchr17\t23255700\t23258100\t0\t2583\nchr17\t23260200\t23263800\t0\t77\nchr17\t23267100\t23268600\t0\t152\nchr17\t23271000\t23271600\t0\t33\nchr17\t23273400\t23277600\t0\t84\nchr17\t23281200\t23286600\t0\t116\nchr17\t23289000\t23298000\t0\t1530\nchr17\t23300100\t23300400\t0\t14\nchr17\t23304900\t23306700\t0\t20\nchr17\t23309400\t23310000\t0\t34\nchr17\t23315100\t23322300\t0\t67\nchr17\t23323800\t23325000\t0\t11\nchr17\t23328900\t23329200\t0\t10\nchr17\t23332500\t23335500\t0\t45\nchr17\t23339400\t23341500\t0\t28\nchr17\t23346900\t23347200\t0.1001\t31\nchr17\t23349600\t23349900\t0\t26\nchr17\t23352000\t23352300\t0\t11\nchr17\t23353500\t23365800\t0\t173\nchr17\t23369700\t23370000\t0\t14\nchr17\t23371800\t23372700\t0\t44\nchr17\t23376900\t23377200\t0\t12\nchr17\t23379000\t23380800\t0.0103\t55\nchr17\t23383500\t23383800\t0.1492\t15\nchr17\t23385600\t23388600\t0\t64\nchr17\t23389800\t23391300\t0\t70\nchr17\t23394000\t23398200\t0\t42\nchr17\t23399400\t23400300\t0\t69\nchr17\t23403900\t23405700\t0\t17\nchr17\t23407500\t23419200\t0\t68\nchr17\t23421600\t23424000\t0\t43\nchr17\t23428800\t23429400\t0\t38\nchr17\t23430900\t23433300\t0\t161\nchr17\t23436300\t23443200\t0\t225\nchr17\t23445900\t23447100\t0\t57\nchr17\t23448900\t23449800\t0\t54\nchr17\t23452800\t23455800\t0\t15\nchr17\t23457600\t23458500\t0\t17\nchr17\t23460600\t23461500\t0\t92\nchr17\t23462700\t23468400\t0\t248\nchr17\t23470200\t23473800\t0\t63\nchr17\t23475600\t23476200\t0\t18\nchr17\t23477400\t23477700\t0\t18\nchr17\t23479500\t23483700\t0\t68\nchr17\t23485800\t23487900\t0\t69\nchr17\t23489400\t23490000\t0\t14\nchr17\t23492100\t23496300\t0\t150\nchr17\t23497500\t23497800\t0\t11\nchr17\t23500200\t23502900\t0\t79\nchr17\t23506200\t23506500\t0\t11\nchr17\t23508900\t23509500\t0\t13\nchr17\t23511000\t23511300\t0\t13\nchr17\t23513700\t23514000\t0\t12\nchr17\t23515500\t23515800\t0\t15\nchr17\t23520000\t23520900\t0\t15\nchr17\t23523300\t23525700\t0\t48\nchr17\t23526900\t23527200\t0\t30\nchr17\t23529900\t23530200\t0.223\t25\nchr17\t23531400\t23532600\t0\t19\nchr17\t23534400\t23537400\t0\t30\nchr17\t23538600\t23538900\t0\t10\nchr17\t23540100\t23545200\t0\t1314\nchr17\t23546700\t23548800\t0\t23\nchr17\t23554200\t23555100\t0\t32\nchr17\t23559000\t23561400\t0\t44\nchr17\t23563800\t23565300\t0\t45\nchr17\t23566500\t23567700\t0\t45\nchr17\t23569800\t23570700\t0\t166\nchr17\t23572200\t23577000\t0\t62\nchr17\t23579700\t23581200\t0\t18\nchr17\t23583000\t23583900\t0\t452\nchr17\t23586000\t23586900\t0\t15\nchr17\t23590200\t23593200\t0\t48\nchr17\t23594400\t23598600\t0\t76\nchr17\t23600700\t23601000\t0.1131\t17\nchr17\t23603700\t23605500\t0\t69\nchr17\t23606700\t23612400\t0\t69\nchr17\t23613600\t23615700\t0\t94\nchr17\t23617200\t23617500\t0\t12\nchr17\t23620800\t23626800\t0\t170\nchr17\t23628900\t23630700\t0\t12\nchr17\t23632200\t23638800\t0\t214\nchr17\t23640300\t23641800\t0\t56\nchr17\t23644200\t23644800\t0\t34\nchr17\t23646900\t23650800\t0\t78\nchr17\t23656500\t23657100\t0\t37\nchr17\t23663100\t23664000\t0\t12\nchr17\t23666100\t23667300\t0\t17\nchr17\t23668800\t23671500\t0\t80\nchr17\t23672700\t23673000\t0\t13\nchr17\t23676300\t23677800\t0\t48\nchr17\t23680500\t23680800\t0\t15\nchr17\t23682600\t23682900\t0\t11\nchr17\t23686800\t23688000\t0\t74\nchr17\t23691300\t23694000\t0\t17\nchr17\t23698800\t23700000\t0\t12\nchr17\t23701200\t23701800\t0\t12\nchr17\t23703300\t23703600\t0\t12\nchr17\t23708100\t23708400\t0\t11\nchr17\t23711400\t23711700\t0\t13\nchr17\t23714700\t23715000\t0\t13\nchr17\t23716800\t23717100\t0\t11\nchr17\t23719800\t23722200\t0\t58\nchr17\t23727600\t23728800\t0\t26\nchr17\t23731200\t23734500\t0\t93\nchr17\t23736000\t23736300\t0\t30\nchr17\t23740200\t23751300\t0\t69\nchr17\t23752500\t23753100\t0\t69\nchr17\t23755800\t23759100\t0\t53\nchr17\t23760900\t23761200\t0\t13\nchr17\t23762700\t23770500\t0\t55\nchr17\t23773800\t23778000\t0\t37\nchr17\t23779500\t23781000\t0\t37\nchr17\t23783400\t23784900\t0\t12\nchr17\t23786400\t23786700\t0\t10\nchr17\t23791800\t23793600\t0\t38\nchr17\t23795100\t23796600\t0\t39\nchr17\t23800500\t23801700\t0\t30\nchr17\t23803800\t23805300\t0\t713\nchr17\t23810400\t23811600\t0\t18\nchr17\t23817900\t23824800\t0\t60\nchr17\t23826300\t23831700\t0\t52\nchr17\t23832900\t23833200\t0\t12\nchr17\t23842200\t23842500\t0\t13\nchr17\t23844000\t23845500\t0\t30\nchr17\t23849700\t23853600\t0\t68\nchr17\t23857200\t23861100\t0\t305\nchr17\t23863500\t23873700\t0\t93\nchr17\t23875200\t23881800\t0\t149\nchr17\t23884800\t23886600\t0\t39\nchr17\t23887800\t23888700\t0\t39\nchr17\t23892900\t23894100\t0\t46\nchr17\t23896800\t23900100\t0\t72\nchr17\t23901600\t23903100\t0\t81\nchr17\t23904900\t23910900\t0\t49\nchr17\t23912100\t23916600\t0\t82\nchr17\t23917800\t23918100\t0\t12\nchr17\t23919900\t23921400\t0\t60\nchr17\t23922600\t23922900\t0.07\t23\nchr17\t23925000\t23925300\t0\t10\nchr17\t23928900\t23931600\t0\t62\nchr17\t23933700\t23936700\t0\t31\nchr17\t23941200\t23943300\t0\t40\nchr17\t23944500\t23946600\t0\t34\nchr17\t23949900\t23954700\t0\t71\nchr17\t23956200\t23964600\t0\t89\nchr17\t23969100\t23969700\t0\t49\nchr17\t23970900\t23977200\t0\t70\nchr17\t23979000\t23980800\t0\t192\nchr17\t23982000\t23983200\t0\t192\nchr17\t23984700\t23988300\t0\t192\nchr17\t23993700\t23996100\t0\t106\nchr17\t23997300\t23997600\t0\t14\nchr17\t23999100\t24004200\t0\t80\nchr17\t24007200\t24007500\t0\t13\nchr17\t24009300\t24009600\t0\t14\nchr17\t24011100\t24013500\t0\t66\nchr17\t24016200\t24019500\t0\t75\nchr17\t24021300\t24021600\t0.2557\t64\nchr17\t24024000\t24025800\t0\t54\nchr17\t24027300\t24027600\t0\t11\nchr17\t24029100\t24033300\t0\t30\nchr17\t24034800\t24036900\t0\t34\nchr17\t24038700\t24043500\t0\t107\nchr17\t24044700\t24046800\t0\t23\nchr17\t24048000\t24048900\t0\t53\nchr17\t24050100\t24051300\t0\t50\nchr17\t24057300\t24057900\t0\t13\nchr17\t24061800\t24062700\t0\t203\nchr17\t24064200\t24066000\t0\t42\nchr17\t24067200\t24069900\t0\t81\nchr17\t24071700\t24073500\t0\t68\nchr17\t24076800\t24081600\t0\t88\nchr17\t24082800\t24083400\t0\t130\nchr17\t24084900\t24094500\t0\t59\nchr17\t24096900\t24098700\t0\t43\nchr17\t24101400\t24102000\t0\t16\nchr17\t24106500\t24107100\t0\t45\nchr17\t24108900\t24111000\t0\t85\nchr17\t24112500\t24117900\t0\t50\nchr17\t24119400\t24120300\t0.056\t42\nchr17\t24122100\t24123900\t0\t35\nchr17\t24125700\t24127800\t0\t56\nchr17\t24132300\t24133200\t0\t46\nchr17\t24135000\t24137400\t0\t29\nchr17\t24139200\t24141600\t0\t130\nchr17\t24144300\t24147300\t0\t60\nchr17\t24150600\t24153900\t0\t573\nchr17\t24158100\t24158400\t0.0558\t12\nchr17\t24163800\t24166500\t0\t40\nchr17\t24168300\t24170700\t0\t79\nchr17\t24175200\t24176400\t0\t49\nchr17\t24180000\t24188400\t0\t1036\nchr17\t24191400\t24199200\t0\t52\nchr17\t24200400\t24205500\t0\t66\nchr17\t24206700\t24219900\t0\t81\nchr17\t24223500\t24230400\t0\t154\nchr17\t24232500\t24232800\t0\t11\nchr17\t24235200\t24235500\t0\t20\nchr17\t24238800\t24243600\t0\t69\nchr17\t24245400\t24246300\t0\t35\nchr17\t24248100\t24248400\t0.0009\t11\nchr17\t24250500\t24258900\t0\t116\nchr17\t24261300\t24262500\t0\t35\nchr17\t24263700\t24264000\t0.0396\t20\nchr17\t24265800\t24268800\t0\t35\nchr17\t24270600\t24270900\t0\t11\nchr17\t24275700\t24277200\t0\t67\nchr17\t24278700\t24285000\t0\t67\nchr17\t24286200\t24286500\t0\t24\nchr17\t24288600\t24288900\t0\t12\nchr17\t24291300\t24293100\t0\t41\nchr17\t24296100\t24297000\t0\t42\nchr17\t24298200\t24298500\t0\t12\nchr17\t24299700\t24303000\t0\t68\nchr17\t24304500\t24305400\t0\t41\nchr17\t24306900\t24311100\t0\t41\nchr17\t24312900\t24313200\t0\t27\nchr17\t24316200\t24318000\t0\t65\nchr17\t24319200\t24319500\t0\t12\nchr17\t24324300\t24324600\t0\t11\nchr17\t24327600\t24328500\t0\t50\nchr17\t24330600\t24332100\t0\t39\nchr17\t24333600\t24333900\t0\t10\nchr17\t24335100\t24340200\t0\t27\nchr17\t24344700\t24351300\t0\t59\nchr17\t24354000\t24355200\t0\t569\nchr17\t24359100\t24359700\t0\t26\nchr17\t24363000\t24363900\t0\t27\nchr17\t24366900\t24367500\t0\t41\nchr17\t24371400\t24375300\t0\t66\nchr17\t24380100\t24382500\t0\t44\nchr17\t24384900\t24386700\t0\t54\nchr17\t24388800\t24390300\t0\t41\nchr17\t24391500\t24391800\t0\t12\nchr17\t24395400\t24395700\t0\t12\nchr17\t24397500\t24399900\t0\t1126\nchr17\t24402600\t24403200\t0\t13\nchr17\t24408300\t24410700\t0\t22\nchr17\t24415500\t24421200\t0\t259\nchr17\t24423300\t24424500\t0\t86\nchr17\t24427200\t24427500\t0\t12\nchr17\t24429300\t24429600\t0\t10\nchr17\t24437700\t24439800\t0\t36\nchr17\t24441000\t24442500\t0\t30\nchr17\t24445200\t24445800\t0.0936\t37\nchr17\t24447300\t24449700\t0\t16\nchr17\t24453000\t24455700\t0\t82\nchr17\t24456900\t24457200\t0\t19\nchr17\t24459300\t24464100\t0\t67\nchr17\t24467100\t24467700\t0\t28\nchr17\t24469200\t24469500\t0\t11\nchr17\t24471300\t24478200\t0\t68\nchr17\t24481500\t24486000\t0\t32\nchr17\t24487200\t24489300\t0\t55\nchr17\t24492000\t24493500\t0\t142\nchr17\t24495600\t24501600\t0\t42\nchr17\t24504300\t24505800\t0\t18\nchr17\t24507300\t24511200\t0\t71\nchr17\t24514200\t24518400\t0\t204\nchr17\t24520200\t24520500\t0\t14\nchr17\t24525600\t24527100\t0\t27\nchr17\t24528300\t24528900\t0\t35\nchr17\t24531300\t24539700\t0\t876\nchr17\t24541500\t24542100\t0\t11\nchr17\t24543900\t24552000\t0\t66\nchr17\t24553200\t24558300\t0\t48\nchr17\t24559500\t24560100\t0\t11\nchr17\t24564900\t24566400\t0\t73\nchr17\t24569700\t24570600\t0\t28\nchr17\t24571800\t24574500\t0\t127\nchr17\t24576600\t24577500\t0\t55\nchr17\t24581400\t24582300\t0\t57\nchr17\t24584100\t24586200\t0\t39\nchr17\t24588000\t24591900\t0\t74\nchr17\t24594600\t24599100\t0\t145\nchr17\t24600900\t24601200\t0\t10\nchr17\t24606300\t24608100\t0\t26\nchr17\t24612900\t24614700\t0\t44\nchr17\t24615900\t24617700\t0\t76\nchr17\t24623400\t24624900\t0\t1118\nchr17\t24627900\t24628200\t0\t11\nchr17\t24630000\t24636300\t0\t75\nchr17\t24638100\t24642300\t0\t53\nchr17\t24643500\t24645300\t0\t50\nchr17\t24648000\t24648300\t0\t11\nchr17\t24649800\t24650100\t0\t10\nchr17\t24651300\t24652200\t0\t34\nchr17\t24654300\t24656700\t0\t20\nchr17\t24660600\t24662100\t0\t24\nchr17\t24663600\t24665100\t0\t38\nchr17\t24668400\t24670200\t0\t53\nchr17\t24672300\t24676200\t0\t159\nchr17\t24677700\t24678000\t0\t14\nchr17\t24681000\t24683400\t0\t54\nchr17\t24685500\t24685800\t0\t12\nchr17\t24688500\t24697800\t0\t67\nchr17\t24699600\t24700200\t0\t13\nchr17\t24702300\t24703500\t0\t156\nchr17\t24707700\t24714600\t0\t66\nchr17\t24716100\t24716700\t0\t13\nchr17\t24718200\t24719100\t0\t567\nchr17\t24722400\t24723900\t0\t18\nchr17\t24729300\t24729600\t0\t12\nchr17\t24734400\t24736800\t0\t149\nchr17\t24740100\t24742500\t0\t1219\nchr17\t24744300\t24744600\t0\t11\nchr17\t24745800\t24748800\t0\t1244\nchr17\t24750600\t24754200\t0\t334\nchr17\t24758400\t24759300\t0\t30\nchr17\t24760500\t24762600\t0\t12\nchr17\t24765300\t24766500\t0\t39\nchr17\t24770100\t24777600\t0\t2349\nchr17\t24778800\t24780000\t0\t27\nchr17\t24781500\t24784200\t0\t74\nchr17\t24786000\t24786300\t0\t10\nchr17\t24790500\t24790800\t0.2394\t24\nchr17\t24792900\t24793200\t0\t11\nchr17\t24795300\t24797400\t0\t38\nchr17\t24800100\t24802200\t0\t39\nchr17\t24809700\t24810300\t0\t16\nchr17\t24812100\t24816900\t0\t71\nchr17\t24820800\t24824700\t0\t88\nchr17\t24828300\t24828600\t0\t10\nchr17\t24830700\t24831000\t0\t14\nchr17\t24833100\t24837300\t0\t34\nchr17\t24839100\t24839400\t0\t12\nchr17\t24841500\t24843300\t0\t44\nchr17\t24845700\t24846000\t0\t20\nchr17\t24847200\t24851400\t0\t67\nchr17\t24852900\t24853500\t0\t14\nchr17\t24855900\t24856500\t0.0019\t21\nchr17\t24857700\t24858000\t0.0703\t12\nchr17\t24859500\t24861300\t0\t80\nchr17\t24863400\t24865500\t0\t14\nchr17\t24866700\t24869700\t0\t151\nchr17\t24872400\t24872700\t0\t11\nchr17\t24873900\t24879600\t0\t63\nchr17\t24882000\t24883500\t0\t22\nchr17\t24885300\t24885600\t0\t11\nchr17\t24888000\t24893700\t0\t2416\nchr17\t24895800\t24896100\t0\t12\nchr17\t24902100\t24903300\t0\t14\nchr17\t24908100\t24908700\t0\t34\nchr17\t24910500\t24910800\t0\t12\nchr17\t24913500\t24913800\t0\t36\nchr17\t24916200\t24918000\t0\t44\nchr17\t24921300\t24924000\t0\t32\nchr17\t24928200\t24929700\t0\t22\nchr17\t24931200\t24931500\t0\t13\nchr17\t24933000\t24936600\t0\t61\nchr17\t24940500\t24941100\t0\t93\nchr17\t24942600\t24945000\t0\t69\nchr17\t24954900\t24956100\t0\t37\nchr17\t24958200\t24961200\t0\t47\nchr17\t24963900\t24967800\t0\t63\nchr17\t24969000\t24969900\t0\t13\nchr17\t24975000\t24976200\t0\t20\nchr17\t24979500\t24979800\t0\t12\nchr17\t24981000\t24988200\t0\t974\nchr17\t24990900\t24991200\t0\t12\nchr17\t24992700\t24993600\t0.0528\t44\nchr17\t24994800\t24997200\t0\t62\nchr17\t24999000\t24999900\t0\t30\nchr17\t25001100\t25007100\t0\t323\nchr17\t25008600\t25010100\t0\t76\nchr17\t25011900\t25012200\t0\t21\nchr17\t25015800\t25016400\t0\t13\nchr17\t25020000\t25021800\t0\t70\nchr17\t25023000\t25025100\t0\t28\nchr17\t25028400\t25028700\t0\t13\nchr17\t25031700\t25040700\t0\t710\nchr17\t25043700\t25045200\t0\t52\nchr17\t25047600\t25050300\t0\t93\nchr17\t25053000\t25056900\t0\t138\nchr17\t25059300\t25064400\t0\t337\nchr17\t25068600\t25069200\t0\t13\nchr17\t25071000\t25077600\t0\t493\nchr17\t25078800\t25087800\t0\t199\nchr17\t25091400\t25093200\t0\t58\nchr17\t25094400\t25094700\t0\t11\nchr17\t25096200\t25098900\t0\t16\nchr17\t25101000\t25107600\t0\t1253\nchr17\t25111500\t25112700\t0.0546\t40\nchr17\t25115100\t25118400\t0\t185\nchr17\t25120200\t25120800\t0\t75\nchr17\t25122900\t25123200\t0\t11\nchr17\t25124700\t25128000\t0\t50\nchr17\t25130100\t25131000\t0\t43\nchr17\t25132200\t25135800\t0\t68\nchr17\t25139100\t25140900\t0\t2390\nchr17\t25143300\t25143900\t0.001\t63\nchr17\t25149900\t25152000\t0\t43\nchr17\t25154100\t25158300\t0\t57\nchr17\t25165500\t25165800\t0\t16\nchr17\t25167300\t25174800\t0\t76\nchr17\t25180500\t25180800\t0\t17\nchr17\t25182300\t25182600\t0\t54\nchr17\t25184700\t25187700\t0\t720\nchr17\t25190700\t25194600\t0\t50\nchr17\t25197600\t25198800\t0\t18\nchr17\t25201500\t25201800\t0\t16\nchr17\t25203600\t25204800\t0\t61\nchr17\t25207500\t25211700\t0\t197\nchr17\t25213500\t25213800\t0\t10\nchr17\t25217100\t25218000\t0\t17\nchr17\t25219200\t25221600\t0\t30\nchr17\t25227900\t25228200\t0\t18\nchr17\t25232100\t25234500\t0\t29\nchr17\t25239300\t25240500\t0\t129\nchr17\t25243200\t25245600\t0\t34\nchr17\t25247400\t25247700\t0\t26\nchr17\t25251600\t25256700\t0\t76\nchr17\t25257900\t25261200\t0\t21\nchr17\t25263900\t25266600\t0\t55\nchr17\t25268700\t25269600\t0\t16\nchr17\t25270800\t25271400\t0\t16\nchr17\t25273500\t25273800\t0\t12\nchr17\t25275600\t25275900\t0\t11\nchr17\t25277100\t25277400\t0\t10\nchr17\t25281300\t25282200\t0\t107\nchr17\t25283400\t25284300\t0\t28\nchr17\t25289100\t25295400\t0\t50\nchr17\t25298100\t25298700\t0\t17\nchr17\t25301700\t25304100\t0\t77\nchr17\t25306500\t25307100\t0\t30\nchr17\t25309800\t25311000\t0\t21\nchr17\t25314600\t25317900\t0\t82\nchr17\t25320000\t25320300\t0\t11\nchr17\t25322400\t25323000\t0\t135\nchr17\t25324800\t25326600\t0\t76\nchr17\t25328100\t25331700\t0\t217\nchr17\t25332900\t25334700\t0\t50\nchr17\t25338000\t25340400\t0\t38\nchr17\t25341900\t25344900\t0\t59\nchr17\t25346700\t25350600\t0\t34\nchr17\t25352700\t25353900\t0\t302\nchr17\t25356600\t25366200\t0\t211\nchr17\t25368000\t25368600\t0\t43\nchr17\t25371300\t25372500\t0\t36\nchr17\t25375500\t25379400\t0\t36\nchr17\t25382100\t25384800\t0\t5097\nchr17\t25387200\t25387500\t0\t36\nchr17\t25388700\t25392600\t0\t386\nchr17\t25393800\t25396800\t0\t322\nchr17\t25398300\t25400100\t0\t183\nchr17\t25403700\t25404000\t0\t30\nchr17\t25405200\t25410600\t0\t296\nchr17\t25413900\t25416900\t0\t70\nchr17\t25418700\t25419900\t0\t36\nchr17\t25421100\t25425600\t0\t48\nchr17\t25427100\t25429500\t0\t40\nchr17\t25431000\t25435500\t0\t63\nchr17\t25437300\t25440600\t0\t80\nchr17\t25443000\t25444200\t0.0009\t27\nchr17\t25445400\t25447800\t0\t38\nchr17\t25450200\t25450800\t0\t103\nchr17\t25452300\t25456200\t0\t67\nchr17\t25457700\t25458300\t0\t139\nchr17\t25462200\t25463400\t0\t41\nchr17\t25464600\t25474200\t0\t64\nchr17\t25476000\t25476900\t0\t46\nchr17\t25480200\t25481700\t0\t455\nchr17\t25482900\t25489800\t0\t455\nchr17\t25493700\t25499100\t0\t646\nchr17\t25502700\t25504500\t0\t72\nchr17\t25505700\t25506000\t0\t45\nchr17\t25507800\t25509900\t0\t28\nchr17\t25511400\t25515600\t0\t61\nchr17\t25516800\t25517100\t0\t11\nchr17\t25519500\t25520400\t0\t49\nchr17\t25521600\t25521900\t0\t49\nchr17\t25523700\t25527900\t0\t938\nchr17\t25529400\t25533600\t0\t123\nchr17\t25537500\t25540800\t0\t54\nchr17\t25542600\t25545300\t0\t54\nchr17\t25549200\t25551000\t0\t39\nchr17\t25552200\t25553400\t0\t17\nchr17\t25555500\t25561200\t0\t67\nchr17\t25563900\t25570200\t0\t4118\nchr17\t25571400\t25572600\t0\t22\nchr17\t25574100\t25575300\t0\t66\nchr17\t25578600\t25582800\t0\t70\nchr17\t25586400\t25588800\t0\t83\nchr17\t25591200\t25592400\t0\t45\nchr17\t25594200\t25600200\t0\t55\nchr17\t25603200\t25608900\t0\t74\nchr17\t25610100\t25612800\t0\t74\nchr17\t25614300\t25616700\t0\t18\nchr17\t25620000\t25620600\t0\t22\nchr17\t25621800\t25623000\t0\t30\nchr17\t25624500\t25624800\t0\t13\nchr17\t25626000\t25629300\t0\t59\nchr17\t25631400\t25638600\t0\t132\nchr17\t25639800\t25643100\t0\t74\nchr17\t25644300\t25648800\t0\t36\nchr17\t25650000\t25653600\t0\t261\nchr17\t25655400\t25661400\t0\t307\nchr17\t25665900\t25666800\t0\t28\nchr17\t25668300\t25668900\t0\t32\nchr17\t25670100\t25670400\t0.2988\t12\nchr17\t25672800\t25676700\t0\t58\nchr17\t25677900\t25681200\t0\t58\nchr17\t25683900\t25684800\t0\t62\nchr17\t25686300\t25694100\t0\t35\nchr17\t25696500\t25697700\t0\t33\nchr17\t25700700\t25704900\t0\t108\nchr17\t25708800\t25719300\t0\t51\nchr17\t25720800\t25734900\t0\t150\nchr17\t25737000\t25742100\t0\t55\nchr17\t25743300\t25743600\t0\t52\nchr17\t25745400\t25747500\t0\t52\nchr17\t25749000\t25750200\t0\t38\nchr17\t25751700\t25752000\t0.0773\t13\nchr17\t25753500\t25754700\t0\t35\nchr17\t25757700\t25758000\t0\t10\nchr17\t25759500\t25761900\t0\t31\nchr17\t25763400\t25764600\t0\t21\nchr17\t25766100\t25768200\t0\t118\nchr17\t25769400\t25775100\t0\t3795\nchr17\t25778100\t25781400\t0\t56\nchr17\t25785600\t25790400\t0\t1563\nchr17\t25794900\t25796700\t0\t217\nchr17\t25798200\t25800600\t0\t47\nchr17\t25802400\t25802700\t0\t13\nchr17\t25804200\t25806000\t0\t49\nchr17\t25807500\t25809900\t0\t37\nchr17\t25811400\t25813800\t0\t54\nchr17\t25816500\t25821000\t0\t53\nchr17\t25822500\t25826400\t0\t33\nchr17\t25827900\t25830300\t0\t66\nchr17\t25831500\t25840800\t0\t44\nchr17\t25842900\t25843200\t0\t14\nchr17\t25844700\t25847700\t0\t70\nchr17\t25850100\t25867800\t0\t303\nchr17\t25869300\t25869600\t0\t15\nchr17\t25871700\t25874100\t0\t64\nchr17\t25876200\t25878300\t0\t58\nchr17\t25881300\t25882200\t0\t62\nchr17\t25884600\t25884900\t0\t16\nchr17\t25886100\t25886700\t0.0122\t59\nchr17\t25888800\t25892700\t0\t53\nchr17\t25895100\t25895700\t0\t33\nchr17\t25898400\t25900500\t0\t25\nchr17\t25902300\t25903500\t0\t36\nchr17\t25904700\t25905900\t0\t45\nchr17\t25907700\t25914600\t0\t67\nchr17\t25917600\t25917900\t0\t21\nchr17\t25919100\t25919400\t0\t60\nchr17\t25920600\t25926000\t0\t60\nchr17\t25927500\t25930800\t0\t79\nchr17\t25934100\t25934700\t0.0314\t18\nchr17\t25936200\t25938300\t0\t21\nchr17\t25939800\t25951500\t0\t159\nchr17\t25953000\t25959600\t0\t65\nchr17\t25961400\t25967700\t0\t226\nchr17\t25969800\t25976400\t0\t233\nchr17\t25977900\t25981200\t0\t42\nchr17\t25982400\t25985700\t0\t51\nchr17\t25986900\t25991700\t0\t43\nchr17\t25994100\t25999500\t0\t110\nchr17\t26001000\t26001600\t0\t37\nchr17\t26003700\t26010000\t0\t146\nchr17\t26011800\t26028300\t0\t437\nchr17\t26029800\t26033400\t0\t205\nchr17\t26034600\t26045400\t0\t133\nchr17\t26048100\t26052600\t0\t83\nchr17\t26053800\t26054400\t0\t30\nchr17\t26055900\t26056200\t0\t27\nchr17\t26057400\t26060700\t0\t52\nchr17\t26064000\t26071200\t0\t183\nchr17\t26075100\t26083200\t0\t457\nchr17\t26084700\t26085600\t0\t74\nchr17\t26087400\t26090100\t0\t48\nchr17\t26092200\t26092800\t0.1069\t50\nchr17\t26094000\t26098500\t0\t296\nchr17\t26100600\t26106900\t0\t1578\nchr17\t26108400\t26115300\t0\t73\nchr17\t26116500\t26120100\t0\t37\nchr17\t26121900\t26123400\t0\t1755\nchr17\t26124600\t26126400\t0\t64\nchr17\t26127900\t26133300\t0\t473\nchr17\t26135400\t26136900\t0\t15\nchr17\t26138100\t26139300\t0\t33\nchr17\t26140500\t26145600\t0\t232\nchr17\t26146800\t26156700\t0\t279\nchr17\t26157900\t26161200\t0\t40\nchr17\t26163600\t26172900\t0\t164\nchr17\t26174400\t26181000\t0\t33\nchr17\t26182800\t26184600\t0\t69\nchr17\t26186100\t26192100\t0\t60\nchr17\t26193900\t26194500\t0\t18\nchr17\t26195700\t26205300\t0\t99\nchr17\t26206500\t26207700\t0\t99\nchr17\t26209800\t26210700\t0\t77\nchr17\t26212200\t26216700\t0\t61\nchr17\t26217900\t26219700\t0\t32\nchr17\t26220900\t26226900\t0\t86\nchr17\t26228400\t26229900\t0\t183\nchr17\t26231100\t26238000\t0\t53\nchr17\t26239200\t26244000\t0\t72\nchr17\t26245500\t26259300\t0\t62\nchr17\t26260800\t26261700\t0\t41\nchr17\t26263500\t26265600\t0\t63\nchr17\t26267100\t26275800\t0\t243\nchr17\t26277600\t26278200\t0\t74\nchr17\t26279700\t26280600\t0\t185\nchr17\t26282400\t26294400\t0\t388\nchr17\t26296500\t26298000\t0\t23\nchr17\t26299200\t26300100\t0.056\t458\nchr17\t26301300\t26303100\t0\t105\nchr17\t26305200\t26305500\t0\t16\nchr17\t26306700\t26311800\t0\t213\nchr17\t26313000\t26318700\t0\t40\nchr17\t26320500\t26332200\t0\t253\nchr17\t26334000\t26334900\t0\t30\nchr17\t26336400\t26337000\t0\t17\nchr17\t26338500\t26339700\t0\t40\nchr17\t26341200\t26345700\t0\t64\nchr17\t26346900\t26349900\t0\t64\nchr17\t26351400\t26353500\t0\t27\nchr17\t26355300\t26358900\t0\t124\nchr17\t26360100\t26364600\t0\t845\nchr17\t26365800\t26367000\t0\t33\nchr17\t26368500\t26373000\t0\t22\nchr17\t26374500\t26381100\t0\t226\nchr17\t26382600\t26385900\t0\t210\nchr17\t26387400\t26391300\t0\t347\nchr17\t26392500\t26396400\t0\t62\nchr17\t26397900\t26400000\t0\t691\nchr17\t26401200\t26403600\t0\t38\nchr17\t26406300\t26409900\t0\t76\nchr17\t26411400\t26415600\t0\t65\nchr17\t26416800\t26423700\t0\t60\nchr17\t26425200\t26428800\t0\t60\nchr17\t26430300\t26436300\t0\t76\nchr17\t26438700\t26442000\t0\t30\nchr17\t26443200\t26447400\t0\t1206\nchr17\t26448900\t26451000\t0\t48\nchr17\t26452200\t26466000\t0\t248\nchr17\t26467500\t26474400\t0\t83\nchr17\t26475900\t26477100\t0\t21\nchr17\t26478300\t26487900\t0\t52\nchr17\t26490000\t26490600\t0\t36\nchr17\t26492100\t26496000\t0\t2782\nchr17\t26497200\t26498700\t0\t39\nchr17\t26500200\t26501700\t0\t35\nchr17\t26502900\t26504400\t0\t69\nchr17\t26505600\t26510100\t0\t73\nchr17\t26511900\t26512200\t0\t16\nchr17\t26514000\t26517900\t0\t29\nchr17\t26519100\t26521200\t0\t20\nchr17\t26523300\t26528400\t0\t58\nchr17\t26529900\t26540100\t0\t66\nchr17\t26541600\t26544900\t0\t256\nchr17\t26546100\t26547900\t0\t256\nchr17\t26549700\t26553600\t0\t256\nchr17\t26554800\t26555700\t0\t45\nchr17\t26557200\t26564400\t0\t58\nchr17\t26565600\t26603100\t0\t814\nchr17\t26604600\t26610600\t0\t2180\nchr17\t26612100\t26618700\t0\t2180\nchr17\t26620800\t26623800\t0\t76\nchr17\t26806500\t26807400\t0.0473\t319\nchr17\t26809200\t26809500\t0.2507\t663\nchr17\t26812200\t26812500\t0.0814\t129\nchr17\t26814900\t26815200\t0.2553\t188\nchr17\t26828100\t26828400\t0.2797\t480\nchr17\t26832300\t26832600\t0.0899\t779\nchr17\t26846100\t26846400\t0.2735\t148\nchr17\t26851500\t26851800\t0.1985\t289\nchr17\t26854500\t26854800\t0.2485\t321\nchr17\t26862900\t26863200\t0.1904\t178\nchr17\t26869800\t26870100\t0.1081\t645\nchr17\t26879400\t26881500\t0\t1028\nchr17\t26884200\t26884500\t0.0248\t426\nchr17\t26936100\t26938500\t0.145\t6317\nchr17\t26939700\t26940900\t0.2085\t2591\nchr17\t27161100\t27162300\t0.0031\t76\nchr17\t27210300\t27210600\t0.0338\t54\nchr17\t27212700\t27213300\t0.0663\t34\nchr17\t27829200\t27829800\t0\t54\nchr17\t27831300\t27831600\t0.0195\t64\nchr17\t27838200\t27839700\t0.0075\t69\nchr17\t28455600\t28456200\t0\t26\nchr17\t29895600\t29896200\t0\t38\nchr17\t30440100\t30441900\t0\t99\nchr17\t30617100\t30621600\t0\t71\nchr17\t30625800\t30630300\t0\t76\nchr17\t30654900\t30655200\t0.0695\t37\nchr17\t30668400\t30668700\t0.0117\t48\nchr17\t30700500\t30700800\t0.1803\t40\nchr17\t30732300\t30732600\t0.0731\t66\nchr17\t32028000\t32028900\t0\t52\nchr17\t32084400\t32084700\t0.0559\t58\nchr17\t32091000\t32091600\t0\t56\nchr17\t32680200\t32680500\t0.0028\t65\nchr17\t32682900\t32683200\t0.0975\t96\nchr17\t32889000\t32892900\t0\t79\nchr17\t33542400\t33542700\t0.0525\t53\nchr17\t34293600\t34296300\t0.0396\t83\nchr17\t36162300\t36162600\t0.045\t112\nchr17\t36164400\t36164700\t0.045\t112\nchr17\t36166500\t36168300\t0.0124\t80\nchr17\t36169800\t36170700\t0\t115\nchr17\t36172200\t36174900\t0\t115\nchr17\t36176100\t36176400\t0\t90\nchr17\t36177600\t36179100\t0\t90\nchr17\t36208800\t36209100\t0.0248\t35\nchr17\t36227100\t36230700\t0\t94\nchr17\t36233700\t36234000\t0\t94\nchr17\t36235200\t36236100\t0\t55\nchr17\t36237600\t36238200\t0\t55\nchr17\t36239700\t36290400\t0\t136\nchr17\t36291600\t36350100\t0\t141\nchr17\t36351300\t36385200\t0\t134\nchr17\t36386400\t36388200\t0\t126\nchr17\t36391500\t36392700\t0.0051\t101\nchr17\t36394500\t36394800\t0.0037\t68\nchr17\t36396000\t36396900\t0.0037\t68\nchr17\t36398100\t36399300\t0\t66\nchr17\t36400500\t36400800\t0\t66\nchr17\t36402300\t36410100\t0\t66\nchr17\t36411600\t36414900\t0\t67\nchr17\t36416100\t36420300\t0\t108\nchr17\t36422400\t36426600\t0\t108\nchr17\t36428100\t36433500\t0\t108\nchr17\t36434700\t36437400\t0\t108\nchr17\t36438900\t36443100\t0\t99\nchr17\t36445200\t36445500\t0.2335\t77\nchr17\t36450300\t36452400\t0\t66\nchr17\t37894200\t37896600\t0\t78\nchr17\t37898100\t37901100\t0\t74\nchr17\t37902600\t37911600\t0\t66\nchr17\t37913700\t37918500\t0\t151\nchr17\t37920300\t37950600\t0\t151\nchr17\t37952400\t37957500\t0\t98\nchr17\t37958700\t37966800\t0\t131\nchr17\t37969800\t37972800\t0\t152\nchr17\t37974000\t38250000\t0\t152\nchr17\t38253600\t38253900\t0.0743\t63\nchr17\t38630700\t38632200\t0.0406\t51\nchr17\t41083500\t41083800\t0.1687\t30\nchr17\t41204100\t41205900\t0.0943\t80\nchr17\t41227200\t41227800\t0.0169\t45\nchr17\t41238600\t41239200\t0.0239\t41\nchr17\t42264900\t42265200\t0.2662\t37\nchr17\t42338100\t42338400\t0.0909\t22\nchr17\t43228200\t43230300\t0\t67\nchr17\t43233000\t43304700\t0\t410\nchr17\t43323000\t43323600\t0\t194\nchr17\t44034900\t44035500\t0.0018\t61\nchr17\t44179800\t44180400\t0.0608\t71\nchr17\t45180600\t45180900\t0\t11\nchr17\t45498000\t45498300\t0.0264\t82\nchr17\t45512100\t45519900\t0\t120\nchr17\t45526800\t45529200\t0\t49\nchr17\t45531300\t45532200\t0.0163\t75\nchr17\t45534300\t45534600\t0.0072\t60\nchr17\t45535800\t45536100\t0.0072\t60\nchr17\t45537900\t45547500\t0\t94\nchr17\t45550800\t45561300\t0\t108\nchr17\t45599100\t45599700\t0.0231\t59\nchr17\t45602700\t45603000\t0.0021\t93\nchr17\t46237500\t46238100\t0.1447\t56\nchr17\t46242600\t46243500\t0\t74\nchr17\t46246200\t46246500\t0\t74\nchr17\t46293000\t46298100\t0\t98\nchr17\t46299300\t46305300\t0\t81\nchr17\t46307100\t46311000\t0\t81\nchr17\t46313100\t46314300\t0\t127\nchr17\t46315500\t46316400\t0\t127\nchr17\t46317600\t46321200\t0\t127\nchr17\t46322400\t46323300\t0\t127\nchr17\t46326000\t46332300\t0\t127\nchr17\t46333800\t46339800\t0\t127\nchr17\t46341000\t46365000\t0\t127\nchr17\t46366200\t46403400\t0\t127\nchr17\t46406100\t46409100\t0\t91\nchr17\t46410300\t46444200\t0\t87\nchr17\t46445400\t46449000\t0\t93\nchr17\t46450500\t46455300\t0\t93\nchr17\t46456500\t46457400\t0\t93\nchr17\t46459200\t46460100\t0\t87\nchr17\t46464000\t46467300\t0\t87\nchr17\t46468500\t46473600\t0\t82\nchr17\t46476000\t46477500\t0\t86\nchr17\t46479000\t46486800\t0\t86\nchr17\t46488000\t46488600\t0.0535\t83\nchr17\t46503900\t46504500\t0\t112\nchr17\t46506300\t46511100\t0\t112\nchr17\t46512300\t46518000\t0\t112\nchr17\t46520100\t46525200\t0\t102\nchr17\t46527600\t46528500\t0.0555\t93\nchr17\t46530600\t46531800\t0.0033\t82\nchr17\t46533000\t46533900\t0.1057\t91\nchr17\t46535400\t46539000\t0\t95\nchr17\t46544100\t46550400\t0\t115\nchr17\t46551900\t46552500\t0.0022\t82\nchr17\t46554300\t46557900\t0\t125\nchr17\t46559100\t46568100\t0\t125\nchr17\t46569900\t46608600\t0\t89\nchr17\t46610400\t46621800\t0\t89\nchr17\t46623000\t46630500\t0\t92\nchr17\t46631700\t46632900\t0\t92\nchr17\t46634100\t46666800\t0\t90\nchr17\t46668000\t46675200\t0\t90\nchr17\t46676700\t46677900\t0\t87\nchr17\t46680600\t46692300\t0\t87\nchr17\t46693800\t46694100\t0.075\t76\nchr17\t46695300\t46704600\t0\t84\nchr17\t46705800\t46706400\t0.027\t83\nchr17\t47016600\t47016900\t0.064\t107\nchr17\t47021400\t47021700\t0.0105\t63\nchr17\t47025600\t47025900\t0.1085\t69\nchr17\t47039400\t47041200\t0\t52\nchr17\t47046600\t47047200\t0\t40\nchr17\t47048700\t47049000\t0.0513\t100\nchr17\t49151100\t49151400\t0\t16\nchr17\t49423500\t49423800\t0.0169\t64\nchr17\t51624900\t51625200\t0.1893\t45\nchr17\t52185600\t52185900\t0.1435\t64\nchr17\t52405500\t52405800\t0.0545\t67\nchr17\t52408200\t52408500\t0.1133\t82\nchr17\t55503000\t55503300\t0.1348\t83\nchr17\t55506000\t55506900\t0.0182\t59\nchr17\t56051100\t56051400\t0.0271\t86\nchr17\t56190900\t56192700\t0.0013\t74\nchr17\t59574000\t59574300\t0.0398\t51\nchr17\t59578200\t59578500\t0\t80\nchr17\t59579700\t59581500\t0\t80\nchr17\t59582700\t59585100\t0\t71\nchr17\t59593200\t59593500\t0.0141\t57\nchr17\t59597100\t59597400\t0.046\t52\nchr17\t59978100\t59978400\t0.0361\t53\nchr17\t59979600\t59979900\t0.1459\t56\nchr17\t59982000\t59982300\t0.0117\t72\nchr17\t59990400\t59992800\t0\t64\nchr17\t59994000\t59995800\t0\t64\nchr17\t59997000\t59997300\t0\t64\nchr17\t60001200\t60001500\t0.0238\t60\nchr17\t60009900\t60010200\t0.0594\t87\nchr17\t60020400\t60027900\t0\t93\nchr17\t60029400\t60034500\t0\t93\nchr17\t60111000\t60126300\t0\t86\nchr17\t60882900\t60885600\t0.0055\t87\nchr17\t61111800\t61113600\t0.0073\t87\nchr17\t62234700\t62235000\t0.0718\t114\nchr17\t62263800\t62264100\t0.0448\t74\nchr17\t62265300\t62266800\t0.0448\t74\nchr17\t63862800\t63863100\t0.0306\t58\nchr17\t63872700\t63873000\t0.0589\t64\nchr17\t63886200\t63886500\t0.0547\t64\nchr17\t63895500\t63896100\t0.0076\t80\nchr17\t64884000\t64896600\t0\t92\nchr17\t64897800\t64898100\t0\t102\nchr17\t64900500\t64900800\t0\t102\nchr17\t64902300\t64903500\t0\t102\nchr17\t64904700\t64906500\t0\t102\nchr17\t66596700\t66602400\t0\t88\nchr17\t66798600\t66799500\t0.2375\t1205\nchr17\t68409000\t68410500\t0.0695\t83\nchr17\t69002100\t69002400\t0.0782\t62\nchr17\t69741600\t69741900\t0.0812\t99\nchr17\t70459200\t70464900\t0\t90\nchr17\t70545000\t70550400\t0\t101\nchr17\t71608800\t71609100\t0.0089\t25\nchr17\t77777100\t77777400\t0.0323\t62\nchr17\t80488500\t80488800\t0.2526\t24\nchr17\t80601600\t80602200\t0\t46\nchr17\t80748900\t80749200\t0.2736\t59\nchr17\t80963400\t80963700\t0.1822\t45\nchr17\t82448400\t82448700\t0\t54\nchr17\t82764900\t82765200\t0.0393\t58\nchr17\t82903800\t82904100\t0.2949\t33\nchr17\t82971600\t82971900\t0.1187\t64\nchr17\t83208600\t83211600\t0.0006\t67\nchr17\t83212800\t83214000\t0.0004\t53\nchr17\t83215500\t83223000\t0\t141\nchr17\t83224500\t83230800\t0\t141\nchr17\t83232600\t83234400\t0\t141\nchr17\t83238300\t83238600\t0.0317\t65\nchr17\t83240700\t83241000\t0.1068\t47\nchr17\t83242800\t83247300\t0\t79\nchr18\t9900\t45600\t0\t152\nchr18\t108600\t109200\t0.0446\t13721\nchr18\t117600\t117900\t0.0331\t66\nchr18\t126000\t126300\t0.0049\t47\nchr18\t219000\t219300\t0.2311\t71\nchr18\t536700\t541500\t0\t84\nchr18\t972900\t974100\t0.0793\t97\nchr18\t975300\t975600\t0.1971\t58\nchr18\t1520700\t1521000\t0.1566\t65\nchr18\t1534200\t1534500\t0.0284\t46\nchr18\t1720500\t1720800\t0.0033\t24\nchr18\t2001000\t2001300\t0.1181\t48\nchr18\t2248500\t2248800\t0.236\t91\nchr18\t2251800\t2252100\t0.0771\t168\nchr18\t4474200\t4474800\t0.0683\t84\nchr18\t4650000\t4650300\t0.1137\t43\nchr18\t5332800\t5334300\t0.0142\t52\nchr18\t5681700\t5682000\t0.0029\t69\nchr18\t5685000\t5687700\t0\t94\nchr18\t6273000\t6273300\t0.0151\t107\nchr18\t7399200\t7401300\t0.0679\t46\nchr18\t7692000\t7692300\t0.053\t53\nchr18\t7967100\t7971900\t0.002\t109\nchr18\t8057700\t8062800\t0.0016\t82\nchr18\t9815400\t9816000\t0.0119\t30\nchr18\t10573500\t10574100\t0.0887\t108\nchr18\t10606200\t10606500\t0.0544\t64\nchr18\t10643400\t10643700\t0.114\t78\nchr18\t10646100\t10646400\t0.1295\t42\nchr18\t11804400\t11804700\t0.1491\t49\nchr18\t12077700\t12078000\t0.1295\t72\nchr18\t12081600\t12081900\t0.0693\t47\nchr18\t12141600\t12144900\t0\t77\nchr18\t12147000\t12149700\t0\t77\nchr18\t12179700\t12180000\t0.2801\t62\nchr18\t12204300\t12205500\t0.0108\t68\nchr18\t12228900\t12229200\t0.0548\t52\nchr18\t13976100\t13981200\t0\t80\nchr18\t14165100\t14165400\t0.0266\t59\nchr18\t14387400\t14387700\t0.0292\t74\nchr18\t14388900\t14389200\t0.0292\t74\nchr18\t14629500\t14629800\t0.1696\t36\nchr18\t14634300\t14634600\t0.1222\t48\nchr18\t14721000\t14721300\t0.1676\t47\nchr18\t14800800\t14804400\t0\t54\nchr18\t14811600\t14815200\t0\t53\nchr18\t14823000\t14823300\t0.0226\t64\nchr18\t14857500\t14859900\t0.0196\t47\nchr18\t15213300\t15213900\t0\t48\nchr18\t15461400\t15464700\t0\t143\nchr18\t15466500\t15466800\t0.011\t62\nchr18\t15468300\t15473400\t0\t336\nchr18\t15474900\t15475800\t0\t336\nchr18\t15477000\t15480900\t0\t336\nchr18\t15482400\t15486300\t0.036\t178\nchr18\t15487800\t15507300\t0\t275\nchr18\t15508800\t15516900\t0\t227\nchr18\t15518400\t15520500\t0.0064\t179\nchr18\t15521700\t15549600\t0\t261\nchr18\t15551400\t15555000\t0\t430\nchr18\t15556200\t15562500\t0\t260\nchr18\t15563700\t15571200\t0\t241\nchr18\t15572700\t15573300\t0\t241\nchr18\t15574500\t15576600\t0\t149\nchr18\t15578700\t15616200\t0\t240\nchr18\t15618000\t15631200\t0\t166\nchr18\t15632400\t15642300\t0\t187\nchr18\t15643800\t15645300\t0.0105\t150\nchr18\t15647100\t15661800\t0\t177\nchr18\t15663300\t15665400\t0\t155\nchr18\t15667500\t15680400\t0\t210\nchr18\t15682500\t15685800\t0.0066\t124\nchr18\t15687600\t15691800\t0\t134\nchr18\t15693000\t15693900\t0\t157\nchr18\t15695400\t15703800\t0\t101\nchr18\t15705000\t15706500\t0\t135\nchr18\t15707700\t15713100\t0\t135\nchr18\t15715200\t15718500\t0.0028\t179\nchr18\t15719700\t15720600\t0\t98\nchr18\t15722100\t15726900\t0\t148\nchr18\t15728100\t15739500\t0\t148\nchr18\t15741600\t15751500\t0\t130\nchr18\t15753300\t15754800\t0\t130\nchr18\t15756900\t15758700\t0\t175\nchr18\t15760200\t15769800\t0\t175\nchr18\t15771000\t15771600\t0\t193\nchr18\t15772800\t15780900\t0\t193\nchr18\t15786000\t15786300\t0.0375\t38\nchr18\t15788100\t15788400\t0\t31\nchr18\t15792900\t15794700\t0.0347\t61\nchr18\t15797400\t15798900\t0\t572\nchr18\t15800400\t15809400\t0\t572\nchr18\t15810600\t15819300\t0\t572\nchr18\t15820500\t15821700\t0\t572\nchr18\t15822900\t16046400\t0\t572\nchr18\t16047600\t16464900\t0\t572\nchr18\t16466100\t16618200\t0\t572\nchr18\t16619700\t16769700\t0\t572\nchr18\t16771200\t16864200\t0\t284\nchr18\t16865400\t16920900\t0\t237\nchr18\t16922100\t16930200\t0\t293\nchr18\t16931400\t17376900\t0\t293\nchr18\t17378100\t17731200\t0\t293\nchr18\t17732400\t17803200\t0\t293\nchr18\t17805300\t17810700\t0\t238\nchr18\t17811900\t17938800\t0\t238\nchr18\t17940000\t18040500\t0\t238\nchr18\t18041700\t18381600\t0\t288\nchr18\t18382800\t18394200\t0\t164\nchr18\t18395700\t18446400\t0\t228\nchr18\t18447600\t18519000\t0\t228\nchr18\t18520200\t18616800\t0\t286\nchr18\t18618300\t18788100\t0\t307\nchr18\t18789300\t18885600\t0\t307\nchr18\t18886800\t18980700\t0\t388\nchr18\t18981900\t19162200\t0\t388\nchr18\t19163400\t19275300\t0\t220\nchr18\t19276800\t19352400\t0\t264\nchr18\t19353600\t19415700\t0\t264\nchr18\t19417200\t19479600\t0\t264\nchr18\t19480800\t19622100\t0\t202\nchr18\t19624200\t19691400\t0\t231\nchr18\t19692600\t19719000\t0\t271\nchr18\t19720200\t19803300\t0\t271\nchr18\t19804500\t19868700\t0\t271\nchr18\t19870200\t19913100\t0\t385\nchr18\t19914600\t20075100\t0\t385\nchr18\t20076300\t20198400\t0\t385\nchr18\t20199600\t20561400\t0\t385\nchr18\t20564400\t20564700\t0\t13\nchr18\t20571600\t20572200\t0.0038\t72\nchr18\t20573400\t20573700\t0.036\t43\nchr18\t20576700\t20577900\t0\t85\nchr18\t20580300\t20581500\t0\t83\nchr18\t20584200\t20584800\t0.0041\t117\nchr18\t20586000\t20586300\t0.0041\t117\nchr18\t20591400\t20592300\t0.0262\t55\nchr18\t20599800\t20600100\t0.0943\t38\nchr18\t20602200\t20611500\t0\t159\nchr18\t20613000\t20677500\t0\t159\nchr18\t20678700\t20696400\t0\t102\nchr18\t20697900\t20715600\t0\t102\nchr18\t20716800\t20720400\t0\t102\nchr18\t20721600\t20726700\t0\t93\nchr18\t20727900\t20732700\t0\t47\nchr18\t20733900\t20734500\t0\t47\nchr18\t20738700\t20739900\t0\t102\nchr18\t20741700\t20742900\t0\t75\nchr18\t20745000\t20745600\t0.0116\t88\nchr18\t20748000\t20754900\t0\t114\nchr18\t20756400\t20757000\t0\t114\nchr18\t20758500\t20758800\t0\t114\nchr18\t20760600\t20763600\t0\t114\nchr18\t20766000\t20768100\t0\t114\nchr18\t20769300\t20773800\t0\t64\nchr18\t20775000\t20775300\t0\t64\nchr18\t20776500\t20781000\t0\t128\nchr18\t20782500\t20785500\t0\t20\nchr18\t20787900\t20789400\t0\t29\nchr18\t20791800\t20798400\t0\t76\nchr18\t20803800\t20805900\t0\t76\nchr18\t20807400\t20807700\t0.0828\t64\nchr18\t20810700\t20811000\t0.0302\t68\nchr18\t20812200\t20812500\t0.0302\t68\nchr18\t20813700\t20814600\t0\t56\nchr18\t20817600\t20818200\t0\t49\nchr18\t20820300\t20822100\t0\t35\nchr18\t20824800\t20825100\t0.0532\t23\nchr18\t20835000\t20835600\t0.0032\t38\nchr18\t20837100\t20837700\t0.059\t28\nchr18\t20838900\t20839800\t0\t95\nchr18\t20911200\t20912400\t0\t51\nchr18\t20915100\t20920800\t0.0012\t138\nchr18\t20923200\t20931900\t0\t183\nchr18\t20935200\t20935500\t0.1353\t42\nchr18\t20945700\t20946000\t0.0073\t49\nchr18\t22533600\t22533900\t0.0243\t54\nchr18\t22581600\t22581900\t0.0083\t28\nchr18\t22819500\t22819800\t0.0228\t43\nchr18\t24619200\t24620100\t0.1677\t58\nchr18\t24623700\t24624000\t0.0357\t73\nchr18\t24713100\t24713400\t0.0342\t88\nchr18\t24715200\t24715800\t0.1036\t57\nchr18\t25485300\t25487100\t0\t83\nchr18\t26169900\t26170200\t0.1695\t65\nchr18\t26248500\t26248800\t0.0014\t26\nchr18\t27515100\t27515400\t0.1694\t63\nchr18\t27740100\t27740400\t0.0132\t105\nchr18\t28417200\t28419600\t0.021\t123\nchr18\t28783800\t28784100\t0\t22\nchr18\t30024300\t30025200\t0\t81\nchr18\t31348800\t31350300\t0.0281\t71\nchr18\t32858400\t32860800\t0.0078\t80\nchr18\t34554000\t34554300\t0.0409\t86\nchr18\t35206800\t35209800\t0.0023\t84\nchr18\t35211000\t35211300\t0.0905\t80\nchr18\t36236100\t36236400\t0.0997\t71\nchr18\t36240000\t36240300\t0.1\t87\nchr18\t36986700\t36987300\t0.0145\t60\nchr18\t37819800\t37825200\t0\t77\nchr18\t37973400\t37973700\t0.246\t65\nchr18\t39566700\t39568200\t0.0024\t60\nchr18\t39569400\t39570600\t0.1054\t66\nchr18\t39860400\t39861600\t0.0309\t61\nchr18\t40845300\t40847700\t0\t92\nchr18\t41636100\t41637600\t0.0488\t88\nchr18\t41776200\t41776500\t0.1608\t91\nchr18\t41778000\t41779800\t0\t83\nchr18\t43299600\t43300200\t0.0946\t83\nchr18\t43326000\t43326300\t0.0769\t92\nchr18\t43451700\t43452300\t0\t46\nchr18\t43873500\t43873800\t0.1508\t21\nchr18\t45080400\t45081000\t0\t37\nchr18\t46962300\t46970100\t0\t326\nchr18\t47019900\t47031000\t0\t275\nchr18\t47348400\t47348700\t0.0737\t57\nchr18\t47661000\t47666100\t0\t89\nchr18\t48276600\t48276900\t0.0521\t48\nchr18\t48469800\t48470100\t0.0721\t24\nchr18\t48511200\t48511500\t0.0436\t108\nchr18\t49202400\t49202700\t0.2051\t105\nchr18\t50344200\t50349300\t0\t88\nchr18\t51741300\t51742200\t0.0113\t85\nchr18\t51744900\t51745800\t0.1853\t73\nchr18\t52792500\t52793100\t0.1119\t881\nchr18\t53173800\t53174100\t0.0651\t55\nchr18\t54342600\t54344400\t0.0088\t68\nchr18\t54400200\t54400500\t0.1752\t44\nchr18\t54426600\t54430500\t0\t68\nchr18\t55889100\t55889400\t0.0222\t74\nchr18\t56529600\t56529900\t0.0778\t70\nchr18\t57264900\t57265200\t0.1302\t48\nchr18\t57642300\t57642600\t0.1141\t113\nchr18\t57720300\t57720600\t0.2043\t92\nchr18\t57723300\t57723600\t0.09\t79\nchr18\t57724800\t57725100\t0.0601\t66\nchr18\t58170300\t58171200\t0\t67\nchr18\t59404200\t59409600\t0\t107\nchr18\t60031200\t60031500\t0.1316\t78\nchr18\t61023300\t61023600\t0.1516\t38\nchr18\t61074600\t61075200\t0\t72\nchr18\t61561500\t61561800\t0.0272\t69\nchr18\t61716600\t61718100\t0.1092\t75\nchr18\t62581500\t62581800\t0.178\t36\nchr18\t62906700\t62912100\t0\t103\nchr18\t63063600\t63063900\t0.1234\t218\nchr18\t63863400\t63866100\t0.0027\t70\nchr18\t65779500\t65779800\t0.0385\t44\nchr18\t68227200\t68227800\t0.0122\t61\nchr18\t68538900\t68541600\t0\t30\nchr18\t68786400\t68786700\t0.2248\t59\nchr18\t68859300\t68859600\t0.0539\t50\nchr18\t69450300\t69454200\t0.0578\t102\nchr18\t70685400\t70686600\t0.0115\t136\nchr18\t70746900\t70752300\t0\t76\nchr18\t71179500\t71179800\t0.0301\t24\nchr18\t71656800\t71657400\t0.0508\t37\nchr18\t72966900\t72972300\t0\t94\nchr18\t72975600\t72976200\t0.0481\t75\nchr18\t74485200\t74485500\t0.0805\t15\nchr18\t74998800\t74999100\t0.0004\t90\nchr18\t75847500\t75852600\t0\t112\nchr18\t77028300\t77028600\t0.0699\t70\nchr18\t78371100\t78372300\t0.0129\t20\nchr18\t78437400\t78438000\t0.0625\t334\nchr18\t78502500\t78502800\t0.0018\t74\nchr18\t78513600\t78514800\t0.2194\t60\nchr18\t78753900\t78754200\t0.1537\t36\nchr18\t79015800\t79016700\t0.1763\t66\nchr18\t79035000\t79035300\t0.2596\t58\nchr18\t79115700\t79116600\t0.0367\t64\nchr18\t79308900\t79309200\t0.1281\t42\nchr18\t79356900\t79358700\t0.0552\t66\nchr18\t79550400\t79551900\t0\t26\nchr18\t79745400\t79746300\t0\t37\nchr18\t79752600\t79752900\t0.0878\t24\nchr18\t79764600\t79765500\t0.1719\t57\nchr18\t79808400\t79808700\t0.1089\t19\nchr18\t79830900\t79831500\t0.0503\t61\nchr18\t79886100\t79887000\t0\t69\nchr18\t79920300\t79921500\t0.1145\t50\nchr18\t80071500\t80073000\t0.0439\t110\nchr18\t80262900\t80263500\t0.191\t402\nchr19\t60000\t92700\t0\t132\nchr19\t94800\t95100\t0\t132\nchr19\t97800\t99000\t0.0081\t90\nchr19\t100200\t100500\t0.0119\t82\nchr19\t104400\t107400\t0.0003\t89\nchr19\t109500\t109800\t0\t106\nchr19\t111000\t224700\t0\t106\nchr19\t225900\t226500\t0\t106\nchr19\t227700\t229200\t0\t106\nchr19\t230700\t235200\t0\t80\nchr19\t239400\t239700\t0.083\t95\nchr19\t312600\t312900\t0.2867\t40\nchr19\t332700\t333600\t0.0197\t57\nchr19\t361200\t361800\t0.1338\t78\nchr19\t399900\t400500\t0.1577\t37\nchr19\t432300\t432900\t0.1025\t14\nchr19\t1033800\t1034100\t0.1481\t12\nchr19\t1148700\t1149000\t0.0781\t30\nchr19\t1195200\t1198500\t0\t36\nchr19\t2418600\t2418900\t0.2378\t32\nchr19\t2713500\t2713800\t0.202\t55\nchr19\t3177900\t3178200\t0.1305\t47\nchr19\t3649200\t3649800\t0\t90\nchr19\t3973200\t3975000\t0\t43\nchr19\t5076300\t5076600\t0.2967\t97\nchr19\t5611200\t5611500\t0\t54\nchr19\t5649000\t5649600\t0\t61\nchr19\t7007400\t7007700\t0.04\t67\nchr19\t7010400\t7010700\t0.0217\t67\nchr19\t7019400\t7032600\t0\t101\nchr19\t7035000\t7035300\t0.0493\t84\nchr19\t7037700\t7051500\t0\t92\nchr19\t7056900\t7059900\t0\t95\nchr19\t7061100\t7061400\t0\t95\nchr19\t8274000\t8274300\t0.0126\t35\nchr19\t8276400\t8277600\t0.0225\t31\nchr19\t8280000\t8282100\t0\t38\nchr19\t8284500\t8286300\t0\t38\nchr19\t8288100\t8289300\t0\t37\nchr19\t8290500\t8292300\t0\t33\nchr19\t8293800\t8296800\t0\t30\nchr19\t8298600\t8300700\t0.0045\t37\nchr19\t8741400\t8767200\t0\t250\nchr19\t8769000\t8773800\t0\t259\nchr19\t8775000\t8778900\t0\t259\nchr19\t8780400\t8786700\t0\t233\nchr19\t11424600\t11424900\t0.212\t22\nchr19\t12006900\t12007200\t0.1082\t70\nchr19\t13703100\t13703400\t0.1915\t69\nchr19\t13936800\t13937100\t0.2977\t28\nchr19\t14622600\t14623200\t0\t27\nchr19\t15931500\t15933000\t0.0489\t81\nchr19\t17349000\t17349300\t0.2568\t103\nchr19\t20148900\t20150400\t0.0801\t54\nchr19\t21720300\t21722700\t0\t57\nchr19\t21864900\t21865200\t0.0329\t74\nchr19\t21866400\t21866700\t0.0265\t72\nchr19\t22925700\t22926000\t0.0574\t65\nchr19\t23134800\t23135100\t0.1443\t83\nchr19\t24411000\t24413400\t0\t77\nchr19\t24420900\t24432000\t0\t427\nchr19\t24433500\t24449100\t0\t427\nchr19\t24891300\t24891900\t0.1596\t651\nchr19\t24894600\t24895500\t0.0686\t418\nchr19\t24908400\t24908700\t0.006\t15\nchr19\t27645000\t27645300\t0.1251\t60\nchr19\t28805100\t28805400\t0.2978\t15\nchr19\t29229600\t29230800\t0\t69\nchr19\t29460000\t29464800\t0\t73\nchr19\t29898000\t29902200\t0\t72\nchr19\t30141300\t30143700\t0\t65\nchr19\t31653600\t31654200\t0\t64\nchr19\t34078800\t34080300\t0\t63\nchr19\t34861500\t34861800\t0.049\t94\nchr19\t35360400\t35360700\t0.038\t45\nchr19\t36247200\t36247500\t0.1559\t66\nchr19\t36269100\t36309000\t0\t240\nchr19\t36312000\t36312600\t0\t57\nchr19\t36699900\t36700200\t0.1214\t56\nchr19\t37266000\t37266600\t0.0716\t61\nchr19\t37269300\t37280400\t0\t321\nchr19\t37282500\t37293000\t0\t411\nchr19\t37294800\t37303200\t0\t411\nchr19\t37751100\t37751400\t0.1751\t28\nchr19\t37838100\t37843200\t0\t76\nchr19\t37866300\t37866900\t0.0056\t80\nchr19\t38540400\t38540700\t0.1443\t33\nchr19\t38770500\t38773500\t0\t71\nchr19\t38789400\t38792100\t0\t80\nchr19\t39876600\t39877200\t0.0806\t103\nchr19\t39880800\t39881100\t0.0288\t94\nchr19\t39883500\t39884700\t0.0444\t98\nchr19\t39887100\t39889800\t0\t111\nchr19\t39893100\t39893400\t0.2125\t110\nchr19\t39897000\t39897300\t0.0161\t109\nchr19\t39900600\t39901200\t0.0754\t101\nchr19\t39903300\t39906000\t0\t108\nchr19\t40107300\t40109700\t0.0002\t93\nchr19\t40117200\t40117800\t0.2011\t91\nchr19\t40119000\t40119300\t0.101\t66\nchr19\t40647600\t40649400\t0.0007\t56\nchr19\t40842900\t40843200\t0.1006\t60\nchr19\t40874700\t40875000\t0.0681\t63\nchr19\t40965000\t40965300\t0.1602\t80\nchr19\t41645400\t41646000\t0.0206\t71\nchr19\t42770100\t42770400\t0.2481\t74\nchr19\t43051200\t43052400\t0.017\t70\nchr19\t43356000\t43359900\t0\t73\nchr19\t43364700\t43365000\t0.014\t73\nchr19\t43369800\t43370400\t0.0435\t73\nchr19\t43374900\t43378800\t0\t71\nchr19\t43866000\t43866300\t0.2311\t44\nchr19\t44546400\t44546700\t0.0538\t77\nchr19\t44594400\t44595000\t0.048\t66\nchr19\t45648300\t45648600\t0.2218\t16\nchr19\t46039200\t46039500\t0.2929\t57\nchr19\t46438800\t46440900\t0\t37\nchr19\t46452900\t46453200\t0.2246\t11\nchr19\t47903700\t47949300\t0\t353\nchr19\t47950500\t47958600\t0\t353\nchr19\t49023300\t49023600\t0.1063\t58\nchr19\t49028100\t49028400\t0.1246\t70\nchr19\t49032600\t49032900\t0.0232\t78\nchr19\t49054500\t49054800\t0.1489\t63\nchr19\t49959600\t49959900\t0.0411\t53\nchr19\t50074800\t50075100\t0.1661\t59\nchr19\t50091600\t50098800\t0\t764\nchr19\t50100300\t50133300\t0\t812\nchr19\t50137500\t50139000\t0\t322\nchr19\t50609100\t50609400\t0.0756\t10\nchr19\t51310800\t51311100\t0.1409\t38\nchr19\t51630000\t51630300\t0.04\t53\nchr19\t51646500\t51646800\t0.0275\t69\nchr19\t51672900\t51674100\t0\t63\nchr19\t51758100\t51758400\t0.0684\t61\nchr19\t52888200\t52888500\t0.0797\t53\nchr19\t53014200\t53014500\t0.0649\t69\nchr19\t53049300\t53049600\t0.0059\t61\nchr19\t53097000\t53097300\t0.0819\t79\nchr19\t53113200\t53113500\t0.0981\t41\nchr19\t53126700\t53127000\t0.0004\t54\nchr19\t53186100\t53188200\t0\t74\nchr19\t53281800\t53282100\t0.2322\t61\nchr19\t54360000\t54360300\t0.0974\t51\nchr19\t54580500\t54581400\t0\t74\nchr19\t54780900\t54781200\t0.1369\t60\nchr19\t55450200\t55450500\t0.2292\t52\nchr19\t55773600\t55773900\t0.0363\t65\nchr19\t55824900\t55827000\t0\t71\nchr19\t56080200\t56080500\t0.0022\t32\nchr19\t56103900\t56104200\t0.2659\t24\nchr19\t56339400\t56339700\t0.023\t38\nchr19\t56444700\t56445900\t0.0672\t79\nchr19\t56669700\t56670000\t0.2661\t58\nchr19\t56745000\t56745600\t0.1629\t218\nchr19\t57834300\t57834600\t0.0192\t70\nchr19\t57882000\t57882300\t0.0865\t51\nchr19\t58106400\t58106700\t0.1481\t17\nchr19\t58337400\t58337700\t0.1195\t55\nchr19\t58587600\t58587900\t0.0974\t59\nchr19\t58589100\t58589400\t0.0437\t78\nchr19\t58591800\t58596900\t0.0111\t77\nchr19\t58598100\t58599600\t0.0137\t67\nchr19\t58600800\t58604100\t0.002\t99\nchr19\t58605600\t58605900\t0.1299\t70\nchr2\t197700\t198300\t0.0219\t46\nchr2\t207000\t207600\t0.1359\t138\nchr2\t306600\t308700\t0.211\t47\nchr2\t420600\t420900\t0.0257\t30\nchr2\t488100\t488400\t0.0756\t14\nchr2\t495300\t495600\t0.0635\t30\nchr2\t671400\t671700\t0.1278\t53\nchr2\t800400\t800700\t0.0168\t37\nchr2\t801900\t802200\t0.1086\t99\nchr2\t804900\t805200\t0.1516\t87\nchr2\t861000\t861300\t0.2527\t22\nchr2\t931800\t932400\t0.042\t20\nchr2\t1012800\t1014000\t0.0251\t38\nchr2\t1107300\t1108800\t0\t27\nchr2\t1222500\t1223100\t0.1335\t429\nchr2\t1342500\t1346100\t0\t61\nchr2\t1417500\t1417800\t0.0187\t77\nchr2\t1568700\t1569000\t0.2091\t28\nchr2\t1750500\t1750800\t0.2871\t70\nchr2\t2034600\t2036400\t0.0236\t50\nchr2\t2258100\t2259300\t0.0011\t122\nchr2\t3221100\t3221700\t0.0063\t147\nchr2\t3315300\t3315900\t0.0731\t62\nchr2\t3331500\t3332100\t0.0924\t106\nchr2\t3374700\t3375000\t0.0953\t105\nchr2\t3591000\t3591900\t0.0064\t138\nchr2\t3775200\t3775500\t0.0633\t34\nchr2\t4733700\t4739700\t0\t98\nchr2\t5069100\t5069400\t0.2057\t22\nchr2\t5197200\t5198700\t0.0379\t75\nchr2\t6238200\t6238800\t0.0122\t59\nchr2\t7120500\t7120800\t0.277\t94\nchr2\t7488600\t7488900\t0.2343\t48\nchr2\t9406200\t9406500\t0.1486\t29\nchr2\t10805400\t10805700\t0.1749\t64\nchr2\t10996200\t11001300\t0\t101\nchr2\t11091900\t11092200\t0.0611\t12\nchr2\t12522600\t12523800\t0\t102\nchr2\t13734300\t13734900\t0.1792\t86\nchr2\t14489100\t14489400\t0.0657\t63\nchr2\t14802000\t14802300\t0.124\t63\nchr2\t14851800\t14853300\t0.0762\t106\nchr2\t16230600\t16230900\t0.209\t94\nchr2\t16593900\t16599600\t0\t117\nchr2\t17984100\t17985300\t0\t76\nchr2\t18012300\t18014100\t0.0398\t94\nchr2\t18015600\t18015900\t0.1086\t62\nchr2\t18756000\t18756300\t0.1515\t24\nchr2\t19309500\t19310700\t0.0924\t130\nchr2\t19831800\t19832100\t0.2034\t73\nchr2\t21188100\t21188400\t0.2198\t86\nchr2\t22986900\t22987200\t0.0499\t89\nchr2\t23225400\t23230200\t0\t87\nchr2\t23846100\t23847000\t0\t36\nchr2\t27460200\t27460800\t0.0332\t83\nchr2\t27539400\t27540900\t0.1751\t100\nchr2\t27556800\t27558600\t0\t90\nchr2\t28458600\t28459200\t0.0194\t22\nchr2\t29093700\t29094000\t0.1604\t91\nchr2\t30613800\t30614100\t0.045\t71\nchr2\t30816900\t30817200\t0.0104\t35\nchr2\t30907800\t30908100\t0.132\t76\nchr2\t31500300\t31500600\t0.2163\t82\nchr2\t31576200\t31577100\t0.0232\t55\nchr2\t32448000\t32448300\t0.1032\t68\nchr2\t32866500\t32867100\t0.0179\t2767\nchr2\t32868300\t32870400\t0.0179\t2767\nchr2\t32916000\t32916900\t0.0063\t213491\nchr2\t34572600\t34576500\t0\t89\nchr2\t36112800\t36117300\t0\t87\nchr2\t36183000\t36184200\t0.0808\t173\nchr2\t37225500\t37225800\t0.0834\t71\nchr2\t37494300\t37494900\t0.0076\t72\nchr2\t41515200\t41515500\t0.1615\t72\nchr2\t41550600\t41553600\t0\t71\nchr2\t41746200\t41746800\t0.0272\t70\nchr2\t41748000\t41748600\t0.0085\t68\nchr2\t42993300\t42993900\t0.0543\t85\nchr2\t43296900\t43298400\t0.0971\t63\nchr2\t43660800\t43665900\t0\t112\nchr2\t44589300\t44589600\t0.0206\t43\nchr2\t45059700\t45060000\t0.1249\t55\nchr2\t45061200\t45065400\t0\t95\nchr2\t45076800\t45077100\t0\t102\nchr2\t45079200\t45080400\t0\t102\nchr2\t48555600\t48556500\t0.0693\t40\nchr2\t48744000\t48744600\t0.0567\t95\nchr2\t49638900\t49639500\t0.055\t66\nchr2\t51736800\t51737100\t0.0321\t88\nchr2\t51939300\t51939600\t0.0615\t63\nchr2\t53398800\t53400600\t0\t128\nchr2\t53592000\t53592600\t0.0393\t68\nchr2\t55739400\t55739700\t0.0959\t61\nchr2\t56552100\t56552400\t0.1106\t47\nchr2\t56683200\t56683800\t0.0145\t78\nchr2\t57192300\t57193500\t0\t30\nchr2\t57590400\t57590700\t0.0667\t83\nchr2\t58383300\t58383600\t0.1843\t72\nchr2\t59554800\t59555100\t0.1309\t72\nchr2\t60084600\t60088500\t0\t154\nchr2\t60143400\t60143700\t0.1105\t111\nchr2\t60928500\t60928800\t0.1351\t93\nchr2\t61980000\t61980600\t0.0088\t93\nchr2\t62836500\t62836800\t0.1456\t79\nchr2\t64511100\t64513200\t0\t77\nchr2\t66142200\t66142500\t0.0368\t71\nchr2\t70430400\t70430700\t0.0996\t65\nchr2\t70434600\t70434900\t0.2783\t49\nchr2\t71083500\t71083800\t0.0076\t63\nchr2\t71183100\t71183400\t0.0014\t73\nchr2\t71411700\t71416800\t0\t97\nchr2\t71769300\t71769600\t0.0293\t62\nchr2\t72016500\t72016800\t0.2309\t69\nchr2\t72020100\t72020400\t0.0718\t49\nchr2\t72065100\t72065700\t0.0116\t99\nchr2\t72702300\t72703800\t0.0141\t97\nchr2\t73166700\t73167000\t0.1394\t62\nchr2\t73785300\t73807500\t0\t144\nchr2\t74794200\t74794500\t0.1313\t59\nchr2\t75330900\t75331200\t0.1244\t83\nchr2\t76299600\t76301700\t0\t106\nchr2\t77647200\t77647800\t0.0243\t127\nchr2\t77676300\t77676600\t0.2\t30\nchr2\t77682900\t77683200\t0.0915\t63\nchr2\t77686500\t77686800\t0.0223\t37\nchr2\t77755800\t77756100\t0.0549\t123\nchr2\t79107300\t79109100\t0.0188\t112\nchr2\t79284000\t79284300\t0.0203\t94\nchr2\t79285500\t79285800\t0.1199\t76\nchr2\t81351900\t81352200\t0.0277\t53\nchr2\t81608700\t81609000\t0.1393\t74\nchr2\t83093400\t83093700\t0.1351\t91\nchr2\t83770500\t83773500\t0\t115\nchr2\t83914500\t83914800\t0.1004\t29\nchr2\t84371400\t84372000\t0.0106\t104\nchr2\t85484100\t85484700\t0.0213\t118\nchr2\t85489500\t85489800\t0.0448\t99\nchr2\t86655600\t86660700\t0\t112\nchr2\t86711700\t86712000\t0.2444\t36\nchr2\t86713500\t86713800\t0.031\t50\nchr2\t86717100\t86717400\t0.0391\t55\nchr2\t86721900\t86725200\t0\t66\nchr2\t86727000\t86727600\t0\t66\nchr2\t86730000\t86732100\t0\t77\nchr2\t86735400\t86740500\t0\t77\nchr2\t86905800\t86909400\t0\t78\nchr2\t86910900\t86913000\t0\t85\nchr2\t86915400\t86924100\t0\t78\nchr2\t86930700\t86931000\t0.1507\t80\nchr2\t86932200\t86932800\t0\t64\nchr2\t86936400\t86936700\t0.0309\t65\nchr2\t86937900\t86938200\t0.1746\t42\nchr2\t86939700\t86940000\t0.0869\t52\nchr2\t86946300\t86956500\t0\t70\nchr2\t86957700\t87014100\t0\t80\nchr2\t87015300\t87015900\t0\t72\nchr2\t87017400\t87018900\t0\t72\nchr2\t87020100\t87022500\t0\t72\nchr2\t87024600\t87032700\t0\t70\nchr2\t87036300\t87044100\t0\t86\nchr2\t87045300\t87048000\t0\t70\nchr2\t87055500\t87059700\t0\t76\nchr2\t87060900\t87061500\t0\t76\nchr2\t87064500\t87066600\t0\t72\nchr2\t87069300\t87069600\t0.0282\t52\nchr2\t87071700\t87073200\t0\t64\nchr2\t87074400\t87074700\t0.004\t57\nchr2\t87079200\t87079500\t0.1717\t55\nchr2\t87082800\t87083400\t0.1687\t49\nchr2\t87104100\t87104400\t0.0736\t65\nchr2\t87107700\t87108000\t0.0551\t49\nchr2\t87118800\t87124200\t0\t94\nchr2\t87125700\t87127500\t0\t57\nchr2\t87129300\t87129900\t0.0016\t62\nchr2\t87135000\t87136200\t0.0675\t50\nchr2\t87139500\t87139800\t0.0305\t57\nchr2\t87150600\t87162900\t0\t89\nchr2\t87171600\t87171900\t0.1269\t41\nchr2\t87180600\t87180900\t0.2761\t58\nchr2\t87184500\t87185700\t0.1192\t73\nchr2\t87191100\t87192000\t0.0117\t69\nchr2\t87194700\t87195900\t0.0578\t73\nchr2\t87201900\t87203100\t0.0774\t56\nchr2\t87207300\t87207600\t0.015\t69\nchr2\t87209400\t87209700\t0.0095\t47\nchr2\t87211800\t87212100\t0.0095\t47\nchr2\t87216300\t87216600\t0.1072\t82\nchr2\t87227400\t87227700\t0.1155\t61\nchr2\t87239100\t87239400\t0.0043\t60\nchr2\t87265200\t87267900\t0\t75\nchr2\t87277200\t87278100\t0\t83\nchr2\t87280500\t87280800\t0.0631\t55\nchr2\t87282300\t87282600\t0.1303\t33\nchr2\t87298200\t87298800\t0.0279\t72\nchr2\t87303000\t87303600\t0.0113\t54\nchr2\t87311400\t87312000\t0.0269\t60\nchr2\t87315900\t87316200\t0.0855\t61\nchr2\t87319200\t87319500\t0.1\t64\nchr2\t87326400\t87326700\t0.1785\t67\nchr2\t87340500\t87340800\t0.1158\t74\nchr2\t87349500\t87350100\t0.0153\t88\nchr2\t87357000\t87357600\t0.041\t111\nchr2\t87362700\t87363000\t0.0259\t26\nchr2\t87367200\t87367500\t0.1028\t85\nchr2\t87370500\t87370800\t0.1061\t46\nchr2\t87372300\t87372600\t0.0134\t71\nchr2\t87377700\t87378000\t0.1291\t126\nchr2\t87382500\t87383700\t0\t117\nchr2\t87384900\t87385500\t0.0293\t117\nchr2\t87390900\t87391800\t0.0496\t53\nchr2\t87393900\t87395100\t0.0022\t101\nchr2\t87408000\t87409500\t0\t80\nchr2\t87420300\t87420600\t0.1758\t77\nchr2\t87423600\t87423900\t0.1195\t74\nchr2\t87433200\t87433500\t0.0701\t70\nchr2\t87448200\t87448500\t0.1392\t56\nchr2\t87472800\t87473100\t0.1064\t64\nchr2\t87496800\t87497100\t0\t74\nchr2\t87499200\t87499500\t0\t74\nchr2\t87501900\t87507300\t0\t73\nchr2\t87511200\t87511500\t0.1596\t54\nchr2\t87513300\t87516000\t0\t76\nchr2\t87517800\t87519300\t0.0186\t76\nchr2\t87524100\t87524400\t0\t20\nchr2\t87526200\t87526800\t0\t60\nchr2\t87528600\t87530700\t0\t66\nchr2\t87534300\t87535200\t0\t62\nchr2\t87537900\t87538200\t0.0722\t64\nchr2\t87542100\t87544500\t0\t76\nchr2\t87546600\t87549300\t0\t76\nchr2\t87556500\t87557400\t0.0024\t73\nchr2\t87560100\t87561900\t0\t47\nchr2\t87564300\t87565800\t0.0056\t62\nchr2\t87570600\t87570900\t0.0239\t64\nchr2\t87572400\t87572700\t0.0689\t70\nchr2\t87573900\t87574200\t0.0689\t70\nchr2\t87581700\t87582600\t0\t68\nchr2\t87595800\t87596400\t0\t65\nchr2\t87597600\t87598200\t0\t65\nchr2\t87600600\t87605100\t0.0003\t78\nchr2\t87606900\t87607500\t0.0003\t78\nchr2\t87608700\t87610200\t0.038\t51\nchr2\t87611400\t87614700\t0\t75\nchr2\t87615900\t87616200\t0\t75\nchr2\t87618600\t87623400\t0\t86\nchr2\t87624900\t87627000\t0\t92\nchr2\t87628500\t87629400\t0\t64\nchr2\t87630600\t87631200\t0\t70\nchr2\t87632400\t87632700\t0\t70\nchr2\t87648900\t87649200\t0.0879\t57\nchr2\t87654000\t87654300\t0.0626\t72\nchr2\t87663000\t87663300\t0.0716\t51\nchr2\t87665100\t87665400\t0.0716\t51\nchr2\t87667500\t87669300\t0\t75\nchr2\t87676200\t87676500\t0.0852\t61\nchr2\t87681900\t87682500\t0.0174\t74\nchr2\t87687000\t87687600\t0.014\t72\nchr2\t87690900\t87691200\t0.0439\t67\nchr2\t87699600\t87703500\t0.0014\t74\nchr2\t87704700\t87705600\t0\t51\nchr2\t87710700\t87711900\t0.0044\t51\nchr2\t87715200\t87715500\t0.0018\t56\nchr2\t87721800\t87724500\t0\t59\nchr2\t87726000\t87730200\t0\t72\nchr2\t87732300\t87732600\t0.0819\t68\nchr2\t87738600\t87772500\t0\t97\nchr2\t87773700\t87812700\t0\t97\nchr2\t87814200\t87823500\t0\t85\nchr2\t87826500\t87827700\t0\t51\nchr2\t87828900\t87829200\t0\t51\nchr2\t87833100\t87834000\t0\t56\nchr2\t87835500\t87835800\t0.0139\t51\nchr2\t87837600\t87839100\t0\t52\nchr2\t87844800\t87845100\t0.0809\t33\nchr2\t87850500\t87852300\t0\t46\nchr2\t87854100\t87854400\t0.1039\t48\nchr2\t87855900\t87856200\t0.0419\t46\nchr2\t87858900\t87859200\t0.0349\t42\nchr2\t87861900\t87862200\t0.0011\t44\nchr2\t87865800\t87866100\t0.0166\t64\nchr2\t87867900\t87868500\t0.0077\t48\nchr2\t87871200\t87871500\t0.0855\t38\nchr2\t87879600\t87880800\t0.0113\t51\nchr2\t87887700\t87891900\t0\t54\nchr2\t87895500\t87896700\t0\t49\nchr2\t87898200\t87901800\t0\t55\nchr2\t87903000\t87910200\t0\t54\nchr2\t87912600\t87912900\t0.0247\t44\nchr2\t87914400\t87914700\t0.0252\t43\nchr2\t87917400\t87917700\t0.0219\t47\nchr2\t87924900\t87926700\t0\t57\nchr2\t87927900\t87928500\t0\t58\nchr2\t87929700\t87931800\t0\t58\nchr2\t87933000\t87933300\t0.0753\t45\nchr2\t87936600\t87936900\t0.0573\t46\nchr2\t87938400\t87939000\t0\t45\nchr2\t87941700\t87944400\t0\t55\nchr2\t87945900\t87946800\t0\t55\nchr2\t87948600\t87950400\t0\t61\nchr2\t87954000\t87956100\t0\t40\nchr2\t87960300\t87960900\t0.0033\t51\nchr2\t87963300\t87963600\t0.1192\t49\nchr2\t87965100\t87967200\t0.0598\t62\nchr2\t87970500\t87972600\t0\t64\nchr2\t87977100\t87977400\t0\t68\nchr2\t87979200\t87983700\t0\t68\nchr2\t87987300\t87987900\t0.0042\t55\nchr2\t87990900\t87991200\t0.0338\t51\nchr2\t88729800\t88732800\t0\t100\nchr2\t89070300\t89070600\t0.1162\t70\nchr2\t89096400\t89096700\t0.0497\t65\nchr2\t89106900\t89108100\t0.0129\t67\nchr2\t89110200\t89110500\t0.0257\t60\nchr2\t89123400\t89123700\t0.109\t41\nchr2\t89171700\t89172000\t0.1047\t72\nchr2\t89173200\t89173500\t0.0141\t78\nchr2\t89176800\t89177100\t0.1911\t62\nchr2\t89231100\t89231400\t0.0664\t55\nchr2\t89235600\t89238300\t0\t65\nchr2\t89242200\t89242500\t0.0338\t57\nchr2\t89249700\t89250600\t0.0238\t51\nchr2\t89252100\t89252400\t0.1112\t57\nchr2\t89255700\t89259300\t0\t65\nchr2\t89262300\t89262600\t0.0741\t60\nchr2\t89265600\t89266500\t0.0699\t59\nchr2\t89268000\t89268300\t0.141\t64\nchr2\t89271900\t89283300\t0\t87\nchr2\t89287200\t89288700\t0\t69\nchr2\t89292000\t89295000\t0\t69\nchr2\t89297400\t89298000\t0.0059\t68\nchr2\t89306400\t89307000\t0\t66\nchr2\t89308500\t89308800\t0.0203\t62\nchr2\t89310000\t89310300\t0.0203\t62\nchr2\t89314200\t89316300\t0\t85\nchr2\t89317800\t89319900\t0\t85\nchr2\t89322000\t89330700\t0\t81\nchr2\t89530500\t89538000\t0\t107\nchr2\t89539800\t89544000\t0\t107\nchr2\t89545200\t89565600\t0\t122\nchr2\t89567100\t89570100\t0\t98\nchr2\t89571600\t89574600\t0\t102\nchr2\t89575800\t89578200\t0\t91\nchr2\t89581200\t89583000\t0\t105\nchr2\t89586600\t89589000\t0\t90\nchr2\t89590800\t89591400\t0\t90\nchr2\t89632800\t89633100\t0.0945\t119\nchr2\t89634300\t89634600\t0.0151\t109\nchr2\t89637600\t89637900\t0.0076\t84\nchr2\t89649000\t89649300\t0.0488\t58\nchr2\t89652000\t89652300\t0.0088\t106\nchr2\t89659200\t89659500\t0.1463\t61\nchr2\t89826300\t89841300\t0.1111\t12789\nchr2\t89852100\t89855700\t0\t75\nchr2\t89856900\t89865600\t0\t75\nchr2\t89867400\t89868300\t0\t75\nchr2\t89872500\t89876100\t0\t68\nchr2\t89884500\t89885100\t0\t80\nchr2\t89887200\t89891100\t0\t78\nchr2\t89893800\t89895300\t0\t67\nchr2\t89899500\t89910600\t0\t76\nchr2\t89914500\t89914800\t0.082\t66\nchr2\t89916600\t89916900\t0.0388\t62\nchr2\t89923200\t89926800\t0\t70\nchr2\t89930100\t89930400\t0.0183\t57\nchr2\t89932500\t89932800\t0.0183\t57\nchr2\t89940000\t89940300\t0.0836\t51\nchr2\t89944200\t89946900\t0\t67\nchr2\t89951100\t89951400\t0.0931\t53\nchr2\t90004800\t90005100\t0.2195\t65\nchr2\t90008400\t90008700\t0.0646\t73\nchr2\t90009900\t90010200\t0.0646\t73\nchr2\t90023100\t90023400\t0.2048\t58\nchr2\t90058500\t90058800\t0.022\t45\nchr2\t90090000\t90090300\t0.0802\t61\nchr2\t90092400\t90093000\t0.1126\t60\nchr2\t90103800\t90104100\t0.0509\t73\nchr2\t90116100\t90116400\t0.0931\t66\nchr2\t90237000\t90237300\t0.0738\t95\nchr2\t90243000\t90243300\t0.1821\t63\nchr2\t90246300\t90246900\t0.0021\t101\nchr2\t90248700\t90249000\t0.1626\t83\nchr2\t90258600\t90259500\t0.0558\t67\nchr2\t90261600\t90264600\t0\t113\nchr2\t90268800\t90269400\t0\t141\nchr2\t90271200\t90280800\t0\t141\nchr2\t90282900\t90283500\t0\t119\nchr2\t90285900\t90287100\t0\t119\nchr2\t90303900\t90306900\t0\t92\nchr2\t90315900\t90316200\t0.003\t127\nchr2\t90318600\t90319500\t0.003\t127\nchr2\t90327600\t90329400\t0\t183\nchr2\t90331200\t90332400\t0\t183\nchr2\t90333600\t90333900\t0\t183\nchr2\t90336600\t90337200\t0.0164\t122\nchr2\t90338400\t90339600\t0.0164\t122\nchr2\t90341700\t90343200\t0.0165\t100\nchr2\t90344700\t90345000\t0.1441\t73\nchr2\t90346200\t90348900\t0\t126\nchr2\t90352800\t90356100\t0\t168\nchr2\t90357900\t90358200\t0.0764\t145\nchr2\t90361500\t90362100\t0.0101\t177\nchr2\t90363600\t90365100\t0.0101\t177\nchr2\t90366300\t90369600\t0.0101\t177\nchr2\t90371400\t90372000\t0.0004\t198\nchr2\t90373800\t90374400\t0.0004\t198\nchr2\t90379500\t90379800\t0.1421\t725\nchr2\t90401700\t90402000\t0.1585\t1327\nchr2\t91402500\t91407000\t0\t139\nchr2\t91416300\t91420500\t0\t158\nchr2\t91423200\t91423500\t0.2925\t642\nchr2\t91428600\t91428900\t0.024\t225\nchr2\t91431000\t91431600\t0.0117\t137\nchr2\t91433400\t91433700\t0.0447\t172\nchr2\t91439100\t91439400\t0.1821\t228\nchr2\t91447800\t91450500\t0\t166\nchr2\t91454400\t91456500\t0\t150\nchr2\t91460100\t91461600\t0.0148\t96\nchr2\t91466400\t91466700\t0.0481\t133\nchr2\t91469700\t91470000\t0\t147\nchr2\t91471200\t91472100\t0\t147\nchr2\t91474200\t91474500\t0.013\t156\nchr2\t91479600\t91479900\t0.2705\t115\nchr2\t91483200\t91484100\t0.0005\t138\nchr2\t91486200\t91486500\t0.0968\t105\nchr2\t91490400\t91491900\t0.0012\t131\nchr2\t91505400\t91508700\t0\t198\nchr2\t91509900\t91515900\t0\t326\nchr2\t91517100\t91517700\t0.0557\t336\nchr2\t91531800\t91532100\t0.0304\t125\nchr2\t91533300\t91533600\t0.0304\t125\nchr2\t91537200\t91545300\t0\t125\nchr2\t91547400\t91547700\t0.0121\t141\nchr2\t91552200\t91555200\t0\t140\nchr2\t91557000\t91557300\t0\t140\nchr2\t91563000\t91563300\t0.125\t140\nchr2\t91569900\t91570800\t0.0023\t113\nchr2\t91574700\t91575000\t0.0194\t94\nchr2\t91605300\t91607400\t0\t109\nchr2\t91608600\t91612200\t0\t109\nchr2\t91613400\t91623300\t0\t113\nchr2\t91625400\t91630200\t0\t114\nchr2\t91631400\t91634400\t0\t120\nchr2\t91635600\t91638300\t0\t114\nchr2\t91639500\t91641900\t0\t114\nchr2\t91643100\t91647600\t0\t114\nchr2\t91648800\t91652100\t0\t114\nchr2\t91654200\t91657200\t0.0035\t90\nchr2\t91660800\t91661400\t0.0182\t97\nchr2\t91665000\t91666800\t0\t103\nchr2\t91668900\t91669200\t0\t103\nchr2\t91671600\t91671900\t0.1496\t98\nchr2\t91674900\t91675200\t0.073\t80\nchr2\t91679100\t91679400\t0.1018\t77\nchr2\t91683900\t91684200\t0.1556\t98\nchr2\t91692300\t91692900\t0.0016\t72\nchr2\t91695300\t91695600\t0.0386\t70\nchr2\t91701000\t91701300\t0.2294\t53\nchr2\t91703700\t91704000\t0.0407\t73\nchr2\t91705800\t91709700\t0.0113\t119\nchr2\t91712700\t91713000\t0.2846\t78\nchr2\t91716600\t91716900\t0.1311\t102\nchr2\t91719900\t91721100\t0.1536\t89\nchr2\t91722900\t91726500\t0\t152\nchr2\t91727700\t91728600\t0\t152\nchr2\t91733100\t91733400\t0.1128\t51\nchr2\t91795500\t91798500\t0\t110\nchr2\t91800000\t91839000\t0\t119\nchr2\t91926600\t91926900\t0.1011\t92\nchr2\t92013600\t92053800\t0\t144\nchr2\t92055300\t92057400\t0\t144\nchr2\t92082000\t92131200\t0\t108\nchr2\t92132400\t92133000\t0\t108\nchr2\t92134500\t92138100\t0\t44\nchr2\t92188200\t92193300\t0\t134\nchr2\t92195100\t92216700\t0\t420\nchr2\t92218200\t92221200\t0\t420\nchr2\t92222400\t92232900\t0\t215\nchr2\t92234400\t92241300\t0\t228\nchr2\t92243100\t92256900\t0\t485\nchr2\t92258100\t92260800\t0\t217\nchr2\t92262000\t92270700\t0\t402\nchr2\t92272500\t92285100\t0\t402\nchr2\t92286300\t92337600\t0\t402\nchr2\t92339400\t92346300\t0\t277\nchr2\t92349000\t92365500\t0\t321\nchr2\t92367300\t92370000\t0\t409\nchr2\t92371200\t92382600\t0\t409\nchr2\t92384100\t92390100\t0\t315\nchr2\t92391300\t92393700\t0\t288\nchr2\t92395200\t92402700\t0\t288\nchr2\t92404200\t92445600\t0\t372\nchr2\t92446800\t92452200\t0\t372\nchr2\t92453700\t92492400\t0\t369\nchr2\t92493900\t92514300\t0\t369\nchr2\t92515500\t92522400\t0\t399\nchr2\t92523600\t92529600\t0\t399\nchr2\t92530800\t92535900\t0\t210\nchr2\t92537100\t92538000\t0\t131\nchr2\t92539200\t92539800\t0\t131\nchr2\t92541000\t92551500\t0\t374\nchr2\t92552700\t92558700\t0\t374\nchr2\t92559900\t92571300\t0\t502\nchr2\t92572800\t92604000\t0\t502\nchr2\t92605500\t92607600\t0.0059\t169\nchr2\t92608800\t92619600\t0\t454\nchr2\t92620800\t92623200\t0\t454\nchr2\t92624400\t92633100\t0\t454\nchr2\t92634300\t92644800\t0\t454\nchr2\t92646900\t92660400\t0\t229\nchr2\t92661600\t92663100\t0\t429\nchr2\t92664300\t92667000\t0\t429\nchr2\t92668200\t92673600\t0\t429\nchr2\t92675100\t92686800\t0\t281\nchr2\t92688000\t92690400\t0\t90\nchr2\t92691600\t92694900\t0\t134\nchr2\t92696400\t92711100\t0\t237\nchr2\t92712300\t92715600\t0\t237\nchr2\t92716800\t92734500\t0\t234\nchr2\t92735700\t92736000\t0\t234\nchr2\t92738100\t92748600\t0\t161\nchr2\t92749800\t92753100\t0\t161\nchr2\t92754300\t92754900\t0\t161\nchr2\t92757000\t92760300\t0\t215\nchr2\t92762700\t92763000\t0.032\t369\nchr2\t92764500\t92765100\t0\t114\nchr2\t92767200\t92771400\t0\t319\nchr2\t92772600\t92783700\t0\t260\nchr2\t92785200\t92790300\t0\t260\nchr2\t92791800\t92798700\t0\t184\nchr2\t92800200\t92821800\t0\t184\nchr2\t92823000\t92840700\t0\t453\nchr2\t92841900\t92856000\t0\t246\nchr2\t92858400\t92865900\t0\t200\nchr2\t92867700\t92872200\t0\t116\nchr2\t92874000\t92878200\t0\t191\nchr2\t92879400\t92886900\t0\t435\nchr2\t92888700\t92900100\t0\t223\nchr2\t92901600\t92912100\t0\t172\nchr2\t92913300\t92919000\t0\t172\nchr2\t92920500\t92921400\t0\t172\nchr2\t92922600\t92933100\t0\t259\nchr2\t92934300\t92941500\t0\t259\nchr2\t92943000\t92946300\t0\t77\nchr2\t92948100\t92949300\t0\t127\nchr2\t92950800\t92954700\t0\t127\nchr2\t92957400\t92960700\t0\t418\nchr2\t92962800\t92978400\t0\t197\nchr2\t92979600\t92986500\t0\t145\nchr2\t92988600\t92999700\t0\t312\nchr2\t93001500\t93004500\t0\t312\nchr2\t93007200\t93012900\t0\t312\nchr2\t93014100\t93014400\t0\t312\nchr2\t93015900\t93019200\t0\t234\nchr2\t93021300\t93029100\t0\t234\nchr2\t93030900\t93039300\t0\t136\nchr2\t93040800\t93041400\t0\t294\nchr2\t93042600\t93060900\t0\t294\nchr2\t93062700\t93067500\t0\t274\nchr2\t93068700\t93078300\t0\t274\nchr2\t93079800\t93081300\t0\t75\nchr2\t93082800\t93085800\t0\t77\nchr2\t93087000\t93088500\t0\t231\nchr2\t93089700\t93091500\t0\t231\nchr2\t93093300\t93093600\t0.1346\t38\nchr2\t93095100\t93096000\t0\t233\nchr2\t93098100\t93101100\t0\t233\nchr2\t93103200\t93107400\t0\t233\nchr2\t93108900\t93116700\t0\t233\nchr2\t93117900\t93120900\t0\t233\nchr2\t93122100\t93137700\t0\t138\nchr2\t93138900\t93146100\t0\t172\nchr2\t93149100\t93150300\t0\t30\nchr2\t93152100\t93159900\t0\t258\nchr2\t93161700\t93165600\t0\t190\nchr2\t93167100\t93172500\t0\t190\nchr2\t93174300\t93184200\t0\t171\nchr2\t93186300\t93188400\t0\t274\nchr2\t93189900\t93192000\t0\t274\nchr2\t93193800\t93194700\t0\t148\nchr2\t93195900\t93201000\t0\t148\nchr2\t93202500\t93203400\t0\t148\nchr2\t93205200\t93210000\t0\t245\nchr2\t93211200\t93219300\t0\t245\nchr2\t93220500\t93222300\t0\t154\nchr2\t93223500\t93226500\t0\t154\nchr2\t93228000\t93235200\t0\t145\nchr2\t93236700\t93244800\t0\t115\nchr2\t93246600\t93252000\t0.0034\t126\nchr2\t93253500\t93253800\t0.1406\t124\nchr2\t93256800\t93263100\t0\t286\nchr2\t93264600\t93265200\t0.0045\t91\nchr2\t93267000\t93281400\t0\t355\nchr2\t93282900\t93284400\t0\t355\nchr2\t93286500\t93295500\t0\t121\nchr2\t93298200\t93302100\t0\t121\nchr2\t93303900\t93305100\t0\t181\nchr2\t93306300\t93308100\t0\t181\nchr2\t93309600\t93314100\t0\t181\nchr2\t93315300\t93315900\t0\t66\nchr2\t93317700\t93320100\t0\t72\nchr2\t93321600\t93323400\t0\t72\nchr2\t93324900\t93325200\t0\t72\nchr2\t93327300\t93330600\t0\t73\nchr2\t93334200\t93337500\t0\t79\nchr2\t93339000\t93339600\t0\t79\nchr2\t93341400\t93343200\t0.0015\t226\nchr2\t93345900\t93351000\t0\t193\nchr2\t93352500\t93367500\t0\t142\nchr2\t93368700\t93371100\t0\t141\nchr2\t93373500\t93373800\t0\t141\nchr2\t93375900\t93376200\t0\t141\nchr2\t93378000\t93388800\t0\t359\nchr2\t93390300\t93395400\t0\t359\nchr2\t93396600\t93397200\t0.0576\t32\nchr2\t93399000\t93404700\t0\t152\nchr2\t93408000\t93409200\t0\t194\nchr2\t93410400\t93419400\t0\t194\nchr2\t93420900\t93426300\t0\t194\nchr2\t93427500\t93432300\t0\t130\nchr2\t93433500\t93434400\t0\t130\nchr2\t93435600\t93442200\t0\t130\nchr2\t93444000\t93447000\t0\t156\nchr2\t93448500\t93461100\t0\t160\nchr2\t93465600\t93466800\t0\t58\nchr2\t93468000\t93470700\t0\t59\nchr2\t93472200\t93478500\t0\t142\nchr2\t93480600\t93485400\t0\t142\nchr2\t93486900\t93493800\t0\t142\nchr2\t93495600\t93495900\t0\t142\nchr2\t93497100\t93503100\t0\t142\nchr2\t93504900\t93506700\t0\t124\nchr2\t93508200\t93512700\t0\t124\nchr2\t93515100\t93523800\t0\t154\nchr2\t93525000\t93530700\t0\t154\nchr2\t93533700\t93552900\t0\t201\nchr2\t93555000\t93555300\t0.019\t18\nchr2\t93557100\t93561000\t0\t268\nchr2\t93562500\t93562800\t0\t166\nchr2\t93564600\t93567300\t0\t166\nchr2\t93568500\t93572400\t0\t214\nchr2\t93575100\t93591300\t0\t251\nchr2\t93592800\t93597900\t0\t114\nchr2\t93599400\t93610800\t0\t277\nchr2\t93612000\t93612900\t0\t277\nchr2\t93614700\t93630300\t0\t277\nchr2\t93632100\t93635100\t0\t82\nchr2\t93636900\t93641400\t0\t82\nchr2\t93643200\t93646200\t0\t67\nchr2\t93648600\t93657900\t0\t67\nchr2\t93659400\t93662700\t0\t77\nchr2\t93663900\t93666900\t0\t150\nchr2\t93668100\t93671700\t0\t261\nchr2\t93673200\t93679800\t0\t112\nchr2\t93681600\t93693600\t0\t209\nchr2\t93694800\t93700200\t0\t209\nchr2\t93704100\t93706500\t0\t209\nchr2\t93707700\t93708300\t0\t209\nchr2\t93710400\t93712800\t0\t150\nchr2\t93714000\t93719100\t0\t150\nchr2\t93721200\t93723900\t0\t150\nchr2\t93725100\t93730500\t0\t150\nchr2\t93732300\t93733800\t0\t122\nchr2\t93735000\t93737400\t0\t122\nchr2\t93738900\t93740700\t0\t219\nchr2\t93741900\t93743100\t0\t219\nchr2\t93745200\t93746100\t0\t219\nchr2\t93747300\t93770700\t0\t219\nchr2\t93772200\t93777000\t0\t118\nchr2\t93778500\t93783300\t0\t118\nchr2\t93784800\t93790200\t0\t118\nchr2\t93792300\t93801000\t0\t257\nchr2\t93802500\t93805200\t0\t101\nchr2\t93806400\t93807900\t0\t69\nchr2\t93809100\t93809700\t0\t69\nchr2\t93811200\t93817800\t0\t113\nchr2\t93819300\t93820500\t0\t113\nchr2\t93821700\t93828300\t0\t115\nchr2\t93831000\t93831300\t0\t242\nchr2\t93832800\t93843300\t0\t242\nchr2\t93845100\t93853200\t0\t242\nchr2\t93854400\t93859800\t0\t242\nchr2\t93861600\t93872400\t0\t309\nchr2\t93875700\t93877800\t0\t213\nchr2\t93879000\t93884400\t0\t213\nchr2\t93885600\t93885900\t0.0521\t156\nchr2\t93887400\t93898500\t0\t236\nchr2\t93900600\t93901200\t0\t195\nchr2\t93902400\t93904500\t0\t195\nchr2\t93905700\t93911700\t0\t195\nchr2\t93913800\t93916500\t0\t195\nchr2\t93918000\t93918300\t0\t277\nchr2\t93920100\t93924900\t0\t277\nchr2\t93926100\t93932700\t0\t277\nchr2\t93933900\t93936000\t0\t277\nchr2\t93937200\t93937500\t0\t277\nchr2\t93938700\t93942300\t0\t243\nchr2\t93943500\t93946500\t0\t243\nchr2\t93950700\t93955500\t0\t243\nchr2\t93957000\t93960300\t0\t243\nchr2\t93961500\t93963300\t0\t243\nchr2\t93964500\t93965100\t0\t243\nchr2\t93968400\t93973200\t0\t118\nchr2\t93975600\t93977700\t0\t164\nchr2\t93979200\t93987300\t0\t164\nchr2\t93988500\t93993300\t0\t164\nchr2\t93994500\t93998100\t0\t116\nchr2\t93999300\t94006800\t0\t161\nchr2\t94008600\t94014300\t0\t161\nchr2\t94015500\t94023300\t0\t174\nchr2\t94024800\t94037700\t0\t174\nchr2\t94039500\t94043100\t0\t174\nchr2\t94044300\t94047900\t0\t215\nchr2\t94049100\t94061700\t0\t215\nchr2\t94063800\t94071300\t0\t182\nchr2\t94073700\t94075200\t0\t182\nchr2\t94077000\t94086300\t0\t182\nchr2\t94087500\t94088100\t0.0436\t48\nchr2\t94090200\t94090500\t0.0257\t21\nchr2\t94144800\t94146300\t0.0927\t68\nchr2\t94148400\t94149600\t0.1114\t159\nchr2\t94154700\t94155300\t0\t360\nchr2\t94158900\t94161300\t0.0228\t200\nchr2\t94162800\t94164000\t0\t53\nchr2\t94171500\t94172400\t0\t77\nchr2\t94173600\t94174500\t0\t77\nchr2\t94260300\t94260600\t0.0562\t85\nchr2\t94641000\t94641300\t0.1219\t43\nchr2\t94718100\t94718400\t0.09\t84\nchr2\t94740000\t94740300\t0.1102\t48\nchr2\t95421300\t95424000\t0\t73\nchr2\t95428500\t95431200\t0\t84\nchr2\t95433300\t95433600\t0.0444\t59\nchr2\t95435100\t95480100\t0\t84\nchr2\t95487600\t95488800\t0\t72\nchr2\t95588100\t95589000\t0\t72\nchr2\t95596800\t95641500\t0\t82\nchr2\t95643000\t95643600\t0\t82\nchr2\t95645700\t95648400\t0\t78\nchr2\t95652600\t95655600\t0\t63\nchr2\t95774400\t95774700\t0.0088\t67\nchr2\t95776800\t95798100\t0\t84\nchr2\t95877300\t95877600\t0.129\t64\nchr2\t95898900\t95901900\t0\t69\nchr2\t95903700\t95907600\t0\t70\nchr2\t95940600\t95940900\t0.0184\t144\nchr2\t95946300\t95946600\t0.1212\t102\nchr2\t95963700\t95964000\t0.0919\t63\nchr2\t95982600\t95982900\t0.0804\t54\nchr2\t96010800\t96011100\t0.1217\t82\nchr2\t96026400\t96028200\t0\t80\nchr2\t96030900\t96048000\t0\t80\nchr2\t96049800\t96050700\t0\t70\nchr2\t96055500\t96055800\t0.0112\t63\nchr2\t96058500\t96059400\t0.0504\t60\nchr2\t96444300\t96444900\t0.0214\t107\nchr2\t96462300\t96462600\t0.1698\t101\nchr2\t96776700\t96777000\t0.2438\t315\nchr2\t97049700\t97050000\t0.0101\t73\nchr2\t97051800\t97053900\t0.0537\t67\nchr2\t97071300\t97072800\t0\t77\nchr2\t97076100\t97076400\t0.1823\t33\nchr2\t97094400\t97094700\t0.0475\t67\nchr2\t97114500\t97114800\t0.0838\t42\nchr2\t97118700\t97120500\t0\t68\nchr2\t97156500\t97156800\t0.0651\t92\nchr2\t97162500\t97162800\t0.0328\t142\nchr2\t97166400\t97166700\t0.191\t139\nchr2\t97213200\t97213500\t0.0452\t55\nchr2\t97221300\t97221600\t0.0755\t116\nchr2\t97223700\t97224000\t0.111\t65\nchr2\t97233900\t97236900\t0\t65\nchr2\t97238100\t97248000\t0\t76\nchr2\t97249200\t97260300\t0\t130\nchr2\t97261800\t97266300\t0\t130\nchr2\t97269600\t97278300\t0\t79\nchr2\t97279800\t97285800\t0\t79\nchr2\t97287600\t97292100\t0\t79\nchr2\t97294500\t97310100\t0\t78\nchr2\t97311300\t97313700\t0\t78\nchr2\t97314900\t97347300\t0\t91\nchr2\t97361100\t97393800\t0\t84\nchr2\t97395000\t97397700\t0\t84\nchr2\t97399500\t97411500\t0\t74\nchr2\t97413000\t97413900\t0\t80\nchr2\t97416000\t97420500\t0\t75\nchr2\t97422300\t97438500\t0\t93\nchr2\t97489500\t97493700\t0\t130\nchr2\t97494900\t97508100\t0\t130\nchr2\t97509300\t97513800\t0\t130\nchr2\t97515000\t97521600\t0\t74\nchr2\t97522800\t97524000\t0\t74\nchr2\t97543800\t97544100\t0.0073\t67\nchr2\t97580700\t97581000\t0.0561\t42\nchr2\t97583100\t97584300\t0.026\t74\nchr2\t97588800\t97589100\t0.1438\t51\nchr2\t97605900\t97607700\t0\t80\nchr2\t97611600\t97611900\t0.0072\t74\nchr2\t97614600\t97615500\t0.0266\t77\nchr2\t98266500\t98266800\t0.1671\t63\nchr2\t99307500\t99307800\t0.0596\t70\nchr2\t100089300\t100090200\t0\t69\nchr2\t100091400\t100091700\t0.1353\t64\nchr2\t100096800\t100097400\t0.0012\t64\nchr2\t100100100\t100100400\t0.0955\t94\nchr2\t101748900\t101749200\t0.1974\t101\nchr2\t102566400\t102572100\t0\t84\nchr2\t105054600\t105054900\t0.2925\t22\nchr2\t105210900\t105211200\t0\t17\nchr2\t105586500\t105587100\t0.002\t66\nchr2\t106131300\t106136700\t0\t105\nchr2\t106401000\t106401300\t0.1418\t65\nchr2\t106407900\t106408200\t0.0189\t73\nchr2\t106416300\t106417200\t0.0017\t54\nchr2\t106419000\t106419300\t0.1194\t61\nchr2\t106425600\t106425900\t0.0215\t56\nchr2\t106427700\t106428300\t0\t54\nchr2\t106430700\t106431300\t0\t62\nchr2\t106433400\t106434900\t0.0017\t62\nchr2\t106436700\t106437300\t0.0017\t62\nchr2\t106438800\t106440900\t0\t72\nchr2\t106442100\t106442400\t0.0837\t53\nchr2\t106444200\t106444500\t0\t76\nchr2\t106445700\t106447800\t0\t76\nchr2\t106452000\t106461300\t0\t75\nchr2\t107827500\t107827800\t0.2394\t18\nchr2\t107829000\t107829300\t0.0496\t31\nchr2\t107834700\t107836200\t0\t62\nchr2\t107837400\t107840100\t0\t60\nchr2\t107841300\t107844000\t0\t73\nchr2\t107847300\t107851800\t0\t70\nchr2\t107853000\t107853900\t0.0667\t57\nchr2\t107855100\t107856000\t0.1099\t65\nchr2\t107858700\t107862300\t0\t64\nchr2\t107864400\t107866500\t0\t64\nchr2\t107868000\t107868300\t0.0456\t50\nchr2\t107873100\t107873400\t0.0538\t67\nchr2\t107878800\t107879700\t0.0042\t57\nchr2\t107887500\t107888100\t0.1061\t54\nchr2\t107894700\t107895000\t0.055\t48\nchr2\t107912400\t107912700\t0.1469\t65\nchr2\t108655500\t108657000\t0.0085\t70\nchr2\t108660900\t108661200\t0.0774\t60\nchr2\t108666300\t108666600\t0.1547\t64\nchr2\t108672300\t108672900\t0.0078\t63\nchr2\t108762300\t108762600\t0.025\t46\nchr2\t108801000\t108801900\t0\t86\nchr2\t109199100\t109200000\t0.1484\t11428\nchr2\t109308300\t109308600\t0.0061\t82\nchr2\t109310100\t109311300\t0.0061\t82\nchr2\t109740900\t109742400\t0.0543\t60\nchr2\t109744800\t109760100\t0\t87\nchr2\t109762500\t109762800\t0.1442\t54\nchr2\t109767900\t109772100\t0\t65\nchr2\t109773300\t109777200\t0\t65\nchr2\t109780200\t109999500\t0\t84\nchr2\t110000700\t110003100\t0\t84\nchr2\t110004600\t110027700\t0\t84\nchr2\t110028900\t110038200\t0\t80\nchr2\t110039400\t110043000\t0\t80\nchr2\t110044800\t110048100\t0\t88\nchr2\t110050200\t110067600\t0\t79\nchr2\t110068800\t110074200\t0\t75\nchr2\t110075400\t110094900\t0\t81\nchr2\t110229300\t110243400\t0\t74\nchr2\t110244600\t110259000\t0\t61\nchr2\t110260200\t110261700\t0\t61\nchr2\t110262900\t110265600\t0\t54\nchr2\t110267700\t110268000\t0.0274\t24\nchr2\t110269200\t110269500\t0\t75\nchr2\t110270700\t110272800\t0\t75\nchr2\t110275200\t110291700\t0\t91\nchr2\t110293200\t110298300\t0\t91\nchr2\t110299500\t110305800\t0\t91\nchr2\t110308800\t110313600\t0\t82\nchr2\t110314800\t110325300\t0\t82\nchr2\t110327400\t110327700\t0.1796\t79\nchr2\t110330100\t110332200\t0.0133\t80\nchr2\t110334300\t110341800\t0\t85\nchr2\t110343300\t110356200\t0\t77\nchr2\t110358600\t110360400\t0\t77\nchr2\t110362800\t110364600\t0\t74\nchr2\t110369100\t110370600\t0\t59\nchr2\t110372100\t110386500\t0\t93\nchr2\t110388000\t110389500\t0\t75\nchr2\t110391300\t110424300\t0\t80\nchr2\t110425800\t110590500\t0\t102\nchr2\t110592000\t110592300\t0.0986\t66\nchr2\t110594400\t110600700\t0\t74\nchr2\t110602500\t110603700\t0.0078\t60\nchr2\t110606400\t110606700\t0.037\t105\nchr2\t110608500\t110609400\t0.037\t105\nchr2\t110611800\t110622300\t0\t82\nchr2\t110625000\t110626800\t0\t82\nchr2\t110630400\t110630700\t0.0178\t74\nchr2\t110696100\t110696400\t0.0464\t65\nchr2\t110698500\t110699400\t0\t74\nchr2\t111223800\t111224100\t0.1603\t31\nchr2\t111259800\t111260100\t0.0426\t66\nchr2\t111263400\t111264000\t0.0183\t68\nchr2\t111268500\t111269100\t0.0126\t63\nchr2\t111272400\t111272700\t0.056\t69\nchr2\t111274200\t111274500\t0.056\t69\nchr2\t111279600\t111279900\t0\t70\nchr2\t111281400\t111283200\t0\t70\nchr2\t111285600\t111285900\t0.0449\t56\nchr2\t111287400\t111287700\t0.0449\t56\nchr2\t111296700\t111297000\t0.0748\t58\nchr2\t111300000\t111300300\t0.0379\t51\nchr2\t111301800\t111302100\t0.061\t65\nchr2\t111314700\t111315000\t0.015\t31\nchr2\t111316800\t111317100\t0.0947\t68\nchr2\t111321900\t111322200\t0.022\t65\nchr2\t111324900\t111325800\t0\t81\nchr2\t111327600\t111332100\t0\t78\nchr2\t111335400\t111339300\t0\t81\nchr2\t111341700\t111342000\t0.0269\t74\nchr2\t111343500\t111344700\t0.0151\t66\nchr2\t111347700\t111350100\t0.0004\t83\nchr2\t111352800\t111354900\t0.0024\t69\nchr2\t111362400\t111362700\t0.1935\t56\nchr2\t111368100\t111369000\t0\t78\nchr2\t111378300\t111378600\t0.0725\t73\nchr2\t111379800\t111380400\t0.0798\t56\nchr2\t111384900\t111386400\t0.0132\t62\nchr2\t111390000\t111391500\t0.0374\t51\nchr2\t111393300\t111394200\t0\t72\nchr2\t111402600\t111402900\t0.0459\t57\nchr2\t111404100\t111405300\t0.0505\t49\nchr2\t111407400\t111408600\t0.0129\t68\nchr2\t111423900\t111424200\t0.0003\t62\nchr2\t111431400\t111431700\t0.0873\t74\nchr2\t111435000\t111436500\t0.0205\t56\nchr2\t111438900\t111439200\t0.1885\t55\nchr2\t111443400\t111447300\t0\t69\nchr2\t111448800\t111449100\t0\t69\nchr2\t111451200\t111451500\t0.0166\t40\nchr2\t111453600\t111454200\t0\t81\nchr2\t111477000\t111477300\t0.05\t74\nchr2\t111499800\t111502500\t0.0859\t54\nchr2\t111516900\t111517200\t0.0886\t58\nchr2\t111531900\t111532200\t0.1083\t61\nchr2\t111540300\t111540600\t0.0013\t53\nchr2\t111542100\t111542400\t0.1221\t61\nchr2\t111545400\t111545700\t0.0854\t47\nchr2\t111549000\t111550200\t0.0093\t74\nchr2\t111551700\t111552900\t0.0358\t69\nchr2\t111558000\t111558600\t0.0309\t55\nchr2\t111562800\t111563400\t0.0109\t60\nchr2\t111576600\t111577200\t0.0327\t46\nchr2\t111578700\t111579300\t0.0943\t52\nchr2\t111580800\t111581100\t0.053\t65\nchr2\t111583500\t111584400\t0\t76\nchr2\t111588000\t111588300\t0.1267\t63\nchr2\t111591300\t111591600\t0.0863\t100\nchr2\t111593700\t111596400\t0\t79\nchr2\t111599400\t111599700\t0.2066\t62\nchr2\t111600900\t111601200\t0.0345\t44\nchr2\t111723900\t111724200\t0.1029\t55\nchr2\t111726300\t111726600\t0.0147\t66\nchr2\t111731700\t111732000\t0.0893\t57\nchr2\t111748200\t111749400\t0.0425\t67\nchr2\t111756000\t111756600\t0.1193\t52\nchr2\t111758100\t111758400\t0.1066\t71\nchr2\t111762900\t111764100\t0.0457\t64\nchr2\t111774300\t111774900\t0.0213\t62\nchr2\t111776700\t111777000\t0.0371\t52\nchr2\t111780000\t111780300\t0.1355\t58\nchr2\t111784800\t111785100\t0.1051\t57\nchr2\t111793800\t111794100\t0.0811\t55\nchr2\t111802500\t111803700\t0.0586\t71\nchr2\t111804900\t111807300\t0.0221\t65\nchr2\t111814200\t111815700\t0.0027\t80\nchr2\t111816900\t111817200\t0.0027\t80\nchr2\t111819300\t111819600\t0.1023\t74\nchr2\t111861600\t111861900\t0.1864\t53\nchr2\t112113900\t112115100\t0.0007\t51\nchr2\t112362000\t112363200\t0.1002\t70\nchr2\t112365900\t112369800\t0\t84\nchr2\t112371300\t112374000\t0\t84\nchr2\t112375200\t112375800\t0\t63\nchr2\t112377900\t112379100\t0\t63\nchr2\t112380900\t112389000\t0\t75\nchr2\t112392000\t112409400\t0\t70\nchr2\t112411500\t112413000\t0\t69\nchr2\t112414500\t112414800\t0\t69\nchr2\t112416600\t112423500\t0\t69\nchr2\t112503900\t112509000\t0\t98\nchr2\t112776600\t112776900\t0.0398\t12\nchr2\t113395500\t113395800\t0.0557\t65\nchr2\t113416500\t113416800\t0.0274\t74\nchr2\t113426700\t113427000\t0.0852\t61\nchr2\t113451300\t113451600\t0.1724\t78\nchr2\t113458500\t113458800\t0.0533\t62\nchr2\t113464200\t113464500\t0.1855\t53\nchr2\t113467200\t113467500\t0.0944\t66\nchr2\t113480700\t113481000\t0.2278\t60\nchr2\t113482500\t113482800\t0.0461\t59\nchr2\t113484000\t113484300\t0.2447\t69\nchr2\t113486100\t113486400\t0.0679\t47\nchr2\t113490900\t113492700\t0.0078\t94\nchr2\t113494200\t113495700\t0.0078\t94\nchr2\t113509500\t113509800\t0.1192\t89\nchr2\t113519400\t113519700\t0.1367\t88\nchr2\t113525700\t113526000\t0.1592\t70\nchr2\t113531700\t113532000\t0.1044\t105\nchr2\t113534700\t113535000\t0.0208\t98\nchr2\t113537400\t113538600\t0.0414\t116\nchr2\t113547000\t113549100\t0\t104\nchr2\t113564100\t113564400\t0.0924\t70\nchr2\t113580600\t113580900\t0.0638\t119\nchr2\t113582100\t113582400\t0.0662\t141\nchr2\t113590500\t113590800\t0.1161\t109\nchr2\t113611500\t113613000\t0.0137\t57\nchr2\t113614800\t113615100\t0.2107\t83\nchr2\t113617500\t113617800\t0.2107\t83\nchr2\t113623800\t113624100\t0.1635\t41\nchr2\t113643900\t113645700\t0.0203\t64\nchr2\t113651100\t113653500\t0.0792\t82\nchr2\t114084600\t114085200\t0.0999\t69\nchr2\t114748500\t114748800\t0.1687\t40\nchr2\t115008000\t115009200\t0.0474\t87\nchr2\t115487400\t115488600\t0.0461\t77\nchr2\t116053200\t116053500\t0.1467\t83\nchr2\t117460500\t117461100\t0.0309\t111\nchr2\t117624900\t117625200\t0.23\t91\nchr2\t117649800\t117650400\t0\t29\nchr2\t117750300\t117751800\t0.1202\t91\nchr2\t118139100\t118140000\t0.0483\t93\nchr2\t118141500\t118141800\t0.1289\t71\nchr2\t118302900\t118305000\t0\t65\nchr2\t118486800\t118487100\t0.0128\t78\nchr2\t118867500\t118868100\t0\t99\nchr2\t118896000\t118900800\t0\t93\nchr2\t122014800\t122015400\t0.0395\t72\nchr2\t122017200\t122017500\t0.1687\t95\nchr2\t122050800\t122051100\t0.1184\t76\nchr2\t122265600\t122265900\t0.118\t85\nchr2\t122346900\t122348400\t0.1417\t68\nchr2\t122783100\t122783400\t0.1352\t79\nchr2\t123684600\t123685200\t0.1922\t72\nchr2\t124140900\t124141800\t0\t115\nchr2\t124143000\t124145700\t0\t115\nchr2\t124359600\t124360200\t0.063\t86\nchr2\t124409100\t124409400\t0.1424\t69\nchr2\t124411500\t124413000\t0.023\t80\nchr2\t124593300\t124594200\t0.0295\t56\nchr2\t124595400\t124596900\t0.0062\t86\nchr2\t124598100\t124598400\t0.0062\t86\nchr2\t125417400\t125418000\t0.0916\t76\nchr2\t126178200\t126183000\t0\t111\nchr2\t127119000\t127119600\t0.0369\t88\nchr2\t127787700\t127789500\t0.0503\t85\nchr2\t128340600\t128341200\t0.1742\t38\nchr2\t128418000\t128418300\t0.1456\t80\nchr2\t128859600\t128862900\t0\t93\nchr2\t128864400\t128864700\t0\t93\nchr2\t128964900\t128965200\t0.1787\t48\nchr2\t129411300\t129417000\t0\t94\nchr2\t129682500\t129686700\t0\t110\nchr2\t130041600\t130042500\t0\t57\nchr2\t130064100\t130064400\t0.1367\t66\nchr2\t130066800\t130067400\t0.0168\t70\nchr2\t130078500\t130085100\t0\t79\nchr2\t130086600\t130094700\t0\t79\nchr2\t130095900\t130100700\t0\t79\nchr2\t130106400\t130106700\t0.0399\t49\nchr2\t130121400\t130121700\t0.0926\t60\nchr2\t130122900\t130124100\t0.199\t63\nchr2\t130223100\t130223400\t0.0253\t61\nchr2\t130405500\t130407600\t0\t80\nchr2\t130412400\t130413900\t0.1117\t61\nchr2\t130416000\t130416300\t0.0031\t65\nchr2\t130417500\t130417800\t0.0031\t65\nchr2\t130419900\t130420200\t0.0031\t65\nchr2\t130426800\t130427100\t0.1881\t54\nchr2\t130430400\t130431900\t0\t68\nchr2\t130433400\t130438500\t0\t68\nchr2\t130441200\t130446000\t0\t87\nchr2\t130448100\t130448400\t0\t87\nchr2\t130458900\t130459800\t0\t88\nchr2\t130462800\t130463400\t0\t95\nchr2\t130465500\t130468200\t0\t95\nchr2\t130469700\t130476900\t0\t66\nchr2\t130478100\t130478400\t0.0237\t56\nchr2\t130480800\t130482300\t0\t53\nchr2\t130485300\t130492200\t0\t66\nchr2\t130494300\t130495800\t0\t66\nchr2\t130497000\t130500000\t0\t66\nchr2\t130501200\t130504200\t0\t66\nchr2\t130505400\t130506300\t0\t88\nchr2\t130507500\t130540200\t0\t88\nchr2\t130541400\t130559700\t0\t88\nchr2\t130560900\t130574100\t0\t83\nchr2\t130575300\t130580100\t0\t83\nchr2\t130581900\t130582800\t0\t83\nchr2\t130585200\t130585500\t0\t83\nchr2\t130587000\t130588800\t0\t77\nchr2\t130590000\t130593900\t0\t77\nchr2\t130596000\t130601400\t0\t91\nchr2\t130602900\t130609500\t0\t91\nchr2\t130612800\t130613100\t0\t67\nchr2\t130614900\t130617600\t0\t67\nchr2\t130619400\t130619700\t0.0133\t63\nchr2\t130620900\t130623600\t0.0021\t72\nchr2\t130628400\t130628700\t0.1095\t75\nchr2\t130629900\t130630500\t0.0042\t43\nchr2\t130633200\t130635900\t0.0128\t80\nchr2\t130642200\t130642500\t0.0641\t58\nchr2\t130643700\t130645500\t0\t73\nchr2\t130648800\t130649100\t0.1201\t64\nchr2\t130650600\t130651200\t0.0958\t57\nchr2\t130652400\t130654200\t0.0285\t84\nchr2\t130657800\t130658700\t0.1026\t77\nchr2\t130659900\t130661700\t0\t80\nchr2\t130673100\t130673400\t0.0645\t62\nchr2\t130675500\t130680300\t0\t98\nchr2\t130682100\t130687500\t0\t80\nchr2\t130689600\t130691400\t0\t64\nchr2\t130694400\t130694700\t0.1734\t60\nchr2\t130701300\t130701600\t0.0022\t55\nchr2\t130703700\t130705500\t0.0098\t69\nchr2\t130707600\t130709700\t0.1084\t69\nchr2\t130714500\t130716000\t0\t71\nchr2\t130857300\t130863900\t0\t52\nchr2\t131226300\t131226600\t0.1358\t54\nchr2\t131234400\t131235000\t0.0964\t51\nchr2\t131238300\t131239500\t0\t86\nchr2\t131240700\t131247900\t0\t86\nchr2\t131249100\t131252400\t0\t66\nchr2\t131254200\t131259300\t0\t83\nchr2\t131261700\t131262000\t0.1046\t60\nchr2\t131264400\t131264700\t0.0615\t99\nchr2\t131268000\t131268300\t0.0185\t69\nchr2\t131272800\t131275800\t0\t103\nchr2\t131288700\t131289000\t0.1347\t66\nchr2\t131294400\t131295300\t0.0104\t69\nchr2\t131450700\t131451300\t0.1153\t68\nchr2\t131694600\t131694900\t0.1176\t89\nchr2\t131766300\t131767500\t0\t67\nchr2\t131793900\t131796000\t0\t89\nchr2\t131814600\t131816400\t0.0742\t83\nchr2\t132393900\t132394500\t0.1478\t252\nchr2\t133300800\t133302600\t0.0149\t98\nchr2\t133551300\t133551900\t0.1137\t109\nchr2\t133911600\t133912200\t0.0173\t73\nchr2\t133914000\t133915500\t0.0105\t121\nchr2\t134209200\t134212500\t0\t114\nchr2\t134607300\t134608500\t0.082\t57\nchr2\t134652300\t134655000\t0.0203\t97\nchr2\t137397900\t137398200\t0.1863\t61\nchr2\t138246900\t138247200\t0.0298\t45\nchr2\t138251400\t138251700\t0.0823\t48\nchr2\t139878600\t139880400\t0.0723\t70\nchr2\t141965100\t141965400\t0.0134\t120\nchr2\t142677000\t142677300\t0.2995\t25\nchr2\t143008200\t143011800\t0.0501\t111\nchr2\t143662500\t143662800\t0.0579\t45\nchr2\t143665200\t143665800\t0.0634\t79\nchr2\t143861100\t143866800\t0\t137\nchr2\t144899100\t144899700\t0.0436\t79\nchr2\t146408400\t146409300\t0.0565\t88\nchr2\t146410500\t146410800\t0.0565\t88\nchr2\t147155100\t147155400\t0.1288\t98\nchr2\t147732300\t147732600\t0.0592\t81\nchr2\t147745200\t147745500\t0.0749\t66\nchr2\t148149300\t148149600\t0.1017\t98\nchr2\t148153800\t148154100\t0.0902\t52\nchr2\t148189500\t148194600\t0\t88\nchr2\t149946900\t149951100\t0\t111\nchr2\t151579500\t151591200\t0\t90\nchr2\t151592400\t151608900\t0\t91\nchr2\t151699200\t151700700\t0.0313\t104\nchr2\t151703400\t151704300\t0.0003\t117\nchr2\t153007800\t153013200\t0\t115\nchr2\t153222300\t153222600\t0.1363\t541\nchr2\t153538500\t153539100\t0.021\t132\nchr2\t153865800\t153866100\t0.0073\t101\nchr2\t154989000\t154989300\t0.0803\t81\nchr2\t155444100\t155444700\t0.0037\t76\nchr2\t155445900\t155446500\t0.0037\t76\nchr2\t155500800\t155501100\t0.0656\t140\nchr2\t156369600\t156369900\t0.0384\t64\nchr2\t157370100\t157373400\t0.0162\t112\nchr2\t157378800\t157379700\t0.0191\t68\nchr2\t157520400\t157521000\t0.0215\t61\nchr2\t157547100\t157547400\t0.0742\t62\nchr2\t157567500\t157572000\t0\t102\nchr2\t158524500\t158528100\t0.0005\t81\nchr2\t158851800\t158852100\t0.1111\t62\nchr2\t158872800\t158873400\t0.0473\t71\nchr2\t159292800\t159294900\t0\t91\nchr2\t159663900\t159665700\t0.0064\t109\nchr2\t159991800\t159992100\t0.0939\t69\nchr2\t160758300\t160759500\t0.0017\t91\nchr2\t160770300\t160771500\t0\t75\nchr2\t160800900\t160801200\t0.1221\t93\nchr2\t160851300\t160851600\t0.0833\t27\nchr2\t160853700\t160854000\t0.0099\t80\nchr2\t161540400\t161540700\t0.0459\t67\nchr2\t164121000\t164123400\t0.0018\t127\nchr2\t164262300\t164263500\t0.0847\t92\nchr2\t165486300\t165489900\t0.0102\t120\nchr2\t165491100\t165491700\t0.0102\t120\nchr2\t165731700\t165732300\t0.0027\t137\nchr2\t165733500\t165736800\t0.0027\t137\nchr2\t166099500\t166101000\t0.0198\t147\nchr2\t166988700\t166994400\t0\t114\nchr2\t167216100\t167216700\t0.0077\t92\nchr2\t167466600\t167466900\t0.1813\t941\nchr2\t168039300\t168039600\t0.0894\t24\nchr2\t169248900\t169254300\t0\t111\nchr2\t169785000\t169785600\t0\t63\nchr2\t169787100\t169787400\t0\t63\nchr2\t171866100\t171866400\t0.1162\t78\nchr2\t172316400\t172320900\t0\t129\nchr2\t173699700\t173702700\t0.0027\t103\nchr2\t174269700\t174273900\t0.0293\t90\nchr2\t174405000\t174405600\t0.0402\t86\nchr2\t174407100\t174409200\t0.0422\t83\nchr2\t174720300\t174720600\t0.2718\t42\nchr2\t175482300\t175487700\t0\t90\nchr2\t175589700\t175591200\t0.0225\t102\nchr2\t175592700\t175593000\t0.1403\t84\nchr2\t175692900\t175693200\t0.1359\t81\nchr2\t175760100\t175764900\t0\t66\nchr2\t175813200\t175814100\t0.0106\t46\nchr2\t175962900\t175963200\t0.1763\t86\nchr2\t177946200\t177947100\t0.195\t63\nchr2\t177973200\t177978900\t0\t137\nchr2\t178654800\t178657200\t0\t74\nchr2\t178659000\t178662300\t0\t74\nchr2\t179061900\t179062200\t0.1091\t79\nchr2\t179735400\t179735700\t0.1422\t71\nchr2\t180834000\t180838500\t0\t114\nchr2\t182025900\t182027100\t0.0544\t96\nchr2\t182029500\t182030100\t0.0544\t96\nchr2\t182175600\t182175900\t0.043\t82\nchr2\t182214900\t182215200\t0\t114\nchr2\t182216400\t182217000\t0\t114\nchr2\t182430300\t182430600\t0.0327\t82\nchr2\t184947300\t184950600\t0\t131\nchr2\t185420400\t185421000\t0.0157\t91\nchr2\t185422800\t185424600\t0.0157\t91\nchr2\t185844000\t185844300\t0.0601\t31\nchr2\t185846400\t185846700\t0.0734\t54\nchr2\t185869800\t185870100\t0.1791\t88\nchr2\t186922800\t186923100\t0.0959\t69\nchr2\t186953100\t186953700\t0.0979\t91\nchr2\t187235100\t187235400\t0.1259\t66\nchr2\t188124300\t188127900\t0.0186\t98\nchr2\t188825400\t188825700\t0.0398\t97\nchr2\t189027300\t189030000\t0.0292\t114\nchr2\t192268800\t192272100\t0\t85\nchr2\t193213800\t193218300\t0.0032\t153\nchr2\t193706700\t193707000\t0.049\t56\nchr2\t193914000\t193914300\t0\t16\nchr2\t194447700\t194448000\t0.0585\t57\nchr2\t195068700\t195069000\t0.0493\t74\nchr2\t195528000\t195528300\t0.0873\t99\nchr2\t195567300\t195567900\t0.1823\t87\nchr2\t196524300\t196524600\t0.1823\t65\nchr2\t196525800\t196526400\t0.1644\t65\nchr2\t196906200\t196911600\t0\t103\nchr2\t197067600\t197067900\t0.1037\t111\nchr2\t197635800\t197636700\t0.1055\t91\nchr2\t197638200\t197640000\t0.1234\t84\nchr2\t197688000\t197689800\t0.0054\t97\nchr2\t197691300\t197692200\t0.0664\t77\nchr2\t198583800\t198585600\t0.0562\t111\nchr2\t200822400\t200822700\t0.0142\t54\nchr2\t201282000\t201282600\t0.1115\t70\nchr2\t201283800\t201284100\t0.0566\t50\nchr2\t204583200\t204583500\t0.0772\t55\nchr2\t204767100\t204770400\t0\t96\nchr2\t204993000\t204994500\t0.0248\t76\nchr2\t204995700\t204996300\t0.0248\t76\nchr2\t205044300\t205044600\t0.1335\t120\nchr2\t206374800\t206375400\t0\t25\nchr2\t206400300\t206400600\t0.2003\t26\nchr2\t206910000\t206910300\t0.099\t73\nchr2\t206911800\t206913000\t0.0161\t114\nchr2\t207005700\t207006000\t0.0248\t94\nchr2\t207609900\t207612000\t0\t99\nchr2\t208094400\t208094700\t0.0373\t31\nchr2\t208196400\t208196700\t0.2053\t35\nchr2\t209130000\t209130300\t0.0007\t66\nchr2\t209132700\t209133000\t0.1417\t69\nchr2\t209164500\t209164800\t0.05\t77\nchr2\t209332500\t209332800\t0.0235\t99\nchr2\t211220700\t211221000\t0.0589\t110\nchr2\t211223400\t211224300\t0.1528\t72\nchr2\t211890000\t211892400\t0.0212\t76\nchr2\t212702100\t212702400\t0.1545\t65\nchr2\t213345300\t213345600\t0.1878\t61\nchr2\t213567600\t213572400\t0\t103\nchr2\t213783600\t213783900\t0.016\t53\nchr2\t214686000\t214689300\t0.0111\t101\nchr2\t216226500\t216227700\t0\t45\nchr2\t217311300\t217311600\t0.1284\t80\nchr2\t219932400\t219937500\t0\t113\nchr2\t221985900\t221986200\t0.0404\t76\nchr2\t221989800\t221990100\t0.0773\t75\nchr2\t222148200\t222148500\t0.0589\t76\nchr2\t222149700\t222155100\t0.0165\t100\nchr2\t222816600\t222817200\t0.1754\t38\nchr2\t222895500\t222897600\t0\t65\nchr2\t225322500\t225322800\t0.1028\t68\nchr2\t226470300\t226470600\t0\t19\nchr2\t226574400\t226575000\t0.0078\t92\nchr2\t228756900\t228758400\t0\t98\nchr2\t228760200\t228760500\t0\t98\nchr2\t229184400\t229184700\t0.169\t34\nchr2\t230338200\t230338500\t0.0889\t76\nchr2\t230460600\t230460900\t0\t31\nchr2\t231823200\t231824700\t0\t89\nchr2\t231828300\t231828900\t0\t66\nchr2\t231838200\t231838500\t0.0178\t19\nchr2\t231843600\t231845100\t0.0148\t124\nchr2\t232149600\t232154700\t0\t94\nchr2\t232177500\t232181100\t0\t98\nchr2\t232360500\t232360800\t0.1151\t131\nchr2\t233567400\t233568000\t0.1087\t20\nchr2\t233578500\t233579100\t0.1051\t66\nchr2\t233723700\t233724000\t0.0921\t71\nchr2\t234645900\t234649500\t0\t44\nchr2\t235043400\t235043700\t0.0714\t66\nchr2\t236385300\t236385900\t0.0089\t117\nchr2\t237187800\t237188400\t0.1643\t87\nchr2\t238296000\t238296600\t0.0098\t87\nchr2\t238417800\t238418100\t0.2669\t38\nchr2\t238718400\t238718700\t0.0225\t75\nchr2\t238880400\t238880700\t0.0434\t33\nchr2\t239069100\t239069400\t0.1973\t26\nchr2\t239527500\t239527800\t0.0013\t60\nchr2\t239644500\t239645100\t0.0069\t310\nchr2\t240354600\t240354900\t0.0168\t18\nchr2\t240547500\t240547800\t0.0457\t120\nchr2\t240641400\t240641700\t0.0572\t24\nchr2\t240675300\t240681900\t0\t77\nchr2\t240689400\t240689700\t0\t39\nchr2\t240693900\t240699600\t0\t80\nchr2\t240907800\t240909000\t0\t54\nchr2\t240923700\t240924000\t0.1092\t14\nchr2\t240977100\t240979200\t0.0352\t66\nchr2\t240980400\t240980700\t0.0352\t66\nchr2\t241355700\t241356000\t0.2945\t47\nchr2\t241570500\t241570800\t0.2685\t61\nchr2\t241760100\t241760400\t0.2034\t79\nchr2\t241767000\t241767300\t0\t15\nchr2\t241805400\t241805700\t0.126\t16\nchr2\t241807500\t241807800\t0.2089\t29\nchr2\t242007300\t242009700\t0.0172\t56\nchr2\t242046900\t242047500\t0.0511\t73\nchr2\t242083200\t242083500\t0.2756\t75\nchr2\t242132400\t242132700\t0.0849\t40\nchr2\t242134200\t242135100\t0.0607\t56\nchr2\t242138400\t242139900\t0.0252\t54\nchr2\t242142300\t242142600\t0.0056\t66\nchr2\t242149500\t242151900\t0\t80\nchr2\t242153100\t242157000\t0\t80\nchr2\t242159100\t242169300\t0\t75\nchr2\t242172300\t242172600\t0.0104\t59\nchr2\t242174100\t242181900\t0\t166\nchr20\t60300\t67200\t0.1475\t1203\nchr20\t131100\t131400\t0.0384\t93\nchr20\t133200\t135300\t0\t81\nchr20\t1114800\t1115100\t0.1014\t63\nchr20\t1259400\t1259700\t0.2048\t73\nchr20\t1301700\t1302600\t0\t149\nchr20\t1573200\t1575600\t0.0098\t57\nchr20\t1606200\t1607400\t0.0055\t53\nchr20\t1742400\t1744800\t0.0011\t77\nchr20\t2443200\t2443500\t0.2378\t55\nchr20\t2822700\t2823900\t0.0083\t65\nchr20\t2825100\t2825700\t0.0083\t65\nchr20\t3477300\t3477600\t0.2756\t55\nchr20\t3498900\t3499200\t0.1616\t56\nchr20\t4033200\t4033500\t0.0203\t31\nchr20\t4035300\t4035600\t0.0203\t31\nchr20\t4388700\t4389000\t0.0464\t86\nchr20\t5380200\t5380800\t0.1342\t56\nchr20\t6191100\t6192000\t0.015\t47\nchr20\t6321000\t6321300\t0.0535\t98\nchr20\t7116300\t7122000\t0\t81\nchr20\t8112000\t8112600\t0.0432\t76\nchr20\t8596200\t8600400\t0\t86\nchr20\t9859500\t9861300\t0\t75\nchr20\t11633400\t11636400\t0\t72\nchr20\t11637600\t11638500\t0\t62\nchr20\t12123900\t12124200\t0.2179\t80\nchr20\t12635400\t12635700\t0.1229\t62\nchr20\t12801300\t12807000\t0\t74\nchr20\t16226700\t16228200\t0.0111\t47\nchr20\t16260000\t16260300\t0.228\t61\nchr20\t16549800\t16550100\t0.1687\t63\nchr20\t17122800\t17123100\t0.0173\t20\nchr20\t18602400\t18605700\t0\t86\nchr20\t18950100\t18954300\t0.0032\t87\nchr20\t19089000\t19089300\t0.0176\t72\nchr20\t19419900\t19421400\t0.0159\t68\nchr20\t19755300\t19755600\t0.0534\t47\nchr20\t21747300\t21747600\t0.0899\t87\nchr20\t21893100\t21893400\t0.0414\t91\nchr20\t21911100\t21911400\t0.0503\t98\nchr20\t23262900\t23263200\t0.0284\t44\nchr20\t23426400\t23431800\t0\t107\nchr20\t23591100\t23595000\t0\t106\nchr20\t25332900\t25333200\t0\t26\nchr20\t25765500\t25766700\t0\t139\nchr20\t25767900\t25771800\t0\t139\nchr20\t25778400\t25778700\t0.1196\t52\nchr20\t25779900\t25845000\t0\t98\nchr20\t25846500\t25846800\t0.0763\t77\nchr20\t26010900\t26076000\t0\t101\nchr20\t26084700\t26091000\t0\t131\nchr20\t26310600\t26310900\t0\t70\nchr20\t26313900\t26314500\t0.0244\t77\nchr20\t26366700\t26367000\t0.0993\t41\nchr20\t26437500\t26442600\t0\t282\nchr20\t26443800\t26459400\t0\t747\nchr20\t26460600\t26476200\t0\t929\nchr20\t26477700\t26480700\t0\t537\nchr20\t26482800\t26511000\t0\t623\nchr20\t26512800\t26513700\t0\t623\nchr20\t26516100\t26533200\t0\t516\nchr20\t26535000\t26544000\t0\t982\nchr20\t26546100\t26547900\t0\t317\nchr20\t26549100\t26556300\t0\t317\nchr20\t26557800\t26562300\t0\t381\nchr20\t26564100\t26577000\t0\t449\nchr20\t26578800\t26584500\t0\t449\nchr20\t26585700\t26589600\t0\t449\nchr20\t26600400\t26601900\t0\t402\nchr20\t26603100\t26608200\t0\t402\nchr20\t26609700\t26611200\t0\t402\nchr20\t26613000\t27294600\t0\t685\nchr20\t27295800\t27964200\t0\t930\nchr20\t27965400\t28044300\t0\t442\nchr20\t28045800\t28196100\t0\t483\nchr20\t28197600\t28336200\t0\t2005\nchr20\t28337400\t28415700\t0\t401\nchr20\t28417200\t28497000\t0\t365\nchr20\t28507200\t28535700\t0\t481\nchr20\t28537200\t28557000\t0\t481\nchr20\t28604700\t28605000\t0.062\t75\nchr20\t28635900\t28636200\t0.0164\t37\nchr20\t28644000\t28646100\t0\t311\nchr20\t28648500\t28694400\t0\t95\nchr20\t28696200\t28716900\t0\t84\nchr20\t28719600\t28728900\t0\t100\nchr20\t28777200\t28778400\t0.1606\t84\nchr20\t28842600\t28843500\t0\t224\nchr20\t28897500\t28899000\t0.1563\t1809\nchr20\t28960500\t29013600\t0\t63\nchr20\t29071200\t29071800\t0.04\t158\nchr20\t29080800\t29081100\t0.0396\t202\nchr20\t29130600\t29131500\t0\t11\nchr20\t29133900\t29134500\t0\t13\nchr20\t29136000\t29137500\t0\t43\nchr20\t29139300\t29139600\t0.0744\t10\nchr20\t29143500\t29143800\t0\t32\nchr20\t29145000\t29145600\t0\t44\nchr20\t29148600\t29150400\t0.0473\t27\nchr20\t29153100\t29155200\t0\t31\nchr20\t29157600\t29158800\t0\t33\nchr20\t29161200\t29161500\t0.2563\t18\nchr20\t29163300\t29167500\t0\t39\nchr20\t29173800\t29174100\t0.1824\t15\nchr20\t29175300\t29178300\t0\t41\nchr20\t29184900\t29185200\t0\t20\nchr20\t29189100\t29190300\t0\t41\nchr20\t29192400\t29192700\t0.2395\t25\nchr20\t29195400\t29196900\t0\t20\nchr20\t29198400\t29199900\t0.211\t79\nchr20\t29201400\t29202600\t0\t24\nchr20\t29494500\t29494800\t0.1119\t168\nchr20\t29505900\t29506200\t0.0315\t126\nchr20\t29584800\t29585700\t0.011\t50\nchr20\t29884800\t29885400\t0.0318\t165\nchr20\t29910300\t29910600\t0\t24\nchr20\t29913900\t29914500\t0\t103\nchr20\t29915700\t29920800\t0\t103\nchr20\t29922300\t29923800\t0\t121\nchr20\t29925000\t29929200\t0\t121\nchr20\t29930700\t29933700\t0\t114\nchr20\t29937000\t29941200\t0\t94\nchr20\t29947200\t29948100\t0\t88\nchr20\t29949900\t29950200\t0.0252\t32\nchr20\t29951700\t29952000\t0.0626\t28\nchr20\t29953500\t29954400\t0\t85\nchr20\t29957400\t29958000\t0\t61\nchr20\t29960100\t29960700\t0\t50\nchr20\t29962500\t29964300\t0\t75\nchr20\t29966700\t29967600\t0\t25\nchr20\t29968800\t29969100\t0.0246\t41\nchr20\t29971200\t29972100\t0\t37\nchr20\t29973600\t29974200\t0.1296\t36\nchr20\t29976600\t29976900\t0.0316\t11\nchr20\t29979900\t29981400\t0\t52\nchr20\t29982600\t29983500\t0\t117\nchr20\t29985300\t29986500\t0\t75\nchr20\t29988000\t29990400\t0\t75\nchr20\t29991600\t29998500\t0\t75\nchr20\t29999700\t30001500\t0\t75\nchr20\t30003900\t30004200\t0\t75\nchr20\t30005400\t30006900\t0\t43\nchr20\t30008100\t30012900\t0\t43\nchr20\t30014100\t30015600\t0\t58\nchr20\t30021600\t30022200\t0\t22\nchr20\t30023700\t30024000\t0.1927\t17\nchr20\t30027900\t30029400\t0\t61\nchr20\t30030900\t30033000\t0\t61\nchr20\t30034500\t30034800\t0.0864\t27\nchr20\t30037200\t30037500\t0.0304\t29\nchr20\t30088500\t30098400\t0\t73\nchr20\t30102000\t30108600\t0\t66\nchr20\t30109800\t30125100\t0\t111\nchr20\t30127200\t30127800\t0.0044\t50\nchr20\t30129300\t30129900\t0\t15\nchr20\t30131100\t30136800\t0\t68\nchr20\t30238200\t30238800\t0.0117\t60\nchr20\t30271200\t30271800\t0.0126\t55\nchr20\t30395100\t30395400\t0.2229\t105\nchr20\t31051500\t31054800\t0.0691\t8016\nchr20\t31056000\t31057500\t0.1476\t3117\nchr20\t31059600\t31060200\t0.2268\t4318\nchr20\t31062900\t31064100\t0.1896\t7420\nchr20\t31066200\t31066800\t0.2708\t1225\nchr20\t31069200\t31069800\t0.2123\t4027\nchr20\t31071600\t31071900\t0.2722\t3565\nchr20\t31073100\t31073700\t0.204\t3877\nchr20\t31076100\t31076400\t0.0077\t225\nchr20\t31078500\t31082100\t0.0077\t225\nchr20\t31083300\t31084200\t0.0647\t437\nchr20\t31085700\t31086600\t0.1276\t204\nchr20\t31088400\t31090200\t0.0566\t568\nchr20\t31091700\t31093200\t0.1018\t173\nchr20\t31095900\t31096200\t0.1816\t220\nchr20\t31098000\t31107000\t0\t5573\nchr20\t31157100\t31159200\t0.1848\t4493\nchr20\t31164000\t31168500\t0.1794\t2365\nchr20\t31171500\t31171800\t0.2266\t456\nchr20\t31174800\t31175100\t0.2655\t327\nchr20\t31176600\t31176900\t0.2172\t431\nchr20\t31184700\t31187400\t0.1673\t5715\nchr20\t31189200\t31189500\t0.2292\t2258\nchr20\t31194900\t31212900\t0\t1534\nchr20\t31214100\t31220700\t0\t1534\nchr20\t31222500\t31226400\t0.0137\t378\nchr20\t31229700\t31230900\t0.1276\t771\nchr20\t31235100\t31235400\t0.2136\t401\nchr20\t31237200\t31237500\t0.2671\t373\nchr20\t31239300\t31239600\t0.2954\t258\nchr20\t31241400\t31242000\t0.1216\t23471\nchr20\t31244100\t31245300\t0.25\t395\nchr20\t32175300\t32177400\t0.0556\t122\nchr20\t32723400\t32724900\t0\t70\nchr20\t33456000\t33456300\t0.0085\t24\nchr20\t34223700\t34224000\t0.0376\t76\nchr20\t34228200\t34231200\t0\t78\nchr20\t36981000\t36981300\t0.0163\t28\nchr20\t39368700\t39370500\t0.012\t82\nchr20\t39740700\t39741000\t0.0434\t50\nchr20\t39978600\t39978900\t0.0459\t49\nchr20\t40624800\t40625100\t0.0045\t50\nchr20\t41971200\t41971800\t0.0099\t83\nchr20\t42207300\t42207900\t0.1111\t63\nchr20\t43175700\t43176000\t0.0797\t52\nchr20\t43396200\t43397100\t0\t40\nchr20\t43815300\t43818900\t0.0476\t93\nchr20\t47829600\t47833200\t0\t68\nchr20\t47834700\t47835300\t0\t67\nchr20\t47894100\t47894400\t0.0127\t60\nchr20\t47898300\t47901900\t0\t74\nchr20\t48494700\t48495000\t0.0547\t84\nchr20\t48510600\t48511500\t0.1647\t29\nchr20\t48513900\t48514500\t0.0857\t41\nchr20\t48870900\t48871200\t0.0116\t26\nchr20\t53163300\t53163600\t0.255\t123\nchr20\t53456700\t53457600\t0.0368\t83\nchr20\t53474400\t53474700\t0.0539\t81\nchr20\t53476800\t53477400\t0.0044\t77\nchr20\t54249900\t54250200\t0\t64\nchr20\t54819000\t54819300\t0.1127\t234\nchr20\t55859700\t55865400\t0\t74\nchr20\t55888200\t55888500\t0.0614\t38\nchr20\t55945200\t55945500\t0.0357\t19\nchr20\t56082300\t56082600\t0.1091\t70\nchr20\t56109000\t56109600\t0.0599\t94\nchr20\t59133000\t59133300\t0.2007\t84\nchr20\t60409500\t60410100\t0\t138\nchr20\t60618000\t60618300\t0.1357\t62\nchr20\t61283100\t61283400\t0.2659\t30\nchr20\t61289700\t61290300\t0.143\t87\nchr20\t61653000\t61653300\t0.123\t32\nchr20\t61675500\t61675800\t0.2688\t50\nchr20\t61784100\t61784400\t0.1949\t29\nchr20\t61943100\t61944600\t0\t45\nchr20\t61946100\t61946400\t0.228\t13\nchr20\t62057700\t62058900\t0.071\t77\nchr20\t63156900\t63157200\t0.1406\t38\nchr20\t63607500\t63608100\t0.1235\t69\nchr20\t63669900\t63670200\t0\t53\nchr20\t63965100\t63965400\t0.0594\t48\nchr20\t64011900\t64012800\t0.0031\t84\nchr20\t64087200\t64087500\t0.0152\t62\nchr20\t64133400\t64133700\t0.2071\t19\nchr20\t64173900\t64176000\t0.0083\t99\nchr20\t64270800\t64271400\t0.014\t49\nchr20\t64289400\t64290900\t0.0851\t89\nchr20\t64292400\t64293000\t0\t79\nchr20\t64295100\t64302300\t0\t79\nchr20\t64304100\t64306800\t0.0204\t87\nchr20\t64308300\t64308600\t0.0295\t84\nchr20\t64310700\t64312500\t0.0542\t73\nchr20\t64326600\t64326900\t0.0698\t43\nchr21\t5010000\t5030400\t0\t47\nchr21\t5032200\t5033100\t0\t47\nchr21\t5034600\t5035500\t0\t45\nchr21\t5037300\t5037900\t0\t45\nchr21\t5039400\t5051100\t0\t39\nchr21\t5052600\t5062500\t0\t44\nchr21\t5067300\t5067600\t0.0802\t37\nchr21\t5070300\t5070600\t0.0852\t38\nchr21\t5072100\t5085300\t0\t43\nchr21\t5087100\t5089800\t0\t36\nchr21\t5091000\t5095500\t0\t38\nchr21\t5100300\t5101500\t0\t35\nchr21\t5105100\t5107800\t0\t46\nchr21\t5109900\t5110200\t0\t46\nchr21\t5113200\t5113500\t0.0296\t25\nchr21\t5116800\t5117100\t0.0131\t35\nchr21\t5118600\t5119200\t0\t44\nchr21\t5120400\t5136300\t0\t44\nchr21\t5137500\t5138400\t0\t37\nchr21\t5139600\t5140800\t0\t37\nchr21\t5142000\t5142300\t0.0885\t30\nchr21\t5143800\t5144700\t0\t37\nchr21\t5145900\t5148300\t0\t48\nchr21\t5151300\t5153700\t0\t44\nchr21\t5156400\t5166300\t0\t38\nchr21\t5255700\t5256000\t0.082\t42\nchr21\t5258700\t5260800\t0\t129\nchr21\t5262000\t5264100\t0\t129\nchr21\t5265600\t5269500\t0\t91\nchr21\t5272200\t5272800\t0.1046\t118\nchr21\t5275500\t5280600\t0.0085\t115\nchr21\t5282100\t5283000\t0.005\t100\nchr21\t5284200\t5284800\t0.005\t100\nchr21\t5286300\t5286900\t0.005\t100\nchr21\t5288100\t5289000\t0\t96\nchr21\t5298600\t5298900\t0.0149\t92\nchr21\t5300700\t5301000\t0.0482\t94\nchr21\t5303400\t5307600\t0.0043\t143\nchr21\t5310000\t5311200\t0.1259\t140\nchr21\t5314200\t5314500\t0.0018\t152\nchr21\t5317800\t5318100\t0.0911\t197\nchr21\t5321400\t5322300\t0.0422\t124\nchr21\t5323500\t5324100\t0.0065\t184\nchr21\t5325300\t5325900\t0.1258\t165\nchr21\t5327100\t5330400\t0.0253\t690\nchr21\t5332200\t5334300\t0.0222\t79\nchr21\t5337300\t5340900\t0\t118\nchr21\t5342400\t5343000\t0.0844\t80\nchr21\t5345100\t5345700\t0\t75\nchr21\t5346900\t5348400\t0\t75\nchr21\t5351400\t5351700\t0.0095\t101\nchr21\t5354100\t5354400\t0.0095\t101\nchr21\t5356800\t5357400\t0.0025\t312\nchr21\t5360400\t5363400\t0.0019\t170\nchr21\t5364900\t5366700\t0\t91\nchr21\t5368500\t5369400\t0\t91\nchr21\t5370900\t5371200\t0\t91\nchr21\t5378100\t5378700\t0.0132\t172\nchr21\t5379900\t5380200\t0.0132\t172\nchr21\t5381700\t5382000\t0.0664\t101\nchr21\t5383500\t5387400\t0.0466\t233\nchr21\t5393100\t5393400\t0.1974\t49\nchr21\t5443500\t5448900\t0\t72\nchr21\t5499000\t5506800\t0\t51\nchr21\t5508000\t5627700\t0\t79\nchr21\t5677500\t5796000\t0\t93\nchr21\t5846100\t5916600\t0\t84\nchr21\t5966700\t5985300\t0\t42\nchr21\t5988000\t6093300\t0\t53\nchr21\t6094500\t6097500\t0\t45\nchr21\t6100500\t6102300\t0\t28\nchr21\t6103500\t6106500\t0\t45\nchr21\t6107700\t6124200\t0\t45\nchr21\t6126000\t6154800\t0\t47\nchr21\t6156300\t6157200\t0\t45\nchr21\t6158700\t6161400\t0\t45\nchr21\t6211500\t6312600\t0\t86\nchr21\t6314100\t6374100\t0\t216\nchr21\t6431100\t6431400\t0.1337\t26\nchr21\t6439500\t6458400\t0\t47\nchr21\t6460500\t6478500\t0\t42\nchr21\t6480600\t6486300\t0\t39\nchr21\t6487500\t6489000\t0\t60\nchr21\t6490500\t6557700\t0\t60\nchr21\t6558900\t6560700\t0\t60\nchr21\t6561900\t6564600\t0\t38\nchr21\t6566400\t6580200\t0\t44\nchr21\t6630300\t6675000\t0\t122\nchr21\t6676500\t6738900\t0\t122\nchr21\t6789600\t6822600\t0\t45\nchr21\t6823800\t6846000\t0\t45\nchr21\t6847200\t6891900\t0\t45\nchr21\t6893100\t6896700\t0\t45\nchr21\t6897900\t6899400\t0\t49\nchr21\t6900600\t6900900\t0\t49\nchr21\t6902100\t6915600\t0\t49\nchr21\t6917400\t6927000\t0\t53\nchr21\t6930000\t6932400\t0\t35\nchr21\t6933600\t6934200\t0\t24\nchr21\t6984300\t7149600\t0\t89\nchr21\t7200300\t7202400\t0\t146\nchr21\t7203600\t7204200\t0\t146\nchr21\t7205700\t7226400\t0\t146\nchr21\t7227600\t7228500\t0\t146\nchr21\t7242300\t7242600\t0.1695\t102\nchr21\t7244100\t7244400\t0.0614\t152\nchr21\t7250700\t7252500\t0.0039\t216\nchr21\t7253700\t7254600\t0.0039\t216\nchr21\t7257300\t7257600\t0.029\t432\nchr21\t7261200\t7262400\t0.1625\t1418\nchr21\t7263900\t7264200\t0.0542\t85\nchr21\t7265400\t7266000\t0.0542\t85\nchr21\t7269000\t7269600\t0.0009\t99\nchr21\t7270800\t7271400\t0\t88\nchr21\t7277100\t7277700\t0.0015\t109\nchr21\t7279500\t7279800\t0.0015\t109\nchr21\t7285800\t7286100\t0.113\t98\nchr21\t7288200\t7289100\t0.0003\t315\nchr21\t7294200\t7297200\t0.0202\t164\nchr21\t7299000\t7300500\t0.0043\t75\nchr21\t7302600\t7303200\t0.0043\t75\nchr21\t7305600\t7305900\t0.1168\t109\nchr21\t7308600\t7309200\t0.0389\t192\nchr21\t7313700\t7316700\t0.0077\t151\nchr21\t7377900\t7383900\t0\t44\nchr21\t7385100\t7500900\t0\t79\nchr21\t7551000\t7693800\t0\t91\nchr21\t7743900\t7818600\t0\t51\nchr21\t7820700\t7822500\t0\t47\nchr21\t7824600\t7865700\t0\t47\nchr21\t7927200\t7927500\t0.2991\t1033\nchr21\t7938300\t7938600\t0.2479\t2314\nchr21\t7944300\t7944600\t0.2277\t1733\nchr21\t7970700\t7971600\t0.0106\t318\nchr21\t7974300\t7974600\t0.0977\t351\nchr21\t7978500\t7992000\t0\t284\nchr21\t7994400\t8010600\t0\t284\nchr21\t8012100\t8012700\t0\t284\nchr21\t8013900\t8014800\t0.0027\t144\nchr21\t8016900\t8019300\t0.0289\t215\nchr21\t8024700\t8031000\t0\t236\nchr21\t8032800\t8033100\t0\t236\nchr21\t8034600\t8035500\t0\t236\nchr21\t8042700\t8044800\t0\t210\nchr21\t8046300\t8047200\t0\t123\nchr21\t8100000\t8261100\t0\t5868\nchr21\t8310900\t8472300\t0\t5169\nchr21\t8523000\t8524500\t0.0223\t49\nchr21\t8525700\t8526600\t0.0223\t49\nchr21\t8533800\t8538600\t0\t77\nchr21\t8539800\t8544600\t0\t66\nchr21\t8546400\t8548500\t0.0071\t60\nchr21\t8550300\t8553600\t0\t60\nchr21\t8555100\t8559300\t0\t98\nchr21\t8560500\t8562000\t0\t98\nchr21\t8563500\t8563800\t0\t98\nchr21\t8565000\t8570700\t0\t98\nchr21\t8571900\t8577300\t0\t57\nchr21\t8578500\t8581800\t0\t75\nchr21\t8583000\t8583600\t0.0008\t37\nchr21\t8586300\t8586900\t0\t43\nchr21\t8589300\t8589900\t0.0103\t63\nchr21\t8591700\t8594400\t0\t86\nchr21\t8596500\t8602200\t0\t60\nchr21\t8603400\t8610300\t0\t60\nchr21\t8611500\t8613900\t0\t60\nchr21\t8616600\t8617800\t0.0238\t38\nchr21\t8619300\t8620800\t0\t62\nchr21\t8622600\t8624400\t0\t46\nchr21\t8625900\t8626200\t0.0354\t34\nchr21\t8628300\t8630400\t0\t45\nchr21\t8631600\t8632200\t0.0052\t37\nchr21\t8634900\t8635200\t0.0625\t25\nchr21\t8637300\t8637900\t0\t36\nchr21\t8639400\t8645400\t0\t51\nchr21\t8646600\t8647200\t0\t51\nchr21\t8650200\t8650800\t0.0009\t53\nchr21\t8652900\t8653200\t0.1866\t42\nchr21\t8656800\t8657400\t0.0013\t39\nchr21\t8658900\t8659800\t0\t41\nchr21\t8661000\t8661600\t0\t32\nchr21\t8666400\t8666700\t0\t51\nchr21\t8668200\t8669100\t0\t51\nchr21\t8670300\t8681400\t0\t52\nchr21\t8691000\t8691300\t0.0117\t70\nchr21\t8791800\t8805600\t0\t162\nchr21\t8806800\t8808000\t0\t298\nchr21\t8809800\t8814900\t0\t298\nchr21\t8816700\t8830800\t0\t298\nchr21\t8832300\t8832600\t0\t298\nchr21\t8840400\t8840700\t0.259\t154\nchr21\t8845200\t8879100\t0\t117\nchr21\t8880300\t8885700\t0\t102\nchr21\t8986500\t8988600\t0\t2094\nchr21\t9016200\t9016800\t0.0116\t166\nchr21\t9030900\t9031200\t0.1509\t80\nchr21\t9042900\t9067500\t0\t116\nchr21\t9069000\t9070500\t0\t116\nchr21\t9073500\t9073800\t0\t35\nchr21\t9076200\t9078000\t0.0238\t45\nchr21\t9079500\t9081900\t0\t75\nchr21\t9091500\t9091800\t0\t31\nchr21\t9093900\t9094800\t0\t50\nchr21\t9096000\t9096300\t0\t50\nchr21\t9098700\t9103200\t0\t99\nchr21\t9106800\t9115800\t0\t95\nchr21\t9117900\t9118500\t0.0518\t110\nchr21\t9121800\t9128700\t0\t158\nchr21\t9129900\t9130200\t0\t158\nchr21\t9131400\t9132300\t0.0876\t61\nchr21\t9133500\t9151500\t0\t99\nchr21\t9153000\t9157500\t0\t132\nchr21\t9159300\t9167700\t0\t106\nchr21\t9168900\t9174000\t0\t99\nchr21\t9175200\t9187500\t0\t99\nchr21\t9188700\t9195900\t0\t145\nchr21\t9248700\t9283500\t0\t583\nchr21\t9285300\t9288900\t0\t583\nchr21\t9290100\t9291900\t0\t583\nchr21\t9293700\t9297000\t0\t583\nchr21\t9299100\t9301800\t0.0062\t197\nchr21\t9303000\t9313200\t0\t263\nchr21\t9314400\t9349200\t0\t263\nchr21\t9350400\t9353700\t0\t263\nchr21\t9355500\t9360000\t0\t178\nchr21\t9363300\t9365100\t0\t216\nchr21\t9366600\t9372900\t0\t188\nchr21\t9374400\t9377100\t0\t188\nchr21\t9527400\t9528300\t0\t98\nchr21\t9529500\t9531900\t0\t98\nchr21\t9533700\t9534600\t0\t98\nchr21\t9536700\t9538200\t0\t98\nchr21\t9541200\t9544200\t0\t107\nchr21\t9545400\t9551700\t0\t107\nchr21\t9553200\t9562200\t0\t107\nchr21\t9564300\t9564900\t0\t109\nchr21\t9566400\t9567900\t0.0539\t130\nchr21\t9570000\t9570300\t0.1352\t63\nchr21\t9573300\t9573900\t0.0001\t111\nchr21\t9576000\t9576300\t0.0029\t111\nchr21\t9578400\t9581400\t0.0005\t145\nchr21\t9584400\t9586500\t0.0139\t123\nchr21\t9589200\t9590400\t0\t116\nchr21\t9591600\t9592500\t0\t116\nchr21\t9594000\t9594300\t0\t116\nchr21\t9597900\t9598500\t0.005\t66\nchr21\t9601800\t9603300\t0\t128\nchr21\t9604800\t9606300\t0.1697\t95\nchr21\t9609300\t9610500\t0.046\t104\nchr21\t9612300\t9613800\t0.012\t97\nchr21\t9615300\t9615600\t0.0511\t68\nchr21\t9617100\t9618000\t0.0413\t111\nchr21\t9620700\t9622800\t0.0186\t99\nchr21\t9624300\t9624600\t0.0186\t79\nchr21\t9627900\t9628200\t0.0027\t86\nchr21\t9633000\t9633600\t0.0535\t76\nchr21\t9635100\t9636600\t0.0044\t90\nchr21\t9637800\t9639300\t0.1049\t91\nchr21\t9640500\t9642000\t0\t100\nchr21\t9645000\t9646800\t0\t92\nchr21\t9659100\t9659700\t0\t104\nchr21\t9660900\t9662700\t0\t104\nchr21\t9664800\t9665400\t0\t104\nchr21\t9668100\t9668400\t0\t104\nchr21\t9670200\t9671400\t0\t91\nchr21\t9672600\t9673200\t0\t91\nchr21\t9675000\t9675300\t0.0484\t53\nchr21\t9677400\t9677700\t0.012\t102\nchr21\t9679500\t9683100\t0\t91\nchr21\t9684600\t9690300\t0\t119\nchr21\t9691500\t9695400\t0\t104\nchr21\t9697200\t9697500\t0\t104\nchr21\t9701100\t9701400\t0\t113\nchr21\t9702900\t9703500\t0\t113\nchr21\t9706500\t9706800\t0.0279\t72\nchr21\t9709200\t9710700\t0.0154\t78\nchr21\t9714000\t9714600\t0\t104\nchr21\t9715800\t9716700\t0\t104\nchr21\t9718200\t9718500\t0\t104\nchr21\t9734700\t9735000\t0.1943\t105\nchr21\t9798000\t9798600\t0.0522\t103\nchr21\t9800400\t9804600\t0\t97\nchr21\t9806400\t9807000\t0.0041\t94\nchr21\t9808800\t9809100\t0.0685\t89\nchr21\t9813000\t9813300\t0.19\t335\nchr21\t9816300\t9816600\t0.1635\t379\nchr21\t9818400\t9818700\t0.0889\t53\nchr21\t9825000\t9835800\t0\t187\nchr21\t10031100\t10032300\t0\t103\nchr21\t10034700\t10035000\t0.0111\t87\nchr21\t10037100\t10038600\t0.0111\t87\nchr21\t10040100\t10041600\t0.0163\t73\nchr21\t10043700\t10044300\t0.0042\t71\nchr21\t10045800\t10046400\t0.0112\t54\nchr21\t10049700\t10050000\t0\t80\nchr21\t10051800\t10053600\t0.0084\t93\nchr21\t10054800\t10055100\t0.0153\t96\nchr21\t10057500\t10057800\t0.0537\t90\nchr21\t10059300\t10063200\t0\t69\nchr21\t10065300\t10067400\t0\t91\nchr21\t10068600\t10069200\t0.0155\t78\nchr21\t10070400\t10071600\t0.0086\t100\nchr21\t10073400\t10074000\t0.0086\t100\nchr21\t10075200\t10075500\t0.0327\t80\nchr21\t10083000\t10083300\t0.182\t103\nchr21\t10085400\t10086000\t0\t73\nchr21\t10089900\t10090200\t0.0325\t98\nchr21\t10092300\t10092600\t0.0043\t83\nchr21\t10095300\t10096200\t0\t118\nchr21\t10104300\t10104600\t0.0013\t80\nchr21\t10109100\t10111500\t0.0102\t107\nchr21\t10113300\t10114500\t0.0021\t66\nchr21\t10116300\t10116600\t0.0016\t70\nchr21\t10118100\t10118400\t0.0171\t93\nchr21\t10124400\t10125000\t0.0031\t56\nchr21\t10128000\t10140300\t0\t130\nchr21\t10143300\t10145700\t0\t116\nchr21\t10148700\t10149000\t0\t116\nchr21\t10152000\t10156200\t0\t104\nchr21\t10158000\t10158300\t0\t104\nchr21\t10159500\t10161600\t0\t104\nchr21\t10163700\t10169100\t0\t104\nchr21\t10269600\t10269900\t0.1552\t75\nchr21\t10274100\t10274400\t0.1199\t4615\nchr21\t10324200\t10324500\t0.275\t102\nchr21\t10364100\t10364400\t0.0021\t167\nchr21\t10366500\t10370700\t0\t383\nchr21\t10392600\t10392900\t0.1636\t306\nchr21\t10479300\t10479600\t0.0833\t148\nchr21\t10492500\t10498200\t0.008\t62\nchr21\t10500900\t10501500\t0\t70\nchr21\t10502700\t10504800\t0\t69\nchr21\t10507500\t10510200\t0\t61\nchr21\t10655400\t10656600\t0.1186\t6680\nchr21\t10658700\t10659000\t0.2461\t1950\nchr21\t10668900\t10669200\t0.2317\t3467\nchr21\t10692300\t10693200\t0.1738\t30778\nchr21\t10705200\t10705500\t0.1717\t2181\nchr21\t10731900\t10732200\t0.2272\t1201\nchr21\t13044900\t13045200\t0.1419\t55\nchr21\t13046700\t13047000\t0.0221\t66\nchr21\t13048800\t13050000\t0.0434\t41\nchr21\t13063200\t13063800\t0.0238\t50\nchr21\t13092300\t13092600\t0.0615\t54\nchr21\t13138200\t13138500\t0.0037\t57\nchr21\t13167000\t13167300\t0.1345\t56\nchr21\t13175100\t13175400\t0.2975\t60\nchr21\t13179900\t13181100\t0\t62\nchr21\t13184700\t13185900\t0\t62\nchr21\t13208700\t13209000\t0.0904\t50\nchr21\t13586400\t13587300\t0\t18\nchr21\t13588500\t13591500\t0\t47\nchr21\t13594200\t13594500\t0.0088\t30\nchr21\t13596000\t13596900\t0.2011\t38\nchr21\t13599900\t13600200\t0.0747\t50\nchr21\t13603200\t13603500\t0.0607\t47\nchr21\t13606800\t13608000\t0.001\t31\nchr21\t13610100\t13610400\t0.0831\t37\nchr21\t13614600\t13618500\t0\t37\nchr21\t13619700\t13623900\t0\t47\nchr21\t13625100\t13630200\t0\t32\nchr21\t13631700\t13633200\t0\t32\nchr21\t13635300\t13636200\t0\t25\nchr21\t13638000\t13639200\t0\t36\nchr21\t13640700\t13641300\t0.0193\t31\nchr21\t13642800\t13643100\t0.0202\t45\nchr21\t13646400\t13646700\t0.0021\t34\nchr21\t13648800\t13649100\t0.0021\t34\nchr21\t13652400\t13652700\t0.0807\t49\nchr21\t13657500\t13659000\t0.0975\t32\nchr21\t13660500\t13663500\t0\t38\nchr21\t13666800\t13668600\t0\t29\nchr21\t13669800\t13671900\t0\t34\nchr21\t13675500\t13675800\t0.0403\t19\nchr21\t13678800\t13685100\t0\t38\nchr21\t13686600\t13711200\t0\t37\nchr21\t13712400\t13717500\t0\t23\nchr21\t13719000\t13732500\t0\t27\nchr21\t13733700\t13778100\t0\t50\nchr21\t13784700\t13799100\t0\t64\nchr21\t13866600\t13866900\t0.119\t27\nchr21\t13975500\t13975800\t0.0027\t40\nchr21\t13984200\t13984500\t0.0357\t52\nchr21\t13992900\t13993200\t0.0168\t66\nchr21\t14059800\t14060100\t0.0877\t31\nchr21\t14068500\t14068800\t0.1606\t38\nchr21\t14588100\t14588400\t0.2189\t68\nchr21\t14929800\t14930100\t0.0127\t80\nchr21\t14931300\t14932500\t0.0127\t80\nchr21\t15837000\t15837300\t0.2844\t47\nchr21\t17172600\t17172900\t0.034\t25\nchr21\t17292000\t17292600\t0.0045\t95\nchr21\t17305500\t17306100\t0.0801\t51\nchr21\t17377500\t17378700\t0.0522\t84\nchr21\t17380200\t17380500\t0.1912\t69\nchr21\t17718900\t17719200\t0.1518\t71\nchr21\t19073400\t19073700\t0.0491\t61\nchr21\t20076900\t20077200\t0.0996\t33\nchr21\t20200500\t20201400\t0.1161\t66\nchr21\t24391800\t24392100\t0.0599\t15\nchr21\t25919400\t25920000\t0.0674\t93\nchr21\t25922100\t25922700\t0\t58\nchr21\t25923900\t25924200\t0.0405\t30\nchr21\t29421600\t29422200\t0.1107\t68\nchr21\t30840000\t30841800\t0.0202\t95\nchr21\t31784700\t31785000\t0.2873\t301\nchr21\t32225400\t32226000\t0.006\t87\nchr21\t33927000\t33927300\t0.1607\t87\nchr21\t34374600\t34449000\t0\t45\nchr21\t34450800\t34495500\t0\t47\nchr21\t35493900\t35495400\t0.0053\t70\nchr21\t35498400\t35499300\t0.0702\t94\nchr21\t36496800\t36497400\t0.2061\t169\nchr21\t38828700\t38829300\t0.0202\t56\nchr21\t40023600\t40023900\t0.0196\t15\nchr21\t40027500\t40028100\t0\t77\nchr21\t40034100\t40034700\t0\t66\nchr21\t40038300\t40038600\t0.0135\t32\nchr21\t40917300\t40917600\t0.0442\t26\nchr21\t42588000\t42590100\t0.0432\t19\nchr21\t42957300\t42957600\t0.1622\t1902\nchr21\t43044300\t43045800\t0.023\t40\nchr21\t43047600\t43065900\t0\t49\nchr21\t43068900\t43086900\t0\t49\nchr21\t43089000\t43094100\t0\t40\nchr21\t43095900\t43116600\t0\t46\nchr21\t43117800\t43137900\t0\t46\nchr21\t43139400\t43165200\t0\t46\nchr21\t43167300\t43168200\t0\t47\nchr21\t43170000\t43173000\t0\t50\nchr21\t43174500\t43187400\t0\t50\nchr21\t43377600\t43379700\t0\t43\nchr21\t43381200\t43382100\t0\t43\nchr21\t43383300\t43403400\t0\t43\nchr21\t43404600\t43410600\t0\t43\nchr21\t43412100\t43412400\t0.1544\t28\nchr21\t43414200\t43416900\t0.0009\t35\nchr21\t43418100\t43438500\t0\t38\nchr21\t43440600\t43467300\t0\t46\nchr21\t43468500\t43494600\t0\t46\nchr21\t43497600\t43505100\t0\t41\nchr21\t43506300\t43550700\t0\t51\nchr21\t43553400\t43571700\t0\t39\nchr21\t44096100\t44145900\t0\t45\nchr21\t44147100\t44148900\t0\t45\nchr21\t44150100\t44163300\t0\t45\nchr21\t44164800\t44194800\t0\t45\nchr21\t44196900\t44197200\t0\t15\nchr21\t44201400\t44209500\t0\t46\nchr21\t44211000\t44229000\t0\t44\nchr21\t44230200\t44253300\t0\t44\nchr21\t44422800\t44423100\t0.1979\t32\nchr21\t44982000\t44982300\t0.1984\t31\nchr21\t45633300\t45634200\t0.1596\t78\nchr21\t45746400\t45746700\t0.1334\t74\nchr21\t46034400\t46034700\t0.0249\t51\nchr21\t46169700\t46170000\t0.208\t15\nchr21\t46184400\t46184700\t0.2168\t200\nchr21\t46201200\t46201500\t0.0904\t103\nchr21\t46292700\t46294500\t0.1325\t160\nchr21\t46684500\t46686600\t0\t79\nchr21\t46689900\t46691700\t0\t74\nchr21\t46692900\t46698900\t0\t125\nchr22\t10509900\t10521600\t0\t80\nchr22\t10523400\t10550700\t0\t118\nchr22\t10551900\t10558800\t0\t118\nchr22\t10560000\t10560600\t0\t23\nchr22\t10562100\t10567500\t0\t73\nchr22\t10568700\t10571100\t0\t54\nchr22\t10573500\t10597800\t0\t65\nchr22\t10599300\t10601700\t0\t48\nchr22\t10602900\t10612200\t0\t48\nchr22\t10614000\t10615200\t0\t24\nchr22\t10617300\t10628100\t0\t54\nchr22\t10629900\t10630800\t0\t40\nchr22\t10634100\t10638900\t0\t49\nchr22\t10641000\t10641300\t0.0137\t20\nchr22\t10642500\t10644000\t0\t47\nchr22\t10645500\t10649700\t0\t47\nchr22\t10651500\t10657200\t0\t47\nchr22\t10659000\t10659900\t0\t47\nchr22\t10674600\t10674900\t0.1213\t53\nchr22\t10682700\t10683000\t0.096\t80\nchr22\t10689600\t10689900\t0.158\t120\nchr22\t10706100\t10706700\t0.1954\t82\nchr22\t10709400\t10709700\t0.0682\t83\nchr22\t10718100\t10718400\t0.2787\t1204\nchr22\t10725900\t10726200\t0.2591\t152\nchr22\t10834500\t10862700\t0\t142\nchr22\t10863900\t10874400\t0\t62\nchr22\t10963500\t10963800\t0.0399\t97\nchr22\t11016900\t11017200\t0\t336\nchr22\t11018700\t11022300\t0\t336\nchr22\t11045400\t11045700\t0.0402\t270\nchr22\t11049900\t11050200\t0.0451\t275\nchr22\t11119200\t11160900\t0\t78\nchr22\t11211300\t11212800\t0.1607\t585\nchr22\t11215500\t11217300\t0\t38\nchr22\t11220900\t11244900\t0\t69\nchr22\t11246100\t11250300\t0\t69\nchr22\t11251500\t11252700\t0\t69\nchr22\t11253900\t11265900\t0\t193\nchr22\t11267100\t11271000\t0\t193\nchr22\t11272200\t11274300\t0\t193\nchr22\t11275500\t11281500\t0\t193\nchr22\t11282700\t11284500\t0\t193\nchr22\t11320500\t11322900\t0\t226\nchr22\t11332500\t11332800\t0.1977\t54\nchr22\t11368800\t11370900\t0.0029\t644\nchr22\t11438400\t11438700\t0.2063\t33\nchr22\t11445600\t11447100\t0\t17\nchr22\t11449500\t11450400\t0\t19\nchr22\t11452200\t11452500\t0\t12\nchr22\t11454000\t11456400\t0\t28\nchr22\t11458500\t11459700\t0\t27\nchr22\t11460900\t11461200\t0\t27\nchr22\t11462400\t11466000\t0\t36\nchr22\t11470500\t11471700\t0.0674\t21\nchr22\t11484600\t11484900\t0\t12\nchr22\t11557800\t11560200\t0\t270\nchr22\t11683200\t11684400\t0\t105\nchr22\t11685600\t11689800\t0\t105\nchr22\t11691900\t11694300\t0.0054\t151\nchr22\t11696400\t11696700\t0.0126\t54\nchr22\t11698800\t11702700\t0\t219\nchr22\t11706000\t11706300\t0.0038\t127\nchr22\t11708400\t11710200\t0.0038\t127\nchr22\t11711700\t11714400\t0\t160\nchr22\t11716800\t11722200\t0\t201\nchr22\t11724000\t11724300\t0\t201\nchr22\t11774700\t11782200\t0\t113\nchr22\t11783400\t11785500\t0\t113\nchr22\t11787600\t11790300\t0\t141\nchr22\t11792700\t11793300\t0\t30\nchr22\t11796600\t11796900\t0.0017\t76\nchr22\t11798100\t11799300\t0\t49\nchr22\t11802300\t11810700\t0\t825\nchr22\t11811900\t11817300\t0\t825\nchr22\t11820000\t11821200\t0\t134\nchr22\t11823000\t11823300\t0.1625\t41\nchr22\t11825700\t11826000\t0\t64\nchr22\t11827200\t11827500\t0\t97\nchr22\t11828700\t11829300\t0\t97\nchr22\t11830500\t11832600\t0\t149\nchr22\t11834700\t11866200\t0\t149\nchr22\t11867400\t11869800\t0\t80\nchr22\t11872200\t11872800\t0\t80\nchr22\t11876100\t11878800\t0\t38\nchr22\t11880900\t11883900\t0\t79\nchr22\t11885100\t11885700\t0\t79\nchr22\t11893800\t11894100\t0.0099\t78\nchr22\t11895300\t11899500\t0\t61\nchr22\t11901000\t11908800\t0\t77\nchr22\t11911800\t11915700\t0\t103\nchr22\t11916900\t11919900\t0\t103\nchr22\t11921700\t11928000\t0.0451\t84\nchr22\t11931300\t11931900\t0.0355\t55\nchr22\t11935500\t11938500\t0.0132\t89\nchr22\t11941200\t11941500\t0.0662\t40\nchr22\t11952900\t11953200\t0.1724\t35\nchr22\t11954700\t11956800\t0\t106\nchr22\t11958900\t11959500\t0\t106\nchr22\t11966100\t11966700\t0.1888\t23\nchr22\t11969100\t11969400\t0\t101\nchr22\t11972100\t11973000\t0\t101\nchr22\t12046500\t12046800\t0.104\t109\nchr22\t12058200\t12058500\t0.0647\t66\nchr22\t12060600\t12062100\t0\t61\nchr22\t12063600\t12065700\t0\t128\nchr22\t12066900\t12068400\t0\t128\nchr22\t12070200\t12070500\t0.0085\t99\nchr22\t12071700\t12077100\t0.0006\t163\nchr22\t12080100\t12080700\t0.0724\t101\nchr22\t12085800\t12087900\t0\t119\nchr22\t12089100\t12091200\t0.0083\t107\nchr22\t12092700\t12093000\t0.1163\t91\nchr22\t12096900\t12097200\t0.025\t86\nchr22\t12106800\t12107400\t0.0566\t79\nchr22\t12115800\t12116400\t0.0023\t64\nchr22\t12127500\t12128100\t0.0006\t136\nchr22\t12130200\t12131700\t0\t57\nchr22\t12134400\t12135300\t0.0014\t77\nchr22\t12138300\t12139500\t0.0096\t90\nchr22\t12146700\t12147900\t0.039\t84\nchr22\t12151500\t12151800\t0.1453\t172\nchr22\t12155100\t12155400\t0.1329\t176\nchr22\t12175500\t12176700\t0.016\t892\nchr22\t12178200\t12178500\t0.0173\t183\nchr22\t12182100\t12182400\t0.0042\t79\nchr22\t12186600\t12186900\t0.1295\t113\nchr22\t12275700\t12276600\t0.1793\t149\nchr22\t12281700\t12282000\t0.0069\t158\nchr22\t12286800\t12289500\t0.0021\t171\nchr22\t12291000\t12292500\t0.0021\t171\nchr22\t12293700\t12294900\t0\t253\nchr22\t12296100\t12296700\t0\t253\nchr22\t12299700\t12300000\t0.0705\t67\nchr22\t12301500\t12302100\t0.0836\t88\nchr22\t12305100\t12305400\t0.2314\t185\nchr22\t12309000\t12309300\t0.002\t218\nchr22\t12310500\t12313800\t0.002\t218\nchr22\t12315900\t12316200\t0.0081\t46\nchr22\t12320700\t12321300\t0.0017\t35\nchr22\t12323100\t12326700\t0\t137\nchr22\t12331800\t12332400\t0\t194\nchr22\t12334500\t12335700\t0\t194\nchr22\t12336900\t12338100\t0\t194\nchr22\t12340200\t12340500\t0.0689\t122\nchr22\t12345600\t12345900\t0.0604\t121\nchr22\t12348900\t12349200\t0.0769\t75\nchr22\t12352200\t12352500\t0\t228\nchr22\t12353700\t12356400\t0\t228\nchr22\t12360000\t12362400\t0\t311\nchr22\t12364200\t12364500\t0.0255\t194\nchr22\t12368400\t12370200\t0.1268\t171\nchr22\t12373800\t12374100\t0.1021\t206\nchr22\t12490500\t12490800\t0.0548\t238\nchr22\t12493500\t12494400\t0.0548\t238\nchr22\t12495900\t12496200\t0.0548\t238\nchr22\t12499800\t12500100\t0.0893\t196\nchr22\t12501600\t12504300\t0\t296\nchr22\t12507600\t12510600\t0.0032\t199\nchr22\t12515100\t12515400\t0.1182\t71\nchr22\t12524100\t12524700\t0.0626\t112\nchr22\t12526500\t12528000\t0\t215\nchr22\t12529200\t12530700\t0\t215\nchr22\t12532500\t12534300\t0.0044\t105\nchr22\t12539100\t12540300\t0\t107\nchr22\t12542400\t12543300\t0\t96\nchr22\t12546900\t12547200\t0.0332\t62\nchr22\t12550800\t12556500\t0.0057\t231\nchr22\t12558300\t12558600\t0.0057\t231\nchr22\t12562800\t12563100\t0.01\t69\nchr22\t12564900\t12565200\t0.0076\t97\nchr22\t12568200\t12568800\t0.0028\t123\nchr22\t12570000\t12571200\t0.0341\t135\nchr22\t12572400\t12577800\t0.0024\t208\nchr22\t12579000\t12579300\t0.0024\t208\nchr22\t12582600\t12583200\t0.0155\t89\nchr22\t12585900\t12586200\t0.1237\t130\nchr22\t12588300\t12588900\t0.1242\t123\nchr22\t12698700\t12699000\t0\t13\nchr22\t12709200\t12709500\t0.1964\t60\nchr22\t12715200\t12715500\t0.1493\t82\nchr22\t12717900\t12718200\t0.1481\t59\nchr22\t12724500\t12724800\t0.139\t35\nchr22\t12777000\t12777300\t0.0376\t39\nchr22\t12787800\t12788100\t0.05\t84\nchr22\t12791100\t12792600\t0.0767\t110\nchr22\t12796500\t12796800\t0.0528\t90\nchr22\t12804900\t12805200\t0.1598\t67\nchr22\t12807900\t12809700\t0.0379\t98\nchr22\t12814800\t12815100\t0.025\t98\nchr22\t12868200\t12870900\t0\t175\nchr22\t12872400\t12904800\t0\t239\nchr22\t15155100\t15156600\t0\t74\nchr22\t15159000\t15159600\t0\t74\nchr22\t15160800\t15165900\t0\t74\nchr22\t15167400\t15185400\t0\t83\nchr22\t15186600\t15194100\t0\t83\nchr22\t15195900\t15198000\t0\t87\nchr22\t15199200\t15202800\t0\t87\nchr22\t15204000\t15208200\t0\t87\nchr22\t15209400\t15222000\t0\t86\nchr22\t15223200\t15224400\t0\t46\nchr22\t15225600\t15227400\t0\t46\nchr22\t15228600\t15228900\t0\t73\nchr22\t15230100\t15241800\t0\t73\nchr22\t15243900\t15245700\t0\t86\nchr22\t15247200\t15252000\t0\t86\nchr22\t15253800\t15263100\t0\t72\nchr22\t15264900\t15279000\t0\t72\nchr22\t15280200\t15295500\t0\t77\nchr22\t15297000\t15301500\t0\t77\nchr22\t15303300\t15303600\t0.0434\t46\nchr22\t15304800\t15305700\t0\t53\nchr22\t15307500\t15312600\t0\t69\nchr22\t15315000\t15316800\t0.0026\t46\nchr22\t15318300\t15319200\t0.1307\t52\nchr22\t15321300\t15324300\t0\t57\nchr22\t15326100\t15327600\t0.0484\t65\nchr22\t15331200\t15331500\t0.0715\t42\nchr22\t15333300\t15335100\t0\t55\nchr22\t15337200\t15337800\t0\t37\nchr22\t15340800\t15342000\t0.0129\t40\nchr22\t15345300\t15345600\t0.0056\t53\nchr22\t15347400\t15348600\t0.0006\t54\nchr22\t15349800\t15351900\t0.0821\t64\nchr22\t15354900\t15357000\t0\t96\nchr22\t15358500\t15358800\t0.1251\t64\nchr22\t15365100\t15365700\t0.0728\t67\nchr22\t15367800\t15369600\t0\t83\nchr22\t15372300\t15372600\t0.0506\t69\nchr22\t15380100\t15380400\t0.0508\t28\nchr22\t15385800\t15387000\t0.0962\t68\nchr22\t15393300\t15395100\t0\t81\nchr22\t15398100\t15399300\t0.0409\t82\nchr22\t15401400\t15401700\t0.0409\t82\nchr22\t15403800\t15404700\t0.0025\t88\nchr22\t15409800\t15411000\t0.0171\t55\nchr22\t15414600\t15416400\t0\t83\nchr22\t15417600\t15419400\t0.0042\t76\nchr22\t15420900\t15422400\t0\t70\nchr22\t15425400\t15425700\t0.0066\t73\nchr22\t15426900\t15427200\t0.0066\t73\nchr22\t15430200\t15430800\t0.0048\t71\nchr22\t15433200\t15436800\t0\t80\nchr22\t15441000\t15441300\t0.0752\t81\nchr22\t15445500\t15447900\t0.0021\t73\nchr22\t15450300\t15450600\t0.12\t74\nchr22\t15452400\t15455400\t0\t69\nchr22\t15458100\t15459600\t0\t60\nchr22\t15460800\t15464700\t0.0008\t73\nchr22\t15465900\t15466200\t0.0896\t35\nchr22\t15472200\t15473400\t0\t65\nchr22\t15476100\t15480300\t0\t72\nchr22\t15481500\t15483000\t0\t72\nchr22\t15484800\t15486600\t0\t66\nchr22\t15491100\t15494400\t0.0106\t69\nchr22\t15495600\t15503400\t0\t74\nchr22\t15504900\t15506700\t0\t61\nchr22\t15511800\t15512100\t0.0936\t70\nchr22\t15514500\t15514800\t0.2109\t20\nchr22\t15516600\t15517200\t0\t88\nchr22\t15518400\t15518700\t0.0168\t72\nchr22\t15520200\t15520500\t0.0168\t72\nchr22\t15521700\t15528000\t0\t106\nchr22\t15529200\t15531300\t0.0025\t120\nchr22\t15534300\t15534900\t0.0025\t120\nchr22\t15537600\t15542400\t0\t132\nchr22\t15545400\t15548100\t0\t142\nchr22\t15551100\t15551700\t0\t142\nchr22\t15555300\t15557100\t0\t142\nchr22\t15558900\t15567600\t0\t139\nchr22\t15568800\t15570000\t0\t141\nchr22\t15571200\t15571500\t0\t141\nchr22\t15573600\t15576600\t0\t141\nchr22\t15579000\t15579600\t0.0012\t127\nchr22\t15581400\t15582600\t0\t119\nchr22\t15584100\t15596100\t0\t119\nchr22\t15598200\t15598800\t0.004\t107\nchr22\t15600600\t15607500\t0\t126\nchr22\t15608700\t15611400\t0\t126\nchr22\t15616200\t15616500\t0.2451\t58\nchr22\t15619500\t15624000\t0.0125\t98\nchr22\t15625200\t15625500\t0.1583\t49\nchr22\t15627000\t15627300\t0.0305\t62\nchr22\t15638700\t15639600\t0\t109\nchr22\t15641400\t15651900\t0\t139\nchr22\t15653700\t15657900\t0\t139\nchr22\t15659700\t15669300\t0\t139\nchr22\t15670800\t15681000\t0\t136\nchr22\t15682200\t15682800\t0\t136\nchr22\t15684300\t15687000\t0\t136\nchr22\t15691200\t15691500\t0\t42\nchr22\t15693000\t15696300\t0\t124\nchr22\t15698100\t15699300\t0.0885\t120\nchr22\t15700800\t15707400\t0\t137\nchr22\t15709500\t15710100\t0.0455\t95\nchr22\t15711900\t15712800\t0\t122\nchr22\t15714900\t15718500\t0\t146\nchr22\t15719700\t15724500\t0\t146\nchr22\t15726000\t15728700\t0\t146\nchr22\t15729900\t15730200\t0\t146\nchr22\t15732600\t15733200\t0.0295\t126\nchr22\t15735600\t15736800\t0.004\t146\nchr22\t15741300\t15744900\t0\t130\nchr22\t15747300\t15747600\t0.0626\t105\nchr22\t15750600\t15753900\t0.0161\t131\nchr22\t15759300\t15759600\t0.0053\t135\nchr22\t15762600\t15763500\t0.0211\t150\nchr22\t15765000\t15765300\t0.0478\t124\nchr22\t15767700\t15769200\t0\t101\nchr22\t15770400\t15770700\t0.0284\t93\nchr22\t15773700\t15774000\t0.0233\t112\nchr22\t15776400\t15776700\t0.1098\t128\nchr22\t15779400\t15780900\t0.0124\t135\nchr22\t15782400\t15783000\t0.0124\t135\nchr22\t15784500\t15785400\t0\t142\nchr22\t15786600\t15786900\t0.0233\t81\nchr22\t15788700\t15804000\t0\t161\nchr22\t15805800\t15808800\t0\t161\nchr22\t15810000\t15813000\t0\t161\nchr22\t15815400\t15816600\t0\t158\nchr22\t15817800\t15824100\t0\t158\nchr22\t15826500\t15826800\t0.0641\t107\nchr22\t15830700\t15831900\t0.0015\t156\nchr22\t15839700\t15840000\t0.1108\t102\nchr22\t15842400\t15853500\t0\t159\nchr22\t15855300\t15856800\t0.031\t115\nchr22\t15858300\t15860700\t0\t112\nchr22\t15864300\t15874800\t0\t114\nchr22\t15876300\t15879300\t0\t114\nchr22\t15880800\t15903900\t0\t114\nchr22\t15905400\t15905700\t0.1898\t74\nchr22\t15909300\t15910200\t0\t62\nchr22\t15912300\t15913500\t0.015\t70\nchr22\t15915000\t15915300\t0.049\t29\nchr22\t15918300\t15918600\t0.0741\t62\nchr22\t15931200\t15931500\t0.2082\t74\nchr22\t15941700\t15944700\t0.0362\t68\nchr22\t15957000\t15963300\t0\t41\nchr22\t15964500\t15971700\t0\t45\nchr22\t15973500\t15977100\t0\t67\nchr22\t15979200\t15980400\t0\t35\nchr22\t15985200\t15992700\t0\t73\nchr22\t15993900\t15995100\t0\t73\nchr22\t15996300\t15999000\t0\t89\nchr22\t16000500\t16020600\t0\t89\nchr22\t16164900\t16165200\t0.0694\t21\nchr22\t16305600\t16306800\t0.0214\t29\nchr22\t16308000\t16310100\t0\t32\nchr22\t16311600\t16313100\t0\t18\nchr22\t16319100\t16323600\t0\t51\nchr22\t16329000\t16385700\t0\t11424\nchr22\t16480200\t16480500\t0\t75\nchr22\t16481700\t16522500\t0\t75\nchr22\t16701000\t16701300\t0.0393\t70\nchr22\t17146800\t17147100\t0.1944\t50\nchr22\t18009300\t18009900\t0\t32\nchr22\t18161400\t18161700\t0.0168\t64\nchr22\t18165000\t18165600\t0.233\t57\nchr22\t18171000\t18171300\t0.017\t66\nchr22\t18176100\t18178500\t0.0484\t86\nchr22\t18180300\t18184800\t0\t57\nchr22\t18186600\t18188400\t0.074\t91\nchr22\t18191400\t18203700\t0\t987\nchr22\t18205200\t18206100\t0\t1414\nchr22\t18207600\t18223200\t0\t52\nchr22\t18224400\t18225300\t0\t52\nchr22\t18226800\t18229800\t0\t31\nchr22\t18231300\t18231600\t0.0331\t22\nchr22\t18233700\t18234300\t0\t29\nchr22\t18236700\t18238500\t0.0142\t1239\nchr22\t18340200\t18342900\t0\t31\nchr22\t18344700\t18346500\t0\t31\nchr22\t18347700\t18354300\t0\t43\nchr22\t18358200\t18368700\t0\t58\nchr22\t18371700\t18387900\t0\t2035\nchr22\t18390600\t18400200\t0\t63\nchr22\t18401400\t18417300\t0\t63\nchr22\t18418500\t18419700\t0\t1194\nchr22\t18420900\t18433500\t0\t675\nchr22\t18484200\t18485100\t0\t38\nchr22\t18486300\t18487800\t0\t21\nchr22\t18489600\t18491100\t0\t31\nchr22\t18492600\t18498900\t0\t44\nchr22\t18500400\t18502500\t0\t44\nchr22\t18504000\t18505200\t0\t44\nchr22\t18507600\t18508800\t0\t44\nchr22\t18510000\t18510600\t0\t37\nchr22\t18512100\t18518100\t0\t37\nchr22\t18520800\t18528300\t0\t42\nchr22\t18529500\t18529800\t0.0003\t31\nchr22\t18531000\t18535200\t0\t52\nchr22\t18538800\t18542700\t0\t38\nchr22\t18544200\t18544500\t0.1169\t38\nchr22\t18546000\t18550800\t0\t40\nchr22\t18552900\t18568800\t0\t60\nchr22\t18570300\t18571200\t0\t70\nchr22\t18572400\t18588600\t0\t70\nchr22\t18590400\t18597300\t0\t70\nchr22\t18600300\t18606900\t0\t60\nchr22\t18609000\t18614400\t0\t62\nchr22\t18616200\t18616500\t0\t62\nchr22\t18618600\t18618900\t0.1407\t41\nchr22\t18622500\t18627300\t0\t38\nchr22\t18629700\t18631500\t0\t39\nchr22\t18632700\t18633900\t0\t39\nchr22\t18635400\t18636000\t0\t39\nchr22\t18637800\t18638400\t0\t35\nchr22\t18639900\t18640200\t0\t28\nchr22\t18641700\t18648600\t0\t28\nchr22\t18650100\t18652500\t0\t28\nchr22\t18653700\t18654900\t0\t28\nchr22\t18656400\t18657600\t0\t61\nchr22\t18709500\t18720300\t0\t36\nchr22\t18722100\t18724500\t0\t89\nchr22\t18726000\t18727500\t0\t89\nchr22\t18733500\t18738900\t0\t7475\nchr22\t18741600\t18742200\t0\t36\nchr22\t18743400\t18744600\t0\t23\nchr22\t18746100\t18748500\t0\t37\nchr22\t18749700\t18751500\t0\t37\nchr22\t18752700\t18761700\t0\t51\nchr22\t18762900\t18765300\t0\t51\nchr22\t18767100\t18781500\t0\t43\nchr22\t18784800\t18785700\t0\t40\nchr22\t18786900\t18787200\t0.1241\t19\nchr22\t18788400\t18799200\t0\t47\nchr22\t18800400\t18813600\t0\t43\nchr22\t18815100\t18816900\t0\t34\nchr22\t18819900\t18837900\t0\t48\nchr22\t18839100\t18840300\t0\t32\nchr22\t18841500\t18842100\t0\t32\nchr22\t18843300\t18849900\t0\t71\nchr22\t18851100\t18853200\t0\t71\nchr22\t18854400\t18854700\t0\t63\nchr22\t18855900\t18857400\t0\t63\nchr22\t18858900\t18863100\t0\t63\nchr22\t18864600\t18869700\t0\t63\nchr22\t18871200\t18871500\t0.003\t58\nchr22\t18872700\t18877500\t0.003\t58\nchr22\t18878700\t18879000\t0.1335\t63\nchr22\t18881700\t18908100\t0\t4960\nchr22\t18909900\t18913200\t0\t41\nchr22\t18914400\t18916500\t0\t41\nchr22\t18918300\t18941700\t0\t73\nchr22\t18942900\t18945000\t0\t123\nchr22\t18946500\t18946800\t0.0143\t81\nchr22\t19025700\t19026600\t0.0494\t45\nchr22\t20162700\t20163000\t0.2691\t91\nchr22\t20326500\t20326800\t0.0425\t47\nchr22\t20331900\t20332200\t0.0864\t52\nchr22\t20334000\t20334300\t0.0244\t39\nchr22\t20338800\t20347200\t0\t1137\nchr22\t20350200\t20350500\t0.0541\t67\nchr22\t20366100\t20366700\t0.0382\t77\nchr22\t20372100\t20372400\t0.0924\t73\nchr22\t20375700\t20376000\t0.0192\t64\nchr22\t20679600\t20679900\t0.226\t34\nchr22\t20689500\t20689800\t0.1145\t67\nchr22\t20696700\t20697000\t0.0021\t42\nchr22\t21112200\t21122400\t0\t66\nchr22\t21124200\t21128100\t0\t70\nchr22\t21129900\t21134700\t0\t76\nchr22\t21136200\t21138300\t0\t116\nchr22\t21139500\t21148800\t0\t69\nchr22\t21153900\t21155700\t0\t62\nchr22\t21156900\t21157500\t0\t62\nchr22\t21160200\t21160500\t0\t62\nchr22\t21161700\t21163200\t0\t45\nchr22\t21165900\t21171000\t0\t452\nchr22\t21172500\t21176100\t0\t452\nchr22\t21177900\t21195000\t0\t98\nchr22\t21197400\t21197700\t0\t27\nchr22\t21198900\t21200400\t0\t27\nchr22\t21202200\t21209700\t0\t37\nchr22\t21211500\t21216000\t0\t37\nchr22\t21219000\t21220200\t0\t30\nchr22\t21222000\t21224700\t0\t43\nchr22\t21225900\t21226800\t0\t31\nchr22\t21228300\t21229200\t0\t34\nchr22\t21230400\t21233400\t0\t48\nchr22\t21235200\t21248100\t0\t38\nchr22\t21249300\t21260100\t0\t74\nchr22\t21261300\t21275100\t0\t74\nchr22\t21276600\t21280500\t0\t74\nchr22\t21285000\t21286800\t0\t97\nchr22\t21288000\t21294600\t0\t97\nchr22\t21296400\t21301200\t0\t379\nchr22\t21302400\t21326400\t0\t379\nchr22\t21330000\t21332700\t0\t58\nchr22\t21333900\t21336900\t0\t58\nchr22\t21338100\t21345600\t0\t60\nchr22\t21347100\t21349500\t0\t27\nchr22\t21351600\t21355200\t0\t34\nchr22\t21356400\t21357000\t0\t41\nchr22\t21360000\t21360300\t0.1039\t40\nchr22\t21364200\t21365400\t0\t45\nchr22\t21368700\t21372600\t0\t42\nchr22\t21373800\t21376200\t0\t28\nchr22\t21379500\t21380400\t0\t44\nchr22\t21382200\t21402000\t0\t68\nchr22\t21404400\t21405300\t0.0394\t69\nchr22\t21407700\t21408000\t0.0292\t47\nchr22\t21409200\t21417000\t0\t67\nchr22\t21418200\t21422700\t0\t65\nchr22\t21423900\t21425100\t0\t75\nchr22\t21426600\t21442800\t0\t72\nchr22\t21460800\t21464700\t0\t37\nchr22\t21466200\t21467400\t0\t40\nchr22\t21468900\t21474300\t0\t40\nchr22\t21478500\t21479400\t0\t34\nchr22\t21483600\t21483900\t0.001\t40\nchr22\t21486600\t21487200\t0\t35\nchr22\t21488700\t21489300\t0.0387\t41\nchr22\t21492000\t21511200\t0\t81\nchr22\t21512700\t21542100\t0\t68\nchr22\t21543600\t21554100\t0\t70\nchr22\t21955500\t21956100\t0\t60\nchr22\t22221000\t22221900\t0.0379\t67\nchr22\t22223700\t22224000\t0.0231\t20\nchr22\t22637100\t22637400\t0.1377\t20\nchr22\t22644300\t22644900\t0.1079\t67\nchr22\t22900200\t22900500\t0.0405\t72\nchr22\t22905600\t22905900\t0.0704\t66\nchr22\t23540400\t23540700\t0.2428\t60\nchr22\t23601900\t23602200\t0.1783\t63\nchr22\t23853900\t23854500\t0\t68\nchr22\t23855700\t23856300\t0.0394\t116\nchr22\t23940000\t23940300\t0.0893\t47\nchr22\t23948700\t23949300\t0\t25\nchr22\t23957100\t23958900\t0.0114\t35\nchr22\t23961000\t23969100\t0\t49\nchr22\t23972700\t23980500\t0\t51\nchr22\t23982300\t23984400\t0\t31\nchr22\t23990400\t23990700\t0.0392\t11\nchr22\t23999400\t23999700\t0.0877\t42\nchr22\t24000900\t24001200\t0.0329\t49\nchr22\t24193500\t24193800\t0.0563\t88\nchr22\t24251700\t24252000\t0.0376\t54\nchr22\t24293700\t24294300\t0.0581\t82\nchr22\t24671400\t24672000\t0.0085\t71\nchr22\t28194900\t28195800\t0\t68\nchr22\t28212600\t28213500\t0\t61\nchr22\t28663800\t28668900\t0\t112\nchr22\t31026900\t31027200\t0.0972\t49\nchr22\t31592100\t31592400\t0.1627\t44\nchr22\t32295900\t32296800\t0.0306\t67\nchr22\t32931900\t32932200\t0.1505\t95\nchr22\t34550400\t34553100\t0\t65\nchr22\t34677900\t34678500\t0.02\t53\nchr22\t34682100\t34682400\t0.1587\t51\nchr22\t36138000\t36138900\t0\t69\nchr22\t36187200\t36188100\t0\t77\nchr22\t38229900\t38230200\t0.2375\t53\nchr22\t38806500\t38806800\t0.135\t60\nchr22\t40501200\t40501500\t0.1344\t25\nchr22\t40536600\t40538100\t0.0283\t82\nchr22\t40744200\t40746300\t0\t61\nchr22\t42123300\t42125700\t0\t73\nchr22\t42129900\t42130200\t0.1422\t57\nchr22\t42135600\t42138000\t0\t79\nchr22\t42143700\t42144000\t0.0188\t67\nchr22\t42501600\t42502500\t0\t71\nchr22\t42503700\t42505800\t0\t73\nchr22\t42513300\t42513600\t0.0705\t59\nchr22\t42555000\t42555900\t0\t68\nchr22\t42557100\t42559200\t0\t68\nchr22\t42575100\t42575400\t0.1676\t69\nchr22\t42980700\t42981000\t0.1118\t80\nchr22\t42982200\t42982500\t0.1198\t80\nchr22\t44800800\t44801100\t0.0118\t26\nchr22\t46631700\t46632000\t0.2235\t73\nchr22\t46772100\t46772400\t0.0849\t28\nchr22\t46859400\t46859700\t0.0712\t57\nchr22\t47732400\t47732700\t0.2424\t94\nchr22\t48290400\t48290700\t0.0146\t31\nchr22\t48985800\t48991200\t0\t78\nchr22\t49265400\t49266300\t0.1012\t73\nchr22\t49384800\t49385100\t0.0086\t33\nchr22\t50028900\t50029200\t0.2043\t119\nchr22\t50765400\t50766900\t0.0085\t70\nchr22\t50787300\t50787600\t0.0996\t55\nchr22\t50788800\t50789100\t0.0304\t76\nchr22\t50792400\t50792700\t0.0324\t81\nchr22\t50797800\t50798100\t0.1065\t55\nchr22\t50800500\t50806800\t0\t304\nchr22\t50808000\t50808600\t0\t304\nchr3\t10800\t11100\t0.1615\t29\nchr3\t18600\t18900\t0.0784\t25\nchr3\t135000\t135300\t0.0731\t14\nchr3\t261900\t262500\t0.1039\t172\nchr3\t483000\t483300\t0.1157\t20\nchr3\t812400\t813600\t0.0307\t84\nchr3\t876300\t876600\t0.0763\t119\nchr3\t1391100\t1391400\t0.2436\t69\nchr3\t1392900\t1393200\t0.0479\t96\nchr3\t1565700\t1566000\t0.0939\t56\nchr3\t1658100\t1658700\t0.011\t169\nchr3\t1707300\t1707600\t0.1284\t22\nchr3\t2007000\t2008500\t0\t118\nchr3\t2454300\t2454600\t0.0133\t32\nchr3\t3131700\t3132600\t0.0091\t100\nchr3\t3721500\t3721800\t0.1947\t32\nchr3\t3963900\t3969000\t0\t86\nchr3\t4025400\t4027800\t0\t99\nchr3\t4256100\t4257300\t0.0669\t72\nchr3\t4266600\t4266900\t0.1616\t112\nchr3\t4917900\t4922400\t0\t137\nchr3\t6486900\t6487200\t0.111\t78\nchr3\t6699900\t6700200\t0.1861\t61\nchr3\t8335800\t8336400\t0.0154\t71\nchr3\t8614200\t8615100\t0\t109\nchr3\t8616900\t8617200\t0.0136\t89\nchr3\t8655000\t8655300\t0.0952\t28\nchr3\t10052700\t10053000\t0.131\t107\nchr3\t10297800\t10298100\t0.0706\t79\nchr3\t11487900\t11488200\t0.0274\t23\nchr3\t12028800\t12029100\t0.0227\t107\nchr3\t12030900\t12033000\t0.0227\t107\nchr3\t15188700\t15189000\t0.0389\t116\nchr3\t15190500\t15190800\t0.0553\t102\nchr3\t17097000\t17097300\t0.1059\t103\nchr3\t17858700\t17859300\t0.1242\t84\nchr3\t18326100\t18326400\t0.1455\t103\nchr3\t18328800\t18329100\t0.0664\t90\nchr3\t18518400\t18518700\t0.0792\t83\nchr3\t18933300\t18934500\t0\t77\nchr3\t18961200\t18961500\t0.0647\t97\nchr3\t19009800\t19010400\t0.0079\t71\nchr3\t19100700\t19101000\t0.102\t72\nchr3\t20353800\t20354400\t0.105\t78\nchr3\t21250500\t21251100\t0.0249\t100\nchr3\t21490800\t21491100\t0.0748\t59\nchr3\t21984300\t21988500\t0\t84\nchr3\t22050900\t22056300\t0\t95\nchr3\t22803600\t22804500\t0.0111\t84\nchr3\t22806600\t22806900\t0.0895\t144\nchr3\t24091200\t24092100\t0\t88\nchr3\t24093900\t24094200\t0\t88\nchr3\t26385000\t26389500\t0\t105\nchr3\t26398200\t26403600\t0\t89\nchr3\t27093000\t27093600\t0\t82\nchr3\t27817500\t27817800\t0.0684\t90\nchr3\t28354500\t28354800\t0.198\t57\nchr3\t28366200\t28366500\t0.0367\t68\nchr3\t28414800\t28419900\t0\t74\nchr3\t28493700\t28494300\t0\t83\nchr3\t28851600\t28851900\t0.2945\t147\nchr3\t29109300\t29111100\t0.0005\t83\nchr3\t30412800\t30413400\t0.035\t91\nchr3\t32279400\t32279700\t0.0847\t102\nchr3\t33511800\t33512400\t0\t93\nchr3\t34413600\t34418400\t0\t100\nchr3\t34653000\t34656300\t0\t91\nchr3\t38341800\t38343000\t0\t29\nchr3\t38406900\t38407200\t0.201\t95\nchr3\t39985200\t39985500\t0.1\t82\nchr3\t40040400\t40040700\t0.1816\t80\nchr3\t40041900\t40042200\t0.2022\t48\nchr3\t40203900\t40204200\t0.006\t351\nchr3\t40239600\t40240200\t0.1\t84\nchr3\t40903500\t40903800\t0.1698\t78\nchr3\t41776800\t41779800\t0.0026\t134\nchr3\t42797100\t42799200\t0\t60\nchr3\t43065900\t43069200\t0.0059\t109\nchr3\t43569300\t43569900\t0.1767\t83\nchr3\t44750700\t44751000\t0.0447\t55\nchr3\t45726900\t45727200\t0.0744\t30\nchr3\t46151700\t46152000\t0.0887\t99\nchr3\t46773000\t46773300\t0.0041\t93\nchr3\t46783200\t46788300\t0\t101\nchr3\t46801200\t46801800\t0.0069\t63\nchr3\t47259900\t47260200\t0.2729\t73\nchr3\t48055500\t48055800\t0.1119\t86\nchr3\t48057300\t48057600\t0.0415\t68\nchr3\t48210900\t48213000\t0.0045\t82\nchr3\t49456800\t49457100\t0.2502\t37\nchr3\t50887500\t50887800\t0.1505\t63\nchr3\t50897700\t50898000\t0.1061\t53\nchr3\t50973600\t50973900\t0.0895\t73\nchr3\t51863400\t51864000\t0.0144\t67\nchr3\t52675800\t52676100\t0.1508\t32\nchr3\t53365500\t53370600\t0\t99\nchr3\t53923800\t53925600\t0.1434\t94\nchr3\t54394800\t54399900\t0\t96\nchr3\t55046400\t55049700\t0\t58\nchr3\t55137900\t55138500\t0.0188\t57\nchr3\t55140000\t55142100\t0\t47\nchr3\t56514000\t56515500\t0.0439\t79\nchr3\t56543400\t56543700\t0.043\t48\nchr3\t57028200\t57028500\t0.1478\t76\nchr3\t58549200\t58549500\t0.1293\t82\nchr3\t58818600\t58818900\t0.1562\t104\nchr3\t58843800\t58844400\t0.0733\t92\nchr3\t58847100\t58848000\t0.0513\t125\nchr3\t58889700\t58890000\t0.0485\t55\nchr3\t61399500\t61399800\t0.0028\t58\nchr3\t61672200\t61672500\t0.2102\t76\nchr3\t62599500\t62599800\t0.0131\t24\nchr3\t62847600\t62848800\t0.0021\t141\nchr3\t62850300\t62850600\t0.0021\t141\nchr3\t63136800\t63137700\t0.0207\t76\nchr3\t63138900\t63141900\t0\t141\nchr3\t63153300\t63155700\t0\t97\nchr3\t63212700\t63217200\t0\t112\nchr3\t63589800\t63590700\t0.0087\t237\nchr3\t63737400\t63737700\t0.0895\t83\nchr3\t65511900\t65514000\t0.0188\t113\nchr3\t65697900\t65699400\t0.0623\t92\nchr3\t66063600\t66063900\t0.0622\t32\nchr3\t66874500\t66874800\t0.0157\t23\nchr3\t67445100\t67445700\t0.0714\t53\nchr3\t67814400\t67815600\t0.08\t119\nchr3\t68077200\t68077500\t0.1096\t82\nchr3\t69437700\t69438000\t0.0638\t43\nchr3\t70287000\t70287300\t0.1145\t71\nchr3\t71435400\t71436000\t0.1199\t186\nchr3\t74454000\t74454300\t0.1467\t83\nchr3\t74703000\t74703300\t0.0619\t128\nchr3\t75120300\t75120600\t0.085\t147\nchr3\t76730700\t76731000\t0.1813\t17\nchr3\t77763900\t77769000\t0\t100\nchr3\t78582600\t78583800\t0.0264\t28\nchr3\t78795900\t78796500\t0.0674\t62\nchr3\t79129800\t79134900\t0\t92\nchr3\t80442300\t80442600\t0.0523\t70\nchr3\t80876400\t80877300\t0\t82\nchr3\t80892900\t80893500\t0.0768\t75\nchr3\t81051600\t81057000\t0\t110\nchr3\t82153200\t82153800\t0.0256\t51\nchr3\t82338600\t82338900\t0.1141\t74\nchr3\t82465200\t82465500\t0.1938\t13\nchr3\t83038500\t83039400\t0\t100\nchr3\t83804100\t83806200\t0\t75\nchr3\t86018100\t86019300\t0.044\t70\nchr3\t86860200\t86860500\t0.1175\t60\nchr3\t87844500\t87844800\t0.0908\t89\nchr3\t88872600\t88872900\t0.1663\t92\nchr3\t89349000\t89349300\t0.0094\t66\nchr3\t89461200\t89466300\t0\t126\nchr3\t89869500\t89871000\t0.0108\t91\nchr3\t89872500\t89873400\t0.0022\t76\nchr3\t89961900\t89962200\t0.0181\t109\nchr3\t90169800\t90171600\t0.0053\t91\nchr3\t90173400\t90174900\t0.0053\t91\nchr3\t90336000\t90338400\t0\t94\nchr3\t90406200\t90406500\t0.0956\t105\nchr3\t90514800\t90515400\t0\t62\nchr3\t90525600\t90526200\t0.0064\t47\nchr3\t90559200\t90559500\t0.1323\t55\nchr3\t90564000\t90565200\t0\t45\nchr3\t90568800\t90569400\t0\t40\nchr3\t90582900\t90583200\t0.1733\t191\nchr3\t90670200\t90672600\t0.1254\t118\nchr3\t90676500\t90678600\t0.1189\t58\nchr3\t90681000\t90682500\t0.095\t23\nchr3\t90684600\t90684900\t0.2991\t86\nchr3\t90686700\t90687000\t0.2701\t31\nchr3\t90688800\t90689100\t0.2906\t13\nchr3\t90692100\t90692400\t0.2192\t44\nchr3\t90696900\t90698100\t0.2389\t47\nchr3\t90700200\t90701700\t0.2371\t28\nchr3\t90702900\t90703500\t0.1068\t21\nchr3\t90705600\t90706200\t0.1426\t10\nchr3\t90708600\t90709800\t0.1788\t22\nchr3\t90711000\t90711300\t0.2419\t31\nchr3\t90713700\t90720000\t0\t61\nchr3\t90772500\t90777000\t0\t256\nchr3\t90780000\t90782100\t0.0013\t312\nchr3\t90783300\t90783600\t0.0501\t77\nchr3\t90786300\t90789600\t0\t94\nchr3\t90791700\t90798000\t0\t194\nchr3\t90799200\t90801600\t0\t194\nchr3\t90803100\t90803400\t0.0054\t445\nchr3\t90805500\t90807600\t0.0054\t445\nchr3\t90809700\t90810300\t0\t460\nchr3\t90812700\t90817500\t0\t460\nchr3\t90819000\t90821700\t0.0022\t324\nchr3\t90822900\t90826200\t0.0022\t324\nchr3\t90827700\t90829200\t0\t81\nchr3\t90831000\t90832200\t0\t43\nchr3\t90833700\t90841800\t0.008\t317\nchr3\t90845100\t90845400\t0.1674\t41\nchr3\t90849300\t90852300\t0.0301\t193\nchr3\t90854700\t90860400\t0\t153\nchr3\t90861600\t90861900\t0.265\t21\nchr3\t90863700\t90870300\t0\t994\nchr3\t90872100\t90875700\t0\t232\nchr3\t90876900\t90878100\t0\t151\nchr3\t90879600\t90881700\t0.0781\t425\nchr3\t90883200\t90885000\t0\t107\nchr3\t90890700\t90891900\t0.1254\t229\nchr3\t90894000\t90895800\t0\t205\nchr3\t90897000\t90898800\t0\t205\nchr3\t90900300\t90902700\t0.0573\t197\nchr3\t90904500\t90907200\t0\t227\nchr3\t90908400\t90912900\t0\t287\nchr3\t90914100\t90917400\t0\t287\nchr3\t90918900\t90924000\t0\t197\nchr3\t90925500\t90929700\t0\t108\nchr3\t90931200\t90932700\t0\t108\nchr3\t90933900\t90941100\t0\t280\nchr3\t90942300\t90944700\t0\t188\nchr3\t90945900\t90948300\t0\t188\nchr3\t90949800\t90950700\t0.0087\t191\nchr3\t90951900\t90961800\t0\t395\nchr3\t90963300\t90963600\t0\t395\nchr3\t90964800\t90965700\t0.0334\t106\nchr3\t90966900\t90967200\t0.0334\t106\nchr3\t90968400\t90975300\t0\t494\nchr3\t90976500\t90991200\t0\t637\nchr3\t90992400\t90999600\t0\t436\nchr3\t91000800\t91002900\t0\t436\nchr3\t91004100\t91012200\t0\t436\nchr3\t91014000\t91014300\t0\t49\nchr3\t91015500\t91016700\t0\t49\nchr3\t91017900\t91019400\t0.012\t232\nchr3\t91021200\t91024800\t0\t331\nchr3\t91026300\t91026900\t0.1286\t96\nchr3\t91029300\t91031700\t0\t287\nchr3\t91033200\t91039200\t0\t287\nchr3\t91041000\t91045200\t0\t287\nchr3\t91046700\t91050900\t0\t358\nchr3\t91052400\t91054200\t0\t273\nchr3\t91056300\t91056600\t0\t273\nchr3\t91058700\t91059000\t0\t273\nchr3\t91060800\t91061100\t0.108\t79\nchr3\t91063200\t91063500\t0.0416\t95\nchr3\t91064700\t91067100\t0.0215\t57\nchr3\t91070700\t91072200\t0\t146\nchr3\t91073700\t91074600\t0.0384\t383\nchr3\t91076700\t91077000\t0\t415\nchr3\t91078200\t91085700\t0\t415\nchr3\t91086900\t91089000\t0\t415\nchr3\t91090200\t91099500\t0\t183\nchr3\t91101600\t91103100\t0.0102\t70\nchr3\t91104900\t91105800\t0.0102\t70\nchr3\t91107000\t91108800\t0\t78\nchr3\t91110300\t91110600\t0\t78\nchr3\t91112400\t91112700\t0.1242\t26\nchr3\t91114200\t91115100\t0.0243\t101\nchr3\t91118100\t91119300\t0\t86\nchr3\t91121700\t91122300\t0.055\t19\nchr3\t91123500\t91125600\t0\t526\nchr3\t91127400\t91128000\t0\t526\nchr3\t91131300\t91134600\t0\t106\nchr3\t91138800\t91149600\t0\t182\nchr3\t91152300\t91152600\t0\t182\nchr3\t91154400\t91155300\t0.0195\t356\nchr3\t91156500\t91156800\t0\t156\nchr3\t91158900\t91164900\t0\t139\nchr3\t91167900\t91170000\t0\t87\nchr3\t91171200\t91171500\t0\t87\nchr3\t91174200\t91180500\t0\t136\nchr3\t91182000\t91182300\t0.1899\t266\nchr3\t91185000\t91191000\t0\t836\nchr3\t91194000\t91194300\t0\t81\nchr3\t91195500\t91197600\t0\t81\nchr3\t91198800\t91201200\t0\t202\nchr3\t91202400\t91206000\t0\t135\nchr3\t91207500\t91208700\t0\t135\nchr3\t91210200\t91210500\t0\t135\nchr3\t91213500\t91218900\t0\t162\nchr3\t91221600\t91221900\t0.2328\t30\nchr3\t91224300\t91225500\t0.023\t36\nchr3\t91229100\t91232100\t0\t115\nchr3\t91233600\t91233900\t0.0082\t46\nchr3\t91235700\t91236600\t0\t81\nchr3\t91238100\t91239600\t0\t102\nchr3\t91241700\t91242900\t0.0122\t374\nchr3\t91245000\t91245600\t0.0248\t343\nchr3\t91246800\t91247400\t0.0248\t343\nchr3\t91249200\t91249500\t0.0016\t56\nchr3\t91260600\t91261200\t0\t14\nchr3\t91263900\t91264200\t0.2464\t48\nchr3\t91277700\t91279200\t0\t210\nchr3\t91280400\t91285800\t0\t210\nchr3\t91385100\t91385700\t0.0246\t46\nchr3\t91392900\t91393200\t0.1413\t61\nchr3\t91544100\t91551000\t0\t2208\nchr3\t91552800\t91713900\t0\t2208\nchr3\t91715100\t91734600\t0\t2208\nchr3\t91735800\t92704800\t0\t2208\nchr3\t92706000\t92931300\t0\t2208\nchr3\t92932500\t93026400\t0\t2208\nchr3\t93027900\t93122700\t0\t595\nchr3\t93124200\t93504000\t0\t1558\nchr3\t93505500\t93655500\t0\t1558\nchr3\t93705600\t93713400\t0\t163\nchr3\t93717000\t93717300\t0.2699\t17\nchr3\t93789600\t93791100\t0.0115\t83\nchr3\t94750800\t94751100\t0.1558\t74\nchr3\t95805000\t95805300\t0.2133\t63\nchr3\t98466300\t98467800\t0.0842\t74\nchr3\t98837400\t98837700\t0.1642\t30\nchr3\t99318600\t99318900\t0.0277\t36\nchr3\t100473300\t100474200\t0.1035\t81\nchr3\t101439600\t101440500\t0.024\t59\nchr3\t101694300\t101694600\t0.1036\t61\nchr3\t101797800\t101798100\t0.0682\t76\nchr3\t103220700\t103226100\t0\t64\nchr3\t103233000\t103233600\t0.0364\t89\nchr3\t103235700\t103236300\t0\t102\nchr3\t103556700\t103562400\t0\t118\nchr3\t105297900\t105298500\t0.0742\t31\nchr3\t105587400\t105591900\t0\t101\nchr3\t106110600\t106110900\t0.032\t75\nchr3\t106665900\t106666500\t0.0646\t106\nchr3\t106667700\t106668000\t0.1266\t38\nchr3\t106950600\t106950900\t0.0951\t41\nchr3\t106976100\t106980600\t0.0067\t91\nchr3\t107694000\t107695500\t0.0821\t85\nchr3\t107886900\t107888700\t0.0324\t133\nchr3\t108374700\t108375000\t0.1273\t85\nchr3\t108749700\t108755400\t0\t112\nchr3\t109200000\t109205700\t0\t122\nchr3\t110117700\t110120400\t0\t106\nchr3\t110442900\t110443500\t0.0056\t73\nchr3\t110445600\t110445900\t0.0508\t76\nchr3\t110635200\t110635500\t0.0342\t67\nchr3\t111020700\t111021000\t0.0127\t71\nchr3\t111022200\t111022500\t0.0127\t71\nchr3\t111023700\t111024000\t0.1005\t80\nchr3\t111491700\t111492000\t0.0979\t81\nchr3\t111557100\t111557400\t0\t84\nchr3\t111559200\t111561000\t0\t84\nchr3\t112162800\t112163100\t0.181\t98\nchr3\t112183800\t112184400\t0\t77\nchr3\t113024400\t113025000\t0.0013\t74\nchr3\t113027100\t113029200\t0.0055\t75\nchr3\t113030400\t113033400\t0\t90\nchr3\t114282000\t114282300\t0.1078\t73\nchr3\t114747600\t114747900\t0.2771\t16\nchr3\t116205300\t116205900\t0.0591\t94\nchr3\t116360400\t116365800\t0\t95\nchr3\t116645400\t116645700\t0.0096\t53\nchr3\t118915500\t118915800\t0.0214\t75\nchr3\t118918200\t118920000\t0.0503\t384\nchr3\t119002800\t119003100\t0.0697\t56\nchr3\t119109000\t119109300\t0.0837\t115\nchr3\t120374400\t120375900\t0\t83\nchr3\t120377400\t120377700\t0\t83\nchr3\t120575400\t120580500\t0\t91\nchr3\t121032600\t121033200\t0.0589\t118\nchr3\t121088400\t121089000\t0.0712\t87\nchr3\t121937100\t121937400\t0.0666\t77\nchr3\t122042100\t122042400\t0.0079\t103\nchr3\t122043600\t122044200\t0.0079\t103\nchr3\t122164200\t122164500\t0.2129\t55\nchr3\t122670300\t122670600\t0.1885\t65\nchr3\t123478800\t123479100\t0.2542\t34\nchr3\t123992100\t123992400\t0.1243\t57\nchr3\t124110000\t124110300\t0.2977\t28\nchr3\t124367700\t124368000\t0.0226\t21\nchr3\t124789500\t124790400\t0\t55\nchr3\t125171400\t125172000\t0.0808\t47\nchr3\t125941800\t125942400\t0.0197\t114\nchr3\t125969100\t125969400\t0.0304\t59\nchr3\t126325200\t126326400\t0.0034\t76\nchr3\t126332700\t126333000\t0.1133\t65\nchr3\t126334500\t126337200\t0.0103\t124\nchr3\t127434600\t127434900\t0.0205\t102\nchr3\t128954100\t128955900\t0.0065\t70\nchr3\t129088500\t129089400\t0\t80\nchr3\t130629000\t130634100\t0\t95\nchr3\t130911900\t130912200\t0.0661\t58\nchr3\t131408400\t131410500\t0\t97\nchr3\t132375300\t132375600\t0.1201\t85\nchr3\t132470100\t132470400\t0.0191\t53\nchr3\t132807300\t132809700\t0\t79\nchr3\t132946200\t132951900\t0\t83\nchr3\t133785600\t133785900\t0.0023\t30\nchr3\t134955300\t134955600\t0\t27\nchr3\t135254100\t135254400\t0.0387\t90\nchr3\t135588600\t135590100\t0.026\t102\nchr3\t135660300\t135662400\t0.0002\t84\nchr3\t135663600\t135663900\t0.0002\t84\nchr3\t136479900\t136484100\t0\t82\nchr3\t136963800\t136969200\t0\t97\nchr3\t137094000\t137095800\t0\t84\nchr3\t137353800\t137354400\t0.0016\t83\nchr3\t137457300\t137458500\t0.007\t71\nchr3\t137634000\t137634300\t0\t80\nchr3\t137635500\t137638500\t0\t80\nchr3\t139143900\t139144200\t0.0368\t98\nchr3\t139335900\t139336200\t0.0362\t61\nchr3\t141757500\t141761400\t0\t97\nchr3\t142011000\t142011300\t0.0596\t105\nchr3\t145929000\t145929600\t0.0174\t71\nchr3\t145930800\t145931400\t0.0859\t128\nchr3\t146097300\t146097600\t0.2049\t51\nchr3\t146732700\t146735100\t0.0033\t214\nchr3\t148430100\t148430700\t0.1373\t76\nchr3\t148563900\t148564200\t0.0246\t48\nchr3\t148565700\t148567500\t0.0254\t55\nchr3\t149830200\t149830500\t0.0023\t56\nchr3\t149838900\t149839500\t0.0336\t73\nchr3\t150616200\t150616500\t0.0796\t81\nchr3\t150819600\t150820200\t0.0012\t73\nchr3\t150821400\t150821700\t0.0916\t63\nchr3\t152594100\t152595300\t0.0473\t74\nchr3\t154911300\t154914600\t0\t91\nchr3\t155119800\t155123400\t0.0161\t91\nchr3\t155210100\t155210400\t0.1638\t80\nchr3\t155472900\t155473200\t0.1765\t81\nchr3\t155506800\t155510700\t0\t78\nchr3\t157901700\t157902000\t0.1973\t67\nchr3\t158021100\t158024400\t0\t112\nchr3\t158637900\t158639700\t0.0073\t82\nchr3\t159095400\t159101100\t0\t110\nchr3\t161004300\t161004600\t0.1135\t70\nchr3\t161907600\t161907900\t0.0401\t62\nchr3\t162318900\t162319200\t0.1153\t31\nchr3\t162407100\t162408000\t0.0007\t56\nchr3\t163237800\t163242600\t0\t80\nchr3\t163634700\t163635600\t0.0391\t83\nchr3\t164294400\t164296200\t0.0207\t108\nchr3\t164704500\t164704800\t0.0145\t119\nchr3\t165573600\t165573900\t0.0905\t48\nchr3\t165589200\t165589500\t0.1674\t62\nchr3\t166229400\t166230000\t0.0928\t79\nchr3\t166231800\t166232100\t0.0494\t40\nchr3\t168351600\t168354900\t0\t86\nchr3\t169680600\t169685400\t0.0176\t78\nchr3\t170401800\t170402100\t0.082\t26\nchr3\t170806200\t170806500\t0.0894\t546\nchr3\t170879100\t170879400\t0.0537\t99\nchr3\t170880900\t170881200\t0.0537\t99\nchr3\t174262200\t174263100\t0.0559\t78\nchr3\t175321500\t175321800\t0.2736\t74\nchr3\t175436700\t175437600\t0.0397\t89\nchr3\t175782300\t175782600\t0.2201\t62\nchr3\t176831400\t176831700\t0.1108\t98\nchr3\t177389400\t177392700\t0\t96\nchr3\t178782000\t178782300\t0.064\t73\nchr3\t178862400\t178863000\t0.1265\t90\nchr3\t179121300\t179121600\t0.2563\t74\nchr3\t181134600\t181134900\t0.2216\t53\nchr3\t182429100\t182429400\t0.086\t60\nchr3\t183174600\t183174900\t0.1633\t83\nchr3\t183234900\t183237900\t0\t89\nchr3\t183609300\t183609600\t0.0879\t58\nchr3\t183739500\t183740100\t0\t82\nchr3\t184753500\t184753800\t0.1754\t15\nchr3\t185230800\t185231400\t0\t42\nchr3\t185562900\t185563200\t0.1275\t69\nchr3\t185565300\t185565600\t0.0663\t83\nchr3\t185567100\t185567400\t0.0663\t83\nchr3\t185569500\t185569800\t0.0152\t77\nchr3\t186864000\t186867300\t0\t41\nchr3\t187108800\t187109100\t0.1874\t47\nchr3\t187413600\t187417800\t0\t111\nchr3\t187424700\t187428600\t0\t64\nchr3\t187866300\t187866600\t0.0104\t106\nchr3\t187892700\t187893300\t0.0159\t117\nchr3\t187894500\t187894800\t0.0159\t117\nchr3\t188544600\t188544900\t0.0565\t30\nchr3\t189020700\t189021000\t0.1641\t40\nchr3\t191043300\t191044500\t0.0141\t103\nchr3\t192138300\t192138600\t0.043\t27\nchr3\t192149400\t192150300\t0.1233\t40\nchr3\t192151500\t192153900\t0.0016\t71\nchr3\t192739500\t192741300\t0.031\t77\nchr3\t192743400\t192743700\t0.2295\t74\nchr3\t192963000\t192963600\t0.0112\t103\nchr3\t193888800\t193889400\t0.1459\t86\nchr3\t194400600\t194401200\t0.0394\t65\nchr3\t194663400\t194663700\t0.2229\t34\nchr3\t195091500\t195091800\t0.0518\t74\nchr3\t195093000\t195093300\t0.1113\t84\nchr3\t195215400\t195215700\t0.0515\t108\nchr3\t195217200\t195217500\t0.0515\t108\nchr3\t195480300\t195480600\t0.0519\t106\nchr3\t195483300\t195485100\t0.0398\t201\nchr3\t195486900\t195488400\t0.0398\t201\nchr3\t195489900\t195490200\t0.1126\t86\nchr3\t195491400\t195491700\t0.0981\t90\nchr3\t195497700\t195498300\t0.0576\t162\nchr3\t195501000\t195503700\t0.0202\t163\nchr3\t195624000\t195624900\t0\t139\nchr3\t195626700\t195627000\t0.0673\t134\nchr3\t195631500\t195631800\t0.0409\t100\nchr3\t195635100\t195635400\t0.0276\t93\nchr3\t195639000\t195639300\t0.0507\t111\nchr3\t195644400\t195644700\t0.0046\t243\nchr3\t195651600\t195651900\t0.1548\t111\nchr3\t195681000\t195681900\t0\t139\nchr3\t195723600\t195725700\t0.0018\t111\nchr3\t195777000\t195777300\t0.1591\t76\nchr3\t195787200\t195788100\t0.148\t42\nchr3\t195816000\t195816300\t0.1495\t35\nchr3\t195824400\t195824700\t0.0633\t60\nchr3\t195927900\t195928200\t0.003\t78\nchr3\t195936900\t195937200\t0.041\t96\nchr3\t195953100\t195954000\t0.0002\t141\nchr3\t195967200\t195968100\t0\t125\nchr3\t195985800\t195986100\t0.0411\t144\nchr3\t196271700\t196272000\t0.2113\t37\nchr3\t196761300\t196761600\t0.0092\t67\nchr3\t196784400\t196784700\t0.1014\t62\nchr3\t197436600\t197438100\t0.0399\t58\nchr3\t197623500\t197623800\t0.0517\t139\nchr3\t197631600\t197631900\t0.1802\t65\nchr3\t197635500\t197635800\t0.081\t85\nchr3\t197644500\t197644800\t0.1457\t75\nchr3\t197653200\t197655000\t0\t150\nchr3\t197663100\t197663400\t0.0122\t137\nchr3\t197665200\t197666100\t0\t137\nchr3\t197877000\t197877300\t0.0438\t61\nchr3\t198003900\t198005100\t0\t69\nchr3\t198099900\t198102900\t0.0506\t56\nchr3\t198141600\t198141900\t0.0632\t64\nchr3\t198152400\t198152700\t0.0949\t75\nchr3\t198156000\t198156300\t0\t78\nchr3\t198157500\t198159900\t0\t78\nchr3\t198164400\t198164700\t0.2447\t49\nchr3\t198172200\t198172500\t0.0788\t46\nchr3\t198175200\t198189900\t0\t97\nchr3\t198191400\t198235500\t0\t97\nchr4\t9900\t10200\t0.2781\t50\nchr4\t13200\t15000\t0\t152\nchr4\t17400\t17700\t0\t222\nchr4\t19200\t24900\t0\t222\nchr4\t26700\t27000\t0\t222\nchr4\t28800\t29100\t0.0387\t175\nchr4\t30900\t35400\t0\t169\nchr4\t38700\t39300\t0.0266\t177\nchr4\t43800\t44100\t0.1303\t154\nchr4\t46500\t50400\t0.0207\t163\nchr4\t51900\t54300\t0\t201\nchr4\t55800\t60300\t0\t201\nchr4\t62100\t64200\t0.003\t211\nchr4\t65400\t68100\t0.003\t211\nchr4\t731700\t732000\t0.2435\t25\nchr4\t744900\t747600\t0\t17\nchr4\t759000\t759900\t0\t45\nchr4\t1278900\t1279200\t0.1125\t34\nchr4\t1397700\t1398300\t0.0603\t231\nchr4\t1434600\t1435800\t0.006\t1045\nchr4\t1441500\t1442100\t0\t134\nchr4\t1545300\t1546800\t0\t47\nchr4\t1707000\t1707300\t0.2036\t89\nchr4\t1827300\t1827600\t0.1111\t52\nchr4\t2511300\t2511600\t0.0818\t48\nchr4\t2808900\t2809200\t0.121\t20\nchr4\t3227400\t3227700\t0.0368\t55\nchr4\t3509400\t3509700\t0.0035\t85\nchr4\t3542400\t3543000\t0.0374\t46\nchr4\t3610500\t3610800\t0.1545\t34\nchr4\t3613500\t3613800\t0.1628\t33\nchr4\t4020000\t4020900\t0.0537\t29\nchr4\t4068600\t4068900\t0.0963\t67\nchr4\t5273400\t5273700\t0.051\t70\nchr4\t5316300\t5317500\t0.0001\t1156\nchr4\t5441700\t5442000\t0.0913\t129\nchr4\t5779500\t5779800\t0.102\t48\nchr4\t6879900\t6880200\t0.2808\t98\nchr4\t7363500\t7363800\t0.0795\t30\nchr4\t7386900\t7387200\t0.0186\t28\nchr4\t7449000\t7449300\t0.2517\t35\nchr4\t7835400\t7835700\t0.2975\t54\nchr4\t7994100\t7994700\t0.0634\t73\nchr4\t8622000\t8634600\t0\t265\nchr4\t8636100\t8636700\t0\t262\nchr4\t9084900\t9085200\t0.1985\t60\nchr4\t9203700\t9204000\t0.0566\t17\nchr4\t9211200\t9211500\t0\t30\nchr4\t9213000\t9247800\t0\t799\nchr4\t9249000\t9273000\t0\t799\nchr4\t9322800\t9368700\t0\t691\nchr4\t9614100\t9617700\t0\t36\nchr4\t10827000\t10827300\t0.2107\t45\nchr4\t11148000\t11148300\t0.0246\t60\nchr4\t11169600\t11169900\t0.0876\t34\nchr4\t11381400\t11381700\t0.1576\t73\nchr4\t12509400\t12510000\t0.0685\t62\nchr4\t12753300\t12753600\t0.1248\t81\nchr4\t12907200\t12908100\t0\t61\nchr4\t13131600\t13132500\t0.0683\t63\nchr4\t13663200\t13663500\t0.2074\t100\nchr4\t14011200\t14013300\t0.08\t70\nchr4\t14755500\t14760900\t0\t98\nchr4\t15280200\t15281700\t0.1033\t81\nchr4\t15283200\t15283500\t0.0631\t85\nchr4\t15791700\t15792300\t0.0105\t85\nchr4\t15842400\t15847500\t0\t97\nchr4\t15867600\t15867900\t0.073\t73\nchr4\t16944000\t16949100\t0\t85\nchr4\t17940300\t17940600\t0.1593\t148\nchr4\t18175500\t18175800\t0.0996\t72\nchr4\t19077900\t19083900\t0\t94\nchr4\t19168800\t19169100\t0.1763\t75\nchr4\t19336200\t19337100\t0.0499\t76\nchr4\t19639800\t19640100\t0.0648\t66\nchr4\t19949400\t19950000\t0.0251\t81\nchr4\t19951200\t19951500\t0.0773\t70\nchr4\t20661000\t20661300\t0.1187\t115\nchr4\t21159600\t21165300\t0\t122\nchr4\t22107000\t22107300\t0.0922\t80\nchr4\t23099100\t23099400\t0.0688\t57\nchr4\t23615100\t23620500\t0\t104\nchr4\t23645100\t23645400\t0.1956\t59\nchr4\t26166000\t26166300\t0.1502\t91\nchr4\t26923500\t26927400\t0\t116\nchr4\t27072000\t27072300\t0.1606\t67\nchr4\t27376500\t27381000\t0.0002\t79\nchr4\t31491300\t31491600\t0.2074\t51\nchr4\t31967400\t31967700\t0.1382\t53\nchr4\t32126700\t32127000\t0.2877\t53\nchr4\t32360700\t32361300\t0.0387\t95\nchr4\t35606400\t35606700\t0.2681\t52\nchr4\t36468300\t36468600\t0.0354\t19\nchr4\t36841200\t36841500\t0.245\t22\nchr4\t37103700\t37105200\t0.0197\t94\nchr4\t42982500\t42982800\t0.1021\t69\nchr4\t43287300\t43289400\t0\t116\nchr4\t43817700\t43818300\t0.0464\t61\nchr4\t44505300\t44505600\t0.0021\t24\nchr4\t44975100\t44976900\t0.0255\t73\nchr4\t45023700\t45024000\t0\t17\nchr4\t45824400\t45824700\t0.2008\t71\nchr4\t46054200\t46056000\t0\t87\nchr4\t46795200\t46797000\t0.0185\t70\nchr4\t48052200\t48057300\t0\t95\nchr4\t48363000\t48364500\t0.03\t55\nchr4\t48414900\t48417600\t0\t74\nchr4\t48735300\t48735600\t0.1055\t57\nchr4\t49091100\t49107300\t0.0017\t14130\nchr4\t49108800\t49117800\t0.0376\t21031\nchr4\t49120500\t49149600\t0.001\t43802\nchr4\t49150800\t49151100\t0.2818\t3878\nchr4\t49152300\t49153500\t0.2669\t16685\nchr4\t49154700\t49156800\t0.2512\t2913\nchr4\t49189200\t49189500\t0.2207\t118\nchr4\t49244100\t49244400\t0.1178\t137\nchr4\t49248600\t49248900\t0.0829\t150\nchr4\t49267200\t49267500\t0.001\t262\nchr4\t49269600\t49269900\t0.001\t262\nchr4\t49273200\t49286700\t0\t209\nchr4\t49290000\t49290300\t0.0474\t94\nchr4\t49291800\t49292100\t0.1023\t222\nchr4\t49303800\t49306200\t0\t304\nchr4\t49309200\t49311000\t0\t178\nchr4\t49316700\t49318200\t0.0056\t306\nchr4\t49324500\t49337100\t0\t202\nchr4\t49492800\t49493100\t0.1612\t99\nchr4\t49509600\t49509900\t0.1738\t96\nchr4\t49521600\t49522800\t0.0637\t144\nchr4\t49527600\t49527900\t0.0268\t42\nchr4\t49531200\t49531500\t0.1157\t103\nchr4\t49536600\t49536900\t0.0837\t139\nchr4\t49540800\t49541100\t0.1521\t104\nchr4\t49544400\t49545000\t0.0278\t85\nchr4\t49582800\t49583100\t0.0197\t50\nchr4\t49593000\t49598400\t0\t99\nchr4\t49631400\t49641300\t0.0631\t9574\nchr4\t49642500\t49643400\t0.2195\t8114\nchr4\t49644600\t49647900\t0.1559\t4043\nchr4\t49649700\t49653900\t0.1325\t5912\nchr4\t49655700\t49656900\t0.2271\t2152\nchr4\t49712400\t49715700\t0\t255\nchr4\t49716900\t49718700\t0\t255\nchr4\t49720500\t49726200\t0\t889\nchr4\t49727400\t49730700\t0\t889\nchr4\t49732200\t49732500\t0.0265\t285\nchr4\t49733700\t49753200\t0\t900\nchr4\t49754400\t49786200\t0\t900\nchr4\t49787400\t49920000\t0\t1055\nchr4\t49921500\t50156100\t0\t2664\nchr4\t50157600\t50196900\t0\t252\nchr4\t50200800\t50337900\t0\t683\nchr4\t50339100\t50511300\t0\t2518\nchr4\t50512500\t50522700\t0\t3717\nchr4\t50523900\t50637900\t0\t3717\nchr4\t50639100\t50670300\t0\t3717\nchr4\t50671500\t50829000\t0\t9189\nchr4\t50830500\t50877300\t0\t9189\nchr4\t50878500\t50970900\t0\t9189\nchr4\t50972400\t51028500\t0\t9189\nchr4\t51030000\t51047400\t0\t950\nchr4\t51048600\t51058800\t0\t289\nchr4\t51060000\t51082800\t0\t682\nchr4\t51084000\t51117600\t0\t293\nchr4\t51119100\t51123600\t0\t293\nchr4\t51124800\t51141600\t0\t916\nchr4\t51143400\t51187500\t0\t872\nchr4\t51188700\t51231900\t0\t872\nchr4\t51233100\t51259800\t0\t872\nchr4\t51261300\t51265500\t0\t872\nchr4\t51266700\t51292800\t0\t872\nchr4\t51294000\t51368700\t0\t872\nchr4\t51369900\t51381600\t0\t301\nchr4\t51382800\t51396900\t0\t172\nchr4\t51398700\t51405000\t0\t184\nchr4\t51406500\t51454200\t0\t3549\nchr4\t51455400\t51520500\t0\t3549\nchr4\t51521700\t51534000\t0\t3549\nchr4\t51535500\t51602100\t0\t3549\nchr4\t51603300\t51627900\t0\t1139\nchr4\t51629100\t51743100\t0\t928\nchr4\t51795000\t51814500\t0\t361\nchr4\t52539000\t52544100\t0.01\t108\nchr4\t52817100\t52817700\t0.0025\t87\nchr4\t52818900\t52822200\t0.0025\t87\nchr4\t53726400\t53727000\t0.0328\t57\nchr4\t53737500\t53738100\t0.0118\t56\nchr4\t55058400\t55058700\t0.1252\t66\nchr4\t55620000\t55624800\t0\t89\nchr4\t55847100\t55847400\t0.1322\t85\nchr4\t57562500\t57567600\t0.0306\t103\nchr4\t57644100\t57644700\t0.1123\t81\nchr4\t57856200\t57856500\t0.2319\t65\nchr4\t58021200\t58022100\t0.1089\t83\nchr4\t58229400\t58229700\t0.1209\t58\nchr4\t58577100\t58577400\t0.0011\t54\nchr4\t58778100\t58778400\t0.2305\t44\nchr4\t59079900\t59084700\t0\t87\nchr4\t59519100\t59519400\t0.1063\t35\nchr4\t60105000\t60105600\t0\t88\nchr4\t60122400\t60122700\t0.005\t190\nchr4\t60591900\t60592200\t0.1801\t64\nchr4\t60703500\t60703800\t0.1548\t23\nchr4\t61940100\t61945500\t0\t89\nchr4\t62727000\t62729400\t0.0073\t96\nchr4\t62730600\t62731800\t0.0162\t70\nchr4\t63918000\t63918300\t0.1746\t40\nchr4\t64237500\t64237800\t0.1534\t70\nchr4\t64666500\t64666800\t0.1647\t23\nchr4\t64841100\t64842000\t0\t71\nchr4\t64861500\t64863000\t0\t82\nchr4\t65180400\t65180700\t0.079\t55\nchr4\t67179900\t67180800\t0.0438\t62\nchr4\t67182000\t67182300\t0.0413\t72\nchr4\t67398600\t67398900\t0.0077\t34\nchr4\t67888200\t67889100\t0\t77\nchr4\t67967700\t67968000\t0.1244\t106\nchr4\t67970700\t67971300\t0.0245\t88\nchr4\t68198100\t68203800\t0\t43\nchr4\t68511000\t68513100\t0\t72\nchr4\t69270300\t69270600\t0.0061\t56\nchr4\t69368100\t69368400\t0.1465\t47\nchr4\t69379200\t69379800\t0.0825\t53\nchr4\t70329000\t70334100\t0\t92\nchr4\t71103900\t71105100\t0.0188\t90\nchr4\t72129300\t72129900\t0.0412\t67\nchr4\t72400500\t72400800\t0.241\t65\nchr4\t74717700\t74723400\t0\t80\nchr4\t75128400\t75128700\t0.1795\t78\nchr4\t75272400\t75272700\t0\t39\nchr4\t75274200\t75274800\t0\t39\nchr4\t75444600\t75444900\t0.0304\t71\nchr4\t75446100\t75446400\t0.1314\t63\nchr4\t76828500\t76829400\t0\t66\nchr4\t76916100\t76917300\t0.0241\t83\nchr4\t76918500\t76918800\t0.0241\t83\nchr4\t77514300\t77514600\t0.1331\t88\nchr4\t78106200\t78111600\t0\t88\nchr4\t78348000\t78354000\t0\t90\nchr4\t79270500\t79271400\t0\t90\nchr4\t79704900\t79710300\t0\t91\nchr4\t79938000\t79943700\t0\t113\nchr4\t79967400\t79972800\t0\t103\nchr4\t80381400\t80381700\t0\t18\nchr4\t81537000\t81537300\t0.2199\t71\nchr4\t82008600\t82010100\t0.0047\t67\nchr4\t83184900\t83185200\t0.1103\t44\nchr4\t83649600\t83649900\t0.1854\t25\nchr4\t83954100\t83954700\t0.1521\t83\nchr4\t84075000\t84075300\t0.0488\t80\nchr4\t84130500\t84130800\t0.0627\t73\nchr4\t85891500\t85893600\t0\t69\nchr4\t86138100\t86138700\t0.0054\t94\nchr4\t86252700\t86254500\t0.0085\t92\nchr4\t87347400\t87353100\t0\t84\nchr4\t87563100\t87565200\t0\t87\nchr4\t87715200\t87715500\t0.0475\t76\nchr4\t88161300\t88161900\t0.0066\t97\nchr4\t88895700\t88896000\t0.2531\t78\nchr4\t90675900\t90681600\t0\t90\nchr4\t91137300\t91138800\t0.0605\t110\nchr4\t91239300\t91241100\t0\t33\nchr4\t91978500\t91979400\t0.0017\t97\nchr4\t91980600\t91983300\t0\t97\nchr4\t93609000\t93611400\t0\t100\nchr4\t93612600\t93612900\t0\t100\nchr4\t93638400\t93643800\t0\t72\nchr4\t94839000\t94839300\t0.1464\t71\nchr4\t95918400\t95918700\t0.1607\t100\nchr4\t96797100\t96797400\t0.1224\t71\nchr4\t96870600\t96871200\t0.1613\t105\nchr4\t97669500\t97669800\t0.0694\t33\nchr4\t97780200\t97780500\t0.0035\t59\nchr4\t97798800\t97799100\t0.0266\t64\nchr4\t98321700\t98322600\t0.1043\t73\nchr4\t98591400\t98591700\t0.0008\t126\nchr4\t98592900\t98598000\t0.0008\t126\nchr4\t98880300\t98880600\t0.0172\t48\nchr4\t100002300\t100004100\t0\t84\nchr4\t100046700\t100047000\t0.0947\t88\nchr4\t100718700\t100719000\t0.1168\t76\nchr4\t101406600\t101406900\t0.0844\t65\nchr4\t101749500\t101750100\t0.0212\t25\nchr4\t102044400\t102045000\t0.0486\t103\nchr4\t102205200\t102210300\t0.0078\t71\nchr4\t102221100\t102221400\t0.0709\t12\nchr4\t102952200\t102954300\t0\t81\nchr4\t104689500\t104690700\t0.0812\t91\nchr4\t104803200\t104804700\t0.0917\t49\nchr4\t105307500\t105308400\t0.0148\t73\nchr4\t105986700\t105987000\t0.1153\t70\nchr4\t106572300\t106576800\t0\t93\nchr4\t106638900\t106639800\t0.0341\t85\nchr4\t107082900\t107083500\t0.021\t106\nchr4\t107206800\t107210400\t0\t82\nchr4\t107223000\t107223300\t0.1654\t35\nchr4\t107355600\t107356500\t0\t77\nchr4\t108410100\t108410400\t0.1102\t90\nchr4\t109596000\t109596300\t0.0292\t58\nchr4\t110407200\t110407500\t0.0164\t82\nchr4\t110408700\t110409000\t0.0164\t82\nchr4\t110462100\t110462400\t0.1324\t32\nchr4\t110757900\t110758200\t0.0798\t63\nchr4\t110871600\t110871900\t0.2555\t65\nchr4\t111341400\t111341700\t0.0978\t45\nchr4\t111459000\t111459300\t0.1175\t74\nchr4\t111895800\t111900600\t0\t91\nchr4\t111965700\t111966000\t0.0945\t54\nchr4\t112092000\t112092300\t0.2051\t67\nchr4\t113064900\t113065200\t0.09\t22\nchr4\t113490900\t113491200\t0.2235\t76\nchr4\t116204400\t116206200\t0.0315\t57\nchr4\t116407800\t116408100\t0.199\t65\nchr4\t116686500\t116686800\t0.1493\t42\nchr4\t116775300\t116775600\t0.1555\t83\nchr4\t118066200\t118066500\t0\t17\nchr4\t118427100\t118427400\t0.1379\t48\nchr4\t118608900\t118609200\t0.0108\t59\nchr4\t118614300\t118614600\t0.1964\t61\nchr4\t118621800\t118622400\t0.0002\t65\nchr4\t118652700\t118653000\t0.1754\t66\nchr4\t118662600\t118662900\t0.0507\t41\nchr4\t119274900\t119275500\t0.0106\t75\nchr4\t119276700\t119278800\t0.0106\t75\nchr4\t119342700\t119343000\t0.0482\t77\nchr4\t119414400\t119414700\t0.0644\t74\nchr4\t119416200\t119416500\t0.0644\t74\nchr4\t119417700\t119418900\t0\t58\nchr4\t119421300\t119421600\t0.0399\t48\nchr4\t119424000\t119424300\t0.0234\t53\nchr4\t119425800\t119426100\t0.0234\t53\nchr4\t119429700\t119430000\t0.1\t78\nchr4\t119431200\t119431800\t0.0195\t65\nchr4\t119949300\t119954400\t0\t111\nchr4\t122112900\t122113200\t0.2885\t64\nchr4\t122332800\t122333400\t0.0359\t63\nchr4\t122497800\t122498100\t0.2823\t65\nchr4\t122652900\t122656500\t0\t83\nchr4\t124022700\t124023900\t0.0008\t65\nchr4\t124153200\t124155000\t0\t98\nchr4\t124406100\t124406400\t0.1821\t90\nchr4\t125257500\t125257800\t0.2293\t83\nchr4\t126928800\t126932100\t0.0894\t103\nchr4\t127022400\t127026300\t0.0136\t94\nchr4\t127652400\t127652700\t0.1134\t74\nchr4\t128214600\t128219700\t0\t71\nchr4\t129295800\t129297900\t0\t80\nchr4\t130016700\t130019700\t0.0018\t79\nchr4\t130425000\t130425300\t0.175\t201\nchr4\t131201400\t131202300\t0\t64\nchr4\t131724000\t131724300\t0.0596\t91\nchr4\t131726400\t131726700\t0.0438\t56\nchr4\t131733900\t131734200\t0.1201\t164\nchr4\t131735400\t131737200\t0\t167\nchr4\t131739300\t131739600\t0.065\t39\nchr4\t131740800\t131741100\t0.065\t39\nchr4\t131744100\t131748900\t0\t113\nchr4\t131751900\t131762100\t0\t298\nchr4\t131763600\t131763900\t0.1716\t88\nchr4\t132635700\t132636000\t0.1058\t52\nchr4\t132898500\t132898800\t0.2554\t25\nchr4\t132948000\t132949800\t0.0342\t82\nchr4\t133786800\t133787700\t0.0458\t56\nchr4\t134590200\t134590800\t0\t20\nchr4\t135079800\t135083100\t0.0008\t68\nchr4\t135084600\t135084900\t0.1275\t70\nchr4\t135452100\t135452400\t0.0089\t57\nchr4\t136293600\t136299300\t0\t100\nchr4\t137499000\t137499300\t0.0793\t88\nchr4\t138547800\t138552000\t0\t87\nchr4\t139428600\t139430100\t0.1132\t92\nchr4\t139944600\t139944900\t0.199\t73\nchr4\t140318400\t140318700\t0.1328\t70\nchr4\t140415900\t140417400\t0.0857\t107\nchr4\t140780100\t140780400\t0.0075\t80\nchr4\t140895900\t140896500\t0.0105\t67\nchr4\t141069000\t141069600\t0.1315\t116\nchr4\t141182100\t141182700\t0.0018\t93\nchr4\t141878400\t141878700\t0.1222\t62\nchr4\t142137300\t142137600\t0.1079\t38\nchr4\t142525500\t142525800\t0.0483\t48\nchr4\t143100600\t143106000\t0\t74\nchr4\t143809800\t143811300\t0.0115\t74\nchr4\t143884200\t143884800\t0.0092\t40\nchr4\t143886900\t143887500\t0.0092\t40\nchr4\t144126600\t144126900\t0.1542\t35\nchr4\t144748200\t144748500\t0.1056\t65\nchr4\t144810300\t144810900\t0.0301\t104\nchr4\t145372200\t145374000\t0\t71\nchr4\t146353200\t146353800\t0.1103\t74\nchr4\t146619000\t146620500\t0.0683\t100\nchr4\t146621700\t146622000\t0.0683\t100\nchr4\t146666400\t146667000\t0.1273\t94\nchr4\t147452100\t147452700\t0.0456\t59\nchr4\t147783900\t147784200\t0.0162\t216\nchr4\t149853300\t149853600\t0.2632\t70\nchr4\t150291300\t150291600\t0.023\t83\nchr4\t150638700\t150639000\t0.0428\t92\nchr4\t150659400\t150660900\t0\t75\nchr4\t151419600\t151420200\t0.001\t60\nchr4\t155282700\t155285700\t0\t95\nchr4\t155538600\t155538900\t0\t11\nchr4\t156048600\t156049800\t0.0017\t105\nchr4\t156305100\t156305400\t0.0154\t98\nchr4\t156371100\t156371700\t0.0072\t85\nchr4\t158084400\t158085000\t0.0188\t78\nchr4\t158086500\t158086800\t0.1073\t93\nchr4\t158473800\t158474400\t0\t49\nchr4\t159806400\t159806700\t0.2124\t99\nchr4\t160575600\t160575900\t0.2249\t80\nchr4\t160659300\t160659600\t0.012\t82\nchr4\t161618100\t161618400\t0.1007\t76\nchr4\t161637000\t161637900\t0.0261\t79\nchr4\t161974500\t161974800\t0.1004\t79\nchr4\t163212000\t163212300\t0.2022\t122\nchr4\t163635000\t163635300\t0.0843\t63\nchr4\t163824600\t163824900\t0.2087\t47\nchr4\t164102100\t164102400\t0.0478\t66\nchr4\t164104500\t164104800\t0.0478\t66\nchr4\t164145900\t164146200\t0.1484\t84\nchr4\t164352900\t164353800\t0\t91\nchr4\t164470200\t164470500\t0.1398\t92\nchr4\t164554800\t164556000\t0.0415\t72\nchr4\t165958200\t165958500\t0.1497\t67\nchr4\t166448100\t166449300\t0.0036\t87\nchr4\t166468500\t166468800\t0.1263\t92\nchr4\t166570500\t166575900\t0\t93\nchr4\t166580100\t166580700\t0.0742\t593\nchr4\t166755900\t166761900\t0\t99\nchr4\t168155700\t168156000\t0.0642\t273\nchr4\t168444000\t168447000\t0.0227\t82\nchr4\t169515600\t169521000\t0\t86\nchr4\t169793100\t169793400\t0.2198\t54\nchr4\t170255700\t170256300\t0.1693\t51\nchr4\t170436300\t170436600\t0.0916\t69\nchr4\t173483700\t173484000\t0.2593\t14\nchr4\t173867400\t173867700\t0.0509\t40\nchr4\t174858900\t174859500\t0.0107\t34\nchr4\t175207500\t175208100\t0.0722\t83\nchr4\t175637400\t175637700\t0.0629\t258\nchr4\t177999900\t178000200\t0.1479\t72\nchr4\t180128700\t180129000\t0.0816\t97\nchr4\t180944100\t180945300\t0.052\t33\nchr4\t180955800\t180957000\t0\t68\nchr4\t181239300\t181241700\t0\t550\nchr4\t181409400\t181413900\t0.0672\t81\nchr4\t181774200\t181774800\t0.0017\t84\nchr4\t182780400\t182780700\t0.2263\t48\nchr4\t182782500\t182782800\t0.1285\t68\nchr4\t182832000\t182832300\t0.1349\t22\nchr4\t182833800\t182834400\t0.0213\t17\nchr4\t183336900\t183337200\t0\t35\nchr4\t183640200\t183640800\t0.0011\t58\nchr4\t183735000\t183735300\t0\t22\nchr4\t183736800\t183737100\t0.1183\t16\nchr4\t184140600\t184140900\t0.0896\t67\nchr4\t184858500\t184858800\t0.2965\t48\nchr4\t184966800\t184967400\t0.1565\t48\nchr4\t185796600\t185796900\t0.214\t43\nchr4\t186114000\t186115200\t0\t63\nchr4\t186371400\t186371700\t0.0095\t69\nchr4\t187304700\t187305000\t0\t42\nchr4\t187948800\t187949700\t0\t73\nchr4\t187955100\t187956300\t0\t66\nchr4\t188151900\t188154600\t0.0681\t21\nchr4\t188445000\t188448900\t0.0065\t65\nchr4\t188504400\t188504700\t0.2662\t26\nchr4\t188560200\t188560500\t0.0947\t97\nchr4\t188741400\t188741700\t0.0433\t58\nchr4\t189137400\t189143100\t0\t72\nchr4\t189155400\t189155700\t0.1257\t53\nchr4\t189307800\t189309300\t0.2123\t76\nchr4\t189314400\t189314700\t0.0744\t105\nchr4\t189332700\t189333000\t0\t21\nchr4\t189400200\t189400500\t0.2065\t106\nchr4\t189460800\t189461100\t0.0254\t54\nchr4\t189491400\t189491700\t0.1042\t130\nchr4\t189651600\t189652200\t0.1493\t99\nchr4\t189669900\t189676200\t0\t43\nchr4\t189680100\t189680400\t0\t32\nchr4\t189681600\t189685500\t0\t32\nchr4\t189688200\t189688500\t0\t22\nchr4\t189690600\t189691500\t0\t38\nchr4\t189692700\t189695100\t0\t40\nchr4\t189696600\t189699300\t0\t40\nchr4\t189700800\t189701400\t0\t40\nchr4\t189835800\t189837000\t0.1925\t1488\nchr4\t190022100\t190022400\t0.0537\t176\nchr4\t190025400\t190026900\t0.0161\t88\nchr4\t190038000\t190038300\t0.0262\t61\nchr4\t190056000\t190056300\t0\t57\nchr4\t190060500\t190061400\t0.1497\t78\nchr4\t190065300\t190099500\t0\t815\nchr4\t190101000\t190106100\t0\t190\nchr4\t190113300\t190113600\t0.0603\t187\nchr4\t190117800\t190118100\t0.0484\t137\nchr4\t190173000\t190175700\t0\t381\nchr4\t190177200\t190181400\t0\t8733\nchr4\t190184400\t190202400\t0\t157\nchr4\t190204200\t190204500\t0.2248\t77\nchr5\t9900\t12000\t0\t1344\nchr5\t43200\t43500\t0.1825\t66\nchr5\t83700\t84600\t0.2601\t23\nchr5\t100500\t100800\t0.1758\t53\nchr5\t209100\t209700\t0.2422\t39\nchr5\t212700\t213000\t0.1488\t30\nchr5\t260100\t262200\t0.1675\t54\nchr5\t293400\t294000\t0.1222\t80\nchr5\t309600\t309900\t0.1876\t71\nchr5\t344400\t344700\t0.1329\t54\nchr5\t356700\t358800\t0\t54\nchr5\t474300\t474600\t0.2955\t47\nchr5\t487200\t487500\t0.2205\t19\nchr5\t495600\t495900\t0.0356\t15\nchr5\t553200\t553500\t0.2797\t60\nchr5\t562500\t563100\t0.0341\t33\nchr5\t564300\t564600\t0.0821\t19\nchr5\t630000\t632700\t0\t76\nchr5\t689100\t690900\t0\t77\nchr5\t694500\t695400\t0\t60\nchr5\t725400\t725700\t0.1159\t48\nchr5\t734700\t735600\t0\t76\nchr5\t738000\t738600\t0.0008\t68\nchr5\t740100\t740400\t0.0008\t68\nchr5\t747000\t747300\t0.0764\t58\nchr5\t755700\t756000\t0.0185\t72\nchr5\t767700\t768900\t0\t68\nchr5\t781200\t783000\t0\t70\nchr5\t786000\t786600\t0.0045\t67\nchr5\t809700\t810000\t0.0297\t55\nchr5\t825900\t827100\t0\t67\nchr5\t830100\t830700\t0.0154\t62\nchr5\t832500\t832800\t0.1663\t52\nchr5\t839100\t839400\t0.0692\t55\nchr5\t848100\t848400\t0.119\t63\nchr5\t878700\t879900\t0\t90\nchr5\t897600\t899700\t0\t61\nchr5\t1022400\t1025700\t0.169\t36\nchr5\t1070100\t1070400\t0.1084\t19\nchr5\t1071600\t1073100\t0.0532\t27\nchr5\t1170300\t1170600\t0.256\t58\nchr5\t1272600\t1272900\t0.1948\t54\nchr5\t1289400\t1290900\t0.1549\t103\nchr5\t1569900\t1570200\t0.2046\t99\nchr5\t1644600\t1644900\t0.2396\t28\nchr5\t1713900\t1715400\t0.0234\t80\nchr5\t1968300\t1971300\t0\t83\nchr5\t3499200\t3499500\t0.1537\t26\nchr5\t3638100\t3639000\t0\t37\nchr5\t4496700\t4497000\t0\t81\nchr5\t4498200\t4500300\t0\t81\nchr5\t4619400\t4619700\t0.157\t77\nchr5\t6774000\t6774300\t0.1265\t16\nchr5\t6968400\t6971100\t0\t64\nchr5\t7056900\t7057500\t0.0579\t91\nchr5\t7194300\t7195200\t0.0135\t83\nchr5\t7197300\t7197900\t0.0135\t83\nchr5\t7233000\t7234800\t0.1042\t105\nchr5\t7604100\t7605900\t0\t69\nchr5\t9259800\t9262200\t0\t88\nchr5\t9585300\t9585900\t0.0276\t132\nchr5\t10346400\t10346700\t0.0411\t69\nchr5\t12453300\t12454800\t0\t74\nchr5\t13329900\t13330200\t0.0038\t11\nchr5\t13416600\t13422600\t0\t75\nchr5\t14346900\t14347500\t0.1198\t265\nchr5\t14634300\t14634600\t0.0511\t102\nchr5\t14808900\t14809200\t0.2506\t71\nchr5\t15401400\t15401700\t0.1305\t18\nchr5\t15906600\t15912300\t0\t88\nchr5\t17101200\t17101500\t0.0807\t92\nchr5\t17517900\t17519400\t0.0002\t348\nchr5\t17520600\t17526300\t0\t549\nchr5\t17528100\t17529900\t0\t549\nchr5\t17580600\t17595000\t0\t437\nchr5\t17596500\t17598900\t0\t437\nchr5\t17749800\t17750100\t0.0438\t19\nchr5\t17840700\t17841000\t0.0139\t45\nchr5\t18474300\t18474600\t0.0862\t86\nchr5\t19161600\t19161900\t0.0309\t21\nchr5\t19164000\t19166400\t0.0042\t79\nchr5\t20644500\t20646900\t0.0024\t99\nchr5\t20754600\t20754900\t0.0051\t54\nchr5\t20756700\t20757300\t0.0051\t54\nchr5\t20763300\t20763900\t0.0015\t54\nchr5\t20868300\t20868600\t0\t24\nchr5\t21108900\t21112800\t0.0494\t83\nchr5\t21299400\t21299700\t0.1353\t85\nchr5\t21338100\t21338400\t0.1479\t11\nchr5\t21480600\t21480900\t0.0802\t128\nchr5\t21485100\t21485400\t0.0713\t156\nchr5\t21490500\t21490800\t0.0964\t139\nchr5\t21494700\t21495000\t0.0565\t135\nchr5\t24370800\t24373200\t0\t69\nchr5\t25079400\t25079700\t0.1359\t68\nchr5\t25116900\t25117200\t0.2071\t68\nchr5\t25207500\t25207800\t0.0386\t94\nchr5\t25777200\t25777500\t0.0924\t19\nchr5\t26111100\t26111400\t0\t17\nchr5\t26481600\t26481900\t0.137\t51\nchr5\t27426600\t27426900\t0.2791\t31\nchr5\t28200900\t28201200\t0.1019\t72\nchr5\t28801800\t28802100\t0.1748\t32\nchr5\t29190900\t29191200\t0.0956\t76\nchr5\t29486700\t29489400\t0\t72\nchr5\t29877300\t29877600\t0.0493\t92\nchr5\t30012600\t30012900\t0.0853\t53\nchr5\t30426300\t30426600\t0.0546\t65\nchr5\t30818400\t30818700\t0.1184\t83\nchr5\t30822000\t30822300\t0.143\t110\nchr5\t32208300\t32208600\t0.1095\t115\nchr5\t32822700\t32827800\t0\t83\nchr5\t32911800\t32912100\t0.1122\t81\nchr5\t33126000\t33126600\t0.0507\t109\nchr5\t33127800\t33128100\t0.0636\t88\nchr5\t33953700\t33954000\t0.0497\t97\nchr5\t34097700\t34098300\t0\t59\nchr5\t34104000\t34104600\t0\t52\nchr5\t34106400\t34106700\t0\t52\nchr5\t34148400\t34153800\t0\t85\nchr5\t34179000\t34179300\t0.0312\t202\nchr5\t34183500\t34183800\t0.0224\t150\nchr5\t34188900\t34189200\t0.0976\t165\nchr5\t34198500\t34199400\t0.0113\t57\nchr5\t34204800\t34205100\t0.1681\t47\nchr5\t34231800\t34232100\t0.1284\t79\nchr5\t34245300\t34245600\t0.0692\t37\nchr5\t34305000\t34307700\t0.0008\t77\nchr5\t36293100\t36293400\t0.0775\t53\nchr5\t36321600\t36321900\t0.0467\t29\nchr5\t37458000\t37460400\t0\t64\nchr5\t38173800\t38174100\t0.0875\t88\nchr5\t39787800\t39793500\t0\t139\nchr5\t40543500\t40543800\t0.067\t64\nchr5\t40545300\t40546500\t0.1122\t101\nchr5\t40801200\t40801500\t0.0908\t81\nchr5\t41235600\t41238300\t0.0707\t81\nchr5\t41599500\t41599800\t0.1492\t57\nchr5\t42165900\t42167400\t0\t64\nchr5\t42737400\t42738000\t0.1081\t71\nchr5\t42739200\t42739800\t0.001\t48\nchr5\t42981300\t42981600\t0.0761\t80\nchr5\t43086600\t43087200\t0.0608\t81\nchr5\t44152500\t44154300\t0\t94\nchr5\t45495000\t45495300\t0.0505\t66\nchr5\t45660000\t45664200\t0\t82\nchr5\t46486200\t46487100\t0\t22\nchr5\t46488300\t46492200\t0\t70\nchr5\t46493700\t46501200\t0\t136\nchr5\t46503000\t46503300\t0\t105\nchr5\t46504500\t46507800\t0\t48\nchr5\t46510200\t46512900\t0.0017\t50\nchr5\t46514100\t46515000\t0\t54\nchr5\t46518600\t46524000\t0\t53\nchr5\t46526400\t46526700\t0.2418\t12\nchr5\t46528200\t46529100\t0\t23\nchr5\t46530900\t46533300\t0\t56\nchr5\t46535100\t46538100\t0\t106\nchr5\t46541700\t46542300\t0.0305\t35\nchr5\t46545300\t46551300\t0\t98\nchr5\t46553100\t46553700\t0\t43\nchr5\t46555500\t46557000\t0.0487\t43\nchr5\t46559100\t46562400\t0\t71\nchr5\t46564500\t46564800\t0\t13\nchr5\t46566300\t46570200\t0\t70\nchr5\t46572000\t46573200\t0\t87\nchr5\t46574400\t46575600\t0\t129\nchr5\t46576800\t46580400\t0\t123\nchr5\t46582200\t46584300\t0\t47\nchr5\t46585500\t46586400\t0\t60\nchr5\t46587600\t46599000\t0\t111\nchr5\t46600500\t46610100\t0\t192\nchr5\t46611300\t46616100\t0\t192\nchr5\t46617300\t46625100\t0\t151\nchr5\t46626600\t46627200\t0\t151\nchr5\t46628400\t46630800\t0\t75\nchr5\t46632300\t46635000\t0\t63\nchr5\t46637100\t46638900\t0\t57\nchr5\t46640400\t46642500\t0\t81\nchr5\t46644900\t46645200\t0\t45\nchr5\t46646400\t46647900\t0\t84\nchr5\t46649700\t46658100\t0\t187\nchr5\t46659300\t46673700\t0\t222\nchr5\t46676400\t46676700\t0\t222\nchr5\t46677900\t46682100\t0\t222\nchr5\t46683600\t46684500\t0\t51\nchr5\t46686600\t46687500\t0\t212\nchr5\t46688700\t46689300\t0\t212\nchr5\t46692900\t46695000\t0\t33\nchr5\t46697100\t46702500\t0\t105\nchr5\t46707300\t46708200\t0\t119\nchr5\t46710300\t46716000\t0\t203\nchr5\t46717800\t46718400\t0\t62\nchr5\t46719600\t46722300\t0\t167\nchr5\t46724100\t46725900\t0\t97\nchr5\t46728000\t46728900\t0\t108\nchr5\t46730100\t46740300\t0\t108\nchr5\t46742400\t46749300\t0\t206\nchr5\t46750800\t46769400\t0\t206\nchr5\t46771800\t46781400\t0\t142\nchr5\t46782600\t46784400\t0\t111\nchr5\t46785900\t46790700\t0\t111\nchr5\t46792800\t46812300\t0\t175\nchr5\t46813500\t46912500\t0\t175\nchr5\t46913700\t46925700\t0\t288\nchr5\t46927500\t46953600\t0\t162\nchr5\t46955400\t46957500\t0\t162\nchr5\t46959300\t46985100\t0\t364\nchr5\t46986300\t47026800\t0\t364\nchr5\t47028000\t47059200\t0\t146\nchr5\t47060700\t47065800\t0\t144\nchr5\t47068200\t47068500\t0.0486\t38\nchr5\t47073900\t47074200\t0.0138\t114\nchr5\t47076000\t47079600\t0\t100\nchr5\t47083800\t47087100\t0\t75\nchr5\t47089200\t47089800\t0\t37\nchr5\t47092200\t47095500\t0\t37\nchr5\t47097300\t47098500\t0.0013\t67\nchr5\t47105100\t47106900\t0\t135\nchr5\t47109600\t47110800\t0\t135\nchr5\t47113500\t47115000\t0.0228\t291\nchr5\t47117400\t47124600\t0\t263\nchr5\t47125800\t47127300\t0\t263\nchr5\t47130000\t47131800\t0.0068\t183\nchr5\t47134200\t47137200\t0\t458\nchr5\t47138700\t47142000\t0\t458\nchr5\t47143200\t47145600\t0\t458\nchr5\t47147400\t47165100\t0\t458\nchr5\t47167200\t47209800\t0\t435\nchr5\t47211000\t47231700\t0\t408\nchr5\t47232900\t47242200\t0\t408\nchr5\t47243400\t47248200\t0\t408\nchr5\t47249400\t47255700\t0\t408\nchr5\t47257200\t47264100\t0\t364\nchr5\t47265300\t47271600\t0\t364\nchr5\t47272800\t47295300\t0\t561\nchr5\t47296800\t47297400\t0\t561\nchr5\t47307600\t47309100\t0.0121\t262\nchr5\t49591500\t49591800\t0\t100\nchr5\t49601100\t49601400\t0.2028\t3249\nchr5\t49602900\t49603200\t0.1512\t1576\nchr5\t49609800\t49617300\t0\t297\nchr5\t49626600\t49627200\t0.0071\t398\nchr5\t49633500\t49633800\t0\t23\nchr5\t49644000\t49646400\t0.0554\t2508\nchr5\t49656000\t49656600\t0.1929\t2584\nchr5\t49659000\t49659300\t0.282\t8023\nchr5\t49665900\t49667700\t0\t17908\nchr5\t49670400\t49671300\t0\t37\nchr5\t49672800\t49673400\t0.0124\t231\nchr5\t49674600\t49675200\t0.0124\t231\nchr5\t49679700\t49682700\t0\t150\nchr5\t49687800\t49689900\t0\t93\nchr5\t49691700\t49692000\t0.1035\t81\nchr5\t49695600\t49695900\t0.2833\t91\nchr5\t49698600\t49701300\t0.0073\t175\nchr5\t49703700\t49704600\t0.0073\t175\nchr5\t49705800\t49708800\t0.0073\t175\nchr5\t49712700\t49714500\t0.0013\t111\nchr5\t49716600\t49716900\t0.1228\t59\nchr5\t49719000\t49720200\t0\t86\nchr5\t49723800\t49725300\t0.0338\t448\nchr5\t49726500\t49727700\t0\t83\nchr5\t49729800\t49730400\t0.0054\t107\nchr5\t49734900\t49735800\t0\t321\nchr5\t49740900\t49741200\t0.0106\t126\nchr5\t49743600\t49746600\t0.0222\t445\nchr5\t49748100\t49748700\t0.0222\t445\nchr5\t49750500\t49752600\t0.0873\t141\nchr5\t49755300\t49755600\t0.1234\t318\nchr5\t49756800\t49758300\t0.1234\t318\nchr5\t49759500\t49761300\t0.0627\t136\nchr5\t49762800\t49763100\t0.0685\t30\nchr5\t49764300\t49764900\t0.2015\t286\nchr5\t49767000\t49768200\t0.2055\t143\nchr5\t49771500\t49772700\t0.1999\t101\nchr5\t49774200\t49779300\t0.0107\t356\nchr5\t49783800\t49784100\t0.0571\t233\nchr5\t49787100\t49787700\t0.154\t1046\nchr5\t49789800\t49790100\t0.0765\t38\nchr5\t49791300\t49791900\t0.199\t87\nchr5\t49793400\t49794000\t0.1036\t248\nchr5\t49796100\t49800000\t0.0105\t238\nchr5\t49804500\t49804800\t0.1547\t81\nchr5\t49806300\t49806900\t0.0191\t245\nchr5\t49808700\t49809000\t0.2353\t18\nchr5\t49811700\t49812000\t0.1878\t40\nchr5\t49815300\t49815600\t0.1517\t72\nchr5\t49817100\t49817400\t0.1745\t34\nchr5\t49818900\t49821900\t0\t90\nchr5\t49823400\t49824900\t0.2683\t579\nchr5\t49826700\t49827000\t0.2282\t91\nchr5\t49828200\t49828500\t0.1383\t502\nchr5\t49833000\t49833900\t0.0622\t29\nchr5\t49837200\t49837500\t0.1615\t174\nchr5\t49839000\t49841100\t0.0205\t636\nchr5\t49842600\t49843200\t0.1452\t65\nchr5\t49844400\t49845000\t0.1059\t26\nchr5\t49847100\t49852500\t0.114\t274\nchr5\t49856100\t49856400\t0.0593\t124\nchr5\t49859700\t49860000\t0.1464\t18\nchr5\t49861200\t49861800\t0.0362\t697\nchr5\t49863600\t49864500\t0.0362\t697\nchr5\t49865700\t49866900\t0.0795\t181\nchr5\t49869000\t49872000\t0\t367\nchr5\t49873200\t49875300\t0.0236\t98\nchr5\t49876800\t49877400\t0.0236\t98\nchr5\t49880100\t49880400\t0.1172\t316\nchr5\t49882200\t49884900\t0.0056\t354\nchr5\t49886400\t49887900\t0.0056\t354\nchr5\t49890600\t49890900\t0.1683\t135\nchr5\t49893900\t49895400\t0\t265\nchr5\t49901100\t49903200\t0\t148\nchr5\t49905000\t49906800\t0.112\t147\nchr5\t49908300\t49911000\t0\t116\nchr5\t49912500\t49913400\t0\t244\nchr5\t49915200\t49916100\t0.0926\t270\nchr5\t49917300\t49917900\t0.1104\t517\nchr5\t49921500\t49924500\t0.0242\t845\nchr5\t49925700\t49926000\t0.17\t29\nchr5\t49927500\t49928100\t0.1362\t130\nchr5\t49930200\t49932900\t0\t178\nchr5\t49934100\t49934400\t0\t54\nchr5\t49936800\t49940400\t0.0235\t161\nchr5\t49942200\t49942500\t0.0604\t130\nchr5\t49944300\t49948800\t0.0314\t492\nchr5\t49951500\t49952400\t0.092\t124\nchr5\t49953600\t49954200\t0.092\t124\nchr5\t49955400\t49956600\t0.0192\t563\nchr5\t49959000\t49960200\t0.1907\t59\nchr5\t49962300\t49962600\t0.2665\t386\nchr5\t49964400\t49969500\t0.0755\t497\nchr5\t49971000\t49971900\t0.2606\t101\nchr5\t49977000\t49977300\t0.0644\t571\nchr5\t49979100\t49980600\t0.0644\t571\nchr5\t49981800\t49983900\t0.033\t108\nchr5\t49986000\t49989600\t0.0388\t320\nchr5\t49995300\t49995600\t0.0855\t125\nchr5\t49997700\t49999800\t0.0347\t492\nchr5\t50001000\t50004000\t0.0658\t225\nchr5\t50005800\t50006700\t0.0709\t329\nchr5\t50009700\t50010300\t0.0959\t243\nchr5\t50011500\t50012100\t0.1425\t45\nchr5\t50014800\t50016600\t0.0577\t285\nchr5\t50018700\t50020800\t0.051\t320\nchr5\t50023500\t50026200\t0.0176\t221\nchr5\t50028300\t50028600\t0.0054\t254\nchr5\t50030100\t50030400\t0.0054\t254\nchr5\t50032800\t50033400\t0\t211\nchr5\t50034600\t50035200\t0\t211\nchr5\t50037300\t50037600\t0.0881\t242\nchr5\t50039100\t50039700\t0.0491\t48\nchr5\t50040900\t50042100\t0\t609\nchr5\t50043600\t50045700\t0\t609\nchr5\t50051400\t50053800\t0.1304\t297\nchr5\t50057100\t50059200\t0.0547\t567\nchr5\t50110200\t50134200\t0\t617\nchr5\t50135700\t50136600\t0\t617\nchr5\t50138100\t50141700\t0.0018\t348\nchr5\t51254700\t51255000\t0.0716\t86\nchr5\t51332700\t51333900\t0.0513\t93\nchr5\t51335100\t51335400\t0.1176\t79\nchr5\t52019100\t52019400\t0.1668\t93\nchr5\t52090500\t52090800\t0.1042\t87\nchr5\t52935900\t52936200\t0.2624\t31\nchr5\t54182100\t54182400\t0.1067\t59\nchr5\t55571400\t55571700\t0.1956\t83\nchr5\t55695600\t55695900\t0.1793\t54\nchr5\t55753800\t55754100\t0.134\t66\nchr5\t57354600\t57354900\t0.0187\t86\nchr5\t57473100\t57475200\t0.0505\t72\nchr5\t58384200\t58390200\t0\t89\nchr5\t58597500\t58597800\t0.1233\t12\nchr5\t59284800\t59285100\t0.0048\t67\nchr5\t59396400\t59396700\t0.2892\t29\nchr5\t62799900\t62800200\t0.2163\t48\nchr5\t62818200\t62822700\t0\t73\nchr5\t63943200\t63943500\t0.0725\t61\nchr5\t64466700\t64470300\t0\t68\nchr5\t64477800\t64481100\t0\t69\nchr5\t64710000\t64710300\t0.0028\t73\nchr5\t64711500\t64712100\t0.0028\t73\nchr5\t65164800\t65169300\t0\t86\nchr5\t67822200\t67822500\t0.1797\t74\nchr5\t67892400\t67892700\t0.081\t76\nchr5\t68008200\t68009100\t0.0167\t63\nchr5\t69534300\t69535500\t0\t56\nchr5\t69537300\t69546900\t0\t56\nchr5\t69550800\t69553500\t0\t44\nchr5\t69555900\t69557100\t0\t68\nchr5\t69558300\t69558600\t0\t68\nchr5\t69565200\t69565500\t0.0562\t38\nchr5\t69566700\t69579600\t0\t89\nchr5\t69581700\t69601500\t0\t89\nchr5\t69603300\t69605100\t0\t101\nchr5\t69606300\t69623700\t0\t101\nchr5\t69624900\t69627300\t0\t101\nchr5\t69628800\t69631800\t0\t169\nchr5\t69635700\t69766500\t0\t388\nchr5\t69768000\t69791400\t0\t388\nchr5\t69792600\t69942600\t0\t388\nchr5\t69944400\t69992400\t0\t92\nchr5\t69993600\t69996600\t0\t92\nchr5\t69999000\t70002000\t0\t73\nchr5\t70003200\t70009500\t0\t84\nchr5\t70010700\t70019100\t0\t84\nchr5\t70020300\t70028100\t0\t90\nchr5\t70029900\t70040700\t0\t89\nchr5\t70042200\t70043400\t0\t89\nchr5\t70044600\t70046400\t0\t82\nchr5\t70049400\t70074300\t0\t89\nchr5\t70077900\t70079100\t0\t89\nchr5\t70081200\t70083300\t0\t89\nchr5\t70085700\t70095600\t0\t95\nchr5\t70096800\t70102200\t0\t95\nchr5\t70103700\t70130400\t0\t95\nchr5\t70131900\t70156500\t0\t95\nchr5\t70158300\t70182300\t0\t141\nchr5\t70183500\t70219200\t0\t141\nchr5\t70220700\t70263600\t0\t141\nchr5\t70264800\t70306800\t0\t141\nchr5\t70309800\t70319100\t0\t141\nchr5\t70320600\t70377000\t0\t141\nchr5\t70378200\t70401000\t0\t141\nchr5\t70402500\t70434000\t0\t108\nchr5\t70435800\t70442100\t0\t108\nchr5\t70444500\t70508400\t0\t225\nchr5\t70511700\t70546200\t0\t225\nchr5\t70548600\t70629000\t0\t274\nchr5\t70630200\t70630800\t0\t274\nchr5\t70632000\t70635600\t0\t274\nchr5\t70636800\t70779900\t0\t274\nchr5\t70781100\t70783800\t0.0009\t209\nchr5\t70785900\t70811700\t0\t260\nchr5\t70812900\t70855500\t0\t260\nchr5\t70856700\t70867500\t0\t260\nchr5\t70868700\t70871700\t0\t260\nchr5\t70874100\t70922400\t0\t91\nchr5\t70923600\t70949700\t0\t91\nchr5\t70953300\t70954800\t0\t79\nchr5\t70956900\t70959900\t0.0034\t81\nchr5\t70961100\t70977000\t0\t94\nchr5\t70978500\t71007000\t0\t95\nchr5\t71016600\t71031900\t0\t86\nchr5\t71034600\t71035800\t0\t73\nchr5\t71037000\t71039100\t0\t73\nchr5\t71040300\t71045400\t0\t73\nchr5\t71046900\t71052900\t0\t73\nchr5\t71055600\t71055900\t0\t74\nchr5\t71057700\t71062800\t0\t74\nchr5\t71064300\t71077200\t0\t80\nchr5\t71081700\t71094900\t0\t63\nchr5\t71098800\t71102100\t0\t76\nchr5\t71104800\t71105700\t0\t102\nchr5\t71106900\t71134500\t0\t102\nchr5\t71136000\t71138400\t0\t102\nchr5\t71140200\t71151000\t0\t103\nchr5\t71153400\t71156700\t0\t103\nchr5\t71159400\t71164200\t0\t103\nchr5\t71165700\t71166300\t0.0716\t57\nchr5\t71169000\t71182500\t0\t421\nchr5\t71183700\t71230500\t0\t421\nchr5\t71231700\t71272200\t0\t218\nchr5\t71273400\t71281200\t0\t218\nchr5\t71282700\t71299800\t0\t218\nchr5\t71303100\t71317200\t0\t91\nchr5\t71318400\t71318700\t0\t91\nchr5\t71319900\t71321100\t0\t91\nchr5\t71323800\t71324400\t0.0033\t75\nchr5\t71325900\t71326200\t0.0862\t106\nchr5\t71329800\t71343300\t0\t116\nchr5\t71344500\t71346000\t0.0008\t65\nchr5\t71347200\t71352600\t0\t66\nchr5\t71353800\t71357700\t0\t89\nchr5\t71358900\t71359200\t0.0569\t30\nchr5\t71362200\t71362500\t0.0524\t55\nchr5\t71607900\t71608500\t0.1122\t69\nchr5\t71851800\t71852700\t0.0451\t54\nchr5\t75606000\t75606600\t0.0197\t76\nchr5\t75642600\t75647700\t0.0048\t82\nchr5\t75882900\t75883200\t0.2255\t76\nchr5\t76170300\t76172700\t0.0479\t85\nchr5\t77042700\t77043300\t0.2174\t65\nchr5\t77794500\t77794800\t0.071\t65\nchr5\t78619800\t78620100\t0.0901\t45\nchr5\t79096800\t79097100\t0.1367\t54\nchr5\t79779000\t79784700\t0\t108\nchr5\t81033300\t81033600\t0.0579\t59\nchr5\t81054300\t81054900\t0.1548\t81\nchr5\t81596400\t81596700\t0.0147\t72\nchr5\t81617100\t81621900\t0\t87\nchr5\t82126200\t82126500\t0.0052\t58\nchr5\t82134000\t82134900\t0\t70\nchr5\t82140600\t82140900\t0.132\t57\nchr5\t82369800\t82371600\t0.0023\t77\nchr5\t82430100\t82430700\t0.0092\t91\nchr5\t82505100\t82506000\t0.0797\t89\nchr5\t82867500\t82867800\t0.2191\t42\nchr5\t82938000\t82938300\t0.0262\t50\nchr5\t83316900\t83319900\t0\t64\nchr5\t83458500\t83458800\t0.0807\t97\nchr5\t84176100\t84176400\t0.2734\t213\nchr5\t85638900\t85639500\t0.0641\t60\nchr5\t85662600\t85663200\t0.0491\t80\nchr5\t86511000\t86516100\t0.0083\t94\nchr5\t87091500\t87091800\t0.0578\t72\nchr5\t87470700\t87471000\t0.0274\t51\nchr5\t88904100\t88904400\t0.1865\t37\nchr5\t90075300\t90075900\t0.1149\t68\nchr5\t90212400\t90212700\t0.1132\t55\nchr5\t90443400\t90443700\t0.0229\t85\nchr5\t92194800\t92195100\t0.1237\t64\nchr5\t92197500\t92198100\t0.0126\t88\nchr5\t92300400\t92300700\t0.0818\t55\nchr5\t93213900\t93214800\t0.0468\t93\nchr5\t93262200\t93264300\t0.0976\t86\nchr5\t93265800\t93266100\t0.1218\t51\nchr5\t95492400\t95492700\t0.0796\t251\nchr5\t96104700\t96105000\t0.0657\t53\nchr5\t96106800\t96107100\t0.2258\t58\nchr5\t97518000\t97518600\t0.1031\t80\nchr5\t98548500\t98548800\t0.1408\t25\nchr5\t98550600\t98550900\t0.0426\t65\nchr5\t98552100\t98552400\t0.0426\t65\nchr5\t99401700\t99402000\t0.0156\t50\nchr5\t99410100\t99411600\t0.0368\t67\nchr5\t99426000\t99426300\t0.1204\t13\nchr5\t99427500\t99430500\t0\t74\nchr5\t99498900\t99499800\t0\t67\nchr5\t99518400\t99518700\t0.151\t66\nchr5\t99537600\t99537900\t0.0409\t48\nchr5\t99539100\t99539400\t0.0805\t51\nchr5\t99576600\t99576900\t0.1045\t66\nchr5\t99691500\t99692400\t0.1197\t74\nchr5\t99735300\t99735600\t0.0489\t70\nchr5\t99857100\t99858300\t0.0088\t74\nchr5\t99859800\t99861600\t0.0088\t74\nchr5\t99898200\t99898500\t0.1137\t45\nchr5\t100058100\t100058400\t0.0352\t55\nchr5\t100062300\t100062600\t0.1254\t72\nchr5\t100075500\t100076100\t0.0021\t71\nchr5\t100335300\t100338300\t0\t67\nchr5\t100340400\t100340700\t0.1857\t60\nchr5\t100349400\t100349700\t0.0038\t37\nchr5\t100353600\t100355400\t0.0418\t67\nchr5\t100363200\t100363500\t0.0095\t50\nchr5\t100375500\t100375800\t0.1989\t77\nchr5\t100396200\t100396500\t0.0362\t52\nchr5\t100423800\t100424100\t0.202\t20\nchr5\t101302800\t101303400\t0.1365\t81\nchr5\t102132000\t102136800\t0\t82\nchr5\t102190500\t102194100\t0.0006\t76\nchr5\t102675600\t102675900\t0.1402\t42\nchr5\t103050600\t103050900\t0.0678\t44\nchr5\t104359800\t104360400\t0.0252\t73\nchr5\t104447100\t104447700\t0.0007\t90\nchr5\t104450700\t104451000\t0.1225\t34\nchr5\t104518800\t104524500\t0\t98\nchr5\t105513300\t105513900\t0.1262\t74\nchr5\t105518100\t105518700\t0.0381\t77\nchr5\t106148400\t106149000\t0\t87\nchr5\t109259400\t109265100\t0\t95\nchr5\t109341600\t109341900\t0.2965\t42\nchr5\t109532100\t109532400\t0.2858\t38\nchr5\t110990100\t110990400\t0.1583\t44\nchr5\t111302400\t111308100\t0.0015\t102\nchr5\t114231000\t114231300\t0.0085\t47\nchr5\t115411800\t115412100\t0.1216\t57\nchr5\t115421400\t115421700\t0.1101\t67\nchr5\t117543600\t117543900\t0.1526\t59\nchr5\t118046100\t118046400\t0.0367\t25\nchr5\t118542000\t118542300\t0.1264\t91\nchr5\t119685000\t119687100\t0\t74\nchr5\t119689200\t119689500\t0\t74\nchr5\t120195300\t120195600\t0.1535\t77\nchr5\t120311700\t120312000\t0.062\t56\nchr5\t121411800\t121412100\t0.0899\t46\nchr5\t121952100\t121953000\t0.0038\t77\nchr5\t121996200\t121996800\t0.0444\t79\nchr5\t122240700\t122244900\t0.0007\t116\nchr5\t122379000\t122379600\t0.07\t74\nchr5\t123236700\t123238500\t0\t58\nchr5\t125360400\t125362200\t0.0051\t87\nchr5\t125364000\t125364300\t0.011\t43\nchr5\t125616000\t125616600\t0.0098\t187\nchr5\t126164100\t126164400\t0.2845\t17\nchr5\t126528900\t126529200\t0.2762\t89\nchr5\t126893700\t126894000\t0.0887\t71\nchr5\t126905100\t126905400\t0.055\t79\nchr5\t127734900\t127735200\t0.1571\t64\nchr5\t127748100\t127748400\t0.0279\t80\nchr5\t127879500\t127879800\t0.02\t69\nchr5\t128295600\t128295900\t0.0913\t78\nchr5\t129550200\t129550500\t0.1838\t30\nchr5\t129578100\t129578400\t0.1812\t61\nchr5\t130265400\t130265700\t0.1663\t107\nchr5\t130733700\t130734000\t0.1353\t73\nchr5\t130735500\t130737300\t0.0187\t71\nchr5\t131778600\t131778900\t0.2606\t60\nchr5\t132514500\t132519600\t0\t81\nchr5\t133109400\t133109700\t0.1967\t49\nchr5\t133583700\t133589100\t0\t91\nchr5\t133626000\t133626300\t0.2195\t11\nchr5\t134557500\t134558400\t0.0044\t56\nchr5\t134881200\t134881800\t0.0445\t71\nchr5\t137045400\t137050200\t0\t94\nchr5\t139005600\t139007100\t0.0097\t90\nchr5\t139083600\t139084500\t0\t75\nchr5\t140849100\t140849400\t0.0917\t68\nchr5\t142041900\t142042200\t0.068\t73\nchr5\t142043700\t142044000\t0.0436\t45\nchr5\t142075800\t142077000\t0\t48\nchr5\t144069900\t144071100\t0.1212\t43\nchr5\t144551400\t144553200\t0.0549\t63\nchr5\t144713700\t144717600\t0.0195\t87\nchr5\t144891000\t144892200\t0.106\t72\nchr5\t145149900\t145150800\t0\t71\nchr5\t145183200\t145183800\t0\t20\nchr5\t145372800\t145373100\t0.0903\t44\nchr5\t145420500\t145420800\t0.0792\t70\nchr5\t146610000\t146615400\t0\t80\nchr5\t146679000\t146679900\t0.0167\t77\nchr5\t147013500\t147013800\t0.0855\t58\nchr5\t147717000\t147717300\t0.0878\t70\nchr5\t147941700\t147942000\t0.135\t76\nchr5\t147945600\t147945900\t0.1757\t89\nchr5\t147958800\t147960300\t0.0329\t73\nchr5\t148022700\t148023900\t0.0146\t75\nchr5\t148233300\t148233600\t0.0872\t24\nchr5\t148252500\t148252800\t0\t38\nchr5\t148612500\t148612800\t0.1717\t72\nchr5\t152076900\t152082900\t0\t80\nchr5\t152209500\t152209800\t0.0019\t73\nchr5\t152211000\t152212800\t0.0019\t73\nchr5\t152340300\t152342100\t0\t65\nchr5\t152343300\t152345400\t0\t73\nchr5\t152742300\t152743800\t0.1046\t50\nchr5\t152886600\t152891400\t0\t105\nchr5\t152940000\t152940300\t0.0218\t76\nchr5\t153036900\t153037200\t0.1133\t78\nchr5\t153071400\t153072000\t0\t84\nchr5\t153073200\t153075900\t0\t84\nchr5\t155612100\t155612400\t0.0378\t47\nchr5\t155615400\t155615700\t0.1826\t42\nchr5\t155660100\t155660700\t0.0799\t72\nchr5\t156062100\t156067200\t0\t82\nchr5\t156657900\t156659400\t0.001\t90\nchr5\t156660600\t156661500\t0\t114\nchr5\t156663900\t156664800\t0.0622\t62\nchr5\t156666000\t156666600\t0.0104\t80\nchr5\t157437000\t157438800\t0.0034\t85\nchr5\t159036600\t159037500\t0.0043\t70\nchr5\t160710000\t160714500\t0\t85\nchr5\t160875000\t160876200\t0.0064\t67\nchr5\t160878900\t160879200\t0.0668\t75\nchr5\t161712000\t161712300\t0.0739\t126\nchr5\t162906300\t162906600\t0.0231\t36\nchr5\t163059900\t163060200\t0.0102\t41\nchr5\t166141800\t166142100\t0.0351\t58\nchr5\t166144200\t166144800\t0.0086\t84\nchr5\t166146000\t166146900\t0.0136\t111\nchr5\t166420800\t166421400\t0.0059\t89\nchr5\t166967100\t166972800\t0\t89\nchr5\t167860500\t167860800\t0.1111\t75\nchr5\t168145200\t168145500\t0.0537\t81\nchr5\t168717000\t168717300\t0.0701\t68\nchr5\t168741900\t168742200\t0.1263\t60\nchr5\t169665000\t169665300\t0.092\t20\nchr5\t170242200\t170242500\t0.1802\t59\nchr5\t171059700\t171060300\t0.0373\t68\nchr5\t171084600\t171086100\t0\t84\nchr5\t171404400\t171404700\t0.12\t51\nchr5\t173403000\t173408700\t0\t87\nchr5\t173462700\t173463000\t0.124\t37\nchr5\t174018900\t174019200\t0.1473\t88\nchr5\t175137900\t175138200\t0.071\t37\nchr5\t175401600\t175402200\t0.0277\t147\nchr5\t175917600\t175918500\t0.0621\t69\nchr5\t175941300\t175941600\t0.1872\t41\nchr5\t175946700\t175948200\t0.0141\t68\nchr5\t175949400\t175949700\t0.0141\t68\nchr5\t175954500\t175954800\t0.0734\t61\nchr5\t175956000\t175956900\t0\t66\nchr5\t175964700\t175965000\t0.1657\t56\nchr5\t175969200\t175969800\t0.0158\t58\nchr5\t175972500\t175973100\t0\t54\nchr5\t175974900\t175975500\t0.0031\t54\nchr5\t175977900\t175981800\t0\t79\nchr5\t175983000\t175990200\t0\t79\nchr5\t175991400\t175998600\t0\t63\nchr5\t176000400\t176000700\t0\t63\nchr5\t176014800\t176021700\t0\t85\nchr5\t176025000\t176032500\t0\t72\nchr5\t176033700\t176034600\t0\t109\nchr5\t176046000\t176047800\t0.0065\t71\nchr5\t176059200\t176060700\t0.0011\t52\nchr5\t176063100\t176063400\t0.0118\t40\nchr5\t176065800\t176066100\t0.1879\t44\nchr5\t176067600\t176067900\t0.0076\t58\nchr5\t176075100\t176075400\t0.1269\t82\nchr5\t176082000\t176082600\t0.0073\t48\nchr5\t176089200\t176090700\t0\t62\nchr5\t176092800\t176096400\t0\t76\nchr5\t176097900\t176098500\t0\t66\nchr5\t176102100\t176102700\t0\t77\nchr5\t176106000\t176107200\t0.0628\t76\nchr5\t176111100\t176113500\t0\t76\nchr5\t176117400\t176118300\t0.0331\t59\nchr5\t176123400\t176123700\t0.0613\t64\nchr5\t176196300\t176196600\t0.1025\t65\nchr5\t176215800\t176216100\t0.0348\t68\nchr5\t176227500\t176227800\t0.0034\t50\nchr5\t176238900\t176241300\t0\t64\nchr5\t176244000\t176244300\t0.0114\t61\nchr5\t176266500\t176267100\t0.0347\t60\nchr5\t176278200\t176278800\t0.0284\t67\nchr5\t176871300\t176871600\t0.1837\t30\nchr5\t176960700\t176963100\t0.0085\t60\nchr5\t177517800\t177518700\t0\t28\nchr5\t177643800\t177645600\t0.0012\t49\nchr5\t177666300\t177666600\t0.0268\t69\nchr5\t177671700\t177672000\t0.0097\t68\nchr5\t177682500\t177683100\t0\t68\nchr5\t177694500\t177694800\t0.0395\t67\nchr5\t177714600\t177714900\t0.0171\t62\nchr5\t177717900\t177718200\t0.0116\t53\nchr5\t177719700\t177721500\t0\t69\nchr5\t177724500\t177724800\t0.067\t81\nchr5\t177726600\t177726900\t0.067\t81\nchr5\t177731700\t177732000\t0.0062\t72\nchr5\t177735300\t177736200\t0\t74\nchr5\t177739800\t177740400\t0.0004\t68\nchr5\t177741600\t177745500\t0\t79\nchr5\t177748200\t177748500\t0.1482\t69\nchr5\t177752100\t177752400\t0.0087\t62\nchr5\t177760500\t177760800\t0.0034\t77\nchr5\t177762000\t177763500\t0.0034\t77\nchr5\t177766800\t177767400\t0.0197\t63\nchr5\t177772500\t177778200\t0\t102\nchr5\t177780900\t177781200\t0.0914\t55\nchr5\t177796200\t177796800\t0.0089\t66\nchr5\t177798600\t177799200\t0.0056\t68\nchr5\t177801000\t177801300\t0.006\t33\nchr5\t177802800\t177803100\t0\t19\nchr5\t177809700\t177819300\t0\t75\nchr5\t177822300\t177830700\t0\t77\nchr5\t177833700\t177834300\t0.0272\t75\nchr5\t177843000\t177843300\t0.2214\t56\nchr5\t177845100\t177845700\t0.05\t58\nchr5\t177859500\t177865800\t0\t74\nchr5\t177868200\t177868800\t0\t59\nchr5\t177870600\t177871200\t0\t59\nchr5\t177873900\t177874500\t0\t59\nchr5\t177878700\t177880200\t0.119\t65\nchr5\t177885300\t177887700\t0\t76\nchr5\t177888900\t177889500\t0\t76\nchr5\t177894000\t177894300\t0.0651\t67\nchr5\t177895500\t177896100\t0.0055\t74\nchr5\t177900600\t177902700\t0\t55\nchr5\t177904200\t177905700\t0\t36\nchr5\t177909600\t177909900\t0.0199\t20\nchr5\t177920400\t177921600\t0.0381\t57\nchr5\t177929100\t177929400\t0.1378\t46\nchr5\t177942300\t177942900\t0.0066\t59\nchr5\t177948900\t177949200\t0.0846\t28\nchr5\t177961800\t177962400\t0.0048\t138\nchr5\t178006200\t178006500\t0.1297\t42\nchr5\t178013100\t178013700\t0.0391\t78\nchr5\t178016400\t178017000\t0.0768\t75\nchr5\t178020000\t178023300\t0.0038\t75\nchr5\t178031400\t178031700\t0.0525\t62\nchr5\t178032900\t178033200\t0.0596\t63\nchr5\t178035000\t178036500\t0.0798\t78\nchr5\t178038600\t178039200\t0.0339\t63\nchr5\t178045800\t178046100\t0.0563\t61\nchr5\t178050000\t178051500\t0.0101\t68\nchr5\t178052700\t178053300\t0.0582\t63\nchr5\t178095600\t178096500\t0.1855\t23\nchr5\t178395000\t178396800\t0\t29\nchr5\t178525200\t178525800\t0.0081\t146\nchr5\t178900500\t178900800\t0.1652\t43\nchr5\t179447100\t179448900\t0\t65\nchr5\t179502900\t179503500\t0.0016\t68\nchr5\t179517000\t179517300\t0.2135\t58\nchr5\t179634300\t179637000\t0\t83\nchr5\t179644200\t179644500\t0.0847\t22\nchr5\t179646300\t179646600\t0.0184\t76\nchr5\t179655600\t179658300\t0\t90\nchr5\t180486000\t180486300\t0.1785\t43\nchr5\t180617400\t180617700\t0.2608\t41\nchr5\t180903300\t180903900\t0.0677\t77\nchr5\t180905400\t180905700\t0.0677\t77\nchr5\t181089000\t181091400\t0\t90\nchr5\t181096200\t181098000\t0\t70\nchr5\t181101600\t181103400\t0\t74\nchr5\t181293000\t181294800\t0\t80\nchr5\t181296000\t181299300\t0\t80\nchr5\t181302900\t181303200\t0\t88\nchr5\t181304700\t181356300\t0\t88\nchr5\t181357500\t181361400\t0\t156\nchr5\t181362600\t181473000\t0\t156\nchr5\t181474200\t181478400\t0\t156\nchr6\t60000\t90000\t0\t67\nchr6\t91200\t92700\t0\t67\nchr6\t93900\t95400\t0\t48\nchr6\t97200\t100200\t0.0025\t48\nchr6\t101700\t102000\t0\t84\nchr6\t103200\t120900\t0\t84\nchr6\t122700\t123900\t0.007\t63\nchr6\t126000\t126600\t0.007\t63\nchr6\t127800\t131400\t0\t73\nchr6\t132600\t144000\t0\t73\nchr6\t145200\t146100\t0\t73\nchr6\t519300\t520500\t0\t53\nchr6\t601500\t602400\t0\t84\nchr6\t861900\t863700\t0\t432\nchr6\t909600\t910500\t0\t37\nchr6\t1142100\t1142400\t0.2636\t118\nchr6\t1319100\t1320900\t0\t42\nchr6\t1432200\t1432500\t0.0582\t62\nchr6\t2418000\t2423700\t0\t87\nchr6\t3090900\t3093900\t0\t43\nchr6\t3153900\t3154500\t0.1225\t75\nchr6\t3225000\t3225300\t0.0508\t68\nchr6\t4194000\t4194300\t0.0713\t65\nchr6\t4329300\t4329600\t0.0691\t69\nchr6\t5037300\t5037600\t0.1734\t66\nchr6\t6142500\t6143400\t0.1151\t93\nchr6\t6214800\t6215100\t0.0684\t73\nchr6\t6261600\t6262200\t0.0069\t196\nchr6\t7717200\t7717500\t0.1653\t36\nchr6\t8216700\t8217300\t0.0513\t69\nchr6\t8567100\t8567400\t0.1709\t64\nchr6\t8770800\t8775300\t0\t80\nchr6\t8827800\t8828100\t0.265\t61\nchr6\t9813000\t9813300\t0.0706\t63\nchr6\t9970200\t9970500\t0.0997\t79\nchr6\t15188700\t15189000\t0.2131\t49\nchr6\t15984000\t15984300\t0.2923\t39\nchr6\t16013700\t16014000\t0.1394\t94\nchr6\t16860900\t16861500\t0\t87\nchr6\t17435100\t17435400\t0.2116\t72\nchr6\t18910800\t18912900\t0\t74\nchr6\t19347300\t19347600\t0.018\t23\nchr6\t19765200\t19770900\t0\t74\nchr6\t20615100\t20615700\t0.0346\t61\nchr6\t20959500\t20959800\t0.0644\t850\nchr6\t22176300\t22177200\t0.0258\t64\nchr6\t22930200\t22930500\t0.1429\t23\nchr6\t23232900\t23233200\t0.1267\t66\nchr6\t23948700\t23949300\t0\t25\nchr6\t24469200\t24469500\t0.1092\t54\nchr6\t24811800\t24817500\t0\t88\nchr6\t26634600\t26635800\t0.0151\t62\nchr6\t26637000\t26637900\t0.0305\t69\nchr6\t26671200\t26709600\t0\t82\nchr6\t26711100\t26738700\t0\t82\nchr6\t26746800\t26747100\t0.1105\t46\nchr6\t26751900\t26752500\t0\t48\nchr6\t26763000\t26790900\t0\t76\nchr6\t26792100\t26830500\t0\t76\nchr6\t26844000\t26844300\t0.0693\t55\nchr6\t26885100\t26885400\t0.0762\t131\nchr6\t27484200\t27486000\t0.1521\t68\nchr6\t28026000\t28026300\t0.074\t115\nchr6\t29115600\t29115900\t0.1653\t84\nchr6\t29123100\t29123400\t0.004\t60\nchr6\t29194200\t29194800\t0.0054\t59\nchr6\t29717700\t29719800\t0\t28\nchr6\t29847300\t29847600\t0.1708\t19\nchr6\t29933400\t29933700\t0\t21\nchr6\t30249600\t30249900\t0.1664\t54\nchr6\t31244100\t31245300\t0\t45\nchr6\t31454100\t31454400\t0.088\t49\nchr6\t31486200\t31486500\t0.1163\t71\nchr6\t31815900\t31817400\t0\t72\nchr6\t31828200\t31829400\t0\t75\nchr6\t31854600\t31854900\t0.1357\t42\nchr6\t31980900\t31995600\t0\t81\nchr6\t31996800\t32004300\t0\t78\nchr6\t32009100\t32028300\t0\t80\nchr6\t32030400\t32036700\t0\t78\nchr6\t32041800\t32045700\t0\t75\nchr6\t32579700\t32580000\t0.0357\t15\nchr6\t33484500\t33484800\t0.0464\t77\nchr6\t33525600\t33525900\t0.257\t65\nchr6\t34397100\t34397400\t0.0343\t33\nchr6\t35136600\t35136900\t0.0616\t20\nchr6\t35827500\t35828700\t0.0077\t71\nchr6\t38963700\t38964300\t0\t60\nchr6\t39456000\t39456300\t0.0572\t71\nchr6\t39458700\t39459900\t0\t69\nchr6\t41985600\t41985900\t0.1198\t29\nchr6\t42286500\t42286800\t0.1004\t64\nchr6\t44752800\t44753100\t0.1215\t83\nchr6\t44871300\t44876400\t0\t107\nchr6\t45066600\t45066900\t0.1079\t82\nchr6\t45673800\t45674400\t0.0291\t96\nchr6\t46213800\t46214400\t0.0346\t73\nchr6\t47051100\t47051400\t0.2321\t52\nchr6\t47505900\t47506500\t0.105\t74\nchr6\t47889000\t47889300\t0.1394\t47\nchr6\t48365100\t48367200\t0.0464\t77\nchr6\t48739200\t48740400\t0.0812\t107\nchr6\t48741900\t48742200\t0.095\t58\nchr6\t48901500\t48902100\t0.0042\t79\nchr6\t49765800\t49766100\t0.1187\t92\nchr6\t50894400\t50894700\t0.2071\t54\nchr6\t51875100\t51880500\t0\t94\nchr6\t51981900\t51982200\t0.2871\t15\nchr6\t52757100\t52757400\t0.0548\t47\nchr6\t52798500\t52798800\t0.1698\t45\nchr6\t54838500\t54839100\t0.0611\t79\nchr6\t54963900\t54964200\t0.1982\t26\nchr6\t54966000\t54966600\t0.0537\t82\nchr6\t54999600\t54999900\t0.0547\t18\nchr6\t55365300\t55365600\t0.1562\t63\nchr6\t55366800\t55367100\t0.1145\t83\nchr6\t55543200\t55543500\t0.0161\t132\nchr6\t55648500\t55648800\t0.2939\t60\nchr6\t56893800\t56894100\t0.027\t43\nchr6\t56895300\t56895900\t0.0002\t42\nchr6\t57047100\t57048000\t0\t71\nchr6\t57090600\t57091500\t0\t69\nchr6\t57404100\t57404400\t0.1455\t14\nchr6\t57798300\t57799500\t0\t50\nchr6\t57821100\t57822300\t0.0498\t47\nchr6\t58449900\t58453500\t0\t2483\nchr6\t58554000\t58554300\t0.085\t58\nchr6\t58556400\t58594500\t0\t677\nchr6\t58595700\t59417400\t0\t4133\nchr6\t59418600\t59508000\t0\t4133\nchr6\t59509500\t59652000\t0\t4686\nchr6\t59653500\t59829900\t0\t4686\nchr6\t60280500\t60280800\t0.0624\t36\nchr6\t60306300\t60306900\t0\t62\nchr6\t60459000\t60459300\t0.1869\t58\nchr6\t60510600\t60510900\t0.0481\t60\nchr6\t60533700\t60534300\t0\t43\nchr6\t60704100\t60704400\t0.1224\t68\nchr6\t60861300\t60861900\t0.0555\t82\nchr6\t60863100\t60863400\t0.0555\t82\nchr6\t61323000\t61356900\t0\t78\nchr6\t61425300\t61473300\t0\t94\nchr6\t61480800\t61492800\t0\t38\nchr6\t61673400\t61673700\t0.1961\t63\nchr6\t64942200\t64942500\t0.1266\t48\nchr6\t65256600\t65256900\t0.0787\t82\nchr6\t65304300\t65304900\t0.1183\t78\nchr6\t65550600\t65552100\t0\t66\nchr6\t66078000\t66078300\t0.0806\t60\nchr6\t66603000\t66603300\t0.1241\t63\nchr6\t68432400\t68433000\t0.0257\t62\nchr6\t68517900\t68518200\t0.0584\t66\nchr6\t69519600\t69520500\t0.1506\t60\nchr6\t70011000\t70016100\t0\t93\nchr6\t71128500\t71128800\t0.1723\t76\nchr6\t72571200\t72575700\t0\t96\nchr6\t72989100\t72994500\t0\t90\nchr6\t73436400\t73436700\t0.0533\t563\nchr6\t73920300\t73920600\t0.1106\t85\nchr6\t74098200\t74099400\t0.1272\t54\nchr6\t74155800\t74156700\t0\t88\nchr6\t74209200\t74209800\t0.2002\t86\nchr6\t74247000\t74247300\t0.1077\t44\nchr6\t75248100\t75248400\t0.0856\t22\nchr6\t76109100\t76109400\t0.0177\t84\nchr6\t76964400\t76964700\t0.0584\t63\nchr6\t76977000\t76977300\t0.0957\t65\nchr6\t77043900\t77044500\t0.0338\t73\nchr6\t77591100\t77591400\t0.0826\t12\nchr6\t77717100\t77718300\t0\t120\nchr6\t77719800\t77721900\t0\t120\nchr6\t77723400\t77726100\t0\t120\nchr6\t78859200\t78859500\t0.0289\t68\nchr6\t80571000\t80571600\t0.0334\t69\nchr6\t80802300\t80803800\t0.0437\t83\nchr6\t80917200\t80917500\t0\t89\nchr6\t80919000\t80920800\t0\t89\nchr6\t82392300\t82392600\t0.1679\t45\nchr6\t82394100\t82394400\t0.0308\t24\nchr6\t82560600\t82561200\t0.0628\t69\nchr6\t83318400\t83319000\t0.0844\t70\nchr6\t83334300\t83339700\t0\t75\nchr6\t83798100\t83798400\t0.0641\t86\nchr6\t83800200\t83800500\t0.0656\t77\nchr6\t84608700\t84609000\t0\t53\nchr6\t84610200\t84614400\t0\t53\nchr6\t84628800\t84629100\t0.0817\t53\nchr6\t84630300\t84630600\t0.0817\t53\nchr6\t85986300\t85986600\t0\t68\nchr6\t85999200\t86004600\t0\t84\nchr6\t86052600\t86052900\t0.1047\t23\nchr6\t86646900\t86647800\t0.0019\t81\nchr6\t86667300\t86667600\t0.2147\t56\nchr6\t86811000\t86811600\t0.1674\t76\nchr6\t87327600\t87327900\t0.1709\t92\nchr6\t87750600\t87750900\t0.0526\t66\nchr6\t88381800\t88382100\t0.0092\t87\nchr6\t88947000\t88949100\t0.0183\t94\nchr6\t89225400\t89230200\t0\t80\nchr6\t93636000\t93636300\t0.1458\t66\nchr6\t93865800\t93871500\t0.0015\t112\nchr6\t94198200\t94203900\t0\t71\nchr6\t95665500\t95665800\t0\t56\nchr6\t95667000\t95667300\t0\t56\nchr6\t95760600\t95762700\t0.0022\t88\nchr6\t95981100\t95983800\t0.053\t109\nchr6\t98417100\t98417400\t0.1534\t66\nchr6\t98420100\t98421000\t0.0038\t79\nchr6\t99825300\t99825600\t0.0017\t104\nchr6\t99828300\t99829200\t0.0591\t58\nchr6\t100200000\t100200300\t0.0371\t68\nchr6\t100201800\t100202100\t0.0995\t75\nchr6\t100358700\t100359000\t0.1343\t71\nchr6\t102464100\t102464400\t0.0748\t49\nchr6\t102755100\t102755400\t0.0616\t69\nchr6\t103654800\t103655100\t0.0509\t57\nchr6\t103710000\t103710300\t0.0353\t85\nchr6\t103711500\t103714500\t0.0353\t85\nchr6\t104452800\t104456100\t0\t98\nchr6\t104490900\t104494500\t0\t84\nchr6\t105823800\t105824100\t0.1556\t17\nchr6\t106402200\t106402500\t0.0801\t70\nchr6\t106720800\t106721100\t0.0561\t63\nchr6\t107783100\t107783400\t0.0725\t50\nchr6\t107858100\t107858400\t0.0829\t79\nchr6\t107859600\t107859900\t0.0914\t95\nchr6\t109246500\t109247700\t0.0965\t58\nchr6\t109249500\t109249800\t0.0859\t65\nchr6\t109621200\t109621500\t0.0213\t67\nchr6\t110155800\t110158200\t0\t69\nchr6\t111904200\t111904500\t0.1098\t75\nchr6\t111906900\t111907500\t0.0385\t75\nchr6\t112508400\t112508700\t0.0576\t65\nchr6\t112704000\t112709100\t0\t104\nchr6\t112815000\t112818000\t0\t70\nchr6\t112872300\t112872600\t0.0398\t83\nchr6\t112915800\t112918200\t0.0019\t74\nchr6\t113228100\t113229000\t0.0377\t64\nchr6\t113535900\t113536200\t0.0703\t80\nchr6\t113606100\t113607300\t0.0141\t78\nchr6\t114722400\t114723000\t0\t65\nchr6\t114801600\t114802200\t0.0396\t63\nchr6\t115010700\t115011000\t0.0367\t58\nchr6\t115085400\t115085700\t0.1162\t62\nchr6\t115579200\t115579500\t0.053\t66\nchr6\t115960800\t115965900\t0\t127\nchr6\t116822100\t116822400\t0.134\t70\nchr6\t117092400\t117093000\t0.1095\t85\nchr6\t117102300\t117108000\t0\t69\nchr6\t117246600\t117247200\t0\t35\nchr6\t117250200\t117250500\t0.1514\t68\nchr6\t121162800\t121168200\t0\t97\nchr6\t122847900\t122848500\t0.1044\t74\nchr6\t122889300\t122889600\t0.079\t112\nchr6\t123180900\t123181500\t0.0749\t61\nchr6\t123445500\t123445800\t0.0321\t80\nchr6\t123475500\t123475800\t0.1435\t78\nchr6\t124165800\t124166100\t0.0637\t92\nchr6\t124177800\t124178100\t0.1002\t20\nchr6\t124728300\t124728600\t0.0543\t57\nchr6\t124840200\t124841100\t0.0048\t70\nchr6\t125288700\t125289000\t0.1746\t219\nchr6\t125319300\t125321700\t0.0003\t82\nchr6\t125387700\t125389800\t0\t54\nchr6\t127596000\t127596300\t0.1972\t79\nchr6\t128668800\t128669100\t0.2237\t55\nchr6\t128906100\t128906400\t0.0526\t87\nchr6\t128998500\t129004200\t0\t86\nchr6\t129171600\t129171900\t0.1454\t86\nchr6\t131143800\t131144100\t0.1589\t69\nchr6\t131698500\t131701200\t0\t101\nchr6\t131704200\t131705400\t0.0098\t76\nchr6\t131709000\t131709300\t0.1012\t71\nchr6\t133020900\t133026600\t0\t93\nchr6\t133470300\t133472700\t0\t67\nchr6\t133521600\t133521900\t0.0836\t93\nchr6\t133650600\t133651200\t0.0038\t83\nchr6\t133652400\t133653000\t0.0038\t83\nchr6\t133664100\t133665900\t0.0039\t74\nchr6\t134659500\t134659800\t0.0764\t65\nchr6\t136851300\t136852800\t0.0091\t74\nchr6\t140681100\t140683200\t0\t58\nchr6\t140877900\t140878200\t0.1244\t75\nchr6\t141567600\t141571500\t0.0207\t128\nchr6\t141619200\t141619800\t0.0675\t57\nchr6\t141918300\t141918600\t0.036\t87\nchr6\t141920400\t141920700\t0.2144\t63\nchr6\t141922200\t141922500\t0.0347\t61\nchr6\t141927300\t141927900\t0.0047\t68\nchr6\t142424100\t142424400\t0.0632\t79\nchr6\t145073100\t145073700\t0.1134\t72\nchr6\t145503600\t145505100\t0.0346\t68\nchr6\t145665000\t145666500\t0.0236\t80\nchr6\t145770000\t145770300\t0.019\t65\nchr6\t145852800\t145853100\t0.1629\t77\nchr6\t148160400\t148160700\t0.0671\t65\nchr6\t148738200\t148738800\t0\t52\nchr6\t150022200\t150023100\t0.075\t59\nchr6\t151848000\t151848300\t0.1339\t51\nchr6\t151932300\t151932600\t0.099\t82\nchr6\t152709000\t152712600\t0\t69\nchr6\t152987700\t152989500\t0.0146\t55\nchr6\t154524900\t154525200\t0.2254\t83\nchr6\t156034500\t156039900\t0\t77\nchr6\t156325200\t156330000\t0.013\t69\nchr6\t156362400\t156365700\t0\t95\nchr6\t157311300\t157312200\t0.1232\t217\nchr6\t158127300\t158127900\t0\t48\nchr6\t158238600\t158240400\t0.0125\t60\nchr6\t159547500\t159549600\t0.0104\t67\nchr6\t160100700\t160101000\t0.1063\t434\nchr6\t160409100\t160409400\t0.1139\t50\nchr6\t160611900\t160631400\t0\t270\nchr6\t160632600\t160646700\t0\t282\nchr6\t161646000\t161646300\t0.2316\t45\nchr6\t161874000\t161874300\t0\t114\nchr6\t161900400\t161900700\t0.1605\t28\nchr6\t161982300\t161983800\t0\t86\nchr6\t162839100\t162840900\t0\t71\nchr6\t162842700\t162844200\t0.061\t108\nchr6\t162990900\t162991800\t0.0015\t78\nchr6\t162993900\t162994200\t0.1138\t84\nchr6\t164798100\t164798400\t0.1733\t86\nchr6\t165123300\t165123600\t0.131\t83\nchr6\t165303600\t165306300\t0\t81\nchr6\t166426500\t166426800\t0.0281\t45\nchr6\t166428300\t166428600\t0.1091\t133\nchr6\t166585800\t166586100\t0.0225\t56\nchr6\t167176500\t167176800\t0.0701\t64\nchr6\t167181900\t167182200\t0.0968\t50\nchr6\t167319600\t167319900\t0.1408\t48\nchr6\t167332500\t167334900\t0.084\t94\nchr6\t167376600\t167376900\t0.0005\t19\nchr6\t167381100\t167381400\t0.1818\t53\nchr6\t167423700\t167424000\t0.1499\t17\nchr6\t167941200\t167941500\t0.1299\t24\nchr6\t167977500\t167977800\t0.2755\t60\nchr6\t168246000\t168246300\t0.2571\t69\nchr6\t168316500\t168317700\t0\t80\nchr6\t168560700\t168561900\t0.0944\t28\nchr6\t168592800\t168593700\t0.0205\t105\nchr6\t168654600\t168655200\t0.0073\t72\nchr6\t168846900\t168847500\t0.1791\t138\nchr6\t168976800\t168977100\t0.0725\t74\nchr6\t168978300\t168978600\t0.1018\t47\nchr6\t169032900\t169033200\t0.1067\t33\nchr6\t169987800\t169988400\t0.1783\t19\nchr6\t170064900\t170065200\t0.2219\t28\nchr6\t170145900\t170146500\t0.1753\t220\nchr6\t170214900\t170215500\t0\t115\nchr6\t170217000\t170220600\t0\t115\nchr6\t170246400\t170246700\t0.0675\t20\nchr6\t170612700\t170626200\t0\t88\nchr6\t170627700\t170699700\t0\t88\nchr6\t170700900\t170701200\t0\t88\nchr6\t170703300\t170705700\t0\t33\nchr6\t170706900\t170707200\t0.0012\t66\nchr6\t170708400\t170709900\t0.0012\t66\nchr6\t170712600\t170713500\t0\t111\nchr6\t170715000\t170730300\t0\t111\nchr6\t170731800\t170736600\t0\t41\nchr6\t170738700\t170745900\t0\t75\nchr7\t9900\t30600\t0\t109\nchr7\t31800\t32700\t0\t109\nchr7\t36300\t36900\t0.0115\t95\nchr7\t47400\t48000\t0.0555\t77\nchr7\t49200\t49500\t0.0555\t77\nchr7\t73200\t73500\t0.1026\t51\nchr7\t103500\t103800\t0.0292\t23\nchr7\t215700\t216000\t0.2207\t12\nchr7\t221400\t222000\t0\t22\nchr7\t243300\t243600\t0.0643\t29\nchr7\t361500\t361800\t0.2079\t30\nchr7\t419700\t420000\t0.2812\t24\nchr7\t470400\t471000\t0.1143\t12\nchr7\t478800\t479100\t0.2156\t15\nchr7\t636000\t636300\t0.1177\t51\nchr7\t747900\t748200\t0.0804\t29\nchr7\t990000\t990300\t0.2444\t18\nchr7\t1037700\t1038000\t0.0868\t91\nchr7\t1039500\t1039800\t0.1137\t54\nchr7\t1107900\t1108200\t0.1939\t41\nchr7\t1116900\t1117200\t0.244\t105\nchr7\t1145400\t1147800\t0\t100\nchr7\t1156200\t1156500\t0.0433\t20\nchr7\t1272000\t1273200\t0.0192\t338\nchr7\t1319700\t1320300\t0.0851\t55\nchr7\t1861500\t1861800\t0.0133\t56\nchr7\t1929900\t1930200\t0.264\t17\nchr7\t1937700\t1938000\t0.0247\t68\nchr7\t1990800\t1991400\t0\t67\nchr7\t2035500\t2035800\t0\t17\nchr7\t2278800\t2279100\t0.2426\t21\nchr7\t3708300\t3708600\t0.0944\t61\nchr7\t3815100\t3815400\t0.1099\t49\nchr7\t3976200\t3977100\t0.0393\t150\nchr7\t4263600\t4263900\t0.235\t37\nchr7\t4545000\t4545300\t0.1479\t110\nchr7\t4582800\t4587300\t0\t89\nchr7\t4588800\t4599900\t0\t89\nchr7\t5121000\t5121300\t0.171\t60\nchr7\t5156400\t5156700\t0.0014\t21\nchr7\t5160300\t5160600\t0.0059\t26\nchr7\t5548800\t5549100\t0.2418\t40\nchr7\t5898900\t5899200\t0.0431\t68\nchr7\t5901000\t5901300\t0.1358\t28\nchr7\t5916900\t5917800\t0\t71\nchr7\t5921400\t5921700\t0.0114\t68\nchr7\t5923200\t5923500\t0.0114\t68\nchr7\t5924700\t5925300\t0.0084\t68\nchr7\t5929500\t5930700\t0\t80\nchr7\t5934000\t5937000\t0\t68\nchr7\t5938500\t5940900\t0.0032\t66\nchr7\t5945700\t5957700\t0\t75\nchr7\t5959200\t5960100\t0\t75\nchr7\t5961600\t5963100\t0\t56\nchr7\t5965200\t5965800\t0\t62\nchr7\t5967000\t5967900\t0\t72\nchr7\t5969100\t5972100\t0\t72\nchr7\t5973600\t5975700\t0\t72\nchr7\t5979900\t5980500\t0.0055\t60\nchr7\t6744600\t6744900\t0.0069\t65\nchr7\t6747900\t6751500\t0\t83\nchr7\t6752700\t6763500\t0\t83\nchr7\t6765000\t6780300\t0\t80\nchr7\t6783300\t6784500\t0\t80\nchr7\t6787800\t6792900\t0\t64\nchr7\t6794400\t6795600\t0\t64\nchr7\t6798000\t6800100\t0\t68\nchr7\t6801300\t6803400\t0\t62\nchr7\t6805200\t6807300\t0\t73\nchr7\t6809100\t6809400\t0.2101\t36\nchr7\t6825900\t6826200\t0.1925\t52\nchr7\t7465500\t7470600\t0\t87\nchr7\t7544400\t7545000\t0\t51\nchr7\t8303400\t8303700\t0.0384\t103\nchr7\t8352300\t8353800\t0.0927\t104\nchr7\t9400500\t9400800\t0.0164\t73\nchr7\t9402300\t9402600\t0.165\t64\nchr7\t9595200\t9596100\t0\t40\nchr7\t9808500\t9809100\t0.0109\t102\nchr7\t10166700\t10167900\t0.1348\t73\nchr7\t10170600\t10171200\t0.0227\t86\nchr7\t10464900\t10465200\t0.002\t34\nchr7\t12183000\t12183300\t0.114\t74\nchr7\t12485100\t12485700\t0.0209\t61\nchr7\t12501900\t12502200\t0.0403\t72\nchr7\t13085700\t13086000\t0.0857\t67\nchr7\t13630800\t13631100\t0.0632\t35\nchr7\t14211600\t14211900\t0.0039\t31\nchr7\t14282100\t14282400\t0.0461\t96\nchr7\t14316300\t14318100\t0.0044\t87\nchr7\t14650200\t14650500\t0.0571\t63\nchr7\t14706600\t14708100\t0.0319\t78\nchr7\t15529800\t15530400\t0.0058\t35\nchr7\t16197900\t16198500\t0.1405\t78\nchr7\t16218300\t16218900\t0.1509\t77\nchr7\t16220100\t16220700\t0.1044\t63\nchr7\t16789200\t16789800\t0\t58\nchr7\t18105300\t18105600\t0.2406\t47\nchr7\t18985800\t18986400\t0.0005\t61\nchr7\t19458900\t19459800\t0.105\t79\nchr7\t19683600\t19683900\t0.1765\t79\nchr7\t19686900\t19687200\t0.2136\t71\nchr7\t22532400\t22534200\t0\t70\nchr7\t23040000\t23040600\t0.0119\t104\nchr7\t23042100\t23042400\t0.0119\t104\nchr7\t23324400\t23325000\t0.0826\t105\nchr7\t24001500\t24004800\t0\t61\nchr7\t24355800\t24356100\t0.1198\t36\nchr7\t24638400\t24638700\t0.2392\t43\nchr7\t25005000\t25005300\t0\t12\nchr7\t25018200\t25019100\t0.0675\t38\nchr7\t25041900\t25047000\t0\t88\nchr7\t25601700\t25602300\t0.0765\t86\nchr7\t25605600\t25606200\t0.1153\t72\nchr7\t25607700\t25608900\t0.0005\t98\nchr7\t25744500\t25744800\t0.085\t62\nchr7\t25748700\t25749000\t0.1497\t99\nchr7\t28839000\t28839300\t0.1022\t68\nchr7\t29580600\t29580900\t0.0215\t151\nchr7\t29582400\t29583900\t0.0215\t151\nchr7\t29961300\t29961600\t0.109\t63\nchr7\t30056100\t30056400\t0.2721\t90\nchr7\t30416400\t30417000\t0.1592\t72\nchr7\t30439500\t30445200\t0\t122\nchr7\t30637200\t30638400\t0.0222\t92\nchr7\t30640200\t30641100\t0.0222\t92\nchr7\t31484400\t31485600\t0\t60\nchr7\t32350800\t32353500\t0\t87\nchr7\t32465400\t32465700\t0.0163\t71\nchr7\t32466900\t32467200\t0.0163\t71\nchr7\t32469300\t32469900\t0.0864\t86\nchr7\t32684400\t32684700\t0\t88\nchr7\t32698800\t32699100\t0.1687\t25\nchr7\t32712000\t32712900\t0\t68\nchr7\t32825100\t32825400\t0.0593\t86\nchr7\t33523200\t33524100\t0.002\t85\nchr7\t33525300\t33525600\t0.2088\t72\nchr7\t34200600\t34201800\t0.0535\t78\nchr7\t34267200\t34267500\t0.0598\t65\nchr7\t34517700\t34518600\t0.0327\t101\nchr7\t34790700\t34791000\t0.0705\t38\nchr7\t34800000\t34801200\t0\t32\nchr7\t34816200\t34817400\t0\t40\nchr7\t34907700\t34908000\t0.1849\t55\nchr7\t35116200\t35116500\t0.0565\t59\nchr7\t37298700\t37300500\t0\t72\nchr7\t37612500\t37612800\t0.1009\t106\nchr7\t38028600\t38029500\t0.0213\t110\nchr7\t39274500\t39274800\t0.0573\t76\nchr7\t39677400\t39677700\t0.0628\t47\nchr7\t39853200\t39853800\t0.003\t61\nchr7\t43063200\t43064100\t0.0833\t88\nchr7\t43413300\t43413600\t0.0142\t76\nchr7\t43415700\t43416000\t0.1324\t85\nchr7\t44002800\t44003100\t0.0402\t99\nchr7\t44198700\t44199000\t0.2556\t59\nchr7\t45083700\t45084300\t0\t58\nchr7\t46821300\t46825500\t0\t81\nchr7\t47111700\t47112000\t0\t10\nchr7\t48850800\t48851100\t0.0168\t44\nchr7\t48907800\t48908100\t0.096\t72\nchr7\t49534800\t49535100\t0.1129\t50\nchr7\t49680300\t49686300\t0\t86\nchr7\t51894600\t51894900\t0.0748\t24\nchr7\t52893000\t52893300\t0.1276\t75\nchr7\t53029200\t53029500\t0.1372\t47\nchr7\t54221400\t54222000\t0.0005\t67\nchr7\t54224400\t54230700\t0\t77\nchr7\t54311700\t54318300\t0\t76\nchr7\t54319500\t54321000\t0\t76\nchr7\t55219200\t55221000\t0.0054\t93\nchr7\t56370300\t56374800\t0\t2244\nchr7\t56586600\t56590200\t0.0033\t61\nchr7\t56748600\t56748900\t0.0147\t20\nchr7\t56750100\t56750700\t0.0367\t55\nchr7\t56813700\t56814000\t0.1092\t24\nchr7\t56817900\t56819100\t0\t86\nchr7\t56820300\t56821200\t0\t86\nchr7\t56822700\t56823000\t0\t86\nchr7\t56833800\t56834100\t0.0231\t62\nchr7\t56844900\t56845200\t0.012\t63\nchr7\t56848800\t56849100\t0.1799\t54\nchr7\t56852700\t56853000\t0.1036\t59\nchr7\t56866200\t56866500\t0.1263\t60\nchr7\t56868900\t56869200\t0.1263\t60\nchr7\t56878200\t56878800\t0.0009\t68\nchr7\t56884200\t56885700\t0\t72\nchr7\t56891100\t56891400\t0.029\t20\nchr7\t56902200\t56903700\t0.0097\t50\nchr7\t56907900\t56908200\t0.04\t65\nchr7\t56914500\t56914800\t0.0373\t39\nchr7\t56925000\t56930400\t0\t68\nchr7\t56931600\t56932500\t0\t61\nchr7\t56933700\t56944800\t0\t73\nchr7\t56946300\t56949000\t0\t64\nchr7\t56950500\t56951100\t0.0114\t71\nchr7\t56952900\t56953200\t0.021\t62\nchr7\t56955600\t56956200\t0\t58\nchr7\t56958300\t56961600\t0\t78\nchr7\t56962800\t56969400\t0\t78\nchr7\t56971200\t56973300\t0.0061\t65\nchr7\t56974800\t56993400\t0\t77\nchr7\t56997000\t56997300\t0\t53\nchr7\t57004800\t57005400\t0\t29\nchr7\t57007200\t57007500\t0\t15\nchr7\t57012000\t57012300\t0\t27\nchr7\t57014700\t57020700\t0\t70\nchr7\t57023100\t57026100\t0\t81\nchr7\t57027900\t57028200\t0\t84\nchr7\t57029700\t57036000\t0\t84\nchr7\t57037200\t57045000\t0\t67\nchr7\t57046500\t57047700\t0\t60\nchr7\t57050700\t57051300\t0\t60\nchr7\t57053400\t57053700\t0.1754\t57\nchr7\t57070500\t57074100\t0\t65\nchr7\t57077400\t57078600\t0.0104\t59\nchr7\t57079800\t57081000\t0\t57\nchr7\t57486300\t57486600\t0.2962\t219\nchr7\t57487800\t57488400\t0.1814\t475\nchr7\t57491700\t57492000\t0.1739\t557\nchr7\t57496200\t57496500\t0.1986\t335\nchr7\t57509100\t57509400\t0.123\t16\nchr7\t57611100\t57637500\t0\t163\nchr7\t57827700\t57853800\t0\t149\nchr7\t57898200\t57898500\t0.2466\t17\nchr7\t57983400\t57984900\t0.0118\t63\nchr7\t58170000\t58175400\t0\t148\nchr7\t58176600\t58177200\t0\t1017\nchr7\t58179300\t58184400\t0\t1017\nchr7\t58185600\t58188600\t0\t1801\nchr7\t58191300\t58515000\t0\t1801\nchr7\t58516200\t58541100\t0\t1801\nchr7\t58542300\t58727100\t0\t1010\nchr7\t58728600\t58796100\t0\t4073\nchr7\t58797300\t58912200\t0\t4073\nchr7\t58913400\t58922100\t0\t4073\nchr7\t58923300\t58926900\t0\t4073\nchr7\t58928100\t59028900\t0\t4073\nchr7\t59030100\t59112000\t0\t4073\nchr7\t59113500\t59127600\t0\t4073\nchr7\t59128800\t59249100\t0\t1772\nchr7\t59250300\t59253900\t0\t1772\nchr7\t59255100\t59355300\t0\t2549\nchr7\t59356500\t59509200\t0\t4155\nchr7\t59511300\t59680800\t0\t321\nchr7\t59682600\t59752800\t0\t2715\nchr7\t59754000\t59824500\t0\t2715\nchr7\t59826000\t59848800\t0\t2715\nchr7\t59850000\t59888400\t0\t2471\nchr7\t59889600\t59891400\t0\t2471\nchr7\t59892600\t59951400\t0\t2471\nchr7\t59952600\t59958600\t0\t2471\nchr7\t59959800\t60038100\t0\t2471\nchr7\t60039300\t60117600\t0\t854\nchr7\t60118800\t60121200\t0\t1800\nchr7\t60123000\t60303900\t0\t1800\nchr7\t60305100\t60421500\t0\t1800\nchr7\t60423300\t60469800\t0\t503\nchr7\t60471000\t60478200\t0\t503\nchr7\t60480000\t60480300\t0\t14\nchr7\t60481500\t60544200\t0\t1901\nchr7\t60545400\t60573000\t0\t1901\nchr7\t60574200\t60735000\t0\t1094\nchr7\t60736200\t60828300\t0\t1355\nchr7\t60878400\t60894000\t0\t68\nchr7\t60895200\t60911100\t0\t68\nchr7\t61072800\t61074900\t0\t65\nchr7\t61115700\t61116300\t0\t64\nchr7\t61118400\t61130100\t0\t87\nchr7\t61131300\t61135800\t0\t87\nchr7\t61137000\t61139700\t0\t71\nchr7\t61141200\t61182900\t0\t132\nchr7\t61184100\t61194300\t0\t132\nchr7\t61195800\t61249500\t0\t132\nchr7\t61250700\t61260900\t0\t132\nchr7\t61264800\t61265700\t0\t33\nchr7\t61269300\t61276800\t0\t60\nchr7\t61278000\t61281000\t0\t60\nchr7\t61282800\t61304700\t0\t116\nchr7\t61306500\t61307100\t0\t116\nchr7\t61308300\t61327800\t0\t116\nchr7\t61380000\t61381200\t0.0246\t60\nchr7\t61382700\t61386600\t0\t261\nchr7\t61387800\t61404000\t0\t150\nchr7\t61405200\t61406100\t0\t150\nchr7\t61407300\t61410300\t0\t309\nchr7\t61412100\t61422000\t0\t256\nchr7\t61423500\t61430700\t0\t129\nchr7\t61431900\t61439100\t0\t137\nchr7\t61440300\t61443900\t0\t151\nchr7\t61445700\t61454400\t0\t151\nchr7\t61455900\t61479900\t0\t173\nchr7\t61481100\t61482300\t0\t173\nchr7\t61483800\t61487100\t0\t87\nchr7\t61488900\t61493100\t0\t87\nchr7\t61495500\t61500600\t0\t96\nchr7\t61502100\t61504200\t0.108\t51\nchr7\t61505400\t61509600\t0\t76\nchr7\t61510800\t61512300\t0\t63\nchr7\t61514100\t61514400\t0.0094\t170\nchr7\t61515900\t61525800\t0\t175\nchr7\t61527300\t61527600\t0\t46\nchr7\t61578000\t61609500\t0\t73\nchr7\t61610700\t61612500\t0\t73\nchr7\t61613700\t61629000\t0\t62\nchr7\t61630200\t61719300\t0\t93\nchr7\t61721100\t61725000\t0\t64\nchr7\t61729200\t61729500\t0.0075\t65\nchr7\t61758300\t61763700\t0\t70\nchr7\t61768200\t61768500\t0.0159\t69\nchr7\t61777800\t61779300\t0\t62\nchr7\t61795800\t61797300\t0.0166\t56\nchr7\t61807500\t61811100\t0\t74\nchr7\t61812900\t61813200\t0.0964\t42\nchr7\t61838700\t61839000\t0\t103\nchr7\t61840200\t61843500\t0\t103\nchr7\t61867800\t61868100\t0.1028\t39\nchr7\t61968900\t61969200\t0.0117\t52\nchr7\t61972500\t61976100\t0\t266\nchr7\t62026500\t62027400\t0\t63\nchr7\t62030400\t62036400\t0\t44\nchr7\t62037600\t62041500\t0\t44\nchr7\t62043000\t62057700\t0\t66\nchr7\t62058900\t62113800\t0\t95\nchr7\t62115000\t62122200\t0\t93\nchr7\t62123400\t62146500\t0\t93\nchr7\t62148300\t62151900\t0\t71\nchr7\t62153100\t62153400\t0.0151\t72\nchr7\t62158500\t62159100\t0.0092\t69\nchr7\t62178900\t62184300\t0\t67\nchr7\t62187300\t62187600\t0.1349\t62\nchr7\t62190000\t62191800\t0\t65\nchr7\t62209800\t62210100\t0.0356\t62\nchr7\t62211900\t62212200\t0.2175\t56\nchr7\t62214900\t62215800\t0\t64\nchr7\t62219400\t62223900\t0\t69\nchr7\t62277300\t62292600\t0\t166\nchr7\t62333100\t62333400\t0.1268\t68\nchr7\t62335200\t62335500\t0.2233\t276\nchr7\t62360700\t62373000\t0\t181\nchr7\t62374500\t62375700\t0.0031\t78\nchr7\t62402700\t62403000\t0.2544\t768\nchr7\t62454600\t62454900\t0.2631\t1117\nchr7\t62506800\t62511300\t0\t474\nchr7\t62516100\t62516400\t0.0401\t33\nchr7\t62544000\t62544300\t0.065\t10\nchr7\t63122100\t63122400\t0.0224\t42\nchr7\t63149100\t63154500\t0\t74\nchr7\t63292800\t63297000\t0\t70\nchr7\t63299100\t63302100\t0\t70\nchr7\t63303300\t63304800\t0\t70\nchr7\t63306900\t63315600\t0\t78\nchr7\t63318000\t63348000\t0\t78\nchr7\t63349500\t63365400\t0\t73\nchr7\t63382800\t63456000\t0\t79\nchr7\t63484800\t63485100\t0.0576\t20\nchr7\t63488100\t63493200\t0\t60\nchr7\t63495300\t63502800\t0\t67\nchr7\t63505500\t63505800\t0.0307\t51\nchr7\t63516900\t63517500\t0.025\t50\nchr7\t63525900\t63526200\t0.1109\t69\nchr7\t63529200\t63531900\t0\t70\nchr7\t63533100\t63535800\t0\t68\nchr7\t63537000\t63539100\t0\t68\nchr7\t63540600\t63548700\t0\t91\nchr7\t63549900\t63553800\t0\t91\nchr7\t63555000\t63555300\t0.124\t49\nchr7\t63556500\t63558900\t0\t69\nchr7\t63561300\t63561900\t0.0251\t56\nchr7\t63583500\t63585900\t0\t78\nchr7\t63587700\t63610200\t0\t78\nchr7\t63611400\t63613500\t0\t73\nchr7\t63615000\t63624600\t0\t73\nchr7\t63625800\t63627300\t0\t59\nchr7\t63629400\t63630000\t0.0786\t87\nchr7\t63632400\t63653100\t0\t78\nchr7\t63662100\t63662400\t0.0127\t55\nchr7\t63668700\t63669300\t0\t62\nchr7\t63673200\t63673500\t0.0135\t60\nchr7\t63676800\t63677100\t0.0302\t52\nchr7\t63681300\t63682800\t0.0623\t50\nchr7\t63685200\t63685500\t0.0364\t40\nchr7\t63691200\t63692700\t0.001\t66\nchr7\t63698100\t63698700\t0.0229\t57\nchr7\t63706800\t63708000\t0.1504\t58\nchr7\t63724200\t63724500\t0.1352\t62\nchr7\t63731700\t63732300\t0\t67\nchr7\t63740700\t63741000\t0.0707\t55\nchr7\t63742800\t63743100\t0.16\t74\nchr7\t63750900\t63751200\t0.0376\t77\nchr7\t63753600\t63764700\t0\t169\nchr7\t63776700\t63777000\t0.0265\t33\nchr7\t63825000\t63825600\t0.0347\t54\nchr7\t64856100\t64856400\t0\t37\nchr7\t65028300\t65028600\t0.0159\t52\nchr7\t65073000\t65074800\t0.0091\t59\nchr7\t65107200\t65107800\t0\t46\nchr7\t65109600\t65109900\t0.2455\t58\nchr7\t65114400\t65123100\t0\t84\nchr7\t65124300\t65140800\t0\t79\nchr7\t65146800\t65149200\t0.0201\t54\nchr7\t65153100\t65156100\t0\t78\nchr7\t65161500\t65161800\t0.1527\t52\nchr7\t65164200\t65171700\t0\t76\nchr7\t65175900\t65176200\t0.0096\t44\nchr7\t65179200\t65179500\t0.1407\t66\nchr7\t65181600\t65181900\t0.1596\t43\nchr7\t65185200\t65185500\t0.0749\t56\nchr7\t65192100\t65192400\t0.0208\t61\nchr7\t65193600\t65193900\t0.0905\t67\nchr7\t65196300\t65196600\t0.0093\t62\nchr7\t65258100\t65260200\t0\t58\nchr7\t65489400\t65490300\t0.1192\t470\nchr7\t65507700\t65508300\t0\t67\nchr7\t65520300\t65533500\t0\t79\nchr7\t65534700\t65535900\t0\t79\nchr7\t65537100\t65549700\t0\t79\nchr7\t65551500\t65559300\t0\t92\nchr7\t65562900\t65565600\t0\t70\nchr7\t65566800\t65571900\t0\t83\nchr7\t65573100\t65575200\t0\t69\nchr7\t65578800\t65579100\t0.0101\t73\nchr7\t65581200\t65581500\t0.0101\t73\nchr7\t65583300\t65583600\t0.1103\t88\nchr7\t65630700\t65651100\t0\t83\nchr7\t65652900\t65681400\t0\t79\nchr7\t65682600\t65682900\t0\t79\nchr7\t65687700\t65688000\t0.0018\t51\nchr7\t65691600\t65691900\t0.0575\t53\nchr7\t65698200\t65699700\t0.0669\t73\nchr7\t65702100\t65702400\t0.017\t69\nchr7\t65708100\t65708400\t0.0674\t57\nchr7\t65762400\t65764500\t0\t67\nchr7\t65864700\t65865000\t0.0414\t54\nchr7\t65948400\t65948700\t0.0626\t55\nchr7\t66287100\t66292500\t0\t67\nchr7\t66394800\t66395100\t0.0994\t58\nchr7\t67031400\t67031700\t0.0238\t76\nchr7\t67232700\t67233300\t0\t25\nchr7\t67275300\t67275600\t0.031\t59\nchr7\t67335600\t67335900\t0.0678\t50\nchr7\t68652300\t68652600\t0.1804\t59\nchr7\t70197600\t70203000\t0\t87\nchr7\t72529500\t72530100\t0.0033\t66\nchr7\t72795900\t72796200\t0.022\t58\nchr7\t72851400\t72852000\t0.0064\t64\nchr7\t72874500\t72875700\t0.0435\t67\nchr7\t72942600\t72942900\t0.2098\t56\nchr7\t72951000\t72953700\t0\t76\nchr7\t72957900\t72959100\t0\t84\nchr7\t72960300\t72962400\t0\t84\nchr7\t72963900\t72970200\t0\t84\nchr7\t72971400\t72975600\t0\t84\nchr7\t72977100\t72977700\t0\t84\nchr7\t72979200\t72995400\t0\t84\nchr7\t72997800\t73001400\t0\t84\nchr7\t73002900\t73005300\t0.0225\t71\nchr7\t73008000\t73103700\t0\t105\nchr7\t73104900\t73113600\t0\t112\nchr7\t73115700\t73122300\t0\t95\nchr7\t73124100\t73124400\t0\t79\nchr7\t73125600\t73126500\t0\t79\nchr7\t73128900\t73129500\t0\t83\nchr7\t73130700\t73134300\t0\t83\nchr7\t73135500\t73137000\t0\t64\nchr7\t73138800\t73142400\t0\t78\nchr7\t73144800\t73146900\t0\t72\nchr7\t73148100\t73153800\t0\t72\nchr7\t73157100\t73166700\t0\t84\nchr7\t73167900\t73170300\t0\t96\nchr7\t73172100\t73173300\t0\t96\nchr7\t73174500\t73177200\t0\t95\nchr7\t73178400\t73190400\t0\t95\nchr7\t73191600\t73192200\t0\t95\nchr7\t73193700\t73210800\t0\t95\nchr7\t73212000\t73212300\t0\t95\nchr7\t73213500\t73224900\t0\t95\nchr7\t73226400\t73227900\t0\t76\nchr7\t73230000\t73230900\t0\t80\nchr7\t73232700\t73237200\t0\t80\nchr7\t73240200\t73240800\t0.069\t84\nchr7\t73255500\t73257000\t0.0713\t60\nchr7\t73259400\t73259700\t0\t66\nchr7\t73262700\t73264800\t0.0081\t65\nchr7\t73266000\t73267500\t0\t71\nchr7\t73278900\t73279500\t0.0047\t78\nchr7\t73281000\t73281300\t0.1673\t45\nchr7\t73293300\t73293600\t0.019\t53\nchr7\t74728500\t74730600\t0\t67\nchr7\t74734800\t74749500\t0\t78\nchr7\t74750700\t74761200\t0\t78\nchr7\t74763000\t74771400\t0\t103\nchr7\t74772600\t74778300\t0\t76\nchr7\t74779500\t74782500\t0\t66\nchr7\t74784300\t74785200\t0\t74\nchr7\t74787900\t74790600\t0\t74\nchr7\t74793600\t74793900\t0.0474\t72\nchr7\t74799300\t74810400\t0\t78\nchr7\t74811900\t74815200\t0\t78\nchr7\t74816400\t74818200\t0\t78\nchr7\t74819400\t74824800\t0\t70\nchr7\t74827500\t74829300\t0\t56\nchr7\t74831700\t74835900\t0\t81\nchr7\t74837100\t74840400\t0\t81\nchr7\t74842800\t74844900\t0\t77\nchr7\t74846100\t74857500\t0\t77\nchr7\t74859000\t74859900\t0\t54\nchr7\t74862300\t74862600\t0\t62\nchr7\t74867100\t74867400\t0.079\t49\nchr7\t74877900\t74878200\t0.1568\t54\nchr7\t74889900\t74890200\t0.0812\t57\nchr7\t74891700\t74892600\t0\t62\nchr7\t74894400\t74895900\t0\t80\nchr7\t74897100\t74904000\t0\t80\nchr7\t74905500\t74905800\t0\t80\nchr7\t74911200\t74914500\t0\t74\nchr7\t74917800\t74918100\t0\t70\nchr7\t74919300\t74919900\t0\t70\nchr7\t74927100\t74931600\t0\t98\nchr7\t74932800\t74933400\t0\t98\nchr7\t74934600\t74935200\t0\t98\nchr7\t74939400\t74939700\t0.0068\t68\nchr7\t74942100\t74943000\t0.0104\t84\nchr7\t74948700\t74949900\t0\t66\nchr7\t74951100\t74951400\t0\t66\nchr7\t74953500\t74954100\t0\t73\nchr7\t74955900\t74956200\t0\t73\nchr7\t74957700\t74963700\t0\t72\nchr7\t74964900\t74969700\t0\t76\nchr7\t74971200\t74971800\t0\t76\nchr7\t74973600\t74974800\t0.0039\t91\nchr7\t74978400\t74981400\t0\t78\nchr7\t74982600\t74982900\t0\t78\nchr7\t75075000\t75075300\t0.0656\t60\nchr7\t75076500\t75077100\t0.0234\t48\nchr7\t75078900\t75079200\t0.0719\t33\nchr7\t75081300\t75082200\t0\t59\nchr7\t75084600\t75087600\t0\t67\nchr7\t75088800\t75091500\t0\t73\nchr7\t75093900\t75101100\t0\t71\nchr7\t75106500\t75113400\t0\t72\nchr7\t75120300\t75120600\t0.0225\t61\nchr7\t75122400\t75126300\t0\t70\nchr7\t75127800\t75129600\t0\t73\nchr7\t75130800\t75131700\t0\t78\nchr7\t75135600\t75136800\t0\t84\nchr7\t75138000\t75146700\t0\t84\nchr7\t75156000\t75156300\t0.0597\t54\nchr7\t75158100\t75159000\t0.0001\t70\nchr7\t75160500\t75162600\t0\t92\nchr7\t75164400\t75226500\t0\t92\nchr7\t75227700\t75244500\t0\t92\nchr7\t75246000\t75246600\t0\t92\nchr7\t75247800\t75249000\t0\t92\nchr7\t75250200\t75257100\t0\t92\nchr7\t75258900\t75260400\t0\t78\nchr7\t75261600\t75272100\t0\t78\nchr7\t75273900\t75278100\t0\t92\nchr7\t75279900\t75362400\t0\t92\nchr7\t75363900\t75368100\t0\t82\nchr7\t75369600\t75385800\t0\t82\nchr7\t75387300\t75395100\t0\t82\nchr7\t75396600\t75408300\t0\t72\nchr7\t75410700\t75414300\t0\t80\nchr7\t75426300\t75426600\t0.01\t76\nchr7\t75443700\t75444000\t0\t69\nchr7\t75445500\t75446100\t0\t69\nchr7\t75490800\t75491100\t0.1757\t66\nchr7\t75506700\t75507300\t0.0241\t46\nchr7\t75706800\t75707400\t0.0055\t61\nchr7\t75828900\t75829200\t0.1555\t59\nchr7\t75834600\t75834900\t0.1045\t72\nchr7\t76438800\t76439100\t0.0729\t57\nchr7\t76442100\t76442700\t0\t84\nchr7\t76446000\t76447200\t0\t73\nchr7\t76455300\t76460100\t0\t55\nchr7\t76461300\t76462800\t0.0016\t55\nchr7\t76465800\t76466100\t0.12\t72\nchr7\t76467300\t76467600\t0.0086\t66\nchr7\t76470300\t76470900\t0.0182\t66\nchr7\t76473600\t76473900\t0.0316\t33\nchr7\t76475700\t76476300\t0.0318\t56\nchr7\t76484100\t76487700\t0\t67\nchr7\t76489200\t76490400\t0\t67\nchr7\t76492500\t76494600\t0\t60\nchr7\t76496400\t76496700\t0.0149\t33\nchr7\t76504200\t76504500\t0.1546\t48\nchr7\t76519200\t76519500\t0.0351\t12\nchr7\t76521600\t76522500\t0\t24\nchr7\t76524900\t76525800\t0\t39\nchr7\t76527300\t76529100\t0\t39\nchr7\t76532100\t76532400\t0.1543\t19\nchr7\t76534800\t76538100\t0.0049\t69\nchr7\t76544700\t76545600\t0.0792\t63\nchr7\t76605000\t76605900\t0.0165\t52\nchr7\t76609200\t76610100\t0\t61\nchr7\t76612200\t76614600\t0\t57\nchr7\t76628100\t76628400\t0.0412\t55\nchr7\t76629900\t76630800\t0\t68\nchr7\t76632900\t76633200\t0.0319\t24\nchr7\t76641300\t76642800\t0.0468\t57\nchr7\t76648500\t76649100\t0.0342\t45\nchr7\t76652100\t76652400\t0.0478\t64\nchr7\t76672800\t76673100\t0.1961\t52\nchr7\t76733100\t76734000\t0.0796\t65\nchr7\t76768800\t76769100\t0.1548\t57\nchr7\t76956900\t76957500\t0\t65\nchr7\t76959300\t76961100\t0\t65\nchr7\t76963800\t76964400\t0.1047\t67\nchr7\t76965600\t76965900\t0.039\t69\nchr7\t76968600\t76969200\t0.0662\t79\nchr7\t76974000\t76974300\t0.0352\t56\nchr7\t76983000\t76985400\t0.0142\t70\nchr7\t76987200\t76987500\t0.089\t59\nchr7\t76990800\t76991100\t0.0057\t55\nchr7\t77012700\t77019900\t0\t75\nchr7\t77021700\t77022600\t0.0336\t49\nchr7\t77023800\t77025300\t0\t72\nchr7\t77026800\t77027100\t0\t101\nchr7\t77028600\t77031600\t0\t101\nchr7\t77033100\t77037300\t0\t101\nchr7\t77039100\t77039400\t0.1742\t51\nchr7\t77042100\t77048100\t0\t88\nchr7\t77056200\t77056500\t0.0794\t62\nchr7\t77078700\t77079000\t0.0507\t69\nchr7\t77093700\t77094000\t0.0022\t37\nchr7\t77106600\t77106900\t0.2576\t46\nchr7\t77116200\t77116500\t0.022\t15\nchr7\t77157000\t77157300\t0.0348\t73\nchr7\t77510100\t77510400\t0.0371\t78\nchr7\t79231200\t79233600\t0.0426\t77\nchr7\t81785100\t81785400\t0.1629\t49\nchr7\t82806900\t82807200\t0.1676\t80\nchr7\t83029500\t83029800\t0.1101\t61\nchr7\t84065100\t84065400\t0.1133\t82\nchr7\t85331400\t85333200\t0.1293\t93\nchr7\t86457300\t86457600\t0.0645\t69\nchr7\t86986200\t86986500\t0.1812\t12\nchr7\t87044100\t87045300\t0.104\t64\nchr7\t87063900\t87064200\t0.0626\t70\nchr7\t87951600\t87951900\t0.0818\t46\nchr7\t88552800\t88553100\t0.1058\t65\nchr7\t90074400\t90075000\t0.0026\t57\nchr7\t91178100\t91178400\t0.0669\t76\nchr7\t91217700\t91218000\t0.1438\t86\nchr7\t91587300\t91587600\t0.0547\t84\nchr7\t91905900\t91906200\t0.0853\t92\nchr7\t92561700\t92562000\t0.058\t52\nchr7\t93788100\t93793200\t0\t68\nchr7\t94159800\t94160400\t0.0454\t116\nchr7\t95834100\t95834400\t0.1117\t83\nchr7\t96846600\t96852600\t0\t90\nchr7\t97533300\t97533600\t0.1327\t65\nchr7\t97614300\t97619400\t0.0112\t86\nchr7\t97778400\t97778700\t0.2438\t44\nchr7\t99809700\t99815100\t0\t94\nchr7\t100308900\t100309200\t0.0593\t69\nchr7\t100310400\t100311300\t0.0593\t69\nchr7\t100313700\t100314000\t0.151\t62\nchr7\t100740300\t100742700\t0.0428\t59\nchr7\t100994700\t100999800\t0.0156\t280\nchr7\t101001600\t101001900\t0.0156\t280\nchr7\t101004000\t101004300\t0.0156\t280\nchr7\t102342000\t102342300\t0.0451\t60\nchr7\t102345000\t102345300\t0.0021\t56\nchr7\t102347400\t102351600\t0\t135\nchr7\t102352800\t102357900\t0\t135\nchr7\t102476700\t102477000\t0\t119\nchr7\t102480600\t102484500\t0\t119\nchr7\t102485700\t102495600\t0\t119\nchr7\t102497700\t102503700\t0\t96\nchr7\t102504900\t102527100\t0\t96\nchr7\t102528300\t102541500\t0\t98\nchr7\t102543300\t102543900\t0\t96\nchr7\t102545700\t102553800\t0\t96\nchr7\t102555900\t102576600\t0\t107\nchr7\t102579300\t102595200\t0\t113\nchr7\t102596400\t102602700\t0\t113\nchr7\t102604800\t102605100\t0.1039\t69\nchr7\t102606600\t102618000\t0\t100\nchr7\t102620400\t102633900\t0\t91\nchr7\t102636300\t102640800\t0\t89\nchr7\t102642300\t102664800\t0\t124\nchr7\t102666000\t102675600\t0\t117\nchr7\t102678600\t102690600\t0\t101\nchr7\t102792300\t102792600\t0.1546\t56\nchr7\t104507700\t104508000\t0.1272\t60\nchr7\t106101300\t106101600\t0.0666\t1123\nchr7\t106245000\t106245900\t0\t82\nchr7\t107418300\t107418600\t0.179\t45\nchr7\t107770200\t107770500\t0.2184\t286\nchr7\t108507900\t108508500\t0.0042\t72\nchr7\t109095900\t109098300\t0\t75\nchr7\t109906200\t109908300\t0\t76\nchr7\t110402100\t110402400\t0.0686\t36\nchr7\t110558700\t110560800\t0.0014\t62\nchr7\t110707200\t110712600\t0\t84\nchr7\t111243600\t111249300\t0\t120\nchr7\t111448500\t111449700\t0.0475\t73\nchr7\t111455700\t111457200\t0\t65\nchr7\t111963600\t111968400\t0\t66\nchr7\t112552200\t112552500\t0.0947\t78\nchr7\t112975500\t112978200\t0\t57\nchr7\t112979700\t112980900\t0\t56\nchr7\t113493000\t113494500\t0\t72\nchr7\t113497200\t113497500\t0.0606\t69\nchr7\t113661600\t113661900\t0.2193\t60\nchr7\t113776200\t113782200\t0\t141\nchr7\t115261500\t115263600\t0.0349\t81\nchr7\t116718900\t116719200\t0.2076\t68\nchr7\t117525300\t117528900\t0\t70\nchr7\t118343100\t118343400\t0.0417\t63\nchr7\t118703700\t118704000\t0.1945\t68\nchr7\t118965000\t118965300\t0.0863\t30\nchr7\t119591400\t119591700\t0.0717\t56\nchr7\t120323700\t120324000\t0.0567\t63\nchr7\t121443600\t121443900\t0.1833\t62\nchr7\t121649400\t121649700\t0.1321\t29\nchr7\t122232300\t122232600\t0.2072\t53\nchr7\t122283300\t122283600\t0.0677\t76\nchr7\t123042600\t123042900\t0.1439\t35\nchr7\t123780900\t123781200\t0.0687\t79\nchr7\t125179800\t125180100\t0.0189\t43\nchr7\t125221500\t125221800\t0.0531\t83\nchr7\t126829200\t126829500\t0.1377\t76\nchr7\t127963500\t127963800\t0.0104\t80\nchr7\t127965000\t127966800\t0.0104\t80\nchr7\t130481100\t130481400\t0.1145\t75\nchr7\t130580400\t130581900\t0.0142\t81\nchr7\t130702200\t130702800\t0.0049\t78\nchr7\t133422900\t133423200\t0.2122\t25\nchr7\t133889700\t133894200\t0\t67\nchr7\t136416000\t136416600\t0.0844\t86\nchr7\t136797900\t136798200\t0.1515\t69\nchr7\t136972800\t136973100\t0.2055\t49\nchr7\t137137200\t137137500\t0.1038\t79\nchr7\t137334300\t137334600\t0.0563\t49\nchr7\t137429700\t137430000\t0.1447\t49\nchr7\t139794900\t139795500\t0.1774\t119\nchr7\t141062400\t141066900\t0\t67\nchr7\t141882300\t141883500\t0.0971\t83\nchr7\t141920700\t141926400\t0\t75\nchr7\t141983400\t141984000\t0.0522\t83\nchr7\t142042500\t142042800\t0\t13\nchr7\t143522100\t143524500\t0\t50\nchr7\t143526000\t143529600\t0\t55\nchr7\t143532000\t143537100\t0\t72\nchr7\t143542500\t143548200\t0\t67\nchr7\t143550000\t143556300\t0\t68\nchr7\t143557500\t143558100\t0.0006\t65\nchr7\t143559600\t143560800\t0.0006\t65\nchr7\t143563500\t143566500\t0\t71\nchr7\t143567700\t143570700\t0\t71\nchr7\t143571900\t143577300\t0\t90\nchr7\t143578500\t143580000\t0\t90\nchr7\t143581800\t143585100\t0\t76\nchr7\t143587200\t143593200\t0\t77\nchr7\t143594400\t143610300\t0\t77\nchr7\t143612400\t143650800\t0\t67\nchr7\t143700900\t143707200\t0\t69\nchr7\t143708700\t143718900\t0\t52\nchr7\t143720400\t143724300\t0\t54\nchr7\t143726700\t143727900\t0.0309\t60\nchr7\t143743800\t143747700\t0\t74\nchr7\t143749500\t143766600\t0\t82\nchr7\t143769600\t143779200\t0\t73\nchr7\t143781600\t143786700\t0\t70\nchr7\t143792400\t143797500\t0\t67\nchr7\t143799900\t143801700\t0\t77\nchr7\t143805000\t143806500\t0\t77\nchr7\t143808000\t143809200\t0\t77\nchr7\t143810400\t143844900\t0\t77\nchr7\t143853600\t143858400\t0\t92\nchr7\t143859900\t143867400\t0\t92\nchr7\t143868600\t143874600\t0\t92\nchr7\t144180000\t144181200\t0\t85\nchr7\t144182400\t144186000\t0\t85\nchr7\t144187800\t144190500\t0\t85\nchr7\t144191700\t144196500\t0\t75\nchr7\t144199200\t144207900\t0\t75\nchr7\t144209700\t144215100\t0\t76\nchr7\t144216300\t144218400\t0\t76\nchr7\t144219900\t144225900\t0\t76\nchr7\t144230100\t144232500\t0\t71\nchr7\t144233700\t144234600\t0\t71\nchr7\t144236700\t144244200\t0\t83\nchr7\t144245400\t144249300\t0\t83\nchr7\t144250500\t144253500\t0\t83\nchr7\t144256500\t144259500\t0.001\t100\nchr7\t144263100\t144263400\t0.0024\t80\nchr7\t144265800\t144270300\t0\t66\nchr7\t144271500\t144271800\t0\t66\nchr7\t144273000\t144274800\t0.0064\t79\nchr7\t144277200\t144285300\t0\t78\nchr7\t144286800\t144288300\t0\t57\nchr7\t144290400\t144302400\t0\t76\nchr7\t144303600\t144315600\t0\t85\nchr7\t144316800\t144321300\t0\t85\nchr7\t144326700\t144330900\t0\t67\nchr7\t144332400\t144351600\t0\t75\nchr7\t144354300\t144359100\t0\t78\nchr7\t144360300\t144362400\t0\t78\nchr7\t144364200\t144370200\t0\t72\nchr7\t144371400\t144372300\t0\t79\nchr7\t144374100\t144376800\t0.0036\t61\nchr7\t145305000\t145305300\t0.1345\t54\nchr7\t146015400\t146016300\t0.0978\t87\nchr7\t146604000\t146604300\t0.1283\t57\nchr7\t146909400\t146910000\t0.0143\t86\nchr7\t147084000\t147084300\t0.137\t12\nchr7\t147323100\t147323400\t0.1978\t57\nchr7\t147842700\t147847800\t0\t76\nchr7\t148647900\t148648200\t0.0954\t54\nchr7\t149906700\t149907300\t0.0152\t58\nchr7\t149934900\t149935200\t0\t38\nchr7\t149950800\t149951100\t0.0067\t61\nchr7\t149990400\t149990700\t0.0903\t63\nchr7\t150000300\t150000900\t0.0219\t60\nchr7\t150030000\t150030300\t0.0832\t47\nchr7\t150060900\t150062400\t0\t71\nchr7\t150075000\t150075300\t0.1134\t62\nchr7\t150091200\t150091500\t0.0071\t65\nchr7\t150145500\t150145800\t0.053\t56\nchr7\t150153600\t150153900\t0.1215\t59\nchr7\t150187500\t150187800\t0.0863\t69\nchr7\t150189600\t150189900\t0.0565\t52\nchr7\t150199200\t150199500\t0.1209\t60\nchr7\t150247500\t150247800\t0.1333\t53\nchr7\t150268500\t150270300\t0\t77\nchr7\t150295800\t150296100\t0.0815\t59\nchr7\t152584800\t152586300\t0.0259\t46\nchr7\t152785800\t152786400\t0.007\t65\nchr7\t152812800\t152814000\t0.1079\t53\nchr7\t152839500\t152841300\t0\t81\nchr7\t153707100\t153707400\t0.0676\t54\nchr7\t153748500\t153748800\t0.0507\t29\nchr7\t153750300\t153750600\t0.1234\t41\nchr7\t153821400\t153821700\t0.0259\t53\nchr7\t153854700\t153855000\t0.1958\t64\nchr7\t154009200\t154009500\t0.1727\t67\nchr7\t154038300\t154039800\t0\t71\nchr7\t154048200\t154048800\t0\t23\nchr7\t154067100\t154067400\t0.0992\t61\nchr7\t154096200\t154096500\t0.0464\t59\nchr7\t154145700\t154146300\t0.0104\t53\nchr7\t154161600\t154162200\t0.0136\t45\nchr7\t154457100\t154457700\t0\t65\nchr7\t154661100\t154661400\t0.0635\t13\nchr7\t155341200\t155341500\t0.1159\t169\nchr7\t155350500\t155350800\t0.171\t66\nchr7\t155366700\t155367300\t0.0318\t101\nchr7\t155407200\t155407500\t0.2722\t11\nchr7\t156154200\t156155700\t0\t320\nchr7\t157470300\t157470600\t0.1719\t79\nchr7\t157554000\t157554300\t0.239\t37\nchr7\t157647600\t157647900\t0.1406\t13\nchr7\t157710900\t157711200\t0.0107\t29\nchr7\t157731900\t157732200\t0.1766\t24\nchr7\t157733700\t157734000\t0.1977\t18\nchr7\t157858200\t157859100\t0.0439\t15\nchr7\t157983000\t157983300\t0.1937\t51\nchr7\t158000700\t158001000\t0.1985\t28\nchr7\t158088000\t158088300\t0.2276\t59\nchr7\t158099100\t158099700\t0.1965\t13\nchr7\t158146800\t158148600\t0.0809\t481\nchr7\t158237100\t158237700\t0.0645\t48\nchr7\t158338800\t158339700\t0\t17\nchr7\t158349000\t158349600\t0\t21\nchr7\t158360100\t158361300\t0.0717\t272\nchr7\t158455200\t158455500\t0.1578\t63\nchr7\t158838900\t158839200\t0.1226\t40\nchr7\t158916000\t158916900\t0.2381\t53\nchr7\t158982000\t158982300\t0.2211\t55\nchr7\t159088800\t159089400\t0.0185\t106\nchr7\t159164400\t159164700\t0\t40\nchr7\t159202800\t159203100\t0.2358\t93\nchr8\t60600\t60900\t0\t100\nchr8\t62100\t76800\t0\t100\nchr8\t78300\t79500\t0\t100\nchr8\t80700\t81000\t0\t100\nchr8\t82500\t102300\t0\t100\nchr8\t103800\t166500\t0\t97\nchr8\t168300\t169800\t0\t97\nchr8\t171000\t191100\t0\t97\nchr8\t194100\t194400\t0.191\t80\nchr8\t195900\t200700\t0\t88\nchr8\t304200\t304800\t0.0337\t59\nchr8\t378000\t378300\t0.1707\t76\nchr8\t399300\t399600\t0.0768\t55\nchr8\t402600\t402900\t0.1096\t75\nchr8\t659100\t659700\t0.072\t70\nchr8\t669300\t669600\t0.1689\t63\nchr8\t680100\t680400\t0.216\t85\nchr8\t714300\t714600\t0\t27\nchr8\t775500\t775800\t0.0591\t97\nchr8\t807300\t807600\t0.074\t51\nchr8\t840000\t840300\t0.1552\t48\nchr8\t848400\t848700\t0.2068\t34\nchr8\t895800\t896100\t0.1485\t40\nchr8\t933900\t934200\t0.0172\t30\nchr8\t991500\t993300\t0.0112\t103\nchr8\t1015500\t1015800\t0.2977\t21\nchr8\t1034100\t1035900\t0.0358\t42\nchr8\t1109100\t1110000\t0.0909\t56\nchr8\t1215600\t1215900\t0.254\t72\nchr8\t1238700\t1239300\t0.187\t28\nchr8\t1350600\t1350900\t0.2703\t85\nchr8\t1384500\t1385400\t0.2479\t80\nchr8\t1394400\t1394700\t0.0195\t16\nchr8\t1396800\t1400100\t0\t29\nchr8\t1401900\t1402200\t0.1493\t28\nchr8\t1406700\t1407300\t0.163\t43\nchr8\t1470900\t1471200\t0.0551\t60\nchr8\t1607700\t1608600\t0.0679\t126\nchr8\t1611300\t1612500\t0.0194\t82\nchr8\t1642800\t1644000\t0.2423\t33\nchr8\t1692000\t1692300\t0\t30\nchr8\t1968600\t1968900\t0.1208\t43\nchr8\t1990500\t1990800\t0.1201\t29\nchr8\t2191500\t2191800\t0.0872\t10\nchr8\t2238900\t2239200\t0.1718\t70\nchr8\t2244600\t2246100\t0.1263\t63\nchr8\t2247600\t2247900\t0.2173\t75\nchr8\t2250900\t2251200\t0\t86\nchr8\t2253600\t2276100\t0\t86\nchr8\t2278200\t2279100\t0\t57\nchr8\t2280600\t2333100\t0\t87\nchr8\t2337000\t2338800\t0\t70\nchr8\t2341200\t2341500\t0\t18\nchr8\t2383200\t2384400\t0\t66\nchr8\t2387100\t2387400\t0.0006\t50\nchr8\t2388600\t2440800\t0\t78\nchr8\t2442000\t2443800\t0\t78\nchr8\t2445600\t2447700\t0\t80\nchr8\t2448900\t2470800\t0\t80\nchr8\t2473500\t2475000\t0.0012\t60\nchr8\t2480400\t2481000\t0.0038\t62\nchr8\t6297300\t6297600\t0.0219\t60\nchr8\t6300000\t6300300\t0.081\t65\nchr8\t6974700\t6998700\t0\t149\nchr8\t6999900\t7001700\t0\t149\nchr8\t7002900\t7014300\t0\t154\nchr8\t7017300\t7017600\t0.0609\t79\nchr8\t7155300\t7157100\t0\t83\nchr8\t7161300\t7161600\t0.2303\t35\nchr8\t7162800\t7163100\t0.2031\t39\nchr8\t7164300\t7164600\t0.1082\t25\nchr8\t7165800\t7166400\t0.1607\t31\nchr8\t7168200\t7168500\t0.0521\t42\nchr8\t7173000\t7173600\t0.0075\t32\nchr8\t7181700\t7182000\t0\t35\nchr8\t7189500\t7192500\t0\t33\nchr8\t7205400\t7205700\t0.0495\t37\nchr8\t7209300\t7215900\t0\t60\nchr8\t7218300\t7220700\t0\t37\nchr8\t7222500\t7223400\t0\t34\nchr8\t7224900\t7227600\t0\t70\nchr8\t7229700\t7252800\t0\t65\nchr8\t7254000\t7267800\t0\t129\nchr8\t7269000\t7293300\t0\t129\nchr8\t7294500\t7295400\t0\t129\nchr8\t7299300\t7300200\t0\t31\nchr8\t7302000\t7304700\t0\t38\nchr8\t7307100\t7311900\t0\t38\nchr8\t7314000\t7316400\t0\t34\nchr8\t7317600\t7318500\t0\t32\nchr8\t7320000\t7320900\t0\t38\nchr8\t7323300\t7325100\t0\t41\nchr8\t7326900\t7327500\t0\t41\nchr8\t7329900\t7331100\t0.0111\t36\nchr8\t7332600\t7332900\t0.0792\t52\nchr8\t7335300\t7335600\t0.007\t60\nchr8\t7337100\t7338000\t0.0341\t62\nchr8\t7339200\t7339800\t0.0341\t62\nchr8\t7342500\t7343100\t0\t44\nchr8\t7371600\t7374000\t0\t74\nchr8\t7377000\t7378500\t0.0258\t57\nchr8\t7381200\t7381500\t0.0704\t66\nchr8\t7399500\t7404300\t0\t81\nchr8\t7406100\t7410900\t0\t71\nchr8\t7412700\t7414500\t0\t69\nchr8\t7416900\t7417200\t0.0208\t62\nchr8\t7425600\t7433700\t0\t71\nchr8\t7435500\t7441500\t0\t76\nchr8\t7442700\t7444500\t0\t76\nchr8\t7447200\t7447800\t0\t81\nchr8\t7449000\t7449300\t0.1427\t66\nchr8\t7452000\t7452900\t0\t81\nchr8\t7454400\t7458600\t0\t75\nchr8\t7459800\t7469100\t0\t73\nchr8\t7470300\t7471800\t0.0005\t46\nchr8\t7473300\t7473600\t0.0178\t65\nchr8\t7474800\t7475100\t0.2315\t38\nchr8\t7477800\t7478400\t0.1238\t57\nchr8\t7479600\t7480800\t0.0273\t67\nchr8\t7482300\t7483800\t0\t71\nchr8\t7485600\t7485900\t0\t71\nchr8\t7487100\t7497000\t0\t71\nchr8\t7498200\t7506300\t0\t109\nchr8\t7508700\t7513800\t0\t109\nchr8\t7515600\t7534800\t0\t109\nchr8\t7537200\t7545900\t0\t84\nchr8\t7551000\t7556700\t0\t106\nchr8\t7558800\t7564500\t0\t132\nchr8\t7567200\t7579800\t0\t384\nchr8\t7581000\t7593600\t0\t384\nchr8\t7594800\t7596900\t0\t384\nchr8\t7598100\t7598400\t0\t74\nchr8\t7599600\t7603500\t0\t74\nchr8\t7604700\t7605000\t0.1062\t46\nchr8\t7607400\t7609800\t0.001\t101\nchr8\t7612500\t7614900\t0.0412\t112\nchr8\t7616100\t7616400\t0.0412\t112\nchr8\t7667400\t7676100\t0\t54\nchr8\t7677300\t7678500\t0\t54\nchr8\t7681500\t7682400\t0\t30\nchr8\t7684500\t7686300\t0\t71\nchr8\t7688100\t7718700\t0\t229\nchr8\t7719900\t7764900\t0\t229\nchr8\t7766100\t7769100\t0\t229\nchr8\t7772100\t7772700\t0\t81\nchr8\t7773900\t7789800\t0\t79\nchr8\t7791300\t7801200\t0\t79\nchr8\t7802400\t7805400\t0\t70\nchr8\t7807500\t7812300\t0.0034\t67\nchr8\t7814400\t7826100\t0\t71\nchr8\t7830600\t7832100\t0\t63\nchr8\t7835100\t7835400\t0.0714\t22\nchr8\t7837800\t7838100\t0.0806\t55\nchr8\t7839600\t7856700\t0\t85\nchr8\t7858800\t7859700\t0\t71\nchr8\t7862100\t7862700\t0\t77\nchr8\t7863900\t7866600\t0\t77\nchr8\t7867800\t7869300\t0\t77\nchr8\t7871100\t7872900\t0\t77\nchr8\t7874400\t7875900\t0.017\t64\nchr8\t7880100\t7885800\t0\t74\nchr8\t7896300\t7899300\t0\t71\nchr8\t7901100\t7912500\t0\t71\nchr8\t7916400\t7916700\t0.0498\t20\nchr8\t7917900\t7918800\t0\t47\nchr8\t7923900\t7924200\t0.0503\t11\nchr8\t7925700\t7926600\t0\t42\nchr8\t7928700\t7929000\t0\t44\nchr8\t7930200\t7930800\t0\t44\nchr8\t7933200\t7935000\t0\t70\nchr8\t7938000\t7940100\t0\t75\nchr8\t7943100\t7944300\t0\t42\nchr8\t7945800\t7947900\t0\t42\nchr8\t7949700\t7950000\t0.0841\t12\nchr8\t7952700\t7972200\t0\t37\nchr8\t7974600\t7975200\t0\t39\nchr8\t7977000\t7984500\t0\t43\nchr8\t7986000\t7990500\t0\t43\nchr8\t7991700\t8008800\t0\t43\nchr8\t8010000\t8011200\t0\t92\nchr8\t8013300\t8015400\t0\t92\nchr8\t8016600\t8044200\t0\t391\nchr8\t8046900\t8051700\t0\t68\nchr8\t8053200\t8053500\t0.0868\t42\nchr8\t8056200\t8057400\t0\t94\nchr8\t8058900\t8059200\t0.1534\t79\nchr8\t8061900\t8065800\t0\t88\nchr8\t8068500\t8068800\t0.1618\t12\nchr8\t8071500\t8073300\t0\t78\nchr8\t8074800\t8075100\t0\t78\nchr8\t8081700\t8082600\t0\t26\nchr8\t8084400\t8084700\t0.0683\t11\nchr8\t8086800\t8087100\t0\t17\nchr8\t8091000\t8091300\t0.0257\t23\nchr8\t8093400\t8100900\t0\t40\nchr8\t8102100\t8106000\t0\t26\nchr8\t8109000\t8109600\t0\t18\nchr8\t8112000\t8119500\t0\t104\nchr8\t8121300\t8123100\t0\t104\nchr8\t8124300\t8131800\t0\t104\nchr8\t8133000\t8135700\t0\t104\nchr8\t8137200\t8138400\t0.0626\t85\nchr8\t8141100\t8143200\t0.0075\t109\nchr8\t8145300\t8145600\t0.0853\t98\nchr8\t8148600\t8156400\t0\t110\nchr8\t8157600\t8158800\t0\t110\nchr8\t8160000\t8160300\t0.0022\t82\nchr8\t8162100\t8162400\t0.0334\t90\nchr8\t8163600\t8163900\t0.0007\t123\nchr8\t8165100\t8170200\t0.0007\t123\nchr8\t8171700\t8177700\t0\t108\nchr8\t8178900\t8179800\t0.0105\t85\nchr8\t8185500\t8185800\t0.0064\t95\nchr8\t8187900\t8189100\t0.0582\t108\nchr8\t8190300\t8191200\t0.008\t105\nchr8\t8192700\t8194200\t0.008\t105\nchr8\t8195700\t8198400\t0\t80\nchr8\t8199600\t8203500\t0\t80\nchr8\t8205000\t8206200\t0\t51\nchr8\t8207700\t8208600\t0\t51\nchr8\t8211000\t8211600\t0\t45\nchr8\t8214300\t8214600\t0\t39\nchr8\t8230200\t8230500\t0.0352\t23\nchr8\t8233800\t8234100\t0.0596\t78\nchr8\t8471100\t8476500\t0\t81\nchr8\t9657300\t9658200\t0.145\t58\nchr8\t9736500\t9739800\t0\t65\nchr8\t10934100\t10934400\t0.0717\t51\nchr8\t10936500\t10937100\t0.007\t87\nchr8\t12038700\t12039300\t0\t36\nchr8\t12041700\t12046800\t0\t34\nchr8\t12050100\t12051300\t0\t27\nchr8\t12053100\t12056100\t0\t39\nchr8\t12057600\t12060000\t0\t39\nchr8\t12061500\t12061800\t0\t39\nchr8\t12063000\t12072900\t0\t38\nchr8\t12075000\t12075300\t0\t10\nchr8\t12076800\t12077100\t0\t17\nchr8\t12079800\t12081300\t0\t13\nchr8\t12082500\t12088800\t0\t101\nchr8\t12090300\t12104400\t0\t101\nchr8\t12106500\t12111900\t0\t37\nchr8\t12113400\t12115500\t0\t29\nchr8\t12118800\t12119100\t0\t23\nchr8\t12121200\t12121500\t0\t23\nchr8\t12149400\t12149700\t0.1146\t59\nchr8\t12151800\t12156900\t0\t68\nchr8\t12158400\t12159600\t0\t59\nchr8\t12160800\t12174300\t0\t74\nchr8\t12177600\t12177900\t0\t22\nchr8\t12180900\t12182100\t0\t52\nchr8\t12184200\t12192300\t0\t82\nchr8\t12195600\t12196500\t0\t97\nchr8\t12198300\t12199800\t0\t99\nchr8\t12202500\t12205200\t0\t99\nchr8\t12210000\t12210300\t0.0028\t91\nchr8\t12211800\t12217800\t0\t99\nchr8\t12219900\t12222600\t0\t94\nchr8\t12225000\t12225300\t0.2059\t63\nchr8\t12229200\t12229500\t0.1278\t70\nchr8\t12285300\t12286500\t0.0194\t38\nchr8\t12288600\t12290100\t0.0186\t36\nchr8\t12292500\t12297600\t0\t39\nchr8\t12299100\t12308100\t0\t43\nchr8\t12309600\t12314700\t0\t43\nchr8\t12316200\t12318300\t0\t28\nchr8\t12328800\t12330000\t0.115\t19\nchr8\t12333300\t12333900\t0.0606\t25\nchr8\t12337200\t12341100\t0\t51\nchr8\t12342600\t12348900\t0\t116\nchr8\t12350400\t12351000\t0\t116\nchr8\t12352800\t12354900\t0\t35\nchr8\t12356100\t12357900\t0\t35\nchr8\t12359700\t12362100\t0\t29\nchr8\t12363900\t12365700\t0\t49\nchr8\t12367500\t12367800\t0\t49\nchr8\t12369600\t12370500\t0\t45\nchr8\t12372000\t12373500\t0\t34\nchr8\t12391800\t12392100\t0.1055\t55\nchr8\t12394800\t12401700\t0\t68\nchr8\t12402900\t12414600\t0\t75\nchr8\t12416100\t12420300\t0\t80\nchr8\t12423600\t12432600\t0\t90\nchr8\t12434100\t12434700\t0\t90\nchr8\t12438300\t12438600\t0\t102\nchr8\t12440100\t12441300\t0\t102\nchr8\t12442500\t12442800\t0\t102\nchr8\t12444600\t12451200\t0\t115\nchr8\t12452400\t12461100\t0\t115\nchr8\t12462300\t12475200\t0\t115\nchr8\t12477300\t12479100\t0\t88\nchr8\t12480300\t12483300\t0.0051\t73\nchr8\t12489000\t12496500\t0\t117\nchr8\t12497700\t12501900\t0\t117\nchr8\t12503100\t12507300\t0\t86\nchr8\t12509400\t12511200\t0\t107\nchr8\t12512400\t12512700\t0.0847\t46\nchr8\t12514200\t12517800\t0\t84\nchr8\t12520200\t12520800\t0.0088\t96\nchr8\t12522600\t12523800\t0.0024\t96\nchr8\t12528000\t12528300\t0.1528\t88\nchr8\t12529800\t12532200\t0.0044\t98\nchr8\t12533700\t12537300\t0\t75\nchr8\t12600000\t12601200\t0.204\t69\nchr8\t12602700\t12603000\t0.0589\t73\nchr8\t12604200\t12606000\t0\t75\nchr8\t12607500\t12609900\t0\t75\nchr8\t12625800\t12626100\t0.0381\t96\nchr8\t13920600\t13920900\t0.1277\t21\nchr8\t14805000\t14805300\t0.0551\t86\nchr8\t15557100\t15558600\t0.0044\t48\nchr8\t15559800\t15561000\t0.0338\t103\nchr8\t15579300\t15580800\t0.0167\t97\nchr8\t16672800\t16674600\t0.1635\t76\nchr8\t16946400\t16946700\t0.1322\t57\nchr8\t18002100\t18002700\t0.046\t56\nchr8\t18597300\t18598500\t0\t78\nchr8\t18794100\t18794700\t0\t68\nchr8\t18910200\t18910500\t0.1298\t78\nchr8\t20685000\t20685600\t0.0991\t61\nchr8\t23312700\t23313000\t0.1549\t54\nchr8\t24255300\t24255900\t0.0081\t62\nchr8\t25216200\t25216800\t0\t40\nchr8\t25730700\t25735200\t0.0346\t65\nchr8\t26005200\t26005500\t0.0446\t17\nchr8\t26396100\t26399700\t0\t97\nchr8\t27060900\t27061500\t0.0135\t55\nchr8\t27114300\t27119400\t0\t106\nchr8\t27552900\t27553200\t0.0278\t55\nchr8\t29120400\t29121600\t0.0084\t83\nchr8\t30246600\t30246900\t0.2982\t38\nchr8\t30393900\t30407700\t0\t39\nchr8\t32816700\t32819400\t0\t68\nchr8\t33262800\t33263100\t0.0526\t51\nchr8\t35173500\t35174100\t0.0004\t103\nchr8\t35175300\t35176500\t0.0004\t103\nchr8\t35523600\t35524200\t0\t44\nchr8\t35529600\t35532900\t0\t101\nchr8\t36484800\t36485400\t0.0252\t96\nchr8\t37193400\t37194300\t0\t74\nchr8\t39491400\t39492000\t0.0059\t16\nchr8\t40432800\t40437900\t0\t80\nchr8\t40652400\t40652700\t0.1323\t55\nchr8\t41018700\t41019000\t0.1613\t66\nchr8\t41503500\t41503800\t0.0807\t44\nchr8\t43238100\t43238400\t0.2996\t485\nchr8\t43260900\t43261200\t0.0277\t73\nchr8\t43905900\t43906200\t0.0003\t67\nchr8\t43938000\t43939800\t0\t32\nchr8\t43941900\t43942500\t0.0083\t102\nchr8\t43944300\t43947900\t0\t71\nchr8\t43949400\t43950300\t0\t71\nchr8\t43952100\t43953000\t0\t71\nchr8\t43957200\t43959900\t0\t79\nchr8\t43961700\t43962000\t0.0143\t61\nchr8\t43967400\t43983900\t0\t87\nchr8\t44034000\t44036400\t0\t306\nchr8\t44037900\t44117400\t0\t306\nchr8\t44118600\t44316300\t0\t306\nchr8\t44317800\t44401800\t0\t306\nchr8\t44403000\t44489400\t0\t306\nchr8\t44490900\t44740500\t0\t285\nchr8\t44741700\t44828100\t0\t285\nchr8\t44829300\t44968200\t0\t433\nchr8\t44969400\t45015600\t0\t433\nchr8\t45016800\t45031200\t0\t268\nchr8\t45032400\t45391200\t0\t268\nchr8\t45392700\t45405300\t0\t268\nchr8\t45406800\t45620100\t0\t268\nchr8\t45621300\t45705600\t0\t268\nchr8\t45707100\t45877200\t0\t177\nchr8\t45930600\t45930900\t0\t23\nchr8\t45932400\t45933000\t0\t35\nchr8\t45936600\t45939900\t0\t75\nchr8\t45941100\t45945600\t0\t75\nchr8\t45948000\t45951600\t0\t99\nchr8\t45952800\t45954000\t0\t99\nchr8\t45955500\t45956700\t0\t72\nchr8\t45959400\t45960600\t0\t68\nchr8\t45962400\t45964500\t0\t68\nchr8\t45965700\t45966000\t0.0447\t55\nchr8\t45968700\t45969300\t0.0632\t58\nchr8\t46983900\t46984500\t0.1117\t79\nchr8\t47235000\t47235300\t0.0528\t99\nchr8\t47332200\t47332800\t0.0299\t126\nchr8\t48944100\t48944400\t0.0347\t85\nchr8\t50166000\t50166600\t0\t51\nchr8\t51535200\t51535500\t0.0571\t86\nchr8\t53612700\t53614200\t0.0498\t51\nchr8\t54031800\t54032400\t0.0081\t83\nchr8\t54126000\t54126300\t0.2784\t55\nchr8\t54594000\t54594300\t0.2646\t63\nchr8\t56419200\t56419500\t0.1547\t54\nchr8\t57160500\t57160800\t0.1778\t60\nchr8\t57206400\t57207600\t0.0003\t420\nchr8\t57211200\t57213900\t0.0126\t479\nchr8\t58483500\t58484400\t0.0807\t65\nchr8\t58915800\t58920300\t0\t75\nchr8\t59169900\t59170200\t0.0673\t61\nchr8\t61268700\t61269000\t0.0827\t80\nchr8\t61752000\t61752300\t0.0095\t44\nchr8\t63797700\t63800700\t0.0122\t97\nchr8\t63802200\t63802800\t0.0821\t61\nchr8\t64685400\t64685700\t0.1411\t58\nchr8\t65121900\t65122200\t0.1778\t73\nchr8\t66024600\t66025800\t0\t87\nchr8\t66949800\t66950100\t0.1332\t78\nchr8\t68362800\t68367600\t0.0082\t124\nchr8\t69689100\t69689700\t0.0514\t39\nchr8\t70671900\t70672200\t0.0517\t56\nchr8\t71409300\t71409600\t0.0079\t72\nchr8\t71410800\t71411400\t0.0079\t72\nchr8\t72150000\t72150600\t0.045\t65\nchr8\t72152100\t72152400\t0.2234\t47\nchr8\t72482100\t72482400\t0.0639\t86\nchr8\t72484500\t72484800\t0.0639\t86\nchr8\t72875700\t72881400\t0\t93\nchr8\t74947500\t74947800\t0.102\t68\nchr8\t75280500\t75282900\t0.0279\t91\nchr8\t75445200\t75446700\t0\t70\nchr8\t75447900\t75448200\t0.119\t57\nchr8\t75621600\t75626700\t0\t70\nchr8\t76425300\t76426200\t0\t58\nchr8\t79171800\t79174200\t0\t71\nchr8\t80358600\t80358900\t0.0125\t87\nchr8\t81134100\t81134400\t0.2326\t45\nchr8\t81429600\t81430200\t0.2223\t66\nchr8\t81768600\t81768900\t0.1745\t75\nchr8\t81771900\t81772200\t0.1092\t88\nchr8\t83451300\t83451600\t0.0802\t67\nchr8\t83883600\t83883900\t0\t21\nchr8\t84421200\t84422700\t0.1842\t86\nchr8\t84465300\t84465900\t0.0535\t68\nchr8\t84615900\t84616200\t0.1314\t185\nchr8\t84618600\t84618900\t0.0074\t77\nchr8\t85642800\t85643700\t0\t462\nchr8\t85645500\t85650900\t0\t1042\nchr8\t85652400\t85659900\t0\t1042\nchr8\t85661700\t85664100\t0.0092\t534\nchr8\t85714200\t85741500\t0\t1030\nchr8\t85743600\t85828500\t0\t1030\nchr8\t87326700\t87327000\t0.1693\t73\nchr8\t87629400\t87629700\t0.0653\t51\nchr8\t88149900\t88150500\t0.0302\t89\nchr8\t88152000\t88152900\t0.0302\t89\nchr8\t88154100\t88154400\t0.0302\t89\nchr8\t88251900\t88252200\t0.1668\t71\nchr8\t88380000\t88380300\t0.1809\t12\nchr8\t88686300\t88691400\t0\t72\nchr8\t89555700\t89556300\t0.0307\t56\nchr8\t90684300\t90685500\t0.0348\t101\nchr8\t91193400\t91193700\t0.0993\t69\nchr8\t91307100\t91307400\t0.1406\t79\nchr8\t91520400\t91527600\t0\t76\nchr8\t91559100\t91564200\t0\t90\nchr8\t91895400\t91895700\t0.1773\t84\nchr8\t93406500\t93411300\t0\t140\nchr8\t94590300\t94590900\t0\t76\nchr8\t95368500\t95369100\t0.0939\t81\nchr8\t95370300\t95370600\t0.0939\t81\nchr8\t95371800\t95372100\t0.0939\t81\nchr8\t95552400\t95555400\t0.0304\t76\nchr8\t95556600\t95557800\t0.0304\t76\nchr8\t96118800\t96119100\t0.1411\t96\nchr8\t96121800\t96122100\t0.219\t78\nchr8\t96739200\t96739500\t0.2045\t75\nchr8\t97296000\t97300200\t0.0152\t120\nchr8\t98261400\t98261700\t0.2869\t68\nchr8\t98615700\t98616300\t0.1299\t71\nchr8\t98619600\t98620200\t0.0462\t88\nchr8\t99052200\t99052500\t0.0775\t56\nchr8\t99293100\t99293400\t0.1339\t80\nchr8\t99426300\t99427200\t0.0329\t68\nchr8\t99693900\t99694500\t0\t67\nchr8\t101893500\t101893800\t0.1275\t75\nchr8\t101896800\t101897100\t0.1993\t39\nchr8\t103604700\t103605300\t0.0797\t60\nchr8\t103607700\t103608000\t0.2395\t69\nchr8\t103784400\t103784700\t0.1139\t70\nchr8\t104740200\t104741400\t0.0169\t72\nchr8\t104742600\t104744700\t0\t66\nchr8\t105169200\t105169500\t0.0012\t24\nchr8\t105367200\t105368100\t0.0031\t62\nchr8\t107891100\t107891400\t0.1317\t31\nchr8\t110888100\t110888400\t0.0564\t29\nchr8\t110953500\t110954400\t0.0172\t74\nchr8\t110956500\t110956800\t0.1953\t48\nchr8\t111156000\t111156300\t0.0965\t23\nchr8\t112595400\t112595700\t0.0549\t47\nchr8\t112597500\t112597800\t0.1341\t70\nchr8\t112911600\t112911900\t0.1442\t210\nchr8\t113304300\t113304600\t0.078\t61\nchr8\t113451600\t113451900\t0.0702\t46\nchr8\t113674500\t113674800\t0.1035\t73\nchr8\t113909700\t113910300\t0.0692\t68\nchr8\t114003300\t114003600\t0.1511\t80\nchr8\t114509100\t114509400\t0.0847\t83\nchr8\t114581700\t114582000\t0.168\t48\nchr8\t114633300\t114633600\t0.0736\t56\nchr8\t116679600\t116680800\t0.0955\t88\nchr8\t119160000\t119160300\t0.07\t55\nchr8\t119162100\t119162700\t0.0036\t78\nchr8\t119163900\t119164200\t0.1665\t70\nchr8\t119235900\t119236200\t0.0197\t68\nchr8\t120351600\t120353400\t0.0046\t68\nchr8\t120522000\t120522300\t0.1721\t35\nchr8\t120646200\t120646500\t0.1927\t62\nchr8\t120647700\t120648300\t0.0217\t85\nchr8\t121782000\t121782300\t0.2049\t57\nchr8\t122249700\t122250000\t0.0467\t78\nchr8\t123860100\t123863700\t0.034\t84\nchr8\t125583000\t125588700\t0\t85\nchr8\t126236700\t126237000\t0.1965\t21\nchr8\t126313500\t126313800\t0.0197\t59\nchr8\t126315000\t126315300\t0.0197\t59\nchr8\t126317100\t126317400\t0.0587\t51\nchr8\t126801600\t126801900\t0.0722\t65\nchr8\t126980700\t126981600\t0.0071\t33\nchr8\t126984000\t126985500\t0.0207\t38\nchr8\t127203600\t127203900\t0.1562\t51\nchr8\t127317300\t127317600\t0.0484\t49\nchr8\t127320300\t127320600\t0.1563\t57\nchr8\t127380000\t127381800\t0.0013\t57\nchr8\t127630500\t127630800\t0.2566\t75\nchr8\t128453100\t128458800\t0\t92\nchr8\t128717100\t128717700\t0.0498\t57\nchr8\t128825100\t128826000\t0.1021\t71\nchr8\t128892000\t128892300\t0.0915\t58\nchr8\t128894700\t128895000\t0.0915\t58\nchr8\t128896500\t128896800\t0.0915\t58\nchr8\t129153600\t129155700\t0.0904\t59\nchr8\t129329100\t129329400\t0.0595\t94\nchr8\t129496500\t129497700\t0.0289\t40\nchr8\t131772300\t131773800\t0.0213\t98\nchr8\t132618300\t132618600\t0.0511\t77\nchr8\t133313100\t133313400\t0\t38\nchr8\t134070900\t134076600\t0\t98\nchr8\t135260400\t135260700\t0.1285\t64\nchr8\t135262200\t135264300\t0.0609\t83\nchr8\t135876300\t135881700\t0\t69\nchr8\t135884400\t135884700\t0.1787\t44\nchr8\t135954900\t135955200\t0.0074\t58\nchr8\t136191000\t136191600\t0.1389\t84\nchr8\t136438500\t136438800\t0.1708\t75\nchr8\t136440000\t136443300\t0\t67\nchr8\t137236200\t137236500\t0.0495\t27\nchr8\t137560500\t137560800\t0.2281\t65\nchr8\t138952500\t138952800\t0.0535\t71\nchr8\t139460100\t139460400\t0.1756\t74\nchr8\t140196300\t140196600\t0.1362\t98\nchr8\t140622300\t140623200\t0.1398\t43\nchr8\t141335100\t141335700\t0.021\t68\nchr8\t141492300\t141493200\t0\t325\nchr8\t141550800\t141551100\t0.2214\t28\nchr8\t141633300\t141634500\t0\t40\nchr8\t141970800\t141971100\t0.0677\t44\nchr8\t142390500\t142390800\t0.2071\t47\nchr8\t142760700\t142761000\t0.2302\t52\nchr8\t143458500\t143458800\t0.2622\t57\nchr8\t143661900\t143662200\t0.2343\t88\nchr8\t143858400\t143858700\t0.0166\t113\nchr8\t143860200\t143866500\t0\t150\nchr8\t143981400\t143981700\t0.2027\t142\nchr8\t144531300\t144531900\t0.0396\t171\nchr8\t144612300\t144612600\t0.0068\t59\nchr8\t144625500\t144626400\t0.1235\t45\nchr8\t144634200\t144634800\t0.0431\t32\nchr9\t12300\t13800\t0.0465\t151\nchr9\t15000\t28800\t0\t160\nchr9\t30000\t31500\t0\t160\nchr9\t32700\t38700\t0\t160\nchr9\t51300\t51600\t0.0617\t132\nchr9\t56100\t56400\t0.0771\t133\nchr9\t66000\t68400\t0\t97\nchr9\t77400\t78000\t0.0222\t125\nchr9\t96300\t96600\t0.1799\t76\nchr9\t119700\t120000\t0.077\t66\nchr9\t122700\t123000\t0.1411\t78\nchr9\t124500\t124800\t0.0606\t88\nchr9\t126000\t126300\t0.0606\t88\nchr9\t130800\t131100\t0.0441\t52\nchr9\t132900\t134700\t0.002\t77\nchr9\t135900\t136500\t0.0121\t48\nchr9\t137700\t138000\t0.0788\t64\nchr9\t168000\t168300\t0.1403\t95\nchr9\t183900\t185100\t0.0012\t77\nchr9\t320100\t322200\t0\t60\nchr9\t380100\t380700\t0\t54\nchr9\t707700\t708000\t0.0013\t84\nchr9\t998700\t999000\t0.2021\t49\nchr9\t1225200\t1229400\t0.0053\t78\nchr9\t1338300\t1338600\t0\t78\nchr9\t3504600\t3504900\t0.2378\t17\nchr9\t3780600\t3780900\t0.1316\t40\nchr9\t4346700\t4347000\t0.26\t24\nchr9\t4608000\t4608600\t0.0984\t90\nchr9\t5240100\t5242800\t0\t76\nchr9\t5303100\t5304300\t0\t56\nchr9\t5338200\t5339400\t0\t71\nchr9\t5962500\t5962800\t0.009\t52\nchr9\t6179400\t6179700\t0.1712\t98\nchr9\t7668000\t7668300\t0.0211\t74\nchr9\t9932400\t9932700\t0.1648\t66\nchr9\t10020600\t10022400\t0\t37\nchr9\t10136700\t10137600\t0\t90\nchr9\t12337500\t12337800\t0.0957\t73\nchr9\t12477000\t12477600\t0.0531\t59\nchr9\t12557100\t12559500\t0\t67\nchr9\t13040100\t13040400\t0.0964\t13\nchr9\t13043100\t13043400\t0.0681\t30\nchr9\t14666700\t14668200\t0.0155\t83\nchr9\t15406500\t15407400\t0.0065\t43\nchr9\t16466100\t16467300\t0\t49\nchr9\t17576400\t17576700\t0.1145\t40\nchr9\t17686200\t17686500\t0.0629\t59\nchr9\t17764800\t17765100\t0.1421\t45\nchr9\t17780700\t17781300\t0.017\t60\nchr9\t17912400\t17912700\t0.0514\t26\nchr9\t17924700\t17925000\t0.2098\t105\nchr9\t17944800\t17945100\t0.0754\t50\nchr9\t19536600\t19541100\t0.0128\t84\nchr9\t20657400\t20657700\t0.0304\t51\nchr9\t21537300\t21538200\t0.0006\t107\nchr9\t21540900\t21541500\t0.1682\t79\nchr9\t22350600\t22350900\t0.0746\t57\nchr9\t22353900\t22354200\t0.1106\t111\nchr9\t22701000\t22701300\t0.052\t35\nchr9\t22999500\t22999800\t0.0251\t23\nchr9\t23075100\t23075400\t0.1368\t28\nchr9\t23936100\t23936700\t0.0312\t55\nchr9\t24576600\t24576900\t0.0318\t45\nchr9\t25073700\t25074000\t0.1617\t107\nchr9\t25285800\t25286100\t0.2672\t52\nchr9\t27691800\t27692100\t0.2453\t59\nchr9\t27694200\t27694500\t0.0681\t43\nchr9\t28112100\t28116900\t0\t85\nchr9\t28349400\t28349700\t0.234\t73\nchr9\t29306100\t29306400\t0.1966\t66\nchr9\t29624700\t29625000\t0.0911\t22\nchr9\t31299300\t31299600\t0.0765\t78\nchr9\t32711400\t32711700\t0.0557\t35\nchr9\t32713500\t32713800\t0.0216\t14\nchr9\t34244400\t34245900\t0\t68\nchr9\t34273500\t34274700\t0\t69\nchr9\t35373300\t35373900\t0\t12\nchr9\t38241600\t38241900\t0.1446\t45\nchr9\t38243100\t38243400\t0.0138\t56\nchr9\t38775900\t38776500\t0\t48\nchr9\t38781000\t38781600\t0.051\t61\nchr9\t38783700\t38784000\t0.0923\t47\nchr9\t38798100\t38798400\t0.1305\t26\nchr9\t38816100\t38816400\t0.0544\t43\nchr9\t38819100\t38819700\t0.0864\t49\nchr9\t38824200\t38825100\t0.0176\t56\nchr9\t38829000\t38829300\t0.1478\t36\nchr9\t38832900\t38835600\t0\t66\nchr9\t38836800\t38838600\t0\t66\nchr9\t38840700\t38843400\t0\t66\nchr9\t38845200\t38845500\t0\t52\nchr9\t38847000\t38851800\t0\t52\nchr9\t38853900\t38862900\t0\t58\nchr9\t38865000\t38865300\t0.0351\t47\nchr9\t38866500\t38875200\t0\t67\nchr9\t38880600\t38889600\t0\t58\nchr9\t38891400\t38896200\t0\t74\nchr9\t38898300\t38916600\t0\t59\nchr9\t38919300\t38920200\t0.0604\t63\nchr9\t38924400\t38925000\t0.0074\t46\nchr9\t38926200\t38926800\t0\t80\nchr9\t38929200\t38932500\t0\t80\nchr9\t38934300\t38936100\t0\t80\nchr9\t38937600\t38946600\t0\t80\nchr9\t38949000\t38949600\t0.1143\t49\nchr9\t38952000\t38952300\t0\t69\nchr9\t38953500\t38955900\t0\t69\nchr9\t38957100\t38957400\t0.0522\t49\nchr9\t38959800\t38960700\t0\t65\nchr9\t38963100\t38964000\t0.0021\t76\nchr9\t38966400\t38968500\t0\t89\nchr9\t38969700\t38972400\t0\t89\nchr9\t38973900\t38975100\t0.093\t88\nchr9\t38979300\t38985900\t0\t134\nchr9\t38988600\t38988900\t0.1313\t86\nchr9\t38998500\t38998800\t0.0713\t97\nchr9\t39150300\t39150600\t0.0821\t20\nchr9\t39153000\t39153600\t0.009\t33\nchr9\t39156600\t39159000\t0\t38\nchr9\t39160200\t39162600\t0\t42\nchr9\t39163800\t39164400\t0\t42\nchr9\t39165900\t39174300\t0\t42\nchr9\t39175800\t39177600\t0\t36\nchr9\t39179400\t39180300\t0\t50\nchr9\t39181800\t39248400\t0\t50\nchr9\t39252000\t39252900\t0\t44\nchr9\t39254100\t39288000\t0\t38\nchr9\t39289500\t39339300\t0\t69\nchr9\t39340500\t39341700\t0\t69\nchr9\t39344100\t39357000\t0\t63\nchr9\t39360000\t39360300\t0.015\t65\nchr9\t39363300\t39367200\t0\t53\nchr9\t39369300\t39386700\t0\t66\nchr9\t39388500\t39412200\t0\t79\nchr9\t39413400\t39422100\t0\t79\nchr9\t39423600\t39446400\t0\t70\nchr9\t39452700\t39453000\t0.114\t52\nchr9\t39469200\t39469500\t0.1398\t53\nchr9\t39487800\t39488100\t0.0946\t66\nchr9\t39489900\t39491700\t0\t66\nchr9\t39493200\t39496200\t0\t64\nchr9\t39497400\t39498600\t0\t64\nchr9\t39499800\t39504000\t0\t112\nchr9\t39507000\t39508200\t0\t112\nchr9\t39509400\t39517200\t0\t112\nchr9\t39519000\t39520800\t0\t112\nchr9\t39522900\t39531600\t0\t111\nchr9\t39534300\t39536100\t0\t111\nchr9\t39549000\t39549300\t0.015\t81\nchr9\t39569400\t39569700\t0.099\t44\nchr9\t39573300\t39573600\t0.0628\t65\nchr9\t39593700\t39594000\t0\t90\nchr9\t39596400\t39601800\t0\t90\nchr9\t39603300\t39604200\t0\t90\nchr9\t39611400\t39613200\t0.0296\t57\nchr9\t39616200\t39626400\t0\t71\nchr9\t39627600\t39664200\t0\t98\nchr9\t39665400\t39666300\t0\t73\nchr9\t39667500\t39721800\t0\t73\nchr9\t39723000\t39744000\t0\t77\nchr9\t39745500\t39758400\t0\t77\nchr9\t39759600\t39773100\t0\t83\nchr9\t39774300\t39777000\t0\t75\nchr9\t39778500\t39788100\t0\t75\nchr9\t39789300\t39790200\t0.003\t74\nchr9\t39791700\t39792000\t0.003\t74\nchr9\t39793500\t39800400\t0\t87\nchr9\t39801600\t39802500\t0\t87\nchr9\t39804000\t39804300\t0.0037\t78\nchr9\t39805800\t39807000\t0.0037\t78\nchr9\t39808200\t39808500\t0.0037\t78\nchr9\t39812100\t39812400\t0.1315\t80\nchr9\t39814800\t39818400\t0.007\t67\nchr9\t39819900\t39820500\t0.0018\t71\nchr9\t39822300\t39824100\t0\t70\nchr9\t39839100\t39842100\t0\t101\nchr9\t39843300\t40000800\t0\t101\nchr9\t40002600\t40002900\t0\t101\nchr9\t40004700\t40005600\t0\t85\nchr9\t40008000\t40012200\t0\t85\nchr9\t40013400\t40013700\t0\t85\nchr9\t40015500\t40016100\t0.0324\t77\nchr9\t40026600\t40027200\t0.0257\t66\nchr9\t40032000\t40032300\t0.1155\t39\nchr9\t40033500\t40035000\t0.0588\t56\nchr9\t40037100\t40038300\t0\t52\nchr9\t40040100\t40040400\t0\t58\nchr9\t40041600\t40043400\t0\t58\nchr9\t40044900\t40045500\t0\t58\nchr9\t40047300\t40049100\t0\t69\nchr9\t40052100\t40054200\t0\t70\nchr9\t40056000\t40056300\t0.0977\t49\nchr9\t40059900\t40061400\t0\t49\nchr9\t40064700\t40068000\t0.0025\t60\nchr9\t40070700\t40083900\t0\t82\nchr9\t40085100\t40086900\t0\t82\nchr9\t40088700\t40091700\t0\t64\nchr9\t40092900\t40095300\t0\t64\nchr9\t40097700\t40098900\t0\t64\nchr9\t40100400\t40105800\t0\t57\nchr9\t40107000\t40111500\t0\t57\nchr9\t40112700\t40114200\t0\t57\nchr9\t40115700\t40127100\t0\t90\nchr9\t40128600\t40128900\t0\t90\nchr9\t40131300\t40133700\t0\t95\nchr9\t40134900\t40137300\t0\t95\nchr9\t40138800\t40139100\t0\t94\nchr9\t40140900\t40163100\t0\t94\nchr9\t40164600\t40171800\t0\t94\nchr9\t40173000\t40174200\t0\t94\nchr9\t40178400\t40179300\t0\t51\nchr9\t40180500\t40183500\t0\t51\nchr9\t40184700\t40189500\t0\t51\nchr9\t40198500\t40199700\t0.062\t56\nchr9\t40200900\t40217100\t0\t55\nchr9\t40218600\t40219200\t0.1122\t85\nchr9\t40222200\t40222500\t0.1736\t23\nchr9\t40227000\t40228500\t0.0096\t67\nchr9\t40229700\t40297200\t0\t136\nchr9\t40299300\t40344900\t0\t136\nchr9\t40346100\t40383000\t0\t136\nchr9\t40384200\t40386300\t0\t54\nchr9\t40387800\t40389600\t0.0022\t83\nchr9\t40391700\t40401000\t0\t95\nchr9\t40402200\t40414200\t0\t95\nchr9\t40415700\t40472100\t0\t95\nchr9\t40473900\t40478400\t0\t95\nchr9\t40479600\t40486200\t0\t95\nchr9\t40488000\t40501200\t0\t54\nchr9\t40503000\t40533900\t0\t54\nchr9\t40536000\t40536300\t0.1878\t19\nchr9\t40538400\t40543200\t0\t52\nchr9\t40545900\t40546800\t0\t122\nchr9\t40548600\t40553100\t0\t122\nchr9\t40554900\t40561200\t0\t122\nchr9\t40562400\t40568400\t0\t122\nchr9\t40569600\t40570500\t0\t122\nchr9\t40572000\t40572900\t0.0016\t55\nchr9\t40574100\t40575000\t0\t65\nchr9\t40577700\t40578000\t0.1219\t96\nchr9\t40581900\t40582800\t0\t78\nchr9\t40585200\t40586400\t0.0013\t72\nchr9\t40588200\t40589400\t0\t87\nchr9\t40590900\t40591200\t0.0059\t70\nchr9\t40593000\t40595100\t0\t102\nchr9\t40596900\t40598700\t0\t102\nchr9\t40600200\t40607700\t0\t102\nchr9\t40608900\t40609500\t0\t102\nchr9\t40611600\t40646400\t0\t64\nchr9\t40647600\t40649100\t0\t56\nchr9\t40651800\t40661100\t0\t67\nchr9\t40662600\t40695900\t0\t67\nchr9\t40700400\t40702500\t0\t56\nchr9\t40704600\t40705800\t0.0442\t54\nchr9\t40709400\t40711500\t0\t65\nchr9\t40713600\t40714200\t0.1554\t48\nchr9\t40715400\t40715700\t0.015\t70\nchr9\t40717500\t40718100\t0.0021\t48\nchr9\t40719300\t40720200\t0.1169\t73\nchr9\t40723200\t40724700\t0.0718\t74\nchr9\t40728300\t40729200\t0\t76\nchr9\t40730400\t40730700\t0\t76\nchr9\t40731900\t40735200\t0.0082\t65\nchr9\t40738200\t40738500\t0.0134\t51\nchr9\t40740600\t40740900\t0.0089\t43\nchr9\t40743300\t40745100\t0.0047\t57\nchr9\t40746300\t40747800\t0.0024\t66\nchr9\t40749600\t40752300\t0\t74\nchr9\t40754100\t40754400\t0\t74\nchr9\t40759500\t40759800\t0.0108\t62\nchr9\t40763100\t40764300\t0\t76\nchr9\t40765500\t40768200\t0\t76\nchr9\t40770000\t40770900\t0\t64\nchr9\t40773900\t40774500\t0.0035\t46\nchr9\t40776600\t40777200\t0.034\t70\nchr9\t40778400\t40778700\t0.0124\t61\nchr9\t40785300\t40786500\t0.0173\t69\nchr9\t40792500\t40794300\t0\t78\nchr9\t40795500\t40796100\t0\t78\nchr9\t40798800\t40799100\t0\t78\nchr9\t40801200\t40801500\t0.0983\t62\nchr9\t40803300\t40804500\t0\t56\nchr9\t40809300\t40809600\t0.0058\t72\nchr9\t40814400\t40814700\t0.044\t72\nchr9\t40820400\t40820700\t0.025\t86\nchr9\t40821900\t40823100\t0.025\t86\nchr9\t40827300\t40827900\t0\t67\nchr9\t40830300\t40830600\t0.1226\t93\nchr9\t40834500\t40835100\t0\t67\nchr9\t40842000\t40843500\t0.0024\t68\nchr9\t40848900\t40849200\t0.0782\t43\nchr9\t40852500\t40852800\t0.0178\t87\nchr9\t40854300\t40854600\t0.0178\t87\nchr9\t40856100\t40856400\t0.0178\t87\nchr9\t40863900\t40867200\t0\t83\nchr9\t40967400\t40968000\t0.0942\t159\nchr9\t41057400\t41057700\t0.0854\t136\nchr9\t41077800\t41078100\t0.2073\t99\nchr9\t41081400\t41081700\t0.1175\t121\nchr9\t41102700\t41103600\t0\t119\nchr9\t41105100\t41105400\t0.0514\t162\nchr9\t41107800\t41108100\t0.0644\t79\nchr9\t41109600\t41110200\t0.0006\t190\nchr9\t41114700\t41115300\t0\t147\nchr9\t41116800\t41117100\t0\t147\nchr9\t41118600\t41118900\t0\t179\nchr9\t41121000\t41124000\t0\t179\nchr9\t41125200\t41126700\t0\t179\nchr9\t41127900\t41131800\t0\t179\nchr9\t41133000\t41138700\t0\t119\nchr9\t41140200\t41140800\t0\t99\nchr9\t41142300\t41143800\t0\t99\nchr9\t41145000\t41150700\t0\t99\nchr9\t41152800\t41154300\t0\t99\nchr9\t41155500\t41155800\t0\t113\nchr9\t41157900\t41163900\t0\t113\nchr9\t41165100\t41175900\t0\t113\nchr9\t41177400\t41183100\t0\t113\nchr9\t41185800\t41186700\t0\t59\nchr9\t41187900\t41197500\t0\t97\nchr9\t41198700\t41200500\t0\t97\nchr9\t41203500\t41206500\t0\t97\nchr9\t41208000\t41211000\t0.0197\t67\nchr9\t41214600\t41216700\t0\t217\nchr9\t41217900\t41223300\t0\t217\nchr9\t41262300\t41262900\t0.1451\t181\nchr9\t41265600\t41265900\t0.0365\t118\nchr9\t41268000\t41268900\t0\t137\nchr9\t41272200\t41272800\t0\t112\nchr9\t41277000\t41277900\t0\t102\nchr9\t41283600\t41283900\t0.1177\t126\nchr9\t41286600\t41287800\t0.0407\t95\nchr9\t41293500\t41293800\t0.0366\t74\nchr9\t41297400\t41298300\t0\t63\nchr9\t41300400\t41301900\t0.0004\t76\nchr9\t41305200\t41305500\t0.0347\t69\nchr9\t41311200\t41311500\t0\t85\nchr9\t41317500\t41317800\t0.0187\t74\nchr9\t41320800\t41321100\t0.0303\t107\nchr9\t41322600\t41324100\t0.0303\t107\nchr9\t41328000\t41328300\t0.0086\t65\nchr9\t41331000\t41331300\t0.0978\t63\nchr9\t41337900\t41341200\t0\t92\nchr9\t41344200\t41344500\t0.0081\t75\nchr9\t41347500\t41347800\t0.0359\t80\nchr9\t41351700\t41352000\t0.0859\t70\nchr9\t41359800\t41365500\t0\t75\nchr9\t41372400\t41372700\t0.0082\t53\nchr9\t41375700\t41376000\t0.0133\t54\nchr9\t41382300\t41383200\t0\t61\nchr9\t41386800\t41387100\t0.1759\t46\nchr9\t41391000\t41392500\t0.0698\t54\nchr9\t41394300\t41394600\t0.0355\t91\nchr9\t41395800\t41396700\t0.018\t60\nchr9\t41398200\t41400000\t0\t63\nchr9\t41403300\t41403600\t0.1142\t62\nchr9\t41410500\t41413800\t0\t51\nchr9\t41415000\t41415300\t0.0386\t21\nchr9\t41424000\t41424300\t0.1064\t11\nchr9\t41429700\t41430000\t0.1093\t136\nchr9\t41434500\t41434800\t0.1929\t48\nchr9\t41438100\t41438700\t0.017\t46\nchr9\t41441400\t41442000\t0\t65\nchr9\t41443200\t41443500\t0\t65\nchr9\t41448600\t41449200\t0\t61\nchr9\t41450700\t41451900\t0.0106\t42\nchr9\t41455500\t41455800\t0.0326\t74\nchr9\t41461800\t41462100\t0.1144\t40\nchr9\t41469900\t41470200\t0.0514\t65\nchr9\t41471400\t41471700\t0.0514\t65\nchr9\t41479500\t41479800\t0.0246\t63\nchr9\t41491200\t41491800\t0.0248\t54\nchr9\t41494500\t41495400\t0\t70\nchr9\t41500500\t41501100\t0.0005\t90\nchr9\t41515800\t41516100\t0.0148\t70\nchr9\t41525700\t41527200\t0\t66\nchr9\t41532900\t41533200\t0.0388\t79\nchr9\t41541600\t41541900\t0.2599\t49\nchr9\t41544000\t41547900\t0\t88\nchr9\t41551800\t41552400\t0\t71\nchr9\t41555100\t41556000\t0.0797\t56\nchr9\t41574000\t41574300\t0\t129\nchr9\t41575500\t41607300\t0\t129\nchr9\t41608800\t41614200\t0\t90\nchr9\t41615400\t41616600\t0.0568\t107\nchr9\t41620500\t41622000\t0\t106\nchr9\t41628300\t41631900\t0\t121\nchr9\t41636100\t41637600\t0.0045\t77\nchr9\t41664300\t41665200\t0\t83\nchr9\t41667600\t41667900\t0.0786\t73\nchr9\t41670000\t41670300\t0.2179\t70\nchr9\t41676600\t41687400\t0\t87\nchr9\t41696100\t41696400\t0.0705\t71\nchr9\t41698500\t41699100\t0.0004\t110\nchr9\t41702400\t41703300\t0.0039\t106\nchr9\t41706000\t41706300\t0.0226\t103\nchr9\t41718900\t41725200\t0\t77\nchr9\t41726400\t41731800\t0\t83\nchr9\t41733000\t41733600\t0\t70\nchr9\t41741700\t41742000\t0.1411\t66\nchr9\t41743200\t41753700\t0\t94\nchr9\t41757000\t41757300\t0.1016\t94\nchr9\t41758800\t41769900\t0\t81\nchr9\t41771100\t41771400\t0\t81\nchr9\t41773200\t41773500\t0\t81\nchr9\t41786100\t41786400\t0.0941\t107\nchr9\t41792700\t41793000\t0.2103\t53\nchr9\t41805600\t41805900\t0.0239\t38\nchr9\t41808300\t41808900\t0.0182\t115\nchr9\t41812500\t41912400\t0\t144\nchr9\t41913900\t41915400\t0\t144\nchr9\t41957100\t41957400\t0.0066\t62\nchr9\t41970300\t41972400\t0\t68\nchr9\t41974500\t41976000\t0\t68\nchr9\t41979300\t41982600\t0.0144\t70\nchr9\t41984100\t41985600\t0\t57\nchr9\t41986800\t41987100\t0\t57\nchr9\t41988900\t41989500\t0\t57\nchr9\t41991300\t41991600\t0.14\t67\nchr9\t41994900\t42001200\t0.0002\t74\nchr9\t42004200\t42004500\t0\t79\nchr9\t42005700\t42011100\t0\t79\nchr9\t42013500\t42013800\t0.0705\t52\nchr9\t42015000\t42016200\t0\t53\nchr9\t42021300\t42023100\t0\t62\nchr9\t42025200\t42028500\t0\t75\nchr9\t42030300\t42030600\t0.0307\t68\nchr9\t42033600\t42033900\t0.0628\t64\nchr9\t42039300\t42041100\t0\t62\nchr9\t42048300\t42053100\t0\t61\nchr9\t42056700\t42057300\t0.0745\t51\nchr9\t42058800\t42059700\t0\t63\nchr9\t42065100\t42066000\t0\t59\nchr9\t42068100\t42070200\t0\t76\nchr9\t42073200\t42074400\t0.0396\t64\nchr9\t42081600\t42084900\t0\t66\nchr9\t42087900\t42088200\t0.0612\t38\nchr9\t42091200\t42092400\t0\t74\nchr9\t42100500\t42102600\t0\t63\nchr9\t42103800\t42106200\t0\t63\nchr9\t42128700\t42129000\t0.1669\t59\nchr9\t42187800\t42188100\t0.1007\t75\nchr9\t42198600\t42198900\t0.1179\t39\nchr9\t42348600\t42349200\t0.0304\t51\nchr9\t42350400\t42350700\t0.0683\t71\nchr9\t42402300\t42402600\t0.0241\t42\nchr9\t42408300\t42408900\t0\t99\nchr9\t42410400\t42412200\t0\t99\nchr9\t42413400\t42413700\t0.0932\t72\nchr9\t42417300\t42417600\t0.0967\t28\nchr9\t42419100\t42419400\t0.0129\t15\nchr9\t42495600\t42500400\t0\t79\nchr9\t42508800\t42517200\t0\t81\nchr9\t42521400\t42528600\t0\t64\nchr9\t42530100\t42533400\t0\t64\nchr9\t42535800\t42538200\t0\t70\nchr9\t42539400\t42545700\t0\t84\nchr9\t42546900\t42552900\t0\t84\nchr9\t42554100\t42555300\t0\t84\nchr9\t42556800\t42557100\t0\t84\nchr9\t42558300\t42561000\t0\t89\nchr9\t42562200\t42566100\t0\t89\nchr9\t42569700\t42570300\t0.0063\t79\nchr9\t42571500\t42573600\t0.0186\t71\nchr9\t42575400\t42577500\t0\t77\nchr9\t42579300\t42591000\t0\t95\nchr9\t42592800\t42600000\t0\t95\nchr9\t42601500\t42601800\t0.0376\t75\nchr9\t42603300\t42632100\t0\t91\nchr9\t42633300\t42634500\t0\t91\nchr9\t42635700\t42637200\t0\t91\nchr9\t42638400\t42638700\t0\t79\nchr9\t42639900\t42645300\t0\t79\nchr9\t42646500\t42660600\t0\t79\nchr9\t42662100\t42687300\t0\t83\nchr9\t42688500\t42689400\t0\t81\nchr9\t42691200\t42691800\t0.0156\t64\nchr9\t42729600\t42729900\t0.0322\t51\nchr9\t42733200\t42733500\t0.1256\t75\nchr9\t42784500\t42785100\t0.0223\t51\nchr9\t42820200\t42820500\t0.0424\t67\nchr9\t42829200\t42829500\t0.0113\t55\nchr9\t42857400\t42857700\t0.0011\t38\nchr9\t42882600\t42882900\t0.2037\t83\nchr9\t42970500\t42970800\t0.0293\t61\nchr9\t42996600\t42999000\t0\t81\nchr9\t43000500\t43000800\t0\t81\nchr9\t43002600\t43003200\t0\t81\nchr9\t43009500\t43009800\t0.0959\t45\nchr9\t43032900\t43033200\t0.0085\t53\nchr9\t43040100\t43040400\t0.088\t48\nchr9\t43053300\t43053600\t0.0929\t61\nchr9\t43068900\t43069200\t0.0726\t64\nchr9\t43096500\t43096800\t0.1177\t65\nchr9\t43105500\t43105800\t0.152\t72\nchr9\t43132500\t43132800\t0.0358\t73\nchr9\t43194600\t43195500\t0.0115\t41\nchr9\t43214700\t43215000\t0.0116\t35\nchr9\t43275000\t43281300\t0\t75\nchr9\t43283100\t43292100\t0\t53\nchr9\t43293300\t43332300\t0\t142\nchr9\t43334100\t43370100\t0\t161\nchr9\t43371300\t43377300\t0\t161\nchr9\t43385100\t43443600\t0\t413\nchr9\t43445100\t43455600\t0\t583\nchr9\t43456800\t44124600\t0\t583\nchr9\t44126400\t44251500\t0\t626\nchr9\t44252700\t44298900\t0\t626\nchr9\t44300100\t44427600\t0\t360\nchr9\t44429100\t44652300\t0\t517\nchr9\t44653800\t44719500\t0\t480\nchr9\t44720700\t44730600\t0\t480\nchr9\t44731800\t44760900\t0\t480\nchr9\t44762100\t44799000\t0\t480\nchr9\t44800200\t44859000\t0\t480\nchr9\t44860200\t44868000\t0\t344\nchr9\t44869500\t44920200\t0\t344\nchr9\t44921400\t45019200\t0\t344\nchr9\t45020400\t45031500\t0\t344\nchr9\t45033600\t45034500\t0\t308\nchr9\t45036000\t45074400\t0\t308\nchr9\t45075600\t45094500\t0\t308\nchr9\t45095700\t45112800\t0\t308\nchr9\t45114600\t45116400\t0\t198\nchr9\t45117600\t45151800\t0\t198\nchr9\t45153300\t45164700\t0\t198\nchr9\t45166200\t45182700\t0\t261\nchr9\t45184200\t45201000\t0\t261\nchr9\t45203400\t45205800\t0\t261\nchr9\t45207600\t45215400\t0\t261\nchr9\t45216900\t45231600\t0\t239\nchr9\t45232800\t45261900\t0\t239\nchr9\t45263400\t45264600\t0\t239\nchr9\t45265800\t45291300\t0\t239\nchr9\t45292500\t45298500\t0\t239\nchr9\t45300900\t45306000\t0\t239\nchr9\t45307500\t45322500\t0\t239\nchr9\t45324000\t45331800\t0\t361\nchr9\t45333300\t45335700\t0\t361\nchr9\t45336900\t45368400\t0\t361\nchr9\t45369600\t45384300\t0\t361\nchr9\t45385500\t45422700\t0\t361\nchr9\t45424200\t45484200\t0\t361\nchr9\t45485700\t45518700\t0\t361\nchr9\t60548400\t60548700\t0.1185\t46\nchr9\t60550200\t60552300\t0\t46\nchr9\t60553800\t60560400\t0\t195\nchr9\t60561900\t60570900\t0\t195\nchr9\t60572400\t60616200\t0\t311\nchr9\t60618000\t60654000\t0\t489\nchr9\t60655200\t60656700\t0\t303\nchr9\t60657900\t60679200\t0\t303\nchr9\t60680400\t60682500\t0.0183\t154\nchr9\t60684000\t60687300\t0.0183\t154\nchr9\t60749700\t60759600\t0\t65\nchr9\t60762000\t60765300\t0.0242\t60\nchr9\t60767100\t60767400\t0.1718\t59\nchr9\t60769200\t60772500\t0\t65\nchr9\t60774000\t60779400\t0\t44\nchr9\t60829500\t60863400\t0\t54\nchr9\t60864600\t60864900\t0\t54\nchr9\t60866100\t60875100\t0\t46\nchr9\t60876900\t60885000\t0\t54\nchr9\t60886800\t60887700\t0\t54\nchr9\t60891000\t60893100\t0\t85\nchr9\t60894900\t60898200\t0\t85\nchr9\t60899400\t60980400\t0\t85\nchr9\t60981600\t61003800\t0\t49\nchr9\t61053900\t61126200\t0\t74\nchr9\t61127400\t61138500\t0\t74\nchr9\t61143600\t61144200\t0\t49\nchr9\t61147800\t61149600\t0\t55\nchr9\t61150800\t61151100\t0\t55\nchr9\t61152300\t61157100\t0\t64\nchr9\t61161000\t61161300\t0.0196\t77\nchr9\t61163400\t61163700\t0.0072\t36\nchr9\t61167600\t61168200\t0\t81\nchr9\t61170300\t61173000\t0\t81\nchr9\t61174500\t61179000\t0\t63\nchr9\t61183500\t61184700\t0\t76\nchr9\t61185900\t61191300\t0\t76\nchr9\t61192800\t61196700\t0\t50\nchr9\t61198800\t61211100\t0\t73\nchr9\t61212900\t61213200\t0.0064\t38\nchr9\t61218900\t61219200\t0\t58\nchr9\t61220400\t61223100\t0\t58\nchr9\t61224300\t61224600\t0.1754\t21\nchr9\t61226100\t61226400\t0.0029\t52\nchr9\t61230900\t61231200\t0.0259\t44\nchr9\t61282200\t61315500\t0\t56\nchr9\t61317900\t61318500\t0.0024\t50\nchr9\t61319700\t61320000\t0\t44\nchr9\t61322100\t61329600\t0\t44\nchr9\t61334100\t61337400\t0\t35\nchr9\t61338600\t61340100\t0\t42\nchr9\t61341300\t61342200\t0\t42\nchr9\t61344900\t61345800\t0\t34\nchr9\t61347600\t61359600\t0\t44\nchr9\t61360800\t61362000\t0\t44\nchr9\t61373400\t61373700\t0.0679\t35\nchr9\t61375200\t61376400\t0\t40\nchr9\t61377900\t61380000\t0\t32\nchr9\t61381200\t61381800\t0\t41\nchr9\t61383000\t61384500\t0\t41\nchr9\t61385700\t61396200\t0\t54\nchr9\t61398900\t61399500\t0\t33\nchr9\t61401900\t61402200\t0.0222\t24\nchr9\t61403400\t61403700\t0.0398\t41\nchr9\t61405200\t61405500\t0.0398\t41\nchr9\t61409400\t61412100\t0\t48\nchr9\t61413900\t61468800\t0\t48\nchr9\t61529100\t61529400\t0.1386\t81\nchr9\t61586700\t61587900\t0\t70\nchr9\t61589100\t61590900\t0\t70\nchr9\t61637700\t61638000\t0.1171\t54\nchr9\t61644300\t61644600\t0.0774\t59\nchr9\t61647000\t61647300\t0.1014\t57\nchr9\t61648500\t61663800\t0\t84\nchr9\t61785300\t61879800\t0\t1017\nchr9\t61881300\t61893000\t0\t1017\nchr9\t61894800\t61911000\t0\t1017\nchr9\t61914300\t61914900\t0.0001\t93\nchr9\t61917900\t61919700\t0.0032\t95\nchr9\t61921800\t61926600\t0\t77\nchr9\t61928100\t61933500\t0\t77\nchr9\t61935000\t61944000\t0\t77\nchr9\t61945200\t61946700\t0\t72\nchr9\t61953600\t61957200\t0\t114\nchr9\t61959000\t61959300\t0\t114\nchr9\t61961100\t61966800\t0\t114\nchr9\t61968600\t61969500\t0\t114\nchr9\t61970700\t61971600\t0\t114\nchr9\t61973700\t61974300\t0\t94\nchr9\t61975500\t61977900\t0\t94\nchr9\t61986300\t61986900\t0.0135\t35\nchr9\t61989300\t61989900\t0\t48\nchr9\t61991100\t61992000\t0\t48\nchr9\t61993500\t61995900\t0\t48\nchr9\t61997400\t62000700\t0\t58\nchr9\t62002500\t62039100\t0\t65\nchr9\t62040300\t62043900\t0\t59\nchr9\t62045700\t62049000\t0\t59\nchr9\t62050800\t62051400\t0.0067\t38\nchr9\t62054700\t62055000\t0.0086\t30\nchr9\t62056800\t62058600\t0\t71\nchr9\t62059800\t62060100\t0\t71\nchr9\t62061300\t62076300\t0\t68\nchr9\t62078400\t62104200\t0\t68\nchr9\t62105400\t62117700\t0\t61\nchr9\t62118900\t62121300\t0\t61\nchr9\t62122500\t62136300\t0\t60\nchr9\t62137500\t62144400\t0\t60\nchr9\t62145600\t62146500\t0\t60\nchr9\t62147700\t62149500\t0\t59\nchr9\t62249700\t62345100\t0\t113\nchr9\t62346300\t62358300\t0\t113\nchr9\t62359500\t62384400\t0\t113\nchr9\t62385900\t62407500\t0\t113\nchr9\t62408700\t62425800\t0\t113\nchr9\t62427000\t62438700\t0\t113\nchr9\t62440800\t62442000\t0.0191\t74\nchr9\t62443200\t62443800\t0.0149\t59\nchr9\t62445900\t62446200\t0.1219\t44\nchr9\t62448000\t62452500\t0\t89\nchr9\t62454000\t62455500\t0\t78\nchr9\t62456700\t62457900\t0\t78\nchr9\t62459100\t62466600\t0\t74\nchr9\t62467800\t62468100\t0\t74\nchr9\t62469600\t62508300\t0\t112\nchr9\t62509500\t62526300\t0\t112\nchr9\t62528100\t62530200\t0\t112\nchr9\t62531400\t62532000\t0.023\t81\nchr9\t62535600\t62539200\t0\t69\nchr9\t62540700\t62543400\t0\t69\nchr9\t62545500\t62545800\t0.0043\t72\nchr9\t62547300\t62547600\t0.0043\t72\nchr9\t62549700\t62553000\t0\t76\nchr9\t62554200\t62554800\t0\t76\nchr9\t62556000\t62562300\t0\t76\nchr9\t62563500\t62568000\t0\t92\nchr9\t62569200\t62582700\t0\t92\nchr9\t62583900\t62596800\t0\t92\nchr9\t62598600\t62601300\t0\t77\nchr9\t62602500\t62606700\t0\t67\nchr9\t62608200\t62610000\t0.0022\t76\nchr9\t62612100\t62612400\t0.0022\t76\nchr9\t62614500\t62627700\t0\t67\nchr9\t62628900\t62655000\t0\t105\nchr9\t62656200\t62672100\t0\t105\nchr9\t62673300\t62696700\t0\t105\nchr9\t62697900\t62699700\t0\t105\nchr9\t62700900\t62716500\t0\t105\nchr9\t62718600\t62724000\t0\t85\nchr9\t62725200\t62727300\t0\t85\nchr9\t62729400\t62732700\t0\t85\nchr9\t62734500\t62746200\t0\t85\nchr9\t62748300\t62748900\t0\t85\nchr9\t62812200\t62812500\t0.0172\t128\nchr9\t62829900\t62830500\t0.0087\t163\nchr9\t62832300\t62833200\t0\t163\nchr9\t62836800\t62837100\t0.0236\t111\nchr9\t62846700\t62848200\t0.0361\t163\nchr9\t62883600\t62884800\t0.0072\t82\nchr9\t62886300\t62892600\t0\t73\nchr9\t62894100\t62896500\t0\t60\nchr9\t62900400\t62900700\t0.1494\t72\nchr9\t62904600\t62907900\t0\t94\nchr9\t62910000\t62913900\t0\t98\nchr9\t62917800\t62918400\t0.0004\t73\nchr9\t62919900\t62921100\t0\t82\nchr9\t62922900\t62923200\t0\t74\nchr9\t62924700\t62945700\t0\t74\nchr9\t62947200\t62949600\t0\t36\nchr9\t62951100\t62958300\t0\t97\nchr9\t63008400\t63023400\t0\t62\nchr9\t63024900\t63038100\t0\t59\nchr9\t63039600\t63040200\t0\t59\nchr9\t63042600\t63057900\t0\t67\nchr9\t63059400\t63074700\t0\t125\nchr9\t63076500\t63156300\t0\t125\nchr9\t63157500\t63162300\t0\t125\nchr9\t63163800\t63174300\t0\t125\nchr9\t63175500\t63180000\t0\t125\nchr9\t63181500\t63187500\t0\t125\nchr9\t63188700\t63189000\t0\t53\nchr9\t63190200\t63202800\t0\t53\nchr9\t63252900\t63254400\t0\t44\nchr9\t63255900\t63256200\t0.0726\t73\nchr9\t63258900\t63259800\t0.0347\t41\nchr9\t63261900\t63262800\t0.0807\t45\nchr9\t63268200\t63268500\t0.0779\t59\nchr9\t63271500\t63279000\t0\t69\nchr9\t63280200\t63283500\t0\t69\nchr9\t63285000\t63289800\t0\t69\nchr9\t63291600\t63295500\t0\t65\nchr9\t63298500\t63301800\t0\t72\nchr9\t63304200\t63309600\t0\t69\nchr9\t63310800\t63312000\t0\t69\nchr9\t63316200\t63324900\t0\t76\nchr9\t63331500\t63332100\t0\t46\nchr9\t63333600\t63335100\t0\t56\nchr9\t63336600\t63337800\t0.0137\t66\nchr9\t63339600\t63341100\t0\t68\nchr9\t63343200\t63343500\t0.1252\t52\nchr9\t63358800\t63360300\t0\t69\nchr9\t63363300\t63373200\t0\t126\nchr9\t63375000\t63375900\t0\t126\nchr9\t63378000\t63379200\t0.0033\t95\nchr9\t63382800\t63384900\t0\t82\nchr9\t63386100\t63386700\t0\t78\nchr9\t63388800\t63396600\t0\t78\nchr9\t63397800\t63399900\t0\t78\nchr9\t63402000\t63405300\t0\t64\nchr9\t63406500\t63408600\t0\t72\nchr9\t63410100\t63433500\t0\t72\nchr9\t63435000\t63448800\t0\t72\nchr9\t63451200\t63492300\t0\t72\nchr9\t63547500\t63547800\t0.2101\t16\nchr9\t63566400\t63566700\t0.0008\t59\nchr9\t63570000\t63570900\t0.006\t88\nchr9\t63598500\t63598800\t0.0932\t10\nchr9\t63603000\t63603300\t0.0814\t45\nchr9\t63639900\t63640200\t0.0464\t55\nchr9\t63650100\t63651300\t0\t57\nchr9\t63660600\t63663900\t0.0029\t63\nchr9\t63666900\t63667200\t0.0402\t18\nchr9\t63765900\t63766200\t0.0567\t122\nchr9\t63768900\t63769200\t0.1697\t69\nchr9\t63773100\t63773400\t0.0926\t149\nchr9\t63778500\t63778800\t0.121\t109\nchr9\t63801900\t63802200\t0.1709\t142\nchr9\t63834300\t63834600\t0.1884\t122\nchr9\t63872400\t63872700\t0.2155\t136\nchr9\t63884100\t63884400\t0.0592\t143\nchr9\t63992100\t63992400\t0.1152\t65\nchr9\t63999600\t63999900\t0.0599\t137\nchr9\t64002300\t64002600\t0.123\t85\nchr9\t64006500\t64006800\t0.0129\t156\nchr9\t64185600\t64189200\t0\t35\nchr9\t64190400\t64194600\t0\t44\nchr9\t64195800\t64215000\t0\t44\nchr9\t64315200\t64317000\t0\t64\nchr9\t64320300\t64320900\t0.0017\t83\nchr9\t64323900\t64324200\t0.1986\t10\nchr9\t64326300\t64334400\t0\t92\nchr9\t64340700\t64363200\t0\t66\nchr9\t64364700\t64365600\t0\t66\nchr9\t64368600\t64377900\t0\t63\nchr9\t64379100\t64399800\t0\t84\nchr9\t64401300\t64402500\t0\t67\nchr9\t64404300\t64405800\t0.0008\t74\nchr9\t64407000\t64407300\t0.1189\t52\nchr9\t64409700\t64410000\t0.0362\t60\nchr9\t64413600\t64414800\t0.0183\t74\nchr9\t64416900\t64417200\t0.0533\t60\nchr9\t64420200\t64420800\t0.0156\t31\nchr9\t64422000\t64426200\t0\t78\nchr9\t64428000\t64431900\t0\t80\nchr9\t64434000\t64437600\t0\t80\nchr9\t64449000\t64450500\t0.0071\t119\nchr9\t64453800\t64454100\t0.1227\t63\nchr9\t64458000\t64461900\t0\t106\nchr9\t64465200\t64465500\t0.0208\t110\nchr9\t64468800\t64469100\t0.0413\t71\nchr9\t64473900\t64474200\t0.0207\t86\nchr9\t64475400\t64475700\t0.1704\t48\nchr9\t64476900\t64477200\t0.1004\t68\nchr9\t64478700\t64479000\t0.049\t83\nchr9\t64491300\t64491600\t0.0353\t73\nchr9\t64500000\t64500300\t0.1787\t75\nchr9\t64507500\t64507800\t0.1272\t78\nchr9\t64511700\t64513200\t0.0005\t79\nchr9\t64515300\t64515600\t0.1746\t93\nchr9\t64516800\t64517100\t0.0268\t57\nchr9\t64519200\t64520100\t0\t39\nchr9\t64521900\t64523400\t0\t73\nchr9\t64524600\t64524900\t0\t73\nchr9\t64527900\t64528200\t0\t88\nchr9\t64529400\t64530000\t0\t88\nchr9\t64531200\t64539000\t0\t88\nchr9\t64541400\t64547700\t0.0145\t92\nchr9\t64549200\t64549800\t0.0224\t64\nchr9\t64551000\t64554000\t0\t80\nchr9\t64555500\t64558800\t0.0012\t59\nchr9\t64562400\t64574700\t0\t76\nchr9\t64575900\t64583400\t0\t76\nchr9\t64585200\t64585500\t0.0021\t19\nchr9\t64587000\t64594500\t0\t104\nchr9\t64595700\t64601400\t0\t104\nchr9\t64602600\t64608600\t0\t104\nchr9\t64609800\t64613700\t0\t104\nchr9\t64614900\t64617300\t0\t104\nchr9\t64618500\t64626000\t0\t104\nchr9\t64627500\t64765800\t0\t104\nchr9\t64767000\t64768500\t0\t66\nchr9\t64770900\t64771500\t0.0172\t35\nchr9\t64779600\t64780800\t0.0019\t48\nchr9\t64784700\t64787700\t0\t65\nchr9\t64789200\t64791300\t0\t65\nchr9\t64792500\t64794000\t0\t65\nchr9\t64795500\t64799400\t0\t65\nchr9\t64800600\t64802700\t0\t61\nchr9\t64808100\t64809900\t0\t45\nchr9\t64811100\t64811700\t0\t45\nchr9\t64813500\t64814100\t0\t45\nchr9\t64816200\t64819200\t0\t66\nchr9\t64821000\t64822500\t0\t58\nchr9\t64824000\t64824300\t0.1619\t43\nchr9\t64825500\t64826100\t0.0197\t53\nchr9\t64828800\t64829100\t0.0326\t48\nchr9\t64831200\t64834800\t0\t59\nchr9\t64837200\t64839300\t0.0148\t55\nchr9\t64840800\t64841400\t0.0033\t42\nchr9\t64842600\t64843500\t0.0701\t52\nchr9\t64846800\t64848000\t0\t61\nchr9\t64851900\t64854300\t0\t70\nchr9\t64855500\t64859700\t0.0043\t62\nchr9\t64861800\t64862100\t0.1023\t67\nchr9\t64864200\t64864800\t0\t64\nchr9\t64867200\t64868700\t0\t64\nchr9\t64869900\t64874700\t0\t63\nchr9\t64876500\t64878000\t0.02\t77\nchr9\t64880100\t64884900\t0\t74\nchr9\t64886100\t64888200\t0\t52\nchr9\t64890600\t64891800\t0\t58\nchr9\t64893900\t64895400\t0\t63\nchr9\t64897500\t64897800\t0\t63\nchr9\t64899300\t64900800\t0.0152\t56\nchr9\t64903800\t64904100\t0\t71\nchr9\t64905900\t64907400\t0\t71\nchr9\t64913400\t64914900\t0\t56\nchr9\t64916100\t64919700\t0\t75\nchr9\t64922100\t64922700\t0.0044\t66\nchr9\t64924200\t64927500\t0\t56\nchr9\t64929900\t64930800\t0\t68\nchr9\t64932300\t64932600\t0\t68\nchr9\t64933800\t64934100\t0\t68\nchr9\t64947600\t64947900\t0.0837\t78\nchr9\t64952400\t64956300\t0.0019\t88\nchr9\t64960200\t64961700\t0\t57\nchr9\t64963500\t64963800\t0.0815\t82\nchr9\t64967700\t64970100\t0\t69\nchr9\t64974600\t64976700\t0\t66\nchr9\t64982700\t64987500\t0.0011\t73\nchr9\t64992000\t64992600\t0.0562\t60\nchr9\t64994400\t64996200\t0\t66\nchr9\t64997400\t64997700\t0.0785\t56\nchr9\t65079600\t65080200\t0.0007\t48\nchr9\t65130600\t65137200\t0\t47\nchr9\t65139000\t65143800\t0\t47\nchr9\t65145600\t65151600\t0\t76\nchr9\t65152800\t65195400\t0\t76\nchr9\t65196600\t65205900\t0\t76\nchr9\t65209200\t65210100\t0\t79\nchr9\t65211300\t65223600\t0\t79\nchr9\t65225700\t65229000\t0\t57\nchr9\t65230200\t65232000\t0\t57\nchr9\t65233200\t65241600\t0\t86\nchr9\t65242800\t65258100\t0\t86\nchr9\t65259600\t65274000\t0\t146\nchr9\t65276100\t65285100\t0\t146\nchr9\t65286600\t65291100\t0\t156\nchr9\t65292300\t65305800\t0\t156\nchr9\t65307000\t65325000\t0\t156\nchr9\t65375100\t65375400\t0\t82\nchr9\t65514000\t65514300\t0.1086\t59\nchr9\t65517900\t65521800\t0\t68\nchr9\t65542800\t65543100\t0.1032\t86\nchr9\t65575500\t65575800\t0.0664\t46\nchr9\t65579400\t65583900\t0\t85\nchr9\t65585100\t65587500\t0\t85\nchr9\t65589300\t65593500\t0\t37\nchr9\t65645100\t65646900\t0\t181\nchr9\t65648100\t65648400\t0.1888\t65\nchr9\t65650800\t65654700\t0\t111\nchr9\t65663400\t65663700\t0.0431\t63\nchr9\t65670000\t65673300\t0.0054\t100\nchr9\t65674800\t65676300\t0.1381\t89\nchr9\t65679000\t65679300\t0.0402\t58\nchr9\t65682900\t65683200\t0.0425\t85\nchr9\t65685900\t65688600\t0.0077\t118\nchr9\t65690100\t65690700\t0.0077\t118\nchr9\t65692200\t65692800\t0.0042\t76\nchr9\t65694600\t65707800\t0\t130\nchr9\t65712300\t65713500\t0\t130\nchr9\t65715900\t65716200\t0.1954\t31\nchr9\t65718600\t65720700\t0\t133\nchr9\t65721900\t65724000\t0\t133\nchr9\t65726700\t65727900\t0\t133\nchr9\t65729100\t65732400\t0\t133\nchr9\t65736300\t65736600\t0.0236\t123\nchr9\t65738400\t65741700\t0.0061\t102\nchr9\t65743500\t65744400\t0\t57\nchr9\t65747400\t65750700\t0\t81\nchr9\t65753100\t65762400\t0\t81\nchr9\t65763600\t65809500\t0\t80\nchr9\t65811000\t65811300\t0.2528\t26\nchr9\t65814600\t65900400\t0\t90\nchr9\t65901600\t65914500\t0\t90\nchr9\t65916300\t65940300\t0\t90\nchr9\t65941800\t65956200\t0\t95\nchr9\t65957700\t65965800\t0\t88\nchr9\t65967000\t65969100\t0.0004\t96\nchr9\t65970300\t65971800\t0.0004\t96\nchr9\t65973000\t65975700\t0\t100\nchr9\t65979300\t65984400\t0\t100\nchr9\t65986800\t65989500\t0\t89\nchr9\t65993100\t66015000\t0\t101\nchr9\t66016200\t66029400\t0\t101\nchr9\t66032100\t66063600\t0\t110\nchr9\t66065100\t66065700\t0\t97\nchr9\t66067500\t66068100\t0\t97\nchr9\t66069600\t66078600\t0\t106\nchr9\t66080700\t66104700\t0\t108\nchr9\t66105900\t66146400\t0\t108\nchr9\t66148800\t66150300\t0\t74\nchr9\t66156000\t66157500\t0.0092\t70\nchr9\t66163800\t66164400\t0\t90\nchr9\t66165600\t66169800\t0\t90\nchr9\t66176100\t66176400\t0.0114\t65\nchr9\t66178500\t66178800\t0.0586\t38\nchr9\t66183900\t66185400\t0.0493\t61\nchr9\t66186600\t66191100\t0\t56\nchr9\t66192300\t66196200\t0\t56\nchr9\t66201900\t66207900\t0\t56\nchr9\t66209100\t66235200\t0\t98\nchr9\t66237000\t66237300\t0.0123\t60\nchr9\t66238800\t66241200\t0\t76\nchr9\t66242400\t66244800\t0\t76\nchr9\t66247800\t66248100\t0.0238\t64\nchr9\t66252600\t66258900\t0\t93\nchr9\t66260100\t66260700\t0\t93\nchr9\t66262500\t66262800\t0\t93\nchr9\t66270600\t66273000\t0\t62\nchr9\t66274500\t66276600\t0\t62\nchr9\t66282300\t66283800\t0\t70\nchr9\t66285000\t66285600\t0\t70\nchr9\t66286800\t66288600\t0\t70\nchr9\t66289800\t66294300\t0\t70\nchr9\t66296100\t66297300\t0\t70\nchr9\t66299100\t66299400\t0\t70\nchr9\t66301500\t66302400\t0.0169\t48\nchr9\t66303900\t66305100\t0.1536\t40\nchr9\t66307500\t66312300\t0\t62\nchr9\t66313500\t66313800\t0.0674\t52\nchr9\t66315600\t66316800\t0\t76\nchr9\t66318900\t66326700\t0\t76\nchr9\t66328500\t66329700\t0\t35\nchr9\t66331800\t66332100\t0\t57\nchr9\t66333900\t66335100\t0\t57\nchr9\t66336300\t66336900\t0\t57\nchr9\t66338400\t66340200\t0\t62\nchr9\t66342600\t66344700\t0\t62\nchr9\t66346200\t66350400\t0\t62\nchr9\t66351600\t66352200\t0\t62\nchr9\t66353700\t66355800\t0\t62\nchr9\t66358800\t66359100\t0.0452\t43\nchr9\t66361500\t66366000\t0\t65\nchr9\t66367500\t66371100\t0\t65\nchr9\t66373200\t66386700\t0\t65\nchr9\t66387900\t66390600\t0\t65\nchr9\t66591300\t66591900\t0\t14\nchr9\t66594300\t66600600\t0\t69\nchr9\t66602400\t66612300\t0\t98\nchr9\t66614100\t66616500\t0\t72\nchr9\t66618300\t66619200\t0\t85\nchr9\t66620700\t66624600\t0\t85\nchr9\t66626100\t66628500\t0\t85\nchr9\t66629700\t66631500\t0\t72\nchr9\t66632700\t66634800\t0\t53\nchr9\t66636300\t66641400\t0\t81\nchr9\t66643800\t66647100\t0\t81\nchr9\t66648900\t66655500\t0\t81\nchr9\t66656700\t66660600\t0\t57\nchr9\t66662400\t66669600\t0\t57\nchr9\t66670800\t66673500\t0\t57\nchr9\t66674700\t66695400\t0\t76\nchr9\t66697800\t66710400\t0\t145\nchr9\t66712200\t66721200\t0\t145\nchr9\t66722400\t66731100\t0\t145\nchr9\t66732300\t66735600\t0\t145\nchr9\t66737700\t66738300\t0\t55\nchr9\t66739800\t66745800\t0\t88\nchr9\t66747300\t66752100\t0\t88\nchr9\t66753300\t66765000\t0\t88\nchr9\t66766200\t66768300\t0\t88\nchr9\t66769500\t66773400\t0\t62\nchr9\t66779700\t66780000\t0.0476\t52\nchr9\t66791400\t66792000\t0.0078\t73\nchr9\t66815700\t66816000\t0.1352\t96\nchr9\t66821100\t66821400\t0.1287\t81\nchr9\t66827700\t66831000\t0\t88\nchr9\t66833700\t66842700\t0\t118\nchr9\t66844500\t66847200\t0.0205\t98\nchr9\t66848400\t66851100\t0.0021\t60\nchr9\t66852600\t66859200\t0\t65\nchr9\t66861300\t66865500\t0\t77\nchr9\t66866700\t66875400\t0\t73\nchr9\t66877200\t66877500\t0.0603\t66\nchr9\t66895800\t66896100\t0.1111\t45\nchr9\t66912300\t66912600\t0.0783\t50\nchr9\t66918900\t66919200\t0.0565\t74\nchr9\t66927900\t66928200\t0.0718\t46\nchr9\t66933600\t66933900\t0.1084\t18\nchr9\t66935700\t66936000\t0.0349\t55\nchr9\t66940500\t66940800\t0.0629\t49\nchr9\t66947700\t66948000\t0.1049\t46\nchr9\t66956100\t66956400\t0.1357\t64\nchr9\t66959100\t66960300\t0\t61\nchr9\t66963000\t66965700\t0\t73\nchr9\t66967800\t66968400\t0\t73\nchr9\t66970200\t66971700\t0\t58\nchr9\t66974400\t66974700\t0.1231\t57\nchr9\t66979800\t66980100\t0.0335\t48\nchr9\t66981600\t66981900\t0.0257\t42\nchr9\t66983400\t66986700\t0\t73\nchr9\t66987900\t66996600\t0\t73\nchr9\t66997800\t66999000\t0\t73\nchr9\t67002900\t67004400\t0\t65\nchr9\t67006200\t67011600\t0\t52\nchr9\t67012800\t67013100\t0\t47\nchr9\t67014300\t67015200\t0\t47\nchr9\t67018800\t67019100\t0.0042\t47\nchr9\t67020900\t67022700\t0.0184\t62\nchr9\t67023900\t67030200\t0\t67\nchr9\t67031400\t67037400\t0\t65\nchr9\t67042500\t67043700\t0\t38\nchr9\t67045200\t67047000\t0\t60\nchr9\t67048200\t67049100\t0\t60\nchr9\t67059600\t67059900\t0.0309\t54\nchr9\t67083300\t67084500\t0\t76\nchr9\t67085700\t67086900\t0\t76\nchr9\t67095000\t67096200\t0\t52\nchr9\t67099200\t67099500\t0.089\t45\nchr9\t67101600\t67106700\t0\t65\nchr9\t67112400\t67117500\t0\t57\nchr9\t67118700\t67123500\t0\t70\nchr9\t67125000\t67125300\t0\t64\nchr9\t67128000\t67130700\t0\t64\nchr9\t67134300\t67139100\t0\t72\nchr9\t67146300\t67148700\t0\t63\nchr9\t67153500\t67154100\t0\t62\nchr9\t67156800\t67157100\t0.0162\t61\nchr9\t67158600\t67162200\t0\t76\nchr9\t67163400\t67167600\t0\t76\nchr9\t67170600\t67172400\t0\t59\nchr9\t67173600\t67173900\t0.1365\t47\nchr9\t67176300\t67179000\t0\t74\nchr9\t67180200\t67181100\t0\t74\nchr9\t67182900\t67183200\t0\t74\nchr9\t67186200\t67190700\t0\t62\nchr9\t67192200\t67193100\t0\t62\nchr9\t67194900\t67196100\t0.0173\t64\nchr9\t67197900\t67203300\t0\t69\nchr9\t67204500\t67207500\t0\t69\nchr9\t67210200\t67212900\t0\t151\nchr9\t67215000\t67375200\t0\t151\nchr9\t67376400\t67387500\t0\t120\nchr9\t67389000\t67397400\t0\t120\nchr9\t67400100\t67404900\t0.0069\t66\nchr9\t67408200\t67410300\t0\t64\nchr9\t67411500\t67412100\t0.0466\t72\nchr9\t67417500\t67425900\t0\t75\nchr9\t67428000\t67428600\t0\t76\nchr9\t67430100\t67433400\t0\t76\nchr9\t67434600\t67445700\t0\t59\nchr9\t67446900\t67447200\t0\t59\nchr9\t67448400\t67451100\t0\t42\nchr9\t67452300\t67510200\t0\t68\nchr9\t67512000\t67548300\t0\t68\nchr9\t67549500\t67591500\t0\t59\nchr9\t67592700\t67600200\t0\t59\nchr9\t67601700\t67603500\t0\t59\nchr9\t67604700\t67607700\t0\t63\nchr9\t67617300\t67622400\t0\t82\nchr9\t67631400\t67635900\t0\t75\nchr9\t67641600\t67657500\t0\t91\nchr9\t67658700\t67679400\t0\t91\nchr9\t67680900\t67699500\t0\t1053\nchr9\t67700700\t67722900\t0\t1053\nchr9\t67724100\t67736400\t0\t1053\nchr9\t67737600\t67756500\t0\t1053\nchr9\t67758300\t67758600\t0.1544\t94\nchr9\t67761600\t67763100\t0.0007\t115\nchr9\t67764300\t67765200\t0\t97\nchr9\t67766400\t67769400\t0\t132\nchr9\t67771500\t67773300\t0\t132\nchr9\t67779300\t67782900\t0\t94\nchr9\t67784700\t67785300\t0\t106\nchr9\t67786500\t67788600\t0\t106\nchr9\t67790100\t67790700\t0\t106\nchr9\t67791900\t67792200\t0\t139\nchr9\t67794300\t67795200\t0\t139\nchr9\t67796400\t67797900\t0\t91\nchr9\t67799700\t67811400\t0\t91\nchr9\t67813200\t67819200\t0\t91\nchr9\t67820700\t67822500\t0\t91\nchr9\t67825200\t67828800\t0\t80\nchr9\t67831200\t67831500\t0\t80\nchr9\t67833600\t67835700\t0\t76\nchr9\t67837800\t67838100\t0\t76\nchr9\t67839300\t67839600\t0\t76\nchr9\t67841700\t67843800\t0\t97\nchr9\t67846500\t67848600\t0\t97\nchr9\t67858200\t67858800\t0.102\t92\nchr9\t67860600\t67864500\t0\t55\nchr9\t67866600\t67870800\t0\t70\nchr9\t67872900\t67881300\t0\t84\nchr9\t67883400\t67884000\t0\t62\nchr9\t67886100\t67897200\t0\t101\nchr9\t67898400\t67918800\t0\t101\nchr9\t67920300\t67920600\t0.0678\t27\nchr9\t68220600\t68245500\t0\t111\nchr9\t68247600\t68256600\t0\t111\nchr9\t68258100\t68266200\t0\t111\nchr9\t68267400\t68268000\t0\t111\nchr9\t68269500\t68275200\t0\t87\nchr9\t68276700\t68279100\t0\t87\nchr9\t68280600\t68280900\t0\t87\nchr9\t68282100\t68286600\t0\t87\nchr9\t68287800\t68295900\t0.0042\t111\nchr9\t68297400\t68298900\t0\t167\nchr9\t68300700\t68303400\t0\t167\nchr9\t68305800\t68306400\t0\t167\nchr9\t68308200\t68311500\t0\t136\nchr9\t68312700\t68313300\t0.0002\t150\nchr9\t68316000\t68316600\t0\t135\nchr9\t68319600\t68328600\t0\t148\nchr9\t69416400\t69418200\t0\t81\nchr9\t69437400\t69439200\t0\t86\nchr9\t69477600\t69480900\t0\t80\nchr9\t69506400\t69509700\t0\t81\nchr9\t69763200\t69763800\t0.2008\t51\nchr9\t70038300\t70038600\t0.2992\t6102\nchr9\t70200900\t70201500\t0.0423\t44\nchr9\t70432500\t70433100\t0\t77\nchr9\t70702200\t70737600\t0\t45\nchr9\t74427900\t74428800\t0.0495\t66\nchr9\t76063500\t76063800\t0.0105\t22\nchr9\t76175100\t76175400\t0.1739\t450\nchr9\t76673400\t76673700\t0.1018\t71\nchr9\t76675200\t76675800\t0.1509\t73\nchr9\t76791300\t76791600\t0.1685\t62\nchr9\t79098000\t79098300\t0.026\t59\nchr9\t79497900\t79498500\t0.1218\t63\nchr9\t80743200\t80743800\t0.0062\t81\nchr9\t81709500\t81711900\t0.0104\t76\nchr9\t81919800\t81933900\t0\t63\nchr9\t81935100\t81948900\t0\t63\nchr9\t83049900\t83052600\t0.0011\t98\nchr9\t83053800\t83054400\t0.0011\t98\nchr9\t83226300\t83226600\t0.2252\t82\nchr9\t83821200\t83821800\t0\t63\nchr9\t83826300\t83826600\t0.0171\t65\nchr9\t85074600\t85074900\t0.1191\t49\nchr9\t85165500\t85165800\t0.0118\t64\nchr9\t85811400\t85812300\t0.0136\t123\nchr9\t86107500\t86109300\t0\t64\nchr9\t86159400\t86159700\t0.1369\t76\nchr9\t86607600\t86607900\t0.1385\t59\nchr9\t87913800\t87915300\t0\t75\nchr9\t87917400\t87919800\t0\t78\nchr9\t87926700\t87927300\t0.0045\t56\nchr9\t87928500\t87929700\t0.0005\t74\nchr9\t87933000\t87933600\t0.0145\t49\nchr9\t87940800\t87941100\t0.0126\t31\nchr9\t88119300\t88119900\t0.0275\t65\nchr9\t88123200\t88123800\t0.0506\t72\nchr9\t88125600\t88126200\t0.051\t59\nchr9\t88133100\t88133400\t0.0295\t79\nchr9\t88140300\t88140600\t0.0015\t41\nchr9\t88244100\t88245900\t0.007\t83\nchr9\t88626300\t88626900\t0.0029\t82\nchr9\t90150300\t90155400\t0\t143\nchr9\t91227300\t91227600\t0.0841\t56\nchr9\t91797300\t91798200\t0.0269\t54\nchr9\t92216400\t92216700\t0.1995\t72\nchr9\t92218200\t92218500\t0.2264\t84\nchr9\t92226900\t92227200\t0.0599\t107\nchr9\t93335700\t93336300\t0.0203\t68\nchr9\t93515400\t93516000\t0.0359\t77\nchr9\t94089600\t94090800\t0.0413\t93\nchr9\t94113900\t94119300\t0\t124\nchr9\t94307700\t94308000\t0.0608\t70\nchr9\t94313100\t94313400\t0.2024\t18\nchr9\t94314900\t94316100\t0\t74\nchr9\t94317600\t94319400\t0\t74\nchr9\t94328700\t94329000\t0.0812\t66\nchr9\t94331400\t94331700\t0.058\t62\nchr9\t94333200\t94333500\t0.1286\t40\nchr9\t94334700\t94335000\t0.0558\t34\nchr9\t94338000\t94338300\t0.1576\t58\nchr9\t94340400\t94340700\t0.0367\t57\nchr9\t94342800\t94343100\t0.0936\t73\nchr9\t94348500\t94349100\t0\t77\nchr9\t94350600\t94350900\t0.122\t27\nchr9\t94362900\t94363200\t0.11\t60\nchr9\t94365000\t94365300\t0.0255\t63\nchr9\t94393200\t94393500\t0.0363\t71\nchr9\t94530600\t94530900\t0.1437\t26\nchr9\t95698200\t95703300\t0\t84\nchr9\t96707100\t96707400\t0.1754\t59\nchr9\t96908700\t96909000\t0.0017\t72\nchr9\t96916800\t96917100\t0.0835\t61\nchr9\t96919200\t96919500\t0.038\t43\nchr9\t96924300\t96924600\t0.0806\t58\nchr9\t96928500\t96928800\t0.0124\t59\nchr9\t96939000\t96940200\t0\t84\nchr9\t96942300\t96942600\t0.031\t67\nchr9\t96948000\t96948300\t0.0511\t72\nchr9\t96994500\t96994800\t0.0963\t74\nchr9\t97022700\t97023300\t0.0999\t68\nchr9\t97196400\t97196700\t0.0326\t71\nchr9\t97197900\t97199100\t0.05\t64\nchr9\t97582500\t97582800\t0.2024\t78\nchr9\t98214300\t98214600\t0.1431\t54\nchr9\t99500100\t99502500\t0.0681\t96\nchr9\t99504300\t99504600\t0.0409\t60\nchr9\t99853500\t99855000\t0\t75\nchr9\t100528500\t100528800\t0.195\t60\nchr9\t100692900\t100693800\t0.0216\t84\nchr9\t100983300\t100986900\t0\t82\nchr9\t101102400\t101107800\t0\t77\nchr9\t101681700\t101682300\t0\t20\nchr9\t102149100\t102149400\t0.169\t63\nchr9\t102363900\t102364200\t0.0169\t25\nchr9\t103739700\t103740000\t0.2758\t73\nchr9\t105576600\t105576900\t0.0583\t83\nchr9\t105580500\t105580800\t0.0276\t74\nchr9\t105781500\t105781800\t0.1526\t22\nchr9\t106184400\t106185000\t0.0838\t56\nchr9\t106212600\t106212900\t0.0295\t61\nchr9\t107027400\t107028000\t0.0259\t94\nchr9\t107256000\t107258400\t0\t74\nchr9\t107272800\t107273100\t0.0033\t36\nchr9\t107776500\t107776800\t0\t41\nchr9\t108504600\t108504900\t0.2168\t90\nchr9\t110417400\t110422800\t0\t73\nchr9\t110791500\t110796900\t0\t88\nchr9\t111640500\t111640800\t0.0573\t67\nchr9\t111642000\t111642600\t0.122\t77\nchr9\t112513500\t112515000\t0.0049\t60\nchr9\t112798200\t112803900\t0\t90\nchr9\t113060400\t113061300\t0.0033\t109\nchr9\t113063700\t113088000\t0\t213\nchr9\t113105400\t113111400\t0\t80\nchr9\t113112900\t113119200\t0\t83\nchr9\t113439300\t113443200\t0.0019\t70\nchr9\t114326700\t114327600\t0.1214\t66\nchr9\t114329700\t114330000\t0.1838\t57\nchr9\t115527600\t115527900\t0.1395\t68\nchr9\t115769400\t115769700\t0.0378\t92\nchr9\t115919400\t115919700\t0.1001\t78\nchr9\t117066900\t117070500\t0.0075\t64\nchr9\t119133900\t119134200\t0.102\t72\nchr9\t119171700\t119172000\t0.0206\t53\nchr9\t119622000\t119622600\t0.0007\t81\nchr9\t119623800\t119624100\t0.0007\t81\nchr9\t120056400\t120060900\t0\t113\nchr9\t120495000\t120496200\t0.0254\t109\nchr9\t121971300\t121971600\t0.115\t42\nchr9\t123404700\t123405900\t0.0201\t58\nchr9\t123906600\t123908400\t0.0344\t76\nchr9\t123976500\t123978900\t0\t64\nchr9\t123991200\t123992700\t0\t72\nchr9\t125623500\t125625000\t0.029\t85\nchr9\t126013800\t126014100\t0.2442\t46\nchr9\t126484500\t126485400\t0\t45\nchr9\t130277700\t130278000\t0.2813\t117\nchr9\t131356800\t131357400\t0.0678\t77\nchr9\t132526800\t132529200\t0\t65\nchr9\t133069200\t133069500\t0.1435\t75\nchr9\t133082700\t133083300\t0\t33\nchr9\t133514100\t133514400\t0.0255\t26\nchr9\t133827600\t133827900\t0.2235\t18\nchr9\t134012700\t134014500\t0\t197\nchr9\t134114700\t134118900\t0\t69\nchr9\t134587200\t134587500\t0.1683\t78\nchr9\t136355100\t136355400\t0.0271\t25\nchr9\t136580400\t136581000\t0.0357\t19\nchr9\t136802700\t136803300\t0.1716\t100\nchr9\t137288700\t137289000\t0.2844\t51\nchr9\t137322900\t137323200\t0.1391\t57\nchr9\t137565900\t137568000\t0.042\t58\nchr9\t137716200\t137716500\t0.1242\t259\nchr9\t137818800\t137819400\t0.015\t63\nchr9\t137845200\t137846400\t0\t244\nchr9\t137887500\t137887800\t0.1619\t53\nchr9\t138018000\t138019500\t0\t54\nchr9\t138163200\t138163500\t0.1011\t56\nchr9\t138184200\t138186300\t0.0033\t73\nchr9\t138191100\t138196800\t0\t37\nchr9\t138205500\t138205800\t0.0011\t44\nchr9\t138216000\t138216600\t0.1351\t68\nchr9\t138219900\t138334200\t0\t252\nchrX\t10200\t12300\t0\t46\nchrX\t16800\t19500\t0\t30\nchrX\t21000\t24600\t0\t33\nchrX\t94800\t95100\t0\t34\nchrX\t96300\t97500\t0\t34\nchrX\t99600\t100200\t0\t34\nchrX\t222900\t225600\t0\t42\nchrX\t229500\t230100\t0.0351\t26\nchrX\t234300\t234600\t0.1256\t35\nchrX\t236400\t236700\t0.091\t42\nchrX\t249900\t250800\t0.0036\t46\nchrX\t268200\t274500\t0.1001\t513\nchrX\t297900\t298500\t0.1506\t100\nchrX\t315900\t316200\t0.2671\t129\nchrX\t321600\t321900\t0.0965\t33\nchrX\t513000\t515700\t0.0585\t103\nchrX\t527400\t528300\t0.0145\t80\nchrX\t647400\t648000\t0.0118\t37\nchrX\t839400\t840300\t0.0734\t58\nchrX\t1128300\t1128600\t0.2277\t27\nchrX\t1174200\t1174500\t0.1663\t27\nchrX\t1264200\t1264500\t0.0556\t74\nchrX\t1298100\t1298400\t0.1405\t53\nchrX\t1368900\t1376100\t0\t57\nchrX\t1409700\t1410300\t0\t25\nchrX\t1697100\t1697400\t0.0735\t40\nchrX\t1763700\t1764900\t0.2162\t28\nchrX\t1855800\t1856100\t0.1546\t58\nchrX\t1887900\t1888200\t0.1661\t60\nchrX\t1947600\t1949400\t0\t39\nchrX\t2133000\t2133600\t0\t33\nchrX\t2227800\t2228400\t0.2219\t28\nchrX\t2845200\t2845500\t0.0508\t19\nchrX\t3824100\t3824700\t0.0158\t20\nchrX\t3830700\t3837900\t0\t25\nchrX\t3839100\t3842100\t0\t34\nchrX\t3843600\t3866400\t0\t30\nchrX\t3867900\t3877800\t0\t40\nchrX\t3879000\t3880800\t0\t30\nchrX\t3882000\t3904800\t0\t30\nchrX\t3906300\t3926100\t0\t34\nchrX\t3928200\t3937200\t0\t34\nchrX\t3967500\t3968400\t0\t66\nchrX\t4267200\t4267500\t0.1625\t26\nchrX\t5108400\t5109000\t0.0046\t53\nchrX\t5481300\t5481600\t0.0255\t34\nchrX\t5483100\t5485200\t0.0255\t34\nchrX\t5652300\t5652600\t0.0411\t15\nchrX\t5669700\t5670000\t0.2126\t11\nchrX\t5765100\t5765400\t0.1374\t53\nchrX\t5816100\t5816700\t0.0103\t67\nchrX\t6529500\t6529800\t0.1405\t36\nchrX\t6533100\t6533400\t0.1014\t23\nchrX\t6584100\t6588600\t0\t62\nchrX\t6934800\t6936600\t0.007\t64\nchrX\t6937800\t6938400\t0.0871\t48\nchrX\t7590000\t7590300\t0.0365\t118\nchrX\t7848900\t7849200\t0.1013\t32\nchrX\t8169300\t8169900\t0.0883\t55\nchrX\t8465700\t8467200\t0.1441\t38\nchrX\t10967400\t10967700\t0.2436\t39\nchrX\t11000700\t11001600\t0.0923\t57\nchrX\t11219100\t11219700\t0.08\t69\nchrX\t11707500\t11713200\t0\t99\nchrX\t11935500\t11941200\t0\t84\nchrX\t12621900\t12622500\t0.002\t15\nchrX\t13881600\t13883400\t0\t21\nchrX\t14085300\t14085900\t0.1188\t44\nchrX\t14106000\t14106300\t0.1727\t56\nchrX\t14107500\t14107800\t0.1727\t56\nchrX\t15647700\t15648000\t0.0421\t37\nchrX\t16234500\t16234800\t0.0383\t41\nchrX\t16323600\t16324200\t0.0116\t42\nchrX\t16337700\t16338000\t0.2195\t56\nchrX\t16377600\t16378200\t0\t29\nchrX\t16409700\t16410000\t0\t25\nchrX\t16503000\t16503300\t0.1259\t35\nchrX\t17055000\t17055600\t0.0905\t57\nchrX\t17319300\t17319900\t0.0023\t48\nchrX\t17342700\t17344800\t0.0969\t74\nchrX\t17737200\t17737500\t0.0802\t169\nchrX\t18110100\t18110400\t0.0239\t87\nchrX\t19144500\t19148400\t0\t84\nchrX\t19941900\t19944600\t0\t72\nchrX\t20335800\t20336400\t0.0322\t60\nchrX\t23239500\t23239800\t0.1791\t56\nchrX\t23241000\t23244300\t0\t73\nchrX\t23973000\t23974500\t0\t36\nchrX\t24134400\t24135900\t0\t37\nchrX\t24708600\t24710100\t0.0224\t96\nchrX\t25824300\t25824600\t0.0766\t11\nchrX\t26313900\t26320200\t0\t104\nchrX\t27109800\t27110400\t0.0159\t60\nchrX\t27226500\t27226800\t0.1976\t56\nchrX\t27927900\t27928200\t0.0764\t50\nchrX\t28209000\t28212600\t0.0012\t77\nchrX\t28230000\t28230300\t0.0338\t96\nchrX\t28950300\t28950600\t0.1399\t52\nchrX\t29332200\t29332500\t0.0481\t64\nchrX\t29334300\t29334600\t0.2214\t128\nchrX\t29356200\t29356500\t0.0794\t449\nchrX\t29582400\t29583600\t0.004\t61\nchrX\t30018900\t30019200\t0.0269\t24\nchrX\t30603300\t30603600\t0.2009\t63\nchrX\t31531200\t31535400\t0\t64\nchrX\t31897500\t31897800\t0.0938\t54\nchrX\t32244300\t32246700\t0.1308\t60\nchrX\t33190500\t33190800\t0.0069\t20\nchrX\t34248600\t34251900\t0.0073\t53\nchrX\t34416000\t34416300\t0.0839\t47\nchrX\t35315400\t35316000\t0.0184\t61\nchrX\t36466800\t36469800\t0.0193\t70\nchrX\t36986700\t36987900\t0.0352\t36\nchrX\t36998100\t36999300\t0.0142\t33\nchrX\t37085100\t37099200\t0\t42\nchrX\t37554600\t37554900\t0.0144\t40\nchrX\t37570200\t37570500\t0.0062\t22\nchrX\t41427600\t41427900\t0.0585\t49\nchrX\t42202800\t42203100\t0.0239\t78\nchrX\t42204600\t42204900\t0.1012\t67\nchrX\t42473400\t42473700\t0.125\t52\nchrX\t42888900\t42890400\t0.0129\t89\nchrX\t42891600\t42893700\t0\t65\nchrX\t43304700\t43305300\t0\t294\nchrX\t43306500\t43311600\t0\t294\nchrX\t43588500\t43588800\t0.0779\t30\nchrX\t43671600\t43671900\t0.0757\t61\nchrX\t43989300\t43990200\t0\t36\nchrX\t43992900\t43993200\t0.0072\t42\nchrX\t44282400\t44282700\t0.1779\t78\nchrX\t44441100\t44441400\t0\t15\nchrX\t44443800\t44444100\t0.0165\t21\nchrX\t45039600\t45042000\t0.0774\t94\nchrX\t45687900\t45688800\t0\t36\nchrX\t45691800\t45692400\t0\t36\nchrX\t46659300\t46659900\t0.1145\t66\nchrX\t47036700\t47037000\t0.0988\t69\nchrX\t47510100\t47510400\t0.1776\t37\nchrX\t47511900\t47512200\t0.1013\t35\nchrX\t47784300\t47784900\t0\t80\nchrX\t47786400\t47787000\t0.012\t74\nchrX\t47790600\t47790900\t0.0087\t70\nchrX\t47906100\t47906400\t0.2386\t31\nchrX\t48004500\t48012000\t0\t42\nchrX\t48015300\t48015600\t0.0331\t28\nchrX\t48018300\t48020100\t0\t33\nchrX\t48092100\t48092400\t0\t35\nchrX\t48095100\t48095700\t0\t31\nchrX\t48127500\t48134700\t0\t39\nchrX\t48137400\t48137700\t0.0238\t26\nchrX\t48232500\t48233100\t0.0795\t55\nchrX\t48367500\t48368400\t0\t35\nchrX\t48369600\t48396000\t0\t42\nchrX\t48399300\t48425700\t0\t43\nchrX\t48427200\t48427800\t0.0032\t34\nchrX\t49317900\t49320600\t0\t101\nchrX\t49321800\t49322100\t0\t150\nchrX\t49324200\t49331700\t0\t150\nchrX\t49333500\t49344300\t0\t123\nchrX\t49346700\t49348500\t0\t99\nchrX\t49528500\t49589700\t0\t165\nchrX\t49591800\t49603500\t0\t138\nchrX\t49966800\t49968900\t0\t83\nchrX\t50019600\t50025300\t0\t91\nchrX\t50057400\t50057700\t0.0714\t61\nchrX\t50061000\t50062500\t0\t80\nchrX\t50065200\t50065500\t0.1287\t76\nchrX\t50296500\t50296800\t0.1\t40\nchrX\t50739900\t50740200\t0.0623\t33\nchrX\t50990700\t50991900\t0\t29\nchrX\t51033000\t51033300\t0.0463\t33\nchrX\t51079800\t51081000\t0\t39\nchrX\t51111600\t51112200\t0.1212\t79\nchrX\t51115200\t51117300\t0.0116\t63\nchrX\t51265800\t51267000\t0.0795\t68\nchrX\t51429600\t51429900\t0.0113\t31\nchrX\t51618000\t51618300\t0.0424\t22\nchrX\t51668400\t51692100\t0\t48\nchrX\t51700500\t51725100\t0\t46\nchrX\t52041600\t52077000\t0\t44\nchrX\t52177200\t52212600\t0\t45\nchrX\t52223700\t52224300\t0.0928\t66\nchrX\t52267500\t52268100\t0.0114\t19\nchrX\t52445100\t52445700\t0.0663\t29\nchrX\t52458600\t52459500\t0\t35\nchrX\t52460700\t52461300\t0\t35\nchrX\t52473900\t52502100\t0\t71\nchrX\t52510800\t52539000\t0\t65\nchrX\t52644000\t52644600\t0\t28\nchrX\t52670400\t52787700\t0\t49\nchrX\t52790100\t52791300\t0.0047\t37\nchrX\t52799700\t52800000\t0.005\t31\nchrX\t52801200\t52801800\t0.005\t31\nchrX\t52883400\t52920000\t0\t45\nchrX\t52935900\t52973100\t0\t46\nchrX\t53338200\t53339400\t0\t21\nchrX\t53769300\t53769600\t0.2188\t30\nchrX\t53772300\t53772600\t0.0088\t24\nchrX\t54102300\t54102600\t0.055\t29\nchrX\t54108900\t54109200\t0.0327\t35\nchrX\t54118800\t54124500\t0\t72\nchrX\t54765000\t54766800\t0.0428\t52\nchrX\t54769200\t54769500\t0.211\t46\nchrX\t54823200\t54823500\t0.0576\t28\nchrX\t54828000\t54828300\t0.1133\t48\nchrX\t54967500\t54968400\t0\t45\nchrX\t54970500\t54971400\t0\t37\nchrX\t55077900\t55079700\t0\t42\nchrX\t55092000\t55093500\t0\t35\nchrX\t55454100\t55479900\t0\t49\nchrX\t55493400\t55519200\t0\t44\nchrX\t55806900\t55807200\t0.1024\t67\nchrX\t56432400\t56441100\t0\t41\nchrX\t56696100\t56701500\t0\t89\nchrX\t56767800\t56780700\t0\t63\nchrX\t57120300\t57120600\t0.1136\t31\nchrX\t57297600\t57298800\t0\t37\nchrX\t57325800\t57326100\t0.0059\t30\nchrX\t58133400\t58135200\t0\t45\nchrX\t58468200\t58468800\t0.0173\t54\nchrX\t58480500\t58485000\t0\t49\nchrX\t58486800\t58487400\t0\t42\nchrX\t58493700\t58494300\t0\t37\nchrX\t58499100\t58505700\t0\t44\nchrX\t58539900\t58555500\t0\t115\nchrX\t58606200\t58874700\t0\t196\nchrX\t58875900\t58935000\t0\t267\nchrX\t58936200\t58988700\t0\t267\nchrX\t58989900\t59114700\t0\t179\nchrX\t59115900\t59144700\t0\t179\nchrX\t59145900\t59185800\t0\t107\nchrX\t59187600\t59189700\t0\t43\nchrX\t59190900\t59316600\t0\t205\nchrX\t59317800\t59327100\t0\t205\nchrX\t59329200\t59425200\t0\t229\nchrX\t59427000\t59457300\t0\t229\nchrX\t59458500\t59594400\t0\t229\nchrX\t59598600\t59666100\t0\t200\nchrX\t59667300\t59695500\t0\t200\nchrX\t59696700\t59735100\t0\t200\nchrX\t59736900\t59824200\t0\t200\nchrX\t59825400\t59889600\t0\t150\nchrX\t59891100\t59921400\t0\t232\nchrX\t59922600\t59961000\t0\t232\nchrX\t59962200\t60066600\t0\t405\nchrX\t60067800\t60153300\t0\t405\nchrX\t60154500\t60208800\t0\t114\nchrX\t60210300\t60264900\t0\t321\nchrX\t60266400\t60405000\t0\t321\nchrX\t60407700\t60483000\t0\t285\nchrX\t60484800\t60486600\t0\t285\nchrX\t60487800\t60774600\t0\t285\nchrX\t60776100\t60971100\t0\t285\nchrX\t60972300\t60987900\t0\t285\nchrX\t60989100\t61022400\t0\t285\nchrX\t61024800\t61203000\t0\t361\nchrX\t61204200\t61286100\t0\t361\nchrX\t61287300\t61368600\t0\t328\nchrX\t61369800\t61437300\t0\t328\nchrX\t61438800\t61467300\t0\t328\nchrX\t61468500\t61511400\t0\t328\nchrX\t61513800\t61581900\t0\t328\nchrX\t61583100\t61738500\t0\t328\nchrX\t61739700\t61819800\t0\t328\nchrX\t61821300\t61862700\t0\t328\nchrX\t61863900\t61929600\t0\t328\nchrX\t61930800\t61955700\t0\t312\nchrX\t61956900\t61995600\t0\t312\nchrX\t61997100\t61997700\t0\t312\nchrX\t61998900\t62106900\t0\t312\nchrX\t62108400\t62159400\t0\t312\nchrX\t62160600\t62189100\t0\t312\nchrX\t62190300\t62247000\t0\t312\nchrX\t62248200\t62321700\t0\t222\nchrX\t62323200\t62412600\t0\t222\nchrX\t62463300\t62465700\t0\t240\nchrX\t62468700\t62472600\t0\t80\nchrX\t62475000\t62483100\t0\t108\nchrX\t62484300\t62487300\t0\t33\nchrX\t62490000\t62490300\t0\t95\nchrX\t62492100\t62495700\t0\t95\nchrX\t62497800\t62499600\t0\t44\nchrX\t62502000\t62503500\t0\t28\nchrX\t62504700\t62506200\t0\t20\nchrX\t62603100\t62603400\t0.2658\t22\nchrX\t63129600\t63185400\t0\t47\nchrX\t63188700\t63189000\t0.0148\t67\nchrX\t63193500\t63249300\t0\t47\nchrX\t64013400\t64015200\t0.0418\t52\nchrX\t64017000\t64018500\t0.125\t60\nchrX\t64111200\t64111500\t0.0047\t32\nchrX\t64114200\t64114800\t0.0033\t49\nchrX\t64134300\t64134900\t0.0029\t44\nchrX\t64254300\t64258200\t0\t91\nchrX\t64298700\t64299000\t0.1922\t54\nchrX\t64516800\t64517100\t0.0195\t58\nchrX\t65207700\t65211000\t0\t83\nchrX\t65457600\t65457900\t0.1056\t66\nchrX\t65616300\t65616600\t0.0603\t65\nchrX\t65834400\t65834700\t0.1593\t43\nchrX\t66066900\t66067500\t0.016\t70\nchrX\t66080100\t66080400\t0.0984\t45\nchrX\t66137100\t66137700\t0.0109\t75\nchrX\t66180900\t66186000\t0\t87\nchrX\t66560400\t66560700\t0.1511\t32\nchrX\t66953400\t66953700\t0.0846\t75\nchrX\t67060200\t67060500\t0.068\t66\nchrX\t67169400\t67169700\t0\t55\nchrX\t68042700\t68043300\t0.0332\t54\nchrX\t68217900\t68219400\t0.0222\t55\nchrX\t68220600\t68220900\t0.0222\t55\nchrX\t68326200\t68327700\t0.0088\t37\nchrX\t69680400\t69680700\t0.1952\t23\nchrX\t69749100\t69749400\t0.0367\t50\nchrX\t69824700\t69825000\t0.0339\t50\nchrX\t69950100\t69950400\t0.09\t47\nchrX\t69982800\t69987000\t0\t85\nchrX\t70100400\t70104000\t0.0117\t74\nchrX\t70600800\t70601400\t0.0031\t63\nchrX\t70631700\t70632000\t0.0429\t31\nchrX\t70642500\t70643100\t0.011\t67\nchrX\t70680300\t70680600\t0.2979\t61\nchrX\t71350200\t71351700\t0\t29\nchrX\t71414100\t71416200\t0\t41\nchrX\t71520600\t71522700\t0\t17\nchrX\t71683500\t71797800\t0\t47\nchrX\t71903400\t71903700\t0.0306\t27\nchrX\t72178200\t72178500\t0.0361\t88\nchrX\t72179700\t72180000\t0.0361\t88\nchrX\t72680700\t72681300\t0.0672\t70\nchrX\t72743400\t72749700\t0\t44\nchrX\t72750900\t72753900\t0\t44\nchrX\t72755100\t72757200\t0\t44\nchrX\t72758700\t72806700\t0\t47\nchrX\t72808200\t72838800\t0\t44\nchrX\t72840300\t72912600\t0\t42\nchrX\t72914400\t72962400\t0\t46\nchrX\t72963600\t72979200\t0\t46\nchrX\t72996300\t73004400\t0\t39\nchrX\t73009800\t73011900\t0\t64\nchrX\t73078500\t73086600\t0\t44\nchrX\t73106400\t73112700\t0\t94\nchrX\t73291200\t73291800\t0.0093\t65\nchrX\t73381200\t73386900\t0\t78\nchrX\t73887600\t73887900\t0.0605\t60\nchrX\t74874600\t74874900\t0.2478\t39\nchrX\t74991300\t74992200\t0.0584\t87\nchrX\t75218400\t75218700\t0.1423\t58\nchrX\t75510600\t75513000\t0\t53\nchrX\t76004700\t76005000\t0.0491\t47\nchrX\t76006500\t76007400\t0.0014\t51\nchrX\t76034100\t76034400\t0.141\t27\nchrX\t76142100\t76146000\t0\t42\nchrX\t76149300\t76152900\t0\t42\nchrX\t76217400\t76217700\t0.2403\t31\nchrX\t76323000\t76326300\t0.0104\t84\nchrX\t76375800\t76376100\t0.1709\t45\nchrX\t77205300\t77208600\t0\t58\nchrX\t77247900\t77248200\t0.2988\t43\nchrX\t78058500\t78058800\t0.2017\t48\nchrX\t78172500\t78173100\t0.005\t35\nchrX\t78196800\t78197100\t0\t26\nchrX\t78229800\t78230400\t0.0694\t59\nchrX\t78269100\t78269400\t0.005\t14\nchrX\t78441600\t78441900\t0\t52\nchrX\t78853800\t78854100\t0.19\t62\nchrX\t79086600\t79086900\t0.0477\t50\nchrX\t79224300\t79224600\t0.1521\t43\nchrX\t79743600\t79743900\t0.2971\t49\nchrX\t79766400\t79767900\t0.0311\t63\nchrX\t79770600\t79770900\t0.0421\t62\nchrX\t79927800\t79928100\t0.1661\t43\nchrX\t79930800\t79931700\t0.067\t68\nchrX\t80406600\t80406900\t0.0749\t68\nchrX\t80534400\t80535900\t0.0575\t49\nchrX\t81841500\t81847200\t0\t71\nchrX\t82013100\t82013400\t0.196\t65\nchrX\t82491300\t82492200\t0.1387\t87\nchrX\t82857000\t82857600\t0.0035\t55\nchrX\t83060400\t83064600\t0\t70\nchrX\t83543100\t83548200\t0\t61\nchrX\t83841300\t83841600\t0.1262\t71\nchrX\t84604800\t84605100\t0.0495\t94\nchrX\t85254300\t85254600\t0.0712\t25\nchrX\t85425300\t85425600\t0.1569\t53\nchrX\t86114100\t86114400\t0.0396\t43\nchrX\t86350500\t86354700\t0\t73\nchrX\t86446500\t86449200\t0\t87\nchrX\t86557500\t86561700\t0\t74\nchrX\t86970600\t86970900\t0.0983\t62\nchrX\t87118200\t87118500\t0.0321\t45\nchrX\t87499800\t87500100\t0.1061\t33\nchrX\t87821400\t87826800\t0\t88\nchrX\t88033500\t88036500\t0.006\t73\nchrX\t89323500\t89323800\t0.0229\t19\nchrX\t89357700\t89358000\t0.1686\t34\nchrX\t89400900\t89401200\t0.0572\t15\nchrX\t89408400\t89408700\t0.0466\t14\nchrX\t89415900\t89416200\t0.0365\t32\nchrX\t89505300\t89505600\t0.1145\t44\nchrX\t89542800\t89543100\t0.1479\t25\nchrX\t89546100\t89546400\t0.1784\t25\nchrX\t89572800\t89573100\t0.1899\t30\nchrX\t89619300\t89619600\t0.0325\t33\nchrX\t89685300\t89685600\t0.0164\t25\nchrX\t89707200\t89708400\t0.0181\t31\nchrX\t89710800\t89711100\t0.0872\t32\nchrX\t89729700\t89730000\t0.1111\t19\nchrX\t89802000\t89802300\t0.1118\t31\nchrX\t89828700\t89829000\t0.0897\t22\nchrX\t89849400\t89849700\t0\t28\nchrX\t89856300\t89856600\t0.0712\t31\nchrX\t89991300\t89991600\t0.0923\t32\nchrX\t90128700\t90129000\t0.1099\t16\nchrX\t90138000\t90138300\t0.0841\t33\nchrX\t90145800\t90146400\t0.0119\t38\nchrX\t90179400\t90179700\t0.033\t23\nchrX\t90186600\t90186900\t0.0853\t27\nchrX\t90218700\t90219000\t0.1124\t24\nchrX\t90234900\t90235200\t0.0208\t45\nchrX\t90272700\t90273000\t0.0403\t13\nchrX\t90284400\t90284700\t0.1282\t25\nchrX\t90307800\t90308400\t0\t29\nchrX\t90316500\t90316800\t0.24\t25\nchrX\t90320700\t90321000\t0.1289\t11\nchrX\t90346800\t90347100\t0.1524\t26\nchrX\t90397800\t90398100\t0.0493\t25\nchrX\t90446100\t90446400\t0.1019\t26\nchrX\t90528300\t90528600\t0.1102\t21\nchrX\t90575400\t90575700\t0.0723\t33\nchrX\t90684600\t90684900\t0.2078\t19\nchrX\t90693600\t90693900\t0.2903\t22\nchrX\t90810000\t90810300\t0.0492\t31\nchrX\t90869400\t90869700\t0.0129\t35\nchrX\t90908400\t90908700\t0.022\t30\nchrX\t90910500\t90910800\t0.0433\t17\nchrX\t90934800\t90935100\t0.0245\t23\nchrX\t90961200\t90961500\t0.132\t25\nchrX\t90964500\t90964800\t0.0976\t25\nchrX\t90966300\t90966900\t0\t36\nchrX\t91360200\t91360800\t0.0428\t53\nchrX\t91507500\t91508100\t0\t28\nchrX\t91509300\t91510200\t0.0342\t33\nchrX\t91566000\t91566600\t0.0998\t29\nchrX\t91652400\t91652700\t0.135\t34\nchrX\t91667100\t91667400\t0.0594\t28\nchrX\t91746000\t91746300\t0.0621\t34\nchrX\t91820100\t91820400\t0.1294\t46\nchrX\t91862700\t91863000\t0.0673\t25\nchrX\t91896600\t91896900\t0.0098\t24\nchrX\t91979400\t91980000\t0.0888\t30\nchrX\t91996500\t91996800\t0.0024\t30\nchrX\t92035500\t92036100\t0.021\t33\nchrX\t92055000\t92055300\t0.006\t30\nchrX\t92155200\t92155500\t0.0429\t21\nchrX\t92161800\t92162100\t0.0948\t28\nchrX\t92220000\t92220300\t0.021\t26\nchrX\t92349000\t92349300\t0.1759\t16\nchrX\t92362500\t92362800\t0.0137\t23\nchrX\t92413200\t92413500\t0.0954\t21\nchrX\t92455500\t92455800\t0.066\t25\nchrX\t92459100\t92459400\t0.0158\t25\nchrX\t92476800\t92477100\t0.1024\t11\nchrX\t92483400\t92483700\t0.0776\t23\nchrX\t92595600\t92595900\t0.0765\t26\nchrX\t92616000\t92616300\t0.0229\t21\nchrX\t92643300\t92643600\t0.1093\t26\nchrX\t92742600\t92742900\t0.1807\t25\nchrX\t92795700\t92796000\t0.1888\t15\nchrX\t92806200\t92806500\t0\t33\nchrX\t92954400\t92954700\t0.0185\t30\nchrX\t93058200\t93058500\t0.1715\t29\nchrX\t93310800\t93311700\t0\t65\nchrX\t94864200\t94864500\t0.0741\t53\nchrX\t95140200\t95140500\t0.0901\t16\nchrX\t95600700\t95601900\t0.0223\t50\nchrX\t95810400\t95812500\t0\t70\nchrX\t96057900\t96063600\t0\t60\nchrX\t96897900\t96898200\t0.0733\t54\nchrX\t97512600\t97513800\t0\t77\nchrX\t97578600\t97578900\t0.1693\t33\nchrX\t97581300\t97582200\t0\t59\nchrX\t98424600\t98426100\t0.053\t72\nchrX\t98687700\t98692800\t0\t72\nchrX\t98831400\t98831700\t0.1437\t12\nchrX\t99486900\t99487200\t0.0946\t41\nchrX\t100139400\t100139700\t0.1989\t53\nchrX\t100168800\t100169100\t0.0592\t47\nchrX\t100257300\t100257900\t0.0188\t59\nchrX\t100259700\t100260000\t0.0188\t59\nchrX\t100501200\t100502100\t0\t50\nchrX\t100551000\t100551600\t0.0867\t65\nchrX\t100554900\t100557000\t0.0745\t73\nchrX\t100869600\t100869900\t0.1476\t75\nchrX\t100971600\t100972200\t0.0231\t57\nchrX\t101472000\t101472600\t0.0199\t74\nchrX\t101473800\t101474400\t0.0199\t74\nchrX\t101597700\t101601900\t0\t38\nchrX\t101611800\t101616000\t0\t42\nchrX\t102048600\t102049200\t0.0752\t44\nchrX\t102050400\t102051000\t0.0847\t48\nchrX\t102198000\t102281100\t0\t46\nchrX\t102282600\t102338100\t0\t44\nchrX\t102349200\t102452400\t0\t47\nchrX\t102453600\t102457200\t0\t47\nchrX\t102458400\t102479700\t0\t43\nchrX\t102481800\t102489300\t0\t43\nchrX\t102811500\t102811800\t0\t55\nchrX\t103893000\t103894800\t0.0581\t55\nchrX\t103956300\t103987200\t0\t40\nchrX\t104027700\t104030700\t0.0013\t59\nchrX\t104032200\t104032500\t0.1272\t43\nchrX\t104051700\t104082600\t0\t46\nchrX\t104531100\t104531400\t0.1423\t35\nchrX\t104549700\t104550000\t0.0567\t37\nchrX\t105799200\t105799500\t0.0715\t51\nchrX\t105992400\t105992700\t0.0892\t48\nchrX\t106232700\t106233000\t0.1234\t17\nchrX\t106266600\t106278000\t0\t47\nchrX\t106288200\t106299600\t0\t48\nchrX\t106469400\t106475100\t0\t78\nchrX\t106602900\t106603200\t0.0829\t44\nchrX\t106756800\t106757400\t0.1045\t63\nchrX\t107035800\t107036100\t0\t54\nchrX\t107159100\t107159700\t0.0641\t69\nchrX\t107326800\t107327100\t0.1515\t29\nchrX\t107365800\t107366700\t0.0089\t65\nchrX\t107368500\t107368800\t0.0565\t62\nchrX\t107612400\t107613600\t0\t67\nchrX\t108281100\t108281400\t0.0837\t92\nchrX\t108773700\t108774000\t0.0247\t44\nchrX\t109035600\t109035900\t0.1749\t57\nchrX\t109056000\t109056300\t0.1264\t57\nchrX\t109057800\t109058400\t0.009\t55\nchrX\t110222100\t110222400\t0.1329\t49\nchrX\t110817000\t110817600\t0.086\t60\nchrX\t111315300\t111315900\t0.0021\t63\nchrX\t111590100\t111593100\t0.0061\t76\nchrX\t111638400\t111640200\t0.0204\t84\nchrX\t111721200\t111721500\t0.1134\t10\nchrX\t112433400\t112434000\t0.0975\t58\nchrX\t113337900\t113340900\t0.0231\t80\nchrX\t113342400\t113343000\t0.0231\t80\nchrX\t113633700\t113634000\t0.2018\t21\nchrX\t113688600\t113688900\t0.083\t38\nchrX\t114705900\t114706200\t0.0294\t44\nchrX\t114721200\t114721500\t0.1508\t45\nchrX\t114742800\t114743100\t0.0423\t32\nchrX\t114831900\t114833100\t0.0355\t43\nchrX\t115119300\t115120800\t0.0811\t108\nchrX\t115347600\t115347900\t0.1968\t15\nchrX\t115705800\t115706100\t0.2544\t14\nchrX\t115724400\t115725000\t0\t16\nchrX\t115726800\t115735500\t0\t255\nchrX\t115736700\t115737000\t0\t30\nchrX\t115842600\t115889100\t0\t259\nchrX\t116557200\t116557500\t0.0203\t18\nchrX\t116966700\t116967000\t0.1061\t74\nchrX\t117425400\t117425700\t0.2166\t41\nchrX\t117729600\t117730200\t0.1031\t55\nchrX\t117876900\t117877500\t0.1209\t51\nchrX\t118009200\t118010400\t0.0427\t55\nchrX\t118034400\t118035000\t0.204\t53\nchrX\t118401000\t118401300\t0.0342\t50\nchrX\t119435700\t119441400\t0\t77\nchrX\t119805900\t119806200\t0.0526\t57\nchrX\t120038700\t120065100\t0\t46\nchrX\t120066900\t120067200\t0.005\t38\nchrX\t120069300\t120074100\t0\t45\nchrX\t120075900\t120086400\t0\t45\nchrX\t120150000\t120160500\t0\t39\nchrX\t120162300\t120165900\t0\t39\nchrX\t120168900\t120169500\t0.0475\t38\nchrX\t120171300\t120198000\t0\t48\nchrX\t120875700\t120879300\t0\t40\nchrX\t120930000\t120986700\t0\t55\nchrX\t121263900\t121267800\t0.0141\t72\nchrX\t121692000\t121692300\t0.0212\t70\nchrX\t121696500\t121697700\t0\t86\nchrX\t121728300\t121728900\t0.0188\t80\nchrX\t123051900\t123052200\t0.1991\t54\nchrX\t124494900\t124495200\t0.2773\t65\nchrX\t125043600\t125044200\t0.0154\t56\nchrX\t125610000\t125610300\t0.0911\t51\nchrX\t125611500\t125612100\t0.0911\t51\nchrX\t125613300\t125613600\t0.1161\t35\nchrX\t125779800\t125780400\t0.0324\t84\nchrX\t125843100\t125843400\t0.0771\t64\nchrX\t126108600\t126108900\t0.1952\t55\nchrX\t126914400\t126914700\t0.0533\t44\nchrX\t127117500\t127118400\t0.0018\t79\nchrX\t127119600\t127122300\t0.0018\t79\nchrX\t127254900\t127255200\t0.2951\t39\nchrX\t127362900\t127365000\t0.0097\t59\nchrX\t127366200\t127367400\t0.0097\t59\nchrX\t127483800\t127484100\t0.1128\t56\nchrX\t127593900\t127594200\t0.2355\t30\nchrX\t128667600\t128667900\t0.0257\t23\nchrX\t128787300\t128787600\t0.0935\t67\nchrX\t129048900\t129049200\t0.1099\t54\nchrX\t130518000\t130523100\t0\t78\nchrX\t130569900\t130570200\t0.1007\t47\nchrX\t130786800\t130787100\t0.071\t51\nchrX\t130949100\t130949400\t0.0133\t60\nchrX\t130959900\t130960200\t0.0075\t80\nchrX\t130961700\t130964700\t0.0075\t80\nchrX\t131003100\t131006400\t0\t64\nchrX\t131124900\t131125800\t0.0017\t84\nchrX\t131155500\t131155800\t0.186\t24\nchrX\t131379000\t131380200\t0.1231\t66\nchrX\t131487600\t131487900\t0.2065\t74\nchrX\t131504700\t131505000\t0.1408\t64\nchrX\t132136500\t132138000\t0.0119\t66\nchrX\t132866400\t132866700\t0.0524\t57\nchrX\t135116100\t135118500\t0\t45\nchrX\t135120600\t135157800\t0\t48\nchrX\t135174600\t135174900\t0.1226\t29\nchrX\t135214500\t135248700\t0\t44\nchrX\t135249900\t135252000\t0\t40\nchrX\t135254100\t135256200\t0\t43\nchrX\t135615900\t135619200\t0\t42\nchrX\t135621300\t135621600\t0.0971\t21\nchrX\t135669900\t135673200\t0\t38\nchrX\t135720600\t135723000\t0\t91\nchrX\t135724200\t135729900\t0\t91\nchrX\t135731100\t135734400\t0\t37\nchrX\t135748800\t135757200\t0\t92\nchrX\t135758400\t135813000\t0\t92\nchrX\t135814500\t135847500\t0\t92\nchrX\t135849000\t135864900\t0\t72\nchrX\t135866100\t135877200\t0\t58\nchrX\t135879000\t135881400\t0\t58\nchrX\t135883800\t135885900\t0\t83\nchrX\t135945900\t135946200\t0.053\t49\nchrX\t136075800\t136076100\t0.114\t22\nchrX\t136440600\t136440900\t0.115\t64\nchrX\t136443300\t136445400\t0.0063\t106\nchrX\t137674200\t137674500\t0.1362\t37\nchrX\t138062400\t138064200\t0\t67\nchrX\t138301200\t138301500\t0.2246\t35\nchrX\t139069200\t139069500\t0.0417\t41\nchrX\t139852200\t139852500\t0.2235\t50\nchrX\t140013000\t140013300\t0\t13\nchrX\t140018100\t140018400\t0.0957\t11\nchrX\t140074800\t140075100\t0\t33\nchrX\t140219400\t140220000\t0.0169\t19\nchrX\t140412000\t140412300\t0.2196\t15\nchrX\t140419500\t140420100\t0.0513\t97\nchrX\t140995800\t140996100\t0.139\t35\nchrX\t141007200\t141010500\t0\t80\nchrX\t141011700\t141027900\t0\t80\nchrX\t141030300\t141032100\t0\t35\nchrX\t141034200\t141038100\t0\t35\nchrX\t141039600\t141042900\t0\t40\nchrX\t141044700\t141045000\t0.0477\t32\nchrX\t141052500\t141054300\t0\t39\nchrX\t141055500\t141064200\t0\t39\nchrX\t141066000\t141072300\t0\t48\nchrX\t141073800\t141081600\t0\t48\nchrX\t141082800\t141090300\t0\t48\nchrX\t141091500\t141092700\t0.0117\t33\nchrX\t141094500\t141105000\t0\t39\nchrX\t141106200\t141111000\t0\t39\nchrX\t141117300\t141117900\t0.0591\t60\nchrX\t141231900\t141232200\t0.0102\t32\nchrX\t141241800\t141242100\t0.1474\t51\nchrX\t141249000\t141249300\t0.0009\t26\nchrX\t141357000\t141357300\t0.1946\t38\nchrX\t141421200\t141426900\t0\t82\nchrX\t141476400\t141477000\t0\t33\nchrX\t141478500\t141480900\t0\t33\nchrX\t141482400\t141492900\t0\t34\nchrX\t141494700\t141495900\t0.045\t38\nchrX\t141497100\t141507900\t0\t42\nchrX\t141509100\t141511200\t0\t33\nchrX\t141512400\t141513600\t0.0042\t32\nchrX\t141515700\t141521100\t0\t43\nchrX\t141523500\t141531900\t0\t39\nchrX\t141533100\t141535500\t0\t39\nchrX\t141537600\t141539400\t0\t28\nchrX\t141544500\t141546600\t0\t40\nchrX\t141549300\t141557100\t0\t37\nchrX\t141559500\t141560400\t0\t39\nchrX\t141561900\t141566700\t0\t39\nchrX\t141568200\t141569100\t0\t77\nchrX\t141570600\t141578100\t0\t77\nchrX\t141579600\t141585000\t0\t77\nchrX\t141587100\t141588300\t0\t59\nchrX\t141589500\t141594900\t0\t59\nchrX\t141598500\t141598800\t0.14\t39\nchrX\t141688200\t141688500\t0.0468\t36\nchrX\t141697800\t141698400\t0.0421\t50\nchrX\t141699900\t141700200\t0.0775\t31\nchrX\t141790500\t141790800\t0.1709\t20\nchrX\t141825000\t141825300\t0.1034\t67\nchrX\t141912300\t141912900\t0\t30\nchrX\t142190100\t142190700\t0.0046\t33\nchrX\t142339200\t142340400\t0.0031\t88\nchrX\t142342500\t142344000\t0.0031\t88\nchrX\t142478400\t142483500\t0.0225\t104\nchrX\t143154300\t143154600\t0.1576\t48\nchrX\t144078000\t144079800\t0\t46\nchrX\t144081000\t144081300\t0\t46\nchrX\t144082800\t144083700\t0\t36\nchrX\t144088500\t144097500\t0\t56\nchrX\t144099900\t144100500\t0\t34\nchrX\t144102300\t144102600\t0.0016\t45\nchrX\t144105900\t144106200\t0.061\t56\nchrX\t144107400\t144111300\t0\t56\nchrX\t144112500\t144116700\t0\t40\nchrX\t144118200\t144118500\t0.2348\t34\nchrX\t144121500\t144123000\t0\t44\nchrX\t144124200\t144124800\t0.0103\t33\nchrX\t144126000\t144126600\t0.0433\t36\nchrX\t144128700\t144145200\t0\t55\nchrX\t144146700\t144150900\t0\t55\nchrX\t144156900\t144159300\t0\t50\nchrX\t144160500\t144161700\t0\t50\nchrX\t144163800\t144164100\t0\t41\nchrX\t144166200\t144167400\t0\t41\nchrX\t144168900\t144170700\t0\t48\nchrX\t144172500\t144173100\t0\t48\nchrX\t144175200\t144176700\t0\t41\nchrX\t144179100\t144179700\t0.0517\t35\nchrX\t144182400\t144182700\t0.0255\t56\nchrX\t144183900\t144184200\t0.1697\t43\nchrX\t144186300\t144188100\t0\t44\nchrX\t144189600\t144189900\t0.1191\t40\nchrX\t144193200\t144193500\t0.0483\t48\nchrX\t144195000\t144196800\t0.0483\t48\nchrX\t144199500\t144201000\t0\t43\nchrX\t144202500\t144205500\t0\t43\nchrX\t144208500\t144212100\t0\t43\nchrX\t144324600\t144326700\t0\t55\nchrX\t144966900\t144967200\t0.154\t47\nchrX\t145974900\t145975800\t0\t75\nchrX\t146111400\t146112000\t0.031\t63\nchrX\t146619300\t146619600\t0.0375\t59\nchrX\t146802000\t146822400\t0\t44\nchrX\t146861700\t146862300\t0.0412\t47\nchrX\t146904000\t146904300\t0.1175\t65\nchrX\t147279900\t147280200\t0\t24\nchrX\t147283500\t147283800\t0.0287\t59\nchrX\t147285300\t147286500\t0\t71\nchrX\t147408900\t147409500\t0.0332\t65\nchrX\t147654000\t147659400\t0\t82\nchrX\t148123500\t148123800\t0.0723\t65\nchrX\t148125300\t148126800\t0.0723\t65\nchrX\t148170300\t148171800\t0.0477\t45\nchrX\t148300200\t148300500\t0.1053\t26\nchrX\t148731900\t148732200\t0.1489\t54\nchrX\t148971900\t148973100\t0\t53\nchrX\t149178300\t149182800\t0\t86\nchrX\t149215200\t149215800\t0\t66\nchrX\t149336100\t149337600\t0.005\t61\nchrX\t149339100\t149339400\t0.0481\t32\nchrX\t149438400\t149439600\t0.0099\t370\nchrX\t149441100\t149441400\t0.0496\t35\nchrX\t149538600\t149538900\t0.07\t27\nchrX\t149544000\t149544300\t0.0458\t40\nchrX\t149550900\t149553600\t0\t43\nchrX\t149554800\t149562000\t0\t43\nchrX\t149573400\t149585700\t0\t45\nchrX\t149586900\t149598600\t0\t45\nchrX\t149599800\t149601000\t0.0096\t39\nchrX\t149654700\t149658300\t0\t43\nchrX\t149659500\t149680800\t0\t43\nchrX\t149722500\t149748600\t0\t43\nchrX\t149767200\t149769600\t0\t41\nchrX\t149770800\t149796000\t0\t41\nchrX\t149917500\t149928900\t0\t38\nchrX\t149935200\t149935500\t0.0451\t37\nchrX\t149941200\t149941500\t0.102\t35\nchrX\t149946600\t149946900\t0.1209\t30\nchrX\t150000900\t150001200\t0.0157\t131\nchrX\t150022200\t150022500\t0.1802\t46\nchrX\t150132000\t150134100\t0.0194\t73\nchrX\t150170100\t150170400\t0.1248\t63\nchrX\t150215700\t150216000\t0.0386\t28\nchrX\t150340800\t150341100\t0.0413\t17\nchrX\t150418800\t150420300\t0.0091\t64\nchrX\t151331400\t151336200\t0\t75\nchrX\t151914300\t151917600\t0\t19\nchrX\t152349600\t152349900\t0.1667\t55\nchrX\t152360100\t152360400\t0.0649\t76\nchrX\t152550000\t152550300\t0.121\t91\nchrX\t152678700\t152696700\t0\t43\nchrX\t152698500\t152699700\t0\t36\nchrX\t152702400\t152707800\t0\t39\nchrX\t152709600\t152725200\t0\t45\nchrX\t152743200\t152758800\t0\t43\nchrX\t152761800\t152764200\t0\t43\nchrX\t152765700\t152766300\t0\t43\nchrX\t152767500\t152770200\t0\t45\nchrX\t152771700\t152780700\t0\t45\nchrX\t152781900\t152789100\t0\t44\nchrX\t152983800\t152986800\t0\t41\nchrX\t153066600\t153074100\t0\t43\nchrX\t153075900\t153083400\t0\t47\nchrX\t153106800\t153148500\t0\t47\nchrX\t153251700\t153272100\t0\t44\nchrX\t153273600\t153275400\t0\t44\nchrX\t153276600\t153293700\t0\t44\nchrX\t153313500\t153316200\t0\t46\nchrX\t154144500\t154147800\t0\t53\nchrX\t154149600\t154153800\t0\t84\nchrX\t154155000\t154188000\t0\t84\nchrX\t154189200\t154236900\t0\t75\nchrX\t154241100\t154293300\t0\t57\nchrX\t154338300\t154347000\t0\t43\nchrX\t154385100\t154393800\t0\t38\nchrX\t154556400\t154591200\t0\t44\nchrX\t154614000\t154620900\t0\t44\nchrX\t154622400\t154648200\t0\t44\nchrX\t154653600\t154654200\t0\t24\nchrX\t154881000\t154884900\t0\t44\nchrX\t154886400\t154887300\t0\t76\nchrX\t155006400\t155007000\t0.0018\t43\nchrX\t155148000\t155148600\t0.0122\t35\nchrX\t155301600\t155303700\t0.0216\t78\nchrX\t155337000\t155340900\t0\t36\nchrX\t155342100\t155346300\t0\t39\nchrX\t155347500\t155369700\t0\t42\nchrX\t155372100\t155386500\t0\t42\nchrX\t155454300\t155468400\t0\t41\nchrX\t155471400\t155504400\t0\t49\nchrX\t155516100\t155521800\t0\t77\nchrX\t155571300\t155571900\t0\t26\nchrX\t155700900\t155703600\t0\t76\nchrX\t156010500\t156014400\t0\t68\nchrX\t156017100\t156021600\t0\t68\nchrX\t156024600\t156024900\t0.0031\t141\nchrX\t156026400\t156027900\t0.0031\t141\nchrX\t156030300\t156030900\t0.1447\t1368\nchrY\t2808900\t2809500\t0.0171\t34\nchrY\t3071400\t3072000\t0.1232\t23\nchrY\t3215100\t3215400\t0.1449\t27\nchrY\t3228600\t3228900\t0.2332\t25\nchrY\t3275400\t3275700\t0.105\t24\nchrY\t3346500\t3346800\t0.0623\t24\nchrY\t3368400\t3369600\t0.0117\t27\nchrY\t3444300\t3444600\t0.0534\t63\nchrY\t3446100\t3449400\t0\t85\nchrY\t3456600\t3456900\t0.2976\t30\nchrY\t3504300\t3505200\t0.0044\t31\nchrY\t3708000\t3708300\t0.0621\t34\nchrY\t3715800\t3716100\t0.2054\t34\nchrY\t3787800\t3788100\t0.1149\t28\nchrY\t3804300\t3804600\t0.1398\t30\nchrY\t3884400\t3885000\t0.0009\t23\nchrY\t3974700\t3975000\t0\t24\nchrY\t4018200\t4018500\t0.2037\t25\nchrY\t4023000\t4023300\t0.0474\t25\nchrY\t4106100\t4106400\t0.1154\t32\nchrY\t4153200\t4153500\t0.0848\t42\nchrY\t4266900\t4267200\t0.0203\t26\nchrY\t4451700\t4452000\t0.1134\t33\nchrY\t4482600\t4482900\t0.0659\t25\nchrY\t4539900\t4540200\t0.0612\t29\nchrY\t4541700\t4542300\t0.157\t41\nchrY\t4632300\t4632600\t0.2087\t23\nchrY\t4748700\t4749300\t0.189\t30\nchrY\t4807200\t4807800\t0.0639\t33\nchrY\t4851900\t4852200\t0.1844\t25\nchrY\t4891200\t4891500\t0.137\t37\nchrY\t4906500\t4906800\t0.1569\t21\nchrY\t4949400\t4954800\t0\t74\nchrY\t4966500\t4966800\t0.0809\t36\nchrY\t5084100\t5084400\t0.1962\t19\nchrY\t5118600\t5118900\t0.102\t26\nchrY\t5141100\t5141400\t0.2212\t46\nchrY\t5175600\t5175900\t0.0085\t51\nchrY\t5196600\t5197200\t0.1548\t42\nchrY\t5204100\t5204400\t0.0646\t29\nchrY\t5221200\t5221500\t0.0199\t28\nchrY\t5260200\t5260500\t0\t10\nchrY\t5277000\t5277300\t0.0227\t22\nchrY\t5279700\t5280000\t0.0082\t23\nchrY\t5376900\t5377200\t0.0534\t33\nchrY\t5473800\t5474400\t0.105\t28\nchrY\t5526300\t5526600\t0.2625\t33\nchrY\t5568900\t5569200\t0.0023\t26\nchrY\t5572800\t5573100\t0.2278\t28\nchrY\t5596500\t5596800\t0.0957\t34\nchrY\t5606400\t5612100\t0.0078\t99\nchrY\t5734800\t5735400\t0.0142\t30\nchrY\t5760000\t5760300\t0.0212\t32\nchrY\t5861700\t5862000\t0.1383\t32\nchrY\t5875800\t5876100\t0.077\t29\nchrY\t5922600\t5923200\t0.0457\t28\nchrY\t6070500\t6070800\t0.1071\t31\nchrY\t6174600\t6174900\t0.046\t36\nchrY\t6191700\t6192000\t0.2732\t27\nchrY\t6237600\t6248700\t0\t173\nchrY\t6249900\t6257400\t0\t173\nchrY\t6258600\t6260400\t0\t140\nchrY\t6263100\t6266400\t0.0001\t118\nchrY\t6273900\t6275400\t0.0503\t35\nchrY\t6280500\t6280800\t0\t32\nchrY\t6282000\t6284700\t0\t32\nchrY\t6286500\t6288900\t0\t45\nchrY\t6291300\t6321600\t0\t45\nchrY\t6323100\t6335700\t0\t41\nchrY\t6338400\t6361200\t0\t50\nchrY\t6362400\t6463800\t0\t50\nchrY\t6465300\t6477000\t0\t50\nchrY\t6493200\t6493800\t0\t35\nchrY\t6512100\t6513600\t0\t28\nchrY\t6519300\t6520800\t0.0034\t29\nchrY\t6524100\t6524400\t0.0121\t26\nchrY\t6640500\t6640800\t0.1268\t34\nchrY\t6675600\t6706200\t0\t42\nchrY\t6709200\t6709500\t0.0046\t30\nchrY\t7158300\t7158600\t0.1533\t64\nchrY\t7254300\t7254600\t0.1293\t46\nchrY\t7579200\t7581000\t0\t40\nchrY\t7590900\t7591200\t0\t41\nchrY\t7592400\t7593000\t0\t41\nchrY\t7597800\t7598100\t0.0157\t34\nchrY\t7600200\t7600500\t0.0417\t32\nchrY\t7605300\t7608600\t0\t43\nchrY\t7610100\t7621500\t0\t43\nchrY\t7622700\t7630800\t0\t42\nchrY\t7634700\t7636500\t0\t35\nchrY\t7638300\t7638600\t0\t35\nchrY\t9333600\t9333900\t0.0694\t107\nchrY\t9336000\t9345900\t0\t208\nchrY\t9347100\t9402900\t0\t208\nchrY\t9453600\t9491400\t0\t223\nchrY\t9492600\t9502500\t0\t223\nchrY\t9503700\t9533700\t0\t183\nchrY\t9534900\t9537000\t0\t183\nchrY\t9636600\t9636900\t0.1465\t28\nchrY\t9641100\t9642000\t0\t30\nchrY\t9648600\t9650100\t0\t33\nchrY\t9668400\t9669000\t0\t32\nchrY\t9687900\t9699600\t0\t48\nchrY\t9700800\t9802500\t0\t48\nchrY\t9813600\t9836400\t0\t44\nchrY\t9839100\t9883500\t0\t44\nchrY\t9885600\t9887400\t0\t32\nchrY\t9890100\t9892500\t0\t35\nchrY\t9893700\t9894000\t0.1064\t31\nchrY\t9898500\t9900900\t0\t31\nchrY\t9903300\t9903600\t0.1033\t34\nchrY\t9908400\t9916800\t0\t39\nchrY\t9942000\t9942900\t0\t76\nchrY\t9944100\t9946200\t0\t76\nchrY\t10246500\t10266900\t0\t69\nchrY\t10317000\t10544100\t0\t80\nchrY\t10594200\t10616400\t0\t67\nchrY\t10618800\t10621500\t0\t39\nchrY\t10626600\t10633500\t0\t4684\nchrY\t10645800\t10650000\t0\t4661\nchrY\t10651500\t10660800\t0.0561\t2454\nchrY\t10663500\t10669800\t0.129\t4167\nchrY\t10672200\t10672500\t0.1853\t1716\nchrY\t10673700\t10674000\t0.1853\t1716\nchrY\t10682400\t10689600\t0.1031\t3324\nchrY\t10690800\t10692900\t0.1031\t3324\nchrY\t10744200\t10744500\t0.0933\t3565\nchrY\t10745700\t10781700\t0.0933\t3565\nchrY\t10783800\t10787400\t0.156\t3867\nchrY\t10789200\t10794300\t0.1068\t4048\nchrY\t10795800\t10802100\t0.1126\t3884\nchrY\t10803900\t10805100\t0.1547\t276\nchrY\t10806600\t10816800\t0.0883\t910\nchrY\t10818600\t10819500\t0.0883\t910\nchrY\t10820700\t10822200\t0.0883\t910\nchrY\t10823400\t10829400\t0.082\t1580\nchrY\t10830600\t10849200\t0.0669\t3525\nchrY\t10851000\t10852800\t0.0669\t3525\nchrY\t10855800\t10856100\t0.1969\t132\nchrY\t10858200\t10860000\t0.1621\t291\nchrY\t10861200\t10866600\t0.132\t488\nchrY\t10868100\t10873200\t0.0733\t1034\nchrY\t10875600\t10878000\t0.1605\t370\nchrY\t10879200\t10885500\t0.0885\t719\nchrY\t10887300\t10890600\t0.1298\t1144\nchrY\t10891800\t10892700\t0.1363\t1073\nchrY\t10895700\t10896600\t0.1275\t773\nchrY\t10898100\t10902300\t0.0994\t435\nchrY\t10921200\t10947900\t0.088\t1180\nchrY\t10949100\t10952700\t0.088\t1180\nchrY\t10953900\t10956900\t0.088\t1180\nchrY\t10958100\t10959600\t0.1588\t1023\nchrY\t10961100\t10965900\t0.0673\t536\nchrY\t10967400\t10967700\t0.1566\t1002\nchrY\t10968900\t10977300\t0.0937\t1949\nchrY\t10980000\t10980300\t0.235\t169\nchrY\t10982400\t10995900\t0.0998\t2607\nchrY\t10997100\t11001600\t0.1104\t8125\nchrY\t11003100\t11028300\t0.0718\t4082\nchrY\t11029500\t11031900\t0.1076\t520\nchrY\t11033100\t11040900\t0.1074\t538\nchrY\t11240100\t11240400\t0.1767\t102\nchrY\t11292900\t11293200\t0.2616\t2484\nchrY\t11297100\t11304300\t0.101\t4992\nchrY\t11313300\t11313600\t0.2069\t2158\nchrY\t11326200\t11326500\t0.2071\t2104\nchrY\t11355000\t11355300\t0.2326\t24\nchrY\t11493000\t11493600\t0.2816\t148\nchrY\t11494800\t11495100\t0.2079\t257\nchrY\t11496300\t11496600\t0.209\t199\nchrY\t11516700\t11517000\t0.2971\t117\nchrY\t11520900\t11521200\t0.2394\t213\nchrY\t11522400\t11522700\t0.1624\t336\nchrY\t11529000\t11529300\t0.1439\t837\nchrY\t11541900\t11549100\t0\t801\nchrY\t11552700\t11553000\t0.0459\t930\nchrY\t11555400\t11555700\t0.1537\t563\nchrY\t11558100\t11558400\t0.0724\t381\nchrY\t11560200\t11561700\t0.0409\t374\nchrY\t11564100\t11566500\t0.0066\t961\nchrY\t11567700\t11569500\t0\t736\nchrY\t11570700\t11592000\t0\t736\nchrY\t11643600\t11643900\t0.221\t15657\nchrY\t11646000\t11646300\t0.1362\t458\nchrY\t11666100\t11666400\t0.2009\t293\nchrY\t11670600\t11670900\t0.2457\t146\nchrY\t11673000\t11673300\t0.2658\t120\nchrY\t11674800\t11675100\t0.2342\t139\nchrY\t11676300\t11676600\t0.2747\t162\nchrY\t11680200\t11680500\t0.1714\t423\nchrY\t11684700\t11685000\t0.2622\t132\nchrY\t11687400\t11688300\t0.1467\t1992\nchrY\t11690100\t11690700\t0.1671\t3894\nchrY\t11699100\t11700600\t0.159\t334\nchrY\t11705400\t11706900\t0.2045\t156\nchrY\t11709300\t11709600\t0.2801\t163\nchrY\t11711700\t11713200\t0.1822\t221\nchrY\t11716800\t11719200\t0.0966\t1772\nchrY\t11721900\t11723400\t0.1258\t31584\nchrY\t11726400\t11726700\t0.2299\t120\nchrY\t11728200\t11729700\t0.202\t217\nchrY\t11731200\t11732700\t0.1633\t2982\nchrY\t11734800\t11741700\t0.113\t2626\nchrY\t11743500\t11745300\t0.1493\t2360\nchrY\t11747100\t11748600\t0.2632\t7206\nchrY\t12313800\t12315000\t0\t40\nchrY\t12320400\t12321000\t0\t40\nchrY\t12850800\t12851100\t0.018\t28\nchrY\t13113300\t13114200\t0\t41\nchrY\t13121100\t13122000\t0\t33\nchrY\t13166700\t13167000\t0.1983\t42\nchrY\t13563600\t13564200\t0.0696\t89\nchrY\t13984500\t14019600\t0\t46\nchrY\t14023200\t14058000\t0\t44\nchrY\t15875400\t15883500\t0\t124\nchrY\t15896400\t15904500\t0\t105\nchrY\t16159800\t16269300\t0\t46\nchrY\t16316100\t16425600\t0\t57\nchrY\t17061600\t17063400\t0\t76\nchrY\t17376300\t17377200\t0\t62\nchrY\t17456100\t17951100\t0\t63\nchrY\t17955000\t18450000\t0\t64\nchrY\t18451200\t18640200\t0\t64\nchrY\t18680100\t18870000\t0\t50\nchrY\t19583100\t19583700\t0\t32\nchrY\t19667700\t19668000\t0.1543\t55\nchrY\t19678200\t19679100\t0.02\t48\nchrY\t19780800\t19781400\t0\t34\nchrY\t20054100\t20062800\t0\t48\nchrY\t20064300\t20065500\t0\t56\nchrY\t20069700\t20070900\t0\t39\nchrY\t20078400\t20078700\t0.1089\t15\nchrY\t20080200\t20083500\t0\t80\nchrY\t20085600\t20091000\t0\t80\nchrY\t20095200\t20095500\t0.0923\t13\nchrY\t20096700\t20100000\t0\t42\nchrY\t20103000\t20107200\t0\t52\nchrY\t20112300\t20112600\t0\t40\nchrY\t20114100\t20115000\t0\t67\nchrY\t20120100\t20124600\t0\t93\nchrY\t20127600\t20131500\t0\t52\nchrY\t20134500\t20135700\t0\t30\nchrY\t20142600\t20153400\t0\t66\nchrY\t20158500\t20176800\t0\t88\nchrY\t20179500\t20182800\t0\t44\nchrY\t20184900\t20203500\t0\t167\nchrY\t20204700\t20207700\t0\t63\nchrY\t20258400\t20260200\t0\t40\nchrY\t20269500\t20273400\t0\t80\nchrY\t20287800\t20295300\t0\t100\nchrY\t20318700\t20321100\t0\t56\nchrY\t20326500\t20328300\t0\t229\nchrY\t20329500\t20343600\t0\t229\nchrY\t20371500\t20371800\t0.2192\t58\nchrY\t20473200\t20475600\t0.0241\t61\nchrY\t20958900\t20959200\t0.1668\t53\nchrY\t21010500\t21021300\t0\t40\nchrY\t21051600\t21063300\t0\t42\nchrY\t21065100\t21065700\t0\t29\nchrY\t21493800\t21567000\t0\t73\nchrY\t21705900\t21706200\t0.0565\t36\nchrY\t21714900\t21738900\t0\t23\nchrY\t21741600\t21750000\t0\t26\nchrY\t21756000\t21789000\t0\t26\nchrY\t21862200\t21923400\t0\t86\nchrY\t21926100\t21932100\t0\t86\nchrY\t21934200\t21980400\t0\t86\nchrY\t21981600\t22001700\t0\t86\nchrY\t22003500\t22006500\t0\t86\nchrY\t22007700\t22074300\t0\t86\nchrY\t22076700\t22208700\t0\t58\nchrY\t22289100\t22289400\t0.1461\t35\nchrY\t22377900\t22504800\t0\t52\nchrY\t22506000\t22526100\t0\t52\nchrY\t22527300\t22725900\t0\t52\nchrY\t22735800\t22736100\t0.0225\t25\nchrY\t22741500\t22741800\t0.1508\t26\nchrY\t22746900\t22777500\t0\t39\nchrY\t22779000\t22783200\t0\t37\nchrY\t22785000\t22814400\t0\t50\nchrY\t22815600\t22883700\t0\t50\nchrY\t22885200\t22898700\t0\t63\nchrY\t22899900\t22941600\t0\t63\nchrY\t22942800\t23027400\t0\t63\nchrY\t23028600\t23572800\t0\t63\nchrY\t23574900\t23655900\t0\t46\nchrY\t23657100\t24353700\t0\t59\nchrY\t24355200\t24490500\t0\t69\nchrY\t24491700\t24569700\t0\t69\nchrY\t24570900\t24582900\t0\t69\nchrY\t24584400\t25185000\t0\t69\nchrY\t25186200\t25406100\t0\t68\nchrY\t25407300\t25692000\t0\t68\nchrY\t25693200\t26019900\t0\t68\nchrY\t26021100\t26059800\t0\t68\nchrY\t26061300\t26282400\t0\t68\nchrY\t26283900\t26311200\t0\t68\nchrY\t26638200\t26643600\t0.06\t1063\nchrY\t26645100\t26645400\t0.0623\t531\nchrY\t26652000\t26655000\t0.1651\t335\nchrY\t26656200\t26656500\t0.2273\t310\nchrY\t26660100\t26660400\t0.1911\t147\nchrY\t26667900\t26668500\t0.1505\t266\nchrY\t26672700\t26673000\t0.1076\t600\nchrY\t56673000\t56771700\t0\t27429\n"
  },
  {
    "path": "tracks/lowmap50perc.bed",
    "content": "chr1\t9900\t15600\t0\t226\nchr1\t16800\t55200\t0\t191\nchr1\t59700\t61200\t0.0233\t68\nchr1\t64200\t66000\t0\t104\nchr1\t67800\t75900\t0\t104\nchr1\t78300\t78900\t0\t104\nchr1\t80700\t81000\t0.1405\t73\nchr1\t90300\t97500\t0\t119\nchr1\t99300\t101400\t0\t119\nchr1\t103500\t108300\t0.0051\t106\nchr1\t109800\t128400\t0\t124\nchr1\t129600\t132900\t0\t124\nchr1\t134400\t135900\t0\t55\nchr1\t137100\t137700\t0.2235\t73\nchr1\t140100\t182700\t0\t112\nchr1\t184500\t186300\t0.1444\t135\nchr1\t187500\t190800\t0\t154\nchr1\t192000\t207300\t0\t114\nchr1\t258300\t267300\t0\t150\nchr1\t269700\t270600\t0.0833\t110\nchr1\t271800\t279000\t0.0011\t120\nchr1\t280800\t284100\t0.0011\t120\nchr1\t286200\t286500\t0\t99\nchr1\t288000\t297300\t0\t99\nchr1\t348000\t532800\t0\t120\nchr1\t534000\t535800\t0\t120\nchr1\t587700\t589500\t0\t29\nchr1\t590700\t591000\t0\t29\nchr1\t593700\t599700\t0.0018\t109\nchr1\t601200\t608400\t0\t65\nchr1\t609600\t610500\t0\t750\nchr1\t611700\t632400\t0\t750\nchr1\t635400\t645000\t0\t94\nchr1\t646500\t664500\t0\t94\nchr1\t666600\t667200\t0.3088\t74\nchr1\t669000\t676500\t0\t110\nchr1\t678300\t701100\t0\t110\nchr1\t702600\t729300\t0\t110\nchr1\t731100\t732600\t0\t114\nchr1\t734400\t752400\t0\t114\nchr1\t753600\t757500\t0\t114\nchr1\t758700\t762000\t0\t114\nchr1\t763200\t766200\t0.0015\t75\nchr1\t767700\t769800\t0\t86\nchr1\t772800\t774600\t0\t90\nchr1\t776400\t776700\t0.3125\t57\nchr1\t789600\t791700\t0.2643\t739\nchr1\t799800\t800100\t0.3809\t59\nchr1\t807000\t807300\t0.251\t89\nchr1\t808800\t809100\t0.1351\t68\nchr1\t813900\t814200\t0.0238\t43\nchr1\t817500\t817800\t0.0781\t83\nchr1\t828000\t828300\t0.1916\t71\nchr1\t857400\t857700\t0.1344\t31\nchr1\t866700\t867000\t0.4355\t66\nchr1\t934200\t934500\t0.0843\t24\nchr1\t976800\t977100\t0.2936\t18\nchr1\t1076700\t1079400\t0.0176\t87\nchr1\t1139400\t1140300\t0.0455\t40\nchr1\t1201800\t1202400\t0.1474\t43\nchr1\t1248900\t1249500\t0.0008\t77\nchr1\t1288800\t1290000\t0.3288\t96\nchr1\t1297200\t1297500\t0.4759\t50\nchr1\t1478700\t1479000\t0.0834\t63\nchr1\t1481100\t1481700\t0.0206\t70\nchr1\t1517400\t1517700\t0.0632\t67\nchr1\t1519200\t1519800\t0.0705\t55\nchr1\t1632600\t1636200\t0\t65\nchr1\t1642200\t1644600\t0\t71\nchr1\t1657500\t1658700\t0.0599\t62\nchr1\t1661700\t1662000\t0.0691\t72\nchr1\t1675500\t1677300\t0.0404\t71\nchr1\t1690800\t1693800\t0.0417\t71\nchr1\t1695600\t1695900\t0.0864\t44\nchr1\t1698300\t1703400\t0\t63\nchr1\t1705200\t1705500\t0.4392\t40\nchr1\t1707000\t1707300\t0.3648\t48\nchr1\t1708800\t1712700\t0\t74\nchr1\t1722900\t1723200\t0.0836\t65\nchr1\t1727700\t1728000\t0.0666\t56\nchr1\t1738500\t1740000\t0.0382\t82\nchr1\t1744200\t1748100\t0.0108\t71\nchr1\t1751100\t1751700\t0.0595\t54\nchr1\t1979400\t1979700\t0.4737\t28\nchr1\t2123100\t2123700\t0.334\t56\nchr1\t2280900\t2282400\t0.0113\t114\nchr1\t2365800\t2366100\t0.2105\t80\nchr1\t2568000\t2568300\t0.2465\t53\nchr1\t2655000\t2682900\t0\t730\nchr1\t2684700\t2687100\t0.1498\t317\nchr1\t2688600\t2702700\t0\t1101\nchr1\t2746500\t2750100\t0\t610\nchr1\t2753100\t2767500\t0\t949\nchr1\t2768700\t2775000\t0\t152\nchr1\t2776500\t2777400\t0.0034\t100\nchr1\t2852400\t2852700\t0.4024\t56\nchr1\t2949600\t2949900\t0.3544\t24\nchr1\t3162900\t3163200\t0.1753\t82\nchr1\t3167700\t3168000\t0.4241\t45\nchr1\t3475200\t3475800\t0\t98\nchr1\t3583200\t3583800\t0.0758\t106\nchr1\t3643800\t3644400\t0\t27\nchr1\t3693900\t3694800\t0.1974\t65\nchr1\t3891900\t3892500\t0.0354\t23\nchr1\t4077300\t4077900\t0.1175\t60\nchr1\t4302900\t4303200\t0.2549\t348\nchr1\t4332900\t4333500\t0.3322\t112\nchr1\t4632900\t4633200\t0.3057\t16\nchr1\t5334300\t5334600\t0\t103\nchr1\t6304500\t6304800\t0.1027\t54\nchr1\t7114800\t7115400\t0\t60\nchr1\t7865100\t7865400\t0.3899\t41\nchr1\t10577400\t10577700\t0.4368\t29\nchr1\t10744500\t10744800\t0.3425\t81\nchr1\t12789600\t12789900\t0.3936\t45\nchr1\t12825300\t12825600\t0.1179\t91\nchr1\t12832800\t12833100\t0.2072\t59\nchr1\t12862200\t12862500\t0.3216\t56\nchr1\t12866400\t12867300\t0\t46\nchr1\t12868500\t12868800\t0.0613\t65\nchr1\t12870900\t12872700\t0\t51\nchr1\t12875100\t12876600\t0.0488\t98\nchr1\t12879000\t12879600\t0.0419\t41\nchr1\t12887700\t12889500\t0.0228\t83\nchr1\t12891600\t12892500\t0.0047\t68\nchr1\t12894600\t12898200\t0.0047\t68\nchr1\t12899400\t12900000\t0.0047\t68\nchr1\t12901800\t12906000\t0\t75\nchr1\t12908400\t12908700\t0.056\t39\nchr1\t12912900\t12919200\t0\t81\nchr1\t12920400\t12924600\t0\t77\nchr1\t12926100\t12934800\t0\t77\nchr1\t12936600\t12936900\t0.1919\t73\nchr1\t12939000\t12947400\t0\t91\nchr1\t12948600\t12954300\t0\t66\nchr1\t13005000\t13005300\t0.0151\t56\nchr1\t13007700\t13015800\t0\t56\nchr1\t13017600\t13023600\t0\t74\nchr1\t13024800\t13026300\t0\t74\nchr1\t13030500\t13031100\t0.1259\t46\nchr1\t13032600\t13034100\t0.0234\t50\nchr1\t13035600\t13043100\t0\t67\nchr1\t13044300\t13045200\t0\t67\nchr1\t13047600\t13055400\t0\t69\nchr1\t13059000\t13067700\t0\t86\nchr1\t13068900\t13070100\t0\t86\nchr1\t13071600\t13104000\t0\t86\nchr1\t13122600\t13167600\t0\t92\nchr1\t13168800\t13169100\t0\t92\nchr1\t13173000\t13199400\t0\t67\nchr1\t13200600\t13224300\t0\t67\nchr1\t13247700\t13251000\t0\t72\nchr1\t13252200\t13252500\t0\t72\nchr1\t13254000\t13263000\t0\t72\nchr1\t13264200\t13265400\t0\t72\nchr1\t13266600\t13275900\t0\t75\nchr1\t13277400\t13279200\t0.136\t66\nchr1\t13280400\t13281600\t0\t89\nchr1\t13282800\t13285500\t0\t89\nchr1\t13286700\t13288500\t0\t89\nchr1\t13290000\t13291500\t0.0925\t59\nchr1\t13295700\t13298700\t0\t74\nchr1\t13299900\t13300200\t0.0003\t66\nchr1\t13301700\t13302600\t0.0003\t66\nchr1\t13304400\t13305300\t0.0003\t66\nchr1\t13306800\t13307400\t0.3077\t61\nchr1\t13312200\t13312800\t0.092\t70\nchr1\t13327500\t13328700\t0\t57\nchr1\t13332600\t13332900\t0.3013\t73\nchr1\t13335600\t13336200\t0\t74\nchr1\t13340100\t13340400\t0.1149\t51\nchr1\t13363200\t13363800\t0.0261\t40\nchr1\t14029200\t14029500\t0.0111\t86\nchr1\t14257200\t14257500\t0.4339\t50\nchr1\t16495200\t16495800\t0.01\t91\nchr1\t16515000\t16516800\t0.1868\t180\nchr1\t16539900\t16540200\t0.3954\t57\nchr1\t16542000\t16542300\t0.2269\t85\nchr1\t16545600\t16545900\t0.301\t60\nchr1\t16548000\t16548900\t0.0779\t52\nchr1\t16551000\t16551600\t0.0233\t95\nchr1\t16554000\t16557000\t0\t85\nchr1\t16558200\t16569600\t0\t292\nchr1\t16572300\t16574400\t0.0665\t134\nchr1\t16579200\t16579500\t0.3376\t142\nchr1\t16581000\t16581300\t0.3252\t156\nchr1\t16582500\t16582800\t0.1968\t117\nchr1\t16588800\t16589100\t0.2012\t128\nchr1\t16590600\t16599000\t0\t135\nchr1\t16600500\t16601100\t0\t135\nchr1\t16602300\t16604700\t0\t135\nchr1\t16619100\t16619700\t0.111\t150\nchr1\t16653300\t16674000\t0\t185\nchr1\t16682100\t16682700\t0.0749\t78\nchr1\t16688400\t16696200\t0\t86\nchr1\t16698000\t16699200\t0.0385\t92\nchr1\t16700400\t16704000\t0\t98\nchr1\t16706100\t16707300\t0\t83\nchr1\t16708500\t16711500\t0\t83\nchr1\t16713300\t16715700\t0\t98\nchr1\t16729500\t16729800\t0.054\t122\nchr1\t16731000\t16731900\t0\t175\nchr1\t16733700\t16755000\t0\t175\nchr1\t16756500\t16758300\t0.0529\t150\nchr1\t16760100\t16760400\t0.3697\t69\nchr1\t16761900\t16764000\t0.0038\t94\nchr1\t16768500\t16769100\t0.0208\t123\nchr1\t16773000\t16773300\t0.2326\t106\nchr1\t16778400\t16778700\t0.0466\t126\nchr1\t16783800\t16785600\t0.0011\t99\nchr1\t16790400\t16792200\t0.2609\t120\nchr1\t16850700\t16853700\t0\t72\nchr1\t16855500\t16855800\t0.3755\t51\nchr1\t16858200\t16858500\t0.411\t61\nchr1\t16863300\t16863600\t0.2797\t87\nchr1\t16866000\t16866600\t0.1518\t141\nchr1\t16917600\t16918200\t0.0114\t75\nchr1\t16953600\t16954200\t0.0577\t140\nchr1\t16974000\t16974900\t0\t34\nchr1\t17241600\t17241900\t0.457\t59\nchr1\t20814900\t20817000\t0.056\t41\nchr1\t20831700\t20833200\t0.0494\t70\nchr1\t21387600\t21389700\t0.0859\t57\nchr1\t21422400\t21422700\t0.3003\t61\nchr1\t21425100\t21425700\t0.0351\t65\nchr1\t21482400\t21483000\t0.0104\t73\nchr1\t21484800\t21485700\t0.1315\t57\nchr1\t21968100\t21968400\t0.0698\t54\nchr1\t21979800\t21980100\t0.2965\t58\nchr1\t21989400\t21991200\t0\t78\nchr1\t21993600\t21993900\t0.1595\t60\nchr1\t22012500\t22014600\t0\t72\nchr1\t23837100\t23837400\t0.3386\t43\nchr1\t23992800\t23994900\t0.0688\t55\nchr1\t24799800\t24800400\t0.1913\t26\nchr1\t24832500\t24834900\t0\t36\nchr1\t25002300\t25002600\t0.3444\t13\nchr1\t25264800\t25266000\t0.0078\t53\nchr1\t25273500\t25273800\t0.4385\t40\nchr1\t25292700\t25293000\t0.3935\t35\nchr1\t25297200\t25298400\t0.1491\t51\nchr1\t25303800\t25304400\t0.1804\t49\nchr1\t25312200\t25312500\t0.1363\t47\nchr1\t25316700\t25317900\t0\t42\nchr1\t25323000\t25329000\t0\t56\nchr1\t25335000\t25336200\t0.0015\t58\nchr1\t25337400\t25337700\t0.0015\t58\nchr1\t25362600\t25368600\t0\t57\nchr1\t25374600\t25375200\t0.0553\t54\nchr1\t25380000\t25380300\t0.1413\t55\nchr1\t25388100\t25388400\t0.0911\t47\nchr1\t25419600\t25419900\t0.3566\t47\nchr1\t25508700\t25512000\t0.1838\t123\nchr1\t26163300\t26163600\t0.1266\t39\nchr1\t26597100\t26597400\t0.2336\t69\nchr1\t26640600\t26641200\t0.0034\t67\nchr1\t26646900\t26647500\t0.0017\t66\nchr1\t26818500\t26819100\t0.4183\t38\nchr1\t27065100\t27065400\t0.0868\t81\nchr1\t27852300\t27855000\t0.0671\t75\nchr1\t29723400\t29723700\t0.4786\t150\nchr1\t30439200\t30439800\t0.0665\t109\nchr1\t30441900\t30442500\t0.0665\t109\nchr1\t30443700\t30444000\t0.0665\t109\nchr1\t30498600\t30498900\t0.096\t84\nchr1\t30567900\t30568800\t0.011\t182\nchr1\t30577200\t30577500\t0.4454\t62\nchr1\t30578700\t30579300\t0.0551\t71\nchr1\t30935700\t30936000\t0.1235\t68\nchr1\t30949200\t30949500\t0.1536\t79\nchr1\t31431900\t31432200\t0.4337\t516\nchr1\t32974500\t32974800\t0.3256\t61\nchr1\t33051300\t33053400\t0.0135\t70\nchr1\t33834000\t33834900\t0.0253\t56\nchr1\t34095000\t34095300\t0.0234\t194\nchr1\t34096500\t34098300\t0.0234\t194\nchr1\t34252200\t34256400\t0.0393\t93\nchr1\t34566300\t34572000\t0\t101\nchr1\t34956900\t34957200\t0.3072\t73\nchr1\t35260200\t35260500\t0.2316\t39\nchr1\t38667000\t38667300\t0.1822\t126\nchr1\t38922300\t38922600\t0.3326\t18\nchr1\t39413400\t39413700\t0.4493\t37\nchr1\t39495300\t39495600\t0.3206\t70\nchr1\t39511200\t39513300\t0\t68\nchr1\t39515100\t39516300\t0.0618\t68\nchr1\t39518100\t39518700\t0.0919\t66\nchr1\t39520500\t39522000\t0.0408\t60\nchr1\t39765300\t39765900\t0.1933\t64\nchr1\t39767700\t39768000\t0.2489\t78\nchr1\t39770700\t39774900\t0\t87\nchr1\t39785100\t39785400\t0.1394\t56\nchr1\t39999600\t39999900\t0.1148\t50\nchr1\t40366200\t40370700\t0\t136\nchr1\t40496700\t40497000\t0.1811\t41\nchr1\t41208000\t41208300\t0.0326\t56\nchr1\t41854500\t41855100\t0.0947\t97\nchr1\t41989800\t41991000\t0.1619\t84\nchr1\t41992500\t41993100\t0.1619\t84\nchr1\t42064800\t42065100\t0.1743\t69\nchr1\t42094500\t42094800\t0.202\t55\nchr1\t42233100\t42233400\t0.1903\t44\nchr1\t42253200\t42254700\t0.258\t76\nchr1\t42277500\t42277800\t0.2148\t36\nchr1\t42494700\t42495300\t0.0235\t166\nchr1\t42708900\t42709200\t0.2458\t185\nchr1\t42750900\t42751500\t0.0401\t50\nchr1\t43117200\t43117800\t0.1024\t78\nchr1\t45709800\t45711000\t0.1354\t61\nchr1\t45725400\t45726000\t0.0421\t51\nchr1\t45741600\t45741900\t0.1112\t25\nchr1\t46240200\t46242900\t0.1027\t82\nchr1\t46504200\t46505400\t0.0383\t90\nchr1\t46874700\t46875000\t0.1614\t58\nchr1\t46876800\t46877100\t0.1271\t51\nchr1\t46886400\t46887600\t0\t67\nchr1\t46891800\t46897200\t0\t97\nchr1\t47070600\t47075700\t0\t83\nchr1\t47078400\t47078700\t0.3607\t49\nchr1\t47080200\t47081400\t0\t62\nchr1\t47088600\t47088900\t0.285\t55\nchr1\t47090700\t47091000\t0.167\t70\nchr1\t47092800\t47093100\t0.2563\t61\nchr1\t48150600\t48150900\t0\t148\nchr1\t48152400\t48156000\t0\t148\nchr1\t48381900\t48384000\t0.0287\t99\nchr1\t49006800\t49007400\t0.1349\t70\nchr1\t49259400\t49260000\t0.2722\t80\nchr1\t49261800\t49262100\t0.4033\t76\nchr1\t49283700\t49284000\t0.1117\t102\nchr1\t49287000\t49288200\t0.0645\t79\nchr1\t49800600\t49800900\t0.1283\t52\nchr1\t49875600\t49876800\t0.0302\t78\nchr1\t49878900\t49879200\t0.0602\t65\nchr1\t50864100\t50864400\t0.3397\t63\nchr1\t50918400\t50919000\t0.0081\t89\nchr1\t52636200\t52636500\t0.4439\t46\nchr1\t52797300\t52797600\t0.1032\t134\nchr1\t53283600\t53284200\t0.0752\t36\nchr1\t53713200\t53713500\t0.2647\t120\nchr1\t54561300\t54562800\t0.2505\t103\nchr1\t55666800\t55667100\t0.1833\t21\nchr1\t55941900\t55942200\t0.1605\t65\nchr1\t56365500\t56369100\t0\t135\nchr1\t58115100\t58115700\t0.0732\t84\nchr1\t58129800\t58131300\t0.1765\t91\nchr1\t58254600\t58255200\t0.0951\t82\nchr1\t58269600\t58274400\t0.0006\t87\nchr1\t58374000\t58374300\t0.0548\t82\nchr1\t58376700\t58377000\t0.0548\t82\nchr1\t58378200\t58378800\t0.0548\t82\nchr1\t58582500\t58583400\t0.1672\t81\nchr1\t58593900\t58594200\t0.3137\t38\nchr1\t58960200\t58960500\t0.1892\t121\nchr1\t59253900\t59254500\t0.1297\t76\nchr1\t59648400\t59650800\t0.156\t69\nchr1\t59652300\t59652600\t0.156\t69\nchr1\t60003000\t60003300\t0.2314\t73\nchr1\t60210300\t60210600\t0.2012\t83\nchr1\t60278700\t60279000\t0.1995\t87\nchr1\t60380700\t60381000\t0.2317\t69\nchr1\t60466800\t60467100\t0.3263\t73\nchr1\t60493800\t60494700\t0.2107\t90\nchr1\t60550800\t60551400\t0.0955\t109\nchr1\t60643800\t60645300\t0.1929\t88\nchr1\t60776100\t60776400\t0.3228\t53\nchr1\t60779100\t60779400\t0.2439\t56\nchr1\t61925100\t61925400\t0.2659\t103\nchr1\t63239700\t63242400\t0.0028\t102\nchr1\t63474000\t63474300\t0.3256\t61\nchr1\t63926700\t63927600\t0.0432\t53\nchr1\t64373400\t64373700\t0\t68\nchr1\t64798200\t64798500\t0.0889\t106\nchr1\t65227500\t65227800\t0.1824\t82\nchr1\t65450400\t65450700\t0.2497\t80\nchr1\t65558700\t65564100\t0\t94\nchr1\t65671800\t65672100\t0.276\t68\nchr1\t65778300\t65778600\t0.0289\t74\nchr1\t66104400\t66104700\t0.1789\t95\nchr1\t66486000\t66486300\t0.3607\t93\nchr1\t66805500\t66805800\t0.2601\t70\nchr1\t66823500\t66824400\t0.2397\t67\nchr1\t67079100\t67084800\t0\t91\nchr1\t67158900\t67159200\t0.1275\t56\nchr1\t67342800\t67343100\t0.361\t55\nchr1\t68734800\t68739600\t0\t110\nchr1\t68878800\t68879100\t0.2492\t74\nchr1\t68925600\t68926200\t0.324\t77\nchr1\t69116100\t69117000\t0.1179\t84\nchr1\t69118200\t69118500\t0.2728\t50\nchr1\t69883800\t69884100\t0.0895\t78\nchr1\t69887100\t69887400\t0.1147\t82\nchr1\t70099200\t70099500\t0.139\t82\nchr1\t70596000\t70596600\t0.1902\t53\nchr1\t70599300\t70599600\t0.2421\t100\nchr1\t70646700\t70647600\t0.0059\t26\nchr1\t70814400\t70814700\t0.4068\t37\nchr1\t71514000\t71519700\t0\t114\nchr1\t71888700\t71894100\t0\t122\nchr1\t72900900\t72901500\t0.3049\t86\nchr1\t73194000\t73194900\t0.0125\t112\nchr1\t73287900\t73288200\t0.239\t19\nchr1\t74447700\t74449200\t0.0093\t104\nchr1\t74519100\t74519400\t0.081\t34\nchr1\t74758500\t74758800\t0.3686\t80\nchr1\t74787900\t74788200\t0.2648\t66\nchr1\t75377100\t75379800\t0\t75\nchr1\t75381000\t75384900\t0\t75\nchr1\t75387300\t75387900\t0.0728\t125\nchr1\t75885900\t75886200\t0.095\t25\nchr1\t76111500\t76111800\t0.1833\t78\nchr1\t76999800\t77001600\t0.1473\t72\nchr1\t77002800\t77003400\t0.1473\t72\nchr1\t77004600\t77004900\t0.1473\t72\nchr1\t77869200\t77870700\t0.1259\t79\nchr1\t78243900\t78245700\t0\t95\nchr1\t78282900\t78283200\t0.2715\t57\nchr1\t78845700\t78851100\t0.0015\t114\nchr1\t79571700\t79572000\t0.2215\t28\nchr1\t79940700\t79941300\t0.1225\t74\nchr1\t79942800\t79943700\t0.1225\t74\nchr1\t80134200\t80134800\t0.13\t60\nchr1\t80136900\t80137200\t0.13\t60\nchr1\t80939400\t80944800\t0\t105\nchr1\t80950800\t80951100\t0.0219\t59\nchr1\t82131600\t82132200\t0.2059\t72\nchr1\t82251000\t82252500\t0.0333\t97\nchr1\t82253700\t82255800\t0.0333\t97\nchr1\t82660200\t82661700\t0\t91\nchr1\t83134500\t83134800\t0.3362\t68\nchr1\t83161200\t83161500\t0.2608\t42\nchr1\t83184000\t83184300\t0.1363\t78\nchr1\t83187000\t83187300\t0.2478\t59\nchr1\t83195700\t83196000\t0.4019\t56\nchr1\t83208000\t83208300\t0.1703\t46\nchr1\t83230500\t83231100\t0.1165\t100\nchr1\t83266200\t83266800\t0.0975\t87\nchr1\t83275500\t83276100\t0.398\t44\nchr1\t83281200\t83281500\t0.3683\t48\nchr1\t83303400\t83304000\t0.0442\t57\nchr1\t83325300\t83325900\t0.3289\t46\nchr1\t83339400\t83341200\t0.0207\t89\nchr1\t83351100\t83352300\t0.0666\t69\nchr1\t83390100\t83390400\t0.3693\t38\nchr1\t83392800\t83393100\t0.1258\t34\nchr1\t83417400\t83417700\t0.2211\t72\nchr1\t83424600\t83424900\t0.4267\t51\nchr1\t83440500\t83440800\t0.4107\t50\nchr1\t83881800\t83882100\t0.3067\t72\nchr1\t84052200\t84058500\t0\t92\nchr1\t84233400\t84234000\t0.0408\t126\nchr1\t85515300\t85515600\t0.2094\t62\nchr1\t85521900\t85522500\t0.0134\t63\nchr1\t85535400\t85535700\t0.0181\t57\nchr1\t85748700\t85754400\t0\t148\nchr1\t85825800\t85826700\t0.228\t77\nchr1\t85927500\t85932900\t0\t117\nchr1\t85940100\t85940400\t0.1448\t27\nchr1\t86215200\t86217300\t0.0235\t57\nchr1\t86242800\t86243400\t0.3194\t78\nchr1\t86275500\t86275800\t0.0005\t64\nchr1\t86679300\t86685000\t0\t111\nchr1\t88342800\t88347000\t0.0481\t82\nchr1\t89412600\t89412900\t0.0016\t89\nchr1\t89414400\t89415300\t0.0016\t89\nchr1\t89416800\t89417400\t0.0016\t89\nchr1\t89561400\t89561700\t0.0317\t76\nchr1\t89747100\t89752500\t0.0414\t89\nchr1\t89797200\t89797500\t0.1077\t53\nchr1\t90060300\t90060900\t0.3026\t93\nchr1\t90215100\t90215400\t0.3873\t69\nchr1\t91159200\t91159500\t0.4709\t13\nchr1\t91212000\t91216800\t0.0107\t104\nchr1\t91301400\t91302000\t0.0469\t23\nchr1\t91371300\t91371600\t0.0807\t37\nchr1\t91387200\t91387500\t0.035\t950\nchr1\t93276900\t93277500\t0.0049\t74\nchr1\t93791400\t93796200\t0.0157\t98\nchr1\t95292300\t95295600\t0.0647\t100\nchr1\t96052500\t96052800\t0.1288\t41\nchr1\t96173400\t96173700\t0.2831\t96\nchr1\t96242700\t96243000\t0.2236\t113\nchr1\t96245400\t96245700\t0.4833\t52\nchr1\t96606900\t96607200\t0.0775\t84\nchr1\t96853500\t96854100\t0.2118\t106\nchr1\t97319400\t97322100\t0.0018\t85\nchr1\t98591100\t98591400\t0.4295\t84\nchr1\t98983200\t98983500\t0.1537\t63\nchr1\t99213600\t99214200\t0.0136\t84\nchr1\t99388800\t99390900\t0.0085\t93\nchr1\t101628900\t101629200\t0.186\t58\nchr1\t101669100\t101669400\t0.3387\t61\nchr1\t102073500\t102073800\t0.2643\t95\nchr1\t102630600\t102630900\t0.2767\t41\nchr1\t102807300\t102807600\t0.1934\t55\nchr1\t103020300\t103020900\t0.1192\t58\nchr1\t103356000\t103356300\t0.065\t65\nchr1\t103594500\t103610700\t0\t80\nchr1\t103618800\t103623000\t0\t61\nchr1\t103624200\t103760400\t0\t85\nchr1\t103923900\t103924500\t0.1691\t103\nchr1\t104035500\t104036400\t0.0083\t116\nchr1\t104127000\t104127300\t0.0189\t25\nchr1\t104770500\t104775900\t0\t95\nchr1\t104844000\t104849100\t0\t87\nchr1\t104885700\t104886000\t0.0026\t12\nchr1\t105214500\t105216000\t0.0011\t57\nchr1\t105575400\t105575700\t0.0908\t94\nchr1\t105658800\t105660600\t0.0251\t131\nchr1\t106089900\t106090200\t0.2428\t184\nchr1\t106284600\t106284900\t0.3692\t65\nchr1\t108162900\t108163200\t0.292\t103\nchr1\t108224100\t108228300\t0\t96\nchr1\t108229500\t108247200\t0\t96\nchr1\t108248400\t108255600\t0\t96\nchr1\t108257100\t108310500\t0\t79\nchr1\t108375000\t108437400\t0\t140\nchr1\t108438600\t108447300\t0\t86\nchr1\t108448500\t108470400\t0\t86\nchr1\t108577200\t108579300\t0\t71\nchr1\t109055100\t109055400\t0.0225\t35\nchr1\t109674900\t109675200\t0.1752\t56\nchr1\t109680600\t109684200\t0\t66\nchr1\t109693500\t109693800\t0.043\t45\nchr1\t109698900\t109702200\t0\t56\nchr1\t109842600\t109843800\t0.1528\t96\nchr1\t110845800\t110846100\t0.0597\t64\nchr1\t111339300\t111339600\t0.2432\t86\nchr1\t111544800\t111545100\t0.1185\t104\nchr1\t111800100\t111800400\t0.0574\t56\nchr1\t112104900\t112105200\t0.2437\t15\nchr1\t112155300\t112155600\t0.0432\t72\nchr1\t112158300\t112159500\t0.0432\t72\nchr1\t112226100\t112227300\t0.1008\t100\nchr1\t112293300\t112294800\t0.007\t48\nchr1\t112773600\t112774500\t0.0854\t54\nchr1\t112898400\t112899300\t0.0505\t70\nchr1\t113068800\t113070900\t0.0582\t92\nchr1\t113344200\t113345700\t0.0688\t81\nchr1\t113360700\t113362800\t0.0147\t129\nchr1\t113497200\t113503200\t0\t132\nchr1\t113509500\t113509800\t0.0614\t69\nchr1\t115151700\t115153500\t0.0435\t140\nchr1\t115254300\t115254600\t0.2562\t27\nchr1\t115627200\t115627500\t0.1056\t100\nchr1\t116136900\t116137200\t0.0484\t83\nchr1\t116718000\t116719500\t0\t134\nchr1\t117430200\t117430800\t0.0103\t78\nchr1\t118551300\t118551600\t0.2847\t84\nchr1\t118575900\t118576200\t0.1012\t50\nchr1\t118852500\t118858200\t0\t122\nchr1\t119599200\t119599500\t0.2114\t46\nchr1\t119989800\t119994900\t0\t70\nchr1\t119998800\t119999100\t0.1029\t78\nchr1\t120004200\t120004500\t0.0593\t69\nchr1\t120005700\t120006000\t0.0593\t69\nchr1\t120007800\t120008700\t0\t61\nchr1\t120012000\t120013200\t0\t81\nchr1\t120014400\t120022800\t0\t81\nchr1\t120024300\t120033000\t0\t74\nchr1\t120034500\t120036900\t0\t74\nchr1\t120039900\t120040800\t0.0153\t81\nchr1\t120042000\t120042600\t0.0153\t81\nchr1\t120044100\t120047400\t0\t101\nchr1\t120048600\t120054000\t0\t101\nchr1\t120055200\t120060000\t0\t101\nchr1\t120061800\t120062700\t0\t101\nchr1\t120064200\t120064500\t0.1809\t74\nchr1\t120067800\t120068700\t0.0076\t66\nchr1\t120069900\t120070500\t0.0076\t66\nchr1\t120073200\t120073500\t0.1825\t46\nchr1\t120075300\t120081600\t0\t104\nchr1\t120084000\t120085200\t0\t104\nchr1\t120086400\t120087900\t0.03\t115\nchr1\t120096600\t120096900\t0.0659\t70\nchr1\t120099000\t120100500\t0.0801\t65\nchr1\t120103500\t120104100\t0.0156\t63\nchr1\t120106200\t120106800\t0.2459\t55\nchr1\t120111000\t120112200\t0.0942\t73\nchr1\t120118800\t120119400\t0.2222\t59\nchr1\t120126600\t120127500\t0\t70\nchr1\t120154500\t120156600\t0.2637\t68\nchr1\t120158400\t120159000\t0.0749\t57\nchr1\t120162000\t120162600\t0.1222\t74\nchr1\t120164100\t120164400\t0.184\t49\nchr1\t120169500\t120169800\t0.3386\t57\nchr1\t120172200\t120175500\t0\t88\nchr1\t120181800\t120182100\t0.0917\t71\nchr1\t120184200\t120185400\t0.0064\t71\nchr1\t120188700\t120189300\t0.0064\t71\nchr1\t120192900\t120196200\t0.0341\t81\nchr1\t120198300\t120198600\t0.1837\t45\nchr1\t120200100\t120218100\t0\t88\nchr1\t120220200\t120220800\t0\t96\nchr1\t120222000\t120321900\t0\t96\nchr1\t120323400\t120332100\t0\t65\nchr1\t120334800\t120340800\t0\t76\nchr1\t120342900\t120345300\t0\t76\nchr1\t120346800\t120347100\t0\t71\nchr1\t120348300\t120351000\t0\t71\nchr1\t120352200\t120363000\t0\t71\nchr1\t120364500\t120364800\t0\t71\nchr1\t120368700\t120369000\t0.1433\t54\nchr1\t120372300\t120373800\t0.126\t54\nchr1\t120376800\t120377700\t0.0155\t55\nchr1\t120382200\t120383400\t0.0832\t56\nchr1\t120384900\t120385200\t0.0217\t76\nchr1\t120387000\t120391200\t0.0217\t76\nchr1\t120392400\t120392700\t0.0217\t76\nchr1\t120394500\t120394800\t0.3432\t40\nchr1\t120396300\t120397500\t0.0043\t65\nchr1\t120398700\t120401400\t0.0545\t63\nchr1\t120403800\t120404100\t0.0051\t71\nchr1\t120405300\t120408900\t0.0051\t71\nchr1\t120410700\t120411300\t0\t77\nchr1\t120413400\t120414300\t0\t77\nchr1\t120416100\t120418500\t0.1528\t55\nchr1\t120419700\t120420000\t0.0741\t63\nchr1\t120424800\t120426000\t0.1013\t70\nchr1\t120427500\t120427800\t0.044\t53\nchr1\t120429600\t120430500\t0.2468\t69\nchr1\t120434700\t120435600\t0.1322\t55\nchr1\t120436800\t120449100\t0\t86\nchr1\t120451200\t120453600\t0.1191\t82\nchr1\t120455400\t120455700\t0.0589\t50\nchr1\t120457200\t120459300\t0\t98\nchr1\t120461400\t120465300\t0\t155\nchr1\t120466500\t120467700\t0\t155\nchr1\t120469800\t120470100\t0\t155\nchr1\t120471600\t120471900\t0\t155\nchr1\t120478800\t120479400\t0.1279\t56\nchr1\t120493800\t120494400\t0.1489\t70\nchr1\t120499200\t120500100\t0.0473\t63\nchr1\t120501900\t120503400\t0.0006\t86\nchr1\t120504600\t120506400\t0.0006\t86\nchr1\t120507600\t120508800\t0.0015\t76\nchr1\t120510300\t120510900\t0.0015\t76\nchr1\t120513000\t120515700\t0\t80\nchr1\t120516900\t120521100\t0\t80\nchr1\t120525000\t120525300\t0.2087\t27\nchr1\t120526800\t120529200\t0.0004\t75\nchr1\t120531000\t120534000\t0.0004\t75\nchr1\t120536100\t120537000\t0\t59\nchr1\t120538200\t120539100\t0\t59\nchr1\t120541500\t120541800\t0.1175\t62\nchr1\t120544800\t120545400\t0.0209\t55\nchr1\t120548100\t120548400\t0\t71\nchr1\t120550200\t120551100\t0\t71\nchr1\t120552900\t120554100\t0.0076\t53\nchr1\t120555600\t120555900\t0.1411\t21\nchr1\t120558000\t120558300\t0.0004\t58\nchr1\t120563400\t120565800\t0\t72\nchr1\t120567000\t120572100\t0\t72\nchr1\t120574500\t120580200\t0\t80\nchr1\t120582900\t120590700\t0\t80\nchr1\t120592500\t120670200\t0\t99\nchr1\t120672000\t120673500\t0.0344\t90\nchr1\t120674700\t120678900\t0.0344\t90\nchr1\t120680100\t120704400\t0\t81\nchr1\t120706800\t120709500\t0\t87\nchr1\t120710700\t120718800\t0\t87\nchr1\t120720000\t120723000\t0\t87\nchr1\t120724800\t120726000\t0\t89\nchr1\t120730800\t120732000\t0\t89\nchr1\t120733500\t120753900\t0\t89\nchr1\t120755100\t120755400\t0.0988\t50\nchr1\t120756900\t120758100\t0\t73\nchr1\t120760500\t120763200\t0.0732\t67\nchr1\t120764700\t120767700\t0\t75\nchr1\t120768900\t120769200\t0\t80\nchr1\t120771000\t120777300\t0\t80\nchr1\t120778500\t120778800\t0.0221\t70\nchr1\t120780300\t120781500\t0.0221\t70\nchr1\t120783000\t120783600\t0.0221\t70\nchr1\t120785400\t120792300\t0.0172\t73\nchr1\t120794700\t120801000\t0\t71\nchr1\t120802800\t120804000\t0.1965\t72\nchr1\t120808500\t120808800\t0.2187\t83\nchr1\t120812400\t120812700\t0\t283\nchr1\t120815700\t120817800\t0\t283\nchr1\t120819900\t120821700\t0\t283\nchr1\t120823800\t120842700\t0\t283\nchr1\t120848700\t120849000\t0.0282\t67\nchr1\t120853500\t120854100\t0.1357\t63\nchr1\t120856500\t120856800\t0.4699\t51\nchr1\t120861300\t120861600\t0.3388\t57\nchr1\t120863100\t120865500\t0.0718\t56\nchr1\t120868200\t120870000\t0.0233\t76\nchr1\t120871200\t120871500\t0.0196\t69\nchr1\t120872700\t120875100\t0.0196\t69\nchr1\t120876300\t120877500\t0.081\t52\nchr1\t120885900\t120887400\t0.0421\t50\nchr1\t120890400\t120891300\t0.0071\t45\nchr1\t120894300\t120895800\t0.035\t59\nchr1\t120900000\t120900300\t0.2933\t62\nchr1\t120911700\t120919800\t0\t92\nchr1\t120922800\t120924600\t0\t94\nchr1\t120925800\t120928500\t0\t94\nchr1\t120929700\t120930600\t0\t94\nchr1\t120936000\t120936300\t0.208\t87\nchr1\t120943800\t120944100\t0.2953\t68\nchr1\t120945900\t120946500\t0.0478\t60\nchr1\t120948900\t120949200\t0.0849\t60\nchr1\t120965700\t120966600\t0.0662\t49\nchr1\t120971400\t120971700\t0.1568\t37\nchr1\t120984300\t120984600\t0.016\t59\nchr1\t120986400\t120989100\t0.0187\t75\nchr1\t120990300\t120992700\t0.0187\t75\nchr1\t120995400\t121002600\t0.0039\t66\nchr1\t121004400\t121005000\t0.0034\t77\nchr1\t121011000\t121013400\t0.0123\t79\nchr1\t121014600\t121016400\t0.0043\t87\nchr1\t121019400\t121020600\t0.0495\t77\nchr1\t121023000\t121027800\t0\t67\nchr1\t121029300\t121032300\t0.0648\t78\nchr1\t121036800\t121037100\t0.0458\t65\nchr1\t121049100\t121049400\t0.1196\t78\nchr1\t121058700\t121059000\t0.1644\t51\nchr1\t121065300\t121065600\t0.2389\t52\nchr1\t121067400\t121070100\t0.0023\t80\nchr1\t121071300\t121074000\t0.0023\t80\nchr1\t121076100\t121078500\t0.0023\t80\nchr1\t121083600\t121084800\t0.0916\t59\nchr1\t121086600\t121086900\t0.0916\t59\nchr1\t121088100\t121088700\t0\t34\nchr1\t121092000\t121092600\t0.047\t62\nchr1\t121096500\t121096800\t0.2753\t69\nchr1\t121099200\t121100700\t0.0352\t57\nchr1\t121102500\t121104300\t0.0699\t57\nchr1\t121107600\t121107900\t0.0006\t83\nchr1\t121110600\t121110900\t0.0006\t83\nchr1\t121112700\t121113900\t0.0006\t83\nchr1\t121116000\t121116300\t0.0006\t83\nchr1\t121122600\t121122900\t0.2059\t66\nchr1\t121124700\t121125000\t0.2059\t66\nchr1\t121128300\t121129200\t0.0048\t68\nchr1\t121130400\t121131600\t0.0048\t68\nchr1\t121134300\t121134900\t0.0274\t61\nchr1\t121138200\t121138800\t0.0774\t51\nchr1\t121140000\t121146900\t0\t71\nchr1\t121148700\t121150500\t0\t71\nchr1\t121151700\t121153200\t0\t71\nchr1\t121154400\t121159200\t0\t71\nchr1\t121160400\t121160700\t0.3274\t56\nchr1\t121161900\t121162200\t0.0653\t49\nchr1\t121166700\t121174200\t0\t76\nchr1\t121175400\t121183500\t0\t68\nchr1\t121185300\t121191000\t0\t68\nchr1\t121192800\t121201500\t0\t73\nchr1\t121203600\t121206000\t0\t71\nchr1\t121209000\t121212000\t0.0181\t68\nchr1\t121214400\t121215900\t0\t57\nchr1\t121218000\t121221000\t0\t79\nchr1\t121223400\t121225500\t0\t71\nchr1\t121226700\t121227300\t0\t71\nchr1\t121229100\t121238100\t0\t75\nchr1\t121239300\t121243200\t0\t75\nchr1\t121244400\t121254600\t0\t75\nchr1\t121255800\t121259100\t0\t72\nchr1\t121260600\t121262700\t0\t72\nchr1\t121264200\t121265700\t0.0007\t79\nchr1\t121267500\t121278000\t0.0007\t79\nchr1\t121280700\t121282200\t0.0007\t79\nchr1\t121284300\t121285800\t0.0007\t79\nchr1\t121287000\t121287600\t0.0007\t79\nchr1\t121289400\t121293300\t0.012\t68\nchr1\t121296300\t121303200\t0.0057\t71\nchr1\t121305300\t121307700\t0.0057\t71\nchr1\t121308900\t121314300\t0\t107\nchr1\t121315800\t121322700\t0\t73\nchr1\t121325400\t121327800\t0\t70\nchr1\t121329300\t121335000\t0\t70\nchr1\t121336500\t121340100\t0\t73\nchr1\t121341600\t121343100\t0\t73\nchr1\t121344300\t121350000\t0\t73\nchr1\t121351800\t121365900\t0\t99\nchr1\t121368600\t121370100\t0.0023\t66\nchr1\t121371300\t121374300\t0.0008\t65\nchr1\t121376100\t121377900\t0.0251\t67\nchr1\t121379700\t121381200\t0\t72\nchr1\t121382700\t121390800\t0\t72\nchr1\t121392600\t121394100\t0\t85\nchr1\t121398000\t121398600\t0.3404\t131\nchr1\t121532400\t121538100\t0\t125\nchr1\t121604400\t121608300\t0\t37\nchr1\t121609500\t121615800\t0\t44\nchr1\t121619400\t121622700\t0\t83\nchr1\t121624200\t121624500\t0\t62\nchr1\t121625700\t121627200\t0\t62\nchr1\t121628700\t121631400\t0\t62\nchr1\t121633200\t121685700\t0\t426\nchr1\t121688400\t121689000\t0\t40\nchr1\t121692600\t121692900\t0.1119\t53\nchr1\t121694700\t121698900\t0\t55\nchr1\t121700100\t121700700\t0\t55\nchr1\t121701900\t121710000\t0\t62\nchr1\t121711200\t121718100\t0\t61\nchr1\t121719300\t121722000\t0\t26\nchr1\t121724400\t121727400\t0\t27\nchr1\t121731000\t121735800\t0\t72\nchr1\t121737000\t121737300\t0\t129\nchr1\t121738800\t121739400\t0\t129\nchr1\t121741500\t121756800\t0\t2648\nchr1\t121758000\t121758300\t0.0599\t16\nchr1\t121760400\t121788000\t0\t3380\nchr1\t121790100\t121791300\t0\t32\nchr1\t121793400\t121796400\t0\t131\nchr1\t121797600\t121798200\t0\t97\nchr1\t121799400\t121804800\t0\t97\nchr1\t121806000\t121806300\t0\t207\nchr1\t121808400\t121809900\t0\t207\nchr1\t121811100\t121843200\t0\t207\nchr1\t121845000\t121846800\t0\t162\nchr1\t121848300\t121863000\t0\t115\nchr1\t121865100\t121869300\t0\t74\nchr1\t121870500\t121879500\t0\t81\nchr1\t121881300\t121882200\t0\t32\nchr1\t121883700\t121884000\t0\t25\nchr1\t121888200\t121893000\t0\t79\nchr1\t121894500\t121898100\t0\t81\nchr1\t121899600\t121901100\t0\t25\nchr1\t121903500\t121909200\t0\t122\nchr1\t121911600\t121911900\t0\t15\nchr1\t121914300\t121924200\t0\t144\nchr1\t121925400\t121929900\t0\t102\nchr1\t121931700\t121932000\t0\t13\nchr1\t121938900\t121939500\t0.3254\t32\nchr1\t121940700\t121942800\t0\t66\nchr1\t121944600\t121946100\t0\t31\nchr1\t121948500\t121948800\t0\t17\nchr1\t121951800\t121952700\t0\t34\nchr1\t121953900\t121957800\t0\t40\nchr1\t121959300\t121965300\t0\t84\nchr1\t121966800\t121968900\t0\t42\nchr1\t121970100\t121973100\t0\t404\nchr1\t122032800\t122047200\t0\t106\nchr1\t122050500\t122050800\t0\t197\nchr1\t122053500\t122055000\t0\t197\nchr1\t122056200\t122056800\t0\t35\nchr1\t122058600\t122063700\t0\t60\nchr1\t122064900\t122070600\t0\t415\nchr1\t122073000\t122085600\t0\t116\nchr1\t122087400\t122089500\t0\t130\nchr1\t122090700\t122098500\t0\t130\nchr1\t122101500\t122102100\t0.1373\t20\nchr1\t122105100\t122109000\t0\t97\nchr1\t122111400\t122124300\t0\t104\nchr1\t122126100\t122130600\t0\t389\nchr1\t122131800\t122133300\t0\t21\nchr1\t122134500\t122141700\t0\t150\nchr1\t122143800\t122159700\t0\t118\nchr1\t122161800\t122169600\t0\t98\nchr1\t122172000\t122175000\t0\t412\nchr1\t122176200\t122176800\t0\t412\nchr1\t122178000\t122184300\t0\t412\nchr1\t122185800\t122186400\t0\t412\nchr1\t122187600\t122189100\t0\t22\nchr1\t122191200\t122195400\t0\t82\nchr1\t122196600\t122203200\t0\t111\nchr1\t122204400\t122204700\t0\t111\nchr1\t122207100\t122209500\t0\t111\nchr1\t122211000\t122214900\t0\t111\nchr1\t122216700\t122219100\t0\t37\nchr1\t122222100\t122222400\t0.3979\t41\nchr1\t122224200\t122225400\t0\t200\nchr1\t122226600\t122229000\t0\t200\nchr1\t122230500\t122236500\t0\t200\nchr1\t122238000\t122270400\t0\t838\nchr1\t122271600\t122368800\t0\t838\nchr1\t122370000\t122449800\t0\t838\nchr1\t122452200\t122490900\t0\t838\nchr1\t122492100\t122495700\t0\t3359\nchr1\t122497500\t122555100\t0\t3359\nchr1\t122556300\t122573400\t0\t3359\nchr1\t122575200\t122655000\t0\t2578\nchr1\t122656500\t122658900\t0\t2578\nchr1\t122660100\t122701800\t0\t1708\nchr1\t122703000\t122712600\t0.0072\t1373\nchr1\t122713800\t122739900\t0\t2814\nchr1\t122741100\t122752500\t0\t1369\nchr1\t122754300\t122872500\t0\t3523\nchr1\t122874000\t122874900\t0\t3523\nchr1\t122876700\t122920500\t0\t3575\nchr1\t122922900\t123012000\t0\t5163\nchr1\t123013500\t123066300\t0\t3618\nchr1\t123067800\t123099000\t0\t3618\nchr1\t123100500\t123150900\t0\t3618\nchr1\t123152100\t123178500\t0\t2320\nchr1\t123179700\t123227100\t0\t2048\nchr1\t123229500\t123237900\t0\t1045\nchr1\t123239100\t123276900\t0\t1264\nchr1\t123278100\t123314400\t0\t2092\nchr1\t123315600\t123373200\t0\t2092\nchr1\t123374700\t123507300\t0\t4862\nchr1\t123508800\t123531300\t0\t3361\nchr1\t123532500\t123533100\t0.1255\t217\nchr1\t123534300\t123537900\t0.0134\t818\nchr1\t123539100\t123541800\t0\t3931\nchr1\t123543000\t123622200\t0\t3931\nchr1\t123623400\t123644100\t0\t3931\nchr1\t123645300\t123652800\t0\t1009\nchr1\t123655200\t123675900\t0\t1546\nchr1\t123677100\t123720000\t0\t1546\nchr1\t123721500\t123726600\t0\t4856\nchr1\t123727800\t123756900\t0\t4856\nchr1\t123758400\t123801600\t0\t6466\nchr1\t123803400\t123920100\t0\t2786\nchr1\t123921300\t123933600\t0\t2786\nchr1\t123934800\t123963600\t0\t5034\nchr1\t123964800\t123966900\t0\t5034\nchr1\t123968100\t123976200\t0\t5034\nchr1\t123977400\t124045200\t0\t4893\nchr1\t124046400\t124085700\t0\t4893\nchr1\t124087200\t124095000\t0\t1039\nchr1\t124096200\t124100400\t0\t2235\nchr1\t124101600\t124111200\t0\t2235\nchr1\t124112400\t124119000\t0\t2235\nchr1\t124120200\t124138200\t0\t2235\nchr1\t124139400\t124142400\t0\t2235\nchr1\t124143600\t124173300\t0\t2474\nchr1\t124174800\t124194000\t0\t6138\nchr1\t124195200\t124231800\t0\t6138\nchr1\t124233000\t124278600\t0\t6138\nchr1\t124279800\t124294800\t0\t6138\nchr1\t124296000\t124468200\t0\t6138\nchr1\t124469400\t124514100\t0\t6138\nchr1\t124515300\t124543800\t0\t5650\nchr1\t124545000\t124614300\t0\t4870\nchr1\t124615500\t124779300\t0\t8877\nchr1\t124780800\t124788900\t0\t2430\nchr1\t124793400\t124801500\t0\t170\nchr1\t124803600\t124805700\t0\t788\nchr1\t124807500\t124820100\t0\t305\nchr1\t124821600\t124826700\t0\t672\nchr1\t124827900\t124834800\t0\t672\nchr1\t124836000\t124848900\t0\t672\nchr1\t124850100\t124852500\t0\t672\nchr1\t124853700\t124857600\t0\t672\nchr1\t124858800\t124898400\t0\t446\nchr1\t124899900\t124914600\t0\t407\nchr1\t124915800\t124921200\t0\t411\nchr1\t124922700\t124928700\t0\t411\nchr1\t124931100\t124931700\t0.0951\t101\nchr1\t124932900\t124939800\t0\t212\nchr1\t125102700\t125103300\t0.0666\t53\nchr1\t125114400\t125114700\t0.2726\t132\nchr1\t125139000\t125139300\t0.2741\t64\nchr1\t125166900\t125167200\t0.3706\t2420\nchr1\t125171100\t125171400\t0.0748\t228\nchr1\t125175300\t125183700\t0.0222\t36986\nchr1\t143184600\t143188500\t0.0145\t16765\nchr1\t143189700\t143197200\t0.0145\t16765\nchr1\t143199600\t143208600\t0\t30628\nchr1\t143210700\t143224200\t0\t36167\nchr1\t143225700\t143268900\t0\t36167\nchr1\t143271600\t143271900\t0.4763\t284\nchr1\t143273700\t143274900\t0\t288\nchr1\t143280000\t143280300\t0.2277\t76\nchr1\t143282700\t143283000\t0.3364\t93\nchr1\t143284200\t143284500\t0.2646\t94\nchr1\t143286600\t143286900\t0.0687\t44\nchr1\t143288700\t143296800\t0\t106\nchr1\t143298900\t143305800\t0\t117\nchr1\t143307000\t143308800\t0\t117\nchr1\t143312700\t143404200\t0\t113\nchr1\t143405400\t143411100\t0\t77\nchr1\t143412300\t143419200\t0\t77\nchr1\t143420400\t143450400\t0\t116\nchr1\t143452200\t143452800\t0\t109\nchr1\t143454000\t143472300\t0\t109\nchr1\t143473500\t143482500\t0\t135\nchr1\t143483700\t143496600\t0\t135\nchr1\t143499300\t143502000\t0.0072\t118\nchr1\t143506200\t143523300\t0\t124\nchr1\t143524500\t143526900\t0\t124\nchr1\t143528700\t143529900\t0.323\t87\nchr1\t143535000\t143535300\t0.1113\t46\nchr1\t143558400\t143559300\t0.1717\t97\nchr1\t143560800\t143562600\t0.1717\t97\nchr1\t143637600\t143639400\t0.1444\t78\nchr1\t143703900\t143704200\t0.1677\t66\nchr1\t143728500\t143730300\t0.0254\t67\nchr1\t143737800\t143739300\t0.2757\t64\nchr1\t143740500\t143741700\t0.0001\t79\nchr1\t143744400\t143744700\t0.3958\t55\nchr1\t143752500\t143752800\t0.2685\t81\nchr1\t143766900\t143767800\t0.0097\t70\nchr1\t143770200\t143770800\t0\t68\nchr1\t143772600\t143774400\t0\t68\nchr1\t143776200\t143776800\t0.0046\t86\nchr1\t143778600\t143778900\t0\t92\nchr1\t143780100\t143803800\t0\t92\nchr1\t143805300\t143813700\t0\t88\nchr1\t143815200\t143817300\t0\t88\nchr1\t143818800\t143820300\t0.001\t85\nchr1\t143821800\t143822400\t0.001\t85\nchr1\t143823600\t143824200\t0.001\t85\nchr1\t143826000\t143830200\t0.001\t85\nchr1\t143833800\t143835000\t0.0073\t57\nchr1\t143842200\t143842500\t0.1864\t55\nchr1\t143846700\t143847900\t0\t60\nchr1\t143855100\t143856300\t0.0317\t71\nchr1\t143858700\t143860500\t0.0014\t67\nchr1\t143863500\t143863800\t0.2124\t57\nchr1\t143865000\t143866200\t0.0432\t71\nchr1\t143868000\t143868300\t0.1066\t73\nchr1\t143869500\t143869800\t0.1018\t68\nchr1\t143871000\t143872800\t0.1018\t68\nchr1\t143875200\t143876100\t0\t73\nchr1\t143879400\t143880000\t0.1272\t74\nchr1\t143886900\t143888100\t0.0303\t59\nchr1\t143891100\t143892900\t0.0015\t65\nchr1\t143895000\t143895600\t0.0335\t70\nchr1\t143900700\t143901300\t0.0217\t72\nchr1\t143903400\t143903700\t0.004\t72\nchr1\t143910000\t143910300\t0.2223\t80\nchr1\t143915700\t143916300\t0.0135\t80\nchr1\t143921700\t143922600\t0.0016\t70\nchr1\t143925300\t143925600\t0.2986\t67\nchr1\t143929800\t143930100\t0.0044\t72\nchr1\t143931900\t143932500\t0.0044\t72\nchr1\t143934000\t143934900\t0.0044\t72\nchr1\t143938800\t143973900\t0\t83\nchr1\t143975100\t143977200\t0\t83\nchr1\t143979600\t143986200\t0\t83\nchr1\t143988000\t144052200\t0\t98\nchr1\t144053400\t144076500\t0\t98\nchr1\t144078300\t144101100\t0\t100\nchr1\t144102600\t144103200\t0.1806\t316\nchr1\t144105000\t144394200\t0\t423\nchr1\t144395400\t144395700\t0\t423\nchr1\t144397200\t144401700\t0\t423\nchr1\t144406500\t144406800\t0.0787\t63\nchr1\t144408600\t144411600\t0.025\t76\nchr1\t144414600\t144414900\t0.2094\t47\nchr1\t144417000\t144418500\t0\t57\nchr1\t144422100\t144422700\t0.0699\t77\nchr1\t144424800\t144426300\t0.1352\t114\nchr1\t144429600\t144429900\t0.0884\t69\nchr1\t144431700\t144432000\t0.0884\t69\nchr1\t144433500\t144433800\t0.103\t91\nchr1\t144446700\t144447000\t0.1678\t66\nchr1\t144448800\t144450300\t0.0401\t67\nchr1\t144453000\t144454500\t0.2519\t65\nchr1\t144458400\t144458700\t0.3437\t49\nchr1\t144460200\t144460500\t0.1037\t62\nchr1\t144465600\t144465900\t0.2637\t71\nchr1\t144469200\t144469800\t0.0778\t74\nchr1\t144473100\t144475200\t0\t84\nchr1\t144477600\t144480000\t0.0061\t64\nchr1\t144481200\t144481500\t0.0564\t71\nchr1\t144482700\t144483000\t0.0564\t71\nchr1\t144484800\t144488400\t0.0535\t98\nchr1\t144490200\t144490500\t0.0535\t98\nchr1\t144498000\t144498300\t0.3314\t32\nchr1\t144500400\t144502200\t0.0077\t73\nchr1\t144505200\t144506100\t0.1452\t63\nchr1\t144509100\t144509700\t0.1452\t63\nchr1\t144514200\t144514500\t0.1719\t57\nchr1\t144519300\t144519600\t0.1686\t62\nchr1\t144520800\t144521100\t0.01\t70\nchr1\t144523200\t144525300\t0.01\t70\nchr1\t144526800\t144527100\t0.1581\t73\nchr1\t144528300\t144528600\t0.3627\t38\nchr1\t144535500\t144535800\t0.1094\t56\nchr1\t144537000\t144538500\t0.0797\t59\nchr1\t144540900\t144541200\t0.2766\t54\nchr1\t144549300\t144549600\t0.1754\t36\nchr1\t144558000\t144558300\t0.0426\t67\nchr1\t144559800\t144561900\t0.0426\t67\nchr1\t144568200\t144570000\t0.001\t61\nchr1\t144573000\t144825900\t0\t174\nchr1\t144827100\t144882600\t0\t174\nchr1\t144884100\t144904800\t0\t88\nchr1\t144906600\t144907200\t0.0008\t75\nchr1\t144909900\t144911400\t0.0008\t75\nchr1\t144912600\t144919800\t0\t88\nchr1\t144921900\t144922500\t0.1547\t61\nchr1\t144923700\t144924000\t0.0308\t75\nchr1\t144925800\t144926400\t0\t94\nchr1\t144927600\t144928200\t0\t94\nchr1\t144930000\t144930600\t0\t94\nchr1\t144931800\t144935700\t0\t94\nchr1\t144936900\t144941400\t0\t94\nchr1\t144942900\t144943200\t0\t94\nchr1\t144945600\t144951600\t0\t73\nchr1\t144954000\t144954300\t0\t73\nchr1\t144955500\t144955800\t0\t78\nchr1\t144957300\t144963600\t0\t78\nchr1\t144966900\t144970500\t0.002\t115\nchr1\t144972300\t144973800\t0.0404\t68\nchr1\t144976800\t144983700\t0.0114\t77\nchr1\t144984900\t144990600\t0\t93\nchr1\t144992400\t144992700\t0.0146\t86\nchr1\t144994200\t144998400\t0.0146\t86\nchr1\t145000200\t145002300\t0.0318\t86\nchr1\t145004100\t145005300\t0.0318\t86\nchr1\t145007700\t145011300\t0.0171\t73\nchr1\t145012500\t145012800\t0.0171\t73\nchr1\t145014600\t145016700\t0\t78\nchr1\t145018200\t145019700\t0\t78\nchr1\t145021200\t145021500\t0\t78\nchr1\t145023900\t145041300\t0\t95\nchr1\t145042500\t145044300\t0\t95\nchr1\t145045500\t145063500\t0\t95\nchr1\t145065600\t145066200\t0\t100\nchr1\t145067400\t145075800\t0\t100\nchr1\t145077000\t145079700\t0\t100\nchr1\t145081800\t145106400\t0\t87\nchr1\t145107600\t145128900\t0\t87\nchr1\t145130700\t145135500\t0\t79\nchr1\t145136700\t145139100\t0\t79\nchr1\t145140900\t145146300\t0\t78\nchr1\t145147500\t145152600\t0\t78\nchr1\t145153800\t145155900\t0\t68\nchr1\t145157400\t145167900\t0\t79\nchr1\t145170000\t145171500\t0.0158\t57\nchr1\t145173300\t145185600\t0\t75\nchr1\t145187400\t145188000\t0.0087\t85\nchr1\t145191900\t145193100\t0.2149\t67\nchr1\t145195800\t145196400\t0\t83\nchr1\t145198800\t145203600\t0\t83\nchr1\t145205700\t145206300\t0\t107\nchr1\t145207500\t145208700\t0\t107\nchr1\t145211100\t145212300\t0\t107\nchr1\t145213500\t145214400\t0\t107\nchr1\t145216500\t145217100\t0\t107\nchr1\t145220400\t145221000\t0.0044\t63\nchr1\t145227000\t145227300\t0.0838\t60\nchr1\t145229400\t145229700\t0.1777\t41\nchr1\t145230900\t145232100\t0.2309\t78\nchr1\t145233600\t145233900\t0.0146\t77\nchr1\t145236000\t145236600\t0.0146\t77\nchr1\t145239600\t145240500\t0\t64\nchr1\t145241700\t145248600\t0\t74\nchr1\t145250100\t145254300\t0\t74\nchr1\t145257600\t145258500\t0.0084\t86\nchr1\t145262100\t145262400\t0\t81\nchr1\t145264800\t145268400\t0\t81\nchr1\t145269900\t145271100\t0\t81\nchr1\t145274700\t145277700\t0\t81\nchr1\t145279200\t145280100\t0\t81\nchr1\t145283100\t145283400\t0.0278\t62\nchr1\t145284900\t145286100\t0.0671\t61\nchr1\t145288800\t145289100\t0.4049\t53\nchr1\t145292700\t145393200\t0\t325\nchr1\t145395900\t145397100\t0.1353\t80\nchr1\t145398900\t145399200\t0.2142\t53\nchr1\t145401300\t145402200\t0.0593\t71\nchr1\t145405500\t145407000\t0.1795\t70\nchr1\t145411800\t145414800\t0\t81\nchr1\t145416300\t145419000\t0\t81\nchr1\t145420500\t145421100\t0\t81\nchr1\t145422900\t145423200\t0.2735\t49\nchr1\t145433100\t145433700\t0.163\t69\nchr1\t145440000\t145440300\t0.1154\t65\nchr1\t145441800\t145442100\t0.1154\t65\nchr1\t145443300\t145443900\t0.0222\t69\nchr1\t145447500\t145447800\t0.1832\t67\nchr1\t145449000\t145449300\t0.0808\t66\nchr1\t145451100\t145452600\t0.1246\t72\nchr1\t145456500\t145460100\t0\t73\nchr1\t145462500\t145462800\t0.147\t71\nchr1\t145465800\t145468200\t0.147\t71\nchr1\t145472400\t145472700\t0.2172\t58\nchr1\t145477500\t145479600\t0.0663\t73\nchr1\t145480800\t145481100\t0.0663\t73\nchr1\t145483500\t145484100\t0.2127\t61\nchr1\t145488300\t145488900\t0\t81\nchr1\t145491000\t145494000\t0\t81\nchr1\t145495200\t145495500\t0\t81\nchr1\t145497300\t145511700\t0\t81\nchr1\t145514100\t145515600\t0\t65\nchr1\t145521600\t145522500\t0\t63\nchr1\t145527300\t145527600\t0.0329\t71\nchr1\t145533900\t145534200\t0.4552\t64\nchr1\t145540500\t145541100\t0.0182\t52\nchr1\t145548300\t145548600\t0.1677\t42\nchr1\t145550400\t145551300\t0\t60\nchr1\t145573200\t145573500\t0.0852\t83\nchr1\t145578000\t145578300\t0.2567\t95\nchr1\t145581600\t145582200\t0.033\t79\nchr1\t145584600\t145584900\t0.1095\t65\nchr1\t145589700\t145590000\t0.1279\t90\nchr1\t145618500\t145618800\t0.0216\t56\nchr1\t145622400\t145622700\t0.04\t63\nchr1\t145624200\t145624500\t0.238\t60\nchr1\t145630500\t145632000\t0.0039\t55\nchr1\t145633200\t145633800\t0.0039\t55\nchr1\t145640400\t145640700\t0.2362\t49\nchr1\t145643700\t145644300\t0.0306\t53\nchr1\t145652400\t145653900\t0.107\t69\nchr1\t145659600\t145659900\t0.1219\t43\nchr1\t145669200\t145670100\t0.2005\t53\nchr1\t145673400\t145673700\t0.262\t71\nchr1\t145675200\t145675500\t0.2589\t70\nchr1\t145677900\t145678500\t0.0067\t55\nchr1\t145680900\t145682400\t0.0805\t69\nchr1\t145809600\t145811700\t0.0086\t53\nchr1\t145813800\t145814100\t0.1918\t39\nchr1\t145815900\t145818600\t0.0075\t72\nchr1\t145821000\t145823100\t0.128\t71\nchr1\t145924800\t145925400\t0.1376\t56\nchr1\t146059500\t146062500\t0\t219\nchr1\t146063700\t146125500\t0\t219\nchr1\t146126700\t146135700\t0\t90\nchr1\t146136900\t146141100\t0\t90\nchr1\t146143500\t146157900\t0\t97\nchr1\t146159700\t146161500\t0\t97\nchr1\t146162700\t146170500\t0\t97\nchr1\t146173200\t146174100\t0\t97\nchr1\t146175600\t146184900\t0\t97\nchr1\t146188500\t146228100\t0\t125\nchr1\t146229300\t146317800\t0\t125\nchr1\t146319000\t146319600\t0\t125\nchr1\t146321100\t146322300\t0\t125\nchr1\t146323800\t146324100\t0.2997\t60\nchr1\t146327100\t146327400\t0.0992\t55\nchr1\t146329800\t146330700\t0\t72\nchr1\t146331900\t146335200\t0\t72\nchr1\t146337000\t146341200\t0\t94\nchr1\t146342400\t146349000\t0\t94\nchr1\t146350200\t146358300\t0\t94\nchr1\t146359500\t146362200\t0.0242\t90\nchr1\t146364300\t146365200\t0.0242\t90\nchr1\t146367300\t146367600\t0.0331\t78\nchr1\t146369100\t146369700\t0.0331\t78\nchr1\t146379300\t146380200\t0.3143\t47\nchr1\t146392200\t146393100\t0.1956\t67\nchr1\t146396700\t146397000\t0.2819\t60\nchr1\t146398200\t146398500\t0.176\t57\nchr1\t146403000\t146405700\t0.0445\t83\nchr1\t146407200\t146407800\t0.1047\t69\nchr1\t146414400\t146414700\t0.0188\t67\nchr1\t146417100\t146417400\t0.0446\t87\nchr1\t146419500\t146422200\t0.0446\t87\nchr1\t146423400\t146424600\t0.0446\t87\nchr1\t146426700\t146427000\t0.2755\t76\nchr1\t146428800\t146430600\t0.1077\t70\nchr1\t146433600\t146434200\t0\t83\nchr1\t146435400\t146436300\t0\t83\nchr1\t146438100\t146446200\t0\t83\nchr1\t146448900\t146449200\t0.1518\t88\nchr1\t146451300\t146456700\t0\t99\nchr1\t146459100\t146461200\t0.0015\t81\nchr1\t146463900\t146465700\t0.0348\t67\nchr1\t146467200\t146467500\t0.1797\t61\nchr1\t146476500\t146476800\t0.329\t81\nchr1\t146479800\t146480700\t0.111\t77\nchr1\t146481900\t146482200\t0.162\t63\nchr1\t146485500\t146485800\t0.0831\t54\nchr1\t146487600\t146489700\t0\t75\nchr1\t146491500\t146497800\t0\t72\nchr1\t146502900\t146504100\t0.0958\t62\nchr1\t146506500\t146528100\t0\t79\nchr1\t146529600\t146533200\t0\t77\nchr1\t146535300\t146538900\t0\t67\nchr1\t146543400\t146543700\t0.044\t65\nchr1\t146545200\t146546100\t0.0104\t69\nchr1\t146547300\t146547600\t0.4887\t45\nchr1\t146548800\t146552400\t0.0006\t71\nchr1\t146553900\t146554500\t0.016\t65\nchr1\t146562000\t146564700\t0\t53\nchr1\t146567100\t146568600\t0.1105\t68\nchr1\t146570400\t146571000\t0.0033\t58\nchr1\t146578500\t146580300\t0.0192\t72\nchr1\t146581500\t146581800\t0.0192\t72\nchr1\t146583300\t146583600\t0.2062\t52\nchr1\t146585700\t146586000\t0.0848\t73\nchr1\t146587500\t146591700\t0.0848\t73\nchr1\t146593500\t146593800\t0.0848\t73\nchr1\t146598900\t146601000\t0.0795\t74\nchr1\t146604900\t146607600\t0.0207\t69\nchr1\t146609400\t146610000\t0.0055\t74\nchr1\t146611200\t146611800\t0.1235\t63\nchr1\t146615100\t146616000\t0.152\t58\nchr1\t146619000\t146621100\t0\t74\nchr1\t146623200\t146627100\t0.0312\t76\nchr1\t146632800\t146634300\t0.0184\t58\nchr1\t146637900\t146638200\t0.1853\t37\nchr1\t146640000\t146640300\t0.3134\t71\nchr1\t146652600\t146654100\t0.029\t86\nchr1\t146655300\t146655600\t0.2724\t56\nchr1\t146659800\t146660100\t0.29\t52\nchr1\t146664600\t146665200\t0.0097\t69\nchr1\t146674200\t146676000\t0.1243\t63\nchr1\t146677800\t146678400\t0.1994\t68\nchr1\t146681400\t146681700\t0.0547\t67\nchr1\t146685600\t146687700\t0.0119\t64\nchr1\t146692200\t146693700\t0.0772\t56\nchr1\t146697300\t146697600\t0.1814\t52\nchr1\t146702100\t146702700\t0.2571\t75\nchr1\t146705100\t146705400\t0.3602\t71\nchr1\t146709900\t146710200\t0.0394\t55\nchr1\t146713800\t146714100\t0.2075\t72\nchr1\t146717400\t146722800\t0\t97\nchr1\t146728800\t146731500\t0\t73\nchr1\t146733900\t146734200\t0.1305\t62\nchr1\t146739900\t146740200\t0.2083\t65\nchr1\t146741400\t146745300\t0.0276\t68\nchr1\t146747100\t146747700\t0.0523\t56\nchr1\t146748900\t146749500\t0.1701\t67\nchr1\t146753700\t146754000\t0.0431\t61\nchr1\t146759400\t146759700\t0.029\t58\nchr1\t146763000\t146763600\t0.0019\t65\nchr1\t146765100\t146765700\t0.0019\t65\nchr1\t146768400\t146768700\t0.3398\t82\nchr1\t146771100\t146771400\t0.1652\t61\nchr1\t146774100\t146774400\t0.2627\t64\nchr1\t146779200\t146780400\t0.0045\t83\nchr1\t146785500\t146786700\t0.1849\t67\nchr1\t146787900\t146789400\t0.006\t71\nchr1\t146790600\t146791200\t0.006\t71\nchr1\t146794800\t146797800\t0.0102\t56\nchr1\t146799600\t146799900\t0.0291\t66\nchr1\t146801400\t146801700\t0.0291\t66\nchr1\t146802900\t146804700\t0.0291\t66\nchr1\t146807700\t146808000\t0.1566\t58\nchr1\t146811300\t146811900\t0.06\t76\nchr1\t146823600\t146823900\t0.1536\t65\nchr1\t146826000\t146826600\t0.0111\t51\nchr1\t146830200\t146831400\t0.2296\t79\nchr1\t146835300\t146835900\t0.1777\t66\nchr1\t146838900\t146839200\t0.0609\t46\nchr1\t146841000\t146842500\t0.0061\t64\nchr1\t146845800\t146846700\t0.0968\t59\nchr1\t146850900\t146851200\t0.1772\t38\nchr1\t146852700\t146855100\t0.0375\t73\nchr1\t146856600\t146857200\t0.1592\t57\nchr1\t146859000\t146860200\t0.0726\t59\nchr1\t146862900\t146863200\t0.0559\t63\nchr1\t146866800\t146872200\t0\t121\nchr1\t146876400\t146876700\t0.0883\t68\nchr1\t146883600\t146889600\t0.0087\t71\nchr1\t146892000\t146892600\t0.0233\t60\nchr1\t146897400\t146897700\t0.1679\t63\nchr1\t146900400\t146903100\t0.154\t72\nchr1\t146904900\t146905500\t0.1882\t70\nchr1\t146908200\t146909100\t0\t74\nchr1\t146913900\t146914800\t0.0586\t57\nchr1\t146916000\t146920800\t0\t69\nchr1\t146922000\t146923800\t0\t69\nchr1\t146925300\t146925600\t0.1616\t62\nchr1\t146929800\t146930400\t0.0414\t72\nchr1\t146931600\t146934000\t0.0414\t72\nchr1\t146937300\t146937600\t0.2018\t75\nchr1\t146949300\t146949600\t0.1166\t41\nchr1\t146953200\t146953500\t0.3139\t88\nchr1\t146955000\t146955600\t0.0453\t74\nchr1\t146957100\t146957400\t0\t71\nchr1\t146958600\t146960400\t0\t71\nchr1\t146974500\t146974800\t0.2173\t70\nchr1\t146978700\t146981100\t0\t72\nchr1\t146983200\t146985300\t0\t408\nchr1\t146986800\t146995500\t0\t408\nchr1\t146998500\t146998800\t0\t408\nchr1\t147015300\t147015900\t0.0178\t58\nchr1\t147018000\t147018300\t0.3214\t68\nchr1\t147019800\t147020100\t0.3214\t68\nchr1\t147067800\t147068100\t0.2507\t63\nchr1\t147424200\t147424500\t0.3254\t62\nchr1\t147425700\t147426300\t0.283\t72\nchr1\t147939000\t147939300\t0.1908\t67\nchr1\t147942600\t147943200\t0.146\t53\nchr1\t147944400\t147945300\t0.1402\t73\nchr1\t147952800\t147954600\t0.0072\t67\nchr1\t147955800\t147956400\t0.0111\t56\nchr1\t147966300\t147966900\t0.0044\t61\nchr1\t147974100\t147976500\t0.2984\t61\nchr1\t147980100\t147980400\t0.4671\t42\nchr1\t147982500\t147982800\t0.2361\t61\nchr1\t147987300\t147987600\t0.3112\t64\nchr1\t147992100\t147993000\t0.2254\t72\nchr1\t147996300\t147996600\t0.2254\t72\nchr1\t147998100\t147998400\t0.1486\t78\nchr1\t148000800\t148001400\t0.0119\t59\nchr1\t148003800\t148005300\t0.0765\t60\nchr1\t148016100\t148016400\t0.0537\t67\nchr1\t148020000\t148020300\t0.3655\t63\nchr1\t148024500\t148024800\t0.2558\t71\nchr1\t148026000\t148027500\t0.0217\t60\nchr1\t148029600\t148031400\t0\t76\nchr1\t148032900\t148033200\t0\t76\nchr1\t148035600\t148035900\t0.2216\t65\nchr1\t148040100\t148041300\t0.2216\t65\nchr1\t148045500\t148045800\t0.1584\t51\nchr1\t148050600\t148052700\t0.0623\t75\nchr1\t148053900\t148054200\t0.0623\t75\nchr1\t148056600\t148057200\t0.1885\t51\nchr1\t148059600\t148059900\t0.0579\t74\nchr1\t148061400\t148062000\t0.0579\t74\nchr1\t148063500\t148065900\t0.0579\t74\nchr1\t148068300\t148068600\t0.418\t65\nchr1\t148070400\t148084800\t0\t86\nchr1\t148087500\t148088700\t0.0148\t60\nchr1\t148093200\t148093800\t0.0414\t79\nchr1\t148095300\t148095600\t0.0414\t79\nchr1\t148097700\t148098300\t0.1184\t49\nchr1\t148102800\t148107300\t0.022\t267\nchr1\t148109700\t148110000\t0.1315\t92\nchr1\t148113300\t148114800\t0.0149\t84\nchr1\t148117200\t148117800\t0.1533\t87\nchr1\t148119000\t148119300\t0.1533\t87\nchr1\t148126800\t148128600\t0.0047\t64\nchr1\t148129800\t148130100\t0.0047\t64\nchr1\t148131600\t148132200\t0.0182\t64\nchr1\t148135500\t148135800\t0.2361\t69\nchr1\t148137600\t148137900\t0.1425\t55\nchr1\t148139400\t148139700\t0.156\t46\nchr1\t148153200\t148153500\t0.2353\t66\nchr1\t148156800\t148158000\t0.1456\t67\nchr1\t148167900\t148170000\t0.1117\t67\nchr1\t148173900\t148174800\t0.1535\t71\nchr1\t148176000\t148185900\t0\t75\nchr1\t148187700\t148188900\t0\t68\nchr1\t148194000\t148198200\t0\t74\nchr1\t148200300\t148202700\t0\t78\nchr1\t148205100\t148226700\t0\t78\nchr1\t148230300\t148230600\t0.3756\t60\nchr1\t148235700\t148236000\t0\t96\nchr1\t148238700\t148241100\t0\t96\nchr1\t148243800\t148244100\t0.006\t72\nchr1\t148245300\t148245900\t0.006\t72\nchr1\t148247400\t148248000\t0.2178\t52\nchr1\t148251300\t148253400\t0.033\t67\nchr1\t148256700\t148257000\t0.0851\t71\nchr1\t148281000\t148282800\t0.0041\t73\nchr1\t148284600\t148285800\t0.0286\t71\nchr1\t148298400\t148303200\t0.0017\t80\nchr1\t148396200\t148396500\t0.3929\t64\nchr1\t148419300\t148419600\t0.0753\t51\nchr1\t148442400\t148447500\t0\t83\nchr1\t148448700\t148449000\t0\t83\nchr1\t148450500\t148451700\t0\t83\nchr1\t148454400\t148456500\t0.0538\t71\nchr1\t148460100\t148461900\t0\t92\nchr1\t148463100\t148463400\t0\t92\nchr1\t148464600\t148464900\t0.1744\t62\nchr1\t148470300\t148471800\t0.0692\t68\nchr1\t148473300\t148473900\t0.0089\t78\nchr1\t148475700\t148476600\t0.0386\t79\nchr1\t148479000\t148480500\t0.0386\t79\nchr1\t148482000\t148482600\t0.0386\t79\nchr1\t148484400\t148484700\t0\t69\nchr1\t148486500\t148488300\t0\t69\nchr1\t148490100\t148494000\t0\t69\nchr1\t148495200\t148499400\t0.0107\t80\nchr1\t148506300\t148508700\t0.0632\t72\nchr1\t148511100\t148512600\t0.091\t66\nchr1\t148516200\t148517400\t0.0211\t64\nchr1\t148518900\t148521300\t0.0341\t78\nchr1\t148527300\t148528500\t0.3054\t72\nchr1\t148531500\t148534200\t0.0027\t117\nchr1\t148535400\t148559100\t0\t215\nchr1\t148560300\t148584900\t0\t215\nchr1\t148586100\t148586400\t0\t215\nchr1\t148587900\t148590900\t0\t215\nchr1\t148594500\t148607400\t0\t97\nchr1\t148609200\t148636500\t0\t85\nchr1\t148639200\t148660200\t0\t81\nchr1\t148661700\t148820400\t0\t110\nchr1\t148821900\t148910100\t0\t110\nchr1\t148911300\t148914900\t0\t93\nchr1\t148916100\t148916700\t0\t93\nchr1\t148917900\t148922400\t0\t93\nchr1\t148924500\t148924800\t0\t69\nchr1\t148926000\t148929000\t0\t69\nchr1\t148930800\t148932300\t0.0017\t81\nchr1\t148935300\t148936500\t0\t57\nchr1\t148938900\t148939200\t0.0033\t69\nchr1\t148941000\t148944600\t0.0033\t69\nchr1\t148947300\t148947600\t0.0033\t69\nchr1\t148956600\t148957500\t0\t58\nchr1\t148960500\t148960800\t0.044\t81\nchr1\t148962600\t148962900\t0.1428\t75\nchr1\t148965600\t148966200\t0.1428\t75\nchr1\t148968300\t148969500\t0.2348\t69\nchr1\t148971900\t148974900\t0\t60\nchr1\t148977000\t148977600\t0.0278\t50\nchr1\t148988400\t148989000\t0.0032\t68\nchr1\t148990800\t148991100\t0.0577\t59\nchr1\t148992900\t148994100\t0.0331\t77\nchr1\t148997100\t148997400\t0.2895\t58\nchr1\t148998900\t148999200\t0.1754\t64\nchr1\t149001300\t149004900\t0.012\t77\nchr1\t149006700\t149009400\t0\t76\nchr1\t149011200\t149012100\t0\t72\nchr1\t149013300\t149014800\t0.0204\t69\nchr1\t149018700\t149020500\t0.0099\t78\nchr1\t149023500\t149023800\t0.0352\t75\nchr1\t149027400\t149028000\t0.0352\t75\nchr1\t149042400\t149043000\t0.1815\t72\nchr1\t149050500\t149054700\t0\t143\nchr1\t149056200\t149059200\t0\t143\nchr1\t149060400\t149064000\t0.1676\t178\nchr1\t149069400\t149069700\t0.1947\t74\nchr1\t149078400\t149078700\t0.1301\t94\nchr1\t149083200\t149083500\t0.1371\t85\nchr1\t149090700\t149091900\t0.0002\t87\nchr1\t149093700\t149094600\t0.0002\t87\nchr1\t149096100\t149097000\t0.0002\t87\nchr1\t149098800\t149100600\t0.2209\t65\nchr1\t149102100\t149102400\t0.1447\t72\nchr1\t149107200\t149110200\t0\t90\nchr1\t149112300\t149113200\t0\t90\nchr1\t149116800\t149119800\t0\t90\nchr1\t149121300\t149121900\t0\t90\nchr1\t149123400\t149124600\t0\t90\nchr1\t149128200\t149130000\t0.0593\t75\nchr1\t149131200\t149134800\t0\t74\nchr1\t149140800\t149141100\t0.1027\t61\nchr1\t149142600\t149143500\t0.0121\t78\nchr1\t149145300\t149147400\t0.0539\t88\nchr1\t149148900\t149150700\t0.0236\t78\nchr1\t149151900\t149152200\t0.3807\t42\nchr1\t149153400\t149154000\t0.3741\t44\nchr1\t149155500\t149157300\t0.0145\t79\nchr1\t149161500\t149162100\t0.0135\t91\nchr1\t149163900\t149167500\t0.0135\t91\nchr1\t149168700\t149171400\t0.0135\t91\nchr1\t149174100\t149174700\t0.0296\t84\nchr1\t149177100\t149178300\t0.022\t99\nchr1\t149179800\t149180700\t0.022\t99\nchr1\t149183400\t149183700\t0\t82\nchr1\t149186700\t149190300\t0\t82\nchr1\t149191800\t149194200\t0\t82\nchr1\t149197800\t149199300\t0.0314\t89\nchr1\t149201100\t149202300\t0\t93\nchr1\t149203800\t149205900\t0.1865\t79\nchr1\t149207100\t149210100\t0\t89\nchr1\t149211900\t149214900\t0\t130\nchr1\t149216100\t149219100\t0\t130\nchr1\t149220300\t149264700\t0\t130\nchr1\t149266500\t149305800\t0\t130\nchr1\t149307000\t149308200\t0\t119\nchr1\t149310000\t149314200\t0\t119\nchr1\t149315700\t149363400\t0\t119\nchr1\t149366700\t149368200\t0.03\t62\nchr1\t149371800\t149377500\t0\t95\nchr1\t149378700\t149380800\t0\t95\nchr1\t149385600\t149385900\t0.3036\t78\nchr1\t149388000\t149388300\t0.3036\t78\nchr1\t149389800\t149392500\t0.0123\t66\nchr1\t149393700\t149394300\t0\t95\nchr1\t149396100\t149397900\t0\t95\nchr1\t149399400\t149403900\t0\t70\nchr1\t149405700\t149408400\t0\t70\nchr1\t149410500\t149412000\t0.0258\t73\nchr1\t149415000\t149416500\t0.0192\t65\nchr1\t149418300\t149418900\t0.0192\t65\nchr1\t149420700\t149422200\t0.0004\t74\nchr1\t149426100\t149428200\t0.0048\t64\nchr1\t149430900\t149431800\t0\t100\nchr1\t149433900\t149444400\t0\t100\nchr1\t149445900\t149448600\t0\t100\nchr1\t149450700\t149459700\t0\t82\nchr1\t149461800\t149470800\t0\t80\nchr1\t149472900\t149476800\t0\t94\nchr1\t149481300\t149484300\t0\t94\nchr1\t149485500\t149486400\t0\t94\nchr1\t149487900\t149554200\t0\t184\nchr1\t149559000\t149559600\t0\t75\nchr1\t149561100\t149561400\t0.3642\t52\nchr1\t149563500\t149563800\t0\t87\nchr1\t149565000\t149565300\t0\t87\nchr1\t149566500\t149585400\t0\t87\nchr1\t149587800\t149591400\t0.0121\t83\nchr1\t149593200\t149593800\t0.0338\t69\nchr1\t149595000\t149598600\t0.0299\t63\nchr1\t149606700\t149607000\t0.0467\t94\nchr1\t149608200\t149609700\t0.0467\t94\nchr1\t149611200\t149612100\t0.2119\t65\nchr1\t149614500\t149616600\t0\t86\nchr1\t149617800\t149618700\t0\t86\nchr1\t149620200\t149622000\t0\t86\nchr1\t149623200\t149627100\t0.0024\t82\nchr1\t149630100\t149630400\t0.2269\t75\nchr1\t149637300\t149637600\t0.2697\t67\nchr1\t149640000\t149640600\t0.1317\t47\nchr1\t149643000\t149643300\t0.1219\t55\nchr1\t149649300\t149649600\t0.1598\t60\nchr1\t149651100\t149651700\t0.0245\t70\nchr1\t149654700\t149655000\t0.1604\t47\nchr1\t149657400\t149657700\t0.157\t57\nchr1\t149659800\t149660100\t0.0868\t62\nchr1\t149675700\t149676300\t0.0045\t67\nchr1\t149678100\t149679600\t0.0022\t85\nchr1\t149681100\t149685300\t0.0022\t85\nchr1\t149687100\t149687400\t0.0022\t85\nchr1\t149688600\t149689500\t0.0022\t85\nchr1\t149691600\t149691900\t0.2967\t54\nchr1\t149694600\t149694900\t0.2264\t72\nchr1\t149696400\t149709600\t0\t81\nchr1\t149710800\t149712000\t0\t81\nchr1\t149713800\t149715600\t0.0123\t61\nchr1\t149717100\t149719800\t0\t69\nchr1\t149722800\t149728800\t0.025\t69\nchr1\t149731800\t149734500\t0.025\t69\nchr1\t149736000\t149738100\t0.025\t69\nchr1\t149740800\t149741100\t0\t64\nchr1\t149742300\t149743500\t0\t64\nchr1\t149750700\t149751300\t0.2279\t65\nchr1\t149755800\t149756100\t0.0518\t64\nchr1\t149758200\t149758500\t0.1983\t64\nchr1\t149760600\t149761500\t0.1983\t64\nchr1\t149765400\t149765700\t0.3301\t70\nchr1\t149767800\t149769300\t0.0156\t70\nchr1\t149772000\t149774100\t0\t66\nchr1\t149775900\t149776200\t0.1227\t62\nchr1\t149777400\t149777700\t0.0927\t65\nchr1\t149779200\t149780700\t0.0927\t65\nchr1\t149783100\t149784000\t0\t70\nchr1\t149791800\t149792100\t0.1275\t68\nchr1\t149794500\t149795700\t0.0063\t68\nchr1\t149798100\t149799300\t0.218\t58\nchr1\t149800500\t149800800\t0.1622\t58\nchr1\t149808900\t149809200\t0.1762\t60\nchr1\t149817900\t149818200\t0\t81\nchr1\t149821800\t149843400\t0\t81\nchr1\t149850300\t149871900\t0\t83\nchr1\t149873400\t149873700\t0\t83\nchr1\t149875800\t149876100\t0.2981\t57\nchr1\t150728100\t150729000\t0.1538\t55\nchr1\t150782100\t150782400\t0.1901\t67\nchr1\t151599900\t151601700\t0.0506\t78\nchr1\t151647300\t151647900\t0.1975\t85\nchr1\t152213400\t152214900\t0.008\t357\nchr1\t152216100\t152218200\t0\t306\nchr1\t152269500\t152271300\t0\t58\nchr1\t152292300\t152292600\t0.2843\t64\nchr1\t152305800\t152307000\t0.0842\t68\nchr1\t152431800\t152432100\t0.2019\t88\nchr1\t152490000\t152491500\t0.0011\t78\nchr1\t152957100\t152957400\t0.2639\t78\nchr1\t153004500\t153004800\t0.3856\t58\nchr1\t153143100\t153143400\t0.254\t79\nchr1\t153256800\t153257100\t0.3818\t72\nchr1\t153278700\t153279300\t0.0491\t78\nchr1\t153442800\t153443100\t0.2012\t83\nchr1\t153465300\t153465600\t0.3258\t51\nchr1\t155189100\t155190300\t0\t43\nchr1\t155213100\t155214600\t0\t70\nchr1\t155233800\t155235000\t0\t70\nchr1\t155610300\t155611800\t0.0376\t66\nchr1\t155618700\t155619300\t0.0209\t63\nchr1\t155626800\t155630400\t0\t95\nchr1\t155632200\t155635800\t0\t95\nchr1\t155700900\t155701500\t0.0394\t97\nchr1\t155745900\t155746800\t0.1094\t71\nchr1\t155757600\t155758200\t0.1238\t63\nchr1\t156179400\t156180000\t0.2474\t63\nchr1\t156557400\t156559200\t0\t53\nchr1\t157609500\t157609800\t0.1698\t91\nchr1\t158240700\t158241000\t0.1121\t67\nchr1\t158268600\t158268900\t0.1485\t41\nchr1\t158319000\t158319300\t0.1993\t79\nchr1\t158742300\t158742600\t0.3371\t22\nchr1\t158761800\t158763000\t0.008\t69\nchr1\t158953800\t158954400\t0.0501\t74\nchr1\t158955600\t158958600\t0.116\t76\nchr1\t159456600\t159458400\t0.0873\t83\nchr1\t159525300\t159525600\t0.1277\t34\nchr1\t159526800\t159527100\t0.0794\t61\nchr1\t159569400\t159570900\t0.1645\t114\nchr1\t159759900\t159760500\t0.186\t89\nchr1\t159761700\t159762600\t0.1989\t83\nchr1\t160695300\t160695600\t0.3902\t105\nchr1\t161244000\t161244300\t0.2508\t45\nchr1\t161423700\t161424000\t0.3642\t71\nchr1\t161440800\t161458500\t0\t452\nchr1\t161460300\t161472000\t0\t452\nchr1\t161527200\t161528100\t0.2505\t55\nchr1\t161533500\t161535000\t0.2048\t57\nchr1\t161560500\t161560800\t0.2431\t64\nchr1\t161566800\t161567100\t0.3146\t50\nchr1\t161569500\t161569800\t0.2954\t60\nchr1\t161573400\t161586900\t0\t85\nchr1\t161588100\t161589000\t0\t67\nchr1\t161590200\t161590500\t0.1365\t49\nchr1\t161592000\t161592600\t0.2687\t67\nchr1\t161608800\t161609100\t0.2765\t65\nchr1\t161613600\t161614500\t0.0164\t68\nchr1\t161633700\t161634000\t0.2826\t56\nchr1\t161640000\t161640600\t0.0063\t48\nchr1\t161641800\t161642100\t0.0063\t48\nchr1\t161646000\t161646300\t0.3113\t64\nchr1\t161648100\t161648400\t0.2851\t57\nchr1\t161650800\t161651700\t0.0038\t55\nchr1\t161653800\t161670900\t0\t84\nchr1\t161673900\t161674200\t0.0272\t66\nchr1\t162311700\t162312000\t0.1512\t87\nchr1\t162737400\t162739200\t0.006\t91\nchr1\t162791400\t162791700\t0.3857\t50\nchr1\t163262400\t163262700\t0.0263\t67\nchr1\t163641000\t163644300\t0.0168\t90\nchr1\t163750800\t163751100\t0.3485\t61\nchr1\t164290800\t164291100\t0.3646\t64\nchr1\t164463300\t164464800\t0.0346\t121\nchr1\t165971100\t165974100\t0\t114\nchr1\t166243200\t166248000\t0.0348\t137\nchr1\t166311300\t166311600\t0.3352\t78\nchr1\t166494300\t166494600\t0.1364\t58\nchr1\t167435100\t167435400\t0.4384\t64\nchr1\t168055500\t168055800\t0.0323\t67\nchr1\t168348900\t168349500\t0.0521\t72\nchr1\t168351600\t168354000\t0.0612\t93\nchr1\t168544200\t168544500\t0.1846\t61\nchr1\t168576000\t168576300\t0.1523\t72\nchr1\t169252800\t169253400\t0.2993\t72\nchr1\t171097200\t171097500\t0.3862\t56\nchr1\t171374100\t171375600\t0.2222\t101\nchr1\t171377100\t171378000\t0.165\t85\nchr1\t171690300\t171690900\t0.0756\t91\nchr1\t172059300\t172061100\t0.0333\t74\nchr1\t172981800\t172988100\t0.0044\t75\nchr1\t173327400\t173327700\t0.3052\t76\nchr1\t174235200\t174237900\t0.0112\t95\nchr1\t174350100\t174351000\t0.0576\t73\nchr1\t174379500\t174382800\t0.0021\t93\nchr1\t174590400\t174596100\t0\t101\nchr1\t174630300\t174632100\t0.0423\t92\nchr1\t174633900\t174634800\t0.0423\t92\nchr1\t174843600\t174848400\t0\t111\nchr1\t175107600\t175107900\t0.339\t63\nchr1\t175231500\t175231800\t0.3399\t30\nchr1\t176002800\t176003100\t0.3249\t132\nchr1\t176132700\t176133000\t0.0024\t21\nchr1\t176256300\t176261400\t0\t116\nchr1\t176640900\t176641200\t0.2602\t131\nchr1\t176751300\t176752200\t0.0162\t87\nchr1\t177408900\t177409200\t0.2098\t80\nchr1\t177637500\t177639600\t0.0236\t114\nchr1\t178315800\t178317300\t0\t81\nchr1\t178695600\t178696200\t0.402\t72\nchr1\t178777800\t178778700\t0.0172\t137\nchr1\t178804500\t178805100\t0.1071\t117\nchr1\t178841400\t178843500\t0\t101\nchr1\t179943300\t179943600\t0.2195\t63\nchr1\t180302700\t180303000\t0.4846\t58\nchr1\t180699300\t180702300\t0\t95\nchr1\t180867000\t180872700\t0\t120\nchr1\t181225500\t181226700\t0.0592\t66\nchr1\t182508900\t182510400\t0.0063\t70\nchr1\t183616800\t183617100\t0.2795\t66\nchr1\t184846200\t184851600\t0.0009\t121\nchr1\t185004300\t185004600\t0.1429\t165\nchr1\t185006100\t185006400\t0.1429\t165\nchr1\t185252700\t185255700\t0.1867\t82\nchr1\t185380200\t185380500\t0.0792\t95\nchr1\t185888100\t185888400\t0.0936\t83\nchr1\t185889600\t185891100\t0.0936\t83\nchr1\t186160200\t186160500\t0.1835\t66\nchr1\t186641100\t186642000\t0.156\t133\nchr1\t186795600\t186796200\t0.0239\t24\nchr1\t187344000\t187348800\t0\t116\nchr1\t187598100\t187603500\t0\t112\nchr1\t187805400\t187805700\t0.2465\t46\nchr1\t188559900\t188560200\t0.2836\t62\nchr1\t188756100\t188756400\t0.3004\t120\nchr1\t189025800\t189026100\t0.1147\t26\nchr1\t189469500\t189471000\t0.0753\t88\nchr1\t189863400\t189863700\t0.204\t48\nchr1\t190730400\t190732800\t0.148\t92\nchr1\t191064000\t191064300\t0.2471\t65\nchr1\t191069700\t191070000\t0.0579\t58\nchr1\t192501300\t192506400\t0.0418\t95\nchr1\t193445400\t193446300\t0.1974\t95\nchr1\t193718100\t193723500\t0\t103\nchr1\t194272200\t194273100\t0.2246\t64\nchr1\t195925500\t195929100\t0\t92\nchr1\t196219500\t196225200\t0\t114\nchr1\t196753200\t196754700\t0\t49\nchr1\t196757100\t196757400\t0.0483\t64\nchr1\t196758900\t196759200\t0.0483\t64\nchr1\t196795800\t196796400\t0.0089\t63\nchr1\t196812900\t196813200\t0.2013\t64\nchr1\t196819500\t196820100\t0.0346\t59\nchr1\t196821300\t196821600\t0.0774\t66\nchr1\t196837800\t196839300\t0\t49\nchr1\t196841700\t196844100\t0\t54\nchr1\t196847100\t196847700\t0.0188\t70\nchr1\t196920900\t196921500\t0.0221\t76\nchr1\t196943400\t196944000\t0.0128\t63\nchr1\t196945200\t196945800\t0.2424\t70\nchr1\t197531400\t197534100\t0\t102\nchr1\t197708100\t197713800\t0\t111\nchr1\t197803500\t197804100\t0.1705\t77\nchr1\t198250500\t198250800\t0.1148\t93\nchr1\t199023600\t199025400\t0\t102\nchr1\t199469700\t199470900\t0\t78\nchr1\t200487600\t200487900\t0.4729\t70\nchr1\t200797500\t200798700\t0.0506\t95\nchr1\t200914800\t200915400\t0\t72\nchr1\t201210000\t201210600\t0.2724\t67\nchr1\t201235500\t201235800\t0.175\t66\nchr1\t202204800\t202205100\t0.2868\t70\nchr1\t202391700\t202392000\t0.007\t11\nchr1\t204471000\t204471600\t0\t59\nchr1\t205847100\t205847400\t0.1791\t58\nchr1\t205854300\t205854600\t0.0894\t60\nchr1\t205958100\t205958400\t0.117\t21\nchr1\t205966800\t205967100\t0.4159\t18\nchr1\t206153100\t206153700\t0.0215\t56\nchr1\t206158200\t206160300\t0\t63\nchr1\t206163000\t206164500\t0.1748\t70\nchr1\t206170500\t206172000\t0\t77\nchr1\t206175000\t206176800\t0.0179\t63\nchr1\t206180100\t206180700\t0.0179\t63\nchr1\t206183400\t206190300\t0\t75\nchr1\t206192100\t206192700\t0\t75\nchr1\t206194800\t206197800\t0\t75\nchr1\t206199300\t206205600\t0.0004\t76\nchr1\t206207700\t206208300\t0.0004\t76\nchr1\t206211300\t206212800\t0.0649\t64\nchr1\t206214900\t206220300\t0\t86\nchr1\t206221500\t206226300\t0\t86\nchr1\t206228100\t206228400\t0.1616\t94\nchr1\t206230200\t206230500\t0.2069\t55\nchr1\t206232600\t206234100\t0\t83\nchr1\t206235300\t206238600\t0\t83\nchr1\t206242500\t206247900\t0\t90\nchr1\t206250600\t206254200\t0.0913\t74\nchr1\t206256900\t206257200\t0.0109\t66\nchr1\t206258400\t206258700\t0.0109\t66\nchr1\t206259900\t206261400\t0.0109\t66\nchr1\t206263200\t206265600\t0\t72\nchr1\t206268600\t206272200\t0\t70\nchr1\t206274900\t206277600\t0.0163\t75\nchr1\t206279100\t206282700\t0.0163\t75\nchr1\t206287500\t206289300\t0.1385\t67\nchr1\t206293200\t206294400\t0.0004\t71\nchr1\t206297100\t206300700\t0.0907\t70\nchr1\t206302800\t206303100\t0.0907\t70\nchr1\t206308200\t206309100\t0.0012\t60\nchr1\t206310900\t206311200\t0.2815\t89\nchr1\t206313300\t206313600\t0.3485\t81\nchr1\t206314800\t206317500\t0.0083\t77\nchr1\t206319900\t206321700\t0.0013\t68\nchr1\t206323800\t206324400\t0.0013\t68\nchr1\t206327400\t206332200\t0\t105\nchr1\t206334000\t206334300\t0.2437\t70\nchr1\t206336100\t206338800\t0.0168\t83\nchr1\t206342700\t206343900\t0.3068\t70\nchr1\t206348700\t206349900\t0.0757\t73\nchr1\t206352000\t206352600\t0.0307\t51\nchr1\t206356200\t206356500\t0.3475\t72\nchr1\t206357700\t206358000\t0.1335\t59\nchr1\t206359200\t206362800\t0.0382\t92\nchr1\t206364900\t206365200\t0.203\t62\nchr1\t206366700\t206367000\t0.0188\t99\nchr1\t206368200\t206368800\t0.0188\t99\nchr1\t206370900\t206375100\t0.0019\t73\nchr1\t206376600\t206378100\t0.0199\t54\nchr1\t206379300\t206383200\t0\t85\nchr1\t206387400\t206388900\t0\t85\nchr1\t206390100\t206394000\t0.1159\t69\nchr1\t206396700\t206398200\t0.2345\t54\nchr1\t206400300\t206400900\t0\t83\nchr1\t206402700\t206409300\t0\t83\nchr1\t207526800\t207564000\t0\t74\nchr1\t207568200\t207572100\t0\t58\nchr1\t207721500\t207722400\t0.0686\t81\nchr1\t207732300\t207733500\t0.0835\t85\nchr1\t207735300\t207736200\t0.0169\t113\nchr1\t208307100\t208307400\t0.344\t105\nchr1\t208659000\t208659300\t0.1524\t63\nchr1\t208694100\t208694400\t0.4882\t49\nchr1\t208707000\t208707300\t0.2368\t83\nchr1\t209281500\t209281800\t0.1699\t72\nchr1\t209913900\t209919600\t0\t82\nchr1\t210442200\t210444300\t0\t69\nchr1\t210968100\t210968400\t0.2441\t65\nchr1\t212298600\t212298900\t0.2244\t29\nchr1\t212849400\t212851200\t0.0009\t84\nchr1\t213740700\t213741000\t0.259\t36\nchr1\t213806700\t213807000\t0.2221\t110\nchr1\t214683300\t214683600\t0.3777\t50\nchr1\t214868700\t214870500\t0.0419\t51\nchr1\t215209500\t215209800\t0.0394\t45\nchr1\t216488400\t216489300\t0.2044\t84\nchr1\t216490800\t216491100\t0.2044\t84\nchr1\t217359300\t217359900\t0.1739\t54\nchr1\t217690500\t217695600\t0\t83\nchr1\t217744200\t217744500\t0.3307\t43\nchr1\t218009100\t218014800\t0\t76\nchr1\t218072400\t218073000\t0.0039\t75\nchr1\t219103800\t219104100\t0.1983\t66\nchr1\t219455700\t219457500\t0.0698\t109\nchr1\t219561900\t219562200\t0.165\t63\nchr1\t219591300\t219591600\t0.2649\t46\nchr1\t219598800\t219600300\t0.2296\t52\nchr1\t219610200\t219611700\t0.1811\t72\nchr1\t219866400\t219867000\t0.016\t40\nchr1\t219869100\t219869400\t0.1181\t77\nchr1\t220112100\t220112400\t0.2366\t44\nchr1\t220246500\t220246800\t0.034\t59\nchr1\t220995900\t220996800\t0\t136\nchr1\t222138300\t222138600\t0.314\t18\nchr1\t222481200\t222481800\t0.0281\t40\nchr1\t222483000\t222483300\t0.3182\t54\nchr1\t222488400\t222489300\t0.0386\t101\nchr1\t222501300\t222501600\t0.4911\t38\nchr1\t222507300\t222507600\t0.2135\t87\nchr1\t222509400\t222509700\t0.2134\t62\nchr1\t222668400\t222668700\t0.0095\t68\nchr1\t223317900\t223319400\t0.0166\t101\nchr1\t223396800\t223397400\t0.0647\t72\nchr1\t223398600\t223399500\t0.0647\t72\nchr1\t223451100\t223451700\t0.0266\t79\nchr1\t223635600\t223636800\t0\t122\nchr1\t223890000\t223890300\t0.0632\t68\nchr1\t223894200\t223894500\t0.2902\t49\nchr1\t223910400\t223910700\t0.2719\t73\nchr1\t223917300\t223917600\t0.2498\t71\nchr1\t223920600\t223920900\t0.1297\t90\nchr1\t223923000\t223923300\t0.2606\t72\nchr1\t223927800\t223931400\t0.0213\t66\nchr1\t223932600\t223934700\t0\t68\nchr1\t223938600\t223938900\t0.0039\t68\nchr1\t223940100\t223941600\t0.0039\t68\nchr1\t223943400\t223944300\t0.1719\t67\nchr1\t223950900\t223951200\t0.1232\t36\nchr1\t223953900\t223954200\t0.2175\t50\nchr1\t223963200\t223963500\t0.4961\t43\nchr1\t223968300\t223968600\t0.265\t76\nchr1\t223979700\t223981500\t0.0585\t53\nchr1\t223987800\t223988400\t0.0625\t78\nchr1\t224001300\t224001600\t0.2409\t47\nchr1\t224011800\t224017200\t0.2077\t1434\nchr1\t224025300\t224025600\t0.2432\t61\nchr1\t224026800\t224027100\t0.1541\t36\nchr1\t224034000\t224034300\t0.1403\t64\nchr1\t224059500\t224059800\t0\t30\nchr1\t224340000\t224340600\t0.0779\t52\nchr1\t224378700\t224379000\t0.3123\t91\nchr1\t224799600\t224800200\t0.076\t141\nchr1\t226071600\t226071900\t0.1224\t46\nchr1\t226114500\t226114800\t0.0645\t44\nchr1\t226797900\t226798200\t0.0165\t27\nchr1\t227207700\t227208000\t0.2293\t76\nchr1\t227493300\t227496000\t0.0059\t96\nchr1\t227497800\t227499000\t0.0059\t96\nchr1\t227502300\t227508000\t0\t71\nchr1\t227981400\t227982000\t0.1635\t56\nchr1\t227984100\t227985600\t0.0849\t52\nchr1\t228384600\t228384900\t0.4534\t47\nchr1\t228556500\t228558300\t0\t325\nchr1\t228608400\t228646800\t0\t773\nchr1\t228679200\t228679500\t0.2133\t32\nchr1\t228709500\t228709800\t0.3244\t71\nchr1\t228711600\t228712200\t0.2721\t100\nchr1\t229900800\t229901100\t0.3862\t67\nchr1\t230335200\t230335500\t0.327\t13\nchr1\t230871900\t230872200\t0.4319\t236\nchr1\t231047400\t231047700\t0.2172\t36\nchr1\t231780600\t231780900\t0.0081\t61\nchr1\t232082100\t232082700\t0.2749\t94\nchr1\t232231800\t232232100\t0.1874\t25\nchr1\t232725300\t232725600\t0.3893\t44\nchr1\t232823700\t232824300\t0.065\t83\nchr1\t233174100\t233174400\t0.4098\t10\nchr1\t234267000\t234267600\t0.298\t79\nchr1\t234451500\t234451800\t0.2176\t32\nchr1\t234788100\t234790800\t0.065\t125\nchr1\t234793800\t234794100\t0.3437\t108\nchr1\t234797100\t234798600\t0.0313\t116\nchr1\t234801000\t234801300\t0.3427\t85\nchr1\t234803100\t234804300\t0.1416\t116\nchr1\t234805800\t234806100\t0.2708\t93\nchr1\t234809100\t234809700\t0.2708\t93\nchr1\t234812400\t234812700\t0.0623\t123\nchr1\t234813900\t234814800\t0.0623\t123\nchr1\t234818400\t234818700\t0.152\t74\nchr1\t235382700\t235384500\t0.2121\t73\nchr1\t236035200\t236035500\t0.0302\t105\nchr1\t236097000\t236097300\t0.2783\t390\nchr1\t236386500\t236388000\t0\t59\nchr1\t236713500\t236715000\t0\t414\nchr1\t236755800\t236757000\t0.1186\t44\nchr1\t237019500\t237025200\t0\t110\nchr1\t237075600\t237081300\t0.0036\t103\nchr1\t238689300\t238689900\t0.0431\t109\nchr1\t239623500\t239629200\t0\t103\nchr1\t239732400\t239732700\t0.0195\t57\nchr1\t241197300\t241197600\t0.2177\t31\nchr1\t241416000\t241416300\t0.281\t61\nchr1\t242045700\t242051400\t0\t82\nchr1\t242394300\t242394600\t0.1125\t15\nchr1\t243013200\t243013500\t0.2069\t63\nchr1\t243030000\t243031500\t0.0389\t74\nchr1\t243033000\t243034200\t0.2107\t61\nchr1\t243036300\t243036600\t0.322\t63\nchr1\t243038400\t243038700\t0.322\t63\nchr1\t243040500\t243040800\t0.0656\t63\nchr1\t243042300\t243042600\t0.0656\t63\nchr1\t243045600\t243046800\t0.0178\t50\nchr1\t243052200\t243052500\t0.2328\t47\nchr1\t243058800\t243059100\t0.156\t58\nchr1\t243061500\t243061800\t0.3266\t45\nchr1\t243068400\t243068700\t0.3517\t89\nchr1\t243081300\t243082800\t0.0109\t79\nchr1\t243096300\t243096600\t0.3059\t67\nchr1\t244492800\t244493100\t0.1586\t82\nchr1\t244523400\t244523700\t0.0986\t79\nchr1\t244540800\t244541100\t0.225\t45\nchr1\t245103300\t245103600\t0.1551\t58\nchr1\t245280900\t245281800\t0.0573\t90\nchr1\t245819400\t245820300\t0.0105\t118\nchr1\t245974500\t245976900\t0\t20\nchr1\t245991900\t245992800\t0.0023\t49\nchr1\t246024600\t246024900\t0.4614\t70\nchr1\t246251700\t246252300\t0.3594\t50\nchr1\t246388200\t246389700\t0\t118\nchr1\t246429900\t246430200\t0.4254\t44\nchr1\t246484200\t246485100\t0.2527\t74\nchr1\t246520800\t246521100\t0.4323\t34\nchr1\t246620100\t246620400\t0.1052\t15\nchr1\t246818100\t246819300\t0\t30\nchr1\t246864600\t246864900\t0.1618\t14\nchr1\t247116000\t247119000\t0\t47\nchr1\t247126200\t247129800\t0\t77\nchr1\t247170900\t247172100\t0\t58\nchr1\t247219200\t247219500\t0.069\t67\nchr1\t247354800\t247355100\t0.0551\t45\nchr1\t247363200\t247363500\t0.4447\t70\nchr1\t247687500\t247693200\t0\t97\nchr1\t247725600\t247726800\t0.0733\t66\nchr1\t247800600\t247800900\t0.2274\t36\nchr1\t247809300\t247810800\t0.0101\t81\nchr1\t247870500\t247871100\t0.2659\t175\nchr1\t247888500\t247891200\t0\t100\nchr1\t247892400\t247893900\t0\t100\nchr1\t247921500\t247921800\t0.1473\t42\nchr1\t248166900\t248170800\t0.0061\t105\nchr1\t248187900\t248188800\t0\t64\nchr1\t248221200\t248221800\t0.0667\t81\nchr1\t248256300\t248256600\t0.308\t72\nchr1\t248408100\t248409000\t0.0298\t129\nchr1\t248448300\t248448900\t0\t72\nchr1\t248450700\t248452500\t0\t72\nchr1\t248454000\t248457000\t0\t65\nchr1\t248474400\t248476500\t0\t74\nchr1\t248479800\t248480100\t0.1043\t67\nchr1\t248483400\t248484600\t0\t67\nchr1\t248486100\t248493900\t0\t88\nchr1\t248495700\t248498400\t0\t66\nchr1\t248499600\t248500500\t0\t66\nchr1\t248502000\t248519100\t0\t65\nchr1\t248529000\t248543700\t0\t78\nchr1\t248544900\t248546100\t0\t78\nchr1\t248547600\t248548200\t0\t78\nchr1\t248549400\t248551800\t0\t69\nchr1\t248554200\t248562000\t0\t72\nchr1\t248563800\t248564400\t0\t77\nchr1\t248568000\t248568300\t0.0747\t73\nchr1\t248571600\t248573700\t0\t69\nchr1\t248635800\t248638200\t0.0007\t93\nchr1\t248639700\t248643900\t0\t68\nchr1\t248650200\t248650500\t0.3035\t41\nchr1\t248654100\t248655000\t0\t55\nchr1\t248676600\t248676900\t0.0569\t12\nchr1\t248747100\t248748000\t0.0083\t41\nchr1\t248931300\t248933400\t0.0069\t305\nchr1\t248937900\t248946600\t0.0069\t305\nchr10\t9900\t47100\t0\t302\nchr10\t321600\t323400\t0.0504\t107\nchr10\t345600\t347100\t0.2067\t46\nchr10\t402300\t402600\t0.3243\t25\nchr10\t425100\t425400\t0.3833\t93\nchr10\t455400\t456000\t0.4409\t135\nchr10\t465000\t465300\t0.1919\t59\nchr10\t632400\t632700\t0.4778\t56\nchr10\t717900\t718200\t0.0922\t41\nchr10\t723300\t723600\t0.3428\t36\nchr10\t735900\t736200\t0.2104\t37\nchr10\t747300\t747600\t0.2376\t59\nchr10\t757200\t757500\t0.0324\t40\nchr10\t777600\t777900\t0.1577\t41\nchr10\t783900\t784200\t0.0562\t48\nchr10\t952500\t953400\t0.0013\t77\nchr10\t1046700\t1047600\t0\t22\nchr10\t1235400\t1240200\t0.0942\t172\nchr10\t1260900\t1261200\t0.2213\t79\nchr10\t1340400\t1340700\t0.4262\t42\nchr10\t1460100\t1460400\t0.2983\t44\nchr10\t1592400\t1593300\t0.2122\t120\nchr10\t1699200\t1701000\t0.3754\t33\nchr10\t1770000\t1770300\t0.1316\t78\nchr10\t2232000\t2232300\t0.4724\t56\nchr10\t2392200\t2392500\t0.4444\t107\nchr10\t2522700\t2523000\t0.286\t31\nchr10\t2806200\t2806500\t0.2031\t73\nchr10\t3085200\t3085500\t0.4878\t11\nchr10\t3106200\t3106500\t0.4702\t78\nchr10\t3221700\t3222000\t0.2522\t69\nchr10\t3252300\t3252600\t0.4406\t29\nchr10\t3315000\t3315300\t0.3292\t112\nchr10\t4592700\t4593000\t0.2608\t28\nchr10\t4598100\t4598400\t0.402\t68\nchr10\t4815600\t4815900\t0.0423\t12\nchr10\t4956300\t4956600\t0.184\t70\nchr10\t4975800\t4976100\t0.0906\t56\nchr10\t4980300\t4980600\t0.2068\t65\nchr10\t4987200\t4987500\t0.1164\t62\nchr10\t4991700\t4992000\t0.0362\t58\nchr10\t5245500\t5251200\t0\t90\nchr10\t6210600\t6210900\t0.4172\t11\nchr10\t6369600\t6375600\t0\t69\nchr10\t6450000\t6450300\t0.1576\t71\nchr10\t6861000\t6861300\t0.3483\t65\nchr10\t7058700\t7060200\t0.0358\t69\nchr10\t7061400\t7062600\t0.0385\t84\nchr10\t7138500\t7138800\t0.0586\t79\nchr10\t7140300\t7141800\t0.0586\t79\nchr10\t8984400\t8984700\t0.0844\t105\nchr10\t9831900\t9832200\t0.241\t64\nchr10\t10107600\t10108500\t0.2146\t81\nchr10\t10557000\t10557300\t0.2837\t75\nchr10\t10652100\t10652400\t0.2138\t66\nchr10\t10654500\t10654800\t0.2138\t66\nchr10\t10692600\t10693500\t0.0684\t95\nchr10\t11731500\t11736900\t0\t107\nchr10\t11885400\t11885700\t0.3822\t91\nchr10\t12519600\t12520800\t0.0017\t29\nchr10\t12694200\t12694500\t0.4123\t20\nchr10\t12774900\t12776100\t0\t253\nchr10\t13155300\t13155600\t0.1149\t70\nchr10\t13217400\t13218600\t0\t62\nchr10\t14515200\t14515500\t0.1601\t67\nchr10\t15915900\t15921300\t0\t87\nchr10\t17628900\t17629200\t0.4835\t72\nchr10\t17631000\t17631300\t0.0536\t47\nchr10\t17720400\t17720700\t0.1718\t89\nchr10\t18031500\t18032400\t0.0421\t76\nchr10\t19088700\t19093800\t0\t101\nchr10\t19160400\t19161300\t0.0143\t67\nchr10\t19238100\t19238700\t0\t52\nchr10\t19285800\t19286100\t0.1409\t71\nchr10\t19582500\t19583100\t0.0125\t68\nchr10\t20538600\t20539800\t0.1201\t69\nchr10\t20752200\t20757000\t0\t89\nchr10\t21322800\t21323100\t0.0582\t87\nchr10\t21430500\t21431100\t0.0126\t73\nchr10\t22124400\t22128000\t0.0533\t74\nchr10\t22404000\t22405800\t0.0084\t80\nchr10\t22408200\t22408500\t0.0084\t80\nchr10\t23152800\t23154600\t0.0388\t98\nchr10\t24656400\t24657900\t0.22\t66\nchr10\t24809100\t24809400\t0.4005\t25\nchr10\t25250100\t25250400\t0.19\t53\nchr10\t25516500\t25520400\t0.0086\t81\nchr10\t26892000\t26894100\t0.108\t98\nchr10\t27281400\t27282000\t0.2201\t59\nchr10\t27355200\t27355500\t0.2879\t77\nchr10\t27823800\t27824100\t0.2793\t75\nchr10\t27846600\t27846900\t0.3416\t50\nchr10\t27873300\t27873600\t0.192\t64\nchr10\t27968700\t27969000\t0.2287\t69\nchr10\t29423400\t29423700\t0\t28\nchr10\t29697000\t29697600\t0.1826\t44\nchr10\t30945600\t30946200\t0.089\t79\nchr10\t30950700\t30951000\t0.2437\t11\nchr10\t30952500\t30953100\t0.0273\t86\nchr10\t31445700\t31446000\t0.0917\t82\nchr10\t31447200\t31448400\t0.0917\t82\nchr10\t31470600\t31471200\t0.212\t93\nchr10\t31968900\t31971600\t0\t184\nchr10\t32416800\t32417100\t0.2795\t16\nchr10\t32660700\t32661300\t0.2938\t75\nchr10\t32775900\t32776200\t0.3486\t51\nchr10\t32901000\t32901300\t0.192\t49\nchr10\t33510900\t33516300\t0\t74\nchr10\t35478000\t35478300\t0.2008\t84\nchr10\t37066200\t37066500\t0.1362\t70\nchr10\t37103100\t37104300\t0.0031\t54\nchr10\t37111800\t37113000\t0.0005\t64\nchr10\t37163100\t37164000\t0.0044\t62\nchr10\t37167900\t37177800\t0\t79\nchr10\t37179600\t37182900\t0\t70\nchr10\t37184400\t37189500\t0\t78\nchr10\t37900800\t37901100\t0.2272\t65\nchr10\t38263500\t38265600\t0.0095\t79\nchr10\t38272500\t38272800\t0.3282\t53\nchr10\t38418600\t38418900\t0.0213\t63\nchr10\t38424600\t38424900\t0.1032\t44\nchr10\t38464200\t38465100\t0.0115\t61\nchr10\t38468100\t38468400\t0.1549\t53\nchr10\t38469900\t38470200\t0.2354\t46\nchr10\t38476200\t38476500\t0.1565\t72\nchr10\t38485200\t38491800\t0.1539\t3073\nchr10\t38493000\t38493300\t0.3878\t314\nchr10\t38494800\t38497800\t0.2124\t829\nchr10\t38499000\t38501700\t0.2124\t829\nchr10\t38503200\t38507100\t0.2703\t357\nchr10\t38508300\t38508600\t0.2608\t375\nchr10\t38509800\t38511000\t0.2608\t375\nchr10\t38512800\t38513700\t0.2334\t291\nchr10\t38515200\t38522400\t0.2203\t557\nchr10\t38524200\t38526300\t0.2237\t424\nchr10\t38573100\t38575200\t0.1381\t2536\nchr10\t38577600\t38582100\t0.1536\t2263\nchr10\t38636700\t38637000\t0.2891\t94\nchr10\t38750400\t38750700\t0.3225\t40\nchr10\t38783400\t38783700\t0.307\t231\nchr10\t38785800\t38788500\t0.2239\t322\nchr10\t38790600\t38793000\t0.1933\t322\nchr10\t38794500\t38795100\t0.2562\t285\nchr10\t38800500\t38801700\t0.3061\t342\nchr10\t38803800\t38805300\t0.3865\t171\nchr10\t38807400\t38809500\t0.3817\t194\nchr10\t38814000\t38814300\t0.3606\t228\nchr10\t38815800\t38816100\t0.4649\t166\nchr10\t38817900\t38818200\t0.2173\t323\nchr10\t38822400\t38823000\t0.3576\t184\nchr10\t38825700\t38826600\t0.277\t242\nchr10\t38833500\t38833800\t0.4742\t148\nchr10\t38835000\t38835300\t0.4749\t120\nchr10\t38836800\t38862300\t0\t206\nchr10\t38863800\t38869200\t0\t206\nchr10\t38870700\t38871000\t0\t1407\nchr10\t38872500\t38892300\t0\t1407\nchr10\t38893500\t38905500\t0\t1407\nchr10\t38911500\t38913000\t0.0971\t299\nchr10\t38918100\t38920500\t0.2128\t2075\nchr10\t39183300\t39183600\t0.3024\t31\nchr10\t39466500\t39470100\t0.0005\t60\nchr10\t39508800\t39513900\t0\t79\nchr10\t39559800\t39560100\t0.3686\t14\nchr10\t39568500\t39568800\t0.2527\t36\nchr10\t39575100\t39576300\t0.1422\t83\nchr10\t39579600\t39579900\t0.2989\t25\nchr10\t39582600\t39582900\t0.4612\t14\nchr10\t39606300\t39607500\t0\t49\nchr10\t39609600\t39609900\t0.1253\t16\nchr10\t39619800\t39620100\t0\t58\nchr10\t39625500\t39625800\t0\t22\nchr10\t39636000\t39636300\t0.0225\t44\nchr10\t39687600\t39687900\t0.1457\t19\nchr10\t39701700\t39702000\t0\t16\nchr10\t39708300\t39708900\t0\t17\nchr10\t39711300\t39712500\t0\t127\nchr10\t39717600\t39717900\t0\t14\nchr10\t39719100\t39720600\t0\t145\nchr10\t39721800\t39722400\t0\t16\nchr10\t39725700\t39728400\t0\t103\nchr10\t39735000\t39735300\t0\t19\nchr10\t39738600\t39738900\t0\t24\nchr10\t39744900\t39746400\t0\t79\nchr10\t39751800\t39752100\t0.0262\t25\nchr10\t39753600\t39755400\t0.1383\t31\nchr10\t39757500\t39758400\t0.0437\t78\nchr10\t39762600\t39763800\t0\t24\nchr10\t39770400\t39771900\t0\t60\nchr10\t39774300\t39777900\t0\t60\nchr10\t39779700\t39780000\t0\t18\nchr10\t39786300\t39786900\t0\t52\nchr10\t39795000\t39795300\t0\t25\nchr10\t39799500\t39800100\t0.1899\t23\nchr10\t39802500\t39802800\t0.1813\t11\nchr10\t39804000\t39805200\t0\t19\nchr10\t39809700\t39810000\t0.2306\t59\nchr10\t39812700\t39813300\t0\t44\nchr10\t39819900\t39820200\t0\t16\nchr10\t39825900\t39826200\t0.2293\t26\nchr10\t39828900\t39829200\t0\t11\nchr10\t39830700\t39831000\t0.1286\t15\nchr10\t39834300\t39836400\t0\t150\nchr10\t39837600\t39837900\t0\t34\nchr10\t39843900\t39844200\t0\t13\nchr10\t39849900\t39851400\t0\t10\nchr10\t39855900\t39856500\t0.0614\t87\nchr10\t39858900\t39860400\t0\t54\nchr10\t39861900\t39863400\t0\t19\nchr10\t39869700\t39870600\t0\t37\nchr10\t39871800\t39872100\t0\t31\nchr10\t39874200\t39874500\t0\t40\nchr10\t39876300\t39876900\t0\t40\nchr10\t39882600\t39882900\t0\t12\nchr10\t39884400\t39884700\t0\t17\nchr10\t39892500\t39894000\t0.1654\t27\nchr10\t39897300\t39898200\t0\t53\nchr10\t39900600\t39900900\t0\t25\nchr10\t39904200\t39906300\t0\t70\nchr10\t39911100\t39911400\t0.3556\t13\nchr10\t39912600\t39912900\t0\t28\nchr10\t39915300\t39916500\t0.0485\t69\nchr10\t39918000\t39918900\t0\t15\nchr10\t39921000\t39921300\t0\t27\nchr10\t39924300\t39924600\t0\t16\nchr10\t39927000\t39927300\t0\t26\nchr10\t39928500\t39930300\t0\t36\nchr10\t39933900\t39934200\t0\t17\nchr10\t39936000\t39941400\t0\t840\nchr10\t39946200\t39946500\t0\t14\nchr10\t39953100\t39956400\t0\t263\nchr10\t39958800\t39959100\t0.3216\t34\nchr10\t39961200\t39970200\t0\t3165\nchr10\t39980100\t39981600\t0\t53\nchr10\t39983100\t39987900\t0\t1012\nchr10\t39989400\t39994500\t0\t465\nchr10\t39996900\t40002300\t0\t465\nchr10\t40004400\t40005900\t0\t294\nchr10\t40019400\t40021200\t0\t1990\nchr10\t40024500\t40025100\t0.0024\t289\nchr10\t40029300\t40029900\t0\t57\nchr10\t40046700\t40048200\t0\t280\nchr10\t40059600\t40061100\t0\t74\nchr10\t40065300\t40074000\t0\t887\nchr10\t40076100\t40087800\t0\t773\nchr10\t40090500\t40090800\t0\t27\nchr10\t40097100\t40102200\t0\t1747\nchr10\t40104600\t40105800\t0.0047\t137\nchr10\t40107300\t40107900\t0.2694\t146\nchr10\t40117800\t40118100\t0\t36\nchr10\t40127400\t40129800\t0\t2060\nchr10\t40134600\t40139400\t0\t1903\nchr10\t40141500\t40142400\t0\t203\nchr10\t40145100\t40145700\t0\t46\nchr10\t40147500\t40150200\t0\t267\nchr10\t40157400\t40159200\t0.0003\t846\nchr10\t40162800\t40163100\t0\t11\nchr10\t40167000\t40167600\t0\t82\nchr10\t40169700\t40170000\t0\t19\nchr10\t40183500\t40188000\t0\t311\nchr10\t40191900\t40193400\t0\t248\nchr10\t40200600\t40209000\t0\t2419\nchr10\t40213200\t40213800\t0.0559\t46\nchr10\t40216200\t40224300\t0\t377\nchr10\t40227600\t40228800\t0\t254\nchr10\t40232400\t40232700\t0.0308\t32\nchr10\t40241700\t40242000\t0.0163\t56\nchr10\t40246200\t40248900\t0\t329\nchr10\t40257900\t40258200\t0.4353\t15\nchr10\t40262400\t40263600\t0\t516\nchr10\t40265700\t40269000\t0\t1958\nchr10\t40270800\t40271100\t0\t12\nchr10\t40276800\t40280700\t0\t1970\nchr10\t40283100\t40291500\t0\t683\nchr10\t40294500\t40294800\t0.0148\t32\nchr10\t40301100\t40302900\t0\t73\nchr10\t40314600\t40316100\t0\t479\nchr10\t40318500\t40319100\t0\t55\nchr10\t40325400\t40326900\t0.0012\t142\nchr10\t40332600\t40338600\t0\t445\nchr10\t40344600\t40347300\t0\t564\nchr10\t40364400\t40369200\t0\t1934\nchr10\t40370700\t40379400\t0\t552\nchr10\t40387500\t40401000\t0\t991\nchr10\t40407900\t40410000\t0.0092\t738\nchr10\t40411200\t40416300\t0\t2950\nchr10\t40420800\t40422600\t0.0088\t247\nchr10\t40425600\t40428900\t0\t186\nchr10\t40435500\t40437600\t0\t373\nchr10\t40440900\t40442700\t0\t686\nchr10\t40445700\t40446000\t0.0311\t58\nchr10\t40447200\t40448400\t0\t79\nchr10\t40453200\t40456500\t0\t404\nchr10\t40461000\t40463400\t0\t904\nchr10\t40465200\t40467900\t0\t907\nchr10\t40476000\t40480800\t0\t965\nchr10\t40482900\t40487400\t0\t965\nchr10\t40488600\t40491600\t0\t201\nchr10\t40492800\t40494600\t0\t249\nchr10\t40495800\t40498200\t0\t255\nchr10\t40502400\t40518900\t0\t615\nchr10\t40524600\t40525500\t0\t239\nchr10\t40532100\t40532700\t0.001\t110\nchr10\t40537500\t40548600\t0\t634\nchr10\t40550700\t40551000\t0\t634\nchr10\t40555200\t40558500\t0\t3094\nchr10\t40567500\t40568100\t0.0021\t321\nchr10\t40574700\t40576500\t0\t226\nchr10\t40578300\t40580700\t0\t169\nchr10\t40582200\t40582800\t0\t120\nchr10\t40584000\t40584300\t0.1375\t50\nchr10\t40586400\t40613100\t0\t3793\nchr10\t40614600\t40620600\t0\t1089\nchr10\t40626900\t40627200\t0.0556\t155\nchr10\t40633200\t40634100\t0\t477\nchr10\t40639800\t40641000\t0\t191\nchr10\t40642800\t40651200\t0\t674\nchr10\t40652400\t40653300\t0\t143\nchr10\t40657500\t40671600\t0\t400\nchr10\t40673100\t40674000\t0.0118\t431\nchr10\t40676100\t40683900\t0\t759\nchr10\t40685400\t40686300\t0\t188\nchr10\t40687800\t40689300\t0\t222\nchr10\t40691100\t40691700\t0\t82\nchr10\t40700700\t40701300\t0.35\t134\nchr10\t40704600\t40705500\t0.0041\t275\nchr10\t40709700\t40710000\t0.0914\t28\nchr10\t40711500\t40717800\t0\t422\nchr10\t40720500\t40721400\t0\t215\nchr10\t40722900\t40723500\t0\t20\nchr10\t40726500\t40730100\t0\t738\nchr10\t40733400\t40737300\t0\t633\nchr10\t40739100\t40740900\t0\t158\nchr10\t40743300\t40743600\t0\t26\nchr10\t40744800\t40745700\t0\t157\nchr10\t40748700\t40749300\t0\t178\nchr10\t40751100\t40753500\t0\t412\nchr10\t40755900\t40758300\t0\t340\nchr10\t40759800\t40766400\t0\t483\nchr10\t40767900\t40772100\t0\t599\nchr10\t40773300\t40775700\t0\t229\nchr10\t40781400\t40785300\t0\t262\nchr10\t40786500\t40787400\t0.0001\t181\nchr10\t40790400\t40791000\t0\t666\nchr10\t40792200\t40794000\t0\t666\nchr10\t40795500\t40808700\t0\t513\nchr10\t40810800\t40812000\t0\t646\nchr10\t40814400\t40818900\t0\t373\nchr10\t40821600\t40823400\t0\t400\nchr10\t40827300\t40828800\t0\t1015\nchr10\t40830000\t40839900\t0\t1015\nchr10\t40841400\t40855500\t0\t1015\nchr10\t40857000\t40857300\t0.4777\t41\nchr10\t40862100\t40864500\t0\t231\nchr10\t40866300\t40867500\t0\t102\nchr10\t40869900\t40871400\t0\t504\nchr10\t40873200\t40873500\t0\t34\nchr10\t40874700\t40876200\t0\t213\nchr10\t40878000\t40881000\t0\t525\nchr10\t40882500\t40884000\t0\t273\nchr10\t40886100\t40886400\t0\t10\nchr10\t40888500\t40890600\t0.008\t184\nchr10\t40891800\t40898700\t0\t1649\nchr10\t40900200\t40901100\t0\t359\nchr10\t40903200\t40907100\t0\t359\nchr10\t40908300\t40908900\t0.1968\t182\nchr10\t40911600\t40912800\t0\t261\nchr10\t40917900\t40920900\t0\t308\nchr10\t40923900\t40927200\t0\t1318\nchr10\t40928700\t40929000\t0\t1318\nchr10\t40931400\t40943400\t0\t803\nchr10\t40944900\t40949400\t0\t241\nchr10\t40954200\t40958400\t0\t548\nchr10\t40960800\t40969200\t0\t548\nchr10\t40970400\t40972200\t0\t624\nchr10\t40973400\t40984500\t0\t2674\nchr10\t40986000\t40989600\t0\t571\nchr10\t40990800\t40992900\t0\t782\nchr10\t40994100\t40994700\t0\t135\nchr10\t40998600\t41001900\t0\t473\nchr10\t41003100\t41003400\t0\t473\nchr10\t41004600\t41009700\t0\t259\nchr10\t41010900\t41014200\t0\t379\nchr10\t41015400\t41018400\t0\t357\nchr10\t41019900\t41022000\t0\t357\nchr10\t41025300\t41030400\t0\t260\nchr10\t41031600\t41033400\t0\t260\nchr10\t41034900\t41036400\t0\t822\nchr10\t41037600\t41039400\t0.0009\t606\nchr10\t41042100\t41048700\t0\t356\nchr10\t41049900\t41055600\t0\t356\nchr10\t41056800\t41057400\t0\t105\nchr10\t41060100\t41063100\t0\t160\nchr10\t41066400\t41079300\t0\t541\nchr10\t41080800\t41081100\t0.127\t80\nchr10\t41082300\t41084700\t0\t465\nchr10\t41086500\t41090700\t0\t1383\nchr10\t41096400\t41096700\t0\t130\nchr10\t41098500\t41099400\t0\t130\nchr10\t41100600\t41101800\t0\t143\nchr10\t41104500\t41106000\t0.0015\t530\nchr10\t41107500\t41107800\t0\t23\nchr10\t41109300\t41112900\t0\t337\nchr10\t41114700\t41115000\t0\t36\nchr10\t41117400\t41119500\t0\t474\nchr10\t41120700\t41121600\t0\t474\nchr10\t41124300\t41125800\t0\t765\nchr10\t41128200\t41134200\t0\t2057\nchr10\t41135400\t41138100\t0\t410\nchr10\t41139900\t41140500\t0\t410\nchr10\t41143800\t41145600\t0\t506\nchr10\t41148900\t41152800\t0\t248\nchr10\t41154000\t41158800\t0\t435\nchr10\t41160600\t41160900\t0\t29\nchr10\t41162400\t41164800\t0\t286\nchr10\t41166600\t41166900\t0\t180\nchr10\t41169600\t41183400\t0\t517\nchr10\t41185500\t41189100\t0\t882\nchr10\t41190600\t41207700\t0\t882\nchr10\t41209200\t41212500\t0\t268\nchr10\t41214900\t41220000\t0\t188\nchr10\t41221800\t41224200\t0\t114\nchr10\t41225400\t41226900\t0\t66\nchr10\t41228700\t41229300\t0.0051\t68\nchr10\t41231400\t41232600\t0\t468\nchr10\t41235000\t41237700\t0\t437\nchr10\t41239200\t41240700\t0\t114\nchr10\t41243400\t41251200\t0\t437\nchr10\t41255400\t41258700\t0\t111\nchr10\t41260800\t41268900\t0\t1993\nchr10\t41270100\t41273400\t0\t194\nchr10\t41274900\t41293500\t0\t629\nchr10\t41295600\t41296500\t0\t500\nchr10\t41299500\t41301300\t0\t213\nchr10\t41302800\t41306100\t0\t456\nchr10\t41307600\t41312700\t0\t456\nchr10\t41313900\t41314500\t0\t276\nchr10\t41315700\t41316600\t0\t53\nchr10\t41319900\t41323200\t0\t491\nchr10\t41326200\t41327700\t0\t265\nchr10\t41328900\t41336400\t0\t327\nchr10\t41338500\t41342700\t0\t197\nchr10\t41344500\t41356200\t0\t189\nchr10\t41358900\t41361000\t0\t117\nchr10\t41364300\t41368500\t0\t204\nchr10\t41370300\t41374500\t0\t341\nchr10\t41376000\t41378700\t0\t499\nchr10\t41379900\t41384700\t0\t499\nchr10\t41387400\t41391000\t0\t207\nchr10\t41395200\t41395800\t0\t85\nchr10\t41397000\t41397900\t0\t85\nchr10\t41399400\t41407200\t0\t2845\nchr10\t41408400\t41419800\t0\t2845\nchr10\t41422500\t41422800\t0\t539\nchr10\t41424000\t41430900\t0\t539\nchr10\t41432700\t41433000\t0\t539\nchr10\t41436300\t41441400\t0\t990\nchr10\t41442600\t41448300\t0\t990\nchr10\t41449500\t41450400\t0\t73\nchr10\t41454600\t41456700\t0\t310\nchr10\t41460300\t41461800\t0\t275\nchr10\t41466300\t41466900\t0\t89\nchr10\t41468700\t41469000\t0\t89\nchr10\t41470800\t41474400\t0\t285\nchr10\t41475600\t41478300\t0\t285\nchr10\t41481900\t41484000\t0\t495\nchr10\t41488800\t41490000\t0\t78\nchr10\t41493900\t41508300\t0\t567\nchr10\t41509500\t41518800\t0\t567\nchr10\t41520000\t41524500\t0\t567\nchr10\t41525700\t41529000\t0\t579\nchr10\t41530200\t41543700\t0\t579\nchr10\t41544900\t41546100\t0\t98\nchr10\t41547600\t41553900\t0.0249\t142\nchr10\t41556600\t41559900\t0.1901\t194\nchr10\t41562300\t41567400\t0.0067\t741\nchr10\t41569500\t41571900\t0.3029\t288\nchr10\t41573100\t41573700\t0.125\t91\nchr10\t41574900\t41578800\t0.0643\t324\nchr10\t41581500\t41581800\t0.3278\t210\nchr10\t41583600\t41586900\t0.1571\t238\nchr10\t41588100\t41590800\t0.1606\t245\nchr10\t41592000\t41592600\t0.1606\t245\nchr10\t41693700\t41706300\t0\t126\nchr10\t41713500\t41713800\t0.216\t97\nchr10\t41845500\t41845800\t0.3464\t689\nchr10\t41848500\t41848800\t0.3464\t689\nchr10\t41851500\t41852100\t0.4146\t1221\nchr10\t41854500\t41854800\t0.1896\t411\nchr10\t41856900\t41916300\t0.0388\t17851\nchr10\t42066000\t42068100\t0.0398\t1784\nchr10\t42069300\t42069900\t0.0398\t1784\nchr10\t42071100\t42078300\t0.0028\t3747\nchr10\t42080100\t42083100\t0.0028\t3747\nchr10\t42085200\t42086400\t0.0028\t3747\nchr10\t42090600\t42090900\t0.3539\t747\nchr10\t42092400\t42092700\t0.4193\t197\nchr10\t42093900\t42094500\t0.3442\t461\nchr10\t42099600\t42099900\t0.3268\t718\nchr10\t42101400\t42101700\t0.4763\t489\nchr10\t42129900\t42130200\t0.1748\t167\nchr10\t42165900\t42166200\t0.4602\t313\nchr10\t42212400\t42212700\t0.0506\t54\nchr10\t42295200\t42297600\t0.3218\t208\nchr10\t42299100\t42299700\t0.1305\t710\nchr10\t42301500\t42302700\t0.2785\t329\nchr10\t42303900\t42307800\t0.0708\t1830\nchr10\t42309000\t42316200\t0.2574\t332\nchr10\t42318000\t42321000\t0.2499\t378\nchr10\t42436500\t42437100\t0.2156\t71\nchr10\t42448200\t42448800\t0.4002\t79\nchr10\t42530700\t42531000\t0.22\t49\nchr10\t42669900\t42670200\t0.1866\t68\nchr10\t42995100\t42995400\t0.0872\t60\nchr10\t43422600\t43423200\t0.0068\t44\nchr10\t44140800\t44141100\t0.4141\t48\nchr10\t44148000\t44148300\t0.2003\t56\nchr10\t44222400\t44223300\t0\t58\nchr10\t44483100\t44486700\t0.215\t59\nchr10\t44662800\t44663100\t0.4803\t25\nchr10\t45009900\t45011100\t0.0283\t76\nchr10\t45680100\t45680400\t0.0685\t53\nchr10\t45683100\t45683400\t0.0787\t70\nchr10\t45685200\t45687900\t0.0787\t70\nchr10\t45689400\t45690900\t0.0174\t82\nchr10\t45692700\t45693300\t0.0174\t82\nchr10\t45694800\t45696000\t0.0174\t82\nchr10\t45698100\t45699000\t0.0073\t65\nchr10\t45702600\t45703800\t0.1367\t70\nchr10\t45711600\t45711900\t0.1417\t40\nchr10\t45731100\t45731400\t0.3601\t62\nchr10\t45737100\t45737400\t0.0786\t69\nchr10\t45739800\t45740400\t0.2701\t69\nchr10\t45744300\t45746400\t0.2021\t72\nchr10\t45747900\t45748200\t0.1064\t58\nchr10\t45752700\t45753600\t0.1883\t64\nchr10\t45756000\t45757500\t0.1755\t65\nchr10\t45759000\t45760800\t0.0297\t59\nchr10\t45765000\t45768000\t0.0579\t61\nchr10\t45773100\t45779100\t0\t74\nchr10\t45781800\t45782100\t0\t74\nchr10\t45823200\t45823500\t0.1929\t62\nchr10\t45827400\t45830100\t0.0441\t85\nchr10\t45831600\t45834000\t0.0441\t85\nchr10\t45835200\t45837000\t0.0303\t89\nchr10\t45838800\t45839100\t0.0303\t89\nchr10\t45840600\t45841200\t0.0303\t89\nchr10\t45842700\t45843000\t0.0303\t89\nchr10\t45845700\t45846000\t0.1667\t77\nchr10\t45848100\t45848400\t0.1679\t64\nchr10\t45861300\t45861600\t0.2767\t68\nchr10\t45873900\t45874200\t0.1613\t52\nchr10\t45885900\t45886500\t0.0823\t67\nchr10\t45888600\t45889500\t0.2514\t61\nchr10\t45891900\t45892200\t0.2427\t39\nchr10\t45894300\t45895800\t0.1445\t57\nchr10\t45901500\t45904200\t0\t77\nchr10\t45905700\t45906600\t0\t77\nchr10\t45908400\t45908700\t0.0764\t72\nchr10\t45915600\t45915900\t0.3005\t57\nchr10\t45960000\t45960300\t0.0874\t25\nchr10\t45961500\t45961800\t0.0997\t55\nchr10\t45977100\t45977400\t0.4301\t54\nchr10\t45995400\t45995700\t0.1535\t49\nchr10\t46108500\t46110300\t0.0624\t71\nchr10\t46111800\t46112100\t0.0624\t71\nchr10\t46114500\t46115100\t0.0286\t72\nchr10\t46116300\t46116600\t0.1355\t82\nchr10\t46117800\t46118100\t0.1355\t82\nchr10\t46121400\t46124700\t0\t79\nchr10\t46127700\t46131300\t0.0475\t70\nchr10\t46133400\t46133700\t0.0398\t76\nchr10\t46135200\t46137300\t0.0398\t76\nchr10\t46138800\t46145700\t0\t103\nchr10\t46146900\t46150200\t0.0516\t56\nchr10\t46151700\t46153500\t0.0024\t64\nchr10\t46156200\t46156500\t0.0528\t69\nchr10\t46158600\t46159500\t0.0528\t69\nchr10\t46161600\t46161900\t0.1421\t56\nchr10\t46163400\t46163700\t0.1421\t56\nchr10\t46205700\t46215300\t0\t78\nchr10\t46312500\t46312800\t0.2226\t68\nchr10\t46332900\t46334100\t0.0563\t66\nchr10\t46344000\t46345800\t0.1533\t66\nchr10\t46348800\t46352400\t0\t98\nchr10\t46354800\t46355100\t0\t98\nchr10\t46361700\t46362300\t0.0265\t66\nchr10\t46366500\t46366800\t0.271\t61\nchr10\t46368600\t46371300\t0.0126\t81\nchr10\t46376100\t46389300\t0\t100\nchr10\t46391100\t46392900\t0.1385\t66\nchr10\t46398900\t46399200\t0.0137\t68\nchr10\t46400400\t46401000\t0.0137\t68\nchr10\t46402800\t46403400\t0.0969\t51\nchr10\t46405800\t46406400\t0.0236\t48\nchr10\t46411800\t46413000\t0.0321\t68\nchr10\t46416000\t46417200\t0.0398\t60\nchr10\t46418700\t46424100\t0\t100\nchr10\t46428000\t46428900\t0.127\t53\nchr10\t46434300\t46434600\t0.2225\t38\nchr10\t46436100\t46438800\t0.0192\t53\nchr10\t46444500\t46446600\t0.0089\t64\nchr10\t46447800\t46450800\t0\t77\nchr10\t46452600\t46458000\t0\t75\nchr10\t46459500\t46482600\t0\t84\nchr10\t46484400\t46489200\t0\t71\nchr10\t46490700\t46514100\t0\t84\nchr10\t46561500\t46563600\t0.0403\t75\nchr10\t46566000\t46568700\t0.0403\t75\nchr10\t46569900\t46572300\t0.0045\t70\nchr10\t46574400\t46575600\t0.0102\t78\nchr10\t46576800\t46577700\t0.0102\t78\nchr10\t46579200\t46583700\t0\t73\nchr10\t46584900\t46596000\t0\t73\nchr10\t46598100\t46619700\t0\t75\nchr10\t46620900\t46633500\t0\t75\nchr10\t46635000\t46636500\t0.019\t59\nchr10\t46637700\t46638000\t0.019\t59\nchr10\t46643100\t46644600\t0.02\t68\nchr10\t46649100\t46651200\t0.0014\t56\nchr10\t46652400\t46653000\t0.2467\t63\nchr10\t46655700\t46656000\t0.192\t53\nchr10\t46659600\t46661100\t0\t70\nchr10\t46662600\t46664700\t0\t70\nchr10\t46666800\t46667100\t0.2339\t59\nchr10\t46675500\t46675800\t0.1634\t42\nchr10\t46677300\t46680300\t0.0599\t66\nchr10\t46683600\t46683900\t0.1982\t74\nchr10\t46685100\t46686000\t0\t62\nchr10\t46691400\t46692000\t0\t49\nchr10\t46693800\t46694100\t0\t49\nchr10\t46696200\t46707600\t0\t68\nchr10\t46710300\t46712100\t0\t58\nchr10\t46714800\t46716000\t0.1993\t54\nchr10\t46722900\t46723200\t0.2929\t87\nchr10\t46726800\t46727100\t0.2153\t62\nchr10\t46728900\t46733700\t0.0038\t65\nchr10\t46734900\t46739400\t0\t66\nchr10\t46741800\t46742700\t0.0525\t55\nchr10\t46743900\t46744200\t0.3426\t60\nchr10\t46747200\t46748700\t0.0795\t77\nchr10\t46754400\t46757700\t0\t74\nchr10\t46760100\t46760400\t0.0623\t82\nchr10\t46761600\t46761900\t0.0623\t82\nchr10\t46764300\t46764600\t0.0332\t79\nchr10\t46766700\t46767000\t0.1345\t70\nchr10\t46772100\t46772400\t0.2467\t84\nchr10\t46776000\t46777500\t0.1498\t72\nchr10\t46792500\t46792800\t0.1416\t58\nchr10\t46800600\t46800900\t0.1804\t68\nchr10\t46812300\t46813500\t0.2502\t81\nchr10\t46818600\t46818900\t0.267\t76\nchr10\t46821300\t46824300\t0.0053\t70\nchr10\t46827900\t46828800\t0.0012\t76\nchr10\t46830600\t46830900\t0.1294\t45\nchr10\t46832100\t46833000\t0.0579\t62\nchr10\t46834500\t46836000\t0.1656\t105\nchr10\t46837500\t46837800\t0.1656\t105\nchr10\t46839900\t46842300\t0.0393\t85\nchr10\t46843500\t46843800\t0.1331\t64\nchr10\t46845600\t46850100\t0.0007\t88\nchr10\t46851300\t46852200\t0\t76\nchr10\t46853400\t46859700\t0.0013\t82\nchr10\t46863900\t46866300\t0.0408\t70\nchr10\t46867500\t46868100\t0.0408\t70\nchr10\t46869300\t46869600\t0.3149\t61\nchr10\t46872600\t46872900\t0.2446\t67\nchr10\t46879500\t46879800\t0.1798\t72\nchr10\t46881600\t46887000\t0.0026\t72\nchr10\t46889400\t46889700\t0.2397\t63\nchr10\t46895400\t46895700\t0.1415\t65\nchr10\t46899600\t46900500\t0\t51\nchr10\t46901700\t46905600\t0\t83\nchr10\t46907400\t46922700\t0\t83\nchr10\t46924200\t46924800\t0.0282\t68\nchr10\t46926900\t46927200\t0.0428\t69\nchr10\t46928700\t46929300\t0.0428\t69\nchr10\t46930800\t46931400\t0.0428\t69\nchr10\t46932900\t46935600\t0.0478\t70\nchr10\t46938300\t46938900\t0\t68\nchr10\t46940100\t46944600\t0\t68\nchr10\t46945800\t46946400\t0.0177\t60\nchr10\t46949700\t46950000\t0.0119\t85\nchr10\t46951800\t46952100\t0.0652\t58\nchr10\t46955700\t46966800\t0\t82\nchr10\t46968000\t46978500\t0\t82\nchr10\t46980000\t46982100\t0\t82\nchr10\t46984500\t46987800\t0\t73\nchr10\t46989000\t46991700\t0\t65\nchr10\t47407800\t47408100\t0.4509\t69\nchr10\t47461800\t47463000\t0.0635\t75\nchr10\t47466900\t47467200\t0.1602\t75\nchr10\t47468400\t47468700\t0.1602\t75\nchr10\t47470500\t47483100\t0\t116\nchr10\t47487300\t47491500\t0\t80\nchr10\t47493900\t47494800\t0.053\t79\nchr10\t47498700\t47500800\t0.152\t99\nchr10\t47505000\t47505900\t0\t77\nchr10\t47507700\t47509800\t0\t77\nchr10\t47511600\t47512800\t0\t77\nchr10\t47514300\t47521200\t0\t77\nchr10\t47522700\t47523000\t0\t80\nchr10\t47524200\t47525100\t0\t80\nchr10\t47526900\t47527500\t0.0407\t66\nchr10\t47528700\t47547900\t0\t76\nchr10\t47550300\t47550600\t0.2214\t71\nchr10\t47562300\t47564400\t0.079\t67\nchr10\t47567100\t47570100\t0.0268\t54\nchr10\t47573400\t47576400\t0\t65\nchr10\t47577600\t47579700\t0.004\t59\nchr10\t47582700\t47586000\t0\t69\nchr10\t47591700\t47592000\t0.1187\t66\nchr10\t47596200\t47596500\t0.2591\t47\nchr10\t47597700\t47598600\t0.0711\t49\nchr10\t47601000\t47605500\t0\t65\nchr10\t47607000\t47611500\t0\t67\nchr10\t47613300\t47615100\t0\t64\nchr10\t47616300\t47621400\t0\t64\nchr10\t47623500\t47625600\t0\t47\nchr10\t47628900\t47630100\t0\t56\nchr10\t47632800\t47636100\t0\t74\nchr10\t47637600\t47644200\t0\t74\nchr10\t47646300\t47646600\t0.0095\t68\nchr10\t47648700\t47649300\t0.0095\t68\nchr10\t47654400\t47655300\t0.0026\t65\nchr10\t47656500\t47656800\t0.1503\t61\nchr10\t47661000\t47663100\t0.0922\t55\nchr10\t47664600\t47664900\t0.3715\t63\nchr10\t47675100\t47675400\t0.3296\t48\nchr10\t47677500\t47679300\t0\t69\nchr10\t47680800\t47682000\t0.215\t60\nchr10\t47688900\t47689200\t0.3721\t57\nchr10\t47690400\t47690700\t0\t70\nchr10\t47691900\t47692500\t0\t70\nchr10\t47697600\t47698500\t0.0789\t64\nchr10\t47706300\t47706600\t0.0532\t68\nchr10\t47708100\t47709900\t0\t69\nchr10\t47711700\t47715300\t0\t69\nchr10\t47716500\t47719800\t0\t69\nchr10\t47722200\t47723400\t0.0069\t69\nchr10\t47724900\t47726400\t0.0069\t69\nchr10\t47727600\t47732400\t0\t96\nchr10\t47736000\t47736600\t0.0385\t65\nchr10\t47739300\t47742300\t0.0227\t57\nchr10\t47745900\t47747700\t0.0544\t81\nchr10\t47748900\t47749200\t0.0238\t61\nchr10\t47750400\t47754900\t0\t70\nchr10\t47756100\t47762700\t0\t82\nchr10\t47764500\t47764800\t0.0011\t77\nchr10\t47766000\t47767200\t0.0011\t77\nchr10\t47770200\t47771400\t0.0011\t77\nchr10\t47772900\t47775900\t0.0015\t87\nchr10\t47779200\t47780400\t0\t72\nchr10\t47870400\t47894100\t0\t81\nchr10\t47895300\t47895600\t0\t91\nchr10\t47897100\t47929500\t0\t91\nchr10\t47930700\t47936700\t0\t91\nchr10\t47937900\t47938500\t0.0375\t54\nchr10\t47939700\t47940000\t0.2261\t72\nchr10\t47945700\t47946000\t0.0863\t64\nchr10\t47947200\t47948700\t0.1963\t68\nchr10\t47955900\t47956500\t0.1099\t52\nchr10\t47961300\t47966100\t0\t89\nchr10\t47967300\t47967900\t0.0629\t65\nchr10\t47971500\t47973000\t0.0257\t81\nchr10\t47976900\t47977200\t0.074\t64\nchr10\t47978400\t47979000\t0.0155\t58\nchr10\t47981400\t47981700\t0.0235\t48\nchr10\t47983500\t47985000\t0\t58\nchr10\t47987100\t47991300\t0\t80\nchr10\t47993100\t47993400\t0.4311\t46\nchr10\t47996100\t47996700\t0.1188\t59\nchr10\t47999100\t48000600\t0.0029\t68\nchr10\t48002100\t48002400\t0.1506\t63\nchr10\t48006300\t48007200\t0\t89\nchr10\t48008700\t48009300\t0\t89\nchr10\t48011700\t48017700\t0\t89\nchr10\t48019500\t48021300\t0\t89\nchr10\t48022500\t48029100\t0\t89\nchr10\t48030600\t48033300\t0\t89\nchr10\t48034800\t48037800\t0\t89\nchr10\t48039000\t48056400\t0\t77\nchr10\t48058200\t48059100\t0\t77\nchr10\t48060300\t48067500\t0\t77\nchr10\t48069000\t48072000\t0\t78\nchr10\t48073500\t48083700\t0\t81\nchr10\t48084900\t48097500\t0\t81\nchr10\t48098700\t48100200\t0\t81\nchr10\t48101700\t48103500\t0\t81\nchr10\t48105300\t48113700\t0\t60\nchr10\t48114900\t48119100\t0\t60\nchr10\t48120600\t48120900\t0.0044\t59\nchr10\t48122400\t48124800\t0.0044\t59\nchr10\t48127200\t48127800\t0.0689\t57\nchr10\t48129300\t48144600\t0\t83\nchr10\t48146400\t48146700\t0.2095\t70\nchr10\t48147900\t48150000\t0.0049\t84\nchr10\t48151500\t48152100\t0.0058\t43\nchr10\t48155100\t48157800\t0.1764\t58\nchr10\t48162300\t48162600\t0.4661\t68\nchr10\t48164700\t48170100\t0.0128\t81\nchr10\t48171900\t48172200\t0.0128\t81\nchr10\t48179100\t48179400\t0.191\t65\nchr10\t49127100\t49127400\t0.3559\t79\nchr10\t49848300\t49848600\t0.3582\t45\nchr10\t49850100\t49850400\t0.1977\t56\nchr10\t49855200\t49855500\t0.0404\t61\nchr10\t49857900\t49858800\t0.0456\t57\nchr10\t49861200\t49861500\t0.2384\t67\nchr10\t49863300\t49864800\t0.0504\t59\nchr10\t49870800\t49873500\t0\t70\nchr10\t49875000\t49875900\t0.0026\t71\nchr10\t49877400\t49877700\t0.2958\t56\nchr10\t49882800\t49883100\t0.2658\t58\nchr10\t49884600\t49884900\t0.2658\t58\nchr10\t49923900\t49924200\t0.2443\t56\nchr10\t49930800\t49931100\t0.0828\t57\nchr10\t49961700\t49962000\t0.2777\t76\nchr10\t49974000\t49974900\t0.2269\t60\nchr10\t49998000\t50003400\t0\t101\nchr10\t50004600\t50004900\t0.2826\t51\nchr10\t50007300\t50007600\t0.2184\t34\nchr10\t50013600\t50013900\t0.2203\t67\nchr10\t50070600\t50071200\t0.2618\t51\nchr10\t50073600\t50074200\t0.131\t35\nchr10\t50077800\t50078100\t0.0619\t60\nchr10\t50080500\t50081100\t0.1558\t50\nchr10\t50085000\t50087100\t0.1311\t65\nchr10\t50088600\t50088900\t0.1841\t48\nchr10\t50093400\t50093700\t0.1842\t84\nchr10\t50096100\t50097000\t0.0409\t73\nchr10\t50106900\t50108700\t0\t77\nchr10\t50113800\t50115300\t0.0106\t70\nchr10\t50117100\t50119200\t0\t70\nchr10\t50120700\t50121000\t0\t70\nchr10\t50122200\t50122800\t0.0541\t57\nchr10\t50127600\t50127900\t0.3333\t55\nchr10\t50144400\t50144700\t0.1163\t52\nchr10\t50149800\t50150100\t0.3459\t12\nchr10\t50153400\t50153700\t0.2923\t31\nchr10\t50160900\t50161200\t0.1113\t46\nchr10\t50164200\t50164800\t0.0345\t55\nchr10\t50166600\t50166900\t0.2075\t65\nchr10\t50172300\t50172900\t0.0083\t49\nchr10\t50174100\t50174400\t0.2915\t15\nchr10\t50181900\t50184000\t0.0045\t54\nchr10\t50186100\t50193000\t0\t77\nchr10\t50707200\t50710200\t0.0217\t73\nchr10\t50745000\t50745600\t0.0951\t58\nchr10\t50749200\t50755500\t0\t72\nchr10\t50758200\t50758500\t0.0236\t61\nchr10\t50759700\t50760000\t0.0236\t61\nchr10\t50773500\t50773800\t0.1026\t45\nchr10\t50779200\t50779500\t0.2049\t77\nchr10\t51512400\t51514200\t0.1026\t74\nchr10\t52181700\t52182600\t0.0267\t64\nchr10\t52234800\t52239300\t0.0148\t74\nchr10\t53495700\t53497500\t0.1425\t93\nchr10\t53761800\t53762400\t0.2137\t31\nchr10\t54027000\t54027300\t0.2289\t83\nchr10\t54622500\t54622800\t0.2745\t39\nchr10\t54735600\t54735900\t0.074\t26\nchr10\t54757200\t54757500\t0.285\t49\nchr10\t54825300\t54825600\t0.1868\t87\nchr10\t55069500\t55069800\t0.1996\t89\nchr10\t55542600\t55543200\t0.2313\t45\nchr10\t55604100\t55604400\t0.3901\t82\nchr10\t55605600\t55606200\t0.1627\t84\nchr10\t55607400\t55607700\t0.1627\t84\nchr10\t55683600\t55683900\t0.1379\t65\nchr10\t55686000\t55688100\t0.1379\t65\nchr10\t55942200\t55942500\t0.3104\t41\nchr10\t56188200\t56188500\t0.334\t92\nchr10\t56191200\t56191500\t0.3125\t66\nchr10\t56709600\t56709900\t0.1662\t63\nchr10\t58319400\t58319700\t0.3025\t439\nchr10\t58654200\t58655700\t0.0362\t58\nchr10\t59783700\t59784000\t0.3956\t46\nchr10\t59882100\t59882400\t0.364\t25\nchr10\t60180300\t60180600\t0.0413\t1226\nchr10\t60640500\t60640800\t0.4014\t87\nchr10\t60694800\t60695100\t0.3345\t63\nchr10\t61056900\t61057200\t0.1837\t108\nchr10\t61680300\t61680600\t0.1067\t12\nchr10\t62604000\t62604300\t0.1556\t59\nchr10\t62606100\t62607600\t0.2134\t76\nchr10\t62677500\t62677800\t0.1159\t41\nchr10\t64123500\t64123800\t0.2689\t75\nchr10\t64371900\t64372200\t0.2402\t65\nchr10\t64836300\t64836600\t0.186\t61\nchr10\t64925400\t64926600\t0.1022\t70\nchr10\t64929000\t64929300\t0.0592\t79\nchr10\t65391900\t65392200\t0.3999\t36\nchr10\t65524200\t65524500\t0.4668\t21\nchr10\t67233300\t67233900\t0.1944\t97\nchr10\t67388100\t67388700\t0.1988\t77\nchr10\t67390500\t67390800\t0.2071\t95\nchr10\t67561200\t67561500\t0.2682\t53\nchr10\t67565400\t67565700\t0.2993\t46\nchr10\t67582200\t67582500\t0.2308\t89\nchr10\t67692300\t67692600\t0.0638\t69\nchr10\t69992400\t69993900\t0.0011\t114\nchr10\t70686300\t70688700\t0.0127\t103\nchr10\t73326300\t73326600\t0.3161\t74\nchr10\t73674000\t73674300\t0.2573\t53\nchr10\t73680000\t73681200\t0\t78\nchr10\t73683000\t73685400\t0\t78\nchr10\t75480000\t75480300\t0.2357\t52\nchr10\t76221000\t76221300\t0.4034\t51\nchr10\t76587000\t76591800\t0\t91\nchr10\t76819200\t76819500\t0.2842\t44\nchr10\t76832700\t76833000\t0.2872\t35\nchr10\t77041200\t77041500\t0.1875\t23\nchr10\t77568900\t77569500\t0.2109\t81\nchr10\t78089100\t78094200\t0\t85\nchr10\t79332600\t79332900\t0.0906\t81\nchr10\t79338300\t79338600\t0.1724\t77\nchr10\t79504200\t79504800\t0.2228\t69\nchr10\t79508400\t79509900\t0.2018\t62\nchr10\t79519500\t79520100\t0.0108\t63\nchr10\t79524000\t79524300\t0.2115\t50\nchr10\t79536300\t79536600\t0.2277\t70\nchr10\t79673100\t79673400\t0.3082\t54\nchr10\t79676700\t79677000\t0.0711\t43\nchr10\t79696800\t79697400\t0.2473\t68\nchr10\t79701600\t79703700\t0\t93\nchr10\t79706400\t79706700\t0\t93\nchr10\t79707900\t79708500\t0.0262\t97\nchr10\t79709700\t79710300\t0.0813\t103\nchr10\t79713000\t79714800\t0\t100\nchr10\t79716900\t79718100\t0.0751\t69\nchr10\t79741800\t79742100\t0.0661\t63\nchr10\t79743300\t79743600\t0.1402\t47\nchr10\t79770300\t79771800\t0.0149\t77\nchr10\t79774800\t79775100\t0.0376\t73\nchr10\t79777800\t79778100\t0.1135\t54\nchr10\t79780200\t79782600\t0.09\t66\nchr10\t79794600\t79794900\t0.1117\t54\nchr10\t79797600\t79797900\t0.1138\t42\nchr10\t79801200\t79801500\t0.2008\t34\nchr10\t79812000\t79812300\t0.1822\t50\nchr10\t79814100\t79814400\t0.0701\t61\nchr10\t79821000\t79821300\t0.1626\t57\nchr10\t79835400\t79835700\t0.2406\t63\nchr10\t79841100\t79852800\t0\t102\nchr10\t79874700\t79875000\t0.2311\t64\nchr10\t79965600\t79967400\t0.0689\t105\nchr10\t80022300\t80022600\t0.1799\t64\nchr10\t80025600\t80025900\t0.3292\t54\nchr10\t80038200\t80038500\t0.3008\t79\nchr10\t80240400\t80241000\t0.014\t74\nchr10\t80250600\t80250900\t0.3234\t53\nchr10\t80254800\t80255400\t0.1454\t69\nchr10\t80535000\t80535300\t0.2689\t99\nchr10\t80722800\t80724300\t0.0092\t69\nchr10\t80725800\t80726100\t0.2684\t73\nchr10\t81711300\t81714900\t0.0058\t78\nchr10\t81770700\t81771000\t0.1929\t68\nchr10\t82045200\t82045500\t0.0438\t16\nchr10\t82046700\t82047000\t0.3917\t37\nchr10\t82478400\t82478700\t0.3301\t61\nchr10\t83781600\t83782200\t0.0662\t73\nchr10\t83784900\t83785200\t0.0662\t73\nchr10\t84071100\t84071400\t0.0542\t69\nchr10\t84282000\t84282600\t0.0289\t82\nchr10\t84283800\t84285000\t0.0289\t82\nchr10\t84759600\t84760800\t0.1431\t69\nchr10\t84773400\t84775200\t0.0719\t88\nchr10\t84858300\t84859200\t0.1554\t84\nchr10\t85207200\t85207500\t0.3667\t50\nchr10\t85355700\t85361400\t0\t83\nchr10\t85744500\t85745400\t0.0079\t77\nchr10\t86075100\t86075400\t0.1788\t77\nchr10\t86076900\t86077200\t0.1966\t64\nchr10\t87198300\t87198600\t0.2043\t41\nchr10\t87219000\t87221100\t0.2363\t70\nchr10\t87224100\t87234300\t0\t77\nchr10\t87235500\t87236700\t0\t77\nchr10\t87239100\t87240300\t0.0634\t58\nchr10\t87246900\t87247200\t0\t52\nchr10\t87249300\t87250500\t0\t52\nchr10\t87252600\t87252900\t0.2953\t57\nchr10\t87254100\t87256800\t0.0095\t69\nchr10\t87262800\t87263100\t0\t66\nchr10\t87264300\t87267000\t0\t66\nchr10\t87270000\t87276600\t0\t94\nchr10\t87277800\t87290700\t0\t94\nchr10\t87291900\t87303900\t0\t94\nchr10\t87305100\t87307500\t0\t94\nchr10\t87316800\t87317100\t0.0401\t62\nchr10\t87326400\t87326700\t0.1801\t46\nchr10\t87351900\t87352200\t0.1229\t67\nchr10\t87356100\t87356400\t0.4406\t24\nchr10\t87357600\t87360600\t0\t83\nchr10\t87362100\t87365700\t0\t87\nchr10\t87366900\t87369300\t0\t87\nchr10\t87390900\t87391200\t0.3894\t64\nchr10\t87406200\t87406500\t0.3241\t50\nchr10\t87430500\t87436800\t0\t73\nchr10\t87438600\t87439800\t0\t84\nchr10\t87441300\t87445800\t0\t84\nchr10\t87447000\t87465600\t0\t84\nchr10\t87467100\t87467700\t0.0074\t75\nchr10\t87471000\t87471300\t0\t74\nchr10\t87472500\t87475500\t0\t74\nchr10\t87481200\t87483600\t0.0033\t75\nchr10\t87488400\t87489300\t0.2809\t85\nchr10\t88977600\t88978200\t0.0107\t87\nchr10\t90155700\t90156000\t0.2163\t65\nchr10\t91440600\t91443300\t0\t71\nchr10\t91446300\t91449000\t0\t69\nchr10\t91507800\t91508400\t0.2675\t82\nchr10\t91752300\t91752600\t0.0854\t70\nchr10\t92140500\t92141100\t0.0016\t73\nchr10\t92375100\t92377800\t0\t108\nchr10\t92673900\t92676000\t0.0133\t64\nchr10\t93931500\t93931800\t0.1379\t68\nchr10\t94816800\t94817100\t0.1191\t80\nchr10\t94819200\t94820100\t0.1191\t80\nchr10\t94825500\t94825800\t0.1081\t81\nchr10\t95151600\t95151900\t0.2061\t66\nchr10\t95948400\t95949600\t0\t71\nchr10\t96940500\t96942300\t0.0897\t112\nchr10\t97275000\t97277700\t0\t67\nchr10\t97348500\t97348800\t0.3056\t44\nchr10\t97432800\t97433100\t0.2011\t68\nchr10\t98697900\t98698200\t0.1378\t98\nchr10\t98700600\t98701200\t0.0443\t48\nchr10\t98781900\t98788200\t0\t85\nchr10\t98961000\t98962200\t0.0242\t61\nchr10\t98988600\t98988900\t0.0926\t70\nchr10\t99154200\t99158400\t0.0367\t78\nchr10\t99771600\t99773400\t0\t84\nchr10\t99823800\t99824100\t0.1567\t95\nchr10\t99837300\t99840600\t0.0049\t80\nchr10\t100092300\t100094400\t0.0109\t57\nchr10\t100422600\t100422900\t0.0078\t59\nchr10\t100425900\t100426500\t0.1282\t59\nchr10\t100703100\t100703400\t0.1304\t102\nchr10\t103128300\t103128900\t0.0436\t64\nchr10\t103251000\t103251300\t0.4739\t149\nchr10\t104528700\t104529600\t0.2325\t88\nchr10\t104785200\t104785500\t0.1876\t43\nchr10\t104859900\t104860200\t0.015\t35\nchr10\t105311700\t105312000\t0.2927\t75\nchr10\t105377400\t105383100\t0\t76\nchr10\t105740400\t105740700\t0.2685\t54\nchr10\t105775800\t105781200\t0\t76\nchr10\t106845300\t106848900\t0.0057\t74\nchr10\t107465100\t107467200\t0.0714\t56\nchr10\t108114600\t108119700\t0.0128\t89\nchr10\t108310200\t108315000\t0\t73\nchr10\t108572700\t108573000\t0.0237\t89\nchr10\t109086600\t109086900\t0.1666\t52\nchr10\t109241700\t109242900\t0.0663\t75\nchr10\t109812300\t109818300\t0\t435\nchr10\t109827300\t109827600\t0.2037\t68\nchr10\t109829100\t109830900\t0.0733\t80\nchr10\t110766600\t110766900\t0.2407\t76\nchr10\t111431700\t111432000\t0.3058\t19\nchr10\t111584700\t111589800\t0\t68\nchr10\t111792600\t111792900\t0.1615\t71\nchr10\t111797400\t111797700\t0.0628\t91\nchr10\t111814800\t111815400\t0.0526\t96\nchr10\t111817800\t111818100\t0.2522\t86\nchr10\t112063500\t112063800\t0.2657\t70\nchr10\t112066500\t112067400\t0.0027\t120\nchr10\t112106700\t112107000\t0.1604\t74\nchr10\t112204800\t112206600\t0.0037\t75\nchr10\t112398000\t112398300\t0.2865\t16\nchr10\t112455300\t112455600\t0.4737\t11\nchr10\t114415200\t114415500\t0.2739\t92\nchr10\t114935100\t114935700\t0.1033\t99\nchr10\t114998400\t114998700\t0.074\t20\nchr10\t115200600\t115200900\t0.1274\t67\nchr10\t115202700\t115203000\t0.1519\t75\nchr10\t115246500\t115246800\t0.3309\t21\nchr10\t115362900\t115364400\t0.136\t97\nchr10\t115367100\t115367400\t0.1015\t48\nchr10\t116505900\t116506200\t0.308\t20\nchr10\t117079200\t117081600\t0.0051\t77\nchr10\t117833100\t117838500\t0.0563\t100\nchr10\t117874800\t117875100\t0.1025\t19\nchr10\t118181400\t118181700\t0.4515\t156\nchr10\t119722800\t119723100\t0.3157\t78\nchr10\t120214800\t120215100\t0.2672\t44\nchr10\t120234900\t120235800\t0.0507\t75\nchr10\t120237300\t120239400\t0.0507\t75\nchr10\t120354900\t120355200\t0.2711\t74\nchr10\t120913800\t120915300\t0.1701\t73\nchr10\t120920100\t120921900\t0.0064\t76\nchr10\t121584600\t121584900\t0.4983\t41\nchr10\t122202300\t122202600\t0.1614\t69\nchr10\t122581800\t122584500\t0\t78\nchr10\t122594400\t122597100\t0\t74\nchr10\t122601000\t122616900\t0\t50\nchr10\t122681700\t122682000\t0.1662\t61\nchr10\t122807400\t122807700\t0.2207\t61\nchr10\t123292500\t123293400\t0.0889\t65\nchr10\t124507200\t124507500\t0.4709\t32\nchr10\t125228100\t125228400\t0.4632\t39\nchr10\t125616300\t125616900\t0.0698\t90\nchr10\t125948700\t125949000\t0.281\t77\nchr10\t126056700\t126057000\t0.1579\t53\nchr10\t126417900\t126418200\t0.1469\t16\nchr10\t126672600\t126672900\t0.1737\t96\nchr10\t126678600\t126679200\t0.0498\t101\nchr10\t126680400\t126682200\t0.0498\t101\nchr10\t126884400\t126884700\t0.1854\t79\nchr10\t126885900\t126886200\t0.1854\t79\nchr10\t126947400\t126948600\t0.1753\t826\nchr10\t129414600\t129414900\t0.3696\t110\nchr10\t129735600\t129736200\t0.0759\t79\nchr10\t130051800\t130052100\t0.2618\t19\nchr10\t130314300\t130314600\t0.2845\t104\nchr10\t130316400\t130316700\t0.049\t82\nchr10\t130518900\t130519200\t0.3918\t52\nchr10\t130572300\t130572900\t0.2549\t98\nchr10\t130650900\t130651200\t0.061\t74\nchr10\t130759500\t130760700\t0\t38\nchr10\t130785600\t130785900\t0.3364\t38\nchr10\t131042100\t131042400\t0.1692\t15\nchr10\t131289600\t131289900\t0.3103\t37\nchr10\t131376900\t131377200\t0.0746\t54\nchr10\t131592600\t131601600\t0\t36\nchr10\t131625900\t131626200\t0.2329\t34\nchr10\t131704800\t131706000\t0.0515\t61\nchr10\t131939100\t131939400\t0.2061\t43\nchr10\t132158700\t132159000\t0.147\t78\nchr10\t132160200\t132160800\t0.4293\t20\nchr10\t132505800\t132506100\t0.4496\t13\nchr10\t132622200\t132622800\t0\t118\nchr10\t132874500\t132874800\t0.3474\t57\nchr10\t132914100\t132914400\t0.128\t20\nchr10\t132999300\t132999600\t0.3115\t92\nchr10\t133111200\t133111800\t0.2972\t133\nchr10\t133155600\t133156200\t0.3411\t84\nchr10\t133403100\t133403400\t0.2986\t49\nchr10\t133424400\t133427700\t0\t75\nchr10\t133430400\t133430700\t0.1626\t60\nchr10\t133433100\t133435500\t0\t72\nchr10\t133441200\t133441500\t0.3754\t62\nchr10\t133477800\t133480200\t0\t54\nchr10\t133503600\t133506000\t0.0796\t64\nchr10\t133569300\t133571100\t0\t79\nchr10\t133575000\t133579500\t0\t77\nchr10\t133623000\t133628400\t0.0214\t89\nchr10\t133629900\t133630800\t0.0995\t56\nchr10\t133637400\t133638000\t0.1837\t73\nchr10\t133640700\t133641300\t0.0151\t46\nchr10\t133651800\t133652400\t0.158\t88\nchr10\t133653900\t133655400\t0.0849\t69\nchr10\t133656600\t133656900\t0.2031\t80\nchr10\t133664400\t133690500\t0\t15197\nchr10\t133740600\t133764300\t0\t3268\nchr10\t133766700\t133785300\t0\t145\nchr11\t60000\t122700\t0\t117\nchr11\t124200\t146700\t0\t117\nchr11\t148200\t174600\t0\t87\nchr11\t176400\t177600\t0\t66\nchr11\t178800\t185100\t0.0118\t58\nchr11\t188700\t191700\t0\t88\nchr11\t193200\t196500\t0\t88\nchr11\t310800\t311400\t0.0133\t57\nchr11\t318300\t318900\t0.1034\t55\nchr11\t321300\t322500\t0.269\t86\nchr11\t374700\t375000\t0.2425\t46\nchr11\t384900\t385500\t0\t86\nchr11\t390600\t390900\t0.0787\t26\nchr11\t483000\t483300\t0.2595\t44\nchr11\t519300\t520200\t0\t174\nchr11\t530400\t531000\t0.3767\t119\nchr11\t585300\t585900\t0.0569\t988\nchr11\t664500\t665100\t0.0223\t94\nchr11\t735000\t736200\t0.1133\t61\nchr11\t881400\t881700\t0.4864\t54\nchr11\t964800\t965400\t0.0303\t307\nchr11\t980100\t980400\t0.0302\t83\nchr11\t1078800\t1081500\t0.1681\t45\nchr11\t1096800\t1098900\t0.418\t88\nchr11\t1166700\t1167000\t0.439\t51\nchr11\t1412100\t1412400\t0.0186\t10\nchr11\t1429500\t1433100\t0\t78\nchr11\t1510200\t1510500\t0.372\t48\nchr11\t1663800\t1665300\t0.1095\t71\nchr11\t1666500\t1667100\t0\t50\nchr11\t1683600\t1683900\t0.1836\t56\nchr11\t1686000\t1687800\t0.0614\t59\nchr11\t1945200\t1950900\t0\t47\nchr11\t1952100\t1953000\t0\t47\nchr11\t1954800\t1978800\t0\t51\nchr11\t1980000\t2043000\t0\t51\nchr11\t2332200\t2332500\t0.1201\t68\nchr11\t3248400\t3248700\t0.3551\t27\nchr11\t3252600\t3256800\t0\t51\nchr11\t3258600\t3261900\t0\t44\nchr11\t3263100\t3270900\t0\t41\nchr11\t3272100\t3281100\t0\t41\nchr11\t3282300\t3282900\t0\t44\nchr11\t3284100\t3293100\t0\t44\nchr11\t3294300\t3294600\t0\t25\nchr11\t3297600\t3327000\t0\t44\nchr11\t3328200\t3335400\t0\t44\nchr11\t3336600\t3337800\t0\t44\nchr11\t3653700\t3654900\t0.0399\t2367\nchr11\t4001700\t4003500\t0.2065\t84\nchr11\t4171500\t4172400\t0.07\t67\nchr11\t4173600\t4174800\t0.1246\t68\nchr11\t4223400\t4223700\t0.1893\t69\nchr11\t4230000\t4230600\t0.1257\t63\nchr11\t4245000\t4245900\t0\t63\nchr11\t4256400\t4256700\t0.0308\t60\nchr11\t4263000\t4263300\t0.1839\t40\nchr11\t4268400\t4274100\t0\t84\nchr11\t4276800\t4277100\t0.256\t27\nchr11\t4278300\t4279500\t0\t80\nchr11\t4280700\t4284600\t0\t80\nchr11\t4287300\t4298400\t0\t103\nchr11\t4299900\t4300200\t0.1421\t50\nchr11\t4303500\t4303800\t0.1486\t51\nchr11\t4310700\t4311000\t0.3006\t64\nchr11\t4320000\t4320300\t0.1191\t50\nchr11\t4326600\t4327500\t0.1304\t63\nchr11\t4333500\t4336500\t0\t75\nchr11\t4338600\t4338900\t0.2284\t68\nchr11\t4341300\t4342800\t0\t89\nchr11\t4349100\t4349400\t0.3288\t70\nchr11\t4353000\t4353300\t0.3868\t57\nchr11\t4354800\t4355100\t0.0906\t57\nchr11\t4357500\t4357800\t0.3205\t56\nchr11\t4360200\t4361700\t0.274\t59\nchr11\t4620300\t4620900\t0.0321\t50\nchr11\t4781400\t4781700\t0.3647\t43\nchr11\t4935900\t4936200\t0.1918\t47\nchr11\t5249400\t5250000\t0.0181\t61\nchr11\t5254500\t5254800\t0.175\t66\nchr11\t5415900\t5416200\t0.3261\t60\nchr11\t5481000\t5483100\t0.0179\t71\nchr11\t6186000\t6191100\t0.1372\t79\nchr11\t7179000\t7179900\t0.282\t78\nchr11\t7233600\t7234200\t0.142\t62\nchr11\t7325100\t7327800\t0\t90\nchr11\t7359000\t7359600\t0.0143\t68\nchr11\t7658400\t7659000\t0.0386\t64\nchr11\t7719600\t7720200\t0.0841\t52\nchr11\t7737900\t7740300\t0.0654\t45\nchr11\t7768800\t7769100\t0.0363\t43\nchr11\t7865700\t7866300\t0.263\t76\nchr11\t8142600\t8142900\t0.3176\t69\nchr11\t8977500\t8979600\t0.1116\t155\nchr11\t9542100\t9542400\t0.2104\t79\nchr11\t9544200\t9544500\t0.2104\t79\nchr11\t9705900\t9706200\t0.308\t92\nchr11\t10391400\t10392000\t0.001\t72\nchr11\t12640800\t12641100\t0.4463\t28\nchr11\t12719700\t12720000\t0.2036\t168\nchr11\t13544400\t13544700\t0\t16\nchr11\t13794900\t13795500\t0.0568\t89\nchr11\t13867200\t13867500\t0.1499\t49\nchr11\t14628600\t14628900\t0.3478\t50\nchr11\t14631900\t14632200\t0.2629\t83\nchr11\t14716500\t14721000\t0\t70\nchr11\t14847900\t14848500\t0.2086\t75\nchr11\t14963400\t14963700\t0.2432\t74\nchr11\t15270600\t15270900\t0.1586\t71\nchr11\t16515600\t16515900\t0.1735\t53\nchr11\t16720200\t16720500\t0.1373\t74\nchr11\t16907700\t16908000\t0.1276\t108\nchr11\t17028600\t17029800\t0.0379\t63\nchr11\t17342400\t17342700\t0.1627\t78\nchr11\t18247500\t18247800\t0.2735\t78\nchr11\t18266400\t18267600\t0.3147\t79\nchr11\t18920400\t18921900\t0\t70\nchr11\t18942600\t18944100\t0\t75\nchr11\t19139700\t19140000\t0.2261\t74\nchr11\t20548800\t20549400\t0.0767\t60\nchr11\t20895000\t20895300\t0.3659\t55\nchr11\t22016100\t22020900\t0.0216\t92\nchr11\t22287300\t22288800\t0.1023\t92\nchr11\t22523400\t22523700\t0.0432\t37\nchr11\t22528200\t22528500\t0.2995\t60\nchr11\t22910100\t22911000\t0.0685\t69\nchr11\t23176500\t23178300\t0.1303\t52\nchr11\t23193900\t23194200\t0.2034\t44\nchr11\t23298300\t23299800\t0.0131\t72\nchr11\t23301000\t23303400\t0.0131\t72\nchr11\t23316600\t23317500\t0.2057\t54\nchr11\t23433900\t23434200\t0.1698\t49\nchr11\t23791500\t23791800\t0.4314\t64\nchr11\t24169800\t24170100\t0.218\t79\nchr11\t24327900\t24333900\t0\t83\nchr11\t24387600\t24389400\t0.0042\t50\nchr11\t25143300\t25143600\t0.2915\t94\nchr11\t25425900\t25426500\t0.0299\t34\nchr11\t25428900\t25429200\t0\t51\nchr11\t25635300\t25635600\t0.2588\t83\nchr11\t25647000\t25647300\t0.2504\t57\nchr11\t26115900\t26116200\t0.3561\t71\nchr11\t26968800\t26970900\t0\t88\nchr11\t27221400\t27224100\t0.0691\t98\nchr11\t28029900\t28030200\t0.0713\t69\nchr11\t28205700\t28207200\t0.0925\t51\nchr11\t28429500\t28429800\t0.1819\t22\nchr11\t28431300\t28431600\t0.3258\t44\nchr11\t29154600\t29156400\t0\t71\nchr11\t29417700\t29418000\t0.2312\t56\nchr11\t29648400\t29648700\t0.4018\t55\nchr11\t29743800\t29744100\t0.2535\t45\nchr11\t30965700\t30967200\t0\t78\nchr11\t31316400\t31321500\t0\t83\nchr11\t32942100\t32942400\t0.1152\t47\nchr11\t32944800\t32945100\t0.2203\t79\nchr11\t33626400\t33627300\t0.0226\t76\nchr11\t33628500\t33628800\t0.4506\t36\nchr11\t34687200\t34690200\t0.1763\t89\nchr11\t34760700\t34761000\t0.0272\t88\nchr11\t35053800\t35054100\t0.1557\t59\nchr11\t35396100\t35396700\t0.088\t88\nchr11\t35578800\t35579100\t0.2338\t77\nchr11\t35698500\t35698800\t0.1344\t52\nchr11\t35707800\t35708100\t0.14\t61\nchr11\t36287100\t36287400\t0.1288\t29\nchr11\t36309900\t36310200\t0.4052\t184\nchr11\t36481800\t36482400\t0.0038\t60\nchr11\t36552000\t36557400\t0\t113\nchr11\t36615000\t36615600\t0.0734\t74\nchr11\t36894000\t36894600\t0.1697\t51\nchr11\t37242900\t37243200\t0.2128\t69\nchr11\t37347900\t37348200\t0.4263\t36\nchr11\t38232900\t38233200\t0.1539\t67\nchr11\t38739000\t38739300\t0.1605\t41\nchr11\t39001200\t39001500\t0.3546\t43\nchr11\t39047400\t39048000\t0.1044\t42\nchr11\t40260000\t40260300\t0.2379\t36\nchr11\t40587300\t40587600\t0.2644\t92\nchr11\t40948500\t40948800\t0.2896\t48\nchr11\t41303400\t41303700\t0.2773\t73\nchr11\t41305500\t41305800\t0.2773\t73\nchr11\t41695800\t41696100\t0.2023\t62\nchr11\t42156600\t42156900\t0.2448\t62\nchr11\t42215100\t42216600\t0.0064\t68\nchr11\t42431400\t42432000\t0.0258\t76\nchr11\t42442500\t42442800\t0.417\t24\nchr11\t42459900\t42460200\t0.358\t40\nchr11\t42680400\t42680700\t0.2641\t69\nchr11\t42791700\t42792300\t0.0353\t71\nchr11\t42798000\t42798300\t0.0136\t51\nchr11\t42952200\t42954300\t0.2313\t99\nchr11\t43346400\t43351500\t0.0133\t118\nchr11\t43778400\t43778700\t0.2841\t103\nchr11\t44663700\t44664600\t0.288\t79\nchr11\t45101700\t45102300\t0.0428\t65\nchr11\t45123900\t45124200\t0.2446\t71\nchr11\t45737700\t45739200\t0.1596\t91\nchr11\t46573800\t46574400\t0.1301\t74\nchr11\t46584000\t46584300\t0.1607\t52\nchr11\t47097300\t47098200\t0.0115\t61\nchr11\t48295500\t48295800\t0.2352\t43\nchr11\t48302100\t48302400\t0.2362\t67\nchr11\t48392700\t48393600\t0.2938\t55\nchr11\t48771900\t48772200\t0.2728\t73\nchr11\t48847800\t48852900\t0\t76\nchr11\t48854100\t48854400\t0.1964\t51\nchr11\t48859500\t48859800\t0.1468\t11\nchr11\t48880500\t48888300\t0\t76\nchr11\t48892200\t48899700\t0\t78\nchr11\t48927300\t48927600\t0.3892\t23\nchr11\t48944100\t48944400\t0.1148\t44\nchr11\t49104300\t49105800\t0\t74\nchr11\t49713900\t49714500\t0.0042\t66\nchr11\t49728600\t49729200\t0\t68\nchr11\t49775400\t49776000\t0.258\t64\nchr11\t49778400\t49780800\t0.1274\t89\nchr11\t49792500\t49797600\t0\t79\nchr11\t50114100\t50134800\t0\t73\nchr11\t50180100\t50180400\t0.3105\t76\nchr11\t50343900\t50364300\t0\t81\nchr11\t50588400\t50589000\t0.1506\t53\nchr11\t51078600\t51090000\t0\t31\nchr11\t51091500\t51430200\t0\t1145\nchr11\t51431400\t51830100\t0\t1145\nchr11\t51831600\t52020900\t0\t1145\nchr11\t52022700\t52128000\t0\t1145\nchr11\t52129500\t52303500\t0\t666\nchr11\t52304700\t52599600\t0\t595\nchr11\t52601100\t52632300\t0\t595\nchr11\t52633500\t52652100\t0\t595\nchr11\t52653300\t52701300\t0\t595\nchr11\t52703100\t52707000\t0\t1026\nchr11\t52708200\t53015400\t0\t1026\nchr11\t53016600\t53097000\t0\t1026\nchr11\t53098200\t53107500\t0\t1026\nchr11\t53108700\t53215500\t0\t1802\nchr11\t53216700\t53240400\t0\t1107\nchr11\t53241600\t53283300\t0\t1107\nchr11\t53284500\t53470200\t0\t1107\nchr11\t53471700\t53504400\t0\t1107\nchr11\t53505600\t53507100\t0\t1107\nchr11\t53508600\t53518200\t0\t1107\nchr11\t53519400\t53639700\t0\t1107\nchr11\t53640900\t53716200\t0\t1107\nchr11\t53717400\t53798400\t0\t1107\nchr11\t53799600\t53818200\t0\t1107\nchr11\t53820300\t53840400\t0\t207\nchr11\t53842200\t53948100\t0\t663\nchr11\t53949300\t54084000\t0\t663\nchr11\t54086100\t54097800\t0\t663\nchr11\t54099300\t54177300\t0\t729\nchr11\t54178500\t54326100\t0\t729\nchr11\t54327300\t54343200\t0\t729\nchr11\t54345900\t54346200\t0.2207\t94\nchr11\t54348900\t54350700\t0.0624\t91\nchr11\t54352200\t54353700\t0.0235\t68\nchr11\t54355500\t54356100\t0.0308\t78\nchr11\t54357600\t54360000\t0.0308\t78\nchr11\t54361800\t54368100\t0.0264\t133\nchr11\t54371700\t54372600\t0.0303\t132\nchr11\t54376200\t54377700\t0.1802\t60\nchr11\t54379500\t54380700\t0.3072\t133\nchr11\t54382200\t54383400\t0\t120\nchr11\t54386700\t54387000\t0.4972\t62\nchr11\t54388800\t54393900\t0.0029\t162\nchr11\t54395100\t54395400\t0.3763\t63\nchr11\t54399300\t54405300\t0\t127\nchr11\t54406500\t54406800\t0.2383\t51\nchr11\t54408300\t54408600\t0.2383\t51\nchr11\t54409800\t54410400\t0.0893\t57\nchr11\t54411600\t54414000\t0.0098\t226\nchr11\t54415800\t54425100\t0.0098\t226\nchr11\t54526500\t54526800\t0.2655\t31\nchr11\t54528000\t54537000\t0\t187\nchr11\t54541800\t54542100\t0.008\t50\nchr11\t54545400\t54546900\t0.0128\t68\nchr11\t54549900\t54550200\t0.0942\t34\nchr11\t55477200\t55477500\t0.1747\t73\nchr11\t55686900\t55687200\t0.0631\t45\nchr11\t55689600\t55689900\t0.0631\t45\nchr11\t55991700\t55992000\t0.3207\t162\nchr11\t56913000\t56913300\t0.1677\t50\nchr11\t56965800\t56966100\t0.3254\t63\nchr11\t57995700\t57997800\t0.0851\t85\nchr11\t58010400\t58010700\t0.3213\t43\nchr11\t58048800\t58052400\t0\t63\nchr11\t58697100\t58697400\t0.2865\t73\nchr11\t60048600\t60049500\t0.0007\t81\nchr11\t60051300\t60051600\t0.0007\t81\nchr11\t60438900\t60441000\t0.0161\t85\nchr11\t60474000\t60474300\t0.1831\t62\nchr11\t60532800\t60539100\t0.0012\t76\nchr11\t60603600\t60603900\t0.2637\t88\nchr11\t61084500\t61086300\t0\t83\nchr11\t61203900\t61204200\t0.2692\t46\nchr11\t61205700\t61246200\t0\t58\nchr11\t61340400\t61340700\t0.3085\t29\nchr11\t62096400\t62099400\t0\t64\nchr11\t62277900\t62280300\t0\t58\nchr11\t62384700\t62385000\t0.3299\t46\nchr11\t64161900\t64162200\t0.4434\t62\nchr11\t64170900\t64173300\t0.0477\t125\nchr11\t65239800\t65240100\t0.2513\t54\nchr11\t65678700\t65679300\t0.3988\t154\nchr11\t65970900\t65971500\t0.403\t73\nchr11\t66093300\t66094500\t0.2271\t101\nchr11\t66460200\t66460500\t0.2281\t18\nchr11\t66588600\t66588900\t0.2478\t64\nchr11\t67222200\t67222800\t0.0016\t70\nchr11\t67603500\t67604100\t0.0413\t90\nchr11\t67868100\t67868700\t0.0194\t70\nchr11\t68892300\t68892600\t0.0738\t30\nchr11\t69068400\t69069600\t0.0596\t127\nchr11\t70341000\t70341300\t0.2109\t50\nchr11\t71569500\t71569800\t0.3148\t80\nchr11\t71578800\t71579100\t0.066\t59\nchr11\t72150600\t72150900\t0.2535\t21\nchr11\t72164700\t72165300\t0.3345\t73\nchr11\t73572300\t73572600\t0.3887\t78\nchr11\t74223600\t74223900\t0.3382\t86\nchr11\t74527800\t74528100\t0.1867\t57\nchr11\t74757300\t74762100\t0.0372\t90\nchr11\t74880900\t74882100\t0.2012\t88\nchr11\t74977200\t74977500\t0.4302\t65\nchr11\t75409200\t75409800\t0.2119\t75\nchr11\t75749100\t75751800\t0.146\t85\nchr11\t75753600\t75754500\t0.1132\t89\nchr11\t77097600\t77099700\t0.0194\t102\nchr11\t78678000\t78683700\t0\t81\nchr11\t79557300\t79557600\t0.1057\t77\nchr11\t79961700\t79962000\t0.2087\t70\nchr11\t82156200\t82161600\t0.001\t80\nchr11\t82625100\t82625700\t0.0127\t40\nchr11\t83394900\t83395200\t0.0199\t77\nchr11\t83396400\t83397000\t0.0199\t77\nchr11\t83589600\t83591700\t0.0872\t66\nchr11\t84502200\t84502500\t0.4679\t31\nchr11\t85324800\t85330800\t0\t83\nchr11\t85849800\t85850100\t0.3354\t69\nchr11\t86110200\t86111700\t0.2587\t43\nchr11\t86536200\t86536800\t0.2826\t58\nchr11\t86756400\t86757600\t0.167\t69\nchr11\t87047700\t87053100\t0\t90\nchr11\t87164100\t87165300\t0.0021\t65\nchr11\t87340200\t87345000\t0\t102\nchr11\t87698100\t87698700\t0.107\t57\nchr11\t88989300\t88989900\t0.35\t69\nchr11\t89314500\t89317800\t0.0524\t73\nchr11\t89745000\t89746500\t0.1111\t89\nchr11\t89749500\t89749800\t0.279\t74\nchr11\t89751300\t89751600\t0.3671\t40\nchr11\t89752800\t89753100\t0.2112\t63\nchr11\t89759100\t89759700\t0.0032\t52\nchr11\t89760900\t89761200\t0.2464\t43\nchr11\t89763300\t89764200\t0\t64\nchr11\t89766000\t89766600\t0.1044\t63\nchr11\t89769600\t89769900\t0.067\t67\nchr11\t89771100\t89772000\t0.067\t67\nchr11\t89775300\t89776200\t0.2152\t71\nchr11\t89778300\t89784600\t0\t70\nchr11\t89788200\t89790300\t0\t71\nchr11\t89793900\t89795700\t0.0638\t70\nchr11\t89797800\t89799900\t0\t60\nchr11\t89801400\t89802000\t0.0218\t61\nchr11\t89803200\t89803500\t0.0218\t61\nchr11\t89809200\t89809800\t0.0132\t68\nchr11\t89811300\t89811600\t0.0114\t60\nchr11\t89817300\t89817900\t0.0046\t70\nchr11\t89819400\t89822100\t0.0046\t70\nchr11\t89824200\t89826600\t0\t68\nchr11\t89828100\t89831400\t0\t68\nchr11\t89833800\t89834100\t0.4015\t47\nchr11\t89838000\t89862300\t0\t86\nchr11\t89864700\t89869800\t0\t86\nchr11\t89871600\t89872200\t0.0237\t62\nchr11\t89873400\t89874900\t0.0146\t78\nchr11\t89876100\t89877600\t0\t86\nchr11\t89878800\t89883000\t0\t86\nchr11\t89884500\t89891400\t0\t86\nchr11\t89893800\t89897400\t0\t77\nchr11\t89900100\t89920500\t0\t98\nchr11\t89924100\t90006600\t0\t84\nchr11\t90008100\t90008700\t0.083\t36\nchr11\t90013500\t90016500\t0.0539\t69\nchr11\t90018600\t90021000\t0\t65\nchr11\t90023700\t90028500\t0\t65\nchr11\t90029700\t90030300\t0.0148\t54\nchr11\t90032700\t90033000\t0.1692\t43\nchr11\t90034200\t90034500\t0\t67\nchr11\t90035700\t90038100\t0\t67\nchr11\t90039900\t90042900\t0\t67\nchr11\t90044100\t90045600\t0\t67\nchr11\t90047400\t90051600\t0\t68\nchr11\t90054000\t90061500\t0\t68\nchr11\t90063600\t90065400\t0.1964\t70\nchr11\t90068100\t90070500\t0.1042\t69\nchr11\t90073500\t90073800\t0\t66\nchr11\t90075600\t90076800\t0\t66\nchr11\t90078900\t90079200\t0\t66\nchr11\t90080400\t90081000\t0.0076\t53\nchr11\t90082200\t90082500\t0.0076\t53\nchr11\t90087000\t90088500\t0.1023\t66\nchr11\t90090000\t90091500\t0.1815\t75\nchr11\t90093300\t90094200\t0.2018\t80\nchr11\t90400200\t90405600\t0\t124\nchr11\t90966300\t90972000\t0\t76\nchr11\t90976500\t90976800\t0.0914\t24\nchr11\t91309200\t91309500\t0.3977\t50\nchr11\t91578900\t91579800\t0.0623\t75\nchr11\t91682100\t91682700\t0.2401\t75\nchr11\t92030400\t92030700\t0.4554\t37\nchr11\t92171700\t92172000\t0.4274\t49\nchr11\t92359500\t92359800\t0.248\t68\nchr11\t93136800\t93142500\t0\t93\nchr11\t93172800\t93174000\t0.2723\t77\nchr11\t93175800\t93176100\t0.2245\t62\nchr11\t93243300\t93243600\t0.3154\t56\nchr11\t93420900\t93426900\t0\t81\nchr11\t93945000\t93945300\t0.1066\t46\nchr11\t93946500\t93948000\t0.0661\t68\nchr11\t94038300\t94042500\t0.0365\t112\nchr11\t94233000\t94235400\t0.0079\t278\nchr11\t94236900\t94237500\t0.1427\t262\nchr11\t94239300\t94239600\t0.1811\t256\nchr11\t94341000\t94341300\t0.2757\t56\nchr11\t94807800\t94808100\t0.1397\t29\nchr11\t95320200\t95321100\t0.0873\t63\nchr11\t95436300\t95442300\t0\t87\nchr11\t95626800\t95627700\t0.1101\t153\nchr11\t95629800\t95630100\t0.1597\t57\nchr11\t96406200\t96408600\t0.0637\t79\nchr11\t96513900\t96514200\t0.3361\t73\nchr11\t96771900\t96772200\t0.1422\t35\nchr11\t96774900\t96776400\t0.1356\t66\nchr11\t96935100\t96936900\t0.0617\t72\nchr11\t97040400\t97041000\t0.2104\t65\nchr11\t97043700\t97044000\t0.2986\t24\nchr11\t98325600\t98325900\t0.0984\t50\nchr11\t98344500\t98344800\t0.2414\t65\nchr11\t99581100\t99581400\t0.3347\t49\nchr11\t99602700\t99607800\t0\t90\nchr11\t99761700\t99762300\t0.3638\t62\nchr11\t99783000\t99783600\t0.0073\t60\nchr11\t100035300\t100035600\t0.1631\t68\nchr11\t100412100\t100412400\t0.1118\t63\nchr11\t100413900\t100414200\t0.0793\t76\nchr11\t100452600\t100453200\t0.0472\t124\nchr11\t100457400\t100457700\t0.0825\t67\nchr11\t100476000\t100476300\t0.4222\t72\nchr11\t100478700\t100480200\t0.096\t83\nchr11\t101546100\t101546400\t0.1184\t25\nchr11\t101695200\t101695800\t0\t104\nchr11\t101697000\t101698200\t0\t104\nchr11\t101700000\t101704500\t0\t104\nchr11\t102370200\t102372900\t0.0663\t90\nchr11\t102374400\t102374700\t0.0663\t90\nchr11\t102742800\t102744300\t0.0473\t101\nchr11\t103038900\t103039200\t0.1829\t62\nchr11\t104195100\t104195400\t0.1095\t58\nchr11\t104252100\t104252400\t0.3673\t58\nchr11\t104675700\t104676600\t0.0116\t80\nchr11\t105018600\t105018900\t0.1352\t60\nchr11\t106334700\t106335300\t0.2896\t65\nchr11\t106710000\t106710300\t0.0914\t15\nchr11\t107364600\t107367000\t0\t74\nchr11\t107374500\t107374800\t0.2127\t74\nchr11\t107376300\t107377800\t0\t67\nchr11\t108263100\t108265200\t0.0641\t85\nchr11\t108360900\t108362400\t0.2605\t94\nchr11\t108378600\t108378900\t0.3919\t61\nchr11\t108684600\t108685500\t0.3141\t85\nchr11\t109177800\t109183200\t0\t71\nchr11\t109404300\t109404900\t0.0788\t77\nchr11\t109574700\t109575900\t0.1538\t78\nchr11\t109878900\t109879200\t0.2008\t80\nchr11\t109881300\t109881900\t0.229\t63\nchr11\t109947900\t109948200\t0.2559\t52\nchr11\t110212200\t110214900\t0.0064\t71\nchr11\t110619000\t110619300\t0.3022\t39\nchr11\t110659200\t110659500\t0.1998\t88\nchr11\t112325400\t112326000\t0.0761\t62\nchr11\t112679100\t112680600\t0.0917\t68\nchr11\t114629700\t114630000\t0.3265\t68\nchr11\t114633000\t114633300\t0.1999\t16\nchr11\t114840000\t114841800\t0.0083\t87\nchr11\t114843000\t114844200\t0.1597\t85\nchr11\t116571300\t116575200\t0.0033\t79\nchr11\t117135300\t117138000\t0\t66\nchr11\t117207300\t117208200\t0.1361\t90\nchr11\t117250800\t117251100\t0.2537\t76\nchr11\t118330500\t118330800\t0.3452\t70\nchr11\t118721100\t118721400\t0.0937\t66\nchr11\t119507400\t119507700\t0.3104\t38\nchr11\t119743800\t119744100\t0.4865\t88\nchr11\t119848800\t119849100\t0.2419\t15\nchr11\t120082500\t120083700\t0\t27\nchr11\t121173300\t121173600\t0.2609\t24\nchr11\t121185300\t121185900\t0.0418\t214\nchr11\t121601100\t121601400\t0.0673\t86\nchr11\t121752300\t121752600\t0.1798\t67\nchr11\t121821600\t121827000\t0.0009\t74\nchr11\t121859400\t121859700\t0.1484\t60\nchr11\t122017500\t122017800\t0.4173\t37\nchr11\t122477100\t122478600\t0\t50\nchr11\t122826900\t122828100\t0.0961\t74\nchr11\t123896100\t123896400\t0.1068\t98\nchr11\t124236000\t124236600\t0.0556\t69\nchr11\t124392000\t124392600\t0.1833\t21\nchr11\t124505700\t124506300\t0.0746\t88\nchr11\t125036100\t125036400\t0.0091\t34\nchr11\t125537700\t125542200\t0\t72\nchr11\t125863500\t125864400\t0.2613\t75\nchr11\t126065100\t126065400\t0.2781\t118\nchr11\t126226200\t126226500\t0.0767\t142\nchr11\t127079400\t127079700\t0.104\t35\nchr11\t127287300\t127288800\t0.0416\t84\nchr11\t127364400\t127364700\t0.0819\t82\nchr11\t127367700\t127368000\t0.2057\t70\nchr11\t127776900\t127779000\t0.0549\t104\nchr11\t127780200\t127780500\t0.0549\t104\nchr11\t127869000\t127869900\t0.0227\t85\nchr11\t128930700\t128931000\t0.3649\t132\nchr11\t129174900\t129176400\t0\t77\nchr11\t129342300\t129343800\t0.0071\t64\nchr11\t129563400\t129564000\t0.0104\t62\nchr11\t130092300\t130092600\t0.1845\t81\nchr11\t131173500\t131174700\t0.1201\t45\nchr11\t131342100\t131342700\t0.2844\t131\nchr11\t132322500\t132324300\t0.0414\t81\nchr11\t132483000\t132483300\t0.1945\t79\nchr11\t133642200\t133642500\t0.2494\t36\nchr11\t133644300\t133646100\t0.141\t88\nchr11\t133932600\t133932900\t0.4727\t149\nchr11\t134000100\t134000700\t0.1891\t59\nchr11\t134166000\t134166600\t0.3989\t47\nchr11\t134296200\t134296500\t0.087\t66\nchr11\t134375700\t134376000\t0.4739\t67\nchr11\t134451600\t134451900\t0.4042\t71\nchr11\t134839500\t134840400\t0.0162\t94\nchr11\t134928600\t134928900\t0.157\t63\nchr11\t134986200\t134986500\t0.4847\t63\nchr11\t135046800\t135047100\t0.3865\t86\nchr12\t9900\t11700\t0.0749\t82\nchr12\t14400\t18600\t0.1558\t125\nchr12\t19800\t20100\t0.1558\t125\nchr12\t23400\t38700\t0\t130\nchr12\t41100\t43200\t0\t66\nchr12\t45600\t45900\t0.4275\t108\nchr12\t72600\t72900\t0.2755\t55\nchr12\t419700\t422100\t0.0632\t92\nchr12\t453000\t453300\t0.4258\t44\nchr12\t529800\t530100\t0.1478\t69\nchr12\t1079400\t1079700\t0.1105\t44\nchr12\t1085100\t1086000\t0.0027\t180\nchr12\t1087800\t1088100\t0.3394\t16\nchr12\t1122000\t1122600\t0.2239\t47\nchr12\t1661100\t1661400\t0.2781\t22\nchr12\t1921500\t1922100\t0.2579\t42\nchr12\t2105700\t2106000\t0.4429\t73\nchr12\t2130600\t2135100\t0\t70\nchr12\t2407500\t2407800\t0.473\t74\nchr12\t2520000\t2520600\t0.0416\t129\nchr12\t2539200\t2539800\t0.0621\t251\nchr12\t3393600\t3394200\t0.1903\t83\nchr12\t3499500\t3505200\t0\t91\nchr12\t4510200\t4510500\t0.0296\t100\nchr12\t4511700\t4513200\t0.0296\t100\nchr12\t4732500\t4733100\t0.2752\t88\nchr12\t4973400\t4974000\t0.4494\t34\nchr12\t5117100\t5119500\t0.0353\t72\nchr12\t5120700\t5121600\t0.3013\t72\nchr12\t5288400\t5289900\t0.1882\t77\nchr12\t5929800\t5930100\t0.4367\t103\nchr12\t5931600\t5932200\t0.3595\t141\nchr12\t6022500\t6023100\t0.1418\t65\nchr12\t6290700\t6291000\t0.1073\t40\nchr12\t7196700\t7197000\t0.3466\t12\nchr12\t7335900\t7336200\t0.1421\t75\nchr12\t7819500\t7820100\t0.003\t61\nchr12\t7924500\t7924800\t0.1292\t49\nchr12\t7954200\t7954500\t0.3128\t65\nchr12\t7972200\t7972500\t0.0996\t44\nchr12\t7980300\t7980600\t0.3494\t26\nchr12\t8184900\t8185200\t0.1142\t50\nchr12\t8387700\t8388300\t0.0124\t87\nchr12\t8394000\t8395500\t0.0024\t102\nchr12\t8625900\t8626800\t0.0719\t79\nchr12\t8787600\t8788500\t0.0007\t62\nchr12\t8795100\t8796000\t0\t67\nchr12\t8932800\t8933100\t0.1333\t68\nchr12\t8939400\t8941200\t0.0036\t68\nchr12\t8964600\t8964900\t0.2151\t75\nchr12\t8966700\t8967000\t0.2175\t80\nchr12\t9285300\t9286200\t0\t54\nchr12\t9287700\t9288300\t0.0392\t69\nchr12\t9290400\t9293400\t0.0451\t80\nchr12\t9295800\t9300000\t0.0022\t90\nchr12\t9314400\t9314700\t0.2531\t33\nchr12\t9401400\t9401700\t0.0543\t36\nchr12\t9414900\t9415200\t0.0933\t38\nchr12\t9431700\t9433500\t0.0241\t66\nchr12\t9435000\t9435300\t0.0241\t66\nchr12\t9437100\t9437400\t0.1758\t47\nchr12\t9438600\t9442200\t0\t70\nchr12\t9443400\t9444300\t0\t70\nchr12\t9446100\t9446700\t0\t70\nchr12\t9455100\t9455700\t0.0629\t28\nchr12\t9467700\t9468000\t0.0138\t21\nchr12\t9496800\t9497100\t0.0659\t18\nchr12\t9523200\t9525600\t0\t80\nchr12\t9549600\t9549900\t0.3735\t16\nchr12\t9559800\t9560100\t0\t14\nchr12\t9561300\t9561600\t0\t14\nchr12\t9563100\t9563400\t0\t29\nchr12\t9567600\t9568500\t0.3527\t67\nchr12\t9570600\t9572100\t0\t38\nchr12\t9573600\t9574200\t0\t22\nchr12\t9577500\t9578100\t0\t15\nchr12\t9580500\t9582300\t0\t67\nchr12\t9952800\t9953100\t0.2318\t65\nchr12\t10345800\t10346100\t0.1088\t79\nchr12\t10348800\t10349100\t0.2629\t59\nchr12\t10423800\t10425300\t0\t38\nchr12\t10427100\t10427400\t0.0031\t52\nchr12\t10437000\t10437900\t0\t21\nchr12\t10439100\t10440900\t0.078\t49\nchr12\t10442400\t10443000\t0.0028\t48\nchr12\t11034000\t11034600\t0.0808\t28\nchr12\t11088300\t11088600\t0.065\t38\nchr12\t11095200\t11095500\t0\t19\nchr12\t11148600\t11149800\t0.1286\t43\nchr12\t11298900\t11303400\t0\t67\nchr12\t11319600\t11319900\t0.2752\t75\nchr12\t11352300\t11353200\t0\t75\nchr12\t11391900\t11392800\t0\t67\nchr12\t11937900\t11938500\t0.0281\t70\nchr12\t12413700\t12414600\t0.299\t29\nchr12\t13392000\t13399500\t0\t101\nchr12\t14586300\t14586600\t0.243\t10\nchr12\t14631600\t14631900\t0.2572\t79\nchr12\t15476700\t15477300\t0.0936\t70\nchr12\t16707300\t16708200\t0.0475\t118\nchr12\t16709400\t16709700\t0.0475\t118\nchr12\t17177100\t17177700\t0.0388\t81\nchr12\t17178900\t17179200\t0.0388\t81\nchr12\t17656200\t17656500\t0.3882\t59\nchr12\t17769900\t17770500\t0.0281\t83\nchr12\t17772900\t17773800\t0.0984\t103\nchr12\t17856600\t17858100\t0.0218\t105\nchr12\t17859300\t17860200\t0.0218\t105\nchr12\t18369600\t18369900\t0.212\t60\nchr12\t19340400\t19340700\t0.1178\t66\nchr12\t19728900\t19729200\t0.1494\t55\nchr12\t20553300\t20553600\t0.1403\t65\nchr12\t20671500\t20673600\t0.2462\t81\nchr12\t20709600\t20709900\t0\t16\nchr12\t20773500\t20773800\t0.1748\t45\nchr12\t21085200\t21085500\t0.4719\t62\nchr12\t21212100\t21213900\t0.2453\t96\nchr12\t21284700\t21285000\t0.0055\t79\nchr12\t21286200\t21288000\t0.0055\t79\nchr12\t21397800\t21400800\t0.039\t96\nchr12\t21421200\t21421500\t0.276\t54\nchr12\t21422700\t21423900\t0\t44\nchr12\t21622500\t21622800\t0\t11\nchr12\t21798300\t21798600\t0.2731\t66\nchr12\t21976800\t21978000\t0\t35\nchr12\t22139400\t22142100\t0.114\t69\nchr12\t22178100\t22178400\t0.2578\t49\nchr12\t22418700\t22431600\t0\t42\nchr12\t22734900\t22735800\t0.2272\t52\nchr12\t23073600\t23073900\t0.0609\t58\nchr12\t25485600\t25486200\t0.1063\t74\nchr12\t25488300\t25488600\t0.1063\t74\nchr12\t25539900\t25541700\t0.2104\t71\nchr12\t26035200\t26035800\t0.1413\t142\nchr12\t26216400\t26217600\t0.1756\t77\nchr12\t26673900\t26674200\t0.0667\t57\nchr12\t26784900\t26786100\t0.03\t33\nchr12\t27131100\t27131700\t0.2361\t77\nchr12\t27281100\t27281400\t0.1179\t22\nchr12\t27643500\t27643800\t0.2817\t71\nchr12\t28200300\t28200600\t0.1354\t53\nchr12\t28764300\t28764600\t0.1306\t74\nchr12\t29408400\t29408700\t0.108\t67\nchr12\t29932200\t29932800\t0.0067\t98\nchr12\t30433500\t30433800\t0.2222\t47\nchr12\t30521100\t30521400\t0.1784\t47\nchr12\t31165800\t31166400\t0.2344\t81\nchr12\t31615500\t31615800\t0.3056\t69\nchr12\t32099700\t32100300\t0.0421\t56\nchr12\t32810700\t32811000\t0.173\t25\nchr12\t33738000\t33738600\t0.0824\t68\nchr12\t33740100\t33740400\t0.0824\t68\nchr12\t33793800\t33794100\t0.3079\t86\nchr12\t34069800\t34070100\t0.2524\t44\nchr12\t34669800\t34670100\t0.0392\t65\nchr12\t34770000\t34773000\t0\t63\nchr12\t34774500\t34774800\t0\t85\nchr12\t34776000\t34795200\t0\t85\nchr12\t34797600\t34799700\t0\t37\nchr12\t34802700\t34803600\t0\t24\nchr12\t34805700\t34812000\t0\t64\nchr12\t34813200\t34816500\t0\t64\nchr12\t34820400\t34820700\t0\t51\nchr12\t34821900\t34822200\t0\t51\nchr12\t34831200\t34832400\t0.0065\t44\nchr12\t34834800\t34849500\t0\t122\nchr12\t34851000\t34861200\t0\t122\nchr12\t34862400\t34863000\t0\t84\nchr12\t34865700\t34870200\t0\t140\nchr12\t34871700\t34872900\t0\t140\nchr12\t34874100\t34878900\t0\t140\nchr12\t34880700\t34882800\t0\t1117\nchr12\t34884000\t35199300\t0\t1117\nchr12\t35200500\t35274000\t0\t1117\nchr12\t35275500\t35319600\t0\t1097\nchr12\t35320800\t35389800\t0\t338\nchr12\t35391000\t35429400\t0\t338\nchr12\t35430600\t35482800\t0\t338\nchr12\t35484000\t35650500\t0\t4118\nchr12\t35651700\t35725500\t0\t4118\nchr12\t35726700\t35787900\t0\t4118\nchr12\t35789100\t35809800\t0\t1323\nchr12\t35811300\t35995500\t0\t1323\nchr12\t35996700\t36189600\t0\t1323\nchr12\t36191100\t36193500\t0\t213\nchr12\t36194700\t36268500\t0\t213\nchr12\t36270000\t36331500\t0\t213\nchr12\t36332700\t36336600\t0\t213\nchr12\t36338400\t36390000\t0\t213\nchr12\t36391200\t36450900\t0\t213\nchr12\t36452400\t36496200\t0\t213\nchr12\t36497400\t36513600\t0\t213\nchr12\t36514800\t36624000\t0\t185\nchr12\t36625200\t36699900\t0\t479\nchr12\t36701100\t36733800\t0\t479\nchr12\t36735000\t36779100\t0\t479\nchr12\t36780300\t36796200\t0\t479\nchr12\t36798600\t36830400\t0\t364\nchr12\t36831600\t36840600\t0\t364\nchr12\t36842100\t37010400\t0\t364\nchr12\t37011600\t37039200\t0\t364\nchr12\t37040700\t37102500\t0\t182\nchr12\t37104300\t37111800\t0\t232\nchr12\t37113000\t37185300\t0\t232\nchr12\t37235400\t37240500\t0\t144\nchr12\t37246200\t37248900\t0\t82\nchr12\t37251300\t37251600\t0\t38\nchr12\t37333200\t37334700\t0\t50\nchr12\t37339800\t37340400\t0.1009\t46\nchr12\t37342500\t37342800\t0.1614\t26\nchr12\t37465500\t37465800\t0.2866\t25\nchr12\t37705800\t37706100\t0.0472\t60\nchr12\t37736700\t37737000\t0.1871\t65\nchr12\t37815300\t37815600\t0.1457\t72\nchr12\t38094000\t38094300\t0.0755\t35\nchr12\t38211600\t38212200\t0.0059\t54\nchr12\t38226900\t38227200\t0.276\t44\nchr12\t38313300\t38313600\t0.0745\t41\nchr12\t38800200\t38805600\t0\t84\nchr12\t38963700\t38964000\t0.3546\t69\nchr12\t39790500\t39792300\t0.0042\t63\nchr12\t39800400\t39801000\t0\t66\nchr12\t39836700\t39837600\t0.0357\t60\nchr12\t39901500\t39901800\t0.0425\t97\nchr12\t39979500\t39979800\t0.0268\t87\nchr12\t39981900\t39984000\t0.0268\t87\nchr12\t41040900\t41041200\t0.329\t75\nchr12\t41640300\t41640600\t0.2166\t84\nchr12\t41669400\t41671200\t0.2172\t81\nchr12\t41673900\t41675700\t0.1789\t74\nchr12\t41677200\t41677500\t0.1789\t74\nchr12\t41823900\t41824200\t0.4017\t56\nchr12\t41844300\t41844900\t0\t31\nchr12\t42228600\t42229200\t0.0121\t49\nchr12\t42919200\t42919500\t0.3281\t54\nchr12\t43260600\t43260900\t0.2944\t43\nchr12\t43471500\t43471800\t0.0213\t124\nchr12\t43473000\t43476600\t0.0213\t124\nchr12\t43532700\t43534200\t0.0058\t49\nchr12\t43583700\t43585200\t0\t55\nchr12\t43605900\t43606200\t0.1232\t68\nchr12\t43622700\t43623300\t0.2229\t70\nchr12\t43686000\t43686300\t0.1915\t55\nchr12\t43790700\t43791300\t0.1281\t61\nchr12\t43910700\t43911300\t0.0416\t65\nchr12\t44108400\t44114100\t0\t106\nchr12\t44577000\t44577300\t0.1435\t70\nchr12\t44865000\t44865300\t0.3463\t55\nchr12\t44951700\t44954700\t0.0622\t84\nchr12\t44956200\t44956800\t0.0622\t84\nchr12\t45229500\t45229800\t0.319\t237\nchr12\t45372300\t45372600\t0.1296\t83\nchr12\t45374100\t45374700\t0.0559\t77\nchr12\t45376200\t45376500\t0.0817\t101\nchr12\t46705200\t46705800\t0.2725\t64\nchr12\t46940400\t46940700\t0.2617\t58\nchr12\t48277800\t48278100\t0.2469\t65\nchr12\t48331800\t48333600\t0.0234\t65\nchr12\t48843000\t48843300\t0.1963\t67\nchr12\t51454500\t51455100\t0.0491\t75\nchr12\t51562800\t51568200\t0\t73\nchr12\t51719100\t51719700\t0.0474\t43\nchr12\t52288800\t52291200\t0.001\t82\nchr12\t52302000\t52304400\t0.0202\t75\nchr12\t54779700\t54780000\t0.1159\t41\nchr12\t54789000\t54794400\t0\t80\nchr12\t55081500\t55081800\t0.2909\t80\nchr12\t55083900\t55084500\t0.2909\t80\nchr12\t55096500\t55101300\t0\t85\nchr12\t55161900\t55162200\t0.3636\t73\nchr12\t55345500\t55347600\t0\t70\nchr12\t55349100\t55350000\t0\t70\nchr12\t55410000\t55411800\t0.0049\t62\nchr12\t55413000\t55413300\t0.0233\t69\nchr12\t55489500\t55489800\t0.1927\t75\nchr12\t55521600\t55521900\t0.3122\t87\nchr12\t56075400\t56075700\t0.2028\t77\nchr12\t56400600\t56401200\t0.1159\t79\nchr12\t56938500\t56938800\t0.235\t72\nchr12\t56940300\t56940900\t0.0362\t63\nchr12\t56982000\t56982300\t0.2231\t64\nchr12\t56984700\t56985300\t0.0146\t69\nchr12\t57648600\t57651900\t0.0052\t106\nchr12\t58057200\t58057500\t0.268\t65\nchr12\t58110000\t58110300\t0.0552\t62\nchr12\t58112700\t58113000\t0.3292\t72\nchr12\t58327500\t58328700\t0.0014\t108\nchr12\t58331400\t58333800\t0.0014\t108\nchr12\t58336200\t58336800\t0.0272\t66\nchr12\t59468100\t59468400\t0.44\t48\nchr12\t59739300\t59739600\t0.1942\t56\nchr12\t59756700\t59757000\t0.1921\t54\nchr12\t60008700\t60009600\t0.0024\t167\nchr12\t60736500\t60736800\t0.4053\t58\nchr12\t61541400\t61541700\t0.1974\t71\nchr12\t61942500\t61947000\t0.0109\t88\nchr12\t63670500\t63670800\t0.3066\t50\nchr12\t64055100\t64055400\t0.3347\t61\nchr12\t64140600\t64140900\t0.2441\t60\nchr12\t64197000\t64201500\t0.0108\t80\nchr12\t64287600\t64293000\t0\t89\nchr12\t65350500\t65350800\t0.3252\t55\nchr12\t65550600\t65551200\t0.1118\t74\nchr12\t65687400\t65687700\t0.2018\t60\nchr12\t66057600\t66057900\t0.1246\t480\nchr12\t66135600\t66135900\t0.0581\t39\nchr12\t67847100\t67847400\t0.2872\t75\nchr12\t67903800\t67905300\t0.083\t80\nchr12\t67953600\t67953900\t0.1828\t68\nchr12\t68513100\t68513700\t0.2871\t62\nchr12\t68660100\t68660400\t0.1348\t56\nchr12\t68994600\t68995200\t0.0871\t46\nchr12\t69773700\t69779400\t0\t85\nchr12\t69940800\t69942600\t0.0987\t72\nchr12\t69944100\t69944400\t0.0987\t72\nchr12\t70013700\t70016700\t0.0004\t98\nchr12\t70017900\t70018500\t0.0004\t98\nchr12\t70201200\t70203600\t0.0008\t120\nchr12\t71098800\t71099700\t0.121\t65\nchr12\t71101200\t71103300\t0.0198\t84\nchr12\t71119200\t71120100\t0\t60\nchr12\t71121900\t71124000\t0.0488\t54\nchr12\t71564100\t71564400\t0\t57\nchr12\t71911500\t71911800\t0.4343\t100\nchr12\t72515100\t72515400\t0.1046\t76\nchr12\t72908400\t72908700\t0.1393\t69\nchr12\t73148100\t73149000\t0.0165\t83\nchr12\t73151100\t73151400\t0.3341\t56\nchr12\t73194600\t73195200\t0.0735\t109\nchr12\t73283700\t73288800\t0\t75\nchr12\t73395600\t73395900\t0.1651\t84\nchr12\t73397100\t73397400\t0.1651\t84\nchr12\t73398900\t73400400\t0.1866\t92\nchr12\t73982700\t73983600\t0.0185\t137\nchr12\t74506800\t74507100\t0.3468\t95\nchr12\t74875500\t74880900\t0\t81\nchr12\t75729900\t75730500\t0.1438\t97\nchr12\t76321800\t76322100\t0.2896\t79\nchr12\t77174100\t77178600\t0.0997\t85\nchr12\t77656200\t77656800\t0.1887\t46\nchr12\t78072300\t78073200\t0.0636\t84\nchr12\t79042500\t79042800\t0.2092\t76\nchr12\t79177200\t79177800\t0.0212\t61\nchr12\t79311300\t79311900\t0.4239\t75\nchr12\t80245200\t80248800\t0.0059\t80\nchr12\t80451300\t80452200\t0\t56\nchr12\t80453400\t80454000\t0\t54\nchr12\t80464200\t80465100\t0\t59\nchr12\t80482800\t80483100\t0.0841\t63\nchr12\t82899900\t82900500\t0.0784\t88\nchr12\t83393700\t83394300\t0.0496\t21\nchr12\t83450400\t83450700\t0.1169\t54\nchr12\t83524500\t83524800\t0.0431\t45\nchr12\t83587500\t83587800\t0.2088\t69\nchr12\t83589600\t83589900\t0.1922\t73\nchr12\t83671800\t83676300\t0\t68\nchr12\t83902500\t83902800\t0.1238\t47\nchr12\t84006300\t84006600\t0.2963\t61\nchr12\t85193100\t85194600\t0.0472\t82\nchr12\t85315500\t85317600\t0.0178\t95\nchr12\t86802600\t86802900\t0.1499\t66\nchr12\t86845500\t86846400\t0.0051\t76\nchr12\t86859300\t86859900\t0.0199\t59\nchr12\t87077400\t87077700\t0.2803\t56\nchr12\t87102000\t87102600\t0.1538\t54\nchr12\t87192000\t87194100\t0.0215\t67\nchr12\t87582600\t87583500\t0.1326\t75\nchr12\t87747600\t87750000\t0\t72\nchr12\t87970800\t87971100\t0.3748\t71\nchr12\t88621800\t88622700\t0.0283\t74\nchr12\t88848000\t88848600\t0.2979\t106\nchr12\t88852200\t88852500\t0.1961\t71\nchr12\t89443500\t89443800\t0.2605\t82\nchr12\t90536700\t90542400\t0\t69\nchr12\t92231700\t92232600\t0.1595\t75\nchr12\t92315100\t92319900\t0\t85\nchr12\t92680200\t92680500\t0.2234\t87\nchr12\t92728200\t92728500\t0.4381\t31\nchr12\t92916600\t92920500\t0.0157\t63\nchr12\t93399300\t93399600\t0.0799\t48\nchr12\t93401700\t93402000\t0.1436\t59\nchr12\t93492900\t93494100\t0\t63\nchr12\t93498000\t93499200\t0\t56\nchr12\t95339700\t95340000\t0.3328\t67\nchr12\t95839800\t95842500\t0\t59\nchr12\t95923800\t95925000\t0.2328\t89\nchr12\t95946600\t95947500\t0.0013\t67\nchr12\t95948700\t95949000\t0.1775\t52\nchr12\t96317100\t96321900\t0\t84\nchr12\t96827400\t96827700\t0.1323\t25\nchr12\t97161000\t97161300\t0.0607\t40\nchr12\t97653600\t97653900\t0.1655\t85\nchr12\t97655700\t97656000\t0.1655\t85\nchr12\t97704900\t97705500\t0\t73\nchr12\t97706700\t97708800\t0\t73\nchr12\t97718100\t97718700\t0.0631\t77\nchr12\t97725300\t97729800\t0\t79\nchr12\t98278500\t98279100\t0.0287\t65\nchr12\t98655000\t98655300\t0.1204\t68\nchr12\t101146800\t101147400\t0.1883\t82\nchr12\t101149200\t101151900\t0\t66\nchr12\t101153700\t101154000\t0.3482\t69\nchr12\t101509200\t101511300\t0.0433\t70\nchr12\t101586300\t101587200\t0.1689\t60\nchr12\t101704800\t101705700\t0.054\t45\nchr12\t102308100\t102308700\t0.1209\t69\nchr12\t102448200\t102448500\t0.4219\t57\nchr12\t102828900\t102829500\t0.1071\t81\nchr12\t103321200\t103321800\t0.153\t95\nchr12\t103899600\t103899900\t0.1547\t45\nchr12\t104031600\t104032200\t0.15\t64\nchr12\t104322900\t104323200\t0.1151\t41\nchr12\t105630600\t105633600\t0.0854\t88\nchr12\t105777300\t105781500\t0\t70\nchr12\t106473000\t106474500\t0\t77\nchr12\t106476000\t106476600\t0.1328\t66\nchr12\t106752000\t106752300\t0.4565\t88\nchr12\t108348000\t108348600\t0.0384\t26\nchr12\t108999000\t109000800\t0.0171\t84\nchr12\t109002000\t109002600\t0.0171\t84\nchr12\t109635000\t109635600\t0.3056\t125\nchr12\t110570400\t110570700\t0.023\t49\nchr12\t111831900\t111832200\t0.1301\t75\nchr12\t112621200\t112627200\t0\t105\nchr12\t113872500\t113873700\t0.065\t103\nchr12\t114536400\t114536700\t0.3072\t68\nchr12\t114571500\t114571800\t0.0632\t59\nchr12\t115287300\t115288800\t0.0159\t106\nchr12\t115290300\t115290600\t0.311\t52\nchr12\t118681200\t118681500\t0.209\t60\nchr12\t118707600\t118708200\t0.4307\t150\nchr12\t119918100\t119919300\t0.3589\t68\nchr12\t120928500\t120928800\t0.1222\t34\nchr12\t121301100\t121301400\t0.4575\t20\nchr12\t121747500\t121748100\t0.0484\t46\nchr12\t121993200\t121995000\t0.2093\t67\nchr12\t122695800\t122696400\t0.0165\t69\nchr12\t122700300\t122700600\t0.1872\t76\nchr12\t122709300\t122709900\t0.0322\t64\nchr12\t122713500\t122713800\t0.0144\t49\nchr12\t122717700\t122718000\t0.2796\t59\nchr12\t124089300\t124089600\t0.4693\t49\nchr12\t124101300\t124101600\t0.1226\t37\nchr12\t124839600\t124839900\t0.2197\t57\nchr12\t124912200\t124912500\t0.1934\t55\nchr12\t125204400\t125204700\t0.4183\t38\nchr12\t125409900\t125411100\t0.1004\t27\nchr12\t126151800\t126152100\t0.1364\t60\nchr12\t126299100\t126304800\t0\t97\nchr12\t126583500\t126584100\t0\t69\nchr12\t126969300\t126969600\t0.3368\t64\nchr12\t127095000\t127100100\t0.049\t86\nchr12\t127545000\t127545900\t0.0013\t39\nchr12\t127871400\t127871700\t0.0355\t70\nchr12\t128708400\t128708700\t0.4473\t118\nchr12\t128844900\t128845200\t0.2808\t35\nchr12\t129018000\t129018300\t0.1703\t46\nchr12\t129088200\t129088800\t0.4039\t84\nchr12\t129190200\t129190500\t0.4359\t54\nchr12\t129303300\t129303600\t0.0859\t76\nchr12\t129356100\t129356400\t0.2866\t28\nchr12\t129479700\t129480000\t0.4053\t42\nchr12\t129804000\t129806400\t0.0327\t60\nchr12\t129855600\t129858300\t0\t58\nchr12\t130338300\t130338600\t0.4328\t51\nchr12\t130379400\t130380000\t0.3554\t69\nchr12\t130386600\t130387500\t0.0245\t62\nchr12\t130392600\t130392900\t0.477\t166\nchr12\t130482900\t130483200\t0.4381\t47\nchr12\t130586700\t130587600\t0.0468\t69\nchr12\t130843800\t130844100\t0.1047\t100\nchr12\t130882200\t130882500\t0.1945\t66\nchr12\t130887600\t130887900\t0.2105\t62\nchr12\t131032800\t131033100\t0.4251\t58\nchr12\t131071800\t131072100\t0.4112\t61\nchr12\t131195100\t131195400\t0.038\t61\nchr12\t131200800\t131202300\t0\t81\nchr12\t131206200\t131206800\t0.1545\t67\nchr12\t131225400\t131226000\t0.0162\t76\nchr12\t131278200\t131278500\t0.2476\t56\nchr12\t131297400\t131307000\t0\t78\nchr12\t131392800\t131393400\t0.2243\t56\nchr12\t131395500\t131395800\t0.4328\t231\nchr12\t131433300\t131434200\t0.0373\t49\nchr12\t131439600\t131440200\t0.042\t62\nchr12\t131470500\t131470800\t0.0808\t49\nchr12\t131475600\t131476200\t0\t87\nchr12\t131481000\t131481600\t0.0311\t62\nchr12\t131580300\t131580600\t0.3327\t60\nchr12\t131588400\t131588700\t0.1747\t439\nchr12\t131626500\t131627700\t0.1268\t196\nchr12\t131654400\t131654700\t0.3126\t85\nchr12\t131656500\t131658300\t0.0791\t79\nchr12\t131660700\t131663400\t0\t68\nchr12\t131701200\t131701800\t0.111\t28\nchr12\t132149100\t132150600\t0.0006\t206\nchr12\t132212400\t132212700\t0.0779\t21\nchr12\t132231300\t132236100\t0\t72\nchr12\t132241200\t132243300\t0.1538\t199\nchr12\t132304800\t132305100\t0.466\t25\nchr12\t132349800\t132350100\t0.4687\t225\nchr12\t132361800\t132362400\t0.2446\t71\nchr12\t132364800\t132365100\t0.4251\t34\nchr12\t132378000\t132378300\t0.1995\t12\nchr12\t132392100\t132392400\t0.3899\t14\nchr12\t132464100\t132464400\t0.3734\t124\nchr12\t132684000\t132684900\t0.1793\t92\nchr12\t132688800\t132689100\t0.1648\t11\nchr12\t132693300\t132693900\t0.4516\t33\nchr12\t132793200\t132793500\t0.009\t21\nchr12\t132817200\t132817800\t0.3954\t34\nchr12\t132836100\t132836400\t0.2755\t33\nchr12\t133264800\t133265400\t0\t201\nchr13\t16004100\t16004400\t0.2736\t47\nchr13\t16005600\t16006800\t0.1347\t111\nchr13\t16015800\t16016100\t0.3213\t39\nchr13\t16023600\t16025400\t0.0067\t75\nchr13\t16028400\t16029600\t0.0437\t135\nchr13\t16030800\t16034400\t0.1502\t62\nchr13\t16038600\t16042200\t0\t141\nchr13\t16043400\t16047900\t0\t71\nchr13\t16050900\t16065000\t0\t152\nchr13\t16068300\t16069500\t0\t152\nchr13\t16071000\t16074000\t0\t59\nchr13\t16075200\t16077000\t0.0197\t153\nchr13\t16080000\t16089600\t0\t105\nchr13\t16090800\t16091100\t0\t105\nchr13\t16093200\t16099500\t0.008\t256\nchr13\t16100700\t16111800\t0\t179\nchr13\t16114800\t16119000\t0.1139\t562\nchr13\t16121700\t16122900\t0.3148\t376\nchr13\t16124100\t16126200\t0.0406\t428\nchr13\t16127400\t16127700\t0.4133\t204\nchr13\t16130400\t16130700\t0.482\t311\nchr13\t16131900\t16135200\t0.0646\t1052\nchr13\t16136400\t16141200\t0.0646\t1052\nchr13\t16142400\t16142700\t0.3767\t463\nchr13\t16146900\t16150200\t0.3128\t404\nchr13\t16152300\t16155900\t0.356\t889\nchr13\t16159200\t16159500\t0.428\t288\nchr13\t16161000\t16162500\t0.1312\t629\nchr13\t16164300\t16185000\t0\t733\nchr13\t16186500\t16194600\t0.2\t484\nchr13\t16195800\t16205700\t0.1094\t401\nchr13\t16206900\t16211400\t0.1559\t381\nchr13\t16212600\t16214400\t0.1395\t257\nchr13\t16216200\t16231500\t0.0549\t449\nchr13\t16232700\t16233900\t0.3478\t465\nchr13\t16235100\t16237200\t0.1336\t478\nchr13\t16242300\t16245300\t0.0761\t556\nchr13\t16246800\t16256100\t0\t805\nchr13\t16262100\t16263300\t0\t83\nchr13\t16266300\t16269900\t0\t127\nchr13\t16272000\t16272300\t0\t1930\nchr13\t16273500\t16276500\t0\t1930\nchr13\t16278300\t16280100\t0\t1930\nchr13\t16281300\t16305900\t0\t1930\nchr13\t16307100\t16400100\t0\t1930\nchr13\t16401300\t16426800\t0\t4973\nchr13\t16428300\t16440600\t0\t4973\nchr13\t16441800\t16504200\t0\t4973\nchr13\t16505400\t16835400\t0\t4973\nchr13\t16836900\t16906200\t0\t4973\nchr13\t16908000\t16954200\t0\t7157\nchr13\t16955400\t17431200\t0\t7157\nchr13\t17432400\t17447100\t0\t1822\nchr13\t17448600\t17449500\t0\t1822\nchr13\t17451000\t17592900\t0\t1822\nchr13\t17594100\t17768100\t0\t1868\nchr13\t17769300\t17880900\t0\t3185\nchr13\t17882700\t18051300\t0\t3185\nchr13\t18192000\t18192300\t0.3695\t115\nchr13\t18193800\t18194100\t0.1706\t114\nchr13\t18195300\t18197100\t0.1706\t114\nchr13\t18201300\t18201900\t0.2348\t186\nchr13\t18211500\t18215100\t0.104\t5875\nchr13\t18293100\t18293400\t0.4432\t51\nchr13\t18318000\t18318300\t0.2492\t155\nchr13\t18336300\t18336600\t0.2203\t106\nchr13\t18339300\t18348900\t0\t78\nchr13\t18350100\t18352500\t0\t78\nchr13\t18356100\t18357300\t0.0385\t78\nchr13\t18409500\t18409800\t0.3518\t55\nchr13\t18414000\t18414300\t0.0038\t47\nchr13\t18415500\t18416100\t0.0038\t47\nchr13\t18417600\t18418200\t0\t59\nchr13\t18419700\t18421800\t0.0787\t65\nchr13\t18423000\t18423300\t0.0787\t65\nchr13\t18424500\t18425100\t0.0787\t65\nchr13\t18428100\t18428700\t0.0787\t65\nchr13\t18430500\t18430800\t0.1708\t75\nchr13\t18432600\t18432900\t0.0002\t58\nchr13\t18434100\t18436200\t0.0002\t58\nchr13\t18441300\t18441600\t0.2048\t59\nchr13\t18452700\t18453300\t0.2452\t28\nchr13\t18457200\t18457800\t0.0576\t234\nchr13\t18459000\t18459300\t0.016\t37\nchr13\t18464100\t18464400\t0.1352\t42\nchr13\t18466200\t18466800\t0.1896\t57\nchr13\t18481200\t18481500\t0.378\t66\nchr13\t18483900\t18484200\t0.3246\t42\nchr13\t18485700\t18486000\t0.1162\t23\nchr13\t18492600\t18494100\t0.1381\t66\nchr13\t18497400\t18498000\t0.1321\t52\nchr13\t18503100\t18503400\t0.3493\t69\nchr13\t18509700\t18510300\t0.0224\t65\nchr13\t18521700\t18522000\t0.3118\t48\nchr13\t18538500\t18539100\t0.2064\t55\nchr13\t18542700\t18543000\t0.3408\t63\nchr13\t18546900\t18548700\t0.1235\t58\nchr13\t18550200\t18550500\t0.1235\t58\nchr13\t18551700\t18552900\t0\t71\nchr13\t18554400\t18557700\t0\t71\nchr13\t18565500\t18566400\t0.1572\t55\nchr13\t18569100\t18569400\t0.3061\t53\nchr13\t18571200\t18572700\t0.005\t62\nchr13\t18574500\t18574800\t0.0945\t27\nchr13\t18576000\t18577200\t0.0091\t64\nchr13\t18579900\t18582000\t0.025\t46\nchr13\t18588300\t18588600\t0.0826\t50\nchr13\t18604200\t18604800\t0\t58\nchr13\t18608400\t18608700\t0.0796\t38\nchr13\t18616800\t18617100\t0.2616\t43\nchr13\t18669900\t18670200\t0.2181\t68\nchr13\t18671400\t18672000\t0.0407\t48\nchr13\t18675600\t18676200\t0.0903\t54\nchr13\t18769200\t18771300\t0\t36\nchr13\t18778800\t18779100\t0.4406\t62\nchr13\t18784800\t18785400\t0.0495\t61\nchr13\t18788700\t18790800\t0\t32\nchr13\t18801300\t18801900\t0.0124\t56\nchr13\t18805800\t18806100\t0.2793\t70\nchr13\t18902700\t18903000\t0.1139\t20\nchr13\t19107000\t19107300\t0.1192\t79\nchr13\t19137300\t19138500\t0.028\t168\nchr13\t19199400\t19199700\t0.1821\t19\nchr13\t19274400\t19277100\t0.0816\t69\nchr13\t19278300\t19278900\t0.1208\t38\nchr13\t19353300\t19353600\t0.4084\t57\nchr13\t19431900\t19432200\t0.2636\t38\nchr13\t19497300\t19497600\t0.0535\t34\nchr13\t19499400\t19499700\t0.1444\t71\nchr13\t19500900\t19501500\t0.1444\t71\nchr13\t19559700\t19560300\t0.2105\t78\nchr13\t19778400\t19780500\t0.1148\t73\nchr13\t21261600\t21261900\t0.2881\t67\nchr13\t21377100\t21377700\t0.2003\t347\nchr13\t21447600\t21449100\t0.0983\t44\nchr13\t22481100\t22481400\t0.1837\t33\nchr13\t22577700\t22578000\t0.1814\t60\nchr13\t24321000\t24321300\t0.4582\t15\nchr13\t24808500\t24808800\t0.0331\t72\nchr13\t24810300\t24810600\t0.3138\t62\nchr13\t25004700\t25005000\t0.1223\t48\nchr13\t26072700\t26073300\t0.015\t43\nchr13\t26472600\t26472900\t0.1739\t61\nchr13\t28265700\t28266000\t0.1351\t28\nchr13\t29413500\t29414400\t0.0105\t48\nchr13\t29641800\t29647500\t0\t97\nchr13\t29669400\t29670600\t0.0612\t66\nchr13\t30264600\t30264900\t0.4141\t69\nchr13\t30601500\t30601800\t0.3775\t24\nchr13\t31302300\t31308300\t0\t118\nchr13\t32717400\t32717700\t0.1779\t39\nchr13\t32868000\t32869200\t0\t99\nchr13\t34480800\t34486200\t0\t78\nchr13\t34540200\t34540500\t0.1326\t31\nchr13\t35088900\t35089800\t0.0432\t101\nchr13\t36009000\t36013200\t0.0115\t78\nchr13\t36056100\t36056400\t0.0321\t53\nchr13\t36488100\t36488400\t0.1019\t49\nchr13\t37150200\t37150500\t0.2093\t99\nchr13\t37152900\t37153200\t0.2093\t99\nchr13\t37155300\t37155600\t0.2825\t115\nchr13\t37314600\t37315200\t0.0514\t70\nchr13\t37317900\t37318500\t0.0828\t59\nchr13\t37826100\t37826400\t0.1076\t68\nchr13\t39001200\t39001800\t0\t73\nchr13\t39003000\t39006000\t0\t73\nchr13\t39986700\t39987300\t0.0174\t58\nchr13\t40005900\t40006200\t0.1266\t64\nchr13\t40356900\t40358400\t0.0813\t81\nchr13\t40361400\t40362000\t0.0813\t81\nchr13\t40832100\t40833900\t0.0962\t72\nchr13\t40865700\t40866000\t0.2756\t52\nchr13\t40902600\t40902900\t0.1953\t67\nchr13\t40957200\t40957500\t0.2134\t58\nchr13\t41591700\t41592000\t0.1797\t99\nchr13\t41874000\t41874300\t0.281\t63\nchr13\t42181800\t42182100\t0.4815\t58\nchr13\t42372000\t42372300\t0.3617\t20\nchr13\t42425400\t42430500\t0.0284\t101\nchr13\t42856800\t42857100\t0.1935\t82\nchr13\t42965700\t42967200\t0.0579\t50\nchr13\t43161300\t43162200\t0.1906\t69\nchr13\t43966800\t43967700\t0.0966\t78\nchr13\t43971900\t43975200\t0.0096\t86\nchr13\t44036700\t44037300\t0.143\t64\nchr13\t44114400\t44114700\t0.3949\t64\nchr13\t45380400\t45381900\t0.1471\t27\nchr13\t45484500\t45486300\t0.0078\t112\nchr13\t45645600\t45650400\t0.0275\t100\nchr13\t45664200\t45664500\t0.0498\t58\nchr13\t46515300\t46515600\t0.2038\t45\nchr13\t47019300\t47019900\t0.3151\t71\nchr13\t47222400\t47224500\t0.0241\t164\nchr13\t47715900\t47716200\t0.2574\t77\nchr13\t47731200\t47731500\t0.3496\t69\nchr13\t47785500\t47787000\t0.1871\t84\nchr13\t48427200\t48428400\t0\t81\nchr13\t48465600\t48471600\t0\t100\nchr13\t49014000\t49014900\t0.1873\t86\nchr13\t49153800\t49158000\t0.0493\t75\nchr13\t49378500\t49379700\t0.0521\t77\nchr13\t49592400\t49593000\t0.0893\t62\nchr13\t49799400\t49800000\t0.1249\t108\nchr13\t50180400\t50185800\t0\t68\nchr13\t50555400\t50555700\t0.4271\t46\nchr13\t50982900\t50983200\t0.2047\t78\nchr13\t50985900\t50987700\t0.1935\t76\nchr13\t51172800\t51173100\t0.1807\t68\nchr13\t51641400\t51642000\t0.241\t129\nchr13\t51774600\t51775800\t0\t53\nchr13\t52058100\t52059600\t0.0246\t73\nchr13\t52218900\t52220100\t0.0815\t60\nchr13\t52229700\t52234200\t0\t71\nchr13\t52237200\t52239000\t0\t67\nchr13\t52247400\t52248000\t0.0506\t66\nchr13\t52252500\t52254000\t0.0297\t63\nchr13\t52257000\t52257600\t0.0279\t89\nchr13\t52259400\t52260000\t0\t65\nchr13\t52261800\t52263300\t0.0749\t61\nchr13\t52267500\t52268100\t0.0113\t59\nchr13\t52269900\t52274700\t0\t96\nchr13\t52278300\t52278900\t0.0963\t53\nchr13\t52284300\t52284600\t0.2592\t71\nchr13\t52294200\t52294500\t0.2805\t70\nchr13\t52296900\t52299300\t0.0143\t60\nchr13\t52302600\t52302900\t0.228\t67\nchr13\t52304100\t52306500\t0.013\t64\nchr13\t52327200\t52328100\t0.214\t73\nchr13\t52332000\t52332600\t0.1184\t67\nchr13\t52334100\t52334400\t0.0475\t71\nchr13\t52488900\t52489200\t0.0201\t61\nchr13\t52490700\t52491600\t0.0965\t62\nchr13\t52495200\t52496100\t0.1615\t53\nchr13\t52498200\t52498500\t0.2876\t58\nchr13\t52501200\t52501500\t0.417\t51\nchr13\t52506000\t52508700\t0.0371\t71\nchr13\t52513200\t52515900\t0.0249\t56\nchr13\t52518600\t52518900\t0.1327\t47\nchr13\t52523400\t52523700\t0.2115\t68\nchr13\t52527900\t52528500\t0.0209\t60\nchr13\t52530600\t52532100\t0.0378\t65\nchr13\t52533600\t52534200\t0.0378\t65\nchr13\t52538400\t52540200\t0.0252\t53\nchr13\t52543200\t52544700\t0.0845\t66\nchr13\t52546500\t52547100\t0.0056\t54\nchr13\t52552500\t52554300\t0.0412\t64\nchr13\t52557300\t52559100\t0.0588\t72\nchr13\t52567500\t52569300\t0\t70\nchr13\t52570500\t52570800\t0.2668\t60\nchr13\t52572300\t52576800\t0\t66\nchr13\t52587300\t52587600\t0.0679\t61\nchr13\t53094000\t53094300\t0.0213\t73\nchr13\t53095500\t53097300\t0.0213\t73\nchr13\t55320300\t55320600\t0.3153\t43\nchr13\t55812900\t55813200\t0.1871\t70\nchr13\t57139500\t57173400\t0\t168\nchr13\t57220200\t57220500\t0.3818\t56\nchr13\t57357900\t57358500\t0.2095\t75\nchr13\t57401400\t57401700\t0\t22\nchr13\t58512300\t58513800\t0.0032\t80\nchr13\t58672800\t58677900\t0\t74\nchr13\t59027700\t59029200\t0.2111\t69\nchr13\t59848500\t59850000\t0\t85\nchr13\t59984700\t59986500\t0\t79\nchr13\t60714300\t60714600\t0.2623\t58\nchr13\t60741900\t60744000\t0.0011\t70\nchr13\t60801300\t60801600\t0.2203\t62\nchr13\t60977700\t60978000\t0.3738\t99\nchr13\t63717000\t63726900\t0\t72\nchr13\t63742500\t63742800\t0.2887\t63\nchr13\t63744000\t63744300\t0.3612\t55\nchr13\t63747300\t63748500\t0\t79\nchr13\t63749700\t63755700\t0\t79\nchr13\t63759000\t63769200\t0\t70\nchr13\t63823500\t63830400\t0\t81\nchr13\t63831600\t63832800\t0\t81\nchr13\t63835500\t63835800\t0.2413\t53\nchr13\t63837000\t63837300\t0.2376\t58\nchr13\t64231500\t64232700\t0.0331\t58\nchr13\t66738900\t66743400\t0\t71\nchr13\t67325400\t67325700\t0.1997\t37\nchr13\t67527900\t67528200\t0.0451\t903\nchr13\t67563900\t67564200\t0.2469\t69\nchr13\t67682100\t67683600\t0.01\t87\nchr13\t70854600\t70854900\t0.0547\t573\nchr13\t71734200\t71734800\t0.0263\t34\nchr13\t72382500\t72382800\t0.256\t25\nchr13\t72613500\t72615300\t0.199\t70\nchr13\t73574400\t73574700\t0.3983\t46\nchr13\t73641300\t73642200\t0.1976\t62\nchr13\t73645800\t73646100\t0.1523\t41\nchr13\t74236200\t74237100\t0.0851\t71\nchr13\t74238900\t74241000\t0.0149\t80\nchr13\t74427000\t74431800\t0\t71\nchr13\t74539500\t74542200\t0.1065\t78\nchr13\t75729300\t75729600\t0.2695\t97\nchr13\t76545300\t76548000\t0.0325\t77\nchr13\t76613100\t76618500\t0\t88\nchr13\t77204400\t77205000\t0.3289\t72\nchr13\t77685000\t77685900\t0.2062\t77\nchr13\t77704200\t77705100\t0\t34\nchr13\t78020100\t78020400\t0.3507\t33\nchr13\t78095100\t78095400\t0.2212\t71\nchr13\t78153900\t78154200\t0.2068\t40\nchr13\t79086900\t79087200\t0.2318\t40\nchr13\t79818600\t79822500\t0\t86\nchr13\t79840500\t79844400\t0\t63\nchr13\t80153100\t80155200\t0.1534\t73\nchr13\t80916900\t80918100\t0.2343\t75\nchr13\t81067800\t81068100\t0.3759\t36\nchr13\t81173100\t81173400\t0.1137\t35\nchr13\t82048800\t82050900\t0.0017\t79\nchr13\t82499400\t82499700\t0.3782\t58\nchr13\t82538400\t82538700\t0.355\t77\nchr13\t82604700\t82605000\t0.445\t40\nchr13\t82742400\t82742700\t0.3816\t48\nchr13\t83523000\t83523300\t0.19\t61\nchr13\t83961600\t83966400\t0\t76\nchr13\t84502800\t84503100\t0.2508\t63\nchr13\t85124400\t85125000\t0.0279\t93\nchr13\t85127400\t85128000\t0.0279\t93\nchr13\t85395300\t85395600\t0\t12\nchr13\t85926300\t85927800\t0.0696\t80\nchr13\t86253000\t86258100\t0\t48\nchr13\t86259600\t86264700\t0\t48\nchr13\t86265900\t86268900\t0\t48\nchr13\t86649300\t86649600\t0.3657\t38\nchr13\t87074400\t87074700\t0.3991\t20\nchr13\t87627900\t87628200\t0.4463\t10\nchr13\t88199700\t88200600\t0.1504\t66\nchr13\t89090700\t89091300\t0.2359\t101\nchr13\t90325500\t90325800\t0.1218\t69\nchr13\t90669000\t90669300\t0.3463\t37\nchr13\t91605300\t91606200\t0\t72\nchr13\t92475300\t92475600\t0.3169\t63\nchr13\t92685600\t92691000\t0\t70\nchr13\t93490800\t93491400\t0.0208\t67\nchr13\t93492900\t93494400\t0.0208\t67\nchr13\t93541200\t93541800\t0.1642\t46\nchr13\t93844500\t93845700\t0.2401\t76\nchr13\t94374600\t94377600\t0.0044\t88\nchr13\t94731900\t94732500\t0.1758\t82\nchr13\t94819200\t94819500\t0.011\t58\nchr13\t95350500\t95350800\t0.1685\t29\nchr13\t95735100\t95735400\t0.1972\t77\nchr13\t95737800\t95738100\t0.1972\t77\nchr13\t95908500\t95909100\t0.3553\t61\nchr13\t96329700\t96330900\t0.3098\t77\nchr13\t97155900\t97157700\t0.0602\t75\nchr13\t97611300\t97611600\t0.3647\t60\nchr13\t97668600\t97672800\t0.0087\t75\nchr13\t97734300\t97734900\t0.1516\t71\nchr13\t97765200\t97766100\t0.2602\t70\nchr13\t99241800\t99242100\t0.1887\t74\nchr13\t100699500\t100700100\t0.0868\t83\nchr13\t100701300\t100704000\t0.0757\t71\nchr13\t104051400\t104051700\t0.0469\t67\nchr13\t104508900\t104509200\t0.1496\t27\nchr13\t104654100\t104655000\t0.0483\t65\nchr13\t105299700\t105300900\t0.0526\t55\nchr13\t105382200\t105382500\t0.0517\t24\nchr13\t105386400\t105387000\t0.1546\t88\nchr13\t106214100\t106217700\t0.062\t76\nchr13\t106779900\t106780500\t0.091\t75\nchr13\t106931100\t106931400\t0.3583\t67\nchr13\t107272200\t107272500\t0.2738\t42\nchr13\t107921400\t107922300\t0.1425\t56\nchr13\t107923500\t107923800\t0.3276\t44\nchr13\t107935200\t107935500\t0.1467\t82\nchr13\t108237900\t108238500\t0.1092\t76\nchr13\t108510600\t108516000\t0\t76\nchr13\t109218000\t109218600\t0.0024\t58\nchr13\t109488900\t109489200\t0.1397\t88\nchr13\t109569300\t109569600\t0.1459\t13\nchr13\t110252700\t110253000\t0.1655\t32\nchr13\t110385600\t110385900\t0.3777\t176\nchr13\t110481300\t110481900\t0.3933\t109\nchr13\t110530200\t110530500\t0.4488\t45\nchr13\t110580600\t110580900\t0.3045\t54\nchr13\t111052200\t111052500\t0.4512\t14\nchr13\t111254700\t111255000\t0.0128\t63\nchr13\t111340200\t111341700\t0\t145\nchr13\t111545700\t111546000\t0.4333\t66\nchr13\t111591900\t111592200\t0.0828\t64\nchr13\t111669300\t111703800\t0\t47\nchr13\t111753900\t111757200\t0\t38\nchr13\t111758400\t111781800\t0\t50\nchr13\t111783000\t111789000\t0\t46\nchr13\t112015200\t112015800\t0.0327\t67\nchr13\t112279200\t112279500\t0\t106\nchr13\t112281000\t112284600\t0\t106\nchr13\t112287900\t112288500\t0.258\t143\nchr13\t112290000\t112292400\t0\t180\nchr13\t112294200\t112296600\t0\t180\nchr13\t112298100\t112308000\t0\t133\nchr13\t112449900\t112450200\t0.4022\t38\nchr13\t112749900\t112750500\t0.3937\t80\nchr13\t112786200\t112786500\t0.2945\t57\nchr13\t113067300\t113069400\t0.0076\t144\nchr13\t113107500\t113107800\t0.3647\t19\nchr13\t113136600\t113136900\t0.1049\t28\nchr13\t113162100\t113162700\t0.1165\t42\nchr13\t113262900\t113263200\t0.2145\t195\nchr13\t113314500\t113314800\t0.2253\t28\nchr13\t113346600\t113346900\t0.3286\t25\nchr13\t113371500\t113371800\t0.2113\t91\nchr13\t113375400\t113375700\t0.2898\t42\nchr13\t113541600\t113542200\t0\t83\nchr13\t113725800\t113726400\t0.1697\t21\nchr13\t113745300\t113745600\t0.4848\t47\nchr13\t113751900\t113752200\t0.4367\t67\nchr13\t113824200\t113824500\t0.3519\t154\nchr13\t113831700\t113832000\t0.401\t30\nchr13\t113899200\t113900400\t0.0088\t38\nchr13\t113940600\t113941200\t0\t26\nchr13\t113985900\t113986200\t0\t16\nchr13\t113987400\t113988600\t0\t15\nchr13\t114006000\t114009000\t0.0363\t69\nchr13\t114028800\t114029100\t0.4161\t26\nchr13\t114070800\t114071100\t0.4573\t73\nchr13\t114083700\t114087000\t0\t56\nchr13\t114113700\t114114000\t0.0602\t176\nchr13\t114120000\t114120300\t0.4893\t42\nchr13\t114147600\t114147900\t0.4314\t43\nchr13\t114198900\t114199800\t0.3073\t191\nchr13\t114348900\t114349200\t0.2481\t74\nchr13\t114351900\t114352200\t0.1106\t121\nchr13\t114354000\t114354600\t0.0536\t244\nchr14\t16023600\t16034700\t0\t185\nchr14\t16035900\t16053900\t0\t185\nchr14\t16055100\t16055700\t0\t68\nchr14\t16056900\t16086600\t0\t68\nchr14\t16090200\t16093500\t0\t280\nchr14\t16095900\t16098600\t0.236\t695\nchr14\t16099800\t16100100\t0.4726\t627\nchr14\t16101900\t16102200\t0.4336\t436\nchr14\t16103400\t16104000\t0.2427\t4332\nchr14\t16133700\t16135200\t0\t154\nchr14\t16404000\t16404300\t0.0118\t47\nchr14\t18225000\t18225300\t0\t87\nchr14\t18226500\t18234900\t0\t87\nchr14\t18239400\t18240000\t0.1002\t86\nchr14\t18241200\t18246000\t0\t140\nchr14\t18247800\t18250200\t0\t140\nchr14\t18251700\t18254400\t0\t140\nchr14\t18255600\t18258600\t0.0601\t75\nchr14\t18259800\t18261000\t0.0601\t75\nchr14\t18264900\t18270900\t0\t104\nchr14\t18273300\t18273900\t0.0048\t64\nchr14\t18276300\t18276900\t0.0104\t75\nchr14\t18280200\t18288900\t0.0013\t97\nchr14\t18290400\t18291000\t0.0013\t97\nchr14\t18293100\t18293400\t0.1739\t74\nchr14\t18297900\t18298200\t0.1094\t63\nchr14\t18299700\t18301800\t0\t87\nchr14\t18303300\t18303600\t0\t81\nchr14\t18306000\t18311100\t0\t81\nchr14\t18312900\t18315000\t0\t81\nchr14\t18316200\t18317100\t0.0024\t60\nchr14\t18319200\t18321000\t0.016\t65\nchr14\t18323100\t18324900\t0\t81\nchr14\t18326100\t18329100\t0\t81\nchr14\t18331500\t18332100\t0.0073\t74\nchr14\t18334200\t18334800\t0\t80\nchr14\t18336000\t18339600\t0\t80\nchr14\t18341400\t18346500\t0\t80\nchr14\t18348900\t18349800\t0.0652\t70\nchr14\t18351600\t18370800\t0\t73\nchr14\t18372600\t18375000\t0\t73\nchr14\t18376500\t18386100\t0\t75\nchr14\t18387600\t18388200\t0.0085\t60\nchr14\t18389400\t18392100\t0.0085\t60\nchr14\t18393300\t18393600\t0.0085\t60\nchr14\t18395400\t18396600\t0\t68\nchr14\t18398100\t18398400\t0\t68\nchr14\t18400500\t18404400\t0.0252\t61\nchr14\t18406500\t18406800\t0.1429\t24\nchr14\t18410700\t18411300\t0.017\t70\nchr14\t18413100\t18413400\t0.017\t70\nchr14\t18414600\t18417000\t0.0061\t70\nchr14\t18418800\t18422100\t0.0635\t93\nchr14\t18424200\t18425700\t0.0097\t96\nchr14\t18427500\t18430200\t0.0837\t73\nchr14\t18431700\t18432000\t0\t82\nchr14\t18433500\t18434700\t0\t82\nchr14\t18435900\t18436200\t0\t82\nchr14\t18438000\t18438900\t0\t82\nchr14\t18441300\t18446400\t0.0383\t74\nchr14\t18448200\t18448500\t0.0907\t82\nchr14\t18449700\t18453600\t0.0907\t82\nchr14\t18454800\t18456000\t0.0541\t74\nchr14\t18462300\t18465300\t0\t83\nchr14\t18468300\t18471000\t0.0477\t81\nchr14\t18472500\t18475200\t0.0324\t85\nchr14\t18476700\t18477000\t0.0324\t85\nchr14\t18478200\t18479700\t0.21\t81\nchr14\t18483600\t18487500\t0.0243\t78\nchr14\t18492300\t18493200\t0\t64\nchr14\t18494700\t18496200\t0.2261\t81\nchr14\t18498300\t18501000\t0\t101\nchr14\t18502500\t18503100\t0\t101\nchr14\t18504900\t18510300\t0\t83\nchr14\t18513600\t18513900\t0.0517\t76\nchr14\t18517800\t18520500\t0\t71\nchr14\t18522600\t18522900\t0.0432\t71\nchr14\t18524700\t18526500\t0.026\t88\nchr14\t18527700\t18534300\t0\t88\nchr14\t18535800\t18538800\t0.0021\t79\nchr14\t18541200\t18541800\t0.0006\t46\nchr14\t18543600\t18546300\t0\t63\nchr14\t18549000\t18553800\t0\t63\nchr14\t18555600\t18556500\t0.0304\t68\nchr14\t18557700\t18558900\t0.0304\t68\nchr14\t18561600\t18561900\t0\t77\nchr14\t18563400\t18567600\t0\t77\nchr14\t18568800\t18579300\t0\t77\nchr14\t18580800\t18581100\t0\t77\nchr14\t18583500\t18585600\t0\t69\nchr14\t18588600\t18589800\t0.0653\t84\nchr14\t18591300\t18593400\t0.002\t137\nchr14\t18594900\t18595200\t0.002\t137\nchr14\t18596400\t18605400\t0.002\t137\nchr14\t18606900\t18608400\t0\t149\nchr14\t18610200\t18624000\t0\t149\nchr14\t18626400\t18627000\t0\t151\nchr14\t18628200\t18631200\t0\t151\nchr14\t18632400\t18649500\t0\t151\nchr14\t18653100\t18654600\t0.1863\t81\nchr14\t18663600\t18663900\t0.2951\t62\nchr14\t18696600\t18697800\t0.0241\t140\nchr14\t18700800\t18701100\t0.0185\t80\nchr14\t18702900\t18705000\t0.0185\t80\nchr14\t18706200\t18706800\t0.0185\t80\nchr14\t18708900\t18712500\t0.0011\t101\nchr14\t18862500\t18929700\t0\t151\nchr14\t18931500\t18949200\t0\t151\nchr14\t18951000\t18952500\t0.0283\t140\nchr14\t18954600\t18958200\t0\t174\nchr14\t18959400\t18963300\t0\t174\nchr14\t18964500\t19025100\t0\t179\nchr14\t19026300\t19026600\t0\t165\nchr14\t19028100\t19082400\t0\t165\nchr14\t19083600\t19086300\t0\t165\nchr14\t19087800\t19096500\t0\t161\nchr14\t19099500\t19106400\t0\t124\nchr14\t19108500\t19114200\t0\t114\nchr14\t19116000\t19118100\t0\t114\nchr14\t19119600\t19120200\t0\t122\nchr14\t19121400\t19123200\t0\t122\nchr14\t19124700\t19125300\t0.145\t100\nchr14\t19131000\t19134900\t0\t116\nchr14\t19137300\t19158600\t0\t134\nchr14\t19160700\t19161000\t0\t134\nchr14\t19165200\t19165500\t0.4713\t104\nchr14\t19176300\t19179900\t0.0928\t113\nchr14\t19183800\t19185000\t0.002\t112\nchr14\t19186800\t19187100\t0.1778\t78\nchr14\t19190700\t19191600\t0.0762\t67\nchr14\t19203900\t19204200\t0.2065\t70\nchr14\t19207200\t19210200\t0\t75\nchr14\t19211700\t19215300\t0\t75\nchr14\t19216800\t19279500\t0\t149\nchr14\t19282200\t19286400\t0\t109\nchr14\t19288500\t19288800\t0.0308\t130\nchr14\t19290000\t19290900\t0.0308\t130\nchr14\t19293600\t19309800\t0\t176\nchr14\t19311300\t19312200\t0\t176\nchr14\t19313700\t19317000\t0\t176\nchr14\t19319100\t19319400\t0.125\t48\nchr14\t19320600\t19340400\t0\t177\nchr14\t19341900\t19371900\t0\t177\nchr14\t19374900\t19376400\t0\t177\nchr14\t19379100\t19379400\t0.3421\t78\nchr14\t19382400\t19383900\t0\t175\nchr14\t19385100\t19413900\t0\t175\nchr14\t19415400\t19426200\t0\t201\nchr14\t19427700\t19442700\t0\t201\nchr14\t19444200\t19449900\t0\t201\nchr14\t19452300\t19486200\t0\t179\nchr14\t19487700\t19488000\t0\t179\nchr14\t19489800\t19498500\t0\t128\nchr14\t19500000\t19507500\t0\t128\nchr14\t19510200\t19510500\t0.2188\t68\nchr14\t19612500\t19615200\t0\t141\nchr14\t19616400\t19664400\t0\t149\nchr14\t19665600\t19666200\t0.1605\t76\nchr14\t19671600\t19672800\t0.181\t123\nchr14\t19681200\t19689300\t0\t119\nchr14\t19690500\t19700400\t0\t141\nchr14\t19701600\t19702200\t0\t141\nchr14\t19703400\t19704600\t0\t141\nchr14\t19706400\t19708200\t0\t141\nchr14\t19709700\t19713000\t0\t108\nchr14\t19714200\t19714800\t0\t108\nchr14\t19716300\t19721100\t0\t108\nchr14\t19722600\t19722900\t0.0248\t88\nchr14\t20107800\t20108100\t0.0826\t50\nchr14\t20153100\t20153400\t0.2129\t73\nchr14\t20233800\t20234100\t0.1342\t69\nchr14\t20266800\t20267100\t0.3446\t58\nchr14\t20505900\t20507700\t0.1021\t110\nchr14\t20882100\t20883900\t0\t69\nchr14\t20946300\t20946900\t0.058\t68\nchr14\t21183300\t21183600\t0.4225\t25\nchr14\t22637400\t22639200\t0.1985\t81\nchr14\t22674600\t22676100\t0\t65\nchr14\t22680000\t22681200\t0\t75\nchr14\t23920200\t23921700\t0.0207\t62\nchr14\t23957700\t23958000\t0.344\t57\nchr14\t23961900\t23962500\t0.2756\t54\nchr14\t23964600\t23964900\t0.2756\t54\nchr14\t23967600\t23968200\t0.04\t70\nchr14\t23979600\t23980500\t0.002\t59\nchr14\t23997000\t23997600\t0.2518\t51\nchr14\t23999700\t24000000\t0.376\t51\nchr14\t24002100\t24005400\t0.0144\t88\nchr14\t24022500\t24023100\t0.0151\t54\nchr14\t24111900\t24113100\t0\t67\nchr14\t24486300\t24489900\t0\t68\nchr14\t25205100\t25205400\t0.1738\t65\nchr14\t25207800\t25208100\t0.1799\t50\nchr14\t25947900\t25948200\t0.287\t61\nchr14\t26215800\t26216100\t0.4155\t62\nchr14\t26297100\t26297400\t0.2404\t71\nchr14\t26298900\t26299500\t0.2239\t58\nchr14\t26495700\t26496000\t0.2354\t31\nchr14\t26630100\t26634000\t0.0271\t84\nchr14\t26675700\t26676300\t0.0353\t67\nchr14\t26678100\t26678700\t0.1696\t66\nchr14\t27044700\t27045000\t0.2014\t66\nchr14\t27459900\t27460800\t0.0721\t60\nchr14\t27678000\t27678900\t0.0171\t96\nchr14\t28178400\t28178700\t0.3168\t50\nchr14\t28191600\t28191900\t0.3277\t95\nchr14\t28193400\t28194000\t0.0309\t65\nchr14\t28314000\t28314300\t0.2095\t65\nchr14\t28402500\t28402800\t0.2721\t40\nchr14\t28414800\t28415100\t0.2824\t72\nchr14\t28545300\t28545600\t0.2418\t49\nchr14\t29478600\t29481000\t0.0364\t83\nchr14\t30364800\t30367500\t0.001\t102\nchr14\t30368700\t30369000\t0.001\t102\nchr14\t30475500\t30475800\t0.4775\t59\nchr14\t30477300\t30477900\t0.2039\t75\nchr14\t30684900\t30690600\t0\t90\nchr14\t31247700\t31248000\t0.2694\t63\nchr14\t31249200\t31249500\t0.1281\t54\nchr14\t31473900\t31474200\t0.3925\t34\nchr14\t31794000\t31797900\t0\t59\nchr14\t32217000\t32217300\t0.3269\t13\nchr14\t32269200\t32269500\t0.0992\t67\nchr14\t34185900\t34186200\t0.225\t100\nchr14\t34205400\t34205700\t0.0684\t63\nchr14\t34294800\t34297200\t0\t61\nchr14\t34348800\t34349100\t0.4601\t12\nchr14\t34443300\t34443600\t0.4764\t37\nchr14\t34540800\t34547700\t0\t75\nchr14\t34555500\t34562100\t0\t73\nchr14\t35038500\t35040300\t0.0803\t60\nchr14\t35948400\t35949600\t0.2264\t75\nchr14\t35976900\t35977500\t0.4238\t63\nchr14\t36143100\t36145800\t0.0506\t89\nchr14\t36186600\t36187200\t0.3151\t74\nchr14\t36188400\t36190500\t0.0573\t84\nchr14\t37352100\t37353000\t0.0379\t53\nchr14\t37354500\t37354800\t0.1613\t36\nchr14\t38640600\t38640900\t0.4137\t60\nchr14\t39511800\t39512400\t0.0904\t46\nchr14\t39517500\t39517800\t0.1035\t75\nchr14\t39521700\t39522300\t0.287\t93\nchr14\t39629400\t39630900\t0.0139\t77\nchr14\t39936000\t39936300\t0.2272\t75\nchr14\t40327500\t40328700\t0.038\t87\nchr14\t40331100\t40331700\t0.0309\t42\nchr14\t40349400\t40350000\t0.1715\t79\nchr14\t40351500\t40352100\t0.1455\t57\nchr14\t40423200\t40423500\t0.313\t79\nchr14\t40719000\t40720200\t0.0394\t92\nchr14\t40728900\t40730400\t0.0047\t68\nchr14\t40952100\t40952700\t0.1698\t84\nchr14\t41420400\t41420700\t0.232\t36\nchr14\t41492400\t41492700\t0.2581\t25\nchr14\t42956100\t42956400\t0.2169\t68\nchr14\t42969000\t42969300\t0.2038\t84\nchr14\t43065600\t43066200\t0\t62\nchr14\t43256700\t43257000\t0.3508\t31\nchr14\t43266600\t43266900\t0.2773\t46\nchr14\t43371600\t43372800\t0.0537\t66\nchr14\t43405800\t43406100\t0.1321\t60\nchr14\t43494900\t43495200\t0.3048\t49\nchr14\t43601700\t43603200\t0.0716\t75\nchr14\t44643300\t44644500\t0.0137\t72\nchr14\t44674800\t44675100\t0.3101\t65\nchr14\t44705100\t44710800\t0\t87\nchr14\t44891400\t44891700\t0.1947\t84\nchr14\t44916300\t44916600\t0.233\t17\nchr14\t45389100\t45389700\t0.1786\t95\nchr14\t45477300\t45482700\t0.0554\t83\nchr14\t45844500\t45845100\t0.1236\t72\nchr14\t45884100\t45888000\t0.042\t67\nchr14\t46726500\t46727400\t0\t52\nchr14\t47795400\t47798400\t0.2082\t74\nchr14\t47902200\t47903700\t0.0766\t56\nchr14\t48187200\t48192300\t0\t79\nchr14\t48314700\t48315300\t0.1928\t61\nchr14\t48453600\t48454200\t0.1625\t65\nchr14\t48938700\t48939000\t0.1145\t14\nchr14\t49097700\t49098300\t0.1031\t72\nchr14\t49100100\t49100400\t0.1257\t96\nchr14\t49101900\t49102200\t0.2023\t73\nchr14\t49535100\t49535400\t0.1554\t64\nchr14\t49821300\t49821600\t0.2819\t13\nchr14\t50074200\t50074800\t0.0177\t31\nchr14\t51134700\t51135000\t0.319\t21\nchr14\t51794700\t51799800\t0\t76\nchr14\t52065600\t52065900\t0.1727\t45\nchr14\t52255800\t52257000\t0.0272\t71\nchr14\t52638600\t52638900\t0.4306\t58\nchr14\t53268000\t53268300\t0.2899\t70\nchr14\t53269800\t53270400\t0.2175\t67\nchr14\t53909400\t53911200\t0.0289\t81\nchr14\t55024800\t55025100\t0.0474\t65\nchr14\t55988400\t55992900\t0.0342\t91\nchr14\t56014200\t56014500\t0.1854\t64\nchr14\t56017200\t56018100\t0.1232\t78\nchr14\t56442000\t56447400\t0.0011\t89\nchr14\t56667900\t56673300\t0.0055\t113\nchr14\t56988900\t56989200\t0.3366\t68\nchr14\t57552300\t57552600\t0.15\t55\nchr14\t57626100\t57626400\t0.1979\t50\nchr14\t57628200\t57628500\t0.1983\t50\nchr14\t58032900\t58038300\t0\t93\nchr14\t58962300\t58962900\t0.0797\t34\nchr14\t59946900\t59951400\t0.0203\t85\nchr14\t60341400\t60341700\t0.1346\t54\nchr14\t60399000\t60399300\t0.0385\t55\nchr14\t60524700\t60525000\t0.1491\t53\nchr14\t60604800\t60606000\t0\t70\nchr14\t60611700\t60613200\t0\t76\nchr14\t60888600\t60888900\t0.3079\t39\nchr14\t61055100\t61060800\t0\t88\nchr14\t62284800\t62285400\t0.031\t24\nchr14\t62286600\t62288400\t0.04\t72\nchr14\t62536200\t62541900\t0\t65\nchr14\t62640300\t62640600\t0.3944\t84\nchr14\t62874900\t62875200\t0.2906\t73\nchr14\t62948700\t62949000\t0.2576\t71\nchr14\t63116700\t63122700\t0\t86\nchr14\t63864900\t63865500\t0.3042\t65\nchr14\t63870300\t63870600\t0.0846\t59\nchr14\t64893900\t64896600\t0\t65\nchr14\t64978800\t64979400\t0.0101\t86\nchr14\t66835800\t66836100\t0.3431\t60\nchr14\t67870500\t67870800\t0.1586\t68\nchr14\t67872000\t67872600\t0.229\t105\nchr14\t70424400\t70425000\t0.0128\t70\nchr14\t70476300\t70476600\t0.0531\t95\nchr14\t70480800\t70482000\t0.0077\t67\nchr14\t70547400\t70553100\t0\t94\nchr14\t70959900\t70960200\t0.0907\t83\nchr14\t71037300\t71038500\t0.0972\t72\nchr14\t71368200\t71370300\t0\t85\nchr14\t71843400\t71844300\t0.0058\t67\nchr14\t71846400\t71847600\t0.0058\t67\nchr14\t71978100\t71978400\t0.3533\t36\nchr14\t71979900\t71981100\t0.1087\t78\nchr14\t73516200\t73516500\t0.1728\t42\nchr14\t73543500\t73543800\t0.0094\t63\nchr14\t73545300\t73545600\t0.3172\t39\nchr14\t73549500\t73550100\t0.2293\t44\nchr14\t73557600\t73557900\t0.3301\t47\nchr14\t73575000\t73575300\t0.1502\t68\nchr14\t73581900\t73582200\t0.1821\t42\nchr14\t74994900\t74995800\t0\t99\nchr14\t76750800\t76751100\t0.4797\t23\nchr14\t77269500\t77270100\t0.285\t178\nchr14\t79048800\t79049100\t0.3605\t32\nchr14\t79128000\t79129800\t0.2353\t91\nchr14\t79308900\t79314600\t0\t73\nchr14\t79771500\t79771800\t0.222\t87\nchr14\t80031000\t80031300\t0.3635\t84\nchr14\t80858400\t80858700\t0.1856\t67\nchr14\t81116100\t81120000\t0\t87\nchr14\t81861300\t81861600\t0.0365\t130\nchr14\t81863100\t81863400\t0.1756\t53\nchr14\t82348800\t82351200\t0\t77\nchr14\t82352400\t82352700\t0\t77\nchr14\t82675500\t82675800\t0.4309\t15\nchr14\t83169600\t83169900\t0.0379\t40\nchr14\t83202300\t83204700\t0.0635\t71\nchr14\t83642700\t83643000\t0.2234\t60\nchr14\t85846800\t85847700\t0\t19\nchr14\t85885800\t85890900\t0\t80\nchr14\t86106900\t86107500\t0.1489\t49\nchr14\t86246100\t86246400\t0.1277\t69\nchr14\t86473200\t86473500\t0.1164\t67\nchr14\t86878500\t86879100\t0.2639\t45\nchr14\t87391800\t87392100\t0.3015\t42\nchr14\t87415500\t87415800\t0.2409\t76\nchr14\t89360700\t89362800\t0.2027\t80\nchr14\t90207600\t90207900\t0.2539\t73\nchr14\t90246300\t90246600\t0.1611\t42\nchr14\t90525600\t90525900\t0.2943\t61\nchr14\t91432800\t91436400\t0.0086\t102\nchr14\t91640400\t91645800\t0\t88\nchr14\t92640300\t92640600\t0.2054\t38\nchr14\t92910900\t92912100\t0.0165\t92\nchr14\t93413400\t93413700\t0.3083\t64\nchr14\t93722100\t93722400\t0.1243\t50\nchr14\t94590900\t94591200\t0.3329\t126\nchr14\t96883500\t96883800\t0.2431\t66\nchr14\t99332700\t99333000\t0.3797\t51\nchr14\t99420900\t99421200\t0.067\t549\nchr14\t99927900\t99928200\t0.2305\t571\nchr14\t100685700\t100686000\t0.1916\t12\nchr14\t100869300\t100870800\t0\t36\nchr14\t101266800\t101268600\t0.0209\t91\nchr14\t101270400\t101271600\t0.1025\t80\nchr14\t101524500\t101524800\t0.3532\t38\nchr14\t101572200\t101572500\t0.2652\t43\nchr14\t102677400\t102678000\t0.09\t137\nchr14\t103062600\t103062900\t0.3882\t57\nchr14\t104217000\t104217600\t0.2782\t47\nchr14\t104250900\t104252100\t0.009\t155\nchr14\t104720700\t104721000\t0.3782\t45\nchr14\t105110700\t105113100\t0.0016\t79\nchr14\t105229800\t105240900\t0\t254\nchr14\t105276000\t105277500\t0.1955\t58\nchr14\t105459600\t105459900\t0.2065\t14\nchr14\t105520800\t105521400\t0.1125\t92\nchr14\t105559800\t105560400\t0.0357\t58\nchr14\t105561600\t105562200\t0.1869\t61\nchr14\t105566100\t105566400\t0.0228\t49\nchr14\t105572400\t105572700\t0.0632\t15\nchr14\t105574800\t105576000\t0.0043\t74\nchr14\t105578700\t105579300\t0.005\t80\nchr14\t105584700\t105585000\t0.4252\t68\nchr14\t105594300\t105596400\t0.0089\t69\nchr14\t105597600\t105597900\t0.1384\t54\nchr14\t105603900\t105604200\t0.1676\t65\nchr14\t105607500\t105608400\t0.0195\t50\nchr14\t105618300\t105619200\t0.3612\t51\nchr14\t105626400\t105627000\t0.199\t83\nchr14\t105638100\t105638400\t0.2742\t30\nchr14\t105645300\t105645600\t0.0995\t53\nchr14\t105661500\t105661800\t0.3999\t30\nchr14\t105678900\t105679200\t0.3968\t26\nchr14\t105680400\t105680700\t0.0597\t59\nchr14\t105682200\t105682500\t0.109\t70\nchr14\t105685800\t105686400\t0.0652\t64\nchr14\t105692400\t105693300\t0.0008\t75\nchr14\t105695700\t105696900\t0.0199\t74\nchr14\t105714600\t105717000\t0.0048\t87\nchr14\t105719400\t105719700\t0.2441\t54\nchr14\t105722700\t105723000\t0.1678\t52\nchr14\t105726600\t105726900\t0.2132\t56\nchr14\t105735000\t105737100\t0.0126\t47\nchr14\t105740700\t105741000\t0.2089\t81\nchr14\t105755700\t105756300\t0.1898\t53\nchr14\t105768600\t105768900\t0.449\t101\nchr14\t105850500\t105850800\t0.3276\t78\nchr14\t105867600\t105867900\t0.0144\t20\nchr14\t105947100\t105947400\t0.354\t45\nchr14\t106001100\t106001400\t0.1507\t27\nchr14\t106335300\t106335900\t0.0161\t125\nchr14\t106337400\t106337700\t0.0161\t125\nchr14\t106341600\t106342200\t0.0211\t69\nchr14\t106360200\t106360800\t0.0232\t98\nchr14\t106362000\t106362600\t0.0154\t94\nchr14\t106366500\t106366800\t0.3471\t101\nchr14\t106464300\t106464600\t0.3459\t15\nchr14\t106471800\t106473300\t0\t32\nchr14\t106476600\t106481700\t0\t74\nchr14\t106483500\t106483800\t0\t74\nchr14\t106639800\t106640100\t0.1647\t63\nchr14\t106701600\t106703100\t0\t56\nchr14\t106716300\t106716900\t0.0848\t71\nchr14\t106720500\t106721100\t0.0229\t68\nchr14\t106744500\t106744800\t0.2282\t49\nchr14\t106748100\t106749600\t0\t55\nchr14\t106752300\t106753200\t0.2945\t347\nchr14\t106761300\t106761900\t0.2263\t55\nchr14\t106763700\t106764300\t0.1501\t81\nchr14\t106767600\t106768200\t0.0711\t64\nchr15\t17000100\t17009100\t0\t102\nchr15\t17080500\t17446200\t0\t2089\nchr15\t17447400\t17457900\t0\t69\nchr15\t17459400\t17498400\t0\t345\nchr15\t17500500\t17502600\t0\t100\nchr15\t17504700\t17506200\t0\t43\nchr15\t17507400\t17766600\t0\t139\nchr15\t17767800\t17913900\t0\t139\nchr15\t17915100\t18046500\t0\t129\nchr15\t18048600\t18217800\t0\t140\nchr15\t18219300\t18316200\t0\t140\nchr15\t18317400\t18341100\t0\t97\nchr15\t18343200\t18355800\t0\t97\nchr15\t18357000\t18801900\t0\t525\nchr15\t18804000\t18910800\t0\t362\nchr15\t18912600\t19344900\t0\t362\nchr15\t19346400\t19467300\t0\t275\nchr15\t19468500\t19563300\t0\t275\nchr15\t19564500\t19724700\t0\t289\nchr15\t19775400\t19783500\t0\t125\nchr15\t19789200\t19789500\t0\t27\nchr15\t19817100\t19818600\t0\t69\nchr15\t19820400\t19820700\t0.451\t231\nchr15\t19993500\t19994100\t0.0591\t56\nchr15\t19995900\t19996200\t0.1375\t56\nchr15\t19998300\t19998600\t0.1873\t59\nchr15\t19999800\t20000100\t0.2526\t50\nchr15\t20004600\t20009700\t0\t52\nchr15\t20013600\t20016900\t0\t60\nchr15\t20018400\t20019600\t0.0104\t52\nchr15\t20022300\t20028000\t0\t71\nchr15\t20029200\t20031600\t0\t71\nchr15\t20035200\t20036700\t0\t56\nchr15\t20039700\t20041800\t0\t54\nchr15\t20043600\t20046000\t0\t53\nchr15\t20047800\t20053800\t0.0025\t59\nchr15\t20057400\t20057700\t0.3866\t35\nchr15\t20063700\t20095200\t0\t68\nchr15\t20096700\t20104500\t0\t352\nchr15\t20106900\t20113800\t0\t86\nchr15\t20116200\t20116800\t0\t86\nchr15\t20118000\t20144400\t0\t86\nchr15\t20145600\t20147700\t0\t68\nchr15\t20148900\t20153100\t0\t68\nchr15\t20154600\t20155800\t0.0539\t55\nchr15\t20158500\t20167800\t0\t79\nchr15\t20169900\t20175600\t0\t79\nchr15\t20176800\t20179800\t0\t79\nchr15\t20181900\t20185500\t0\t66\nchr15\t20314500\t20314800\t0.2999\t88\nchr15\t20330100\t20330700\t0.01\t70\nchr15\t20332200\t20332500\t0.0422\t61\nchr15\t20423400\t20437800\t0\t57\nchr15\t20439900\t20440500\t0.0229\t46\nchr15\t20442000\t20447400\t0\t133\nchr15\t20448600\t20534400\t0\t133\nchr15\t20535600\t20562000\t0\t133\nchr15\t20563500\t20586300\t0\t133\nchr15\t20588700\t20604000\t0\t61\nchr15\t20605800\t20611800\t0\t61\nchr15\t20613300\t20614500\t0\t60\nchr15\t20615700\t20616000\t0\t60\nchr15\t20617200\t20623500\t0\t60\nchr15\t20626500\t20628300\t0\t57\nchr15\t20630100\t20640900\t0\t61\nchr15\t20673600\t20675100\t0\t51\nchr15\t20678400\t20678700\t0.1311\t31\nchr15\t20680200\t20680500\t0.1508\t39\nchr15\t20682000\t20682300\t0.0999\t32\nchr15\t20685000\t20685300\t0.06\t34\nchr15\t20730600\t20733300\t0.009\t42\nchr15\t20736000\t20754000\t0\t45\nchr15\t20755200\t20757300\t0\t27\nchr15\t20760000\t20791800\t0\t48\nchr15\t20793000\t20793600\t0\t20\nchr15\t20796000\t20844000\t0\t58\nchr15\t20845200\t20848200\t0\t51\nchr15\t20849400\t20859600\t0\t51\nchr15\t20860800\t20935500\t0\t51\nchr15\t20937900\t20946600\t0\t44\nchr15\t20947800\t20951100\t0\t44\nchr15\t20952600\t20954100\t0\t44\nchr15\t20955300\t20957100\t0\t44\nchr15\t20959800\t20960100\t0.274\t30\nchr15\t20961600\t20961900\t0.274\t30\nchr15\t20963700\t20986200\t0\t43\nchr15\t20989500\t20990400\t0\t32\nchr15\t20992200\t20992500\t0\t56\nchr15\t20994600\t21001200\t0\t56\nchr15\t21002400\t21015900\t0\t56\nchr15\t21020100\t21023700\t0\t53\nchr15\t21025200\t21038400\t0\t64\nchr15\t21040200\t21043200\t0\t49\nchr15\t21045600\t21052800\t0\t67\nchr15\t21054600\t21061200\t0\t49\nchr15\t21064200\t21064500\t0.3193\t33\nchr15\t21065700\t21069000\t0\t62\nchr15\t21070800\t21102600\t0\t62\nchr15\t21103800\t21150900\t0\t367\nchr15\t21152100\t21159600\t0\t367\nchr15\t21161100\t21163500\t0\t367\nchr15\t21164700\t21192900\t0\t367\nchr15\t21243300\t21244200\t0\t38\nchr15\t21247500\t21248100\t0.0867\t33\nchr15\t21251100\t21251400\t0.1077\t34\nchr15\t21254100\t21254400\t0.2156\t40\nchr15\t21274800\t21276000\t0\t39\nchr15\t21277200\t21283500\t0\t48\nchr15\t21285000\t21285300\t0\t48\nchr15\t21286500\t21291300\t0\t48\nchr15\t21293100\t21301500\t0\t62\nchr15\t21302700\t21317100\t0\t45\nchr15\t21318600\t21319200\t0\t26\nchr15\t21320700\t21327000\t0\t39\nchr15\t21330000\t21331800\t0\t57\nchr15\t21333000\t21360600\t0\t57\nchr15\t21362400\t21362700\t0\t30\nchr15\t21364500\t21379800\t0\t46\nchr15\t21381600\t21408900\t0\t65\nchr15\t21410400\t21417000\t0\t44\nchr15\t21418200\t21419700\t0\t36\nchr15\t21420900\t21421200\t0\t57\nchr15\t21422400\t21428100\t0\t57\nchr15\t21429600\t21430200\t0\t57\nchr15\t21431400\t21432900\t0\t57\nchr15\t21434100\t21449400\t0\t44\nchr15\t21450900\t21456600\t0\t44\nchr15\t21458100\t21458400\t0.022\t30\nchr15\t21460200\t21483000\t0\t66\nchr15\t21484800\t21509400\t0\t36\nchr15\t21510600\t21514500\t0\t24\nchr15\t21515700\t21516300\t0\t24\nchr15\t21517800\t21526200\t0\t24\nchr15\t21527400\t21529800\t0\t24\nchr15\t21537900\t21544200\t0.0041\t55\nchr15\t21545700\t21547200\t0.0041\t55\nchr15\t21551100\t21559800\t0\t32\nchr15\t21562200\t21568200\t0\t59\nchr15\t21569700\t21573900\t0.0009\t35\nchr15\t21576300\t21584400\t0\t38\nchr15\t21585600\t21586800\t0\t38\nchr15\t21588000\t21600300\t0\t55\nchr15\t21601800\t21608400\t0\t55\nchr15\t21610800\t21612900\t0\t55\nchr15\t21614700\t21622200\t0\t33\nchr15\t21624000\t21635100\t0\t51\nchr15\t21636900\t21640500\t0\t30\nchr15\t21641700\t21642000\t0.0318\t13\nchr15\t21644400\t21651900\t0\t41\nchr15\t21654300\t21747900\t0\t45\nchr15\t21749400\t21750300\t0\t37\nchr15\t21751500\t21763500\t0\t49\nchr15\t21764700\t21778500\t0\t49\nchr15\t21828900\t21854100\t0\t61\nchr15\t21855600\t21870300\t0\t61\nchr15\t21871500\t21920400\t0\t47\nchr15\t21922200\t21928500\t0\t47\nchr15\t21929700\t21954600\t0\t47\nchr15\t21955800\t21986700\t0\t47\nchr15\t21988500\t21997500\t0\t58\nchr15\t21998700\t22002900\t0\t58\nchr15\t22005300\t22035900\t0\t58\nchr15\t22037100\t22042800\t0\t58\nchr15\t22044900\t22048200\t0\t30\nchr15\t22050600\t22051500\t0\t14\nchr15\t22052700\t22053000\t0\t54\nchr15\t22054500\t22056000\t0\t54\nchr15\t22057200\t22079400\t0\t54\nchr15\t22080600\t22101000\t0\t39\nchr15\t22102500\t22121100\t0\t29\nchr15\t22122600\t22124700\t0.0024\t25\nchr15\t22128000\t22190700\t0\t52\nchr15\t22191900\t22202100\t0\t52\nchr15\t22203300\t22220400\t0\t52\nchr15\t22302000\t22302600\t0\t58\nchr15\t22303800\t22307100\t0\t58\nchr15\t22359300\t22370400\t0\t64\nchr15\t22371600\t22383000\t0\t55\nchr15\t22384500\t22386900\t0\t68\nchr15\t22388700\t22394700\t0\t68\nchr15\t22396500\t22412100\t0\t68\nchr15\t22414200\t22416600\t0\t68\nchr15\t22418100\t22418700\t0\t68\nchr15\t22420500\t22422000\t0.2123\t72\nchr15\t22423200\t22443900\t0\t125\nchr15\t22445100\t22448400\t0\t125\nchr15\t22449900\t22482300\t0\t125\nchr15\t22484100\t22494300\t0\t125\nchr15\t22496400\t22496700\t0\t125\nchr15\t22498200\t22499100\t0\t86\nchr15\t22500300\t22502700\t0\t86\nchr15\t22503900\t22511700\t0\t86\nchr15\t22513800\t22529700\t0\t86\nchr15\t22531200\t22546200\t0\t77\nchr15\t22547700\t22551900\t0\t77\nchr15\t22553700\t22557900\t0\t78\nchr15\t22560000\t22560600\t0.02\t53\nchr15\t22562100\t22564200\t0.0052\t82\nchr15\t22565400\t22570500\t0.0052\t82\nchr15\t22573800\t22581300\t0\t76\nchr15\t22583400\t22583700\t0.0171\t70\nchr15\t22585200\t22588800\t0.0171\t70\nchr15\t22591800\t22593900\t0.1487\t67\nchr15\t22602600\t22602900\t0.0145\t64\nchr15\t22605600\t22606200\t0.0749\t63\nchr15\t22608600\t22610100\t0.0307\t67\nchr15\t22614300\t22614600\t0.1967\t72\nchr15\t22615800\t22616100\t0.1967\t72\nchr15\t22673100\t22674900\t0.1243\t66\nchr15\t22676100\t22678800\t0.0653\t60\nchr15\t22680000\t22680300\t0.1562\t63\nchr15\t22686600\t22686900\t0.3937\t62\nchr15\t22704600\t22704900\t0.0952\t29\nchr15\t22745400\t22745700\t0.3302\t60\nchr15\t22770300\t22770600\t0.0054\t28\nchr15\t23124300\t23173800\t0\t101\nchr15\t23175300\t23175600\t0.0341\t90\nchr15\t23177400\t23178600\t0.0341\t90\nchr15\t23182800\t23183700\t0\t98\nchr15\t23186400\t23186700\t0.2402\t90\nchr15\t23188200\t23189400\t0.2023\t135\nchr15\t23191500\t23192400\t0.2023\t135\nchr15\t23194800\t23196000\t0\t138\nchr15\t23197500\t23198100\t0\t138\nchr15\t23199300\t23200200\t0\t138\nchr15\t23202000\t23202300\t0.1363\t113\nchr15\t23203800\t23204400\t0.1363\t113\nchr15\t23206500\t23208600\t0.0152\t90\nchr15\t23210100\t23210400\t0.0409\t100\nchr15\t23212500\t23213400\t0.0409\t100\nchr15\t23216400\t23218800\t0.0409\t100\nchr15\t23221500\t23221800\t0.2066\t50\nchr15\t23277000\t23295300\t0\t87\nchr15\t23296500\t23297100\t0.0437\t63\nchr15\t23298900\t23299500\t0.0422\t56\nchr15\t23303400\t23303700\t0.1532\t69\nchr15\t23313000\t23357400\t0\t137\nchr15\t23358900\t23359200\t0\t137\nchr15\t23362800\t23364000\t0.0399\t90\nchr15\t23366700\t23367600\t0.2048\t69\nchr15\t23428500\t23433900\t0\t71\nchr15\t23445000\t23445300\t0.089\t11\nchr15\t23676300\t23676600\t0.3703\t33\nchr15\t23993100\t23993400\t0.3102\t18\nchr15\t24134100\t24135000\t0.0002\t61\nchr15\t24137400\t24138600\t0.0207\t59\nchr15\t24191700\t24192300\t0.0057\t58\nchr15\t24261600\t24261900\t0.2824\t57\nchr15\t24357900\t24358200\t0.2368\t55\nchr15\t24918600\t24918900\t0.4441\t13\nchr15\t25459500\t25459800\t0.1934\t63\nchr15\t25528200\t25528500\t0.4428\t166\nchr15\t25758000\t25758900\t0.0241\t304\nchr15\t27852600\t27853200\t0.1756\t142\nchr15\t27998400\t27999000\t0.3456\t65\nchr15\t28146900\t28147200\t0.3307\t60\nchr15\t28200900\t28201200\t0.4741\t59\nchr15\t28202400\t28203300\t0.0054\t65\nchr15\t28205400\t28206000\t0.1991\t71\nchr15\t28213200\t28213500\t0.0468\t54\nchr15\t28234500\t28234800\t0.2326\t80\nchr15\t28302300\t28302600\t0.3276\t62\nchr15\t28305300\t28305900\t0.4165\t65\nchr15\t28318800\t28319100\t0.2612\t56\nchr15\t28322100\t28372800\t0\t145\nchr15\t28374600\t28429500\t0\t145\nchr15\t28430700\t28440000\t0\t102\nchr15\t28441200\t28452300\t0\t102\nchr15\t28465500\t28470900\t0\t93\nchr15\t28472700\t28475700\t0\t121\nchr15\t28478400\t28479300\t0\t136\nchr15\t28480800\t28491300\t0\t136\nchr15\t28495500\t28508400\t0\t136\nchr15\t28509600\t28510800\t0\t136\nchr15\t28512300\t28513800\t0\t122\nchr15\t28515300\t28541100\t0\t122\nchr15\t28542300\t28573500\t0\t122\nchr15\t28574700\t28581600\t0\t122\nchr15\t28582800\t28590600\t0\t122\nchr15\t28592400\t28600500\t0.0299\t73\nchr15\t28602300\t28606800\t0\t71\nchr15\t28608300\t28609500\t0\t75\nchr15\t28611000\t28611300\t0\t75\nchr15\t28612500\t28613400\t0\t75\nchr15\t28614600\t28628100\t0\t75\nchr15\t28629600\t28633200\t0\t75\nchr15\t28634700\t28641000\t0\t75\nchr15\t28642200\t28646400\t0\t62\nchr15\t28648500\t28652400\t0\t93\nchr15\t28654800\t28656300\t0.0581\t66\nchr15\t28658100\t28658700\t0.0581\t66\nchr15\t28659900\t28661700\t0\t62\nchr15\t28662900\t28674600\t0\t75\nchr15\t28679700\t28683300\t0\t64\nchr15\t28687500\t28688400\t0.2336\t61\nchr15\t28696800\t28697400\t0.0291\t59\nchr15\t28699500\t28700700\t0.1711\t55\nchr15\t28709100\t28710900\t0.2253\t74\nchr15\t28723800\t28724100\t0.3585\t57\nchr15\t28746600\t28748100\t0.1696\t59\nchr15\t28749300\t28752000\t0.1696\t59\nchr15\t28753500\t28753800\t0.2013\t65\nchr15\t28759500\t28759800\t0.2547\t53\nchr15\t28770900\t28771200\t0.253\t33\nchr15\t28789200\t28789500\t0.2459\t45\nchr15\t30082800\t30089400\t0\t104\nchr15\t30090900\t30091200\t0\t104\nchr15\t30093600\t30093900\t0.244\t50\nchr15\t30095700\t30103800\t0\t99\nchr15\t30105300\t30122700\t0\t99\nchr15\t30125400\t30135900\t0\t99\nchr15\t30137700\t30144600\t0\t99\nchr15\t30145800\t30148800\t0\t99\nchr15\t30150000\t30150300\t0\t99\nchr15\t30152400\t30153000\t0.0782\t59\nchr15\t30155700\t30156000\t0.2956\t30\nchr15\t30158400\t30162000\t0\t53\nchr15\t30163500\t30174900\t0\t61\nchr15\t30177000\t30180900\t0\t64\nchr15\t30183000\t30189300\t0\t58\nchr15\t30190500\t30191100\t0\t58\nchr15\t30192600\t30195600\t0\t66\nchr15\t30197700\t30208500\t0\t66\nchr15\t30210000\t30211200\t0\t66\nchr15\t30212700\t30224100\t0\t66\nchr15\t30225900\t30227400\t0\t66\nchr15\t30228900\t30245400\t0\t82\nchr15\t30246600\t30247200\t0\t82\nchr15\t30248400\t30252600\t0\t64\nchr15\t30253800\t30256200\t0\t64\nchr15\t30257400\t30291000\t0\t64\nchr15\t30292200\t30317700\t0\t68\nchr15\t30319200\t30321300\t0\t49\nchr15\t30322500\t30327300\t0\t96\nchr15\t30328800\t30346500\t0\t96\nchr15\t30348000\t30374700\t0\t96\nchr15\t30376200\t30442200\t0\t96\nchr15\t30445500\t30477300\t0\t73\nchr15\t30478800\t30483300\t0\t73\nchr15\t30494100\t30503400\t0\t64\nchr15\t30505500\t30511500\t0\t54\nchr15\t30513000\t30515100\t0\t62\nchr15\t30516600\t30520800\t0\t62\nchr15\t30522900\t30526500\t0.0359\t62\nchr15\t30527700\t30567000\t0\t96\nchr15\t30568200\t30585000\t0\t91\nchr15\t30586200\t30587700\t0\t91\nchr15\t30589500\t30591600\t0\t91\nchr15\t30592800\t30596700\t0\t91\nchr15\t30597900\t30602400\t0\t75\nchr15\t30604500\t30604800\t0.0275\t80\nchr15\t30606900\t30607500\t0.0299\t82\nchr15\t30610200\t30612300\t0.0315\t86\nchr15\t30613500\t30613800\t0.0315\t86\nchr15\t30640200\t30640500\t0.0549\t63\nchr15\t30652800\t30653400\t0.1413\t48\nchr15\t30656700\t30657000\t0.4552\t66\nchr15\t30681600\t30682200\t0.1024\t67\nchr15\t30692700\t30693300\t0.2152\t69\nchr15\t30699000\t30701700\t0\t68\nchr15\t30703500\t30703800\t0.2091\t63\nchr15\t30706800\t30707100\t0.2793\t51\nchr15\t30710100\t30710400\t0.2921\t55\nchr15\t30713700\t30714000\t0.3191\t55\nchr15\t30751500\t30751800\t0.0428\t65\nchr15\t30755400\t30755700\t0.1171\t55\nchr15\t30832200\t30832500\t0.395\t63\nchr15\t31510800\t31511700\t0.0627\t28\nchr15\t31620600\t31620900\t0.2851\t37\nchr15\t31650000\t31650900\t0.0981\t56\nchr15\t31653900\t31655400\t0.1252\t58\nchr15\t31691700\t31692600\t0.0084\t58\nchr15\t31695300\t31696500\t0.125\t59\nchr15\t31701900\t31702200\t0.1716\t59\nchr15\t31704000\t31707300\t0\t84\nchr15\t31712400\t31712700\t0.2852\t62\nchr15\t31723500\t31724100\t0.1813\t57\nchr15\t31912500\t31913100\t0.2718\t40\nchr15\t32154000\t32165400\t0\t74\nchr15\t32166600\t32183100\t0\t74\nchr15\t32186400\t32187600\t0\t74\nchr15\t32188800\t32207400\t0\t74\nchr15\t32208900\t32216400\t0\t62\nchr15\t32225100\t32225400\t0\t79\nchr15\t32226600\t32246700\t0\t79\nchr15\t32247900\t32279100\t0\t79\nchr15\t32280300\t32309700\t0\t79\nchr15\t32311200\t32312700\t0.0211\t60\nchr15\t32314500\t32323200\t0\t62\nchr15\t32324400\t32325300\t0\t62\nchr15\t32328300\t32328900\t0.048\t35\nchr15\t32330400\t32336700\t0\t59\nchr15\t32338200\t32339400\t0\t59\nchr15\t32340600\t32340900\t0\t59\nchr15\t32343300\t32346000\t0\t69\nchr15\t32347500\t32355600\t0\t69\nchr15\t32357700\t32375100\t0\t65\nchr15\t32376900\t32381100\t0\t60\nchr15\t32382600\t32382900\t0.0022\t39\nchr15\t32385300\t32385900\t0.087\t54\nchr15\t32387400\t32397300\t0\t85\nchr15\t32398500\t32404800\t0\t92\nchr15\t32406600\t32407200\t0\t83\nchr15\t32408400\t32409600\t0\t83\nchr15\t32410800\t32412900\t0\t83\nchr15\t32414100\t32414400\t0.3429\t41\nchr15\t32416200\t32420400\t0\t81\nchr15\t32422500\t32439600\t0\t82\nchr15\t32440800\t32484600\t0\t110\nchr15\t32485800\t32491200\t0\t110\nchr15\t32492700\t32502300\t0\t110\nchr15\t32504100\t32513700\t0\t58\nchr15\t32524500\t32551500\t0\t63\nchr15\t32552700\t32562000\t0\t63\nchr15\t32563500\t32564400\t0\t63\nchr15\t32565600\t32572800\t0\t63\nchr15\t32576700\t32606400\t0\t145\nchr15\t32630100\t32630400\t0.0579\t56\nchr15\t34381800\t34408800\t0\t107\nchr15\t34410000\t34416900\t0\t107\nchr15\t34419300\t34419900\t0.0005\t85\nchr15\t34422000\t34422900\t0.0005\t85\nchr15\t34523700\t34524000\t0.1112\t24\nchr15\t34527900\t34563300\t0\t86\nchr15\t34565100\t34567200\t0\t79\nchr15\t34568400\t34571100\t0.0031\t91\nchr15\t34638600\t34638900\t0.2976\t26\nchr15\t34716900\t34717200\t0.2083\t57\nchr15\t36197700\t36198000\t0.1263\t80\nchr15\t36199200\t36199500\t0.1263\t80\nchr15\t36683100\t36684000\t0.013\t70\nchr15\t37430100\t37430700\t0.1018\t90\nchr15\t37473900\t37474200\t0.3218\t50\nchr15\t37515000\t37515300\t0.1829\t48\nchr15\t38787300\t38787600\t0.1148\t47\nchr15\t38974800\t38975100\t0.2043\t15\nchr15\t39421800\t39425400\t0.0216\t100\nchr15\t39522900\t39523500\t0.1763\t59\nchr15\t40681800\t40684200\t0.0075\t57\nchr15\t41382300\t41384100\t0.0484\t107\nchr15\t41725500\t41725800\t0.3161\t25\nchr15\t43561500\t43596300\t0\t81\nchr15\t43599600\t43599900\t0.0334\t55\nchr15\t43605600\t43607400\t0\t73\nchr15\t43610400\t43619400\t0\t89\nchr15\t43642500\t43642800\t0.0971\t49\nchr15\t43652700\t43653600\t0.2056\t93\nchr15\t43660200\t43696200\t0\t81\nchr15\t43699200\t43699800\t0.1456\t69\nchr15\t43705200\t43706400\t0\t71\nchr15\t43709700\t43718700\t0\t81\nchr15\t43738500\t43739100\t0.1073\t52\nchr15\t44252700\t44257800\t0\t110\nchr15\t44823600\t44826900\t0\t80\nchr15\t44856900\t44857500\t0.169\t63\nchr15\t44888400\t44888700\t0.3241\t59\nchr15\t44922900\t44923200\t0.1014\t58\nchr15\t44936400\t44936700\t0.0814\t76\nchr15\t44943600\t44943900\t0.1975\t74\nchr15\t44967600\t44968200\t0.2735\t57\nchr15\t44998200\t44998500\t0.1658\t71\nchr15\t45031800\t45032100\t0.0398\t53\nchr15\t45043200\t45043500\t0.2875\t60\nchr15\t45071700\t45072300\t0\t76\nchr15\t45073800\t45076800\t0\t76\nchr15\t45111000\t45111300\t0.4069\t65\nchr15\t45135600\t45135900\t0.4096\t51\nchr15\t45462600\t45462900\t0.3075\t27\nchr15\t45598500\t45599700\t0.0008\t71\nchr15\t45775800\t45776100\t0.1986\t49\nchr15\t46107000\t46107300\t0.0961\t61\nchr15\t46368600\t46368900\t0.1938\t47\nchr15\t46745700\t46746300\t0.1353\t105\nchr15\t46748100\t46748700\t0.1353\t105\nchr15\t46998000\t46998900\t0.0076\t67\nchr15\t47133600\t47134200\t0.0728\t60\nchr15\t47166600\t47166900\t0.2955\t69\nchr15\t47169600\t47170800\t0.1953\t86\nchr15\t47279100\t47279400\t0.1814\t42\nchr15\t49263000\t49263600\t0.1148\t53\nchr15\t49356300\t49356900\t0.0177\t77\nchr15\t49398300\t49400400\t0.0046\t77\nchr15\t49401600\t49401900\t0.0046\t77\nchr15\t50833800\t50834100\t0.3008\t23\nchr15\t51032100\t51032400\t0.1916\t89\nchr15\t51174600\t51178800\t0.0619\t95\nchr15\t51417300\t51423300\t0\t93\nchr15\t51583200\t51585300\t0\t41\nchr15\t52233000\t52233300\t0\t18\nchr15\t52907100\t52908000\t0.0082\t43\nchr15\t53136900\t53139300\t0\t94\nchr15\t53156100\t53157000\t0\t63\nchr15\t53495100\t53495700\t0.0242\t80\nchr15\t53496900\t53497200\t0.0242\t80\nchr15\t53541600\t53542800\t0.1294\t84\nchr15\t53544000\t53544600\t0.25\t88\nchr15\t53545800\t53546100\t0.3543\t28\nchr15\t54051900\t54052500\t0.1057\t66\nchr15\t54477000\t54477300\t0.3362\t61\nchr15\t54926100\t54932100\t0\t121\nchr15\t55065600\t55065900\t0.0837\t68\nchr15\t55068300\t55068900\t0.0837\t68\nchr15\t55987200\t55987800\t0.0034\t62\nchr15\t56136300\t56136900\t0.3286\t67\nchr15\t56138100\t56138400\t0.3817\t80\nchr15\t56311500\t56314500\t0.0787\t119\nchr15\t56331900\t56332200\t0.3603\t24\nchr15\t56575500\t56576100\t0.1565\t72\nchr15\t57687600\t57688200\t0.061\t21\nchr15\t58126200\t58127100\t0.0111\t81\nchr15\t58128900\t58131600\t0.0111\t81\nchr15\t59420700\t59421000\t0\t21\nchr15\t59539500\t59539800\t0.3388\t26\nchr15\t60366600\t60368100\t0.1586\t61\nchr15\t60816000\t60816600\t0.0718\t21\nchr15\t60950400\t60951000\t0.2639\t76\nchr15\t60953100\t60953400\t0.2639\t76\nchr15\t61899000\t61899300\t0.1187\t74\nchr15\t64139400\t64139700\t0.1712\t48\nchr15\t64327800\t64331700\t0.0716\t102\nchr15\t65167200\t65167500\t0.4243\t123\nchr15\t65864100\t65864400\t0.2684\t10\nchr15\t66341400\t66341700\t0.3598\t32\nchr15\t66450000\t66452100\t0\t73\nchr15\t68133900\t68136000\t0\t30\nchr15\t68691300\t68691600\t0.17\t20\nchr15\t70130100\t70130400\t0.4493\t53\nchr15\t70729800\t70735200\t0\t87\nchr15\t70988100\t70988400\t0.1327\t71\nchr15\t71095200\t71096100\t0.2187\t80\nchr15\t71134800\t71135100\t0.39\t73\nchr15\t71175000\t71180100\t0\t93\nchr15\t71587200\t71587500\t0.2374\t35\nchr15\t71593200\t71593500\t0.2442\t36\nchr15\t71769000\t71769900\t0.0654\t72\nchr15\t71793600\t71796300\t0.3063\t81\nchr15\t71907300\t71907600\t0.1512\t63\nchr15\t72102000\t72102300\t0.2884\t77\nchr15\t72631800\t72663300\t0\t136\nchr15\t72664500\t72668700\t0\t136\nchr15\t72670200\t72670500\t0\t136\nchr15\t73219500\t73219800\t0.0949\t76\nchr15\t73510500\t73512900\t0.0215\t78\nchr15\t73533000\t73535100\t0.0238\t81\nchr15\t74068500\t74071800\t0\t145\nchr15\t74073600\t74092200\t0\t159\nchr15\t74093700\t74102400\t0\t159\nchr15\t74103600\t74105700\t0\t159\nchr15\t74977200\t74977500\t0.0438\t19\nchr15\t75255600\t75272400\t0\t147\nchr15\t75273600\t75273900\t0.2675\t57\nchr15\t75276600\t75295200\t0\t134\nchr15\t75480900\t75481200\t0.1983\t67\nchr15\t75702900\t75703200\t0.0784\t55\nchr15\t75708000\t75708600\t0.1157\t60\nchr15\t75716400\t75716700\t0.2473\t74\nchr15\t76538100\t76538400\t0.0885\t63\nchr15\t77077200\t77077800\t0.33\t33\nchr15\t77205900\t77206200\t0.3742\t63\nchr15\t77618400\t77618700\t0.1664\t260\nchr15\t77876400\t77876700\t0.1788\t57\nchr15\t77880000\t77880300\t0.3042\t55\nchr15\t77883000\t77883300\t0.0744\t58\nchr15\t77888700\t77889000\t0.152\t74\nchr15\t77948400\t77948700\t0.0715\t73\nchr15\t77949900\t77952900\t0\t86\nchr15\t77973300\t77973600\t0.3513\t41\nchr15\t78188400\t78189000\t0.2255\t99\nchr15\t78742800\t78746100\t0\t72\nchr15\t78747300\t78747600\t0.0502\t34\nchr15\t78780000\t78780300\t0.364\t71\nchr15\t79273200\t79275300\t0.1157\t94\nchr15\t79648800\t79649100\t0.0739\t74\nchr15\t81091500\t81091800\t0.079\t71\nchr15\t81655500\t81656100\t0.1239\t63\nchr15\t81659400\t81659700\t0.3052\t39\nchr15\t81669000\t81672600\t0.061\t74\nchr15\t81699900\t81702300\t0.1251\t75\nchr15\t81731400\t81732000\t0.0873\t71\nchr15\t81733800\t81734400\t0.0873\t71\nchr15\t81735600\t81736200\t0.0873\t71\nchr15\t81799200\t81799800\t0.0528\t82\nchr15\t81801900\t81803400\t0.0368\t92\nchr15\t81873600\t81874200\t0.1265\t68\nchr15\t81996300\t81997800\t0.0239\t90\nchr15\t81999000\t82001100\t0.0239\t90\nchr15\t82242300\t82243800\t0\t81\nchr15\t82250100\t82250400\t0.1592\t84\nchr15\t82318800\t82324200\t0\t73\nchr15\t82329000\t82331700\t0\t51\nchr15\t82337400\t82338000\t0.1672\t75\nchr15\t82339200\t82339800\t0\t107\nchr15\t82341000\t82341900\t0\t107\nchr15\t82346100\t82346400\t0.2531\t96\nchr15\t82348500\t82352100\t0\t123\nchr15\t82355100\t82367100\t0\t74\nchr15\t82368600\t82368900\t0.2533\t42\nchr15\t82421700\t82428900\t0\t86\nchr15\t82430100\t82431600\t0\t90\nchr15\t82433400\t82436100\t0\t90\nchr15\t82437300\t82449000\t0\t141\nchr15\t82450200\t82471800\t0\t141\nchr15\t82473000\t82473600\t0.3501\t89\nchr15\t82479000\t82479300\t0.247\t55\nchr15\t82484400\t82487100\t0\t53\nchr15\t82489500\t82491900\t0.1002\t56\nchr15\t82493100\t82497300\t0\t74\nchr15\t82500000\t82506900\t0\t66\nchr15\t82508100\t82526100\t0\t115\nchr15\t82883100\t82888800\t0\t77\nchr15\t82989900\t82990500\t0.0062\t50\nchr15\t82997700\t82998900\t0.035\t77\nchr15\t83328900\t83329500\t0.2535\t93\nchr15\t83384100\t83384400\t0.0745\t82\nchr15\t83386200\t83388600\t0.0745\t82\nchr15\t83451000\t83456700\t0\t75\nchr15\t83661900\t83662200\t0.2805\t64\nchr15\t84092700\t84093000\t0.1571\t69\nchr15\t84099600\t84101100\t0\t66\nchr15\t84165600\t84197400\t0\t81\nchr15\t84198900\t84252000\t0\t84\nchr15\t84253200\t84270000\t0\t43\nchr15\t84320100\t84360300\t0\t77\nchr15\t84362100\t84384000\t0\t52\nchr15\t84403800\t84425400\t0\t110\nchr15\t84426600\t84474300\t0\t96\nchr15\t84476100\t84493800\t0\t95\nchr15\t84495000\t84516900\t0\t95\nchr15\t84518100\t84525600\t0\t90\nchr15\t84564300\t84564600\t0.1583\t52\nchr15\t85188900\t85234500\t0\t153\nchr15\t85237800\t85238400\t0.0088\t66\nchr15\t85240200\t85244100\t0\t107\nchr15\t85250100\t85250400\t0.2291\t75\nchr15\t85265700\t85269300\t0.0043\t76\nchr15\t85270500\t85271100\t0.0043\t76\nchr15\t85434900\t85438200\t0.081\t70\nchr15\t85856100\t85856400\t0.2007\t56\nchr15\t85881900\t85882200\t0.2256\t100\nchr15\t86528700\t86529300\t0.0024\t90\nchr15\t86530800\t86531700\t0.0024\t90\nchr15\t86532900\t86534100\t0.0024\t90\nchr15\t87000000\t87001200\t0.1134\t65\nchr15\t87510300\t87515700\t0\t96\nchr15\t88555800\t88556100\t0.3162\t62\nchr15\t88855800\t88856700\t0\t130\nchr15\t88940700\t88942800\t0.0017\t78\nchr15\t89636400\t89637300\t0.0974\t78\nchr15\t89639400\t89639700\t0.0974\t78\nchr15\t89663700\t89664000\t0.3999\t53\nchr15\t89853600\t89854800\t0.1086\t81\nchr15\t89869200\t89869500\t0.2278\t64\nchr15\t90858900\t90859200\t0.219\t22\nchr15\t91504800\t91505100\t0.2404\t63\nchr15\t91750800\t91751100\t0.4535\t141\nchr15\t91762800\t91763400\t0.0205\t71\nchr15\t92137200\t92140500\t0.1263\t83\nchr15\t93676500\t93677100\t0.013\t88\nchr15\t93678300\t93679800\t0.013\t88\nchr15\t93681000\t93681300\t0.013\t88\nchr15\t96898200\t96898500\t0.2483\t103\nchr15\t97265700\t97268100\t0\t46\nchr15\t97269300\t97270800\t0.1382\t24\nchr15\t97437000\t97437300\t0.256\t61\nchr15\t98089200\t98089800\t0.027\t62\nchr15\t98096400\t98096700\t0.221\t64\nchr15\t99013800\t99014100\t0.057\t69\nchr15\t99805800\t99807000\t0.3413\t52\nchr15\t100367400\t100367700\t0.2377\t50\nchr15\t100419000\t100420200\t0.0474\t86\nchr15\t100421700\t100422900\t0.0474\t86\nchr15\t100557000\t100557600\t0.2726\t32\nchr15\t100706400\t100706700\t0.328\t32\nchr15\t100719000\t100720200\t0\t61\nchr15\t101130600\t101130900\t0.3192\t29\nchr15\t101311800\t101312100\t0.2267\t22\nchr15\t101627400\t101631000\t0.133\t96\nchr15\t101745600\t101747100\t0.0732\t62\nchr15\t101752800\t101753700\t0.0496\t122\nchr15\t101754900\t101764200\t0\t160\nchr15\t101766900\t101767200\t0.3441\t39\nchr15\t101860200\t101862300\t0\t76\nchr15\t101863800\t101865600\t0.0626\t84\nchr15\t101867700\t101869200\t0.0212\t71\nchr15\t101871900\t101873400\t0.0081\t84\nchr15\t101874900\t101875200\t0.0081\t84\nchr15\t101878800\t101879100\t0.3456\t59\nchr15\t101892900\t101893800\t0.1042\t86\nchr15\t101896500\t101897400\t0\t52\nchr15\t101900100\t101900400\t0.2156\t39\nchr15\t101905500\t101906100\t0.347\t67\nchr15\t101907600\t101907900\t0.0101\t71\nchr15\t101909700\t101912700\t0.0101\t71\nchr15\t101917500\t101918700\t0.035\t79\nchr15\t101921100\t101921400\t0.1487\t61\nchr15\t101922600\t101923200\t0.0217\t83\nchr15\t101926200\t101928300\t0\t117\nchr15\t101929500\t101937900\t0\t117\nchr15\t101939700\t101944800\t0\t117\nchr15\t101948700\t101949000\t0\t171\nchr15\t101950200\t101962200\t0\t171\nchr15\t101963400\t101964300\t0\t171\nchr15\t101966400\t101967300\t0.0148\t148\nchr15\t101968800\t101970300\t0.0148\t148\nchr15\t101971800\t101974500\t0.0148\t148\nchr15\t101975700\t101976900\t0\t159\nchr15\t101978100\t101981400\t0\t159\nchr16\t14400\t16800\t0\t148\nchr16\t18000\t18300\t0.001\t118\nchr16\t19800\t22500\t0.001\t118\nchr16\t25500\t26700\t0.0172\t78\nchr16\t28800\t29700\t0.0172\t78\nchr16\t153300\t153900\t0.0066\t66\nchr16\t163800\t164700\t0.0017\t53\nchr16\t172500\t173100\t0\t56\nchr16\t458400\t458700\t0.2609\t175\nchr16\t481500\t482100\t0.259\t55\nchr16\t494700\t495000\t0.3722\t395\nchr16\t585000\t585300\t0.1015\t21\nchr16\t599700\t600000\t0.1702\t77\nchr16\t612000\t612600\t0.2255\t31\nchr16\t846900\t847200\t0.2419\t501\nchr16\t858000\t858900\t0.4072\t108\nchr16\t886500\t886800\t0.4845\t38\nchr16\t895800\t896100\t0.4045\t51\nchr16\t953400\t954000\t0.2527\t39\nchr16\t960600\t962100\t0\t91\nchr16\t1025100\t1025700\t0.4222\t349\nchr16\t1043400\t1043700\t0.2957\t27\nchr16\t1092600\t1093200\t0.384\t105\nchr16\t1228800\t1229400\t0.0084\t60\nchr16\t1231800\t1232700\t0\t68\nchr16\t1233900\t1237800\t0.0015\t68\nchr16\t1241400\t1242000\t0.0034\t64\nchr16\t1248600\t1252500\t0.0021\t63\nchr16\t1253700\t1254600\t0\t66\nchr16\t1459500\t1459800\t0.3693\t28\nchr16\t1599000\t1600500\t0.23\t65\nchr16\t2134200\t2134500\t0.1666\t74\nchr16\t2542800\t2543400\t0.0002\t63\nchr16\t2547300\t2551200\t0\t72\nchr16\t2552700\t2559000\t0\t80\nchr16\t2560500\t2575800\t0\t80\nchr16\t2578500\t2584200\t0\t69\nchr16\t2600400\t2601000\t0.1623\t70\nchr16\t2606700\t2609400\t0\t84\nchr16\t2611800\t2614200\t0\t81\nchr16\t2616000\t2621400\t0\t69\nchr16\t2624400\t2639700\t0\t73\nchr16\t2642400\t2647500\t0\t73\nchr16\t2650800\t2654700\t0\t87\nchr16\t2657700\t2658300\t0.0019\t73\nchr16\t2679000\t2679300\t0.0326\t67\nchr16\t2686200\t2686800\t0.0055\t94\nchr16\t2688600\t2689500\t0\t71\nchr16\t2693700\t2696100\t0\t85\nchr16\t3072600\t3072900\t0.4505\t12\nchr16\t3886800\t3887100\t0.1546\t83\nchr16\t5201700\t5202300\t0.2527\t76\nchr16\t5500200\t5500500\t0.3564\t184\nchr16\t5754600\t5755200\t0.0229\t89\nchr16\t7008600\t7009200\t0.1654\t112\nchr16\t7291800\t7292100\t0.2543\t64\nchr16\t8058000\t8060400\t0\t84\nchr16\t8953800\t8954100\t0.0121\t32\nchr16\t9293700\t9294000\t0.3463\t54\nchr16\t9317400\t9317700\t0.3334\t57\nchr16\t9584700\t9590100\t0\t83\nchr16\t9686400\t9686700\t0.1808\t86\nchr16\t10288200\t10288500\t0.2954\t49\nchr16\t10479000\t10479300\t0.2345\t67\nchr16\t11925300\t11925600\t0.318\t78\nchr16\t11927700\t11931000\t0\t97\nchr16\t11934900\t11935200\t0.26\t56\nchr16\t11936400\t11937000\t0.4114\t54\nchr16\t11939400\t11940300\t0.0555\t70\nchr16\t14688000\t14768400\t0\t103\nchr16\t14773500\t14774100\t0.0295\t69\nchr16\t14776500\t14777400\t0\t92\nchr16\t14779800\t14800200\t0\t109\nchr16\t14801400\t14802000\t0.0946\t88\nchr16\t14803200\t14803800\t0.0169\t64\nchr16\t14806200\t14806500\t0.0143\t84\nchr16\t14808300\t14810700\t0.0143\t84\nchr16\t14813100\t14813400\t0.0783\t70\nchr16\t14819400\t14820300\t0\t63\nchr16\t14824500\t14824800\t0.3502\t45\nchr16\t14826600\t14827200\t0.0038\t77\nchr16\t14829000\t14829300\t0.3063\t60\nchr16\t14831400\t14835000\t0.0158\t68\nchr16\t14837700\t14838000\t0.0299\t71\nchr16\t14840100\t14841600\t0.0299\t71\nchr16\t14843100\t14844900\t0.0299\t71\nchr16\t14846400\t14849700\t0\t73\nchr16\t14853000\t14854500\t0.203\t96\nchr16\t14857200\t14858400\t0.1174\t64\nchr16\t14863500\t14864100\t0.01\t81\nchr16\t14865600\t14865900\t0.01\t81\nchr16\t14868000\t14868300\t0.2576\t69\nchr16\t14872200\t14872800\t0.1178\t72\nchr16\t14875200\t14875500\t0.2009\t83\nchr16\t14878200\t14878500\t0.2446\t43\nchr16\t14881800\t14882400\t0.0151\t50\nchr16\t14886300\t14886600\t0.2703\t47\nchr16\t14889900\t14891100\t0.099\t61\nchr16\t14895000\t14895300\t0.2281\t68\nchr16\t14896500\t14897100\t0\t73\nchr16\t14898600\t14899500\t0\t73\nchr16\t14901300\t14901600\t0.1699\t57\nchr16\t14903100\t14903400\t0.1044\t55\nchr16\t14905200\t14913300\t0\t149\nchr16\t14914500\t14915100\t0\t149\nchr16\t14916300\t14930400\t0\t149\nchr16\t14931900\t14932200\t0\t149\nchr16\t14933400\t14934600\t0.007\t88\nchr16\t14935800\t14946300\t0.0004\t95\nchr16\t14948700\t14953200\t0\t101\nchr16\t15103800\t15108900\t0.0059\t90\nchr16\t15112800\t15121800\t0\t95\nchr16\t15123600\t15123900\t0\t95\nchr16\t15126300\t15126600\t0.1321\t78\nchr16\t15134400\t15134700\t0.2843\t50\nchr16\t15138300\t15139500\t0\t84\nchr16\t15150600\t15151200\t0\t67\nchr16\t15152400\t15153300\t0\t67\nchr16\t15155700\t15156000\t0.0143\t69\nchr16\t15165600\t15166800\t0.0558\t72\nchr16\t15173400\t15173700\t0.1888\t52\nchr16\t15179100\t15179400\t0.0101\t61\nchr16\t15183600\t15190500\t0\t78\nchr16\t15193500\t15194100\t0.257\t75\nchr16\t15195900\t15196200\t0.0928\t70\nchr16\t15197700\t15201600\t0.0007\t69\nchr16\t15204300\t15204600\t0.1854\t48\nchr16\t15208200\t15208800\t0.0287\t62\nchr16\t15210600\t15216600\t0.0077\t68\nchr16\t15217800\t15218100\t0.0077\t68\nchr16\t15219600\t15220800\t0.1514\t77\nchr16\t15222000\t15222300\t0.1207\t74\nchr16\t15223500\t15226800\t0\t76\nchr16\t15234600\t15235200\t0.0289\t68\nchr16\t15236400\t15241800\t0\t82\nchr16\t15243000\t15261900\t0\t78\nchr16\t15263700\t15264000\t0.3453\t65\nchr16\t15266100\t15266700\t0.0344\t46\nchr16\t15268800\t15269100\t0.086\t74\nchr16\t15271500\t15273900\t0\t88\nchr16\t15276300\t15277500\t0.0789\t67\nchr16\t15279000\t15280500\t0.0339\t72\nchr16\t15282000\t15282300\t0.0339\t72\nchr16\t15284100\t15284400\t0.1146\t67\nchr16\t15295500\t15298200\t0.0208\t83\nchr16\t15300000\t15300300\t0.2755\t59\nchr16\t15305400\t15305700\t0.2025\t53\nchr16\t15308400\t15308700\t0.3652\t86\nchr16\t15310200\t15310500\t0.0206\t58\nchr16\t15315300\t15318300\t0.1591\t70\nchr16\t15319800\t15320700\t0\t70\nchr16\t15323100\t15323700\t0.1913\t92\nchr16\t15325200\t15325800\t0\t103\nchr16\t15327000\t15327300\t0\t103\nchr16\t15328800\t15366600\t0\t103\nchr16\t15367800\t15368100\t0.0195\t71\nchr16\t15369600\t15370200\t0.1143\t89\nchr16\t15372900\t15375000\t0.0568\t78\nchr16\t15378300\t15378900\t0.0139\t81\nchr16\t15380700\t15381000\t0.2781\t59\nchr16\t16218300\t16218900\t0.0083\t63\nchr16\t16224300\t16226100\t0\t63\nchr16\t16227900\t16228200\t0.2617\t63\nchr16\t16230300\t16233900\t0.015\t70\nchr16\t16239600\t16239900\t0.0714\t44\nchr16\t16241400\t16242300\t0\t77\nchr16\t16244400\t16249200\t0\t77\nchr16\t16250400\t16254000\t0\t77\nchr16\t16255500\t16257300\t0\t71\nchr16\t16259400\t16260300\t0\t71\nchr16\t16261800\t16262400\t0\t71\nchr16\t16263600\t16265100\t0\t71\nchr16\t16266900\t16268100\t0.1721\t43\nchr16\t16269600\t16357500\t0\t111\nchr16\t16359300\t16364700\t0\t111\nchr16\t16366200\t16366500\t0\t111\nchr16\t16367700\t16386300\t0\t99\nchr16\t16387500\t16418700\t0\t99\nchr16\t16421400\t16424400\t0.0039\t76\nchr16\t16426200\t16429800\t0\t91\nchr16\t16431000\t16431300\t0.0597\t59\nchr16\t16432800\t16446000\t0.0032\t81\nchr16\t16447200\t16448100\t0.0032\t81\nchr16\t16450500\t16450800\t0.0813\t77\nchr16\t16452000\t16452300\t0.0813\t77\nchr16\t16453500\t16453800\t0.0813\t77\nchr16\t16455000\t16456200\t0\t85\nchr16\t16457700\t16461600\t0\t85\nchr16\t16464600\t16465200\t0.0063\t54\nchr16\t16471500\t16473000\t0.313\t81\nchr16\t16475400\t16477500\t0.0694\t69\nchr16\t16478700\t16479600\t0.0137\t63\nchr16\t16482600\t16484700\t0\t68\nchr16\t16486200\t16488000\t0\t68\nchr16\t16489500\t16490400\t0\t68\nchr16\t16493700\t16528800\t0\t86\nchr16\t16531200\t16534800\t0\t86\nchr16\t16557300\t16557900\t0.0459\t69\nchr16\t16559700\t16560000\t0.0627\t70\nchr16\t16563900\t16567500\t0\t72\nchr16\t16571400\t16572000\t0.3737\t68\nchr16\t16589400\t16590000\t0.005\t70\nchr16\t16592400\t16592700\t0.0203\t40\nchr16\t16595100\t16595400\t0.0716\t68\nchr16\t16599000\t16599300\t0.1468\t67\nchr16\t16604700\t16605000\t0.1116\t74\nchr16\t16607700\t16608600\t0.1889\t67\nchr16\t16611000\t16611300\t0.221\t56\nchr16\t16613100\t16613400\t0.2819\t59\nchr16\t16614900\t16615200\t0.0431\t49\nchr16\t16616400\t16617300\t0\t54\nchr16\t16620600\t16621800\t0.058\t63\nchr16\t16623900\t16624500\t0.1416\t65\nchr16\t16625700\t16626300\t0.0009\t29\nchr16\t16639500\t16642800\t0\t66\nchr16\t16646700\t16650600\t0\t74\nchr16\t16653300\t16653600\t0.3701\t52\nchr16\t16655100\t16662600\t0\t78\nchr16\t16664100\t16683600\t0\t80\nchr16\t16684800\t16686600\t0\t80\nchr16\t16688400\t16689300\t0\t81\nchr16\t16690800\t16691700\t0\t81\nchr16\t16694100\t16699500\t0\t77\nchr16\t16701000\t16735200\t0\t77\nchr16\t16737300\t16737600\t0.1306\t60\nchr16\t16745400\t16745700\t0.2329\t56\nchr16\t16747800\t16748100\t0.2329\t56\nchr16\t16755000\t16756200\t0.2097\t82\nchr16\t16758000\t16758900\t0.0516\t67\nchr16\t16840500\t16846500\t0\t91\nchr16\t18076500\t18078600\t0.0126\t62\nchr16\t18080100\t18080700\t0.1738\t64\nchr16\t18087600\t18087900\t0.1708\t39\nchr16\t18090600\t18091200\t0.1442\t56\nchr16\t18095100\t18099600\t0\t73\nchr16\t18100800\t18102000\t0\t73\nchr16\t18105000\t18105600\t0.0458\t59\nchr16\t18107400\t18107700\t0.0133\t68\nchr16\t18109200\t18113100\t0.0133\t68\nchr16\t18115800\t18116100\t0.2851\t73\nchr16\t18120000\t18120600\t0.007\t59\nchr16\t18122100\t18128100\t0\t70\nchr16\t18129600\t18129900\t0.3014\t68\nchr16\t18131100\t18132300\t0.0611\t66\nchr16\t18133500\t18138600\t0\t73\nchr16\t18141600\t18142500\t0.2984\t52\nchr16\t18144900\t18148500\t0\t71\nchr16\t18152400\t18153000\t0.269\t70\nchr16\t18154500\t18155100\t0.0567\t56\nchr16\t18177600\t18180900\t0\t93\nchr16\t18183600\t18189600\t0\t93\nchr16\t18191700\t18193800\t0\t93\nchr16\t18202200\t18202500\t0.3126\t68\nchr16\t18204600\t18205800\t0.0972\t74\nchr16\t18207000\t18207300\t0.2906\t76\nchr16\t18221700\t18222000\t0.4151\t40\nchr16\t18224100\t18226200\t0.0183\t65\nchr16\t18228300\t18229800\t0\t76\nchr16\t18232200\t18232800\t0.3969\t75\nchr16\t18234600\t18234900\t0.2478\t62\nchr16\t18239100\t18240300\t0.0608\t59\nchr16\t18246600\t18247500\t0\t78\nchr16\t18250200\t18255000\t0\t78\nchr16\t18256500\t18256800\t0.074\t49\nchr16\t18258300\t18258600\t0.1327\t55\nchr16\t18261300\t18261600\t0.1327\t55\nchr16\t18264300\t18266400\t0.055\t60\nchr16\t18268200\t18278700\t0\t76\nchr16\t18280200\t18286200\t0\t72\nchr16\t18287400\t18287700\t0\t72\nchr16\t18288900\t18291000\t0\t80\nchr16\t18292200\t18305100\t0\t80\nchr16\t18306600\t18354000\t0\t107\nchr16\t18355200\t18435900\t0\t107\nchr16\t18486600\t18524400\t0\t80\nchr16\t18527400\t18528000\t0.2436\t76\nchr16\t18530100\t18532500\t0.0485\t95\nchr16\t18534600\t18535200\t0.0133\t56\nchr16\t18537600\t18538200\t0.0377\t59\nchr16\t18540900\t18543000\t0.0257\t83\nchr16\t18545700\t18547200\t0\t61\nchr16\t18549600\t18550200\t0.0601\t63\nchr16\t18551400\t18552600\t0.1213\t71\nchr16\t18554700\t18556200\t0.0142\t80\nchr16\t18558300\t18558600\t0.3465\t44\nchr16\t18566400\t18566700\t0.2005\t58\nchr16\t18600300\t18601200\t0.1043\t57\nchr16\t18603000\t18604200\t0.1615\t70\nchr16\t18611100\t18611400\t0.1275\t77\nchr16\t18621300\t18621900\t0.2105\t69\nchr16\t18624000\t18654600\t0\t86\nchr16\t18655800\t18658200\t0\t86\nchr16\t18659700\t18664800\t0\t71\nchr16\t18667200\t18668400\t0\t70\nchr16\t18672600\t18678900\t0\t76\nchr16\t18680100\t18687900\t0\t83\nchr16\t18689400\t18694500\t0\t83\nchr16\t18696600\t18699600\t0\t77\nchr16\t18702300\t18702600\t0.0075\t64\nchr16\t18705000\t18706200\t0\t76\nchr16\t18707400\t18714300\t0\t76\nchr16\t18716100\t18719700\t0\t69\nchr16\t18720900\t18722400\t0.034\t39\nchr16\t18723900\t18724500\t0.034\t39\nchr16\t18728400\t18729600\t0\t58\nchr16\t18731700\t18732300\t0.2128\t85\nchr16\t18736500\t18736800\t0.108\t72\nchr16\t18740400\t18740700\t0.081\t44\nchr16\t18742200\t18742500\t0.2219\t60\nchr16\t18758100\t18758700\t0.3025\t78\nchr16\t18760800\t18761400\t0.0162\t54\nchr16\t18763800\t18764400\t0.0397\t54\nchr16\t18781800\t18782400\t0.2693\t71\nchr16\t18821400\t18827100\t0\t68\nchr16\t18889200\t18889500\t0.189\t59\nchr16\t19003500\t19004100\t0.0875\t69\nchr16\t19219200\t19219500\t0.2792\t28\nchr16\t19786800\t19802400\t0\t37\nchr16\t20185500\t20186100\t0.0047\t89\nchr16\t20442900\t20451300\t0\t71\nchr16\t20456100\t20456400\t0.2488\t53\nchr16\t20484300\t20484600\t0.1726\t53\nchr16\t20490000\t20501100\t0\t83\nchr16\t20522400\t20532900\t0\t80\nchr16\t20539200\t20539500\t0.0782\t62\nchr16\t20566800\t20567100\t0.3281\t18\nchr16\t20571600\t20571900\t0.3826\t58\nchr16\t20576400\t20584800\t0\t73\nchr16\t20767200\t20767500\t0.2226\t40\nchr16\t20858700\t20859000\t0.219\t49\nchr16\t21043200\t21045000\t0.0282\t79\nchr16\t21047100\t21047400\t0.0282\t79\nchr16\t21351300\t21351600\t0.2069\t49\nchr16\t21353400\t21354000\t0.3279\t86\nchr16\t21379500\t21379800\t0\t115\nchr16\t21381600\t21386700\t0\t115\nchr16\t21389100\t21390900\t0\t115\nchr16\t21392100\t21396900\t0\t115\nchr16\t21399300\t21499200\t0\t115\nchr16\t21500700\t21501300\t0\t115\nchr16\t21732900\t21733200\t0.0122\t75\nchr16\t21738000\t21738600\t0.2123\t89\nchr16\t21739800\t21755700\t0\t97\nchr16\t21756900\t21757500\t0\t97\nchr16\t21761100\t21762600\t0\t75\nchr16\t21765600\t21766500\t0.0241\t74\nchr16\t21768600\t21771300\t0.0157\t75\nchr16\t21774000\t21774300\t0.3734\t76\nchr16\t21776700\t21794700\t0\t103\nchr16\t21796800\t21800100\t0\t70\nchr16\t21831600\t21832800\t0\t84\nchr16\t21834600\t21874500\t0\t122\nchr16\t21876300\t21884700\t0\t122\nchr16\t21886800\t21890700\t0\t83\nchr16\t21892200\t21893400\t0\t92\nchr16\t21894600\t21917400\t0\t92\nchr16\t21918600\t21933300\t0\t89\nchr16\t22433400\t22435200\t0\t73\nchr16\t22437900\t22539300\t0\t131\nchr16\t22542300\t22542600\t0.1674\t80\nchr16\t22548900\t22549500\t0.2755\t89\nchr16\t22554000\t22559400\t0\t91\nchr16\t22560600\t22573500\t0\t91\nchr16\t22577100\t22578900\t0\t90\nchr16\t22581600\t22582500\t0.2398\t88\nchr16\t22584900\t22586400\t0.0111\t91\nchr16\t22593000\t22599300\t0\t100\nchr16\t22600500\t22611900\t0\t89\nchr16\t22657500\t22657800\t0.1955\t50\nchr16\t22700100\t22700400\t0.055\t38\nchr16\t23517300\t23517600\t0.3684\t35\nchr16\t23599800\t23600100\t0.112\t73\nchr16\t25337100\t25337700\t0.1374\t58\nchr16\t26811900\t26812500\t0.021\t32\nchr16\t27138900\t27139500\t0.3336\t242\nchr16\t28334100\t28334700\t0.0656\t59\nchr16\t28340400\t28347300\t0\t108\nchr16\t28348500\t28359600\t0\t108\nchr16\t28360800\t28361400\t0\t108\nchr16\t28362900\t28376100\t0\t108\nchr16\t28377600\t28391700\t0\t81\nchr16\t28392900\t28413900\t0\t81\nchr16\t28415100\t28417800\t0\t81\nchr16\t28419600\t28441200\t0\t110\nchr16\t28442400\t28471800\t0\t110\nchr16\t28598700\t28601100\t0\t71\nchr16\t28611900\t28615500\t0\t85\nchr16\t28631400\t28631700\t0.2348\t43\nchr16\t28637100\t28637400\t0.1802\t70\nchr16\t28641600\t28641900\t0.1803\t101\nchr16\t28643400\t28665300\t0\t101\nchr16\t28666500\t28699500\t0\t102\nchr16\t28701300\t28737600\t0\t102\nchr16\t28739400\t28740300\t0\t110\nchr16\t28741800\t28743000\t0\t110\nchr16\t28744200\t28745700\t0\t110\nchr16\t28747500\t28752300\t0\t110\nchr16\t28753500\t28803000\t0\t110\nchr16\t28804200\t28809300\t0\t110\nchr16\t29037900\t29038200\t0\t126\nchr16\t29039700\t29054100\t0\t126\nchr16\t29055300\t29055600\t0.0636\t106\nchr16\t29056800\t29059500\t0.0636\t106\nchr16\t29061300\t29066100\t0\t102\nchr16\t29067900\t29068800\t0.0024\t102\nchr16\t29070600\t29070900\t0.1187\t60\nchr16\t29097900\t29098200\t0.3524\t50\nchr16\t29330400\t29330700\t0.3302\t45\nchr16\t29332800\t29333100\t0.0055\t75\nchr16\t29358600\t29358900\t0.1998\t57\nchr16\t29360400\t29365800\t0\t101\nchr16\t29368200\t29370000\t0\t101\nchr16\t29371200\t29376900\t0\t101\nchr16\t29378700\t29382900\t0\t101\nchr16\t29384100\t29388900\t0\t101\nchr16\t29390100\t29390400\t0.3427\t84\nchr16\t29392800\t29393100\t0.2879\t64\nchr16\t29394900\t29395500\t0.0283\t86\nchr16\t29397900\t29398500\t0.0283\t86\nchr16\t29403300\t29405100\t0.1263\t92\nchr16\t29412000\t29412300\t0.193\t62\nchr16\t29415300\t29416500\t0.1915\t79\nchr16\t29418900\t29419200\t0.3045\t73\nchr16\t29430900\t29436000\t0\t138\nchr16\t29437200\t29545200\t0\t138\nchr16\t29547900\t29550000\t0\t110\nchr16\t29551200\t29555700\t0\t110\nchr16\t29557500\t29559600\t0\t72\nchr16\t29561400\t29568600\t0\t72\nchr16\t29586900\t29587200\t0.1923\t56\nchr16\t29621100\t29621400\t0.3131\t74\nchr16\t29630100\t29630400\t0.3111\t69\nchr16\t29637300\t29637600\t0.2908\t84\nchr16\t30188700\t30276300\t0\t146\nchr16\t30277500\t30280800\t0\t131\nchr16\t30284100\t30295500\t0\t121\nchr16\t30297300\t30297600\t0.2438\t30\nchr16\t30298800\t30299700\t0\t70\nchr16\t30301200\t30308100\t0\t70\nchr16\t30327000\t30327300\t0.3239\t53\nchr16\t31104000\t31104900\t0\t149\nchr16\t31308900\t31309500\t0.0376\t59\nchr16\t31340400\t31341000\t0.0006\t57\nchr16\t31596000\t31596600\t0.013\t65\nchr16\t31759800\t31760700\t0\t59\nchr16\t31953900\t31954200\t0.1682\t72\nchr16\t31955700\t31956300\t0.1682\t72\nchr16\t31959300\t31959600\t0.1949\t69\nchr16\t31960800\t31961700\t0.1728\t79\nchr16\t31964400\t31964700\t0.0202\t41\nchr16\t31970700\t31971000\t0.1348\t80\nchr16\t31972200\t31973100\t0\t52\nchr16\t31977600\t31977900\t0.1481\t45\nchr16\t31989000\t31989900\t0.1739\t70\nchr16\t31998000\t31998300\t0.1992\t52\nchr16\t32014200\t32014500\t0.2459\t53\nchr16\t32017800\t32018400\t0.0647\t61\nchr16\t32023800\t32024400\t0.116\t47\nchr16\t32028900\t32044200\t0\t104\nchr16\t32046000\t32064900\t0\t104\nchr16\t32066700\t32071500\t0.0052\t152\nchr16\t32074500\t32084700\t0.0052\t152\nchr16\t32086500\t32096400\t0\t245\nchr16\t32098200\t32110200\t0.0218\t197\nchr16\t32112000\t32112300\t0.0218\t197\nchr16\t32117400\t32117700\t0.3326\t96\nchr16\t32122500\t32122800\t0.299\t88\nchr16\t32131200\t32134200\t0.0016\t87\nchr16\t32135700\t32151600\t0\t98\nchr16\t32153400\t32188800\t0\t98\nchr16\t32190900\t32200800\t0\t98\nchr16\t32202000\t32208900\t0\t98\nchr16\t32210700\t32213100\t0\t95\nchr16\t32214300\t32234400\t0\t95\nchr16\t32235600\t32254200\t0\t95\nchr16\t32255400\t32261400\t0\t71\nchr16\t32265300\t32269200\t0\t90\nchr16\t32270400\t32283000\t0\t71\nchr16\t32288100\t32381700\t0\t98\nchr16\t32395500\t32397300\t0\t69\nchr16\t32398500\t32398800\t0\t69\nchr16\t32413500\t32414100\t0.1102\t83\nchr16\t32416800\t32417400\t0.2561\t70\nchr16\t32421000\t32421300\t0.2212\t77\nchr16\t32424300\t32426700\t0.1355\t50\nchr16\t32429100\t32443200\t0\t87\nchr16\t32457000\t32457300\t0.0862\t53\nchr16\t32459700\t32460000\t0.2262\t46\nchr16\t32464800\t32467800\t0\t56\nchr16\t32473500\t32474100\t0.0233\t76\nchr16\t32476200\t32477100\t0.0233\t76\nchr16\t32478900\t32483700\t0.0023\t140\nchr16\t32488500\t32489700\t0\t74\nchr16\t32496900\t32498400\t0.2436\t56\nchr16\t32502300\t32503500\t0\t59\nchr16\t32505300\t32506800\t0.0022\t44\nchr16\t32508000\t32511300\t0\t58\nchr16\t32520900\t32524500\t0\t56\nchr16\t32526600\t32542500\t0\t56\nchr16\t32544600\t32549700\t0\t54\nchr16\t32551500\t32552100\t0\t40\nchr16\t32553300\t32553900\t0\t60\nchr16\t32555400\t32566200\t0\t60\nchr16\t32568600\t32572500\t0.0011\t63\nchr16\t32574000\t32575800\t0\t59\nchr16\t32577600\t32577900\t0.3296\t61\nchr16\t32579100\t32580900\t0\t60\nchr16\t32582100\t32582700\t0\t60\nchr16\t32583900\t32585400\t0\t75\nchr16\t32588100\t32600100\t0\t82\nchr16\t32602200\t32604900\t0\t82\nchr16\t32607600\t32612400\t0\t82\nchr16\t32613600\t32617200\t0\t82\nchr16\t32618400\t32620500\t0.0233\t67\nchr16\t32623200\t32624100\t0\t68\nchr16\t32628000\t32628600\t0.157\t81\nchr16\t32631900\t32632200\t0.291\t61\nchr16\t32635500\t32638800\t0\t77\nchr16\t32640000\t32643600\t0\t77\nchr16\t32646000\t32649000\t0\t158\nchr16\t32650500\t32806200\t0\t158\nchr16\t32807700\t32811300\t0\t140\nchr16\t32815200\t32815500\t0.2898\t98\nchr16\t32818200\t32818800\t0\t120\nchr16\t32820900\t32824200\t0\t120\nchr16\t32827800\t32828100\t0.1717\t96\nchr16\t32829900\t32830200\t0.0432\t132\nchr16\t32833800\t32840700\t0\t146\nchr16\t32847000\t32865900\t0\t97\nchr16\t32867400\t32868000\t0\t88\nchr16\t32869500\t32877000\t0\t88\nchr16\t32878800\t32879100\t0\t85\nchr16\t32880600\t32887800\t0\t85\nchr16\t32889000\t32889900\t0.2935\t88\nchr16\t32906100\t32906400\t0.2679\t75\nchr16\t32912100\t32912700\t0.3171\t89\nchr16\t32921100\t32921400\t0.0811\t48\nchr16\t32924100\t32924700\t0.0126\t70\nchr16\t32926200\t32928000\t0\t88\nchr16\t32929800\t32930100\t0.0961\t65\nchr16\t32937000\t32937300\t0.1862\t67\nchr16\t32939700\t32940300\t0.0262\t62\nchr16\t32949000\t32949300\t0.28\t68\nchr16\t32951400\t32988000\t0\t93\nchr16\t32991600\t32992200\t0.0999\t93\nchr16\t32994300\t32997300\t0\t80\nchr16\t32999400\t33000000\t0.0314\t89\nchr16\t33001200\t33001500\t0.0314\t89\nchr16\t33003900\t33014700\t0.0035\t97\nchr16\t33018000\t33020100\t0.0043\t96\nchr16\t33021300\t33024600\t0.0026\t108\nchr16\t33026400\t33027900\t0.1773\t131\nchr16\t33030000\t33039600\t0\t267\nchr16\t33042600\t33046200\t0.092\t157\nchr16\t33048300\t33048600\t0.092\t157\nchr16\t33049800\t33051000\t0.092\t157\nchr16\t33052200\t33053700\t0.092\t157\nchr16\t33055200\t33055800\t0.092\t157\nchr16\t33065400\t33214500\t0\t129\nchr16\t33264600\t33336300\t0\t339\nchr16\t33340200\t33392400\t0\t83\nchr16\t33442500\t33506700\t0\t111\nchr16\t33507900\t33508800\t0\t111\nchr16\t33510300\t33514800\t0.048\t64\nchr16\t33516000\t33516300\t0.048\t64\nchr16\t33518100\t33525600\t0\t99\nchr16\t33527100\t33528300\t0\t99\nchr16\t33529500\t33602700\t0\t99\nchr16\t33603900\t33609300\t0\t99\nchr16\t33619800\t33620100\t0.0137\t57\nchr16\t33625800\t33626100\t0.1764\t66\nchr16\t33636300\t33636600\t0.2117\t40\nchr16\t33645300\t33645600\t0.0102\t48\nchr16\t33648900\t33658200\t0\t59\nchr16\t33659400\t33660300\t0\t59\nchr16\t33666900\t33667200\t0.3617\t48\nchr16\t33668700\t33669300\t0.3448\t56\nchr16\t33684000\t33684300\t0.3922\t44\nchr16\t33687600\t33688500\t0.1271\t59\nchr16\t33690600\t33692100\t0.0383\t57\nchr16\t33698700\t33699300\t0.0307\t53\nchr16\t33705000\t33705300\t0.1372\t52\nchr16\t33717900\t33718200\t0.2753\t85\nchr16\t33727500\t33730200\t0.004\t164\nchr16\t33732000\t33732900\t0.004\t164\nchr16\t33734100\t33734700\t0.004\t164\nchr16\t33735900\t33736500\t0.141\t104\nchr16\t33739800\t33741300\t0.075\t129\nchr16\t33744900\t33745200\t0.294\t139\nchr16\t33751500\t33751800\t0.2846\t24\nchr16\t33757500\t33759000\t0\t41\nchr16\t33761100\t33764400\t0\t41\nchr16\t33766500\t33766800\t0.076\t20\nchr16\t33768000\t33768300\t0.1462\t28\nchr16\t33778200\t33797400\t0\t66\nchr16\t33798900\t33821400\t0\t66\nchr16\t33822600\t33822900\t0\t66\nchr16\t33825000\t33826800\t0\t66\nchr16\t33828600\t33830700\t0\t111\nchr16\t33831900\t33835200\t0\t111\nchr16\t33839100\t33839400\t0\t111\nchr16\t33843000\t33843300\t0.1581\t68\nchr16\t33845400\t33846000\t0.1581\t68\nchr16\t33848100\t33848400\t0.2668\t51\nchr16\t33849900\t33851400\t0.345\t61\nchr16\t33852900\t33854100\t0.2234\t54\nchr16\t33855900\t33857400\t0.0029\t68\nchr16\t33859800\t33860100\t0.3496\t76\nchr16\t33861900\t33862200\t0.3496\t76\nchr16\t33866100\t33894000\t0\t99\nchr16\t33895200\t33903600\t0\t99\nchr16\t33904800\t33905100\t0\t99\nchr16\t33907200\t33907500\t0.0507\t52\nchr16\t33909000\t33909300\t0.0507\t52\nchr16\t33916500\t33916800\t0.1034\t73\nchr16\t33920400\t33922500\t0.1406\t70\nchr16\t33924000\t33924600\t0\t90\nchr16\t33925800\t33927900\t0\t90\nchr16\t33929100\t33930600\t0\t90\nchr16\t33935400\t33935700\t0.1171\t62\nchr16\t33939300\t33942900\t0.0007\t70\nchr16\t33944100\t33945300\t0.0007\t70\nchr16\t33947400\t33948600\t0.0007\t70\nchr16\t33950400\t33958500\t0\t111\nchr16\t33961800\t33962400\t0\t64\nchr16\t33963600\t33964200\t0\t64\nchr16\t33965400\t33969300\t0\t64\nchr16\t33971400\t33982800\t0\t100\nchr16\t33984300\t33984900\t0\t100\nchr16\t33987000\t33991500\t0\t100\nchr16\t33996300\t34013100\t0\t98\nchr16\t34062000\t34068000\t0.0047\t2127\nchr16\t34072800\t34073700\t0.0061\t873\nchr16\t34085100\t34086300\t0.2121\t3841\nchr16\t34096200\t34099800\t0.1597\t2317\nchr16\t34186200\t34189200\t0\t63\nchr16\t34241400\t34241700\t0.2223\t47\nchr16\t34267800\t34268100\t0.1283\t35\nchr16\t34273800\t34274400\t0\t44\nchr16\t34275900\t34276200\t0.0129\t50\nchr16\t34278600\t34281600\t0\t80\nchr16\t34282800\t34284600\t0\t80\nchr16\t34286100\t34289400\t0\t116\nchr16\t34339500\t34494300\t0\t400\nchr16\t34495500\t34506600\t0\t400\nchr16\t34507800\t34517100\t0\t400\nchr16\t34518600\t34521000\t0\t46\nchr16\t34572600\t34573500\t0.2625\t7640\nchr16\t34574700\t34575900\t0.0918\t597\nchr16\t34580700\t34581300\t0.0943\t1089\nchr16\t34582500\t34582800\t0.4189\t5687\nchr16\t34586400\t34586700\t0.0725\t5927\nchr16\t34588500\t34590600\t0.0383\t6369\nchr16\t34593000\t34593900\t0.2103\t14692\nchr16\t34595700\t34596000\t0.3354\t4609\nchr16\t34744800\t34746000\t0\t64\nchr16\t34827300\t34829400\t0.0668\t61\nchr16\t34831500\t34831800\t0.0074\t24\nchr16\t34833300\t34836000\t0\t45\nchr16\t34838700\t34840800\t0\t45\nchr16\t34842000\t34842600\t0\t52\nchr16\t34844700\t34847100\t0\t52\nchr16\t34848900\t34852800\t0\t41\nchr16\t34854300\t34856100\t0\t52\nchr16\t34857600\t34857900\t0\t52\nchr16\t34859100\t34862400\t0.0023\t58\nchr16\t34863900\t34896600\t0\t389\nchr16\t34902300\t34902600\t0.1957\t1295\nchr16\t34911300\t34913100\t0\t53\nchr16\t34960200\t35072400\t0\t55\nchr16\t35609400\t35613900\t0\t76\nchr16\t35804100\t35804400\t0.0053\t64\nchr16\t35806500\t35807100\t0.1439\t54\nchr16\t35829300\t35829600\t0.3012\t69\nchr16\t35945400\t35946000\t0.0206\t56\nchr16\t35957100\t35957700\t0.006\t70\nchr16\t36009300\t36010200\t0\t72\nchr16\t36011700\t36012900\t0\t124\nchr16\t36016500\t36017700\t0\t108\nchr16\t36019200\t36019800\t0\t108\nchr16\t36246300\t36249000\t0\t50\nchr16\t36260700\t36261000\t0\t33\nchr16\t36312600\t36312900\t0.1557\t84\nchr16\t36314700\t36321300\t0\t124\nchr16\t36323700\t36325200\t0\t47\nchr16\t36327600\t36328800\t0\t146\nchr16\t36330000\t36330900\t0\t146\nchr16\t36333600\t36333900\t0\t32\nchr16\t36337500\t36340800\t0\t783\nchr16\t36342000\t36342300\t0\t314\nchr16\t36343800\t36714300\t0\t314\nchr16\t36716100\t36747600\t0\t314\nchr16\t36749100\t36976500\t0\t346\nchr16\t36977700\t36993900\t0\t346\nchr16\t36995100\t37725300\t0\t346\nchr16\t37727100\t37945200\t0\t475\nchr16\t37946400\t38048100\t0\t475\nchr16\t38049300\t38109900\t0\t475\nchr16\t38111100\t38253900\t0\t195\nchr16\t38255100\t38267100\t0\t195\nchr16\t38275800\t38276700\t0\t54\nchr16\t38278800\t38279100\t0.2046\t34\nchr16\t46382400\t46389600\t0.0077\t8715\nchr16\t46392600\t46392900\t0.2036\t1647\nchr16\t46394100\t46394400\t0.4106\t5057\nchr16\t46397100\t46398300\t0.0285\t5604\nchr16\t46450200\t46450500\t0.2637\t70\nchr16\t46623600\t46624800\t0.0124\t67\nchr16\t46693800\t46694400\t0.0533\t61\nchr16\t47645100\t47646300\t0.0435\t60\nchr16\t47864700\t47865000\t0.1111\t79\nchr16\t48017100\t48019200\t0.0438\t90\nchr16\t48768900\t48770400\t0.1145\t76\nchr16\t48771900\t48774000\t0.0103\t110\nchr16\t48917400\t48918000\t0.059\t31\nchr16\t49135800\t49136700\t0.1108\t80\nchr16\t49945500\t49945800\t0.0069\t29\nchr16\t50442600\t50442900\t0.3549\t113\nchr16\t50928600\t50928900\t0.373\t47\nchr16\t51014400\t51015000\t0.2881\t83\nchr16\t51373800\t51374100\t0.2933\t93\nchr16\t52175100\t52175400\t0.0968\t92\nchr16\t52248900\t52249500\t0.3967\t25\nchr16\t53401800\t53402100\t0.2773\t97\nchr16\t54042300\t54048000\t0\t81\nchr16\t55170600\t55170900\t0.018\t212\nchr16\t55761900\t55762200\t0.0262\t63\nchr16\t55788600\t55808400\t0\t84\nchr16\t56739000\t56739600\t0.1617\t76\nchr16\t57200100\t57200400\t0.2877\t94\nchr16\t58993800\t58994100\t0.0966\t49\nchr16\t59559600\t59560500\t0.2137\t51\nchr16\t59562300\t59564100\t0.0027\t103\nchr16\t59680800\t59681100\t0.1894\t72\nchr16\t59977800\t59979300\t0.0716\t47\nchr16\t59980500\t59980800\t0.0476\t73\nchr16\t59982000\t59982300\t0.0476\t73\nchr16\t59998200\t59998500\t0.021\t24\nchr16\t60196200\t60197700\t0.0701\t74\nchr16\t60524100\t60524400\t0.1661\t71\nchr16\t60526500\t60528300\t0.0116\t86\nchr16\t60876300\t60879900\t0\t79\nchr16\t61782900\t61787700\t0\t81\nchr16\t61802100\t61803300\t0\t79\nchr16\t61804800\t61807200\t0\t79\nchr16\t61920000\t61920900\t0.149\t76\nchr16\t63149400\t63150000\t0.2891\t66\nchr16\t63151800\t63152100\t0.1537\t62\nchr16\t63390300\t63390900\t0.0196\t79\nchr16\t65129400\t65129700\t0.1243\t15\nchr16\t65237700\t65238900\t0.1906\t58\nchr16\t65361900\t65362200\t0.1462\t77\nchr16\t65690100\t65690700\t0\t86\nchr16\t65692200\t65695800\t0\t86\nchr16\t66789300\t66789600\t0.2214\t28\nchr16\t67712400\t67713000\t0.0656\t87\nchr16\t68583600\t68589300\t0\t110\nchr16\t69665400\t69666300\t0.1256\t74\nchr16\t69946800\t69952200\t0.0238\t87\nchr16\t69956400\t69964200\t0\t91\nchr16\t69967800\t69969300\t0\t73\nchr16\t69971400\t69971700\t0.2177\t106\nchr16\t69973200\t69975900\t0.0269\t111\nchr16\t69989100\t69989400\t0.4201\t45\nchr16\t70050900\t70052700\t0.1102\t93\nchr16\t70106100\t70106400\t0.2335\t55\nchr16\t70144200\t70144500\t0.2539\t96\nchr16\t70146600\t70147200\t0.1116\t108\nchr16\t70167900\t70168500\t0.13\t107\nchr16\t70172400\t70172700\t0.133\t104\nchr16\t70174800\t70187400\t0\t153\nchr16\t70188600\t70191900\t0\t153\nchr16\t70200900\t70201200\t0.0037\t50\nchr16\t70205400\t70205700\t0.1685\t54\nchr16\t70812000\t70812300\t0.0825\t49\nchr16\t70814400\t70817100\t0.0186\t63\nchr16\t70822800\t70823400\t0.0033\t61\nchr16\t70825800\t70827600\t0.0016\t73\nchr16\t70828800\t70833600\t0.0016\t73\nchr16\t70838700\t70839300\t0.1608\t62\nchr16\t70843500\t70848900\t0.0338\t78\nchr16\t70852200\t70852500\t0.0943\t84\nchr16\t70854600\t70854900\t0.0943\t84\nchr16\t70856100\t70857300\t0.0376\t90\nchr16\t70860300\t70862700\t0.0457\t63\nchr16\t70864200\t70864500\t0.2287\t41\nchr16\t70869000\t70869300\t0.0859\t65\nchr16\t70872900\t70874700\t0.0006\t66\nchr16\t70876200\t70876800\t0.2567\t57\nchr16\t70879800\t70880100\t0.0233\t68\nchr16\t70885200\t70885500\t0.3623\t82\nchr16\t70889100\t70889700\t0.0154\t52\nchr16\t70891500\t70891800\t0.3458\t63\nchr16\t70894500\t70895400\t0.128\t75\nchr16\t70900800\t70901100\t0.2349\t80\nchr16\t70903500\t70904100\t0\t74\nchr16\t70907400\t70907700\t0.2065\t48\nchr16\t70910700\t70915800\t0.0068\t64\nchr16\t70917600\t70920300\t0.0113\t62\nchr16\t70923000\t70924800\t0.0026\t53\nchr16\t70927200\t70927500\t0.0938\t61\nchr16\t70928700\t70929900\t0.1164\t54\nchr16\t70935300\t70936200\t0.0007\t76\nchr16\t70941000\t70941300\t0.1698\t66\nchr16\t70946100\t70946400\t0.2421\t81\nchr16\t70951800\t70952400\t0.0037\t70\nchr16\t70953900\t70954500\t0.0037\t70\nchr16\t70957800\t70958100\t0.1487\t75\nchr16\t70962600\t70963800\t0.0461\t68\nchr16\t70968000\t70968600\t0.0524\t65\nchr16\t70969800\t70970400\t0.0649\t53\nchr16\t70972200\t70976100\t0.0648\t68\nchr16\t70983000\t70983600\t0.0851\t50\nchr16\t70986000\t70988700\t0\t78\nchr16\t71001000\t71001300\t0.1278\t52\nchr16\t71005800\t71006100\t0.3242\t67\nchr16\t71008800\t71010000\t0.0678\t90\nchr16\t71013600\t71013900\t0.1351\t64\nchr16\t71015700\t71016000\t0.1351\t64\nchr16\t71018100\t71018400\t0.0786\t53\nchr16\t71023500\t71025600\t0.0075\t76\nchr16\t71027700\t71028000\t0.2842\t50\nchr16\t71029200\t71029800\t0.1939\t55\nchr16\t71032500\t71033100\t0.1181\t73\nchr16\t71034900\t71036700\t0.0631\t69\nchr16\t71045700\t71046300\t0.0059\t59\nchr16\t71050800\t71051100\t0.3221\t47\nchr16\t71056800\t71058300\t0.0426\t76\nchr16\t71070600\t71070900\t0.2527\t49\nchr16\t71074800\t71075100\t0.3895\t49\nchr16\t71076600\t71077200\t0.0403\t53\nchr16\t71083800\t71085600\t0.0776\t66\nchr16\t71087400\t71092200\t0\t76\nchr16\t71094900\t71096100\t0.1614\t73\nchr16\t71099100\t71099700\t0.0056\t52\nchr16\t71100900\t71101500\t0.014\t74\nchr16\t71103300\t71106000\t0.0079\t69\nchr16\t71109900\t71112000\t0.0408\t69\nchr16\t71114700\t71115000\t0.2616\t44\nchr16\t71117100\t71117400\t0.1073\t64\nchr16\t71119200\t71123700\t0.0763\t76\nchr16\t71127300\t71127600\t0.1483\t64\nchr16\t71129100\t71129400\t0.3127\t64\nchr16\t71130900\t71132700\t0.0188\t73\nchr16\t71140200\t71140800\t0.0006\t63\nchr16\t71142300\t71142900\t0.1071\t66\nchr16\t71146500\t71150100\t0\t57\nchr16\t71154300\t71156100\t0.0723\t63\nchr16\t71158800\t71161200\t0\t65\nchr16\t71164200\t71164800\t0.0316\t62\nchr16\t71166300\t71166900\t0.2026\t56\nchr16\t71589900\t71590200\t0.1493\t79\nchr16\t71603100\t71604300\t0\t75\nchr16\t72056700\t72057000\t0.0061\t72\nchr16\t72058200\t72058800\t0.0061\t72\nchr16\t72060900\t72061200\t0.3913\t77\nchr16\t72077100\t72077400\t0.1899\t42\nchr16\t72342900\t72343200\t0.1431\t73\nchr16\t72497100\t72497400\t0.3713\t63\nchr16\t72570900\t72571200\t0.2805\t73\nchr16\t72584100\t72585600\t0.015\t98\nchr16\t72627900\t72633000\t0.028\t80\nchr16\t73824600\t73830300\t0\t80\nchr16\t74333700\t74334600\t0.0882\t81\nchr16\t74336400\t74336700\t0.0882\t81\nchr16\t74381700\t74382300\t0.0194\t116\nchr16\t74384100\t74386200\t0.0194\t116\nchr16\t74390100\t74391000\t0.2602\t100\nchr16\t74405100\t74406600\t0\t107\nchr16\t74408100\t74409300\t0.1219\t134\nchr16\t74414400\t74418600\t0.0416\t107\nchr16\t74420100\t74423400\t0.12\t120\nchr16\t74427600\t74428800\t0.196\t78\nchr16\t74526300\t74526600\t0.3232\t56\nchr16\t74799600\t74800200\t0.0101\t91\nchr16\t75204900\t75206100\t0.0006\t71\nchr16\t75222900\t75224100\t0.0292\t67\nchr16\t75504900\t75505200\t0.0606\t81\nchr16\t75545400\t75546000\t0.1318\t64\nchr16\t75822300\t75822600\t0.2037\t75\nchr16\t75824100\t75825000\t0.0041\t73\nchr16\t75826800\t75827400\t0.2205\t88\nchr16\t76610700\t76611000\t0.051\t77\nchr16\t76757400\t76758000\t0.0543\t89\nchr16\t78651900\t78652500\t0.059\t903\nchr16\t79696200\t79696500\t0.0539\t61\nchr16\t80089500\t80089800\t0.0509\t81\nchr16\t81082500\t81082800\t0.0282\t73\nchr16\t81085800\t81086400\t0.1958\t174\nchr16\t82139700\t82142400\t0.0116\t102\nchr16\t82144500\t82144800\t0.0116\t102\nchr16\t82275600\t82276200\t0.1766\t97\nchr16\t83637300\t83643300\t0\t75\nchr16\t84456000\t84458400\t0\t66\nchr16\t85405200\t85406700\t0.0517\t25\nchr16\t85410600\t85412700\t0.0371\t72\nchr16\t85451400\t85451700\t0.2875\t42\nchr16\t85519200\t85519500\t0.4334\t98\nchr16\t85972500\t85974000\t0\t220\nchr16\t86236200\t86237400\t0.1727\t54\nchr16\t86262600\t86262900\t0.1679\t77\nchr16\t86265000\t86266800\t0.231\t84\nchr16\t86419200\t86419800\t0.3725\t168\nchr16\t87162600\t87163200\t0.2199\t48\nchr16\t87222300\t87222600\t0.4895\t170\nchr16\t87726300\t87726600\t0.0758\t17\nchr16\t87738900\t87739200\t0.4161\t109\nchr16\t87999600\t88001100\t0.0985\t42\nchr16\t88217700\t88218000\t0.1439\t90\nchr16\t88219200\t88219500\t0.1439\t90\nchr16\t88277700\t88278600\t0.2151\t81\nchr16\t88295100\t88295400\t0.3122\t23\nchr16\t88547100\t88547400\t0.1313\t12\nchr16\t88728600\t88729500\t0.1513\t75\nchr16\t88771800\t88772100\t0.3603\t37\nchr16\t88831200\t88831800\t0.2077\t35\nchr16\t88894200\t88894500\t0.1518\t97\nchr16\t88933500\t88933800\t0.4167\t44\nchr16\t88950600\t88950900\t0.2773\t52\nchr16\t88955100\t88955700\t0.3941\t44\nchr16\t89029200\t89029500\t0.3498\t30\nchr16\t89068800\t89069100\t0.4576\t203\nchr16\t89083500\t89084100\t0.1601\t29\nchr16\t89166000\t89166300\t0.4319\t43\nchr16\t89268000\t89268600\t0.2172\t54\nchr16\t89400000\t89400600\t0.0438\t44\nchr16\t89412000\t89412300\t0.4048\t46\nchr16\t89421300\t89421600\t0.4738\t37\nchr16\t89535900\t89536200\t0.4146\t83\nchr16\t89587800\t89588100\t0.4558\t32\nchr16\t89598600\t89598900\t0.198\t36\nchr16\t89634900\t89635200\t0.3597\t59\nchr16\t89647800\t89648400\t0.0279\t42\nchr16\t89879400\t89879700\t0.3179\t47\nchr16\t89901600\t89902500\t0.0381\t44\nchr16\t90003600\t90004500\t0.0977\t51\nchr16\t90008100\t90008400\t0.457\t67\nchr16\t90100800\t90101400\t0.0448\t89\nchr16\t90107400\t90121200\t0\t434\nchr16\t90122400\t90161700\t0\t434\nchr16\t90163200\t90166800\t0.0138\t81\nchr16\t90169500\t90173400\t0.0117\t63\nchr16\t90174600\t90177000\t0\t114\nchr16\t90178200\t90185700\t0\t114\nchr16\t90186900\t90197100\t0\t114\nchr16\t90198600\t90207000\t0.0011\t126\nchr16\t90208200\t90211800\t0.0011\t126\nchr16\t90213600\t90214800\t0.0011\t126\nchr16\t90216000\t90228000\t0\t112\nchr17\t60000\t63300\t0\t34\nchr17\t65700\t89700\t0\t93\nchr17\t90900\t114000\t0\t93\nchr17\t115800\t129900\t0\t1057\nchr17\t132600\t133800\t0\t101\nchr17\t135600\t136500\t0\t101\nchr17\t137700\t138900\t0\t101\nchr17\t140100\t141000\t0.0151\t73\nchr17\t166800\t168600\t0\t28\nchr17\t192000\t192300\t0.1814\t12\nchr17\t201600\t201900\t0.1127\t270\nchr17\t217500\t218100\t0.392\t188\nchr17\t220500\t221400\t0.1\t131\nchr17\t234000\t234300\t0.4544\t43\nchr17\t242400\t242700\t0.412\t65\nchr17\t253800\t257700\t0.0473\t165\nchr17\t287400\t287700\t0.3276\t15\nchr17\t295500\t295800\t0.3881\t31\nchr17\t303600\t304200\t0.0886\t84\nchr17\t340500\t341100\t0.44\t26\nchr17\t355800\t356400\t0.2301\t79\nchr17\t363600\t363900\t0.2632\t13\nchr17\t370200\t370500\t0.4869\t50\nchr17\t402900\t404400\t0\t86\nchr17\t505800\t506700\t0.3062\t51\nchr17\t510000\t510300\t0.2472\t44\nchr17\t513900\t514200\t0.4833\t52\nchr17\t618000\t618300\t0.1027\t30\nchr17\t646500\t646800\t0.4382\t198\nchr17\t648900\t649500\t0.26\t123\nchr17\t658200\t658500\t0.3875\t85\nchr17\t727500\t728100\t0.2188\t89\nchr17\t810000\t810300\t0.4619\t86\nchr17\t860400\t860700\t0.389\t49\nchr17\t867000\t867300\t0.3788\t38\nchr17\t894300\t894600\t0.2535\t31\nchr17\t941700\t942900\t0.3922\t82\nchr17\t952200\t952800\t0.1667\t81\nchr17\t1006800\t1007100\t0.1411\t21\nchr17\t1053000\t1053300\t0.3175\t16\nchr17\t1065000\t1065300\t0.4066\t47\nchr17\t1117200\t1119300\t0.087\t77\nchr17\t1131300\t1131600\t0.4656\t17\nchr17\t1308000\t1311600\t0\t137\nchr17\t1738800\t1739100\t0.2906\t66\nchr17\t1740900\t1741200\t0.4846\t61\nchr17\t2052600\t2052900\t0.0024\t29\nchr17\t2355000\t2356500\t0.225\t110\nchr17\t2448000\t2448600\t0.0066\t62\nchr17\t3051300\t3053100\t0\t83\nchr17\t3054300\t3056400\t0\t83\nchr17\t3058500\t3060300\t0.0029\t45\nchr17\t3062100\t3062400\t0.1005\t71\nchr17\t3064800\t3065100\t0.0055\t49\nchr17\t3066600\t3068700\t0\t72\nchr17\t3071100\t3071400\t0.4567\t70\nchr17\t3072900\t3073500\t0.003\t66\nchr17\t3079500\t3079800\t0.2641\t61\nchr17\t3147600\t3148200\t0.2019\t70\nchr17\t3150300\t3150600\t0.0706\t68\nchr17\t3179400\t3182100\t0.0593\t78\nchr17\t3230700\t3231300\t0.0241\t64\nchr17\t3233100\t3233700\t0.3941\t53\nchr17\t3235500\t3238200\t0\t65\nchr17\t3241800\t3242100\t0\t61\nchr17\t3243900\t3246000\t0\t61\nchr17\t3248100\t3250200\t0\t61\nchr17\t3252300\t3252900\t0.0076\t63\nchr17\t3274500\t3275100\t0.2808\t46\nchr17\t3327300\t3328500\t0.1286\t63\nchr17\t3329700\t3330000\t0.1003\t98\nchr17\t3351300\t3351600\t0.0243\t59\nchr17\t3420600\t3420900\t0.2491\t61\nchr17\t3455400\t3455700\t0.4219\t63\nchr17\t3687000\t3687900\t0.0149\t18\nchr17\t4089900\t4090200\t0.0791\t41\nchr17\t4462200\t4462500\t0.1108\t17\nchr17\t4639800\t4640100\t0.3856\t19\nchr17\t5561400\t5561700\t0.4189\t15\nchr17\t6658800\t6659100\t0.195\t45\nchr17\t7749300\t7749600\t0.4472\t90\nchr17\t9616200\t9621900\t0\t89\nchr17\t10554000\t10554300\t0.4546\t73\nchr17\t10759200\t10759500\t0.4687\t41\nchr17\t11478000\t11478900\t0.1305\t88\nchr17\t11654100\t11654400\t0.2706\t52\nchr17\t11846100\t11847000\t0.1174\t67\nchr17\t12443100\t12444000\t0.1107\t21\nchr17\t12450000\t12453600\t0.0097\t115\nchr17\t12651900\t12652200\t0.0466\t21\nchr17\t12654900\t12655200\t0.1786\t57\nchr17\t13468200\t13468500\t0.2673\t26\nchr17\t13496400\t13496700\t0.3377\t55\nchr17\t13782600\t13783200\t0.1405\t26\nchr17\t13797000\t13797300\t0.3342\t15\nchr17\t14022300\t14023800\t0\t69\nchr17\t14026800\t14027100\t0.2693\t64\nchr17\t14177400\t14178300\t0.0564\t60\nchr17\t14234400\t14234700\t0.1659\t78\nchr17\t14237400\t14240400\t0.0018\t61\nchr17\t14345100\t14345400\t0.3275\t51\nchr17\t15537000\t15537300\t0.1935\t44\nchr17\t15557700\t15558000\t0.1975\t41\nchr17\t15574200\t15574800\t0.2172\t64\nchr17\t15600300\t15600600\t0.2234\t56\nchr17\t15635700\t15636000\t0.2469\t81\nchr17\t15637500\t15637800\t0.2587\t116\nchr17\t15642600\t15642900\t0.3576\t65\nchr17\t15700200\t15700500\t0.2929\t60\nchr17\t15718800\t15719100\t0.2015\t57\nchr17\t15730200\t15730500\t0.175\t57\nchr17\t15735600\t15735900\t0.3375\t66\nchr17\t15792600\t15792900\t0.1253\t69\nchr17\t15794100\t15794400\t0.1253\t69\nchr17\t15870000\t15870300\t0.2005\t45\nchr17\t15880200\t15880500\t0.223\t44\nchr17\t15960300\t15960600\t0.1668\t24\nchr17\t16721400\t16721700\t0.279\t55\nchr17\t16726800\t16727700\t0.1659\t85\nchr17\t16730100\t16730400\t0.0928\t58\nchr17\t16731600\t16732200\t0.0253\t65\nchr17\t16735800\t16736100\t0.2714\t63\nchr17\t16738200\t16739400\t0.1289\t62\nchr17\t16752600\t16752900\t0.0771\t70\nchr17\t16764900\t16765200\t0.0449\t75\nchr17\t16777500\t16777800\t0.1067\t90\nchr17\t16779000\t16779300\t0.0851\t71\nchr17\t16785900\t16786200\t0.2365\t81\nchr17\t16789200\t16789500\t0.2754\t75\nchr17\t16800600\t16800900\t0.0492\t60\nchr17\t16809300\t16809600\t0.1926\t79\nchr17\t16828800\t16829400\t0.0014\t59\nchr17\t16833300\t16833600\t0.2485\t92\nchr17\t16839300\t16841100\t0.2284\t100\nchr17\t16845600\t16846200\t0\t47\nchr17\t16848300\t16849500\t0.0217\t73\nchr17\t16863900\t16866000\t0.0524\t73\nchr17\t17010300\t17010600\t0.1507\t57\nchr17\t17011800\t17012100\t0.4298\t74\nchr17\t17442000\t17442300\t0.1381\t83\nchr17\t17911800\t17912100\t0.1889\t80\nchr17\t18389400\t18389700\t0.3427\t16\nchr17\t18391200\t18398400\t0\t83\nchr17\t18399900\t18400200\t0.0617\t69\nchr17\t18401400\t18401700\t0\t30\nchr17\t18402900\t18404400\t0\t47\nchr17\t18405900\t18407400\t0\t57\nchr17\t18411900\t18412800\t0\t61\nchr17\t18416400\t18416700\t0.3373\t54\nchr17\t18417900\t18418500\t0\t33\nchr17\t18420300\t18420900\t0.1002\t73\nchr17\t18423900\t18424200\t0.1976\t84\nchr17\t18426000\t18429000\t0\t91\nchr17\t18430200\t18453600\t0\t91\nchr17\t18456600\t18459000\t0\t35\nchr17\t18460200\t18462300\t0\t35\nchr17\t18469500\t18469800\t0\t28\nchr17\t18471000\t18472800\t0\t28\nchr17\t18474000\t18474300\t0\t28\nchr17\t18477600\t18482400\t0\t39\nchr17\t18483600\t18483900\t0\t29\nchr17\t18485400\t18493800\t0\t35\nchr17\t18498000\t18504600\t0\t37\nchr17\t18505800\t18506700\t0\t63\nchr17\t18513600\t18516300\t0\t32\nchr17\t18517500\t18517800\t0\t32\nchr17\t18520500\t18521100\t0\t44\nchr17\t18522300\t18522900\t0\t44\nchr17\t18526200\t18527100\t0\t54\nchr17\t18528300\t18528600\t0\t54\nchr17\t18533400\t18534300\t0\t47\nchr17\t18536100\t18536700\t0\t47\nchr17\t18538200\t18538800\t0\t38\nchr17\t18540900\t18541800\t0\t43\nchr17\t18544500\t18545100\t0.0475\t28\nchr17\t18550200\t18550800\t0\t66\nchr17\t18552600\t18552900\t0\t66\nchr17\t18554100\t18555300\t0\t43\nchr17\t18562800\t18563100\t0.0031\t101\nchr17\t18576300\t18576600\t0.3578\t41\nchr17\t18583200\t18583500\t0.3877\t53\nchr17\t18584700\t18585300\t0.0455\t78\nchr17\t18587700\t18589800\t0.1664\t64\nchr17\t18603600\t18603900\t0\t59\nchr17\t18605700\t18606600\t0\t59\nchr17\t18619500\t18621900\t0.0758\t64\nchr17\t18623100\t18623400\t0.1554\t55\nchr17\t18646200\t18646500\t0.2512\t54\nchr17\t18669000\t18669300\t0.1946\t68\nchr17\t18689700\t18690000\t0.3294\t35\nchr17\t18722100\t18722400\t0.1927\t66\nchr17\t18727800\t18728400\t0.2165\t75\nchr17\t18763800\t18764100\t0.1877\t81\nchr17\t18806400\t18806700\t0.2667\t43\nchr17\t18825000\t18827100\t0.007\t49\nchr17\t18839400\t18840900\t0\t72\nchr17\t18842100\t18842400\t0.0523\t58\nchr17\t18888000\t18888600\t0.0037\t64\nchr17\t19025700\t19092900\t0\t110\nchr17\t19094100\t19110900\t0\t94\nchr17\t19112400\t19237200\t0\t115\nchr17\t19627200\t19628700\t0.0305\t67\nchr17\t20323200\t20323500\t0.0892\t49\nchr17\t20332500\t20333100\t0.0882\t58\nchr17\t20337300\t20337600\t0.3162\t45\nchr17\t20356200\t20356500\t0.0365\t54\nchr17\t20360700\t20362500\t0.0909\t66\nchr17\t20368200\t20368500\t0.2484\t59\nchr17\t20391000\t20391300\t0.0911\t44\nchr17\t20393400\t20393700\t0.2129\t81\nchr17\t20395500\t20395800\t0.2129\t81\nchr17\t20400900\t20401200\t0.2906\t81\nchr17\t20406000\t20406300\t0.1207\t71\nchr17\t20414400\t20415900\t0.1379\t75\nchr17\t20417700\t20418000\t0.2832\t64\nchr17\t20423400\t20423700\t0.2241\t41\nchr17\t20429100\t20429400\t0.0529\t62\nchr17\t20437800\t20438100\t0.0503\t68\nchr17\t20442300\t20442900\t0\t42\nchr17\t20445000\t20446500\t0\t42\nchr17\t20451300\t20453700\t0.0132\t34\nchr17\t20456400\t20457300\t0\t29\nchr17\t20459700\t20460000\t0\t21\nchr17\t20461800\t20463900\t0.0427\t43\nchr17\t20465100\t20465700\t0.1435\t33\nchr17\t20472600\t20472900\t0.2213\t28\nchr17\t20483100\t20484300\t0.1466\t40\nchr17\t20487600\t20487900\t0.2796\t37\nchr17\t20492400\t20492700\t0.4414\t78\nchr17\t20499000\t20499300\t0.1596\t36\nchr17\t20500800\t20501400\t0.0351\t58\nchr17\t20503200\t20503500\t0\t96\nchr17\t20505000\t20513400\t0\t96\nchr17\t20516400\t20518500\t0.0023\t81\nchr17\t20531700\t20532600\t0.1001\t58\nchr17\t20536800\t20538600\t0\t60\nchr17\t20540100\t20540400\t0.3288\t75\nchr17\t20544300\t20544600\t0.0072\t64\nchr17\t20546100\t20551800\t0\t85\nchr17\t20595300\t20595600\t0.1309\t66\nchr17\t20687700\t20688000\t0.2785\t51\nchr17\t20984100\t20986200\t0.0122\t55\nchr17\t21316500\t21316800\t0.3127\t71\nchr17\t21334200\t21334500\t0.1944\t92\nchr17\t21342600\t21342900\t0.061\t99\nchr17\t21345900\t21346500\t0.0109\t111\nchr17\t21348000\t21348300\t0.0969\t105\nchr17\t21412800\t21413700\t0.0025\t112\nchr17\t21438600\t21438900\t0.0282\t110\nchr17\t21623100\t21623400\t0.2099\t57\nchr17\t21625800\t21626100\t0.1389\t58\nchr17\t21653400\t21654600\t0.2407\t115\nchr17\t21700200\t21701100\t0.0117\t82\nchr17\t21738600\t21739200\t0.0373\t82\nchr17\t21741300\t21745500\t0.0042\t107\nchr17\t21753600\t21753900\t0.2378\t96\nchr17\t21759000\t21759300\t0.1998\t12\nchr17\t21762000\t21762300\t0.3418\t112\nchr17\t21771000\t21771300\t0.3144\t50\nchr17\t21782400\t21782700\t0.236\t64\nchr17\t21853800\t21855300\t0.3933\t359\nchr17\t21856500\t21856800\t0.3554\t263\nchr17\t21858600\t21859800\t0.3766\t189\nchr17\t21861300\t21861900\t0.3074\t195\nchr17\t21865500\t21866100\t0.3328\t243\nchr17\t21869400\t21869700\t0.3956\t220\nchr17\t21873600\t21874800\t0.3704\t239\nchr17\t21882000\t21882300\t0.2719\t436\nchr17\t21883500\t21992100\t0\t23536\nchr17\t22041900\t22042200\t0.075\t19\nchr17\t22044000\t22044300\t0.1515\t202\nchr17\t22047000\t22048200\t0.127\t173\nchr17\t22076700\t22077600\t0.2577\t73\nchr17\t22080000\t22080300\t0.0679\t50\nchr17\t22375500\t22408500\t0\t471\nchr17\t22746000\t22747200\t0\t205\nchr17\t22748400\t22761900\t0\t205\nchr17\t22814100\t22817100\t0\t158\nchr17\t22818600\t22821600\t0\t78\nchr17\t22823100\t22912200\t0\t311\nchr17\t22913400\t22990200\t0\t2064\nchr17\t22991400\t23016000\t0\t2064\nchr17\t23017200\t23027700\t0\t334\nchr17\t23028900\t23031000\t0\t81\nchr17\t23032200\t23067900\t0\t223\nchr17\t23069100\t23093700\t0\t205\nchr17\t23094900\t23175600\t0\t205\nchr17\t23177100\t23192700\t0\t606\nchr17\t23194200\t23219700\t0\t606\nchr17\t23221200\t23221800\t0.0017\t766\nchr17\t23223300\t23231100\t0\t35\nchr17\t23235300\t23235600\t0\t10\nchr17\t23238900\t23242500\t0\t121\nchr17\t23243700\t23247900\t0\t70\nchr17\t23249700\t23251500\t0\t19\nchr17\t23255700\t23258100\t0\t2583\nchr17\t23260200\t23263800\t0\t77\nchr17\t23267100\t23268600\t0\t152\nchr17\t23271000\t23271600\t0\t33\nchr17\t23273400\t23277600\t0\t84\nchr17\t23281200\t23286600\t0\t116\nchr17\t23289000\t23298000\t0\t1530\nchr17\t23300100\t23300400\t0\t14\nchr17\t23304900\t23306700\t0\t20\nchr17\t23309400\t23310000\t0\t34\nchr17\t23315100\t23322300\t0\t67\nchr17\t23323800\t23325000\t0\t11\nchr17\t23328900\t23329200\t0\t10\nchr17\t23332500\t23335500\t0\t45\nchr17\t23339400\t23341500\t0\t28\nchr17\t23343600\t23344200\t0\t15\nchr17\t23346600\t23347200\t0.1001\t31\nchr17\t23349600\t23349900\t0\t26\nchr17\t23352000\t23352300\t0\t11\nchr17\t23353500\t23365800\t0\t173\nchr17\t23369700\t23370000\t0\t14\nchr17\t23371800\t23372700\t0\t44\nchr17\t23376900\t23377200\t0\t12\nchr17\t23379000\t23380800\t0.0103\t55\nchr17\t23383500\t23383800\t0.1492\t15\nchr17\t23385600\t23388600\t0\t64\nchr17\t23389800\t23391300\t0\t70\nchr17\t23394000\t23398200\t0\t42\nchr17\t23399400\t23400300\t0\t69\nchr17\t23403900\t23405700\t0\t17\nchr17\t23407500\t23419200\t0\t283\nchr17\t23421600\t23424000\t0\t43\nchr17\t23428800\t23429400\t0\t38\nchr17\t23430900\t23433300\t0\t161\nchr17\t23436300\t23443200\t0\t225\nchr17\t23445900\t23447100\t0\t57\nchr17\t23448900\t23449800\t0\t54\nchr17\t23452800\t23455800\t0\t15\nchr17\t23457600\t23458500\t0\t17\nchr17\t23460600\t23461500\t0\t92\nchr17\t23462700\t23468400\t0\t248\nchr17\t23470200\t23473800\t0\t63\nchr17\t23475600\t23476200\t0\t18\nchr17\t23477400\t23477700\t0\t18\nchr17\t23479500\t23483700\t0\t68\nchr17\t23485800\t23487900\t0\t69\nchr17\t23489400\t23490000\t0\t14\nchr17\t23492100\t23496300\t0\t150\nchr17\t23497500\t23497800\t0\t11\nchr17\t23500200\t23502900\t0\t79\nchr17\t23506200\t23506500\t0\t11\nchr17\t23508900\t23509500\t0\t13\nchr17\t23511000\t23511300\t0\t13\nchr17\t23513700\t23514000\t0\t12\nchr17\t23515500\t23515800\t0\t15\nchr17\t23520000\t23520900\t0\t15\nchr17\t23523300\t23525700\t0\t48\nchr17\t23526900\t23527200\t0\t30\nchr17\t23529900\t23530200\t0.223\t25\nchr17\t23531400\t23532600\t0\t19\nchr17\t23534400\t23537400\t0\t30\nchr17\t23538600\t23538900\t0\t10\nchr17\t23540100\t23545200\t0\t1314\nchr17\t23546700\t23548800\t0\t23\nchr17\t23554200\t23555100\t0\t32\nchr17\t23559000\t23561400\t0\t44\nchr17\t23563800\t23565300\t0\t45\nchr17\t23566500\t23567700\t0\t45\nchr17\t23569800\t23570700\t0\t166\nchr17\t23572200\t23577000\t0\t62\nchr17\t23579700\t23581200\t0\t18\nchr17\t23583000\t23583900\t0\t452\nchr17\t23586000\t23586900\t0\t15\nchr17\t23590200\t23593200\t0\t48\nchr17\t23594400\t23598600\t0\t76\nchr17\t23600700\t23601000\t0.1131\t17\nchr17\t23603700\t23605500\t0\t94\nchr17\t23606700\t23615700\t0\t94\nchr17\t23617200\t23617500\t0\t12\nchr17\t23620800\t23626800\t0\t170\nchr17\t23628900\t23630700\t0\t12\nchr17\t23632200\t23638800\t0\t214\nchr17\t23640000\t23641800\t0\t56\nchr17\t23644200\t23644800\t0\t34\nchr17\t23646900\t23650800\t0\t78\nchr17\t23656500\t23657100\t0\t37\nchr17\t23663100\t23664000\t0\t12\nchr17\t23666100\t23667300\t0\t17\nchr17\t23668800\t23673000\t0\t80\nchr17\t23676300\t23677800\t0\t48\nchr17\t23680500\t23680800\t0\t15\nchr17\t23682600\t23682900\t0\t11\nchr17\t23686800\t23688000\t0\t74\nchr17\t23691300\t23694000\t0\t17\nchr17\t23698800\t23700000\t0\t12\nchr17\t23701200\t23701800\t0\t12\nchr17\t23703300\t23703600\t0\t12\nchr17\t23708100\t23708400\t0\t11\nchr17\t23711400\t23711700\t0\t13\nchr17\t23714700\t23715000\t0\t13\nchr17\t23716800\t23717100\t0\t11\nchr17\t23719800\t23722200\t0\t58\nchr17\t23727600\t23728800\t0\t26\nchr17\t23731200\t23734500\t0\t93\nchr17\t23736000\t23736300\t0\t30\nchr17\t23740200\t23753100\t0\t69\nchr17\t23755800\t23759100\t0\t53\nchr17\t23760900\t23761200\t0\t13\nchr17\t23762700\t23770500\t0\t55\nchr17\t23773800\t23778000\t0\t37\nchr17\t23779500\t23781000\t0\t37\nchr17\t23783400\t23784900\t0\t12\nchr17\t23786400\t23786700\t0\t10\nchr17\t23791800\t23793600\t0\t38\nchr17\t23795100\t23796600\t0\t39\nchr17\t23800500\t23802000\t0\t30\nchr17\t23803800\t23805600\t0\t713\nchr17\t23810400\t23811600\t0\t18\nchr17\t23817900\t23824800\t0\t60\nchr17\t23826300\t23831700\t0\t52\nchr17\t23832900\t23833200\t0\t12\nchr17\t23842200\t23842500\t0\t13\nchr17\t23844000\t23845500\t0\t30\nchr17\t23849700\t23853600\t0\t68\nchr17\t23857200\t23861100\t0\t305\nchr17\t23863500\t23873700\t0\t93\nchr17\t23875200\t23881800\t0\t149\nchr17\t23884800\t23886600\t0\t39\nchr17\t23887800\t23888700\t0\t39\nchr17\t23892900\t23894100\t0\t46\nchr17\t23896800\t23900100\t0\t72\nchr17\t23901600\t23903100\t0\t81\nchr17\t23904900\t23910900\t0\t49\nchr17\t23912100\t23916600\t0\t82\nchr17\t23917800\t23918100\t0\t12\nchr17\t23919900\t23921400\t0\t60\nchr17\t23922600\t23922900\t0.07\t23\nchr17\t23925000\t23925300\t0\t10\nchr17\t23928900\t23931600\t0\t62\nchr17\t23933700\t23936700\t0\t31\nchr17\t23941200\t23943300\t0\t40\nchr17\t23944500\t23946600\t0\t34\nchr17\t23949900\t23954700\t0\t71\nchr17\t23956200\t23964600\t0\t89\nchr17\t23969100\t23969700\t0\t49\nchr17\t23970900\t23977200\t0\t70\nchr17\t23979000\t23980800\t0\t192\nchr17\t23982000\t23983200\t0\t192\nchr17\t23984400\t23988300\t0\t192\nchr17\t23993700\t23996100\t0\t106\nchr17\t23997300\t23997600\t0\t14\nchr17\t23999100\t24004200\t0\t80\nchr17\t24007200\t24007500\t0\t13\nchr17\t24009300\t24009600\t0\t14\nchr17\t24011100\t24013500\t0\t66\nchr17\t24016200\t24019500\t0\t75\nchr17\t24021300\t24021600\t0.2557\t64\nchr17\t24024000\t24025800\t0\t54\nchr17\t24027300\t24027600\t0\t11\nchr17\t24029100\t24033300\t0\t30\nchr17\t24034800\t24036900\t0\t34\nchr17\t24038700\t24043500\t0\t107\nchr17\t24044700\t24046800\t0\t23\nchr17\t24048000\t24048900\t0\t53\nchr17\t24050100\t24051300\t0\t50\nchr17\t24057300\t24057900\t0\t13\nchr17\t24061800\t24062700\t0\t203\nchr17\t24064200\t24066000\t0\t42\nchr17\t24067200\t24069900\t0\t81\nchr17\t24071700\t24073500\t0\t68\nchr17\t24076800\t24081600\t0\t88\nchr17\t24082800\t24083400\t0\t130\nchr17\t24084900\t24094500\t0\t59\nchr17\t24096900\t24098700\t0\t43\nchr17\t24101400\t24102000\t0\t16\nchr17\t24106500\t24107400\t0\t45\nchr17\t24108900\t24111000\t0\t85\nchr17\t24112500\t24117900\t0\t50\nchr17\t24119400\t24123900\t0\t42\nchr17\t24125700\t24127800\t0\t56\nchr17\t24132300\t24133200\t0\t46\nchr17\t24135000\t24137400\t0\t29\nchr17\t24139200\t24141600\t0\t130\nchr17\t24144300\t24147300\t0\t60\nchr17\t24150600\t24153900\t0\t573\nchr17\t24158100\t24158400\t0.0558\t12\nchr17\t24163800\t24166500\t0\t40\nchr17\t24168300\t24170700\t0\t79\nchr17\t24175200\t24176400\t0\t49\nchr17\t24180000\t24188400\t0\t1036\nchr17\t24191400\t24199200\t0\t52\nchr17\t24200400\t24205500\t0\t66\nchr17\t24206700\t24219900\t0\t81\nchr17\t24223500\t24230400\t0\t154\nchr17\t24232500\t24232800\t0\t11\nchr17\t24235200\t24235500\t0\t20\nchr17\t24238800\t24243600\t0\t69\nchr17\t24245400\t24246300\t0\t35\nchr17\t24248100\t24249300\t0.0009\t19\nchr17\t24250500\t24258900\t0\t116\nchr17\t24261300\t24262500\t0\t35\nchr17\t24263700\t24264000\t0.0396\t20\nchr17\t24265800\t24268800\t0\t35\nchr17\t24270600\t24270900\t0\t11\nchr17\t24275700\t24277200\t0\t67\nchr17\t24278700\t24286500\t0\t67\nchr17\t24288600\t24288900\t0\t12\nchr17\t24291300\t24293100\t0\t41\nchr17\t24296100\t24297000\t0\t42\nchr17\t24298200\t24298500\t0\t12\nchr17\t24299700\t24303000\t0\t68\nchr17\t24304500\t24305400\t0\t41\nchr17\t24306900\t24311400\t0\t43\nchr17\t24312900\t24313200\t0\t27\nchr17\t24316200\t24318000\t0\t65\nchr17\t24319200\t24319500\t0\t12\nchr17\t24324300\t24324600\t0\t11\nchr17\t24327600\t24328500\t0\t50\nchr17\t24330300\t24332100\t0\t49\nchr17\t24333600\t24333900\t0\t10\nchr17\t24335100\t24340200\t0\t27\nchr17\t24344700\t24351300\t0\t59\nchr17\t24354000\t24355200\t0\t569\nchr17\t24359100\t24359700\t0\t26\nchr17\t24363000\t24363900\t0\t27\nchr17\t24366900\t24367500\t0\t41\nchr17\t24371400\t24375300\t0\t66\nchr17\t24380100\t24382500\t0\t44\nchr17\t24384900\t24386700\t0\t54\nchr17\t24388800\t24390300\t0\t41\nchr17\t24391500\t24391800\t0\t12\nchr17\t24395400\t24395700\t0\t12\nchr17\t24397500\t24399900\t0\t1126\nchr17\t24402600\t24403200\t0\t13\nchr17\t24408300\t24410700\t0\t22\nchr17\t24415500\t24421800\t0\t4203\nchr17\t24423300\t24425700\t0\t86\nchr17\t24427200\t24427500\t0\t12\nchr17\t24429300\t24429600\t0\t10\nchr17\t24437700\t24439800\t0\t36\nchr17\t24441000\t24442500\t0\t30\nchr17\t24445200\t24445800\t0.0936\t37\nchr17\t24447300\t24449700\t0\t16\nchr17\t24453000\t24455700\t0\t82\nchr17\t24456900\t24457200\t0\t19\nchr17\t24459300\t24464100\t0\t67\nchr17\t24467100\t24467700\t0\t28\nchr17\t24469200\t24469500\t0\t11\nchr17\t24471300\t24478200\t0\t68\nchr17\t24481500\t24486000\t0\t32\nchr17\t24487200\t24489300\t0\t55\nchr17\t24492000\t24493500\t0\t142\nchr17\t24495600\t24501600\t0\t223\nchr17\t24504300\t24505800\t0\t18\nchr17\t24507300\t24511200\t0\t71\nchr17\t24514200\t24519000\t0\t204\nchr17\t24520200\t24520500\t0\t14\nchr17\t24525600\t24527100\t0\t27\nchr17\t24528300\t24528900\t0\t35\nchr17\t24531000\t24539700\t0\t876\nchr17\t24541500\t24542100\t0\t11\nchr17\t24543900\t24552000\t0\t66\nchr17\t24553200\t24558300\t0\t48\nchr17\t24559500\t24560100\t0\t11\nchr17\t24564900\t24566400\t0\t73\nchr17\t24569700\t24570600\t0\t28\nchr17\t24571800\t24574500\t0\t127\nchr17\t24576600\t24577500\t0\t55\nchr17\t24581400\t24582300\t0\t57\nchr17\t24584100\t24591900\t0\t116\nchr17\t24594600\t24599100\t0\t145\nchr17\t24600900\t24601200\t0\t10\nchr17\t24606300\t24608100\t0\t26\nchr17\t24612900\t24614700\t0\t44\nchr17\t24615900\t24617700\t0\t76\nchr17\t24623400\t24624900\t0\t1118\nchr17\t24627900\t24628200\t0\t11\nchr17\t24630000\t24636300\t0\t75\nchr17\t24638100\t24642300\t0\t53\nchr17\t24643500\t24645300\t0\t50\nchr17\t24648000\t24648300\t0\t11\nchr17\t24649800\t24650100\t0\t10\nchr17\t24651300\t24652200\t0\t34\nchr17\t24654300\t24656700\t0\t20\nchr17\t24660600\t24662100\t0\t24\nchr17\t24663600\t24665100\t0\t38\nchr17\t24668400\t24670200\t0\t53\nchr17\t24672300\t24676200\t0\t159\nchr17\t24677700\t24678000\t0\t14\nchr17\t24681000\t24683400\t0\t54\nchr17\t24685500\t24685800\t0\t12\nchr17\t24688500\t24697800\t0\t67\nchr17\t24699600\t24700200\t0\t13\nchr17\t24702300\t24703500\t0\t156\nchr17\t24707700\t24714600\t0\t66\nchr17\t24716100\t24716700\t0\t13\nchr17\t24718200\t24719100\t0\t567\nchr17\t24722400\t24723900\t0\t18\nchr17\t24729300\t24729600\t0\t12\nchr17\t24734400\t24736800\t0\t149\nchr17\t24740100\t24742500\t0\t1219\nchr17\t24744300\t24744600\t0\t11\nchr17\t24745800\t24748800\t0\t1244\nchr17\t24750600\t24754200\t0\t334\nchr17\t24758400\t24759300\t0\t30\nchr17\t24760500\t24762600\t0\t12\nchr17\t24765300\t24766500\t0\t39\nchr17\t24770100\t24780000\t0\t2349\nchr17\t24781500\t24784200\t0\t74\nchr17\t24786000\t24786300\t0\t10\nchr17\t24790500\t24791100\t0.2394\t24\nchr17\t24792900\t24793500\t0\t30\nchr17\t24795300\t24797400\t0\t38\nchr17\t24800100\t24802200\t0\t39\nchr17\t24809700\t24810300\t0\t16\nchr17\t24812100\t24816900\t0\t71\nchr17\t24819900\t24824700\t0\t88\nchr17\t24828300\t24828600\t0\t10\nchr17\t24830700\t24831000\t0\t14\nchr17\t24833100\t24837300\t0\t34\nchr17\t24839100\t24839400\t0\t12\nchr17\t24841500\t24843300\t0\t44\nchr17\t24845700\t24846000\t0\t20\nchr17\t24847200\t24851400\t0\t67\nchr17\t24852900\t24853500\t0\t14\nchr17\t24855900\t24856500\t0.0019\t21\nchr17\t24857700\t24858000\t0.0703\t12\nchr17\t24859500\t24861300\t0\t80\nchr17\t24863400\t24865500\t0\t14\nchr17\t24866700\t24869700\t0\t151\nchr17\t24872400\t24872700\t0\t11\nchr17\t24873900\t24879600\t0\t63\nchr17\t24882000\t24883500\t0\t22\nchr17\t24885300\t24885600\t0\t11\nchr17\t24888000\t24893700\t0\t2416\nchr17\t24895800\t24896100\t0\t12\nchr17\t24902100\t24903300\t0\t14\nchr17\t24908100\t24908700\t0\t34\nchr17\t24910500\t24910800\t0\t12\nchr17\t24913500\t24913800\t0\t36\nchr17\t24916200\t24918000\t0\t44\nchr17\t24921300\t24924000\t0\t32\nchr17\t24928200\t24929700\t0\t22\nchr17\t24931200\t24931500\t0\t13\nchr17\t24933000\t24936600\t0\t61\nchr17\t24940500\t24941100\t0\t93\nchr17\t24942600\t24945000\t0\t69\nchr17\t24954900\t24956100\t0\t37\nchr17\t24958200\t24961200\t0\t47\nchr17\t24963900\t24967800\t0\t63\nchr17\t24969000\t24969900\t0\t13\nchr17\t24975000\t24976200\t0\t20\nchr17\t24979500\t24979800\t0\t12\nchr17\t24981000\t24988200\t0\t974\nchr17\t24990900\t24991200\t0\t12\nchr17\t24992400\t24997200\t0\t77\nchr17\t24999000\t25007100\t0\t323\nchr17\t25008600\t25010400\t0\t76\nchr17\t25011900\t25012200\t0\t21\nchr17\t25015800\t25016400\t0\t13\nchr17\t25020000\t25021800\t0\t70\nchr17\t25023000\t25025100\t0\t28\nchr17\t25028400\t25028700\t0\t13\nchr17\t25031700\t25040700\t0\t710\nchr17\t25043700\t25045200\t0\t52\nchr17\t25047600\t25050300\t0\t93\nchr17\t25053000\t25056900\t0\t138\nchr17\t25059300\t25064400\t0\t337\nchr17\t25068600\t25069200\t0\t13\nchr17\t25071000\t25077600\t0\t493\nchr17\t25078800\t25087800\t0\t199\nchr17\t25091400\t25094700\t0\t58\nchr17\t25096200\t25107600\t0\t1253\nchr17\t25111200\t25112700\t0.0546\t40\nchr17\t25115100\t25118400\t0\t185\nchr17\t25120200\t25120800\t0\t75\nchr17\t25122900\t25123200\t0\t11\nchr17\t25124700\t25128000\t0\t50\nchr17\t25130100\t25131000\t0\t43\nchr17\t25132200\t25135800\t0\t68\nchr17\t25139100\t25140900\t0\t2390\nchr17\t25143300\t25143900\t0.001\t63\nchr17\t25149900\t25152000\t0\t43\nchr17\t25154100\t25158300\t0\t57\nchr17\t25165500\t25165800\t0\t16\nchr17\t25167300\t25174800\t0\t76\nchr17\t25180500\t25180800\t0\t17\nchr17\t25182300\t25182600\t0\t54\nchr17\t25184700\t25187700\t0\t720\nchr17\t25190700\t25194600\t0\t50\nchr17\t25197600\t25198800\t0\t18\nchr17\t25201500\t25201800\t0\t16\nchr17\t25203600\t25204800\t0\t61\nchr17\t25207500\t25211700\t0\t197\nchr17\t25213500\t25213800\t0\t10\nchr17\t25217100\t25218000\t0\t17\nchr17\t25219200\t25221600\t0\t30\nchr17\t25227900\t25228200\t0\t18\nchr17\t25232100\t25234500\t0\t29\nchr17\t25239300\t25240500\t0\t129\nchr17\t25242600\t25245600\t0\t159\nchr17\t25247400\t25247700\t0\t26\nchr17\t25251600\t25256700\t0\t76\nchr17\t25257900\t25261200\t0\t21\nchr17\t25263900\t25266600\t0\t55\nchr17\t25268700\t25269600\t0\t28\nchr17\t25270800\t25271400\t0\t28\nchr17\t25273500\t25273800\t0\t12\nchr17\t25275600\t25275900\t0\t11\nchr17\t25277100\t25277400\t0\t10\nchr17\t25281000\t25282200\t0\t107\nchr17\t25283400\t25284300\t0\t28\nchr17\t25289100\t25295400\t0\t50\nchr17\t25298100\t25298700\t0\t17\nchr17\t25301700\t25304700\t0\t77\nchr17\t25306500\t25307100\t0\t30\nchr17\t25309800\t25311000\t0\t21\nchr17\t25314600\t25317900\t0\t82\nchr17\t25320000\t25320300\t0\t11\nchr17\t25322400\t25323000\t0\t135\nchr17\t25324800\t25326600\t0\t76\nchr17\t25328100\t25331700\t0\t217\nchr17\t25332900\t25334700\t0\t50\nchr17\t25338000\t25340400\t0\t38\nchr17\t25341900\t25344900\t0\t59\nchr17\t25346700\t25350600\t0\t34\nchr17\t25352700\t25353900\t0\t302\nchr17\t25356600\t25366200\t0\t211\nchr17\t25368000\t25368600\t0\t43\nchr17\t25371300\t25372500\t0\t36\nchr17\t25375500\t25379400\t0\t36\nchr17\t25382100\t25384800\t0\t5097\nchr17\t25387200\t25387500\t0\t36\nchr17\t25388700\t25392600\t0\t4252\nchr17\t25393800\t25396800\t0\t322\nchr17\t25398300\t25400400\t0\t183\nchr17\t25403700\t25404000\t0\t30\nchr17\t25405200\t25411200\t0\t296\nchr17\t25413900\t25416900\t0\t70\nchr17\t25418700\t25419900\t0\t36\nchr17\t25421100\t25425600\t0\t48\nchr17\t25427100\t25429500\t0\t40\nchr17\t25431000\t25435500\t0\t63\nchr17\t25437300\t25440600\t0\t80\nchr17\t25442700\t25447800\t0\t38\nchr17\t25450200\t25450800\t0\t103\nchr17\t25452300\t25456200\t0\t67\nchr17\t25457700\t25458300\t0\t139\nchr17\t25462200\t25463400\t0\t41\nchr17\t25464600\t25474200\t0\t64\nchr17\t25476000\t25476900\t0\t46\nchr17\t25480200\t25481700\t0\t455\nchr17\t25482900\t25489800\t0\t455\nchr17\t25493700\t25499100\t0\t646\nchr17\t25502700\t25504500\t0\t72\nchr17\t25505700\t25506000\t0\t45\nchr17\t25507800\t25509900\t0\t28\nchr17\t25511400\t25515600\t0\t61\nchr17\t25516800\t25517100\t0\t11\nchr17\t25519500\t25520400\t0\t49\nchr17\t25521600\t25521900\t0\t49\nchr17\t25523700\t25527900\t0\t938\nchr17\t25529400\t25533600\t0\t123\nchr17\t25536600\t25540800\t0\t54\nchr17\t25542600\t25545300\t0\t54\nchr17\t25549200\t25551000\t0\t39\nchr17\t25552200\t25553400\t0\t17\nchr17\t25555500\t25561200\t0\t67\nchr17\t25563900\t25572600\t0\t4118\nchr17\t25574100\t25575300\t0\t66\nchr17\t25578600\t25582800\t0\t70\nchr17\t25586400\t25588800\t0\t83\nchr17\t25591200\t25592400\t0\t45\nchr17\t25594200\t25600200\t0\t55\nchr17\t25603200\t25608900\t0\t74\nchr17\t25610100\t25612800\t0\t74\nchr17\t25614300\t25616700\t0\t18\nchr17\t25620000\t25620600\t0\t22\nchr17\t25621800\t25623000\t0\t30\nchr17\t25624500\t25629300\t0\t59\nchr17\t25631400\t25638600\t0\t132\nchr17\t25639800\t25643100\t0\t74\nchr17\t25644300\t25648800\t0\t66\nchr17\t25650000\t25653600\t0\t261\nchr17\t25655400\t25661400\t0\t307\nchr17\t25665900\t25666800\t0\t28\nchr17\t25668300\t25668900\t0\t32\nchr17\t25670100\t25670400\t0.2988\t12\nchr17\t25672800\t25676700\t0\t58\nchr17\t25677900\t25681200\t0\t58\nchr17\t25683900\t25684800\t0\t62\nchr17\t25686300\t25694100\t0\t62\nchr17\t25696500\t25697700\t0\t33\nchr17\t25700700\t25704900\t0\t108\nchr17\t25708800\t25734900\t0\t150\nchr17\t25737000\t25743600\t0\t55\nchr17\t25745400\t25747500\t0\t55\nchr17\t25749000\t25750200\t0\t38\nchr17\t25751700\t25752000\t0.0773\t13\nchr17\t25753500\t25754700\t0\t35\nchr17\t25757700\t25758000\t0\t10\nchr17\t25759500\t25761900\t0\t31\nchr17\t25763400\t25764600\t0\t21\nchr17\t25766100\t25768200\t0\t118\nchr17\t25769400\t25775100\t0\t3795\nchr17\t25778100\t25781700\t0\t57\nchr17\t25785600\t25790400\t0\t1563\nchr17\t25794600\t25796700\t0\t217\nchr17\t25798200\t25800600\t0\t47\nchr17\t25802400\t25802700\t0\t13\nchr17\t25803900\t25806000\t0\t49\nchr17\t25807500\t25813800\t0\t54\nchr17\t25816200\t25821000\t0\t53\nchr17\t25822500\t25826400\t0\t33\nchr17\t25827900\t25830300\t0\t66\nchr17\t25831500\t25840800\t0\t44\nchr17\t25842900\t25847700\t0\t70\nchr17\t25850100\t25867800\t0\t303\nchr17\t25869300\t25869600\t0\t15\nchr17\t25871700\t25874100\t0\t64\nchr17\t25876200\t25878300\t0\t58\nchr17\t25881300\t25882200\t0\t62\nchr17\t25884600\t25886700\t0\t59\nchr17\t25888800\t25892700\t0\t53\nchr17\t25895100\t25895700\t0\t33\nchr17\t25898400\t25900500\t0\t25\nchr17\t25902300\t25903500\t0\t36\nchr17\t25904700\t25905900\t0\t48\nchr17\t25907700\t25914600\t0\t67\nchr17\t25917600\t25917900\t0\t21\nchr17\t25919100\t25926000\t0\t992\nchr17\t25927500\t25930800\t0\t79\nchr17\t25934100\t25934700\t0.0314\t18\nchr17\t25936200\t25938300\t0\t21\nchr17\t25939800\t25951500\t0\t159\nchr17\t25953000\t25960200\t0\t226\nchr17\t25961400\t25967700\t0\t226\nchr17\t25969800\t25976400\t0\t233\nchr17\t25977900\t25981200\t0\t42\nchr17\t25982400\t25985700\t0\t51\nchr17\t25986900\t25991700\t0\t43\nchr17\t25994100\t25999500\t0\t110\nchr17\t26001000\t26001600\t0\t37\nchr17\t26003700\t26010000\t0\t146\nchr17\t26011800\t26028300\t0\t437\nchr17\t26029800\t26045400\t0\t205\nchr17\t26048100\t26052600\t0\t83\nchr17\t26053800\t26056200\t0\t30\nchr17\t26057400\t26060700\t0\t52\nchr17\t26064000\t26071200\t0\t183\nchr17\t26075100\t26083200\t0\t457\nchr17\t26084700\t26085600\t0\t74\nchr17\t26087400\t26090700\t0\t48\nchr17\t26091900\t26092800\t0.1069\t50\nchr17\t26094000\t26098500\t0\t296\nchr17\t26100600\t26106900\t0\t1578\nchr17\t26108400\t26115300\t0\t73\nchr17\t26116500\t26120100\t0\t37\nchr17\t26121900\t26123400\t0\t1755\nchr17\t26124600\t26126400\t0\t64\nchr17\t26127900\t26133900\t0\t473\nchr17\t26135400\t26136900\t0\t15\nchr17\t26138100\t26139300\t0\t33\nchr17\t26140500\t26145600\t0\t232\nchr17\t26146800\t26156700\t0\t279\nchr17\t26157900\t26161200\t0\t40\nchr17\t26163600\t26172900\t0\t164\nchr17\t26174400\t26181000\t0\t33\nchr17\t26182800\t26184600\t0\t69\nchr17\t26186100\t26192100\t0\t60\nchr17\t26193900\t26194500\t0\t18\nchr17\t26195700\t26205300\t0\t99\nchr17\t26206500\t26207700\t0\t99\nchr17\t26209800\t26210700\t0\t77\nchr17\t26212200\t26216700\t0\t61\nchr17\t26217900\t26219700\t0\t87\nchr17\t26220900\t26226900\t0\t86\nchr17\t26228400\t26238000\t0\t183\nchr17\t26239200\t26244000\t0\t72\nchr17\t26245500\t26259300\t0\t62\nchr17\t26260800\t26261700\t0\t41\nchr17\t26263500\t26275800\t0\t243\nchr17\t26277600\t26278200\t0\t74\nchr17\t26279700\t26280600\t0\t185\nchr17\t26282400\t26294400\t0\t388\nchr17\t26296500\t26298000\t0\t23\nchr17\t26299200\t26300100\t0.056\t458\nchr17\t26301300\t26303100\t0\t105\nchr17\t26305200\t26305500\t0\t16\nchr17\t26306700\t26311800\t0\t213\nchr17\t26313000\t26318700\t0\t40\nchr17\t26320500\t26332500\t0\t253\nchr17\t26334000\t26337000\t0\t30\nchr17\t26338500\t26339700\t0\t40\nchr17\t26341200\t26345700\t0\t78\nchr17\t26346900\t26349900\t0\t78\nchr17\t26351400\t26353500\t0\t27\nchr17\t26355300\t26358900\t0\t124\nchr17\t26360100\t26364600\t0\t845\nchr17\t26365800\t26367000\t0\t33\nchr17\t26368500\t26373000\t0\t22\nchr17\t26374500\t26385900\t0\t226\nchr17\t26387400\t26391300\t0\t347\nchr17\t26392500\t26396400\t0\t62\nchr17\t26397900\t26400000\t0\t691\nchr17\t26401200\t26403900\t0\t55\nchr17\t26406300\t26415600\t0\t76\nchr17\t26416800\t26423700\t0\t60\nchr17\t26425200\t26428800\t0\t60\nchr17\t26430300\t26436300\t0\t76\nchr17\t26438700\t26447400\t0\t1206\nchr17\t26448900\t26451000\t0\t48\nchr17\t26452200\t26466000\t0\t248\nchr17\t26467500\t26474400\t0\t83\nchr17\t26475900\t26477100\t0\t21\nchr17\t26478300\t26487900\t0\t52\nchr17\t26490000\t26490600\t0\t36\nchr17\t26492100\t26496000\t0\t2782\nchr17\t26497200\t26498700\t0\t39\nchr17\t26500200\t26501700\t0\t35\nchr17\t26502900\t26504400\t0\t69\nchr17\t26505600\t26510100\t0\t73\nchr17\t26511900\t26512200\t0\t16\nchr17\t26514000\t26517900\t0\t29\nchr17\t26519100\t26528400\t0\t58\nchr17\t26529900\t26540100\t0\t66\nchr17\t26541600\t26544900\t0\t256\nchr17\t26546100\t26553600\t0\t256\nchr17\t26554800\t26555700\t0\t45\nchr17\t26557200\t26564400\t0\t58\nchr17\t26565600\t26603100\t0\t10049\nchr17\t26604300\t26610600\t0\t10049\nchr17\t26611800\t26625900\t0\t10049\nchr17\t26630100\t26630400\t0.2708\t111\nchr17\t26753700\t26754000\t0.4778\t96\nchr17\t26763600\t26763900\t0.253\t147\nchr17\t26783100\t26785500\t0.2621\t279\nchr17\t26787300\t26788800\t0.3699\t237\nchr17\t26794200\t26794500\t0.3937\t169\nchr17\t26796300\t26796600\t0.3907\t139\nchr17\t26797800\t26799900\t0.3826\t183\nchr17\t26801400\t26804700\t0.2953\t263\nchr17\t26805900\t26809500\t0.0473\t663\nchr17\t26811900\t26813100\t0.0814\t381\nchr17\t26814600\t26816400\t0.2553\t195\nchr17\t26820900\t26821200\t0.4469\t175\nchr17\t26824200\t26826600\t0.3314\t425\nchr17\t26828100\t26829000\t0.2797\t480\nchr17\t26830200\t26833500\t0.0899\t779\nchr17\t26835300\t26835600\t0.371\t324\nchr17\t26836800\t26837400\t0.3211\t248\nchr17\t26840100\t26841600\t0.2735\t228\nchr17\t26842800\t26849100\t0.2735\t228\nchr17\t26851500\t26851800\t0.1985\t289\nchr17\t26854500\t26856900\t0.2485\t321\nchr17\t26859600\t26864100\t0.1904\t239\nchr17\t26865300\t26865600\t0.4589\t166\nchr17\t26868900\t26870700\t0.1081\t645\nchr17\t26873100\t26873400\t0.4356\t181\nchr17\t26877600\t26881500\t0\t1028\nchr17\t26883900\t26884500\t0.0248\t426\nchr17\t26936100\t26938500\t0.145\t6317\nchr17\t26939700\t26941200\t0.2085\t2591\nchr17\t27160800\t27162600\t0.0031\t76\nchr17\t27210300\t27210600\t0.0338\t54\nchr17\t27212100\t27213300\t0.0663\t34\nchr17\t27645600\t27645900\t0.2771\t69\nchr17\t27746100\t27746400\t0.2402\t72\nchr17\t27829200\t27831600\t0\t70\nchr17\t27838200\t27840600\t0.0075\t71\nchr17\t28223100\t28223700\t0.265\t66\nchr17\t28455600\t28456200\t0\t26\nchr17\t29895600\t29896500\t0\t38\nchr17\t30439500\t30441900\t0\t99\nchr17\t30617100\t30621600\t0\t71\nchr17\t30625800\t30630300\t0\t76\nchr17\t30635700\t30636000\t0.164\t55\nchr17\t30654900\t30655200\t0.0695\t54\nchr17\t30663300\t30663600\t0.2692\t58\nchr17\t30668400\t30668700\t0.0117\t48\nchr17\t30700200\t30700800\t0.1803\t56\nchr17\t30732300\t30732600\t0.0731\t66\nchr17\t30978600\t30978900\t0.1926\t55\nchr17\t30980400\t30980700\t0.2675\t65\nchr17\t31036200\t31036500\t0.2461\t63\nchr17\t31937700\t31938000\t0.0934\t76\nchr17\t32028000\t32028900\t0\t52\nchr17\t32061000\t32061300\t0.3505\t63\nchr17\t32070900\t32071200\t0.1679\t66\nchr17\t32084400\t32085000\t0.0559\t58\nchr17\t32090700\t32091600\t0\t56\nchr17\t32679900\t32680500\t0.0028\t96\nchr17\t32682000\t32683200\t0.0028\t96\nchr17\t32887500\t32892900\t0\t79\nchr17\t33542400\t33542700\t0.0525\t53\nchr17\t34212600\t34212900\t0.3983\t64\nchr17\t34293600\t34297500\t0.0396\t83\nchr17\t35030100\t35030400\t0.1527\t107\nchr17\t35353500\t35353800\t0.1165\t61\nchr17\t35398500\t35398800\t0.2424\t75\nchr17\t35441700\t35442000\t0.2963\t78\nchr17\t36162000\t36162600\t0.045\t112\nchr17\t36164400\t36164700\t0.045\t112\nchr17\t36166500\t36168300\t0.0124\t80\nchr17\t36169500\t36179700\t0\t115\nchr17\t36208800\t36209400\t0.0248\t35\nchr17\t36225300\t36230700\t0\t94\nchr17\t36233700\t36234000\t0\t94\nchr17\t36235200\t36236100\t0\t55\nchr17\t36237600\t36238200\t0\t55\nchr17\t36239700\t36290400\t0\t136\nchr17\t36291600\t36388500\t0\t160\nchr17\t36390000\t36396900\t0\t101\nchr17\t36398100\t36410400\t0\t101\nchr17\t36411600\t36414900\t0\t101\nchr17\t36416100\t36443100\t0\t108\nchr17\t36445200\t36445500\t0.2335\t77\nchr17\t36450300\t36452400\t0\t66\nchr17\t36786300\t36786600\t0.3212\t54\nchr17\t37379700\t37380000\t0.2549\t61\nchr17\t37566300\t37566600\t0.1937\t61\nchr17\t37890600\t37891800\t0\t78\nchr17\t37893300\t37896600\t0\t78\nchr17\t37897800\t37901100\t0\t78\nchr17\t37902600\t37966800\t0\t151\nchr17\t37969200\t37972800\t0\t152\nchr17\t37974000\t38250000\t0\t152\nchr17\t38253600\t38253900\t0.0743\t63\nchr17\t38630700\t38632200\t0.0406\t51\nchr17\t38930100\t38930400\t0.2184\t87\nchr17\t41081400\t41081700\t0.1573\t38\nchr17\t41083500\t41083800\t0.1687\t30\nchr17\t41089200\t41089500\t0.4114\t24\nchr17\t41203200\t41206200\t0.0943\t80\nchr17\t41227200\t41227800\t0.0169\t45\nchr17\t41238600\t41239200\t0.0239\t41\nchr17\t42219300\t42219600\t0.2146\t66\nchr17\t42264900\t42265200\t0.2662\t75\nchr17\t42300000\t42300300\t0.329\t64\nchr17\t42338100\t42338400\t0.0909\t22\nchr17\t42550500\t42550800\t0.1898\t45\nchr17\t43228200\t43230300\t0\t67\nchr17\t43231500\t43231800\t0.4283\t61\nchr17\t43233000\t43304700\t0\t410\nchr17\t43322700\t43323900\t0\t194\nchr17\t44034600\t44036100\t0.0018\t61\nchr17\t44179800\t44181600\t0.0608\t71\nchr17\t44239200\t44239500\t0.1466\t70\nchr17\t44524800\t44525100\t0.4756\t58\nchr17\t44984400\t44984700\t0.3173\t32\nchr17\t45180600\t45180900\t0\t34\nchr17\t45450600\t45450900\t0.3919\t61\nchr17\t45498000\t45498300\t0.0264\t82\nchr17\t45500700\t45501300\t0.0264\t82\nchr17\t45510600\t45510900\t0\t120\nchr17\t45512100\t45522000\t0\t120\nchr17\t45525900\t45529200\t0\t49\nchr17\t45531300\t45532800\t0.0072\t106\nchr17\t45534300\t45536100\t0.0072\t106\nchr17\t45537900\t45561300\t0\t108\nchr17\t45562500\t45562800\t0.3345\t44\nchr17\t45599100\t45599700\t0.0231\t59\nchr17\t45602700\t45603300\t0.0021\t93\nchr17\t45618600\t45618900\t0.236\t51\nchr17\t45621600\t45622800\t0.2044\t82\nchr17\t46224600\t46224900\t0.1677\t49\nchr17\t46237500\t46238100\t0.1447\t56\nchr17\t46242600\t46246500\t0\t105\nchr17\t46293000\t46311300\t0\t127\nchr17\t46313100\t46324500\t0\t127\nchr17\t46326000\t46409100\t0\t127\nchr17\t46410300\t46457400\t0\t100\nchr17\t46458900\t46474800\t0\t87\nchr17\t46476000\t46486800\t0\t87\nchr17\t46488000\t46488600\t0\t87\nchr17\t46497000\t46497300\t0.2835\t85\nchr17\t46499700\t46500000\t0.1951\t88\nchr17\t46503900\t46518900\t0\t112\nchr17\t46520100\t46528800\t0\t112\nchr17\t46530300\t46531800\t0\t112\nchr17\t46533000\t46533900\t0\t112\nchr17\t46535400\t46539000\t0\t95\nchr17\t46540800\t46541100\t0.2561\t84\nchr17\t46544100\t46550400\t0\t115\nchr17\t46551900\t46552500\t0.0022\t114\nchr17\t46554300\t46608600\t0\t125\nchr17\t46610100\t46621800\t0\t125\nchr17\t46623000\t46704600\t0\t125\nchr17\t46705800\t46707000\t0\t125\nchr17\t47016300\t47016900\t0.064\t107\nchr17\t47019000\t47019300\t0.2914\t64\nchr17\t47021400\t47021700\t0.0105\t63\nchr17\t47025600\t47026200\t0.1085\t69\nchr17\t47031900\t47032200\t0.2543\t99\nchr17\t47039400\t47042700\t0\t52\nchr17\t47045700\t47049000\t0\t100\nchr17\t47051700\t47052000\t0.3844\t82\nchr17\t47523000\t47523300\t0.247\t62\nchr17\t49151100\t49151400\t0\t43\nchr17\t49423500\t49424100\t0.0169\t64\nchr17\t50880600\t50880900\t0.3553\t32\nchr17\t51483300\t51484500\t0.222\t89\nchr17\t51624900\t51625200\t0.1893\t73\nchr17\t52185600\t52186200\t0.1435\t64\nchr17\t52405500\t52405800\t0.0545\t67\nchr17\t52408200\t52408500\t0.1133\t82\nchr17\t52657500\t52658400\t0.272\t71\nchr17\t53841600\t53841900\t0.2397\t111\nchr17\t55502400\t55503600\t0.1348\t83\nchr17\t55506000\t55507500\t0.0182\t66\nchr17\t55791300\t55791600\t0.2279\t58\nchr17\t56050200\t56051400\t0.0271\t87\nchr17\t56190300\t56193300\t0.0013\t84\nchr17\t56792700\t56793000\t0.3591\t208\nchr17\t57132000\t57132300\t0.4885\t17\nchr17\t59574000\t59574300\t0.0398\t51\nchr17\t59578200\t59585400\t0\t80\nchr17\t59589600\t59589900\t0.2492\t60\nchr17\t59593200\t59593800\t0.0141\t65\nchr17\t59595600\t59595900\t0.046\t56\nchr17\t59597100\t59597400\t0.046\t56\nchr17\t59978100\t59978400\t0.0361\t60\nchr17\t59979600\t59980200\t0.0361\t60\nchr17\t59981700\t59982900\t0.0117\t72\nchr17\t59985600\t59985900\t0.2156\t62\nchr17\t59990100\t59997300\t0\t64\nchr17\t59999400\t60000000\t0.3262\t58\nchr17\t60001200\t60001500\t0.0238\t60\nchr17\t60007200\t60007500\t0.277\t52\nchr17\t60008700\t60010200\t0.0594\t87\nchr17\t60020100\t60034500\t0\t93\nchr17\t60111000\t60126300\t0\t86\nchr17\t60550800\t60551400\t0.3166\t78\nchr17\t60882900\t60886200\t0.0055\t87\nchr17\t60978000\t60979200\t0.3397\t72\nchr17\t61111800\t61114500\t0.0073\t87\nchr17\t62021100\t62021400\t0.2131\t59\nchr17\t62234700\t62235000\t0.0718\t114\nchr17\t62263800\t62266800\t0.0448\t74\nchr17\t62272500\t62272800\t0.4272\t22\nchr17\t62274300\t62274600\t0.3558\t61\nchr17\t63862800\t63863100\t0.0306\t58\nchr17\t63872700\t63873000\t0.0589\t64\nchr17\t63886200\t63886800\t0.0547\t64\nchr17\t63895500\t63896100\t0.0076\t80\nchr17\t64797300\t64797600\t0.1958\t54\nchr17\t64828200\t64828500\t0.3677\t66\nchr17\t64881300\t64882200\t0.2584\t69\nchr17\t64884000\t64906500\t0\t115\nchr17\t64907700\t64908300\t0\t115\nchr17\t64911300\t64911900\t0.1939\t89\nchr17\t64914600\t64914900\t0.1939\t89\nchr17\t65764800\t65766300\t0.2482\t57\nchr17\t66596700\t66602400\t0\t88\nchr17\t66798300\t66799500\t0.2375\t1205\nchr17\t66934500\t66934800\t0.4024\t36\nchr17\t67470900\t67471200\t0.0797\t54\nchr17\t68269200\t68269500\t0.0801\t25\nchr17\t68313000\t68313300\t0.4074\t139\nchr17\t68409000\t68410500\t0.0695\t83\nchr17\t68999400\t68999700\t0.4732\t57\nchr17\t69002100\t69003600\t0.0782\t62\nchr17\t69280500\t69280800\t0.2203\t87\nchr17\t69612300\t69613500\t0.3011\t44\nchr17\t69615600\t69616200\t0.388\t74\nchr17\t69740700\t69742200\t0.0812\t99\nchr17\t70458900\t70464900\t0\t90\nchr17\t70545000\t70550400\t0\t101\nchr17\t71352300\t71352600\t0.3204\t84\nchr17\t71355000\t71355300\t0.3058\t62\nchr17\t71608800\t71609100\t0.0089\t25\nchr17\t73148100\t73148400\t0.2875\t25\nchr17\t76991400\t76991700\t0.435\t23\nchr17\t77239800\t77240100\t0.4611\t29\nchr17\t77776500\t77777400\t0.0323\t62\nchr17\t80488500\t80488800\t0.2526\t24\nchr17\t80601600\t80602200\t0\t46\nchr17\t80744400\t80744700\t0.4482\t30\nchr17\t80748900\t80749500\t0.2736\t59\nchr17\t80915400\t80915700\t0.4184\t47\nchr17\t80963400\t80963700\t0.1822\t45\nchr17\t81531300\t81531600\t0.4951\t159\nchr17\t82448400\t82448700\t0\t54\nchr17\t82764900\t82765500\t0.0393\t86\nchr17\t82785300\t82785600\t0.4324\t51\nchr17\t82848900\t82849200\t0.4346\t91\nchr17\t82903800\t82904100\t0.2949\t33\nchr17\t82971600\t82972200\t0.1187\t102\nchr17\t82975200\t82975800\t0.3941\t43\nchr17\t83022300\t83022600\t0.3556\t60\nchr17\t83025300\t83025600\t0.2322\t29\nchr17\t83068200\t83068800\t0.3154\t30\nchr17\t83205600\t83205900\t0.4667\t67\nchr17\t83208300\t83211600\t0.0006\t67\nchr17\t83212800\t83214000\t0.0004\t60\nchr17\t83215500\t83235600\t0\t141\nchr17\t83238300\t83239500\t0\t141\nchr17\t83240700\t83247600\t0\t79\nchr18\t9900\t45600\t0\t152\nchr18\t47100\t47400\t0.2698\t126\nchr18\t96900\t97200\t0.3742\t29\nchr18\t107400\t109800\t0.0446\t32919\nchr18\t111900\t112800\t0.4202\t2870\nchr18\t116100\t116400\t0.3194\t45\nchr18\t117600\t117900\t0.0331\t66\nchr18\t126000\t126600\t0.0049\t56\nchr18\t219000\t219600\t0.2311\t71\nchr18\t515100\t515400\t0.3455\t79\nchr18\t536100\t541500\t0\t84\nchr18\t663600\t663900\t0.31\t77\nchr18\t972600\t974100\t0.0793\t97\nchr18\t975300\t975600\t0.1971\t77\nchr18\t1354500\t1354800\t0.1544\t67\nchr18\t1517400\t1517700\t0.2601\t99\nchr18\t1519200\t1521300\t0.1566\t67\nchr18\t1533900\t1534500\t0.0284\t46\nchr18\t1632300\t1632600\t0.2955\t62\nchr18\t1720500\t1721100\t0.0033\t24\nchr18\t2001000\t2001300\t0.1181\t48\nchr18\t2248500\t2248800\t0.236\t91\nchr18\t2251500\t2252100\t0.0771\t168\nchr18\t3736800\t3739200\t0.1639\t84\nchr18\t4473900\t4475100\t0.0683\t84\nchr18\t4477800\t4478100\t0.3279\t80\nchr18\t4650000\t4650300\t0.1137\t53\nchr18\t5007600\t5009700\t0.2381\t70\nchr18\t5332500\t5334600\t0.0142\t56\nchr18\t5681400\t5682000\t0.0029\t69\nchr18\t5685000\t5687700\t0\t94\nchr18\t6272400\t6273600\t0.0151\t107\nchr18\t6420000\t6420300\t0.1714\t101\nchr18\t7399200\t7401300\t0.0679\t74\nchr18\t7402500\t7403100\t0.0679\t74\nchr18\t7692000\t7692300\t0.053\t53\nchr18\t7967100\t7972200\t0.002\t109\nchr18\t8057700\t8062800\t0.0016\t82\nchr18\t8711100\t8711400\t0.1688\t112\nchr18\t9537000\t9537600\t0.3058\t60\nchr18\t9815400\t9816000\t0.0119\t30\nchr18\t10573500\t10574100\t0.0887\t108\nchr18\t10575900\t10576200\t0.1899\t97\nchr18\t10606200\t10606800\t0.0544\t64\nchr18\t10615800\t10616100\t0.1381\t23\nchr18\t10642800\t10643700\t0.114\t78\nchr18\t10646100\t10646400\t0.1295\t42\nchr18\t10914900\t10915200\t0.2506\t54\nchr18\t11620500\t11620800\t0.3436\t86\nchr18\t11623800\t11624100\t0.3053\t74\nchr18\t11634000\t11634300\t0.2514\t65\nchr18\t11804100\t11804700\t0.1491\t56\nchr18\t12077700\t12078000\t0.1295\t72\nchr18\t12081600\t12081900\t0.0693\t47\nchr18\t12141600\t12144900\t0\t77\nchr18\t12147000\t12150000\t0\t77\nchr18\t12179700\t12180300\t0.2801\t71\nchr18\t12203100\t12205500\t0.0108\t83\nchr18\t12228000\t12229500\t0.0548\t68\nchr18\t13976100\t13981800\t0\t80\nchr18\t14165100\t14165400\t0.0266\t59\nchr18\t14382300\t14382600\t0.346\t66\nchr18\t14384400\t14385000\t0.1906\t58\nchr18\t14387400\t14389200\t0.0292\t74\nchr18\t14452200\t14452800\t0.2917\t51\nchr18\t14454300\t14454600\t0.1512\t55\nchr18\t14518500\t14518800\t0.2134\t45\nchr18\t14560500\t14560800\t0.1511\t42\nchr18\t14562000\t14562300\t0.2252\t40\nchr18\t14589900\t14590200\t0.248\t55\nchr18\t14594700\t14595000\t0.4657\t62\nchr18\t14613000\t14613300\t0.1869\t31\nchr18\t14616000\t14616300\t0.3573\t30\nchr18\t14623500\t14624400\t0.1974\t77\nchr18\t14629500\t14629800\t0.1696\t36\nchr18\t14634300\t14634600\t0.1222\t48\nchr18\t14656500\t14657400\t0.2455\t57\nchr18\t14663400\t14663700\t0.249\t72\nchr18\t14673600\t14673900\t0.2534\t52\nchr18\t14689200\t14689500\t0.0249\t12\nchr18\t14721000\t14721600\t0.1676\t47\nchr18\t14800800\t14804400\t0\t54\nchr18\t14811600\t14815200\t0\t60\nchr18\t14822700\t14823300\t0.0226\t64\nchr18\t14857500\t14859900\t0.0196\t47\nchr18\t14891400\t14891700\t0.3236\t54\nchr18\t15026700\t15027000\t0.3012\t76\nchr18\t15032100\t15032400\t0.2295\t43\nchr18\t15159300\t15159600\t0.1593\t57\nchr18\t15171900\t15172200\t0.2391\t151\nchr18\t15213000\t15213900\t0\t66\nchr18\t15215700\t15216000\t0\t66\nchr18\t15273600\t15273900\t0.3049\t24\nchr18\t15363600\t15363900\t0.2157\t67\nchr18\t15461400\t15465000\t0\t150\nchr18\t15466200\t15466800\t0\t150\nchr18\t15468000\t15486300\t0\t336\nchr18\t15487800\t15507600\t0\t336\nchr18\t15508800\t15516900\t0\t336\nchr18\t15518400\t15520500\t0\t261\nchr18\t15521700\t15550200\t0\t261\nchr18\t15551400\t15562500\t0\t430\nchr18\t15563700\t15576900\t0\t430\nchr18\t15578400\t15631200\t0\t430\nchr18\t15632400\t15642600\t0\t187\nchr18\t15643800\t15645300\t0\t187\nchr18\t15647100\t15661800\t0\t177\nchr18\t15663300\t15666000\t0\t155\nchr18\t15667200\t15686400\t0\t210\nchr18\t15687600\t15691800\t0\t210\nchr18\t15693000\t15706500\t0\t210\nchr18\t15707700\t15713100\t0\t210\nchr18\t15714600\t15720600\t0\t210\nchr18\t15722100\t15739500\t0\t199\nchr18\t15741000\t15751500\t0\t199\nchr18\t15753300\t15754800\t0\t199\nchr18\t15756000\t15758700\t0\t175\nchr18\t15760200\t15769800\t0\t175\nchr18\t15771000\t15781200\t0\t193\nchr18\t15785700\t15786300\t0.0375\t79\nchr18\t15787800\t15788400\t0\t31\nchr18\t15792000\t15795000\t0\t572\nchr18\t15797100\t15809400\t0\t572\nchr18\t15810600\t15821700\t0\t572\nchr18\t15822900\t16864200\t0\t572\nchr18\t16865400\t17803200\t0\t572\nchr18\t17805000\t18381600\t0\t460\nchr18\t18382800\t18519000\t0\t460\nchr18\t18520200\t18616800\t0\t710\nchr18\t18618300\t19415700\t0\t710\nchr18\t19417200\t19622100\t0\t710\nchr18\t19623900\t19719000\t0\t385\nchr18\t19720200\t19913100\t0\t385\nchr18\t19914600\t20075100\t0\t385\nchr18\t20076300\t20198400\t0\t385\nchr18\t20199600\t20562300\t0\t385\nchr18\t20564100\t20564700\t0\t109\nchr18\t20571600\t20572200\t0.0038\t72\nchr18\t20573400\t20573700\t0.0038\t72\nchr18\t20576700\t20577900\t0\t85\nchr18\t20580000\t20581500\t0\t117\nchr18\t20583000\t20586300\t0\t117\nchr18\t20591400\t20592600\t0.0262\t55\nchr18\t20595300\t20595600\t0.1637\t45\nchr18\t20596800\t20598300\t0.1637\t45\nchr18\t20599800\t20600700\t0\t180\nchr18\t20601900\t20611500\t0\t180\nchr18\t20613000\t20726700\t0\t180\nchr18\t20727900\t20732700\t0\t180\nchr18\t20733900\t20734800\t0\t180\nchr18\t20738700\t20739900\t0\t102\nchr18\t20741400\t20742900\t0\t75\nchr18\t20745000\t20746800\t0\t128\nchr18\t20748000\t20754900\t0\t128\nchr18\t20756400\t20781000\t0\t128\nchr18\t20782500\t20785500\t0\t128\nchr18\t20787900\t20789400\t0\t76\nchr18\t20790900\t20798400\t0\t76\nchr18\t20800800\t20801100\t0\t76\nchr18\t20803800\t20806200\t0\t76\nchr18\t20807400\t20807700\t0\t76\nchr18\t20810400\t20812500\t0.0302\t68\nchr18\t20813700\t20814600\t0\t104\nchr18\t20817600\t20818500\t0\t59\nchr18\t20820300\t20822400\t0\t59\nchr18\t20824800\t20825100\t0.0532\t32\nchr18\t20827500\t20827800\t0.3953\t42\nchr18\t20835000\t20839800\t0\t95\nchr18\t20911200\t20912700\t0\t51\nchr18\t20914200\t20920800\t0.0012\t138\nchr18\t20922300\t20931900\t0\t183\nchr18\t20935200\t20935500\t0.1353\t42\nchr18\t20945700\t20946000\t0.0073\t49\nchr18\t20954100\t20954400\t0.0809\t61\nchr18\t20955600\t20955900\t0.2531\t60\nchr18\t21144900\t21145200\t0.3423\t71\nchr18\t21160200\t21160500\t0.2103\t45\nchr18\t21738600\t21738900\t0.4444\t78\nchr18\t21884700\t21885000\t0.2373\t90\nchr18\t22530900\t22533900\t0.0243\t72\nchr18\t22581600\t22581900\t0.0083\t30\nchr18\t22722000\t22722300\t0.284\t78\nchr18\t22819500\t22820100\t0.0228\t43\nchr18\t24323700\t24324000\t0.1285\t37\nchr18\t24619200\t24624000\t0.0357\t95\nchr18\t24711300\t24713400\t0.0342\t88\nchr18\t24714900\t24715800\t0.1036\t64\nchr18\t25033500\t25033800\t0.4488\t72\nchr18\t25485300\t25487400\t0\t83\nchr18\t26168700\t26170200\t0.1695\t65\nchr18\t26247900\t26248800\t0.0014\t26\nchr18\t27282000\t27282600\t0.1703\t77\nchr18\t27515100\t27515400\t0.1694\t63\nchr18\t27531600\t27531900\t0.3022\t59\nchr18\t27738300\t27738600\t0.3119\t61\nchr18\t27740100\t27741000\t0.0132\t105\nchr18\t28217400\t28217700\t0.1535\t39\nchr18\t28416600\t28420500\t0.021\t123\nchr18\t28783800\t28784100\t0\t22\nchr18\t29151300\t29151900\t0.3025\t53\nchr18\t29168100\t29168400\t0.3872\t33\nchr18\t29552700\t29553000\t0.1552\t67\nchr18\t30022200\t30026400\t0\t81\nchr18\t31348800\t31350600\t0.0281\t71\nchr18\t31353000\t31353300\t0.2687\t88\nchr18\t32228400\t32229900\t0.1442\t77\nchr18\t32857200\t32860800\t0.0078\t80\nchr18\t32862000\t32862300\t0.0078\t80\nchr18\t33881100\t33881400\t0.3072\t59\nchr18\t34332000\t34332300\t0.2321\t72\nchr18\t34334100\t34334400\t0.24\t63\nchr18\t34335900\t34336500\t0.3568\t65\nchr18\t34554000\t34555200\t0.0409\t86\nchr18\t35206800\t35209800\t0.0023\t84\nchr18\t35211000\t35211300\t0.0023\t84\nchr18\t36235200\t36237300\t0.0997\t71\nchr18\t36240000\t36240300\t0.1\t87\nchr18\t36986400\t36987300\t0.0145\t60\nchr18\t37078500\t37078800\t0.3166\t61\nchr18\t37819800\t37825500\t0\t77\nchr18\t37842300\t37842600\t0.4049\t62\nchr18\t37941000\t37941900\t0.1615\t79\nchr18\t37970100\t37970400\t0.1147\t52\nchr18\t37973400\t37973700\t0.246\t65\nchr18\t39254700\t39255000\t0.1227\t71\nchr18\t39566400\t39570600\t0.0024\t79\nchr18\t39860100\t39861600\t0.0309\t61\nchr18\t39925800\t39926100\t0.187\t70\nchr18\t39928200\t39928500\t0.2948\t55\nchr18\t40190100\t40190400\t0.331\t71\nchr18\t40845300\t40847700\t0\t92\nchr18\t41635200\t41637600\t0.0488\t88\nchr18\t41775300\t41780100\t0\t91\nchr18\t43299600\t43300200\t0.0946\t83\nchr18\t43326000\t43326300\t0.0769\t92\nchr18\t43451700\t43452300\t0\t46\nchr18\t43873500\t43873800\t0.1508\t21\nchr18\t45030300\t45030600\t0.3416\t59\nchr18\t45080400\t45081000\t0\t37\nchr18\t45681000\t45681300\t0.3399\t28\nchr18\t46546200\t46546500\t0.3995\t153\nchr18\t46962000\t46970100\t0\t326\nchr18\t47019900\t47031300\t0\t275\nchr18\t47348400\t47348700\t0.0737\t57\nchr18\t47352000\t47352300\t0.3127\t80\nchr18\t47642700\t47643300\t0.3279\t72\nchr18\t47660700\t47666400\t0\t89\nchr18\t48276600\t48276900\t0.0521\t48\nchr18\t48469800\t48470100\t0.0721\t24\nchr18\t48510900\t48511500\t0.0436\t108\nchr18\t49202400\t49202700\t0.2051\t105\nchr18\t49577100\t49578600\t0.1285\t87\nchr18\t50150100\t50150400\t0.2194\t49\nchr18\t50344200\t50349600\t0\t88\nchr18\t51677100\t51677400\t0.4206\t45\nchr18\t51741300\t51743700\t0.0113\t112\nchr18\t51744900\t51745800\t0.1853\t85\nchr18\t52792500\t52793100\t0.1119\t881\nchr18\t53110800\t53111100\t0.3073\t43\nchr18\t53173800\t53174100\t0.0651\t57\nchr18\t53175900\t53176500\t0.3035\t80\nchr18\t53516700\t53517300\t0.2391\t79\nchr18\t54342600\t54344400\t0.0088\t68\nchr18\t54400200\t54400500\t0.1752\t44\nchr18\t54426600\t54430500\t0\t68\nchr18\t54664500\t54664800\t0.3033\t73\nchr18\t55887900\t55890000\t0.0222\t81\nchr18\t56529600\t56529900\t0.0778\t81\nchr18\t57264600\t57265200\t0.1302\t78\nchr18\t57642300\t57642600\t0.1141\t113\nchr18\t57720300\t57720600\t0.0601\t92\nchr18\t57721800\t57725100\t0.0601\t92\nchr18\t58134300\t58134600\t0.4145\t23\nchr18\t58170300\t58171200\t0\t67\nchr18\t59404200\t59409600\t0\t107\nchr18\t60031200\t60034800\t0.1316\t78\nchr18\t60928200\t60928500\t0.1113\t76\nchr18\t61023300\t61023600\t0.1516\t38\nchr18\t61074600\t61075500\t0\t72\nchr18\t61311300\t61311600\t0.1643\t52\nchr18\t61561500\t61561800\t0.0272\t69\nchr18\t61716600\t61718100\t0.1092\t75\nchr18\t62097000\t62097300\t0.3457\t56\nchr18\t62581200\t62581800\t0.178\t36\nchr18\t62906400\t62912100\t0\t103\nchr18\t63063600\t63063900\t0.1234\t218\nchr18\t63469500\t63470100\t0.2904\t38\nchr18\t63653400\t63653700\t0.3082\t53\nchr18\t63863400\t63866400\t0.0027\t70\nchr18\t64368900\t64369200\t0.3824\t28\nchr18\t64880400\t64880700\t0.285\t63\nchr18\t65393100\t65393400\t0.3363\t25\nchr18\t65583900\t65584200\t0.2081\t45\nchr18\t65779500\t65779800\t0.0385\t44\nchr18\t66547800\t66548100\t0.4387\t31\nchr18\t66717300\t66717600\t0.2532\t67\nchr18\t68227200\t68227800\t0.0122\t68\nchr18\t68538300\t68541600\t0\t36\nchr18\t68786400\t68786700\t0.2248\t59\nchr18\t68859300\t68859600\t0.0539\t52\nchr18\t69450000\t69454800\t0.0578\t102\nchr18\t70685400\t70686600\t0.0115\t136\nchr18\t70746600\t70752300\t0\t76\nchr18\t71179500\t71179800\t0.0301\t24\nchr18\t71357100\t71357400\t0.1558\t54\nchr18\t71656200\t71657700\t0.0508\t37\nchr18\t72162300\t72162600\t0.3201\t55\nchr18\t72966600\t72972300\t0\t94\nchr18\t72975600\t72976800\t0.0481\t75\nchr18\t73444200\t73444500\t0.3092\t79\nchr18\t74485200\t74485500\t0.0805\t15\nchr18\t74998800\t74999400\t0.0004\t90\nchr18\t75299700\t75300000\t0.4777\t45\nchr18\t75591000\t75591300\t0.4051\t83\nchr18\t75847200\t75852600\t0\t112\nchr18\t76585500\t76585800\t0.3629\t58\nchr18\t76645800\t76646100\t0.4181\t58\nchr18\t76810200\t76810500\t0.3867\t52\nchr18\t76967100\t76967400\t0.3097\t112\nchr18\t77028000\t77028600\t0.0699\t70\nchr18\t77416500\t77418300\t0.2033\t73\nchr18\t77670300\t77670600\t0.3643\t13\nchr18\t78371100\t78372900\t0.0129\t96\nchr18\t78437400\t78438300\t0.0625\t334\nchr18\t78486000\t78486300\t0.4519\t26\nchr18\t78502500\t78503100\t0.0018\t74\nchr18\t78513600\t78514800\t0.2194\t68\nchr18\t78633300\t78633900\t0.2947\t72\nchr18\t78753900\t78754200\t0.1537\t36\nchr18\t78782400\t78782700\t0.3774\t35\nchr18\t78787200\t78787500\t0.4951\t34\nchr18\t79014900\t79017000\t0.1763\t145\nchr18\t79033500\t79036500\t0.2596\t122\nchr18\t79115100\t79116900\t0.0367\t64\nchr18\t79146000\t79146300\t0.488\t50\nchr18\t79308900\t79309200\t0.1281\t42\nchr18\t79326000\t79326300\t0.3208\t67\nchr18\t79356900\t79358700\t0.0552\t66\nchr18\t79367100\t79367400\t0.4007\t65\nchr18\t79417500\t79417800\t0.4769\t29\nchr18\t79504800\t79505400\t0.3199\t77\nchr18\t79525200\t79525500\t0.4277\t24\nchr18\t79550100\t79551900\t0\t26\nchr18\t79618800\t79619700\t0.3568\t381\nchr18\t79687200\t79687500\t0.3706\t94\nchr18\t79691700\t79692000\t0.3874\t20\nchr18\t79745400\t79746300\t0\t37\nchr18\t79752300\t79753200\t0.0878\t82\nchr18\t79764600\t79765500\t0.1719\t57\nchr18\t79808400\t79809300\t0.1089\t66\nchr18\t79830900\t79831500\t0.0503\t61\nchr18\t79885800\t79887000\t0\t69\nchr18\t79919700\t79921500\t0.1145\t109\nchr18\t80015700\t80016000\t0.3031\t72\nchr18\t80071500\t80073300\t0.0439\t110\nchr18\t80075100\t80075700\t0.4657\t33\nchr18\t80207100\t80207400\t0.4176\t50\nchr18\t80258400\t80258700\t0.3921\t19\nchr18\t80262900\t80263500\t0.191\t402\nchr19\t60000\t95100\t0\t132\nchr19\t97800\t99000\t0\t132\nchr19\t100200\t102900\t0\t132\nchr19\t104400\t107400\t0\t132\nchr19\t109200\t229200\t0\t106\nchr19\t230700\t236700\t0\t80\nchr19\t239400\t239700\t0.083\t95\nchr19\t241200\t241500\t0.2004\t61\nchr19\t250200\t250500\t0.2066\t70\nchr19\t312600\t312900\t0.2867\t40\nchr19\t332700\t333900\t0.0197\t61\nchr19\t360900\t361800\t0.1338\t78\nchr19\t399900\t400500\t0.1577\t37\nchr19\t411000\t411300\t0.4038\t54\nchr19\t423300\t423600\t0.37\t36\nchr19\t432000\t432900\t0.1025\t36\nchr19\t491700\t492000\t0.3177\t24\nchr19\t524700\t525000\t0.3196\t84\nchr19\t540000\t540300\t0.4355\t11\nchr19\t564000\t564900\t0.0924\t41\nchr19\t605400\t605700\t0.4636\t39\nchr19\t1033800\t1034700\t0.1481\t20\nchr19\t1148700\t1149000\t0.0781\t30\nchr19\t1195200\t1198500\t0\t47\nchr19\t1627800\t1629000\t0.3196\t60\nchr19\t2418600\t2418900\t0.2378\t32\nchr19\t2713500\t2714100\t0.202\t110\nchr19\t2772900\t2773200\t0.4628\t50\nchr19\t3177900\t3178200\t0.1305\t47\nchr19\t3332400\t3332700\t0.4504\t25\nchr19\t3649200\t3649800\t0\t90\nchr19\t3973200\t3975000\t0\t43\nchr19\t4619100\t4619400\t0.4681\t21\nchr19\t4961100\t4961400\t0.1641\t50\nchr19\t5076000\t5076600\t0.2967\t97\nchr19\t5498400\t5498700\t0.3579\t48\nchr19\t5610900\t5611800\t0\t58\nchr19\t5649000\t5649600\t0\t61\nchr19\t7007100\t7007700\t0.04\t67\nchr19\t7010100\t7010700\t0.0217\t68\nchr19\t7019400\t7032600\t0\t101\nchr19\t7035000\t7035300\t0.0493\t84\nchr19\t7037700\t7051500\t0\t103\nchr19\t7056600\t7061400\t0\t101\nchr19\t8274000\t8274300\t0\t40\nchr19\t8275500\t8286600\t0\t40\nchr19\t8288100\t8292600\t0\t37\nchr19\t8293800\t8297100\t0\t37\nchr19\t8298600\t8301300\t0\t37\nchr19\t8740800\t8767200\t0\t267\nchr19\t8768400\t8778900\t0\t267\nchr19\t8780400\t8786700\t0\t233\nchr19\t11424600\t11424900\t0.212\t22\nchr19\t12005400\t12005700\t0.1082\t70\nchr19\t12006900\t12007500\t0.1082\t70\nchr19\t12393300\t12393600\t0.3006\t56\nchr19\t13536000\t13536300\t0.3648\t11\nchr19\t13703100\t13704300\t0.1915\t69\nchr19\t13936800\t13937100\t0.2977\t28\nchr19\t14585700\t14586000\t0.2307\t57\nchr19\t14589900\t14590200\t0.1833\t61\nchr19\t14622600\t14623200\t0\t27\nchr19\t14649600\t14649900\t0.4291\t35\nchr19\t14749500\t14750100\t0.2925\t13\nchr19\t15362400\t15362700\t0.3641\t84\nchr19\t15674100\t15674400\t0.3333\t14\nchr19\t15931500\t15934200\t0.0489\t258\nchr19\t17349000\t17349300\t0.2568\t103\nchr19\t20148600\t20150700\t0.0801\t54\nchr19\t20797200\t20797500\t0.4543\t31\nchr19\t21720300\t21722700\t0\t57\nchr19\t21864900\t21865200\t0.0265\t74\nchr19\t21866400\t21866700\t0.0265\t74\nchr19\t22107900\t22108500\t0.337\t63\nchr19\t22915800\t22916100\t0.2118\t72\nchr19\t22925700\t22926300\t0.0574\t65\nchr19\t22928100\t22928400\t0.0397\t24\nchr19\t23134500\t23135100\t0.1443\t83\nchr19\t24114300\t24114600\t0.1455\t59\nchr19\t24411000\t24413700\t0\t77\nchr19\t24417000\t24417300\t0.4868\t192\nchr19\t24420600\t24449100\t0\t427\nchr19\t24891300\t24891900\t0.1596\t651\nchr19\t24894000\t24895800\t0.0686\t418\nchr19\t24908400\t24908700\t0.006\t15\nchr19\t27639600\t27641100\t0.1823\t70\nchr19\t27645000\t27645600\t0.1251\t79\nchr19\t28050600\t28050900\t0.4578\t53\nchr19\t28678200\t28678500\t0.2025\t53\nchr19\t28805100\t28805400\t0.2978\t15\nchr19\t29229600\t29231100\t0\t69\nchr19\t29459700\t29465100\t0\t73\nchr19\t29898000\t29902200\t0\t72\nchr19\t30141300\t30143700\t0\t65\nchr19\t31506900\t31507500\t0.3713\t64\nchr19\t31653600\t31654500\t0\t64\nchr19\t34078500\t34080300\t0\t63\nchr19\t34616400\t34616700\t0.1092\t42\nchr19\t34861500\t34863000\t0.049\t94\nchr19\t34864200\t34864800\t0.049\t94\nchr19\t35358600\t35358900\t0.2272\t66\nchr19\t35360400\t35360700\t0.038\t45\nchr19\t35371200\t35371800\t0.3392\t57\nchr19\t36247200\t36247800\t0.1559\t114\nchr19\t36269100\t36309000\t0\t240\nchr19\t36311700\t36312600\t0\t60\nchr19\t36698400\t36698700\t0.2906\t67\nchr19\t36699900\t36700200\t0.1214\t58\nchr19\t36793500\t36793800\t0.3068\t29\nchr19\t37264500\t37264800\t0.0716\t61\nchr19\t37266000\t37266600\t0.0716\t61\nchr19\t37269300\t37303500\t0\t411\nchr19\t37332000\t37332300\t0.3343\t84\nchr19\t37751100\t37752000\t0.1751\t55\nchr19\t37838100\t37843200\t0\t76\nchr19\t37866300\t37866900\t0.0056\t80\nchr19\t38540400\t38541000\t0.1443\t34\nchr19\t38770500\t38773500\t0\t71\nchr19\t38789400\t38792100\t0\t80\nchr19\t39245100\t39245400\t0.2783\t58\nchr19\t39876600\t39877200\t0.0806\t103\nchr19\t39879600\t39881100\t0.0288\t94\nchr19\t39882900\t39884700\t0.0444\t98\nchr19\t39887100\t39889800\t0\t111\nchr19\t39892800\t39893400\t0.2125\t110\nchr19\t39895800\t39897600\t0.0161\t109\nchr19\t39899700\t39901500\t0.0754\t101\nchr19\t39903300\t39906300\t0\t108\nchr19\t39958500\t39958800\t0.1327\t43\nchr19\t40107300\t40109700\t0.0002\t93\nchr19\t40117200\t40119300\t0.101\t91\nchr19\t40647600\t40649400\t0.0007\t56\nchr19\t40821300\t40821600\t0.3135\t39\nchr19\t40842900\t40843200\t0.1006\t60\nchr19\t40874700\t40875000\t0.0681\t63\nchr19\t40965000\t40965300\t0.1602\t80\nchr19\t40998600\t40999200\t0.1843\t61\nchr19\t41103900\t41104200\t0.1806\t64\nchr19\t41644200\t41646000\t0.0206\t78\nchr19\t41842800\t41843100\t0.3766\t72\nchr19\t42769800\t42770400\t0.2481\t74\nchr19\t43051200\t43052400\t0.017\t70\nchr19\t43243200\t43243500\t0.304\t68\nchr19\t43356000\t43360800\t0\t73\nchr19\t43364700\t43365600\t0.014\t88\nchr19\t43369200\t43370400\t0.0435\t73\nchr19\t43374900\t43378800\t0\t71\nchr19\t43864500\t43864800\t0.2311\t67\nchr19\t43866000\t43866300\t0.2311\t67\nchr19\t43878000\t43878300\t0.2417\t47\nchr19\t44225100\t44225400\t0.3503\t95\nchr19\t44546400\t44546700\t0.0538\t77\nchr19\t44594400\t44595000\t0.048\t66\nchr19\t44801100\t44801400\t0.471\t46\nchr19\t45648300\t45648600\t0.2218\t41\nchr19\t46038900\t46039800\t0.2929\t65\nchr19\t46078800\t46079100\t0.4615\t49\nchr19\t46438500\t46440900\t0\t37\nchr19\t46452900\t46453200\t0.2246\t11\nchr19\t47903400\t47958900\t0\t501\nchr19\t48669000\t48669600\t0.3813\t287\nchr19\t48834900\t48835200\t0.2757\t29\nchr19\t49023000\t49023600\t0.1063\t58\nchr19\t49028100\t49028400\t0.1246\t70\nchr19\t49032600\t49032900\t0.0232\t78\nchr19\t49040400\t49041000\t0.2993\t84\nchr19\t49054500\t49054800\t0.1489\t63\nchr19\t49959600\t49959900\t0.0411\t53\nchr19\t49970700\t49971300\t0.3294\t72\nchr19\t50074800\t50075100\t0.1661\t59\nchr19\t50091300\t50098800\t0\t877\nchr19\t50100000\t50133600\t0\t877\nchr19\t50137200\t50139300\t0\t322\nchr19\t50609100\t50609400\t0.0756\t10\nchr19\t50617500\t50617800\t0.1212\t62\nchr19\t50961000\t50961300\t0.3689\t58\nchr19\t51051600\t51051900\t0.0581\t31\nchr19\t51182700\t51183000\t0.4927\t55\nchr19\t51310800\t51311100\t0.1409\t38\nchr19\t51353400\t51353700\t0.4121\t35\nchr19\t51463800\t51464400\t0.314\t68\nchr19\t51629700\t51630300\t0.04\t57\nchr19\t51646200\t51646800\t0.0275\t90\nchr19\t51672900\t51674100\t0\t63\nchr19\t51758100\t51758700\t0.0684\t88\nchr19\t52575600\t52575900\t0.1137\t65\nchr19\t52802700\t52803000\t0.317\t191\nchr19\t52888200\t52888500\t0.0797\t53\nchr19\t53014200\t53014500\t0.0649\t69\nchr19\t53049300\t53049600\t0.0059\t72\nchr19\t53097000\t53097300\t0.0819\t79\nchr19\t53113200\t53113500\t0.0981\t41\nchr19\t53126400\t53127000\t0.0004\t66\nchr19\t53186100\t53188800\t0\t74\nchr19\t53281800\t53282100\t0.2322\t61\nchr19\t53301600\t53301900\t0.1905\t53\nchr19\t53962500\t53962800\t0.4281\t27\nchr19\t54360000\t54360300\t0.0974\t51\nchr19\t54510000\t54510300\t0.3773\t81\nchr19\t54580200\t54581400\t0\t74\nchr19\t54645000\t54645300\t0.3421\t53\nchr19\t54749700\t54750000\t0.2692\t27\nchr19\t54780000\t54781200\t0.1369\t60\nchr19\t54844200\t54844500\t0.3422\t27\nchr19\t55093500\t55094100\t0.4238\t46\nchr19\t55450200\t55450500\t0.2292\t52\nchr19\t55472100\t55472400\t0.4325\t39\nchr19\t55763700\t55764000\t0.3647\t87\nchr19\t55773600\t55774500\t0.0363\t65\nchr19\t55824900\t55827000\t0\t71\nchr19\t55850400\t55851600\t0.4654\t46\nchr19\t56080200\t56080500\t0.0022\t32\nchr19\t56103900\t56104500\t0.2659\t25\nchr19\t56151000\t56151600\t0.3374\t76\nchr19\t56235300\t56236200\t0.3537\t78\nchr19\t56306700\t56307000\t0.2272\t39\nchr19\t56339400\t56339700\t0.023\t38\nchr19\t56444700\t56445900\t0.0672\t79\nchr19\t56600100\t56600400\t0.3368\t30\nchr19\t56669700\t56670000\t0.2661\t58\nchr19\t56745000\t56745600\t0.1629\t218\nchr19\t57148200\t57148500\t0.1221\t48\nchr19\t57169200\t57169500\t0.2278\t25\nchr19\t57206700\t57207000\t0.4028\t62\nchr19\t57833100\t57835200\t0.0192\t83\nchr19\t57881400\t57882300\t0.0865\t101\nchr19\t58106400\t58106700\t0.1481\t17\nchr19\t58337400\t58337700\t0.1195\t55\nchr19\t58404300\t58404600\t0.2187\t58\nchr19\t58587600\t58587900\t0.0974\t59\nchr19\t58589100\t58589400\t0.0437\t78\nchr19\t58591800\t58604400\t0.002\t99\nchr19\t58605600\t58605900\t0.002\t99\nchr2\t127200\t127500\t0.3351\t76\nchr2\t197700\t198300\t0.0219\t46\nchr2\t207000\t207600\t0.1359\t138\nchr2\t294000\t294300\t0.4876\t13\nchr2\t306600\t308700\t0.211\t47\nchr2\t399000\t399300\t0.3463\t72\nchr2\t420300\t420900\t0.0257\t30\nchr2\t427200\t427500\t0.4499\t40\nchr2\t488100\t488400\t0.0756\t14\nchr2\t495300\t495600\t0.0635\t30\nchr2\t671400\t671700\t0.1278\t53\nchr2\t800400\t803400\t0.0168\t99\nchr2\t804900\t805200\t0.1516\t87\nchr2\t846600\t846900\t0.3029\t45\nchr2\t861000\t861300\t0.2527\t22\nchr2\t879000\t879300\t0.4135\t64\nchr2\t928200\t928500\t0.3437\t111\nchr2\t931800\t932400\t0.042\t20\nchr2\t970500\t970800\t0.2222\t69\nchr2\t1012800\t1014300\t0.0251\t38\nchr2\t1107000\t1109100\t0\t72\nchr2\t1179900\t1180200\t0.3586\t88\nchr2\t1221600\t1223400\t0.1335\t429\nchr2\t1317300\t1317600\t0.3782\t35\nchr2\t1342500\t1346100\t0\t61\nchr2\t1417200\t1417800\t0.0187\t77\nchr2\t1444500\t1444800\t0.1581\t46\nchr2\t1490100\t1490400\t0.2577\t29\nchr2\t1529100\t1529400\t0.3412\t15\nchr2\t1568700\t1569000\t0.2091\t28\nchr2\t1750500\t1750800\t0.2871\t70\nchr2\t2034300\t2036400\t0.0236\t50\nchr2\t2138400\t2138700\t0.0578\t79\nchr2\t2257800\t2259300\t0.0011\t122\nchr2\t2736300\t2736600\t0.4243\t46\nchr2\t3221100\t3221700\t0.0063\t147\nchr2\t3315300\t3315900\t0.0731\t62\nchr2\t3331200\t3332100\t0.0924\t106\nchr2\t3374700\t3375000\t0.0953\t105\nchr2\t3437100\t3437400\t0.3468\t34\nchr2\t3590400\t3592200\t0.0064\t138\nchr2\t3775200\t3775800\t0.0633\t34\nchr2\t3796500\t3796800\t0.1463\t75\nchr2\t4159200\t4159500\t0.2758\t60\nchr2\t4162200\t4162500\t0.2177\t93\nchr2\t4471200\t4471500\t0.4452\t57\nchr2\t4647900\t4648200\t0.2045\t85\nchr2\t4733700\t4739700\t0\t98\nchr2\t5049900\t5050200\t0.2386\t56\nchr2\t5069100\t5069400\t0.2057\t22\nchr2\t5196900\t5199000\t0.0379\t77\nchr2\t5637600\t5637900\t0.333\t62\nchr2\t5644200\t5644500\t0.2666\t73\nchr2\t6238200\t6238800\t0.0122\t59\nchr2\t7120500\t7120800\t0.277\t94\nchr2\t7488600\t7489200\t0.2343\t48\nchr2\t8041200\t8041500\t0.2863\t83\nchr2\t9406200\t9406500\t0.1486\t29\nchr2\t10399200\t10399500\t0.3314\t226\nchr2\t10804500\t10805700\t0.1749\t69\nchr2\t10953600\t10953900\t0.4391\t220\nchr2\t10996200\t11001600\t0\t101\nchr2\t11091900\t11092200\t0.0611\t12\nchr2\t12346500\t12346800\t0.3467\t77\nchr2\t12492300\t12492600\t0.3633\t59\nchr2\t12522600\t12525000\t0\t102\nchr2\t13734300\t13734900\t0.1792\t86\nchr2\t14489100\t14489400\t0.0657\t63\nchr2\t14501700\t14502000\t0.1877\t77\nchr2\t14662500\t14662800\t0.1065\t94\nchr2\t14802000\t14802300\t0.124\t63\nchr2\t14850600\t14853300\t0.0762\t106\nchr2\t15026100\t15026400\t0.3386\t22\nchr2\t15219600\t15219900\t0.3652\t66\nchr2\t16230600\t16232100\t0.209\t108\nchr2\t16593900\t16599600\t0\t117\nchr2\t16876800\t16877100\t0.356\t67\nchr2\t16878600\t16878900\t0.2049\t73\nchr2\t17946600\t17946900\t0.4035\t36\nchr2\t17984100\t17985300\t0\t76\nchr2\t18012300\t18014400\t0.0398\t94\nchr2\t18015600\t18016200\t0.1086\t62\nchr2\t18756000\t18756300\t0.1515\t24\nchr2\t19307100\t19307400\t0.2417\t72\nchr2\t19309500\t19310700\t0.0924\t130\nchr2\t19831800\t19832100\t0.2034\t87\nchr2\t20820600\t20820900\t0.1216\t69\nchr2\t20906400\t20906700\t0.2978\t58\nchr2\t21067500\t21067800\t0.3466\t86\nchr2\t21188100\t21188400\t0.2198\t86\nchr2\t21208800\t21209100\t0.3165\t71\nchr2\t21907800\t21908100\t0.343\t77\nchr2\t22158900\t22159200\t0.2378\t85\nchr2\t22986900\t22988100\t0.0499\t89\nchr2\t23225100\t23230500\t0\t87\nchr2\t23845800\t23847300\t0\t54\nchr2\t26656200\t26656500\t0.3134\t53\nchr2\t27359700\t27360300\t0.1441\t60\nchr2\t27460200\t27460800\t0.0332\t83\nchr2\t27539400\t27541200\t0.1751\t100\nchr2\t27556800\t27558900\t0\t90\nchr2\t28126500\t28126800\t0.1744\t74\nchr2\t28131000\t28131300\t0.3691\t28\nchr2\t28458600\t28459200\t0.0194\t22\nchr2\t29093100\t29094600\t0.1604\t91\nchr2\t29672700\t29673300\t0.3837\t73\nchr2\t30596700\t30597000\t0.1278\t55\nchr2\t30606300\t30606600\t0.2612\t72\nchr2\t30613800\t30614400\t0.045\t71\nchr2\t30816900\t30817200\t0.0104\t49\nchr2\t30907800\t30908700\t0.132\t76\nchr2\t31500300\t31500900\t0.2163\t82\nchr2\t31576200\t31577100\t0.0232\t55\nchr2\t32110800\t32111100\t0.3083\t23\nchr2\t32446800\t32448300\t0.1032\t68\nchr2\t32866500\t32867100\t0.0179\t2767\nchr2\t32868300\t32870400\t0.0179\t2767\nchr2\t32916000\t32916900\t0.0063\t213491\nchr2\t33556200\t33556500\t0.4155\t38\nchr2\t34572600\t34576500\t0\t89\nchr2\t34819800\t34820100\t0.1715\t68\nchr2\t36112800\t36118500\t0\t87\nchr2\t36183000\t36184500\t0.0808\t173\nchr2\t37225500\t37226100\t0.0834\t71\nchr2\t37494000\t37494900\t0.0076\t72\nchr2\t38492700\t38493000\t0.2693\t58\nchr2\t38755500\t38755800\t0.4046\t60\nchr2\t38844300\t38844600\t0.2672\t25\nchr2\t40012800\t40013100\t0.3483\t60\nchr2\t41515200\t41515500\t0.1615\t72\nchr2\t41550600\t41553600\t0\t71\nchr2\t41746200\t41748600\t0.0085\t70\nchr2\t42605100\t42605400\t0.3174\t67\nchr2\t42991200\t42991500\t0.2502\t83\nchr2\t42992700\t42994800\t0.0543\t85\nchr2\t43296900\t43298400\t0.0971\t74\nchr2\t43660500\t43665900\t0\t112\nchr2\t44587800\t44589600\t0.0206\t47\nchr2\t45059700\t45065400\t0\t95\nchr2\t45076200\t45081600\t0\t109\nchr2\t47100300\t47100600\t0.294\t50\nchr2\t48554700\t48556800\t0.0693\t76\nchr2\t48744000\t48744600\t0.0567\t95\nchr2\t49008600\t49008900\t0.1997\t92\nchr2\t49010100\t49010400\t0.1997\t92\nchr2\t49638900\t49639800\t0.055\t75\nchr2\t51735600\t51737100\t0.0321\t88\nchr2\t51852600\t51852900\t0.4032\t19\nchr2\t51939300\t51939600\t0.0615\t79\nchr2\t53398800\t53400600\t0\t128\nchr2\t53591400\t53592600\t0.0393\t81\nchr2\t54873600\t54873900\t0.1709\t55\nchr2\t55739400\t55740000\t0.0959\t117\nchr2\t56172900\t56173500\t0.3665\t95\nchr2\t56552100\t56552400\t0.1106\t47\nchr2\t56622900\t56623200\t0.4338\t26\nchr2\t56664000\t56664300\t0.1714\t74\nchr2\t56682900\t56683800\t0.0145\t78\nchr2\t57192300\t57193500\t0\t30\nchr2\t57422400\t57422700\t0.2191\t73\nchr2\t57423900\t57424200\t0.0954\t108\nchr2\t57590400\t57590700\t0.0667\t116\nchr2\t57612900\t57613200\t0.2337\t79\nchr2\t58383000\t58383600\t0.1843\t75\nchr2\t59162400\t59162700\t0.1062\t70\nchr2\t59554800\t59555100\t0.1204\t94\nchr2\t59556900\t59558400\t0.1204\t94\nchr2\t60084600\t60088500\t0\t154\nchr2\t60143400\t60143700\t0.1105\t111\nchr2\t60928500\t60928800\t0.1351\t93\nchr2\t61980000\t61980600\t0.0088\t93\nchr2\t62647500\t62648100\t0.4164\t71\nchr2\t62836500\t62837100\t0.1456\t79\nchr2\t62838900\t62839500\t0.1456\t79\nchr2\t64375800\t64376100\t0.4061\t184\nchr2\t64511100\t64513200\t0\t77\nchr2\t66142200\t66142500\t0.0368\t71\nchr2\t66396900\t66397200\t0.2948\t85\nchr2\t66627600\t66627900\t0.3001\t75\nchr2\t67176600\t67176900\t0.3163\t69\nchr2\t70429800\t70431000\t0.0996\t66\nchr2\t70434600\t70435200\t0.2783\t49\nchr2\t71083500\t71084100\t0.0076\t63\nchr2\t71182800\t71183400\t0.0014\t73\nchr2\t71411700\t71416800\t0\t97\nchr2\t71769300\t71770200\t0.0293\t62\nchr2\t72016200\t72016800\t0.0718\t69\nchr2\t72018900\t72020400\t0.0718\t69\nchr2\t72065100\t72067800\t0.0116\t99\nchr2\t72642300\t72642600\t0.2322\t82\nchr2\t72702300\t72703800\t0.0141\t97\nchr2\t73166700\t73167000\t0.1394\t62\nchr2\t73463400\t73463700\t0.247\t72\nchr2\t73785000\t73807800\t0\t144\nchr2\t74794200\t74794500\t0.1313\t60\nchr2\t74797200\t74797500\t0.3487\t66\nchr2\t75330900\t75331500\t0.1244\t93\nchr2\t76299300\t76301700\t0\t106\nchr2\t76480800\t76481100\t0.1398\t75\nchr2\t76776600\t76778400\t0.1296\t87\nchr2\t76800300\t76800900\t0.3244\t81\nchr2\t77244000\t77244300\t0.185\t85\nchr2\t77597100\t77598600\t0.1228\t108\nchr2\t77647200\t77647800\t0.0243\t127\nchr2\t77670300\t77670600\t0.2464\t51\nchr2\t77676300\t77676600\t0.2\t53\nchr2\t77680200\t77680500\t0.2608\t42\nchr2\t77681700\t77683200\t0.0915\t74\nchr2\t77686500\t77687100\t0.0223\t51\nchr2\t77755800\t77757300\t0.0549\t123\nchr2\t77795100\t77795400\t0.1284\t108\nchr2\t79107300\t79109700\t0.0188\t112\nchr2\t79283100\t79285800\t0.0203\t94\nchr2\t79410000\t79410300\t0.3518\t89\nchr2\t81314700\t81315000\t0.2814\t68\nchr2\t81351900\t81352200\t0.0277\t53\nchr2\t81608700\t81609600\t0.1393\t74\nchr2\t83091000\t83094300\t0.1351\t91\nchr2\t83770200\t83773500\t0\t115\nchr2\t83914500\t83914800\t0.1004\t29\nchr2\t84371400\t84372000\t0.0106\t104\nchr2\t84531300\t84531600\t0.2597\t15\nchr2\t84794700\t84795000\t0.2554\t112\nchr2\t85099800\t85100100\t0.4932\t32\nchr2\t85483500\t85484700\t0.0213\t118\nchr2\t85489500\t85489800\t0.0448\t99\nchr2\t86655300\t86660700\t0\t112\nchr2\t86711700\t86712000\t0.2444\t36\nchr2\t86713500\t86713800\t0.031\t50\nchr2\t86717100\t86717400\t0.0391\t67\nchr2\t86719200\t86719500\t0.0391\t67\nchr2\t86721900\t86725200\t0\t66\nchr2\t86727000\t86728200\t0\t66\nchr2\t86730000\t86733000\t0\t77\nchr2\t86735400\t86740500\t0\t87\nchr2\t86905800\t86909700\t0\t78\nchr2\t86910900\t86913300\t0\t85\nchr2\t86915400\t86924100\t0\t80\nchr2\t86927700\t86929200\t0\t80\nchr2\t86930700\t86931000\t0\t80\nchr2\t86932200\t86933100\t0\t80\nchr2\t86935200\t86938500\t0\t80\nchr2\t86939700\t86940600\t0\t80\nchr2\t86945700\t86956500\t0\t82\nchr2\t86957700\t87022800\t0\t82\nchr2\t87024600\t87032700\t0\t82\nchr2\t87035100\t87049200\t0\t86\nchr2\t87055500\t87063300\t0\t87\nchr2\t87064500\t87066600\t0\t72\nchr2\t87068700\t87069600\t0\t69\nchr2\t87071700\t87074700\t0\t69\nchr2\t87077100\t87077400\t0.3378\t80\nchr2\t87079200\t87079800\t0.1717\t65\nchr2\t87081000\t87081300\t0.2018\t58\nchr2\t87082800\t87083400\t0.1687\t49\nchr2\t87101400\t87101700\t0.345\t53\nchr2\t87104100\t87104400\t0.0736\t65\nchr2\t87107700\t87108000\t0.0551\t49\nchr2\t87114600\t87114900\t0.3318\t41\nchr2\t87116700\t87117000\t0.2585\t46\nchr2\t87118500\t87127800\t0\t94\nchr2\t87129000\t87129900\t0\t94\nchr2\t87135000\t87136200\t0.0675\t55\nchr2\t87139200\t87139800\t0.0305\t57\nchr2\t87142200\t87142500\t0.3373\t67\nchr2\t87150600\t87162900\t0\t89\nchr2\t87164700\t87165900\t0.1021\t50\nchr2\t87169800\t87170100\t0.1733\t54\nchr2\t87171600\t87171900\t0.1269\t41\nchr2\t87174000\t87174300\t0.2863\t52\nchr2\t87175800\t87176100\t0.1389\t50\nchr2\t87178500\t87178800\t0.2761\t58\nchr2\t87180300\t87180900\t0.2761\t58\nchr2\t87184200\t87186000\t0.0117\t73\nchr2\t87188700\t87189300\t0.0117\t73\nchr2\t87191100\t87192000\t0.0117\t73\nchr2\t87194700\t87197400\t0.0578\t73\nchr2\t87201600\t87203100\t0.0774\t68\nchr2\t87207300\t87207900\t0.015\t69\nchr2\t87209100\t87213900\t0.0095\t64\nchr2\t87216300\t87217500\t0.1072\t82\nchr2\t87226800\t87227700\t0.1155\t70\nchr2\t87231900\t87232200\t0.2123\t73\nchr2\t87233700\t87234000\t0.2123\t73\nchr2\t87236100\t87236400\t0.2123\t73\nchr2\t87239100\t87239400\t0.0043\t70\nchr2\t87240600\t87242100\t0.0043\t70\nchr2\t87244800\t87245100\t0.3105\t78\nchr2\t87248400\t87249300\t0.2219\t61\nchr2\t87254400\t87254700\t0.3093\t58\nchr2\t87261900\t87262200\t0.2624\t67\nchr2\t87265200\t87267900\t0\t75\nchr2\t87271500\t87271800\t0.1237\t66\nchr2\t87273300\t87273600\t0.1237\t66\nchr2\t87277200\t87279000\t0\t83\nchr2\t87280500\t87280800\t0.0631\t60\nchr2\t87282300\t87282600\t0.1303\t33\nchr2\t87284700\t87285000\t0.2823\t61\nchr2\t87288600\t87290100\t0.2322\t72\nchr2\t87292200\t87292500\t0.3352\t48\nchr2\t87298200\t87298800\t0.0279\t72\nchr2\t87303000\t87303600\t0.0113\t61\nchr2\t87307500\t87307800\t0.1913\t71\nchr2\t87311400\t87312000\t0.0269\t68\nchr2\t87315900\t87316200\t0.0855\t61\nchr2\t87319200\t87319500\t0.1\t64\nchr2\t87324900\t87326700\t0.1244\t67\nchr2\t87331200\t87331500\t0.2911\t68\nchr2\t87338700\t87339000\t0.2744\t67\nchr2\t87340500\t87340800\t0.1158\t120\nchr2\t87344100\t87344400\t0.3383\t92\nchr2\t87349200\t87350700\t0.0153\t88\nchr2\t87353100\t87353400\t0.2342\t91\nchr2\t87355800\t87357600\t0.041\t111\nchr2\t87362700\t87363000\t0.0259\t80\nchr2\t87366900\t87367500\t0.1028\t85\nchr2\t87370500\t87372900\t0.0134\t89\nchr2\t87377700\t87380700\t0\t128\nchr2\t87382200\t87383700\t0\t128\nchr2\t87384900\t87385500\t0\t128\nchr2\t87390600\t87391800\t0\t128\nchr2\t87393600\t87395700\t0\t128\nchr2\t87408000\t87409500\t0\t87\nchr2\t87413100\t87413400\t0.3915\t37\nchr2\t87416700\t87417000\t0.3675\t73\nchr2\t87418500\t87418800\t0.3544\t159\nchr2\t87420300\t87420900\t0.1758\t77\nchr2\t87423600\t87424500\t0.1195\t74\nchr2\t87433200\t87434100\t0.0701\t70\nchr2\t87448200\t87448500\t0.1392\t58\nchr2\t87450600\t87450900\t0.2978\t63\nchr2\t87459000\t87459300\t0.2357\t65\nchr2\t87461100\t87461400\t0.2093\t74\nchr2\t87472800\t87473100\t0.1064\t72\nchr2\t87494400\t87494700\t0.3982\t56\nchr2\t87496800\t87499500\t0\t76\nchr2\t87501600\t87507600\t0\t73\nchr2\t87511200\t87512100\t0.1596\t54\nchr2\t87513300\t87516300\t0\t76\nchr2\t87517800\t87521100\t0.0186\t76\nchr2\t87523800\t87524400\t0\t34\nchr2\t87526200\t87526800\t0\t82\nchr2\t87528600\t87531300\t0\t66\nchr2\t87534300\t87536400\t0\t62\nchr2\t87537900\t87538800\t0.0722\t64\nchr2\t87540000\t87551100\t0\t79\nchr2\t87552300\t87552600\t0.2778\t50\nchr2\t87556200\t87557700\t0.0024\t73\nchr2\t87560100\t87562200\t0\t86\nchr2\t87564300\t87565800\t0.0056\t62\nchr2\t87570600\t87570900\t0.0239\t64\nchr2\t87572100\t87574800\t0.0689\t70\nchr2\t87577200\t87577800\t0.2977\t53\nchr2\t87581700\t87582600\t0\t68\nchr2\t87588300\t87588600\t0.3099\t57\nchr2\t87592200\t87593100\t0.2023\t70\nchr2\t87595500\t87598200\t0\t78\nchr2\t87600300\t87607500\t0\t78\nchr2\t87608700\t87610200\t0\t78\nchr2\t87611400\t87616500\t0\t75\nchr2\t87618600\t87623700\t0\t92\nchr2\t87624900\t87629400\t0\t92\nchr2\t87630600\t87633900\t0\t70\nchr2\t87635700\t87636000\t0.1072\t50\nchr2\t87645000\t87645300\t0.2373\t61\nchr2\t87648900\t87649200\t0.0879\t57\nchr2\t87650700\t87651600\t0.1247\t66\nchr2\t87654000\t87654300\t0.0626\t72\nchr2\t87657000\t87657600\t0.0982\t64\nchr2\t87663000\t87665400\t0.0716\t78\nchr2\t87666900\t87669600\t0\t75\nchr2\t87673200\t87674400\t0.1981\t62\nchr2\t87676200\t87677400\t0.0852\t71\nchr2\t87681000\t87682500\t0.0174\t74\nchr2\t87687000\t87687600\t0.014\t72\nchr2\t87690900\t87691200\t0.0439\t67\nchr2\t87694200\t87695400\t0.1088\t63\nchr2\t87698700\t87705600\t0\t74\nchr2\t87709200\t87711900\t0.0044\t51\nchr2\t87714900\t87718500\t0.0018\t56\nchr2\t87721800\t87724500\t0\t72\nchr2\t87726000\t87730500\t0\t72\nchr2\t87732000\t87732600\t0.0819\t68\nchr2\t87737100\t87824100\t0\t97\nchr2\t87826200\t87830100\t0\t51\nchr2\t87833100\t87834000\t0\t56\nchr2\t87835500\t87835800\t0\t56\nchr2\t87837600\t87840300\t0\t69\nchr2\t87841800\t87842100\t0\t69\nchr2\t87843300\t87843600\t0\t69\nchr2\t87844800\t87845100\t0.0809\t47\nchr2\t87849900\t87852300\t0\t57\nchr2\t87854100\t87854400\t0.0419\t62\nchr2\t87855900\t87856200\t0.0419\t62\nchr2\t87858900\t87860100\t0.0349\t51\nchr2\t87861900\t87862500\t0.0011\t54\nchr2\t87865500\t87866100\t0.0166\t64\nchr2\t87867900\t87869700\t0.0077\t48\nchr2\t87871200\t87871500\t0.0855\t52\nchr2\t87874200\t87874500\t0.2417\t51\nchr2\t87879600\t87880800\t0.0113\t51\nchr2\t87887700\t87891900\t0\t61\nchr2\t87893700\t87894000\t0\t61\nchr2\t87895500\t87896700\t0\t61\nchr2\t87898200\t87910200\t0\t61\nchr2\t87912600\t87912900\t0\t61\nchr2\t87914100\t87914700\t0.0252\t43\nchr2\t87916200\t87917700\t0.0219\t47\nchr2\t87920700\t87921000\t0.2452\t36\nchr2\t87923700\t87926700\t0\t57\nchr2\t87927900\t87931800\t0\t58\nchr2\t87933000\t87933300\t0\t58\nchr2\t87935700\t87936900\t0.0573\t51\nchr2\t87938400\t87939000\t0\t45\nchr2\t87941400\t87947100\t0\t55\nchr2\t87948600\t87950700\t0\t61\nchr2\t87953400\t87956100\t0\t42\nchr2\t87959100\t87960900\t0.0033\t51\nchr2\t87963300\t87963600\t0.1192\t62\nchr2\t87965100\t87967200\t0\t64\nchr2\t87969600\t87972600\t0\t64\nchr2\t87974100\t87975600\t0.1389\t57\nchr2\t87977100\t87983700\t0\t68\nchr2\t87987300\t87987900\t0.0042\t55\nchr2\t87990900\t87991200\t0.0338\t66\nchr2\t88181100\t88181400\t0.3631\t71\nchr2\t88729800\t88732800\t0\t100\nchr2\t89070300\t89071500\t0.1162\t70\nchr2\t89077800\t89078100\t0.3313\t64\nchr2\t89080500\t89080800\t0.1974\t52\nchr2\t89084100\t89084400\t0.1931\t66\nchr2\t89096400\t89096700\t0.0497\t65\nchr2\t89106900\t89108100\t0.0129\t67\nchr2\t89110200\t89110500\t0.0257\t71\nchr2\t89123100\t89123700\t0.109\t65\nchr2\t89154000\t89154300\t0.2966\t53\nchr2\t89157000\t89157300\t0.0684\t62\nchr2\t89158500\t89158800\t0.0684\t62\nchr2\t89171700\t89173500\t0.0141\t78\nchr2\t89176800\t89177100\t0.1911\t62\nchr2\t89196900\t89197200\t0.2979\t48\nchr2\t89216400\t89216700\t0.4357\t75\nchr2\t89231100\t89231400\t0.0664\t55\nchr2\t89232600\t89232900\t0.2976\t47\nchr2\t89235300\t89238600\t0\t71\nchr2\t89242200\t89242500\t0.0338\t57\nchr2\t89249700\t89250600\t0.0238\t72\nchr2\t89252100\t89252400\t0.0238\t72\nchr2\t89254800\t89259300\t0\t65\nchr2\t89262300\t89262600\t0.0741\t60\nchr2\t89265600\t89266500\t0.0699\t59\nchr2\t89267700\t89269200\t0.141\t64\nchr2\t89271900\t89283300\t0\t87\nchr2\t89286300\t89289300\t0\t69\nchr2\t89291100\t89295300\t0\t69\nchr2\t89297400\t89298000\t0.0059\t68\nchr2\t89304000\t89304600\t0.1685\t54\nchr2\t89306100\t89307300\t0\t66\nchr2\t89308500\t89310300\t0\t66\nchr2\t89314200\t89330700\t0\t104\nchr2\t89530500\t89538000\t0\t122\nchr2\t89539500\t89578500\t0\t122\nchr2\t89581200\t89583000\t0\t105\nchr2\t89586600\t89589000\t0\t104\nchr2\t89590800\t89592600\t0\t104\nchr2\t89597400\t89597700\t0.2644\t97\nchr2\t89600400\t89601600\t0.2289\t115\nchr2\t89604600\t89604900\t0.3906\t94\nchr2\t89607600\t89607900\t0.2433\t124\nchr2\t89628300\t89628600\t0.2903\t90\nchr2\t89631600\t89633100\t0.0945\t119\nchr2\t89634300\t89634900\t0.0151\t109\nchr2\t89637600\t89637900\t0.0076\t112\nchr2\t89640000\t89640300\t0.4103\t126\nchr2\t89642100\t89642400\t0.1699\t114\nchr2\t89645700\t89646000\t0.1594\t84\nchr2\t89649000\t89649600\t0.0088\t106\nchr2\t89651100\t89652600\t0.0088\t106\nchr2\t89658900\t89659500\t0.1463\t105\nchr2\t89811900\t89812200\t0.4437\t319\nchr2\t89815800\t89818800\t0.3124\t522\nchr2\t89821500\t89822700\t0.3166\t484\nchr2\t89824500\t89824800\t0.3098\t425\nchr2\t89826000\t89841300\t0.1111\t12789\nchr2\t89852100\t89868600\t0\t98\nchr2\t89872500\t89876100\t0\t68\nchr2\t89877900\t89878500\t0.2681\t73\nchr2\t89881200\t89881500\t0.4001\t64\nchr2\t89884500\t89885100\t0\t80\nchr2\t89887200\t89895900\t0\t78\nchr2\t89897400\t89910600\t0\t80\nchr2\t89913300\t89914800\t0.082\t66\nchr2\t89916000\t89916900\t0.0388\t62\nchr2\t89919600\t89920200\t0.2458\t70\nchr2\t89922300\t89927700\t0\t70\nchr2\t89930100\t89930400\t0.0183\t57\nchr2\t89931900\t89932800\t0.0183\t57\nchr2\t89940000\t89940300\t0.0836\t64\nchr2\t89944200\t89946900\t0\t72\nchr2\t89951100\t89951400\t0.0931\t53\nchr2\t89960400\t89960700\t0.1399\t67\nchr2\t89966100\t89966400\t0.2618\t69\nchr2\t89985600\t89985900\t0.2059\t61\nchr2\t90004800\t90005100\t0.2195\t65\nchr2\t90008400\t90010200\t0.0646\t73\nchr2\t90016800\t90017100\t0.3662\t59\nchr2\t90023100\t90023400\t0.2003\t58\nchr2\t90024600\t90024900\t0.2003\t58\nchr2\t90058500\t90058800\t0.022\t70\nchr2\t90083700\t90084000\t0.2116\t53\nchr2\t90090000\t90090600\t0.0802\t61\nchr2\t90092400\t90093600\t0.1126\t61\nchr2\t90103800\t90104100\t0.0509\t73\nchr2\t90114900\t90116400\t0.0931\t66\nchr2\t90119100\t90120000\t0.1378\t63\nchr2\t90122400\t90122700\t0.2093\t69\nchr2\t90129900\t90130200\t0.2593\t70\nchr2\t90153000\t90153300\t0.1782\t62\nchr2\t90157500\t90157800\t0.2953\t64\nchr2\t90162900\t90163200\t0.2299\t42\nchr2\t90235200\t90235500\t0.2905\t63\nchr2\t90237000\t90237300\t0.0738\t95\nchr2\t90240300\t90240600\t0.2043\t84\nchr2\t90243000\t90243300\t0.1821\t91\nchr2\t90246300\t90247200\t0.0021\t101\nchr2\t90248700\t90249900\t0.1626\t85\nchr2\t90252600\t90252900\t0.1622\t62\nchr2\t90258600\t90260100\t0.0558\t74\nchr2\t90261600\t90264600\t0\t121\nchr2\t90268500\t90269400\t0\t141\nchr2\t90270600\t90280800\t0\t141\nchr2\t90282600\t90283500\t0\t141\nchr2\t90284700\t90287700\t0\t141\nchr2\t90303900\t90308100\t0\t97\nchr2\t90313200\t90313500\t0.003\t127\nchr2\t90315000\t90322800\t0.003\t127\nchr2\t90325200\t90326400\t0.2811\t39\nchr2\t90327600\t90334500\t0\t183\nchr2\t90336600\t90339600\t0.0164\t122\nchr2\t90341700\t90343500\t0.0165\t100\nchr2\t90344700\t90345000\t0.1441\t73\nchr2\t90346200\t90349200\t0\t168\nchr2\t90350400\t90350700\t0\t168\nchr2\t90352200\t90356100\t0\t168\nchr2\t90357900\t90360000\t0.0101\t177\nchr2\t90361200\t90369600\t0.0101\t177\nchr2\t90371400\t90374700\t0.0004\t198\nchr2\t90379500\t90379800\t0.1421\t725\nchr2\t90386400\t90387300\t0.2503\t1008\nchr2\t90399600\t90402600\t0.1585\t1327\nchr2\t91402500\t91407000\t0\t145\nchr2\t91416300\t91420800\t0\t158\nchr2\t91423200\t91423500\t0.2925\t770\nchr2\t91425300\t91425600\t0.346\t114\nchr2\t91428300\t91428900\t0.0117\t225\nchr2\t91431000\t91431600\t0.0117\t225\nchr2\t91433400\t91436400\t0.0447\t238\nchr2\t91438200\t91439400\t0.0447\t238\nchr2\t91440900\t91441500\t0.0447\t238\nchr2\t91445100\t91445700\t0.2521\t167\nchr2\t91447200\t91450500\t0\t166\nchr2\t91452600\t91452900\t0\t150\nchr2\t91454400\t91457100\t0\t150\nchr2\t91458600\t91458900\t0.0148\t131\nchr2\t91460100\t91461600\t0.0148\t131\nchr2\t91464000\t91464900\t0.0481\t158\nchr2\t91466400\t91466700\t0.0481\t158\nchr2\t91469100\t91472100\t0\t147\nchr2\t91474200\t91476000\t0.013\t156\nchr2\t91479600\t91481400\t0.0005\t150\nchr2\t91483200\t91485000\t0.0005\t150\nchr2\t91486200\t91486500\t0.0005\t150\nchr2\t91488900\t91489200\t0.0012\t131\nchr2\t91490400\t91493100\t0.0012\t131\nchr2\t91505100\t91508700\t0\t419\nchr2\t91509900\t91515900\t0\t419\nchr2\t91517100\t91517700\t0\t419\nchr2\t91519200\t91520400\t0.2313\t440\nchr2\t91522200\t91526700\t0.2313\t440\nchr2\t91530000\t91532100\t0.0304\t128\nchr2\t91533300\t91533600\t0.0304\t128\nchr2\t91537200\t91548000\t0\t174\nchr2\t91552200\t91557600\t0\t140\nchr2\t91563000\t91564500\t0.125\t140\nchr2\t91569600\t91570800\t0.0023\t129\nchr2\t91574700\t91575000\t0.0194\t94\nchr2\t91579200\t91579500\t0.2819\t110\nchr2\t91600800\t91601100\t0.1142\t90\nchr2\t91603800\t91604100\t0\t152\nchr2\t91605300\t91630200\t0\t152\nchr2\t91631400\t91634400\t0\t152\nchr2\t91635600\t91653000\t0\t152\nchr2\t91654200\t91657200\t0.0035\t95\nchr2\t91660800\t91663500\t0\t103\nchr2\t91664700\t91669200\t0\t103\nchr2\t91670400\t91671900\t0\t103\nchr2\t91673700\t91675800\t0.073\t80\nchr2\t91678800\t91680600\t0.1018\t81\nchr2\t91681800\t91682400\t0.2611\t85\nchr2\t91683900\t91684200\t0.1556\t98\nchr2\t91685400\t91685700\t0.4074\t57\nchr2\t91692000\t91692900\t0.0016\t86\nchr2\t91695000\t91695600\t0.0386\t70\nchr2\t91699800\t91704600\t0.0113\t124\nchr2\t91705800\t91709700\t0.0113\t124\nchr2\t91710900\t91711200\t0.2293\t101\nchr2\t91712400\t91713000\t0.2293\t101\nchr2\t91714200\t91714500\t0.2776\t67\nchr2\t91716300\t91717800\t0.1311\t127\nchr2\t91719000\t91721100\t0.1311\t127\nchr2\t91722600\t91728600\t0\t164\nchr2\t91733100\t91733400\t0.1128\t51\nchr2\t91795200\t91798500\t0\t110\nchr2\t91799700\t91839300\t0\t119\nchr2\t91921800\t91922100\t0.2417\t93\nchr2\t91924500\t91924800\t0.1011\t92\nchr2\t91926600\t91926900\t0.1011\t92\nchr2\t92013600\t92057700\t0\t144\nchr2\t92059500\t92059800\t0\t144\nchr2\t92082000\t92133000\t0\t108\nchr2\t92134500\t92138100\t0\t44\nchr2\t92188200\t92337600\t0\t654\nchr2\t92339100\t92390100\t0\t451\nchr2\t92391300\t92452200\t0\t451\nchr2\t92453700\t92535900\t0\t399\nchr2\t92537100\t92539800\t0\t515\nchr2\t92541000\t92558700\t0\t515\nchr2\t92559900\t92604000\t0\t515\nchr2\t92605500\t92645700\t0\t515\nchr2\t92646900\t92673900\t0\t515\nchr2\t92675100\t92694900\t0\t515\nchr2\t92696100\t92715600\t0\t515\nchr2\t92716800\t92760300\t0\t515\nchr2\t92762100\t92790300\t0\t453\nchr2\t92791500\t92872800\t0\t453\nchr2\t92874000\t92878200\t0\t453\nchr2\t92879400\t92886900\t0\t453\nchr2\t92888700\t92900100\t0\t223\nchr2\t92901600\t92919000\t0\t259\nchr2\t92920500\t92933100\t0\t259\nchr2\t92934300\t92946300\t0\t259\nchr2\t92947800\t92949300\t0\t273\nchr2\t92950800\t92954700\t0\t273\nchr2\t92955900\t92960700\t0\t418\nchr2\t92962800\t92987400\t0\t394\nchr2\t92988600\t93004500\t0\t394\nchr2\t93007200\t93014400\t0\t394\nchr2\t93015600\t93029100\t0\t394\nchr2\t93030600\t93039300\t0\t394\nchr2\t93040800\t93060900\t0\t294\nchr2\t93062400\t93085800\t0\t274\nchr2\t93087000\t93091500\t0\t231\nchr2\t93093300\t93093900\t0.1346\t38\nchr2\t93095100\t93101100\t0\t233\nchr2\t93103200\t93146100\t0\t233\nchr2\t93147600\t93147900\t0\t59\nchr2\t93149100\t93150600\t0\t59\nchr2\t93152100\t93159900\t0\t258\nchr2\t93161100\t93165600\t0\t274\nchr2\t93166800\t93192300\t0\t274\nchr2\t93193800\t93194700\t0\t245\nchr2\t93195900\t93201000\t0\t245\nchr2\t93202500\t93222300\t0\t245\nchr2\t93223500\t93245100\t0\t245\nchr2\t93246300\t93252300\t0.0034\t146\nchr2\t93253500\t93265200\t0\t355\nchr2\t93267000\t93281700\t0\t355\nchr2\t93282900\t93284400\t0\t355\nchr2\t93286200\t93295500\t0\t181\nchr2\t93298200\t93320100\t0\t181\nchr2\t93321600\t93323700\t0\t181\nchr2\t93324900\t93325500\t0\t181\nchr2\t93327300\t93331200\t0\t149\nchr2\t93333000\t93337500\t0\t226\nchr2\t93339000\t93343200\t0\t226\nchr2\t93345900\t93367500\t0\t359\nchr2\t93368700\t93371100\t0\t359\nchr2\t93373500\t93388800\t0\t359\nchr2\t93390000\t93395400\t0\t359\nchr2\t93396600\t93404700\t0\t152\nchr2\t93405900\t93406200\t0\t194\nchr2\t93408000\t93409200\t0\t194\nchr2\t93410400\t93419700\t0\t194\nchr2\t93420900\t93434400\t0\t194\nchr2\t93435600\t93447000\t0\t194\nchr2\t93448500\t93461100\t0\t160\nchr2\t93462900\t93463200\t0\t58\nchr2\t93465300\t93466800\t0\t58\nchr2\t93468000\t93485400\t0\t207\nchr2\t93486900\t93495900\t0\t207\nchr2\t93497100\t93503700\t0\t207\nchr2\t93504900\t93506700\t0\t207\nchr2\t93508200\t93512700\t0\t207\nchr2\t93515100\t93523800\t0\t276\nchr2\t93525000\t93531900\t0\t276\nchr2\t93533100\t93552900\t0\t276\nchr2\t93555000\t93562800\t0\t276\nchr2\t93564300\t93567300\t0\t276\nchr2\t93568500\t93572400\t0\t214\nchr2\t93575100\t93591300\t0\t251\nchr2\t93592500\t93610800\t0\t277\nchr2\t93612000\t93612900\t0\t277\nchr2\t93614700\t93635100\t0\t277\nchr2\t93636900\t93646200\t0\t277\nchr2\t93648600\t93658200\t0\t277\nchr2\t93659400\t93662700\t0\t277\nchr2\t93663900\t93671700\t0\t277\nchr2\t93672900\t93679800\t0\t112\nchr2\t93681600\t93701100\t0\t209\nchr2\t93704100\t93706500\t0\t209\nchr2\t93707700\t93733800\t0\t209\nchr2\t93735000\t93737400\t0\t209\nchr2\t93738900\t93740700\t0\t257\nchr2\t93741900\t93777300\t0\t257\nchr2\t93778500\t93783300\t0\t257\nchr2\t93784800\t93801000\t0\t257\nchr2\t93802500\t93805200\t0\t101\nchr2\t93806400\t93810000\t0\t69\nchr2\t93811200\t93818100\t0\t115\nchr2\t93819300\t93828300\t0\t115\nchr2\t93830400\t93831600\t0\t309\nchr2\t93832800\t93872700\t0\t309\nchr2\t93875700\t93877800\t0\t277\nchr2\t93879000\t93885900\t0\t277\nchr2\t93887400\t93898500\t0\t277\nchr2\t93900000\t93904500\t0\t277\nchr2\t93905700\t93924900\t0\t277\nchr2\t93926100\t93937500\t0\t277\nchr2\t93938700\t93946500\t0\t243\nchr2\t93947700\t93948000\t0\t243\nchr2\t93950700\t93955500\t0\t243\nchr2\t93957000\t93960300\t0\t243\nchr2\t93961500\t93963300\t0\t243\nchr2\t93964500\t93965100\t0\t243\nchr2\t93968100\t93973200\t0\t118\nchr2\t93975600\t93977700\t0\t175\nchr2\t93979200\t93987300\t0\t175\nchr2\t93988500\t93993300\t0\t175\nchr2\t93994500\t94006800\t0\t175\nchr2\t94008600\t94014300\t0\t175\nchr2\t94015500\t94023300\t0\t215\nchr2\t94024800\t94061700\t0\t215\nchr2\t94063200\t94071600\t0\t182\nchr2\t94073400\t94075800\t0\t182\nchr2\t94077000\t94086300\t0\t182\nchr2\t94087500\t94088100\t0.0257\t69\nchr2\t94089600\t94090500\t0.0257\t69\nchr2\t94140600\t94140900\t0\t360\nchr2\t94144500\t94149900\t0\t360\nchr2\t94152000\t94152300\t0\t360\nchr2\t94153800\t94155600\t0\t360\nchr2\t94158900\t94161300\t0\t200\nchr2\t94162800\t94164000\t0\t200\nchr2\t94165500\t94166400\t0.1627\t194\nchr2\t94171500\t94172400\t0\t77\nchr2\t94173600\t94174500\t0\t77\nchr2\t94257600\t94257900\t0.2207\t125\nchr2\t94260300\t94260600\t0.0562\t112\nchr2\t94279500\t94279800\t0.2011\t139\nchr2\t94285200\t94286400\t0.2463\t185\nchr2\t94287600\t94287900\t0.2463\t185\nchr2\t94496400\t94496700\t0.2471\t99\nchr2\t94581600\t94581900\t0.1051\t62\nchr2\t94641000\t94641300\t0.1219\t43\nchr2\t94718100\t94718400\t0.09\t84\nchr2\t94723500\t94723800\t0.2944\t70\nchr2\t94740000\t94740300\t0.1102\t48\nchr2\t94828200\t94828500\t0.2326\t71\nchr2\t95244000\t95244300\t0.2269\t77\nchr2\t95406000\t95406300\t0.3274\t69\nchr2\t95421000\t95424000\t0\t73\nchr2\t95428200\t95431200\t0\t84\nchr2\t95433300\t95433600\t0.0444\t59\nchr2\t95435100\t95480100\t0\t84\nchr2\t95487600\t95489400\t0\t72\nchr2\t95587800\t95589300\t0\t72\nchr2\t95596500\t95643600\t0\t82\nchr2\t95645700\t95648400\t0\t78\nchr2\t95652600\t95655600\t0\t63\nchr2\t95765400\t95765700\t0.3845\t80\nchr2\t95774400\t95774700\t0\t84\nchr2\t95776500\t95798100\t0\t84\nchr2\t95821500\t95821800\t0.2478\t65\nchr2\t95843400\t95843700\t0.2491\t49\nchr2\t95868600\t95868900\t0.2865\t71\nchr2\t95871900\t95872200\t0.1468\t70\nchr2\t95877300\t95877900\t0.129\t71\nchr2\t95879700\t95880000\t0.3521\t66\nchr2\t95895300\t95895600\t0.1546\t61\nchr2\t95898300\t95901900\t0\t69\nchr2\t95903700\t95907600\t0\t70\nchr2\t95909400\t95909700\t0.247\t56\nchr2\t95940600\t95940900\t0.0184\t144\nchr2\t95946300\t95946600\t0.1212\t102\nchr2\t95960700\t95961000\t0.4137\t82\nchr2\t95963400\t95964000\t0.0919\t63\nchr2\t95982600\t95982900\t0.0804\t54\nchr2\t96010800\t96011100\t0.1217\t82\nchr2\t96026400\t96048000\t0\t80\nchr2\t96049500\t96051600\t0\t80\nchr2\t96055500\t96055800\t0.0112\t75\nchr2\t96057300\t96059400\t0.0112\t75\nchr2\t96444300\t96444900\t0.0214\t107\nchr2\t96462000\t96462600\t0.1698\t101\nchr2\t96776700\t96777000\t0.2438\t315\nchr2\t96805500\t96805800\t0.0836\t50\nchr2\t97049700\t97050000\t0.0101\t73\nchr2\t97051800\t97053900\t0.0537\t67\nchr2\t97071300\t97072800\t0\t77\nchr2\t97075800\t97076400\t0.1823\t56\nchr2\t97090800\t97091400\t0.2835\t42\nchr2\t97094400\t97095000\t0.0475\t67\nchr2\t97114500\t97114800\t0.0838\t51\nchr2\t97118400\t97120500\t0\t68\nchr2\t97122300\t97122600\t0.4888\t54\nchr2\t97125900\t97126200\t0.2497\t61\nchr2\t97141200\t97141800\t0.2203\t47\nchr2\t97156500\t97156800\t0.0651\t92\nchr2\t97162500\t97162800\t0.0328\t152\nchr2\t97166100\t97166700\t0.191\t139\nchr2\t97170900\t97171500\t0.3463\t69\nchr2\t97176300\t97176600\t0.2025\t35\nchr2\t97213200\t97213500\t0.0452\t74\nchr2\t97219500\t97219800\t0.2979\t67\nchr2\t97221000\t97221600\t0.0755\t116\nchr2\t97223400\t97224000\t0.111\t65\nchr2\t97232400\t97232700\t0.2191\t66\nchr2\t97233900\t97266600\t0\t130\nchr2\t97269300\t97292400\t0\t80\nchr2\t97294500\t97347600\t0\t91\nchr2\t97360800\t97397700\t0\t93\nchr2\t97398900\t97413900\t0\t93\nchr2\t97416000\t97420500\t0\t93\nchr2\t97422000\t97439100\t0\t93\nchr2\t97489500\t97524000\t0\t130\nchr2\t97542300\t97544400\t0.0073\t67\nchr2\t97577100\t97577700\t0.1957\t60\nchr2\t97580700\t97581000\t0.0561\t42\nchr2\t97583100\t97584900\t0.026\t74\nchr2\t97588800\t97589100\t0.1438\t53\nchr2\t97603500\t97603800\t0.2539\t57\nchr2\t97605600\t97608000\t0\t81\nchr2\t97611600\t97615800\t0.0072\t79\nchr2\t98061900\t98062200\t0.332\t68\nchr2\t98265600\t98266800\t0.1671\t107\nchr2\t99300600\t99301200\t0.2777\t48\nchr2\t99307500\t99307800\t0.0596\t70\nchr2\t100088400\t100090200\t0\t69\nchr2\t100091400\t100092000\t0.1353\t64\nchr2\t100096800\t100098000\t0.0012\t94\nchr2\t100099800\t100100400\t0.0012\t94\nchr2\t100102500\t100103100\t0.0012\t94\nchr2\t100109100\t100109400\t0.3635\t69\nchr2\t101748900\t101750400\t0.1974\t101\nchr2\t102566400\t102572100\t0\t84\nchr2\t102876000\t102876300\t0.2337\t84\nchr2\t105054600\t105054900\t0.2925\t22\nchr2\t105209700\t105211200\t0\t17\nchr2\t105586500\t105587400\t0.002\t66\nchr2\t106131300\t106136700\t0\t105\nchr2\t106204800\t106205100\t0.2782\t64\nchr2\t106243800\t106244100\t0.2726\t82\nchr2\t106255500\t106255800\t0.3545\t68\nchr2\t106320000\t106320300\t0.3362\t198\nchr2\t106394100\t106396500\t0.332\t60\nchr2\t106401000\t106401300\t0.1418\t65\nchr2\t106406400\t106406700\t0.0189\t73\nchr2\t106407900\t106408500\t0.0189\t73\nchr2\t106411200\t106411500\t0.1688\t51\nchr2\t106416300\t106417500\t0.0017\t57\nchr2\t106419000\t106419300\t0.1194\t61\nchr2\t106423200\t106423800\t0.3314\t74\nchr2\t106425600\t106425900\t0.0215\t61\nchr2\t106427700\t106428600\t0\t54\nchr2\t106430700\t106431300\t0\t62\nchr2\t106432500\t106437300\t0.0017\t62\nchr2\t106438800\t106443000\t0\t77\nchr2\t106444200\t106447800\t0\t77\nchr2\t106452000\t106463100\t0\t75\nchr2\t106466400\t106467600\t0.2666\t82\nchr2\t106469100\t106469400\t0.3\t46\nchr2\t106485300\t106485600\t0.251\t30\nchr2\t106500000\t106500300\t0.2602\t79\nchr2\t107189400\t107189700\t0.2408\t66\nchr2\t107826000\t107829300\t0.0496\t52\nchr2\t107834700\t107844000\t0\t73\nchr2\t107847300\t107857200\t0\t70\nchr2\t107858700\t107869500\t0\t79\nchr2\t107872800\t107873400\t0.0538\t68\nchr2\t107875800\t107876100\t0.2381\t50\nchr2\t107878500\t107879700\t0.0042\t64\nchr2\t107884500\t107884800\t0.2347\t47\nchr2\t107887500\t107888100\t0.1061\t54\nchr2\t107889300\t107890500\t0.1441\t59\nchr2\t107892300\t107892600\t0.1441\t59\nchr2\t107894700\t107895900\t0.055\t48\nchr2\t107899800\t107900100\t0.1293\t61\nchr2\t107901300\t107901600\t0.1293\t61\nchr2\t107907900\t107909100\t0.3326\t45\nchr2\t107911500\t107912700\t0.1469\t65\nchr2\t107922900\t107923200\t0.0894\t53\nchr2\t108651900\t108653400\t0.1149\t71\nchr2\t108655200\t108658200\t0.0085\t70\nchr2\t108660900\t108661200\t0.0774\t60\nchr2\t108666300\t108666600\t0.1547\t64\nchr2\t108672300\t108672900\t0.0078\t63\nchr2\t108745200\t108745500\t0.1717\t64\nchr2\t108762300\t108762600\t0.025\t46\nchr2\t108800700\t108802500\t0\t86\nchr2\t109199100\t109200000\t0.1484\t11428\nchr2\t109307700\t109311300\t0.0061\t82\nchr2\t109739100\t109739400\t0.2027\t64\nchr2\t109740900\t109742400\t0.0543\t60\nchr2\t109744800\t109760100\t0\t87\nchr2\t109762500\t109762800\t0\t87\nchr2\t109764900\t109765200\t0.0761\t21\nchr2\t109767600\t109777200\t0\t105\nchr2\t109779000\t110043000\t0\t105\nchr2\t110044800\t110048100\t0\t105\nchr2\t110049600\t110074200\t0\t104\nchr2\t110075400\t110095200\t0\t104\nchr2\t110228400\t110261700\t0\t74\nchr2\t110262900\t110266200\t0\t74\nchr2\t110267400\t110268000\t0\t74\nchr2\t110269200\t110273100\t0\t75\nchr2\t110275200\t110307000\t0\t91\nchr2\t110308800\t110325900\t0\t88\nchr2\t110327400\t110327700\t0\t88\nchr2\t110329500\t110332500\t0\t88\nchr2\t110334300\t110341800\t0\t85\nchr2\t110343300\t110365800\t0\t88\nchr2\t110368500\t110386500\t0\t93\nchr2\t110388000\t110424300\t0\t80\nchr2\t110425800\t110600700\t0\t102\nchr2\t110602500\t110604300\t0\t102\nchr2\t110606400\t110609400\t0.037\t105\nchr2\t110611800\t110626800\t0\t82\nchr2\t110629200\t110630700\t0.0178\t74\nchr2\t110696100\t110696400\t0.0464\t65\nchr2\t110697900\t110699400\t0\t74\nchr2\t111223800\t111224700\t0.1603\t82\nchr2\t111255300\t111256800\t0.2267\t52\nchr2\t111259800\t111260100\t0.0426\t66\nchr2\t111263400\t111264000\t0.0183\t68\nchr2\t111265800\t111266100\t0.2722\t77\nchr2\t111268500\t111269700\t0.0126\t63\nchr2\t111272400\t111274800\t0.056\t69\nchr2\t111276600\t111276900\t0.3542\t55\nchr2\t111279300\t111288000\t0\t72\nchr2\t111292800\t111293700\t0.1941\t77\nchr2\t111296700\t111297000\t0.0748\t58\nchr2\t111300000\t111300300\t0.0379\t71\nchr2\t111301800\t111302100\t0.0379\t71\nchr2\t111305400\t111305700\t0.146\t58\nchr2\t111308100\t111309000\t0.1326\t64\nchr2\t111314700\t111315000\t0.015\t53\nchr2\t111316800\t111318300\t0.0947\t68\nchr2\t111319800\t111320100\t0.2023\t70\nchr2\t111321900\t111322200\t0\t81\nchr2\t111323700\t111325800\t0\t81\nchr2\t111327600\t111332400\t0\t78\nchr2\t111335100\t111339600\t0\t81\nchr2\t111340800\t111342300\t0.0004\t83\nchr2\t111343500\t111344700\t0.0004\t83\nchr2\t111345900\t111350400\t0.0004\t83\nchr2\t111352500\t111354900\t0.0024\t73\nchr2\t111357900\t111358200\t0.3313\t71\nchr2\t111359700\t111360000\t0.3698\t52\nchr2\t111362400\t111362700\t0.1935\t56\nchr2\t111365700\t111366000\t0.223\t42\nchr2\t111368100\t111369000\t0\t78\nchr2\t111373200\t111373500\t0.3533\t58\nchr2\t111375900\t111378600\t0.0725\t73\nchr2\t111379800\t111380400\t0.0798\t56\nchr2\t111384900\t111386700\t0.0132\t62\nchr2\t111389100\t111391500\t0.0374\t79\nchr2\t111393300\t111394800\t0\t72\nchr2\t111400500\t111402900\t0.0459\t58\nchr2\t111404100\t111405300\t0.0459\t58\nchr2\t111406500\t111408600\t0.0129\t68\nchr2\t111410400\t111410700\t0.3363\t74\nchr2\t111412500\t111412800\t0.2594\t70\nchr2\t111415500\t111415800\t0.2594\t70\nchr2\t111419700\t111420000\t0.3361\t37\nchr2\t111423600\t111424200\t0.0003\t62\nchr2\t111429600\t111429900\t0.1921\t57\nchr2\t111431400\t111433200\t0.0873\t74\nchr2\t111434700\t111439200\t0.0205\t82\nchr2\t111443400\t111449100\t0\t76\nchr2\t111450600\t111451800\t0\t81\nchr2\t111453600\t111454500\t0\t81\nchr2\t111456000\t111456300\t0.1807\t64\nchr2\t111477000\t111477300\t0.05\t74\nchr2\t111489000\t111489300\t0.2588\t62\nchr2\t111492900\t111493200\t0.4485\t64\nchr2\t111499800\t111502500\t0.0859\t64\nchr2\t111515700\t111517200\t0.0886\t58\nchr2\t111527700\t111528000\t0.3823\t69\nchr2\t111531900\t111533700\t0.1083\t70\nchr2\t111540000\t111540900\t0.0013\t61\nchr2\t111542100\t111542700\t0.0013\t61\nchr2\t111545400\t111546300\t0.0854\t47\nchr2\t111549000\t111550200\t0.0093\t74\nchr2\t111551700\t111554100\t0.0093\t74\nchr2\t111558000\t111558600\t0.0309\t61\nchr2\t111562800\t111563400\t0.0109\t60\nchr2\t111569100\t111569400\t0.4389\t43\nchr2\t111571500\t111573000\t0.2883\t51\nchr2\t111576600\t111577200\t0.0327\t46\nchr2\t111578700\t111581100\t0.053\t65\nchr2\t111582600\t111584400\t0\t76\nchr2\t111588000\t111588300\t0.1267\t63\nchr2\t111589800\t111590100\t0\t100\nchr2\t111591300\t111591600\t0\t100\nchr2\t111593100\t111596400\t0\t100\nchr2\t111599400\t111599700\t0.2066\t81\nchr2\t111600900\t111601200\t0.0345\t44\nchr2\t111606900\t111607200\t0.2148\t54\nchr2\t111610800\t111611100\t0.2135\t55\nchr2\t111612300\t111614100\t0.1749\t65\nchr2\t111720900\t111721200\t0.1029\t67\nchr2\t111723900\t111724200\t0.1029\t67\nchr2\t111726300\t111726900\t0.0147\t66\nchr2\t111730200\t111730500\t0.2478\t71\nchr2\t111731700\t111732000\t0.0893\t57\nchr2\t111738000\t111738900\t0.0795\t57\nchr2\t111748200\t111749400\t0.0425\t67\nchr2\t111750900\t111751800\t0.1652\t64\nchr2\t111753900\t111754200\t0.1652\t64\nchr2\t111756000\t111756600\t0.1193\t52\nchr2\t111758100\t111758700\t0.1066\t71\nchr2\t111762600\t111764100\t0.0457\t64\nchr2\t111770100\t111770400\t0.2428\t75\nchr2\t111774300\t111774900\t0.0213\t64\nchr2\t111776700\t111777000\t0.0371\t52\nchr2\t111780000\t111780600\t0.1355\t58\nchr2\t111784500\t111785100\t0.1051\t61\nchr2\t111786600\t111786900\t0.1051\t61\nchr2\t111789300\t111789600\t0.2467\t50\nchr2\t111793500\t111794100\t0.0811\t55\nchr2\t111795300\t111795600\t0.3126\t59\nchr2\t111799500\t111801000\t0.2767\t49\nchr2\t111802500\t111803700\t0.0586\t71\nchr2\t111804900\t111807300\t0.0221\t65\nchr2\t111809100\t111809700\t0.0027\t80\nchr2\t111811200\t111812100\t0.0027\t80\nchr2\t111814200\t111820800\t0.0027\t80\nchr2\t111822300\t111822600\t0.1693\t54\nchr2\t111861600\t111861900\t0.1864\t82\nchr2\t112113600\t112115400\t0.0007\t51\nchr2\t112361400\t112363200\t0.1002\t70\nchr2\t112365900\t112379100\t0\t101\nchr2\t112380900\t112389900\t0\t101\nchr2\t112391700\t112409400\t0\t75\nchr2\t112411500\t112415100\t0\t75\nchr2\t112416600\t112423500\t0\t75\nchr2\t112426500\t112426800\t0.2892\t96\nchr2\t112428300\t112428600\t0.2892\t96\nchr2\t112503900\t112509000\t0\t98\nchr2\t112776600\t112776900\t0.0398\t12\nchr2\t113130600\t113130900\t0.3616\t60\nchr2\t113394000\t113395800\t0.0557\t66\nchr2\t113416500\t113416800\t0.0274\t74\nchr2\t113426700\t113427300\t0.0852\t61\nchr2\t113430600\t113430900\t0.2714\t53\nchr2\t113440800\t113441100\t0.2407\t71\nchr2\t113443800\t113444100\t0.1726\t47\nchr2\t113447400\t113448600\t0.1724\t94\nchr2\t113450700\t113453700\t0.1724\t94\nchr2\t113457300\t113458800\t0.0533\t62\nchr2\t113460000\t113460300\t0.2622\t62\nchr2\t113464200\t113464500\t0.0944\t69\nchr2\t113467200\t113467500\t0.0944\t69\nchr2\t113469600\t113469900\t0.0944\t69\nchr2\t113475000\t113475300\t0.2859\t75\nchr2\t113479200\t113481300\t0.0461\t112\nchr2\t113482500\t113484600\t0.0461\t112\nchr2\t113486100\t113486400\t0.0461\t112\nchr2\t113489700\t113498400\t0.0078\t94\nchr2\t113509500\t113509800\t0.1192\t89\nchr2\t113517300\t113517600\t0.2189\t67\nchr2\t113519400\t113520000\t0.1367\t94\nchr2\t113525400\t113526000\t0.1592\t106\nchr2\t113531700\t113532000\t0.1044\t105\nchr2\t113534700\t113535000\t0.0208\t98\nchr2\t113537400\t113538600\t0.0414\t157\nchr2\t113544000\t113544300\t0.1702\t97\nchr2\t113547000\t113550300\t0\t106\nchr2\t113553000\t113553300\t0.2116\t114\nchr2\t113564100\t113564400\t0.0924\t74\nchr2\t113577300\t113577600\t0.0638\t141\nchr2\t113580600\t113582400\t0.0638\t141\nchr2\t113586600\t113586900\t0.1696\t128\nchr2\t113590500\t113591100\t0.1161\t134\nchr2\t113596500\t113597100\t0.1437\t116\nchr2\t113607300\t113607600\t0.1815\t82\nchr2\t113608800\t113609100\t0.0137\t87\nchr2\t113610300\t113613000\t0.0137\t87\nchr2\t113614800\t113615100\t0.1727\t83\nchr2\t113616300\t113617800\t0.1727\t83\nchr2\t113619300\t113620200\t0.1727\t83\nchr2\t113623800\t113624100\t0.1635\t57\nchr2\t113641800\t113642100\t0.3673\t65\nchr2\t113643900\t113645700\t0.0203\t64\nchr2\t113651100\t113653500\t0.0792\t82\nchr2\t114084300\t114085200\t0.0999\t69\nchr2\t114098100\t114098400\t0.1911\t71\nchr2\t114748500\t114749100\t0.1687\t60\nchr2\t115008000\t115009200\t0.0474\t90\nchr2\t115426200\t115426500\t0.3786\t41\nchr2\t115438800\t115439100\t0.4384\t59\nchr2\t115487100\t115488600\t0.0461\t77\nchr2\t116050200\t116050500\t0.1467\t104\nchr2\t116051700\t116054400\t0.1467\t104\nchr2\t116121900\t116122200\t0.227\t81\nchr2\t116931300\t116931600\t0.1147\t57\nchr2\t117460200\t117461400\t0.0309\t111\nchr2\t117528000\t117528300\t0.2598\t73\nchr2\t117624900\t117625200\t0.23\t91\nchr2\t117627300\t117627600\t0.2345\t69\nchr2\t117649800\t117650400\t0\t29\nchr2\t117653100\t117653400\t0.242\t64\nchr2\t117654600\t117654900\t0.242\t64\nchr2\t117676800\t117677100\t0.3874\t370\nchr2\t117750300\t117751800\t0.1202\t91\nchr2\t117780300\t117780600\t0.3473\t106\nchr2\t117806100\t117807900\t0.206\t71\nchr2\t118137600\t118140000\t0.0483\t93\nchr2\t118141500\t118142700\t0.1289\t143\nchr2\t118302900\t118305000\t0\t65\nchr2\t118486500\t118487400\t0.0128\t91\nchr2\t118867500\t118868100\t0\t99\nchr2\t118896000\t118900800\t0\t93\nchr2\t119001300\t119001600\t0.3305\t91\nchr2\t119843400\t119843700\t0.3669\t59\nchr2\t122014800\t122015400\t0.0395\t76\nchr2\t122017200\t122017800\t0.1687\t95\nchr2\t122050500\t122051700\t0.1184\t85\nchr2\t122265600\t122265900\t0.118\t85\nchr2\t122346600\t122348400\t0.1417\t68\nchr2\t122350500\t122350800\t0.1858\t65\nchr2\t122783100\t122783700\t0.1352\t79\nchr2\t123257100\t123257400\t0.1721\t74\nchr2\t123684600\t123685200\t0.1922\t72\nchr2\t123705000\t123705600\t0.1781\t91\nchr2\t123950400\t123950700\t0.4379\t66\nchr2\t124140300\t124145700\t0\t115\nchr2\t124357500\t124357800\t0.063\t86\nchr2\t124359600\t124361100\t0.063\t86\nchr2\t124409100\t124409700\t0.1424\t69\nchr2\t124411500\t124413900\t0.023\t80\nchr2\t124593300\t124596900\t0.0062\t94\nchr2\t124598100\t124598700\t0.0062\t94\nchr2\t125417400\t125418000\t0.0916\t76\nchr2\t125752500\t125753100\t0.231\t56\nchr2\t126178200\t126183300\t0\t111\nchr2\t127119000\t127120500\t0.0369\t88\nchr2\t127787100\t127789800\t0.0503\t85\nchr2\t128340600\t128341200\t0.1742\t38\nchr2\t128417700\t128418300\t0.1456\t84\nchr2\t128859600\t128864700\t0\t93\nchr2\t128964900\t128965200\t0.1787\t70\nchr2\t129411300\t129417000\t0\t94\nchr2\t129645900\t129646200\t0.3903\t52\nchr2\t129682500\t129687000\t0\t110\nchr2\t130041600\t130043100\t0\t57\nchr2\t130058400\t130058700\t0.3154\t53\nchr2\t130064100\t130064400\t0.1367\t90\nchr2\t130066800\t130067400\t0.0168\t70\nchr2\t130071900\t130072200\t0.3008\t51\nchr2\t130074300\t130074600\t0.1991\t67\nchr2\t130077000\t130100700\t0\t79\nchr2\t130103700\t130104000\t0.0399\t69\nchr2\t130106400\t130106700\t0.0399\t69\nchr2\t130108500\t130108800\t0.2136\t56\nchr2\t130112400\t130112700\t0.1938\t57\nchr2\t130121400\t130121700\t0.0926\t60\nchr2\t130122900\t130124100\t0.199\t63\nchr2\t130223100\t130223400\t0.0253\t61\nchr2\t130238700\t130239000\t0.233\t46\nchr2\t130277100\t130277400\t0.4018\t59\nchr2\t130405200\t130408800\t0\t80\nchr2\t130411200\t130413900\t0.1117\t61\nchr2\t130416000\t130418700\t0.0031\t65\nchr2\t130419900\t130420200\t0.0031\t65\nchr2\t130426800\t130427700\t0.1881\t67\nchr2\t130430100\t130439700\t0\t87\nchr2\t130440900\t130448700\t0\t87\nchr2\t130450800\t130451100\t0.2441\t71\nchr2\t130458900\t130459800\t0\t95\nchr2\t130462800\t130464000\t0\t95\nchr2\t130465500\t130476900\t0\t95\nchr2\t130478100\t130483200\t0\t88\nchr2\t130484400\t130495800\t0\t88\nchr2\t130497000\t130559700\t0\t88\nchr2\t130560900\t130585800\t0\t93\nchr2\t130587000\t130594800\t0\t91\nchr2\t130596000\t130609500\t0\t91\nchr2\t130611300\t130611600\t0\t84\nchr2\t130612800\t130617600\t0\t84\nchr2\t130619400\t130619700\t0\t84\nchr2\t130620900\t130623600\t0\t84\nchr2\t130627500\t130630500\t0.0042\t91\nchr2\t130632300\t130635900\t0.0128\t80\nchr2\t130642200\t130642500\t0\t84\nchr2\t130643700\t130646400\t0\t84\nchr2\t130648800\t130649100\t0\t84\nchr2\t130650600\t130655100\t0\t84\nchr2\t130657500\t130658700\t0\t80\nchr2\t130659900\t130661700\t0\t80\nchr2\t130672200\t130673400\t0\t98\nchr2\t130674900\t130680600\t0\t98\nchr2\t130681800\t130691400\t0\t80\nchr2\t130693800\t130694700\t0.1734\t60\nchr2\t130701300\t130705500\t0.0022\t69\nchr2\t130707300\t130710300\t0.1084\t69\nchr2\t130713300\t130716000\t0\t71\nchr2\t130822200\t130822500\t0.3717\t55\nchr2\t130857300\t130863900\t0\t52\nchr2\t131214900\t131215800\t0.2408\t57\nchr2\t131217000\t131217600\t0.3102\t60\nchr2\t131226300\t131226600\t0.1358\t54\nchr2\t131232000\t131232600\t0.2875\t74\nchr2\t131234400\t131235000\t0.0964\t51\nchr2\t131238300\t131262000\t0\t94\nchr2\t131264400\t131264700\t0.0615\t99\nchr2\t131268000\t131268300\t0.0185\t69\nchr2\t131272500\t131275800\t0\t103\nchr2\t131282700\t131283000\t0.3318\t78\nchr2\t131288700\t131289000\t0.1347\t71\nchr2\t131294400\t131295600\t0.0104\t69\nchr2\t131435400\t131435700\t0.3331\t56\nchr2\t131450700\t131451300\t0.1153\t68\nchr2\t131466300\t131466600\t0.3217\t42\nchr2\t131694600\t131695200\t0.1176\t89\nchr2\t131761800\t131763000\t0.2689\t75\nchr2\t131766300\t131768100\t0\t67\nchr2\t131793900\t131796600\t0\t89\nchr2\t131799300\t131799900\t0.1497\t66\nchr2\t131814300\t131816400\t0.0742\t83\nchr2\t131856900\t131857200\t0.4154\t49\nchr2\t132090600\t132090900\t0.2555\t45\nchr2\t132393900\t132394500\t0.1478\t252\nchr2\t132565800\t132566400\t0.3128\t72\nchr2\t133101000\t133101600\t0.2964\t50\nchr2\t133299900\t133302600\t0.0149\t98\nchr2\t133466100\t133466400\t0.4439\t80\nchr2\t133549500\t133552500\t0.1137\t109\nchr2\t133618800\t133619100\t0.2054\t60\nchr2\t133911600\t133915500\t0.0105\t121\nchr2\t134209200\t134212500\t0\t114\nchr2\t134607000\t134609400\t0.082\t120\nchr2\t134650800\t134655000\t0.0203\t97\nchr2\t134830200\t134831100\t0.132\t106\nchr2\t135033900\t135034200\t0.3027\t51\nchr2\t136818000\t136818300\t0.3338\t79\nchr2\t137396400\t137396700\t0.1175\t62\nchr2\t137397900\t137398200\t0.1863\t83\nchr2\t137484300\t137485200\t0.1178\t63\nchr2\t138246900\t138247200\t0.0298\t45\nchr2\t138251100\t138251700\t0.0823\t60\nchr2\t139027800\t139028100\t0.2512\t48\nchr2\t139372800\t139373100\t0.1955\t127\nchr2\t139535700\t139536000\t0.1673\t52\nchr2\t139878600\t139880400\t0.0723\t70\nchr2\t141963900\t141965700\t0.0134\t120\nchr2\t142608300\t142608600\t0.2461\t88\nchr2\t142677000\t142677300\t0.2995\t25\nchr2\t143007300\t143011800\t0.0501\t111\nchr2\t143638200\t143638500\t0.1878\t45\nchr2\t143662500\t143663100\t0.0579\t79\nchr2\t143665200\t143665800\t0.0634\t82\nchr2\t143861100\t143866800\t0\t137\nchr2\t143921400\t143921700\t0.0971\t40\nchr2\t144899100\t144899700\t0.0436\t79\nchr2\t146408400\t146411100\t0.0565\t88\nchr2\t147155100\t147155400\t0.1288\t98\nchr2\t147727800\t147728100\t0.2247\t60\nchr2\t147729300\t147729600\t0.0592\t81\nchr2\t147732300\t147732900\t0.0592\t81\nchr2\t147744000\t147745800\t0.0749\t66\nchr2\t148149000\t148150200\t0.1017\t98\nchr2\t148153800\t148154100\t0.0902\t52\nchr2\t148189500\t148194600\t0\t88\nchr2\t149854500\t149854800\t0.3077\t74\nchr2\t149946900\t149951100\t0\t111\nchr2\t151579500\t151591200\t0\t90\nchr2\t151592400\t151608900\t0\t95\nchr2\t151699200\t151701000\t0.0003\t117\nchr2\t151703100\t151704600\t0.0003\t117\nchr2\t152357100\t152357400\t0.2259\t30\nchr2\t153007800\t153013200\t0\t115\nchr2\t153222300\t153222600\t0.1363\t541\nchr2\t153253200\t153253500\t0.4349\t53\nchr2\t153398700\t153399300\t0.324\t63\nchr2\t153538500\t153539100\t0.021\t132\nchr2\t153724500\t153724800\t0.1246\t70\nchr2\t153865500\t153866100\t0.0073\t101\nchr2\t154980900\t154981200\t0.2604\t59\nchr2\t154989000\t154990200\t0.0803\t81\nchr2\t155192100\t155192400\t0.3958\t56\nchr2\t155444100\t155446500\t0.0037\t80\nchr2\t155500800\t155501100\t0.0656\t140\nchr2\t155966700\t155967000\t0.2278\t87\nchr2\t155968500\t155969100\t0.2278\t87\nchr2\t156255000\t156255300\t0.1247\t98\nchr2\t156256500\t156256800\t0.1247\t98\nchr2\t156258600\t156260100\t0.1247\t98\nchr2\t156368100\t156368400\t0.1302\t26\nchr2\t156369600\t156369900\t0.0384\t64\nchr2\t156450600\t156451200\t0.2701\t61\nchr2\t156965400\t156965700\t0.331\t63\nchr2\t157370100\t157373400\t0.0162\t112\nchr2\t157378500\t157379700\t0.0191\t68\nchr2\t157520400\t157521000\t0.0215\t73\nchr2\t157547100\t157548600\t0.0742\t62\nchr2\t157566900\t157572300\t0\t102\nchr2\t157576800\t157577100\t0.2448\t38\nchr2\t158355600\t158357100\t0.1978\t74\nchr2\t158523900\t158528100\t0.0005\t81\nchr2\t158780400\t158780700\t0.1536\t47\nchr2\t158851800\t158852400\t0.1111\t62\nchr2\t158872800\t158873400\t0.0473\t71\nchr2\t159292800\t159294900\t0\t91\nchr2\t159663900\t159665700\t0.0064\t109\nchr2\t159991800\t159992700\t0.0939\t69\nchr2\t160120200\t160120800\t0.2937\t54\nchr2\t160713900\t160714200\t0.1602\t45\nchr2\t160758300\t160759500\t0.0017\t91\nchr2\t160768500\t160768800\t0.2997\t63\nchr2\t160770000\t160771500\t0\t75\nchr2\t160800900\t160801200\t0.1221\t93\nchr2\t160851300\t160851600\t0.0833\t27\nchr2\t160852800\t160854000\t0.0099\t82\nchr2\t160855500\t160855800\t0.0099\t82\nchr2\t160999500\t160999800\t0.3091\t63\nchr2\t161540400\t161540700\t0.0459\t67\nchr2\t162572400\t162572700\t0.124\t56\nchr2\t164121000\t164123400\t0.0018\t127\nchr2\t164262300\t164263800\t0.0847\t92\nchr2\t165041100\t165041400\t0.3275\t62\nchr2\t165411000\t165411300\t0.2031\t49\nchr2\t165486300\t165489900\t0.0102\t120\nchr2\t165491100\t165491700\t0.0102\t120\nchr2\t165731700\t165737400\t0.0027\t137\nchr2\t166099500\t166101300\t0.0198\t147\nchr2\t166502700\t166503000\t0.2258\t68\nchr2\t166703100\t166704600\t0.2889\t70\nchr2\t166988400\t166994400\t0\t114\nchr2\t167216100\t167216700\t0.0077\t92\nchr2\t167466600\t167466900\t0.1813\t941\nchr2\t167838000\t167838300\t0.2814\t119\nchr2\t168039300\t168039600\t0.0894\t24\nchr2\t169248900\t169254300\t0\t111\nchr2\t169785000\t169785600\t0\t63\nchr2\t169787100\t169787400\t0\t63\nchr2\t169972800\t169973400\t0.1888\t74\nchr2\t170150400\t170150700\t0.3294\t65\nchr2\t170649300\t170649600\t0.4651\t38\nchr2\t171865800\t171866400\t0.1162\t78\nchr2\t172315500\t172321200\t0\t129\nchr2\t173699400\t173705400\t0.0027\t103\nchr2\t174269700\t174273900\t0.0293\t90\nchr2\t174404700\t174405600\t0.0402\t86\nchr2\t174406800\t174409200\t0.0402\t86\nchr2\t174720300\t174720600\t0.2718\t47\nchr2\t175482000\t175488000\t0\t90\nchr2\t175589700\t175591200\t0.0225\t102\nchr2\t175592700\t175593000\t0.1403\t84\nchr2\t175692300\t175693200\t0.1359\t90\nchr2\t175700700\t175701000\t0.1973\t72\nchr2\t175760100\t175764900\t0\t66\nchr2\t175813200\t175814100\t0.0106\t46\nchr2\t175962900\t175963200\t0.1763\t86\nchr2\t177946200\t177947100\t0.195\t63\nchr2\t177973200\t177978900\t0\t137\nchr2\t178654800\t178662900\t0\t74\nchr2\t178985100\t178985700\t0.3673\t70\nchr2\t179061900\t179062200\t0.1091\t79\nchr2\t179319000\t179319300\t0.3306\t46\nchr2\t179735400\t179735700\t0.1422\t71\nchr2\t180834000\t180838500\t0\t114\nchr2\t182025300\t182030100\t0.0544\t96\nchr2\t182175300\t182175900\t0.043\t82\nchr2\t182214900\t182217600\t0\t114\nchr2\t182430300\t182430900\t0.0327\t82\nchr2\t182747700\t182749500\t0.1617\t68\nchr2\t183385200\t183385500\t0.2563\t48\nchr2\t183590400\t183590700\t0.1833\t65\nchr2\t184947300\t184950900\t0\t131\nchr2\t185419500\t185424600\t0.0157\t91\nchr2\t185766900\t185767200\t0.238\t93\nchr2\t185844000\t185844600\t0.0601\t31\nchr2\t185846400\t185847000\t0.0734\t54\nchr2\t185865600\t185868300\t0.1606\t102\nchr2\t185869800\t185870100\t0.1791\t88\nchr2\t186402600\t186402900\t0.1791\t71\nchr2\t186922800\t186923100\t0.0959\t77\nchr2\t186952800\t186953700\t0.0979\t91\nchr2\t187235100\t187235400\t0.1259\t66\nchr2\t187598100\t187598400\t0.409\t71\nchr2\t188124300\t188129100\t0.0186\t98\nchr2\t188716200\t188716500\t0.2313\t97\nchr2\t188825400\t188827500\t0.0398\t97\nchr2\t189027300\t189030000\t0.0292\t114\nchr2\t189200400\t189200700\t0.1305\t49\nchr2\t191763300\t191764200\t0.0564\t73\nchr2\t191765400\t191765700\t0.0564\t73\nchr2\t192268800\t192272100\t0\t89\nchr2\t192273600\t192273900\t0\t89\nchr2\t192835800\t192836100\t0.2195\t61\nchr2\t193212600\t193218300\t0.0032\t153\nchr2\t193706700\t193707000\t0.049\t56\nchr2\t193821900\t193822200\t0.2901\t62\nchr2\t193914000\t193914300\t0\t16\nchr2\t194447700\t194448000\t0.0585\t57\nchr2\t194859300\t194859600\t0.4679\t75\nchr2\t195063600\t195064200\t0.3366\t64\nchr2\t195068400\t195071400\t0.0493\t83\nchr2\t195376800\t195377100\t0.2297\t70\nchr2\t195528000\t195528300\t0.0873\t99\nchr2\t195567300\t195567900\t0.1823\t87\nchr2\t196524300\t196526400\t0.1644\t96\nchr2\t196905600\t196911600\t0\t103\nchr2\t197067600\t197067900\t0.1037\t111\nchr2\t197635500\t197636700\t0.1055\t91\nchr2\t197638200\t197640000\t0.1055\t91\nchr2\t197687700\t197692500\t0.0054\t97\nchr2\t197730300\t197730600\t0.2008\t65\nchr2\t197732700\t197733300\t0.2353\t77\nchr2\t197922000\t197922600\t0.1655\t62\nchr2\t198582900\t198585900\t0.0562\t111\nchr2\t198934500\t198934800\t0.2172\t78\nchr2\t200682600\t200683200\t0.1174\t57\nchr2\t200822400\t200822700\t0.0142\t58\nchr2\t201282000\t201284400\t0.0566\t70\nchr2\t201484200\t201484500\t0.2515\t84\nchr2\t201592200\t201592500\t0.4153\t48\nchr2\t202606200\t202606800\t0.1264\t68\nchr2\t204583200\t204583500\t0.0772\t55\nchr2\t204767100\t204770400\t0\t96\nchr2\t204992400\t204996300\t0.0248\t76\nchr2\t205044300\t205044600\t0.1335\t120\nchr2\t205207800\t205209300\t0.1285\t94\nchr2\t206071200\t206071500\t0.1866\t130\nchr2\t206355600\t206356200\t0.2363\t93\nchr2\t206374800\t206375400\t0\t25\nchr2\t206400300\t206400900\t0.2003\t26\nchr2\t206910000\t206913000\t0.0161\t114\nchr2\t207004800\t207006000\t0.0248\t94\nchr2\t207273600\t207273900\t0.0685\t51\nchr2\t207609900\t207612000\t0\t99\nchr2\t208094400\t208094700\t0.0373\t31\nchr2\t208196400\t208196700\t0.2053\t35\nchr2\t208587000\t208587300\t0.2983\t43\nchr2\t208803000\t208803300\t0.4033\t31\nchr2\t208814400\t208814700\t0.1851\t86\nchr2\t208817100\t208817400\t0.1851\t86\nchr2\t209129700\t209133600\t0.0007\t82\nchr2\t209164200\t209166900\t0.05\t89\nchr2\t209332500\t209332800\t0.0235\t99\nchr2\t209747700\t209748300\t0.3112\t94\nchr2\t211220400\t211221300\t0.0589\t110\nchr2\t211223400\t211224600\t0.0589\t110\nchr2\t211890000\t211892400\t0.0212\t76\nchr2\t211893600\t211894200\t0.0212\t76\nchr2\t212702100\t212702400\t0.1545\t65\nchr2\t213345300\t213345600\t0.1878\t61\nchr2\t213367800\t213368100\t0.2004\t59\nchr2\t213567300\t213572400\t0\t103\nchr2\t213783600\t213784500\t0.016\t53\nchr2\t214684200\t214684500\t0.0111\t101\nchr2\t214686000\t214689300\t0.0111\t101\nchr2\t214834800\t214836000\t0.2907\t79\nchr2\t216225900\t216227700\t0\t45\nchr2\t216324000\t216324300\t0.1942\t76\nchr2\t216325800\t216326100\t0.1461\t64\nchr2\t217311300\t217311600\t0.1284\t80\nchr2\t219932400\t219937500\t0\t113\nchr2\t221383800\t221384100\t0.1259\t41\nchr2\t221985900\t221988000\t0.0404\t106\nchr2\t221989800\t221990100\t0.0773\t75\nchr2\t222147900\t222148500\t0.0165\t100\nchr2\t222149700\t222155100\t0.0165\t100\nchr2\t222816000\t222817200\t0.1754\t40\nchr2\t222895500\t222897600\t0\t65\nchr2\t222932700\t222933000\t0.1835\t25\nchr2\t225174900\t225175200\t0.2975\t69\nchr2\t225322500\t225322800\t0.1028\t80\nchr2\t225643800\t225644100\t0.3197\t81\nchr2\t225874500\t225875100\t0.2481\t72\nchr2\t226470300\t226470600\t0\t19\nchr2\t226574400\t226575300\t0.0078\t92\nchr2\t227068800\t227069100\t0.2363\t108\nchr2\t227203500\t227203800\t0.2548\t33\nchr2\t228201300\t228201600\t0.2585\t69\nchr2\t228231300\t228231600\t0.1009\t78\nchr2\t228422400\t228422700\t0.2471\t74\nchr2\t228756900\t228760500\t0\t136\nchr2\t228855000\t228855300\t0.1859\t83\nchr2\t229184400\t229184700\t0.169\t34\nchr2\t230338200\t230338800\t0.0889\t90\nchr2\t230340600\t230341200\t0.0889\t90\nchr2\t230400900\t230401200\t0.2839\t68\nchr2\t230460600\t230460900\t0\t31\nchr2\t231005400\t231005700\t0.4855\t135\nchr2\t231579000\t231579300\t0.3682\t13\nchr2\t231823200\t231824700\t0\t89\nchr2\t231828300\t231828900\t0\t66\nchr2\t231838200\t231838500\t0.0178\t62\nchr2\t231842400\t231845400\t0.0148\t124\nchr2\t232149300\t232155000\t0\t94\nchr2\t232177200\t232181100\t0\t113\nchr2\t232360500\t232360800\t0.1151\t131\nchr2\t232995300\t232995600\t0.3673\t32\nchr2\t233561700\t233562300\t0.2367\t88\nchr2\t233567400\t233568000\t0.1087\t20\nchr2\t233578500\t233580300\t0.1051\t66\nchr2\t233723700\t233724000\t0.0921\t71\nchr2\t234562500\t234562800\t0.0889\t25\nchr2\t234645900\t234649500\t0\t44\nchr2\t234888900\t234894300\t0.102\t93\nchr2\t235043400\t235043700\t0.0714\t66\nchr2\t235525800\t235526100\t0.3608\t70\nchr2\t235764900\t235765200\t0.3449\t18\nchr2\t236379300\t236379900\t0.2668\t59\nchr2\t236385300\t236386200\t0.0089\t117\nchr2\t236388600\t236388900\t0.3024\t91\nchr2\t236410800\t236412000\t0.1252\t113\nchr2\t236437200\t236438400\t0.1705\t76\nchr2\t236481900\t236482200\t0.2852\t39\nchr2\t236868300\t236868600\t0.46\t42\nchr2\t237187800\t237188400\t0.1643\t87\nchr2\t237343500\t237343800\t0.2692\t107\nchr2\t238110000\t238110300\t0.4575\t209\nchr2\t238296000\t238296600\t0.0098\t87\nchr2\t238397700\t238398000\t0.4719\t33\nchr2\t238417800\t238418100\t0.2669\t38\nchr2\t238718100\t238718700\t0.0225\t75\nchr2\t238776900\t238777500\t0.4177\t79\nchr2\t238880400\t238881300\t0.0434\t33\nchr2\t239069100\t239069400\t0.1973\t42\nchr2\t239527500\t239527800\t0.0013\t60\nchr2\t239644500\t239645100\t0.0069\t310\nchr2\t239817900\t239818200\t0.4867\t151\nchr2\t240019500\t240019800\t0.316\t15\nchr2\t240045600\t240045900\t0.3586\t46\nchr2\t240354600\t240354900\t0.0168\t18\nchr2\t240547500\t240547800\t0.0457\t120\nchr2\t240626100\t240626400\t0.4806\t168\nchr2\t240641400\t240641700\t0.0572\t24\nchr2\t240675000\t240682200\t0\t82\nchr2\t240684900\t240685200\t0\t82\nchr2\t240689100\t240691200\t0\t87\nchr2\t240693900\t240699600\t0\t80\nchr2\t240780900\t240781200\t0.3831\t21\nchr2\t240842700\t240843000\t0.4028\t18\nchr2\t240907800\t240909000\t0\t54\nchr2\t240923700\t240924000\t0.1092\t14\nchr2\t240977100\t240980700\t0.0352\t72\nchr2\t240984900\t240985200\t0.4793\t15\nchr2\t241206300\t241206600\t0.1216\t31\nchr2\t241355700\t241356000\t0.2945\t47\nchr2\t241561500\t241561800\t0.2368\t50\nchr2\t241570500\t241570800\t0.2685\t61\nchr2\t241760100\t241760400\t0.2034\t79\nchr2\t241767000\t241767300\t0\t15\nchr2\t241805400\t241805700\t0.126\t16\nchr2\t241807500\t241807800\t0.2089\t29\nchr2\t241819500\t241819800\t0.324\t28\nchr2\t242006700\t242010000\t0.0172\t168\nchr2\t242046900\t242047500\t0.0511\t73\nchr2\t242079300\t242079600\t0.1833\t67\nchr2\t242083200\t242085300\t0.2756\t75\nchr2\t242110800\t242111100\t0.2727\t58\nchr2\t242115600\t242115900\t0.1256\t52\nchr2\t242117400\t242117700\t0.2436\t93\nchr2\t242127000\t242127300\t0.3174\t73\nchr2\t242132400\t242135400\t0.0252\t78\nchr2\t242136900\t242139900\t0.0252\t78\nchr2\t242142300\t242142600\t0.0056\t66\nchr2\t242148000\t242157300\t0\t80\nchr2\t242159100\t242169300\t0\t75\nchr2\t242172300\t242172900\t0\t166\nchr2\t242174100\t242183100\t0\t166\nchr20\t60300\t67200\t0.1475\t1203\nchr20\t131100\t132000\t0.0384\t93\nchr20\t133200\t135600\t0\t81\nchr20\t160500\t160800\t0.1176\t66\nchr20\t162000\t162600\t0.1176\t66\nchr20\t1114500\t1115100\t0.1014\t63\nchr20\t1259400\t1260000\t0.2048\t73\nchr20\t1301700\t1302600\t0\t149\nchr20\t1573200\t1575600\t0.0098\t60\nchr20\t1606200\t1609200\t0.0055\t53\nchr20\t1742400\t1744800\t0.0011\t77\nchr20\t2443200\t2443500\t0.2378\t55\nchr20\t2822700\t2825700\t0.0083\t65\nchr20\t2910000\t2910600\t0.3374\t30\nchr20\t3057300\t3057600\t0.3439\t21\nchr20\t3477300\t3477600\t0.2756\t55\nchr20\t3498900\t3499200\t0.1616\t59\nchr20\t4033200\t4035600\t0.0203\t31\nchr20\t4286700\t4287000\t0.2443\t77\nchr20\t4386600\t4389300\t0.0464\t86\nchr20\t5028000\t5028300\t0.2251\t70\nchr20\t5278200\t5278500\t0.2088\t91\nchr20\t5380200\t5380800\t0.1342\t56\nchr20\t5453100\t5453400\t0.4669\t32\nchr20\t6191100\t6192000\t0.015\t47\nchr20\t6316800\t6317700\t0.2344\t72\nchr20\t6321000\t6321300\t0.0535\t98\nchr20\t7116300\t7122000\t0\t81\nchr20\t7124700\t7125300\t0.0302\t47\nchr20\t7299300\t7299600\t0.2919\t52\nchr20\t8112000\t8112600\t0.0432\t76\nchr20\t8595300\t8600400\t0\t105\nchr20\t9015600\t9015900\t0.3939\t30\nchr20\t9189000\t9189300\t0.3496\t41\nchr20\t9858600\t9861300\t0\t75\nchr20\t10807500\t10807800\t0.3624\t71\nchr20\t11632800\t11638800\t0\t75\nchr20\t12123900\t12124200\t0.2179\t80\nchr20\t12125400\t12126000\t0.267\t91\nchr20\t12362100\t12362400\t0.2709\t73\nchr20\t12635400\t12635700\t0.1229\t62\nchr20\t12664200\t12664500\t0.3264\t70\nchr20\t12755100\t12755400\t0.143\t21\nchr20\t12756900\t12757200\t0.2769\t27\nchr20\t12801300\t12807000\t0\t74\nchr20\t14273400\t14273700\t0.3044\t63\nchr20\t15135600\t15135900\t0.2358\t54\nchr20\t16226700\t16228200\t0.0111\t47\nchr20\t16260000\t16260300\t0.228\t61\nchr20\t16549800\t16550100\t0.1687\t63\nchr20\t16994100\t16994400\t0.1203\t78\nchr20\t17122800\t17123100\t0.0173\t20\nchr20\t18602100\t18605700\t0\t86\nchr20\t18950100\t18954300\t0.0032\t87\nchr20\t19088100\t19089300\t0.0176\t72\nchr20\t19118700\t19119000\t0.189\t38\nchr20\t19419900\t19421400\t0.0159\t68\nchr20\t19755300\t19755600\t0.0534\t47\nchr20\t20357100\t20357700\t0.362\t58\nchr20\t21254100\t21254400\t0.3222\t55\nchr20\t21747300\t21747600\t0.0899\t87\nchr20\t21889200\t21889500\t0.1903\t72\nchr20\t21891600\t21893400\t0.0414\t91\nchr20\t21911100\t21911700\t0.0503\t98\nchr20\t21915000\t21915300\t0.27\t73\nchr20\t21932400\t21932700\t0.2969\t62\nchr20\t23262900\t23263200\t0.0284\t44\nchr20\t23426100\t23432100\t0\t107\nchr20\t23589900\t23595000\t0\t106\nchr20\t25332900\t25333200\t0\t79\nchr20\t25335300\t25335600\t0\t79\nchr20\t25562100\t25562400\t0.2475\t63\nchr20\t25716600\t25716900\t0.3748\t41\nchr20\t25754400\t25754700\t0.26\t59\nchr20\t25765500\t25771800\t0\t139\nchr20\t25778400\t25778700\t0.1196\t52\nchr20\t25779900\t25845000\t0\t104\nchr20\t25846500\t25846800\t0.0763\t77\nchr20\t26010900\t26076300\t0\t101\nchr20\t26084700\t26091000\t0\t131\nchr20\t26246700\t26247000\t0.1387\t67\nchr20\t26310300\t26310900\t0\t70\nchr20\t26313900\t26314500\t0.0244\t77\nchr20\t26366700\t26367000\t0.0993\t41\nchr20\t26384700\t26386200\t0.4312\t27\nchr20\t26436300\t26476200\t0\t929\nchr20\t26477400\t26481000\t0\t537\nchr20\t26482200\t26513700\t0\t623\nchr20\t26516100\t26544000\t0\t982\nchr20\t26545800\t26556300\t0\t317\nchr20\t26557500\t26577000\t0\t449\nchr20\t26578800\t26584500\t0\t449\nchr20\t26585700\t26589600\t0\t449\nchr20\t26599500\t26611200\t0\t817\nchr20\t26612700\t27964200\t0\t930\nchr20\t27965400\t28044300\t0\t442\nchr20\t28045800\t28196100\t0\t2005\nchr20\t28197300\t28497000\t0\t2005\nchr20\t28498200\t28498500\t0\t2005\nchr20\t28504800\t28505100\t0\t481\nchr20\t28506900\t28557000\t0\t481\nchr20\t28596000\t28596300\t0.2275\t98\nchr20\t28604700\t28605300\t0.062\t75\nchr20\t28625700\t28626600\t0.3326\t64\nchr20\t28635900\t28636500\t0.0164\t99\nchr20\t28643700\t28646100\t0\t311\nchr20\t28648500\t28694700\t0\t95\nchr20\t28696200\t28717800\t0\t100\nchr20\t28719600\t28728900\t0\t100\nchr20\t28777200\t28778700\t0.1606\t84\nchr20\t28842600\t28843500\t0\t224\nchr20\t28861500\t28861800\t0.4962\t162\nchr20\t28889100\t28889400\t0.4142\t394\nchr20\t28897200\t28899000\t0.1563\t1809\nchr20\t28940100\t28940400\t0.0386\t44\nchr20\t28960500\t29013900\t0\t63\nchr20\t29071200\t29071800\t0.04\t158\nchr20\t29080800\t29081100\t0.0396\t202\nchr20\t29082600\t29083200\t0.2565\t224\nchr20\t29128800\t29131500\t0\t29\nchr20\t29133600\t29134500\t0\t31\nchr20\t29136000\t29138100\t0\t43\nchr20\t29139300\t29139900\t0.0744\t49\nchr20\t29143500\t29143800\t0\t32\nchr20\t29145000\t29145600\t0\t44\nchr20\t29147100\t29150400\t0.0473\t43\nchr20\t29153100\t29155500\t0\t31\nchr20\t29157600\t29158800\t0\t33\nchr20\t29161200\t29161500\t0.2563\t18\nchr20\t29163300\t29167800\t0\t57\nchr20\t29170200\t29171400\t0.0748\t69\nchr20\t29173800\t29174100\t0.1824\t15\nchr20\t29175300\t29179200\t0\t42\nchr20\t29181300\t29181600\t0.4431\t27\nchr20\t29183700\t29185200\t0\t40\nchr20\t29189100\t29190300\t0\t41\nchr20\t29192400\t29193000\t0.2395\t26\nchr20\t29194200\t29196900\t0\t29\nchr20\t29198100\t29202600\t0\t79\nchr20\t29207400\t29207700\t0.4687\t161\nchr20\t29261700\t29262000\t0.2134\t202\nchr20\t29451600\t29451900\t0.2251\t36\nchr20\t29483400\t29484300\t0.1427\t124\nchr20\t29494200\t29494800\t0.1119\t168\nchr20\t29496600\t29496900\t0.3857\t306\nchr20\t29505900\t29506200\t0.0315\t126\nchr20\t29584800\t29586000\t0.011\t50\nchr20\t29704500\t29704800\t0.4856\t36\nchr20\t29884800\t29885400\t0.0318\t165\nchr20\t29904900\t29905200\t0.4586\t155\nchr20\t29910000\t29910600\t0\t24\nchr20\t29913900\t29914500\t0\t103\nchr20\t29915700\t29920800\t0\t103\nchr20\t29922300\t29923800\t0\t121\nchr20\t29925000\t29934300\t0\t121\nchr20\t29937000\t29941200\t0\t94\nchr20\t29944800\t29945100\t0.4065\t20\nchr20\t29947200\t29948100\t0\t88\nchr20\t29949900\t29950200\t0.0252\t32\nchr20\t29951400\t29952000\t0.0626\t68\nchr20\t29953500\t29954400\t0\t85\nchr20\t29957400\t29958000\t0\t61\nchr20\t29960100\t29960700\t0\t50\nchr20\t29962500\t29964900\t0\t75\nchr20\t29966700\t29969100\t0\t41\nchr20\t29971200\t29972100\t0\t37\nchr20\t29973600\t29974200\t0.1296\t36\nchr20\t29976300\t29976900\t0.0316\t28\nchr20\t29979900\t29983500\t0\t117\nchr20\t29985300\t29986500\t0\t75\nchr20\t29987700\t29990400\t0\t75\nchr20\t29991600\t30001500\t0\t75\nchr20\t30003900\t30006900\t0\t75\nchr20\t30008100\t30016200\t0\t75\nchr20\t30018900\t30019500\t0.4315\t36\nchr20\t30021000\t30024000\t0\t42\nchr20\t30025500\t30026400\t0\t33\nchr20\t30027900\t30029400\t0\t61\nchr20\t30030900\t30033000\t0\t61\nchr20\t30034500\t30035100\t0.0864\t27\nchr20\t30037200\t30037500\t0.0304\t29\nchr20\t30088500\t30098400\t0\t73\nchr20\t30102000\t30125100\t0\t111\nchr20\t30127200\t30127800\t0.0044\t50\nchr20\t30129300\t30129900\t0\t15\nchr20\t30131100\t30136800\t0\t68\nchr20\t30157800\t30158100\t0.4586\t87\nchr20\t30238200\t30238800\t0.0117\t60\nchr20\t30271200\t30272400\t0.0126\t55\nchr20\t30395100\t30395400\t0.2229\t105\nchr20\t30414900\t30415200\t0.3633\t80\nchr20\t30841200\t30841500\t0.189\t104\nchr20\t30975300\t30975600\t0.2725\t62\nchr20\t30986100\t30986400\t0.4498\t65\nchr20\t31051500\t31060200\t0.0691\t8016\nchr20\t31062000\t31067400\t0.1896\t7989\nchr20\t31069200\t31107000\t0\t5573\nchr20\t31156800\t31159200\t0.1848\t4493\nchr20\t31163100\t31170000\t0.1794\t2365\nchr20\t31171200\t31172100\t0.2266\t456\nchr20\t31173900\t31175100\t0.2655\t327\nchr20\t31176300\t31176900\t0.2172\t431\nchr20\t31178100\t31178700\t0.3551\t192\nchr20\t31183200\t31189500\t0.1673\t5715\nchr20\t31191000\t31191300\t0.4594\t169\nchr20\t31192500\t31193100\t0.3316\t255\nchr20\t31194300\t31226400\t0\t1534\nchr20\t31227600\t31230900\t0.1276\t771\nchr20\t31233000\t31235400\t0.2136\t401\nchr20\t31236900\t31238100\t0.2671\t373\nchr20\t31239300\t31245300\t0.1216\t23471\nchr20\t32175300\t32177400\t0.0556\t122\nchr20\t32723400\t32724900\t0\t70\nchr20\t33456000\t33456300\t0.0085\t24\nchr20\t33699600\t33699900\t0.2503\t18\nchr20\t34223700\t34225200\t0.0376\t76\nchr20\t34227900\t34231200\t0\t110\nchr20\t35153700\t35154900\t0.2117\t80\nchr20\t35262600\t35262900\t0.2396\t87\nchr20\t36690600\t36690900\t0.3049\t54\nchr20\t36981000\t36981300\t0.0163\t47\nchr20\t38333700\t38334000\t0.3198\t48\nchr20\t38460900\t38461200\t0.1819\t77\nchr20\t39368700\t39372000\t0.012\t82\nchr20\t39740400\t39741300\t0.0434\t63\nchr20\t39804900\t39805500\t0.3416\t86\nchr20\t39978600\t39978900\t0.0459\t49\nchr20\t40623900\t40625100\t0.0045\t50\nchr20\t41971200\t41971800\t0.0099\t83\nchr20\t42207300\t42208200\t0.1111\t63\nchr20\t42615600\t42615900\t0.2763\t59\nchr20\t42618600\t42619500\t0.187\t91\nchr20\t43175700\t43176300\t0.0797\t52\nchr20\t43396200\t43397100\t0\t40\nchr20\t43815000\t43818900\t0.0476\t93\nchr20\t47525100\t47525400\t0.2034\t111\nchr20\t47827200\t47827500\t0.331\t73\nchr20\t47829300\t47833200\t0\t68\nchr20\t47834700\t47835300\t0\t67\nchr20\t47893200\t47894700\t0.0127\t60\nchr20\t47898300\t47902500\t0\t74\nchr20\t47903700\t47904000\t0.2421\t47\nchr20\t48494700\t48495000\t0.0547\t84\nchr20\t48504300\t48504600\t0.4066\t126\nchr20\t48507600\t48509100\t0.0857\t203\nchr20\t48510600\t48514500\t0.0857\t203\nchr20\t48870900\t48871800\t0.0116\t26\nchr20\t50209500\t50209800\t0.3926\t361\nchr20\t51455700\t51456000\t0.3754\t52\nchr20\t53163300\t53163600\t0.255\t123\nchr20\t53456700\t53457600\t0.0368\t83\nchr20\t53459400\t53459700\t0.0368\t83\nchr20\t53474400\t53475600\t0.0044\t81\nchr20\t53476800\t53477700\t0.0044\t81\nchr20\t53504400\t53504700\t0.2021\t86\nchr20\t53505900\t53508000\t0.2021\t86\nchr20\t53509200\t53509500\t0.2021\t86\nchr20\t54072900\t54073200\t0.4078\t73\nchr20\t54249900\t54250500\t0\t64\nchr20\t54811200\t54812700\t0.2455\t71\nchr20\t54819000\t54819300\t0.1127\t234\nchr20\t55076100\t55076400\t0.1948\t73\nchr20\t55497600\t55497900\t0.4083\t26\nchr20\t55859700\t55865400\t0\t74\nchr20\t55888200\t55888500\t0.0614\t38\nchr20\t55945200\t55945500\t0.0357\t19\nchr20\t56082300\t56082600\t0.1091\t70\nchr20\t56109000\t56109600\t0.0599\t94\nchr20\t56281500\t56281800\t0.4787\t38\nchr20\t59133000\t59133300\t0.2007\t84\nchr20\t59533800\t59534700\t0.1865\t109\nchr20\t60409200\t60410400\t0\t138\nchr20\t60615900\t60618600\t0.1357\t62\nchr20\t61242900\t61243200\t0.376\t59\nchr20\t61283100\t61283400\t0.2659\t30\nchr20\t61289700\t61290300\t0.143\t87\nchr20\t61350300\t61350600\t0.3743\t41\nchr20\t61653000\t61653600\t0.123\t32\nchr20\t61675500\t61675800\t0.2688\t50\nchr20\t61689300\t61689600\t0.3108\t62\nchr20\t61783800\t61784400\t0.1949\t47\nchr20\t61943100\t61944600\t0\t45\nchr20\t61945800\t61946400\t0.228\t24\nchr20\t61978200\t61978500\t0.3357\t50\nchr20\t61995600\t61995900\t0.3613\t33\nchr20\t62057700\t62058900\t0.071\t77\nchr20\t62082900\t62083200\t0.3606\t43\nchr20\t62270700\t62271000\t0.2404\t44\nchr20\t62961000\t62961300\t0.2756\t44\nchr20\t62989800\t62990100\t0.1371\t62\nchr20\t63029100\t63029400\t0.3811\t76\nchr20\t63068400\t63068700\t0.3669\t136\nchr20\t63156900\t63157200\t0.1406\t38\nchr20\t63266700\t63267000\t0.4288\t39\nchr20\t63442800\t63443400\t0.4666\t203\nchr20\t63607500\t63609900\t0.1235\t189\nchr20\t63669600\t63670500\t0\t62\nchr20\t63677700\t63678000\t0.3652\t71\nchr20\t63693300\t63693900\t0.394\t365\nchr20\t63824700\t63825000\t0.3108\t17\nchr20\t63919500\t63920100\t0.3251\t42\nchr20\t63942000\t63942300\t0.371\t20\nchr20\t63965100\t63965400\t0.0594\t48\nchr20\t64011900\t64012800\t0.0031\t84\nchr20\t64087200\t64087500\t0.0152\t62\nchr20\t64090800\t64091100\t0.3819\t17\nchr20\t64118400\t64118700\t0.4217\t22\nchr20\t64132200\t64133700\t0.2071\t47\nchr20\t64135200\t64135500\t0.3438\t60\nchr20\t64173600\t64176300\t0.0083\t99\nchr20\t64270800\t64271400\t0.014\t49\nchr20\t64289400\t64302300\t0\t89\nchr20\t64304100\t64308600\t0.0204\t87\nchr20\t64310700\t64312500\t0.0542\t88\nchr20\t64317000\t64317300\t0.3709\t83\nchr20\t64321800\t64322100\t0.2459\t64\nchr20\t64326600\t64326900\t0.0698\t44\nchr21\t5010000\t5033100\t0\t47\nchr21\t5034600\t5037900\t0\t45\nchr21\t5039400\t5051100\t0\t39\nchr21\t5052600\t5062500\t0\t44\nchr21\t5067300\t5067600\t0.0802\t37\nchr21\t5069100\t5070600\t0.0852\t38\nchr21\t5072100\t5085600\t0\t43\nchr21\t5087100\t5089800\t0\t44\nchr21\t5091000\t5095800\t0\t44\nchr21\t5099400\t5102700\t0\t35\nchr21\t5104800\t5110500\t0\t46\nchr21\t5113200\t5113500\t0.0296\t25\nchr21\t5116500\t5117100\t0.0131\t35\nchr21\t5118600\t5119200\t0\t48\nchr21\t5120400\t5136300\t0\t48\nchr21\t5137500\t5142300\t0\t46\nchr21\t5143500\t5144700\t0\t48\nchr21\t5145900\t5148600\t0\t48\nchr21\t5150400\t5154000\t0\t48\nchr21\t5155200\t5166300\t0\t48\nchr21\t5255700\t5260800\t0\t129\nchr21\t5262000\t5264100\t0\t129\nchr21\t5265300\t5270100\t0\t91\nchr21\t5272200\t5280600\t0\t118\nchr21\t5282100\t5286900\t0\t118\nchr21\t5288100\t5289000\t0\t118\nchr21\t5298600\t5301000\t0.0043\t143\nchr21\t5303100\t5307600\t0.0043\t143\nchr21\t5310000\t5311200\t0.0043\t143\nchr21\t5313600\t5314500\t0.0018\t308\nchr21\t5317800\t5318100\t0.0911\t197\nchr21\t5319900\t5322300\t0.0422\t185\nchr21\t5323500\t5325900\t0.0065\t251\nchr21\t5327100\t5330700\t0.0253\t690\nchr21\t5332200\t5334300\t0\t118\nchr21\t5335800\t5340900\t0\t118\nchr21\t5342400\t5343000\t0.0844\t80\nchr21\t5345100\t5349300\t0\t100\nchr21\t5351400\t5354400\t0.0095\t101\nchr21\t5356800\t5357400\t0.0025\t312\nchr21\t5360400\t5363400\t0\t198\nchr21\t5364600\t5371200\t0\t198\nchr21\t5375100\t5375700\t0.0132\t233\nchr21\t5377500\t5390400\t0.0132\t233\nchr21\t5392800\t5393400\t0.1974\t128\nchr21\t5443500\t5448900\t0\t72\nchr21\t5499000\t5506800\t0\t51\nchr21\t5508000\t5627700\t0\t79\nchr21\t5677500\t5796000\t0\t93\nchr21\t5846100\t5916600\t0\t84\nchr21\t5966700\t5985300\t0\t42\nchr21\t5988000\t6093300\t0\t53\nchr21\t6094500\t6097500\t0\t45\nchr21\t6099600\t6161400\t0\t47\nchr21\t6211500\t6312600\t0\t86\nchr21\t6314100\t6374100\t0\t216\nchr21\t6431100\t6431400\t0.1337\t26\nchr21\t6434700\t6435000\t0.2077\t42\nchr21\t6439500\t6478800\t0\t49\nchr21\t6480600\t6486300\t0\t60\nchr21\t6487500\t6560700\t0\t60\nchr21\t6561900\t6580200\t0\t152\nchr21\t6630300\t6675000\t0\t122\nchr21\t6676500\t6738900\t0\t122\nchr21\t6789600\t6915600\t0\t49\nchr21\t6917400\t6928200\t0\t53\nchr21\t6930000\t6932400\t0\t53\nchr21\t6933600\t6934200\t0\t24\nchr21\t6984300\t7149600\t0\t89\nchr21\t7199700\t7228500\t0\t185\nchr21\t7229700\t7232100\t0.1106\t138\nchr21\t7237200\t7238400\t0.1149\t243\nchr21\t7242300\t7242600\t0.1695\t102\nchr21\t7243800\t7244400\t0.0614\t152\nchr21\t7248000\t7248300\t0.3942\t150\nchr21\t7250700\t7254900\t0.0039\t216\nchr21\t7257300\t7262400\t0.029\t2269\nchr21\t7263900\t7266000\t0.0542\t85\nchr21\t7268700\t7271400\t0\t157\nchr21\t7274400\t7274700\t0\t157\nchr21\t7275900\t7279800\t0.0015\t109\nchr21\t7285800\t7286100\t0.113\t98\nchr21\t7287900\t7289100\t0.0003\t315\nchr21\t7292400\t7292700\t0.2102\t120\nchr21\t7294200\t7297200\t0.0202\t164\nchr21\t7299000\t7303200\t0.0043\t124\nchr21\t7305600\t7305900\t0.1168\t119\nchr21\t7308600\t7312500\t0.0389\t192\nchr21\t7313700\t7316700\t0.0077\t151\nchr21\t7318800\t7320900\t0.0077\t151\nchr21\t7323600\t7323900\t0.2135\t82\nchr21\t7377900\t7383900\t0\t44\nchr21\t7385100\t7500900\t0\t79\nchr21\t7551000\t7693800\t0\t91\nchr21\t7743900\t7818600\t0\t51\nchr21\t7820700\t7865700\t0\t47\nchr21\t7926000\t7927500\t0.2991\t1485\nchr21\t7938000\t7938600\t0.2479\t2314\nchr21\t7942200\t7942500\t0.3584\t578\nchr21\t7944300\t7944600\t0.2277\t1733\nchr21\t7950000\t7950300\t0.4122\t495\nchr21\t7956000\t7957800\t0.3721\t1085\nchr21\t7970700\t7975500\t0.0106\t351\nchr21\t7977900\t8012700\t0\t284\nchr21\t8013900\t8014800\t0.0027\t144\nchr21\t8016300\t8019900\t0.0289\t227\nchr21\t8024700\t8035500\t0\t385\nchr21\t8039100\t8039400\t0.3517\t155\nchr21\t8042700\t8044800\t0\t210\nchr21\t8046000\t8047200\t0\t123\nchr21\t8100000\t8261100\t0\t5868\nchr21\t8310900\t8472600\t0\t5641\nchr21\t8523000\t8526600\t0.0223\t49\nchr21\t8529600\t8529900\t0.2226\t55\nchr21\t8532900\t8538600\t0\t77\nchr21\t8539800\t8544600\t0\t77\nchr21\t8546100\t8548800\t0\t77\nchr21\t8550300\t8553600\t0\t60\nchr21\t8555100\t8581800\t0\t98\nchr21\t8583000\t8583600\t0\t98\nchr21\t8585100\t8587500\t0\t86\nchr21\t8589300\t8590200\t0\t86\nchr21\t8591700\t8594400\t0\t86\nchr21\t8596500\t8613900\t0\t60\nchr21\t8616600\t8617800\t0.0238\t38\nchr21\t8619300\t8620800\t0\t62\nchr21\t8622600\t8624400\t0\t46\nchr21\t8625900\t8626200\t0\t90\nchr21\t8628000\t8630400\t0\t90\nchr21\t8631600\t8635200\t0.0052\t43\nchr21\t8637000\t8638200\t0\t40\nchr21\t8639400\t8648100\t0\t53\nchr21\t8650200\t8650800\t0\t53\nchr21\t8652900\t8653200\t0.1866\t42\nchr21\t8656800\t8659800\t0\t50\nchr21\t8661000\t8661900\t0\t50\nchr21\t8663700\t8664000\t0.1989\t28\nchr21\t8665500\t8666700\t0\t69\nchr21\t8668200\t8669100\t0\t69\nchr21\t8670300\t8684100\t0\t69\nchr21\t8691000\t8691300\t0.0117\t70\nchr21\t8700900\t8701200\t0.3311\t78\nchr21\t8705100\t8705400\t0.255\t79\nchr21\t8790000\t8832900\t0\t298\nchr21\t8837100\t8837400\t0.2277\t146\nchr21\t8840100\t8840700\t0.164\t154\nchr21\t8842500\t8842800\t0.164\t154\nchr21\t8844900\t8885700\t0\t117\nchr21\t8986500\t8988600\t0\t2094\nchr21\t9016200\t9016800\t0.0116\t166\nchr21\t9030900\t9031200\t0.1509\t84\nchr21\t9039000\t9039300\t0.1046\t34\nchr21\t9042300\t9067500\t0\t116\nchr21\t9069000\t9070800\t0\t116\nchr21\t9073500\t9073800\t0\t35\nchr21\t9075600\t9078000\t0.0238\t45\nchr21\t9079500\t9083400\t0\t75\nchr21\t9085200\t9085500\t0.4513\t17\nchr21\t9089400\t9089700\t0\t116\nchr21\t9091200\t9103200\t0\t116\nchr21\t9106800\t9116400\t0\t126\nchr21\t9117900\t9118800\t0.0518\t110\nchr21\t9120300\t9130200\t0\t158\nchr21\t9131400\t9132300\t0\t132\nchr21\t9133500\t9157500\t0\t132\nchr21\t9159300\t9174000\t0\t145\nchr21\t9175200\t9195900\t0\t145\nchr21\t9246000\t9246300\t0.3617\t733\nchr21\t9248400\t9291900\t0\t583\nchr21\t9293400\t9301800\t0\t583\nchr21\t9303000\t9360900\t0\t583\nchr21\t9363000\t9365100\t0\t216\nchr21\t9366300\t9377100\t0\t188\nchr21\t9527100\t9538200\t0\t98\nchr21\t9540000\t9562500\t0\t133\nchr21\t9564300\t9564900\t0\t109\nchr21\t9566400\t9570300\t0.0539\t166\nchr21\t9573300\t9576600\t0.0001\t145\nchr21\t9578400\t9587400\t0.0001\t145\nchr21\t9589200\t9592500\t0\t128\nchr21\t9594000\t9594600\t0\t128\nchr21\t9596100\t9596400\t0\t128\nchr21\t9597900\t9598800\t0\t128\nchr21\t9600600\t9607200\t0\t128\nchr21\t9608400\t9610500\t0.046\t104\nchr21\t9612300\t9613800\t0.012\t97\nchr21\t9615300\t9615600\t0.0511\t68\nchr21\t9617100\t9619500\t0.0413\t111\nchr21\t9620700\t9622800\t0.0186\t104\nchr21\t9624300\t9626100\t0.0186\t104\nchr21\t9627600\t9629400\t0.0027\t86\nchr21\t9633000\t9633600\t0.0535\t76\nchr21\t9635100\t9636600\t0.0044\t90\nchr21\t9637800\t9639300\t0.1049\t91\nchr21\t9640500\t9643200\t0\t100\nchr21\t9645000\t9646800\t0\t100\nchr21\t9659100\t9666300\t0\t121\nchr21\t9668100\t9668400\t0\t121\nchr21\t9670200\t9673200\t0\t121\nchr21\t9674700\t9675300\t0\t121\nchr21\t9677100\t9699300\t0\t121\nchr21\t9700500\t9703500\t0\t121\nchr21\t9705300\t9706800\t0\t121\nchr21\t9708600\t9710700\t0\t109\nchr21\t9712200\t9718500\t0\t109\nchr21\t9734700\t9735000\t0.1943\t105\nchr21\t9798000\t9799200\t0\t103\nchr21\t9800400\t9804900\t0\t103\nchr21\t9806400\t9807000\t0.0041\t94\nchr21\t9808800\t9811800\t0.0685\t303\nchr21\t9813000\t9813300\t0.0889\t594\nchr21\t9815700\t9816900\t0.0889\t594\nchr21\t9818400\t9819600\t0.0889\t594\nchr21\t9820800\t9821100\t0.4338\t537\nchr21\t9824400\t9836100\t0\t635\nchr21\t9906600\t9906900\t0.2537\t146\nchr21\t10031100\t10032600\t0\t105\nchr21\t10034700\t10038600\t0.0111\t90\nchr21\t10040100\t10041600\t0.0111\t90\nchr21\t10043700\t10044300\t0.0042\t90\nchr21\t10045800\t10046400\t0.0042\t90\nchr21\t10048800\t10053600\t0\t113\nchr21\t10054800\t10055400\t0\t107\nchr21\t10056900\t10063200\t0\t107\nchr21\t10065300\t10067400\t0\t107\nchr21\t10068600\t10074000\t0\t107\nchr21\t10075200\t10075800\t0\t107\nchr21\t10078800\t10079100\t0.3103\t106\nchr21\t10080600\t10080900\t0\t103\nchr21\t10082100\t10083600\t0\t103\nchr21\t10085100\t10086000\t0\t103\nchr21\t10088400\t10090200\t0.0325\t98\nchr21\t10092000\t10092600\t0.0043\t101\nchr21\t10095300\t10096200\t0\t118\nchr21\t10100400\t10101000\t0.2051\t97\nchr21\t10102500\t10104600\t0.0013\t136\nchr21\t10108200\t10111500\t0.0102\t107\nchr21\t10113300\t10114500\t0.0021\t66\nchr21\t10116300\t10116600\t0.0016\t93\nchr21\t10118100\t10118400\t0.0016\t93\nchr21\t10124400\t10140300\t0\t162\nchr21\t10141500\t10141800\t0\t162\nchr21\t10143300\t10169100\t0\t162\nchr21\t10269600\t10271700\t0.1199\t4615\nchr21\t10272900\t10274400\t0.1199\t4615\nchr21\t10324200\t10326000\t0.275\t16528\nchr21\t10336200\t10336500\t0.3088\t181\nchr21\t10364100\t10364400\t0\t383\nchr21\t10366500\t10371000\t0\t383\nchr21\t10392600\t10392900\t0.1636\t306\nchr21\t10395300\t10395600\t0.4044\t181\nchr21\t10397100\t10397400\t0.2973\t353\nchr21\t10435200\t10435500\t0.1238\t58\nchr21\t10441500\t10441800\t0.1166\t120\nchr21\t10477500\t10477800\t0.2028\t145\nchr21\t10479300\t10479900\t0.0833\t148\nchr21\t10487100\t10488000\t0.198\t126\nchr21\t10492200\t10501500\t0\t109\nchr21\t10502700\t10504800\t0\t69\nchr21\t10506000\t10510200\t0\t69\nchr21\t10653900\t10654200\t0.441\t409\nchr21\t10655400\t10656600\t0.1186\t6680\nchr21\t10658700\t10659000\t0.2461\t1950\nchr21\t10662300\t10662600\t0.2977\t567\nchr21\t10666500\t10666800\t0.4972\t383\nchr21\t10668000\t10669200\t0.2317\t3467\nchr21\t10670700\t10671000\t0.4142\t492\nchr21\t10673100\t10674600\t0.3331\t726\nchr21\t10676700\t10677000\t0.3778\t440\nchr21\t10678500\t10680000\t0.3128\t574\nchr21\t10687200\t10687500\t0.3774\t514\nchr21\t10692300\t10693200\t0.1738\t30778\nchr21\t10698300\t10698600\t0.4679\t374\nchr21\t10703100\t10703400\t0.3365\t916\nchr21\t10704600\t10705500\t0.1717\t2181\nchr21\t10706700\t10708500\t0.331\t582\nchr21\t10711200\t10711500\t0.4604\t364\nchr21\t10714200\t10714500\t0.4633\t440\nchr21\t10716600\t10716900\t0.3328\t679\nchr21\t10722900\t10723200\t0.4211\t265\nchr21\t10724400\t10728600\t0.2272\t1201\nchr21\t10730100\t10733400\t0.2272\t1201\nchr21\t10737600\t10737900\t0.4994\t329\nchr21\t13030500\t13030800\t0.2766\t62\nchr21\t13038900\t13039200\t0.4857\t48\nchr21\t13044900\t13045200\t0.1419\t59\nchr21\t13046700\t13047000\t0.0221\t66\nchr21\t13048800\t13050000\t0.0434\t41\nchr21\t13056000\t13057800\t0.2203\t74\nchr21\t13059000\t13059900\t0.2225\t69\nchr21\t13063200\t13065000\t0.0238\t72\nchr21\t13070400\t13070700\t0.2033\t67\nchr21\t13092300\t13092600\t0.0615\t54\nchr21\t13094700\t13095000\t0.227\t48\nchr21\t13137900\t13138800\t0.0037\t57\nchr21\t13158600\t13158900\t0.3072\t46\nchr21\t13167000\t13167300\t0.1345\t56\nchr21\t13171200\t13171500\t0.2468\t62\nchr21\t13175100\t13175400\t0.2975\t71\nchr21\t13179900\t13181100\t0\t67\nchr21\t13182600\t13183200\t0\t67\nchr21\t13184700\t13185900\t0\t67\nchr21\t13194000\t13196100\t0.1765\t65\nchr21\t13197600\t13197900\t0.1845\t62\nchr21\t13199700\t13200000\t0.2112\t70\nchr21\t13204200\t13205400\t0.2327\t54\nchr21\t13208700\t13210200\t0.0904\t57\nchr21\t13216500\t13216800\t0.2667\t57\nchr21\t13375500\t13375800\t0.2169\t64\nchr21\t13391100\t13391400\t0.2115\t20\nchr21\t13483800\t13484100\t0.1919\t73\nchr21\t13500300\t13500900\t0.4058\t52\nchr21\t13524000\t13524300\t0.3683\t57\nchr21\t13533900\t13534800\t0.1693\t56\nchr21\t13567800\t13568100\t0.2705\t50\nchr21\t13586400\t13591800\t0\t47\nchr21\t13593000\t13594500\t0.0088\t30\nchr21\t13596000\t13596900\t0.2011\t38\nchr21\t13598400\t13601100\t0.0747\t50\nchr21\t13602300\t13604700\t0.001\t47\nchr21\t13606500\t13608300\t0.001\t47\nchr21\t13610100\t13610400\t0.0831\t37\nchr21\t13613100\t13618500\t0\t47\nchr21\t13619700\t13636200\t0\t47\nchr21\t13638000\t13639200\t0\t47\nchr21\t13640700\t13641300\t0\t47\nchr21\t13642800\t13643400\t0\t47\nchr21\t13644600\t13644900\t0.1608\t22\nchr21\t13646400\t13649400\t0.0021\t44\nchr21\t13652400\t13654200\t0\t49\nchr21\t13657500\t13659000\t0\t49\nchr21\t13660200\t13663800\t0\t49\nchr21\t13666800\t13668600\t0\t29\nchr21\t13669800\t13673100\t0\t34\nchr21\t13675500\t13676700\t0\t38\nchr21\t13678800\t13685100\t0\t38\nchr21\t13686600\t13711200\t0\t38\nchr21\t13712400\t13717500\t0\t23\nchr21\t13719000\t13732500\t0\t27\nchr21\t13733700\t13780500\t0\t50\nchr21\t13784700\t13799100\t0\t64\nchr21\t13866600\t13866900\t0.119\t27\nchr21\t13881600\t13881900\t0.3526\t77\nchr21\t13975500\t13975800\t0.0027\t40\nchr21\t13984200\t13984500\t0.0357\t52\nchr21\t13992900\t13993200\t0.0168\t66\nchr21\t14059800\t14060100\t0.0877\t31\nchr21\t14068500\t14068800\t0.1606\t40\nchr21\t14407800\t14408100\t0.0966\t51\nchr21\t14588100\t14588400\t0.2189\t68\nchr21\t14927700\t14932500\t0.0127\t104\nchr21\t15554400\t15555900\t0.2513\t83\nchr21\t15837000\t15837300\t0.2844\t47\nchr21\t16398000\t16398300\t0.4284\t32\nchr21\t16544400\t16544700\t0.2787\t26\nchr21\t17167500\t17167800\t0.171\t14\nchr21\t17172600\t17172900\t0.034\t25\nchr21\t17291700\t17292900\t0.0045\t95\nchr21\t17305500\t17306100\t0.0801\t51\nchr21\t17332200\t17332500\t0.3763\t78\nchr21\t17377200\t17379000\t0.0522\t84\nchr21\t17380200\t17381700\t0.0522\t84\nchr21\t17718600\t17719200\t0.1518\t71\nchr21\t18561000\t18561300\t0.3244\t47\nchr21\t18569700\t18570000\t0.3133\t40\nchr21\t18872400\t18872700\t0.2019\t63\nchr21\t19008900\t19009200\t0.3514\t66\nchr21\t19071900\t19074000\t0.0491\t83\nchr21\t20076900\t20077200\t0.0996\t33\nchr21\t20199600\t20201400\t0.1161\t66\nchr21\t21301800\t21302100\t0.2022\t67\nchr21\t22957800\t22958100\t0.3094\t50\nchr21\t23002500\t23002800\t0.1547\t35\nchr21\t24391800\t24392100\t0.0599\t15\nchr21\t25919400\t25924200\t0\t93\nchr21\t27576000\t27577800\t0.2385\t64\nchr21\t29421300\t29422500\t0.1107\t68\nchr21\t30840000\t30841800\t0.0202\t95\nchr21\t31784400\t31785300\t0.2873\t301\nchr21\t32224800\t32226000\t0.006\t87\nchr21\t33321600\t33321900\t0.2625\t169\nchr21\t33323400\t33323700\t0.4506\t37\nchr21\t33927000\t33927600\t0.1607\t87\nchr21\t33930000\t33930300\t0.1765\t52\nchr21\t34374300\t34449300\t0\t45\nchr21\t34450500\t34495500\t0\t47\nchr21\t35493900\t35499300\t0.0053\t94\nchr21\t36496800\t36497400\t0.2061\t169\nchr21\t38109300\t38109600\t0.1155\t13\nchr21\t38218500\t38218800\t0.416\t45\nchr21\t38828700\t38829300\t0.0202\t56\nchr21\t38874300\t38874600\t0.4657\t39\nchr21\t39786300\t39786600\t0.264\t71\nchr21\t39974400\t39975000\t0.3369\t266\nchr21\t40023600\t40023900\t0.0196\t50\nchr21\t40027500\t40028100\t0\t88\nchr21\t40033800\t40035600\t0\t70\nchr21\t40038300\t40038900\t0\t70\nchr21\t40182600\t40182900\t0.4661\t31\nchr21\t40917300\t40917600\t0.0442\t73\nchr21\t41031000\t41031300\t0.2293\t15\nchr21\t41690100\t41690400\t0.4742\t59\nchr21\t41805900\t41806500\t0.4122\t494\nchr21\t41856000\t41856300\t0.2654\t24\nchr21\t42078300\t42078600\t0.2628\t11\nchr21\t42283800\t42284100\t0.2368\t21\nchr21\t42588000\t42590100\t0.0432\t27\nchr21\t42957300\t42957600\t0.1622\t1902\nchr21\t43037400\t43037700\t0.3773\t16\nchr21\t43039500\t43039800\t0.2369\t39\nchr21\t43043100\t43045800\t0.023\t40\nchr21\t43047600\t43065900\t0\t49\nchr21\t43067400\t43086900\t0\t49\nchr21\t43089000\t43094100\t0\t50\nchr21\t43095600\t43187400\t0\t50\nchr21\t43336800\t43337100\t0.4887\t185\nchr21\t43377300\t43410600\t0\t43\nchr21\t43412100\t43412400\t0\t43\nchr21\t43414200\t43438500\t0\t40\nchr21\t43440600\t43505100\t0\t51\nchr21\t43506300\t43550700\t0\t51\nchr21\t43553400\t43571700\t0\t39\nchr21\t44096100\t44145900\t0\t46\nchr21\t44147100\t44148900\t0\t46\nchr21\t44150100\t44194800\t0\t46\nchr21\t44196900\t44197200\t0\t15\nchr21\t44201100\t44209800\t0\t46\nchr21\t44211000\t44229000\t0\t46\nchr21\t44230200\t44253300\t0\t46\nchr21\t44410200\t44410500\t0.2899\t31\nchr21\t44422800\t44423100\t0.1979\t32\nchr21\t44487000\t44487300\t0.1539\t64\nchr21\t44981700\t44982300\t0.1984\t85\nchr21\t45500400\t45501000\t0.3509\t61\nchr21\t45524400\t45524700\t0.1882\t67\nchr21\t45633300\t45634200\t0.1596\t78\nchr21\t45746100\t45747000\t0.1334\t74\nchr21\t45924300\t45924900\t0.4092\t266\nchr21\t46034400\t46035000\t0.0249\t51\nchr21\t46090800\t46091100\t0.4801\t199\nchr21\t46169700\t46170000\t0.208\t15\nchr21\t46184400\t46184700\t0.2168\t200\nchr21\t46201200\t46201500\t0.0904\t103\nchr21\t46292700\t46294500\t0.1325\t160\nchr21\t46682700\t46686900\t0\t79\nchr21\t46689900\t46691700\t0\t74\nchr21\t46692900\t46700100\t0\t125\nchr22\t10509900\t10521900\t0\t80\nchr22\t10523400\t10560600\t0\t137\nchr22\t10562100\t10571400\t0\t73\nchr22\t10573500\t10597800\t0\t65\nchr22\t10599300\t10615200\t0\t65\nchr22\t10616400\t10628100\t0\t54\nchr22\t10629900\t10630800\t0\t40\nchr22\t10632900\t10639200\t0\t49\nchr22\t10640700\t10641300\t0\t49\nchr22\t10642500\t10644000\t0\t60\nchr22\t10645200\t10659900\t0\t60\nchr22\t10674300\t10676100\t0.1213\t56\nchr22\t10678200\t10678500\t0.1065\t77\nchr22\t10682400\t10684200\t0.096\t80\nchr22\t10685700\t10686300\t0.1957\t97\nchr22\t10689600\t10689900\t0.158\t120\nchr22\t10706100\t10706700\t0.1954\t82\nchr22\t10709400\t10709700\t0.0682\t97\nchr22\t10718100\t10719000\t0.2787\t1204\nchr22\t10720800\t10721400\t0.2897\t1599\nchr22\t10722900\t10723200\t0.2897\t1599\nchr22\t10725000\t10726800\t0.2591\t513\nchr22\t10729200\t10730400\t0.3731\t755\nchr22\t10765200\t10765500\t0.1735\t156\nchr22\t10834500\t10874400\t0\t142\nchr22\t10954800\t10955100\t0.3125\t223\nchr22\t10963500\t10963800\t0.0399\t97\nchr22\t11016600\t11017200\t0\t384\nchr22\t11018400\t11023800\t0\t384\nchr22\t11043900\t11046000\t0.0402\t270\nchr22\t11049900\t11050200\t0.0451\t275\nchr22\t11052900\t11053200\t0.215\t256\nchr22\t11119200\t11160900\t0\t78\nchr22\t11211300\t11214300\t0.1607\t585\nchr22\t11215500\t11217600\t0\t39\nchr22\t11220600\t11250300\t0\t193\nchr22\t11251500\t11284500\t0\t193\nchr22\t11320500\t11322900\t0\t226\nchr22\t11332500\t11332800\t0.1977\t54\nchr22\t11368800\t11371200\t0.0029\t644\nchr22\t11430000\t11430300\t0.2654\t29\nchr22\t11433000\t11433900\t0.4654\t40\nchr22\t11438400\t11438700\t0.2063\t33\nchr22\t11440200\t11440500\t0.2973\t39\nchr22\t11445600\t11447400\t0\t32\nchr22\t11449500\t11450400\t0\t19\nchr22\t11452200\t11452500\t0\t12\nchr22\t11454000\t11456400\t0\t48\nchr22\t11458500\t11459700\t0\t27\nchr22\t11460900\t11461200\t0\t27\nchr22\t11462400\t11466000\t0\t36\nchr22\t11470500\t11471700\t0.0674\t28\nchr22\t11472900\t11473200\t0.0674\t28\nchr22\t11484600\t11486100\t0\t26\nchr22\t11492400\t11493600\t0.244\t22\nchr22\t11548500\t11548800\t0.3266\t140\nchr22\t11557500\t11560500\t0\t270\nchr22\t11683200\t11689800\t0\t151\nchr22\t11691000\t11694300\t0\t151\nchr22\t11696400\t11697000\t0\t151\nchr22\t11698800\t11703000\t0\t219\nchr22\t11704800\t11710200\t0\t219\nchr22\t11711400\t11714400\t0\t219\nchr22\t11715600\t11724300\t0\t219\nchr22\t11774700\t11786400\t0\t141\nchr22\t11787600\t11793300\t0\t141\nchr22\t11794500\t11795400\t0\t136\nchr22\t11796600\t11800200\t0\t136\nchr22\t11802300\t11818200\t0\t825\nchr22\t11820000\t11821200\t0\t134\nchr22\t11823000\t11827500\t0\t149\nchr22\t11828700\t11869800\t0\t149\nchr22\t11871600\t11872800\t0\t149\nchr22\t11874000\t11874600\t0\t41\nchr22\t11876100\t11878800\t0\t41\nchr22\t11880900\t11883900\t0\t79\nchr22\t11885100\t11885700\t0\t79\nchr22\t11893800\t11894100\t0.0099\t78\nchr22\t11895300\t11899500\t0\t61\nchr22\t11901000\t11908800\t0\t171\nchr22\t11910000\t11938500\t0\t171\nchr22\t11940000\t11941500\t0\t171\nchr22\t11943000\t11945400\t0\t171\nchr22\t11946600\t11949900\t0\t171\nchr22\t11951700\t11953500\t0\t171\nchr22\t11954700\t11959500\t0\t106\nchr22\t11966100\t11970300\t0\t101\nchr22\t11972100\t11973000\t0\t101\nchr22\t11974800\t11975100\t0.2985\t13\nchr22\t12042600\t12043200\t0.2457\t162\nchr22\t12046500\t12046800\t0.104\t109\nchr22\t12058200\t12058800\t0\t128\nchr22\t12060600\t12068400\t0\t128\nchr22\t12069900\t12070500\t0.0006\t163\nchr22\t12071700\t12077100\t0.0006\t163\nchr22\t12080100\t12081600\t0.0006\t163\nchr22\t12083700\t12087900\t0\t119\nchr22\t12089100\t12091200\t0.0083\t107\nchr22\t12092700\t12093000\t0.0083\t107\nchr22\t12096600\t12097200\t0.025\t97\nchr22\t12100200\t12100500\t0.219\t89\nchr22\t12102000\t12102300\t0.1687\t103\nchr22\t12104100\t12104700\t0.155\t155\nchr22\t12106800\t12107700\t0.0566\t79\nchr22\t12115800\t12116400\t0.0023\t106\nchr22\t12117600\t12118200\t0.0023\t106\nchr22\t12125100\t12125400\t0\t136\nchr22\t12126900\t12128400\t0\t136\nchr22\t12129900\t12132000\t0\t136\nchr22\t12133800\t12135300\t0.0014\t90\nchr22\t12136800\t12139500\t0.0014\t90\nchr22\t12141600\t12141900\t0.2039\t107\nchr22\t12144000\t12144600\t0.039\t176\nchr22\t12146700\t12147900\t0.039\t176\nchr22\t12149100\t12149400\t0.039\t176\nchr22\t12151500\t12152700\t0.039\t176\nchr22\t12154500\t12157500\t0.039\t176\nchr22\t12159300\t12161100\t0.2304\t246\nchr22\t12162300\t12163500\t0.2304\t246\nchr22\t12172200\t12172500\t0.3189\t153\nchr22\t12175500\t12176700\t0.016\t892\nchr22\t12178200\t12178800\t0.016\t892\nchr22\t12182100\t12182400\t0.0042\t79\nchr22\t12184800\t12186900\t0.1295\t113\nchr22\t12189000\t12189300\t0.3377\t98\nchr22\t12215400\t12215700\t0.1463\t74\nchr22\t12219900\t12222000\t0.256\t165\nchr22\t12225000\t12225300\t0.4271\t84\nchr22\t12275700\t12276900\t0.1793\t182\nchr22\t12278400\t12279600\t0.1793\t182\nchr22\t12281100\t12282000\t0.0069\t158\nchr22\t12285300\t12292500\t0.0021\t171\nchr22\t12293700\t12296700\t0\t253\nchr22\t12299400\t12303000\t0.002\t228\nchr22\t12304500\t12306600\t0.002\t228\nchr22\t12309000\t12314100\t0.002\t228\nchr22\t12315900\t12316500\t0.002\t228\nchr22\t12320700\t12321300\t0.0017\t46\nchr22\t12323100\t12330300\t0\t214\nchr22\t12331800\t12338400\t0\t214\nchr22\t12340200\t12340800\t0\t214\nchr22\t12342900\t12343200\t0\t214\nchr22\t12344400\t12346800\t0.0604\t121\nchr22\t12348900\t12349200\t0.0769\t163\nchr22\t12352200\t12357600\t0\t228\nchr22\t12359700\t12362400\t0\t311\nchr22\t12364200\t12364500\t0.0255\t194\nchr22\t12366300\t12366900\t0.1268\t237\nchr22\t12368400\t12371400\t0.1268\t237\nchr22\t12373800\t12374100\t0.1021\t206\nchr22\t12490500\t12496200\t0.0548\t238\nchr22\t12499800\t12500100\t0.0893\t196\nchr22\t12501300\t12504600\t0\t310\nchr22\t12506100\t12511800\t0.0032\t199\nchr22\t12515100\t12515400\t0.1182\t124\nchr22\t12517500\t12519000\t0.2319\t185\nchr22\t12520800\t12521100\t0.2319\t185\nchr22\t12523200\t12525000\t0\t235\nchr22\t12526200\t12530700\t0\t235\nchr22\t12532200\t12535200\t0\t235\nchr22\t12538200\t12540300\t0\t107\nchr22\t12542100\t12543300\t0\t96\nchr22\t12546900\t12547200\t0.0332\t62\nchr22\t12550500\t12560400\t0.0057\t233\nchr22\t12561900\t12563100\t0.0076\t97\nchr22\t12564300\t12565500\t0.0076\t97\nchr22\t12568200\t12580200\t0.0024\t253\nchr22\t12582600\t12583200\t0.0024\t253\nchr22\t12585300\t12586200\t0.1237\t130\nchr22\t12587400\t12588900\t0.1242\t183\nchr22\t12698700\t12699000\t0\t13\nchr22\t12709200\t12709500\t0.1964\t60\nchr22\t12713400\t12716400\t0.1481\t105\nchr22\t12717900\t12718200\t0.1481\t105\nchr22\t12720900\t12721200\t0.334\t74\nchr22\t12724500\t12724800\t0.139\t55\nchr22\t12776700\t12778200\t0.0376\t76\nchr22\t12781800\t12783000\t0.2023\t169\nchr22\t12785100\t12785400\t0.2023\t169\nchr22\t12786900\t12788100\t0.05\t84\nchr22\t12791100\t12792600\t0.0528\t112\nchr22\t12793800\t12794700\t0.0528\t112\nchr22\t12796200\t12796800\t0.0528\t112\nchr22\t12804900\t12805200\t0.1462\t67\nchr22\t12806700\t12809700\t0.0379\t98\nchr22\t12812100\t12812400\t0.1485\t74\nchr22\t12814800\t12815100\t0.025\t98\nchr22\t12816300\t12817800\t0.224\t101\nchr22\t12868200\t12904800\t0\t239\nchr22\t15155100\t15165900\t0\t74\nchr22\t15167400\t15194100\t0\t83\nchr22\t15195300\t15208200\t0\t87\nchr22\t15209400\t15227400\t0\t86\nchr22\t15228600\t15252000\t0\t86\nchr22\t15253800\t15279000\t0\t86\nchr22\t15280200\t15301500\t0\t86\nchr22\t15303300\t15316800\t0\t86\nchr22\t15318300\t15324300\t0\t71\nchr22\t15326100\t15329100\t0.0484\t65\nchr22\t15331200\t15335100\t0\t55\nchr22\t15336600\t15337800\t0\t55\nchr22\t15339600\t15342300\t0.0129\t57\nchr22\t15343800\t15344100\t0.0129\t57\nchr22\t15345300\t15345900\t0.0006\t71\nchr22\t15347100\t15348600\t0.0006\t71\nchr22\t15349800\t15352500\t0.0006\t71\nchr22\t15354000\t15357000\t0\t96\nchr22\t15358500\t15358800\t0\t96\nchr22\t15360000\t15360300\t0.1424\t75\nchr22\t15363000\t15363300\t0\t83\nchr22\t15364500\t15369600\t0\t83\nchr22\t15372300\t15375900\t0.0506\t78\nchr22\t15377100\t15378900\t0.0506\t78\nchr22\t15380100\t15382200\t0.0508\t76\nchr22\t15384000\t15384300\t0.0962\t88\nchr22\t15385800\t15387600\t0.0962\t88\nchr22\t15393300\t15396300\t0\t81\nchr22\t15398100\t15402300\t0.0025\t88\nchr22\t15403500\t15407700\t0.0025\t88\nchr22\t15409800\t15411000\t0.0171\t76\nchr22\t15414000\t15419400\t0\t83\nchr22\t15420900\t15422700\t0\t70\nchr22\t15425100\t15427200\t0.0066\t73\nchr22\t15429300\t15430800\t0.0048\t71\nchr22\t15432600\t15437700\t0\t80\nchr22\t15441000\t15441300\t0.0752\t81\nchr22\t15444000\t15447900\t0.0021\t73\nchr22\t15450000\t15450600\t0\t74\nchr22\t15452400\t15456300\t0\t74\nchr22\t15457500\t15466200\t0\t74\nchr22\t15467400\t15468000\t0.2152\t52\nchr22\t15471600\t15483000\t0\t72\nchr22\t15484800\t15486600\t0\t72\nchr22\t15489600\t15506700\t0\t74\nchr22\t15507900\t15512700\t0\t88\nchr22\t15514500\t15514800\t0\t88\nchr22\t15516300\t15517200\t0\t88\nchr22\t15518400\t15520500\t0\t139\nchr22\t15521700\t15535200\t0\t139\nchr22\t15537600\t15542700\t0\t139\nchr22\t15545100\t15548400\t0\t156\nchr22\t15549600\t15576600\t0\t156\nchr22\t15578700\t15598800\t0\t141\nchr22\t15600600\t15612000\t0\t141\nchr22\t15616200\t15616500\t0.2451\t105\nchr22\t15617700\t15618000\t0.2451\t105\nchr22\t15619500\t15625500\t0.0125\t98\nchr22\t15627000\t15627300\t0.0305\t67\nchr22\t15629400\t15629700\t0.2347\t116\nchr22\t15637200\t15639600\t0\t177\nchr22\t15641400\t15652200\t0\t177\nchr22\t15653700\t15669300\t0\t177\nchr22\t15670800\t15689100\t0\t177\nchr22\t15690900\t15691500\t0\t177\nchr22\t15693000\t15699300\t0\t150\nchr22\t15700800\t15707700\t0\t150\nchr22\t15709200\t15710100\t0\t150\nchr22\t15711900\t15712800\t0\t122\nchr22\t15714600\t15728700\t0\t146\nchr22\t15729900\t15730200\t0\t146\nchr22\t15732600\t15733500\t0.0295\t126\nchr22\t15735300\t15737400\t0.004\t146\nchr22\t15741300\t15745200\t0\t130\nchr22\t15747300\t15747600\t0.0626\t105\nchr22\t15750600\t15754500\t0.0161\t133\nchr22\t15756000\t15756600\t0.0161\t133\nchr22\t15759000\t15759900\t0.0053\t135\nchr22\t15762300\t15763500\t0.0211\t183\nchr22\t15764700\t15765300\t0.0211\t183\nchr22\t15767400\t15770700\t0\t111\nchr22\t15773700\t15774300\t0.0233\t112\nchr22\t15776100\t15777900\t0\t186\nchr22\t15779100\t15785400\t0\t186\nchr22\t15786600\t15786900\t0.0233\t81\nchr22\t15788700\t15814200\t0\t161\nchr22\t15815400\t15826800\t0\t158\nchr22\t15828300\t15828600\t0.0644\t32\nchr22\t15830700\t15831900\t0.0015\t163\nchr22\t15833100\t15833400\t0.0015\t163\nchr22\t15837300\t15838500\t0.092\t95\nchr22\t15839700\t15840300\t0.1108\t102\nchr22\t15842100\t15861000\t0\t174\nchr22\t15864000\t15879600\t0\t114\nchr22\t15880800\t15904200\t0\t114\nchr22\t15905400\t15906000\t0\t114\nchr22\t15907500\t15907800\t0\t114\nchr22\t15909300\t15910800\t0\t62\nchr22\t15912300\t15913500\t0.015\t70\nchr22\t15915000\t15915300\t0.049\t29\nchr22\t15918300\t15918600\t0.0741\t64\nchr22\t15927900\t15928200\t0.3157\t66\nchr22\t15931200\t15932700\t0.2082\t74\nchr22\t15941400\t15944700\t0.0362\t68\nchr22\t15947100\t15947400\t0.3419\t66\nchr22\t15951000\t15951600\t0.2018\t59\nchr22\t15954900\t15955200\t0.2015\t37\nchr22\t15957000\t15963300\t0\t45\nchr22\t15964500\t15971700\t0\t45\nchr22\t15973500\t15977100\t0\t67\nchr22\t15978300\t15980400\t0\t67\nchr22\t15982500\t15982800\t0.3134\t52\nchr22\t15984900\t15995100\t0\t89\nchr22\t15996300\t16020600\t0\t89\nchr22\t16164900\t16165200\t0.0694\t21\nchr22\t16275600\t16275900\t0.4326\t151\nchr22\t16305600\t16314300\t0\t32\nchr22\t16319100\t16323600\t0\t51\nchr22\t16328100\t16385700\t0\t11424\nchr22\t16479900\t16522500\t0\t75\nchr22\t16701000\t16701300\t0.0393\t70\nchr22\t16959000\t16959300\t0.3749\t49\nchr22\t17018100\t17018400\t0.1362\t136\nchr22\t17034000\t17034300\t0.3226\t98\nchr22\t17037000\t17037300\t0.2576\t108\nchr22\t17146800\t17147100\t0.1944\t50\nchr22\t17877000\t17877300\t0.4925\t164\nchr22\t18009300\t18009900\t0\t32\nchr22\t18161100\t18161700\t0.0168\t64\nchr22\t18165000\t18165600\t0.233\t57\nchr22\t18170700\t18171300\t0.017\t66\nchr22\t18176100\t18178500\t0.0484\t86\nchr22\t18180300\t18184800\t0\t987\nchr22\t18186600\t18189900\t0\t987\nchr22\t18191400\t18203700\t0\t987\nchr22\t18205200\t18206100\t0\t1414\nchr22\t18207600\t18225300\t0\t52\nchr22\t18226500\t18229800\t0\t52\nchr22\t18231000\t18231600\t0\t52\nchr22\t18233100\t18234600\t0\t29\nchr22\t18236700\t18238500\t0.0142\t1239\nchr22\t18339900\t18346500\t0\t37\nchr22\t18347700\t18354300\t0\t43\nchr22\t18358200\t18368700\t0\t58\nchr22\t18371700\t18387900\t0\t2035\nchr22\t18390600\t18417300\t0\t63\nchr22\t18418500\t18419700\t0\t1194\nchr22\t18420900\t18433500\t0\t675\nchr22\t18484200\t18485100\t0\t38\nchr22\t18486300\t18487800\t0\t21\nchr22\t18489000\t18491100\t0\t31\nchr22\t18492300\t18502500\t0\t44\nchr22\t18504000\t18505200\t0\t44\nchr22\t18507600\t18508800\t0\t44\nchr22\t18510000\t18518100\t0\t50\nchr22\t18520800\t18529800\t0\t42\nchr22\t18531000\t18536100\t0\t52\nchr22\t18538500\t18550800\t0\t48\nchr22\t18552900\t18568800\t0\t60\nchr22\t18570000\t18571200\t0\t70\nchr22\t18572400\t18588600\t0\t70\nchr22\t18590400\t18597600\t0\t70\nchr22\t18600300\t18606900\t0\t60\nchr22\t18609000\t18615000\t0\t62\nchr22\t18616200\t18616500\t0\t62\nchr22\t18618000\t18620700\t0.1407\t41\nchr22\t18622500\t18628200\t0\t38\nchr22\t18629400\t18631500\t0\t39\nchr22\t18632700\t18633900\t0\t39\nchr22\t18635100\t18636000\t0\t39\nchr22\t18637800\t18638700\t0\t35\nchr22\t18639900\t18640200\t0\t28\nchr22\t18641700\t18648600\t0\t28\nchr22\t18650100\t18652500\t0\t28\nchr22\t18653700\t18654900\t0\t28\nchr22\t18656400\t18657600\t0\t61\nchr22\t18658800\t18659100\t0\t61\nchr22\t18709500\t18720300\t0\t36\nchr22\t18722100\t18727500\t0\t89\nchr22\t18729900\t18730800\t0.3272\t12678\nchr22\t18733500\t18738900\t0\t7475\nchr22\t18741600\t18742200\t0\t36\nchr22\t18743400\t18744600\t0\t23\nchr22\t18746100\t18748500\t0\t49\nchr22\t18749700\t18751500\t0\t37\nchr22\t18752700\t18761700\t0\t51\nchr22\t18762900\t18765300\t0\t51\nchr22\t18767100\t18782400\t0\t43\nchr22\t18784500\t18799200\t0\t47\nchr22\t18800400\t18813600\t0\t43\nchr22\t18815100\t18816900\t0\t34\nchr22\t18819600\t18837900\t0\t50\nchr22\t18839100\t18840300\t0\t32\nchr22\t18841500\t18842100\t0\t32\nchr22\t18843300\t18870000\t0\t4960\nchr22\t18871200\t18908100\t0\t4960\nchr22\t18909300\t18913200\t0\t4960\nchr22\t18914400\t18916500\t0\t4960\nchr22\t18918300\t18941700\t0\t73\nchr22\t18942900\t18945000\t0\t123\nchr22\t18946200\t18947700\t0\t123\nchr22\t19025700\t19026900\t0.0494\t56\nchr22\t20162400\t20163900\t0.2691\t94\nchr22\t20326500\t20327700\t0.0425\t47\nchr22\t20331600\t20332800\t0.0864\t55\nchr22\t20334000\t20334300\t0.0244\t39\nchr22\t20338500\t20347500\t0\t1137\nchr22\t20350200\t20350500\t0.0541\t67\nchr22\t20352300\t20353500\t0.1668\t47\nchr22\t20366100\t20366700\t0.0382\t77\nchr22\t20371800\t20372400\t0.0924\t73\nchr22\t20375700\t20376300\t0.0192\t64\nchr22\t20679300\t20679900\t0.226\t47\nchr22\t20683200\t20684100\t0.219\t60\nchr22\t20689200\t20689800\t0.1145\t67\nchr22\t20696400\t20697000\t0.0021\t48\nchr22\t20708700\t20709000\t0.1947\t51\nchr22\t21057600\t21057900\t0.2559\t45\nchr22\t21112200\t21122400\t0\t66\nchr22\t21123900\t21128100\t0\t116\nchr22\t21129600\t21151800\t0\t116\nchr22\t21153900\t21158700\t0\t116\nchr22\t21160200\t21163800\t0\t116\nchr22\t21165600\t21176100\t0\t452\nchr22\t21177600\t21216000\t0\t452\nchr22\t21219000\t21226800\t0\t48\nchr22\t21228000\t21229200\t0\t48\nchr22\t21230400\t21233400\t0\t48\nchr22\t21234600\t21248100\t0\t38\nchr22\t21249300\t21294600\t0\t379\nchr22\t21295800\t21327000\t0\t379\nchr22\t21330000\t21336900\t0\t60\nchr22\t21338100\t21349500\t0\t60\nchr22\t21350700\t21355200\t0\t34\nchr22\t21356400\t21357000\t0\t41\nchr22\t21360000\t21360300\t0.1039\t40\nchr22\t21361500\t21362100\t0.1041\t43\nchr22\t21364200\t21365400\t0\t45\nchr22\t21367200\t21376200\t0\t45\nchr22\t21379500\t21380700\t0\t68\nchr22\t21381900\t21402000\t0\t68\nchr22\t21403200\t21405600\t0.0394\t75\nchr22\t21407700\t21417000\t0\t67\nchr22\t21418200\t21425100\t0\t75\nchr22\t21426600\t21442800\t0\t78\nchr22\t21460800\t21465000\t0\t50\nchr22\t21466200\t21475800\t0\t50\nchr22\t21477900\t21479400\t0\t45\nchr22\t21481800\t21482100\t0.001\t46\nchr22\t21483300\t21483900\t0.001\t46\nchr22\t21486600\t21511500\t0\t81\nchr22\t21512700\t21542100\t0\t81\nchr22\t21543300\t21554700\t0\t78\nchr22\t21883500\t21883800\t0.4648\t90\nchr22\t21955500\t21956100\t0\t66\nchr22\t22221000\t22221900\t0.0379\t67\nchr22\t22223400\t22224000\t0.0231\t64\nchr22\t22278900\t22279200\t0.307\t58\nchr22\t22281000\t22281300\t0.2814\t61\nchr22\t22632600\t22632900\t0.3064\t60\nchr22\t22636800\t22637400\t0.1377\t20\nchr22\t22644300\t22644900\t0.1079\t67\nchr22\t22650000\t22650300\t0.2507\t33\nchr22\t22900200\t22900500\t0.0405\t72\nchr22\t22905600\t22905900\t0.0704\t66\nchr22\t23310900\t23311200\t0.1467\t72\nchr22\t23344500\t23344800\t0.1897\t42\nchr22\t23540100\t23540700\t0.2428\t60\nchr22\t23601900\t23602200\t0.1783\t63\nchr22\t23853900\t23856300\t0\t134\nchr22\t23940000\t23940300\t0.0893\t64\nchr22\t23941800\t23942100\t0.1364\t36\nchr22\t23946600\t23949300\t0\t25\nchr22\t23957100\t23959200\t0.0114\t37\nchr22\t23961000\t23969100\t0\t49\nchr22\t23972700\t23980500\t0\t51\nchr22\t23982300\t23984400\t0\t31\nchr22\t23989200\t23990700\t0.0392\t30\nchr22\t23999400\t23999700\t0.0877\t42\nchr22\t24000900\t24001200\t0.0329\t49\nchr22\t24193500\t24193800\t0.0563\t88\nchr22\t24251700\t24252300\t0.0376\t54\nchr22\t24293700\t24294300\t0.0581\t82\nchr22\t24671400\t24672000\t0.0085\t71\nchr22\t25228200\t25228500\t0.2127\t65\nchr22\t25266600\t25267200\t0.152\t60\nchr22\t25309800\t25310100\t0.3228\t67\nchr22\t25523700\t25524000\t0.1532\t70\nchr22\t25613400\t25613700\t0.308\t66\nchr22\t25615500\t25615800\t0.2402\t54\nchr22\t26772300\t26772900\t0.3252\t82\nchr22\t28194900\t28195800\t0\t70\nchr22\t28212600\t28213800\t0\t61\nchr22\t28663500\t28669200\t0\t113\nchr22\t31026900\t31027800\t0.0972\t49\nchr22\t31591800\t31593900\t0.1627\t49\nchr22\t32145900\t32146200\t0.4876\t36\nchr22\t32156400\t32156700\t0.1777\t37\nchr22\t32295900\t32298900\t0.0306\t67\nchr22\t32346600\t32346900\t0.2415\t53\nchr22\t32931900\t32932200\t0.1505\t95\nchr22\t34549800\t34554600\t0\t78\nchr22\t34677600\t34678500\t0.02\t53\nchr22\t34680900\t34682400\t0.1587\t51\nchr22\t34779600\t34779900\t0.4564\t45\nchr22\t36138000\t36138900\t0\t69\nchr22\t36187200\t36188100\t0\t77\nchr22\t37227000\t37227300\t0.2244\t29\nchr22\t38229600\t38230200\t0.2375\t66\nchr22\t38384400\t38386200\t0.165\t88\nchr22\t38806500\t38807700\t0.135\t82\nchr22\t39842700\t39843000\t0.2303\t49\nchr22\t40501200\t40501500\t0.1344\t25\nchr22\t40536300\t40538400\t0.0283\t82\nchr22\t40744200\t40746600\t0\t61\nchr22\t42123300\t42125700\t0\t73\nchr22\t42129900\t42130200\t0.1422\t67\nchr22\t42135600\t42138000\t0\t79\nchr22\t42143700\t42144000\t0.0188\t67\nchr22\t42501600\t42505800\t0\t73\nchr22\t42513300\t42513600\t0.0705\t59\nchr22\t42518100\t42519300\t0.2469\t61\nchr22\t42555000\t42559200\t0\t77\nchr22\t42575100\t42575400\t0.1676\t69\nchr22\t42980700\t42982500\t0.1118\t80\nchr22\t43281000\t43281300\t0.3349\t26\nchr22\t43496700\t43497000\t0.4123\t44\nchr22\t44113200\t44113500\t0.4956\t98\nchr22\t44800800\t44801100\t0.0118\t31\nchr22\t45327900\t45328500\t0.2558\t136\nchr22\t46606200\t46606500\t0.1489\t14\nchr22\t46631400\t46632000\t0.2235\t73\nchr22\t46772100\t46772400\t0.0849\t28\nchr22\t46859100\t46860000\t0.0712\t57\nchr22\t47070600\t47070900\t0.4861\t56\nchr22\t47732400\t47732700\t0.2424\t94\nchr22\t48290400\t48290700\t0.0146\t31\nchr22\t48985800\t48991500\t0\t78\nchr22\t49265400\t49266300\t0.1012\t73\nchr22\t49384800\t49385100\t0.0086\t38\nchr22\t49672500\t49672800\t0.2866\t43\nchr22\t49802400\t49802700\t0.368\t62\nchr22\t50028900\t50029500\t0.2043\t119\nchr22\t50643900\t50644200\t0.336\t320\nchr22\t50685600\t50685900\t0.4341\t18\nchr22\t50765100\t50767200\t0.0085\t70\nchr22\t50769000\t50769300\t0.2535\t65\nchr22\t50777400\t50777700\t0.1312\t54\nchr22\t50782800\t50783100\t0.2594\t59\nchr22\t50787300\t50787600\t0.0304\t76\nchr22\t50788800\t50789100\t0.0304\t76\nchr22\t50790600\t50790900\t0.0547\t41\nchr22\t50792400\t50793600\t0.0324\t81\nchr22\t50797800\t50808600\t0\t304\nchr3\t10200\t11100\t0.1615\t113\nchr3\t18600\t18900\t0.0784\t25\nchr3\t134700\t135600\t0.0731\t40\nchr3\t261900\t262500\t0.1039\t172\nchr3\t483000\t483300\t0.1157\t20\nchr3\t698100\t698400\t0.2009\t92\nchr3\t760500\t760800\t0.3758\t76\nchr3\t811800\t813600\t0.0307\t84\nchr3\t876300\t876600\t0.0763\t119\nchr3\t960900\t961500\t0.4311\t43\nchr3\t1391100\t1391700\t0.0479\t96\nchr3\t1392900\t1393500\t0.0479\t96\nchr3\t1565400\t1566000\t0.0939\t56\nchr3\t1596900\t1597200\t0.315\t132\nchr3\t1638600\t1638900\t0.4588\t57\nchr3\t1658100\t1658700\t0.011\t169\nchr3\t1707300\t1707600\t0.1284\t22\nchr3\t2007000\t2008500\t0\t118\nchr3\t2454300\t2454600\t0.0133\t54\nchr3\t3131700\t3132600\t0.0091\t100\nchr3\t3671700\t3672000\t0.2514\t77\nchr3\t3721500\t3721800\t0.1947\t50\nchr3\t3723000\t3723300\t0.3374\t67\nchr3\t3831600\t3831900\t0.2837\t24\nchr3\t3895800\t3896100\t0.2501\t67\nchr3\t3963300\t3969000\t0\t86\nchr3\t4025400\t4027800\t0\t99\nchr3\t4039200\t4039500\t0.2301\t23\nchr3\t4254600\t4257600\t0.0669\t72\nchr3\t4266600\t4266900\t0.1616\t112\nchr3\t4917300\t4922400\t0\t137\nchr3\t6320400\t6320700\t0.3049\t73\nchr3\t6486900\t6487200\t0.111\t78\nchr3\t6699600\t6700200\t0.1861\t61\nchr3\t8335800\t8336400\t0.0154\t71\nchr3\t8412000\t8412300\t0.4486\t34\nchr3\t8612400\t8612700\t0.1351\t37\nchr3\t8613900\t8615400\t0\t109\nchr3\t8616900\t8617500\t0.0136\t89\nchr3\t8655000\t8655300\t0.0952\t28\nchr3\t8719800\t8720100\t0.24\t89\nchr3\t8721300\t8721900\t0.24\t89\nchr3\t8924400\t8924700\t0.182\t32\nchr3\t10052700\t10053300\t0.131\t107\nchr3\t10297800\t10298100\t0.0706\t79\nchr3\t11487300\t11488200\t0.0274\t23\nchr3\t11942700\t11943300\t0.2716\t80\nchr3\t12028800\t12033000\t0.0227\t107\nchr3\t14091600\t14091900\t0.2893\t63\nchr3\t15188100\t15189000\t0.0389\t116\nchr3\t15190500\t15191100\t0.0389\t116\nchr3\t15592800\t15593100\t0.4873\t28\nchr3\t16970400\t16970700\t0.1819\t81\nchr3\t17097000\t17097300\t0.1059\t103\nchr3\t17699100\t17699400\t0.1365\t90\nchr3\t17703900\t17705100\t0.2455\t74\nchr3\t17858700\t17859300\t0.1242\t84\nchr3\t18326100\t18326700\t0.1455\t103\nchr3\t18328800\t18329100\t0.0664\t90\nchr3\t18518100\t18519000\t0.0792\t83\nchr3\t18930900\t18935400\t0\t77\nchr3\t18961200\t18961500\t0.0647\t97\nchr3\t19009800\t19010400\t0.0079\t71\nchr3\t19100700\t19101300\t0.102\t72\nchr3\t19856100\t19856400\t0.1864\t92\nchr3\t19857900\t19858200\t0.1864\t92\nchr3\t20353800\t20354400\t0.105\t78\nchr3\t21250500\t21251100\t0.0249\t100\nchr3\t21278100\t21278400\t0.265\t87\nchr3\t21416100\t21416400\t0.3119\t42\nchr3\t21486000\t21486300\t0.1132\t66\nchr3\t21490800\t21491100\t0.0748\t59\nchr3\t21569100\t21569400\t0.3114\t85\nchr3\t21983400\t21988500\t0\t84\nchr3\t22050900\t22056300\t0\t95\nchr3\t22100100\t22100400\t0.1616\t62\nchr3\t22697400\t22697700\t0.4907\t73\nchr3\t22803000\t22804500\t0.0111\t84\nchr3\t22806600\t22806900\t0.0895\t144\nchr3\t24090000\t24094800\t0\t88\nchr3\t24282300\t24282600\t0.1494\t52\nchr3\t26296200\t26296500\t0.1612\t89\nchr3\t26385000\t26389500\t0\t105\nchr3\t26398200\t26403900\t0\t89\nchr3\t26495100\t26495400\t0.3218\t92\nchr3\t26745300\t26745600\t0.2229\t48\nchr3\t26884200\t26884500\t0.3538\t83\nchr3\t27093000\t27093600\t0\t82\nchr3\t27205200\t27205800\t0.1867\t112\nchr3\t27817500\t27818100\t0.0684\t90\nchr3\t28061700\t28062000\t0.2349\t78\nchr3\t28063200\t28063500\t0.2349\t78\nchr3\t28354500\t28355100\t0.198\t57\nchr3\t28366200\t28366500\t0.0367\t68\nchr3\t28414500\t28419900\t0\t74\nchr3\t28493400\t28494900\t0\t83\nchr3\t28851600\t28851900\t0.2945\t147\nchr3\t29109000\t29111400\t0.0005\t83\nchr3\t30364800\t30365100\t0.1699\t134\nchr3\t30412800\t30414300\t0.035\t91\nchr3\t31965300\t31965600\t0.3812\t18\nchr3\t32279400\t32280000\t0.0847\t102\nchr3\t33511800\t33512700\t0\t93\nchr3\t34413300\t34418400\t0\t100\nchr3\t34653000\t34656600\t0\t91\nchr3\t35902200\t35902800\t0.2433\t83\nchr3\t36066600\t36066900\t0.3308\t46\nchr3\t36104700\t36105300\t0.2951\t84\nchr3\t38081100\t38081700\t0.1864\t78\nchr3\t38341800\t38343000\t0\t67\nchr3\t38388900\t38389500\t0.3282\t77\nchr3\t38406900\t38407200\t0.201\t95\nchr3\t39228000\t39228300\t0.1376\t91\nchr3\t39985200\t39985800\t0.1\t82\nchr3\t40040400\t40042200\t0.1816\t80\nchr3\t40157100\t40157700\t0.1844\t66\nchr3\t40203900\t40204200\t0.006\t351\nchr3\t40219800\t40220100\t0.2086\t113\nchr3\t40239600\t40240200\t0.1\t84\nchr3\t40903200\t40903800\t0.1698\t78\nchr3\t40906200\t40906500\t0.4018\t59\nchr3\t41689800\t41690100\t0.264\t108\nchr3\t41776500\t41779800\t0.0026\t134\nchr3\t42243300\t42243600\t0.2531\t78\nchr3\t42282900\t42283200\t0.1898\t85\nchr3\t42797100\t42799200\t0\t60\nchr3\t42989700\t42990000\t0.295\t44\nchr3\t43065600\t43069200\t0.0059\t109\nchr3\t43486800\t43487100\t0.2352\t85\nchr3\t43568700\t43571100\t0.1767\t83\nchr3\t44750400\t44751000\t0.0447\t55\nchr3\t45133500\t45133800\t0.3028\t47\nchr3\t45726900\t45727200\t0.0744\t30\nchr3\t46151400\t46152000\t0.0887\t99\nchr3\t46495200\t46495500\t0.3215\t77\nchr3\t46773000\t46774500\t0.0041\t93\nchr3\t46783200\t46788600\t0\t101\nchr3\t46801200\t46801800\t0.0069\t63\nchr3\t47259600\t47260200\t0.2729\t73\nchr3\t48055500\t48057600\t0.0415\t92\nchr3\t48210900\t48213000\t0.0045\t86\nchr3\t49456800\t49457100\t0.2502\t37\nchr3\t50084700\t50085000\t0.3501\t55\nchr3\t50887500\t50887800\t0.1505\t63\nchr3\t50897700\t50898000\t0.1061\t53\nchr3\t50973600\t50973900\t0.0895\t73\nchr3\t50976900\t50977200\t0.2671\t62\nchr3\t51204000\t51204600\t0.1295\t76\nchr3\t51863400\t51864900\t0.0144\t67\nchr3\t52675800\t52676100\t0.1508\t32\nchr3\t53365500\t53370600\t0\t99\nchr3\t53923800\t53926200\t0.1434\t94\nchr3\t54394800\t54399900\t0\t96\nchr3\t55046400\t55049700\t0\t62\nchr3\t55137900\t55138500\t0.0188\t92\nchr3\t55140000\t55142100\t0\t50\nchr3\t56514000\t56515500\t0.0439\t79\nchr3\t56543400\t56543700\t0.043\t73\nchr3\t57028200\t57028800\t0.1478\t76\nchr3\t57329400\t57329700\t0.2461\t52\nchr3\t57747300\t57747600\t0.3045\t50\nchr3\t58549200\t58551000\t0.1293\t82\nchr3\t58817400\t58818900\t0.1562\t104\nchr3\t58821900\t58822200\t0.3661\t76\nchr3\t58843800\t58844400\t0.0513\t125\nchr3\t58846800\t58848000\t0.0513\t125\nchr3\t58854900\t58855200\t0.2609\t76\nchr3\t58889700\t58891200\t0.0485\t75\nchr3\t60098100\t60098400\t0.2452\t51\nchr3\t61398900\t61399800\t0.0028\t78\nchr3\t61672200\t61672500\t0.2102\t76\nchr3\t62599500\t62599800\t0.0131\t24\nchr3\t62847300\t62850600\t0.0021\t141\nchr3\t63136800\t63142200\t0\t141\nchr3\t63153300\t63155700\t0\t97\nchr3\t63212100\t63217500\t0\t112\nchr3\t63589800\t63590700\t0.0087\t237\nchr3\t63737400\t63737700\t0.0895\t83\nchr3\t64982100\t64982400\t0.4302\t41\nchr3\t65510400\t65514600\t0.0188\t113\nchr3\t65697300\t65699400\t0.0623\t92\nchr3\t66063600\t66063900\t0.0622\t32\nchr3\t66874200\t66874800\t0.0157\t23\nchr3\t67445100\t67445700\t0.0714\t53\nchr3\t67814400\t67815600\t0.08\t119\nchr3\t68077200\t68077500\t0.1096\t82\nchr3\t69437700\t69438000\t0.0638\t43\nchr3\t70287000\t70289700\t0.1145\t83\nchr3\t71435400\t71436000\t0.1199\t186\nchr3\t74451900\t74452200\t0.3634\t68\nchr3\t74454000\t74454300\t0.1467\t83\nchr3\t74589300\t74589600\t0.1245\t111\nchr3\t74703000\t74703300\t0.0619\t128\nchr3\t74955600\t74955900\t0.0772\t53\nchr3\t74970600\t74970900\t0.1122\t45\nchr3\t75092100\t75096000\t0.0578\t77\nchr3\t75120000\t75120600\t0.085\t147\nchr3\t75121800\t75122100\t0.085\t147\nchr3\t76730700\t76731000\t0.1813\t17\nchr3\t77290500\t77290800\t0.3021\t38\nchr3\t77763900\t77769000\t0\t100\nchr3\t78582600\t78583800\t0.0264\t28\nchr3\t78795900\t78796500\t0.0674\t62\nchr3\t79129800\t79134900\t0\t92\nchr3\t80441400\t80442600\t0.0523\t70\nchr3\t80876400\t80877300\t0\t82\nchr3\t80892900\t80893500\t0.0768\t75\nchr3\t80894700\t80896200\t0.0768\t75\nchr3\t81051600\t81057000\t0\t110\nchr3\t81487800\t81488100\t0.2296\t73\nchr3\t81720900\t81721200\t0.0618\t44\nchr3\t82152900\t82154100\t0.0256\t51\nchr3\t82334400\t82334700\t0.3552\t65\nchr3\t82336200\t82336500\t0.3552\t65\nchr3\t82338300\t82339200\t0.1141\t74\nchr3\t82465200\t82465500\t0.1938\t13\nchr3\t82866900\t82867200\t0.1967\t70\nchr3\t83037900\t83039400\t0\t100\nchr3\t83804100\t83806200\t0\t75\nchr3\t85293300\t85293900\t0.2743\t57\nchr3\t86018100\t86019300\t0.044\t70\nchr3\t86860200\t86860500\t0.1175\t60\nchr3\t87481500\t87482100\t0.1325\t82\nchr3\t87844500\t87844800\t0.0908\t89\nchr3\t88503600\t88503900\t0.3438\t68\nchr3\t88508400\t88508700\t0.179\t94\nchr3\t88872300\t88872900\t0.1663\t92\nchr3\t89346900\t89349600\t0.0094\t88\nchr3\t89460600\t89466600\t0\t136\nchr3\t89610900\t89611200\t0.4693\t35\nchr3\t89869200\t89874000\t0.0022\t91\nchr3\t89961600\t89962200\t0.0181\t109\nchr3\t89984700\t89985000\t0.3441\t52\nchr3\t90156600\t90156900\t0.3752\t93\nchr3\t90169800\t90175200\t0.0053\t202\nchr3\t90303900\t90304200\t0.2483\t49\nchr3\t90334500\t90334800\t0.2837\t75\nchr3\t90336000\t90339300\t0\t94\nchr3\t90406200\t90407100\t0.0956\t105\nchr3\t90510000\t90510300\t0.4989\t409\nchr3\t90514800\t90515700\t0\t62\nchr3\t90525600\t90526200\t0.0064\t70\nchr3\t90533700\t90534000\t0.4972\t218\nchr3\t90559200\t90559500\t0.1323\t55\nchr3\t90564000\t90565200\t0\t45\nchr3\t90568800\t90569400\t0\t40\nchr3\t90582600\t90583200\t0.1733\t299\nchr3\t90585600\t90587100\t0.2994\t168\nchr3\t90588300\t90588600\t0.273\t66\nchr3\t90616200\t90616800\t0.4764\t389\nchr3\t90668700\t90687000\t0.095\t600\nchr3\t90688200\t90711300\t0.1068\t218\nchr3\t90713700\t90720600\t0\t348\nchr3\t90772500\t90777600\t0\t256\nchr3\t90779400\t90783900\t0\t460\nchr3\t90785700\t90817500\t0\t460\nchr3\t90819000\t90826200\t0\t324\nchr3\t90827700\t90829800\t0\t324\nchr3\t90831000\t90832200\t0\t324\nchr3\t90833400\t90843300\t0\t324\nchr3\t90844500\t90847500\t0.1674\t355\nchr3\t90849000\t90861900\t0\t193\nchr3\t90863700\t90881700\t0\t994\nchr3\t90882900\t90885000\t0\t107\nchr3\t90886500\t90887100\t0\t29\nchr3\t90889200\t90889500\t0.0944\t772\nchr3\t90890700\t90891900\t0.0944\t772\nchr3\t90894000\t90895800\t0\t339\nchr3\t90897000\t90898800\t0\t339\nchr3\t90900000\t90903300\t0\t339\nchr3\t90904500\t90917400\t0\t339\nchr3\t90918900\t90929700\t0\t459\nchr3\t90931200\t90941100\t0\t459\nchr3\t90942300\t90948600\t0\t188\nchr3\t90949800\t90950700\t0.0087\t191\nchr3\t90951900\t90961800\t0\t494\nchr3\t90963300\t90975300\t0\t494\nchr3\t90976500\t91012200\t0\t637\nchr3\t91013400\t91019400\t0\t232\nchr3\t91020600\t91026900\t0\t331\nchr3\t91028400\t91039200\t0\t287\nchr3\t91040400\t91045200\t0\t287\nchr3\t91046700\t91050900\t0\t403\nchr3\t91052400\t91057200\t0\t403\nchr3\t91058700\t91059000\t0\t403\nchr3\t91060500\t91061700\t0.0416\t95\nchr3\t91063200\t91063500\t0.0416\t95\nchr3\t91064700\t91067700\t0\t383\nchr3\t91068900\t91072200\t0\t383\nchr3\t91073400\t91075200\t0\t383\nchr3\t91076700\t91077000\t0\t415\nchr3\t91078200\t91085700\t0\t415\nchr3\t91086900\t91103700\t0\t415\nchr3\t91104900\t91105800\t0\t415\nchr3\t91107000\t91108800\t0\t78\nchr3\t91110300\t91110600\t0\t78\nchr3\t91112400\t91115400\t0.0243\t101\nchr3\t91118100\t91122300\t0\t172\nchr3\t91123500\t91125600\t0\t526\nchr3\t91126800\t91136700\t0\t526\nchr3\t91138800\t91149600\t0\t231\nchr3\t91150800\t91152600\t0\t231\nchr3\t91154400\t91155300\t0.0195\t356\nchr3\t91156500\t91156800\t0\t156\nchr3\t91158900\t91164900\t0\t420\nchr3\t91166100\t91166400\t0\t420\nchr3\t91167600\t91171800\t0\t87\nchr3\t91174200\t91180500\t0\t136\nchr3\t91181700\t91183500\t0.1899\t266\nchr3\t91184700\t91197600\t0\t836\nchr3\t91198800\t91201200\t0\t202\nchr3\t91202400\t91208700\t0\t202\nchr3\t91210200\t91210500\t0\t202\nchr3\t91212000\t91212300\t0\t398\nchr3\t91213500\t91220100\t0\t398\nchr3\t91221600\t91221900\t0.2328\t30\nchr3\t91223400\t91225800\t0.023\t38\nchr3\t91229100\t91233900\t0\t115\nchr3\t91235700\t91236600\t0\t81\nchr3\t91238100\t91239600\t0\t374\nchr3\t91241100\t91243200\t0\t374\nchr3\t91244700\t91247400\t0.0248\t343\nchr3\t91248900\t91249500\t0.0016\t56\nchr3\t91256400\t91256700\t0.0758\t62\nchr3\t91260600\t91261200\t0\t18\nchr3\t91262400\t91264500\t0.2464\t68\nchr3\t91277700\t91285800\t0\t210\nchr3\t91385100\t91385700\t0.0246\t46\nchr3\t91392900\t91393200\t0.1413\t61\nchr3\t91394400\t91394700\t0.2454\t67\nchr3\t91543800\t91713900\t0\t2208\nchr3\t91715100\t92704800\t0\t2208\nchr3\t92706000\t93026400\t0\t2208\nchr3\t93027900\t93655500\t0\t1558\nchr3\t93705600\t93713400\t0\t163\nchr3\t93717000\t93717300\t0.2699\t17\nchr3\t93727800\t93728100\t0.4078\t77\nchr3\t93789300\t93791400\t0.0115\t83\nchr3\t94239000\t94240500\t0.271\t84\nchr3\t94749000\t94751100\t0.1558\t74\nchr3\t94850400\t94850700\t0.1895\t73\nchr3\t95803500\t95803800\t0.2133\t68\nchr3\t95805000\t95805300\t0.2133\t68\nchr3\t96079800\t96080100\t0.3002\t74\nchr3\t97599300\t97600500\t0.1935\t85\nchr3\t97642200\t97642500\t0.2918\t36\nchr3\t97906200\t97907700\t0.1516\t84\nchr3\t98466300\t98467800\t0.0842\t74\nchr3\t98835000\t98835600\t0.3452\t44\nchr3\t98836800\t98838600\t0.1642\t62\nchr3\t99273000\t99274200\t0.2275\t86\nchr3\t99318600\t99318900\t0.0277\t36\nchr3\t99363000\t99363300\t0.3046\t103\nchr3\t99371100\t99371400\t0.21\t63\nchr3\t100473300\t100474200\t0.1035\t81\nchr3\t101439000\t101440500\t0.024\t81\nchr3\t101694300\t101694600\t0.1036\t61\nchr3\t101746800\t101747100\t0.1855\t76\nchr3\t101749500\t101750400\t0.2185\t56\nchr3\t101797500\t101798100\t0.0682\t76\nchr3\t102495600\t102495900\t0.1516\t57\nchr3\t103132500\t103132800\t0.3553\t60\nchr3\t103220700\t103226100\t0\t64\nchr3\t103233000\t103236300\t0\t102\nchr3\t103556700\t103562400\t0\t118\nchr3\t105297900\t105298500\t0.0742\t38\nchr3\t105300900\t105301200\t0.4573\t50\nchr3\t105587400\t105592200\t0\t101\nchr3\t106073100\t106073400\t0.333\t20\nchr3\t106110300\t106111200\t0.032\t75\nchr3\t106665900\t106666500\t0.0646\t106\nchr3\t106667700\t106668000\t0.0646\t106\nchr3\t106669800\t106670100\t0.0646\t106\nchr3\t106950600\t106950900\t0.0951\t73\nchr3\t106976100\t106981200\t0.0067\t91\nchr3\t107692800\t107695500\t0.0821\t85\nchr3\t107886000\t107889000\t0.0324\t133\nchr3\t108374700\t108375000\t0.1273\t85\nchr3\t108575400\t108575700\t0.4477\t75\nchr3\t108749400\t108755400\t0\t112\nchr3\t109164000\t109164600\t0.3653\t90\nchr3\t109200000\t109205700\t0\t122\nchr3\t110117700\t110120400\t0\t106\nchr3\t110442900\t110444100\t0.0056\t76\nchr3\t110445600\t110445900\t0.0056\t76\nchr3\t110634000\t110635500\t0.0342\t81\nchr3\t110889900\t110890200\t0.0972\t38\nchr3\t111019800\t111024300\t0.0127\t83\nchr3\t111388200\t111388500\t0.4047\t49\nchr3\t111491700\t111492600\t0.0979\t81\nchr3\t111557100\t111561900\t0\t84\nchr3\t111753300\t111755400\t0.1915\t90\nchr3\t112162800\t112163400\t0.181\t98\nchr3\t112183500\t112184400\t0\t77\nchr3\t112729200\t112729800\t0.4097\t86\nchr3\t113024400\t113025000\t0\t90\nchr3\t113026200\t113029200\t0\t90\nchr3\t113030400\t113033400\t0\t90\nchr3\t114280200\t114280500\t0.1078\t79\nchr3\t114281700\t114282300\t0.1078\t79\nchr3\t114662400\t114662700\t0.2781\t73\nchr3\t114747600\t114747900\t0.2771\t16\nchr3\t115315200\t115315500\t0.1317\t80\nchr3\t116205300\t116205900\t0.0591\t94\nchr3\t116360400\t116365800\t0\t95\nchr3\t116645400\t116645700\t0.0096\t56\nchr3\t116986200\t116986500\t0.2677\t76\nchr3\t117112200\t117112500\t0.3583\t49\nchr3\t118914600\t118915800\t0.0214\t384\nchr3\t118917900\t118920000\t0.0214\t384\nchr3\t119001900\t119003100\t0.0697\t77\nchr3\t119049900\t119050200\t0.1986\t64\nchr3\t119108700\t119109300\t0.0837\t115\nchr3\t120373500\t120377700\t0\t83\nchr3\t120575100\t120580500\t0\t91\nchr3\t121032600\t121033500\t0.0589\t118\nchr3\t121088100\t121089000\t0.0712\t87\nchr3\t121401600\t121401900\t0.355\t42\nchr3\t121455000\t121455600\t0.2073\t88\nchr3\t121933800\t121934100\t0.3336\t72\nchr3\t121937100\t121937400\t0.0666\t77\nchr3\t122042100\t122044500\t0.0079\t103\nchr3\t122046900\t122047200\t0.1114\t83\nchr3\t122134500\t122134800\t0.2949\t66\nchr3\t122164200\t122164500\t0.2129\t61\nchr3\t122670300\t122670600\t0.1885\t65\nchr3\t122780100\t122780400\t0.349\t41\nchr3\t123478800\t123479100\t0.2542\t34\nchr3\t123975300\t123975600\t0.3509\t66\nchr3\t123991200\t123992400\t0.1243\t66\nchr3\t124109700\t124110300\t0.2977\t34\nchr3\t124367100\t124368000\t0.0226\t69\nchr3\t124789500\t124790400\t0\t55\nchr3\t125171400\t125172000\t0.0808\t47\nchr3\t125891400\t125891700\t0.3334\t59\nchr3\t125938800\t125939100\t0.119\t73\nchr3\t125941800\t125942400\t0.0197\t114\nchr3\t125969100\t125969400\t0.0304\t75\nchr3\t126324300\t126326400\t0.0034\t76\nchr3\t126332700\t126337200\t0.0103\t124\nchr3\t127434600\t127434900\t0.0205\t102\nchr3\t128953800\t128956200\t0.0065\t70\nchr3\t129088200\t129090600\t0\t80\nchr3\t129362400\t129363300\t0.3987\t71\nchr3\t130629000\t130634100\t0\t95\nchr3\t130868400\t130869300\t0.3492\t59\nchr3\t130910400\t130912800\t0.0661\t61\nchr3\t131408400\t131410800\t0\t97\nchr3\t131958900\t131959200\t0.4749\t35\nchr3\t132374100\t132375900\t0.1201\t85\nchr3\t132470100\t132470700\t0.0191\t107\nchr3\t132763500\t132763800\t0.3745\t63\nchr3\t132807300\t132809700\t0\t79\nchr3\t132946200\t132951900\t0\t83\nchr3\t133727400\t133727700\t0.1296\t34\nchr3\t133785000\t133786200\t0.0023\t53\nchr3\t134556000\t134556300\t0.159\t77\nchr3\t134955000\t134955600\t0\t36\nchr3\t135025500\t135027000\t0.154\t75\nchr3\t135028500\t135029100\t0.154\t75\nchr3\t135195600\t135196200\t0.2333\t76\nchr3\t135254100\t135254400\t0.0387\t90\nchr3\t135588300\t135590400\t0.026\t102\nchr3\t135660300\t135664500\t0.0002\t84\nchr3\t136227300\t136227600\t0.2087\t82\nchr3\t136479600\t136484100\t0\t82\nchr3\t136875600\t136875900\t0.3474\t66\nchr3\t136963800\t136969500\t0\t97\nchr3\t137043300\t137043600\t0.2604\t66\nchr3\t137094000\t137095800\t0\t84\nchr3\t137152500\t137152800\t0.1806\t69\nchr3\t137353800\t137354400\t0.0016\t83\nchr3\t137455200\t137455500\t0.007\t84\nchr3\t137457000\t137460600\t0.007\t84\nchr3\t137634000\t137638800\t0\t83\nchr3\t138050700\t138051000\t0.4981\t109\nchr3\t139068000\t139068300\t0.3536\t57\nchr3\t139143900\t139144200\t0.0368\t98\nchr3\t139335900\t139336200\t0.0362\t61\nchr3\t139593600\t139593900\t0.1429\t97\nchr3\t140490000\t140490300\t0.4378\t114\nchr3\t140783700\t140784000\t0.1555\t31\nchr3\t141665700\t141666000\t0.4752\t15\nchr3\t141757500\t141761700\t0\t97\nchr3\t142011000\t142011300\t0.0596\t105\nchr3\t142393200\t142393500\t0.2477\t59\nchr3\t143046600\t143046900\t0.236\t56\nchr3\t143085900\t143086200\t0.2698\t55\nchr3\t145253100\t145253400\t0.2421\t62\nchr3\t145494600\t145494900\t0.4577\t62\nchr3\t145822800\t145823100\t0.2276\t73\nchr3\t145928700\t145929600\t0.0174\t71\nchr3\t145930800\t145932900\t0.0859\t128\nchr3\t146097300\t146097600\t0.2049\t62\nchr3\t146732700\t146735100\t0.0033\t214\nchr3\t147108600\t147108900\t0.3218\t85\nchr3\t147727200\t147727500\t0.1788\t38\nchr3\t148430100\t148431300\t0.1373\t76\nchr3\t148563900\t148564200\t0.0246\t61\nchr3\t148565700\t148567500\t0.0246\t61\nchr3\t149829900\t149830800\t0.0023\t61\nchr3\t149838900\t149839500\t0.0336\t73\nchr3\t150493200\t150493500\t0.2986\t36\nchr3\t150616200\t150616500\t0.0796\t81\nchr3\t150819600\t150822000\t0.0012\t94\nchr3\t151245600\t151245900\t0.3025\t74\nchr3\t151887600\t151887900\t0.3013\t60\nchr3\t151898400\t151898700\t0.1282\t68\nchr3\t152594100\t152595300\t0.0473\t74\nchr3\t153240300\t153240600\t0.1275\t67\nchr3\t153510900\t153511200\t0.3162\t98\nchr3\t153999000\t153999300\t0.0924\t97\nchr3\t154911300\t154914600\t0\t91\nchr3\t155119800\t155123700\t0.0161\t91\nchr3\t155210100\t155210400\t0.1638\t80\nchr3\t155471400\t155471700\t0.1555\t73\nchr3\t155472900\t155473200\t0.1765\t81\nchr3\t155474400\t155474700\t0.2504\t49\nchr3\t155506500\t155510700\t0\t78\nchr3\t155929500\t155930100\t0.241\t72\nchr3\t156282600\t156282900\t0.2806\t63\nchr3\t156881700\t156882000\t0.2435\t82\nchr3\t157883400\t157883700\t0.3656\t59\nchr3\t157901700\t157902000\t0.1973\t88\nchr3\t158020500\t158024700\t0\t112\nchr3\t158635500\t158640300\t0.0073\t82\nchr3\t159056400\t159056700\t0.3599\t50\nchr3\t159095400\t159101100\t0\t110\nchr3\t160323000\t160323300\t0.2884\t65\nchr3\t160324800\t160325100\t0.1685\t76\nchr3\t160974600\t160976400\t0.2271\t58\nchr3\t161002500\t161004600\t0.1135\t70\nchr3\t161907600\t161907900\t0.0401\t62\nchr3\t162318900\t162319200\t0.1153\t31\nchr3\t162379500\t162379800\t0.2181\t79\nchr3\t162382800\t162383400\t0.229\t103\nchr3\t162407100\t162408300\t0.0007\t65\nchr3\t162409500\t162409800\t0.0007\t65\nchr3\t163005000\t163005300\t0.1719\t50\nchr3\t163191900\t163192200\t0.4458\t64\nchr3\t163237500\t163242900\t0\t80\nchr3\t163634700\t163636500\t0.0391\t83\nchr3\t164293800\t164296200\t0.0207\t108\nchr3\t164633100\t164633400\t0.3184\t101\nchr3\t164703600\t164706300\t0.0145\t119\nchr3\t165317400\t165317700\t0.2046\t88\nchr3\t165573600\t165573900\t0.0905\t69\nchr3\t165576300\t165576600\t0.3287\t88\nchr3\t165585900\t165587400\t0.1512\t121\nchr3\t165589200\t165589500\t0.1674\t63\nchr3\t166021200\t166021500\t0.3317\t41\nchr3\t166228500\t166230000\t0.0928\t79\nchr3\t166231800\t166232100\t0.0494\t40\nchr3\t167017500\t167018100\t0.2109\t25\nchr3\t167204400\t167204700\t0.2956\t61\nchr3\t167277900\t167278200\t0.3655\t54\nchr3\t167594700\t167596200\t0.2228\t84\nchr3\t167802600\t167802900\t0.1959\t69\nchr3\t168351600\t168354900\t0\t86\nchr3\t168770400\t168772200\t0.1535\t72\nchr3\t169483500\t169483800\t0.2448\t56\nchr3\t169680000\t169685400\t0.0176\t78\nchr3\t170401800\t170402100\t0.082\t26\nchr3\t170805900\t170806500\t0.0894\t546\nchr3\t170879100\t170881500\t0.0537\t99\nchr3\t170927100\t170927400\t0.202\t86\nchr3\t171630300\t171630600\t0.3597\t51\nchr3\t174261300\t174263100\t0.0559\t88\nchr3\t174484200\t174484800\t0.3384\t70\nchr3\t174829800\t174830400\t0.137\t75\nchr3\t175321500\t175321800\t0.222\t80\nchr3\t175436700\t175437600\t0.0397\t89\nchr3\t175782300\t175782600\t0.2201\t73\nchr3\t175784400\t175785600\t0.2136\t69\nchr3\t176827800\t176828100\t0.2027\t99\nchr3\t176831400\t176831700\t0.1108\t98\nchr3\t176925000\t176925300\t0.2587\t86\nchr3\t177389100\t177393900\t0\t96\nchr3\t177660000\t177660300\t0.3122\t92\nchr3\t178720500\t178720800\t0.2911\t67\nchr3\t178782000\t178782300\t0.064\t73\nchr3\t178862400\t178863000\t0.1265\t90\nchr3\t178864500\t178865400\t0.1265\t90\nchr3\t178940400\t178940700\t0.3587\t68\nchr3\t179119500\t179119800\t0.2857\t91\nchr3\t179121300\t179121900\t0.2563\t74\nchr3\t180375000\t180375300\t0.255\t77\nchr3\t181134600\t181134900\t0.2216\t53\nchr3\t181150500\t181150800\t0.3509\t91\nchr3\t182428800\t182430600\t0.086\t98\nchr3\t183174300\t183174900\t0.1633\t83\nchr3\t183234900\t183237900\t0\t89\nchr3\t183607800\t183609600\t0.0879\t58\nchr3\t183738600\t183740100\t0\t82\nchr3\t184753500\t184754700\t0.1754\t31\nchr3\t185003400\t185003700\t0.2002\t74\nchr3\t185230800\t185231700\t0\t48\nchr3\t185562900\t185563500\t0.0663\t83\nchr3\t185565300\t185567400\t0.0663\t83\nchr3\t185569200\t185569800\t0.0152\t77\nchr3\t185571000\t185571300\t0.0152\t77\nchr3\t186864000\t186867300\t0\t41\nchr3\t187108800\t187109100\t0.1874\t47\nchr3\t187413300\t187417800\t0\t111\nchr3\t187424700\t187428600\t0\t64\nchr3\t187863600\t187863900\t0.2476\t46\nchr3\t187866000\t187868100\t0.0104\t106\nchr3\t187892700\t187894800\t0.0159\t117\nchr3\t188544600\t188545200\t0.0565\t30\nchr3\t189020700\t189021000\t0.1641\t52\nchr3\t190287300\t190287600\t0.2128\t56\nchr3\t191043300\t191044500\t0.0141\t103\nchr3\t191863200\t191863500\t0.2387\t53\nchr3\t192138300\t192138600\t0.043\t27\nchr3\t192149400\t192153900\t0.0016\t76\nchr3\t192739200\t192743700\t0.031\t77\nchr3\t192960600\t192960900\t0.0112\t103\nchr3\t192962700\t192963600\t0.0112\t103\nchr3\t193888800\t193889400\t0.1459\t86\nchr3\t194400600\t194401200\t0.0394\t65\nchr3\t194663400\t194663700\t0.2229\t34\nchr3\t195088500\t195088800\t0.2201\t46\nchr3\t195091500\t195093300\t0.0518\t84\nchr3\t195215100\t195217500\t0.0515\t108\nchr3\t195478500\t195488400\t0.0398\t242\nchr3\t195489900\t195492300\t0.0398\t242\nchr3\t195495600\t195504300\t0.0202\t242\nchr3\t195616200\t195618900\t0.109\t155\nchr3\t195624000\t195624900\t0\t139\nchr3\t195626100\t195627000\t0.0673\t134\nchr3\t195631500\t195631800\t0.0409\t100\nchr3\t195635100\t195636900\t0.0276\t103\nchr3\t195639000\t195640800\t0.0507\t112\nchr3\t195644400\t195644700\t0.0046\t243\nchr3\t195650100\t195650400\t0.2865\t122\nchr3\t195651600\t195652200\t0.1548\t119\nchr3\t195658800\t195659100\t0.2807\t112\nchr3\t195662400\t195662700\t0.1629\t123\nchr3\t195667200\t195667800\t0.2635\t82\nchr3\t195670200\t195670500\t0.3124\t51\nchr3\t195681000\t195681900\t0\t139\nchr3\t195713400\t195713700\t0.3956\t160\nchr3\t195723600\t195725700\t0.0018\t111\nchr3\t195776100\t195777900\t0.1591\t102\nchr3\t195786900\t195788100\t0.148\t60\nchr3\t195816000\t195816300\t0.1495\t35\nchr3\t195824400\t195824700\t0.0633\t77\nchr3\t195927900\t195928500\t0.003\t78\nchr3\t195936900\t195937200\t0.041\t96\nchr3\t195952800\t195954000\t0.0002\t141\nchr3\t195967200\t195968100\t0\t125\nchr3\t195981000\t195981300\t0.3603\t120\nchr3\t195985800\t195986400\t0.0411\t144\nchr3\t195989100\t195989400\t0.3314\t108\nchr3\t196271700\t196272000\t0.2113\t44\nchr3\t196761300\t196761600\t0.0092\t67\nchr3\t196784400\t196784700\t0.1014\t62\nchr3\t197030100\t197030400\t0.3693\t65\nchr3\t197132700\t197133000\t0.2253\t56\nchr3\t197436300\t197438400\t0.0399\t81\nchr3\t197459400\t197460000\t0.3224\t367\nchr3\t197622900\t197625300\t0.0517\t139\nchr3\t197627400\t197627700\t0.1689\t95\nchr3\t197631600\t197631900\t0.1802\t65\nchr3\t197633100\t197634000\t0.1709\t95\nchr3\t197635500\t197635800\t0.081\t85\nchr3\t197642400\t197642700\t0.3803\t57\nchr3\t197644200\t197645100\t0.1457\t77\nchr3\t197649300\t197650800\t0.1866\t125\nchr3\t197652900\t197655600\t0\t150\nchr3\t197658300\t197658600\t0.2794\t112\nchr3\t197662800\t197663700\t0.0122\t137\nchr3\t197665200\t197666100\t0\t137\nchr3\t197877000\t197877300\t0.0438\t61\nchr3\t198003600\t198005100\t0\t69\nchr3\t198099900\t198104100\t0.0506\t56\nchr3\t198141600\t198141900\t0.0632\t64\nchr3\t198145800\t198147000\t0.2599\t64\nchr3\t198149400\t198149700\t0.2956\t69\nchr3\t198152100\t198152700\t0.0949\t75\nchr3\t198156000\t198159900\t0\t78\nchr3\t198161100\t198161700\t0\t78\nchr3\t198162900\t198163200\t0.1798\t75\nchr3\t198164400\t198165600\t0.2447\t75\nchr3\t198172200\t198172500\t0.0788\t46\nchr3\t198175200\t198189900\t0\t99\nchr3\t198191400\t198235500\t0\t99\nchr4\t9900\t10200\t0.2781\t50\nchr4\t11400\t11700\t0\t152\nchr4\t12900\t15000\t0\t152\nchr4\t17400\t27300\t0\t222\nchr4\t28800\t29100\t0\t222\nchr4\t30600\t36300\t0\t169\nchr4\t38700\t40800\t0.0266\t204\nchr4\t42300\t44100\t0.1303\t154\nchr4\t46500\t50400\t0.0207\t163\nchr4\t51900\t60300\t0\t216\nchr4\t61800\t68100\t0\t216\nchr4\t731700\t732000\t0.2435\t25\nchr4\t736800\t737100\t0.4942\t39\nchr4\t744900\t747600\t0\t17\nchr4\t758700\t759900\t0\t45\nchr4\t927300\t927600\t0.4274\t40\nchr4\t1095900\t1096500\t0.4014\t53\nchr4\t1145400\t1145700\t0.4971\t33\nchr4\t1278900\t1279200\t0.1125\t34\nchr4\t1397400\t1398600\t0.0603\t231\nchr4\t1434300\t1435800\t0.006\t1045\nchr4\t1441500\t1442100\t0\t134\nchr4\t1520700\t1521000\t0.2427\t29\nchr4\t1545300\t1547100\t0\t47\nchr4\t1625100\t1625400\t0.3357\t27\nchr4\t1707000\t1707300\t0.2036\t89\nchr4\t1827300\t1828500\t0.1111\t60\nchr4\t2430300\t2430600\t0.4865\t36\nchr4\t2511300\t2511600\t0.0818\t48\nchr4\t2808900\t2809200\t0.121\t20\nchr4\t3227400\t3227700\t0.0368\t55\nchr4\t3509400\t3509700\t0.0035\t85\nchr4\t3537000\t3538200\t0.0804\t50\nchr4\t3542400\t3543000\t0.0374\t46\nchr4\t3610500\t3610800\t0.1545\t34\nchr4\t3613500\t3613800\t0.1628\t33\nchr4\t4020000\t4020900\t0.0537\t29\nchr4\t4068600\t4068900\t0.0963\t67\nchr4\t4954800\t4955100\t0.1563\t79\nchr4\t4957200\t4957800\t0.1563\t79\nchr4\t5272200\t5273700\t0.051\t70\nchr4\t5316300\t5317500\t0.0001\t1156\nchr4\t5439000\t5439300\t0.1996\t73\nchr4\t5441700\t5442300\t0.0913\t129\nchr4\t5763600\t5764500\t0.2216\t66\nchr4\t5779500\t5779800\t0.102\t65\nchr4\t6511500\t6512100\t0.4289\t145\nchr4\t6579000\t6579300\t0.3907\t132\nchr4\t6879900\t6880200\t0.2808\t98\nchr4\t7090500\t7090800\t0.1894\t50\nchr4\t7363500\t7364100\t0.0795\t38\nchr4\t7386900\t7387500\t0.0186\t40\nchr4\t7449000\t7449300\t0.2517\t35\nchr4\t7835400\t7835700\t0.2975\t54\nchr4\t7994100\t7995000\t0.0634\t73\nchr4\t8620200\t8637000\t0\t269\nchr4\t9084900\t9085200\t0.1985\t60\nchr4\t9203700\t9204000\t0.0566\t17\nchr4\t9211200\t9211500\t0\t30\nchr4\t9213000\t9273000\t0\t799\nchr4\t9322800\t9369000\t0\t1454\nchr4\t9613800\t9617700\t0\t36\nchr4\t10776900\t10778400\t0.2195\t62\nchr4\t10827000\t10827300\t0.2107\t76\nchr4\t11015400\t11015700\t0.2593\t54\nchr4\t11016900\t11017200\t0.2593\t54\nchr4\t11063400\t11063700\t0.1987\t105\nchr4\t11064900\t11065200\t0.1987\t105\nchr4\t11145000\t11145300\t0.3796\t62\nchr4\t11148000\t11148300\t0.0246\t60\nchr4\t11169600\t11169900\t0.0876\t54\nchr4\t11238300\t11238600\t0.1526\t62\nchr4\t11381400\t11382600\t0.1576\t73\nchr4\t11560500\t11560800\t0.3806\t99\nchr4\t11793600\t11793900\t0.1851\t73\nchr4\t11797500\t11797800\t0.2903\t91\nchr4\t12345300\t12345600\t0.1573\t83\nchr4\t12509400\t12510000\t0.0685\t68\nchr4\t12753300\t12753600\t0.1248\t81\nchr4\t12906300\t12908100\t0\t61\nchr4\t13131600\t13132800\t0.0683\t63\nchr4\t13663200\t13663500\t0.2074\t100\nchr4\t14010000\t14013300\t0.08\t76\nchr4\t14486100\t14486400\t0.3465\t75\nchr4\t14661900\t14662500\t0.255\t60\nchr4\t14664000\t14664300\t0.255\t60\nchr4\t14755200\t14761200\t0\t98\nchr4\t15280200\t15281700\t0.1033\t81\nchr4\t15283200\t15284100\t0.0631\t85\nchr4\t15791700\t15792300\t0.0105\t85\nchr4\t15841800\t15847500\t0\t97\nchr4\t15867600\t15867900\t0.073\t73\nchr4\t16392600\t16392900\t0.3021\t79\nchr4\t16422300\t16422600\t0.2703\t67\nchr4\t16942800\t16949100\t0\t85\nchr4\t17459100\t17459700\t0.3945\t60\nchr4\t17850000\t17850300\t0.2317\t61\nchr4\t17940300\t17940600\t0.1593\t148\nchr4\t18175500\t18175800\t0.0996\t75\nchr4\t18177000\t18177600\t0.0996\t75\nchr4\t18966000\t18966300\t0.2257\t68\nchr4\t19008300\t19008600\t0.098\t86\nchr4\t19077900\t19083900\t0\t94\nchr4\t19168800\t19169100\t0.1763\t75\nchr4\t19226100\t19226400\t0.332\t10\nchr4\t19335300\t19337100\t0.0499\t76\nchr4\t19520100\t19520400\t0.2492\t27\nchr4\t19639800\t19640100\t0.0648\t81\nchr4\t19949100\t19950000\t0.0251\t81\nchr4\t19951200\t19951800\t0.0251\t81\nchr4\t20518500\t20518800\t0.2677\t24\nchr4\t20661000\t20661300\t0.1187\t125\nchr4\t20669700\t20670900\t0.2886\t91\nchr4\t21159300\t21165300\t0\t122\nchr4\t21582000\t21582300\t0.3195\t190\nchr4\t22107000\t22107600\t0.0922\t80\nchr4\t22148700\t22149900\t0.2227\t89\nchr4\t23099100\t23099400\t0.0688\t57\nchr4\t23615100\t23620800\t0\t104\nchr4\t23645100\t23645400\t0.1956\t59\nchr4\t26166000\t26167800\t0.1502\t91\nchr4\t26209500\t26209800\t0.424\t89\nchr4\t26592600\t26592900\t0.4317\t97\nchr4\t26736000\t26736300\t0.1996\t34\nchr4\t26923500\t26927700\t0\t116\nchr4\t27072000\t27072300\t0.1606\t67\nchr4\t27376500\t27381600\t0.0002\t88\nchr4\t29531700\t29532000\t0.2088\t46\nchr4\t30278100\t30278700\t0.3794\t61\nchr4\t30886200\t30886500\t0.2307\t91\nchr4\t31491300\t31491600\t0.2074\t51\nchr4\t31818600\t31818900\t0.4431\t27\nchr4\t31967100\t31967700\t0.1382\t53\nchr4\t32126700\t32127000\t0.2877\t53\nchr4\t32360700\t32361600\t0.0387\t95\nchr4\t32364000\t32364300\t0.0387\t95\nchr4\t32517000\t32518200\t0.1578\t78\nchr4\t34654800\t34655100\t0.1774\t105\nchr4\t35323500\t35323800\t0.3191\t69\nchr4\t35606400\t35606700\t0.2681\t52\nchr4\t36468300\t36468600\t0.0354\t19\nchr4\t36841200\t36841500\t0.245\t22\nchr4\t36906600\t36906900\t0.3776\t63\nchr4\t37103400\t37105200\t0.0197\t94\nchr4\t37330800\t37331400\t0.3312\t59\nchr4\t37558800\t37559400\t0.1653\t47\nchr4\t37585200\t37585500\t0.4557\t43\nchr4\t37884000\t37884300\t0.37\t20\nchr4\t39001800\t39002100\t0.233\t26\nchr4\t39297000\t39297600\t0.2686\t58\nchr4\t40764900\t40765500\t0.1398\t71\nchr4\t40766700\t40767000\t0.3363\t72\nchr4\t41237100\t41237400\t0.314\t57\nchr4\t42982200\t42983400\t0.1021\t69\nchr4\t43185300\t43185900\t0.2291\t28\nchr4\t43213500\t43214100\t0.1119\t45\nchr4\t43287300\t43289400\t0\t116\nchr4\t43415100\t43415700\t0.2555\t92\nchr4\t43817700\t43818300\t0.0464\t61\nchr4\t44076300\t44076900\t0.3027\t52\nchr4\t44079300\t44079900\t0.2373\t47\nchr4\t44505300\t44505600\t0.0021\t24\nchr4\t44507400\t44507700\t0.3305\t13\nchr4\t44975100\t44976900\t0.0255\t73\nchr4\t45023400\t45024000\t0\t17\nchr4\t45511500\t45511800\t0.2171\t77\nchr4\t45824400\t45825000\t0.2008\t71\nchr4\t46053900\t46056000\t0\t87\nchr4\t46795200\t46797000\t0.0185\t70\nchr4\t48052200\t48057600\t0\t95\nchr4\t48363000\t48364800\t0.03\t55\nchr4\t48414600\t48417600\t0\t74\nchr4\t48735000\t48735900\t0.1055\t88\nchr4\t48918900\t48919200\t0.2376\t79\nchr4\t49091100\t49156800\t0.001\t43802\nchr4\t49159200\t49159500\t0.3246\t149\nchr4\t49161900\t49162200\t0.2231\t94\nchr4\t49164600\t49164900\t0.1845\t67\nchr4\t49180500\t49182000\t0.1185\t144\nchr4\t49183200\t49183500\t0.1185\t144\nchr4\t49184700\t49186200\t0.1185\t144\nchr4\t49189200\t49189500\t0.2207\t118\nchr4\t49203000\t49203300\t0.1695\t190\nchr4\t49230600\t49230900\t0.3408\t185\nchr4\t49244100\t49244400\t0.1178\t137\nchr4\t49246500\t49246800\t0.0829\t188\nchr4\t49248300\t49252500\t0.0829\t188\nchr4\t49257000\t49257300\t0.1238\t161\nchr4\t49259100\t49260600\t0.1238\t161\nchr4\t49263300\t49265100\t0.001\t262\nchr4\t49266900\t49269900\t0.001\t262\nchr4\t49273200\t49286700\t0\t315\nchr4\t49290000\t49292700\t0.0474\t222\nchr4\t49295400\t49295700\t0.2801\t65\nchr4\t49297500\t49299000\t0.2199\t154\nchr4\t49300500\t49300800\t0\t304\nchr4\t49302900\t49306500\t0\t304\nchr4\t49309200\t49312200\t0\t178\nchr4\t49316700\t49318800\t0.0056\t306\nchr4\t49320000\t49320300\t0.0056\t306\nchr4\t49323900\t49337100\t0\t230\nchr4\t49488000\t49488300\t0.2707\t67\nchr4\t49492800\t49493100\t0.1612\t99\nchr4\t49509300\t49509900\t0.1738\t96\nchr4\t49520400\t49524000\t0.0637\t144\nchr4\t49527300\t49528200\t0.0268\t106\nchr4\t49529400\t49531500\t0.1157\t195\nchr4\t49533900\t49534200\t0.2821\t101\nchr4\t49536600\t49538100\t0.0278\t143\nchr4\t49540800\t49541100\t0.0278\t143\nchr4\t49544400\t49545000\t0.0278\t143\nchr4\t49546200\t49546800\t0.0278\t143\nchr4\t49551300\t49551600\t0.3241\t161\nchr4\t49563300\t49564800\t0.2924\t108\nchr4\t49571700\t49572000\t0.1389\t66\nchr4\t49582500\t49583100\t0.0197\t138\nchr4\t49589100\t49589400\t0.2993\t87\nchr4\t49593000\t49598400\t0\t164\nchr4\t49601400\t49601700\t0.2025\t34\nchr4\t49604700\t49605000\t0.2034\t38\nchr4\t49610400\t49611000\t0.2757\t123\nchr4\t49612500\t49612800\t0.2757\t123\nchr4\t49615200\t49615500\t0.2757\t123\nchr4\t49617300\t49617600\t0.3097\t128\nchr4\t49628400\t49628700\t0.156\t176\nchr4\t49631100\t49654200\t0.0631\t9574\nchr4\t49655700\t49658100\t0.2271\t2152\nchr4\t49708200\t49718700\t0\t21389\nchr4\t49720500\t49730700\t0\t889\nchr4\t49732200\t49732500\t0.0265\t285\nchr4\t49733700\t49753200\t0\t2664\nchr4\t49754400\t49920000\t0\t2664\nchr4\t49921500\t50156100\t0\t2664\nchr4\t50157600\t50196900\t0\t252\nchr4\t50200800\t50670300\t0\t3717\nchr4\t50671500\t50829000\t0\t9189\nchr4\t50830500\t51028500\t0\t9189\nchr4\t51029700\t51047400\t0\t950\nchr4\t51048600\t51123600\t0\t2549\nchr4\t51124800\t51141600\t0\t916\nchr4\t51143400\t51187500\t0\t872\nchr4\t51188700\t51368700\t0\t872\nchr4\t51369900\t51396900\t0\t872\nchr4\t51398400\t51405300\t0\t184\nchr4\t51406500\t51454200\t0\t3549\nchr4\t51455400\t51520500\t0\t3549\nchr4\t51521700\t51627900\t0\t3549\nchr4\t51629100\t51743400\t0\t928\nchr4\t51793800\t51814500\t0\t450\nchr4\t52219800\t52220100\t0.1692\t40\nchr4\t52539000\t52544100\t0.01\t108\nchr4\t52816500\t52822500\t0.0025\t115\nchr4\t53567100\t53567400\t0.1056\t91\nchr4\t53569200\t53569500\t0.2214\t100\nchr4\t53726400\t53727000\t0.0328\t57\nchr4\t53737500\t53738100\t0.0118\t56\nchr4\t53882700\t53883000\t0.2611\t95\nchr4\t54922500\t54923100\t0.1869\t65\nchr4\t55058400\t55058700\t0.1252\t75\nchr4\t55620000\t55625100\t0\t89\nchr4\t55847100\t55847400\t0.1322\t85\nchr4\t56248800\t56249100\t0.2809\t47\nchr4\t56366700\t56367000\t0.3454\t79\nchr4\t57562500\t57567900\t0.0306\t103\nchr4\t57644100\t57644700\t0.1123\t81\nchr4\t57790500\t57790800\t0.205\t74\nchr4\t57856200\t57856500\t0.2319\t65\nchr4\t57869100\t57869400\t0.347\t14\nchr4\t58021200\t58022100\t0.1089\t83\nchr4\t58229400\t58229700\t0.1209\t58\nchr4\t58576800\t58577700\t0.0011\t71\nchr4\t58778100\t58778400\t0.2305\t72\nchr4\t59079000\t59084700\t0\t87\nchr4\t59184300\t59184600\t0.1167\t46\nchr4\t59301600\t59301900\t0.21\t75\nchr4\t59304300\t59304600\t0.2236\t67\nchr4\t59519100\t59519400\t0.1063\t35\nchr4\t59720700\t59721000\t0.1531\t71\nchr4\t60104700\t60105600\t0\t88\nchr4\t60122400\t60122700\t0.005\t190\nchr4\t60423600\t60423900\t0.252\t96\nchr4\t60591900\t60592200\t0.1801\t64\nchr4\t60703500\t60703800\t0.1548\t23\nchr4\t60833700\t60835200\t0.1987\t123\nchr4\t61367700\t61368000\t0.186\t77\nchr4\t61643700\t61644000\t0.4732\t54\nchr4\t61939800\t61945500\t0\t89\nchr4\t62604600\t62606100\t0.2065\t90\nchr4\t62607600\t62607900\t0.4291\t76\nchr4\t62727000\t62731800\t0.0073\t96\nchr4\t63328800\t63329100\t0.093\t13\nchr4\t63534600\t63534900\t0.166\t86\nchr4\t63536400\t63536700\t0.166\t86\nchr4\t63576900\t63577200\t0.3515\t30\nchr4\t63654300\t63654600\t0.1464\t66\nchr4\t63918000\t63918300\t0.1746\t40\nchr4\t64237500\t64237800\t0.1534\t70\nchr4\t64666500\t64666800\t0.1647\t23\nchr4\t64841100\t64842000\t0\t71\nchr4\t64860900\t64863000\t0\t82\nchr4\t64900200\t64900800\t0.1098\t92\nchr4\t65053800\t65054100\t0.4081\t68\nchr4\t65180400\t65180700\t0.079\t55\nchr4\t65289300\t65289600\t0.2466\t60\nchr4\t65293200\t65293500\t0.2466\t60\nchr4\t65994900\t65995800\t0.2327\t57\nchr4\t66711900\t66712200\t0.4857\t62\nchr4\t67178400\t67178700\t0.0438\t62\nchr4\t67179900\t67180800\t0.0438\t62\nchr4\t67182000\t67182900\t0.0413\t72\nchr4\t67398600\t67399500\t0.0077\t34\nchr4\t67888200\t67889100\t0\t77\nchr4\t67967700\t67968900\t0.1244\t109\nchr4\t67970400\t67971300\t0.0245\t88\nchr4\t68094000\t68094300\t0.1145\t29\nchr4\t68171100\t68171400\t0.4629\t30\nchr4\t68198100\t68204700\t0\t58\nchr4\t68511000\t68513100\t0\t72\nchr4\t68514300\t68514600\t0\t72\nchr4\t68560500\t68560800\t0.2225\t20\nchr4\t69232200\t69232800\t0.391\t53\nchr4\t69270300\t69270900\t0.0061\t56\nchr4\t69368100\t69368400\t0.1465\t47\nchr4\t69379200\t69379800\t0.0825\t53\nchr4\t69666900\t69667500\t0.2255\t87\nchr4\t70329000\t70334100\t0\t92\nchr4\t71056200\t71056500\t0.1389\t67\nchr4\t71103900\t71106000\t0.0188\t90\nchr4\t71114700\t71115000\t0.3155\t53\nchr4\t71422200\t71422500\t0.2376\t80\nchr4\t72129300\t72129900\t0.0412\t67\nchr4\t72400500\t72400800\t0.241\t65\nchr4\t73554300\t73554600\t0.2823\t104\nchr4\t74248500\t74248800\t0.2057\t69\nchr4\t74562900\t74563200\t0.4054\t36\nchr4\t74717700\t74723700\t0\t80\nchr4\t75128100\t75128700\t0.1795\t78\nchr4\t75132000\t75132600\t0.179\t98\nchr4\t75270600\t75270900\t0\t39\nchr4\t75272400\t75272700\t0\t39\nchr4\t75273900\t75275100\t0\t39\nchr4\t75406200\t75406500\t0.2535\t66\nchr4\t75444300\t75446400\t0.0304\t92\nchr4\t76828500\t76829700\t0\t66\nchr4\t76916100\t76918800\t0.0241\t120\nchr4\t77514300\t77514600\t0.1331\t88\nchr4\t77685600\t77685900\t0.2256\t72\nchr4\t78106200\t78111600\t0\t88\nchr4\t78306300\t78306600\t0.1893\t32\nchr4\t78348000\t78354000\t0\t90\nchr4\t79221300\t79221900\t0.1587\t89\nchr4\t79269000\t79271400\t0\t90\nchr4\t79284600\t79284900\t0.2386\t37\nchr4\t79556400\t79556700\t0.1338\t45\nchr4\t79704900\t79710300\t0\t91\nchr4\t79938000\t79943700\t0\t113\nchr4\t79967400\t79972800\t0\t103\nchr4\t80381400\t80381700\t0\t18\nchr4\t80691000\t80691300\t0.195\t37\nchr4\t80890500\t80890800\t0.4367\t115\nchr4\t81536700\t81537300\t0.2199\t71\nchr4\t81594000\t81594300\t0.3575\t116\nchr4\t82008300\t82010100\t0.0047\t67\nchr4\t83184600\t83186100\t0.1103\t82\nchr4\t83649600\t83649900\t0.1854\t25\nchr4\t83953800\t83954700\t0.1521\t83\nchr4\t84075000\t84075300\t0.0488\t111\nchr4\t84076800\t84078300\t0.0488\t111\nchr4\t84130500\t84131400\t0.0627\t81\nchr4\t84299400\t84299700\t0.2986\t66\nchr4\t84303000\t84303300\t0.3856\t84\nchr4\t84759600\t84761100\t0.3105\t109\nchr4\t85891200\t85893600\t0\t69\nchr4\t86137500\t86138700\t0.0054\t94\nchr4\t86251500\t86254500\t0.0085\t92\nchr4\t86637600\t86637900\t0.2425\t72\nchr4\t86865300\t86865900\t0.2133\t57\nchr4\t86868600\t86868900\t0.451\t74\nchr4\t86996400\t86996700\t0.2884\t79\nchr4\t87347100\t87353100\t0\t84\nchr4\t87563100\t87565200\t0\t87\nchr4\t87711000\t87711300\t0.2268\t52\nchr4\t87714000\t87715500\t0.0475\t76\nchr4\t87796200\t87797400\t0.0861\t80\nchr4\t88116600\t88116900\t0.247\t31\nchr4\t88161300\t88161900\t0.0066\t97\nchr4\t88551300\t88551600\t0.1953\t78\nchr4\t88895400\t88896000\t0.2531\t78\nchr4\t90154500\t90154800\t0.1176\t79\nchr4\t90675600\t90681600\t0\t90\nchr4\t91137300\t91138800\t0.0605\t110\nchr4\t91239300\t91241100\t0\t33\nchr4\t91787100\t91789200\t0.149\t94\nchr4\t91790400\t91790700\t0.2279\t96\nchr4\t91978500\t91983900\t0\t97\nchr4\t92133000\t92133300\t0.4841\t130\nchr4\t92955000\t92955300\t0.1761\t98\nchr4\t93593400\t93593700\t0.3237\t57\nchr4\t93609000\t93613800\t0\t100\nchr4\t93638400\t93644400\t0\t72\nchr4\t93682200\t93682500\t0.2997\t72\nchr4\t93884100\t93884400\t0.0713\t84\nchr4\t94794900\t94795200\t0.1894\t98\nchr4\t94836900\t94839300\t0.1464\t71\nchr4\t95173200\t95173500\t0.1798\t81\nchr4\t95916000\t95918700\t0.1607\t101\nchr4\t95920200\t95920500\t0.2176\t76\nchr4\t96402600\t96402900\t0.1237\t75\nchr4\t96797100\t96797700\t0.1224\t77\nchr4\t96869400\t96871200\t0.1613\t105\nchr4\t97638600\t97638900\t0.1789\t56\nchr4\t97669500\t97669800\t0.0694\t33\nchr4\t97780200\t97780500\t0.0035\t59\nchr4\t97798500\t97799100\t0.0266\t70\nchr4\t98320800\t98323800\t0.1043\t73\nchr4\t98591400\t98598000\t0.0008\t126\nchr4\t98880300\t98880600\t0.0172\t48\nchr4\t99149100\t99149400\t0.383\t24\nchr4\t99769200\t99769500\t0.3091\t53\nchr4\t100001100\t100005300\t0\t84\nchr4\t100046700\t100048200\t0.0947\t88\nchr4\t100677300\t100677600\t0.1336\t49\nchr4\t100718100\t100719000\t0.1168\t76\nchr4\t101406600\t101407200\t0.0844\t65\nchr4\t101749500\t101750100\t0.0212\t25\nchr4\t101866800\t101867100\t0.1737\t65\nchr4\t102044400\t102045000\t0.0486\t103\nchr4\t102205200\t102210300\t0.0078\t88\nchr4\t102221100\t102221400\t0.0709\t45\nchr4\t102409500\t102409800\t0.4324\t29\nchr4\t102463800\t102464100\t0.1842\t45\nchr4\t102951900\t102954300\t0\t81\nchr4\t103688400\t103688700\t0.1973\t85\nchr4\t103817100\t103818300\t0.2059\t39\nchr4\t104442300\t104442600\t0.202\t106\nchr4\t104688600\t104692200\t0.0812\t91\nchr4\t104792400\t104792700\t0.1034\t72\nchr4\t104803200\t104804700\t0.0917\t49\nchr4\t105307500\t105308700\t0.0148\t73\nchr4\t105340200\t105340500\t0.2954\t69\nchr4\t105986700\t105987000\t0.1153\t70\nchr4\t106121100\t106121400\t0.3648\t76\nchr4\t106218600\t106218900\t0.2072\t69\nchr4\t106571700\t106576800\t0\t108\nchr4\t106638600\t106639800\t0.0341\t85\nchr4\t106937100\t106938300\t0.2497\t78\nchr4\t107082900\t107083500\t0.021\t106\nchr4\t107206800\t107210400\t0\t82\nchr4\t107222700\t107223300\t0.1654\t35\nchr4\t107307600\t107308500\t0.2868\t46\nchr4\t107355600\t107357100\t0\t77\nchr4\t108410100\t108410400\t0.1102\t90\nchr4\t109596000\t109596300\t0.0292\t102\nchr4\t110407200\t110409000\t0.0164\t82\nchr4\t110462100\t110462400\t0.1324\t32\nchr4\t110688000\t110688300\t0.3275\t58\nchr4\t110690700\t110691000\t0.121\t46\nchr4\t110757900\t110758800\t0.0798\t63\nchr4\t110871600\t110871900\t0.2555\t65\nchr4\t110873400\t110874300\t0.1828\t65\nchr4\t111339600\t111339900\t0.337\t71\nchr4\t111341400\t111342600\t0.0978\t59\nchr4\t111459000\t111460500\t0.1175\t81\nchr4\t111895800\t111901500\t0\t91\nchr4\t111965700\t111966000\t0.0945\t69\nchr4\t112092000\t112092300\t0.2051\t67\nchr4\t113064900\t113065200\t0.09\t22\nchr4\t113489700\t113491500\t0.2235\t76\nchr4\t113854200\t113854500\t0.2331\t133\nchr4\t113930700\t113931000\t0.2717\t73\nchr4\t115009800\t115010100\t0.2131\t39\nchr4\t116204100\t116206200\t0.0315\t66\nchr4\t116407800\t116408100\t0.199\t65\nchr4\t116686500\t116686800\t0.1493\t75\nchr4\t116775300\t116775600\t0.1555\t119\nchr4\t117924600\t117924900\t0.2564\t82\nchr4\t118066200\t118066500\t0\t17\nchr4\t118162800\t118163100\t0.4349\t77\nchr4\t118427100\t118427400\t0.1379\t48\nchr4\t118602600\t118602900\t0.3318\t57\nchr4\t118608600\t118609200\t0.0108\t59\nchr4\t118614300\t118614900\t0.1964\t61\nchr4\t118616100\t118616400\t0.1846\t81\nchr4\t118618800\t118619100\t0.2282\t66\nchr4\t118621800\t118624500\t0.0002\t84\nchr4\t118647300\t118647600\t0.2587\t71\nchr4\t118652700\t118653300\t0.1754\t66\nchr4\t118654800\t118655100\t0.1754\t66\nchr4\t118662600\t118662900\t0.0507\t72\nchr4\t118689600\t118689900\t0.4952\t121\nchr4\t119063400\t119063700\t0.4147\t55\nchr4\t119077800\t119078100\t0.1186\t62\nchr4\t119274600\t119279100\t0.0106\t75\nchr4\t119342700\t119343300\t0.0482\t77\nchr4\t119414400\t119416500\t0.0644\t74\nchr4\t119417700\t119418900\t0\t58\nchr4\t119421000\t119421600\t0.0195\t78\nchr4\t119424000\t119424300\t0.0195\t78\nchr4\t119425500\t119426100\t0.0195\t78\nchr4\t119428500\t119430000\t0.0195\t78\nchr4\t119431200\t119431800\t0.0195\t78\nchr4\t119435400\t119435700\t0.303\t57\nchr4\t119457600\t119457900\t0.2121\t74\nchr4\t119886900\t119887200\t0.236\t77\nchr4\t119949000\t119954400\t0\t111\nchr4\t120128100\t120128400\t0.2208\t74\nchr4\t120255300\t120255600\t0.3391\t63\nchr4\t120743400\t120743700\t0.1407\t83\nchr4\t120744900\t120745800\t0.2316\t75\nchr4\t121128900\t121129200\t0.2897\t69\nchr4\t121310700\t121311000\t0.1227\t61\nchr4\t122112900\t122113500\t0.2885\t92\nchr4\t122115300\t122115600\t0.3389\t93\nchr4\t122332800\t122333400\t0.0359\t63\nchr4\t122497800\t122498100\t0.2823\t65\nchr4\t122652900\t122656800\t0\t83\nchr4\t123000600\t123001200\t0.1228\t54\nchr4\t123723000\t123723300\t0.2151\t100\nchr4\t124022700\t124023900\t0.0008\t65\nchr4\t124152900\t124155000\t0\t98\nchr4\t124232100\t124232400\t0.2423\t64\nchr4\t124406100\t124407900\t0.122\t90\nchr4\t125257500\t125257800\t0.2293\t83\nchr4\t126928800\t126933300\t0.0894\t103\nchr4\t127022400\t127026300\t0.0136\t94\nchr4\t127064400\t127064700\t0.3237\t79\nchr4\t127590300\t127590600\t0.1887\t91\nchr4\t127591800\t127592100\t0.1887\t91\nchr4\t127593900\t127594200\t0.2128\t80\nchr4\t127652400\t127652700\t0.1134\t103\nchr4\t127863000\t127863300\t0.1891\t90\nchr4\t128214600\t128219700\t0\t80\nchr4\t128647500\t128647800\t0.1174\t74\nchr4\t129295500\t129298200\t0\t80\nchr4\t129855000\t129855600\t0.2029\t80\nchr4\t129878700\t129879000\t0.2256\t80\nchr4\t129964500\t129964800\t0.2581\t77\nchr4\t130016400\t130019700\t0.0018\t79\nchr4\t130425000\t130425300\t0.175\t201\nchr4\t131201400\t131202300\t0\t64\nchr4\t131724000\t131724600\t0.0596\t91\nchr4\t131726400\t131726700\t0.0438\t101\nchr4\t131731500\t131731800\t0.4342\t70\nchr4\t131733900\t131742000\t0\t211\nchr4\t131744100\t131749200\t0\t298\nchr4\t131751000\t131762400\t0\t298\nchr4\t131763600\t131764200\t0\t298\nchr4\t131890200\t131890500\t0.402\t46\nchr4\t132632400\t132633000\t0.4682\t64\nchr4\t132635700\t132636000\t0.1058\t53\nchr4\t132898500\t132898800\t0.2554\t25\nchr4\t132945300\t132946500\t0.2199\t82\nchr4\t132948000\t132950100\t0.0342\t82\nchr4\t133735800\t133736100\t0.1904\t78\nchr4\t133786800\t133787700\t0.0458\t74\nchr4\t134209500\t134209800\t0.1642\t51\nchr4\t134590200\t134590800\t0\t20\nchr4\t135079800\t135085200\t0.0008\t75\nchr4\t135179700\t135180000\t0.1925\t58\nchr4\t135451800\t135452700\t0.0089\t67\nchr4\t136293600\t136299600\t0\t100\nchr4\t137167500\t137167800\t0.4015\t80\nchr4\t137497500\t137499300\t0.0793\t88\nchr4\t137501700\t137502000\t0.0793\t88\nchr4\t137843700\t137844000\t0.3399\t39\nchr4\t138547800\t138552300\t0\t87\nchr4\t138854700\t138855000\t0.2474\t69\nchr4\t138881700\t138882000\t0.2095\t68\nchr4\t139428600\t139430100\t0.1132\t92\nchr4\t139944600\t139944900\t0.199\t73\nchr4\t140318400\t140318700\t0.1328\t70\nchr4\t140415600\t140417700\t0.0857\t107\nchr4\t140779800\t140780400\t0.0075\t80\nchr4\t140895900\t140896500\t0.0105\t67\nchr4\t140956800\t140957100\t0.3054\t58\nchr4\t141068700\t141069600\t0.1315\t116\nchr4\t141182100\t141183000\t0.0018\t93\nchr4\t141877800\t141879000\t0.1222\t62\nchr4\t141882000\t141882300\t0.2811\t67\nchr4\t142137300\t142137600\t0.1079\t38\nchr4\t142525500\t142525800\t0.0483\t48\nchr4\t142624800\t142625100\t0.2853\t77\nchr4\t143100600\t143106000\t0\t74\nchr4\t143809800\t143811300\t0.0115\t74\nchr4\t143877900\t143878200\t0.2561\t64\nchr4\t143884200\t143889000\t0.0092\t61\nchr4\t143892900\t143893200\t0.3023\t39\nchr4\t143998500\t143998800\t0.2594\t81\nchr4\t144126600\t144126900\t0.1542\t35\nchr4\t144128400\t144128700\t0.0479\t15\nchr4\t144748200\t144748500\t0.1056\t65\nchr4\t144810300\t144810900\t0.0301\t104\nchr4\t145370700\t145371000\t0.1312\t31\nchr4\t145372200\t145374000\t0\t71\nchr4\t146351700\t146355000\t0.1103\t75\nchr4\t146619000\t146622000\t0.0683\t100\nchr4\t146666400\t146667000\t0.1273\t94\nchr4\t147358200\t147358500\t0.3922\t24\nchr4\t147452100\t147453300\t0.0456\t59\nchr4\t147783900\t147784200\t0.0162\t216\nchr4\t147905400\t147905700\t0.0643\t35\nchr4\t148322400\t148322700\t0.3993\t71\nchr4\t149130300\t149130600\t0.1597\t92\nchr4\t149817000\t149817300\t0.2803\t96\nchr4\t149853000\t149853600\t0.2632\t74\nchr4\t149917800\t149918400\t0.168\t107\nchr4\t150030000\t150030300\t0.2575\t30\nchr4\t150291300\t150291600\t0.023\t83\nchr4\t150638700\t150639000\t0.0428\t92\nchr4\t150659100\t150660900\t0\t75\nchr4\t151391400\t151391700\t0.3133\t72\nchr4\t151419600\t151420200\t0.001\t60\nchr4\t155282100\t155285700\t0\t95\nchr4\t155538600\t155538900\t0\t11\nchr4\t156048600\t156049800\t0.0017\t105\nchr4\t156285000\t156285300\t0.1407\t72\nchr4\t156304800\t156305400\t0.0154\t98\nchr4\t156371100\t156371700\t0.0072\t85\nchr4\t157635900\t157636200\t0.116\t56\nchr4\t158084400\t158085000\t0.0188\t78\nchr4\t158086500\t158086800\t0.1073\t93\nchr4\t158088600\t158088900\t0.208\t81\nchr4\t158433000\t158433300\t0.106\t25\nchr4\t158436000\t158436300\t0.1601\t18\nchr4\t158473500\t158474700\t0\t49\nchr4\t158476500\t158476800\t0.366\t52\nchr4\t159806100\t159806700\t0.2124\t99\nchr4\t160476600\t160476900\t0.1946\t75\nchr4\t160575600\t160575900\t0.2249\t80\nchr4\t160578900\t160579200\t0.3631\t58\nchr4\t160659000\t160659600\t0.012\t82\nchr4\t161618100\t161618400\t0.1007\t76\nchr4\t161636700\t161638800\t0.0261\t79\nchr4\t161974500\t161974800\t0.1004\t79\nchr4\t162466500\t162467100\t0.152\t70\nchr4\t163209600\t163210800\t0.1935\t110\nchr4\t163212000\t163212300\t0.2022\t122\nchr4\t163634700\t163635300\t0.0843\t63\nchr4\t163737600\t163737900\t0.2428\t49\nchr4\t163824600\t163824900\t0.2087\t47\nchr4\t163980000\t163980300\t0.1311\t74\nchr4\t164102100\t164104800\t0.0478\t66\nchr4\t164106300\t164106600\t0.0478\t66\nchr4\t164143200\t164143500\t0.3154\t82\nchr4\t164144700\t164146200\t0.1484\t84\nchr4\t164242800\t164243400\t0.3046\t62\nchr4\t164245800\t164247300\t0.3423\t61\nchr4\t164352000\t164355300\t0\t91\nchr4\t164470200\t164470500\t0.1398\t92\nchr4\t164554500\t164557500\t0.0415\t72\nchr4\t164915700\t164916000\t0.1404\t49\nchr4\t165958200\t165958500\t0.1497\t88\nchr4\t166448100\t166449300\t0.0036\t87\nchr4\t166464600\t166465800\t0.1251\t60\nchr4\t166468200\t166468800\t0.1263\t92\nchr4\t166570500\t166575900\t0\t93\nchr4\t166579800\t166580700\t0.0742\t593\nchr4\t166755900\t166761900\t0\t99\nchr4\t167276400\t167276700\t0.385\t72\nchr4\t167347800\t167348400\t0.1468\t54\nchr4\t168155700\t168156000\t0.0642\t273\nchr4\t168444000\t168447000\t0.0227\t89\nchr4\t168703500\t168703800\t0.3594\t78\nchr4\t169515600\t169521300\t0\t86\nchr4\t169793100\t169793400\t0.2198\t54\nchr4\t169878900\t169879200\t0.2068\t48\nchr4\t170255700\t170256300\t0.1693\t51\nchr4\t170433900\t170434200\t0.286\t68\nchr4\t170436000\t170436600\t0.0916\t69\nchr4\t170463900\t170464200\t0.2649\t21\nchr4\t171093900\t171094200\t0.2003\t126\nchr4\t173483700\t173484000\t0.2593\t14\nchr4\t173867400\t173867700\t0.0509\t40\nchr4\t174780000\t174781500\t0.1582\t85\nchr4\t174858900\t174859800\t0.0107\t64\nchr4\t175023000\t175025100\t0.1491\t75\nchr4\t175206300\t175208100\t0.0722\t83\nchr4\t175637100\t175637700\t0.0629\t258\nchr4\t175812300\t175812600\t0.4147\t86\nchr4\t176694900\t176695200\t0.308\t76\nchr4\t177845700\t177846000\t0.1177\t43\nchr4\t177847200\t177847500\t0.3451\t83\nchr4\t177999900\t178000200\t0.1479\t72\nchr4\t178017900\t178018200\t0.368\t52\nchr4\t179642100\t179642400\t0.2336\t68\nchr4\t180128400\t180129300\t0.0816\t97\nchr4\t180823500\t180823800\t0.3972\t24\nchr4\t180944100\t180945300\t0.052\t44\nchr4\t180955800\t180957000\t0\t68\nchr4\t181239300\t181241700\t0\t550\nchr4\t181409400\t181413900\t0.0672\t86\nchr4\t181774200\t181774800\t0.0017\t84\nchr4\t182358600\t182358900\t0.415\t69\nchr4\t182360100\t182360400\t0.1711\t56\nchr4\t182780400\t182780700\t0.1285\t69\nchr4\t182781900\t182782800\t0.1285\t69\nchr4\t182832000\t182834400\t0.0213\t42\nchr4\t183277500\t183277800\t0.1859\t74\nchr4\t183336900\t183337200\t0\t35\nchr4\t183382500\t183382800\t0.2982\t18\nchr4\t183640200\t183640800\t0.0011\t58\nchr4\t183735000\t183735300\t0\t22\nchr4\t183736500\t183737400\t0.1183\t76\nchr4\t183852000\t183852300\t0.3248\t103\nchr4\t184140600\t184140900\t0.0896\t67\nchr4\t184210200\t184210500\t0.1898\t92\nchr4\t184213800\t184214100\t0.175\t77\nchr4\t184858200\t184858800\t0.2965\t48\nchr4\t184966800\t184967700\t0.1565\t48\nchr4\t185796600\t185796900\t0.214\t43\nchr4\t185827200\t185827800\t0.4625\t318\nchr4\t186110400\t186111300\t0\t87\nchr4\t186112500\t186112800\t0\t87\nchr4\t186114000\t186115800\t0\t87\nchr4\t186371400\t186372000\t0.0095\t74\nchr4\t186477300\t186477600\t0.3459\t35\nchr4\t186546900\t186547200\t0.3898\t65\nchr4\t186841800\t186842100\t0.3554\t63\nchr4\t186959700\t186963600\t0.2512\t51\nchr4\t186965100\t186965400\t0.3636\t55\nchr4\t186966600\t186966900\t0.4572\t38\nchr4\t186969300\t186969600\t0.4742\t51\nchr4\t186970800\t186972900\t0.2935\t34\nchr4\t187053000\t187053300\t0.2686\t91\nchr4\t187066800\t187067100\t0.2551\t52\nchr4\t187304700\t187305000\t0\t42\nchr4\t187948500\t187949700\t0\t73\nchr4\t187955100\t187956300\t0\t66\nchr4\t188151900\t188154600\t0.0681\t21\nchr4\t188197200\t188197500\t0.3788\t18\nchr4\t188445000\t188448900\t0.0065\t65\nchr4\t188504400\t188504700\t0.2662\t26\nchr4\t188558700\t188560800\t0.0947\t97\nchr4\t188740500\t188741700\t0.0433\t58\nchr4\t188974800\t188975100\t0.3393\t43\nchr4\t189011400\t189011700\t0.4976\t38\nchr4\t189036000\t189036300\t0.1786\t176\nchr4\t189048600\t189048900\t0.2906\t16\nchr4\t189137100\t189143100\t0\t72\nchr4\t189155400\t189155700\t0.1257\t53\nchr4\t189233100\t189234300\t0.4316\t52\nchr4\t189296700\t189297000\t0.2666\t67\nchr4\t189307500\t189309300\t0.2123\t76\nchr4\t189314400\t189315000\t0.0744\t105\nchr4\t189332700\t189333000\t0\t21\nchr4\t189400200\t189400500\t0.2065\t106\nchr4\t189460800\t189461400\t0.0254\t70\nchr4\t189491400\t189491700\t0.1042\t130\nchr4\t189630000\t189630300\t0.2785\t70\nchr4\t189645600\t189646500\t0.3403\t67\nchr4\t189651600\t189652200\t0.1493\t99\nchr4\t189669300\t189676500\t0\t43\nchr4\t189678300\t189678600\t0\t42\nchr4\t189680100\t189685500\t0\t42\nchr4\t189688200\t189689400\t0\t60\nchr4\t189690600\t189702900\t0\t60\nchr4\t189798300\t189798600\t0.2476\t44\nchr4\t189810600\t189810900\t0.3499\t67\nchr4\t189835800\t189837300\t0.1925\t1488\nchr4\t189846300\t189847200\t0.3817\t246\nchr4\t190021800\t190022700\t0.0161\t567\nchr4\t190025100\t190027500\t0.0161\t567\nchr4\t190028700\t190032000\t0.2168\t61\nchr4\t190038000\t190038600\t0.0262\t61\nchr4\t190043100\t190043400\t0.205\t41\nchr4\t190045200\t190045500\t0.2451\t79\nchr4\t190047900\t190049400\t0.2451\t79\nchr4\t190052400\t190052700\t0.3404\t64\nchr4\t190053900\t190054500\t0\t66\nchr4\t190055700\t190056300\t0\t66\nchr4\t190058700\t190059000\t0.2246\t75\nchr4\t190060500\t190061400\t0.1497\t78\nchr4\t190065300\t190106100\t0\t815\nchr4\t190113300\t190114800\t0.0603\t213\nchr4\t190116600\t190118100\t0.0484\t144\nchr4\t190122600\t190123200\t0.3714\t284\nchr4\t190173000\t190182000\t0\t20904\nchr4\t190183200\t190204500\t0\t157\nchr5\t9900\t12000\t0\t1344\nchr5\t43200\t43500\t0.1825\t66\nchr5\t83700\t85200\t0.2601\t64\nchr5\t100500\t100800\t0.1758\t53\nchr5\t209100\t209700\t0.2422\t39\nchr5\t211500\t213000\t0.1488\t36\nchr5\t259800\t262200\t0.1675\t68\nchr5\t293400\t294000\t0.1222\t80\nchr5\t309600\t309900\t0.1876\t71\nchr5\t344400\t344700\t0.1329\t54\nchr5\t356700\t359100\t0\t54\nchr5\t391500\t392400\t0.3038\t117\nchr5\t415200\t415500\t0.4309\t122\nchr5\t474300\t474600\t0.2955\t47\nchr5\t487200\t487500\t0.2205\t19\nchr5\t495600\t495900\t0.0356\t15\nchr5\t552600\t553500\t0.2797\t148\nchr5\t562200\t564600\t0.0341\t36\nchr5\t629700\t632700\t0\t76\nchr5\t650700\t651000\t0.2839\t28\nchr5\t687300\t687600\t0.1917\t60\nchr5\t689100\t690900\t0\t77\nchr5\t694500\t695400\t0\t67\nchr5\t697800\t698100\t0.1368\t72\nchr5\t711900\t712200\t0.1478\t68\nchr5\t723600\t723900\t0.1159\t75\nchr5\t725400\t725700\t0.1159\t75\nchr5\t727500\t727800\t0.1159\t75\nchr5\t734400\t736800\t0\t76\nchr5\t738000\t740700\t0\t76\nchr5\t747000\t747300\t0.0764\t58\nchr5\t755100\t756000\t0.0185\t72\nchr5\t767700\t769500\t0\t68\nchr5\t779400\t779700\t0\t75\nchr5\t781200\t783000\t0\t75\nchr5\t786000\t786600\t0.0045\t67\nchr5\t796200\t796500\t0.35\t86\nchr5\t809700\t810300\t0.0297\t62\nchr5\t811800\t812100\t0.0297\t62\nchr5\t825900\t827100\t0\t67\nchr5\t828900\t830700\t0.0154\t62\nchr5\t832200\t832800\t0.1663\t52\nchr5\t839100\t839400\t0.0692\t55\nchr5\t848100\t848700\t0.119\t82\nchr5\t878700\t880500\t0\t90\nchr5\t897300\t899700\t0\t61\nchr5\t1022400\t1025700\t0.169\t38\nchr5\t1070100\t1073100\t0.0532\t27\nchr5\t1170300\t1170600\t0.256\t58\nchr5\t1272600\t1273500\t0.1948\t54\nchr5\t1289400\t1290900\t0.1549\t103\nchr5\t1327800\t1328400\t0.438\t75\nchr5\t1329600\t1329900\t0.3258\t69\nchr5\t1569900\t1570200\t0.2046\t99\nchr5\t1574400\t1574700\t0.2764\t48\nchr5\t1644600\t1644900\t0.2396\t28\nchr5\t1710600\t1710900\t0.4248\t43\nchr5\t1712400\t1712700\t0.0234\t92\nchr5\t1713900\t1715700\t0.0234\t92\nchr5\t1842900\t1843200\t0.3115\t88\nchr5\t1857900\t1858200\t0.4332\t66\nchr5\t1968300\t1971300\t0\t83\nchr5\t2145600\t2146500\t0.3159\t396\nchr5\t2490600\t2491200\t0.3372\t77\nchr5\t3440700\t3441000\t0.3083\t84\nchr5\t3442800\t3444000\t0.2234\t59\nchr5\t3499200\t3499500\t0.1537\t26\nchr5\t3638100\t3639300\t0\t45\nchr5\t4496700\t4501800\t0\t81\nchr5\t4616700\t4620600\t0.157\t82\nchr5\t5305200\t5305500\t0.4461\t115\nchr5\t6363900\t6364200\t0.2695\t36\nchr5\t6571200\t6571500\t0.3505\t33\nchr5\t6774000\t6774300\t0.1265\t16\nchr5\t6968100\t6971400\t0\t64\nchr5\t7056900\t7057500\t0.0579\t91\nchr5\t7174800\t7175100\t0.2284\t55\nchr5\t7194000\t7195200\t0.0135\t83\nchr5\t7196400\t7199400\t0.0135\t83\nchr5\t7232700\t7234800\t0.1042\t105\nchr5\t7300800\t7301100\t0.4027\t20\nchr5\t7603800\t7605900\t0\t73\nchr5\t8163900\t8164200\t0.2136\t68\nchr5\t8274000\t8274600\t0.274\t60\nchr5\t8937900\t8938200\t0.1371\t35\nchr5\t9259800\t9262800\t0\t88\nchr5\t9411600\t9411900\t0.36\t32\nchr5\t9585000\t9586200\t0.0276\t132\nchr5\t10273200\t10273500\t0.3827\t22\nchr5\t10346400\t10346700\t0.0411\t69\nchr5\t12197400\t12198000\t0.0741\t70\nchr5\t12453300\t12455100\t0\t74\nchr5\t12491400\t12491700\t0.2564\t47\nchr5\t13329900\t13330500\t0.0038\t11\nchr5\t13416600\t13422600\t0\t75\nchr5\t14346900\t14347500\t0.1198\t265\nchr5\t14634000\t14634900\t0.0511\t102\nchr5\t14808600\t14809200\t0.2506\t71\nchr5\t15296700\t15297000\t0.1341\t69\nchr5\t15401100\t15401700\t0.1305\t47\nchr5\t15906600\t15912600\t0\t88\nchr5\t16336800\t16337100\t0.2718\t60\nchr5\t16339500\t16339800\t0.1684\t84\nchr5\t16341000\t16341300\t0.1684\t84\nchr5\t17101200\t17101500\t0.0807\t92\nchr5\t17517900\t17530500\t0\t549\nchr5\t17580600\t17598900\t0\t437\nchr5\t17749800\t17750100\t0.0438\t19\nchr5\t17751900\t17752200\t0.1899\t84\nchr5\t17840700\t17841000\t0.0139\t45\nchr5\t18096900\t18097200\t0.3832\t29\nchr5\t18474300\t18474600\t0.0862\t86\nchr5\t19161600\t19161900\t0.0309\t21\nchr5\t19163700\t19167000\t0.0042\t79\nchr5\t20644500\t20646900\t0.0024\t99\nchr5\t20700300\t20700600\t0.217\t45\nchr5\t20738400\t20738700\t0.295\t71\nchr5\t20754600\t20755200\t0.0051\t57\nchr5\t20756700\t20757300\t0.0051\t57\nchr5\t20759400\t20759700\t0.2794\t58\nchr5\t20761500\t20761800\t0.2794\t58\nchr5\t20763300\t20765100\t0.0015\t54\nchr5\t20771100\t20771400\t0.3286\t44\nchr5\t20775000\t20775300\t0.4249\t48\nchr5\t20792700\t20793000\t0.2695\t49\nchr5\t20841900\t20842200\t0.2631\t47\nchr5\t20868300\t20868600\t0\t24\nchr5\t20870700\t20871000\t0.166\t32\nchr5\t21108000\t21112800\t0.0494\t88\nchr5\t21299400\t21300300\t0.1353\t85\nchr5\t21338100\t21338400\t0.1479\t11\nchr5\t21480600\t21480900\t0.0802\t128\nchr5\t21485100\t21485400\t0.0713\t189\nchr5\t21490200\t21490800\t0.0964\t139\nchr5\t21494700\t21495300\t0.0565\t135\nchr5\t22012800\t22013100\t0.2044\t56\nchr5\t22134600\t22134900\t0.2597\t64\nchr5\t22157100\t22157400\t0.1816\t56\nchr5\t24370800\t24373200\t0\t69\nchr5\t25079100\t25079700\t0.1359\t68\nchr5\t25080900\t25081200\t0.1359\t68\nchr5\t25116900\t25117500\t0.2071\t68\nchr5\t25207500\t25207800\t0.0386\t94\nchr5\t25381800\t25383900\t0.2106\t96\nchr5\t25777200\t25777500\t0.0924\t19\nchr5\t25831800\t25832100\t0.2937\t44\nchr5\t26111100\t26111400\t0\t17\nchr5\t26477100\t26477400\t0.1295\t66\nchr5\t26481600\t26481900\t0.137\t51\nchr5\t27209700\t27210000\t0.2892\t69\nchr5\t27426600\t27426900\t0.2791\t31\nchr5\t28064700\t28065000\t0.1754\t75\nchr5\t28197000\t28197300\t0.2408\t47\nchr5\t28200900\t28201200\t0.1019\t72\nchr5\t28502400\t28502700\t0.1895\t36\nchr5\t28504200\t28504500\t0.1895\t36\nchr5\t28801500\t28802400\t0.1748\t72\nchr5\t29190900\t29191200\t0.0956\t76\nchr5\t29486100\t29490300\t0\t72\nchr5\t29877000\t29878200\t0.0493\t92\nchr5\t30012600\t30013200\t0.0853\t53\nchr5\t30426300\t30426900\t0.0546\t65\nchr5\t30818400\t30819900\t0.1184\t83\nchr5\t30822000\t30823500\t0.143\t110\nchr5\t30860100\t30860400\t0.3609\t51\nchr5\t32208000\t32209500\t0.1095\t115\nchr5\t32822700\t32827800\t0\t83\nchr5\t32911800\t32912100\t0.1122\t81\nchr5\t33124500\t33126600\t0.0507\t109\nchr5\t33127800\t33128100\t0.0507\t109\nchr5\t33952800\t33954000\t0.0497\t97\nchr5\t34086300\t34086600\t0.2049\t53\nchr5\t34090200\t34090500\t0.2534\t36\nchr5\t34093200\t34093500\t0.2467\t50\nchr5\t34095300\t34095600\t0\t59\nchr5\t34097400\t34098300\t0\t59\nchr5\t34099500\t34099800\t0.1834\t60\nchr5\t34104000\t34104600\t0\t52\nchr5\t34105800\t34107300\t0\t52\nchr5\t34148100\t34153800\t0\t95\nchr5\t34173300\t34173900\t0.1884\t47\nchr5\t34178700\t34179300\t0.0312\t202\nchr5\t34183500\t34183800\t0.0224\t150\nchr5\t34188900\t34189200\t0.0976\t182\nchr5\t34194300\t34194600\t0.299\t184\nchr5\t34198200\t34199400\t0.0113\t57\nchr5\t34204800\t34206900\t0.1681\t57\nchr5\t34231800\t34232100\t0.1284\t79\nchr5\t34233300\t34233600\t0.2702\t52\nchr5\t34245300\t34245600\t0.0692\t37\nchr5\t34254000\t34254300\t0.2087\t54\nchr5\t34275900\t34276200\t0.2388\t20\nchr5\t34305000\t34307700\t0.0008\t77\nchr5\t34363800\t34364100\t0.2093\t57\nchr5\t35018700\t35019300\t0.2635\t69\nchr5\t35021400\t35021700\t0.2157\t79\nchr5\t35569200\t35570100\t0.2551\t68\nchr5\t36293100\t36293400\t0.0775\t53\nchr5\t36321600\t36321900\t0.0467\t46\nchr5\t37458000\t37460700\t0\t64\nchr5\t38172900\t38174100\t0.0875\t88\nchr5\t39787800\t39793500\t0\t139\nchr5\t39916800\t39917100\t0.4026\t51\nchr5\t40543200\t40543800\t0.067\t91\nchr5\t40545000\t40546800\t0.1122\t101\nchr5\t40801200\t40801800\t0.0908\t81\nchr5\t40856700\t40857000\t0.2248\t79\nchr5\t41235600\t41238300\t0.0707\t81\nchr5\t41403300\t41403900\t0.1492\t66\nchr5\t41599500\t41599800\t0.1492\t57\nchr5\t42165900\t42167700\t0\t64\nchr5\t42735300\t42735600\t0.001\t95\nchr5\t42737400\t42738000\t0.001\t95\nchr5\t42739200\t42739800\t0.001\t95\nchr5\t42981000\t42981900\t0.0761\t80\nchr5\t43086600\t43087200\t0.0608\t81\nchr5\t43720500\t43720800\t0.2422\t82\nchr5\t44152500\t44154300\t0\t94\nchr5\t44730600\t44730900\t0.2215\t74\nchr5\t45495000\t45495600\t0.0505\t66\nchr5\t45659400\t45664200\t0\t82\nchr5\t45977400\t45978300\t0.2269\t59\nchr5\t46486200\t46487100\t0\t22\nchr5\t46488300\t46492200\t0\t70\nchr5\t46493700\t46501200\t0\t136\nchr5\t46503000\t46503300\t0\t105\nchr5\t46504500\t46507800\t0\t48\nchr5\t46510200\t46515000\t0\t112\nchr5\t46518000\t46524000\t0\t101\nchr5\t46526400\t46526700\t0.2418\t12\nchr5\t46528200\t46529700\t0\t23\nchr5\t46530900\t46533300\t0\t56\nchr5\t46535100\t46538400\t0\t106\nchr5\t46540500\t46542900\t0.0305\t40\nchr5\t46545300\t46551300\t0\t98\nchr5\t46553100\t46554000\t0\t43\nchr5\t46555500\t46557300\t0.0487\t63\nchr5\t46559100\t46562400\t0\t71\nchr5\t46563600\t46564800\t0\t127\nchr5\t46566300\t46570200\t0\t70\nchr5\t46572000\t46573200\t0\t87\nchr5\t46574400\t46575600\t0\t129\nchr5\t46576800\t46584300\t0\t153\nchr5\t46585500\t46586400\t0\t60\nchr5\t46587600\t46599300\t0\t111\nchr5\t46600500\t46610100\t0\t192\nchr5\t46611300\t46616100\t0\t192\nchr5\t46617300\t46625100\t0\t151\nchr5\t46626600\t46627200\t0\t151\nchr5\t46628400\t46635000\t0\t98\nchr5\t46637100\t46638900\t0\t57\nchr5\t46640400\t46643100\t0\t81\nchr5\t46644900\t46648500\t0\t84\nchr5\t46649700\t46674900\t0\t222\nchr5\t46676400\t46676700\t0\t222\nchr5\t46677900\t46682100\t0\t222\nchr5\t46683600\t46684800\t0\t51\nchr5\t46686000\t46687500\t0\t212\nchr5\t46688700\t46689300\t0\t212\nchr5\t46691700\t46695000\t0\t116\nchr5\t46696800\t46702500\t0\t105\nchr5\t46705200\t46705500\t0.4054\t48\nchr5\t46707300\t46708200\t0\t119\nchr5\t46710300\t46716300\t0\t203\nchr5\t46717800\t46718400\t0\t62\nchr5\t46719600\t46722300\t0\t167\nchr5\t46724100\t46725900\t0\t97\nchr5\t46728000\t46728900\t0\t240\nchr5\t46730100\t46740300\t0\t240\nchr5\t46742400\t46749300\t0\t206\nchr5\t46750800\t46769400\t0\t206\nchr5\t46771800\t46784400\t0\t142\nchr5\t46785900\t46790700\t0\t142\nchr5\t46792800\t46812300\t0\t288\nchr5\t46813500\t46925700\t0\t288\nchr5\t46927500\t46957500\t0\t162\nchr5\t46959300\t47026800\t0\t364\nchr5\t47028000\t47068500\t0\t364\nchr5\t47073900\t47074800\t0\t114\nchr5\t47076000\t47079600\t0\t114\nchr5\t47082300\t47087100\t0\t92\nchr5\t47088300\t47090100\t0\t92\nchr5\t47092200\t47098500\t0\t67\nchr5\t47102100\t47102400\t0.1463\t75\nchr5\t47105100\t47108400\t0\t135\nchr5\t47109600\t47110800\t0\t135\nchr5\t47113200\t47128800\t0\t414\nchr5\t47130000\t47209800\t0\t458\nchr5\t47211000\t47231700\t0\t408\nchr5\t47232900\t47242200\t0\t408\nchr5\t47243400\t47255700\t0\t408\nchr5\t47257200\t47271600\t0\t408\nchr5\t47272800\t47295300\t0\t561\nchr5\t47296800\t47297400\t0\t561\nchr5\t47299200\t47299500\t0.4335\t51\nchr5\t47307000\t47309100\t0.0121\t262\nchr5\t49591500\t49591800\t0\t100\nchr5\t49601100\t49603200\t0.1512\t59888\nchr5\t49609800\t49617300\t0\t297\nchr5\t49622700\t49623000\t0.321\t40\nchr5\t49626600\t49627200\t0.0071\t398\nchr5\t49630800\t49631700\t0.2639\t15366\nchr5\t49633200\t49633800\t0\t32\nchr5\t49643700\t49646400\t0.0554\t2508\nchr5\t49650000\t49650300\t0.0554\t2508\nchr5\t49656000\t49661700\t0.1929\t49149\nchr5\t49665900\t49667700\t0\t17908\nchr5\t49670400\t49675500\t0\t17908\nchr5\t49679400\t49683900\t0\t199\nchr5\t49685700\t49686000\t0\t199\nchr5\t49687800\t49693200\t0\t93\nchr5\t49695000\t49695900\t0.2833\t97\nchr5\t49698000\t49710000\t0\t226\nchr5\t49712100\t49717200\t0\t226\nchr5\t49718400\t49720200\t0\t226\nchr5\t49722300\t49728300\t0\t448\nchr5\t49729800\t49738500\t0\t448\nchr5\t49740900\t49749000\t0.0106\t445\nchr5\t49750200\t49754100\t0.0873\t493\nchr5\t49755300\t49761300\t0.0627\t326\nchr5\t49762800\t49765800\t0.0685\t286\nchr5\t49767000\t49769100\t0.2055\t211\nchr5\t49771200\t49784100\t0.0107\t820\nchr5\t49785600\t49788600\t0\t1046\nchr5\t49789800\t49794900\t0.0105\t380\nchr5\t49796100\t49813200\t0.0105\t380\nchr5\t49814400\t49815900\t0.1517\t211\nchr5\t49817100\t49835100\t0\t579\nchr5\t49836300\t49888200\t0\t724\nchr5\t49889400\t49906800\t0\t724\nchr5\t49908000\t49913400\t0\t845\nchr5\t49914600\t49935300\t0\t845\nchr5\t49936800\t49940400\t0.0235\t330\nchr5\t49941900\t49956600\t0.0192\t630\nchr5\t49957800\t49962600\t0.1907\t386\nchr5\t49964400\t49983900\t0.033\t571\nchr5\t49985100\t49992900\t0.0388\t454\nchr5\t49994400\t49996200\t0.0388\t454\nchr5\t49997700\t50008500\t0.0347\t669\nchr5\t50009700\t50012400\t0.0347\t669\nchr5\t50013900\t50026200\t0.0176\t928\nchr5\t50027700\t50035500\t0\t859\nchr5\t50037000\t50037600\t0.0881\t242\nchr5\t50039100\t50046300\t0\t609\nchr5\t50047500\t50048700\t0.4305\t263\nchr5\t50049900\t50059500\t0.0547\t581\nchr5\t50109900\t50143500\t0\t617\nchr5\t50144700\t50145000\t0\t617\nchr5\t51252600\t51252900\t0.0716\t99\nchr5\t51254700\t51255000\t0.0716\t99\nchr5\t51332700\t51333900\t0.0513\t93\nchr5\t51335100\t51335400\t0.1176\t79\nchr5\t52019100\t52019400\t0.1668\t93\nchr5\t52090500\t52090800\t0.1042\t87\nchr5\t52164300\t52164600\t0.1451\t46\nchr5\t52192500\t52193100\t0.1705\t73\nchr5\t52248600\t52248900\t0.2173\t66\nchr5\t52540200\t52540500\t0.2277\t26\nchr5\t52722000\t52722300\t0.2248\t71\nchr5\t52935900\t52936200\t0.2624\t31\nchr5\t54181800\t54183300\t0.1067\t59\nchr5\t54806700\t54807300\t0.3098\t84\nchr5\t55571400\t55572000\t0.1956\t83\nchr5\t55587900\t55588200\t0.1735\t75\nchr5\t55695600\t55695900\t0.1793\t54\nchr5\t55753500\t55754100\t0.134\t66\nchr5\t57354300\t57354900\t0.0187\t86\nchr5\t57377700\t57378300\t0.1883\t80\nchr5\t57472200\t57475200\t0.0505\t72\nchr5\t58290600\t58290900\t0.1269\t48\nchr5\t58384200\t58390200\t0\t89\nchr5\t58422000\t58422300\t0.3277\t61\nchr5\t58552500\t58553700\t0.1616\t88\nchr5\t58597200\t58597800\t0.1233\t20\nchr5\t58757100\t58757400\t0.3059\t60\nchr5\t59284500\t59285100\t0.0048\t67\nchr5\t59396400\t59396700\t0.2892\t48\nchr5\t60570600\t60570900\t0.2159\t92\nchr5\t61375800\t61376400\t0.151\t61\nchr5\t62512800\t62513100\t0.2589\t62\nchr5\t62598300\t62598600\t0.4366\t36\nchr5\t62799600\t62801700\t0.2163\t74\nchr5\t62802900\t62803200\t0.1572\t54\nchr5\t62817600\t62823000\t0\t73\nchr5\t63408600\t63408900\t0.4673\t33\nchr5\t63942300\t63943800\t0.0725\t81\nchr5\t64131000\t64132500\t0.2507\t103\nchr5\t64466700\t64470300\t0\t68\nchr5\t64477800\t64481400\t0\t69\nchr5\t64710000\t64712100\t0.0028\t73\nchr5\t64713600\t64714200\t0.2731\t73\nchr5\t65164800\t65169600\t0\t86\nchr5\t65499900\t65500500\t0.2436\t65\nchr5\t66752400\t66752700\t0.074\t81\nchr5\t67251300\t67251900\t0.3054\t58\nchr5\t67821900\t67823400\t0.1797\t79\nchr5\t67892400\t67893900\t0.081\t76\nchr5\t68007900\t68009100\t0.0167\t63\nchr5\t69475800\t69476100\t0.4096\t61\nchr5\t69480300\t69480600\t0.3663\t48\nchr5\t69534000\t69547500\t0\t62\nchr5\t69550500\t69554100\t0\t62\nchr5\t69555900\t69558900\t0\t73\nchr5\t69560400\t69560700\t0.1894\t55\nchr5\t69562800\t69563100\t0.2846\t64\nchr5\t69565200\t69565500\t0\t388\nchr5\t69566700\t69579600\t0\t388\nchr5\t69581700\t69602100\t0\t388\nchr5\t69603300\t69627300\t0\t388\nchr5\t69628800\t69631800\t0\t388\nchr5\t69634500\t69791400\t0\t388\nchr5\t69792600\t69992400\t0\t388\nchr5\t69993600\t70019100\t0\t388\nchr5\t70020300\t70028400\t0\t388\nchr5\t70029900\t70043400\t0\t102\nchr5\t70044600\t70046400\t0\t102\nchr5\t70049400\t70074600\t0\t141\nchr5\t70076100\t70102200\t0\t141\nchr5\t70103700\t70182300\t0\t141\nchr5\t70183500\t70377000\t0\t141\nchr5\t70378200\t70401000\t0\t141\nchr5\t70402500\t70442100\t0\t141\nchr5\t70444500\t70546200\t0\t280\nchr5\t70547400\t70950000\t0\t280\nchr5\t70952700\t70955100\t0\t280\nchr5\t70956900\t70959900\t0\t280\nchr5\t70961100\t70977000\t0\t280\nchr5\t70978500\t71008800\t0\t95\nchr5\t71015700\t71031900\t0\t86\nchr5\t71033400\t71052900\t0\t86\nchr5\t71055600\t71077500\t0\t80\nchr5\t71079600\t71094900\t0\t63\nchr5\t71097000\t71097300\t0.2255\t60\nchr5\t71098800\t71102400\t0\t76\nchr5\t71104500\t71138700\t0\t103\nchr5\t71140200\t71164200\t0\t103\nchr5\t71165700\t71166300\t0\t421\nchr5\t71168700\t71230500\t0\t421\nchr5\t71231700\t71300400\t0\t218\nchr5\t71302200\t71321100\t0\t106\nchr5\t71322600\t71327100\t0\t106\nchr5\t71328900\t71352600\t0\t116\nchr5\t71353800\t71359200\t0\t116\nchr5\t71362200\t71362500\t0\t116\nchr5\t71364000\t71364300\t0\t116\nchr5\t71367900\t71368200\t0.2164\t69\nchr5\t71398200\t71398500\t0.2063\t66\nchr5\t71604900\t71605200\t0.0968\t49\nchr5\t71606400\t71608500\t0.1122\t73\nchr5\t71851800\t71852700\t0.0451\t60\nchr5\t73876200\t73877700\t0.205\t79\nchr5\t74711100\t74711400\t0.3136\t70\nchr5\t75606000\t75606600\t0.0197\t76\nchr5\t75642300\t75647700\t0.0048\t109\nchr5\t75700800\t75701400\t0.1621\t67\nchr5\t75882900\t75883200\t0.2255\t76\nchr5\t76170300\t76172700\t0.0479\t85\nchr5\t76233000\t76233600\t0.1999\t102\nchr5\t76360500\t76360800\t0.2775\t92\nchr5\t76984200\t76984500\t0.3242\t63\nchr5\t77042700\t77043600\t0.2174\t65\nchr5\t77612700\t77613000\t0.4391\t62\nchr5\t77794500\t77794800\t0.071\t65\nchr5\t78455700\t78456300\t0.2099\t51\nchr5\t78582300\t78582600\t0.2134\t88\nchr5\t78619800\t78620100\t0.0901\t45\nchr5\t78867900\t78868200\t0.3771\t57\nchr5\t78872400\t78872700\t0.344\t62\nchr5\t78981000\t78981300\t0.2902\t53\nchr5\t79096800\t79097100\t0.1367\t62\nchr5\t79779000\t79784700\t0\t108\nchr5\t79907100\t79907400\t0.2717\t44\nchr5\t80628300\t80628600\t0.1747\t67\nchr5\t80692800\t80693100\t0.3621\t47\nchr5\t80743500\t80743800\t0.3094\t34\nchr5\t81033300\t81033600\t0.0579\t59\nchr5\t81054300\t81054900\t0.1548\t81\nchr5\t81596400\t81596700\t0.0147\t72\nchr5\t81616200\t81621900\t0\t87\nchr5\t82047900\t82048200\t0.4526\t53\nchr5\t82125900\t82126800\t0.0052\t71\nchr5\t82134000\t82134900\t0\t70\nchr5\t82140300\t82141200\t0.132\t57\nchr5\t82369500\t82371900\t0.0023\t77\nchr5\t82429800\t82433100\t0.0092\t91\nchr5\t82505100\t82506000\t0.0797\t89\nchr5\t82867500\t82867800\t0.2191\t55\nchr5\t82937700\t82938300\t0.0262\t50\nchr5\t83316600\t83319900\t0\t69\nchr5\t83458200\t83459700\t0.0807\t97\nchr5\t83460900\t83461200\t0.0807\t97\nchr5\t83610300\t83610600\t0.4909\t21\nchr5\t84176100\t84176400\t0.2734\t213\nchr5\t84652200\t84652500\t0.16\t24\nchr5\t85358700\t85359600\t0.0861\t65\nchr5\t85638900\t85639500\t0.0641\t60\nchr5\t85662600\t85663200\t0.0491\t80\nchr5\t86510700\t86516700\t0.0083\t94\nchr5\t87091200\t87091800\t0.0578\t72\nchr5\t87470700\t87471000\t0.0274\t51\nchr5\t88904100\t88904400\t0.1865\t37\nchr5\t89624400\t89624700\t0.2673\t56\nchr5\t89737800\t89738100\t0.4893\t128\nchr5\t90075300\t90075900\t0.1149\t68\nchr5\t90077400\t90077700\t0.2068\t63\nchr5\t90078900\t90079200\t0.3534\t41\nchr5\t90212400\t90213000\t0.1132\t82\nchr5\t90443100\t90444600\t0.0229\t85\nchr5\t90595200\t90595500\t0.4896\t41\nchr5\t90667200\t90667500\t0.3994\t29\nchr5\t90925800\t90926100\t0.1742\t68\nchr5\t91273500\t91274400\t0.2542\t77\nchr5\t91278900\t91279200\t0.2109\t20\nchr5\t92194800\t92195100\t0.1237\t64\nchr5\t92196300\t92198100\t0.0126\t88\nchr5\t92300400\t92301900\t0.0818\t109\nchr5\t93148800\t93149100\t0.1465\t66\nchr5\t93213900\t93216300\t0.0468\t93\nchr5\t93218100\t93218400\t0.0468\t93\nchr5\t93261900\t93264300\t0.0976\t86\nchr5\t93265800\t93266400\t0.0976\t86\nchr5\t94580700\t94581000\t0.3546\t59\nchr5\t94773900\t94774200\t0.2858\t57\nchr5\t95201400\t95201700\t0.4098\t60\nchr5\t95492400\t95492700\t0.0796\t251\nchr5\t96104700\t96105300\t0.0657\t57\nchr5\t96106800\t96107100\t0.2258\t58\nchr5\t96241800\t96242100\t0.2667\t70\nchr5\t96732300\t96732600\t0.2159\t48\nchr5\t97295100\t97295400\t0.3366\t72\nchr5\t97515900\t97516500\t0.2886\t71\nchr5\t97518000\t97518600\t0.1031\t80\nchr5\t97632000\t97632600\t0.1585\t67\nchr5\t97811400\t97811700\t0.2236\t75\nchr5\t97813800\t97814100\t0.2348\t98\nchr5\t98139000\t98139300\t0.2448\t67\nchr5\t98548500\t98548800\t0.1408\t25\nchr5\t98550600\t98552400\t0.0426\t80\nchr5\t98704800\t98705100\t0.1931\t55\nchr5\t98821800\t98822100\t0.4111\t62\nchr5\t99401700\t99402300\t0.0156\t50\nchr5\t99409800\t99411600\t0.0368\t67\nchr5\t99415500\t99415800\t0.1594\t58\nchr5\t99423900\t99424800\t0.2283\t55\nchr5\t99426000\t99430500\t0\t74\nchr5\t99432300\t99433200\t0.176\t63\nchr5\t99484200\t99484500\t0.1483\t41\nchr5\t99489300\t99489600\t0.3591\t67\nchr5\t99493200\t99493500\t0.1792\t43\nchr5\t99495000\t99495300\t0.1979\t58\nchr5\t99498900\t99499800\t0\t67\nchr5\t99518400\t99521100\t0.151\t66\nchr5\t99529800\t99530100\t0.3473\t33\nchr5\t99537600\t99537900\t0.0409\t48\nchr5\t99539100\t99539400\t0.0805\t51\nchr5\t99576600\t99578100\t0.1045\t66\nchr5\t99584400\t99584700\t0.1788\t74\nchr5\t99690900\t99692400\t0.1197\t74\nchr5\t99735300\t99735600\t0.0489\t70\nchr5\t99829200\t99829500\t0.3099\t56\nchr5\t99855300\t99855600\t0.3491\t84\nchr5\t99857100\t99861600\t0.0088\t74\nchr5\t99896400\t99898500\t0.1137\t62\nchr5\t100058100\t100058400\t0.0352\t55\nchr5\t100062300\t100062600\t0.1254\t98\nchr5\t100069800\t100070100\t0.2235\t60\nchr5\t100075500\t100076400\t0.0021\t71\nchr5\t100085700\t100086000\t0.1287\t67\nchr5\t100087800\t100088100\t0.1087\t78\nchr5\t100092900\t100093200\t0.2818\t55\nchr5\t100332600\t100333500\t0.3098\t54\nchr5\t100335300\t100339200\t0\t67\nchr5\t100340400\t100341900\t0.1857\t63\nchr5\t100349400\t100350000\t0.0038\t49\nchr5\t100353600\t100355400\t0.0418\t67\nchr5\t100363200\t100363800\t0.0095\t54\nchr5\t100375500\t100376100\t0.1989\t77\nchr5\t100383600\t100383900\t0.1799\t62\nchr5\t100388700\t100389300\t0.1659\t59\nchr5\t100396200\t100396800\t0.0362\t52\nchr5\t100423800\t100424100\t0.202\t20\nchr5\t101110500\t101110800\t0.1996\t63\nchr5\t101126700\t101127000\t0.1793\t74\nchr5\t101290200\t101290500\t0.3109\t67\nchr5\t101302800\t101303400\t0.1365\t81\nchr5\t102132000\t102137100\t0\t82\nchr5\t102189600\t102194100\t0.0006\t76\nchr5\t102675600\t102675900\t0.1402\t77\nchr5\t102683700\t102684900\t0.1998\t77\nchr5\t103050600\t103051500\t0.0678\t50\nchr5\t103998300\t103999200\t0.1605\t85\nchr5\t104075100\t104076600\t0.1363\t97\nchr5\t104079300\t104079600\t0.1722\t55\nchr5\t104357700\t104360400\t0.0252\t73\nchr5\t104447100\t104448000\t0.0007\t90\nchr5\t104450700\t104451000\t0.1225\t34\nchr5\t104518800\t104524500\t0\t98\nchr5\t105513300\t105515100\t0.1262\t79\nchr5\t105518100\t105518700\t0.0381\t95\nchr5\t106148400\t106149300\t0\t87\nchr5\t106427100\t106427400\t0.2163\t66\nchr5\t106564200\t106564500\t0.3666\t14\nchr5\t106696200\t106696500\t0.2534\t61\nchr5\t106902600\t106902900\t0.1538\t58\nchr5\t109259400\t109265400\t0\t95\nchr5\t109341600\t109343100\t0.2965\t56\nchr5\t109532100\t109532400\t0.2858\t38\nchr5\t110172600\t110172900\t0.1841\t70\nchr5\t110655300\t110655600\t0.157\t55\nchr5\t110990100\t110990400\t0.1583\t44\nchr5\t111088500\t111089100\t0.1981\t63\nchr5\t111302400\t111308100\t0.0015\t156\nchr5\t111576600\t111576900\t0.4162\t45\nchr5\t114230400\t114231300\t0.0085\t59\nchr5\t114641700\t114642000\t0.1743\t92\nchr5\t114675300\t114675600\t0.3768\t37\nchr5\t115061100\t115061400\t0.2253\t25\nchr5\t115410600\t115413000\t0.1216\t71\nchr5\t115421400\t115421700\t0.1101\t67\nchr5\t116149500\t116151000\t0.3507\t66\nchr5\t116252400\t116253300\t0.1031\t79\nchr5\t116558400\t116558700\t0.364\t27\nchr5\t116821200\t116821800\t0.3569\t85\nchr5\t117492000\t117492300\t0.1766\t72\nchr5\t117543600\t117543900\t0.1526\t59\nchr5\t117908100\t117908400\t0.1311\t40\nchr5\t117931500\t117931800\t0.2104\t56\nchr5\t118046100\t118046400\t0.0367\t25\nchr5\t118542000\t118542300\t0.1264\t91\nchr5\t119605200\t119605500\t0.3012\t52\nchr5\t119685000\t119689800\t0\t74\nchr5\t120195000\t120195600\t0.1535\t77\nchr5\t120281400\t120281700\t0.2431\t53\nchr5\t120311400\t120312000\t0.062\t60\nchr5\t120666600\t120666900\t0.2673\t85\nchr5\t121411800\t121412100\t0.0899\t46\nchr5\t121952100\t121953000\t0.0038\t77\nchr5\t121996200\t121997100\t0.0444\t79\nchr5\t122240400\t122244900\t0.0007\t116\nchr5\t122379000\t122379600\t0.07\t76\nchr5\t122381100\t122381400\t0.07\t76\nchr5\t122511900\t122512200\t0.1955\t69\nchr5\t122911500\t122912100\t0.2367\t58\nchr5\t122914500\t122914800\t0.2874\t66\nchr5\t123236700\t123238800\t0\t58\nchr5\t123240900\t123241200\t0.2602\t59\nchr5\t125359500\t125362200\t0.0051\t87\nchr5\t125364000\t125364300\t0.011\t43\nchr5\t125616000\t125616600\t0.0098\t187\nchr5\t125676300\t125676600\t0.1382\t77\nchr5\t126163800\t126164400\t0.2845\t17\nchr5\t126528900\t126529500\t0.2762\t89\nchr5\t126891300\t126892500\t0.2345\t79\nchr5\t126893700\t126894300\t0.0887\t71\nchr5\t126904800\t126905400\t0.055\t79\nchr5\t126907200\t126907500\t0.055\t79\nchr5\t127103700\t127104000\t0.2688\t51\nchr5\t127734900\t127735800\t0.1571\t70\nchr5\t127738200\t127738500\t0.3477\t40\nchr5\t127747800\t127748700\t0.0279\t80\nchr5\t127750500\t127750800\t0.2273\t69\nchr5\t127879200\t127879800\t0.02\t69\nchr5\t128295000\t128295900\t0.0913\t83\nchr5\t128605200\t128605800\t0.1948\t123\nchr5\t128820600\t128820900\t0.32\t50\nchr5\t129313200\t129313500\t0.1615\t52\nchr5\t129550200\t129550500\t0.1838\t30\nchr5\t129578100\t129578400\t0.1812\t61\nchr5\t130265400\t130265700\t0.1663\t107\nchr5\t130733700\t130734000\t0.1353\t73\nchr5\t130735200\t130737300\t0.0187\t92\nchr5\t131073300\t131073600\t0.1495\t64\nchr5\t131308500\t131308800\t0.4447\t88\nchr5\t131778600\t131778900\t0.2606\t60\nchr5\t131876400\t131876700\t0.3036\t68\nchr5\t132514500\t132519600\t0\t81\nchr5\t133109100\t133109700\t0.1967\t56\nchr5\t133583700\t133589100\t0\t91\nchr5\t133626000\t133626300\t0.2195\t11\nchr5\t134557500\t134558400\t0.0044\t56\nchr5\t134881200\t134881800\t0.0445\t71\nchr5\t135983400\t135983700\t0.1419\t72\nchr5\t136783500\t136784700\t0.2854\t75\nchr5\t136787700\t136788000\t0.276\t78\nchr5\t137045400\t137050500\t0\t94\nchr5\t137500200\t137500500\t0.2954\t93\nchr5\t137687400\t137687700\t0.4256\t25\nchr5\t137973600\t137973900\t0.2989\t63\nchr5\t138519900\t138520200\t0.2104\t49\nchr5\t139005600\t139007700\t0.0097\t90\nchr5\t139009200\t139009500\t0.0097\t90\nchr5\t139083300\t139084800\t0\t75\nchr5\t140517000\t140517900\t0.2297\t76\nchr5\t140592600\t140593200\t0.2565\t63\nchr5\t140835000\t140835300\t0.147\t74\nchr5\t140849100\t140849400\t0.0917\t68\nchr5\t141106800\t141107100\t0.2314\t45\nchr5\t141214200\t141214500\t0.2799\t54\nchr5\t141387900\t141388200\t0.1986\t59\nchr5\t141398100\t141398400\t0.3258\t72\nchr5\t142041600\t142042200\t0.068\t73\nchr5\t142043700\t142044000\t0.0436\t61\nchr5\t142075200\t142077000\t0\t61\nchr5\t144069900\t144071400\t0.1212\t53\nchr5\t144551400\t144553500\t0.0549\t63\nchr5\t144713700\t144717600\t0.0195\t87\nchr5\t144891000\t144892200\t0.106\t72\nchr5\t145149900\t145150800\t0\t71\nchr5\t145183200\t145183800\t0\t20\nchr5\t145372800\t145373100\t0.0903\t44\nchr5\t145419300\t145421100\t0.0792\t70\nchr5\t146610000\t146615400\t0\t80\nchr5\t146678700\t146680200\t0.0167\t77\nchr5\t147013200\t147013800\t0.0855\t71\nchr5\t147716100\t147720600\t0.0878\t75\nchr5\t147941700\t147942300\t0.135\t76\nchr5\t147945600\t147945900\t0.1757\t89\nchr5\t147958500\t147960900\t0.0329\t73\nchr5\t148022400\t148024200\t0.0146\t75\nchr5\t148233300\t148233600\t0.0872\t45\nchr5\t148252500\t148253700\t0\t38\nchr5\t148612500\t148613100\t0.1717\t72\nchr5\t148945200\t148946100\t0.3132\t59\nchr5\t149655000\t149655600\t0.4306\t55\nchr5\t152076900\t152082900\t0\t80\nchr5\t152209200\t152213100\t0.0019\t81\nchr5\t152340300\t152345700\t0\t99\nchr5\t152615100\t152616000\t0.1916\t71\nchr5\t152654700\t152655000\t0.3696\t36\nchr5\t152742300\t152743800\t0.1046\t50\nchr5\t152746500\t152746800\t0.3221\t67\nchr5\t152766900\t152767200\t0.2943\t86\nchr5\t152886600\t152892300\t0\t105\nchr5\t152939700\t152940600\t0.0218\t76\nchr5\t153036900\t153037200\t0.1133\t78\nchr5\t153071400\t153075900\t0\t84\nchr5\t155170500\t155170800\t0.0979\t73\nchr5\t155612100\t155612400\t0.0378\t47\nchr5\t155615100\t155615700\t0.1826\t61\nchr5\t155660100\t155660700\t0.0799\t72\nchr5\t156062100\t156067500\t0\t82\nchr5\t156657900\t156659400\t0\t114\nchr5\t156660600\t156661800\t0\t114\nchr5\t156663900\t156664800\t0.0104\t80\nchr5\t156666000\t156666900\t0.0104\t80\nchr5\t157437000\t157438800\t0.0034\t85\nchr5\t158183700\t158184000\t0.2798\t78\nchr5\t159036600\t159037500\t0.0043\t73\nchr5\t160498500\t160498800\t0.4045\t68\nchr5\t160709700\t160715700\t0\t85\nchr5\t160875000\t160876200\t0.0064\t67\nchr5\t160878900\t160879500\t0.0668\t75\nchr5\t161004300\t161004600\t0.3272\t25\nchr5\t161073000\t161073300\t0.3882\t42\nchr5\t161075400\t161075700\t0.1966\t100\nchr5\t161607600\t161607900\t0.1186\t37\nchr5\t161609700\t161610000\t0.1894\t71\nchr5\t161712000\t161712300\t0.0739\t126\nchr5\t162290700\t162291000\t0.1964\t24\nchr5\t162736800\t162737100\t0.2078\t74\nchr5\t162850800\t162851100\t0.3747\t69\nchr5\t162906000\t162906600\t0.0231\t57\nchr5\t163059900\t163060200\t0.0102\t41\nchr5\t165801000\t165801300\t0.4669\t26\nchr5\t166141800\t166142700\t0.0086\t93\nchr5\t166143900\t166144800\t0.0086\t93\nchr5\t166146000\t166147200\t0.0136\t111\nchr5\t166420800\t166421400\t0.0059\t89\nchr5\t166966800\t166972800\t0\t89\nchr5\t167859000\t167860800\t0.1111\t76\nchr5\t168145200\t168146100\t0.0537\t81\nchr5\t168717000\t168717300\t0.0701\t68\nchr5\t168741900\t168742200\t0.1263\t60\nchr5\t169665000\t169665300\t0.092\t20\nchr5\t169834200\t169834500\t0.4062\t60\nchr5\t170214900\t170215200\t0.4207\t102\nchr5\t170240100\t170240400\t0.3466\t69\nchr5\t170242200\t170242500\t0.1802\t64\nchr5\t171059700\t171060300\t0.0373\t84\nchr5\t171084600\t171087300\t0\t84\nchr5\t171404400\t171404700\t0.12\t56\nchr5\t173403000\t173408700\t0\t87\nchr5\t173462700\t173463000\t0.124\t37\nchr5\t174018900\t174019200\t0.1473\t88\nchr5\t174539700\t174540000\t0.2217\t77\nchr5\t175137900\t175138200\t0.071\t58\nchr5\t175400700\t175402200\t0.0277\t147\nchr5\t175721100\t175721400\t0.3443\t75\nchr5\t175906800\t175907100\t0.2494\t73\nchr5\t175911300\t175911900\t0.3073\t61\nchr5\t175917600\t175918500\t0.0621\t69\nchr5\t175941300\t175941600\t0.1872\t41\nchr5\t175943100\t175943400\t0.2655\t69\nchr5\t175946700\t175949700\t0.0141\t68\nchr5\t175951500\t175951800\t0.0703\t56\nchr5\t175954500\t175957800\t0\t66\nchr5\t175964700\t175965000\t0.1657\t59\nchr5\t175967100\t175967400\t0.1937\t70\nchr5\t175969200\t175969800\t0.0158\t58\nchr5\t175972500\t175973100\t0\t54\nchr5\t175974900\t175975800\t0.0031\t66\nchr5\t175977900\t176000700\t0\t79\nchr5\t176009700\t176010300\t0.1935\t80\nchr5\t176014800\t176022000\t0\t85\nchr5\t176024400\t176032500\t0\t109\nchr5\t176033700\t176034600\t0\t109\nchr5\t176037900\t176038200\t0.4591\t39\nchr5\t176042400\t176043000\t0.3826\t61\nchr5\t176046000\t176048400\t0.0065\t71\nchr5\t176053500\t176054400\t0.1533\t80\nchr5\t176059200\t176061000\t0.0011\t52\nchr5\t176062800\t176063400\t0.0118\t40\nchr5\t176065800\t176066100\t0.1879\t44\nchr5\t176067600\t176067900\t0.0076\t58\nchr5\t176073000\t176073600\t0.1269\t82\nchr5\t176075100\t176075400\t0.1269\t82\nchr5\t176079900\t176080200\t0.2266\t14\nchr5\t176082000\t176082600\t0.0073\t58\nchr5\t176085600\t176087400\t0\t76\nchr5\t176089200\t176091300\t0\t76\nchr5\t176092500\t176096400\t0\t76\nchr5\t176097600\t176098500\t0\t76\nchr5\t176101800\t176102700\t0\t77\nchr5\t176106000\t176107200\t0.0628\t76\nchr5\t176109000\t176109300\t0\t76\nchr5\t176110800\t176114400\t0\t76\nchr5\t176117400\t176118300\t0.0331\t59\nchr5\t176123100\t176123700\t0.0613\t64\nchr5\t176128200\t176128500\t0.2334\t41\nchr5\t176196300\t176196600\t0.1025\t76\nchr5\t176215200\t176216400\t0.0348\t68\nchr5\t176224200\t176224500\t0.2259\t68\nchr5\t176226900\t176227800\t0.0034\t62\nchr5\t176231700\t176232000\t0.1264\t62\nchr5\t176238600\t176241300\t0\t64\nchr5\t176244000\t176244300\t0.0114\t62\nchr5\t176266500\t176268600\t0.0347\t60\nchr5\t176277900\t176278800\t0.0284\t67\nchr5\t176305200\t176305500\t0.447\t13\nchr5\t176871000\t176871600\t0.1837\t30\nchr5\t176960700\t176963100\t0.0085\t60\nchr5\t177451500\t177451800\t0.2648\t23\nchr5\t177517800\t177518700\t0\t28\nchr5\t177643800\t177645900\t0.0012\t49\nchr5\t177666300\t177666900\t0.0268\t69\nchr5\t177670800\t177672600\t0.0097\t68\nchr5\t177678600\t177678900\t0.2429\t59\nchr5\t177682500\t177683400\t0\t68\nchr5\t177686100\t177686400\t0.3084\t70\nchr5\t177694200\t177694800\t0.0395\t67\nchr5\t177703800\t177704100\t0.3231\t43\nchr5\t177709800\t177710100\t0.2889\t53\nchr5\t177714600\t177714900\t0.0171\t62\nchr5\t177717900\t177718500\t0.0116\t53\nchr5\t177719700\t177722400\t0\t69\nchr5\t177723600\t177728100\t0.067\t81\nchr5\t177730800\t177733200\t0.0062\t91\nchr5\t177735300\t177736200\t0\t74\nchr5\t177739500\t177745800\t0\t80\nchr5\t177747600\t177748800\t0.1482\t74\nchr5\t177750600\t177750900\t0.0087\t68\nchr5\t177752100\t177752400\t0.0087\t68\nchr5\t177756300\t177757500\t0.2319\t66\nchr5\t177760500\t177763500\t0.0034\t81\nchr5\t177766800\t177767700\t0.0197\t67\nchr5\t177772200\t177778200\t0\t102\nchr5\t177779700\t177781200\t0.0914\t55\nchr5\t177788700\t177789000\t0.3542\t90\nchr5\t177796200\t177799200\t0.0056\t68\nchr5\t177801000\t177801300\t0.006\t33\nchr5\t177802800\t177804600\t0\t29\nchr5\t177807300\t177807600\t0.47\t18\nchr5\t177809700\t177819300\t0\t75\nchr5\t177820500\t177830700\t0\t77\nchr5\t177833700\t177834300\t0.0272\t75\nchr5\t177843000\t177843300\t0.2214\t56\nchr5\t177845100\t177845700\t0.05\t69\nchr5\t177851100\t177851400\t0.1153\t43\nchr5\t177855300\t177855900\t0.1196\t53\nchr5\t177859500\t177865800\t0\t74\nchr5\t177867900\t177871200\t0\t59\nchr5\t177873300\t177874500\t0\t59\nchr5\t177875700\t177876600\t0.2261\t70\nchr5\t177878700\t177881100\t0.119\t65\nchr5\t177885300\t177889500\t0\t76\nchr5\t177894000\t177894300\t0.0055\t81\nchr5\t177895500\t177898200\t0.0055\t81\nchr5\t177899400\t177902700\t0\t61\nchr5\t177903900\t177905700\t0\t61\nchr5\t177909600\t177909900\t0.0199\t20\nchr5\t177914100\t177914400\t0.054\t19\nchr5\t177916800\t177917100\t0.4388\t26\nchr5\t177920400\t177921600\t0.0381\t57\nchr5\t177924900\t177925500\t0.3571\t53\nchr5\t177929100\t177929700\t0.1378\t69\nchr5\t177932100\t177932400\t0.2983\t69\nchr5\t177942300\t177942900\t0.0066\t59\nchr5\t177948900\t177949200\t0.0846\t28\nchr5\t177961500\t177962400\t0.0048\t250\nchr5\t177979500\t177979800\t0.3577\t15\nchr5\t178006200\t178006500\t0.1297\t42\nchr5\t178010100\t178010400\t0.2984\t55\nchr5\t178013100\t178013700\t0.0391\t78\nchr5\t178014900\t178015200\t0.0768\t75\nchr5\t178016400\t178017000\t0.0768\t75\nchr5\t178020000\t178023300\t0.0038\t75\nchr5\t178025400\t178025700\t0.2462\t83\nchr5\t178030800\t178033200\t0.0525\t63\nchr5\t178035000\t178036500\t0.0798\t78\nchr5\t178038000\t178039200\t0.0339\t63\nchr5\t178045800\t178046700\t0.0563\t61\nchr5\t178048800\t178051500\t0.0101\t68\nchr5\t178052700\t178053300\t0.0582\t63\nchr5\t178095600\t178096500\t0.1855\t23\nchr5\t178395000\t178396800\t0\t29\nchr5\t178448100\t178448400\t0.353\t59\nchr5\t178525200\t178525800\t0.0081\t146\nchr5\t178900500\t178900800\t0.1652\t43\nchr5\t179313300\t179313900\t0.3369\t67\nchr5\t179447100\t179448900\t0\t65\nchr5\t179502000\t179503500\t0.0016\t77\nchr5\t179514300\t179514600\t0.3211\t85\nchr5\t179517000\t179517300\t0.2135\t58\nchr5\t179634000\t179637000\t0\t83\nchr5\t179641800\t179642100\t0.1638\t31\nchr5\t179644200\t179644500\t0.0847\t22\nchr5\t179646300\t179646600\t0.0184\t76\nchr5\t179655600\t179658300\t0\t90\nchr5\t179871900\t179872200\t0.4062\t54\nchr5\t180486000\t180486300\t0.1785\t43\nchr5\t180534600\t180534900\t0.3238\t53\nchr5\t180615600\t180615900\t0.3881\t58\nchr5\t180617400\t180617700\t0.2608\t41\nchr5\t180658500\t180658800\t0.4082\t208\nchr5\t180903300\t180905700\t0.0677\t89\nchr5\t181088700\t181091700\t0\t95\nchr5\t181095900\t181098000\t0\t70\nchr5\t181101300\t181104000\t0\t74\nchr5\t181160700\t181161000\t0.3683\t20\nchr5\t181183200\t181183500\t0.246\t58\nchr5\t181293000\t181299300\t0\t80\nchr5\t181300800\t181301700\t0\t88\nchr5\t181302900\t181356300\t0\t88\nchr5\t181357500\t181361400\t0\t156\nchr5\t181362600\t181478400\t0\t156\nchr6\t60000\t92700\t0\t90\nchr6\t93900\t95400\t0\t90\nchr6\t97200\t100200\t0\t90\nchr6\t101400\t120900\t0\t90\nchr6\t122700\t126600\t0\t78\nchr6\t127800\t131400\t0\t78\nchr6\t132600\t146700\t0\t78\nchr6\t424500\t424800\t0.4943\t23\nchr6\t519300\t520500\t0\t53\nchr6\t601200\t602400\t0\t84\nchr6\t676200\t676800\t0.4435\t54\nchr6\t861900\t863700\t0\t432\nchr6\t909600\t910500\t0\t37\nchr6\t1141800\t1142400\t0.2636\t118\nchr6\t1234800\t1235100\t0.3159\t67\nchr6\t1319100\t1320900\t0\t42\nchr6\t1432200\t1432500\t0.0582\t62\nchr6\t1534500\t1534800\t0.4392\t66\nchr6\t1926900\t1927200\t0.4431\t139\nchr6\t2418000\t2423700\t0\t87\nchr6\t3090900\t3093900\t0\t52\nchr6\t3153900\t3154500\t0.1225\t75\nchr6\t3225000\t3225300\t0.0508\t68\nchr6\t4050000\t4050300\t0.375\t12\nchr6\t4194000\t4194300\t0.0713\t65\nchr6\t4254600\t4254900\t0.3216\t60\nchr6\t4329000\t4329600\t0.0691\t69\nchr6\t4331700\t4332000\t0.2635\t73\nchr6\t4572900\t4573200\t0.1706\t83\nchr6\t4834200\t4834500\t0.281\t97\nchr6\t5037000\t5037600\t0.1734\t66\nchr6\t5135100\t5135400\t0.3886\t12\nchr6\t5835000\t5835300\t0.3507\t68\nchr6\t5888100\t5889000\t0.2776\t74\nchr6\t6142500\t6143400\t0.1151\t93\nchr6\t6186900\t6189600\t0.1821\t70\nchr6\t6213900\t6216000\t0.0684\t73\nchr6\t6261600\t6262200\t0.0069\t196\nchr6\t6295500\t6295800\t0.2\t77\nchr6\t6299100\t6299400\t0.2006\t93\nchr6\t6429000\t6429300\t0.3075\t62\nchr6\t7717200\t7717500\t0.1653\t36\nchr6\t8216700\t8217300\t0.0513\t69\nchr6\t8566800\t8568000\t0.1709\t65\nchr6\t8770800\t8775300\t0\t80\nchr6\t8827800\t8828100\t0.265\t61\nchr6\t9813000\t9813600\t0.0706\t68\nchr6\t9814800\t9815100\t0.0706\t68\nchr6\t9968100\t9970500\t0.0997\t79\nchr6\t14482200\t14482800\t0.3143\t80\nchr6\t15188400\t15189900\t0.2131\t53\nchr6\t15806400\t15806700\t0.1818\t69\nchr6\t15984000\t15984300\t0.2923\t39\nchr6\t16013700\t16014000\t0.1394\t94\nchr6\t16860600\t16862100\t0\t87\nchr6\t17434800\t17435700\t0.2116\t72\nchr6\t18910800\t18912900\t0\t74\nchr6\t19347300\t19347600\t0.018\t23\nchr6\t19765200\t19770900\t0\t74\nchr6\t20615100\t20616600\t0.0346\t61\nchr6\t20959500\t20959800\t0.0644\t850\nchr6\t21192000\t21192300\t0.2429\t39\nchr6\t22176300\t22177200\t0.0258\t87\nchr6\t22179000\t22179600\t0.0258\t87\nchr6\t22461600\t22461900\t0.189\t86\nchr6\t22930200\t22930500\t0.1429\t23\nchr6\t23232900\t23233200\t0.1267\t76\nchr6\t23300100\t23300400\t0.2228\t59\nchr6\t23948700\t23949300\t0\t25\nchr6\t24046500\t24046800\t0.2113\t41\nchr6\t24469200\t24469500\t0.1092\t54\nchr6\t24811800\t24817800\t0\t88\nchr6\t26368800\t26369100\t0.2617\t64\nchr6\t26634600\t26635800\t0.0151\t69\nchr6\t26637000\t26638200\t0.0151\t69\nchr6\t26671200\t26738700\t0\t105\nchr6\t26746500\t26747100\t0.1105\t46\nchr6\t26751600\t26753700\t0\t48\nchr6\t26755800\t26756100\t0.1751\t43\nchr6\t26757300\t26757900\t0.1587\t56\nchr6\t26762700\t26830500\t0\t76\nchr6\t26833800\t26834100\t0.1768\t51\nchr6\t26844000\t26844300\t0.0693\t55\nchr6\t26868900\t26869200\t0.2164\t48\nchr6\t26876400\t26876700\t0.2134\t46\nchr6\t26885100\t26885400\t0.0762\t131\nchr6\t26894700\t26895000\t0.1943\t82\nchr6\t26961000\t26961300\t0.1588\t44\nchr6\t26999700\t27000000\t0.2605\t74\nchr6\t27484200\t27486300\t0.1521\t68\nchr6\t27945000\t27945300\t0.18\t87\nchr6\t28022100\t28022400\t0.3418\t81\nchr6\t28026000\t28026300\t0.074\t115\nchr6\t28626900\t28627200\t0.4186\t65\nchr6\t29115600\t29115900\t0.1653\t84\nchr6\t29123100\t29123700\t0.004\t64\nchr6\t29194200\t29195700\t0.0054\t59\nchr6\t29717700\t29719800\t0\t28\nchr6\t29847300\t29847600\t0.1708\t19\nchr6\t29933400\t29933700\t0\t21\nchr6\t30249600\t30249900\t0.1664\t54\nchr6\t31244100\t31245300\t0\t45\nchr6\t31389300\t31389600\t0.3019\t79\nchr6\t31453800\t31454400\t0.088\t49\nchr6\t31486200\t31486800\t0.1163\t71\nchr6\t31815900\t31817400\t0\t72\nchr6\t31828200\t31829400\t0\t75\nchr6\t31853700\t31855200\t0.1357\t97\nchr6\t31980900\t31995600\t0\t81\nchr6\t31996800\t32004300\t0\t78\nchr6\t32009100\t32028300\t0\t80\nchr6\t32030400\t32036700\t0\t92\nchr6\t32041800\t32045700\t0\t75\nchr6\t32410200\t32410800\t0.3233\t45\nchr6\t32579700\t32580000\t0.0357\t15\nchr6\t32595300\t32596200\t0.4329\t31\nchr6\t32657400\t32657700\t0.3328\t24\nchr6\t33484500\t33484800\t0.0464\t77\nchr6\t33525600\t33525900\t0.257\t65\nchr6\t34397100\t34397700\t0.0343\t68\nchr6\t35136600\t35136900\t0.0616\t30\nchr6\t35384400\t35385600\t0.1501\t77\nchr6\t35827500\t35828700\t0.0077\t71\nchr6\t38963700\t38964300\t0\t60\nchr6\t39456000\t39457500\t0\t76\nchr6\t39458700\t39459900\t0\t76\nchr6\t41130600\t41130900\t0.1673\t80\nchr6\t41436300\t41436600\t0.3564\t28\nchr6\t41985600\t41985900\t0.1198\t29\nchr6\t42210300\t42210600\t0.336\t51\nchr6\t42286500\t42287100\t0.1004\t64\nchr6\t43580100\t43580700\t0.348\t75\nchr6\t44181600\t44182200\t0.3613\t81\nchr6\t44401800\t44402100\t0.3517\t59\nchr6\t44752800\t44753100\t0.1215\t83\nchr6\t44757300\t44757600\t0.4849\t62\nchr6\t44871300\t44876400\t0\t107\nchr6\t44893800\t44894100\t0.2815\t42\nchr6\t45063900\t45065400\t0.1079\t82\nchr6\t45066600\t45068100\t0.1079\t82\nchr6\t45670200\t45671400\t0.0291\t96\nchr6\t45672900\t45674400\t0.0291\t96\nchr6\t46213800\t46214400\t0.0346\t73\nchr6\t47051100\t47051700\t0.2321\t73\nchr6\t47505900\t47506500\t0.105\t74\nchr6\t47758800\t47759100\t0.1871\t34\nchr6\t47889000\t47889300\t0.1394\t47\nchr6\t48365100\t48368700\t0.0464\t77\nchr6\t48495300\t48495900\t0.298\t41\nchr6\t48738900\t48742500\t0.0812\t107\nchr6\t48901200\t48902100\t0.0042\t79\nchr6\t49391100\t49391400\t0.318\t68\nchr6\t49765800\t49766100\t0.1187\t92\nchr6\t50894400\t50895000\t0.2071\t67\nchr6\t51127200\t51127500\t0.2256\t53\nchr6\t51652500\t51652800\t0.3169\t35\nchr6\t51874800\t51880800\t0\t94\nchr6\t51981900\t51982500\t0.2871\t76\nchr6\t52205400\t52205700\t0.1756\t119\nchr6\t52757100\t52757400\t0.0548\t61\nchr6\t52798200\t52798800\t0.1698\t77\nchr6\t52922700\t52923000\t0.4413\t69\nchr6\t54838500\t54839100\t0.0611\t79\nchr6\t54963900\t54964500\t0.0537\t82\nchr6\t54965700\t54967200\t0.0537\t82\nchr6\t54999600\t54999900\t0.0547\t18\nchr6\t55365300\t55365600\t0.1562\t63\nchr6\t55366800\t55367100\t0.1145\t83\nchr6\t55543200\t55543500\t0.0161\t132\nchr6\t55648500\t55648800\t0.2939\t60\nchr6\t56114700\t56115000\t0.3573\t86\nchr6\t56893800\t56894100\t0.0002\t45\nchr6\t56895300\t56895900\t0.0002\t45\nchr6\t57046800\t57048000\t0\t71\nchr6\t57090300\t57091500\t0\t69\nchr6\t57378900\t57379200\t0.2217\t52\nchr6\t57404100\t57405000\t0.1455\t55\nchr6\t57554100\t57554400\t0.2176\t47\nchr6\t57556800\t57557100\t0.3493\t62\nchr6\t57565200\t57565500\t0.2315\t53\nchr6\t57797700\t57799500\t0\t50\nchr6\t57820800\t57822300\t0.0498\t62\nchr6\t57830700\t57831000\t0.2041\t63\nchr6\t57880800\t57881400\t0.2247\t55\nchr6\t57909900\t57910200\t0.2349\t47\nchr6\t57939600\t57939900\t0.21\t58\nchr6\t58014900\t58015200\t0.3159\t58\nchr6\t58449900\t58453500\t0\t2483\nchr6\t58554000\t58554600\t0\t4686\nchr6\t58555800\t59508000\t0\t4686\nchr6\t59509200\t59829900\t0\t4686\nchr6\t60240300\t60241800\t0.4873\t537\nchr6\t60280500\t60280800\t0.0624\t42\nchr6\t60306300\t60307200\t0\t62\nchr6\t60446700\t60447000\t0.1657\t44\nchr6\t60449400\t60449700\t0.2641\t58\nchr6\t60459000\t60459300\t0.1869\t58\nchr6\t60463800\t60464100\t0.2461\t44\nchr6\t60510600\t60510900\t0.0481\t60\nchr6\t60533700\t60534300\t0\t43\nchr6\t60703800\t60704700\t0.1224\t68\nchr6\t60804000\t60804300\t0.1391\t68\nchr6\t60861300\t60863400\t0.0555\t82\nchr6\t60936900\t60937200\t0.2629\t51\nchr6\t61322700\t61356900\t0\t78\nchr6\t61425000\t61473300\t0\t94\nchr6\t61480800\t61492800\t0\t38\nchr6\t61673400\t61674000\t0.1961\t68\nchr6\t62063700\t62064000\t0.3536\t81\nchr6\t62532900\t62533200\t0.2894\t46\nchr6\t63408300\t63408600\t0.2112\t75\nchr6\t63419700\t63420000\t0.4141\t80\nchr6\t64704300\t64704600\t0.3782\t41\nchr6\t64942200\t64942500\t0.1266\t48\nchr6\t65256600\t65257200\t0.0787\t82\nchr6\t65303100\t65305200\t0.1183\t78\nchr6\t65308200\t65308500\t0.1084\t45\nchr6\t65314200\t65314500\t0.2137\t54\nchr6\t65315700\t65316000\t0.322\t62\nchr6\t65550300\t65552100\t0\t66\nchr6\t66077700\t66078300\t0.0806\t60\nchr6\t66602700\t66603600\t0.1241\t63\nchr6\t66864000\t66864300\t0.1548\t48\nchr6\t68288700\t68289300\t0.2133\t70\nchr6\t68432400\t68433000\t0.0257\t62\nchr6\t68517900\t68518200\t0.0584\t66\nchr6\t69516000\t69516300\t0.1814\t58\nchr6\t69518700\t69520800\t0.1506\t60\nchr6\t69556500\t69556800\t0.2525\t68\nchr6\t70010700\t70016100\t0\t93\nchr6\t70767600\t70767900\t0.1926\t45\nchr6\t70786200\t70786500\t0.1454\t56\nchr6\t71128500\t71129400\t0.1723\t76\nchr6\t71265600\t71265900\t0.3378\t64\nchr6\t71827500\t71827800\t0.1386\t58\nchr6\t72110400\t72110700\t0.2283\t69\nchr6\t72571200\t72576000\t0\t96\nchr6\t72801300\t72801600\t0.1571\t44\nchr6\t72988800\t72994500\t0\t94\nchr6\t73436400\t73436700\t0.0533\t563\nchr6\t73711500\t73711800\t0.2965\t18\nchr6\t73839600\t73840200\t0.1342\t51\nchr6\t73920300\t73920900\t0.1106\t85\nchr6\t73959600\t73959900\t0.4036\t77\nchr6\t74097900\t74099400\t0.1272\t70\nchr6\t74155800\t74156700\t0\t88\nchr6\t74209200\t74209800\t0.2002\t86\nchr6\t74246700\t74247300\t0.1077\t44\nchr6\t75248100\t75248400\t0.0856\t22\nchr6\t76109100\t76109400\t0.0177\t84\nchr6\t76891200\t76891500\t0.2002\t56\nchr6\t76964100\t76964700\t0.0584\t63\nchr6\t76976700\t76977300\t0.0957\t65\nchr6\t77043600\t77044800\t0.0338\t73\nchr6\t77157900\t77158200\t0.4027\t41\nchr6\t77591100\t77591400\t0.0826\t12\nchr6\t77717100\t77726100\t0\t120\nchr6\t78128100\t78128400\t0.231\t36\nchr6\t78543600\t78543900\t0.2075\t60\nchr6\t78858900\t78859500\t0.0289\t95\nchr6\t78976800\t78977100\t0.1046\t66\nchr6\t80571000\t80571600\t0.0334\t69\nchr6\t80800800\t80801100\t0.0437\t83\nchr6\t80802300\t80803800\t0.0437\t83\nchr6\t80916900\t80920800\t0\t89\nchr6\t81663300\t81665100\t0.1082\t71\nchr6\t82392300\t82392900\t0.0308\t45\nchr6\t82394100\t82394400\t0.0308\t45\nchr6\t82560300\t82561200\t0.0628\t87\nchr6\t82563600\t82563900\t0.3122\t61\nchr6\t83318400\t83319000\t0.0844\t70\nchr6\t83334300\t83339700\t0\t75\nchr6\t83798100\t83798400\t0.0641\t86\nchr6\t83800200\t83800500\t0.0641\t86\nchr6\t83802300\t83802600\t0.0641\t86\nchr6\t84243900\t84244200\t0.2091\t61\nchr6\t84365100\t84365400\t0.3172\t68\nchr6\t84608400\t84609000\t0\t53\nchr6\t84610200\t84614400\t0\t53\nchr6\t84628800\t84630600\t0.0817\t87\nchr6\t85986000\t85986600\t0\t68\nchr6\t85999200\t86004600\t0\t84\nchr6\t86022900\t86023200\t0.2561\t70\nchr6\t86052600\t86052900\t0.1047\t23\nchr6\t86211900\t86212500\t0.3875\t81\nchr6\t86645700\t86648400\t0.0019\t81\nchr6\t86667300\t86667600\t0.2147\t56\nchr6\t86811000\t86811600\t0.1674\t76\nchr6\t87010500\t87010800\t0.1965\t53\nchr6\t87326700\t87327900\t0.1709\t92\nchr6\t87750600\t87750900\t0.0526\t66\nchr6\t88319400\t88319700\t0.3696\t78\nchr6\t88381800\t88382400\t0.0092\t87\nchr6\t88449000\t88449300\t0.1695\t49\nchr6\t88773000\t88773300\t0.3397\t69\nchr6\t88946700\t88949100\t0.0183\t94\nchr6\t89225400\t89230500\t0\t80\nchr6\t91047600\t91047900\t0.1682\t61\nchr6\t91049100\t91049400\t0.3149\t55\nchr6\t91870500\t91870800\t0.2793\t63\nchr6\t92098200\t92098500\t0.4395\t41\nchr6\t92984100\t92984400\t0.2718\t95\nchr6\t93632700\t93633900\t0.1909\t86\nchr6\t93636000\t93636300\t0.1458\t80\nchr6\t93865800\t93871500\t0.0015\t112\nchr6\t94198200\t94203900\t0\t71\nchr6\t94911000\t94911900\t0.2748\t65\nchr6\t95303100\t95303400\t0.4679\t22\nchr6\t95363400\t95363700\t0.2452\t50\nchr6\t95665200\t95667300\t0\t57\nchr6\t95760600\t95763900\t0.0022\t88\nchr6\t95979900\t95983800\t0.053\t109\nchr6\t98417100\t98417400\t0.1534\t66\nchr6\t98420100\t98421600\t0.0038\t79\nchr6\t98705700\t98706000\t0.2628\t84\nchr6\t98867100\t98868000\t0.2128\t60\nchr6\t99142500\t99142800\t0.0614\t55\nchr6\t99649500\t99649800\t0.13\t76\nchr6\t99824400\t99825600\t0.0017\t104\nchr6\t99827700\t99829500\t0.0591\t58\nchr6\t100198500\t100198800\t0.0371\t85\nchr6\t100200000\t100200300\t0.0371\t85\nchr6\t100201800\t100202400\t0.0995\t76\nchr6\t100357200\t100360200\t0.1343\t71\nchr6\t102090000\t102090300\t0.2451\t73\nchr6\t102334500\t102334800\t0.2204\t74\nchr6\t102463800\t102464400\t0.0748\t49\nchr6\t102609900\t102610200\t0.3557\t66\nchr6\t102722700\t102723000\t0.1089\t86\nchr6\t102724200\t102724500\t0.1089\t86\nchr6\t102753000\t102753300\t0.1523\t56\nchr6\t102755100\t102756600\t0.0616\t69\nchr6\t103192800\t103193100\t0.3945\t86\nchr6\t103654800\t103656000\t0.0509\t57\nchr6\t103710000\t103714800\t0.0353\t85\nchr6\t104452800\t104457000\t0\t98\nchr6\t104490300\t104495400\t0\t84\nchr6\t104741400\t104741700\t0.2623\t71\nchr6\t105120000\t105120300\t0.4577\t11\nchr6\t105720300\t105720600\t0.2474\t107\nchr6\t105823800\t105824100\t0.1556\t17\nchr6\t106401600\t106402500\t0.0801\t70\nchr6\t106720800\t106721100\t0.0561\t63\nchr6\t106723200\t106723500\t0.1067\t59\nchr6\t107519100\t107519400\t0.3449\t52\nchr6\t107783100\t107783700\t0.0725\t50\nchr6\t107856300\t107856600\t0.3152\t66\nchr6\t107858100\t107859900\t0.0829\t95\nchr6\t107887200\t107887500\t0.252\t49\nchr6\t109047000\t109047600\t0.3149\t93\nchr6\t109246500\t109248000\t0.0859\t87\nchr6\t109249500\t109249800\t0.0859\t87\nchr6\t109621200\t109621800\t0.0213\t67\nchr6\t110155800\t110158500\t0\t69\nchr6\t110231700\t110232000\t0.2864\t43\nchr6\t111904200\t111905700\t0.1098\t75\nchr6\t111906900\t111907500\t0.0385\t75\nchr6\t112033200\t112033500\t0.3596\t110\nchr6\t112508400\t112509000\t0.0576\t65\nchr6\t112703700\t112709400\t0\t104\nchr6\t112814700\t112818900\t0\t70\nchr6\t112872300\t112872900\t0.0398\t83\nchr6\t112915200\t112918200\t0.0019\t94\nchr6\t113228100\t113229000\t0.0377\t72\nchr6\t113230200\t113231100\t0.0377\t72\nchr6\t113535300\t113536500\t0.0703\t80\nchr6\t113605800\t113607300\t0.0141\t78\nchr6\t114722400\t114723000\t0\t65\nchr6\t114725400\t114726000\t0.1428\t50\nchr6\t114801600\t114802200\t0.0396\t63\nchr6\t115010400\t115011300\t0.0367\t58\nchr6\t115034400\t115034700\t0.2977\t99\nchr6\t115085400\t115085700\t0.1162\t62\nchr6\t115578900\t115580100\t0.053\t66\nchr6\t115960800\t115965900\t0\t127\nchr6\t116693700\t116694000\t0.3592\t91\nchr6\t116822100\t116822700\t0.134\t70\nchr6\t117092400\t117093000\t0.1095\t85\nchr6\t117102300\t117108000\t0\t69\nchr6\t117183900\t117184200\t0.339\t77\nchr6\t117187200\t117187500\t0.3511\t129\nchr6\t117246600\t117249000\t0\t70\nchr6\t117250200\t117250500\t0\t70\nchr6\t117707400\t117707700\t0.0996\t55\nchr6\t117709200\t117709500\t0.4168\t51\nchr6\t117924000\t117924300\t0.4658\t88\nchr6\t117998100\t117998400\t0.2076\t79\nchr6\t118128000\t118128300\t0.2139\t78\nchr6\t118646100\t118646400\t0.3011\t2638\nchr6\t120691800\t120693000\t0.348\t88\nchr6\t120694200\t120694500\t0.4228\t43\nchr6\t121162800\t121168200\t0\t97\nchr6\t121568400\t121568700\t0.1904\t64\nchr6\t121623300\t121623600\t0.2771\t122\nchr6\t122847900\t122848500\t0.1044\t74\nchr6\t122889000\t122889600\t0.079\t112\nchr6\t123180600\t123181500\t0.0749\t61\nchr6\t123444300\t123445800\t0.0321\t80\nchr6\t123475200\t123475800\t0.0837\t78\nchr6\t123477000\t123477300\t0.0837\t78\nchr6\t124165800\t124167300\t0.0637\t92\nchr6\t124177800\t124178100\t0.1002\t20\nchr6\t124728300\t124728600\t0.0543\t57\nchr6\t124840200\t124841100\t0.0048\t70\nchr6\t125288700\t125289300\t0.1746\t219\nchr6\t125319000\t125322000\t0.0003\t82\nchr6\t125387700\t125389800\t0\t54\nchr6\t127596000\t127596300\t0.1972\t79\nchr6\t127617000\t127618200\t0.188\t83\nchr6\t128668800\t128669100\t0.2237\t55\nchr6\t128906100\t128907300\t0.0526\t87\nchr6\t128908500\t128909700\t0.0526\t87\nchr6\t128922900\t128923200\t0.2843\t75\nchr6\t128998500\t129004500\t0\t86\nchr6\t129168000\t129169800\t0.1454\t90\nchr6\t129171600\t129172200\t0.1454\t90\nchr6\t131143800\t131144100\t0.1589\t69\nchr6\t131698200\t131703000\t0\t101\nchr6\t131704200\t131705400\t0\t101\nchr6\t131707200\t131711700\t0\t101\nchr6\t131714400\t131714700\t0.348\t62\nchr6\t131857200\t131857500\t0.2645\t82\nchr6\t133020900\t133026600\t0\t93\nchr6\t133050300\t133050600\t0.4998\t25\nchr6\t133470000\t133473000\t0\t67\nchr6\t133520400\t133521900\t0.0836\t93\nchr6\t133650000\t133653000\t0.0038\t83\nchr6\t133664100\t133666200\t0.0039\t74\nchr6\t134659200\t134659800\t0.0764\t65\nchr6\t135511200\t135511500\t0.2161\t83\nchr6\t135980700\t135981000\t0.3688\t62\nchr6\t136851000\t136853100\t0.0091\t74\nchr6\t138189900\t138190200\t0.2097\t268\nchr6\t138823800\t138824100\t0.3046\t49\nchr6\t140681100\t140683200\t0\t58\nchr6\t140877900\t140878200\t0.1244\t75\nchr6\t141567600\t141571500\t0.0207\t128\nchr6\t141619200\t141619800\t0.0675\t66\nchr6\t141621000\t141621300\t0.0675\t66\nchr6\t141748800\t141750300\t0.3321\t70\nchr6\t141818700\t141819000\t0.4172\t85\nchr6\t141820200\t141820500\t0.4172\t85\nchr6\t141918300\t141918600\t0.036\t87\nchr6\t141920400\t141921000\t0.2144\t63\nchr6\t141922200\t141922800\t0.0347\t61\nchr6\t141926700\t141927900\t0.0047\t68\nchr6\t142422600\t142424700\t0.0632\t79\nchr6\t143213400\t143213700\t0.3971\t347\nchr6\t143303700\t143304000\t0.3926\t60\nchr6\t145072800\t145073700\t0.1134\t82\nchr6\t145503300\t145505100\t0.0346\t68\nchr6\t145665000\t145667400\t0.0236\t80\nchr6\t145770000\t145770600\t0.019\t65\nchr6\t145852500\t145855200\t0.1249\t106\nchr6\t145983000\t145983300\t0.2994\t70\nchr6\t147720900\t147721200\t0.1935\t44\nchr6\t148160100\t148160700\t0.0671\t65\nchr6\t148738200\t148738800\t0\t52\nchr6\t149944500\t149944800\t0.1911\t78\nchr6\t150022200\t150023100\t0.075\t59\nchr6\t150198000\t150198300\t0.4605\t104\nchr6\t151847400\t151848300\t0.1339\t56\nchr6\t151931700\t151932600\t0.099\t82\nchr6\t152633700\t152634000\t0.2986\t67\nchr6\t152709000\t152712600\t0\t69\nchr6\t152987700\t152989500\t0.0146\t55\nchr6\t153914400\t153914700\t0.467\t93\nchr6\t154524900\t154525200\t0.2254\t83\nchr6\t156011100\t156011400\t0.2656\t63\nchr6\t156034500\t156039900\t0\t77\nchr6\t156178800\t156179100\t0.3188\t44\nchr6\t156325200\t156330300\t0.013\t69\nchr6\t156362100\t156367200\t0\t95\nchr6\t157283700\t157284000\t0.3457\t87\nchr6\t157311300\t157312200\t0.1232\t217\nchr6\t158127300\t158127900\t0\t48\nchr6\t158238600\t158240400\t0.0125\t60\nchr6\t159457500\t159457800\t0.3288\t71\nchr6\t159547200\t159549600\t0.0104\t67\nchr6\t159652200\t159652500\t0.3162\t30\nchr6\t160091100\t160091400\t0.4626\t48\nchr6\t160100700\t160101000\t0.1063\t434\nchr6\t160409100\t160409400\t0.1139\t50\nchr6\t160611900\t160646700\t0\t282\nchr6\t160680300\t160680600\t0.2399\t74\nchr6\t161646000\t161646300\t0.2316\t45\nchr6\t161874000\t161874300\t0\t114\nchr6\t161900400\t161900700\t0.1605\t28\nchr6\t161982300\t161983800\t0\t86\nchr6\t162074100\t162074400\t0.3143\t11\nchr6\t162838800\t162844200\t0\t108\nchr6\t162990900\t162994200\t0.0015\t86\nchr6\t164076600\t164076900\t0.4418\t71\nchr6\t164798100\t164798700\t0.1733\t86\nchr6\t165123300\t165123600\t0.131\t83\nchr6\t165303600\t165306300\t0\t81\nchr6\t165370200\t165370500\t0.149\t152\nchr6\t166426200\t166426800\t0.0281\t83\nchr6\t166428300\t166428600\t0.1091\t133\nchr6\t166585500\t166586100\t0.0225\t56\nchr6\t166748700\t166749300\t0.3654\t24\nchr6\t166783800\t166784400\t0.2166\t42\nchr6\t167084700\t167085000\t0.1878\t88\nchr6\t167170800\t167171100\t0.2234\t63\nchr6\t167175900\t167176800\t0.0701\t72\nchr6\t167181300\t167183400\t0.0968\t71\nchr6\t167204400\t167204700\t0.1593\t52\nchr6\t167319600\t167319900\t0.1408\t48\nchr6\t167332500\t167335200\t0.084\t94\nchr6\t167358000\t167358600\t0.108\t45\nchr6\t167374500\t167374800\t0.3031\t65\nchr6\t167376600\t167376900\t0.0005\t19\nchr6\t167378100\t167381400\t0.1818\t70\nchr6\t167383800\t167384400\t0.2228\t64\nchr6\t167389500\t167389800\t0.1303\t13\nchr6\t167423700\t167424000\t0.1499\t17\nchr6\t167562300\t167562600\t0.3071\t72\nchr6\t167940300\t167941500\t0.1299\t137\nchr6\t167977500\t167977800\t0.2755\t60\nchr6\t168235200\t168235500\t0.459\t48\nchr6\t168245700\t168246300\t0.2571\t69\nchr6\t168316500\t168318000\t0\t80\nchr6\t168560700\t168562200\t0.0944\t33\nchr6\t168572100\t168573300\t0.4135\t55\nchr6\t168592800\t168594900\t0.0205\t105\nchr6\t168653700\t168655200\t0.0073\t72\nchr6\t168693000\t168693300\t0.1718\t55\nchr6\t168694800\t168695100\t0.2563\t55\nchr6\t168840600\t168840900\t0.3667\t73\nchr6\t168846900\t168847800\t0.1791\t138\nchr6\t168931800\t168932100\t0.465\t61\nchr6\t168942000\t168942300\t0.4958\t50\nchr6\t168976800\t168977100\t0.0725\t74\nchr6\t168978300\t168978600\t0.0725\t74\nchr6\t168991500\t168991800\t0.4809\t28\nchr6\t169032900\t169033200\t0.1067\t33\nchr6\t169377000\t169377600\t0.2309\t60\nchr6\t169425300\t169425600\t0.4766\t28\nchr6\t169900500\t169901100\t0.3103\t58\nchr6\t169987500\t169988400\t0.1783\t62\nchr6\t170064900\t170065200\t0.2219\t28\nchr6\t170145900\t170146500\t0.1753\t220\nchr6\t170190900\t170191200\t0.4364\t41\nchr6\t170214900\t170220600\t0\t115\nchr6\t170246400\t170246700\t0.0675\t20\nchr6\t170266800\t170267700\t0.2964\t28\nchr6\t170377200\t170377800\t0.3651\t192\nchr6\t170495400\t170495700\t0.4323\t107\nchr6\t170612100\t170626500\t0\t88\nchr6\t170627700\t170701200\t0\t88\nchr6\t170703300\t170705700\t0\t88\nchr6\t170706900\t170709900\t0\t88\nchr6\t170712600\t170736600\t0\t111\nchr6\t170738400\t170745900\t0\t75\nchr7\t9900\t32700\t0\t109\nchr7\t36300\t36900\t0.0115\t95\nchr7\t38700\t39000\t0.2265\t80\nchr7\t47400\t49500\t0.0555\t77\nchr7\t73200\t73500\t0.1026\t55\nchr7\t74700\t75000\t0.1026\t55\nchr7\t103200\t104100\t0.0292\t49\nchr7\t172800\t173100\t0.4245\t44\nchr7\t207000\t207300\t0.3256\t53\nchr7\t215400\t216000\t0.2207\t18\nchr7\t221400\t222000\t0\t22\nchr7\t243300\t243600\t0.0643\t29\nchr7\t361500\t361800\t0.2079\t30\nchr7\t393600\t393900\t0.3259\t76\nchr7\t419700\t420000\t0.2812\t24\nchr7\t470400\t471000\t0.1143\t12\nchr7\t478800\t479100\t0.2156\t15\nchr7\t552000\t552300\t0.4445\t97\nchr7\t608700\t609000\t0.2257\t45\nchr7\t636000\t636300\t0.1177\t51\nchr7\t747900\t748200\t0.0804\t29\nchr7\t847500\t847800\t0.4073\t41\nchr7\t889800\t890100\t0.3444\t21\nchr7\t906000\t906600\t0.4403\t82\nchr7\t933900\t934200\t0.4899\t20\nchr7\t990000\t990300\t0.2444\t18\nchr7\t1016100\t1016400\t0.4313\t41\nchr7\t1031400\t1031700\t0.3394\t23\nchr7\t1037700\t1040100\t0.0868\t91\nchr7\t1069500\t1070100\t0.0781\t70\nchr7\t1107900\t1108200\t0.1939\t41\nchr7\t1116600\t1117500\t0.244\t105\nchr7\t1145400\t1148100\t0\t100\nchr7\t1156200\t1156500\t0.0433\t20\nchr7\t1272000\t1274100\t0.0192\t338\nchr7\t1319700\t1320300\t0.0851\t55\nchr7\t1861500\t1861800\t0.0133\t56\nchr7\t1929900\t1930500\t0.264\t30\nchr7\t1937700\t1938000\t0.0247\t68\nchr7\t1990800\t1991400\t0\t67\nchr7\t2035500\t2035800\t0\t71\nchr7\t2058000\t2058300\t0.4896\t17\nchr7\t2278800\t2279100\t0.2426\t57\nchr7\t3708300\t3708600\t0.0944\t61\nchr7\t3813600\t3813900\t0.1099\t76\nchr7\t3815100\t3815400\t0.1099\t76\nchr7\t3975900\t3977100\t0.0393\t150\nchr7\t4263600\t4263900\t0.235\t37\nchr7\t4313100\t4313400\t0.1439\t35\nchr7\t4545000\t4545300\t0.1479\t110\nchr7\t4582500\t4599900\t0\t89\nchr7\t5121000\t5121300\t0.171\t60\nchr7\t5156400\t5156700\t0.0014\t64\nchr7\t5160300\t5160600\t0.0059\t64\nchr7\t5449200\t5449500\t0.2004\t31\nchr7\t5548800\t5549100\t0.2418\t40\nchr7\t5847600\t5847900\t0.3923\t69\nchr7\t5898900\t5899200\t0.0431\t68\nchr7\t5901000\t5901300\t0.1358\t28\nchr7\t5915700\t5925300\t0\t95\nchr7\t5929500\t5930700\t0\t80\nchr7\t5932200\t5937000\t0\t80\nchr7\t5938500\t5940900\t0\t80\nchr7\t5945700\t5957700\t0\t81\nchr7\t5958900\t5976900\t0\t81\nchr7\t5979900\t5980800\t0.0055\t60\nchr7\t6744300\t6744900\t0.0069\t65\nchr7\t6747900\t6780300\t0\t84\nchr7\t6782400\t6786300\t0\t84\nchr7\t6787500\t6792900\t0\t84\nchr7\t6794400\t6795600\t0\t84\nchr7\t6798000\t6800100\t0\t73\nchr7\t6801300\t6809400\t0\t73\nchr7\t6811200\t6811500\t0.271\t30\nchr7\t6825300\t6826200\t0.1925\t68\nchr7\t7465500\t7470600\t0\t87\nchr7\t7544400\t7545000\t0\t79\nchr7\t8299200\t8299500\t0.189\t74\nchr7\t8301000\t8301300\t0.189\t74\nchr7\t8303400\t8303700\t0.0384\t103\nchr7\t8352300\t8353800\t0.0927\t104\nchr7\t9400200\t9400800\t0.0164\t73\nchr7\t9402300\t9402600\t0.165\t70\nchr7\t9595200\t9596100\t0\t40\nchr7\t9740100\t9740400\t0.2178\t58\nchr7\t9808500\t9809100\t0.0109\t102\nchr7\t10166700\t10167900\t0.1348\t73\nchr7\t10170300\t10171200\t0.0227\t86\nchr7\t10464900\t10465500\t0.002\t40\nchr7\t10566900\t10567200\t0.3312\t68\nchr7\t10589700\t10590000\t0.3128\t77\nchr7\t12183000\t12183300\t0.114\t74\nchr7\t12485100\t12485700\t0.0209\t61\nchr7\t12501600\t12502200\t0.0403\t72\nchr7\t13085700\t13086000\t0.0857\t67\nchr7\t13203000\t13203300\t0.4742\t43\nchr7\t13272300\t13272600\t0.2344\t61\nchr7\t13630800\t13631100\t0.0632\t35\nchr7\t13650000\t13650300\t0.3013\t149\nchr7\t13768500\t13769700\t0.1829\t59\nchr7\t13808400\t13808700\t0.404\t77\nchr7\t14211600\t14212200\t0.0039\t31\nchr7\t14281800\t14282400\t0.0461\t96\nchr7\t14316300\t14318100\t0.0044\t87\nchr7\t14650200\t14650500\t0.0571\t63\nchr7\t14651700\t14652000\t0.0571\t63\nchr7\t14706000\t14708100\t0.0319\t78\nchr7\t15529800\t15530400\t0.0058\t35\nchr7\t15549000\t15549300\t0.2687\t92\nchr7\t15550800\t15551100\t0.2687\t92\nchr7\t15944100\t15945300\t0.2446\t177\nchr7\t16197900\t16198500\t0.1405\t78\nchr7\t16217400\t16220700\t0.1044\t77\nchr7\t16789200\t16789800\t0\t58\nchr7\t17017500\t17018700\t0.2141\t68\nchr7\t18105300\t18105600\t0.2406\t47\nchr7\t18985800\t18986700\t0.0005\t84\nchr7\t19197900\t19198200\t0.3962\t90\nchr7\t19458900\t19459800\t0.105\t79\nchr7\t19683600\t19683900\t0.1765\t79\nchr7\t19686900\t19687200\t0.2136\t71\nchr7\t20002800\t20003100\t0.2783\t72\nchr7\t20538600\t20538900\t0.4337\t67\nchr7\t20668800\t20669700\t0.3009\t76\nchr7\t22494000\t22494300\t0.3483\t42\nchr7\t22530600\t22534200\t0\t81\nchr7\t22801500\t22801800\t0.1765\t85\nchr7\t23036700\t23042400\t0.0119\t104\nchr7\t23324400\t23325000\t0.0826\t105\nchr7\t23637000\t23637900\t0.2861\t30\nchr7\t23952600\t23952900\t0.2821\t63\nchr7\t24001500\t24004800\t0\t61\nchr7\t24355800\t24356100\t0.1198\t36\nchr7\t24584100\t24584400\t0.2864\t109\nchr7\t24638400\t24638700\t0.2392\t43\nchr7\t24675600\t24675900\t0.2302\t21\nchr7\t25005000\t25005300\t0\t12\nchr7\t25018200\t25019700\t0.0675\t38\nchr7\t25041900\t25047600\t0\t168\nchr7\t25601700\t25602300\t0.0765\t86\nchr7\t25605600\t25608900\t0.0005\t98\nchr7\t25744500\t25744800\t0.085\t62\nchr7\t25748100\t25749600\t0.1497\t99\nchr7\t26176500\t26176800\t0.4793\t63\nchr7\t26283900\t26284200\t0.3128\t12\nchr7\t27743700\t27744000\t0.3185\t23\nchr7\t28839000\t28839300\t0.1022\t68\nchr7\t29580600\t29584200\t0.0215\t151\nchr7\t29961300\t29961600\t0.109\t63\nchr7\t30056100\t30056400\t0.2721\t90\nchr7\t30416400\t30417000\t0.1592\t72\nchr7\t30439500\t30445200\t0\t122\nchr7\t30637200\t30638400\t0.0222\t92\nchr7\t30640200\t30641100\t0.0222\t92\nchr7\t31484400\t31485600\t0\t60\nchr7\t31586100\t31586400\t0.3916\t67\nchr7\t31624200\t31624500\t0.2871\t55\nchr7\t32350500\t32353500\t0\t87\nchr7\t32386200\t32386800\t0.0911\t69\nchr7\t32465100\t32467500\t0.0163\t86\nchr7\t32469300\t32469900\t0.0163\t86\nchr7\t32684400\t32685000\t0\t88\nchr7\t32698800\t32699400\t0.1687\t51\nchr7\t32712000\t32713800\t0\t79\nchr7\t32737800\t32738100\t0.3023\t15\nchr7\t32825100\t32825400\t0.0593\t86\nchr7\t33170100\t33170400\t0.4079\t81\nchr7\t33523200\t33524100\t0.002\t85\nchr7\t33525300\t33525900\t0.2088\t72\nchr7\t33859200\t33859500\t0.3592\t22\nchr7\t33988800\t33989100\t0.2844\t33\nchr7\t33990900\t33992100\t0.3575\t77\nchr7\t34170600\t34170900\t0.2779\t70\nchr7\t34200300\t34201800\t0.0535\t78\nchr7\t34266600\t34267800\t0.0598\t83\nchr7\t34517700\t34518600\t0.0327\t101\nchr7\t34790700\t34791000\t0.0705\t38\nchr7\t34799700\t34801500\t0\t32\nchr7\t34816200\t34817700\t0\t40\nchr7\t34907700\t34908000\t0.1849\t55\nchr7\t34910700\t34911300\t0.255\t70\nchr7\t34954800\t34955100\t0.4134\t39\nchr7\t35045400\t35045700\t0.4207\t37\nchr7\t35116200\t35116800\t0.0565\t59\nchr7\t36554700\t36555300\t0.188\t100\nchr7\t36556500\t36556800\t0.3222\t59\nchr7\t37293000\t37293300\t0.0411\t20\nchr7\t37298700\t37300800\t0\t72\nchr7\t37612500\t37614000\t0.1009\t106\nchr7\t37615200\t37616400\t0.1009\t106\nchr7\t37807500\t37807800\t0.1103\t78\nchr7\t37959000\t37959300\t0.3808\t34\nchr7\t38028600\t38029500\t0.0213\t110\nchr7\t38473500\t38473800\t0.4838\t20\nchr7\t38696100\t38696400\t0.144\t64\nchr7\t39010500\t39011700\t0.2235\t82\nchr7\t39274500\t39274800\t0.0573\t77\nchr7\t39677400\t39678000\t0.0628\t47\nchr7\t39853200\t39853800\t0.003\t61\nchr7\t42786600\t42786900\t0.1812\t81\nchr7\t43060200\t43060500\t0.0833\t88\nchr7\t43063200\t43064700\t0.0833\t88\nchr7\t43413000\t43414500\t0.0142\t76\nchr7\t43415700\t43416000\t0.1324\t85\nchr7\t43777200\t43777500\t0.19\t103\nchr7\t44002800\t44003400\t0.0402\t99\nchr7\t44031600\t44031900\t0.2768\t94\nchr7\t44033100\t44033400\t0.3523\t82\nchr7\t44198700\t44199000\t0.2556\t59\nchr7\t45083400\t45084300\t0\t58\nchr7\t45811200\t45812700\t0.2273\t59\nchr7\t45948300\t45948600\t0.1165\t19\nchr7\t46821300\t46825500\t0\t81\nchr7\t47111700\t47112300\t0\t23\nchr7\t48850500\t48851100\t0.0168\t44\nchr7\t48864000\t48864600\t0.2291\t78\nchr7\t48907800\t48908100\t0.096\t72\nchr7\t48921600\t48921900\t0.2635\t58\nchr7\t49534800\t49535100\t0.1129\t50\nchr7\t49680300\t49686300\t0\t86\nchr7\t50122200\t50122500\t0.2895\t79\nchr7\t50901600\t50903700\t0.1206\t72\nchr7\t51891300\t51891600\t0.2739\t72\nchr7\t51894300\t51895200\t0.0748\t39\nchr7\t52892700\t52893300\t0.1276\t76\nchr7\t53027100\t53029500\t0.1372\t82\nchr7\t54221400\t54222900\t0\t77\nchr7\t54224100\t54231000\t0\t77\nchr7\t54311400\t54321000\t0\t76\nchr7\t55219200\t55221300\t0.0054\t93\nchr7\t55401900\t55402200\t0.242\t82\nchr7\t55472700\t55473000\t0.2419\t76\nchr7\t55747200\t55747500\t0.3106\t55\nchr7\t56370300\t56374800\t0\t2733\nchr7\t56377800\t56378100\t0.2242\t66\nchr7\t56586600\t56590500\t0.0033\t115\nchr7\t56748300\t56748900\t0.0147\t67\nchr7\t56750100\t56750700\t0.0367\t55\nchr7\t56813700\t56814000\t0.1092\t24\nchr7\t56817900\t56823000\t0\t86\nchr7\t56833800\t56834100\t0.0231\t62\nchr7\t56835900\t56836500\t0.1518\t47\nchr7\t56842500\t56842800\t0.1862\t75\nchr7\t56844900\t56845200\t0.012\t63\nchr7\t56848200\t56849100\t0.1799\t54\nchr7\t56852400\t56853000\t0.1036\t59\nchr7\t56854200\t56854500\t0.2435\t62\nchr7\t56866200\t56870100\t0.1263\t71\nchr7\t56878200\t56878800\t0.0009\t68\nchr7\t56883000\t56886000\t0\t72\nchr7\t56888100\t56889300\t0.1257\t65\nchr7\t56891100\t56891400\t0.029\t79\nchr7\t56894100\t56894400\t0.2358\t67\nchr7\t56902200\t56903700\t0.0097\t50\nchr7\t56907900\t56909100\t0.04\t75\nchr7\t56914500\t56914800\t0.0373\t61\nchr7\t56916600\t56916900\t0.0373\t61\nchr7\t56922000\t56922300\t0\t85\nchr7\t56924400\t56930400\t0\t85\nchr7\t56931600\t56932500\t0\t85\nchr7\t56933700\t56945100\t0\t85\nchr7\t56946300\t56951100\t0\t71\nchr7\t56952900\t56953200\t0\t69\nchr7\t56954700\t56956200\t0\t69\nchr7\t56957400\t56969400\t0\t78\nchr7\t56970900\t56973300\t0.0061\t65\nchr7\t56974800\t56993400\t0\t86\nchr7\t56997000\t56997300\t0\t53\nchr7\t57004800\t57005400\t0\t29\nchr7\t57007200\t57007500\t0\t29\nchr7\t57009600\t57009900\t0\t29\nchr7\t57012000\t57012300\t0\t29\nchr7\t57014400\t57036000\t0\t84\nchr7\t57037200\t57045300\t0\t67\nchr7\t57046500\t57048000\t0\t67\nchr7\t57050700\t57051300\t0\t60\nchr7\t57053400\t57053700\t0.1754\t57\nchr7\t57064800\t57065100\t0.2785\t60\nchr7\t57068100\t57075000\t0\t81\nchr7\t57077400\t57078600\t0\t81\nchr7\t57079800\t57081000\t0\t81\nchr7\t57083100\t57083400\t0\t81\nchr7\t57090000\t57090300\t0.2578\t58\nchr7\t57486000\t57490200\t0.1814\t475\nchr7\t57491400\t57497100\t0.1739\t557\nchr7\t57509100\t57509400\t0.123\t16\nchr7\t57611100\t57638100\t0\t175\nchr7\t57639900\t57640200\t0.1295\t68\nchr7\t57827400\t57853800\t0\t219\nchr7\t57898200\t57899100\t0.2466\t17\nchr7\t57937500\t57937800\t0.4875\t177\nchr7\t57945600\t57945900\t0.3198\t61\nchr7\t57983400\t57985200\t0.0118\t63\nchr7\t58036500\t58036800\t0.3405\t393\nchr7\t58096800\t58097100\t0.2401\t127\nchr7\t58170000\t58177200\t0\t1801\nchr7\t58179300\t58189500\t0\t1801\nchr7\t58191300\t58515000\t0\t1801\nchr7\t58516200\t58541100\t0\t1801\nchr7\t58542300\t58727100\t0\t1010\nchr7\t58728600\t58796100\t0\t4073\nchr7\t58797300\t58912200\t0\t4073\nchr7\t58913400\t58926900\t0\t4073\nchr7\t58928100\t59028900\t0\t4073\nchr7\t59030100\t59112000\t0\t4073\nchr7\t59113500\t59127600\t0\t4073\nchr7\t59128800\t59249100\t0\t1772\nchr7\t59250300\t59253900\t0\t1772\nchr7\t59255100\t59355300\t0\t2549\nchr7\t59356500\t59509200\t0\t4155\nchr7\t59511300\t59680800\t0\t321\nchr7\t59682600\t59752800\t0\t2715\nchr7\t59754000\t59824500\t0\t2715\nchr7\t59826000\t59888400\t0\t2715\nchr7\t59889600\t59891400\t0\t2715\nchr7\t59892600\t59951400\t0\t2715\nchr7\t59952600\t59958600\t0\t2715\nchr7\t59959800\t60038100\t0\t2715\nchr7\t60039300\t60117600\t0\t854\nchr7\t60118800\t60303900\t0\t1800\nchr7\t60305100\t60469800\t0\t1800\nchr7\t60471000\t60478200\t0\t1800\nchr7\t60480000\t60573000\t0\t1901\nchr7\t60574200\t60828300\t0\t1355\nchr7\t60878400\t60911400\t0\t68\nchr7\t61031400\t61031700\t0.4806\t129\nchr7\t61072800\t61074900\t0\t65\nchr7\t61115700\t61116900\t0\t64\nchr7\t61118400\t61130100\t0\t87\nchr7\t61131300\t61135800\t0\t87\nchr7\t61137000\t61139700\t0\t71\nchr7\t61141200\t61182900\t0\t208\nchr7\t61184100\t61194300\t0\t208\nchr7\t61195800\t61249500\t0\t208\nchr7\t61250700\t61260900\t0\t208\nchr7\t61262100\t61262400\t0\t208\nchr7\t61264500\t61266000\t0\t38\nchr7\t61268100\t61281000\t0\t232\nchr7\t61282500\t61327800\t0\t232\nchr7\t61380000\t61404000\t0\t424\nchr7\t61405200\t61422000\t0\t424\nchr7\t61423200\t61500600\t0\t213\nchr7\t61501800\t61512900\t0\t111\nchr7\t61514100\t61527600\t0\t175\nchr7\t61578000\t61725000\t0\t93\nchr7\t61728900\t61729500\t0.0075\t65\nchr7\t61758300\t61763700\t0\t70\nchr7\t61764900\t61765200\t0.2271\t75\nchr7\t61768200\t61768500\t0.0159\t69\nchr7\t61777800\t61779300\t0\t62\nchr7\t61795800\t61797600\t0.0166\t62\nchr7\t61799400\t61799700\t0.3661\t56\nchr7\t61802400\t61805100\t0.1708\t71\nchr7\t61806300\t61811400\t0\t74\nchr7\t61812900\t61813200\t0.0964\t42\nchr7\t61838400\t61843500\t0\t103\nchr7\t61867800\t61868400\t0.1028\t39\nchr7\t61967700\t61970400\t0.0117\t52\nchr7\t61972500\t61976100\t0\t266\nchr7\t62026500\t62027400\t0\t63\nchr7\t62030400\t62036400\t0\t95\nchr7\t62037600\t62041500\t0\t95\nchr7\t62043000\t62057700\t0\t95\nchr7\t62058900\t62113800\t0\t95\nchr7\t62115000\t62146500\t0\t95\nchr7\t62147700\t62151900\t0\t95\nchr7\t62153100\t62153400\t0.0151\t72\nchr7\t62158500\t62159100\t0.0092\t69\nchr7\t62177400\t62184300\t0\t80\nchr7\t62187300\t62187600\t0.1349\t62\nchr7\t62190000\t62191800\t0\t87\nchr7\t62209500\t62210100\t0.0356\t77\nchr7\t62211900\t62212200\t0.2175\t56\nchr7\t62214900\t62216400\t0\t64\nchr7\t62219400\t62226000\t0\t69\nchr7\t62264100\t62264400\t0.323\t80\nchr7\t62270700\t62271000\t0.1631\t23\nchr7\t62277300\t62292600\t0\t166\nchr7\t62295300\t62295600\t0.475\t163\nchr7\t62333100\t62333400\t0.1268\t68\nchr7\t62335200\t62335500\t0.2233\t276\nchr7\t62360700\t62375700\t0\t181\nchr7\t62402700\t62403000\t0.2544\t768\nchr7\t62454600\t62454900\t0.2631\t1117\nchr7\t62506800\t62511300\t0\t474\nchr7\t62516100\t62516400\t0.0401\t33\nchr7\t62544000\t62544300\t0.065\t10\nchr7\t62588100\t62588400\t0.1264\t53\nchr7\t62607600\t62608200\t0.2776\t75\nchr7\t63122100\t63122400\t0.0224\t42\nchr7\t63149100\t63154800\t0\t74\nchr7\t63292500\t63305400\t0\t84\nchr7\t63306900\t63365400\t0\t84\nchr7\t63382800\t63456000\t0\t82\nchr7\t63471300\t63471600\t0.2879\t64\nchr7\t63484800\t63485100\t0.0576\t20\nchr7\t63486900\t63493800\t0\t74\nchr7\t63495300\t63502800\t0\t74\nchr7\t63505500\t63505800\t0.0307\t51\nchr7\t63515400\t63515700\t0.1506\t48\nchr7\t63516900\t63517500\t0.025\t63\nchr7\t63525600\t63526200\t0.1109\t69\nchr7\t63529200\t63531900\t0\t70\nchr7\t63533100\t63553800\t0\t97\nchr7\t63555000\t63555300\t0.124\t49\nchr7\t63556500\t63558900\t0\t69\nchr7\t63561300\t63561900\t0.0251\t56\nchr7\t63583500\t63610200\t0\t78\nchr7\t63611400\t63627900\t0\t87\nchr7\t63629400\t63630600\t0\t87\nchr7\t63632400\t63653100\t0\t87\nchr7\t63660000\t63660300\t0.0127\t60\nchr7\t63662100\t63662400\t0.0127\t60\nchr7\t63667800\t63669600\t0\t62\nchr7\t63673200\t63674700\t0.0135\t60\nchr7\t63676800\t63677700\t0.0302\t52\nchr7\t63679800\t63680100\t0.1467\t62\nchr7\t63681300\t63682800\t0.0623\t50\nchr7\t63685200\t63686100\t0.0364\t51\nchr7\t63687600\t63688800\t0.001\t73\nchr7\t63690900\t63693900\t0.001\t73\nchr7\t63698100\t63698700\t0.0229\t69\nchr7\t63701100\t63701400\t0.2461\t39\nchr7\t63705300\t63705600\t0.1504\t60\nchr7\t63706800\t63708000\t0.1504\t60\nchr7\t63709500\t63710700\t0.1407\t54\nchr7\t63723900\t63724500\t0.1352\t65\nchr7\t63727800\t63728700\t0.2301\t78\nchr7\t63731400\t63732300\t0\t67\nchr7\t63739200\t63739500\t0.0707\t55\nchr7\t63740700\t63741000\t0.0707\t55\nchr7\t63742800\t63743400\t0.16\t74\nchr7\t63750000\t63751200\t0.0376\t77\nchr7\t63753600\t63765000\t0\t192\nchr7\t63768300\t63768900\t0.2262\t50\nchr7\t63770700\t63771000\t0.2639\t47\nchr7\t63774000\t63774300\t0.3333\t15\nchr7\t63776700\t63777000\t0.0265\t33\nchr7\t63825000\t63825600\t0.0347\t54\nchr7\t63827100\t63827400\t0.2332\t60\nchr7\t64645500\t64645800\t0.2358\t72\nchr7\t64808700\t64809300\t0.3343\t44\nchr7\t64856100\t64856400\t0\t37\nchr7\t64967100\t64967400\t0.148\t28\nchr7\t65028300\t65028600\t0.0159\t59\nchr7\t65073000\t65075100\t0.0091\t60\nchr7\t65106900\t65107800\t0\t46\nchr7\t65109300\t65109900\t0.2455\t69\nchr7\t65112600\t65112900\t0\t99\nchr7\t65114400\t65140800\t0\t99\nchr7\t65143800\t65144100\t0.3049\t93\nchr7\t65146800\t65149200\t0.0201\t75\nchr7\t65153100\t65156100\t0\t78\nchr7\t65161500\t65161800\t0.1527\t52\nchr7\t65163000\t65173800\t0\t78\nchr7\t65175900\t65176200\t0\t78\nchr7\t65179200\t65179500\t0.1407\t66\nchr7\t65181600\t65181900\t0.1596\t43\nchr7\t65185200\t65185500\t0.0749\t56\nchr7\t65192100\t65192400\t0.0208\t61\nchr7\t65193600\t65193900\t0.0905\t67\nchr7\t65196300\t65196900\t0.0093\t62\nchr7\t65199900\t65200200\t0.2284\t40\nchr7\t65202300\t65202600\t0.2649\t51\nchr7\t65204700\t65205000\t0.2649\t51\nchr7\t65217900\t65218200\t0.4211\t62\nchr7\t65258100\t65260200\t0\t58\nchr7\t65340900\t65341200\t0.269\t86\nchr7\t65489400\t65490300\t0.1192\t470\nchr7\t65506200\t65508300\t0\t67\nchr7\t65511900\t65513700\t0.1789\t91\nchr7\t65514900\t65515500\t0.1731\t77\nchr7\t65517300\t65517600\t0.3465\t58\nchr7\t65520300\t65550300\t0\t117\nchr7\t65551500\t65560200\t0\t117\nchr7\t65562900\t65565600\t0\t70\nchr7\t65566800\t65576400\t0\t83\nchr7\t65578800\t65581500\t0.0101\t82\nchr7\t65583300\t65583600\t0.1103\t88\nchr7\t65586300\t65586600\t0.1678\t77\nchr7\t65630700\t65651400\t0\t83\nchr7\t65652600\t65682900\t0\t83\nchr7\t65687700\t65688300\t0.0018\t78\nchr7\t65691600\t65691900\t0.0575\t53\nchr7\t65694300\t65694600\t0.1106\t51\nchr7\t65697900\t65699700\t0.017\t73\nchr7\t65701800\t65702400\t0.017\t73\nchr7\t65708100\t65708400\t0.0674\t57\nchr7\t65721600\t65721900\t0.4038\t55\nchr7\t65762400\t65764500\t0\t67\nchr7\t65864700\t65865000\t0.0414\t54\nchr7\t65946000\t65946300\t0.1976\t57\nchr7\t65948400\t65948700\t0.0626\t55\nchr7\t66001200\t66001500\t0.1049\t45\nchr7\t66003600\t66004200\t0.1818\t64\nchr7\t66287100\t66292800\t0\t80\nchr7\t66394200\t66395100\t0.0994\t58\nchr7\t67031100\t67031700\t0.0238\t76\nchr7\t67185900\t67186200\t0.1337\t42\nchr7\t67232700\t67233300\t0\t25\nchr7\t67275300\t67275900\t0.031\t59\nchr7\t67278300\t67279500\t0.2646\t70\nchr7\t67281000\t67281300\t0.2489\t86\nchr7\t67290300\t67290600\t0.2714\t86\nchr7\t67335600\t67335900\t0.0678\t50\nchr7\t68652300\t68652600\t0.1804\t64\nchr7\t70197300\t70203900\t0\t87\nchr7\t71102100\t71102400\t0.2939\t41\nchr7\t71679900\t71680800\t0.3054\t72\nchr7\t71747700\t71748000\t0.2281\t14\nchr7\t72296100\t72296700\t0.2759\t73\nchr7\t72529500\t72530400\t0.0033\t66\nchr7\t72580800\t72581100\t0.267\t32\nchr7\t72795600\t72796200\t0.022\t58\nchr7\t72851400\t72852300\t0.0064\t74\nchr7\t72864900\t72865200\t0.2062\t71\nchr7\t72874500\t72875700\t0.0435\t67\nchr7\t72942300\t72942900\t0.2098\t68\nchr7\t72950700\t73001400\t0\t102\nchr7\t73002900\t73005300\t0\t102\nchr7\t73007100\t73103700\t0\t112\nchr7\t73104900\t73114200\t0\t112\nchr7\t73115400\t73122900\t0\t95\nchr7\t73124100\t73126500\t0\t79\nchr7\t73127700\t73134300\t0\t100\nchr7\t73135500\t73137000\t0\t100\nchr7\t73138800\t73142400\t0\t100\nchr7\t73144800\t73154400\t0\t100\nchr7\t73155600\t73166700\t0\t100\nchr7\t73167900\t73173300\t0\t100\nchr7\t73174500\t73210800\t0\t100\nchr7\t73212000\t73228800\t0\t100\nchr7\t73230000\t73237200\t0\t85\nchr7\t73239600\t73241100\t0.069\t84\nchr7\t73251300\t73252800\t0.1095\t59\nchr7\t73255500\t73257000\t0\t68\nchr7\t73258500\t73259700\t0\t68\nchr7\t73262100\t73264800\t0\t71\nchr7\t73266000\t73267500\t0\t71\nchr7\t73269000\t73269300\t0.2597\t50\nchr7\t73273800\t73274100\t0.3032\t56\nchr7\t73277700\t73279800\t0.0047\t78\nchr7\t73281000\t73281600\t0.0047\t78\nchr7\t73284600\t73284900\t0.1931\t59\nchr7\t73292400\t73294800\t0.019\t73\nchr7\t73296300\t73297800\t0.019\t73\nchr7\t73776000\t73776300\t0.348\t36\nchr7\t73835400\t73835700\t0.3505\t42\nchr7\t74728500\t74730600\t0\t67\nchr7\t74733000\t74733300\t0\t103\nchr7\t74734500\t74761200\t0\t103\nchr7\t74762400\t74771400\t0\t103\nchr7\t74772600\t74778300\t0\t89\nchr7\t74779500\t74782500\t0\t89\nchr7\t74784300\t74790600\t0\t74\nchr7\t74793600\t74794200\t0\t78\nchr7\t74795700\t74810400\t0\t78\nchr7\t74811600\t74818200\t0\t78\nchr7\t74819400\t74829600\t0\t81\nchr7\t74830800\t74840400\t0\t81\nchr7\t74842800\t74859900\t0\t77\nchr7\t74862000\t74865300\t0\t62\nchr7\t74867100\t74869200\t0.079\t68\nchr7\t74873100\t74873400\t0.2437\t64\nchr7\t74875500\t74875800\t0.4021\t61\nchr7\t74877900\t74878200\t0.1568\t64\nchr7\t74882700\t74885700\t0\t71\nchr7\t74889900\t74890200\t0.0812\t57\nchr7\t74891400\t74892900\t0\t62\nchr7\t74894100\t74906700\t0\t80\nchr7\t74910900\t74914500\t0\t74\nchr7\t74916900\t74919900\t0\t70\nchr7\t74926500\t74931600\t0\t98\nchr7\t74932800\t74935200\t0\t98\nchr7\t74939400\t74940900\t0.0068\t84\nchr7\t74942100\t74943000\t0.0068\t84\nchr7\t74944500\t74945400\t0.0068\t84\nchr7\t74947800\t74951700\t0\t66\nchr7\t74953500\t74956200\t0\t91\nchr7\t74957700\t74971800\t0\t91\nchr7\t74973300\t74976900\t0\t91\nchr7\t74978400\t74981400\t0\t78\nchr7\t74982600\t74983200\t0\t78\nchr7\t75075000\t75077100\t0.0234\t60\nchr7\t75078900\t75079800\t0.0719\t37\nchr7\t75081300\t75082200\t0\t59\nchr7\t75084300\t75091500\t0\t73\nchr7\t75093900\t75101100\t0\t71\nchr7\t75106500\t75113400\t0\t72\nchr7\t75114900\t75116400\t0\t72\nchr7\t75119100\t75120600\t0\t70\nchr7\t75122400\t75126300\t0\t70\nchr7\t75127500\t75129600\t0\t90\nchr7\t75130800\t75134100\t0\t90\nchr7\t75135600\t75146700\t0\t90\nchr7\t75149100\t75149400\t0\t90\nchr7\t75150900\t75153000\t0.2376\t76\nchr7\t75156000\t75156300\t0.0597\t54\nchr7\t75158100\t75272100\t0\t99\nchr7\t75273900\t75362400\t0\t92\nchr7\t75363600\t75414300\t0\t82\nchr7\t75422400\t75422700\t0.2653\t66\nchr7\t75426300\t75427500\t0.01\t76\nchr7\t75443700\t75444000\t0\t69\nchr7\t75445200\t75446100\t0\t69\nchr7\t75451200\t75451800\t0.321\t66\nchr7\t75459300\t75459600\t0.3399\t50\nchr7\t75478800\t75479100\t0.1676\t63\nchr7\t75490500\t75491100\t0.1757\t66\nchr7\t75496800\t75497100\t0.1031\t79\nchr7\t75499800\t75500400\t0.1031\t79\nchr7\t75506700\t75507300\t0.0241\t46\nchr7\t75706800\t75708000\t0.0055\t61\nchr7\t75828900\t75829200\t0.1555\t59\nchr7\t75834600\t75834900\t0.1045\t72\nchr7\t76266000\t76266300\t0.1145\t14\nchr7\t76438800\t76439100\t0.0729\t57\nchr7\t76442100\t76442700\t0\t84\nchr7\t76446000\t76447500\t0\t73\nchr7\t76455300\t76463100\t0\t67\nchr7\t76465800\t76466100\t0.0086\t72\nchr7\t76467300\t76468800\t0.0086\t72\nchr7\t76470300\t76470900\t0.0182\t66\nchr7\t76473600\t76473900\t0.0316\t43\nchr7\t76475700\t76476300\t0.0318\t56\nchr7\t76479000\t76479300\t0.2502\t55\nchr7\t76484100\t76491000\t0\t68\nchr7\t76492500\t76494600\t0\t60\nchr7\t76496400\t76497000\t0.0149\t64\nchr7\t76500300\t76500600\t0.244\t23\nchr7\t76504200\t76504500\t0.1546\t48\nchr7\t76519200\t76519500\t0.0351\t12\nchr7\t76521600\t76522500\t0\t24\nchr7\t76524900\t76525800\t0\t69\nchr7\t76527000\t76532400\t0\t69\nchr7\t76534800\t76538700\t0\t69\nchr7\t76544700\t76545900\t0.0792\t63\nchr7\t76605000\t76606800\t0.0165\t52\nchr7\t76609200\t76610100\t0\t61\nchr7\t76612200\t76614600\t0\t57\nchr7\t76617300\t76617900\t0.3307\t59\nchr7\t76619700\t76620300\t0.1502\t29\nchr7\t76626900\t76630800\t0\t68\nchr7\t76632900\t76634100\t0\t68\nchr7\t76635900\t76636200\t0\t68\nchr7\t76639800\t76642800\t0.0468\t57\nchr7\t76648500\t76649100\t0.0342\t45\nchr7\t76652100\t76652700\t0.0478\t64\nchr7\t76660800\t76661100\t0.1608\t52\nchr7\t76672800\t76673100\t0.1961\t52\nchr7\t76695600\t76695900\t0.1886\t38\nchr7\t76733100\t76734000\t0.0796\t65\nchr7\t76737000\t76737300\t0.2046\t67\nchr7\t76749600\t76749900\t0.4466\t19\nchr7\t76768500\t76769100\t0.1548\t57\nchr7\t76790700\t76791000\t0.2686\t51\nchr7\t76870800\t76871100\t0.253\t58\nchr7\t76881300\t76881600\t0.3252\t45\nchr7\t76896900\t76897200\t0.3863\t55\nchr7\t76951200\t76951500\t0.1595\t73\nchr7\t76952700\t76953900\t0.1595\t73\nchr7\t76956300\t76962300\t0\t65\nchr7\t76963800\t76964400\t0.1047\t67\nchr7\t76965600\t76966800\t0.039\t69\nchr7\t76968600\t76969200\t0.0662\t79\nchr7\t76973700\t76974300\t0.0352\t56\nchr7\t76982400\t76985400\t0.0142\t70\nchr7\t76987200\t76987500\t0.089\t59\nchr7\t76990500\t76991100\t0.0057\t55\nchr7\t76993200\t76993500\t0.3666\t70\nchr7\t77012100\t77019900\t0\t75\nchr7\t77021700\t77022600\t0\t72\nchr7\t77023800\t77025300\t0\t72\nchr7\t77026800\t77037300\t0\t101\nchr7\t77039100\t77048100\t0\t101\nchr7\t77056200\t77056800\t0.0794\t83\nchr7\t77061300\t77061600\t0.228\t60\nchr7\t77078700\t77080200\t0.0507\t69\nchr7\t77093700\t77094000\t0.0022\t52\nchr7\t77099100\t77099400\t0.1538\t53\nchr7\t77100900\t77101800\t0.1935\t45\nchr7\t77106600\t77106900\t0.2576\t46\nchr7\t77114400\t77114700\t0.2398\t54\nchr7\t77116200\t77116800\t0.022\t52\nchr7\t77157000\t77157300\t0.0348\t73\nchr7\t77508900\t77510400\t0.0371\t78\nchr7\t79230900\t79234200\t0.0426\t77\nchr7\t79885500\t79886700\t0.1995\t66\nchr7\t79939200\t79939800\t0.2259\t72\nchr7\t80713800\t80714100\t0.1857\t98\nchr7\t80715900\t80716200\t0.3443\t47\nchr7\t80718300\t80718600\t0.3124\t45\nchr7\t81172500\t81172800\t0.3807\t16\nchr7\t81785100\t81785700\t0.1629\t49\nchr7\t82806900\t82807200\t0.1676\t80\nchr7\t83026800\t83029800\t0.1101\t61\nchr7\t83298000\t83298300\t0.3899\t63\nchr7\t83747400\t83747700\t0.3094\t45\nchr7\t84053100\t84053700\t0.1591\t59\nchr7\t84065100\t84065400\t0.1133\t82\nchr7\t84067800\t84068100\t0.1513\t109\nchr7\t85250700\t85251000\t0.1916\t50\nchr7\t85254000\t85254300\t0.2907\t54\nchr7\t85330200\t85334700\t0.1293\t93\nchr7\t86343600\t86344500\t0.2127\t69\nchr7\t86457300\t86457900\t0.0645\t69\nchr7\t86986200\t86986500\t0.1812\t43\nchr7\t87042000\t87042300\t0.3216\t94\nchr7\t87044100\t87045300\t0.104\t64\nchr7\t87063000\t87064200\t0.0626\t70\nchr7\t87242700\t87243000\t0.3051\t100\nchr7\t87626400\t87626700\t0.3732\t31\nchr7\t87703800\t87704100\t0.2983\t96\nchr7\t87951300\t87951900\t0.0818\t66\nchr7\t88551900\t88553100\t0.1058\t65\nchr7\t89195100\t89195400\t0.1305\t102\nchr7\t89789400\t89790900\t0.1496\t61\nchr7\t89792100\t89792400\t0.1496\t61\nchr7\t89899200\t89899500\t0.2336\t109\nchr7\t90074400\t90075000\t0.0026\t57\nchr7\t90117000\t90117300\t0.1516\t55\nchr7\t91175700\t91176000\t0.3585\t65\nchr7\t91177800\t91178400\t0.0669\t76\nchr7\t91217400\t91218000\t0.1438\t86\nchr7\t91587300\t91587900\t0.0547\t84\nchr7\t91905900\t91906800\t0.0853\t92\nchr7\t92013000\t92013300\t0.3359\t62\nchr7\t92561100\t92562000\t0.058\t52\nchr7\t93788100\t93793200\t0\t68\nchr7\t94159800\t94160400\t0.0454\t116\nchr7\t95833200\t95835300\t0.1117\t83\nchr7\t95942700\t95943000\t0.26\t59\nchr7\t96554100\t96554400\t0.2754\t51\nchr7\t96555600\t96557100\t0.3431\t62\nchr7\t96846600\t96852600\t0\t90\nchr7\t97533300\t97533600\t0.1327\t65\nchr7\t97614300\t97619400\t0.0112\t86\nchr7\t97702200\t97702500\t0.2101\t77\nchr7\t97765800\t97766100\t0.2601\t60\nchr7\t97778400\t97779000\t0.2438\t62\nchr7\t99809700\t99815100\t0\t94\nchr7\t100308900\t100311300\t0.0593\t69\nchr7\t100313100\t100314900\t0.0593\t69\nchr7\t100740300\t100742700\t0.0428\t59\nchr7\t100993500\t101004300\t0.0156\t344\nchr7\t101358000\t101359500\t0.0445\t75\nchr7\t101691000\t101691300\t0.4019\t30\nchr7\t102341700\t102342300\t0.0451\t74\nchr7\t102343500\t102343800\t0.2726\t85\nchr7\t102345000\t102345600\t0.0021\t56\nchr7\t102347400\t102357900\t0\t135\nchr7\t102476700\t102527100\t0\t119\nchr7\t102528300\t102541500\t0\t119\nchr7\t102543000\t102554100\t0\t96\nchr7\t102555300\t102576900\t0\t107\nchr7\t102579300\t102605100\t0\t124\nchr7\t102606300\t102618000\t0\t124\nchr7\t102620100\t102634800\t0\t124\nchr7\t102636300\t102640800\t0\t124\nchr7\t102642000\t102664800\t0\t124\nchr7\t102666000\t102676500\t0\t117\nchr7\t102677700\t102690900\t0\t117\nchr7\t102713700\t102714000\t0.2846\t67\nchr7\t102756600\t102756900\t0.2407\t74\nchr7\t102764400\t102764700\t0.2004\t50\nchr7\t102771900\t102772200\t0.1693\t57\nchr7\t102792300\t102792900\t0.1546\t58\nchr7\t103910100\t103911000\t0.2532\t65\nchr7\t104507400\t104508000\t0.1272\t60\nchr7\t104559000\t104560500\t0.0745\t84\nchr7\t105405600\t105405900\t0.4163\t27\nchr7\t106101300\t106101600\t0.0666\t1123\nchr7\t106245000\t106245900\t0\t82\nchr7\t107418300\t107418600\t0.179\t45\nchr7\t107422800\t107423100\t0.0652\t57\nchr7\t107769900\t107770500\t0.2184\t286\nchr7\t108256200\t108256500\t0.2012\t71\nchr7\t108507900\t108509400\t0.0042\t72\nchr7\t108938100\t108938400\t0.1414\t94\nchr7\t109013700\t109014000\t0.1898\t50\nchr7\t109095900\t109098300\t0\t75\nchr7\t109899600\t109899900\t0.1016\t25\nchr7\t109906200\t109908600\t0\t76\nchr7\t110402100\t110402400\t0.0686\t36\nchr7\t110558700\t110560800\t0.0014\t78\nchr7\t110562000\t110562600\t0.0014\t78\nchr7\t110707200\t110712600\t0\t84\nchr7\t111243600\t111249300\t0\t120\nchr7\t111447000\t111447300\t0.0475\t73\nchr7\t111448500\t111449700\t0.0475\t73\nchr7\t111455700\t111457200\t0\t65\nchr7\t111502800\t111503100\t0.2704\t75\nchr7\t111610800\t111611100\t0.1276\t58\nchr7\t111963600\t111969000\t0\t90\nchr7\t112552200\t112552500\t0.0947\t78\nchr7\t112975500\t112978200\t0\t57\nchr7\t112979700\t112981200\t0\t56\nchr7\t113259900\t113260200\t0.4074\t72\nchr7\t113385000\t113385300\t0.256\t57\nchr7\t113430300\t113430600\t0.2242\t81\nchr7\t113493000\t113494500\t0\t72\nchr7\t113495700\t113496000\t0.0606\t69\nchr7\t113497200\t113499300\t0.0606\t69\nchr7\t113536800\t113537100\t0.2909\t69\nchr7\t113661300\t113661900\t0.2193\t70\nchr7\t113745000\t113745300\t0.1135\t120\nchr7\t113776200\t113782200\t0\t141\nchr7\t114454500\t114454800\t0.3548\t39\nchr7\t115026300\t115026600\t0.4501\t49\nchr7\t115028700\t115029000\t0.3097\t35\nchr7\t115261500\t115263600\t0.0349\t81\nchr7\t116718900\t116719200\t0.1747\t97\nchr7\t116720400\t116721000\t0.1747\t97\nchr7\t116723100\t116723400\t0.1747\t97\nchr7\t117031500\t117031800\t0.2043\t101\nchr7\t117525300\t117529200\t0\t70\nchr7\t118343100\t118343400\t0.0417\t63\nchr7\t118703700\t118704000\t0.1945\t68\nchr7\t118964700\t118965300\t0.0863\t32\nchr7\t119589300\t119589600\t0.3609\t62\nchr7\t119591400\t119591700\t0.0717\t56\nchr7\t119657100\t119657400\t0.2356\t64\nchr7\t120323700\t120325200\t0.0567\t63\nchr7\t121443600\t121443900\t0.1833\t62\nchr7\t121649400\t121650000\t0.1321\t30\nchr7\t122232000\t122233500\t0.2072\t53\nchr7\t122239500\t122241000\t0.164\t78\nchr7\t122242800\t122244300\t0.2347\t88\nchr7\t122280300\t122281500\t0.2117\t83\nchr7\t122283300\t122283900\t0.0677\t76\nchr7\t122569800\t122570100\t0.2882\t68\nchr7\t123042600\t123042900\t0.1439\t35\nchr7\t123429300\t123429600\t0.2222\t71\nchr7\t123780900\t123781500\t0.0687\t79\nchr7\t123996900\t123997200\t0.2458\t32\nchr7\t124094400\t124094700\t0.229\t95\nchr7\t125179800\t125180100\t0.0189\t43\nchr7\t125221500\t125222100\t0.0531\t83\nchr7\t125384700\t125385000\t0.3474\t64\nchr7\t126168300\t126168600\t0.1966\t66\nchr7\t126601500\t126602400\t0.3683\t76\nchr7\t126829200\t126829500\t0.1377\t76\nchr7\t127963500\t127966800\t0.0104\t80\nchr7\t127980000\t127980300\t0.4776\t34\nchr7\t128295000\t128295300\t0.2481\t74\nchr7\t128655300\t128655600\t0.3019\t58\nchr7\t130480800\t130481400\t0.1145\t75\nchr7\t130541700\t130542000\t0.238\t71\nchr7\t130578900\t130579200\t0.0142\t93\nchr7\t130580400\t130582500\t0.0142\t93\nchr7\t130702200\t130703400\t0.0049\t78\nchr7\t133178100\t133178400\t0.3374\t43\nchr7\t133422900\t133423200\t0.2122\t25\nchr7\t133524000\t133524600\t0.1419\t60\nchr7\t133889700\t133894800\t0\t67\nchr7\t136094400\t136094700\t0.3357\t72\nchr7\t136415100\t136418100\t0.0844\t89\nchr7\t136764300\t136764600\t0.2292\t70\nchr7\t136776300\t136776600\t0.3515\t40\nchr7\t136797900\t136798200\t0.1515\t69\nchr7\t136834800\t136835100\t0.3385\t39\nchr7\t136972800\t136973100\t0.2055\t49\nchr7\t137137200\t137137500\t0.1038\t79\nchr7\t137334300\t137334600\t0.0563\t49\nchr7\t137427900\t137428200\t0.2193\t61\nchr7\t137429700\t137430000\t0.1447\t49\nchr7\t138621900\t138622200\t0.3489\t181\nchr7\t139794900\t139795500\t0.1774\t119\nchr7\t140363100\t140363400\t0.3957\t62\nchr7\t141037500\t141037800\t0.2864\t69\nchr7\t141062400\t141067800\t0\t67\nchr7\t141882300\t141883500\t0.0971\t83\nchr7\t141920700\t141926700\t0\t75\nchr7\t141981000\t141981300\t0.1629\t57\nchr7\t141983400\t141984000\t0.0522\t83\nchr7\t142042500\t142045200\t0\t31\nchr7\t142132800\t142133100\t0.1495\t19\nchr7\t142893600\t142893900\t0.3286\t28\nchr7\t143522100\t143524500\t0\t50\nchr7\t143526000\t143529600\t0\t55\nchr7\t143531700\t143537100\t0\t72\nchr7\t143540700\t143548500\t0\t88\nchr7\t143550000\t143556300\t0\t88\nchr7\t143557500\t143561400\t0\t88\nchr7\t143563500\t143570700\t0\t93\nchr7\t143571900\t143580600\t0\t93\nchr7\t143581800\t143585700\t0\t93\nchr7\t143587200\t143593200\t0\t93\nchr7\t143594400\t143610300\t0\t93\nchr7\t143612400\t143650800\t0\t67\nchr7\t143700900\t143707200\t0\t69\nchr7\t143708700\t143725200\t0\t60\nchr7\t143726400\t143727900\t0\t60\nchr7\t143743800\t143747700\t0\t89\nchr7\t143749500\t143766600\t0\t89\nchr7\t143768100\t143779500\t0\t89\nchr7\t143781000\t143787000\t0\t77\nchr7\t143788500\t143788800\t0\t77\nchr7\t143792400\t143798100\t0\t76\nchr7\t143799900\t143802900\t0\t92\nchr7\t143805000\t143844900\t0\t92\nchr7\t143852700\t143874600\t0\t92\nchr7\t144120000\t144120300\t0.1706\t85\nchr7\t144180000\t144181200\t0\t85\nchr7\t144182400\t144190500\t0\t85\nchr7\t144191700\t144197700\t0\t85\nchr7\t144199200\t144226200\t0\t84\nchr7\t144230100\t144234600\t0\t71\nchr7\t144236700\t144253500\t0\t83\nchr7\t144256500\t144259500\t0.001\t100\nchr7\t144262200\t144263700\t0.0024\t94\nchr7\t144265500\t144271800\t0\t85\nchr7\t144273000\t144276000\t0\t85\nchr7\t144277200\t144285300\t0\t85\nchr7\t144286800\t144322200\t0\t85\nchr7\t144324900\t144330900\t0\t85\nchr7\t144332400\t144351600\t0\t85\nchr7\t144353400\t144362700\t0\t93\nchr7\t144364200\t144370200\t0\t93\nchr7\t144371400\t144372300\t0\t93\nchr7\t144373500\t144377100\t0\t93\nchr7\t144685500\t144685800\t0.3511\t77\nchr7\t144692100\t144693000\t0.2816\t67\nchr7\t145192500\t145192800\t0.4227\t35\nchr7\t145238700\t145239300\t0.3114\t70\nchr7\t145305000\t145305300\t0.1345\t54\nchr7\t145343100\t145343400\t0.245\t62\nchr7\t146015400\t146017200\t0.0978\t87\nchr7\t146604000\t146604600\t0.1283\t73\nchr7\t146907300\t146910000\t0.0143\t86\nchr7\t147084000\t147084300\t0.137\t12\nchr7\t147322800\t147323400\t0.1978\t62\nchr7\t147842700\t147847800\t0\t76\nchr7\t148647900\t148648200\t0.0954\t54\nchr7\t149906700\t149907300\t0.0152\t58\nchr7\t149916600\t149916900\t0.3539\t47\nchr7\t149934900\t149935500\t0\t47\nchr7\t149947200\t149947500\t0.2996\t40\nchr7\t149950800\t149951400\t0.0067\t61\nchr7\t149953800\t149954100\t0.1471\t60\nchr7\t149973900\t149974200\t0.1088\t37\nchr7\t149986800\t149987100\t0.2128\t62\nchr7\t149990400\t149990700\t0.0903\t63\nchr7\t150000300\t150000900\t0.0219\t60\nchr7\t150010800\t150011100\t0.2642\t73\nchr7\t150012900\t150013200\t0.2554\t50\nchr7\t150027300\t150027600\t0.3103\t62\nchr7\t150030000\t150030300\t0.0832\t47\nchr7\t150046500\t150046800\t0.2361\t58\nchr7\t150052500\t150052800\t0.2323\t71\nchr7\t150056700\t150057000\t0.2305\t55\nchr7\t150060900\t150063300\t0\t71\nchr7\t150071400\t150072300\t0.1134\t62\nchr7\t150075000\t150075300\t0.1134\t62\nchr7\t150091200\t150091800\t0.0071\t65\nchr7\t150145500\t150145800\t0.053\t56\nchr7\t150147900\t150148200\t0.1165\t40\nchr7\t150151800\t150152100\t0.3308\t15\nchr7\t150153600\t150153900\t0.1215\t59\nchr7\t150171000\t150171300\t0.3592\t63\nchr7\t150187500\t150187800\t0.0863\t69\nchr7\t150189600\t150189900\t0.0565\t52\nchr7\t150199200\t150199500\t0.1209\t60\nchr7\t150218700\t150219000\t0.2193\t69\nchr7\t150238200\t150238500\t0.143\t56\nchr7\t150247500\t150247800\t0.1333\t53\nchr7\t150261900\t150262200\t0.2161\t57\nchr7\t150268500\t150270300\t0\t77\nchr7\t150295800\t150296100\t0.0815\t64\nchr7\t150298500\t150298800\t0.1966\t55\nchr7\t150557400\t150557700\t0.2607\t43\nchr7\t150674400\t150674700\t0.1995\t48\nchr7\t150711300\t150711600\t0.2195\t74\nchr7\t150909600\t150910500\t0.3309\t153\nchr7\t151603200\t151603500\t0.4772\t45\nchr7\t151737900\t151738200\t0.2271\t74\nchr7\t152584800\t152586600\t0.0259\t46\nchr7\t152785500\t152786400\t0.007\t65\nchr7\t152802300\t152802600\t0.1485\t52\nchr7\t152811000\t152811300\t0.2705\t58\nchr7\t152812800\t152814300\t0.1079\t55\nchr7\t152816700\t152817000\t0.1255\t12\nchr7\t152839500\t152841300\t0\t81\nchr7\t153312000\t153312300\t0.3189\t56\nchr7\t153707100\t153707400\t0.0676\t54\nchr7\t153711000\t153711300\t0.1541\t66\nchr7\t153721800\t153722100\t0.1611\t60\nchr7\t153748500\t153748800\t0.0507\t29\nchr7\t153750300\t153750600\t0.1234\t43\nchr7\t153777300\t153777900\t0.1181\t63\nchr7\t153779400\t153779700\t0.2547\t63\nchr7\t153821400\t153821700\t0.0259\t53\nchr7\t153853800\t153855000\t0.1958\t64\nchr7\t154008900\t154009500\t0.1727\t67\nchr7\t154025400\t154025700\t0.2148\t67\nchr7\t154026900\t154027200\t0.2148\t67\nchr7\t154037400\t154040100\t0\t71\nchr7\t154043700\t154044000\t0.1627\t61\nchr7\t154047900\t154048800\t0\t60\nchr7\t154053900\t154054200\t0.3872\t70\nchr7\t154067100\t154067400\t0.0992\t61\nchr7\t154068900\t154069200\t0.4316\t64\nchr7\t154075500\t154075800\t0.353\t51\nchr7\t154088400\t154088700\t0.277\t64\nchr7\t154096200\t154096500\t0.0464\t59\nchr7\t154106100\t154106400\t0.2845\t70\nchr7\t154109700\t154110000\t0.2063\t66\nchr7\t154119600\t154119900\t0.1165\t70\nchr7\t154142700\t154143000\t0.2341\t61\nchr7\t154145700\t154146300\t0.0104\t53\nchr7\t154161600\t154162200\t0.0136\t45\nchr7\t154456800\t154457700\t0\t65\nchr7\t154661100\t154661400\t0.0635\t13\nchr7\t155328600\t155329200\t0.4403\t148\nchr7\t155341200\t155341500\t0.1159\t169\nchr7\t155350500\t155350800\t0.171\t66\nchr7\t155366700\t155367300\t0.0318\t101\nchr7\t155406900\t155407500\t0.2722\t100\nchr7\t155573700\t155574000\t0.3577\t47\nchr7\t155934000\t155934300\t0.487\t17\nchr7\t156154200\t156155700\t0\t320\nchr7\t157441500\t157441800\t0.4444\t37\nchr7\t157470300\t157470600\t0.1719\t79\nchr7\t157554000\t157554300\t0.239\t37\nchr7\t157647300\t157648500\t0.1406\t32\nchr7\t157710900\t157711200\t0.0107\t29\nchr7\t157716600\t157716900\t0.4229\t64\nchr7\t157725900\t157726200\t0.4069\t102\nchr7\t157731600\t157734000\t0.1766\t43\nchr7\t157749000\t157749300\t0.448\t69\nchr7\t157838700\t157839000\t0.3828\t58\nchr7\t157858200\t157859100\t0.0439\t22\nchr7\t157924800\t157925400\t0.3051\t148\nchr7\t157972500\t157972800\t0.4917\t51\nchr7\t157983000\t157983300\t0.1937\t51\nchr7\t157994700\t157995000\t0.3452\t12\nchr7\t158000700\t158001000\t0.1985\t28\nchr7\t158058300\t158058600\t0.475\t56\nchr7\t158088000\t158090100\t0.2276\t59\nchr7\t158099100\t158099700\t0.1965\t13\nchr7\t158146800\t158148900\t0.0809\t481\nchr7\t158158800\t158159100\t0.4179\t73\nchr7\t158198700\t158199000\t0.361\t49\nchr7\t158237100\t158237700\t0.0645\t48\nchr7\t158315100\t158315400\t0.491\t127\nchr7\t158330100\t158330400\t0.3832\t80\nchr7\t158334600\t158335800\t0.4604\t20\nchr7\t158338500\t158340000\t0\t51\nchr7\t158349000\t158349600\t0\t21\nchr7\t158352000\t158352300\t0.3623\t78\nchr7\t158360100\t158361300\t0.0717\t272\nchr7\t158426100\t158426400\t0.3164\t12\nchr7\t158455200\t158455800\t0.1578\t63\nchr7\t158460000\t158460300\t0.4447\t85\nchr7\t158464200\t158464500\t0.3787\t53\nchr7\t158493300\t158493600\t0.4983\t61\nchr7\t158521800\t158522400\t0.3584\t115\nchr7\t158551800\t158552100\t0.3367\t63\nchr7\t158648700\t158649000\t0.3368\t228\nchr7\t158667900\t158668200\t0.4676\t56\nchr7\t158838900\t158839200\t0.1226\t40\nchr7\t158915700\t158917200\t0.2381\t131\nchr7\t158950500\t158950800\t0.4163\t80\nchr7\t158982000\t158982300\t0.2211\t55\nchr7\t159006000\t159006300\t0.3863\t25\nchr7\t159088800\t159089400\t0.0185\t106\nchr7\t159152400\t159152700\t0.4408\t57\nchr7\t159164400\t159164700\t0\t40\nchr7\t159171300\t159172200\t0.3202\t90\nchr7\t159202800\t159203400\t0.2358\t354\nchr8\t60600\t77100\t0\t100\nchr8\t78300\t79500\t0\t100\nchr8\t80700\t102300\t0\t100\nchr8\t103500\t191700\t0\t100\nchr8\t193500\t200700\t0\t88\nchr8\t210900\t211200\t0.2803\t68\nchr8\t282300\t282600\t0.3514\t25\nchr8\t304200\t304800\t0.0337\t59\nchr8\t378000\t378300\t0.1707\t76\nchr8\t399300\t399600\t0.0768\t55\nchr8\t402300\t402900\t0.1096\t75\nchr8\t659100\t659700\t0.072\t70\nchr8\t669300\t669600\t0.1689\t63\nchr8\t676200\t676500\t0.314\t29\nchr8\t679800\t680400\t0.216\t105\nchr8\t714000\t714600\t0\t50\nchr8\t747900\t748200\t0.466\t67\nchr8\t775500\t776100\t0.0591\t97\nchr8\t807300\t807600\t0.074\t51\nchr8\t840000\t840300\t0.1552\t48\nchr8\t848400\t848700\t0.2068\t34\nchr8\t895800\t896100\t0.1485\t40\nchr8\t933900\t934200\t0.0172\t30\nchr8\t978000\t978600\t0.3138\t91\nchr8\t991500\t993300\t0.0112\t103\nchr8\t1013700\t1015800\t0.2977\t43\nchr8\t1034100\t1035900\t0.0358\t42\nchr8\t1109100\t1110000\t0.0909\t56\nchr8\t1206300\t1206600\t0.4163\t248\nchr8\t1215300\t1215900\t0.254\t109\nchr8\t1238700\t1239300\t0.187\t28\nchr8\t1248000\t1248300\t0.4078\t15\nchr8\t1350300\t1351200\t0.2703\t85\nchr8\t1354500\t1354800\t0.4554\t78\nchr8\t1384500\t1385700\t0.2479\t107\nchr8\t1392900\t1393200\t0.0876\t23\nchr8\t1394400\t1394700\t0.0195\t16\nchr8\t1396800\t1400100\t0\t29\nchr8\t1401900\t1402200\t0.1493\t28\nchr8\t1406700\t1407300\t0.163\t43\nchr8\t1449900\t1450200\t0.4788\t48\nchr8\t1470900\t1471200\t0.0551\t60\nchr8\t1521300\t1521600\t0.2901\t24\nchr8\t1607700\t1613100\t0.0194\t126\nchr8\t1642200\t1644000\t0.2423\t45\nchr8\t1692000\t1692300\t0\t30\nchr8\t1785300\t1785600\t0.2657\t77\nchr8\t1852200\t1852500\t0.3471\t45\nchr8\t1968600\t1969200\t0.1208\t43\nchr8\t1990500\t1991100\t0.1201\t29\nchr8\t2191500\t2191800\t0.0872\t10\nchr8\t2238600\t2239200\t0.1718\t70\nchr8\t2244300\t2246100\t0.1263\t74\nchr8\t2247600\t2247900\t0.2173\t75\nchr8\t2250900\t2277000\t0\t86\nchr8\t2278200\t2279100\t0\t57\nchr8\t2280300\t2334900\t0\t87\nchr8\t2336700\t2338800\t0\t70\nchr8\t2341200\t2341500\t0\t18\nchr8\t2369100\t2369400\t0.4046\t64\nchr8\t2383200\t2384400\t0\t66\nchr8\t2386500\t2443800\t0\t78\nchr8\t2445600\t2471100\t0\t80\nchr8\t2472900\t2475300\t0\t80\nchr8\t2480400\t2481900\t0.0038\t62\nchr8\t5122800\t5123100\t0.4112\t89\nchr8\t6297300\t6297600\t0.0219\t60\nchr8\t6300000\t6300600\t0.081\t65\nchr8\t6974400\t7001700\t0\t149\nchr8\t7002900\t7014300\t0\t154\nchr8\t7017300\t7017600\t0.0609\t124\nchr8\t7155300\t7157100\t0\t83\nchr8\t7161000\t7161600\t0.1082\t47\nchr8\t7162800\t7163100\t0.1082\t47\nchr8\t7164300\t7166400\t0.1082\t47\nchr8\t7168200\t7171800\t0.0521\t42\nchr8\t7173000\t7174500\t0.0075\t32\nchr8\t7181400\t7183200\t0\t35\nchr8\t7185000\t7185300\t0.2906\t27\nchr8\t7187700\t7188000\t0\t42\nchr8\t7189500\t7192500\t0\t42\nchr8\t7194000\t7194300\t0\t42\nchr8\t7197900\t7198200\t0.079\t21\nchr8\t7200300\t7200900\t0.3666\t27\nchr8\t7205400\t7205700\t0.0495\t37\nchr8\t7209300\t7217100\t0\t70\nchr8\t7218300\t7227600\t0\t70\nchr8\t7229400\t7252800\t0\t65\nchr8\t7254000\t7267800\t0\t129\nchr8\t7269000\t7295400\t0\t129\nchr8\t7299300\t7300200\t0\t31\nchr8\t7301700\t7311900\t0\t54\nchr8\t7314000\t7316400\t0\t34\nchr8\t7317600\t7318500\t0\t34\nchr8\t7320000\t7320900\t0\t46\nchr8\t7323000\t7325400\t0\t41\nchr8\t7326900\t7327500\t0\t41\nchr8\t7329900\t7331100\t0.0111\t52\nchr8\t7332300\t7332900\t0.0111\t52\nchr8\t7335000\t7335900\t0.007\t60\nchr8\t7337100\t7339800\t0.0341\t81\nchr8\t7342500\t7343400\t0\t44\nchr8\t7371600\t7374000\t0\t74\nchr8\t7377000\t7378500\t0.0258\t81\nchr8\t7381200\t7381500\t0.0704\t66\nchr8\t7385700\t7386000\t0.3503\t78\nchr8\t7393500\t7393800\t0.3073\t90\nchr8\t7399500\t7404300\t0\t92\nchr8\t7405500\t7411200\t0\t92\nchr8\t7412400\t7415400\t0\t92\nchr8\t7416600\t7417200\t0.0208\t62\nchr8\t7420500\t7420800\t0.3257\t62\nchr8\t7424100\t7424400\t0\t71\nchr8\t7425600\t7433700\t0\t71\nchr8\t7435500\t7444500\t0\t77\nchr8\t7446300\t7449300\t0\t81\nchr8\t7450500\t7450800\t0.4985\t73\nchr8\t7452000\t7452900\t0\t95\nchr8\t7454100\t7469100\t0\t95\nchr8\t7470300\t7471800\t0\t95\nchr8\t7473000\t7473600\t0.0178\t65\nchr8\t7474800\t7475100\t0.2315\t38\nchr8\t7476900\t7480800\t0.0273\t67\nchr8\t7482300\t7497000\t0\t109\nchr8\t7498200\t7506300\t0\t109\nchr8\t7507500\t7535100\t0\t109\nchr8\t7537200\t7547400\t0\t109\nchr8\t7551000\t7556700\t0\t106\nchr8\t7558800\t7564500\t0\t132\nchr8\t7567200\t7603500\t0\t384\nchr8\t7604700\t7605300\t0\t384\nchr8\t7607400\t7610100\t0.001\t112\nchr8\t7611900\t7616400\t0.001\t112\nchr8\t7667400\t7678800\t0\t54\nchr8\t7681200\t7682400\t0\t45\nchr8\t7684500\t7718700\t0\t547\nchr8\t7719900\t7769100\t0\t547\nchr8\t7772100\t7772700\t0\t81\nchr8\t7773900\t7801200\t0\t79\nchr8\t7802400\t7805400\t0\t81\nchr8\t7806600\t7827000\t0\t81\nchr8\t7828800\t7829100\t0.4567\t90\nchr8\t7830600\t7833300\t0\t94\nchr8\t7835100\t7835400\t0\t94\nchr8\t7837800\t7859700\t0\t85\nchr8\t7860900\t7872900\t0\t77\nchr8\t7874100\t7875900\t0.017\t69\nchr8\t7877400\t7885800\t0\t74\nchr8\t7890600\t7890900\t0.1497\t65\nchr8\t7894200\t7912500\t0\t85\nchr8\t7916400\t7916700\t0.0498\t20\nchr8\t7917900\t7918800\t0\t47\nchr8\t7923900\t7924200\t0.0503\t11\nchr8\t7925400\t7926600\t0\t46\nchr8\t7928700\t7930800\t0\t44\nchr8\t7933200\t7935000\t0\t70\nchr8\t7938000\t7941000\t0\t75\nchr8\t7943100\t7944300\t0\t42\nchr8\t7945800\t7947900\t0\t42\nchr8\t7949700\t7950000\t0.0841\t12\nchr8\t7952700\t7972200\t0\t37\nchr8\t7973700\t7975200\t0\t39\nchr8\t7977000\t7990500\t0\t43\nchr8\t7991700\t8008800\t0\t43\nchr8\t8010000\t8015400\t0\t92\nchr8\t8016600\t8044800\t0\t391\nchr8\t8046000\t8051700\t0\t94\nchr8\t8052900\t8057400\t0\t94\nchr8\t8058600\t8059500\t0\t94\nchr8\t8061900\t8075100\t0\t108\nchr8\t8077200\t8078400\t0\t108\nchr8\t8081700\t8082600\t0\t32\nchr8\t8084400\t8084700\t0.0683\t11\nchr8\t8086800\t8087100\t0\t17\nchr8\t8091000\t8091300\t0.0257\t23\nchr8\t8093100\t8100900\t0\t40\nchr8\t8102100\t8106000\t0\t26\nchr8\t8108700\t8109600\t0\t18\nchr8\t8112000\t8119500\t0\t117\nchr8\t8121000\t8123100\t0\t117\nchr8\t8124300\t8138400\t0\t117\nchr8\t8139600\t8143200\t0.0075\t109\nchr8\t8145300\t8145600\t0.0853\t109\nchr8\t8147100\t8160600\t0\t116\nchr8\t8162100\t8162400\t0\t116\nchr8\t8163600\t8170500\t0.0007\t129\nchr8\t8171700\t8179800\t0\t130\nchr8\t8182500\t8183400\t0.0064\t97\nchr8\t8185200\t8186700\t0.0064\t97\nchr8\t8187900\t8189100\t0.0582\t108\nchr8\t8190300\t8191200\t0.008\t105\nchr8\t8192700\t8194500\t0.008\t105\nchr8\t8195700\t8203800\t0\t80\nchr8\t8205000\t8206200\t0\t51\nchr8\t8207700\t8208600\t0\t51\nchr8\t8211000\t8211600\t0\t45\nchr8\t8214300\t8214600\t0\t39\nchr8\t8230200\t8230500\t0.0352\t23\nchr8\t8233800\t8234100\t0.0596\t78\nchr8\t8471100\t8476800\t0\t81\nchr8\t9657000\t9658200\t0.145\t58\nchr8\t9736500\t9739800\t0\t65\nchr8\t10933800\t10934400\t0.007\t87\nchr8\t10936200\t10937700\t0.007\t87\nchr8\t12038100\t12039300\t0\t36\nchr8\t12041400\t12046800\t0\t41\nchr8\t12049800\t12051300\t0\t27\nchr8\t12053100\t12060300\t0\t39\nchr8\t12061500\t12061800\t0\t39\nchr8\t12063000\t12072900\t0\t45\nchr8\t12075000\t12075300\t0\t10\nchr8\t12076800\t12077100\t0\t17\nchr8\t12079800\t12081300\t0\t13\nchr8\t12082500\t12088800\t0\t101\nchr8\t12090300\t12104400\t0\t101\nchr8\t12106500\t12111900\t0\t37\nchr8\t12113400\t12115500\t0\t29\nchr8\t12118800\t12119100\t0\t48\nchr8\t12121200\t12121500\t0\t23\nchr8\t12149400\t12149700\t0.1146\t59\nchr8\t12151500\t12159600\t0\t82\nchr8\t12160800\t12174300\t0\t74\nchr8\t12176100\t12178200\t0\t84\nchr8\t12180900\t12192600\t0\t100\nchr8\t12195600\t12196500\t0\t97\nchr8\t12198300\t12200400\t0\t109\nchr8\t12202500\t12205800\t0\t109\nchr8\t12207000\t12207300\t0.0028\t136\nchr8\t12208500\t12210600\t0.0028\t136\nchr8\t12211800\t12218100\t0\t99\nchr8\t12219600\t12223500\t0\t94\nchr8\t12225000\t12226500\t0.1278\t135\nchr8\t12228600\t12229500\t0.1278\t135\nchr8\t12285300\t12286500\t0\t43\nchr8\t12287700\t12290100\t0\t43\nchr8\t12291300\t12297600\t0\t43\nchr8\t12299100\t12314700\t0\t43\nchr8\t12316200\t12318600\t0\t43\nchr8\t12328800\t12330000\t0.115\t19\nchr8\t12333300\t12333900\t0.0606\t43\nchr8\t12337200\t12341100\t0\t51\nchr8\t12342600\t12351000\t0\t116\nchr8\t12352800\t12357900\t0\t43\nchr8\t12359700\t12362100\t0\t53\nchr8\t12363300\t12366300\t0\t53\nchr8\t12367500\t12370800\t0\t53\nchr8\t12372000\t12373500\t0\t38\nchr8\t12390600\t12392100\t0.1055\t59\nchr8\t12393600\t12401700\t0\t83\nchr8\t12402900\t12414600\t0\t83\nchr8\t12415800\t12420300\t0\t83\nchr8\t12423600\t12432600\t0\t102\nchr8\t12434100\t12442800\t0\t102\nchr8\t12444000\t12483300\t0\t134\nchr8\t12486600\t12487200\t0.3199\t110\nchr8\t12488700\t12501900\t0\t129\nchr8\t12503100\t12511200\t0\t137\nchr8\t12512400\t12521100\t0\t104\nchr8\t12522600\t12524400\t0.0024\t110\nchr8\t12526200\t12528300\t0.1528\t88\nchr8\t12529800\t12532200\t0.0044\t98\nchr8\t12533700\t12537300\t0\t87\nchr8\t12567600\t12567900\t0.1653\t121\nchr8\t12594900\t12595200\t0.1692\t69\nchr8\t12599100\t12601200\t0\t119\nchr8\t12602700\t12603000\t0\t119\nchr8\t12604200\t12609900\t0\t119\nchr8\t12625800\t12626100\t0.0381\t96\nchr8\t13920600\t13920900\t0.1277\t21\nchr8\t14804100\t14805600\t0.0551\t86\nchr8\t15143700\t15144000\t0.4961\t27\nchr8\t15557100\t15561000\t0.0044\t103\nchr8\t15576600\t15581400\t0.0167\t97\nchr8\t16672800\t16674600\t0.1635\t76\nchr8\t16946400\t16948800\t0.083\t75\nchr8\t17819400\t17819700\t0.3365\t14\nchr8\t18002100\t18002700\t0.046\t56\nchr8\t18569100\t18569400\t0.2338\t48\nchr8\t18597300\t18598500\t0\t78\nchr8\t18794100\t18794700\t0\t68\nchr8\t18910200\t18910500\t0.1298\t78\nchr8\t19386900\t19387200\t0.4648\t65\nchr8\t20685000\t20685600\t0.0991\t61\nchr8\t21830700\t21831000\t0.1359\t61\nchr8\t23312400\t23313000\t0.1549\t54\nchr8\t23817900\t23818200\t0.2619\t61\nchr8\t24255300\t24256200\t0.0081\t78\nchr8\t25216200\t25217100\t0\t40\nchr8\t25656300\t25656600\t0.1468\t63\nchr8\t25730700\t25735500\t0.0346\t65\nchr8\t26005200\t26005500\t0.0446\t17\nchr8\t26396100\t26401200\t0\t97\nchr8\t26590500\t26590800\t0.3591\t108\nchr8\t26938200\t26938500\t0.0935\t64\nchr8\t27060900\t27061500\t0.0135\t55\nchr8\t27113700\t27119400\t0\t106\nchr8\t27550500\t27550800\t0.1681\t52\nchr8\t27552600\t27553200\t0.0278\t77\nchr8\t28292400\t28292700\t0.2216\t32\nchr8\t28818000\t28818300\t0.2353\t118\nchr8\t28839900\t28840200\t0.1123\t96\nchr8\t28880700\t28881900\t0.3366\t82\nchr8\t29120400\t29121600\t0.0084\t83\nchr8\t29666400\t29666700\t0.2312\t27\nchr8\t30246000\t30246900\t0.2982\t66\nchr8\t30393900\t30407700\t0\t39\nchr8\t30987000\t30987300\t0.1627\t67\nchr8\t31853400\t31853700\t0.1847\t74\nchr8\t32816400\t32819400\t0\t68\nchr8\t33261900\t33263100\t0.0526\t51\nchr8\t33657600\t33658200\t0.2075\t73\nchr8\t34612200\t34612500\t0.3882\t79\nchr8\t35173200\t35174100\t0.0004\t103\nchr8\t35175300\t35176800\t0.0004\t103\nchr8\t35523600\t35525100\t0\t45\nchr8\t35528700\t35532900\t0\t101\nchr8\t36390300\t36391200\t0.2272\t126\nchr8\t36393300\t36394200\t0.2272\t126\nchr8\t36478800\t36479100\t0.2929\t81\nchr8\t36480600\t36480900\t0.2929\t81\nchr8\t36484800\t36485700\t0.0252\t96\nchr8\t36488100\t36488400\t0.3933\t89\nchr8\t36831600\t36831900\t0.234\t60\nchr8\t37150200\t37150500\t0.312\t13\nchr8\t37193400\t37194300\t0\t74\nchr8\t39491400\t39492000\t0.0059\t29\nchr8\t40432500\t40437900\t0\t80\nchr8\t40648500\t40648800\t0.2334\t45\nchr8\t40651800\t40652700\t0.1323\t55\nchr8\t41018700\t41019000\t0.1613\t66\nchr8\t41033700\t41034300\t0.1698\t61\nchr8\t41503200\t41503800\t0.0807\t44\nchr8\t43178700\t43181100\t0.1045\t86\nchr8\t43238100\t43238400\t0.2996\t485\nchr8\t43239600\t43241700\t0.3428\t570\nchr8\t43260900\t43261200\t0.0277\t73\nchr8\t43905000\t43906500\t0.0003\t71\nchr8\t43938000\t43939800\t0\t32\nchr8\t43941900\t43947900\t0\t102\nchr8\t43949400\t43950300\t0\t102\nchr8\t43952100\t43953300\t0\t77\nchr8\t43955100\t43959900\t0\t83\nchr8\t43961400\t43962000\t0.0143\t61\nchr8\t43965900\t43983900\t0\t87\nchr8\t44034000\t45620100\t0\t433\nchr8\t45621300\t45877200\t0\t433\nchr8\t45930600\t45930900\t0\t23\nchr8\t45932400\t45933000\t0\t35\nchr8\t45936600\t45939900\t0\t75\nchr8\t45941100\t45945600\t0\t75\nchr8\t45948000\t45954000\t0\t99\nchr8\t45955500\t45956700\t0\t99\nchr8\t45958500\t45966600\t0\t68\nchr8\t45968700\t45969300\t0.0632\t58\nchr8\t46983900\t46984500\t0.1117\t79\nchr8\t47161800\t47162400\t0.1361\t94\nchr8\t47235000\t47235300\t0.0528\t99\nchr8\t47318700\t47319000\t0.1917\t44\nchr8\t47331900\t47332800\t0.0299\t126\nchr8\t48796200\t48796800\t0.2987\t62\nchr8\t48944100\t48944400\t0.0347\t85\nchr8\t50088300\t50088600\t0.2643\t39\nchr8\t50166000\t50166900\t0\t51\nchr8\t50486400\t50486700\t0.2472\t70\nchr8\t51535200\t51535500\t0.0571\t86\nchr8\t51599700\t51600000\t0.2894\t19\nchr8\t53611500\t53615400\t0.0498\t54\nchr8\t53948400\t53948700\t0.4132\t28\nchr8\t54031800\t54032400\t0.0081\t83\nchr8\t54126000\t54126300\t0.2784\t55\nchr8\t54594000\t54594300\t0.2646\t63\nchr8\t56417700\t56419500\t0.1547\t89\nchr8\t57070800\t57071100\t0.2241\t71\nchr8\t57158700\t57160800\t0.1778\t60\nchr8\t57206400\t57207900\t0.0003\t525\nchr8\t57209100\t57209400\t0.0003\t525\nchr8\t57211200\t57213900\t0.0126\t479\nchr8\t58323000\t58323300\t0.3619\t66\nchr8\t58374600\t58374900\t0.3882\t91\nchr8\t58483500\t58484400\t0.0807\t65\nchr8\t58915200\t58920600\t0\t75\nchr8\t58950000\t58950300\t0.4273\t45\nchr8\t59169300\t59170200\t0.0673\t62\nchr8\t59171700\t59172000\t0.0673\t62\nchr8\t61117200\t61117500\t0.308\t78\nchr8\t61120200\t61120500\t0.2611\t84\nchr8\t61268700\t61269900\t0.0827\t80\nchr8\t61752000\t61752600\t0.0095\t47\nchr8\t63484500\t63485100\t0.2538\t86\nchr8\t63487500\t63487800\t0.2453\t78\nchr8\t63797700\t63802800\t0.0122\t97\nchr8\t64106400\t64106700\t0.2505\t57\nchr8\t64241400\t64241700\t0.2617\t66\nchr8\t64685400\t64686900\t0.1411\t58\nchr8\t65121900\t65122200\t0.1778\t73\nchr8\t66024600\t66025800\t0\t87\nchr8\t66949800\t66953100\t0.1332\t78\nchr8\t67593000\t67593300\t0.1692\t71\nchr8\t68362800\t68367600\t0.0082\t124\nchr8\t68615100\t68615400\t0.3437\t56\nchr8\t68906400\t68906700\t0.3354\t39\nchr8\t69024300\t69024600\t0.2418\t94\nchr8\t69258000\t69259200\t0.1533\t84\nchr8\t69689100\t69689700\t0.0514\t146\nchr8\t70671300\t70672200\t0.0517\t56\nchr8\t70737300\t70737900\t0.1974\t90\nchr8\t71406900\t71407200\t0.3921\t107\nchr8\t71409300\t71411400\t0.0079\t77\nchr8\t72148500\t72148800\t0.045\t65\nchr8\t72150000\t72150900\t0.045\t65\nchr8\t72152100\t72152400\t0.2234\t47\nchr8\t72482100\t72482400\t0.0639\t86\nchr8\t72484500\t72485400\t0.0639\t86\nchr8\t72875700\t72881400\t0\t93\nchr8\t73862700\t73863000\t0.3105\t77\nchr8\t74595300\t74596500\t0.1755\t81\nchr8\t74597700\t74598000\t0.1755\t81\nchr8\t74733600\t74733900\t0.2672\t59\nchr8\t74870100\t74870400\t0.4512\t58\nchr8\t74946000\t74948100\t0.102\t68\nchr8\t74964600\t74964900\t0.3958\t36\nchr8\t75280500\t75282900\t0.0279\t91\nchr8\t75324900\t75325200\t0.3215\t73\nchr8\t75328200\t75328500\t0.2249\t109\nchr8\t75444300\t75448200\t0\t70\nchr8\t75621600\t75626700\t0\t70\nchr8\t76425300\t76426200\t0\t58\nchr8\t76644900\t76645500\t0.3808\t33\nchr8\t77091000\t77091300\t0.478\t55\nchr8\t77303100\t77303400\t0.4416\t59\nchr8\t77645400\t77645700\t0.3286\t41\nchr8\t79170600\t79174200\t0\t71\nchr8\t80135700\t80136000\t0.2276\t64\nchr8\t80358600\t80358900\t0.0125\t87\nchr8\t81134100\t81134400\t0.2326\t45\nchr8\t81327600\t81327900\t0.245\t74\nchr8\t81429600\t81430200\t0.2223\t73\nchr8\t81768600\t81769500\t0.1745\t75\nchr8\t81771900\t81772200\t0.1092\t88\nchr8\t82284300\t82285500\t0.2576\t51\nchr8\t83439300\t83441100\t0.0894\t79\nchr8\t83450700\t83452800\t0.0802\t70\nchr8\t83883600\t83883900\t0\t27\nchr8\t84050400\t84050700\t0.2959\t54\nchr8\t84420900\t84423000\t0.1842\t86\nchr8\t84465000\t84466200\t0.0535\t82\nchr8\t84615600\t84616500\t0.0074\t185\nchr8\t84618300\t84618900\t0.0074\t185\nchr8\t85043400\t85043700\t0.1693\t28\nchr8\t85642800\t85644000\t0\t462\nchr8\t85645500\t85659900\t0\t1042\nchr8\t85661400\t85664100\t0\t1042\nchr8\t85714200\t85828800\t0\t1030\nchr8\t86586900\t86587200\t0.1868\t74\nchr8\t86804100\t86804400\t0.1781\t70\nchr8\t87227400\t87227700\t0.1791\t75\nchr8\t87322800\t87323100\t0.3776\t48\nchr8\t87325200\t87325500\t0.1693\t73\nchr8\t87326700\t87327000\t0.1693\t73\nchr8\t87378000\t87378300\t0.4317\t59\nchr8\t87485100\t87487200\t0.2286\t91\nchr8\t87625500\t87627000\t0.315\t46\nchr8\t87629100\t87629700\t0.0653\t51\nchr8\t88149900\t88154400\t0.0302\t89\nchr8\t88251600\t88252200\t0.1668\t71\nchr8\t88345800\t88346100\t0.1275\t42\nchr8\t88380000\t88380300\t0.1809\t12\nchr8\t88686300\t88691700\t0\t72\nchr8\t89444100\t89444700\t0.2756\t70\nchr8\t89553600\t89554200\t0.3476\t66\nchr8\t89555700\t89557200\t0.0307\t56\nchr8\t90057000\t90057300\t0.3577\t33\nchr8\t90684300\t90685500\t0.0348\t101\nchr8\t91170600\t91170900\t0.2035\t67\nchr8\t91193100\t91194000\t0.0993\t69\nchr8\t91307100\t91307400\t0.1406\t79\nchr8\t91520400\t91527900\t0\t76\nchr8\t91558800\t91564500\t0\t90\nchr8\t91796400\t91796700\t0.3771\t46\nchr8\t91798800\t91799100\t0.2092\t94\nchr8\t91895400\t91895700\t0.1773\t84\nchr8\t93406500\t93412500\t0\t140\nchr8\t93485100\t93485400\t0.1799\t48\nchr8\t94415400\t94415700\t0.1936\t80\nchr8\t94590300\t94592400\t0\t76\nchr8\t95368500\t95372100\t0.0939\t81\nchr8\t95374500\t95374800\t0.3179\t73\nchr8\t95552400\t95557800\t0.0304\t83\nchr8\t96085800\t96086100\t0.3706\t34\nchr8\t96118500\t96119400\t0.1411\t96\nchr8\t96121200\t96122100\t0.219\t78\nchr8\t96557100\t96557400\t0.2088\t87\nchr8\t96695100\t96695400\t0.1892\t52\nchr8\t96739200\t96739800\t0.2045\t81\nchr8\t96741900\t96742200\t0.2035\t63\nchr8\t97296000\t97301100\t0.0152\t120\nchr8\t98261100\t98261700\t0.2869\t75\nchr8\t98265000\t98265900\t0.2329\t63\nchr8\t98584500\t98584800\t0.2381\t75\nchr8\t98615400\t98617500\t0.1299\t77\nchr8\t98619600\t98620200\t0.0462\t88\nchr8\t98652600\t98652900\t0.2071\t76\nchr8\t99052200\t99052500\t0.0775\t56\nchr8\t99083700\t99084000\t0.2628\t68\nchr8\t99220800\t99221100\t0.1743\t44\nchr8\t99293100\t99293700\t0.1339\t80\nchr8\t99426300\t99427500\t0.0329\t68\nchr8\t99693300\t99694800\t0\t79\nchr8\t99849900\t99850200\t0.2795\t54\nchr8\t100891500\t100891800\t0.214\t37\nchr8\t101679000\t101679300\t0.1486\t73\nchr8\t101683500\t101683800\t0.3164\t87\nchr8\t101893500\t101894400\t0.1275\t75\nchr8\t101896800\t101897100\t0.1993\t45\nchr8\t102136500\t102136800\t0.2491\t64\nchr8\t102138000\t102138300\t0.2688\t71\nchr8\t103603800\t103605300\t0.0797\t77\nchr8\t103607700\t103608000\t0.2395\t69\nchr8\t103784400\t103785000\t0.1139\t70\nchr8\t104059500\t104059800\t0.4039\t74\nchr8\t104526600\t104526900\t0.2353\t69\nchr8\t104627700\t104628000\t0.254\t42\nchr8\t104739900\t104745600\t0\t75\nchr8\t105169200\t105169500\t0.0012\t24\nchr8\t105360600\t105360900\t0.2246\t52\nchr8\t105367200\t105368100\t0.0031\t62\nchr8\t106894500\t106894800\t0.3763\t75\nchr8\t107241600\t107241900\t0.2875\t86\nchr8\t107243700\t107244000\t0.2823\t72\nchr8\t107246100\t107246400\t0.32\t86\nchr8\t107891100\t107891400\t0.1317\t40\nchr8\t107893500\t107893800\t0.2401\t90\nchr8\t108947100\t108947400\t0.3486\t47\nchr8\t110888100\t110888400\t0.0564\t29\nchr8\t110952600\t110954400\t0.0172\t74\nchr8\t110955900\t110957100\t0.0172\t74\nchr8\t111156000\t111156300\t0.0965\t23\nchr8\t111634800\t111636000\t0.1845\t78\nchr8\t112595400\t112596000\t0.0549\t55\nchr8\t112597500\t112598100\t0.1341\t70\nchr8\t112911600\t112911900\t0.1442\t210\nchr8\t113304300\t113304600\t0.078\t79\nchr8\t113451600\t113451900\t0.0702\t56\nchr8\t113512200\t113512500\t0.2314\t50\nchr8\t113568300\t113568600\t0.2777\t57\nchr8\t113609700\t113610000\t0.3303\t39\nchr8\t113611200\t113611500\t0.3531\t61\nchr8\t113674500\t113674800\t0.1035\t76\nchr8\t113780100\t113780400\t0.2638\t56\nchr8\t113909400\t113910300\t0.0692\t68\nchr8\t114003300\t114003600\t0.1511\t80\nchr8\t114044400\t114044700\t0.2358\t66\nchr8\t114045900\t114046200\t0.2358\t66\nchr8\t114164700\t114165000\t0.3204\t52\nchr8\t114177300\t114177600\t0.2311\t69\nchr8\t114286200\t114286500\t0.2974\t68\nchr8\t114509100\t114509700\t0.0847\t83\nchr8\t114581700\t114582300\t0.168\t68\nchr8\t114584100\t114584400\t0.3541\t67\nchr8\t114633000\t114633600\t0.0736\t58\nchr8\t114634800\t114635100\t0.2448\t67\nchr8\t115216500\t115216800\t0.1978\t69\nchr8\t116679000\t116680800\t0.0955\t88\nchr8\t118875600\t118875900\t0.0781\t37\nchr8\t119159700\t119160300\t0.0036\t81\nchr8\t119161800\t119162700\t0.0036\t81\nchr8\t119163900\t119164200\t0.1665\t70\nchr8\t119235900\t119236200\t0.0197\t68\nchr8\t119475300\t119475600\t0.2519\t64\nchr8\t120190800\t120191100\t0.4637\t65\nchr8\t120351300\t120354300\t0.0046\t71\nchr8\t120522000\t120522300\t0.1721\t35\nchr8\t120636300\t120636600\t0.2827\t46\nchr8\t120645600\t120646500\t0.0217\t85\nchr8\t120647700\t120649800\t0.0217\t85\nchr8\t121782000\t121782300\t0.2049\t57\nchr8\t122245800\t122246100\t0.0467\t82\nchr8\t122248200\t122248500\t0.0467\t82\nchr8\t122249700\t122250000\t0.0467\t82\nchr8\t122329500\t122329800\t0.3254\t84\nchr8\t122331000\t122331300\t0.2322\t70\nchr8\t122445300\t122445600\t0.2152\t55\nchr8\t122480400\t122480700\t0.3724\t53\nchr8\t123860100\t123863700\t0.034\t84\nchr8\t123865200\t123865500\t0.034\t84\nchr8\t124171800\t124172100\t0.4381\t74\nchr8\t125583000\t125588700\t0\t85\nchr8\t126236700\t126237000\t0.1965\t21\nchr8\t126313500\t126315300\t0.0197\t69\nchr8\t126317100\t126318300\t0.0587\t51\nchr8\t126801600\t126801900\t0.0722\t89\nchr8\t126803100\t126803400\t0.0722\t89\nchr8\t126980700\t126981600\t0.0071\t63\nchr8\t126983700\t126985500\t0.0071\t63\nchr8\t127192800\t127193400\t0.2683\t54\nchr8\t127203600\t127203900\t0.1562\t51\nchr8\t127313700\t127314000\t0.3236\t96\nchr8\t127317300\t127317900\t0.0484\t74\nchr8\t127320300\t127320600\t0.0484\t74\nchr8\t127380000\t127381800\t0.0013\t57\nchr8\t127630200\t127630800\t0.2566\t75\nchr8\t128118600\t128118900\t0.327\t59\nchr8\t128328900\t128329200\t0.3659\t48\nchr8\t128453100\t128459100\t0\t92\nchr8\t128711400\t128711700\t0.2136\t44\nchr8\t128715600\t128718000\t0.0498\t57\nchr8\t128825100\t128826000\t0.1021\t71\nchr8\t128892000\t128896800\t0.0915\t58\nchr8\t129152700\t129155700\t0.0904\t72\nchr8\t129157200\t129157500\t0.0904\t72\nchr8\t129329100\t129329400\t0.0595\t94\nchr8\t129496500\t129497700\t0.0289\t40\nchr8\t130049700\t130050000\t0.4889\t42\nchr8\t131638800\t131639100\t0.312\t87\nchr8\t131772300\t131776800\t0.0213\t98\nchr8\t131871900\t131872200\t0.1703\t79\nchr8\t132617700\t132618600\t0.0511\t77\nchr8\t133313100\t133314600\t0\t60\nchr8\t134070900\t134076600\t0\t98\nchr8\t134416200\t134417400\t0.2952\t57\nchr8\t134498400\t134498700\t0.335\t43\nchr8\t135260400\t135261000\t0.1285\t70\nchr8\t135262200\t135264300\t0.0609\t83\nchr8\t135340200\t135340500\t0.2326\t59\nchr8\t135876300\t135881700\t0\t69\nchr8\t135884400\t135884700\t0.1787\t44\nchr8\t135954600\t135955200\t0.0074\t86\nchr8\t136191000\t136191600\t0.1389\t84\nchr8\t136193100\t136193400\t0.1389\t84\nchr8\t136438200\t136443900\t0\t134\nchr8\t136748400\t136748700\t0.4462\t51\nchr8\t136992000\t136992300\t0.4207\t17\nchr8\t137236200\t137236500\t0.0495\t27\nchr8\t137558700\t137559000\t0.2577\t57\nchr8\t137560500\t137560800\t0.2281\t65\nchr8\t138037200\t138037500\t0.3008\t59\nchr8\t138952500\t138952800\t0.0535\t71\nchr8\t139460100\t139463400\t0.1756\t112\nchr8\t139872600\t139872900\t0.4809\t52\nchr8\t140157000\t140157300\t0.4425\t132\nchr8\t140196000\t140196600\t0.1362\t102\nchr8\t140292600\t140292900\t0.3371\t57\nchr8\t140622300\t140623200\t0.1398\t43\nchr8\t141262200\t141262500\t0.1921\t61\nchr8\t141335100\t141335700\t0.021\t68\nchr8\t141429600\t141429900\t0.4208\t52\nchr8\t141492300\t141493200\t0\t325\nchr8\t141550800\t141551400\t0.2214\t28\nchr8\t141632400\t141634500\t0\t45\nchr8\t141713700\t141714000\t0.4446\t156\nchr8\t141970800\t141971100\t0.0677\t44\nchr8\t142255500\t142255800\t0.4424\t148\nchr8\t142390500\t142390800\t0.2071\t47\nchr8\t142685100\t142685400\t0.4618\t56\nchr8\t142760700\t142761000\t0.2302\t52\nchr8\t142881000\t142882200\t0.2491\t117\nchr8\t142898400\t142898700\t0.3789\t61\nchr8\t143085000\t143085300\t0.4484\t59\nchr8\t143167500\t143167800\t0.4575\t19\nchr8\t143205300\t143205900\t0.3583\t74\nchr8\t143458500\t143458800\t0.2622\t57\nchr8\t143487900\t143488200\t0.4929\t43\nchr8\t143492700\t143493000\t0.4634\t50\nchr8\t143641500\t143641800\t0.3764\t21\nchr8\t143661900\t143662500\t0.2343\t88\nchr8\t143692500\t143692800\t0.3108\t38\nchr8\t143695800\t143696100\t0.4388\t54\nchr8\t143858400\t143866500\t0\t150\nchr8\t143981400\t143982000\t0.2027\t142\nchr8\t144125700\t144126000\t0.4887\t792\nchr8\t144231000\t144231300\t0.2118\t75\nchr8\t144281100\t144281400\t0.4415\t54\nchr8\t144380400\t144381000\t0.4128\t102\nchr8\t144531300\t144531900\t0.0396\t171\nchr8\t144612300\t144612600\t0.0068\t59\nchr8\t144624600\t144626400\t0.1235\t60\nchr8\t144634200\t144634800\t0.0431\t32\nchr8\t144687300\t144687600\t0.3703\t67\nchr9\t12300\t13800\t0.0465\t151\nchr9\t15000\t39900\t0\t160\nchr9\t49500\t49800\t0.3305\t50\nchr9\t51000\t51600\t0.0617\t132\nchr9\t56100\t56400\t0.0771\t133\nchr9\t66000\t68400\t0\t97\nchr9\t70800\t71400\t0.2869\t125\nchr9\t77400\t78000\t0.0222\t125\nchr9\t88800\t89100\t0.2486\t61\nchr9\t92100\t92400\t0.1925\t101\nchr9\t96300\t96900\t0.1799\t86\nchr9\t107400\t107700\t0.3139\t89\nchr9\t119100\t120000\t0.0606\t105\nchr9\t122700\t123300\t0.0606\t105\nchr9\t124500\t126300\t0.0606\t105\nchr9\t130200\t131100\t0.002\t77\nchr9\t132900\t138000\t0.002\t77\nchr9\t141000\t144300\t0.1041\t73\nchr9\t147300\t147600\t0.2553\t57\nchr9\t151500\t153000\t0.2192\t64\nchr9\t156900\t157200\t0.2045\t68\nchr9\t164100\t165900\t0.0895\t65\nchr9\t167700\t168300\t0.1403\t95\nchr9\t170700\t171000\t0.0808\t37\nchr9\t173100\t173400\t0.2202\t58\nchr9\t176100\t176400\t0.1479\t50\nchr9\t183600\t185100\t0.0012\t77\nchr9\t189600\t190200\t0.1762\t74\nchr9\t194400\t194700\t0.2737\t29\nchr9\t320100\t322200\t0\t60\nchr9\t380100\t380700\t0\t54\nchr9\t400500\t400800\t0.3634\t111\nchr9\t707700\t708300\t0.0013\t84\nchr9\t808800\t809100\t0.3369\t121\nchr9\t998700\t999000\t0.2021\t49\nchr9\t1224900\t1229400\t0.0053\t80\nchr9\t1338300\t1338900\t0\t78\nchr9\t1572000\t1572300\t0.3342\t82\nchr9\t3147300\t3147600\t0.3637\t49\nchr9\t3504300\t3504900\t0.2378\t30\nchr9\t3780600\t3780900\t0.1316\t40\nchr9\t4346700\t4347000\t0.26\t24\nchr9\t4608000\t4608600\t0.0984\t90\nchr9\t5239800\t5242800\t0\t76\nchr9\t5302800\t5304300\t0\t56\nchr9\t5338200\t5339400\t0\t71\nchr9\t5684100\t5684400\t0.4075\t97\nchr9\t5962200\t5963400\t0.009\t68\nchr9\t5964600\t5964900\t0.009\t68\nchr9\t6137700\t6138000\t0.1928\t38\nchr9\t6139500\t6139800\t0.2914\t95\nchr9\t6141300\t6141600\t0.2914\t95\nchr9\t6179400\t6179700\t0.1712\t98\nchr9\t6623100\t6623400\t0.343\t69\nchr9\t6808200\t6808500\t0.2193\t38\nchr9\t7668000\t7668300\t0.0211\t74\nchr9\t8017800\t8018100\t0.1389\t53\nchr9\t8334600\t8334900\t0.1419\t18\nchr9\t9413100\t9413400\t0.2793\t42\nchr9\t9932400\t9933000\t0.1648\t66\nchr9\t10020600\t10022400\t0\t40\nchr9\t10136700\t10137600\t0\t90\nchr9\t10498800\t10499100\t0.2606\t33\nchr9\t12337500\t12338100\t0.0957\t73\nchr9\t12477000\t12477600\t0.0531\t69\nchr9\t12556800\t12559500\t0\t67\nchr9\t13039800\t13040400\t0.0964\t72\nchr9\t13043100\t13043400\t0.0681\t30\nchr9\t14664900\t14665500\t0.0155\t83\nchr9\t14666700\t14669100\t0.0155\t83\nchr9\t15326700\t15327000\t0.2868\t57\nchr9\t15406500\t15407700\t0.0065\t43\nchr9\t15948300\t15948600\t0.4108\t49\nchr9\t16466100\t16467300\t0\t69\nchr9\t17285700\t17287200\t0.1519\t83\nchr9\t17544000\t17544300\t0.3432\t65\nchr9\t17576400\t17576700\t0.1145\t40\nchr9\t17685900\t17686500\t0.0629\t59\nchr9\t17764800\t17765100\t0.1421\t45\nchr9\t17780700\t17781300\t0.017\t60\nchr9\t17912400\t17912700\t0.0514\t26\nchr9\t17923200\t17925300\t0.2098\t105\nchr9\t17944500\t17945400\t0.0754\t59\nchr9\t18198600\t18198900\t0.108\t85\nchr9\t18716700\t18717000\t0.3559\t52\nchr9\t19536600\t19541100\t0.0128\t84\nchr9\t20657100\t20658000\t0.0304\t69\nchr9\t20920200\t20920500\t0.4029\t51\nchr9\t21367500\t21367800\t0.1713\t66\nchr9\t21440700\t21441000\t0.178\t65\nchr9\t21537300\t21538200\t0.0006\t107\nchr9\t21539700\t21541500\t0.1682\t83\nchr9\t22349400\t22352100\t0.0746\t57\nchr9\t22353600\t22354200\t0.1106\t111\nchr9\t22700700\t22701300\t0.052\t50\nchr9\t22734900\t22735200\t0.2147\t48\nchr9\t22999500\t22999800\t0.0251\t23\nchr9\t23075100\t23075400\t0.1368\t28\nchr9\t23936100\t23937300\t0.0312\t57\nchr9\t24226200\t24226500\t0.24\t67\nchr9\t24576600\t24576900\t0.0318\t56\nchr9\t24579300\t24579600\t0.4509\t61\nchr9\t25073700\t25074000\t0.1617\t107\nchr9\t25161600\t25161900\t0.4988\t12\nchr9\t25285800\t25286100\t0.2672\t52\nchr9\t26964000\t26964300\t0.1229\t73\nchr9\t27691800\t27692100\t0.0681\t89\nchr9\t27694200\t27694500\t0.0681\t89\nchr9\t27696000\t27696300\t0.0681\t89\nchr9\t28097400\t28097700\t0.1949\t40\nchr9\t28112100\t28116900\t0\t85\nchr9\t28189200\t28189800\t0.3076\t102\nchr9\t28349400\t28349700\t0.234\t84\nchr9\t28352400\t28353300\t0.234\t84\nchr9\t28554900\t28555200\t0.369\t95\nchr9\t29306100\t29306400\t0.1966\t66\nchr9\t29624700\t29625000\t0.0911\t22\nchr9\t30110700\t30111000\t0.4998\t59\nchr9\t30171300\t30171600\t0.2917\t93\nchr9\t31296900\t31299900\t0.0765\t78\nchr9\t31553100\t31553700\t0.1267\t59\nchr9\t31632900\t31633200\t0.264\t72\nchr9\t32212800\t32213100\t0.3022\t64\nchr9\t32711400\t32711700\t0.0557\t35\nchr9\t32713500\t32713800\t0.0216\t40\nchr9\t32731800\t32732100\t0.2253\t67\nchr9\t33423900\t33424200\t0.3451\t74\nchr9\t33579000\t33579300\t0.3023\t45\nchr9\t34244400\t34245900\t0\t68\nchr9\t34273500\t34274700\t0\t69\nchr9\t34847400\t34847700\t0.3317\t104\nchr9\t34872600\t34872900\t0.2157\t72\nchr9\t35372700\t35374200\t0\t14\nchr9\t35884200\t35884500\t0.2678\t51\nchr9\t35913600\t35914200\t0.3722\t136\nchr9\t36347100\t36347400\t0.1753\t232\nchr9\t38241300\t38241900\t0.1446\t48\nchr9\t38243100\t38243400\t0.0138\t56\nchr9\t38325300\t38325600\t0.1918\t34\nchr9\t38556000\t38556600\t0.306\t30\nchr9\t38565000\t38565300\t0.4122\t54\nchr9\t38775600\t38777700\t0\t48\nchr9\t38781000\t38782500\t0.051\t78\nchr9\t38783700\t38784000\t0.0923\t48\nchr9\t38787000\t38787300\t0.2371\t41\nchr9\t38788800\t38789100\t0.2371\t41\nchr9\t38798100\t38798400\t0.1305\t26\nchr9\t38800800\t38801100\t0.2731\t27\nchr9\t38808300\t38808600\t0.3182\t36\nchr9\t38809800\t38810100\t0.454\t42\nchr9\t38811900\t38812200\t0.1935\t40\nchr9\t38816100\t38816400\t0.0544\t43\nchr9\t38818500\t38821800\t0.0864\t49\nchr9\t38824200\t38825100\t0.0176\t56\nchr9\t38829000\t38829600\t0.1478\t49\nchr9\t38832900\t38843700\t0\t67\nchr9\t38844900\t38845800\t0\t67\nchr9\t38847000\t38852100\t0\t67\nchr9\t38853900\t38862900\t0\t67\nchr9\t38864100\t38875200\t0\t67\nchr9\t38877300\t38889900\t0\t67\nchr9\t38891100\t38896200\t0\t80\nchr9\t38897400\t38916600\t0\t80\nchr9\t38918700\t38921100\t0.0604\t63\nchr9\t38924400\t38925000\t0.0074\t46\nchr9\t38926200\t38946900\t0\t95\nchr9\t38949000\t38949600\t0\t84\nchr9\t38952000\t38958000\t0\t84\nchr9\t38959800\t38960700\t0\t84\nchr9\t38961900\t38965200\t0\t84\nchr9\t38966400\t38972400\t0\t101\nchr9\t38973900\t38976600\t0.093\t92\nchr9\t38978400\t38988900\t0\t134\nchr9\t38998500\t38998800\t0.0713\t97\nchr9\t39029100\t39029400\t0.3453\t105\nchr9\t39032100\t39032400\t0.1851\t102\nchr9\t39053100\t39053400\t0.2562\t85\nchr9\t39060900\t39061200\t0.2873\t102\nchr9\t39071700\t39072000\t0.1633\t57\nchr9\t39150300\t39150900\t0.0821\t28\nchr9\t39152100\t39154800\t0\t50\nchr9\t39156600\t39159000\t0\t50\nchr9\t39160200\t39248400\t0\t50\nchr9\t39252000\t39252900\t0\t44\nchr9\t39254100\t39288000\t0\t38\nchr9\t39289500\t39357000\t0\t80\nchr9\t39358200\t39358500\t0\t80\nchr9\t39360000\t39360300\t0.015\t65\nchr9\t39362100\t39367200\t0\t53\nchr9\t39369300\t39446400\t0\t83\nchr9\t39448500\t39448800\t0.2507\t66\nchr9\t39452700\t39453000\t0.114\t52\nchr9\t39465000\t39465300\t0.1469\t59\nchr9\t39469200\t39469500\t0.1398\t53\nchr9\t39473700\t39474000\t0.2844\t50\nchr9\t39480300\t39480600\t0.343\t58\nchr9\t39486000\t39488400\t0\t68\nchr9\t39489900\t39491700\t0\t68\nchr9\t39493200\t39498600\t0\t68\nchr9\t39499800\t39505500\t0\t112\nchr9\t39507000\t39521700\t0\t112\nchr9\t39522900\t39532200\t0\t112\nchr9\t39534000\t39537600\t0\t111\nchr9\t39543000\t39543300\t0.2878\t109\nchr9\t39549000\t39549300\t0.015\t81\nchr9\t39565200\t39565500\t0.3203\t41\nchr9\t39567300\t39569700\t0.099\t50\nchr9\t39573300\t39573600\t0.0628\t65\nchr9\t39593700\t39604800\t0\t90\nchr9\t39610200\t39613800\t0.0296\t57\nchr9\t39615900\t39744000\t0\t98\nchr9\t39745500\t39808800\t0\t98\nchr9\t39812100\t39813300\t0.1315\t98\nchr9\t39814800\t39818400\t0\t71\nchr9\t39819600\t39820500\t0\t71\nchr9\t39822300\t39824100\t0\t71\nchr9\t39839100\t40001400\t0\t101\nchr9\t40002600\t40005600\t0\t101\nchr9\t40007100\t40013700\t0\t101\nchr9\t40015500\t40016100\t0\t101\nchr9\t40017300\t40017900\t0.3907\t61\nchr9\t40019700\t40020000\t0.0779\t61\nchr9\t40022100\t40024800\t0.0779\t61\nchr9\t40026600\t40028100\t0.0257\t66\nchr9\t40029300\t40030800\t0.0257\t66\nchr9\t40032000\t40032300\t0\t60\nchr9\t40033500\t40035000\t0\t60\nchr9\t40037100\t40038300\t0\t60\nchr9\t40039800\t40043400\t0\t58\nchr9\t40044600\t40045500\t0\t58\nchr9\t40047000\t40050300\t0\t89\nchr9\t40052100\t40054800\t0\t89\nchr9\t40056000\t40056300\t0\t89\nchr9\t40057800\t40058100\t0\t89\nchr9\t40059300\t40062900\t0\t89\nchr9\t40064700\t40086900\t0\t100\nchr9\t40088100\t40105800\t0\t100\nchr9\t40107000\t40128900\t0\t100\nchr9\t40131300\t40137300\t0\t95\nchr9\t40138800\t40174500\t0\t94\nchr9\t40177800\t40189500\t0\t51\nchr9\t40191000\t40191900\t0.1841\t56\nchr9\t40197000\t40199700\t0\t72\nchr9\t40200900\t40217400\t0\t72\nchr9\t40218600\t40220700\t0.1122\t85\nchr9\t40222200\t40222500\t0.1122\t85\nchr9\t40227000\t40228500\t0.0096\t67\nchr9\t40229700\t40390200\t0\t136\nchr9\t40391700\t40501800\t0\t95\nchr9\t40503000\t40533900\t0\t95\nchr9\t40536000\t40536300\t0.1878\t19\nchr9\t40537500\t40543200\t0\t52\nchr9\t40545900\t40546800\t0\t122\nchr9\t40548000\t40553400\t0\t122\nchr9\t40554900\t40561200\t0\t122\nchr9\t40562400\t40570500\t0\t122\nchr9\t40572000\t40572900\t0.0016\t55\nchr9\t40574100\t40575000\t0\t96\nchr9\t40576800\t40578000\t0\t96\nchr9\t40581900\t40584000\t0\t84\nchr9\t40585200\t40586700\t0.0013\t97\nchr9\t40588200\t40589700\t0\t87\nchr9\t40590900\t40591200\t0\t87\nchr9\t40593000\t40609500\t0\t117\nchr9\t40611300\t40646400\t0\t117\nchr9\t40647600\t40650600\t0\t117\nchr9\t40651800\t40695900\t0\t67\nchr9\t40698600\t40699200\t0.37\t71\nchr9\t40700400\t40702500\t0\t57\nchr9\t40704300\t40706700\t0\t57\nchr9\t40707900\t40711500\t0\t65\nchr9\t40713600\t40714200\t0\t65\nchr9\t40715400\t40716000\t0.015\t70\nchr9\t40717500\t40718100\t0.0021\t48\nchr9\t40719300\t40720200\t0.1169\t73\nchr9\t40723200\t40725600\t0.0718\t74\nchr9\t40726800\t40727100\t0\t76\nchr9\t40728300\t40730700\t0\t76\nchr9\t40731900\t40735200\t0\t76\nchr9\t40738200\t40739100\t0.0047\t71\nchr9\t40740600\t40740900\t0.0047\t71\nchr9\t40742100\t40745100\t0.0047\t71\nchr9\t40746300\t40748100\t0.0024\t66\nchr9\t40749300\t40754400\t0\t74\nchr9\t40759200\t40760100\t0.0108\t62\nchr9\t40761900\t40768200\t0\t76\nchr9\t40769700\t40770900\t0\t76\nchr9\t40772400\t40775400\t0.0035\t70\nchr9\t40776600\t40777200\t0.0035\t70\nchr9\t40778400\t40780200\t0.0124\t79\nchr9\t40783800\t40784100\t0.0173\t80\nchr9\t40785300\t40786500\t0.0173\t80\nchr9\t40791900\t40796100\t0\t78\nchr9\t40798200\t40799100\t0\t78\nchr9\t40801200\t40801800\t0.0983\t62\nchr9\t40803300\t40805700\t0\t56\nchr9\t40808100\t40809600\t0.0058\t72\nchr9\t40811400\t40811700\t0.0058\t72\nchr9\t40814100\t40815600\t0.044\t123\nchr9\t40820400\t40823100\t0.025\t86\nchr9\t40826400\t40827900\t0\t77\nchr9\t40830300\t40830600\t0.1226\t93\nchr9\t40833600\t40835400\t0\t67\nchr9\t40836600\t40836900\t0.1845\t74\nchr9\t40838400\t40839600\t0.1616\t78\nchr9\t40841700\t40843500\t0.0024\t90\nchr9\t40847700\t40849200\t0.0782\t63\nchr9\t40851600\t40857900\t0.0178\t87\nchr9\t40860000\t40860300\t0.2293\t57\nchr9\t40863900\t40867500\t0\t83\nchr9\t40967400\t40968000\t0.0942\t159\nchr9\t41017200\t41017500\t0.409\t112\nchr9\t41057400\t41057700\t0.0854\t136\nchr9\t41077800\t41078100\t0.2073\t150\nchr9\t41081400\t41081700\t0.1175\t121\nchr9\t41100000\t41100300\t0.3715\t91\nchr9\t41101800\t41108100\t0\t321\nchr9\t41109600\t41110500\t0\t321\nchr9\t41112600\t41124000\t0\t179\nchr9\t41125200\t41131800\t0\t179\nchr9\t41133000\t41150700\t0\t179\nchr9\t41151900\t41154300\t0\t179\nchr9\t41155500\t41183100\t0\t179\nchr9\t41184600\t41206800\t0\t179\nchr9\t41208000\t41211000\t0\t179\nchr9\t41213400\t41224500\t0\t251\nchr9\t41233500\t41233800\t0.2686\t213\nchr9\t41256000\t41256900\t0.1989\t143\nchr9\t41260500\t41262900\t0.1451\t260\nchr9\t41265600\t41265900\t0\t267\nchr9\t41267700\t41270100\t0\t267\nchr9\t41272200\t41272800\t0\t142\nchr9\t41274900\t41275500\t0\t142\nchr9\t41277000\t41278200\t0\t142\nchr9\t41279700\t41280000\t0\t142\nchr9\t41281200\t41281500\t0.3885\t46\nchr9\t41283300\t41283900\t0.0407\t170\nchr9\t41285100\t41288400\t0.0407\t170\nchr9\t41291400\t41292000\t0.1923\t76\nchr9\t41293500\t41293800\t0.0366\t74\nchr9\t41297400\t41298600\t0\t63\nchr9\t41300100\t41301900\t0.0004\t76\nchr9\t41304300\t41305500\t0.0347\t69\nchr9\t41311200\t41312700\t0\t85\nchr9\t41314200\t41314500\t0.2433\t52\nchr9\t41317500\t41317800\t0.0187\t74\nchr9\t41319900\t41324100\t0.0303\t107\nchr9\t41328000\t41328300\t0.0086\t65\nchr9\t41330700\t41332500\t0.0978\t132\nchr9\t41333700\t41334000\t0.0978\t132\nchr9\t41337900\t41341800\t0\t92\nchr9\t41343000\t41344500\t0\t92\nchr9\t41346000\t41346300\t0.3651\t83\nchr9\t41347500\t41347800\t0.0359\t80\nchr9\t41351700\t41352000\t0.0859\t70\nchr9\t41355900\t41356500\t0.3554\t56\nchr9\t41359500\t41366400\t0\t84\nchr9\t41367600\t41367900\t0\t84\nchr9\t41370300\t41370600\t0.0082\t83\nchr9\t41372100\t41373900\t0.0082\t83\nchr9\t41375100\t41376600\t0.0082\t83\nchr9\t41382300\t41383200\t0\t61\nchr9\t41384700\t41385000\t0.2337\t59\nchr9\t41386800\t41387100\t0.1759\t68\nchr9\t41390400\t41392500\t0.0698\t54\nchr9\t41394300\t41394600\t0.018\t94\nchr9\t41395800\t41397000\t0.018\t94\nchr9\t41398200\t41400900\t0\t63\nchr9\t41402100\t41404500\t0.1142\t63\nchr9\t41407200\t41408100\t0\t71\nchr9\t41409600\t41413800\t0\t71\nchr9\t41415000\t41415300\t0.0386\t21\nchr9\t41424000\t41424300\t0.1064\t64\nchr9\t41429100\t41431500\t0.1093\t136\nchr9\t41434500\t41436600\t0.017\t52\nchr9\t41438100\t41438700\t0.017\t52\nchr9\t41441400\t41443500\t0\t65\nchr9\t41446500\t41446800\t0.3605\t23\nchr9\t41448600\t41449200\t0\t61\nchr9\t41450700\t41451900\t0.0106\t49\nchr9\t41453100\t41454000\t0.0326\t74\nchr9\t41455500\t41456700\t0.0326\t74\nchr9\t41461500\t41462100\t0.1144\t65\nchr9\t41468100\t41468400\t0.1985\t26\nchr9\t41469900\t41471700\t0.0514\t65\nchr9\t41476800\t41477100\t0.3569\t54\nchr9\t41479500\t41479800\t0.0246\t63\nchr9\t41487900\t41488200\t0.3934\t52\nchr9\t41490000\t41491800\t0.0248\t54\nchr9\t41494200\t41495400\t0\t74\nchr9\t41498100\t41498400\t0.3137\t52\nchr9\t41499600\t41502300\t0.0005\t90\nchr9\t41503800\t41505300\t0.2194\t84\nchr9\t41507100\t41507400\t0.2194\t84\nchr9\t41515500\t41517900\t0.0148\t70\nchr9\t41520300\t41520600\t0.2929\t70\nchr9\t41522400\t41522700\t0.2195\t80\nchr9\t41525700\t41527200\t0\t96\nchr9\t41532900\t41533200\t0.0388\t79\nchr9\t41539200\t41539500\t0\t114\nchr9\t41541600\t41542200\t0\t114\nchr9\t41543400\t41547900\t0\t114\nchr9\t41549100\t41549400\t0\t114\nchr9\t41551200\t41552700\t0\t114\nchr9\t41555100\t41556000\t0.0797\t56\nchr9\t41573100\t41614200\t0\t129\nchr9\t41615400\t41616600\t0\t129\nchr9\t41620500\t41622000\t0\t119\nchr9\t41628300\t41631900\t0\t168\nchr9\t41636100\t41637900\t0.0045\t81\nchr9\t41641200\t41641500\t0.279\t46\nchr9\t41662500\t41662800\t0.3438\t94\nchr9\t41664300\t41668200\t0\t105\nchr9\t41669700\t41670300\t0\t105\nchr9\t41676600\t41687400\t0\t102\nchr9\t41688900\t41689200\t0.2573\t34\nchr9\t41691600\t41691900\t0\t92\nchr9\t41694900\t41696400\t0.0705\t79\nchr9\t41698500\t41700300\t0.0004\t110\nchr9\t41701500\t41703300\t0.0004\t110\nchr9\t41705100\t41706300\t0.0226\t103\nchr9\t41714100\t41715000\t0.1267\t100\nchr9\t41718600\t41736000\t0\t83\nchr9\t41741700\t41742000\t0.1411\t78\nchr9\t41743200\t41753700\t0\t94\nchr9\t41757000\t41757300\t0.1016\t94\nchr9\t41758800\t41769900\t0\t114\nchr9\t41771100\t41771400\t0\t114\nchr9\t41772900\t41773500\t0\t114\nchr9\t41776800\t41777100\t0.3226\t119\nchr9\t41786100\t41786400\t0.0941\t107\nchr9\t41792700\t41793000\t0.2103\t53\nchr9\t41795100\t41795400\t0.1784\t77\nchr9\t41805600\t41805900\t0.0239\t38\nchr9\t41808300\t41808900\t0.0182\t115\nchr9\t41812200\t41915400\t0\t144\nchr9\t41916600\t41916900\t0.1518\t63\nchr9\t41927100\t41927400\t0.1994\t60\nchr9\t41957100\t41957700\t0.0066\t62\nchr9\t41970000\t41976600\t0\t68\nchr9\t41978100\t41982600\t0\t70\nchr9\t41984100\t41989500\t0\t70\nchr9\t41991300\t41991600\t0.14\t70\nchr9\t41994300\t42002400\t0\t79\nchr9\t42004200\t42011700\t0\t79\nchr9\t42013200\t42016500\t0\t79\nchr9\t42017700\t42023100\t0\t67\nchr9\t42025200\t42028500\t0\t75\nchr9\t42030300\t42035100\t0.0307\t68\nchr9\t42038700\t42041100\t0\t70\nchr9\t42043500\t42043800\t0\t70\nchr9\t42045300\t42045600\t0\t70\nchr9\t42048300\t42053100\t0\t70\nchr9\t42056700\t42057300\t0\t68\nchr9\t42058800\t42062400\t0\t68\nchr9\t42065100\t42066000\t0\t78\nchr9\t42068100\t42070200\t0\t78\nchr9\t42072000\t42074400\t0.0396\t64\nchr9\t42076500\t42076800\t0.4112\t45\nchr9\t42080700\t42085200\t0\t67\nchr9\t42087900\t42088200\t0.0612\t38\nchr9\t42090900\t42093000\t0\t74\nchr9\t42099900\t42106200\t0\t63\nchr9\t42118800\t42119100\t0.4541\t23\nchr9\t42122700\t42123000\t0.4023\t50\nchr9\t42128700\t42129000\t0.1669\t59\nchr9\t42131700\t42132000\t0.405\t35\nchr9\t42135300\t42135600\t0.4858\t56\nchr9\t42137100\t42137400\t0.4139\t49\nchr9\t42180000\t42180300\t0.3499\t67\nchr9\t42186000\t42186600\t0.2686\t67\nchr9\t42187800\t42188700\t0.1007\t75\nchr9\t42192900\t42193200\t0.2585\t57\nchr9\t42198300\t42198900\t0.1179\t49\nchr9\t42201000\t42201300\t0.2956\t49\nchr9\t42204300\t42204600\t0.1578\t55\nchr9\t42225900\t42226200\t0.1536\t77\nchr9\t42318300\t42318600\t0.2497\t90\nchr9\t42348300\t42350700\t0.0304\t71\nchr9\t42356400\t42357000\t0.1889\t18\nchr9\t42370500\t42370800\t0.2839\t36\nchr9\t42401700\t42402600\t0.0241\t42\nchr9\t42408300\t42412200\t0\t99\nchr9\t42413400\t42414000\t0.0932\t72\nchr9\t42417300\t42417600\t0.0967\t28\nchr9\t42419100\t42419400\t0.0129\t15\nchr9\t42440700\t42441000\t0.2758\t73\nchr9\t42450000\t42450300\t0.2182\t58\nchr9\t42465600\t42465900\t0.3021\t70\nchr9\t42495600\t42500700\t0\t79\nchr9\t42508500\t42518100\t0\t81\nchr9\t42519300\t42519600\t0\t81\nchr9\t42521100\t42533400\t0\t81\nchr9\t42535800\t42538200\t0\t70\nchr9\t42539400\t42557100\t0\t115\nchr9\t42558300\t42573900\t0\t115\nchr9\t42575100\t42577500\t0\t115\nchr9\t42579300\t42600000\t0\t115\nchr9\t42601500\t42601800\t0.0376\t84\nchr9\t42603300\t42637200\t0\t91\nchr9\t42638400\t42660600\t0\t90\nchr9\t42662100\t42689700\t0\t83\nchr9\t42691200\t42691800\t0\t83\nchr9\t42729600\t42729900\t0.0322\t51\nchr9\t42733200\t42733500\t0.1256\t75\nchr9\t42741000\t42741300\t0.2516\t75\nchr9\t42760800\t42761100\t0.1779\t49\nchr9\t42784500\t42785100\t0.0223\t51\nchr9\t42818400\t42818700\t0.0424\t67\nchr9\t42820200\t42822600\t0.0424\t67\nchr9\t42824400\t42825300\t0.2125\t52\nchr9\t42826500\t42826800\t0.1949\t39\nchr9\t42828600\t42829500\t0.0113\t55\nchr9\t42857400\t42857700\t0.0011\t46\nchr9\t42882300\t42882900\t0.2037\t83\nchr9\t42896400\t42897000\t0.23\t74\nchr9\t42907800\t42908100\t0.3132\t76\nchr9\t42919200\t42919500\t0.327\t52\nchr9\t42970500\t42970800\t0.0293\t61\nchr9\t42996600\t43000800\t0\t99\nchr9\t43002600\t43003200\t0\t99\nchr9\t43009500\t43009800\t0.0959\t45\nchr9\t43017300\t43017600\t0.2946\t56\nchr9\t43029300\t43029600\t0.3126\t54\nchr9\t43032600\t43033200\t0.0085\t85\nchr9\t43040100\t43040400\t0.088\t48\nchr9\t43042500\t43044000\t0.1417\t50\nchr9\t43045200\t43045800\t0.257\t63\nchr9\t43053000\t43053600\t0.0929\t61\nchr9\t43062000\t43062300\t0.2665\t39\nchr9\t43068300\t43070400\t0.0726\t64\nchr9\t43076400\t43076700\t0.2255\t78\nchr9\t43078200\t43078500\t0.2255\t78\nchr9\t43091700\t43092000\t0.3956\t43\nchr9\t43096500\t43097100\t0.1177\t65\nchr9\t43105500\t43106400\t0.152\t72\nchr9\t43131600\t43134000\t0.0358\t73\nchr9\t43150500\t43150800\t0.2484\t77\nchr9\t43194600\t43195500\t0.0115\t41\nchr9\t43214400\t43215000\t0.0116\t35\nchr9\t43216200\t43216500\t0.3752\t276\nchr9\t43240500\t43240800\t0.317\t79\nchr9\t43242000\t43242300\t0.1375\t77\nchr9\t43275000\t43281300\t0\t75\nchr9\t43283100\t43332300\t0\t142\nchr9\t43333800\t43370100\t0\t171\nchr9\t43371300\t43377300\t0\t171\nchr9\t43382400\t43382700\t0.1462\t46\nchr9\t43383900\t43443600\t0\t413\nchr9\t43445100\t43455600\t0\t583\nchr9\t43456800\t44124600\t0\t583\nchr9\t44125800\t44251500\t0\t626\nchr9\t44252700\t44719500\t0\t626\nchr9\t44720700\t44730600\t0\t626\nchr9\t44731800\t44799000\t0\t626\nchr9\t44800200\t44868300\t0\t626\nchr9\t44869500\t44920200\t0\t626\nchr9\t44921400\t45019200\t0\t626\nchr9\t45020400\t45031500\t0\t626\nchr9\t45033600\t45034500\t0\t308\nchr9\t45036000\t45074400\t0\t308\nchr9\t45075600\t45094500\t0\t308\nchr9\t45095700\t45112800\t0\t308\nchr9\t45114600\t45152100\t0\t265\nchr9\t45153300\t45164700\t0\t265\nchr9\t45166200\t45182700\t0\t261\nchr9\t45184200\t45201000\t0\t261\nchr9\t45202500\t45205800\t0\t261\nchr9\t45207600\t45215400\t0\t261\nchr9\t45216900\t45231600\t0\t239\nchr9\t45232800\t45261900\t0\t239\nchr9\t45263400\t45264600\t0\t239\nchr9\t45265800\t45298500\t0\t239\nchr9\t45300900\t45306000\t0\t239\nchr9\t45307500\t45322500\t0\t239\nchr9\t45324000\t45368400\t0\t361\nchr9\t45369600\t45384300\t0\t361\nchr9\t45385500\t45422700\t0\t361\nchr9\t45424200\t45484200\t0\t361\nchr9\t45485700\t45518700\t0\t361\nchr9\t60548400\t60548700\t0.1185\t46\nchr9\t60550200\t60552600\t0\t195\nchr9\t60553800\t60570900\t0\t195\nchr9\t60572400\t60616200\t0\t311\nchr9\t60618000\t60656700\t0\t489\nchr9\t60657900\t60687300\t0\t489\nchr9\t60744000\t60744300\t0.1796\t30\nchr9\t60749100\t60759600\t0\t68\nchr9\t60761400\t60765300\t0\t68\nchr9\t60767100\t60767700\t0.1718\t59\nchr9\t60769200\t60772500\t0\t65\nchr9\t60773700\t60779400\t0\t65\nchr9\t60829500\t60864900\t0\t54\nchr9\t60866100\t60875100\t0\t46\nchr9\t60876900\t60885000\t0\t54\nchr9\t60886800\t60887700\t0\t54\nchr9\t60891000\t60893100\t0\t85\nchr9\t60894900\t61003800\t0\t85\nchr9\t61053900\t61138800\t0\t74\nchr9\t61143600\t61144500\t0\t49\nchr9\t61146900\t61151100\t0\t55\nchr9\t61152300\t61158600\t0\t77\nchr9\t61159800\t61161600\t0\t77\nchr9\t61163400\t61163700\t0\t81\nchr9\t61166700\t61173000\t0\t81\nchr9\t61174200\t61179300\t0\t81\nchr9\t61182900\t61191300\t0\t81\nchr9\t61192500\t61211400\t0\t81\nchr9\t61212600\t61213800\t0\t81\nchr9\t61218900\t61224600\t0\t70\nchr9\t61226100\t61226700\t0.0029\t52\nchr9\t61230900\t61231800\t0.0259\t44\nchr9\t61282200\t61318500\t0\t56\nchr9\t61319700\t61329600\t0\t56\nchr9\t61334100\t61337400\t0\t37\nchr9\t61338600\t61345800\t0\t42\nchr9\t61347600\t61362000\t0\t49\nchr9\t61363500\t61363800\t0\t49\nchr9\t61366200\t61366500\t0.2502\t41\nchr9\t61371600\t61371900\t0.1839\t42\nchr9\t61373400\t61373700\t0.0679\t35\nchr9\t61374900\t61376700\t0\t40\nchr9\t61377900\t61384500\t0\t54\nchr9\t61385700\t61396500\t0\t54\nchr9\t61398900\t61399500\t0\t39\nchr9\t61401900\t61405500\t0.0222\t41\nchr9\t61407300\t61407600\t0.4734\t31\nchr9\t61408800\t61468800\t0\t52\nchr9\t61528800\t61529400\t0.1386\t81\nchr9\t61575300\t61575600\t0.2392\t41\nchr9\t61585500\t61590900\t0\t70\nchr9\t61636500\t61638300\t0.1171\t54\nchr9\t61644300\t61644900\t0.0774\t72\nchr9\t61647000\t61647300\t0\t84\nchr9\t61648500\t61663800\t0\t84\nchr9\t61785300\t61912800\t0\t1017\nchr9\t61914300\t61915200\t0.0001\t95\nchr9\t61916700\t61919700\t0.0001\t95\nchr9\t61920900\t61933500\t0\t114\nchr9\t61934700\t61944000\t0\t114\nchr9\t61945200\t61946700\t0\t114\nchr9\t61947900\t61948200\t0\t114\nchr9\t61949700\t61950000\t0\t114\nchr9\t61952700\t61977900\t0\t114\nchr9\t61979100\t61979400\t0.2765\t40\nchr9\t61983300\t61983900\t0.3529\t82\nchr9\t61986300\t61986900\t0.0135\t35\nchr9\t61988100\t61992000\t0\t53\nchr9\t61993500\t61995900\t0\t55\nchr9\t61997400\t62001000\t0\t65\nchr9\t62002500\t62039100\t0\t65\nchr9\t62040300\t62049000\t0\t59\nchr9\t62050800\t62051400\t0.0067\t38\nchr9\t62052600\t62053200\t0\t71\nchr9\t62054700\t62055000\t0\t71\nchr9\t62056500\t62060100\t0\t71\nchr9\t62061300\t62146500\t0\t78\nchr9\t62147700\t62149500\t0\t78\nchr9\t62249700\t62439600\t0\t113\nchr9\t62440800\t62442000\t0.0149\t74\nchr9\t62443200\t62444400\t0.0149\t74\nchr9\t62445600\t62446800\t0.0149\t74\nchr9\t62448000\t62452500\t0\t120\nchr9\t62454000\t62457900\t0\t120\nchr9\t62459100\t62530200\t0\t120\nchr9\t62531400\t62534400\t0\t120\nchr9\t62535600\t62562300\t0\t120\nchr9\t62563500\t62597100\t0\t120\nchr9\t62598600\t62613300\t0\t120\nchr9\t62614500\t62717400\t0\t105\nchr9\t62718600\t62748900\t0\t85\nchr9\t62810100\t62810400\t0.3434\t139\nchr9\t62812200\t62813700\t0.0172\t244\nchr9\t62825100\t62825400\t0.2225\t323\nchr9\t62829900\t62830500\t0.0087\t163\nchr9\t62832300\t62833200\t0\t163\nchr9\t62836800\t62837100\t0.0236\t111\nchr9\t62840700\t62841600\t0.2316\t175\nchr9\t62845800\t62848200\t0.0361\t163\nchr9\t62853900\t62854200\t0.1924\t106\nchr9\t62883600\t62896800\t0\t82\nchr9\t62900100\t62900700\t0\t82\nchr9\t62902800\t62903100\t0.2503\t93\nchr9\t62904600\t62907900\t0\t104\nchr9\t62910000\t62913900\t0\t98\nchr9\t62915400\t62918400\t0\t98\nchr9\t62919900\t62921100\t0\t98\nchr9\t62922900\t62923200\t0\t98\nchr9\t62924700\t62945700\t0\t98\nchr9\t62946900\t62949600\t0\t98\nchr9\t62951100\t62958300\t0\t98\nchr9\t63008400\t63023400\t0\t62\nchr9\t63024900\t63041400\t0\t59\nchr9\t63042600\t63180000\t0\t125\nchr9\t63181500\t63202800\t0\t125\nchr9\t63252900\t63257100\t0\t75\nchr9\t63258600\t63259800\t0.0347\t41\nchr9\t63261900\t63262800\t0.0807\t45\nchr9\t63267900\t63269400\t0\t69\nchr9\t63271500\t63296100\t0\t69\nchr9\t63297300\t63302100\t0\t72\nchr9\t63304200\t63312300\t0\t72\nchr9\t63316200\t63324900\t0\t76\nchr9\t63331500\t63335400\t0\t56\nchr9\t63336600\t63337800\t0.0137\t66\nchr9\t63339000\t63341100\t0\t68\nchr9\t63343200\t63343500\t0.1252\t52\nchr9\t63352500\t63353100\t0.1794\t76\nchr9\t63358800\t63360300\t0\t76\nchr9\t63363300\t63375900\t0\t126\nchr9\t63377700\t63379200\t0.0033\t95\nchr9\t63382800\t63384900\t0\t82\nchr9\t63386100\t63396600\t0\t105\nchr9\t63397800\t63399900\t0\t105\nchr9\t63402000\t63405300\t0\t105\nchr9\t63406500\t63449100\t0\t105\nchr9\t63451200\t63492300\t0\t72\nchr9\t63543000\t63543600\t0.096\t64\nchr9\t63544800\t63545100\t0.096\t64\nchr9\t63547200\t63547800\t0.096\t64\nchr9\t63566100\t63567600\t0.0008\t67\nchr9\t63568800\t63570900\t0.006\t88\nchr9\t63598500\t63599100\t0.0932\t45\nchr9\t63600900\t63603300\t0.0814\t49\nchr9\t63639000\t63640200\t0.0464\t55\nchr9\t63645000\t63646500\t0.1138\t41\nchr9\t63650100\t63652200\t0\t62\nchr9\t63653700\t63654600\t0.228\t67\nchr9\t63660600\t63663900\t0.0029\t63\nchr9\t63666900\t63667200\t0.0402\t18\nchr9\t63671400\t63671700\t0.2133\t43\nchr9\t63675300\t63675600\t0.2345\t38\nchr9\t63687000\t63687300\t0.1914\t56\nchr9\t63711300\t63711600\t0.4098\t52\nchr9\t63717300\t63718500\t0.3637\t90\nchr9\t63737400\t63737700\t0.4367\t174\nchr9\t63765900\t63767700\t0.0567\t147\nchr9\t63768900\t63769200\t0.0567\t147\nchr9\t63772800\t63774600\t0.0926\t149\nchr9\t63778200\t63780900\t0.121\t112\nchr9\t63801900\t63803400\t0.1709\t163\nchr9\t63829200\t63829500\t0.3998\t151\nchr9\t63834300\t63834600\t0.1884\t122\nchr9\t63867000\t63868200\t0.161\t291\nchr9\t63872100\t63872700\t0.2155\t183\nchr9\t63884100\t63884400\t0.0592\t143\nchr9\t63918300\t63918600\t0.3972\t60\nchr9\t63969000\t63969300\t0.4029\t114\nchr9\t63972600\t63972900\t0.3089\t114\nchr9\t63983400\t63984000\t0.1122\t152\nchr9\t63991500\t63992400\t0.1152\t162\nchr9\t63998700\t64000500\t0.0599\t137\nchr9\t64002000\t64002600\t0.123\t108\nchr9\t64006200\t64006800\t0.0129\t156\nchr9\t64008900\t64009200\t0.1662\t123\nchr9\t64185600\t64189200\t0\t35\nchr9\t64190400\t64215000\t0\t44\nchr9\t64315200\t64335300\t0\t101\nchr9\t64340700\t64365600\t0\t113\nchr9\t64368600\t64400100\t0\t84\nchr9\t64401300\t64402800\t0\t67\nchr9\t64404300\t64405800\t0.0008\t98\nchr9\t64407000\t64407300\t0.0008\t98\nchr9\t64409700\t64411500\t0.0183\t87\nchr9\t64413600\t64417200\t0.0183\t87\nchr9\t64418400\t64426200\t0\t83\nchr9\t64427700\t64437600\t0\t83\nchr9\t64441500\t64445700\t0.0103\t85\nchr9\t64447200\t64450800\t0.0071\t119\nchr9\t64453800\t64454100\t0.1227\t63\nchr9\t64458000\t64462200\t0\t106\nchr9\t64464600\t64465800\t0.0208\t110\nchr9\t64468800\t64469100\t0.0413\t71\nchr9\t64472400\t64474200\t0.0207\t86\nchr9\t64475400\t64475700\t0.1004\t78\nchr9\t64476900\t64477200\t0.1004\t78\nchr9\t64478700\t64480200\t0.049\t83\nchr9\t64485000\t64486200\t0.1757\t92\nchr9\t64491300\t64494000\t0.0353\t100\nchr9\t64497900\t64498200\t0.1778\t82\nchr9\t64500000\t64500300\t0.1787\t75\nchr9\t64502400\t64502700\t0.2731\t52\nchr9\t64505400\t64506300\t0.2583\t81\nchr9\t64507500\t64507800\t0.0005\t96\nchr9\t64511400\t64513500\t0.0005\t96\nchr9\t64515300\t64515600\t0\t93\nchr9\t64516800\t64517100\t0\t93\nchr9\t64519200\t64520100\t0\t93\nchr9\t64521600\t64524900\t0\t73\nchr9\t64527900\t64539000\t0\t105\nchr9\t64541400\t64547700\t0.0145\t92\nchr9\t64549200\t64549800\t0.0145\t92\nchr9\t64551000\t64554300\t0\t80\nchr9\t64555500\t64558800\t0\t80\nchr9\t64560600\t64583700\t0\t80\nchr9\t64585200\t64585500\t0\t80\nchr9\t64587000\t64768800\t0\t104\nchr9\t64770900\t64771500\t0\t104\nchr9\t64776600\t64776900\t0.0019\t49\nchr9\t64778400\t64780800\t0.0019\t49\nchr9\t64784700\t64791300\t0\t107\nchr9\t64792500\t64803300\t0\t107\nchr9\t64805100\t64806300\t0.2383\t56\nchr9\t64808100\t64814100\t0\t45\nchr9\t64816200\t64819200\t0\t66\nchr9\t64821000\t64822800\t0\t58\nchr9\t64824000\t64826100\t0\t60\nchr9\t64827900\t64834800\t0\t60\nchr9\t64837200\t64839600\t0\t60\nchr9\t64840800\t64841400\t0.0033\t53\nchr9\t64842600\t64844400\t0.0033\t53\nchr9\t64846800\t64849200\t0\t61\nchr9\t64850400\t64854300\t0\t77\nchr9\t64855500\t64862700\t0\t77\nchr9\t64863900\t64878000\t0\t77\nchr9\t64880100\t64888200\t0\t77\nchr9\t64890600\t64898100\t0\t77\nchr9\t64899300\t64901100\t0\t77\nchr9\t64903800\t64908600\t0\t76\nchr9\t64909800\t64910100\t0.2286\t56\nchr9\t64911300\t64911600\t0.2286\t56\nchr9\t64912800\t64920000\t0\t75\nchr9\t64922100\t64927500\t0\t75\nchr9\t64928700\t64935600\t0\t75\nchr9\t64937700\t64938000\t0.4761\t119\nchr9\t64947000\t64950000\t0.0837\t78\nchr9\t64952100\t64957500\t0.0019\t88\nchr9\t64959000\t64962300\t0\t94\nchr9\t64963500\t64963800\t0.0815\t82\nchr9\t64965600\t64970400\t0\t69\nchr9\t64973700\t64976700\t0\t71\nchr9\t64979400\t64979700\t0.2143\t66\nchr9\t64981200\t64981500\t0.0011\t73\nchr9\t64982700\t64988400\t0.0011\t73\nchr9\t64989600\t64997700\t0\t93\nchr9\t65079600\t65080200\t0.0007\t48\nchr9\t65130600\t65144100\t0\t86\nchr9\t65145300\t65207400\t0\t86\nchr9\t65208900\t65258100\t0\t86\nchr9\t65259600\t65285100\t0\t156\nchr9\t65286300\t65325000\t0\t156\nchr9\t65375100\t65376300\t0\t82\nchr9\t65502600\t65502900\t0.3065\t60\nchr9\t65514000\t65514300\t0.1086\t75\nchr9\t65517000\t65522100\t0\t68\nchr9\t65531700\t65532000\t0.1538\t71\nchr9\t65535900\t65536200\t0.245\t62\nchr9\t65542800\t65544300\t0.1032\t86\nchr9\t65545500\t65545800\t0.1032\t86\nchr9\t65559900\t65560200\t0.2526\t114\nchr9\t65567700\t65568900\t0.2893\t92\nchr9\t65575500\t65576700\t0.0664\t90\nchr9\t65578200\t65594700\t0\t92\nchr9\t65645100\t65648400\t0\t187\nchr9\t65650200\t65656500\t0\t119\nchr9\t65659800\t65660100\t0.1989\t76\nchr9\t65663400\t65663700\t0.0431\t63\nchr9\t65665500\t65673300\t0.0054\t100\nchr9\t65674800\t65676600\t0.0402\t100\nchr9\t65678100\t65679300\t0.0402\t100\nchr9\t65682600\t65690700\t0.0077\t118\nchr9\t65692200\t65692800\t0.0042\t91\nchr9\t65694600\t65707800\t0\t130\nchr9\t65709600\t65713500\t0\t130\nchr9\t65715900\t65716200\t0\t156\nchr9\t65718300\t65732400\t0\t156\nchr9\t65734800\t65735100\t0\t156\nchr9\t65736300\t65736600\t0\t141\nchr9\t65738100\t65741700\t0\t141\nchr9\t65742900\t65745000\t0\t141\nchr9\t65747400\t65762400\t0\t81\nchr9\t65763600\t65809800\t0\t121\nchr9\t65811000\t65811300\t0\t121\nchr9\t65813700\t65900400\t0\t121\nchr9\t65901600\t65940300\t0\t121\nchr9\t65941800\t65965800\t0\t121\nchr9\t65967000\t65984400\t0\t121\nchr9\t65986500\t65990700\t0\t121\nchr9\t65991900\t66030600\t0\t121\nchr9\t66032100\t66068400\t0\t121\nchr9\t66069600\t66146400\t0\t108\nchr9\t66148800\t66157800\t0\t88\nchr9\t66159000\t66160800\t0.1304\t75\nchr9\t66163800\t66169800\t0\t90\nchr9\t66176100\t66177000\t0.0114\t65\nchr9\t66178200\t66179100\t0.0586\t52\nchr9\t66183900\t66185400\t0.0493\t68\nchr9\t66186600\t66196200\t0\t68\nchr9\t66201900\t66235200\t0\t98\nchr9\t66236700\t66237600\t0\t98\nchr9\t66238800\t66245400\t0\t98\nchr9\t66247800\t66248400\t0\t97\nchr9\t66249900\t66251100\t0\t97\nchr9\t66252600\t66260700\t0\t97\nchr9\t66262200\t66262800\t0\t97\nchr9\t66267900\t66268200\t0.2877\t63\nchr9\t66270600\t66278100\t0\t90\nchr9\t66281100\t66288600\t0\t70\nchr9\t66289800\t66302700\t0\t70\nchr9\t66303900\t66312300\t0\t70\nchr9\t66313500\t66314100\t0\t76\nchr9\t66315600\t66326700\t0\t76\nchr9\t66328500\t66329700\t0\t76\nchr9\t66331800\t66336900\t0\t65\nchr9\t66338400\t66355800\t0\t65\nchr9\t66358500\t66359100\t0\t65\nchr9\t66360900\t66366000\t0\t65\nchr9\t66367500\t66390600\t0\t65\nchr9\t66591300\t66600600\t0\t73\nchr9\t66601800\t66612300\t0\t98\nchr9\t66614100\t66616800\t0\t72\nchr9\t66618300\t66628500\t0\t85\nchr9\t66629700\t66655500\t0\t85\nchr9\t66656700\t66673500\t0\t85\nchr9\t66674700\t66731100\t0\t145\nchr9\t66732300\t66735600\t0\t145\nchr9\t66737700\t66738300\t0\t89\nchr9\t66739500\t66765000\t0\t89\nchr9\t66766200\t66768300\t0\t89\nchr9\t66769500\t66773400\t0\t112\nchr9\t66779700\t66780600\t0.0476\t52\nchr9\t66791400\t66792000\t0.0078\t73\nchr9\t66795300\t66795600\t0.226\t51\nchr9\t66797400\t66797700\t0.2981\t62\nchr9\t66808800\t66809100\t0.383\t64\nchr9\t66810900\t66812100\t0.0984\t60\nchr9\t66813300\t66813600\t0.3684\t23\nchr9\t66815700\t66816000\t0.1352\t96\nchr9\t66821100\t66822000\t0.1287\t113\nchr9\t66827700\t66831300\t0\t97\nchr9\t66833700\t66842700\t0\t118\nchr9\t66844500\t66865500\t0\t98\nchr9\t66866700\t66875400\t0\t98\nchr9\t66876900\t66877500\t0\t98\nchr9\t66895800\t66896100\t0.1111\t45\nchr9\t66902400\t66902700\t0.4596\t59\nchr9\t66912300\t66912600\t0.0783\t50\nchr9\t66916500\t66917100\t0.3157\t65\nchr9\t66918900\t66919500\t0.0565\t74\nchr9\t66924600\t66929400\t0.0718\t56\nchr9\t66933600\t66936900\t0.0349\t55\nchr9\t66939600\t66940800\t0.0629\t56\nchr9\t66947700\t66948300\t0.1049\t46\nchr9\t66955800\t66956400\t0.1357\t64\nchr9\t66959100\t66960300\t0\t61\nchr9\t66963000\t66969000\t0\t73\nchr9\t66970200\t66972300\t0\t58\nchr9\t66973800\t66975300\t0.1231\t57\nchr9\t66979500\t66980100\t0\t73\nchr9\t66981600\t66996600\t0\t73\nchr9\t66997800\t67001100\t0\t73\nchr9\t67002300\t67005000\t0\t65\nchr9\t67006200\t67013100\t0\t52\nchr9\t67014300\t67015200\t0\t52\nchr9\t67016400\t67016700\t0.0042\t68\nchr9\t67018800\t67019400\t0.0042\t68\nchr9\t67020900\t67022700\t0.0042\t68\nchr9\t67023900\t67037700\t0\t67\nchr9\t67041600\t67043700\t0\t38\nchr9\t67045200\t67049100\t0\t60\nchr9\t67053000\t67053300\t0.2692\t62\nchr9\t67059600\t67059900\t0.0309\t54\nchr9\t67064400\t67065000\t0.183\t77\nchr9\t67077600\t67077900\t0.337\t62\nchr9\t67080600\t67086900\t0\t76\nchr9\t67094400\t67096500\t0\t52\nchr9\t67099200\t67099500\t0.089\t45\nchr9\t67101600\t67106700\t0\t65\nchr9\t67112400\t67123500\t0\t70\nchr9\t67125000\t67133100\t0\t64\nchr9\t67134300\t67141800\t0\t72\nchr9\t67143000\t67143900\t0\t72\nchr9\t67145700\t67148700\t0\t63\nchr9\t67150200\t67150500\t0.2467\t43\nchr9\t67152300\t67154100\t0\t62\nchr9\t67156800\t67157100\t0\t62\nchr9\t67158300\t67174200\t0\t76\nchr9\t67176300\t67183200\t0\t74\nchr9\t67185000\t67193400\t0\t62\nchr9\t67194900\t67196100\t0.0173\t64\nchr9\t67197300\t67208100\t0\t69\nchr9\t67210200\t67397700\t0\t151\nchr9\t67399500\t67410300\t0\t72\nchr9\t67411500\t67412400\t0\t72\nchr9\t67413600\t67413900\t0\t72\nchr9\t67417200\t67426200\t0\t89\nchr9\t67427700\t67433400\t0\t89\nchr9\t67434600\t67548300\t0\t89\nchr9\t67549500\t67591500\t0\t124\nchr9\t67592700\t67607700\t0\t124\nchr9\t67614300\t67614600\t0.3275\t64\nchr9\t67617300\t67623000\t0\t89\nchr9\t67624200\t67624500\t0.2943\t40\nchr9\t67626600\t67637100\t0\t75\nchr9\t67641000\t67679400\t0\t1810\nchr9\t67680600\t67756800\t0\t1810\nchr9\t67758000\t67758600\t0.1544\t94\nchr9\t67761600\t67763100\t0\t132\nchr9\t67764300\t67775700\t0\t132\nchr9\t67777800\t67778100\t0.1972\t66\nchr9\t67779300\t67782900\t0\t106\nchr9\t67784400\t67790700\t0\t106\nchr9\t67791900\t67822500\t0\t139\nchr9\t67824900\t67829100\t0\t80\nchr9\t67830300\t67831500\t0\t80\nchr9\t67833300\t67839600\t0\t76\nchr9\t67841700\t67844700\t0\t97\nchr9\t67846500\t67848600\t0\t97\nchr9\t67853100\t67853400\t0.3974\t65\nchr9\t67856100\t67858800\t0.102\t92\nchr9\t67860600\t67864500\t0\t85\nchr9\t67866300\t67871100\t0\t85\nchr9\t67872900\t67881600\t0\t85\nchr9\t67883100\t67884300\t0\t85\nchr9\t67885800\t67918800\t0\t109\nchr9\t67920300\t67920600\t0\t109\nchr9\t68220600\t68295900\t0\t111\nchr9\t68297400\t68303400\t0\t167\nchr9\t68304600\t68306400\t0\t167\nchr9\t68308200\t68311500\t0\t167\nchr9\t68312700\t68313600\t0\t167\nchr9\t68316000\t68318100\t0\t135\nchr9\t68319600\t68329800\t0\t148\nchr9\t68331900\t68332800\t0.1852\t90\nchr9\t68365200\t68365500\t0.1476\t85\nchr9\t68368200\t68368500\t0.2135\t96\nchr9\t68384700\t68386200\t0.1759\t121\nchr9\t68388000\t68388600\t0.2173\t91\nchr9\t68394600\t68394900\t0.3525\t90\nchr9\t68409300\t68409600\t0.2088\t80\nchr9\t68412000\t68412300\t0.2\t104\nchr9\t69416400\t69418200\t0\t81\nchr9\t69437400\t69439200\t0\t86\nchr9\t69477600\t69481200\t0\t80\nchr9\t69506400\t69510300\t0\t90\nchr9\t69763200\t69763800\t0.2008\t51\nchr9\t69838800\t69839400\t0.1036\t76\nchr9\t70038000\t70038900\t0.2992\t6102\nchr9\t70199400\t70199700\t0.3212\t61\nchr9\t70200900\t70201800\t0.0423\t61\nchr9\t70203300\t70203900\t0.0423\t61\nchr9\t70432500\t70433400\t0\t77\nchr9\t70701900\t70737600\t0\t45\nchr9\t74258100\t74259900\t0.1414\t52\nchr9\t74426400\t74426700\t0.2906\t49\nchr9\t74427900\t74428800\t0.0495\t66\nchr9\t75204300\t75204600\t0.2401\t41\nchr9\t76063500\t76063800\t0.0105\t51\nchr9\t76175100\t76175400\t0.1739\t450\nchr9\t76672200\t76673700\t0.1018\t79\nchr9\t76674900\t76675800\t0.1509\t73\nchr9\t76791300\t76791600\t0.1685\t62\nchr9\t78789300\t78789600\t0.4954\t15\nchr9\t79098000\t79098300\t0.026\t59\nchr9\t79181400\t79181700\t0.235\t54\nchr9\t79497900\t79498500\t0.1218\t69\nchr9\t80251200\t80251800\t0.2519\t80\nchr9\t80611800\t80612100\t0.2727\t75\nchr9\t80742900\t80744100\t0.0062\t81\nchr9\t81709500\t81711900\t0.0104\t86\nchr9\t81918600\t81948900\t0\t63\nchr9\t82753500\t82754100\t0.2635\t61\nchr9\t82755600\t82755900\t0.2635\t61\nchr9\t82771200\t82771500\t0.2724\t76\nchr9\t83049900\t83055300\t0.0011\t110\nchr9\t83223600\t83223900\t0.2837\t46\nchr9\t83226000\t83226900\t0.2252\t82\nchr9\t83821200\t83822100\t0\t63\nchr9\t83826300\t83826600\t0.0171\t78\nchr9\t83843100\t83843400\t0.1933\t44\nchr9\t84167400\t84167700\t0.4367\t73\nchr9\t85074600\t85074900\t0.1191\t49\nchr9\t85165200\t85165800\t0.0118\t68\nchr9\t85195800\t85196100\t0.1604\t52\nchr9\t85780200\t85780500\t0.1632\t39\nchr9\t85811400\t85812300\t0.0136\t123\nchr9\t85828500\t85829100\t0.2727\t57\nchr9\t86107500\t86109300\t0\t64\nchr9\t86159400\t86160300\t0.1369\t76\nchr9\t86607600\t86609400\t0.1385\t64\nchr9\t87912900\t87915300\t0\t75\nchr9\t87917400\t87919800\t0\t78\nchr9\t87926700\t87929700\t0.0005\t74\nchr9\t87933000\t87933600\t0.0145\t49\nchr9\t87939900\t87941400\t0.0126\t53\nchr9\t88112700\t88113000\t0.3361\t25\nchr9\t88119300\t88119900\t0.0275\t65\nchr9\t88123200\t88124400\t0.0506\t72\nchr9\t88125600\t88126200\t0.0506\t72\nchr9\t88133100\t88134300\t0.0295\t79\nchr9\t88137600\t88137900\t0.2262\t62\nchr9\t88140000\t88140600\t0.0015\t41\nchr9\t88244100\t88245900\t0.007\t83\nchr9\t88625700\t88626900\t0.0029\t83\nchr9\t89161800\t89163300\t0.242\t81\nchr9\t90150300\t90155400\t0\t143\nchr9\t91226700\t91228800\t0.0841\t97\nchr9\t91797000\t91798200\t0.0269\t63\nchr9\t92216400\t92217000\t0.1995\t72\nchr9\t92218200\t92218800\t0.2264\t84\nchr9\t92226900\t92227200\t0.0599\t107\nchr9\t92579100\t92579400\t0.111\t70\nchr9\t93335700\t93336300\t0.0203\t68\nchr9\t93515400\t93516000\t0.0359\t77\nchr9\t93740700\t93741000\t0.3126\t39\nchr9\t94089300\t94090800\t0.0413\t93\nchr9\t94092300\t94092600\t0.2456\t99\nchr9\t94113600\t94119300\t0\t124\nchr9\t94307700\t94308000\t0.0608\t72\nchr9\t94313100\t94313400\t0.2024\t18\nchr9\t94314900\t94319400\t0\t74\nchr9\t94321500\t94321800\t0.2931\t66\nchr9\t94328700\t94329300\t0.0812\t66\nchr9\t94331100\t94331700\t0.058\t62\nchr9\t94332900\t94335000\t0.0558\t68\nchr9\t94338000\t94338600\t0.1576\t58\nchr9\t94340400\t94341000\t0.0367\t73\nchr9\t94342800\t94343100\t0.0367\t73\nchr9\t94348500\t94349400\t0\t77\nchr9\t94350600\t94351500\t0\t77\nchr9\t94352700\t94353600\t0.1842\t66\nchr9\t94362900\t94365600\t0.0255\t63\nchr9\t94376700\t94377000\t0.1794\t60\nchr9\t94380300\t94381200\t0.1808\t61\nchr9\t94393200\t94394700\t0.0363\t71\nchr9\t94398600\t94398900\t0.2349\t51\nchr9\t94412700\t94413000\t0.3526\t53\nchr9\t94437000\t94437900\t0.1684\t64\nchr9\t94530600\t94530900\t0.1437\t26\nchr9\t95503800\t95504100\t0.3832\t71\nchr9\t95697900\t95703300\t0\t84\nchr9\t96706800\t96707700\t0.1754\t59\nchr9\t96904200\t96904500\t0.1786\t60\nchr9\t96908700\t96909000\t0.0017\t81\nchr9\t96914700\t96915000\t0.341\t50\nchr9\t96916800\t96917400\t0.0835\t61\nchr9\t96919200\t96919500\t0.038\t43\nchr9\t96922800\t96924600\t0.0806\t74\nchr9\t96928500\t96928800\t0.0124\t70\nchr9\t96939000\t96940200\t0\t84\nchr9\t96941700\t96942600\t0.031\t67\nchr9\t96947400\t96948300\t0.0511\t72\nchr9\t96950100\t96951000\t0.1184\t72\nchr9\t96975300\t96975600\t0.1974\t86\nchr9\t96989100\t96989400\t0.1243\t54\nchr9\t96993300\t96995100\t0.0963\t75\nchr9\t97007400\t97007700\t0.2146\t71\nchr9\t97022700\t97024500\t0.0999\t68\nchr9\t97195500\t97196700\t0.0326\t71\nchr9\t97197900\t97199100\t0.05\t64\nchr9\t97209300\t97209600\t0.3866\t82\nchr9\t97582500\t97584000\t0.2024\t87\nchr9\t98214300\t98214600\t0.1431\t54\nchr9\t98681100\t98681400\t0.136\t33\nchr9\t99499800\t99502800\t0.0681\t96\nchr9\t99504000\t99504600\t0.0409\t60\nchr9\t99853500\t99855000\t0\t75\nchr9\t100528500\t100528800\t0.195\t83\nchr9\t100692300\t100693800\t0.0216\t84\nchr9\t100695600\t100696500\t0.2947\t58\nchr9\t100983300\t100986900\t0\t82\nchr9\t101102400\t101107800\t0\t77\nchr9\t101681700\t101682300\t0\t20\nchr9\t102091800\t102092100\t0.2789\t96\nchr9\t102149100\t102149400\t0.169\t78\nchr9\t102219600\t102219900\t0.3626\t63\nchr9\t102221700\t102222000\t0.4506\t60\nchr9\t102363900\t102364200\t0.0169\t25\nchr9\t102792600\t102793800\t0.2045\t77\nchr9\t103239600\t103239900\t0.3592\t75\nchr9\t103739700\t103740000\t0.2758\t73\nchr9\t103947600\t103947900\t0.2739\t39\nchr9\t105576600\t105577500\t0.0583\t83\nchr9\t105580500\t105581100\t0.0276\t77\nchr9\t105631800\t105632100\t0.1683\t90\nchr9\t105762300\t105762600\t0.2572\t87\nchr9\t105779100\t105779400\t0.1524\t67\nchr9\t105781500\t105781800\t0.1524\t67\nchr9\t106184400\t106185000\t0.0838\t56\nchr9\t106212600\t106212900\t0.0295\t61\nchr9\t107027400\t107028000\t0.0259\t94\nchr9\t107256000\t107258400\t0\t74\nchr9\t107271300\t107273100\t0.0033\t64\nchr9\t107775300\t107778300\t0\t49\nchr9\t108504000\t108505200\t0.2168\t90\nchr9\t108594600\t108595200\t0.3048\t83\nchr9\t110412900\t110413200\t0.334\t84\nchr9\t110417400\t110423100\t0\t73\nchr9\t110791200\t110797200\t0\t88\nchr9\t111318600\t111319500\t0.2362\t59\nchr9\t111640200\t111642600\t0.0573\t77\nchr9\t111669600\t111669900\t0.0867\t21\nchr9\t112513500\t112515900\t0.0049\t60\nchr9\t112798200\t112804200\t0\t90\nchr9\t113060400\t113061300\t0.0033\t109\nchr9\t113063700\t113088000\t0\t259\nchr9\t113089200\t113089500\t0\t259\nchr9\t113105400\t113111400\t0\t80\nchr9\t113112900\t113119200\t0\t83\nchr9\t113439000\t113443200\t0.0019\t77\nchr9\t114322800\t114323100\t0.1977\t69\nchr9\t114326700\t114327600\t0.1214\t66\nchr9\t114329700\t114330000\t0.1838\t57\nchr9\t114333900\t114334200\t0.2484\t81\nchr9\t115527600\t115528200\t0.1395\t68\nchr9\t115769400\t115769700\t0.0378\t92\nchr9\t115919400\t115919700\t0.1001\t78\nchr9\t117066900\t117070500\t0.0075\t81\nchr9\t119133900\t119134200\t0.102\t72\nchr9\t119171400\t119172000\t0.0206\t69\nchr9\t119621700\t119626200\t0.0007\t81\nchr9\t120056100\t120061200\t0\t113\nchr9\t120495000\t120496500\t0.0254\t109\nchr9\t121417200\t121417500\t0.3337\t70\nchr9\t121429200\t121429500\t0.2981\t97\nchr9\t121971300\t121971600\t0.115\t42\nchr9\t122569800\t122570100\t0.337\t93\nchr9\t122627100\t122627700\t0.1288\t70\nchr9\t122867100\t122868000\t0.2346\t51\nchr9\t123404700\t123405900\t0.0201\t58\nchr9\t123905400\t123908700\t0.0344\t76\nchr9\t123976500\t123978900\t0\t64\nchr9\t123991200\t123993600\t0\t84\nchr9\t125328300\t125328600\t0.2278\t47\nchr9\t125623200\t125625000\t0.029\t85\nchr9\t125778900\t125779200\t0.0787\t72\nchr9\t126013500\t126014100\t0.2442\t75\nchr9\t126484500\t126485400\t0\t45\nchr9\t128138700\t128139000\t0.4487\t79\nchr9\t128795400\t128795700\t0.478\t99\nchr9\t130277700\t130278000\t0.2813\t117\nchr9\t130777500\t130778100\t0.3938\t66\nchr9\t131356800\t131357400\t0.0678\t77\nchr9\t132526800\t132529200\t0\t65\nchr9\t133062300\t133062600\t0.2877\t66\nchr9\t133069200\t133070400\t0.1435\t75\nchr9\t133082700\t133083600\t0\t75\nchr9\t133084800\t133086300\t0\t75\nchr9\t133185300\t133185600\t0.1544\t30\nchr9\t133313400\t133314000\t0.2099\t92\nchr9\t133514100\t133514400\t0.0255\t26\nchr9\t133564200\t133564500\t0.4995\t63\nchr9\t133668900\t133669200\t0.4431\t18\nchr9\t133827300\t133827900\t0.2235\t32\nchr9\t134012100\t134014500\t0\t197\nchr9\t134114700\t134118900\t0\t69\nchr9\t134466600\t134466900\t0.4041\t25\nchr9\t134475900\t134476200\t0.3245\t116\nchr9\t134481000\t134481300\t0.4184\t59\nchr9\t134586900\t134588100\t0.1683\t78\nchr9\t134866200\t134867100\t0.1875\t71\nchr9\t135528000\t135528300\t0.3769\t64\nchr9\t135981600\t135982200\t0.3109\t49\nchr9\t136101600\t136101900\t0.3093\t67\nchr9\t136355100\t136355400\t0.0271\t25\nchr9\t136580400\t136581000\t0.0357\t19\nchr9\t136696800\t136697100\t0.4528\t11\nchr9\t136802700\t136803300\t0.1716\t100\nchr9\t137288400\t137289000\t0.2844\t51\nchr9\t137322900\t137323200\t0.1391\t57\nchr9\t137328600\t137329200\t0.3897\t97\nchr9\t137341800\t137342100\t0.4446\t36\nchr9\t137394300\t137394600\t0.4836\t33\nchr9\t137565600\t137568300\t0.042\t64\nchr9\t137693700\t137694000\t0.3613\t24\nchr9\t137715900\t137716500\t0.1242\t259\nchr9\t137818800\t137819400\t0.015\t63\nchr9\t137845200\t137846400\t0\t244\nchr9\t137885400\t137886000\t0.2862\t66\nchr9\t137887500\t137887800\t0.1619\t53\nchr9\t137976900\t137977200\t0.4754\t59\nchr9\t138018000\t138019500\t0\t54\nchr9\t138163200\t138163500\t0.1011\t64\nchr9\t138184200\t138186300\t0.0033\t73\nchr9\t138191100\t138196800\t0\t37\nchr9\t138205200\t138206100\t0.0011\t93\nchr9\t138209400\t138209700\t0.2554\t66\nchr9\t138213300\t138213900\t0.1116\t75\nchr9\t138216000\t138216600\t0.1116\t75\nchr9\t138219900\t138334500\t0\t252\nchrX\t10200\t12300\t0\t46\nchrX\t16800\t19500\t0\t30\nchrX\t21000\t24600\t0\t33\nchrX\t94800\t95100\t0\t34\nchrX\t96300\t97800\t0\t34\nchrX\t99600\t100200\t0\t34\nchrX\t222600\t225600\t0\t42\nchrX\t226800\t227400\t0.1611\t30\nchrX\t229500\t230100\t0.0351\t26\nchrX\t231600\t232500\t0.3214\t46\nchrX\t234300\t234600\t0.1256\t43\nchrX\t236100\t236700\t0.091\t42\nchrX\t244200\t245400\t0.1967\t62\nchrX\t246900\t247200\t0.1335\t59\nchrX\t249900\t250800\t0.0036\t46\nchrX\t268200\t274800\t0.1001\t513\nchrX\t280500\t280800\t0.4785\t24\nchrX\t297900\t298500\t0.1506\t100\nchrX\t315900\t316200\t0.2671\t129\nchrX\t321600\t322500\t0.0965\t33\nchrX\t342300\t342900\t0.4381\t62\nchrX\t407400\t408300\t0.3387\t55\nchrX\t432600\t432900\t0.4625\t144\nchrX\t512400\t516000\t0.0585\t106\nchrX\t527400\t528600\t0.0145\t109\nchrX\t598500\t598800\t0.4125\t15\nchrX\t647400\t648000\t0.0118\t37\nchrX\t724800\t725400\t0.3145\t207\nchrX\t825300\t825600\t0.4511\t41\nchrX\t839400\t840600\t0.0734\t58\nchrX\t918600\t918900\t0.4865\t51\nchrX\t1049700\t1050000\t0.3474\t94\nchrX\t1127400\t1128900\t0.2277\t111\nchrX\t1143300\t1143900\t0.3474\t65\nchrX\t1146300\t1146900\t0.3375\t103\nchrX\t1174200\t1174800\t0.1663\t70\nchrX\t1264200\t1264500\t0.0556\t74\nchrX\t1296600\t1298700\t0.1405\t94\nchrX\t1368900\t1376100\t0\t57\nchrX\t1409700\t1410300\t0\t25\nchrX\t1453800\t1454100\t0.4585\t34\nchrX\t1489800\t1490100\t0.3792\t27\nchrX\t1641000\t1641300\t0.3159\t13\nchrX\t1697100\t1697400\t0.0735\t57\nchrX\t1698600\t1698900\t0.0735\t57\nchrX\t1705800\t1706100\t0.2726\t60\nchrX\t1763700\t1764900\t0.2162\t28\nchrX\t1855800\t1856100\t0.1546\t58\nchrX\t1887900\t1888200\t0.1661\t60\nchrX\t1947600\t1949400\t0\t39\nchrX\t2133000\t2134800\t0\t33\nchrX\t2227800\t2228400\t0.2219\t28\nchrX\t2277300\t2277600\t0.293\t17\nchrX\t2362800\t2363100\t0.3709\t59\nchrX\t2382600\t2382900\t0.4872\t271\nchrX\t2773500\t2773800\t0.2276\t37\nchrX\t2845200\t2845500\t0.0508\t19\nchrX\t3524400\t3525000\t0.3362\t216\nchrX\t3641700\t3642000\t0.1933\t34\nchrX\t3824100\t3824700\t0.0158\t20\nchrX\t3830700\t3837900\t0\t25\nchrX\t3839100\t3842400\t0\t34\nchrX\t3843600\t3866700\t0\t40\nchrX\t3867900\t3880800\t0\t40\nchrX\t3882000\t3937500\t0\t40\nchrX\t3967500\t3968400\t0\t66\nchrX\t4267200\t4267500\t0.1625\t26\nchrX\t4681800\t4682100\t0.3092\t13\nchrX\t4986600\t4986900\t0.325\t22\nchrX\t5107800\t5109000\t0.0046\t53\nchrX\t5481300\t5486400\t0.0255\t49\nchrX\t5652300\t5652600\t0.0411\t15\nchrX\t5669700\t5670000\t0.2126\t11\nchrX\t5764800\t5765400\t0.1374\t53\nchrX\t5816100\t5817000\t0.0103\t67\nchrX\t6480600\t6481200\t0.3235\t46\nchrX\t6529200\t6529800\t0.1405\t36\nchrX\t6532800\t6534300\t0.1014\t43\nchrX\t6584100\t6588900\t0\t62\nchrX\t6934500\t6938400\t0.007\t64\nchrX\t7589100\t7590300\t0.0365\t118\nchrX\t7608000\t7608300\t0.135\t52\nchrX\t7844100\t7844400\t0.4499\t26\nchrX\t7848600\t7849200\t0.1013\t39\nchrX\t8169300\t8170800\t0.0883\t55\nchrX\t8465700\t8467200\t0.1441\t41\nchrX\t9052800\t9053100\t0.2161\t26\nchrX\t9054600\t9054900\t0.1274\t30\nchrX\t9406800\t9407100\t0.4951\t29\nchrX\t10250100\t10250400\t0.1978\t49\nchrX\t10880100\t10880400\t0.0595\t14\nchrX\t10967400\t10967700\t0.2436\t39\nchrX\t11000700\t11001600\t0.0923\t57\nchrX\t11078400\t11078700\t0.3202\t19\nchrX\t11219100\t11220000\t0.08\t69\nchrX\t11518800\t11519100\t0.3545\t33\nchrX\t11674800\t11675100\t0.3935\t27\nchrX\t11707500\t11713200\t0\t99\nchrX\t11935200\t11941200\t0\t84\nchrX\t12560700\t12561000\t0.1427\t35\nchrX\t12621900\t12623400\t0.002\t15\nchrX\t12857400\t12857700\t0.2644\t45\nchrX\t12928200\t12928500\t0.1754\t62\nchrX\t13612200\t13612500\t0.1553\t40\nchrX\t13881600\t13883400\t0\t21\nchrX\t14085300\t14085900\t0.1188\t44\nchrX\t14104500\t14107800\t0.1727\t56\nchrX\t15030300\t15030900\t0.2747\t66\nchrX\t15647700\t15648000\t0.0421\t37\nchrX\t15703800\t15704400\t0.0702\t30\nchrX\t16231200\t16231500\t0.2652\t46\nchrX\t16234500\t16234800\t0.0383\t42\nchrX\t16323600\t16324200\t0.0116\t42\nchrX\t16337700\t16338000\t0.2195\t56\nchrX\t16362300\t16362600\t0.2103\t28\nchrX\t16377600\t16378200\t0\t29\nchrX\t16409700\t16410000\t0\t25\nchrX\t16499400\t16499700\t0.1937\t66\nchrX\t16501800\t16503300\t0.1259\t37\nchrX\t17055000\t17055600\t0.0905\t57\nchrX\t17096400\t17096700\t0.3088\t31\nchrX\t17184300\t17184600\t0.2167\t50\nchrX\t17231400\t17232000\t0.2736\t68\nchrX\t17319300\t17320200\t0.0023\t48\nchrX\t17342700\t17346300\t0.0969\t74\nchrX\t17737200\t17737500\t0.0802\t169\nchrX\t18106800\t18107100\t0.3195\t57\nchrX\t18109800\t18110700\t0.0239\t87\nchrX\t19144500\t19148700\t0\t84\nchrX\t19452000\t19452300\t0.4813\t16\nchrX\t19780200\t19780500\t0.301\t35\nchrX\t19941900\t19944900\t0\t72\nchrX\t20335500\t20337000\t0.0322\t60\nchrX\t20416500\t20416800\t0.1372\t49\nchrX\t20704500\t20704800\t0.2546\t50\nchrX\t20724300\t20724600\t0.1181\t46\nchrX\t22658700\t22659000\t0.2413\t67\nchrX\t23238900\t23244300\t0\t73\nchrX\t23887200\t23887500\t0.3274\t66\nchrX\t23973000\t23974500\t0\t36\nchrX\t24043500\t24043800\t0.1102\t41\nchrX\t24053100\t24053400\t0.1093\t42\nchrX\t24134400\t24135900\t0\t37\nchrX\t24274500\t24274800\t0.4326\t19\nchrX\t24312900\t24313200\t0.3478\t29\nchrX\t24336900\t24337200\t0.3642\t41\nchrX\t24708300\t24710100\t0.0224\t96\nchrX\t25824300\t25824600\t0.0766\t11\nchrX\t25929900\t25930200\t0.2294\t14\nchrX\t26163000\t26163300\t0.4393\t38\nchrX\t26196300\t26196600\t0.286\t36\nchrX\t26313900\t26320200\t0\t104\nchrX\t27109800\t27110400\t0.0159\t60\nchrX\t27226500\t27227100\t0.1976\t56\nchrX\t27927600\t27928200\t0.0764\t50\nchrX\t28095300\t28095600\t0.2468\t34\nchrX\t28206900\t28207200\t0.0012\t77\nchrX\t28209000\t28212600\t0.0012\t77\nchrX\t28230000\t28230300\t0.0338\t96\nchrX\t28950000\t28950600\t0.1399\t52\nchrX\t29332200\t29334600\t0.0481\t128\nchrX\t29356200\t29356500\t0.0794\t449\nchrX\t29582400\t29583600\t0.004\t61\nchrX\t29916000\t29916300\t0.3013\t65\nchrX\t29984700\t29985000\t0.2868\t60\nchrX\t30018900\t30019200\t0.0269\t24\nchrX\t30324000\t30324300\t0.4356\t48\nchrX\t30545400\t30545700\t0.3506\t38\nchrX\t30603300\t30603900\t0.2009\t63\nchrX\t30770700\t30771600\t0.2449\t52\nchrX\t31184400\t31184700\t0.269\t33\nchrX\t31190400\t31190700\t0.4196\t37\nchrX\t31512300\t31513200\t0.2293\t49\nchrX\t31530900\t31535700\t0\t64\nchrX\t31798200\t31798500\t0.1544\t109\nchrX\t31897500\t31897800\t0.0938\t54\nchrX\t32244300\t32246700\t0.1308\t60\nchrX\t33190500\t33190800\t0.0069\t20\nchrX\t34248600\t34251900\t0.0073\t53\nchrX\t34416000\t34416300\t0.0839\t47\nchrX\t34819500\t34820700\t0.2006\t47\nchrX\t35222100\t35222700\t0.2254\t57\nchrX\t35315100\t35317200\t0.0184\t61\nchrX\t35939400\t35940000\t0.2007\t45\nchrX\t36174600\t36174900\t0.1989\t51\nchrX\t36465300\t36465600\t0.0193\t70\nchrX\t36466800\t36470400\t0.0193\t70\nchrX\t36986700\t36988800\t0.0352\t36\nchrX\t36998100\t36999300\t0.0142\t33\nchrX\t37085100\t37099200\t0\t42\nchrX\t37554600\t37555800\t0.0144\t40\nchrX\t37570200\t37570500\t0.0062\t36\nchrX\t40110600\t40110900\t0.182\t127\nchrX\t41427600\t41427900\t0.0585\t49\nchrX\t41613300\t41613600\t0.1955\t58\nchrX\t42202800\t42204900\t0.0239\t78\nchrX\t42426000\t42426300\t0.1128\t61\nchrX\t42473400\t42474900\t0.125\t52\nchrX\t42564600\t42564900\t0.367\t50\nchrX\t42888900\t42890400\t0.0129\t89\nchrX\t42891600\t42894300\t0\t65\nchrX\t43304700\t43311600\t0\t294\nchrX\t43574700\t43575000\t0.2384\t46\nchrX\t43588500\t43589100\t0.0779\t30\nchrX\t43671000\t43671900\t0.0757\t61\nchrX\t43989300\t43990200\t0\t36\nchrX\t43992900\t43993500\t0.0072\t42\nchrX\t44282400\t44282700\t0.1779\t78\nchrX\t44441100\t44441400\t0\t15\nchrX\t44443800\t44445000\t0.0165\t21\nchrX\t45039600\t45042000\t0.0774\t94\nchrX\t45108600\t45108900\t0.2553\t52\nchrX\t45589800\t45590100\t0.0756\t31\nchrX\t45687900\t45688800\t0\t36\nchrX\t45691500\t45692400\t0\t36\nchrX\t46509600\t46509900\t0.2775\t47\nchrX\t46656900\t46659900\t0.1145\t66\nchrX\t47036700\t47037000\t0.0988\t69\nchrX\t47148600\t47148900\t0.3262\t13\nchrX\t47327100\t47327700\t0.1316\t22\nchrX\t47510100\t47512200\t0.1013\t37\nchrX\t47669400\t47669700\t0.1814\t60\nchrX\t47784000\t47784900\t0\t80\nchrX\t47786400\t47787300\t0\t80\nchrX\t47790600\t47791800\t0.0087\t73\nchrX\t47903400\t47904000\t0.1325\t75\nchrX\t47906100\t47907300\t0.2386\t31\nchrX\t48004500\t48012000\t0\t42\nchrX\t48015000\t48015600\t0.0331\t38\nchrX\t48018000\t48020100\t0\t33\nchrX\t48091800\t48092400\t0\t35\nchrX\t48095100\t48096000\t0\t31\nchrX\t48127200\t48135900\t0\t40\nchrX\t48137400\t48138000\t0\t40\nchrX\t48140700\t48141000\t0.1644\t36\nchrX\t48142200\t48142500\t0.1644\t36\nchrX\t48173100\t48173400\t0.2391\t52\nchrX\t48232500\t48233400\t0.0795\t55\nchrX\t48259800\t48260100\t0.1437\t29\nchrX\t48308400\t48308700\t0.1829\t27\nchrX\t48339000\t48339300\t0.3102\t18\nchrX\t48367500\t48368400\t0\t42\nchrX\t48369600\t48396300\t0\t42\nchrX\t48399300\t48427800\t0\t43\nchrX\t49317900\t49320600\t0\t101\nchrX\t49321800\t49331700\t0\t150\nchrX\t49333500\t49345500\t0\t150\nchrX\t49346700\t49348500\t0\t150\nchrX\t49528500\t49589700\t0\t165\nchrX\t49591800\t49603500\t0\t138\nchrX\t49966800\t49968900\t0\t83\nchrX\t50019600\t50025600\t0\t91\nchrX\t50057400\t50057700\t0.0714\t61\nchrX\t50060400\t50065800\t0\t80\nchrX\t50296200\t50296800\t0.1\t40\nchrX\t50739600\t50740200\t0.0623\t33\nchrX\t50990700\t50991900\t0\t29\nchrX\t51033000\t51033300\t0.0463\t33\nchrX\t51079800\t51081000\t0\t39\nchrX\t51111300\t51112800\t0.1212\t79\nchrX\t51115200\t51117300\t0.0116\t63\nchrX\t51246900\t51248100\t0.3004\t47\nchrX\t51260400\t51260700\t0.2384\t53\nchrX\t51265800\t51267000\t0.0795\t68\nchrX\t51280500\t51280800\t0.2413\t54\nchrX\t51429600\t51429900\t0.0113\t37\nchrX\t51618000\t51618600\t0.0424\t25\nchrX\t51648600\t51648900\t0.1979\t69\nchrX\t51668400\t51692400\t0\t48\nchrX\t51700500\t51725100\t0\t46\nchrX\t52041300\t52077000\t0\t44\nchrX\t52177200\t52212600\t0\t45\nchrX\t52223700\t52224600\t0.0928\t66\nchrX\t52267200\t52268100\t0.0114\t19\nchrX\t52384500\t52384800\t0.2089\t58\nchrX\t52445100\t52445700\t0.0663\t29\nchrX\t52456500\t52456800\t0\t45\nchrX\t52458600\t52461300\t0\t45\nchrX\t52473600\t52502100\t0\t71\nchrX\t52510800\t52539000\t0\t65\nchrX\t52644000\t52644600\t0\t28\nchrX\t52670400\t52788000\t0\t49\nchrX\t52789800\t52791300\t0.0047\t37\nchrX\t52799700\t52801800\t0.005\t40\nchrX\t52803600\t52804200\t0.005\t40\nchrX\t52826100\t52826700\t0.2131\t38\nchrX\t52882800\t52920000\t0\t45\nchrX\t52935900\t52973400\t0\t46\nchrX\t53338200\t53339400\t0\t21\nchrX\t53504700\t53505000\t0.4589\t58\nchrX\t53524500\t53524800\t0.4314\t27\nchrX\t53578800\t53580000\t0.1103\t77\nchrX\t53597400\t53597700\t0.1834\t21\nchrX\t53769300\t53769600\t0.2188\t30\nchrX\t53772000\t53772600\t0.0088\t29\nchrX\t54078000\t54078300\t0.3908\t34\nchrX\t54102300\t54102600\t0.055\t29\nchrX\t54108900\t54109500\t0.0327\t35\nchrX\t54118800\t54124500\t0\t72\nchrX\t54764400\t54766800\t0.0428\t52\nchrX\t54768000\t54770100\t0.0428\t52\nchrX\t54823200\t54823500\t0.0576\t28\nchrX\t54828000\t54829200\t0.1133\t48\nchrX\t54967500\t54968400\t0\t45\nchrX\t54970500\t54971400\t0\t37\nchrX\t55077900\t55079700\t0\t42\nchrX\t55092000\t55093500\t0\t35\nchrX\t55453800\t55479900\t0\t49\nchrX\t55493100\t55519500\t0\t44\nchrX\t55806900\t55807200\t0.1024\t67\nchrX\t56056500\t56056800\t0.3839\t25\nchrX\t56164200\t56164500\t0.14\t32\nchrX\t56432400\t56441100\t0\t41\nchrX\t56696100\t56701500\t0\t89\nchrX\t56767800\t56780700\t0\t63\nchrX\t56915100\t56915400\t0.307\t32\nchrX\t57120300\t57120900\t0.1136\t31\nchrX\t57136200\t57136800\t0.1188\t32\nchrX\t57297600\t57298800\t0\t37\nchrX\t57325800\t57327000\t0.0059\t33\nchrX\t57800100\t57800700\t0.2019\t55\nchrX\t58133400\t58135500\t0\t46\nchrX\t58468200\t58469100\t0.0173\t54\nchrX\t58480500\t58485300\t0\t49\nchrX\t58486500\t58487700\t0\t42\nchrX\t58493700\t58494600\t0\t37\nchrX\t58499100\t58505700\t0\t44\nchrX\t58539900\t58555500\t0\t115\nchrX\t58606200\t58874700\t0\t196\nchrX\t58875900\t58935000\t0\t267\nchrX\t58936200\t58988700\t0\t267\nchrX\t58989900\t59114700\t0\t179\nchrX\t59115900\t59144700\t0\t179\nchrX\t59145900\t59185800\t0\t107\nchrX\t59187600\t59189700\t0\t43\nchrX\t59190900\t59316600\t0\t205\nchrX\t59317800\t59327100\t0\t205\nchrX\t59329200\t59425200\t0\t229\nchrX\t59427000\t59457300\t0\t229\nchrX\t59458500\t59594400\t0\t229\nchrX\t59598600\t59666100\t0\t200\nchrX\t59667300\t59695500\t0\t200\nchrX\t59696700\t59735100\t0\t200\nchrX\t59736600\t59824200\t0\t200\nchrX\t59825400\t59889600\t0\t150\nchrX\t59891100\t59921400\t0\t232\nchrX\t59922600\t59961000\t0\t232\nchrX\t59962200\t60066600\t0\t405\nchrX\t60067800\t60153300\t0\t405\nchrX\t60154500\t60208800\t0\t114\nchrX\t60210300\t60264900\t0\t321\nchrX\t60266400\t60405000\t0\t321\nchrX\t60406800\t60483000\t0\t321\nchrX\t60484800\t60486600\t0\t321\nchrX\t60487800\t60774600\t0\t321\nchrX\t60776100\t60971100\t0\t321\nchrX\t60972300\t60987900\t0\t321\nchrX\t60989100\t61022400\t0\t321\nchrX\t61024800\t61203000\t0\t361\nchrX\t61204200\t61286100\t0\t361\nchrX\t61287300\t61368600\t0\t328\nchrX\t61369800\t61437300\t0\t328\nchrX\t61438800\t61467300\t0\t328\nchrX\t61468500\t61511400\t0\t328\nchrX\t61513800\t61581900\t0\t328\nchrX\t61583100\t61738500\t0\t328\nchrX\t61739700\t61819800\t0\t328\nchrX\t61821300\t61862700\t0\t328\nchrX\t61863900\t61929600\t0\t328\nchrX\t61930800\t61955700\t0\t312\nchrX\t61956900\t61997700\t0\t312\nchrX\t61998900\t62159400\t0\t312\nchrX\t62160600\t62189100\t0\t312\nchrX\t62190300\t62247000\t0\t312\nchrX\t62248200\t62321700\t0\t222\nchrX\t62323200\t62412600\t0\t222\nchrX\t62463300\t62466000\t0\t240\nchrX\t62467800\t62472900\t0\t117\nchrX\t62474700\t62487300\t0\t117\nchrX\t62489400\t62495700\t0\t117\nchrX\t62497800\t62499600\t0\t44\nchrX\t62502000\t62506200\t0\t37\nchrX\t62511300\t62511600\t0.4953\t74\nchrX\t62603100\t62603400\t0.2658\t22\nchrX\t62646900\t62647200\t0.433\t168\nchrX\t63129600\t63185400\t0\t47\nchrX\t63188700\t63190500\t0.0148\t67\nchrX\t63193500\t63249300\t0\t47\nchrX\t63319500\t63319800\t0.2815\t55\nchrX\t63597900\t63598200\t0.338\t40\nchrX\t64013400\t64018500\t0.0418\t60\nchrX\t64110900\t64112400\t0.0047\t34\nchrX\t64114200\t64115100\t0.0033\t49\nchrX\t64134300\t64134900\t0.0029\t44\nchrX\t64254300\t64258200\t0\t91\nchrX\t64296900\t64300800\t0.1922\t54\nchrX\t64516800\t64517100\t0.0195\t58\nchrX\t64518900\t64519200\t0.0195\t58\nchrX\t65190900\t65191500\t0.1918\t52\nchrX\t65207700\t65211000\t0\t83\nchrX\t65383800\t65384100\t0.2453\t55\nchrX\t65457600\t65458200\t0.1056\t66\nchrX\t65616300\t65616600\t0.0603\t65\nchrX\t65619000\t65619300\t0.379\t37\nchrX\t65824800\t65825100\t0.3658\t47\nchrX\t65834400\t65834700\t0.1593\t43\nchrX\t66066900\t66067500\t0.016\t70\nchrX\t66080100\t66080700\t0.0984\t45\nchrX\t66137100\t66137700\t0.0109\t75\nchrX\t66180900\t66186300\t0\t87\nchrX\t66560400\t66560700\t0.1511\t32\nchrX\t66646500\t66646800\t0.1682\t54\nchrX\t66747300\t66747600\t0.1565\t37\nchrX\t66953400\t66954000\t0.0846\t75\nchrX\t67060200\t67060500\t0.068\t66\nchrX\t67169100\t67170000\t0\t55\nchrX\t67415400\t67415700\t0.3213\t430\nchrX\t68042700\t68043300\t0.0332\t54\nchrX\t68217900\t68221500\t0.0222\t55\nchrX\t68325900\t68327700\t0.0088\t37\nchrX\t68652900\t68653500\t0.3235\t79\nchrX\t69680400\t69680700\t0.1952\t23\nchrX\t69749100\t69749400\t0.0367\t50\nchrX\t69785100\t69785400\t0.1427\t44\nchrX\t69822900\t69825300\t0.0339\t50\nchrX\t69949800\t69951000\t0.09\t47\nchrX\t69982800\t69987000\t0\t85\nchrX\t70100400\t70104000\t0.0117\t74\nchrX\t70600500\t70601400\t0.0031\t63\nchrX\t70602900\t70603500\t0.0031\t63\nchrX\t70631700\t70632000\t0.0429\t31\nchrX\t70642500\t70644600\t0.011\t67\nchrX\t70680000\t70680600\t0.2979\t61\nchrX\t70716000\t70716300\t0.4278\t38\nchrX\t70728900\t70729200\t0.2831\t24\nchrX\t70748700\t70749000\t0.2471\t42\nchrX\t70939500\t70939800\t0.2148\t63\nchrX\t71340600\t71340900\t0.252\t53\nchrX\t71350200\t71352300\t0\t33\nchrX\t71414100\t71416200\t0\t41\nchrX\t71520600\t71522700\t0\t17\nchrX\t71591400\t71591700\t0.2089\t39\nchrX\t71683500\t71797800\t0\t47\nchrX\t71903400\t71903700\t0.0306\t27\nchrX\t72178200\t72180000\t0.0361\t88\nchrX\t72444600\t72444900\t0.3171\t49\nchrX\t72680700\t72682800\t0.0672\t70\nchrX\t72743400\t72757200\t0\t44\nchrX\t72758700\t72962400\t0\t47\nchrX\t72963600\t72979200\t0\t47\nchrX\t72996300\t73005000\t0\t39\nchrX\t73009500\t73011900\t0\t64\nchrX\t73033200\t73033800\t0.1668\t40\nchrX\t73078500\t73086900\t0\t44\nchrX\t73106100\t73112700\t0\t94\nchrX\t73291200\t73291800\t0.0093\t65\nchrX\t73381200\t73386900\t0\t78\nchrX\t73600200\t73600500\t0.2428\t50\nchrX\t73887600\t73887900\t0.0605\t60\nchrX\t73889100\t73890600\t0.0605\t60\nchrX\t74792400\t74793900\t0.1932\t60\nchrX\t74874600\t74874900\t0.2478\t45\nchrX\t74991300\t74992200\t0.0584\t87\nchrX\t75218400\t75218700\t0.1423\t58\nchrX\t75437400\t75437700\t0.2466\t39\nchrX\t75510600\t75513000\t0\t53\nchrX\t75537900\t75538200\t0.2908\t57\nchrX\t75590100\t75590400\t0.3679\t45\nchrX\t76003200\t76003500\t0.0014\t51\nchrX\t76004700\t76005000\t0.0014\t51\nchrX\t76006500\t76007400\t0.0014\t51\nchrX\t76034100\t76034400\t0.141\t27\nchrX\t76074000\t76074300\t0.2244\t45\nchrX\t76092900\t76093200\t0.2199\t36\nchrX\t76142100\t76146000\t0\t42\nchrX\t76149300\t76153200\t0\t42\nchrX\t76217400\t76218300\t0.2403\t31\nchrX\t76272000\t76272300\t0.1092\t57\nchrX\t76277700\t76278000\t0.144\t44\nchrX\t76293000\t76293300\t0.1588\t54\nchrX\t76323000\t76326900\t0.0104\t84\nchrX\t76375800\t76376100\t0.1709\t45\nchrX\t76481400\t76481700\t0.3452\t57\nchrX\t76581900\t76582200\t0.1434\t24\nchrX\t77145600\t77145900\t0.2279\t31\nchrX\t77205000\t77208600\t0\t58\nchrX\t77246100\t77246700\t0.2049\t56\nchrX\t77247900\t77248200\t0.2988\t43\nchrX\t78058500\t78058800\t0.2017\t48\nchrX\t78172500\t78173100\t0.005\t35\nchrX\t78184200\t78184500\t0.4465\t61\nchrX\t78196800\t78197400\t0\t26\nchrX\t78229800\t78230400\t0.0694\t59\nchrX\t78269100\t78269400\t0.005\t14\nchrX\t78403500\t78404100\t0.2157\t30\nchrX\t78441300\t78441900\t0\t52\nchrX\t78853800\t78854100\t0.19\t62\nchrX\t79086600\t79086900\t0.0477\t50\nchrX\t79200300\t79200600\t0.2972\t50\nchrX\t79224300\t79224600\t0.1521\t43\nchrX\t79743300\t79743900\t0.2971\t77\nchrX\t79765800\t79767900\t0.0311\t63\nchrX\t79769100\t79770900\t0.0311\t63\nchrX\t79927800\t79928100\t0.1661\t44\nchrX\t79930200\t79931700\t0.067\t68\nchrX\t80187900\t80188200\t0.1358\t33\nchrX\t80392500\t80392800\t0.3771\t28\nchrX\t80406600\t80406900\t0.0749\t68\nchrX\t80410200\t80410500\t0.1028\t59\nchrX\t80534400\t80536500\t0.0575\t57\nchrX\t81066900\t81067500\t0.2296\t62\nchrX\t81832800\t81833100\t0.0762\t41\nchrX\t81841200\t81847200\t0\t71\nchrX\t81972900\t81973200\t0.1751\t61\nchrX\t81976500\t81976800\t0.1955\t54\nchrX\t82013100\t82013400\t0.196\t65\nchrX\t82119900\t82120200\t0.3519\t39\nchrX\t82491300\t82492200\t0.1387\t87\nchrX\t82713300\t82713600\t0.4392\t28\nchrX\t82857000\t82858800\t0.0035\t55\nchrX\t82903500\t82903800\t0.224\t46\nchrX\t83059800\t83065200\t0\t70\nchrX\t83316000\t83316300\t0.2889\t66\nchrX\t83543100\t83549100\t0\t61\nchrX\t83568300\t83568900\t0.2952\t42\nchrX\t83731500\t83731800\t0.2173\t41\nchrX\t83838000\t83838600\t0.2106\t63\nchrX\t83840100\t83842800\t0.1262\t71\nchrX\t84435900\t84436200\t0.2376\t95\nchrX\t84604500\t84605100\t0.0495\t94\nchrX\t84858300\t84858600\t0.2536\t25\nchrX\t84871800\t84872100\t0.3733\t28\nchrX\t85254300\t85254600\t0.0712\t25\nchrX\t85425300\t85425600\t0.1569\t53\nchrX\t86074800\t86075100\t0.3538\t36\nchrX\t86114100\t86114700\t0.0396\t43\nchrX\t86117100\t86117400\t0.2755\t27\nchrX\t86294700\t86295000\t0.4156\t52\nchrX\t86350200\t86354700\t0\t73\nchrX\t86396400\t86396700\t0.3004\t46\nchrX\t86446500\t86449500\t0\t87\nchrX\t86557500\t86562000\t0\t74\nchrX\t86871300\t86871900\t0.3014\t31\nchrX\t86970600\t86972100\t0.0983\t62\nchrX\t87117300\t87118800\t0.0321\t45\nchrX\t87121500\t87121800\t0.1897\t30\nchrX\t87499800\t87500100\t0.1061\t33\nchrX\t87821400\t87827100\t0\t88\nchrX\t87828900\t87829200\t0.3472\t36\nchrX\t88033500\t88036500\t0.006\t73\nchrX\t88213500\t88213800\t0.2124\t69\nchrX\t89285100\t89285400\t0.2304\t21\nchrX\t89294700\t89295000\t0.2741\t40\nchrX\t89306100\t89306700\t0.1978\t28\nchrX\t89323200\t89323800\t0.0229\t25\nchrX\t89329800\t89330100\t0.413\t23\nchrX\t89357400\t89358000\t0.1686\t34\nchrX\t89390700\t89391000\t0.1996\t26\nchrX\t89396400\t89396700\t0.3963\t22\nchrX\t89400900\t89401200\t0.0572\t26\nchrX\t89408400\t89408700\t0.0466\t22\nchrX\t89415900\t89416500\t0.0365\t32\nchrX\t89423700\t89424000\t0.2199\t38\nchrX\t89428200\t89428500\t0.4348\t17\nchrX\t89447100\t89448300\t0.1191\t28\nchrX\t89458200\t89458500\t0.212\t24\nchrX\t89459700\t89460000\t0.2318\t25\nchrX\t89477400\t89477700\t0.115\t39\nchrX\t89479200\t89479500\t0.1996\t14\nchrX\t89505300\t89505600\t0.1145\t44\nchrX\t89535300\t89535900\t0.2952\t29\nchrX\t89538300\t89538600\t0.4538\t17\nchrX\t89542800\t89543100\t0.1479\t25\nchrX\t89546100\t89546400\t0.1784\t25\nchrX\t89549400\t89549700\t0.4973\t39\nchrX\t89559000\t89559300\t0.1295\t33\nchrX\t89572500\t89573100\t0.1899\t30\nchrX\t89582100\t89582400\t0.1837\t30\nchrX\t89619300\t89619600\t0.0325\t33\nchrX\t89630400\t89630700\t0.175\t22\nchrX\t89655900\t89656200\t0.1173\t36\nchrX\t89685000\t89685600\t0.0164\t25\nchrX\t89707200\t89708700\t0.0181\t31\nchrX\t89710800\t89711100\t0.0872\t32\nchrX\t89722800\t89723100\t0.3635\t27\nchrX\t89726100\t89726400\t0.3831\t22\nchrX\t89729700\t89730000\t0.1111\t19\nchrX\t89774400\t89774700\t0.1285\t27\nchrX\t89778000\t89778300\t0.3227\t29\nchrX\t89782500\t89782800\t0.2818\t28\nchrX\t89802000\t89802300\t0.1118\t31\nchrX\t89828700\t89829000\t0.0897\t22\nchrX\t89849400\t89850600\t0\t30\nchrX\t89856300\t89856600\t0.0712\t31\nchrX\t89859600\t89859900\t0.4273\t26\nchrX\t89872200\t89872500\t0.2514\t31\nchrX\t89881200\t89881500\t0.1886\t33\nchrX\t89910300\t89910600\t0.3649\t27\nchrX\t89916300\t89916600\t0.0907\t23\nchrX\t89928600\t89928900\t0.3103\t15\nchrX\t89936700\t89937000\t0.3884\t30\nchrX\t89976000\t89976300\t0.2273\t31\nchrX\t89987700\t89988000\t0.3175\t33\nchrX\t89991300\t89991600\t0.0923\t40\nchrX\t89994000\t89995500\t0.1555\t32\nchrX\t90001200\t90001500\t0.3256\t27\nchrX\t90096600\t90096900\t0.3415\t25\nchrX\t90123900\t90124200\t0.223\t26\nchrX\t90128700\t90129000\t0.1099\t16\nchrX\t90132900\t90133200\t0.1829\t11\nchrX\t90138000\t90138300\t0.0841\t33\nchrX\t90144300\t90144600\t0.15\t13\nchrX\t90145800\t90146400\t0.0119\t38\nchrX\t90150300\t90150600\t0.1308\t26\nchrX\t90179400\t90179700\t0.033\t23\nchrX\t90186600\t90186900\t0.0853\t27\nchrX\t90218700\t90219000\t0.1124\t24\nchrX\t90224400\t90224700\t0.1454\t25\nchrX\t90234900\t90235200\t0.0208\t45\nchrX\t90238500\t90238800\t0.3403\t25\nchrX\t90244800\t90245100\t0.3427\t35\nchrX\t90254700\t90255000\t0.2697\t32\nchrX\t90272700\t90273000\t0.0403\t26\nchrX\t90279600\t90279900\t0.2292\t30\nchrX\t90284400\t90284700\t0.1282\t25\nchrX\t90307800\t90308400\t0\t29\nchrX\t90316500\t90316800\t0.24\t25\nchrX\t90320700\t90321000\t0.1289\t11\nchrX\t90346800\t90347100\t0.1524\t26\nchrX\t90390900\t90391200\t0.288\t28\nchrX\t90397500\t90398100\t0.0493\t29\nchrX\t90441300\t90441600\t0.325\t22\nchrX\t90446100\t90446400\t0.1019\t30\nchrX\t90461100\t90461400\t0.2694\t28\nchrX\t90528300\t90528900\t0.1102\t21\nchrX\t90542400\t90542700\t0.2748\t24\nchrX\t90555300\t90555600\t0.2726\t26\nchrX\t90575400\t90575700\t0.0723\t33\nchrX\t90684600\t90685200\t0.2078\t19\nchrX\t90693600\t90693900\t0.2903\t32\nchrX\t90700500\t90700800\t0.4597\t21\nchrX\t90702600\t90702900\t0.4214\t29\nchrX\t90792300\t90792600\t0.2022\t25\nchrX\t90810000\t90810300\t0.0492\t31\nchrX\t90869400\t90869700\t0.0129\t35\nchrX\t90890700\t90891000\t0.248\t32\nchrX\t90908400\t90908700\t0.022\t30\nchrX\t90910500\t90910800\t0.0433\t17\nchrX\t90921300\t90921600\t0.2814\t29\nchrX\t90926400\t90926700\t0.2321\t25\nchrX\t90934800\t90935100\t0.0245\t23\nchrX\t90961200\t90961500\t0.132\t25\nchrX\t90963600\t90964800\t0.0976\t25\nchrX\t90966300\t90966900\t0\t36\nchrX\t90977700\t90978000\t0.2173\t24\nchrX\t91160700\t91161600\t0.1683\t28\nchrX\t91163400\t91163700\t0.2502\t33\nchrX\t91168500\t91168800\t0.1135\t29\nchrX\t91215900\t91216200\t0.1664\t35\nchrX\t91231200\t91231500\t0.4916\t23\nchrX\t91245900\t91246200\t0.3107\t22\nchrX\t91360200\t91360800\t0.0428\t53\nchrX\t91485900\t91486200\t0.3882\t35\nchrX\t91500000\t91500300\t0.3669\t26\nchrX\t91507500\t91510200\t0\t33\nchrX\t91520400\t91520700\t0.2939\t28\nchrX\t91530000\t91530300\t0.1548\t32\nchrX\t91557000\t91557300\t0.4105\t25\nchrX\t91566000\t91566600\t0.0998\t29\nchrX\t91575300\t91575600\t0.3347\t20\nchrX\t91580400\t91580700\t0.2603\t33\nchrX\t91612200\t91612500\t0.3872\t28\nchrX\t91632600\t91632900\t0.2109\t56\nchrX\t91641000\t91641300\t0.3023\t28\nchrX\t91650900\t91651200\t0.3896\t28\nchrX\t91652400\t91652700\t0.135\t34\nchrX\t91664700\t91665000\t0.0474\t28\nchrX\t91667100\t91667400\t0.0594\t28\nchrX\t91682100\t91682700\t0.2572\t44\nchrX\t91742700\t91743300\t0.3412\t39\nchrX\t91746000\t91746300\t0.0621\t34\nchrX\t91757400\t91758000\t0.2254\t42\nchrX\t91786500\t91786800\t0.2864\t18\nchrX\t91789200\t91790100\t0.2929\t36\nchrX\t91811700\t91812000\t0.2019\t34\nchrX\t91820100\t91820400\t0.1294\t46\nchrX\t91826400\t91826700\t0.1567\t33\nchrX\t91841700\t91842000\t0.2665\t27\nchrX\t91849800\t91850100\t0.474\t24\nchrX\t91852800\t91853100\t0.4334\t23\nchrX\t91856100\t91856400\t0.2966\t30\nchrX\t91862700\t91863000\t0.0673\t25\nchrX\t91874700\t91875000\t0.3863\t23\nchrX\t91877100\t91877400\t0.2138\t34\nchrX\t91896600\t91896900\t0.0098\t24\nchrX\t91928400\t91928700\t0.2324\t26\nchrX\t91972200\t91972500\t0.283\t37\nchrX\t91979400\t91980000\t0.0888\t30\nchrX\t91996500\t91997100\t0.0024\t30\nchrX\t92000700\t92001000\t0.2996\t32\nchrX\t92026800\t92028600\t0.2464\t30\nchrX\t92035500\t92036100\t0.021\t33\nchrX\t92052300\t92052900\t0.1669\t22\nchrX\t92055000\t92055300\t0.006\t30\nchrX\t92060100\t92060400\t0.4175\t22\nchrX\t92066100\t92066400\t0.2071\t22\nchrX\t92151900\t92152200\t0.1799\t21\nchrX\t92155200\t92155500\t0.0429\t31\nchrX\t92161800\t92162100\t0.0948\t28\nchrX\t92219700\t92220300\t0.021\t26\nchrX\t92286600\t92286900\t0.1368\t24\nchrX\t92296800\t92297100\t0.1761\t43\nchrX\t92349000\t92349300\t0.1759\t16\nchrX\t92362200\t92362800\t0.0137\t23\nchrX\t92371200\t92371500\t0.1899\t33\nchrX\t92379900\t92380200\t0.3076\t24\nchrX\t92388900\t92389200\t0.1943\t25\nchrX\t92405100\t92405400\t0.2628\t32\nchrX\t92413200\t92413500\t0.0954\t21\nchrX\t92425800\t92426100\t0.2831\t28\nchrX\t92448300\t92448600\t0.2404\t39\nchrX\t92455200\t92455800\t0.066\t25\nchrX\t92459100\t92459400\t0.0158\t29\nchrX\t92476800\t92477100\t0.1024\t11\nchrX\t92483400\t92483700\t0.0776\t23\nchrX\t92488800\t92489100\t0.0918\t27\nchrX\t92494800\t92495100\t0.3151\t27\nchrX\t92574000\t92574300\t0.2292\t37\nchrX\t92583300\t92583600\t0.2839\t29\nchrX\t92592000\t92592300\t0.1386\t35\nchrX\t92593800\t92594100\t0.2184\t20\nchrX\t92595600\t92595900\t0.0765\t26\nchrX\t92598600\t92598900\t0.2825\t25\nchrX\t92615700\t92616300\t0.0229\t23\nchrX\t92622000\t92622300\t0.2421\t25\nchrX\t92643000\t92643600\t0.1093\t34\nchrX\t92704800\t92705100\t0.1313\t16\nchrX\t92738700\t92739000\t0.3512\t22\nchrX\t92742600\t92742900\t0.1807\t25\nchrX\t92745000\t92746200\t0.1466\t29\nchrX\t92748300\t92748600\t0.2599\t32\nchrX\t92759100\t92759400\t0.187\t27\nchrX\t92773800\t92774100\t0.3691\t47\nchrX\t92795700\t92796000\t0.1888\t15\nchrX\t92805900\t92806500\t0\t33\nchrX\t92817900\t92818200\t0.1101\t43\nchrX\t92835600\t92835900\t0.1758\t31\nchrX\t92854500\t92854800\t0.1151\t30\nchrX\t92856000\t92856300\t0.3028\t25\nchrX\t92886600\t92888100\t0.2867\t26\nchrX\t92954400\t92954700\t0.0185\t30\nchrX\t92962800\t92963100\t0.2491\t20\nchrX\t92970300\t92970600\t0.3203\t24\nchrX\t93037800\t93038100\t0.2287\t19\nchrX\t93058200\t93058800\t0.1715\t29\nchrX\t93079800\t93081600\t0.2436\t32\nchrX\t93310800\t93311700\t0\t65\nchrX\t93632700\t93633000\t0.1575\t36\nchrX\t93943500\t93943800\t0.1857\t59\nchrX\t93945000\t93945300\t0.2686\t43\nchrX\t94863600\t94864800\t0.0741\t53\nchrX\t94866000\t94866300\t0.2263\t33\nchrX\t95140200\t95140500\t0.0901\t16\nchrX\t95600700\t95602200\t0.0223\t50\nchrX\t95810400\t95812500\t0\t70\nchrX\t95852100\t95852400\t0.2969\t38\nchrX\t96057900\t96063600\t0\t60\nchrX\t96078600\t96078900\t0.2811\t57\nchrX\t96523500\t96523800\t0.3938\t23\nchrX\t96897900\t96898200\t0.0733\t54\nchrX\t97512600\t97514400\t0\t77\nchrX\t97578600\t97578900\t0\t59\nchrX\t97580100\t97582500\t0\t59\nchrX\t98305500\t98305800\t0.1132\t74\nchrX\t98424600\t98426100\t0.053\t72\nchrX\t98427900\t98428200\t0.1555\t52\nchrX\t98669400\t98669700\t0.2446\t46\nchrX\t98687700\t98692800\t0\t72\nchrX\t98831400\t98831700\t0.1437\t12\nchrX\t99178200\t99178500\t0.328\t28\nchrX\t99403200\t99403500\t0.29\t54\nchrX\t99485700\t99487200\t0.0946\t49\nchrX\t99864300\t99864600\t0.3408\t49\nchrX\t100139400\t100140000\t0.1989\t53\nchrX\t100166100\t100166400\t0.0949\t58\nchrX\t100167900\t100169100\t0.0592\t47\nchrX\t100257300\t100260000\t0.0188\t59\nchrX\t100501200\t100502100\t0\t50\nchrX\t100550700\t100551600\t0.0745\t73\nchrX\t100554900\t100557000\t0.0745\t73\nchrX\t100869600\t100870200\t0.1476\t75\nchrX\t100971600\t100973400\t0.0231\t57\nchrX\t101472000\t101474400\t0.0199\t74\nchrX\t101597700\t101601900\t0\t41\nchrX\t101611800\t101616000\t0\t42\nchrX\t101712000\t101712300\t0.3733\t26\nchrX\t101995800\t101997000\t0.1886\t48\nchrX\t102048600\t102049200\t0.0752\t44\nchrX\t102050400\t102051000\t0.0847\t48\nchrX\t102189000\t102189300\t0.4287\t33\nchrX\t102198000\t102281400\t0\t46\nchrX\t102282600\t102338100\t0\t46\nchrX\t102349200\t102489300\t0\t47\nchrX\t102617100\t102617400\t0.2049\t61\nchrX\t102671100\t102671700\t0.2704\t66\nchrX\t102777600\t102777900\t0.3408\t49\nchrX\t102780900\t102781200\t0.4548\t30\nchrX\t102811200\t102812100\t0\t55\nchrX\t103235400\t103235700\t0.3269\t39\nchrX\t103287000\t103287300\t0.3229\t51\nchrX\t103891800\t103897200\t0.0581\t55\nchrX\t103911600\t103911900\t0.1432\t24\nchrX\t103956000\t103987200\t0\t40\nchrX\t104027400\t104030700\t0.0013\t68\nchrX\t104031900\t104032500\t0.0013\t68\nchrX\t104051100\t104082600\t0\t46\nchrX\t104417100\t104417400\t0.1414\t52\nchrX\t104531100\t104531700\t0.1423\t35\nchrX\t104549700\t104550000\t0.0567\t37\nchrX\t104914500\t104914800\t0.4301\t60\nchrX\t104946600\t104946900\t0.2168\t56\nchrX\t105040800\t105041100\t0.129\t59\nchrX\t105391500\t105392100\t0.2782\t37\nchrX\t105799200\t105799500\t0.0715\t51\nchrX\t105800700\t105801000\t0.1681\t42\nchrX\t105920700\t105921000\t0.3223\t47\nchrX\t105992400\t105992700\t0.0892\t48\nchrX\t106079700\t106080600\t0.1458\t61\nchrX\t106232700\t106233000\t0.1234\t17\nchrX\t106266600\t106278000\t0\t47\nchrX\t106288200\t106299600\t0\t48\nchrX\t106308600\t106308900\t0.161\t18\nchrX\t106382700\t106383000\t0.1567\t51\nchrX\t106469400\t106475400\t0\t78\nchrX\t106602900\t106603200\t0.0829\t44\nchrX\t106756800\t106757700\t0.1045\t63\nchrX\t106852200\t106852500\t0.294\t45\nchrX\t107009700\t107010000\t0.2884\t40\nchrX\t107035500\t107036400\t0\t54\nchrX\t107156700\t107157000\t0.0641\t69\nchrX\t107158200\t107161500\t0.0641\t69\nchrX\t107326800\t107327100\t0.1515\t29\nchrX\t107365200\t107367000\t0.0089\t65\nchrX\t107368500\t107369100\t0.0565\t76\nchrX\t107612400\t107613900\t0\t67\nchrX\t108281100\t108281400\t0.0837\t92\nchrX\t108530400\t108530700\t0.3934\t33\nchrX\t108773700\t108774000\t0.0247\t44\nchrX\t108858300\t108858600\t0.3053\t51\nchrX\t108982500\t108982800\t0.358\t26\nchrX\t109035600\t109035900\t0.1749\t57\nchrX\t109056000\t109056300\t0.009\t57\nchrX\t109057500\t109058400\t0.009\t57\nchrX\t109115700\t109116000\t0.0797\t40\nchrX\t109117500\t109117800\t0.2469\t51\nchrX\t109648800\t109649100\t0.21\t53\nchrX\t110222100\t110222400\t0.1329\t49\nchrX\t110609400\t110609700\t0.2315\t41\nchrX\t110817000\t110817600\t0.086\t60\nchrX\t110819100\t110819400\t0.086\t60\nchrX\t110820600\t110820900\t0.3516\t65\nchrX\t111315300\t111315900\t0.0021\t63\nchrX\t111590100\t111593100\t0.0061\t76\nchrX\t111638400\t111640800\t0.0204\t84\nchrX\t111721200\t111721500\t0.1134\t10\nchrX\t111936600\t111936900\t0.2316\t39\nchrX\t112329900\t112330200\t0.1438\t69\nchrX\t112331700\t112332000\t0.1438\t69\nchrX\t112349400\t112350000\t0.2626\t63\nchrX\t112432500\t112434000\t0.0975\t58\nchrX\t112506300\t112506600\t0.2662\t68\nchrX\t112719600\t112719900\t0.2053\t55\nchrX\t113325600\t113325900\t0.1692\t51\nchrX\t113337900\t113343000\t0.0231\t80\nchrX\t113451000\t113451300\t0.1966\t31\nchrX\t113633700\t113634300\t0.2018\t42\nchrX\t113688600\t113689800\t0.083\t38\nchrX\t113740500\t113740800\t0.1961\t39\nchrX\t114470700\t114471000\t0.3435\t11\nchrX\t114492900\t114493200\t0.1291\t81\nchrX\t114705600\t114706500\t0.0294\t44\nchrX\t114720900\t114721500\t0.1508\t45\nchrX\t114742800\t114743100\t0.0423\t32\nchrX\t114831000\t114833100\t0.0355\t43\nchrX\t114856200\t114856500\t0.1444\t39\nchrX\t115080900\t115081200\t0.2207\t40\nchrX\t115119300\t115120800\t0.0811\t108\nchrX\t115346400\t115348200\t0.1968\t44\nchrX\t115474500\t115474800\t0.2927\t21\nchrX\t115668900\t115669500\t0.2351\t36\nchrX\t115705800\t115706100\t0.2544\t14\nchrX\t115724400\t115725000\t0\t16\nchrX\t115726200\t115735500\t0\t255\nchrX\t115736700\t115737000\t0\t30\nchrX\t115840200\t115840500\t0.2618\t16\nchrX\t115842300\t115889400\t0\t297\nchrX\t116164200\t116164500\t0.2133\t29\nchrX\t116187300\t116187600\t0.2281\t41\nchrX\t116312100\t116313300\t0.2296\t46\nchrX\t116516100\t116516400\t0.3763\t36\nchrX\t116557200\t116557500\t0.0203\t18\nchrX\t116944200\t116944500\t0.2831\t49\nchrX\t116966400\t116967000\t0.1061\t74\nchrX\t117425400\t117425700\t0.2166\t41\nchrX\t117728100\t117728400\t0.1031\t57\nchrX\t117729600\t117730500\t0.1031\t57\nchrX\t117874200\t117874500\t0.1209\t51\nchrX\t117875700\t117878400\t0.1209\t51\nchrX\t118009200\t118010700\t0.0427\t55\nchrX\t118034400\t118035000\t0.1528\t53\nchrX\t118036800\t118037400\t0.1528\t53\nchrX\t118071600\t118071900\t0.4078\t37\nchrX\t118401000\t118401600\t0.0342\t50\nchrX\t119038500\t119038800\t0.0341\t15\nchrX\t119165400\t119166000\t0.2541\t48\nchrX\t119435700\t119441400\t0\t77\nchrX\t119805600\t119806200\t0.0526\t57\nchrX\t119808300\t119808600\t0.2328\t35\nchrX\t120038400\t120067500\t0\t46\nchrX\t120069000\t120086400\t0\t45\nchrX\t120150000\t120166500\t0\t48\nchrX\t120168900\t120169500\t0\t48\nchrX\t120171000\t120198000\t0\t48\nchrX\t120346200\t120346500\t0.1433\t34\nchrX\t120389100\t120389400\t0.0657\t39\nchrX\t120873600\t120873900\t0.3767\t25\nchrX\t120875700\t120879300\t0\t40\nchrX\t120930000\t120986700\t0\t55\nchrX\t121017900\t121018200\t0.3683\t53\nchrX\t121263900\t121267800\t0.0141\t72\nchrX\t121440900\t121441200\t0.3074\t54\nchrX\t121532100\t121532400\t0.1512\t70\nchrX\t121691700\t121692600\t0.0212\t70\nchrX\t121695900\t121698000\t0\t86\nchrX\t121728000\t121728900\t0.0188\t80\nchrX\t121878900\t121879200\t0.2693\t41\nchrX\t122181000\t122181300\t0.3264\t18\nchrX\t122331900\t122332200\t0.4226\t26\nchrX\t123051600\t123052200\t0.1991\t54\nchrX\t123056700\t123057000\t0.2514\t37\nchrX\t123058500\t123058800\t0.2236\t23\nchrX\t124179300\t124179600\t0.3145\t61\nchrX\t124494900\t124495200\t0.2773\t65\nchrX\t124753200\t124753500\t0.3534\t41\nchrX\t125043300\t125044200\t0.0154\t56\nchrX\t125351100\t125351400\t0.4233\t51\nchrX\t125511600\t125511900\t0.3029\t49\nchrX\t125514300\t125514600\t0.1741\t78\nchrX\t125610000\t125613600\t0.0911\t51\nchrX\t125779500\t125780400\t0.0324\t84\nchrX\t125842800\t125843400\t0.0771\t64\nchrX\t126051900\t126052200\t0.2624\t29\nchrX\t126108300\t126108900\t0.1952\t55\nchrX\t126188100\t126188400\t0.2448\t41\nchrX\t126231900\t126232200\t0.2784\t74\nchrX\t126233700\t126234000\t0.2784\t74\nchrX\t126288300\t126288600\t0.2763\t58\nchrX\t126462300\t126462600\t0.451\t58\nchrX\t126914400\t126915000\t0.0533\t47\nchrX\t127117500\t127122600\t0.0018\t79\nchrX\t127254900\t127255200\t0.2951\t39\nchrX\t127362600\t127368000\t0.0097\t59\nchrX\t127483800\t127484400\t0.1128\t56\nchrX\t127593900\t127594200\t0.2355\t30\nchrX\t127800300\t127800600\t0.3524\t44\nchrX\t128667600\t128667900\t0.0257\t23\nchrX\t128785800\t128788200\t0.0935\t67\nchrX\t128944200\t128944800\t0.116\t64\nchrX\t129045900\t129046200\t0.1099\t64\nchrX\t129048300\t129049200\t0.1099\t64\nchrX\t129085200\t129085500\t0.294\t46\nchrX\t129166800\t129168000\t0.1938\t56\nchrX\t129341700\t129342600\t0.1946\t49\nchrX\t129406500\t129407400\t0.3143\t44\nchrX\t129482100\t129482400\t0.2713\t56\nchrX\t129536700\t129537000\t0.4455\t38\nchrX\t129851700\t129852000\t0.112\t44\nchrX\t130496100\t130496400\t0.1704\t44\nchrX\t130517700\t130523400\t0\t78\nchrX\t130569900\t130570200\t0.1007\t56\nchrX\t130674900\t130675200\t0.1764\t54\nchrX\t130786500\t130787100\t0.071\t51\nchrX\t130821300\t130821600\t0.1835\t40\nchrX\t130949100\t130949700\t0.0133\t60\nchrX\t130959600\t130965000\t0.0075\t80\nchrX\t131003100\t131006400\t0\t64\nchrX\t131124900\t131126100\t0.0017\t84\nchrX\t131155500\t131156100\t0.186\t47\nchrX\t131245800\t131248200\t0.1353\t67\nchrX\t131250300\t131250600\t0.1353\t67\nchrX\t131327700\t131328000\t0.3234\t39\nchrX\t131379000\t131380200\t0.1231\t66\nchrX\t131487600\t131488200\t0.2065\t74\nchrX\t131504100\t131505000\t0.1408\t64\nchrX\t131579700\t131580300\t0.2318\t54\nchrX\t131584200\t131584500\t0.1896\t48\nchrX\t131664600\t131664900\t0.222\t54\nchrX\t131667000\t131667300\t0.2275\t58\nchrX\t132135600\t132138000\t0.0119\t66\nchrX\t132156300\t132159300\t0.2178\t69\nchrX\t132197100\t132197400\t0.4145\t41\nchrX\t132866400\t132867000\t0.0524\t57\nchrX\t134788200\t134788500\t0.1084\t10\nchrX\t135027600\t135027900\t0.2377\t41\nchrX\t135116100\t135118500\t0\t48\nchrX\t135120600\t135157800\t0\t48\nchrX\t135174600\t135175200\t0.1226\t29\nchrX\t135214500\t135252600\t0\t44\nchrX\t135253800\t135256200\t0\t43\nchrX\t135615900\t135619200\t0\t42\nchrX\t135621300\t135621600\t0.0971\t28\nchrX\t135667200\t135667500\t0.2644\t24\nchrX\t135669900\t135673200\t0\t38\nchrX\t135686100\t135686400\t0.2217\t46\nchrX\t135720600\t135734700\t0\t91\nchrX\t135748800\t135813000\t0\t92\nchrX\t135814500\t135847500\t0\t92\nchrX\t135849000\t135864900\t0\t72\nchrX\t135866100\t135881400\t0\t58\nchrX\t135883800\t135887700\t0\t83\nchrX\t135945600\t135946200\t0.053\t49\nchrX\t136075800\t136076100\t0.114\t22\nchrX\t136332300\t136332600\t0.2431\t64\nchrX\t136440300\t136445700\t0.0063\t106\nchrX\t137674200\t137674500\t0.1362\t59\nchrX\t138062100\t138064200\t0\t67\nchrX\t138301200\t138301800\t0.2246\t55\nchrX\t138341700\t138342000\t0.1578\t47\nchrX\t138780300\t138780600\t0.1072\t61\nchrX\t138782700\t138783600\t0.1328\t61\nchrX\t139068000\t139069500\t0.0417\t62\nchrX\t139503300\t139503600\t0.2609\t24\nchrX\t139852200\t139852500\t0.2235\t50\nchrX\t140013000\t140013900\t0\t14\nchrX\t140018100\t140018400\t0.0957\t11\nchrX\t140074800\t140075100\t0\t33\nchrX\t140137200\t140138400\t0.2234\t39\nchrX\t140219400\t140220600\t0.0169\t26\nchrX\t140412000\t140412300\t0.2196\t15\nchrX\t140419200\t140420100\t0.0513\t97\nchrX\t140995500\t140996100\t0.139\t35\nchrX\t141007200\t141028200\t0\t89\nchrX\t141030000\t141033000\t0\t35\nchrX\t141034200\t141042900\t0\t40\nchrX\t141044700\t141045000\t0.0477\t32\nchrX\t141048000\t141048600\t0.3004\t31\nchrX\t141052500\t141064800\t0\t48\nchrX\t141066000\t141092700\t0\t48\nchrX\t141094500\t141111900\t0\t48\nchrX\t141117300\t141117900\t0.0591\t60\nchrX\t141231900\t141232500\t0.0102\t42\nchrX\t141239100\t141239400\t0.4153\t40\nchrX\t141241800\t141243000\t0.1474\t51\nchrX\t141244800\t141245100\t0.3106\t35\nchrX\t141248700\t141249600\t0.0009\t26\nchrX\t141285900\t141286200\t0.3486\t37\nchrX\t141357000\t141357600\t0.1946\t38\nchrX\t141421200\t141427200\t0\t82\nchrX\t141475800\t141492900\t0\t46\nchrX\t141494700\t141495900\t0\t46\nchrX\t141497100\t141507900\t0\t46\nchrX\t141509100\t141511200\t0\t46\nchrX\t141512400\t141514200\t0\t46\nchrX\t141515700\t141521100\t0\t46\nchrX\t141523500\t141535500\t0\t39\nchrX\t141537600\t141539400\t0\t28\nchrX\t141542100\t141542700\t0\t40\nchrX\t141544500\t141557400\t0\t40\nchrX\t141559500\t141566700\t0\t77\nchrX\t141568200\t141585300\t0\t77\nchrX\t141586800\t141594900\t0\t59\nchrX\t141598500\t141600900\t0.14\t39\nchrX\t141688200\t141689700\t0.0468\t36\nchrX\t141697800\t141698400\t0.0421\t50\nchrX\t141699900\t141700200\t0.0775\t31\nchrX\t141790500\t141790800\t0.1709\t20\nchrX\t141824700\t141825300\t0.1034\t67\nchrX\t141912000\t141912900\t0\t30\nchrX\t142171500\t142171800\t0.3489\t41\nchrX\t142190100\t142190700\t0.0046\t33\nchrX\t142192200\t142192500\t0.12\t15\nchrX\t142339200\t142344000\t0.0031\t88\nchrX\t142377600\t142377900\t0.1384\t51\nchrX\t142385700\t142386000\t0.2534\t50\nchrX\t142387200\t142387500\t0.3244\t48\nchrX\t142478400\t142483500\t0.0225\t104\nchrX\t142908900\t142910100\t0.2412\t74\nchrX\t143154300\t143154900\t0.1576\t48\nchrX\t143355000\t143355300\t0.164\t77\nchrX\t143990700\t143991300\t0.2347\t23\nchrX\t144078000\t144079800\t0\t46\nchrX\t144081000\t144081300\t0\t46\nchrX\t144082800\t144085200\t0\t51\nchrX\t144088500\t144097800\t0\t56\nchrX\t144099900\t144100800\t0\t56\nchrX\t144102300\t144103500\t0.0016\t45\nchrX\t144105900\t144106200\t0\t56\nchrX\t144107400\t144111300\t0\t56\nchrX\t144112500\t144117000\t0\t42\nchrX\t144118200\t144118500\t0.2348\t34\nchrX\t144120000\t144120300\t0.2423\t37\nchrX\t144121500\t144123000\t0\t44\nchrX\t144124200\t144124800\t0.0103\t33\nchrX\t144126000\t144126600\t0\t55\nchrX\t144128700\t144150900\t0\t55\nchrX\t144152700\t144153600\t0\t55\nchrX\t144156900\t144167400\t0\t50\nchrX\t144168900\t144173100\t0\t50\nchrX\t144174900\t144176700\t0\t56\nchrX\t144177900\t144179700\t0\t56\nchrX\t144182100\t144182700\t0\t56\nchrX\t144183900\t144184500\t0\t56\nchrX\t144186000\t144191700\t0\t48\nchrX\t144193200\t144193800\t0\t48\nchrX\t144195000\t144201000\t0\t48\nchrX\t144202500\t144206700\t0\t48\nchrX\t144208500\t144212400\t0\t43\nchrX\t144324000\t144326700\t0\t55\nchrX\t144764700\t144765000\t0.4372\t53\nchrX\t144966900\t144967500\t0.154\t50\nchrX\t145353900\t145354200\t0.3501\t36\nchrX\t145974900\t145975800\t0\t75\nchrX\t146111400\t146112600\t0.031\t63\nchrX\t146470800\t146471100\t0.2503\t22\nchrX\t146619300\t146619600\t0.0375\t59\nchrX\t146802000\t146822400\t0\t44\nchrX\t146861700\t146862300\t0.0412\t47\nchrX\t146903100\t146904600\t0.1175\t65\nchrX\t147145500\t147145800\t0.1988\t44\nchrX\t147221100\t147221400\t0.2697\t35\nchrX\t147279900\t147280200\t0\t24\nchrX\t147281700\t147282000\t0\t71\nchrX\t147283500\t147286800\t0\t71\nchrX\t147408900\t147412200\t0.0332\t65\nchrX\t147654000\t147659700\t0\t82\nchrX\t147992400\t147992700\t0.4075\t16\nchrX\t148123500\t148126800\t0.0723\t65\nchrX\t148170000\t148171800\t0.0477\t45\nchrX\t148300200\t148300500\t0.1053\t26\nchrX\t148351800\t148352100\t0.2015\t26\nchrX\t148731600\t148732200\t0.1489\t54\nchrX\t148971900\t148973100\t0\t53\nchrX\t149178300\t149183100\t0\t86\nchrX\t149215200\t149215800\t0\t66\nchrX\t149336100\t149337600\t0.005\t61\nchrX\t149338800\t149339400\t0.0481\t33\nchrX\t149438400\t149439600\t0.0099\t370\nchrX\t149441100\t149441400\t0.0099\t370\nchrX\t149533200\t149533500\t0.4414\t31\nchrX\t149538600\t149538900\t0.07\t27\nchrX\t149542800\t149544300\t0.0458\t40\nchrX\t149548500\t149562000\t0\t48\nchrX\t149573400\t149598600\t0\t45\nchrX\t149599800\t149602200\t0\t45\nchrX\t149654700\t149681100\t0\t43\nchrX\t149722200\t149748600\t0\t43\nchrX\t149767200\t149796000\t0\t41\nchrX\t149917500\t149931000\t0\t38\nchrX\t149935200\t149936700\t0.0451\t37\nchrX\t149940900\t149941500\t0.102\t35\nchrX\t149946600\t149946900\t0.1209\t30\nchrX\t149973900\t149974200\t0.2421\t33\nchrX\t150000900\t150001200\t0.0157\t131\nchrX\t150022200\t150022500\t0.1802\t46\nchrX\t150132000\t150134100\t0.0194\t73\nchrX\t150170100\t150171300\t0.1248\t63\nchrX\t150215700\t150216000\t0.0386\t28\nchrX\t150340800\t150341100\t0.0413\t35\nchrX\t150418500\t150420300\t0.0091\t64\nchrX\t151331100\t151336200\t0\t75\nchrX\t151703700\t151704000\t0.3836\t46\nchrX\t151914300\t151917600\t0\t19\nchrX\t152239500\t152239800\t0.2308\t59\nchrX\t152349600\t152349900\t0.1667\t55\nchrX\t152359800\t152360400\t0.0649\t76\nchrX\t152416200\t152416500\t0.146\t49\nchrX\t152547300\t152547600\t0.2318\t63\nchrX\t152549700\t152550300\t0.121\t91\nchrX\t152678700\t152696700\t0\t43\nchrX\t152698500\t152699700\t0\t36\nchrX\t152702100\t152725200\t0\t45\nchrX\t152743200\t152766300\t0\t43\nchrX\t152767500\t152770200\t0\t45\nchrX\t152771700\t152789100\t0\t45\nchrX\t152983800\t152986800\t0\t41\nchrX\t153066600\t153074100\t0\t43\nchrX\t153075900\t153083400\t0\t47\nchrX\t153106200\t153148500\t0\t47\nchrX\t153251700\t153293700\t0\t48\nchrX\t153313500\t153316200\t0\t46\nchrX\t154144500\t154148100\t0\t53\nchrX\t154149600\t154188000\t0\t84\nchrX\t154189200\t154238100\t0\t84\nchrX\t154241100\t154294200\t0\t57\nchrX\t154338300\t154347000\t0\t43\nchrX\t154385100\t154394100\t0\t38\nchrX\t154556400\t154591200\t0\t44\nchrX\t154614000\t154648200\t0\t44\nchrX\t154653600\t154654200\t0\t24\nchrX\t154881000\t154885200\t0\t76\nchrX\t154886400\t154888500\t0\t76\nchrX\t154941900\t154942200\t0.2303\t51\nchrX\t155006400\t155007000\t0.0018\t43\nchrX\t155148000\t155148600\t0.0122\t35\nchrX\t155160900\t155161200\t0.3361\t50\nchrX\t155300700\t155304900\t0.0216\t78\nchrX\t155336700\t155369700\t0\t46\nchrX\t155372100\t155386500\t0\t42\nchrX\t155454000\t155468400\t0\t41\nchrX\t155471400\t155504400\t0\t49\nchrX\t155516100\t155522100\t0\t77\nchrX\t155568900\t155569200\t0\t26\nchrX\t155571300\t155571900\t0\t26\nchrX\t155672700\t155673000\t0.3597\t35\nchrX\t155693700\t155694000\t0.3998\t66\nchrX\t155700600\t155703600\t0\t76\nchrX\t156010200\t156015300\t0\t68\nchrX\t156017100\t156023100\t0\t160\nchrX\t156024600\t156028800\t0\t160\nchrX\t156030000\t156030900\t0.1447\t1368\nchrY\t2807700\t2809500\t0.0171\t34\nchrY\t3056400\t3056700\t0.3152\t36\nchrY\t3063900\t3064500\t0.1699\t24\nchrY\t3071400\t3072000\t0.1232\t23\nchrY\t3079200\t3079500\t0.2092\t27\nchrY\t3103200\t3103500\t0.2882\t29\nchrY\t3115800\t3116100\t0.2469\t24\nchrY\t3161100\t3161700\t0.3895\t39\nchrY\t3191400\t3191700\t0.0784\t25\nchrY\t3198600\t3198900\t0.2399\t24\nchrY\t3201900\t3202500\t0.288\t29\nchrY\t3215100\t3215400\t0.1449\t34\nchrY\t3228600\t3228900\t0.2332\t26\nchrY\t3238200\t3238500\t0.1977\t41\nchrY\t3275400\t3275700\t0.105\t24\nchrY\t3317400\t3317700\t0.4146\t28\nchrY\t3346500\t3346800\t0.0623\t24\nchrY\t3354300\t3354600\t0.3523\t26\nchrY\t3368400\t3369600\t0.0117\t27\nchrY\t3371700\t3372300\t0.2939\t28\nchrY\t3380100\t3380400\t0.2016\t29\nchrY\t3384000\t3384300\t0.1825\t17\nchrY\t3387600\t3387900\t0.2632\t32\nchrY\t3415800\t3416100\t0.1608\t38\nchrY\t3422700\t3423600\t0.1717\t25\nchrY\t3430500\t3430800\t0.3068\t36\nchrY\t3444300\t3449400\t0\t85\nchrY\t3456600\t3456900\t0.2976\t30\nchrY\t3483300\t3483600\t0.3727\t26\nchrY\t3504000\t3505200\t0.0044\t31\nchrY\t3510900\t3511500\t0.1575\t35\nchrY\t3536700\t3537000\t0.2137\t33\nchrY\t3540900\t3541200\t0.3229\t30\nchrY\t3550200\t3550500\t0.1672\t15\nchrY\t3556200\t3556500\t0.2555\t31\nchrY\t3571800\t3572100\t0.2969\t26\nchrY\t3573600\t3573900\t0.3089\t28\nchrY\t3581400\t3581700\t0.2565\t22\nchrY\t3648900\t3649200\t0.2097\t34\nchrY\t3650700\t3651900\t0.2304\t31\nchrY\t3658800\t3659100\t0.37\t36\nchrY\t3693900\t3694200\t0.4698\t36\nchrY\t3698700\t3699300\t0.2759\t30\nchrY\t3708000\t3708300\t0.0621\t34\nchrY\t3715800\t3716400\t0.2054\t34\nchrY\t3720300\t3720600\t0.1094\t33\nchrY\t3755400\t3755700\t0.3245\t30\nchrY\t3787800\t3788100\t0.1149\t28\nchrY\t3793500\t3793800\t0.0811\t30\nchrY\t3804300\t3804600\t0.1398\t32\nchrY\t3805800\t3806100\t0.3153\t25\nchrY\t3824100\t3824400\t0.275\t24\nchrY\t3861000\t3861600\t0.3661\t24\nchrY\t3884400\t3885000\t0.0009\t23\nchrY\t3893400\t3893700\t0.3316\t32\nchrY\t3923400\t3924000\t0.3901\t32\nchrY\t3936900\t3937200\t0.2362\t17\nchrY\t3974700\t3975000\t0\t32\nchrY\t3995400\t3995700\t0.3253\t25\nchrY\t4018200\t4018500\t0.2037\t30\nchrY\t4023000\t4023300\t0.0474\t25\nchrY\t4038600\t4038900\t0.3535\t22\nchrY\t4106100\t4106700\t0.1154\t32\nchrY\t4120200\t4120500\t0.2809\t20\nchrY\t4133100\t4133400\t0.2358\t29\nchrY\t4153200\t4153500\t0.0848\t42\nchrY\t4221600\t4221900\t0.2875\t48\nchrY\t4266900\t4267200\t0.0203\t26\nchrY\t4275600\t4275900\t0.1471\t35\nchrY\t4291200\t4291500\t0.4497\t20\nchrY\t4374300\t4374600\t0.2584\t26\nchrY\t4386000\t4386300\t0.2681\t26\nchrY\t4392000\t4392300\t0.2615\t22\nchrY\t4451100\t4452300\t0.1134\t33\nchrY\t4458600\t4458900\t0.4529\t21\nchrY\t4464900\t4465200\t0.3698\t27\nchrY\t4482600\t4482900\t0.0659\t25\nchrY\t4491300\t4491600\t0.3741\t24\nchrY\t4501800\t4502400\t0.2402\t22\nchrY\t4539900\t4540200\t0.0612\t29\nchrY\t4541700\t4542300\t0.157\t41\nchrY\t4595700\t4596000\t0.4237\t29\nchrY\t4624500\t4624800\t0.1667\t32\nchrY\t4627200\t4627500\t0.4463\t24\nchrY\t4632300\t4632600\t0.2087\t23\nchrY\t4707600\t4707900\t0.4306\t31\nchrY\t4709100\t4709400\t0.2301\t28\nchrY\t4741200\t4741500\t0.2666\t37\nchrY\t4748700\t4749300\t0.189\t30\nchrY\t4761600\t4761900\t0.4191\t18\nchrY\t4771500\t4771800\t0.2249\t27\nchrY\t4798200\t4798500\t0.171\t30\nchrY\t4807200\t4807800\t0.0639\t33\nchrY\t4821600\t4821900\t0.325\t27\nchrY\t4851900\t4852200\t0.1844\t25\nchrY\t4889700\t4890000\t0.1458\t24\nchrY\t4891200\t4891500\t0.137\t37\nchrY\t4904100\t4905000\t0.1886\t27\nchrY\t4906500\t4906800\t0.1569\t21\nchrY\t4921500\t4921800\t0.213\t29\nchrY\t4949100\t4954800\t0\t74\nchrY\t4961400\t4961700\t0.1948\t29\nchrY\t4963200\t4963800\t0.2397\t29\nchrY\t4966500\t4966800\t0.0809\t36\nchrY\t4975500\t4975800\t0.2322\t50\nchrY\t4978800\t4979100\t0.3625\t42\nchrY\t4987200\t4987500\t0.3502\t21\nchrY\t5000400\t5000700\t0.2643\t26\nchrY\t5010300\t5010600\t0.2261\t31\nchrY\t5033100\t5033400\t0.2977\t27\nchrY\t5036100\t5036400\t0.3899\t31\nchrY\t5042700\t5043000\t0.2367\t45\nchrY\t5047800\t5048400\t0.1593\t32\nchrY\t5063100\t5063400\t0.2215\t30\nchrY\t5071200\t5071500\t0.3107\t28\nchrY\t5074200\t5074500\t0.3686\t21\nchrY\t5077500\t5077800\t0.2886\t28\nchrY\t5084100\t5084400\t0.1962\t19\nchrY\t5096100\t5096400\t0.1737\t25\nchrY\t5098500\t5098800\t0.2114\t32\nchrY\t5118600\t5118900\t0.102\t27\nchrY\t5141100\t5142000\t0.2212\t46\nchrY\t5170800\t5171100\t0.4072\t26\nchrY\t5175600\t5176500\t0.0085\t51\nchrY\t5196600\t5197200\t0.1548\t42\nchrY\t5204100\t5205000\t0.0646\t29\nchrY\t5210400\t5210700\t0.2188\t34\nchrY\t5218500\t5218800\t0.2735\t29\nchrY\t5221200\t5221500\t0.0199\t28\nchrY\t5225400\t5225700\t0.4036\t29\nchrY\t5250000\t5253300\t0.1358\t33\nchrY\t5260200\t5260800\t0\t30\nchrY\t5277000\t5277300\t0.0227\t22\nchrY\t5279400\t5280000\t0.0082\t23\nchrY\t5290800\t5291100\t0.3218\t18\nchrY\t5376900\t5377200\t0.0534\t33\nchrY\t5379900\t5380500\t0.167\t32\nchrY\t5393100\t5393700\t0.257\t36\nchrY\t5400900\t5401200\t0.0938\t23\nchrY\t5411100\t5411400\t0.1499\t27\nchrY\t5438700\t5439000\t0.2711\t26\nchrY\t5473800\t5474400\t0.105\t28\nchrY\t5485800\t5486100\t0.2428\t34\nchrY\t5510100\t5510700\t0.3076\t26\nchrY\t5518500\t5518800\t0.3663\t26\nchrY\t5526300\t5526600\t0.2625\t33\nchrY\t5568900\t5569200\t0.0023\t26\nchrY\t5571600\t5573100\t0.2278\t33\nchrY\t5596500\t5596800\t0.0957\t34\nchrY\t5606400\t5612100\t0.0078\t99\nchrY\t5613900\t5614200\t0.2624\t37\nchrY\t5673300\t5673600\t0.314\t23\nchrY\t5702400\t5702700\t0.1791\t32\nchrY\t5712900\t5713200\t0.1511\t18\nchrY\t5714700\t5715000\t0.1151\t27\nchrY\t5734800\t5735400\t0.0142\t30\nchrY\t5759700\t5760300\t0.0212\t32\nchrY\t5771100\t5771400\t0.3272\t29\nchrY\t5821500\t5821800\t0.2435\t15\nchrY\t5855400\t5855700\t0.2365\t22\nchrY\t5859300\t5859600\t0.1865\t21\nchrY\t5861700\t5862000\t0.1383\t32\nchrY\t5865000\t5865300\t0.1615\t26\nchrY\t5867700\t5868000\t0.1787\t42\nchrY\t5875800\t5876100\t0.077\t29\nchrY\t5912400\t5912700\t0.3423\t27\nchrY\t5922600\t5923200\t0.0457\t28\nchrY\t5934600\t5934900\t0.2321\t26\nchrY\t5952300\t5952600\t0.1699\t24\nchrY\t5971500\t5971800\t0.196\t20\nchrY\t6004800\t6005100\t0.2408\t23\nchrY\t6011700\t6012000\t0.1019\t20\nchrY\t6070200\t6070800\t0.1071\t31\nchrY\t6086700\t6087000\t0.1826\t21\nchrY\t6174300\t6174900\t0.046\t36\nchrY\t6191700\t6192300\t0.2732\t27\nchrY\t6237600\t6257400\t0\t173\nchrY\t6258600\t6261600\t0\t173\nchrY\t6263100\t6266400\t0.0001\t118\nchrY\t6267600\t6267900\t0.141\t34\nchrY\t6271200\t6271500\t0.19\t34\nchrY\t6273900\t6276300\t0.0503\t35\nchrY\t6280500\t6285300\t0\t45\nchrY\t6286500\t6289200\t0\t45\nchrY\t6291300\t6321600\t0\t45\nchrY\t6323100\t6336900\t0\t41\nchrY\t6338400\t6477000\t0\t50\nchrY\t6492900\t6493800\t0\t35\nchrY\t6501900\t6502200\t0.2343\t36\nchrY\t6508500\t6508800\t0.3733\t34\nchrY\t6511200\t6513600\t0\t28\nchrY\t6519300\t6520800\t0.0034\t29\nchrY\t6523200\t6525000\t0.0121\t26\nchrY\t6563100\t6563400\t0.3564\t30\nchrY\t6591000\t6591300\t0.4209\t21\nchrY\t6640500\t6640800\t0.1268\t34\nchrY\t6659100\t6659400\t0.1841\t30\nchrY\t6665400\t6665700\t0.1232\t28\nchrY\t6675600\t6706500\t0\t42\nchrY\t6709200\t6709500\t0.0046\t30\nchrY\t6744900\t6745200\t0.2271\t30\nchrY\t6854400\t6854700\t0.2063\t52\nchrY\t7086900\t7087200\t0.1159\t16\nchrY\t7155000\t7155300\t0.2343\t136\nchrY\t7158300\t7159500\t0.1533\t64\nchrY\t7254300\t7254600\t0.1293\t46\nchrY\t7341000\t7341600\t0.3307\t27\nchrY\t7578900\t7581900\t0\t40\nchrY\t7587900\t7588200\t0.2176\t31\nchrY\t7590900\t7593000\t0\t41\nchrY\t7595700\t7598100\t0.0157\t34\nchrY\t7599600\t7600500\t0.0417\t34\nchrY\t7603200\t7603500\t0.4032\t24\nchrY\t7605300\t7631100\t0\t43\nchrY\t7634400\t7636500\t0\t35\nchrY\t7638300\t7638600\t0\t35\nchrY\t9158100\t9158400\t0.0691\t23\nchrY\t9333600\t9333900\t0.0694\t107\nchrY\t9336000\t9403800\t0\t215\nchrY\t9453600\t9502500\t0\t223\nchrY\t9503700\t9537000\t0\t199\nchrY\t9545400\t9546000\t0.2455\t73\nchrY\t9590700\t9591000\t0.1291\t48\nchrY\t9636000\t9637200\t0.1465\t35\nchrY\t9640200\t9642000\t0\t30\nchrY\t9648600\t9650700\t0\t34\nchrY\t9653100\t9653400\t0.2803\t30\nchrY\t9659700\t9660000\t0.2809\t26\nchrY\t9668100\t9669000\t0\t32\nchrY\t9670200\t9670800\t0\t32\nchrY\t9687600\t9699600\t0\t48\nchrY\t9700800\t9802500\t0\t48\nchrY\t9813000\t9836400\t0\t44\nchrY\t9838800\t9888000\t0\t44\nchrY\t9889500\t9894000\t0\t44\nchrY\t9898500\t9900900\t0\t31\nchrY\t9903300\t9903600\t0.1033\t34\nchrY\t9906900\t9907200\t0.2233\t31\nchrY\t9908400\t9916800\t0\t39\nchrY\t9918300\t9918600\t0\t39\nchrY\t9942000\t9947100\t0\t76\nchrY\t10246200\t10266900\t0\t69\nchrY\t10317000\t10544100\t0\t80\nchrY\t10594200\t10617600\t0\t67\nchrY\t10618800\t10621800\t0\t67\nchrY\t10626600\t10633500\t0\t4684\nchrY\t10645800\t10650000\t0\t4661\nchrY\t10651500\t10662000\t0.0561\t2454\nchrY\t10663200\t10669800\t0.129\t4167\nchrY\t10671000\t10674000\t0.1853\t1716\nchrY\t10677300\t10679100\t0.2861\t270\nchrY\t10682400\t10694100\t0.1031\t3324\nchrY\t10744200\t10852800\t0.0669\t4048\nchrY\t10855800\t10874100\t0.0733\t1034\nchrY\t10875600\t10890600\t0.0885\t1144\nchrY\t10891800\t10896600\t0.1275\t1073\nchrY\t10898100\t10902300\t0.0994\t435\nchrY\t10905900\t10907100\t0.4521\t97\nchrY\t10909500\t10909800\t0.4271\t232\nchrY\t10920900\t10965900\t0.0673\t1357\nchrY\t10967400\t10977300\t0.0937\t1949\nchrY\t10978800\t11028300\t0.0718\t8125\nchrY\t11029500\t11040900\t0.0718\t8125\nchrY\t11106300\t11106600\t0.3334\t65\nchrY\t11125500\t11125800\t0.2906\t70\nchrY\t11163900\t11164200\t0.2148\t60\nchrY\t11193000\t11193300\t0.4225\t70\nchrY\t11219700\t11220000\t0.3419\t70\nchrY\t11222100\t11222400\t0.339\t128\nchrY\t11229900\t11230200\t0.3892\t75\nchrY\t11240100\t11240400\t0.1767\t102\nchrY\t11267100\t11267400\t0.2753\t53\nchrY\t11290800\t11291700\t0.3537\t914\nchrY\t11292900\t11293200\t0.2616\t2484\nchrY\t11296200\t11305800\t0.101\t14535\nchrY\t11310600\t11310900\t0.4935\t2679\nchrY\t11312100\t11313600\t0.2069\t2158\nchrY\t11317800\t11320200\t0.4513\t6145\nchrY\t11323800\t11326800\t0.2071\t2104\nchrY\t11328900\t11330100\t0.3135\t7569\nchrY\t11355000\t11355300\t0.2326\t24\nchrY\t11492100\t11499000\t0.2079\t257\nchrY\t11502300\t11502600\t0.2691\t124\nchrY\t11504400\t11505900\t0.3495\t87\nchrY\t11508900\t11509200\t0.4197\t104\nchrY\t11511000\t11511300\t0.3884\t97\nchrY\t11512500\t11514600\t0.3769\t130\nchrY\t11516700\t11517000\t0.2971\t117\nchrY\t11518500\t11518800\t0.2971\t117\nchrY\t11520900\t11525400\t0.1624\t336\nchrY\t11528400\t11529300\t0.1439\t837\nchrY\t11534400\t11536200\t0.2294\t1257\nchrY\t11538000\t11538300\t0.3619\t110\nchrY\t11539500\t11562900\t0\t3239\nchrY\t11564100\t11592000\t0\t3239\nchrY\t11643600\t11643900\t0.221\t15657\nchrY\t11646000\t11647200\t0.1362\t458\nchrY\t11649300\t11649600\t0.3752\t121\nchrY\t11652600\t11653800\t0.341\t122\nchrY\t11657100\t11658300\t0.3223\t133\nchrY\t11659500\t11660100\t0.3324\t109\nchrY\t11662800\t11663100\t0.4291\t85\nchrY\t11666100\t11666400\t0.2009\t293\nchrY\t11668800\t11670900\t0.2457\t146\nchrY\t11672700\t11673300\t0.2658\t120\nchrY\t11674800\t11678700\t0.2342\t162\nchrY\t11680200\t11682600\t0.1714\t423\nchrY\t11683800\t11685000\t0.2622\t132\nchrY\t11687100\t11691300\t0.1467\t3894\nchrY\t11692500\t11700600\t0.1467\t3894\nchrY\t11702400\t11702700\t0.1467\t3894\nchrY\t11705400\t11706900\t0.2045\t156\nchrY\t11708700\t11709600\t0.2801\t163\nchrY\t11711700\t11713200\t0.1822\t221\nchrY\t11716800\t11723400\t0.0966\t31584\nchrY\t11725200\t11726700\t0.2299\t151\nchrY\t11728200\t11741700\t0.113\t2982\nchrY\t11743500\t11748600\t0.1493\t7206\nchrY\t11756400\t11757000\t0.307\t49\nchrY\t12313800\t12315000\t0\t40\nchrY\t12320100\t12321300\t0\t40\nchrY\t12850800\t12851400\t0.018\t31\nchrY\t13113300\t13114200\t0\t41\nchrY\t13120500\t13122000\t0\t33\nchrY\t13131000\t13131300\t0.2575\t59\nchrY\t13166700\t13167000\t0.1983\t42\nchrY\t13180500\t13181700\t0.1998\t57\nchrY\t13183800\t13184100\t0.225\t36\nchrY\t13561800\t13562100\t0.2394\t56\nchrY\t13563600\t13564200\t0.0696\t89\nchrY\t13772100\t13772400\t0.2858\t49\nchrY\t13984500\t14019600\t0\t46\nchrY\t14023200\t14058000\t0\t44\nchrY\t14180700\t14181000\t0.4791\t22\nchrY\t14923800\t14924100\t0.2166\t49\nchrY\t14962800\t14963100\t0.3831\t42\nchrY\t15087900\t15088200\t0.3482\t45\nchrY\t15723000\t15723300\t0.2223\t52\nchrY\t15875400\t15883500\t0\t124\nchrY\t15896400\t15904500\t0\t105\nchrY\t16159800\t16269300\t0\t46\nchrY\t16315800\t16425600\t0\t57\nchrY\t16870500\t16870800\t0.2222\t61\nchrY\t16914000\t16914300\t0.1624\t47\nchrY\t17061300\t17063400\t0\t76\nchrY\t17065200\t17065800\t0.2774\t52\nchrY\t17375100\t17377500\t0\t62\nchrY\t17456100\t17951100\t0\t63\nchrY\t17954700\t18640200\t0\t64\nchrY\t18680100\t18870000\t0\t50\nchrY\t19413300\t19413600\t0.4034\t57\nchrY\t19583100\t19584000\t0\t32\nchrY\t19667700\t19668000\t0.1543\t55\nchrY\t19678200\t19679100\t0.02\t48\nchrY\t19780500\t19781400\t0\t34\nchrY\t20054100\t20062800\t0\t48\nchrY\t20064300\t20065500\t0\t73\nchrY\t20069400\t20070900\t0\t50\nchrY\t20078100\t20078700\t0.1089\t33\nchrY\t20079900\t20091000\t0\t80\nchrY\t20094900\t20095500\t0.0923\t18\nchrY\t20096700\t20100300\t0\t42\nchrY\t20103000\t20107200\t0\t52\nchrY\t20112300\t20112900\t0\t50\nchrY\t20114100\t20115000\t0\t67\nchrY\t20120100\t20124600\t0\t93\nchrY\t20127600\t20131500\t0\t52\nchrY\t20133000\t20136000\t0\t33\nchrY\t20142600\t20153700\t0\t67\nchrY\t20158500\t20177100\t0\t88\nchrY\t20179500\t20183100\t0\t44\nchrY\t20184900\t20207700\t0\t239\nchrY\t20258400\t20260200\t0\t40\nchrY\t20262000\t20262300\t0.4095\t51\nchrY\t20264400\t20264700\t0.3393\t44\nchrY\t20269200\t20273400\t0\t80\nchrY\t20286600\t20295300\t0\t248\nchrY\t20318700\t20321100\t0\t56\nchrY\t20326200\t20343600\t0\t229\nchrY\t20349000\t20349600\t0.4309\t176\nchrY\t20371200\t20371800\t0.2192\t58\nchrY\t20473200\t20475600\t0.0241\t64\nchrY\t20690400\t20690700\t0.2685\t30\nchrY\t20958900\t20959500\t0.1668\t53\nchrY\t21010200\t21021600\t0\t40\nchrY\t21051600\t21063300\t0\t42\nchrY\t21065100\t21066000\t0\t29\nchrY\t21426600\t21426900\t0.2782\t36\nchrY\t21493800\t21567300\t0\t73\nchrY\t21705900\t21706200\t0.0565\t36\nchrY\t21714600\t21738900\t0\t23\nchrY\t21741600\t21750000\t0\t26\nchrY\t21756000\t21789000\t0\t41\nchrY\t21862200\t22208700\t0\t86\nchrY\t22241100\t22241400\t0.318\t16\nchrY\t22288800\t22289400\t0.1461\t52\nchrY\t22341900\t22342800\t0.1696\t74\nchrY\t22344600\t22344900\t0.1696\t74\nchrY\t22377900\t22725900\t0\t52\nchrY\t22733400\t22733700\t0.1866\t37\nchrY\t22735800\t22736400\t0.0225\t32\nchrY\t22741500\t22741800\t0.1508\t42\nchrY\t22743600\t22743900\t0.1713\t28\nchrY\t22746900\t22777500\t0\t69\nchrY\t22779000\t26311500\t0\t69\nchrY\t26638200\t26645400\t0.06\t1063\nchrY\t26646600\t26648100\t0.1651\t1024\nchrY\t26649600\t26650200\t0.1651\t1024\nchrY\t26651700\t26663400\t0.1651\t1024\nchrY\t26665800\t26666100\t0.1505\t521\nchrY\t26667300\t26670000\t0.1505\t521\nchrY\t26671800\t26673300\t0.1076\t600\nchrY\t56673000\t56771700\t0\t28529\nchrY\t56829900\t56830200\t0.4436\t728\nchrY\t56833200\t56834700\t0.4786\t3185\nchrY\t56850600\t56850900\t0.4243\t1367\n"
  },
  {
    "path": "tracks/lowmap70perc.bed",
    "content": "chr1\t9900\t55200\t0\t226\nchr1\t57900\t61200\t0.0233\t75\nchr1\t63600\t78900\t0\t104\nchr1\t80400\t81000\t0.1405\t85\nchr1\t83100\t83700\t0.221\t70\nchr1\t90300\t108300\t0\t124\nchr1\t109500\t137700\t0\t124\nchr1\t139800\t183300\t0\t156\nchr1\t184500\t190800\t0\t156\nchr1\t192000\t207300\t0\t114\nchr1\t258000\t267900\t0\t150\nchr1\t269700\t270600\t0\t150\nchr1\t271800\t284400\t0\t150\nchr1\t286200\t297900\t0\t150\nchr1\t348000\t535800\t0\t120\nchr1\t587700\t591000\t0\t750\nchr1\t592200\t600000\t0\t750\nchr1\t601200\t632400\t0\t750\nchr1\t635400\t665400\t0\t121\nchr1\t666600\t770100\t0\t121\nchr1\t771300\t774900\t0\t121\nchr1\t776400\t777000\t0\t121\nchr1\t781200\t782700\t0.4817\t86\nchr1\t788700\t792300\t0.2643\t739\nchr1\t799800\t800100\t0.3809\t74\nchr1\t807000\t807300\t0.1351\t106\nchr1\t808800\t809400\t0.1351\t106\nchr1\t813600\t814500\t0.0238\t63\nchr1\t817500\t817800\t0.0781\t83\nchr1\t827700\t828300\t0.1916\t71\nchr1\t842400\t842700\t0.4762\t68\nchr1\t851100\t851400\t0.4845\t45\nchr1\t853500\t853800\t0.5208\t20\nchr1\t857400\t858000\t0.1344\t40\nchr1\t861300\t861600\t0.543\t50\nchr1\t866700\t867000\t0.4355\t66\nchr1\t876000\t876300\t0.5791\t30\nchr1\t909000\t909300\t0.5078\t20\nchr1\t934200\t934500\t0.0843\t24\nchr1\t976800\t977100\t0.2936\t18\nchr1\t996300\t996600\t0.5557\t74\nchr1\t1007700\t1008000\t0.3594\t47\nchr1\t1016100\t1016400\t0.4079\t138\nchr1\t1076700\t1079400\t0.0176\t87\nchr1\t1080600\t1080900\t0.5825\t32\nchr1\t1099200\t1099800\t0.6093\t222\nchr1\t1139400\t1140600\t0.0455\t56\nchr1\t1184700\t1185000\t0.5398\t56\nchr1\t1201800\t1202400\t0.1474\t43\nchr1\t1248900\t1249500\t0.0008\t77\nchr1\t1288200\t1290300\t0.3288\t200\nchr1\t1297200\t1297500\t0.4759\t50\nchr1\t1350000\t1350300\t0.5275\t10\nchr1\t1382400\t1382700\t0.5687\t205\nchr1\t1445400\t1445700\t0.3131\t58\nchr1\t1456200\t1456500\t0.2497\t60\nchr1\t1474800\t1475100\t0.4887\t52\nchr1\t1478700\t1479000\t0.0834\t63\nchr1\t1481100\t1481700\t0.0206\t70\nchr1\t1497300\t1497600\t0.3168\t63\nchr1\t1513200\t1513500\t0.4026\t58\nchr1\t1517400\t1517700\t0.0632\t67\nchr1\t1519200\t1519800\t0.0705\t55\nchr1\t1524300\t1524600\t0.3351\t86\nchr1\t1530600\t1530900\t0.3808\t36\nchr1\t1632600\t1636200\t0\t73\nchr1\t1641600\t1645500\t0\t79\nchr1\t1657500\t1658700\t0.0599\t62\nchr1\t1661700\t1662000\t0.0691\t83\nchr1\t1675500\t1677300\t0.0404\t71\nchr1\t1690800\t1693800\t0.0417\t71\nchr1\t1695600\t1695900\t0.0864\t53\nchr1\t1698300\t1703400\t0\t75\nchr1\t1705200\t1705500\t0.4392\t40\nchr1\t1707000\t1707300\t0.3648\t48\nchr1\t1708800\t1713000\t0\t74\nchr1\t1714200\t1714500\t0\t74\nchr1\t1722600\t1724100\t0.0836\t65\nchr1\t1727700\t1728000\t0.0666\t56\nchr1\t1738200\t1740300\t0.0382\t82\nchr1\t1743900\t1748100\t0.0108\t71\nchr1\t1751100\t1751700\t0.0595\t54\nchr1\t1928100\t1928400\t0.6613\t68\nchr1\t1979100\t1979700\t0.4737\t36\nchr1\t1981500\t1982100\t0.626\t92\nchr1\t2121600\t2124300\t0.334\t162\nchr1\t2142000\t2142300\t0.614\t52\nchr1\t2280600\t2282400\t0.0113\t114\nchr1\t2365200\t2366100\t0.2105\t80\nchr1\t2401200\t2401500\t0.6613\t44\nchr1\t2440200\t2440800\t0.5545\t118\nchr1\t2553300\t2553900\t0.4952\t56\nchr1\t2568000\t2568300\t0.2465\t53\nchr1\t2652000\t2652300\t0.6895\t980\nchr1\t2655000\t2702700\t0\t1101\nchr1\t2746200\t2767500\t0\t949\nchr1\t2768700\t2775300\t0\t152\nchr1\t2776500\t2777400\t0.0034\t100\nchr1\t2849100\t2849400\t0.6441\t132\nchr1\t2852400\t2853000\t0.4024\t60\nchr1\t2859300\t2859600\t0.5488\t45\nchr1\t2949600\t2949900\t0.3544\t24\nchr1\t3029100\t3029400\t0.5608\t72\nchr1\t3162900\t3163200\t0.1753\t82\nchr1\t3167700\t3168000\t0.4241\t45\nchr1\t3287400\t3287700\t0.5694\t27\nchr1\t3299700\t3300000\t0.5262\t25\nchr1\t3474900\t3475800\t0\t98\nchr1\t3583200\t3583800\t0.0758\t106\nchr1\t3588000\t3588300\t0.5576\t23\nchr1\t3643800\t3644400\t0\t51\nchr1\t3675000\t3675300\t0.3889\t36\nchr1\t3693900\t3694800\t0.1974\t65\nchr1\t3891900\t3892500\t0.0354\t23\nchr1\t3929700\t3930300\t0.4971\t38\nchr1\t4077300\t4078200\t0.1175\t97\nchr1\t4302900\t4303200\t0.2549\t348\nchr1\t4332900\t4333500\t0.3322\t112\nchr1\t4632600\t4633200\t0.3057\t75\nchr1\t5115600\t5115900\t0.5285\t115\nchr1\t5334000\t5334900\t0\t103\nchr1\t5732700\t5733000\t0.3445\t60\nchr1\t5825700\t5826000\t0.564\t59\nchr1\t5884500\t5884800\t0.5277\t50\nchr1\t6186300\t6186600\t0.3136\t65\nchr1\t6304500\t6305100\t0.1027\t68\nchr1\t7114800\t7115400\t0\t60\nchr1\t7335000\t7335300\t0.6539\t52\nchr1\t7381500\t7381800\t0.5328\t81\nchr1\t7865100\t7865400\t0.3899\t41\nchr1\t7953000\t7953600\t0.4613\t96\nchr1\t8433600\t8433900\t0.4035\t70\nchr1\t8502000\t8502900\t0.4889\t62\nchr1\t8511900\t8512200\t0.4422\t36\nchr1\t9411000\t9411300\t0.6587\t30\nchr1\t10577400\t10577700\t0.4368\t29\nchr1\t10744200\t10744800\t0.3425\t83\nchr1\t11036400\t11036700\t0.5377\t60\nchr1\t11085900\t11086200\t0.3423\t74\nchr1\t11249400\t11250000\t0.2146\t47\nchr1\t11491800\t11492100\t0.4155\t68\nchr1\t11522700\t11523000\t0.5874\t169\nchr1\t12042900\t12043200\t0.585\t44\nchr1\t12250800\t12251100\t0.5938\t36\nchr1\t12782700\t12783000\t0.5695\t66\nchr1\t12789600\t12789900\t0.3936\t45\nchr1\t12816000\t12816300\t0.3762\t44\nchr1\t12825300\t12825600\t0.1179\t91\nchr1\t12832800\t12833100\t0.2072\t59\nchr1\t12834300\t12834600\t0.2072\t59\nchr1\t12846000\t12846300\t0.5352\t71\nchr1\t12862200\t12862500\t0.3216\t56\nchr1\t12866400\t12868800\t0\t98\nchr1\t12870000\t12872700\t0\t98\nchr1\t12874200\t12877800\t0\t98\nchr1\t12879000\t12879600\t0\t98\nchr1\t12887400\t12889500\t0.0228\t83\nchr1\t12891600\t12900600\t0\t89\nchr1\t12901800\t12906600\t0\t89\nchr1\t12908100\t12924600\t0\t89\nchr1\t12925800\t12937800\t0\t89\nchr1\t12939000\t12947400\t0\t91\nchr1\t12948600\t12954300\t0\t91\nchr1\t13005000\t13005600\t0\t76\nchr1\t13007700\t13015800\t0\t76\nchr1\t13017600\t13028400\t0\t76\nchr1\t13029600\t13045200\t0\t76\nchr1\t13046400\t13055400\t0\t76\nchr1\t13059000\t13104300\t0\t86\nchr1\t13110300\t13110600\t0.5616\t41\nchr1\t13122600\t13169100\t0\t92\nchr1\t13173000\t13199400\t0\t143\nchr1\t13200600\t13224300\t0\t143\nchr1\t13247400\t13265400\t0\t88\nchr1\t13266600\t13275900\t0\t88\nchr1\t13277400\t13288500\t0\t103\nchr1\t13289700\t13293600\t0\t113\nchr1\t13294800\t13305300\t0\t113\nchr1\t13306500\t13307700\t0\t113\nchr1\t13312200\t13312800\t0.092\t70\nchr1\t13314000\t13314300\t0.4305\t82\nchr1\t13319400\t13319700\t0.6158\t93\nchr1\t13322100\t13322400\t0.5296\t63\nchr1\t13327500\t13329000\t0\t58\nchr1\t13332300\t13337700\t0\t80\nchr1\t13340100\t13340400\t0.1149\t56\nchr1\t13347600\t13347900\t0.3417\t79\nchr1\t13354800\t13355100\t0.5767\t60\nchr1\t13357500\t13358100\t0.4083\t60\nchr1\t13361400\t13361700\t0.3004\t65\nchr1\t13363200\t13363800\t0.0261\t40\nchr1\t13369800\t13370100\t0.5354\t77\nchr1\t13371300\t13371600\t0.5417\t79\nchr1\t13942200\t13942500\t0.511\t68\nchr1\t14028900\t14030400\t0.0111\t86\nchr1\t14257200\t14257500\t0.4339\t50\nchr1\t14386200\t14386500\t0.4865\t80\nchr1\t15268500\t15268800\t0.3118\t65\nchr1\t16035600\t16035900\t0.637\t28\nchr1\t16495200\t16496100\t0.01\t91\nchr1\t16513200\t16513500\t0.1868\t180\nchr1\t16515000\t16516800\t0.1868\t180\nchr1\t16533600\t16535100\t0.3397\t107\nchr1\t16537200\t16537500\t0.3813\t66\nchr1\t16539900\t16540200\t0.3954\t71\nchr1\t16542000\t16542600\t0.2269\t111\nchr1\t16545600\t16545900\t0.301\t60\nchr1\t16547700\t16552500\t0.0233\t95\nchr1\t16554000\t16570200\t0\t292\nchr1\t16571700\t16575600\t0\t292\nchr1\t16579200\t16579500\t0.3252\t156\nchr1\t16580700\t16581300\t0.3252\t156\nchr1\t16582500\t16582800\t0.1968\t168\nchr1\t16585500\t16585800\t0\t214\nchr1\t16587300\t16587600\t0\t214\nchr1\t16588800\t16604700\t0\t214\nchr1\t16619100\t16619700\t0.111\t150\nchr1\t16647000\t16648800\t0.4157\t169\nchr1\t16652700\t16674000\t0\t186\nchr1\t16682100\t16682700\t0.0749\t80\nchr1\t16686900\t16687200\t0.4718\t98\nchr1\t16688400\t16696200\t0\t98\nchr1\t16698000\t16699200\t0\t108\nchr1\t16700400\t16711500\t0\t108\nchr1\t16713000\t16715700\t0\t98\nchr1\t16729200\t16764300\t0\t221\nchr1\t16767900\t16770300\t0.0208\t135\nchr1\t16773000\t16773300\t0.2326\t128\nchr1\t16774500\t16775400\t0.3433\t140\nchr1\t16776600\t16776900\t0.3809\t117\nchr1\t16778400\t16779300\t0.0466\t126\nchr1\t16781100\t16781400\t0.3578\t142\nchr1\t16782900\t16785600\t0.0011\t126\nchr1\t16787400\t16789200\t0.2609\t138\nchr1\t16790400\t16794300\t0.2609\t138\nchr1\t16797600\t16797900\t0.5406\t63\nchr1\t16850700\t16854000\t0\t81\nchr1\t16855500\t16858500\t0\t81\nchr1\t16862100\t16863600\t0.2797\t101\nchr1\t16865400\t16866600\t0.1518\t141\nchr1\t16868700\t16869000\t0.6266\t171\nchr1\t16870500\t16870800\t0.5875\t88\nchr1\t16872900\t16873200\t0.6545\t159\nchr1\t16917300\t16918200\t0.0114\t85\nchr1\t16953600\t16954200\t0.0577\t140\nchr1\t16974000\t16974900\t0\t34\nchr1\t17241600\t17241900\t0.457\t59\nchr1\t18049500\t18049800\t0.6813\t73\nchr1\t18825300\t18825600\t0.4995\t21\nchr1\t18925800\t18926100\t0.5125\t157\nchr1\t19267500\t19267800\t0.516\t63\nchr1\t19508400\t19508700\t0.5363\t50\nchr1\t20814900\t20817300\t0.056\t41\nchr1\t20831700\t20833200\t0.0494\t70\nchr1\t21387600\t21389700\t0.0859\t60\nchr1\t21422400\t21423000\t0.3003\t71\nchr1\t21425100\t21425700\t0.0351\t70\nchr1\t21426900\t21427500\t0.0351\t70\nchr1\t21429600\t21430200\t0.0351\t70\nchr1\t21480900\t21483000\t0.0104\t77\nchr1\t21484800\t21485700\t0.0104\t77\nchr1\t21967800\t21968400\t0.0698\t54\nchr1\t21979800\t21980400\t0.2965\t58\nchr1\t21986700\t21987000\t0.3281\t49\nchr1\t21989100\t21991200\t0\t78\nchr1\t21993600\t21994200\t0.1595\t103\nchr1\t22009800\t22010100\t0.5281\t74\nchr1\t22012500\t22014600\t0\t72\nchr1\t22372800\t22373100\t0.4761\t108\nchr1\t23504700\t23505000\t0.6919\t30\nchr1\t23837100\t23837700\t0.3386\t43\nchr1\t23962200\t23962500\t0.5041\t54\nchr1\t23992800\t23994900\t0.0688\t55\nchr1\t24031500\t24032100\t0.2018\t65\nchr1\t24076500\t24076800\t0.2306\t40\nchr1\t24799800\t24800400\t0.1913\t26\nchr1\t24832500\t24834900\t0\t36\nchr1\t25002000\t25002600\t0.3444\t13\nchr1\t25059300\t25059600\t0.4542\t60\nchr1\t25264500\t25267500\t0.0078\t53\nchr1\t25273200\t25273800\t0.4385\t40\nchr1\t25292700\t25293000\t0.3935\t35\nchr1\t25294500\t25295700\t0.1491\t54\nchr1\t25297200\t25298400\t0.1491\t54\nchr1\t25303800\t25304400\t0.1804\t49\nchr1\t25311900\t25312500\t0.1363\t47\nchr1\t25316700\t25317900\t0\t42\nchr1\t25322700\t25329000\t0\t56\nchr1\t25335000\t25337700\t0.0015\t58\nchr1\t25362600\t25368600\t0\t62\nchr1\t25374600\t25375200\t0.0553\t54\nchr1\t25380000\t25380300\t0.1413\t55\nchr1\t25388100\t25388400\t0.0911\t47\nchr1\t25395000\t25396200\t0.2648\t48\nchr1\t25397700\t25398600\t0.2648\t48\nchr1\t25400400\t25400700\t0.5652\t46\nchr1\t25419600\t25419900\t0.3566\t47\nchr1\t25508400\t25512000\t0.1838\t123\nchr1\t26163300\t26163600\t0.1266\t39\nchr1\t26597100\t26597400\t0.2336\t69\nchr1\t26640300\t26641200\t0.0034\t67\nchr1\t26646900\t26647500\t0.0017\t66\nchr1\t26817300\t26819100\t0.4183\t57\nchr1\t27064500\t27065700\t0.0868\t81\nchr1\t27288600\t27288900\t0.3266\t66\nchr1\t27642600\t27642900\t0.4499\t57\nchr1\t27852300\t27855000\t0.0671\t75\nchr1\t27916800\t27917100\t0.6937\t23\nchr1\t27921300\t27921600\t0.5853\t31\nchr1\t28095300\t28095900\t0.3064\t51\nchr1\t28695600\t28695900\t0.379\t57\nchr1\t29657400\t29657700\t0.5369\t51\nchr1\t29723400\t29723700\t0.4786\t150\nchr1\t30375600\t30375900\t0.6195\t36\nchr1\t30384000\t30384300\t0.491\t59\nchr1\t30438600\t30444000\t0.0665\t109\nchr1\t30495600\t30495900\t0.4704\t54\nchr1\t30498600\t30498900\t0.096\t84\nchr1\t30567900\t30568800\t0.011\t182\nchr1\t30577200\t30577500\t0.4454\t62\nchr1\t30578700\t30579300\t0.0551\t71\nchr1\t30655200\t30655800\t0.5189\t124\nchr1\t30773100\t30773400\t0.6196\t58\nchr1\t30935700\t30936300\t0.1235\t68\nchr1\t30949200\t30949500\t0.1536\t79\nchr1\t31431600\t31432200\t0.4337\t516\nchr1\t32973600\t32974800\t0.3256\t61\nchr1\t32999700\t33000000\t0.4026\t57\nchr1\t33051000\t33053400\t0.0135\t70\nchr1\t33216000\t33216300\t0.4549\t35\nchr1\t33833400\t33834900\t0.0253\t56\nchr1\t34084500\t34084800\t0.3369\t94\nchr1\t34095000\t34095300\t0.0234\t194\nchr1\t34096500\t34098300\t0.0234\t194\nchr1\t34252200\t34256700\t0.0393\t93\nchr1\t34566300\t34572000\t0\t101\nchr1\t34956900\t34957200\t0.3072\t73\nchr1\t35260200\t35260500\t0.2316\t39\nchr1\t37211400\t37211700\t0.3942\t71\nchr1\t37896000\t37896300\t0.5053\t73\nchr1\t38666700\t38667300\t0.1822\t126\nchr1\t38922300\t38922600\t0.3326\t18\nchr1\t39234000\t39234300\t0.4343\t75\nchr1\t39264600\t39264900\t0.5031\t39\nchr1\t39413400\t39413700\t0.4493\t37\nchr1\t39495300\t39496500\t0.3206\t70\nchr1\t39511200\t39516300\t0\t110\nchr1\t39518100\t39518700\t0.0919\t66\nchr1\t39520200\t39522000\t0.0408\t78\nchr1\t39764700\t39765900\t0.1933\t85\nchr1\t39767400\t39768000\t0.2489\t78\nchr1\t39769800\t39774900\t0\t87\nchr1\t39784200\t39785400\t0.1394\t63\nchr1\t39999600\t39999900\t0.1148\t56\nchr1\t40365900\t40370700\t0\t136\nchr1\t40494300\t40494600\t0.4331\t34\nchr1\t40496700\t40498200\t0.1811\t41\nchr1\t41207700\t41208300\t0.0326\t65\nchr1\t41545500\t41545800\t0.6939\t70\nchr1\t41552400\t41552700\t0.3537\t45\nchr1\t41854500\t41855100\t0.0947\t97\nchr1\t41989800\t41993100\t0.1619\t84\nchr1\t42064800\t42065100\t0.1743\t69\nchr1\t42094200\t42094800\t0.202\t66\nchr1\t42167100\t42167400\t0.5131\t41\nchr1\t42233100\t42234000\t0.1903\t80\nchr1\t42252900\t42254700\t0.258\t76\nchr1\t42277500\t42277800\t0.2148\t36\nchr1\t42494400\t42495300\t0.0235\t166\nchr1\t42708900\t42709200\t0.2458\t185\nchr1\t42750900\t42751500\t0.0401\t50\nchr1\t43114800\t43115100\t0.1024\t92\nchr1\t43116300\t43117800\t0.1024\t92\nchr1\t43502700\t43503000\t0.3196\t55\nchr1\t44140200\t44140500\t0.5894\t44\nchr1\t44816700\t44817000\t0.5695\t29\nchr1\t45223500\t45223800\t0.4133\t61\nchr1\t45497700\t45498300\t0.5148\t62\nchr1\t45709800\t45711000\t0.1354\t85\nchr1\t45725100\t45726000\t0.0421\t87\nchr1\t45741600\t45741900\t0.1112\t25\nchr1\t45803700\t45804000\t0.3598\t37\nchr1\t45900600\t45900900\t0.6763\t34\nchr1\t46014900\t46015200\t0.308\t78\nchr1\t46240200\t46242900\t0.1027\t100\nchr1\t46504200\t46505700\t0.0383\t90\nchr1\t46773900\t46774200\t0.4124\t50\nchr1\t46808400\t46809000\t0.534\t67\nchr1\t46874700\t46875000\t0.1614\t58\nchr1\t46876800\t46877100\t0.1271\t51\nchr1\t46878900\t46879200\t0.5075\t68\nchr1\t46882800\t46883100\t0.3628\t61\nchr1\t46886400\t46887600\t0\t69\nchr1\t46891800\t46897800\t0\t97\nchr1\t47069700\t47075700\t0\t83\nchr1\t47078400\t47078700\t0.3607\t49\nchr1\t47080200\t47081700\t0\t62\nchr1\t47084700\t47085000\t0.4175\t56\nchr1\t47088600\t47088900\t0.285\t55\nchr1\t47090700\t47091300\t0.167\t70\nchr1\t47092800\t47093400\t0.2563\t62\nchr1\t47274300\t47274600\t0.3407\t39\nchr1\t47614500\t47614800\t0.5178\t60\nchr1\t47874300\t47874600\t0.2714\t53\nchr1\t47958000\t47958600\t0.5521\t64\nchr1\t48150300\t48156000\t0\t148\nchr1\t48381900\t48384000\t0.0287\t99\nchr1\t49006800\t49007400\t0.1349\t70\nchr1\t49010100\t49011300\t0.1349\t70\nchr1\t49095600\t49095900\t0.3535\t65\nchr1\t49259400\t49260000\t0.2722\t80\nchr1\t49261500\t49262100\t0.2722\t80\nchr1\t49283700\t49284000\t0.1117\t102\nchr1\t49287000\t49288200\t0.0645\t79\nchr1\t49350300\t49350600\t0.4954\t69\nchr1\t49510200\t49511100\t0.4267\t69\nchr1\t49622400\t49622700\t0.3134\t63\nchr1\t49800600\t49800900\t0.1283\t52\nchr1\t49875300\t49876800\t0.0302\t78\nchr1\t49878600\t49880100\t0.0602\t95\nchr1\t49881600\t49882500\t0.344\t73\nchr1\t50864100\t50865600\t0.3397\t63\nchr1\t50918400\t50919000\t0.0081\t89\nchr1\t51478500\t51478800\t0.4198\t56\nchr1\t51918900\t51919200\t0.4125\t60\nchr1\t52172700\t52173000\t0.4032\t76\nchr1\t52636200\t52636500\t0.4439\t46\nchr1\t52797300\t52797600\t0.1032\t134\nchr1\t53283600\t53284200\t0.0752\t65\nchr1\t53713200\t53713500\t0.2647\t120\nchr1\t54025800\t54026100\t0.3611\t45\nchr1\t54234000\t54234300\t0.5308\t67\nchr1\t54440700\t54441000\t0.444\t46\nchr1\t54561000\t54563100\t0.2505\t103\nchr1\t55025100\t55025400\t0.5369\t74\nchr1\t55497000\t55497300\t0.4246\t44\nchr1\t55666800\t55667100\t0.1833\t21\nchr1\t55941900\t55942500\t0.1605\t65\nchr1\t56365500\t56369400\t0\t135\nchr1\t57426900\t57427200\t0.486\t54\nchr1\t57639000\t57639300\t0.545\t18\nchr1\t58115100\t58116000\t0.0732\t84\nchr1\t58128600\t58131300\t0.1765\t91\nchr1\t58254600\t58255200\t0.0951\t82\nchr1\t58269600\t58274700\t0.0006\t87\nchr1\t58374000\t58379100\t0.0548\t82\nchr1\t58582500\t58583400\t0.1672\t81\nchr1\t58593900\t58594200\t0.3137\t38\nchr1\t58729500\t58729800\t0.6643\t39\nchr1\t58888500\t58888800\t0.4659\t53\nchr1\t58960200\t58960500\t0.1892\t121\nchr1\t59253900\t59254500\t0.1297\t76\nchr1\t59324400\t59324700\t0.4948\t64\nchr1\t59647800\t59652600\t0.156\t69\nchr1\t60003000\t60003300\t0.2314\t73\nchr1\t60209700\t60210600\t0.2012\t83\nchr1\t60218700\t60219000\t0.2739\t67\nchr1\t60278700\t60279300\t0.1995\t87\nchr1\t60380700\t60381300\t0.2317\t69\nchr1\t60405000\t60405300\t0.6019\t73\nchr1\t60466800\t60467100\t0.3263\t73\nchr1\t60492600\t60494700\t0.2107\t90\nchr1\t60550800\t60551400\t0.0955\t109\nchr1\t60643800\t60645600\t0.1929\t88\nchr1\t60776100\t60776700\t0.3228\t62\nchr1\t60778800\t60779400\t0.2439\t56\nchr1\t61713900\t61714200\t0.2425\t37\nchr1\t61925100\t61925400\t0.2659\t103\nchr1\t62874000\t62874300\t0.3386\t53\nchr1\t63239700\t63242400\t0.0028\t102\nchr1\t63473400\t63474600\t0.3256\t99\nchr1\t63926400\t63927600\t0.0432\t56\nchr1\t64200600\t64200900\t0.3523\t74\nchr1\t64276500\t64278600\t0.3976\t86\nchr1\t64373100\t64373700\t0\t68\nchr1\t64415400\t64416900\t0.4498\t59\nchr1\t64797900\t64798500\t0.0889\t106\nchr1\t65226900\t65228400\t0.1824\t82\nchr1\t65302500\t65302800\t0.4873\t41\nchr1\t65450400\t65450700\t0.2497\t80\nchr1\t65452200\t65452800\t0.2497\t80\nchr1\t65544900\t65546100\t0.2673\t93\nchr1\t65558400\t65564400\t0\t94\nchr1\t65671500\t65672400\t0.276\t68\nchr1\t65778000\t65778600\t0.0289\t74\nchr1\t65875200\t65875800\t0.3251\t81\nchr1\t65924100\t65924400\t0.3232\t46\nchr1\t66104400\t66105000\t0.1789\t95\nchr1\t66338700\t66339000\t0.5931\t62\nchr1\t66484800\t66486600\t0.3607\t93\nchr1\t66736500\t66736800\t0.6285\t24\nchr1\t66785400\t66786000\t0.2839\t75\nchr1\t66805500\t66805800\t0.2601\t70\nchr1\t66823500\t66824400\t0.2397\t67\nchr1\t67079100\t67084800\t0\t91\nchr1\t67158900\t67159200\t0.1275\t56\nchr1\t67342800\t67343100\t0.361\t71\nchr1\t67362300\t67362600\t0.3591\t60\nchr1\t67548000\t67548300\t0.3189\t100\nchr1\t67550400\t67551000\t0.3189\t100\nchr1\t67784100\t67784400\t0.3762\t49\nchr1\t68734200\t68739600\t0\t110\nchr1\t68878800\t68879700\t0.2492\t74\nchr1\t68880900\t68881200\t0.2492\t74\nchr1\t68924400\t68926200\t0.324\t77\nchr1\t68996100\t68996400\t0.4413\t63\nchr1\t69115200\t69118500\t0.1179\t90\nchr1\t69119700\t69120000\t0.1179\t90\nchr1\t69212100\t69212400\t0.2961\t38\nchr1\t69265800\t69266100\t0.5749\t40\nchr1\t69341400\t69341700\t0.4873\t20\nchr1\t69447600\t69448200\t0.4288\t82\nchr1\t69462000\t69462300\t0.3779\t51\nchr1\t69526500\t69526800\t0.6472\t22\nchr1\t69561600\t69561900\t0.3612\t50\nchr1\t69578400\t69578700\t0.514\t65\nchr1\t69677100\t69677400\t0.6831\t37\nchr1\t69883800\t69885900\t0.0895\t78\nchr1\t69887100\t69887400\t0.1147\t82\nchr1\t69908700\t69909000\t0.6008\t52\nchr1\t69926100\t69926400\t0.3248\t43\nchr1\t69995700\t69996300\t0.4518\t80\nchr1\t69997500\t69997800\t0.4518\t80\nchr1\t70098900\t70099500\t0.139\t82\nchr1\t70596000\t70596600\t0.1902\t100\nchr1\t70599300\t70599900\t0.1902\t100\nchr1\t70646700\t70647600\t0.0059\t26\nchr1\t70814100\t70814700\t0.4068\t50\nchr1\t71275500\t71275800\t0.5551\t27\nchr1\t71513700\t71519700\t0\t114\nchr1\t71602200\t71602500\t0.4987\t27\nchr1\t71888400\t71894400\t0\t122\nchr1\t71928000\t71928300\t0.6592\t35\nchr1\t71942400\t71942700\t0.2622\t19\nchr1\t72025800\t72026100\t0.4799\t60\nchr1\t72900900\t72901500\t0.3049\t86\nchr1\t72902700\t72903000\t0.3049\t86\nchr1\t72904500\t72904800\t0.5028\t34\nchr1\t73193700\t73194900\t0.0125\t112\nchr1\t73287900\t73288200\t0.239\t19\nchr1\t73471200\t73471500\t0.3428\t90\nchr1\t74446200\t74450400\t0.0093\t104\nchr1\t74500500\t74500800\t0.494\t36\nchr1\t74518800\t74519400\t0.081\t45\nchr1\t74533500\t74533800\t0.5324\t66\nchr1\t74758500\t74758800\t0.3686\t80\nchr1\t74787900\t74788200\t0.2648\t66\nchr1\t74882700\t74883000\t0.3756\t66\nchr1\t75107100\t75107400\t0.2729\t66\nchr1\t75110400\t75110700\t0.5052\t72\nchr1\t75323100\t75323400\t0.3512\t88\nchr1\t75377100\t75384900\t0\t125\nchr1\t75387300\t75388200\t0\t125\nchr1\t75536700\t75537000\t0.2144\t53\nchr1\t75702900\t75703200\t0.5149\t66\nchr1\t75839700\t75840000\t0.1895\t72\nchr1\t75885900\t75886200\t0.095\t25\nchr1\t76111500\t76111800\t0.1833\t78\nchr1\t76458000\t76458300\t0.29\t58\nchr1\t76914900\t76915200\t0.2658\t63\nchr1\t76999800\t77004900\t0.1473\t72\nchr1\t77810100\t77810400\t0.2458\t65\nchr1\t77869200\t77870700\t0.1259\t79\nchr1\t77992200\t77992500\t0.4676\t45\nchr1\t78243600\t78245700\t0\t95\nchr1\t78282300\t78283200\t0.2715\t57\nchr1\t78845400\t78851100\t0.0015\t114\nchr1\t79130700\t79131000\t0.6011\t52\nchr1\t79170000\t79170300\t0.4194\t74\nchr1\t79512600\t79512900\t0.522\t73\nchr1\t79541700\t79542000\t0.3503\t57\nchr1\t79571700\t79572000\t0.2215\t28\nchr1\t79648500\t79648800\t0.4477\t33\nchr1\t79939500\t79943700\t0.1225\t81\nchr1\t80132700\t80133000\t0.2614\t33\nchr1\t80134200\t80138100\t0.13\t79\nchr1\t80394600\t80394900\t0.3493\t70\nchr1\t80406900\t80407200\t0.4277\t26\nchr1\t80409000\t80409300\t0.5048\t51\nchr1\t80734200\t80734500\t0.4462\t55\nchr1\t80939400\t80944800\t0\t105\nchr1\t80946300\t80946900\t0.1882\t24\nchr1\t80948400\t80948700\t0.5207\t12\nchr1\t80949900\t80951100\t0.0219\t59\nchr1\t81222000\t81222300\t0.642\t52\nchr1\t81734400\t81735300\t0.3038\t59\nchr1\t82104600\t82104900\t0.3332\t80\nchr1\t82131300\t82135200\t0.2059\t72\nchr1\t82250700\t82255800\t0.0333\t97\nchr1\t82497600\t82497900\t0.5481\t27\nchr1\t82576800\t82577400\t0.485\t47\nchr1\t82584300\t82584600\t0.3378\t59\nchr1\t82660200\t82662000\t0\t91\nchr1\t83134500\t83134800\t0.3362\t68\nchr1\t83143800\t83144100\t0.6694\t64\nchr1\t83145900\t83146200\t0.3896\t57\nchr1\t83150100\t83150400\t0.4436\t52\nchr1\t83161200\t83161500\t0.2608\t42\nchr1\t83169600\t83169900\t0.2557\t113\nchr1\t83177700\t83178000\t0.3069\t52\nchr1\t83184000\t83184300\t0.1363\t78\nchr1\t83185800\t83187300\t0.1363\t78\nchr1\t83195700\t83196000\t0.4019\t56\nchr1\t83201400\t83201700\t0.2699\t66\nchr1\t83208000\t83208300\t0.1703\t46\nchr1\t83216700\t83217000\t0.3904\t62\nchr1\t83230500\t83231100\t0.1165\t100\nchr1\t83234400\t83234700\t0.4004\t29\nchr1\t83261700\t83262000\t0.0975\t87\nchr1\t83266200\t83268600\t0.0975\t87\nchr1\t83272200\t83272500\t0.4429\t71\nchr1\t83275500\t83276400\t0.398\t60\nchr1\t83281200\t83281500\t0.3683\t64\nchr1\t83303400\t83304000\t0.0442\t57\nchr1\t83325300\t83325900\t0.3289\t46\nchr1\t83339400\t83341800\t0.0207\t89\nchr1\t83350800\t83355000\t0.0666\t69\nchr1\t83361600\t83361900\t0.5447\t63\nchr1\t83383200\t83383500\t0.5872\t61\nchr1\t83388900\t83390400\t0.3693\t38\nchr1\t83392800\t83393400\t0.1258\t34\nchr1\t83406900\t83407200\t0.3015\t56\nchr1\t83412900\t83413200\t0.3006\t57\nchr1\t83414400\t83414700\t0.3006\t57\nchr1\t83417400\t83417700\t0.2211\t72\nchr1\t83424600\t83425200\t0.4267\t59\nchr1\t83436000\t83436300\t0.4221\t55\nchr1\t83440200\t83440800\t0.4107\t59\nchr1\t83481300\t83481600\t0.5567\t67\nchr1\t83486400\t83486700\t0.4791\t61\nchr1\t83881500\t83882100\t0.3067\t84\nchr1\t84052200\t84058500\t0\t92\nchr1\t84229200\t84229500\t0.1674\t87\nchr1\t84230700\t84231000\t0.1674\t87\nchr1\t84233400\t84234000\t0.0408\t126\nchr1\t84993600\t84993900\t0.4937\t51\nchr1\t85026300\t85026600\t0.5804\t90\nchr1\t85187400\t85187700\t0.3239\t69\nchr1\t85515300\t85517400\t0.2094\t62\nchr1\t85521900\t85522500\t0.0134\t63\nchr1\t85526700\t85527000\t0.4162\t50\nchr1\t85528800\t85529100\t0.4162\t50\nchr1\t85531500\t85531800\t0.4245\t66\nchr1\t85535100\t85535700\t0.0181\t62\nchr1\t85748700\t85754400\t0\t148\nchr1\t85771800\t85772100\t0.2511\t59\nchr1\t85813500\t85813800\t0.3903\t46\nchr1\t85825500\t85826700\t0.228\t99\nchr1\t85828500\t85829100\t0.228\t99\nchr1\t85927500\t85933200\t0\t117\nchr1\t85940100\t85940400\t0.1448\t27\nchr1\t85948200\t85948500\t0.4529\t46\nchr1\t86215200\t86217300\t0.0235\t57\nchr1\t86242800\t86243700\t0.3194\t78\nchr1\t86244900\t86245200\t0.3194\t78\nchr1\t86275200\t86276100\t0.0005\t66\nchr1\t86467500\t86467800\t0.399\t83\nchr1\t86529600\t86529900\t0.3975\t54\nchr1\t86679300\t86685000\t0\t111\nchr1\t86816400\t86816700\t0.2211\t89\nchr1\t87888900\t87889200\t0.5377\t47\nchr1\t87895200\t87895500\t0.3841\t69\nchr1\t88342500\t88347000\t0.0481\t82\nchr1\t88770600\t88770900\t0.6309\t66\nchr1\t89388900\t89389200\t0.3913\t27\nchr1\t89412600\t89413200\t0.0016\t89\nchr1\t89414400\t89418000\t0.0016\t89\nchr1\t89561100\t89562000\t0.0317\t76\nchr1\t89705100\t89705400\t0.4101\t76\nchr1\t89747100\t89752800\t0.0414\t89\nchr1\t89797200\t89797800\t0.1077\t53\nchr1\t89961300\t89961600\t0.3678\t91\nchr1\t90057900\t90060900\t0.3026\t93\nchr1\t90146400\t90146700\t0.3642\t77\nchr1\t90214800\t90215700\t0.3873\t81\nchr1\t90216900\t90217200\t0.3873\t81\nchr1\t91159200\t91159500\t0.4709\t13\nchr1\t91211700\t91216800\t0.0107\t104\nchr1\t91293600\t91293900\t0.4107\t67\nchr1\t91301400\t91302000\t0.0469\t49\nchr1\t91371300\t91371600\t0.0807\t50\nchr1\t91387200\t91387800\t0.035\t950\nchr1\t91448700\t91449000\t0.3722\t15\nchr1\t91668600\t91668900\t0.5952\t25\nchr1\t93276900\t93277800\t0.0049\t74\nchr1\t93790800\t93796200\t0.0157\t98\nchr1\t94493400\t94493700\t0.4017\t92\nchr1\t94507800\t94508700\t0.3825\t79\nchr1\t95292300\t95295900\t0.0647\t100\nchr1\t96052500\t96053100\t0.1288\t52\nchr1\t96142200\t96142500\t0.4575\t66\nchr1\t96173100\t96174000\t0.2831\t96\nchr1\t96241200\t96243000\t0.2236\t113\nchr1\t96245400\t96245700\t0.2236\t113\nchr1\t96381300\t96381600\t0.3786\t73\nchr1\t96434400\t96434700\t0.5105\t77\nchr1\t96606600\t96608700\t0.0775\t84\nchr1\t96762000\t96762300\t0.3179\t55\nchr1\t96853500\t96854100\t0.2118\t106\nchr1\t96884400\t96884700\t0.3921\t70\nchr1\t97156800\t97157100\t0.5587\t53\nchr1\t97162800\t97163100\t0.5496\t66\nchr1\t97318800\t97322100\t0.0018\t85\nchr1\t97556400\t97557000\t0.3921\t91\nchr1\t97971600\t97971900\t0.4046\t58\nchr1\t98511900\t98512200\t0.1751\t39\nchr1\t98543100\t98543400\t0.4647\t72\nchr1\t98591100\t98591700\t0.4295\t97\nchr1\t98614200\t98614500\t0.2721\t58\nchr1\t98672700\t98673000\t0.4624\t54\nchr1\t98694000\t98694300\t0.5684\t57\nchr1\t98983200\t98983800\t0.1537\t63\nchr1\t99213600\t99214200\t0.0136\t84\nchr1\t99388500\t99390900\t0.0085\t93\nchr1\t100632600\t100632900\t0.3546\t63\nchr1\t100923000\t100923300\t0.528\t28\nchr1\t101628900\t101629500\t0.186\t58\nchr1\t101636700\t101637000\t0.6079\t44\nchr1\t101669100\t101669400\t0.3387\t61\nchr1\t102073500\t102074100\t0.2643\t95\nchr1\t102341700\t102342000\t0.2874\t70\nchr1\t102542100\t102542400\t0.5904\t28\nchr1\t102630600\t102630900\t0.2767\t41\nchr1\t102807300\t102807600\t0.1934\t55\nchr1\t102928800\t102929100\t0.4876\t60\nchr1\t102930900\t102933300\t0.2299\t67\nchr1\t103019700\t103020900\t0.1192\t58\nchr1\t103277700\t103278000\t0.4286\t39\nchr1\t103356000\t103356300\t0.065\t65\nchr1\t103380000\t103380600\t0.3037\t51\nchr1\t103594500\t103610700\t0\t86\nchr1\t103618800\t103623000\t0\t120\nchr1\t103624200\t103760400\t0\t120\nchr1\t103922700\t103924500\t0.1691\t103\nchr1\t104035500\t104036700\t0.0083\t116\nchr1\t104127000\t104127300\t0.0189\t47\nchr1\t104218500\t104218800\t0.4829\t57\nchr1\t104660700\t104661000\t0.3489\t60\nchr1\t104770500\t104775900\t0\t95\nchr1\t104844000\t104849100\t0\t87\nchr1\t104885700\t104886000\t0.0026\t12\nchr1\t105189900\t105190200\t0.486\t58\nchr1\t105214200\t105216300\t0.0011\t57\nchr1\t105575400\t105576000\t0.0908\t94\nchr1\t105658800\t105660900\t0.0251\t131\nchr1\t105822600\t105823200\t0.3636\t79\nchr1\t105948300\t105948600\t0.291\t68\nchr1\t106089900\t106090200\t0.2428\t184\nchr1\t106284600\t106285200\t0.3692\t65\nchr1\t107993100\t107993400\t0.3589\t54\nchr1\t108162900\t108165000\t0.292\t103\nchr1\t108167100\t108167400\t0.4108\t77\nchr1\t108223800\t108310500\t0\t98\nchr1\t108374100\t108470400\t0\t140\nchr1\t108482100\t108483600\t0.238\t50\nchr1\t108489000\t108489300\t0.4398\t89\nchr1\t108576300\t108579600\t0\t71\nchr1\t108675900\t108676200\t0.6127\t71\nchr1\t108933000\t108933600\t0.5283\t60\nchr1\t109055100\t109055400\t0.0225\t35\nchr1\t109674900\t109675500\t0.1752\t56\nchr1\t109680600\t109684200\t0\t66\nchr1\t109693200\t109694100\t0.043\t45\nchr1\t109698900\t109702500\t0\t56\nchr1\t109744200\t109744800\t0.2935\t78\nchr1\t109842300\t109843800\t0.1528\t96\nchr1\t110079900\t110080200\t0.5148\t106\nchr1\t110808300\t110808900\t0.35\t65\nchr1\t110821200\t110821800\t0.4787\t62\nchr1\t110845800\t110846400\t0.0597\t71\nchr1\t111059400\t111059700\t0.3694\t71\nchr1\t111234000\t111234300\t0.6095\t57\nchr1\t111337800\t111338100\t0.3924\t48\nchr1\t111339300\t111339600\t0.2432\t86\nchr1\t111529500\t111529800\t0.414\t75\nchr1\t111544800\t111545100\t0.1185\t104\nchr1\t111800100\t111800700\t0.0574\t56\nchr1\t112022700\t112023000\t0.4636\t45\nchr1\t112104900\t112105200\t0.2437\t15\nchr1\t112155300\t112155900\t0.0432\t72\nchr1\t112158300\t112159500\t0.0432\t72\nchr1\t112203600\t112203900\t0.2977\t86\nchr1\t112216500\t112216800\t0.394\t54\nchr1\t112226100\t112227300\t0.1008\t100\nchr1\t112293300\t112295100\t0.007\t48\nchr1\t112340700\t112341000\t0.4179\t99\nchr1\t112639800\t112640400\t0.5033\t104\nchr1\t112773600\t112774800\t0.0854\t55\nchr1\t112897800\t112899300\t0.0505\t70\nchr1\t113068800\t113071200\t0.0582\t92\nchr1\t113344200\t113346300\t0.0688\t81\nchr1\t113360700\t113362800\t0.0147\t129\nchr1\t113415900\t113416200\t0.524\t47\nchr1\t113497200\t113503200\t0\t132\nchr1\t113509500\t113509800\t0.0614\t69\nchr1\t113599500\t113599800\t0.344\t51\nchr1\t113601600\t113601900\t0.494\t62\nchr1\t113668500\t113668800\t0.5697\t47\nchr1\t114804000\t114804300\t0.6811\t60\nchr1\t115016700\t115017000\t0.4238\t75\nchr1\t115148700\t115153800\t0.0435\t140\nchr1\t115254300\t115254600\t0.2562\t27\nchr1\t115602300\t115602600\t0.5481\t63\nchr1\t115626000\t115627500\t0.1056\t100\nchr1\t116136000\t116137200\t0.0484\t83\nchr1\t116214600\t116214900\t0.4741\t63\nchr1\t116718000\t116719800\t0\t134\nchr1\t117429600\t117431100\t0.0103\t78\nchr1\t118283700\t118284000\t0.405\t69\nchr1\t118286400\t118286700\t0.3423\t65\nchr1\t118422900\t118423200\t0.4286\t53\nchr1\t118551300\t118551600\t0.2847\t84\nchr1\t118571400\t118571700\t0.5737\t55\nchr1\t118575900\t118576500\t0.1012\t69\nchr1\t118577700\t118578000\t0.1012\t69\nchr1\t118721700\t118722000\t0.3976\t60\nchr1\t118836600\t118836900\t0.4005\t88\nchr1\t118852500\t118858200\t0\t122\nchr1\t119016300\t119016600\t0.5471\t63\nchr1\t119023200\t119023500\t0.4955\t78\nchr1\t119059200\t119059500\t0.4588\t77\nchr1\t119561700\t119562000\t0.5094\t67\nchr1\t119599200\t119599500\t0.2114\t46\nchr1\t119607600\t119607900\t0.3622\t44\nchr1\t119989800\t119995500\t0\t70\nchr1\t119998800\t119999700\t0.1029\t81\nchr1\t120004200\t120006600\t0\t69\nchr1\t120007800\t120008700\t0\t69\nchr1\t120012000\t120013200\t0\t81\nchr1\t120014400\t120036900\t0\t81\nchr1\t120038400\t120038700\t0\t81\nchr1\t120039900\t120042600\t0\t101\nchr1\t120043800\t120062700\t0\t101\nchr1\t120063900\t120064500\t0\t101\nchr1\t120066600\t120073500\t0.0076\t91\nchr1\t120074700\t120088200\t0\t115\nchr1\t120089700\t120091800\t0\t115\nchr1\t120093600\t120094800\t0.0659\t70\nchr1\t120096600\t120097200\t0.0659\t70\nchr1\t120099000\t120100500\t0.0801\t65\nchr1\t120103500\t120104100\t0.0156\t78\nchr1\t120106200\t120107100\t0.0156\t78\nchr1\t120110100\t120112800\t0.0942\t73\nchr1\t120117300\t120117600\t0.5594\t59\nchr1\t120118800\t120120900\t0.2222\t59\nchr1\t120122700\t120123000\t0.5771\t55\nchr1\t120125100\t120127500\t0\t70\nchr1\t120131700\t120132000\t0.4508\t60\nchr1\t120138000\t120139500\t0.307\t77\nchr1\t120152100\t120152400\t0.2637\t68\nchr1\t120154500\t120156600\t0.2637\t68\nchr1\t120158400\t120159000\t0.0749\t57\nchr1\t120162000\t120162600\t0.1222\t74\nchr1\t120164100\t120164400\t0.184\t49\nchr1\t120169500\t120170100\t0\t88\nchr1\t120171300\t120175500\t0\t88\nchr1\t120180300\t120180600\t0.4179\t65\nchr1\t120181800\t120182400\t0.0917\t71\nchr1\t120183900\t120189600\t0\t108\nchr1\t120192000\t120198600\t0\t108\nchr1\t120199800\t120218100\t0\t108\nchr1\t120220200\t120321900\t0\t96\nchr1\t120323400\t120345600\t0\t96\nchr1\t120346800\t120365100\t0\t71\nchr1\t120366900\t120367200\t0.4071\t50\nchr1\t120368400\t120369000\t0.0155\t68\nchr1\t120370800\t120373800\t0.0155\t68\nchr1\t120375300\t120377700\t0.0155\t68\nchr1\t120380700\t120383400\t0.0043\t76\nchr1\t120384600\t120392700\t0.0043\t76\nchr1\t120394200\t120408900\t0.0043\t76\nchr1\t120410700\t120414300\t0\t77\nchr1\t120416100\t120418500\t0.1528\t55\nchr1\t120419700\t120420300\t0.044\t77\nchr1\t120421500\t120421800\t0.044\t77\nchr1\t120423600\t120427800\t0.044\t77\nchr1\t120429600\t120430500\t0.245\t93\nchr1\t120432000\t120432900\t0.245\t93\nchr1\t120434700\t120435600\t0\t114\nchr1\t120436800\t120449400\t0\t114\nchr1\t120450900\t120453900\t0\t101\nchr1\t120455400\t120455700\t0\t101\nchr1\t120456900\t120459600\t0\t101\nchr1\t120461100\t120472200\t0\t155\nchr1\t120474300\t120474900\t0.5486\t61\nchr1\t120478800\t120479400\t0.1279\t56\nchr1\t120483000\t120483900\t0.3342\t67\nchr1\t120490800\t120491100\t0.4503\t53\nchr1\t120493800\t120497400\t0.1489\t76\nchr1\t120499200\t120500700\t0.0006\t86\nchr1\t120501900\t120511200\t0.0006\t86\nchr1\t120512700\t120521100\t0\t80\nchr1\t120522900\t120525300\t0.2087\t69\nchr1\t120526800\t120534000\t0.0004\t75\nchr1\t120536100\t120539100\t0\t105\nchr1\t120540600\t120542700\t0\t105\nchr1\t120544500\t120551100\t0\t105\nchr1\t120552900\t120554400\t0\t105\nchr1\t120555600\t120556200\t0\t105\nchr1\t120557400\t120558300\t0\t105\nchr1\t120559500\t120560700\t0\t105\nchr1\t120563400\t120572400\t0\t105\nchr1\t120574500\t120591300\t0\t105\nchr1\t120592500\t120670800\t0\t105\nchr1\t120672000\t120678900\t0\t90\nchr1\t120680100\t120705300\t0\t90\nchr1\t120706800\t120723000\t0\t89\nchr1\t120724800\t120729600\t0\t89\nchr1\t120730800\t120753900\t0\t89\nchr1\t120755100\t120783600\t0\t89\nchr1\t120785400\t120792600\t0\t73\nchr1\t120793800\t120804300\t0\t73\nchr1\t120807600\t120809100\t0.2187\t166\nchr1\t120812100\t120818400\t0\t326\nchr1\t120819900\t120821700\t0\t326\nchr1\t120823800\t120843600\t0\t326\nchr1\t120845100\t120846900\t0.0282\t67\nchr1\t120848700\t120849000\t0.0282\t67\nchr1\t120852000\t120852300\t0.1357\t63\nchr1\t120853500\t120854700\t0.1357\t63\nchr1\t120855900\t120856800\t0.4699\t51\nchr1\t120858300\t120858900\t0.0196\t76\nchr1\t120860100\t120875100\t0.0196\t76\nchr1\t120876300\t120878100\t0.0196\t76\nchr1\t120885900\t120887400\t0.0421\t50\nchr1\t120890100\t120891600\t0.0071\t71\nchr1\t120892800\t120893100\t0.3773\t27\nchr1\t120894300\t120896100\t0.035\t59\nchr1\t120899100\t120900300\t0.2933\t62\nchr1\t120911700\t120920100\t0\t92\nchr1\t120922800\t120934800\t0\t94\nchr1\t120936000\t120938700\t0.208\t87\nchr1\t120940500\t120940800\t0.208\t87\nchr1\t120942900\t120944100\t0.2953\t68\nchr1\t120945900\t120946500\t0.0478\t60\nchr1\t120948900\t120949200\t0.0849\t60\nchr1\t120951000\t120951900\t0.4761\t58\nchr1\t120959400\t120959700\t0.6026\t30\nchr1\t120961500\t120962100\t0.3906\t63\nchr1\t120964200\t120967200\t0.0662\t55\nchr1\t120971400\t120972900\t0.1568\t68\nchr1\t120974400\t120975000\t0.1568\t68\nchr1\t120981300\t120981600\t0.5035\t72\nchr1\t120983400\t121005300\t0.0034\t77\nchr1\t121010100\t121017300\t0\t91\nchr1\t121019400\t121020600\t0\t91\nchr1\t121022100\t121027800\t0\t91\nchr1\t121029000\t121032300\t0.0648\t78\nchr1\t121036500\t121038000\t0.0458\t65\nchr1\t121040100\t121041300\t0.2382\t72\nchr1\t121042500\t121044600\t0.2382\t72\nchr1\t121046100\t121046400\t0.3535\t42\nchr1\t121049100\t121049400\t0.1196\t78\nchr1\t121058700\t121061700\t0.0023\t92\nchr1\t121062900\t121066200\t0.0023\t92\nchr1\t121067400\t121079100\t0.0023\t92\nchr1\t121082700\t121084800\t0.0916\t65\nchr1\t121086600\t121086900\t0.0916\t65\nchr1\t121088100\t121089900\t0\t57\nchr1\t121092000\t121092600\t0.047\t62\nchr1\t121095900\t121096800\t0.2753\t69\nchr1\t121099200\t121104300\t0.0352\t63\nchr1\t121107600\t121116600\t0.0006\t83\nchr1\t121119600\t121119900\t0.4169\t61\nchr1\t121122600\t121125900\t0\t88\nchr1\t121128300\t121129200\t0\t88\nchr1\t121130400\t121131600\t0\t88\nchr1\t121133700\t121136100\t0\t88\nchr1\t121138200\t121159200\t0\t88\nchr1\t121160400\t121160700\t0\t88\nchr1\t121161900\t121162500\t0\t88\nchr1\t121164600\t121174200\t0\t88\nchr1\t121175400\t121191000\t0\t68\nchr1\t121192800\t121201500\t0\t73\nchr1\t121202700\t121206900\t0\t73\nchr1\t121209000\t121221300\t0\t79\nchr1\t121223100\t121238100\t0\t85\nchr1\t121239300\t121254600\t0\t85\nchr1\t121255800\t121262700\t0\t85\nchr1\t121264200\t121295100\t0\t85\nchr1\t121296300\t121314300\t0\t107\nchr1\t121315500\t121366500\t0\t131\nchr1\t121367700\t121377900\t0\t131\nchr1\t121379400\t121394100\t0\t131\nchr1\t121395900\t121396200\t0\t131\nchr1\t121397700\t121398600\t0\t131\nchr1\t121402500\t121403700\t0.3974\t90\nchr1\t121532400\t121538100\t0\t125\nchr1\t121604400\t121615800\t0\t46\nchr1\t121619400\t121685700\t0\t426\nchr1\t121687500\t121689000\t0\t426\nchr1\t121692600\t121692900\t0.1119\t53\nchr1\t121694700\t121698900\t0\t55\nchr1\t121700100\t121700700\t0\t55\nchr1\t121701900\t121710000\t0\t62\nchr1\t121711200\t121718100\t0\t61\nchr1\t121719300\t121722000\t0\t26\nchr1\t121724400\t121727400\t0\t27\nchr1\t121731000\t121735800\t0\t129\nchr1\t121737000\t121737600\t0\t129\nchr1\t121738800\t121739400\t0\t129\nchr1\t121740900\t121756800\t0\t2648\nchr1\t121758000\t121758300\t0.0599\t16\nchr1\t121760400\t121788000\t0\t3380\nchr1\t121790100\t121791600\t0\t131\nchr1\t121793400\t121796400\t0\t131\nchr1\t121797600\t121798200\t0\t130\nchr1\t121799400\t121804800\t0\t130\nchr1\t121806000\t121806300\t0\t207\nchr1\t121808400\t121809900\t0\t207\nchr1\t121811100\t121843200\t0\t207\nchr1\t121845000\t121846800\t0\t207\nchr1\t121848300\t121863000\t0\t128\nchr1\t121865100\t121869300\t0\t74\nchr1\t121870500\t121879500\t0\t160\nchr1\t121880700\t121882200\t0\t160\nchr1\t121883700\t121885200\t0\t101\nchr1\t121886400\t121893000\t0\t297\nchr1\t121894500\t121898100\t0\t81\nchr1\t121899600\t121901100\t0\t25\nchr1\t121903500\t121909200\t0\t142\nchr1\t121911600\t121911900\t0\t15\nchr1\t121914300\t121924200\t0\t144\nchr1\t121925400\t121929900\t0\t102\nchr1\t121931700\t121932000\t0\t13\nchr1\t121938300\t121939500\t0.3254\t46\nchr1\t121940700\t121942800\t0\t66\nchr1\t121944600\t121946100\t0\t31\nchr1\t121948500\t121950000\t0\t95\nchr1\t121951800\t121952700\t0\t34\nchr1\t121953900\t121957800\t0\t40\nchr1\t121959300\t121965300\t0\t84\nchr1\t121966800\t121968900\t0\t42\nchr1\t121970100\t121973100\t0\t404\nchr1\t122026800\t122027100\t0\t13\nchr1\t122032800\t122047200\t0\t106\nchr1\t122050500\t122050800\t0\t197\nchr1\t122053500\t122055000\t0\t197\nchr1\t122056200\t122056800\t0\t35\nchr1\t122058600\t122063700\t0\t60\nchr1\t122064900\t122070600\t0\t415\nchr1\t122073000\t122085600\t0\t116\nchr1\t122087400\t122089500\t0\t130\nchr1\t122090700\t122098800\t0\t130\nchr1\t122101500\t122102100\t0.1373\t20\nchr1\t122105100\t122109000\t0\t97\nchr1\t122111400\t122124300\t0\t104\nchr1\t122126100\t122133300\t0\t658\nchr1\t122134500\t122141700\t0\t150\nchr1\t122143800\t122159700\t0\t118\nchr1\t122161800\t122169600\t0\t412\nchr1\t122172000\t122175000\t0\t412\nchr1\t122176200\t122176800\t0\t412\nchr1\t122178000\t122184300\t0\t412\nchr1\t122185800\t122186400\t0\t412\nchr1\t122187600\t122189100\t0\t22\nchr1\t122191200\t122195400\t0\t82\nchr1\t122196600\t122203200\t0\t111\nchr1\t122204400\t122204700\t0\t111\nchr1\t122207100\t122209500\t0\t111\nchr1\t122211000\t122214900\t0\t111\nchr1\t122216700\t122219100\t0\t37\nchr1\t122222100\t122222700\t0.3979\t165\nchr1\t122224200\t122225400\t0\t200\nchr1\t122226600\t122236500\t0\t200\nchr1\t122238000\t122449800\t0\t3359\nchr1\t122452200\t122495700\t0\t3359\nchr1\t122497500\t122555100\t0\t3359\nchr1\t122556300\t122573700\t0\t3359\nchr1\t122575200\t122655000\t0\t2578\nchr1\t122656500\t122658900\t0\t2578\nchr1\t122660100\t122712600\t0\t1708\nchr1\t122713800\t122739900\t0\t2814\nchr1\t122741100\t122874900\t0\t3523\nchr1\t122876700\t122921100\t0\t3575\nchr1\t122922900\t123066300\t0\t5163\nchr1\t123067800\t123228000\t0\t5163\nchr1\t123229500\t123237900\t0\t1045\nchr1\t123239100\t123373200\t0\t2092\nchr1\t123374700\t123537900\t0\t4862\nchr1\t123539100\t123622200\t0\t3931\nchr1\t123623400\t123644100\t0\t3931\nchr1\t123645300\t123652800\t0\t1009\nchr1\t123655200\t123675900\t0\t5424\nchr1\t123677100\t123726600\t0\t5424\nchr1\t123727800\t123756900\t0\t5424\nchr1\t123758400\t123801600\t0\t6466\nchr1\t123803400\t123920100\t0\t5034\nchr1\t123921300\t123963600\t0\t5034\nchr1\t123964800\t124045200\t0\t5034\nchr1\t124046400\t124085700\t0\t5034\nchr1\t124087200\t124111200\t0\t2235\nchr1\t124112400\t124138200\t0\t2235\nchr1\t124139400\t124142400\t0\t2235\nchr1\t124143600\t124231800\t0\t8877\nchr1\t124233000\t124468200\t0\t8877\nchr1\t124469400\t124779300\t0\t8877\nchr1\t124780800\t124788900\t0\t2430\nchr1\t124791900\t124792200\t0.2937\t12\nchr1\t124793400\t124801800\t0\t170\nchr1\t124803600\t124806300\t0\t788\nchr1\t124807500\t124820100\t0\t672\nchr1\t124821600\t124834800\t0\t672\nchr1\t124836000\t124848900\t0\t672\nchr1\t124850100\t124898400\t0\t672\nchr1\t124899900\t124914600\t0\t515\nchr1\t124915800\t124928700\t0\t672\nchr1\t124929900\t124940700\t0\t212\nchr1\t125019000\t125019300\t0.4042\t66\nchr1\t125029800\t125030100\t0.6727\t118\nchr1\t125032200\t125032500\t0.6702\t81\nchr1\t125034600\t125034900\t0.6459\t102\nchr1\t125070300\t125070600\t0.6686\t182\nchr1\t125071800\t125072100\t0.6874\t132\nchr1\t125094000\t125094300\t0.6105\t50\nchr1\t125099700\t125100000\t0.4539\t43\nchr1\t125102700\t125103300\t0.0666\t68\nchr1\t125105400\t125106000\t0.556\t189\nchr1\t125113800\t125116200\t0.2726\t273\nchr1\t125117400\t125118300\t0.5081\t172\nchr1\t125127300\t125127600\t0.5745\t120\nchr1\t125139000\t125139300\t0.2741\t106\nchr1\t125140800\t125141100\t0.6037\t69\nchr1\t125166900\t125168100\t0.3706\t2420\nchr1\t125169600\t125169900\t0.5701\t182\nchr1\t125171100\t125171400\t0.0748\t228\nchr1\t125173500\t125184000\t0.0222\t36986\nchr1\t143184600\t143208600\t0\t30628\nchr1\t143210700\t143276100\t0\t36167\nchr1\t143278800\t143280600\t0.2277\t76\nchr1\t143282700\t143286900\t0\t146\nchr1\t143288700\t143310000\t0\t146\nchr1\t143312100\t143472300\t0\t177\nchr1\t143473500\t143496600\t0\t177\nchr1\t143499300\t143502000\t0.0072\t127\nchr1\t143503800\t143504100\t0\t128\nchr1\t143505600\t143530200\t0\t128\nchr1\t143531400\t143535300\t0\t128\nchr1\t143558400\t143562600\t0.1717\t97\nchr1\t143637600\t143639400\t0.1444\t78\nchr1\t143703600\t143704200\t0.1677\t66\nchr1\t143728200\t143730600\t0.0254\t67\nchr1\t143737800\t143739300\t0.0001\t79\nchr1\t143740500\t143741700\t0.0001\t79\nchr1\t143744100\t143744700\t0.3958\t55\nchr1\t143752500\t143752800\t0.2685\t81\nchr1\t143766900\t143774700\t0\t70\nchr1\t143775900\t143803800\t0\t92\nchr1\t143805300\t143830200\t0\t88\nchr1\t143833800\t143835300\t0\t88\nchr1\t143840100\t143840400\t0.4469\t61\nchr1\t143842200\t143842800\t0.1864\t64\nchr1\t143846700\t143847900\t0\t60\nchr1\t143853600\t143856300\t0.0317\t71\nchr1\t143858700\t143861700\t0.0014\t73\nchr1\t143863200\t143863800\t0.0014\t73\nchr1\t143865000\t143866500\t0.0014\t73\nchr1\t143868000\t143868300\t0.0014\t73\nchr1\t143869500\t143872800\t0.0014\t73\nchr1\t143874900\t143876100\t0\t73\nchr1\t143879400\t143880300\t0.1272\t74\nchr1\t143883300\t143883600\t0.4132\t56\nchr1\t143886300\t143888100\t0.0303\t66\nchr1\t143889300\t143889600\t0.0015\t72\nchr1\t143891100\t143892900\t0.0015\t72\nchr1\t143895000\t143895600\t0.0015\t72\nchr1\t143896800\t143898300\t0.0015\t72\nchr1\t143899800\t143905200\t0.0015\t72\nchr1\t143907000\t143907300\t0.1857\t85\nchr1\t143910000\t143910300\t0.0016\t80\nchr1\t143915700\t143917500\t0.0016\t80\nchr1\t143919000\t143919300\t0.0016\t80\nchr1\t143921400\t143922600\t0.0016\t80\nchr1\t143923800\t143926800\t0.0016\t80\nchr1\t143929500\t143934900\t0.0044\t80\nchr1\t143938800\t143986200\t0\t83\nchr1\t143988000\t144076500\t0\t101\nchr1\t144078300\t144101400\t0\t107\nchr1\t144102600\t144103200\t0.1806\t316\nchr1\t144104700\t144403500\t0\t423\nchr1\t144406200\t144407400\t0\t423\nchr1\t144408600\t144411600\t0.025\t84\nchr1\t144414600\t144414900\t0\t77\nchr1\t144416400\t144418800\t0\t77\nchr1\t144420300\t144422700\t0\t77\nchr1\t144424500\t144427500\t0.0884\t114\nchr1\t144429600\t144432000\t0.0884\t114\nchr1\t144433500\t144433800\t0.0884\t114\nchr1\t144435600\t144436200\t0.3835\t104\nchr1\t144441300\t144441600\t0.574\t46\nchr1\t144446700\t144447000\t0.0401\t88\nchr1\t144448500\t144450300\t0.0401\t88\nchr1\t144452400\t144454800\t0.2519\t65\nchr1\t144456600\t144456900\t0.5615\t56\nchr1\t144458400\t144458700\t0.3437\t49\nchr1\t144459900\t144460500\t0.1037\t62\nchr1\t144462900\t144463200\t0.1037\t62\nchr1\t144465600\t144467100\t0.0778\t74\nchr1\t144468600\t144469800\t0.0778\t74\nchr1\t144471000\t144471300\t0.0778\t74\nchr1\t144473100\t144475500\t0\t98\nchr1\t144477600\t144483300\t0\t98\nchr1\t144484800\t144490500\t0\t98\nchr1\t144493500\t144493800\t0\t98\nchr1\t144495600\t144495900\t0\t98\nchr1\t144497700\t144498300\t0\t98\nchr1\t144500100\t144503700\t0.0077\t74\nchr1\t144505200\t144510300\t0.0077\t74\nchr1\t144511800\t144513000\t0.1719\t73\nchr1\t144514200\t144514500\t0.1719\t73\nchr1\t144516000\t144516900\t0.1719\t73\nchr1\t144519000\t144527100\t0.01\t75\nchr1\t144528300\t144528600\t0.01\t75\nchr1\t144530100\t144530400\t0.01\t75\nchr1\t144534600\t144535800\t0.1094\t59\nchr1\t144537000\t144538500\t0.0797\t59\nchr1\t144540900\t144541800\t0.2766\t66\nchr1\t144544200\t144544500\t0.2766\t66\nchr1\t144549300\t144549600\t0.1754\t54\nchr1\t144557400\t144561900\t0.0426\t67\nchr1\t144568200\t144570600\t0.001\t61\nchr1\t144572100\t144882600\t0\t174\nchr1\t144884100\t144904800\t0\t94\nchr1\t144906600\t144911400\t0\t94\nchr1\t144912600\t144919800\t0\t94\nchr1\t144921300\t144924600\t0\t94\nchr1\t144925800\t144930600\t0\t94\nchr1\t144931800\t144943800\t0\t94\nchr1\t144945000\t144951600\t0\t115\nchr1\t144952800\t144954300\t0\t115\nchr1\t144955500\t144965700\t0\t115\nchr1\t144966900\t144970500\t0\t115\nchr1\t144972000\t144974400\t0\t115\nchr1\t144976200\t144983700\t0\t115\nchr1\t144984900\t144998400\t0\t105\nchr1\t144999600\t145005900\t0\t105\nchr1\t145007700\t145012800\t0\t105\nchr1\t145014000\t145064100\t0\t105\nchr1\t145065300\t145079700\t0\t105\nchr1\t145081800\t145128900\t0\t96\nchr1\t145130700\t145139100\t0\t85\nchr1\t145140900\t145155900\t0\t85\nchr1\t145157400\t145167900\t0\t85\nchr1\t145169700\t145171800\t0\t85\nchr1\t145173300\t145188000\t0\t85\nchr1\t145190400\t145190700\t0.2149\t67\nchr1\t145191900\t145193100\t0.2149\t67\nchr1\t145195500\t145203600\t0\t107\nchr1\t145204800\t145217400\t0\t107\nchr1\t145219500\t145222200\t0\t107\nchr1\t145223700\t145224900\t0\t107\nchr1\t145226100\t145228200\t0.0838\t78\nchr1\t145229400\t145232100\t0.0838\t78\nchr1\t145233300\t145237200\t0\t86\nchr1\t145239600\t145248600\t0\t86\nchr1\t145250100\t145254900\t0\t86\nchr1\t145256400\t145258500\t0\t86\nchr1\t145259700\t145260900\t0\t81\nchr1\t145262100\t145280100\t0\t81\nchr1\t145283100\t145283700\t0.0278\t63\nchr1\t145284900\t145287000\t0.0278\t63\nchr1\t145288800\t145291200\t0.0278\t63\nchr1\t145292400\t145393200\t0\t325\nchr1\t145395000\t145397100\t0\t325\nchr1\t145398900\t145399800\t0.2142\t53\nchr1\t145401000\t145402200\t0.0593\t98\nchr1\t145405500\t145407300\t0.1795\t70\nchr1\t145408800\t145409700\t0\t81\nchr1\t145411800\t145414800\t0\t81\nchr1\t145416000\t145419000\t0\t81\nchr1\t145420500\t145421100\t0\t81\nchr1\t145422300\t145424400\t0\t81\nchr1\t145431000\t145431300\t0.49\t71\nchr1\t145433100\t145433700\t0.163\t77\nchr1\t145437300\t145437600\t0.3207\t61\nchr1\t145438800\t145442100\t0.0222\t69\nchr1\t145443300\t145445100\t0.0222\t69\nchr1\t145446600\t145447800\t0.1832\t67\nchr1\t145449000\t145452600\t0.0808\t72\nchr1\t145456200\t145460100\t0\t73\nchr1\t145462500\t145468200\t0.147\t71\nchr1\t145469400\t145470300\t0.2172\t72\nchr1\t145472400\t145472700\t0.2172\t72\nchr1\t145477500\t145482300\t0\t93\nchr1\t145483500\t145484100\t0\t93\nchr1\t145486500\t145486800\t0\t93\nchr1\t145488300\t145488900\t0\t93\nchr1\t145490400\t145511700\t0\t93\nchr1\t145513200\t145515600\t0\t93\nchr1\t145521600\t145522800\t0\t68\nchr1\t145527300\t145527600\t0.0329\t71\nchr1\t145531200\t145531500\t0.2748\t66\nchr1\t145533900\t145534200\t0.4552\t64\nchr1\t145536000\t145536300\t0.4375\t52\nchr1\t145540500\t145541100\t0.0182\t66\nchr1\t145546500\t145548600\t0\t64\nchr1\t145550100\t145551300\t0\t64\nchr1\t145568400\t145569000\t0.36\t66\nchr1\t145572600\t145573500\t0.0852\t83\nchr1\t145575600\t145575900\t0.4914\t150\nchr1\t145577700\t145578900\t0.2567\t133\nchr1\t145581600\t145582200\t0.033\t79\nchr1\t145584600\t145585200\t0.1095\t78\nchr1\t145589700\t145590300\t0.1279\t90\nchr1\t145607400\t145607700\t0.5947\t61\nchr1\t145617900\t145618800\t0.0216\t56\nchr1\t145620300\t145620600\t0.04\t63\nchr1\t145622100\t145622700\t0.04\t63\nchr1\t145623900\t145625100\t0.04\t63\nchr1\t145627800\t145628700\t0.0039\t70\nchr1\t145630200\t145633800\t0.0039\t70\nchr1\t145637100\t145637400\t0.33\t54\nchr1\t145640100\t145640700\t0.2362\t49\nchr1\t145641900\t145642200\t0.4552\t61\nchr1\t145643700\t145644300\t0.0306\t77\nchr1\t145646100\t145646400\t0.0306\t77\nchr1\t145647900\t145648200\t0.3352\t34\nchr1\t145651500\t145653900\t0.107\t77\nchr1\t145657500\t145659900\t0.1219\t74\nchr1\t145661100\t145661700\t0.1219\t74\nchr1\t145663800\t145666500\t0.3281\t60\nchr1\t145669200\t145671000\t0.2005\t71\nchr1\t145672200\t145674000\t0.2005\t71\nchr1\t145675200\t145675500\t0.2589\t70\nchr1\t145677900\t145678800\t0.0067\t55\nchr1\t145680900\t145682400\t0.0805\t69\nchr1\t145684500\t145685100\t0.5182\t68\nchr1\t145809600\t145812000\t0.0086\t53\nchr1\t145813800\t145814100\t0.0086\t53\nchr1\t145815600\t145819200\t0.0075\t72\nchr1\t145820700\t145823400\t0.0075\t72\nchr1\t145924800\t145925400\t0.1376\t56\nchr1\t146054700\t146055000\t0.4078\t65\nchr1\t146057400\t146057700\t0.5137\t103\nchr1\t146059500\t146141700\t0\t219\nchr1\t146142900\t146185200\t0\t219\nchr1\t146186400\t146324100\t0\t219\nchr1\t146326800\t146327400\t0.0992\t78\nchr1\t146329800\t146335200\t0\t72\nchr1\t146337000\t146358300\t0\t94\nchr1\t146359500\t146362200\t0\t94\nchr1\t146363400\t146365200\t0\t94\nchr1\t146367300\t146367600\t0\t94\nchr1\t146369100\t146369700\t0\t94\nchr1\t146376000\t146376300\t0.3228\t63\nchr1\t146379300\t146380200\t0.3143\t50\nchr1\t146389500\t146389800\t0.4029\t43\nchr1\t146391900\t146393100\t0.1956\t67\nchr1\t146395500\t146397000\t0.176\t62\nchr1\t146398200\t146399100\t0.176\t62\nchr1\t146402700\t146408400\t0.0445\t83\nchr1\t146410800\t146411100\t0.0445\t83\nchr1\t146414100\t146414700\t0.0188\t96\nchr1\t146416200\t146427600\t0.0188\t96\nchr1\t146428800\t146430600\t0.0188\t96\nchr1\t146431800\t146432100\t0\t88\nchr1\t146433300\t146449500\t0\t88\nchr1\t146451000\t146456700\t0\t99\nchr1\t146458200\t146462100\t0\t99\nchr1\t146463600\t146465700\t0\t99\nchr1\t146467200\t146468700\t0\t99\nchr1\t146476200\t146476800\t0.329\t81\nchr1\t146479800\t146483400\t0.0831\t77\nchr1\t146484600\t146486100\t0.0831\t77\nchr1\t146487300\t146490300\t0\t83\nchr1\t146491500\t146498400\t0\t83\nchr1\t146501100\t146501400\t0\t83\nchr1\t146502600\t146505000\t0\t83\nchr1\t146506500\t146534100\t0\t83\nchr1\t146535300\t146540700\t0\t83\nchr1\t146542500\t146546100\t0\t83\nchr1\t146547300\t146547600\t0.0006\t71\nchr1\t146548800\t146552400\t0.0006\t71\nchr1\t146553900\t146556000\t0.0006\t71\nchr1\t146559900\t146560200\t0.4525\t48\nchr1\t146562000\t146564700\t0\t54\nchr1\t146565900\t146569200\t0.0033\t68\nchr1\t146570400\t146571300\t0.0033\t68\nchr1\t146572500\t146575800\t0.3621\t76\nchr1\t146578200\t146580300\t0.0192\t72\nchr1\t146581500\t146582100\t0.0192\t72\nchr1\t146583300\t146583600\t0.0192\t72\nchr1\t146585700\t146593800\t0.0848\t73\nchr1\t146597400\t146602200\t0.0795\t74\nchr1\t146604000\t146607600\t0.0207\t69\nchr1\t146609400\t146612400\t0.0055\t74\nchr1\t146614800\t146616000\t0.0055\t74\nchr1\t146617200\t146617500\t0.0055\t74\nchr1\t146618700\t146621100\t0\t76\nchr1\t146623200\t146628000\t0\t76\nchr1\t146632500\t146634600\t0.0184\t72\nchr1\t146635800\t146636100\t0.0184\t72\nchr1\t146637900\t146638200\t0.1853\t80\nchr1\t146639700\t146640300\t0.1853\t80\nchr1\t146646600\t146646900\t0.3689\t57\nchr1\t146649600\t146650500\t0.3733\t71\nchr1\t146652300\t146654100\t0.029\t86\nchr1\t146655300\t146656200\t0.029\t86\nchr1\t146659800\t146661300\t0.29\t59\nchr1\t146663100\t146663400\t0.29\t59\nchr1\t146664600\t146667000\t0.0097\t70\nchr1\t146670000\t146670600\t0.4479\t62\nchr1\t146674200\t146676000\t0.1243\t63\nchr1\t146677800\t146678400\t0.0547\t68\nchr1\t146681100\t146681700\t0.0547\t68\nchr1\t146682900\t146683200\t0.0547\t68\nchr1\t146684400\t146688000\t0.0119\t64\nchr1\t146691300\t146695500\t0.0772\t71\nchr1\t146697300\t146697900\t0.0772\t71\nchr1\t146699100\t146699400\t0.0772\t71\nchr1\t146701200\t146703300\t0.2571\t75\nchr1\t146704800\t146705400\t0.3602\t71\nchr1\t146709900\t146710200\t0\t97\nchr1\t146711400\t146711700\t0\t97\nchr1\t146713800\t146715300\t0\t97\nchr1\t146717100\t146723700\t0\t97\nchr1\t146725500\t146725800\t0.356\t56\nchr1\t146728800\t146731500\t0\t73\nchr1\t146733900\t146734500\t0.1305\t62\nchr1\t146737200\t146737500\t0.4759\t54\nchr1\t146739900\t146740200\t0.0276\t73\nchr1\t146741400\t146745300\t0.0276\t73\nchr1\t146747100\t146747700\t0.0523\t56\nchr1\t146748900\t146749500\t0.0431\t79\nchr1\t146750700\t146751000\t0.0431\t79\nchr1\t146753700\t146754900\t0.0431\t79\nchr1\t146758500\t146759700\t0.029\t68\nchr1\t146763000\t146765700\t0.0019\t65\nchr1\t146768100\t146771400\t0.1652\t82\nchr1\t146774100\t146775600\t0.2627\t64\nchr1\t146778900\t146780400\t0.0045\t83\nchr1\t146785500\t146792100\t0.006\t71\nchr1\t146794800\t146797800\t0.0102\t74\nchr1\t146799300\t146804700\t0.0291\t66\nchr1\t146807700\t146808000\t0.0291\t66\nchr1\t146811300\t146812800\t0.06\t76\nchr1\t146814300\t146816400\t0.06\t76\nchr1\t146818500\t146818800\t0.06\t76\nchr1\t146820000\t146821200\t0.3601\t66\nchr1\t146823600\t146824200\t0.0111\t79\nchr1\t146825700\t146826600\t0.0111\t79\nchr1\t146829000\t146831400\t0.0111\t79\nchr1\t146835300\t146835900\t0.0111\t79\nchr1\t146837100\t146837400\t0.3922\t57\nchr1\t146838900\t146839200\t0.0061\t84\nchr1\t146840700\t146842800\t0.0061\t84\nchr1\t146844600\t146846700\t0.0061\t84\nchr1\t146850900\t146851200\t0.1772\t38\nchr1\t146852700\t146855100\t0.0375\t73\nchr1\t146856600\t146857200\t0.1592\t57\nchr1\t146858400\t146863200\t0.0559\t70\nchr1\t146865600\t146872200\t0\t121\nchr1\t146875200\t146876700\t0.0883\t68\nchr1\t146879700\t146880000\t0.0087\t90\nchr1\t146881500\t146890200\t0.0087\t90\nchr1\t146891400\t146892600\t0.0087\t90\nchr1\t146895600\t146895900\t0.154\t72\nchr1\t146897400\t146898900\t0.154\t72\nchr1\t146900400\t146903100\t0.154\t72\nchr1\t146904900\t146905500\t0.1882\t70\nchr1\t146908200\t146909400\t0\t74\nchr1\t146913900\t146914800\t0.0586\t57\nchr1\t146916000\t146923800\t0\t75\nchr1\t146925000\t146925600\t0\t75\nchr1\t146928000\t146934000\t0.0414\t74\nchr1\t146937300\t146937600\t0.2018\t75\nchr1\t146949300\t146949600\t0.1166\t41\nchr1\t146951400\t146953800\t0\t88\nchr1\t146955000\t146955600\t0\t88\nchr1\t146956800\t146960400\t0\t88\nchr1\t146967900\t146968500\t0.2568\t86\nchr1\t146973300\t146977200\t0\t592\nchr1\t146978700\t146982000\t0\t592\nchr1\t146983200\t146998800\t0\t592\nchr1\t147000000\t147000300\t0\t592\nchr1\t147003300\t147003600\t0.1763\t48\nchr1\t147015300\t147015900\t0.0178\t58\nchr1\t147017700\t147020100\t0.3214\t68\nchr1\t147067800\t147068100\t0.2507\t63\nchr1\t147230100\t147230400\t0.456\t38\nchr1\t147322200\t147322500\t0.461\t74\nchr1\t147325500\t147325800\t0.4878\t74\nchr1\t147360300\t147360600\t0.5022\t71\nchr1\t147424200\t147424500\t0.3254\t62\nchr1\t147425700\t147426300\t0.283\t89\nchr1\t147927900\t147929400\t0.4278\t63\nchr1\t147938700\t147939300\t0.1908\t67\nchr1\t147940800\t147941100\t0.1402\t73\nchr1\t147942600\t147943200\t0.1402\t73\nchr1\t147944400\t147945300\t0.1402\t73\nchr1\t147948300\t147948600\t0.371\t56\nchr1\t147952800\t147954600\t0.0072\t67\nchr1\t147955800\t147956400\t0.0111\t56\nchr1\t147960600\t147961200\t0.362\t67\nchr1\t147963000\t147963300\t0.3778\t47\nchr1\t147964500\t147964800\t0.6008\t62\nchr1\t147966300\t147967200\t0.0044\t62\nchr1\t147969000\t147969300\t0.4338\t55\nchr1\t147974100\t147976500\t0.2984\t69\nchr1\t147977700\t147978000\t0.2984\t69\nchr1\t147980100\t147982800\t0.2361\t69\nchr1\t147984000\t147984600\t0.2361\t69\nchr1\t147986700\t147989100\t0.3112\t64\nchr1\t147992100\t147993900\t0.2254\t72\nchr1\t147995100\t147996900\t0.2254\t72\nchr1\t147998100\t147998400\t0.0119\t78\nchr1\t148000800\t148001700\t0.0119\t78\nchr1\t148003800\t148005300\t0.0765\t68\nchr1\t148007400\t148008000\t0.4521\t65\nchr1\t148016100\t148016700\t0.0537\t67\nchr1\t148020000\t148020300\t0.0537\t67\nchr1\t148021800\t148024800\t0\t76\nchr1\t148026000\t148027500\t0\t76\nchr1\t148029300\t148034100\t0\t76\nchr1\t148035600\t148035900\t0\t76\nchr1\t148038000\t148041300\t0\t76\nchr1\t148042500\t148043400\t0\t76\nchr1\t148045200\t148045800\t0\t76\nchr1\t148047000\t148047300\t0\t76\nchr1\t148050300\t148054200\t0.0623\t75\nchr1\t148056000\t148057200\t0\t86\nchr1\t148059300\t148059900\t0\t86\nchr1\t148061400\t148062000\t0\t86\nchr1\t148063500\t148084800\t0\t86\nchr1\t148087500\t148088700\t0.0148\t60\nchr1\t148093200\t148098300\t0.0414\t79\nchr1\t148099500\t148108200\t0.022\t361\nchr1\t148109700\t148110900\t0.022\t361\nchr1\t148112400\t148114800\t0.0149\t87\nchr1\t148116300\t148119300\t0.0149\t87\nchr1\t148121700\t148122000\t0.6054\t81\nchr1\t148123800\t148124100\t0.4619\t87\nchr1\t148126800\t148130400\t0.0047\t64\nchr1\t148131600\t148135800\t0.0182\t69\nchr1\t148137600\t148137900\t0.1425\t56\nchr1\t148139400\t148139700\t0.1425\t56\nchr1\t148144200\t148144500\t0.3293\t87\nchr1\t148152900\t148153500\t0.2353\t66\nchr1\t148156500\t148158000\t0.1456\t68\nchr1\t148167900\t148171800\t0.1117\t71\nchr1\t148173900\t148174800\t0\t75\nchr1\t148176000\t148186200\t0\t75\nchr1\t148187700\t148188900\t0\t68\nchr1\t148192200\t148198200\t0\t88\nchr1\t148200000\t148227000\t0\t88\nchr1\t148229400\t148230600\t0.3756\t84\nchr1\t148235700\t148245900\t0\t96\nchr1\t148247400\t148248600\t0\t96\nchr1\t148250100\t148253700\t0\t96\nchr1\t148256700\t148257900\t0.0851\t71\nchr1\t148280700\t148285800\t0.0041\t90\nchr1\t148298400\t148303500\t0.0017\t89\nchr1\t148395900\t148396500\t0.3929\t64\nchr1\t148412700\t148413000\t0.4347\t88\nchr1\t148419300\t148419600\t0.0753\t69\nchr1\t148440600\t148452600\t0\t91\nchr1\t148454100\t148458300\t0\t91\nchr1\t148460100\t148464900\t0\t92\nchr1\t148467600\t148469100\t0\t92\nchr1\t148470300\t148476600\t0\t92\nchr1\t148478100\t148482900\t0\t92\nchr1\t148484400\t148500900\t0\t80\nchr1\t148502400\t148502700\t0\t80\nchr1\t148505400\t148509000\t0.0632\t72\nchr1\t148511100\t148512600\t0.0632\t72\nchr1\t148514100\t148514700\t0.5513\t70\nchr1\t148516200\t148517700\t0.0211\t78\nchr1\t148518900\t148521300\t0.0211\t78\nchr1\t148527300\t148528500\t0\t215\nchr1\t148529700\t148534200\t0\t215\nchr1\t148535400\t148586400\t0\t215\nchr1\t148587600\t148590900\t0\t215\nchr1\t148592100\t148592700\t0\t215\nchr1\t148594200\t148607700\t0\t97\nchr1\t148609200\t148636800\t0\t97\nchr1\t148638900\t148923300\t0\t110\nchr1\t148924500\t148929000\t0\t110\nchr1\t148930800\t148934100\t0\t110\nchr1\t148935300\t148936500\t0\t57\nchr1\t148938900\t148947600\t0.0033\t78\nchr1\t148949700\t148950000\t0.3861\t71\nchr1\t148951200\t148951500\t0.3861\t71\nchr1\t148952700\t148953000\t0.3861\t71\nchr1\t148956600\t148958100\t0\t81\nchr1\t148959600\t148960800\t0\t81\nchr1\t148962000\t148966200\t0\t81\nchr1\t148968300\t148970400\t0\t81\nchr1\t148971900\t148975500\t0\t81\nchr1\t148977000\t148977600\t0.0278\t60\nchr1\t148988100\t148989300\t0.0032\t68\nchr1\t148990500\t148991400\t0.0331\t90\nchr1\t148992900\t148995300\t0.0331\t90\nchr1\t148997100\t148997400\t0.2895\t60\nchr1\t148998900\t148999200\t0.1754\t64\nchr1\t149001300\t149005200\t0\t106\nchr1\t149006700\t149009400\t0\t106\nchr1\t149011200\t149017200\t0\t109\nchr1\t149018400\t149020500\t0\t109\nchr1\t149021700\t149028000\t0\t109\nchr1\t149030700\t149031300\t0.4879\t74\nchr1\t149042400\t149043000\t0.1815\t72\nchr1\t149047200\t149047500\t0.3605\t63\nchr1\t149049000\t149059200\t0\t178\nchr1\t149060400\t149067600\t0\t178\nchr1\t149069400\t149070000\t0\t178\nchr1\t149076900\t149080500\t0.1301\t94\nchr1\t149082300\t149084100\t0.1371\t85\nchr1\t149086200\t149086500\t0.0002\t89\nchr1\t149088900\t149097000\t0.0002\t89\nchr1\t149098500\t149100600\t0.2209\t71\nchr1\t149101800\t149102400\t0\t90\nchr1\t149104200\t149104800\t0\t90\nchr1\t149106900\t149110500\t0\t90\nchr1\t149112300\t149124600\t0\t90\nchr1\t149128200\t149130000\t0.0593\t75\nchr1\t149131200\t149143800\t0\t88\nchr1\t149145300\t149154000\t0\t88\nchr1\t149155200\t149157300\t0\t88\nchr1\t149159100\t149159400\t0\t88\nchr1\t149161500\t149171400\t0\t114\nchr1\t149174100\t149175900\t0\t114\nchr1\t149177100\t149181000\t0\t114\nchr1\t149182800\t149194500\t0\t114\nchr1\t149197800\t149199300\t0.0314\t89\nchr1\t149201100\t149202300\t0\t130\nchr1\t149203800\t149205900\t0\t130\nchr1\t149207100\t149305800\t0\t130\nchr1\t149307000\t149364600\t0\t130\nchr1\t149366700\t149382300\t0\t130\nchr1\t149383800\t149384400\t0\t130\nchr1\t149385600\t149385900\t0\t130\nchr1\t149387400\t149388300\t0\t130\nchr1\t149389800\t149392500\t0\t95\nchr1\t149393700\t149398200\t0\t95\nchr1\t149399400\t149408400\t0\t73\nchr1\t149409600\t149412600\t0\t73\nchr1\t149413800\t149418900\t0.0192\t65\nchr1\t149420100\t149423100\t0.0004\t74\nchr1\t149425500\t149448600\t0\t100\nchr1\t149449800\t149460300\t0\t100\nchr1\t149461800\t149470800\t0\t100\nchr1\t149472300\t149476800\t0\t94\nchr1\t149479500\t149486400\t0\t184\nchr1\t149487900\t149557500\t0\t184\nchr1\t149558700\t149559600\t0\t75\nchr1\t149560800\t149561400\t0\t75\nchr1\t149563500\t149585400\t0\t87\nchr1\t149587800\t149591700\t0\t87\nchr1\t149593200\t149598600\t0\t94\nchr1\t149599800\t149604900\t0\t94\nchr1\t149606700\t149618700\t0\t94\nchr1\t149619900\t149627400\t0\t94\nchr1\t149628600\t149628900\t0.2269\t79\nchr1\t149630100\t149630400\t0.2269\t79\nchr1\t149632200\t149632500\t0.2269\t79\nchr1\t149634600\t149635200\t0.2269\t79\nchr1\t149637300\t149638200\t0.2697\t67\nchr1\t149640000\t149640600\t0.1317\t47\nchr1\t149643000\t149643600\t0.1219\t59\nchr1\t149645100\t149645400\t0.366\t60\nchr1\t149647200\t149649900\t0.1598\t63\nchr1\t149651100\t149652600\t0.0245\t70\nchr1\t149654700\t149655600\t0.1604\t47\nchr1\t149657400\t149657700\t0.157\t90\nchr1\t149659800\t149661300\t0.0868\t62\nchr1\t149663700\t149664900\t0.4931\t90\nchr1\t149675700\t149676600\t0.0022\t85\nchr1\t149678100\t149685600\t0.0022\t85\nchr1\t149686800\t149689500\t0.0022\t85\nchr1\t149691600\t149691900\t0\t81\nchr1\t149693100\t149694900\t0\t81\nchr1\t149696400\t149712600\t0\t81\nchr1\t149713800\t149715600\t0\t81\nchr1\t149716800\t149719800\t0\t69\nchr1\t149721000\t149738400\t0\t69\nchr1\t149739600\t149744400\t0\t69\nchr1\t149747700\t149748900\t0.3124\t70\nchr1\t149750700\t149751300\t0.2279\t65\nchr1\t149754000\t149754300\t0.0518\t74\nchr1\t149755500\t149762100\t0.0518\t74\nchr1\t149765100\t149769600\t0.0156\t70\nchr1\t149772000\t149774100\t0\t66\nchr1\t149775900\t149776200\t0\t70\nchr1\t149777400\t149784000\t0\t70\nchr1\t149787600\t149788200\t0.5124\t87\nchr1\t149791800\t149792100\t0.1275\t68\nchr1\t149794500\t149795700\t0.0063\t68\nchr1\t149797800\t149799300\t0.218\t58\nchr1\t149800500\t149800800\t0.1622\t58\nchr1\t149804100\t149805000\t0.4011\t82\nchr1\t149808900\t149809800\t0.1762\t73\nchr1\t149814600\t149814900\t0.636\t56\nchr1\t149817600\t149843400\t0\t81\nchr1\t149850300\t149876100\t0\t83\nchr1\t150719100\t150719400\t0.5892\t34\nchr1\t150728100\t150729300\t0.1538\t55\nchr1\t150782100\t150782400\t0.1901\t67\nchr1\t151599600\t151601700\t0.0506\t87\nchr1\t151647300\t151647900\t0.1975\t85\nchr1\t152213400\t152218500\t0\t363\nchr1\t152269500\t152272200\t0\t75\nchr1\t152289900\t152292600\t0.2843\t101\nchr1\t152305500\t152307000\t0.0842\t76\nchr1\t152385300\t152385600\t0.4164\t61\nchr1\t152431800\t152435700\t0.2019\t88\nchr1\t152464500\t152464800\t0.4473\t65\nchr1\t152490000\t152491500\t0.0011\t78\nchr1\t152615700\t152617200\t0.3652\t35\nchr1\t152881500\t152881800\t0.4541\t62\nchr1\t152927700\t152928000\t0.3626\t57\nchr1\t152955600\t152957400\t0.2639\t78\nchr1\t153004500\t153005100\t0.3856\t58\nchr1\t153143100\t153143400\t0.254\t79\nchr1\t153256800\t153257100\t0.3818\t72\nchr1\t153278400\t153279600\t0.0491\t78\nchr1\t153405300\t153405600\t0.3916\t78\nchr1\t153442500\t153443100\t0.2012\t83\nchr1\t153465300\t153465600\t0.3258\t51\nchr1\t154125600\t154125900\t0.5743\t21\nchr1\t155189100\t155190300\t0\t43\nchr1\t155213100\t155214600\t0\t70\nchr1\t155233800\t155235300\t0\t70\nchr1\t155274600\t155274900\t0.5578\t77\nchr1\t155561400\t155562000\t0.3406\t61\nchr1\t155610300\t155612100\t0.0376\t66\nchr1\t155614200\t155614500\t0.3323\t73\nchr1\t155618400\t155619300\t0.0209\t64\nchr1\t155626800\t155635800\t0\t95\nchr1\t155687100\t155687700\t0.4166\t68\nchr1\t155700900\t155701800\t0.0394\t97\nchr1\t155745900\t155747400\t0.1094\t71\nchr1\t155749500\t155750400\t0.4343\t59\nchr1\t155757600\t155758200\t0.1238\t63\nchr1\t156179400\t156180000\t0.2474\t63\nchr1\t156557400\t156559200\t0\t53\nchr1\t157242600\t157242900\t0.5011\t60\nchr1\t157344000\t157344300\t0.364\t66\nchr1\t157609500\t157609800\t0.1698\t91\nchr1\t157681800\t157682100\t0.5038\t71\nchr1\t158240700\t158241000\t0.1121\t67\nchr1\t158268000\t158268900\t0.1485\t73\nchr1\t158314800\t158315100\t0.4686\t53\nchr1\t158319000\t158319300\t0.1993\t79\nchr1\t158567400\t158567700\t0.2262\t67\nchr1\t158709000\t158709300\t0.6177\t60\nchr1\t158742300\t158742600\t0.3371\t22\nchr1\t158761800\t158763000\t0.008\t69\nchr1\t158887800\t158889000\t0.2879\t87\nchr1\t158891700\t158892000\t0.4601\t71\nchr1\t158953800\t158958600\t0.0501\t77\nchr1\t159045000\t159045300\t0.5128\t71\nchr1\t159049200\t159049500\t0.4894\t55\nchr1\t159326400\t159326700\t0.3217\t67\nchr1\t159455700\t159458700\t0.0873\t83\nchr1\t159525300\t159527100\t0.0794\t61\nchr1\t159569400\t159571500\t0.1645\t114\nchr1\t159573300\t159573600\t0.5402\t95\nchr1\t159734100\t159734400\t0.2767\t74\nchr1\t159735900\t159736200\t0.2767\t74\nchr1\t159759900\t159760500\t0.186\t89\nchr1\t159761700\t159762600\t0.186\t89\nchr1\t160695300\t160697100\t0.2223\t112\nchr1\t160785900\t160786200\t0.3369\t67\nchr1\t160788000\t160788300\t0.3369\t67\nchr1\t160965300\t160965600\t0.3573\t28\nchr1\t161244000\t161244300\t0.2508\t45\nchr1\t161423400\t161424000\t0.3642\t71\nchr1\t161440800\t161472600\t0\t577\nchr1\t161512200\t161513400\t0.2437\t60\nchr1\t161516700\t161517000\t0.2771\t49\nchr1\t161527200\t161528100\t0.2505\t55\nchr1\t161533500\t161535000\t0.2048\t105\nchr1\t161553300\t161553900\t0.4321\t64\nchr1\t161560500\t161560800\t0.2431\t64\nchr1\t161564700\t161565600\t0.5188\t76\nchr1\t161566800\t161567100\t0.3146\t50\nchr1\t161569200\t161569800\t0.2954\t67\nchr1\t161571900\t161589000\t0\t92\nchr1\t161590200\t161592600\t0\t92\nchr1\t161593800\t161596800\t0\t92\nchr1\t161598600\t161598900\t0.4949\t51\nchr1\t161608800\t161609100\t0.2765\t75\nchr1\t161613600\t161614500\t0.0164\t68\nchr1\t161629200\t161629800\t0.5002\t81\nchr1\t161633700\t161635200\t0.2826\t56\nchr1\t161639700\t161642400\t0.0063\t53\nchr1\t161646000\t161646300\t0.3113\t64\nchr1\t161648100\t161648400\t0.2851\t57\nchr1\t161650800\t161651700\t0.0038\t55\nchr1\t161653200\t161670900\t0\t93\nchr1\t161672100\t161672400\t0.3593\t73\nchr1\t161673600\t161674500\t0.0272\t66\nchr1\t162082800\t162083100\t0.544\t38\nchr1\t162311700\t162312600\t0.1512\t87\nchr1\t162737400\t162739200\t0.006\t91\nchr1\t162791400\t162791700\t0.3857\t60\nchr1\t163254000\t163254300\t0.2193\t74\nchr1\t163255500\t163255800\t0.2193\t74\nchr1\t163262400\t163262700\t0.0263\t67\nchr1\t163490100\t163490700\t0.3444\t113\nchr1\t163640100\t163644300\t0.0168\t90\nchr1\t163750800\t163752000\t0.3485\t73\nchr1\t163753800\t163754100\t0.5801\t42\nchr1\t163850100\t163850400\t0.3539\t84\nchr1\t164048100\t164048400\t0.6808\t13\nchr1\t164290200\t164291100\t0.3646\t64\nchr1\t164359200\t164359500\t0.6065\t43\nchr1\t164463300\t164464800\t0.0346\t121\nchr1\t164958600\t164958900\t0.4117\t32\nchr1\t165808200\t165808500\t0.3369\t73\nchr1\t165970800\t165974400\t0\t114\nchr1\t166243200\t166248300\t0.0348\t137\nchr1\t166311300\t166311600\t0.3352\t78\nchr1\t166494300\t166494600\t0.1364\t58\nchr1\t166878300\t166878600\t0.6111\t52\nchr1\t167435100\t167435400\t0.4384\t64\nchr1\t168055500\t168055800\t0.0323\t67\nchr1\t168162000\t168162300\t0.4894\t67\nchr1\t168348900\t168350400\t0.0521\t93\nchr1\t168351600\t168354000\t0.0521\t93\nchr1\t168544200\t168544500\t0.1846\t61\nchr1\t168576000\t168576300\t0.1523\t72\nchr1\t169251900\t169253400\t0.2993\t72\nchr1\t169255200\t169255500\t0.5638\t46\nchr1\t169273500\t169274100\t0.5312\t87\nchr1\t169277400\t169278000\t0.4666\t79\nchr1\t169604100\t169604400\t0.3428\t57\nchr1\t169990200\t169990500\t0.4594\t49\nchr1\t170089200\t170089800\t0.3402\t74\nchr1\t170092500\t170093100\t0.3402\t74\nchr1\t170124600\t170125200\t0.4277\t65\nchr1\t170236200\t170236500\t0.4311\t41\nchr1\t170280300\t170283600\t0.3389\t87\nchr1\t170418300\t170419800\t0.5298\t72\nchr1\t170468400\t170468700\t0.47\t59\nchr1\t171078900\t171079500\t0.396\t96\nchr1\t171097200\t171097500\t0.3862\t56\nchr1\t171292200\t171292500\t0.5272\t66\nchr1\t171374100\t171375600\t0.165\t101\nchr1\t171377100\t171379200\t0.165\t101\nchr1\t171690000\t171690900\t0.0756\t91\nchr1\t172059000\t172061100\t0.0333\t74\nchr1\t172317000\t172317300\t0.5013\t84\nchr1\t172806900\t172807200\t0.4923\t67\nchr1\t172878600\t172878900\t0.4608\t82\nchr1\t172981500\t172988100\t0.0044\t75\nchr1\t172989300\t172989600\t0.0044\t75\nchr1\t173327400\t173327700\t0.3052\t76\nchr1\t173975700\t173976000\t0.3658\t38\nchr1\t174148500\t174148800\t0.4233\t57\nchr1\t174233400\t174234000\t0.0112\t100\nchr1\t174235200\t174237900\t0.0112\t100\nchr1\t174348600\t174348900\t0.3574\t58\nchr1\t174350100\t174351000\t0.0576\t73\nchr1\t174364200\t174364500\t0.4963\t46\nchr1\t174379200\t174383400\t0.0021\t93\nchr1\t174587100\t174587400\t0.377\t31\nchr1\t174590400\t174596100\t0\t101\nchr1\t174630000\t174634800\t0.0423\t92\nchr1\t174650700\t174651000\t0.3879\t72\nchr1\t174675300\t174675600\t0.5451\t62\nchr1\t174843300\t174849000\t0\t111\nchr1\t175107600\t175107900\t0.339\t63\nchr1\t175231500\t175231800\t0.3399\t30\nchr1\t175557900\t175558200\t0.1934\t27\nchr1\t175998000\t175998300\t0.4796\t69\nchr1\t176002500\t176003100\t0.3249\t132\nchr1\t176132700\t176133000\t0.0024\t21\nchr1\t176256300\t176261700\t0\t116\nchr1\t176309100\t176309700\t0.3635\t76\nchr1\t176600400\t176600700\t0.5551\t47\nchr1\t176640600\t176641200\t0.2602\t131\nchr1\t176751000\t176752200\t0.0162\t87\nchr1\t177402600\t177403200\t0.3832\t98\nchr1\t177404400\t177405000\t0.3832\t98\nchr1\t177408900\t177409200\t0.2098\t80\nchr1\t177634800\t177639600\t0.0236\t114\nchr1\t178314900\t178318800\t0\t81\nchr1\t178320000\t178320300\t0.305\t76\nchr1\t178695600\t178696200\t0.402\t72\nchr1\t178777800\t178779000\t0.0172\t137\nchr1\t178804500\t178805100\t0.1071\t117\nchr1\t178841100\t178843500\t0\t101\nchr1\t178896600\t178896900\t0.3224\t67\nchr1\t178989300\t178989600\t0.4524\t68\nchr1\t178990800\t178991100\t0.4312\t77\nchr1\t179452500\t179452800\t0.497\t43\nchr1\t179645100\t179645400\t0.3584\t53\nchr1\t179943300\t179943600\t0.2195\t63\nchr1\t180214800\t180215100\t0.5368\t36\nchr1\t180302700\t180303300\t0.4846\t66\nchr1\t180336000\t180336600\t0.267\t66\nchr1\t180699300\t180702600\t0\t95\nchr1\t180867000\t180872700\t0\t120\nchr1\t181225500\t181226700\t0.0592\t66\nchr1\t181728900\t181729200\t0.4004\t61\nchr1\t181860000\t181860300\t0.4094\t52\nchr1\t182439300\t182439900\t0.5767\t48\nchr1\t182508600\t182510400\t0.0063\t70\nchr1\t182980800\t182981100\t0.4217\t83\nchr1\t183614100\t183614400\t0.4817\t22\nchr1\t183616200\t183617100\t0.2795\t66\nchr1\t183657600\t183657900\t0.4481\t68\nchr1\t183776100\t183776400\t0.5126\t40\nchr1\t184263000\t184263300\t0.5726\t65\nchr1\t184800300\t184800600\t0.487\t59\nchr1\t184845600\t184851600\t0.0009\t121\nchr1\t185002800\t185007300\t0.1429\t165\nchr1\t185252700\t185256300\t0.1867\t82\nchr1\t185380200\t185380800\t0.0792\t95\nchr1\t185710500\t185710800\t0.3544\t70\nchr1\t185797800\t185798100\t0.4239\t34\nchr1\t185888100\t185891400\t0.0936\t83\nchr1\t185953800\t185954100\t0.5485\t77\nchr1\t186157800\t186158400\t0.1835\t67\nchr1\t186160200\t186160500\t0.1835\t67\nchr1\t186216600\t186216900\t0.3011\t67\nchr1\t186637800\t186638100\t0.156\t133\nchr1\t186641100\t186642000\t0.156\t133\nchr1\t186643200\t186643500\t0.156\t133\nchr1\t186795600\t186796200\t0.0239\t24\nchr1\t187344000\t187349700\t0\t116\nchr1\t187598100\t187603500\t0\t112\nchr1\t187804800\t187806000\t0.2465\t54\nchr1\t187823400\t187823700\t0.4626\t50\nchr1\t187824900\t187825200\t0.4328\t36\nchr1\t188032800\t188033100\t0.3918\t81\nchr1\t188352900\t188353200\t0.2589\t52\nchr1\t188559900\t188560200\t0.2836\t62\nchr1\t188624400\t188624700\t0.5191\t60\nchr1\t188754000\t188754300\t0.3004\t120\nchr1\t188755500\t188757000\t0.3004\t120\nchr1\t189025800\t189026100\t0.1147\t26\nchr1\t189364500\t189365100\t0.3432\t89\nchr1\t189469500\t189471000\t0.0753\t88\nchr1\t189759900\t189760200\t0.3905\t83\nchr1\t189863400\t189863700\t0.204\t48\nchr1\t190730400\t190734300\t0.148\t92\nchr1\t191063700\t191064300\t0.2471\t65\nchr1\t191069400\t191070000\t0.0579\t58\nchr1\t192481500\t192482100\t0.2894\t79\nchr1\t192485100\t192485400\t0.2894\t79\nchr1\t192501300\t192506400\t0.0418\t95\nchr1\t192795900\t192796200\t0.643\t53\nchr1\t193445100\t193446300\t0.1974\t95\nchr1\t193717800\t193723800\t0\t103\nchr1\t193862100\t193862400\t0.3465\t71\nchr1\t193867200\t193867500\t0.3254\t67\nchr1\t194017200\t194017500\t0.6969\t22\nchr1\t194259600\t194260200\t0.3164\t74\nchr1\t194272200\t194273100\t0.2246\t64\nchr1\t195551400\t195551700\t0.4341\t68\nchr1\t195924900\t195929100\t0\t92\nchr1\t196219500\t196225200\t0\t114\nchr1\t196753200\t196755900\t0\t58\nchr1\t196757100\t196759500\t0.0483\t74\nchr1\t196762500\t196762800\t0.4902\t85\nchr1\t196795800\t196796700\t0.0089\t66\nchr1\t196812900\t196815300\t0.2013\t64\nchr1\t196819500\t196820100\t0.0346\t59\nchr1\t196821300\t196821900\t0.0774\t66\nchr1\t196836300\t196836600\t0\t51\nchr1\t196837800\t196840500\t0\t51\nchr1\t196841700\t196844100\t0\t54\nchr1\t196847100\t196848600\t0.0188\t70\nchr1\t196920900\t196921500\t0.0221\t76\nchr1\t196934700\t196935000\t0.2865\t60\nchr1\t196937100\t196937400\t0.2865\t60\nchr1\t196943400\t196944000\t0.0128\t63\nchr1\t196945200\t196945800\t0.2424\t70\nchr1\t197531400\t197534100\t0\t102\nchr1\t197708100\t197713800\t0\t111\nchr1\t197803500\t197804400\t0.1705\t77\nchr1\t198077400\t198077700\t0.222\t78\nchr1\t198250500\t198250800\t0.1148\t93\nchr1\t198546300\t198546600\t0.4575\t50\nchr1\t199023300\t199025400\t0\t102\nchr1\t199193700\t199194000\t0.5217\t52\nchr1\t199469700\t199471200\t0\t78\nchr1\t199555800\t199556100\t0.4523\t64\nchr1\t200487600\t200487900\t0.4729\t70\nchr1\t200797200\t200799000\t0.0506\t95\nchr1\t200914500\t200915400\t0\t72\nchr1\t201210000\t201210600\t0.2724\t67\nchr1\t201235500\t201235800\t0.175\t74\nchr1\t202191000\t202192200\t0.3906\t77\nchr1\t202204500\t202205700\t0.2868\t147\nchr1\t202253700\t202254000\t0.4764\t28\nchr1\t202332600\t202332900\t0.2678\t67\nchr1\t202341300\t202341600\t0.4945\t39\nchr1\t202391700\t202392000\t0.007\t11\nchr1\t202451400\t202451700\t0.4696\t47\nchr1\t202610700\t202611000\t0.4344\t71\nchr1\t203022900\t203023200\t0.394\t48\nchr1\t204471000\t204471600\t0\t59\nchr1\t205847100\t205847700\t0.1791\t58\nchr1\t205854000\t205854600\t0.0894\t64\nchr1\t205958100\t205958400\t0.117\t21\nchr1\t205966800\t205967100\t0.4159\t18\nchr1\t206153100\t206153700\t0.0215\t68\nchr1\t206156100\t206160300\t0\t80\nchr1\t206162700\t206166000\t0\t80\nchr1\t206167500\t206168400\t0\t77\nchr1\t206169600\t206172600\t0\t77\nchr1\t206173800\t206176800\t0\t77\nchr1\t206178900\t206181000\t0\t77\nchr1\t206182200\t206197800\t0\t77\nchr1\t206199300\t206209500\t0.0004\t76\nchr1\t206211000\t206213100\t0.0004\t76\nchr1\t206214900\t206220300\t0\t86\nchr1\t206221500\t206226300\t0\t86\nchr1\t206227800\t206228400\t0.1616\t94\nchr1\t206230200\t206239500\t0\t83\nchr1\t206241300\t206248200\t0\t90\nchr1\t206249700\t206254200\t0\t90\nchr1\t206255400\t206255700\t0\t90\nchr1\t206256900\t206266200\t0\t90\nchr1\t206268600\t206272200\t0\t90\nchr1\t206274000\t206277600\t0\t90\nchr1\t206279100\t206285400\t0\t90\nchr1\t206287200\t206290200\t0\t90\nchr1\t206293200\t206303100\t0\t90\nchr1\t206304300\t206304900\t0.0012\t97\nchr1\t206307900\t206309100\t0.0012\t97\nchr1\t206310900\t206311800\t0.2815\t89\nchr1\t206313000\t206313600\t0.2815\t89\nchr1\t206314800\t206322300\t0\t105\nchr1\t206323500\t206324400\t0\t105\nchr1\t206325900\t206334300\t0\t105\nchr1\t206336100\t206338800\t0\t105\nchr1\t206340600\t206340900\t0\t105\nchr1\t206342700\t206345700\t0\t105\nchr1\t206346900\t206350800\t0.0307\t73\nchr1\t206352000\t206352600\t0.0307\t73\nchr1\t206355900\t206362800\t0.0382\t92\nchr1\t206364900\t206365200\t0.0382\t92\nchr1\t206366700\t206368800\t0\t99\nchr1\t206370900\t206378100\t0\t99\nchr1\t206379300\t206388900\t0\t99\nchr1\t206390100\t206394000\t0\t99\nchr1\t206396400\t206409600\t0\t99\nchr1\t207526800\t207564300\t0\t74\nchr1\t207568200\t207573000\t0\t62\nchr1\t207718800\t207719100\t0.345\t64\nchr1\t207721500\t207722400\t0.0686\t81\nchr1\t207732300\t207736200\t0.0169\t113\nchr1\t208307100\t208307400\t0.344\t105\nchr1\t208659000\t208659300\t0.1524\t63\nchr1\t208694100\t208694400\t0.4882\t49\nchr1\t208707000\t208707300\t0.2368\t83\nchr1\t209281500\t209281800\t0.1699\t72\nchr1\t209320200\t209320500\t0.4942\t51\nchr1\t209913900\t209919600\t0\t82\nchr1\t210441900\t210444300\t0\t69\nchr1\t210968100\t210968700\t0.2441\t65\nchr1\t211035300\t211035600\t0.3993\t61\nchr1\t211272600\t211272900\t0.3084\t48\nchr1\t212298300\t212299200\t0.2244\t37\nchr1\t212392800\t212393100\t0.3372\t78\nchr1\t212778600\t212778900\t0.4782\t74\nchr1\t212849400\t212851800\t0.0009\t84\nchr1\t213116400\t213116700\t0.6117\t54\nchr1\t213150300\t213151500\t0.1583\t64\nchr1\t213740700\t213741000\t0.259\t36\nchr1\t213806400\t213807000\t0.2221\t110\nchr1\t214683000\t214683600\t0.3777\t50\nchr1\t214868700\t214870500\t0.0419\t51\nchr1\t215209500\t215209800\t0.0394\t45\nchr1\t216486600\t216486900\t0.2044\t84\nchr1\t216488400\t216491400\t0.2044\t84\nchr1\t217257600\t217257900\t0.4211\t27\nchr1\t217359300\t217359900\t0.1739\t77\nchr1\t217580700\t217581000\t0.3638\t59\nchr1\t217690500\t217695900\t0\t83\nchr1\t217744200\t217744500\t0.3307\t43\nchr1\t218009100\t218014800\t0\t76\nchr1\t218072400\t218073000\t0.0039\t75\nchr1\t218598600\t218598900\t0.6834\t58\nchr1\t219103800\t219104400\t0.1983\t66\nchr1\t219114900\t219115800\t0.3273\t70\nchr1\t219455700\t219458100\t0.0698\t109\nchr1\t219546600\t219546900\t0.5083\t59\nchr1\t219561900\t219562200\t0.165\t63\nchr1\t219591300\t219591600\t0.2649\t46\nchr1\t219598500\t219600300\t0.2296\t52\nchr1\t219602400\t219602700\t0.5023\t57\nchr1\t219605700\t219607800\t0.4684\t61\nchr1\t219609300\t219612000\t0.1811\t95\nchr1\t219841500\t219841800\t0.1944\t116\nchr1\t219866400\t219867000\t0.016\t68\nchr1\t219868800\t219869400\t0.1181\t77\nchr1\t219872700\t219873300\t0.3194\t62\nchr1\t219948000\t219948300\t0.302\t58\nchr1\t220112100\t220112400\t0.2366\t44\nchr1\t220246200\t220246800\t0.034\t69\nchr1\t220665300\t220665600\t0.5728\t44\nchr1\t220995600\t220996800\t0\t136\nchr1\t221607000\t221607300\t0.4511\t56\nchr1\t221856900\t221857200\t0.3955\t65\nchr1\t221860800\t221861100\t0.4246\t49\nchr1\t222138300\t222138900\t0.314\t36\nchr1\t222353700\t222354000\t0.3998\t55\nchr1\t222469200\t222469500\t0.491\t88\nchr1\t222481200\t222483300\t0.0281\t76\nchr1\t222484800\t222485100\t0.0281\t76\nchr1\t222486300\t222489300\t0.0386\t101\nchr1\t222492000\t222492900\t0.3737\t78\nchr1\t222495000\t222495300\t0.3609\t73\nchr1\t222497400\t222498300\t0.3609\t73\nchr1\t222501300\t222501900\t0.3609\t73\nchr1\t222504000\t222510000\t0.2134\t87\nchr1\t222668400\t222669300\t0.0095\t68\nchr1\t223026000\t223026300\t0.5316\t68\nchr1\t223169100\t223169400\t0.427\t80\nchr1\t223171500\t223173000\t0.2599\t80\nchr1\t223317900\t223319400\t0.0166\t101\nchr1\t223396500\t223400700\t0.0647\t81\nchr1\t223450800\t223451700\t0.0266\t79\nchr1\t223635600\t223636800\t0\t122\nchr1\t223767600\t223768500\t0.287\t90\nchr1\t223890000\t223890300\t0.0632\t73\nchr1\t223893900\t223894500\t0.2902\t49\nchr1\t223910400\t223910700\t0.2719\t73\nchr1\t223912200\t223912500\t0.3466\t87\nchr1\t223914300\t223914600\t0.3466\t87\nchr1\t223916400\t223917600\t0.2498\t71\nchr1\t223919400\t223923300\t0.0213\t90\nchr1\t223926300\t223931400\t0.0213\t90\nchr1\t223932600\t223935000\t0\t68\nchr1\t223938300\t223941900\t0.0039\t68\nchr1\t223943400\t223944300\t0.1719\t67\nchr1\t223947300\t223947600\t0.5104\t46\nchr1\t223950600\t223951200\t0.1232\t36\nchr1\t223953900\t223954800\t0.2175\t69\nchr1\t223956900\t223958700\t0.3783\t76\nchr1\t223963200\t223963800\t0.265\t76\nchr1\t223966500\t223969500\t0.265\t76\nchr1\t223973700\t223977000\t0.402\t58\nchr1\t223979700\t223981500\t0.0585\t69\nchr1\t223987800\t223989000\t0.0625\t78\nchr1\t224001300\t224001600\t0.2409\t47\nchr1\t224011500\t224017200\t0.2077\t1434\nchr1\t224024100\t224025600\t0.1541\t102\nchr1\t224026800\t224027700\t0.1541\t102\nchr1\t224032200\t224032500\t0.1403\t87\nchr1\t224033700\t224035500\t0.1403\t87\nchr1\t224059500\t224059800\t0\t30\nchr1\t224100600\t224101800\t0.4022\t57\nchr1\t224340000\t224340600\t0.0779\t52\nchr1\t224378400\t224379000\t0.3123\t91\nchr1\t224799600\t224800200\t0.076\t141\nchr1\t225574500\t225574800\t0.5219\t30\nchr1\t226071600\t226071900\t0.1224\t46\nchr1\t226114200\t226115100\t0.0645\t44\nchr1\t226701300\t226701600\t0.4809\t60\nchr1\t226797900\t226798200\t0.0165\t27\nchr1\t227207700\t227210100\t0.2293\t76\nchr1\t227493300\t227499000\t0.0059\t96\nchr1\t227502300\t227508300\t0\t75\nchr1\t227836500\t227836800\t0.4127\t21\nchr1\t227976600\t227976900\t0.6515\t60\nchr1\t227979600\t227979900\t0.1635\t60\nchr1\t227981400\t227982000\t0.1635\t60\nchr1\t227984100\t227985600\t0.0849\t52\nchr1\t228193500\t228193800\t0.4708\t54\nchr1\t228384600\t228384900\t0.4534\t47\nchr1\t228556200\t228558300\t0\t325\nchr1\t228608400\t228646800\t0\t773\nchr1\t228678900\t228679500\t0.2133\t43\nchr1\t228709200\t228709800\t0.2721\t100\nchr1\t228711600\t228712200\t0.2721\t100\nchr1\t229900800\t229901100\t0.3862\t67\nchr1\t230296500\t230297100\t0.452\t101\nchr1\t230335200\t230335500\t0.327\t13\nchr1\t230871900\t230872200\t0.4319\t236\nchr1\t231047400\t231047700\t0.2172\t36\nchr1\t231167400\t231167700\t0.3655\t44\nchr1\t231780600\t231780900\t0.0081\t61\nchr1\t231995700\t231996000\t0.3588\t88\nchr1\t232082100\t232082700\t0.2749\t94\nchr1\t232231500\t232232400\t0.1874\t25\nchr1\t232287300\t232287600\t0.5801\t25\nchr1\t232725300\t232725600\t0.3893\t44\nchr1\t232823700\t232824900\t0.065\t83\nchr1\t233174100\t233174400\t0.4098\t10\nchr1\t233594400\t233594700\t0.4925\t12\nchr1\t233729400\t233729700\t0.6212\t35\nchr1\t234267000\t234267600\t0.298\t79\nchr1\t234451500\t234451800\t0.2176\t32\nchr1\t234786000\t234786300\t0.5673\t38\nchr1\t234787800\t234792000\t0.065\t127\nchr1\t234793500\t234794400\t0.3437\t108\nchr1\t234796800\t234799800\t0.0313\t116\nchr1\t234801000\t234801600\t0.0313\t116\nchr1\t234803100\t234804300\t0.0313\t116\nchr1\t234805500\t234809700\t0.2708\t95\nchr1\t234810900\t234811200\t0.2708\t95\nchr1\t234812400\t234814800\t0.0623\t150\nchr1\t234816300\t234816600\t0.0623\t150\nchr1\t234818100\t234819900\t0.152\t74\nchr1\t235382700\t235384500\t0.2121\t73\nchr1\t235891200\t235891500\t0.5379\t24\nchr1\t236035200\t236035800\t0.0302\t105\nchr1\t236097000\t236097600\t0.2783\t390\nchr1\t236386500\t236388000\t0\t59\nchr1\t236713500\t236715000\t0\t414\nchr1\t236755800\t236757000\t0.1186\t44\nchr1\t237019500\t237025200\t0\t110\nchr1\t237075300\t237081300\t0.0036\t103\nchr1\t237605700\t237606000\t0.4623\t57\nchr1\t238208100\t238209600\t0.5509\t96\nchr1\t238689300\t238689900\t0.0431\t109\nchr1\t239623500\t239629200\t0\t103\nchr1\t239640600\t239641500\t0.4777\t75\nchr1\t239732100\t239733000\t0.0195\t57\nchr1\t239813700\t239814000\t0.5002\t46\nchr1\t240184800\t240185100\t0.5519\t106\nchr1\t240453600\t240453900\t0.4789\t44\nchr1\t240777900\t240778200\t0.5605\t69\nchr1\t240972300\t240972600\t0.2465\t42\nchr1\t241197300\t241197600\t0.2177\t31\nchr1\t241415700\t241416300\t0.281\t61\nchr1\t242045700\t242051400\t0\t82\nchr1\t242341500\t242341800\t0.4266\t23\nchr1\t242394300\t242394900\t0.1125\t15\nchr1\t242714100\t242714400\t0.4637\t71\nchr1\t242968800\t242969100\t0.3885\t55\nchr1\t242992500\t242992800\t0.3637\t58\nchr1\t243013200\t243013500\t0.2069\t63\nchr1\t243030000\t243034200\t0.0389\t74\nchr1\t243036300\t243038700\t0.0656\t63\nchr1\t243039900\t243042600\t0.0656\t63\nchr1\t243044700\t243047100\t0.0178\t50\nchr1\t243048900\t243049200\t0.3754\t44\nchr1\t243052200\t243052800\t0.2328\t62\nchr1\t243057900\t243059100\t0.156\t75\nchr1\t243061500\t243062100\t0.3266\t45\nchr1\t243065100\t243066600\t0.4812\t51\nchr1\t243068100\t243068700\t0.3517\t89\nchr1\t243074100\t243075600\t0.4791\t72\nchr1\t243081000\t243084300\t0.0109\t79\nchr1\t243087000\t243087300\t0.487\t82\nchr1\t243096300\t243098100\t0.3059\t67\nchr1\t243660000\t243660300\t0.3335\t79\nchr1\t243661800\t243662100\t0.2284\t103\nchr1\t244275900\t244276200\t0.5162\t25\nchr1\t244444200\t244444500\t0.297\t62\nchr1\t244492200\t244493100\t0.1586\t82\nchr1\t244523400\t244524000\t0.0986\t79\nchr1\t244539300\t244542000\t0.225\t45\nchr1\t245103000\t245103600\t0.1551\t133\nchr1\t245280600\t245281800\t0.0573\t90\nchr1\t245586600\t245586900\t0.6158\t55\nchr1\t245682300\t245682600\t0.6855\t51\nchr1\t245819100\t245821800\t0.0105\t118\nchr1\t245974500\t245976900\t0\t20\nchr1\t245991900\t245993100\t0.0023\t49\nchr1\t246024300\t246024900\t0.4614\t84\nchr1\t246233400\t246233700\t0.6517\t129\nchr1\t246251700\t246252300\t0.3594\t50\nchr1\t246388200\t246389700\t0\t118\nchr1\t246429900\t246430200\t0.4254\t44\nchr1\t246478500\t246478800\t0.4819\t60\nchr1\t246483900\t246485100\t0.2527\t74\nchr1\t246520800\t246521100\t0.4323\t34\nchr1\t246620100\t246620700\t0.1052\t81\nchr1\t246713100\t246713400\t0.6612\t74\nchr1\t246719400\t246719700\t0.3746\t65\nchr1\t246783000\t246783300\t0.479\t56\nchr1\t246785700\t246786000\t0.5614\t204\nchr1\t246818100\t246819300\t0\t30\nchr1\t246864600\t246864900\t0.1618\t14\nchr1\t247116000\t247119000\t0\t47\nchr1\t247126200\t247130100\t0\t77\nchr1\t247169700\t247172400\t0\t58\nchr1\t247219200\t247219500\t0.069\t67\nchr1\t247354800\t247355400\t0.0551\t47\nchr1\t247363200\t247363500\t0.4447\t70\nchr1\t247649100\t247649400\t0.686\t52\nchr1\t247687500\t247693200\t0\t97\nchr1\t247725600\t247728000\t0.0733\t66\nchr1\t247800600\t247802700\t0.2274\t48\nchr1\t247809300\t247811100\t0.0101\t81\nchr1\t247870200\t247871100\t0.2659\t175\nchr1\t247888500\t247891200\t0\t100\nchr1\t247892400\t247894500\t0\t100\nchr1\t247921500\t247921800\t0.1473\t42\nchr1\t248025000\t248025300\t0.3718\t73\nchr1\t248044500\t248044800\t0.4446\t47\nchr1\t248166900\t248172300\t0.0061\t105\nchr1\t248187900\t248188800\t0\t64\nchr1\t248221200\t248221800\t0.0667\t81\nchr1\t248256300\t248256600\t0.308\t72\nchr1\t248258100\t248258400\t0.308\t72\nchr1\t248298600\t248298900\t0.4146\t47\nchr1\t248306700\t248307000\t0.5948\t75\nchr1\t248383200\t248384100\t0.4422\t87\nchr1\t248408100\t248409000\t0.0298\t129\nchr1\t248436000\t248437800\t0.5108\t88\nchr1\t248441400\t248441700\t0.6428\t79\nchr1\t248448000\t248457000\t0\t100\nchr1\t248474400\t248476500\t0\t74\nchr1\t248479800\t248480100\t0.1043\t74\nchr1\t248481900\t248482200\t0.6622\t35\nchr1\t248483400\t248484600\t0\t67\nchr1\t248486100\t248493900\t0\t88\nchr1\t248495700\t248500500\t0\t83\nchr1\t248502000\t248519100\t0\t83\nchr1\t248529000\t248552400\t0\t78\nchr1\t248554200\t248562000\t0\t72\nchr1\t248563500\t248564700\t0\t77\nchr1\t248567700\t248568600\t0.0747\t73\nchr1\t248571600\t248574000\t0\t75\nchr1\t248634900\t248643900\t0\t93\nchr1\t248649000\t248650800\t0.3035\t66\nchr1\t248654100\t248655600\t0\t55\nchr1\t248676600\t248677500\t0.0569\t50\nchr1\t248725800\t248726100\t0.4767\t73\nchr1\t248746800\t248748300\t0.0083\t41\nchr1\t248764200\t248764500\t0.4267\t70\nchr1\t248867100\t248867400\t0.6659\t72\nchr1\t248931300\t248933400\t0.0069\t305\nchr1\t248934600\t248946600\t0.0069\t305\nchr10\t9900\t47100\t0\t302\nchr10\t54300\t54600\t0.409\t62\nchr10\t295500\t295800\t0.6981\t48\nchr10\t321600\t323400\t0.0504\t107\nchr10\t345600\t347100\t0.2067\t46\nchr10\t402000\t402600\t0.3243\t25\nchr10\t425100\t425400\t0.3833\t93\nchr10\t448800\t449100\t0.4909\t62\nchr10\t455400\t456000\t0.4409\t135\nchr10\t465000\t466500\t0.1919\t59\nchr10\t489900\t490200\t0.6832\t63\nchr10\t587700\t588000\t0.5789\t44\nchr10\t632400\t632700\t0.4778\t57\nchr10\t717900\t718200\t0.0922\t41\nchr10\t723300\t723600\t0.3428\t36\nchr10\t726300\t726600\t0.5156\t49\nchr10\t735600\t736200\t0.2104\t37\nchr10\t747300\t747900\t0.2376\t78\nchr10\t757200\t757500\t0.0324\t64\nchr10\t777600\t777900\t0.1577\t41\nchr10\t779400\t779700\t0.4451\t53\nchr10\t783900\t784500\t0.0562\t48\nchr10\t793800\t794100\t0.4163\t47\nchr10\t952500\t953700\t0.0013\t81\nchr10\t954900\t955200\t0.5827\t62\nchr10\t1015500\t1015800\t0.5846\t72\nchr10\t1038900\t1039200\t0.5575\t50\nchr10\t1046400\t1047600\t0\t55\nchr10\t1219800\t1220400\t0.5625\t98\nchr10\t1235100\t1240500\t0.0942\t172\nchr10\t1246500\t1246800\t0.4258\t47\nchr10\t1260600\t1262100\t0.2213\t79\nchr10\t1265700\t1266000\t0.4897\t69\nchr10\t1306800\t1307100\t0.4027\t81\nchr10\t1326900\t1327200\t0.5452\t23\nchr10\t1340100\t1340700\t0.4262\t76\nchr10\t1396800\t1397700\t0.5293\t54\nchr10\t1438800\t1439100\t0.6999\t36\nchr10\t1460100\t1460700\t0.2983\t69\nchr10\t1541100\t1542900\t0.5119\t81\nchr10\t1592400\t1593300\t0.2122\t120\nchr10\t1699200\t1701300\t0.3754\t33\nchr10\t1769700\t1770600\t0.1316\t82\nchr10\t1800300\t1800600\t0.5385\t39\nchr10\t2231700\t2232300\t0.4724\t81\nchr10\t2254200\t2255100\t0.2059\t78\nchr10\t2337300\t2337600\t0.3826\t20\nchr10\t2392200\t2392500\t0.4444\t107\nchr10\t2521800\t2523300\t0.286\t86\nchr10\t2805900\t2806500\t0.2031\t73\nchr10\t3084900\t3085800\t0.4878\t17\nchr10\t3106200\t3106500\t0.4702\t78\nchr10\t3206100\t3206400\t0.5785\t68\nchr10\t3221700\t3222000\t0.2522\t69\nchr10\t3225000\t3225300\t0.4006\t57\nchr10\t3252300\t3252600\t0.4406\t29\nchr10\t3315000\t3315300\t0.3292\t112\nchr10\t3318300\t3318600\t0.5864\t51\nchr10\t3373500\t3373800\t0.6084\t63\nchr10\t3771600\t3771900\t0.3654\t77\nchr10\t4592700\t4593000\t0.2608\t28\nchr10\t4598100\t4598400\t0.402\t68\nchr10\t4815600\t4815900\t0.0423\t12\nchr10\t4956300\t4956600\t0.184\t70\nchr10\t4975500\t4976100\t0.0906\t56\nchr10\t4979700\t4980600\t0.2068\t65\nchr10\t4987200\t4987800\t0.1164\t62\nchr10\t4989300\t4989600\t0.4255\t54\nchr10\t4991700\t4992000\t0.0362\t62\nchr10\t4995000\t4995600\t0.484\t55\nchr10\t5009700\t5010300\t0.3137\t72\nchr10\t5021400\t5021700\t0.6818\t37\nchr10\t5028000\t5028300\t0.3496\t46\nchr10\t5176200\t5176500\t0.6531\t13\nchr10\t5227200\t5227500\t0.3002\t67\nchr10\t5245500\t5251500\t0\t90\nchr10\t5253600\t5253900\t0.3667\t44\nchr10\t5370000\t5370600\t0.5754\t138\nchr10\t5381100\t5381400\t0.6044\t63\nchr10\t6206100\t6206400\t0.3425\t46\nchr10\t6210600\t6210900\t0.4172\t11\nchr10\t6369600\t6375600\t0\t69\nchr10\t6450000\t6450300\t0.1576\t71\nchr10\t6548400\t6548700\t0.1386\t59\nchr10\t6799500\t6799800\t0.4737\t32\nchr10\t6806400\t6806700\t0.3925\t61\nchr10\t6807900\t6808200\t0.5203\t66\nchr10\t6860100\t6861300\t0.3483\t68\nchr10\t6906600\t6906900\t0.3045\t58\nchr10\t6992100\t6992400\t0.4257\t63\nchr10\t7058100\t7062900\t0.0358\t84\nchr10\t7138500\t7141800\t0.0586\t79\nchr10\t7378200\t7378500\t0.5638\t49\nchr10\t7593300\t7593600\t0.4906\t38\nchr10\t7719900\t7720200\t0.6252\t46\nchr10\t8367000\t8367300\t0.3974\t50\nchr10\t8984400\t8985300\t0.0844\t105\nchr10\t9216900\t9217200\t0.4907\t58\nchr10\t9272700\t9273000\t0.3633\t34\nchr10\t9372000\t9372300\t0.2598\t38\nchr10\t9407700\t9408000\t0.5962\t11\nchr10\t9477900\t9478200\t0.4428\t14\nchr10\t9584100\t9584400\t0.3517\t67\nchr10\t9596100\t9596400\t0.6219\t39\nchr10\t9725400\t9725700\t0.4537\t79\nchr10\t9831900\t9832200\t0.241\t64\nchr10\t9930900\t9931200\t0.5962\t46\nchr10\t10107600\t10108500\t0.2146\t81\nchr10\t10266300\t10267200\t0.5013\t70\nchr10\t10556700\t10558200\t0.2837\t75\nchr10\t10652100\t10656600\t0.2138\t66\nchr10\t10666500\t10666800\t0.5998\t47\nchr10\t10692300\t10693500\t0.0684\t95\nchr10\t11283900\t11284200\t0.6922\t155\nchr10\t11366400\t11366700\t0.6565\t22\nchr10\t11404200\t11404500\t0.4711\t29\nchr10\t11731500\t11736900\t0\t107\nchr10\t11885400\t11885700\t0.3822\t91\nchr10\t12518400\t12520800\t0.0017\t39\nchr10\t12694200\t12694500\t0.4123\t20\nchr10\t12774900\t12776100\t0\t253\nchr10\t13155300\t13155600\t0.1149\t70\nchr10\t13217400\t13218600\t0\t62\nchr10\t14514900\t14515500\t0.1601\t67\nchr10\t15149400\t15149700\t0.6767\t115\nchr10\t15229500\t15230100\t0.5088\t82\nchr10\t15915900\t15921300\t0\t87\nchr10\t17252100\t17252400\t0.4649\t81\nchr10\t17518200\t17518500\t0.6523\t59\nchr10\t17628900\t17629200\t0.4835\t72\nchr10\t17631000\t17631600\t0.0536\t47\nchr10\t17720400\t17721600\t0.1718\t89\nchr10\t17723700\t17724000\t0.5382\t57\nchr10\t18031500\t18033300\t0.0421\t76\nchr10\t18035100\t18035400\t0.0421\t76\nchr10\t18630000\t18630300\t0.3761\t79\nchr10\t18631500\t18631800\t0.3761\t79\nchr10\t19088700\t19093800\t0\t101\nchr10\t19160100\t19161300\t0.0143\t67\nchr10\t19238100\t19238700\t0\t52\nchr10\t19284600\t19287000\t0.1409\t71\nchr10\t19581600\t19583400\t0.0125\t68\nchr10\t19741200\t19741500\t0.521\t72\nchr10\t20538300\t20539800\t0.1201\t69\nchr10\t20570400\t20571600\t0.2321\t73\nchr10\t20752200\t20757000\t0\t89\nchr10\t20940300\t20940600\t0.4934\t44\nchr10\t21322500\t21323100\t0.0582\t87\nchr10\t21430500\t21431100\t0.0126\t73\nchr10\t21717600\t21717900\t0.6058\t55\nchr10\t22062900\t22063200\t0.4102\t32\nchr10\t22124100\t22129200\t0.0533\t80\nchr10\t22403700\t22405800\t0.0084\t80\nchr10\t22407900\t22408500\t0.0084\t80\nchr10\t23152500\t23154600\t0.0388\t98\nchr10\t23331300\t23331600\t0.5197\t21\nchr10\t23773200\t23773500\t0.374\t71\nchr10\t23790000\t23790300\t0.5833\t53\nchr10\t24268500\t24269100\t0.29\t62\nchr10\t24655500\t24657900\t0.22\t66\nchr10\t24809100\t24809400\t0.4005\t25\nchr10\t25247400\t25248000\t0.19\t81\nchr10\t25249800\t25251900\t0.19\t81\nchr10\t25429800\t25430100\t0.3705\t61\nchr10\t25472100\t25472400\t0.5113\t51\nchr10\t25490400\t25490700\t0.6832\t46\nchr10\t25515600\t25520400\t0.0086\t81\nchr10\t26006700\t26007000\t0.3976\t75\nchr10\t26892000\t26894100\t0.108\t98\nchr10\t27281100\t27282600\t0.2201\t59\nchr10\t27355200\t27355500\t0.2879\t77\nchr10\t27443400\t27444000\t0.551\t47\nchr10\t27823800\t27824100\t0.2793\t75\nchr10\t27846600\t27846900\t0.3416\t50\nchr10\t27873000\t27873600\t0.192\t64\nchr10\t27968100\t27969000\t0.2287\t74\nchr10\t28522500\t28522800\t0.3441\t60\nchr10\t29306400\t29306700\t0.4661\t35\nchr10\t29423400\t29423700\t0\t28\nchr10\t29510700\t29511000\t0.6733\t57\nchr10\t29697000\t29698500\t0.1826\t44\nchr10\t30642900\t30643200\t0.6777\t63\nchr10\t30945600\t30946200\t0.089\t79\nchr10\t30950700\t30951000\t0.0273\t86\nchr10\t30952500\t30953400\t0.0273\t86\nchr10\t31109400\t31109700\t0.2976\t58\nchr10\t31306500\t31306800\t0.4507\t64\nchr10\t31444200\t31444500\t0.0917\t84\nchr10\t31445700\t31446000\t0.0917\t84\nchr10\t31447200\t31448400\t0.0917\t84\nchr10\t31470300\t31471800\t0.212\t93\nchr10\t31473000\t31473900\t0.212\t93\nchr10\t31968900\t31971600\t0\t184\nchr10\t32024100\t32024400\t0.5109\t42\nchr10\t32416800\t32417100\t0.2795\t16\nchr10\t32660100\t32661300\t0.2938\t75\nchr10\t32775900\t32776200\t0.3486\t51\nchr10\t32900400\t32901300\t0.192\t49\nchr10\t33510900\t33516900\t0\t74\nchr10\t34395600\t34395900\t0.4793\t33\nchr10\t35476500\t35479500\t0.2008\t84\nchr10\t35549700\t35550300\t0.6053\t47\nchr10\t35667300\t35667600\t0.5315\t117\nchr10\t35678100\t35678400\t0.3602\t65\nchr10\t35859900\t35861400\t0.4388\t80\nchr10\t36011100\t36012000\t0\t21\nchr10\t36123000\t36123300\t0.5115\t45\nchr10\t36401400\t36402000\t0.3715\t95\nchr10\t37066200\t37066800\t0.1362\t70\nchr10\t37102500\t37104600\t0.0031\t54\nchr10\t37111800\t37113300\t0.0005\t68\nchr10\t37163100\t37164000\t0.0044\t62\nchr10\t37166400\t37177800\t0\t79\nchr10\t37179600\t37182900\t0\t70\nchr10\t37184100\t37189800\t0\t78\nchr10\t37606200\t37606500\t0.2978\t69\nchr10\t37900500\t37902900\t0.2272\t71\nchr10\t37998300\t37998600\t0.3758\t72\nchr10\t38000100\t38000700\t0.3758\t72\nchr10\t38262900\t38265600\t0.0095\t79\nchr10\t38272500\t38272800\t0.3282\t58\nchr10\t38328900\t38329200\t0.3941\t64\nchr10\t38364000\t38364300\t0.574\t72\nchr10\t38399700\t38400000\t0.4826\t65\nchr10\t38408700\t38409000\t0.4401\t81\nchr10\t38418600\t38418900\t0.0213\t63\nchr10\t38424600\t38424900\t0.1032\t44\nchr10\t38431500\t38431800\t0.4432\t82\nchr10\t38457000\t38457300\t0.6009\t46\nchr10\t38463000\t38465100\t0.0115\t61\nchr10\t38468100\t38468400\t0.1549\t67\nchr10\t38469900\t38470200\t0.1549\t67\nchr10\t38476200\t38476500\t0.1565\t72\nchr10\t38481900\t38482200\t0.3004\t88\nchr10\t38484000\t38507100\t0.1539\t3073\nchr10\t38508300\t38511000\t0.2608\t375\nchr10\t38512800\t38526600\t0.2203\t557\nchr10\t38573100\t38582100\t0.1381\t2536\nchr10\t38588400\t38588700\t0.6925\t101\nchr10\t38618100\t38618400\t0.4339\t86\nchr10\t38623800\t38624100\t0.5451\t91\nchr10\t38633700\t38634000\t0.5584\t60\nchr10\t38636700\t38637900\t0.2891\t94\nchr10\t38640300\t38640600\t0.5314\t105\nchr10\t38667000\t38667300\t0.4648\t94\nchr10\t38750100\t38750700\t0.3225\t83\nchr10\t38759700\t38760000\t0.3707\t67\nchr10\t38783400\t38783700\t0.307\t231\nchr10\t38785200\t38795700\t0.1933\t322\nchr10\t38799600\t38802000\t0.3061\t342\nchr10\t38803200\t38810100\t0.3817\t194\nchr10\t38811600\t38812200\t0.2173\t323\nchr10\t38813400\t38818200\t0.2173\t323\nchr10\t38820900\t38823300\t0.3576\t184\nchr10\t38825700\t38827200\t0.277\t242\nchr10\t38828700\t38829000\t0.6759\t83\nchr10\t38830200\t38906100\t0\t1407\nchr10\t38911500\t38913300\t0.0971\t478\nchr10\t38918100\t38920500\t0.2128\t2075\nchr10\t38943900\t38944200\t0.6212\t116\nchr10\t38949900\t38950200\t0.6887\t93\nchr10\t38977800\t38978400\t0.5293\t71\nchr10\t39183300\t39183600\t0.3024\t31\nchr10\t39334500\t39334800\t0.4667\t52\nchr10\t39427500\t39428700\t0.5999\t129\nchr10\t39454800\t39455100\t0.6628\t52\nchr10\t39459600\t39459900\t0.6292\t50\nchr10\t39466500\t39470400\t0.0005\t60\nchr10\t39480000\t39480300\t0.3149\t50\nchr10\t39485400\t39485700\t0.6179\t175\nchr10\t39496200\t39496500\t0.6634\t160\nchr10\t39506700\t39507000\t0.688\t73\nchr10\t39508500\t39514200\t0\t91\nchr10\t39533400\t39533700\t0.6327\t83\nchr10\t39559800\t39560100\t0.3686\t14\nchr10\t39568500\t39569100\t0.2527\t84\nchr10\t39575100\t39577500\t0.1422\t157\nchr10\t39579600\t39579900\t0.2989\t42\nchr10\t39582600\t39582900\t0.4612\t14\nchr10\t39600600\t39600900\t0.6042\t26\nchr10\t39606300\t39607500\t0\t49\nchr10\t39609600\t39609900\t0.1253\t16\nchr10\t39619800\t39620100\t0\t58\nchr10\t39625500\t39625800\t0\t22\nchr10\t39636000\t39636300\t0.0225\t44\nchr10\t39687600\t39687900\t0.1457\t19\nchr10\t39691500\t39691800\t0.5827\t39\nchr10\t39700800\t39702000\t0\t16\nchr10\t39708300\t39708900\t0\t17\nchr10\t39711300\t39712500\t0\t127\nchr10\t39717600\t39717900\t0\t14\nchr10\t39719100\t39720600\t0\t145\nchr10\t39721800\t39722400\t0\t16\nchr10\t39725700\t39728400\t0\t103\nchr10\t39735000\t39735300\t0\t19\nchr10\t39736500\t39736800\t0.6241\t68\nchr10\t39738600\t39738900\t0\t24\nchr10\t39744900\t39746400\t0\t79\nchr10\t39751800\t39752100\t0.0262\t25\nchr10\t39753600\t39755400\t0.1383\t31\nchr10\t39757200\t39758700\t0.0437\t78\nchr10\t39762600\t39763800\t0\t24\nchr10\t39770400\t39771900\t0\t60\nchr10\t39773100\t39777900\t0\t60\nchr10\t39779700\t39780000\t0\t18\nchr10\t39786000\t39786900\t0\t52\nchr10\t39795000\t39795300\t0\t25\nchr10\t39799500\t39800100\t0.1899\t23\nchr10\t39802500\t39805200\t0\t19\nchr10\t39809700\t39810000\t0.2306\t59\nchr10\t39812700\t39813300\t0\t44\nchr10\t39819900\t39820200\t0\t16\nchr10\t39825900\t39826200\t0.2293\t26\nchr10\t39828900\t39829200\t0\t11\nchr10\t39830700\t39831300\t0.1286\t42\nchr10\t39834300\t39836400\t0\t185\nchr10\t39837600\t39837900\t0\t34\nchr10\t39843900\t39844200\t0\t78\nchr10\t39849900\t39851400\t0\t10\nchr10\t39855900\t39856500\t0.0614\t87\nchr10\t39858900\t39860400\t0\t73\nchr10\t39861900\t39863400\t0\t19\nchr10\t39869700\t39870600\t0\t37\nchr10\t39871800\t39872100\t0\t31\nchr10\t39874200\t39874500\t0\t40\nchr10\t39876300\t39876900\t0\t40\nchr10\t39882600\t39882900\t0\t12\nchr10\t39884400\t39884700\t0\t17\nchr10\t39892500\t39894000\t0.1654\t27\nchr10\t39897300\t39898200\t0\t53\nchr10\t39900600\t39900900\t0\t43\nchr10\t39904200\t39906300\t0\t70\nchr10\t39911100\t39911400\t0.3556\t13\nchr10\t39912600\t39912900\t0\t28\nchr10\t39914700\t39916500\t0.0485\t69\nchr10\t39918000\t39918900\t0\t15\nchr10\t39921000\t39921300\t0\t27\nchr10\t39924300\t39924600\t0\t16\nchr10\t39927000\t39927300\t0\t26\nchr10\t39928500\t39930300\t0\t36\nchr10\t39933900\t39934200\t0\t17\nchr10\t39936000\t39941400\t0\t840\nchr10\t39945900\t39947700\t0\t25\nchr10\t39953100\t39956400\t0\t263\nchr10\t39958800\t39959100\t0\t3165\nchr10\t39960300\t39970200\t0\t3165\nchr10\t39975000\t39975300\t0.0733\t36\nchr10\t39980100\t39981600\t0\t53\nchr10\t39983100\t39987900\t0\t1012\nchr10\t39989400\t39994500\t0\t465\nchr10\t39996900\t40002900\t0\t465\nchr10\t40004400\t40005900\t0\t294\nchr10\t40011000\t40011300\t0.555\t24\nchr10\t40019400\t40021500\t0\t1990\nchr10\t40024200\t40025400\t0.0024\t289\nchr10\t40029300\t40029900\t0\t57\nchr10\t40046700\t40048200\t0\t280\nchr10\t40059600\t40061100\t0\t74\nchr10\t40065300\t40074000\t0\t887\nchr10\t40076100\t40087800\t0\t773\nchr10\t40090500\t40090800\t0\t27\nchr10\t40097100\t40102200\t0\t1747\nchr10\t40104600\t40105800\t0.0047\t137\nchr10\t40107300\t40107900\t0.2694\t146\nchr10\t40117800\t40118100\t0\t36\nchr10\t40127400\t40130400\t0\t2060\nchr10\t40134600\t40139400\t0\t1903\nchr10\t40141500\t40142400\t0\t203\nchr10\t40145100\t40145700\t0\t46\nchr10\t40147500\t40150200\t0\t267\nchr10\t40157400\t40159200\t0.0003\t846\nchr10\t40162800\t40163100\t0\t11\nchr10\t40167000\t40167600\t0\t82\nchr10\t40169700\t40170000\t0\t19\nchr10\t40183500\t40188000\t0\t311\nchr10\t40191900\t40193400\t0\t248\nchr10\t40200600\t40209000\t0\t2419\nchr10\t40213200\t40213800\t0.0559\t46\nchr10\t40216200\t40224300\t0\t377\nchr10\t40227600\t40229100\t0\t254\nchr10\t40232400\t40232700\t0.0308\t32\nchr10\t40241700\t40242000\t0.0163\t56\nchr10\t40246200\t40248900\t0\t329\nchr10\t40257900\t40258200\t0.4353\t15\nchr10\t40262400\t40263600\t0\t516\nchr10\t40265700\t40269300\t0\t1958\nchr10\t40270800\t40271100\t0\t12\nchr10\t40276800\t40280700\t0\t1970\nchr10\t40283100\t40291500\t0\t683\nchr10\t40294500\t40294800\t0.0148\t32\nchr10\t40301100\t40302900\t0\t73\nchr10\t40314600\t40316100\t0\t479\nchr10\t40318500\t40319100\t0\t55\nchr10\t40325400\t40326900\t0.0012\t142\nchr10\t40332600\t40338600\t0\t445\nchr10\t40344600\t40347300\t0\t564\nchr10\t40364400\t40369200\t0\t1934\nchr10\t40370700\t40379400\t0\t552\nchr10\t40387500\t40401000\t0\t991\nchr10\t40407900\t40410000\t0.0092\t738\nchr10\t40411200\t40416300\t0\t2950\nchr10\t40420800\t40422600\t0.0088\t247\nchr10\t40425600\t40429500\t0\t186\nchr10\t40435500\t40437900\t0\t373\nchr10\t40440900\t40442700\t0\t686\nchr10\t40445700\t40446000\t0.0311\t58\nchr10\t40447200\t40448400\t0\t79\nchr10\t40453200\t40456500\t0\t404\nchr10\t40461000\t40463400\t0\t904\nchr10\t40465200\t40467900\t0\t907\nchr10\t40476000\t40481700\t0\t965\nchr10\t40482900\t40487400\t0\t965\nchr10\t40488600\t40494600\t0\t249\nchr10\t40495800\t40498200\t0\t255\nchr10\t40502100\t40519200\t0\t615\nchr10\t40524600\t40525500\t0\t239\nchr10\t40532100\t40533000\t0.001\t110\nchr10\t40537500\t40548600\t0\t634\nchr10\t40550700\t40551000\t0\t634\nchr10\t40555200\t40558500\t0\t3094\nchr10\t40567500\t40568100\t0.0021\t321\nchr10\t40574700\t40576500\t0\t226\nchr10\t40578300\t40580700\t0\t169\nchr10\t40582200\t40582800\t0\t120\nchr10\t40584000\t40584300\t0.1375\t50\nchr10\t40586400\t40613100\t0\t3793\nchr10\t40614600\t40620600\t0\t1089\nchr10\t40626900\t40627500\t0.0556\t155\nchr10\t40633200\t40634100\t0\t477\nchr10\t40639800\t40641000\t0\t191\nchr10\t40642800\t40651200\t0\t674\nchr10\t40652400\t40653300\t0\t143\nchr10\t40657500\t40671600\t0\t400\nchr10\t40673100\t40674000\t0.0118\t431\nchr10\t40676100\t40683900\t0\t759\nchr10\t40685400\t40686300\t0\t188\nchr10\t40687800\t40689300\t0\t222\nchr10\t40691100\t40692000\t0\t82\nchr10\t40700700\t40701300\t0.35\t134\nchr10\t40704600\t40706700\t0.0041\t275\nchr10\t40709700\t40710000\t0.0914\t28\nchr10\t40711500\t40718100\t0\t422\nchr10\t40720500\t40721400\t0\t215\nchr10\t40722900\t40723500\t0\t20\nchr10\t40726500\t40730100\t0\t738\nchr10\t40733400\t40737300\t0\t633\nchr10\t40739100\t40740900\t0\t158\nchr10\t40743300\t40743600\t0\t26\nchr10\t40744800\t40745700\t0\t157\nchr10\t40748700\t40749300\t0\t178\nchr10\t40751100\t40753500\t0\t412\nchr10\t40755900\t40758300\t0\t340\nchr10\t40759800\t40766700\t0\t483\nchr10\t40767900\t40772100\t0\t599\nchr10\t40773300\t40775700\t0\t229\nchr10\t40781400\t40785300\t0\t262\nchr10\t40786500\t40787700\t0.0001\t181\nchr10\t40790400\t40794000\t0\t666\nchr10\t40795500\t40808700\t0\t513\nchr10\t40810800\t40812000\t0\t646\nchr10\t40814400\t40818900\t0\t373\nchr10\t40821600\t40823400\t0\t400\nchr10\t40827300\t40828800\t0\t1015\nchr10\t40830000\t40839900\t0\t1015\nchr10\t40841400\t40855500\t0\t1015\nchr10\t40857000\t40857300\t0.4777\t41\nchr10\t40862100\t40864500\t0\t231\nchr10\t40866300\t40867500\t0\t102\nchr10\t40869900\t40871400\t0\t504\nchr10\t40873200\t40873500\t0\t34\nchr10\t40874700\t40876200\t0\t213\nchr10\t40878000\t40881000\t0\t525\nchr10\t40882500\t40884600\t0\t273\nchr10\t40886100\t40886400\t0\t10\nchr10\t40888500\t40890600\t0.008\t184\nchr10\t40891800\t40898700\t0\t1649\nchr10\t40900200\t40907100\t0\t359\nchr10\t40908300\t40908900\t0.1968\t182\nchr10\t40911600\t40912800\t0\t261\nchr10\t40915500\t40915800\t0.5614\t78\nchr10\t40917600\t40920900\t0\t308\nchr10\t40923900\t40927200\t0\t1318\nchr10\t40928700\t40929600\t0\t1318\nchr10\t40931400\t40943400\t0\t803\nchr10\t40944900\t40949700\t0\t241\nchr10\t40954200\t40958400\t0\t548\nchr10\t40959900\t40969200\t0\t548\nchr10\t40970400\t40972200\t0\t624\nchr10\t40973400\t40984500\t0\t2674\nchr10\t40986000\t40989600\t0\t571\nchr10\t40990800\t40992900\t0\t782\nchr10\t40994100\t40994700\t0\t135\nchr10\t40996800\t40997400\t0.2009\t60\nchr10\t40998600\t41001900\t0\t473\nchr10\t41003100\t41003400\t0\t473\nchr10\t41004600\t41009700\t0\t259\nchr10\t41010900\t41014200\t0\t379\nchr10\t41015400\t41018400\t0\t357\nchr10\t41019900\t41022300\t0\t357\nchr10\t41025300\t41030400\t0\t260\nchr10\t41031600\t41033400\t0\t260\nchr10\t41034900\t41039400\t0\t822\nchr10\t41042100\t41048700\t0\t356\nchr10\t41049900\t41055600\t0\t356\nchr10\t41056800\t41057400\t0\t356\nchr10\t41060100\t41063100\t0\t160\nchr10\t41066100\t41079300\t0\t541\nchr10\t41080800\t41081100\t0.127\t80\nchr10\t41082300\t41084700\t0\t465\nchr10\t41086500\t41090700\t0\t1383\nchr10\t41091900\t41092800\t0.2187\t127\nchr10\t41096400\t41096700\t0\t130\nchr10\t41098200\t41099400\t0\t130\nchr10\t41100600\t41101800\t0\t143\nchr10\t41104500\t41106000\t0.0015\t530\nchr10\t41107500\t41108100\t0\t337\nchr10\t41109300\t41112900\t0\t337\nchr10\t41114700\t41115000\t0\t36\nchr10\t41117400\t41119500\t0\t474\nchr10\t41120700\t41121600\t0\t474\nchr10\t41124300\t41126700\t0\t2057\nchr10\t41128200\t41134200\t0\t2057\nchr10\t41135400\t41138100\t0\t410\nchr10\t41139900\t41140500\t0\t410\nchr10\t41143800\t41145600\t0\t506\nchr10\t41148900\t41152800\t0\t248\nchr10\t41154000\t41158800\t0\t435\nchr10\t41160600\t41160900\t0\t29\nchr10\t41162400\t41164800\t0\t286\nchr10\t41166000\t41166900\t0\t180\nchr10\t41169600\t41183400\t0\t517\nchr10\t41185200\t41189100\t0\t882\nchr10\t41190600\t41207700\t0\t882\nchr10\t41208900\t41212500\t0\t268\nchr10\t41214900\t41220000\t0\t188\nchr10\t41221800\t41224200\t0\t114\nchr10\t41225400\t41229300\t0\t68\nchr10\t41231400\t41232900\t0\t468\nchr10\t41235000\t41237700\t0\t437\nchr10\t41239200\t41241000\t0\t114\nchr10\t41243400\t41251200\t0\t437\nchr10\t41255100\t41258700\t0\t111\nchr10\t41260800\t41268900\t0\t1993\nchr10\t41270100\t41273400\t0\t194\nchr10\t41274900\t41293500\t0\t629\nchr10\t41295600\t41296500\t0\t500\nchr10\t41299500\t41301300\t0\t213\nchr10\t41302800\t41306100\t0\t456\nchr10\t41307600\t41312700\t0\t456\nchr10\t41313900\t41314500\t0\t276\nchr10\t41315700\t41316600\t0\t53\nchr10\t41319900\t41323200\t0\t491\nchr10\t41326200\t41327700\t0\t265\nchr10\t41328900\t41336400\t0\t327\nchr10\t41338500\t41342700\t0\t197\nchr10\t41344500\t41356200\t0\t189\nchr10\t41358900\t41361000\t0\t117\nchr10\t41364300\t41368500\t0\t204\nchr10\t41370300\t41374500\t0\t341\nchr10\t41376000\t41378700\t0\t499\nchr10\t41379900\t41384700\t0\t499\nchr10\t41387400\t41391000\t0\t207\nchr10\t41395200\t41397900\t0\t85\nchr10\t41399400\t41407200\t0\t2845\nchr10\t41408400\t41419800\t0\t2845\nchr10\t41421600\t41422800\t0\t539\nchr10\t41424000\t41430900\t0\t539\nchr10\t41432700\t41433000\t0\t539\nchr10\t41436300\t41448300\t0\t990\nchr10\t41449500\t41450400\t0\t990\nchr10\t41454600\t41456700\t0\t310\nchr10\t41460300\t41461800\t0\t275\nchr10\t41466300\t41466900\t0\t89\nchr10\t41468700\t41469000\t0\t89\nchr10\t41470800\t41478300\t0\t285\nchr10\t41481600\t41484300\t0\t495\nchr10\t41488800\t41490000\t0\t78\nchr10\t41493900\t41561100\t0\t1191\nchr10\t41562300\t41579100\t0\t1191\nchr10\t41580600\t41582100\t0\t1191\nchr10\t41583300\t41592900\t0.1571\t454\nchr10\t41693700\t41706300\t0\t126\nchr10\t41713500\t41714100\t0.216\t97\nchr10\t41843700\t41844300\t0.5642\t288\nchr10\t41845500\t41850000\t0.3464\t689\nchr10\t41851500\t41855400\t0.1896\t1221\nchr10\t41856900\t41916300\t0.0388\t17851\nchr10\t42066000\t42095100\t0.0028\t4510\nchr10\t42097200\t42098100\t0.5658\t338\nchr10\t42099600\t42100200\t0.3268\t1017\nchr10\t42101400\t42102000\t0.4763\t489\nchr10\t42103200\t42105000\t0.4763\t489\nchr10\t42128100\t42128400\t0.1748\t167\nchr10\t42129900\t42130500\t0.1748\t167\nchr10\t42133800\t42134100\t0.377\t69\nchr10\t42152100\t42153600\t0.5628\t182\nchr10\t42165900\t42166200\t0.4602\t313\nchr10\t42177000\t42177900\t0.5316\t135\nchr10\t42185400\t42185700\t0.3882\t72\nchr10\t42189300\t42189600\t0.3905\t60\nchr10\t42206100\t42206400\t0.5031\t44\nchr10\t42210000\t42210300\t0.6773\t66\nchr10\t42211500\t42213900\t0.0506\t54\nchr10\t42217200\t42218400\t0.4472\t69\nchr10\t42219600\t42219900\t0.3281\t30\nchr10\t42243300\t42243900\t0.435\t33\nchr10\t42255900\t42256200\t0.6357\t135\nchr10\t42261900\t42262200\t0.4039\t116\nchr10\t42277200\t42277500\t0.4906\t46\nchr10\t42280200\t42281100\t0.3768\t188\nchr10\t42283800\t42284100\t0.5566\t87\nchr10\t42294900\t42321600\t0.0708\t1830\nchr10\t42436500\t42441300\t0.2156\t71\nchr10\t42448200\t42449400\t0.4002\t79\nchr10\t42530700\t42531000\t0.22\t69\nchr10\t42669900\t42670200\t0.1866\t68\nchr10\t42795000\t42795300\t0.6387\t49\nchr10\t42995100\t42995400\t0.0872\t60\nchr10\t43422600\t43423200\t0.0068\t44\nchr10\t44140800\t44141100\t0.4141\t48\nchr10\t44148000\t44148300\t0.2003\t56\nchr10\t44222100\t44223300\t0\t58\nchr10\t44272200\t44272500\t0.2517\t91\nchr10\t44442300\t44442900\t0.3891\t66\nchr10\t44483100\t44486700\t0.215\t59\nchr10\t44501400\t44501700\t0.285\t36\nchr10\t44534400\t44534700\t0.3913\t45\nchr10\t44662800\t44663100\t0.4803\t25\nchr10\t45009600\t45011400\t0.0283\t76\nchr10\t45026400\t45026700\t0.3592\t72\nchr10\t45679200\t45693300\t0.0073\t82\nchr10\t45694500\t45696000\t0.0073\t82\nchr10\t45697200\t45699900\t0.0073\t82\nchr10\t45702600\t45703800\t0.1367\t70\nchr10\t45711600\t45711900\t0.1417\t40\nchr10\t45719400\t45719700\t0.5505\t64\nchr10\t45726300\t45726600\t0.3254\t59\nchr10\t45729900\t45731700\t0.3601\t62\nchr10\t45733200\t45733500\t0.4722\t88\nchr10\t45735300\t45735600\t0.4722\t88\nchr10\t45737100\t45738600\t0.0786\t69\nchr10\t45739800\t45740400\t0.0786\t69\nchr10\t45743700\t45746400\t0.2021\t72\nchr10\t45747600\t45748200\t0.1064\t58\nchr10\t45752700\t45753900\t0.1755\t78\nchr10\t45756000\t45757500\t0.1755\t78\nchr10\t45759000\t45760800\t0.0297\t59\nchr10\t45763200\t45768000\t0.0579\t92\nchr10\t45770100\t45771900\t0.3141\t68\nchr10\t45773100\t45782700\t0\t74\nchr10\t45786900\t45787500\t0.3987\t61\nchr10\t45794400\t45794700\t0.5027\t33\nchr10\t45822600\t45823800\t0.0303\t117\nchr10\t45825900\t45837300\t0.0303\t117\nchr10\t45838800\t45843600\t0.0303\t117\nchr10\t45845100\t45846900\t0.1667\t77\nchr10\t45848100\t45848400\t0.1679\t66\nchr10\t45850200\t45850500\t0.1679\t66\nchr10\t45861000\t45863400\t0.2767\t68\nchr10\t45867900\t45868500\t0.4272\t73\nchr10\t45873900\t45874500\t0.1613\t66\nchr10\t45880800\t45882300\t0.0823\t73\nchr10\t45884700\t45886500\t0.0823\t73\nchr10\t45888600\t45892500\t0.0823\t73\nchr10\t45894000\t45895800\t0.0823\t73\nchr10\t45898500\t45898800\t0.0823\t73\nchr10\t45901500\t45904200\t0\t94\nchr10\t45905700\t45906900\t0\t94\nchr10\t45908400\t45911100\t0\t94\nchr10\t45912900\t45914400\t0.2698\t62\nchr10\t45915600\t45915900\t0.2698\t62\nchr10\t45929100\t45929700\t0.3259\t50\nchr10\t45936000\t45936300\t0.1752\t21\nchr10\t45937500\t45937800\t0.5111\t42\nchr10\t45954600\t45955200\t0.3906\t57\nchr10\t45959700\t45961800\t0.0874\t55\nchr10\t45970500\t45971100\t0.396\t66\nchr10\t45977100\t45977400\t0.4301\t54\nchr10\t45995400\t45995700\t0.1535\t60\nchr10\t46104900\t46105200\t0.5239\t49\nchr10\t46108500\t46110300\t0\t82\nchr10\t46111500\t46119900\t0\t82\nchr10\t46121400\t46131600\t0\t82\nchr10\t46132800\t46133700\t0.0398\t76\nchr10\t46134900\t46137300\t0.0398\t76\nchr10\t46138800\t46145700\t0\t103\nchr10\t46146900\t46150200\t0\t103\nchr10\t46151400\t46153800\t0.0024\t64\nchr10\t46155000\t46163700\t0.0528\t88\nchr10\t46205100\t46215300\t0\t78\nchr10\t46218600\t46218900\t0.4653\t15\nchr10\t46249200\t46249800\t0.567\t68\nchr10\t46281300\t46281600\t0.4132\t65\nchr10\t46312500\t46312800\t0.2226\t68\nchr10\t46332900\t46335600\t0.0563\t66\nchr10\t46337100\t46337400\t0.0563\t66\nchr10\t46340100\t46345800\t0.1533\t66\nchr10\t46347900\t46353300\t0\t98\nchr10\t46354500\t46355400\t0\t98\nchr10\t46356600\t46357500\t0\t98\nchr10\t46359000\t46359300\t0.2871\t59\nchr10\t46361100\t46362600\t0.0265\t82\nchr10\t46366200\t46366800\t0.0126\t81\nchr10\t46368600\t46374300\t0.0126\t81\nchr10\t46375800\t46389600\t0\t100\nchr10\t46390800\t46392900\t0.1385\t66\nchr10\t46394700\t46395900\t0.3509\t62\nchr10\t46397400\t46406700\t0.0137\t82\nchr10\t46411800\t46413000\t0.0321\t68\nchr10\t46414800\t46417200\t0.0398\t60\nchr10\t46418700\t46425300\t0\t100\nchr10\t46426800\t46429200\t0\t100\nchr10\t46431300\t46431600\t0.305\t43\nchr10\t46434300\t46434900\t0.0192\t90\nchr10\t46436100\t46439100\t0.0192\t90\nchr10\t46440300\t46441500\t0.0192\t90\nchr10\t46444500\t46446600\t0\t78\nchr10\t46447800\t46450800\t0\t78\nchr10\t46452300\t46458000\t0\t79\nchr10\t46459200\t46482900\t0\t90\nchr10\t46484400\t46514100\t0\t90\nchr10\t46561500\t46568700\t0.0045\t78\nchr10\t46569900\t46577700\t0.0045\t78\nchr10\t46578900\t46596900\t0\t99\nchr10\t46598100\t46633800\t0\t75\nchr10\t46635000\t46638900\t0.019\t59\nchr10\t46640700\t46641300\t0.02\t68\nchr10\t46642800\t46644900\t0.02\t68\nchr10\t46647600\t46651200\t0.0014\t63\nchr10\t46652400\t46653600\t0.0014\t63\nchr10\t46655700\t46657500\t0\t70\nchr10\t46659300\t46664700\t0\t70\nchr10\t46666500\t46667100\t0.2339\t59\nchr10\t46672500\t46673700\t0.3847\t55\nchr10\t46675200\t46675800\t0.1634\t50\nchr10\t46677300\t46680300\t0.0599\t74\nchr10\t46682400\t46683900\t0.0599\t74\nchr10\t46685100\t46686900\t0\t62\nchr10\t46688700\t46689900\t0.349\t70\nchr10\t46691100\t46694100\t0\t58\nchr10\t46696200\t46712100\t0\t80\nchr10\t46714800\t46716000\t0.1993\t65\nchr10\t46722600\t46724100\t0.2929\t87\nchr10\t46725300\t46725600\t0.4839\t64\nchr10\t46726800\t46727100\t0.2153\t62\nchr10\t46728900\t46739400\t0\t97\nchr10\t46741500\t46742700\t0\t97\nchr10\t46743900\t46744500\t0.3426\t60\nchr10\t46745700\t46748700\t0.0795\t77\nchr10\t46754400\t46757700\t0\t74\nchr10\t46760100\t46762800\t0.0332\t83\nchr10\t46764300\t46767000\t0.0332\t83\nchr10\t46770900\t46773300\t0.2467\t84\nchr10\t46776000\t46778100\t0.1498\t82\nchr10\t46783200\t46783500\t0.3848\t37\nchr10\t46790400\t46791000\t0.292\t62\nchr10\t46792500\t46793100\t0.1416\t72\nchr10\t46794300\t46794600\t0.1416\t72\nchr10\t46800600\t46800900\t0.1804\t68\nchr10\t46802700\t46803000\t0.3417\t56\nchr10\t46812300\t46813500\t0.2502\t81\nchr10\t46816500\t46817400\t0.267\t76\nchr10\t46818600\t46819200\t0.267\t76\nchr10\t46821300\t46825800\t0.0012\t105\nchr10\t46827000\t46829100\t0.0012\t105\nchr10\t46830300\t46833000\t0.0012\t105\nchr10\t46834200\t46838100\t0.0012\t105\nchr10\t46839900\t46850100\t0.0007\t98\nchr10\t46851300\t46852200\t0\t76\nchr10\t46853400\t46859700\t0.0013\t89\nchr10\t46862100\t46868100\t0.0013\t89\nchr10\t46869300\t46871100\t0.3149\t62\nchr10\t46872600\t46872900\t0.2446\t67\nchr10\t46879500\t46880100\t0.0026\t80\nchr10\t46881600\t46887000\t0.0026\t80\nchr10\t46888200\t46889700\t0.0026\t80\nchr10\t46892700\t46897800\t0\t83\nchr10\t46899600\t46900500\t0\t83\nchr10\t46901700\t46922700\t0\t83\nchr10\t46924200\t46924800\t0.0282\t68\nchr10\t46926900\t46931400\t0.0428\t82\nchr10\t46932600\t46935600\t0\t85\nchr10\t46938300\t46946700\t0\t85\nchr10\t46948200\t46948500\t0\t91\nchr10\t46949700\t46950300\t0\t91\nchr10\t46951800\t46953300\t0\t91\nchr10\t46954500\t46982700\t0\t91\nchr10\t46984500\t46991700\t0\t73\nchr10\t47005200\t47006700\t0.5332\t56\nchr10\t47407800\t47408100\t0.4509\t69\nchr10\t47459400\t47460300\t0.2185\t64\nchr10\t47461800\t47464200\t0.0635\t88\nchr10\t47466900\t47468700\t0.1602\t75\nchr10\t47470200\t47492100\t0\t116\nchr10\t47493900\t47494800\t0\t116\nchr10\t47496300\t47496600\t0\t116\nchr10\t47498400\t47501100\t0.152\t99\nchr10\t47503500\t47521200\t0\t89\nchr10\t47522400\t47525400\t0\t80\nchr10\t47526600\t47548200\t0\t80\nchr10\t47549400\t47550600\t0\t80\nchr10\t47562300\t47570100\t0\t89\nchr10\t47571900\t47572200\t0\t89\nchr10\t47573400\t47576400\t0\t89\nchr10\t47577600\t47580000\t0\t89\nchr10\t47582400\t47586300\t0\t84\nchr10\t47588100\t47588400\t0\t84\nchr10\t47591700\t47594700\t0.1187\t67\nchr10\t47595900\t47596500\t0\t91\nchr10\t47597700\t47599500\t0\t91\nchr10\t47600700\t47611800\t0\t91\nchr10\t47613300\t47615100\t0\t68\nchr10\t47616300\t47621400\t0\t68\nchr10\t47623500\t47625600\t0\t47\nchr10\t47628900\t47631000\t0\t89\nchr10\t47632800\t47644200\t0\t89\nchr10\t47645400\t47649300\t0.0095\t68\nchr10\t47650500\t47650800\t0.0095\t68\nchr10\t47653500\t47655300\t0.0026\t65\nchr10\t47656500\t47658000\t0.0922\t75\nchr10\t47660100\t47663100\t0.0922\t75\nchr10\t47664600\t47665200\t0.0922\t75\nchr10\t47668200\t47668500\t0.4707\t61\nchr10\t47672100\t47672400\t0.4524\t43\nchr10\t47674800\t47675400\t0.3296\t63\nchr10\t47677500\t47679300\t0\t83\nchr10\t47680800\t47682600\t0.215\t65\nchr10\t47685600\t47686200\t0.4749\t63\nchr10\t47688000\t47689200\t0\t70\nchr10\t47690400\t47692800\t0\t70\nchr10\t47697300\t47698500\t0.0789\t78\nchr10\t47700600\t47702100\t0.0532\t68\nchr10\t47704200\t47706600\t0.0532\t68\nchr10\t47708100\t47719800\t0\t96\nchr10\t47721600\t47726400\t0\t96\nchr10\t47727600\t47734800\t0\t96\nchr10\t47736000\t47736600\t0\t96\nchr10\t47737800\t47742900\t0\t96\nchr10\t47745000\t47747700\t0\t91\nchr10\t47748900\t47749200\t0\t91\nchr10\t47750400\t47762700\t0\t91\nchr10\t47764500\t47776500\t0\t92\nchr10\t47778300\t47780400\t0\t92\nchr10\t47870400\t47894100\t0\t91\nchr10\t47895300\t47936700\t0\t91\nchr10\t47937900\t47938500\t0.0375\t78\nchr10\t47939700\t47940000\t0.0375\t78\nchr10\t47944200\t47944500\t0.6086\t73\nchr10\t47945700\t47948700\t0.0863\t83\nchr10\t47949900\t47950200\t0.5277\t60\nchr10\t47955600\t47956500\t0.1099\t71\nchr10\t47960100\t47969700\t0\t89\nchr10\t47971500\t47973600\t0.0257\t81\nchr10\t47976000\t47977200\t0\t82\nchr10\t47978400\t47979000\t0\t82\nchr10\t47980500\t47982000\t0\t82\nchr10\t47983200\t47985000\t0\t82\nchr10\t47986800\t47991300\t0\t82\nchr10\t47993100\t47993400\t0\t82\nchr10\t47995500\t47997000\t0\t102\nchr10\t47998200\t48000600\t0\t102\nchr10\t48001800\t48003000\t0\t102\nchr10\t48004500\t48067800\t0\t102\nchr10\t48069000\t48100200\t0\t88\nchr10\t48101400\t48103500\t0\t88\nchr10\t48105000\t48119100\t0\t88\nchr10\t48120600\t48124800\t0.0044\t63\nchr10\t48127200\t48128100\t0\t85\nchr10\t48129300\t48150000\t0\t85\nchr10\t48151200\t48152100\t0.0058\t103\nchr10\t48153900\t48159000\t0.0058\t103\nchr10\t48162000\t48163500\t0.0128\t81\nchr10\t48164700\t48173400\t0.0128\t81\nchr10\t48174900\t48175200\t0.4416\t50\nchr10\t48179100\t48179400\t0.191\t65\nchr10\t48180600\t48180900\t0.502\t69\nchr10\t48675900\t48676200\t0.5334\t11\nchr10\t48709200\t48709500\t0.5153\t33\nchr10\t49126500\t49127700\t0.3559\t79\nchr10\t49247400\t49247700\t0.379\t71\nchr10\t49250100\t49250400\t0.5498\t119\nchr10\t49847700\t49848600\t0.3582\t46\nchr10\t49850100\t49852800\t0.0404\t67\nchr10\t49854000\t49856100\t0.0404\t67\nchr10\t49857600\t49864800\t0.0404\t67\nchr10\t49867200\t49867800\t0.4217\t54\nchr10\t49870800\t49875900\t0\t71\nchr10\t49877400\t49880100\t0\t71\nchr10\t49882200\t49884900\t0.2658\t58\nchr10\t49898400\t49898700\t0.4349\t60\nchr10\t49923900\t49924200\t0.2443\t60\nchr10\t49930200\t49931100\t0.0828\t79\nchr10\t49940100\t49940700\t0.4284\t54\nchr10\t49946700\t49947000\t0.4539\t60\nchr10\t49961700\t49963200\t0.2777\t76\nchr10\t49967700\t49968000\t0.4278\t69\nchr10\t49972500\t49974900\t0.2269\t60\nchr10\t49977300\t49977600\t0.4861\t37\nchr10\t49987800\t49988100\t0.4156\t72\nchr10\t49996500\t50006100\t0\t101\nchr10\t50007300\t50007600\t0\t101\nchr10\t50010000\t50010300\t0.5815\t79\nchr10\t50012700\t50013900\t0.2203\t74\nchr10\t50034600\t50034900\t0.4511\t79\nchr10\t50050500\t50050800\t0.2541\t65\nchr10\t50067000\t50067300\t0.3603\t57\nchr10\t50070600\t50072400\t0.2618\t51\nchr10\t50073600\t50074200\t0.131\t65\nchr10\t50077800\t50079300\t0.0619\t60\nchr10\t50080500\t50081100\t0.1558\t50\nchr10\t50084700\t50087100\t0.1311\t69\nchr10\t50088600\t50088900\t0.1841\t65\nchr10\t50091000\t50091300\t0.1841\t65\nchr10\t50093100\t50094000\t0.1842\t84\nchr10\t50096100\t50097900\t0.0409\t73\nchr10\t50099400\t50100000\t0.2764\t49\nchr10\t50104800\t50108700\t0\t77\nchr10\t50110800\t50123100\t0\t92\nchr10\t50125200\t50125500\t0.4979\t54\nchr10\t50127600\t50127900\t0.3333\t63\nchr10\t50144400\t50145000\t0.1163\t52\nchr10\t50149800\t50150100\t0.3459\t12\nchr10\t50152500\t50153700\t0.2923\t31\nchr10\t50155200\t50155500\t0.3463\t52\nchr10\t50160600\t50161200\t0.1113\t52\nchr10\t50163600\t50166900\t0.0345\t73\nchr10\t50168400\t50168700\t0.0345\t73\nchr10\t50171700\t50172900\t0.0083\t51\nchr10\t50174100\t50174400\t0.0083\t51\nchr10\t50181900\t50184600\t0\t77\nchr10\t50186100\t50193000\t0\t77\nchr10\t50195400\t50196900\t0.4014\t75\nchr10\t50267100\t50267400\t0.477\t42\nchr10\t50297100\t50297700\t0.404\t79\nchr10\t50322600\t50322900\t0.5046\t48\nchr10\t50701800\t50702100\t0.4594\t63\nchr10\t50707200\t50710200\t0.0217\t73\nchr10\t50712600\t50713800\t0.3465\t67\nchr10\t50745000\t50746800\t0.0951\t58\nchr10\t50748900\t50756100\t0\t75\nchr10\t50757900\t50760000\t0.0236\t85\nchr10\t50769600\t50769900\t0.3382\t75\nchr10\t50772300\t50773800\t0.1026\t55\nchr10\t50775600\t50776500\t0.3633\t80\nchr10\t50779200\t50779500\t0.2049\t77\nchr10\t51512400\t51514200\t0.1026\t74\nchr10\t52181700\t52182600\t0.0267\t64\nchr10\t52233300\t52239300\t0.0148\t74\nchr10\t52681500\t52681800\t0.3897\t27\nchr10\t52834200\t52834500\t0.6014\t14\nchr10\t53495700\t53497800\t0.1425\t93\nchr10\t53761800\t53762400\t0.2137\t31\nchr10\t53793900\t53794200\t0.3424\t97\nchr10\t54027000\t54028800\t0.2289\t83\nchr10\t54622500\t54622800\t0.2745\t39\nchr10\t54717000\t54717900\t0.4302\t61\nchr10\t54735600\t54735900\t0.074\t26\nchr10\t54757200\t54757500\t0.285\t49\nchr10\t54825300\t54825600\t0.1868\t87\nchr10\t55069500\t55069800\t0.1996\t89\nchr10\t55157400\t55157700\t0.465\t69\nchr10\t55542600\t55543200\t0.2313\t45\nchr10\t55589700\t55590000\t0.4491\t55\nchr10\t55603800\t55607700\t0.1627\t87\nchr10\t55683600\t55688100\t0.1379\t65\nchr10\t55695600\t55695900\t0.4433\t44\nchr10\t55942200\t55942500\t0.3104\t41\nchr10\t56187600\t56188500\t0.334\t92\nchr10\t56191200\t56191500\t0.3125\t66\nchr10\t56395200\t56395800\t0.4393\t87\nchr10\t56442600\t56442900\t0.4592\t53\nchr10\t56526600\t56527500\t0.3669\t62\nchr10\t56709600\t56709900\t0.1662\t63\nchr10\t57196800\t57197100\t0.382\t67\nchr10\t57255300\t57255900\t0.5808\t62\nchr10\t57537000\t57537300\t0.3529\t50\nchr10\t58148100\t58148400\t0.5689\t53\nchr10\t58245900\t58247400\t0.1822\t61\nchr10\t58319400\t58319700\t0.3025\t439\nchr10\t58653900\t58655700\t0.0362\t58\nchr10\t59423700\t59424000\t0.4241\t62\nchr10\t59540400\t59540700\t0.488\t84\nchr10\t59605800\t59606100\t0.3878\t29\nchr10\t59783100\t59784000\t0.3956\t51\nchr10\t59882100\t59882700\t0.364\t75\nchr10\t60180300\t60180600\t0.0413\t1226\nchr10\t60469200\t60469500\t0.6693\t28\nchr10\t60640200\t60640800\t0.4014\t87\nchr10\t60642000\t60642300\t0.4014\t87\nchr10\t60694800\t60695100\t0.3116\t70\nchr10\t60696600\t60697200\t0.3116\t70\nchr10\t61055700\t61057200\t0.1837\t108\nchr10\t61334400\t61334700\t0.5644\t68\nchr10\t61680300\t61680600\t0.1067\t12\nchr10\t62445000\t62445300\t0.3258\t95\nchr10\t62500200\t62500500\t0.5216\t69\nchr10\t62603400\t62608200\t0.1556\t76\nchr10\t62677500\t62677800\t0.1159\t78\nchr10\t62947200\t62947500\t0.4468\t60\nchr10\t64123500\t64124700\t0.2689\t78\nchr10\t64371900\t64372200\t0.2402\t65\nchr10\t64440000\t64440300\t0.5157\t72\nchr10\t64836300\t64836600\t0.186\t61\nchr10\t64925400\t64929900\t0.0592\t79\nchr10\t65391300\t65392200\t0.3999\t36\nchr10\t65524200\t65524800\t0.4668\t21\nchr10\t67233300\t67235100\t0.1944\t97\nchr10\t67388100\t67391100\t0.1988\t95\nchr10\t67561200\t67561800\t0.2682\t64\nchr10\t67564800\t67565700\t0.2993\t46\nchr10\t67578000\t67578900\t0.2308\t89\nchr10\t67581900\t67582500\t0.2308\t89\nchr10\t67673100\t67673400\t0.3333\t66\nchr10\t67692300\t67692600\t0.0638\t69\nchr10\t67705200\t67705800\t0.4653\t75\nchr10\t67727100\t67727400\t0.6532\t14\nchr10\t68521500\t68521800\t0.4786\t53\nchr10\t69992100\t69993900\t0.0011\t114\nchr10\t70686300\t70688700\t0.0127\t103\nchr10\t71688600\t71689200\t0.4494\t112\nchr10\t71759700\t71760300\t0.6628\t39\nchr10\t71868600\t71869200\t0.4215\t56\nchr10\t71875500\t71875800\t0.5415\t74\nchr10\t73326300\t73326600\t0.3161\t84\nchr10\t73328400\t73329000\t0.3161\t84\nchr10\t73417800\t73418100\t0.461\t57\nchr10\t73674000\t73674300\t0.2573\t53\nchr10\t73677300\t73685400\t0\t78\nchr10\t74220900\t74221200\t0.4598\t88\nchr10\t75332400\t75333900\t0.3535\t46\nchr10\t75479700\t75480300\t0.2357\t52\nchr10\t75558600\t75559200\t0.5356\t86\nchr10\t76221000\t76221300\t0.4034\t51\nchr10\t76251300\t76251600\t0.6589\t49\nchr10\t76587000\t76591800\t0\t91\nchr10\t76601700\t76602000\t0.6308\t47\nchr10\t76660800\t76661100\t0.3366\t60\nchr10\t76819200\t76819500\t0.2842\t44\nchr10\t76832700\t76833000\t0.2872\t35\nchr10\t77041200\t77041500\t0.1875\t23\nchr10\t77568300\t77570400\t0.2109\t81\nchr10\t78089100\t78094200\t0\t85\nchr10\t79332600\t79332900\t0.0906\t81\nchr10\t79338000\t79338600\t0.1724\t77\nchr10\t79504200\t79504800\t0.2228\t69\nchr10\t79508400\t79509900\t0.2018\t62\nchr10\t79512600\t79512900\t0.5955\t53\nchr10\t79519200\t79520100\t0.0108\t63\nchr10\t79524000\t79524300\t0.2115\t50\nchr10\t79528200\t79528500\t0.2512\t36\nchr10\t79536300\t79536900\t0.2277\t81\nchr10\t79582800\t79583100\t0.6247\t19\nchr10\t79654200\t79654500\t0.5154\t85\nchr10\t79661400\t79661700\t0.2462\t71\nchr10\t79673100\t79673400\t0.3082\t54\nchr10\t79676700\t79677000\t0.0711\t43\nchr10\t79696800\t79698900\t0.2473\t68\nchr10\t79701600\t79708500\t0\t99\nchr10\t79709700\t79714800\t0\t118\nchr10\t79716600\t79718100\t0.0751\t69\nchr10\t79723200\t79723500\t0.4055\t71\nchr10\t79725900\t79726200\t0.5082\t42\nchr10\t79727700\t79728000\t0.415\t70\nchr10\t79735500\t79738500\t0.3153\t73\nchr10\t79741800\t79743600\t0.0661\t72\nchr10\t79752000\t79752300\t0.4616\t63\nchr10\t79755300\t79755600\t0.3927\t61\nchr10\t79758000\t79758300\t0.2759\t52\nchr10\t79760700\t79761000\t0.5023\t62\nchr10\t79762500\t79762800\t0.289\t62\nchr10\t79767000\t79767300\t0.3418\t49\nchr10\t79768500\t79772400\t0.0149\t77\nchr10\t79774800\t79775700\t0.0376\t73\nchr10\t79777800\t79778100\t0.0376\t73\nchr10\t79780200\t79783800\t0.0376\t73\nchr10\t79789200\t79789500\t0.311\t77\nchr10\t79794600\t79794900\t0.1117\t54\nchr10\t79797300\t79797900\t0.1138\t53\nchr10\t79801200\t79802100\t0.2008\t56\nchr10\t79804200\t79804800\t0.2008\t56\nchr10\t79810800\t79812300\t0.1822\t50\nchr10\t79813800\t79815300\t0.0701\t61\nchr10\t79821000\t79821300\t0.1626\t57\nchr10\t79835400\t79836000\t0.2406\t63\nchr10\t79839900\t79853100\t0\t102\nchr10\t79863900\t79864200\t0.3947\t65\nchr10\t79871400\t79872600\t0.2904\t69\nchr10\t79874700\t79876200\t0.2311\t64\nchr10\t79877700\t79878900\t0.4953\t71\nchr10\t79959000\t79960500\t0.4678\t67\nchr10\t79965600\t79967700\t0.0689\t105\nchr10\t80022300\t80022600\t0.1799\t64\nchr10\t80025600\t80025900\t0.3292\t54\nchr10\t80027400\t80027700\t0.5431\t35\nchr10\t80038200\t80038500\t0.3008\t79\nchr10\t80229900\t80230200\t0.5501\t46\nchr10\t80232000\t80232300\t0.2277\t54\nchr10\t80236200\t80236500\t0.3048\t65\nchr10\t80240400\t80241000\t0.014\t74\nchr10\t80250300\t80251800\t0.3234\t80\nchr10\t80254800\t80255400\t0.1454\t69\nchr10\t80479200\t80479500\t0.5774\t56\nchr10\t80534400\t80535300\t0.2689\t99\nchr10\t80722500\t80724300\t0.0092\t78\nchr10\t80725800\t80726100\t0.0092\t78\nchr10\t81710700\t81714900\t0.0058\t78\nchr10\t81769200\t81771000\t0.1929\t68\nchr10\t81856800\t81857100\t0.5424\t28\nchr10\t82045200\t82045500\t0.0438\t50\nchr10\t82046700\t82047000\t0.3917\t37\nchr10\t82344600\t82347300\t0.2874\t71\nchr10\t82348500\t82348800\t0.2874\t71\nchr10\t82478100\t82478700\t0.3301\t61\nchr10\t82647900\t82648200\t0.4983\t51\nchr10\t82783200\t82783500\t0.3679\t63\nchr10\t83628300\t83628900\t0.4617\t67\nchr10\t83781600\t83782200\t0.0662\t73\nchr10\t83783400\t83785200\t0.0662\t73\nchr10\t84070800\t84071400\t0.0542\t69\nchr10\t84281700\t84282600\t0.0289\t89\nchr10\t84283800\t84285600\t0.0289\t89\nchr10\t84731400\t84731700\t0.4257\t63\nchr10\t84747600\t84748200\t0.3224\t50\nchr10\t84756900\t84761700\t0.1431\t69\nchr10\t84773400\t84775500\t0.0719\t88\nchr10\t84777600\t84778200\t0.5549\t48\nchr10\t84793800\t84794400\t0.4104\t50\nchr10\t84858300\t84859200\t0.1554\t84\nchr10\t85207200\t85207500\t0.3667\t50\nchr10\t85355700\t85361700\t0\t83\nchr10\t85404600\t85404900\t0.5069\t57\nchr10\t85744500\t85745700\t0.0079\t77\nchr10\t86075100\t86075400\t0.1788\t77\nchr10\t86076900\t86077200\t0.1966\t64\nchr10\t86274600\t86274900\t0.4013\t52\nchr10\t86452800\t86453100\t0.5233\t48\nchr10\t87152100\t87152400\t0.3621\t69\nchr10\t87163500\t87163800\t0.4004\t51\nchr10\t87174300\t87174600\t0.5652\t57\nchr10\t87198300\t87198600\t0.2043\t41\nchr10\t87219000\t87221100\t0.2363\t70\nchr10\t87223500\t87237000\t0\t94\nchr10\t87239100\t87240300\t0.0634\t58\nchr10\t87245400\t87245700\t0\t69\nchr10\t87246900\t87247200\t0\t69\nchr10\t87248700\t87259500\t0\t69\nchr10\t87260700\t87261000\t0\t94\nchr10\t87262500\t87308400\t0\t94\nchr10\t87311400\t87311700\t0.2744\t56\nchr10\t87316500\t87317100\t0.0401\t62\nchr10\t87319800\t87320100\t0.5191\t49\nchr10\t87326400\t87326700\t0.1801\t46\nchr10\t87333900\t87334500\t0.3291\t66\nchr10\t87336300\t87336600\t0.5316\t48\nchr10\t87340800\t87341700\t0.315\t53\nchr10\t87347400\t87347700\t0.5078\t45\nchr10\t87351900\t87352200\t0.1229\t67\nchr10\t87356100\t87369300\t0\t110\nchr10\t87385800\t87386100\t0.5346\t37\nchr10\t87389100\t87389400\t0.4753\t84\nchr10\t87390900\t87391200\t0.3894\t64\nchr10\t87406200\t87406500\t0.3241\t50\nchr10\t87418500\t87419100\t0.5429\t49\nchr10\t87430200\t87437100\t0\t104\nchr10\t87438600\t87465900\t0\t104\nchr10\t87467100\t87469200\t0\t75\nchr10\t87470400\t87475500\t0\t75\nchr10\t87477000\t87479700\t0.0033\t75\nchr10\t87481200\t87486300\t0.0033\t75\nchr10\t87487800\t87489300\t0.2809\t85\nchr10\t87490800\t87491100\t0.2809\t85\nchr10\t88977300\t88978200\t0.0107\t87\nchr10\t89320800\t89321100\t0.3368\t70\nchr10\t89787600\t89787900\t0.5267\t14\nchr10\t89997300\t89997600\t0.5053\t52\nchr10\t90012900\t90014400\t0.3917\t79\nchr10\t90154500\t90156000\t0.2163\t65\nchr10\t90331500\t90331800\t0.5684\t42\nchr10\t91209600\t91209900\t0.4537\t40\nchr10\t91440600\t91443300\t0\t71\nchr10\t91446300\t91449000\t0\t69\nchr10\t91504500\t91508400\t0.2675\t108\nchr10\t91752300\t91752600\t0.0854\t70\nchr10\t91754400\t91755000\t0.0854\t70\nchr10\t92115900\t92116200\t0.6898\t30\nchr10\t92140500\t92141400\t0.0016\t73\nchr10\t92374800\t92377800\t0\t108\nchr10\t92631300\t92631600\t0.5534\t38\nchr10\t92673900\t92676000\t0.0133\t64\nchr10\t92966700\t92967000\t0.351\t58\nchr10\t92975700\t92976000\t0.6289\t44\nchr10\t93931500\t93931800\t0.1379\t68\nchr10\t94814700\t94815300\t0.3966\t70\nchr10\t94816800\t94820100\t0.1191\t80\nchr10\t94824900\t94825800\t0.1081\t81\nchr10\t94969500\t94971000\t0.5595\t76\nchr10\t95081400\t95081700\t0.5948\t69\nchr10\t95151600\t95152500\t0.2061\t66\nchr10\t95948100\t95949600\t0\t71\nchr10\t96751500\t96751800\t0.4722\t64\nchr10\t96940200\t96942300\t0.0897\t112\nchr10\t97275000\t97277700\t0\t67\nchr10\t97348500\t97348800\t0.3056\t44\nchr10\t97398000\t97398300\t0.248\t21\nchr10\t97432500\t97433100\t0.2011\t73\nchr10\t97528200\t97528800\t0.6\t52\nchr10\t97678800\t97679100\t0.5996\t51\nchr10\t97842000\t97842300\t0.5966\t70\nchr10\t97996200\t97996500\t0.3544\t62\nchr10\t98220600\t98221200\t0.3873\t69\nchr10\t98542200\t98542500\t0.4947\t86\nchr10\t98547000\t98547300\t0.2739\t89\nchr10\t98697900\t98698200\t0.0443\t98\nchr10\t98699400\t98701200\t0.0443\t98\nchr10\t98781900\t98788200\t0\t85\nchr10\t98802600\t98803200\t0.4601\t77\nchr10\t98941500\t98941800\t0.3866\t76\nchr10\t98961000\t98962800\t0.0242\t61\nchr10\t98986200\t98986500\t0.4686\t58\nchr10\t98988600\t98988900\t0.0926\t77\nchr10\t99154200\t99158400\t0.0367\t78\nchr10\t99771600\t99773400\t0\t84\nchr10\t99823500\t99824100\t0.1567\t95\nchr10\t99837000\t99840900\t0.0049\t80\nchr10\t99892200\t99892800\t0.3947\t61\nchr10\t99932700\t99933000\t0.6058\t57\nchr10\t99934200\t99935100\t0.2194\t54\nchr10\t99961200\t99962100\t0.3818\t53\nchr10\t99963600\t99963900\t0.3377\t58\nchr10\t100092300\t100094400\t0.0109\t57\nchr10\t100422600\t100423200\t0.0078\t59\nchr10\t100425900\t100426500\t0.1282\t59\nchr10\t100703100\t100704000\t0.1304\t102\nchr10\t102885600\t102885900\t0.5297\t38\nchr10\t103128300\t103129800\t0.0436\t64\nchr10\t103250700\t103251300\t0.4739\t149\nchr10\t104528700\t104529600\t0.2325\t88\nchr10\t104531700\t104532000\t0.4208\t67\nchr10\t104785200\t104785500\t0.1876\t43\nchr10\t104859900\t104860200\t0.015\t35\nchr10\t105091200\t105091500\t0.4094\t17\nchr10\t105311400\t105312000\t0.2927\t75\nchr10\t105377400\t105383400\t0\t76\nchr10\t105552600\t105552900\t0.4361\t47\nchr10\t105738600\t105739200\t0.3332\t60\nchr10\t105740400\t105740700\t0.2685\t54\nchr10\t105775800\t105781200\t0\t76\nchr10\t106224000\t106224300\t0.3478\t55\nchr10\t106845000\t106849200\t0.0057\t74\nchr10\t107285400\t107285700\t0.5862\t138\nchr10\t107465100\t107467200\t0.0714\t76\nchr10\t107801100\t107801400\t0.4675\t51\nchr10\t108114600\t108119700\t0.0128\t89\nchr10\t108310200\t108315600\t0\t87\nchr10\t108381000\t108381300\t0.5458\t57\nchr10\t108457800\t108458100\t0.57\t52\nchr10\t108572700\t108573000\t0.0237\t89\nchr10\t109086600\t109086900\t0.1666\t52\nchr10\t109227000\t109229400\t0.2864\t72\nchr10\t109241700\t109242900\t0.0663\t75\nchr10\t109318500\t109318800\t0.5785\t29\nchr10\t109414500\t109415700\t0.47\t80\nchr10\t109812300\t109818300\t0\t435\nchr10\t109827300\t109827600\t0.0733\t80\nchr10\t109829100\t109830900\t0.0733\t80\nchr10\t110120100\t110120400\t0.4454\t63\nchr10\t110766600\t110767200\t0.2407\t76\nchr10\t110856300\t110856600\t0.3362\t44\nchr10\t111178200\t111178500\t0.6178\t60\nchr10\t111431700\t111432000\t0.3058\t19\nchr10\t111584700\t111589800\t0\t68\nchr10\t111792600\t111794100\t0.1615\t71\nchr10\t111797100\t111797700\t0.0628\t91\nchr10\t111814500\t111815400\t0.0526\t96\nchr10\t111817500\t111818400\t0.2522\t86\nchr10\t112063500\t112064100\t0.2657\t70\nchr10\t112066500\t112067700\t0.0027\t120\nchr10\t112106700\t112107300\t0.1604\t74\nchr10\t112108500\t112108800\t0.1604\t74\nchr10\t112204800\t112206600\t0.0037\t75\nchr10\t112398000\t112398300\t0.2865\t16\nchr10\t112455300\t112455600\t0.4737\t11\nchr10\t112595100\t112595400\t0.3652\t51\nchr10\t114083700\t114084000\t0.6599\t24\nchr10\t114102000\t114102300\t0.3001\t31\nchr10\t114414300\t114415500\t0.2739\t92\nchr10\t114634200\t114634500\t0.5304\t51\nchr10\t114787500\t114788100\t0.3828\t43\nchr10\t114790200\t114790500\t0.5201\t43\nchr10\t114935100\t114935700\t0.1033\t99\nchr10\t114998400\t114998700\t0.074\t20\nchr10\t115200600\t115200900\t0.1274\t82\nchr10\t115202100\t115203000\t0.1274\t82\nchr10\t115246500\t115246800\t0.3309\t21\nchr10\t115362900\t115364700\t0.136\t97\nchr10\t115366800\t115368000\t0.1015\t59\nchr10\t115582200\t115587000\t0\t51\nchr10\t116505900\t116506200\t0.308\t20\nchr10\t116633700\t116634000\t0.569\t13\nchr10\t116904900\t116905200\t0.5824\t58\nchr10\t116963100\t116963400\t0.3599\t69\nchr10\t117079200\t117083400\t0.0051\t77\nchr10\t117126600\t117126900\t0.5741\t56\nchr10\t117833100\t117838500\t0.0563\t100\nchr10\t117874800\t117875100\t0.1025\t19\nchr10\t118181400\t118182000\t0.4515\t156\nchr10\t118434300\t118434600\t0.1975\t38\nchr10\t119136600\t119137500\t0.4705\t50\nchr10\t119260800\t119261100\t0.4826\t71\nchr10\t119722800\t119723100\t0.3157\t78\nchr10\t120214500\t120216000\t0.2672\t44\nchr10\t120234300\t120239400\t0.0507\t75\nchr10\t120354900\t120355200\t0.2711\t74\nchr10\t120395100\t120395400\t0.5467\t35\nchr10\t120441000\t120441600\t0.28\t92\nchr10\t120563400\t120563700\t0.674\t49\nchr10\t120913500\t120916800\t0.1701\t107\nchr10\t120920100\t120921900\t0.0064\t76\nchr10\t121584600\t121584900\t0.4983\t41\nchr10\t122202300\t122202900\t0.1614\t69\nchr10\t122581200\t122584500\t0\t78\nchr10\t122593800\t122597100\t0\t74\nchr10\t122601000\t122616900\t0\t54\nchr10\t122680800\t122682000\t0.1662\t69\nchr10\t122807100\t122808000\t0.2207\t132\nchr10\t122809200\t122809500\t0.2207\t132\nchr10\t122942400\t122943600\t0.4216\t82\nchr10\t123255000\t123255600\t0.5763\t171\nchr10\t123292200\t123293400\t0.0889\t65\nchr10\t123340500\t123340800\t0.4834\t66\nchr10\t124507200\t124507800\t0.4709\t32\nchr10\t124610400\t124611000\t0.6433\t85\nchr10\t125228100\t125228400\t0.4632\t39\nchr10\t125616300\t125616900\t0.0698\t90\nchr10\t125946600\t125950500\t0.281\t77\nchr10\t126056700\t126057300\t0.1579\t53\nchr10\t126417900\t126418200\t0.1469\t16\nchr10\t126508200\t126508500\t0.5991\t47\nchr10\t126672300\t126672900\t0.1737\t96\nchr10\t126678000\t126682200\t0.0498\t101\nchr10\t126882900\t126886500\t0.1854\t79\nchr10\t126947100\t126948600\t0.1753\t826\nchr10\t127461300\t127461600\t0.2649\t59\nchr10\t127767000\t127767300\t0.2621\t26\nchr10\t128148300\t128148600\t0.3961\t70\nchr10\t128219400\t128219700\t0.6843\t99\nchr10\t128464500\t128464800\t0.6449\t258\nchr10\t129414600\t129414900\t0.3696\t110\nchr10\t129575400\t129575700\t0.4712\t81\nchr10\t129732900\t129733200\t0.5242\t61\nchr10\t129735600\t129736200\t0.0759\t79\nchr10\t129920100\t129920400\t0.56\t66\nchr10\t130051500\t130052100\t0.2618\t26\nchr10\t130314300\t130314900\t0.049\t104\nchr10\t130316400\t130317000\t0.049\t104\nchr10\t130318200\t130318500\t0.049\t104\nchr10\t130360200\t130360500\t0.5823\t15\nchr10\t130518900\t130519200\t0.3918\t52\nchr10\t130572300\t130573200\t0.2549\t98\nchr10\t130650900\t130651500\t0.061\t74\nchr10\t130759500\t130760700\t0\t38\nchr10\t130785600\t130785900\t0.3364\t38\nchr10\t131020200\t131020500\t0.6048\t47\nchr10\t131042100\t131043000\t0.1692\t15\nchr10\t131060100\t131060400\t0.4119\t69\nchr10\t131228400\t131228700\t0.5788\t51\nchr10\t131289600\t131290200\t0.3103\t37\nchr10\t131376900\t131377200\t0.0746\t54\nchr10\t131592600\t131601600\t0\t46\nchr10\t131625900\t131626200\t0.2329\t34\nchr10\t131697000\t131697300\t0.5866\t64\nchr10\t131704800\t131706000\t0.0515\t61\nchr10\t131850900\t131851200\t0.6222\t148\nchr10\t131939100\t131939400\t0.2061\t43\nchr10\t131949600\t131950200\t0.4753\t81\nchr10\t132158700\t132159000\t0.147\t78\nchr10\t132160200\t132161700\t0.147\t78\nchr10\t132173700\t132174000\t0.5819\t51\nchr10\t132191400\t132191700\t0.6646\t44\nchr10\t132352200\t132352500\t0.6495\t33\nchr10\t132356400\t132356700\t0.6035\t61\nchr10\t132364200\t132364800\t0.6294\t465\nchr10\t132448800\t132449100\t0.6284\t27\nchr10\t132505500\t132506100\t0.4496\t184\nchr10\t132549900\t132550200\t0.671\t66\nchr10\t132573900\t132574200\t0.5531\t46\nchr10\t132622200\t132623100\t0\t118\nchr10\t132772500\t132772800\t0.5864\t61\nchr10\t132774900\t132775200\t0.4667\t69\nchr10\t132799200\t132799500\t0.62\t52\nchr10\t132852000\t132852600\t0.5531\t112\nchr10\t132874200\t132874800\t0.3474\t71\nchr10\t132906600\t132906900\t0.5511\t59\nchr10\t132914100\t132914400\t0.128\t20\nchr10\t132982800\t132983400\t0.6023\t48\nchr10\t132999300\t132999600\t0.3115\t92\nchr10\t133011000\t133011300\t0.6755\t93\nchr10\t133017900\t133018200\t0.6579\t37\nchr10\t133029900\t133030200\t0.5318\t64\nchr10\t133063500\t133064100\t0.5201\t49\nchr10\t133078500\t133079100\t0.4651\t35\nchr10\t133111200\t133112100\t0.2972\t133\nchr10\t133138500\t133138800\t0.5594\t16\nchr10\t133155600\t133156200\t0.3411\t84\nchr10\t133220100\t133220400\t0.4772\t11\nchr10\t133403100\t133403400\t0.2986\t49\nchr10\t133416600\t133417500\t0.2052\t65\nchr10\t133424100\t133427700\t0\t75\nchr10\t133430100\t133430700\t0.1626\t84\nchr10\t133432500\t133435500\t0\t102\nchr10\t133441200\t133441500\t0.3754\t62\nchr10\t133477800\t133481100\t0\t54\nchr10\t133503600\t133506300\t0.0796\t68\nchr10\t133568700\t133572000\t0\t79\nchr10\t133574700\t133579500\t0\t85\nchr10\t133623000\t133631700\t0.0214\t105\nchr10\t133637400\t133639500\t0.0151\t92\nchr10\t133640700\t133641600\t0.0151\t92\nchr10\t133642800\t133643100\t0.0151\t92\nchr10\t133644600\t133646100\t0.0151\t92\nchr10\t133648800\t133649400\t0.42\t107\nchr10\t133651800\t133655400\t0.0849\t120\nchr10\t133656600\t133658400\t0.0849\t120\nchr10\t133660200\t133660500\t0.4451\t96\nchr10\t133662000\t133662300\t0.6401\t71\nchr10\t133664400\t133690500\t0\t15197\nchr10\t133740600\t133787700\t0\t3268\nchr11\t60000\t122700\t0\t117\nchr11\t123900\t146700\t0\t117\nchr11\t147900\t174600\t0\t117\nchr11\t176400\t185700\t0\t96\nchr11\t187200\t196500\t0\t150\nchr11\t220800\t221100\t0.5768\t63\nchr11\t310800\t311400\t0.0133\t57\nchr11\t318300\t318900\t0.1034\t55\nchr11\t321300\t322500\t0.269\t86\nchr11\t349500\t350100\t0.4823\t48\nchr11\t374700\t375300\t0.2425\t46\nchr11\t381300\t381600\t0.6045\t28\nchr11\t384900\t385800\t0\t86\nchr11\t390600\t390900\t0.0787\t26\nchr11\t398400\t398700\t0.5442\t40\nchr11\t400800\t401100\t0.5557\t12\nchr11\t411000\t411300\t0.5261\t20\nchr11\t431100\t431400\t0.6974\t28\nchr11\t459000\t459300\t0.4405\t56\nchr11\t480300\t480600\t0.5476\t58\nchr11\t483000\t483300\t0.2595\t44\nchr11\t485700\t486000\t0.6257\t33\nchr11\t519300\t520200\t0\t174\nchr11\t530400\t531000\t0.3767\t119\nchr11\t541800\t542100\t0.5997\t29\nchr11\t585000\t585900\t0.0569\t988\nchr11\t647700\t648000\t0.6563\t53\nchr11\t664500\t665100\t0.0223\t94\nchr11\t734700\t736200\t0.1133\t69\nchr11\t881400\t881700\t0.4864\t54\nchr11\t964800\t965400\t0.0303\t307\nchr11\t980100\t980700\t0.0302\t83\nchr11\t1078800\t1081500\t0.1681\t45\nchr11\t1096800\t1099200\t0.418\t101\nchr11\t1166700\t1167000\t0.439\t51\nchr11\t1244100\t1244400\t0.4521\t66\nchr11\t1248000\t1248300\t0.3653\t61\nchr11\t1255500\t1256100\t0.4312\t23\nchr11\t1287300\t1287900\t0.5045\t46\nchr11\t1294200\t1294500\t0.545\t99\nchr11\t1296600\t1296900\t0.6342\t30\nchr11\t1352400\t1352700\t0.3196\t11\nchr11\t1410000\t1410300\t0.6161\t10\nchr11\t1412100\t1412400\t0.0186\t10\nchr11\t1417500\t1417800\t0.6656\t57\nchr11\t1429500\t1433100\t0\t78\nchr11\t1435200\t1435500\t0.6007\t23\nchr11\t1510200\t1510500\t0.372\t48\nchr11\t1661100\t1661400\t0.6766\t19\nchr11\t1663800\t1665300\t0\t83\nchr11\t1666500\t1667100\t0\t83\nchr11\t1683600\t1684200\t0.1836\t75\nchr11\t1686000\t1687800\t0.0614\t59\nchr11\t1776000\t1776300\t0.6557\t11\nchr11\t1945200\t1953300\t0\t62\nchr11\t1954800\t2043000\t0\t62\nchr11\t2161500\t2161800\t0.6863\t46\nchr11\t2291400\t2292000\t0.3831\t54\nchr11\t2332200\t2334300\t0.1201\t68\nchr11\t3096900\t3097200\t0.6083\t66\nchr11\t3206700\t3207000\t0.6881\t93\nchr11\t3214800\t3215100\t0.6469\t88\nchr11\t3248400\t3248700\t0.3551\t39\nchr11\t3252300\t3256800\t0\t51\nchr11\t3258300\t3261900\t0\t44\nchr11\t3263100\t3281100\t0\t49\nchr11\t3282300\t3293100\t0\t55\nchr11\t3294300\t3294600\t0\t25\nchr11\t3297600\t3327000\t0\t51\nchr11\t3328200\t3338400\t0\t51\nchr11\t3653700\t3654900\t0.0399\t2367\nchr11\t3898200\t3899700\t0.3977\t67\nchr11\t4001700\t4004700\t0.2065\t84\nchr11\t4159200\t4159500\t0.3002\t46\nchr11\t4170600\t4174800\t0.07\t77\nchr11\t4223400\t4223700\t0.1893\t69\nchr11\t4226700\t4227600\t0.4948\t69\nchr11\t4230000\t4230600\t0.1257\t63\nchr11\t4233600\t4234200\t0.5246\t74\nchr11\t4238400\t4239000\t0.2909\t61\nchr11\t4245000\t4245900\t0\t63\nchr11\t4248300\t4248600\t0.2063\t54\nchr11\t4254300\t4256700\t0.0308\t60\nchr11\t4260000\t4260600\t0.3896\t56\nchr11\t4263000\t4263300\t0.1839\t40\nchr11\t4264500\t4265100\t0.4849\t47\nchr11\t4266600\t4266900\t0.4581\t65\nchr11\t4268100\t4275300\t0\t84\nchr11\t4276800\t4284600\t0\t84\nchr11\t4287000\t4298400\t0\t149\nchr11\t4299900\t4300200\t0.1421\t68\nchr11\t4303500\t4303800\t0.1486\t51\nchr11\t4308300\t4309200\t0.4983\t68\nchr11\t4310700\t4311000\t0.3006\t64\nchr11\t4312800\t4313100\t0.3006\t64\nchr11\t4314300\t4315500\t0.3006\t64\nchr11\t4320000\t4320300\t0.1191\t50\nchr11\t4323900\t4324200\t0.531\t96\nchr11\t4326600\t4327500\t0.1304\t67\nchr11\t4333500\t4337400\t0\t75\nchr11\t4338600\t4339200\t0\t75\nchr11\t4340400\t4342800\t0\t131\nchr11\t4347900\t4351200\t0.3288\t70\nchr11\t4353000\t4353300\t0.3868\t64\nchr11\t4354500\t4355100\t0.0906\t64\nchr11\t4357500\t4357800\t0.3205\t81\nchr11\t4360200\t4362300\t0.274\t59\nchr11\t4365000\t4365300\t0.4964\t41\nchr11\t4620000\t4621500\t0.0321\t50\nchr11\t4781400\t4781700\t0.3647\t43\nchr11\t4933800\t4934700\t0.1918\t86\nchr11\t4935900\t4936200\t0.1918\t86\nchr11\t5249400\t5250000\t0.0181\t61\nchr11\t5254500\t5254800\t0.175\t66\nchr11\t5415900\t5416200\t0.3261\t60\nchr11\t5465700\t5466000\t0.4309\t47\nchr11\t5478300\t5478600\t0.0179\t84\nchr11\t5479800\t5483100\t0.0179\t84\nchr11\t5676600\t5676900\t0.5537\t89\nchr11\t5716200\t5716500\t0.4571\t64\nchr11\t5916600\t5916900\t0.3771\t71\nchr11\t6120900\t6122400\t0.4179\t66\nchr11\t6147000\t6147300\t0.3893\t72\nchr11\t6186000\t6191100\t0.1372\t79\nchr11\t6948900\t6949200\t0.2525\t63\nchr11\t6981000\t6981300\t0.4698\t75\nchr11\t7179000\t7179900\t0.282\t78\nchr11\t7188000\t7188300\t0.4351\t35\nchr11\t7233600\t7234200\t0.142\t62\nchr11\t7325100\t7328100\t0\t90\nchr11\t7359000\t7359600\t0.0143\t68\nchr11\t7407300\t7407600\t0.2926\t37\nchr11\t7658400\t7659900\t0.0386\t93\nchr11\t7661700\t7662000\t0.4644\t73\nchr11\t7719600\t7720200\t0.0841\t61\nchr11\t7736100\t7740300\t0.0654\t69\nchr11\t7768800\t7769100\t0.0363\t43\nchr11\t7861800\t7862100\t0.263\t76\nchr11\t7863300\t7864200\t0.263\t76\nchr11\t7865700\t7866900\t0.263\t76\nchr11\t7920600\t7920900\t0.499\t64\nchr11\t8140800\t8144700\t0.3176\t71\nchr11\t8161800\t8162100\t0.6994\t67\nchr11\t8977500\t8979600\t0.1116\t155\nchr11\t9540900\t9544800\t0.2104\t79\nchr11\t9705900\t9706500\t0.308\t92\nchr11\t9773100\t9773400\t0.6168\t17\nchr11\t10391400\t10392300\t0.001\t72\nchr11\t11235600\t11235900\t0.5169\t29\nchr11\t11246700\t11247300\t0.5704\t190\nchr11\t12131100\t12131400\t0.4981\t31\nchr11\t12640800\t12641100\t0.4463\t28\nchr11\t12719700\t12720000\t0.2036\t168\nchr11\t13507500\t13507800\t0.3583\t71\nchr11\t13509000\t13509300\t0.3583\t71\nchr11\t13544400\t13544700\t0\t36\nchr11\t13794900\t13796400\t0.0568\t89\nchr11\t13827900\t13828200\t0.4271\t59\nchr11\t13866900\t13867500\t0.1499\t52\nchr11\t14628600\t14628900\t0.3478\t50\nchr11\t14631900\t14633100\t0.2629\t83\nchr11\t14666100\t14666400\t0.3264\t48\nchr11\t14716500\t14721000\t0\t72\nchr11\t14758200\t14758500\t0.5406\t66\nchr11\t14810700\t14811000\t0.3124\t65\nchr11\t14847300\t14848500\t0.2086\t75\nchr11\t14963100\t14963700\t0.2432\t74\nchr11\t15270600\t15270900\t0.1586\t71\nchr11\t16076700\t16077000\t0.4931\t36\nchr11\t16466700\t16467000\t0.377\t60\nchr11\t16515300\t16515900\t0.1735\t71\nchr11\t16575900\t16576200\t0.5119\t40\nchr11\t16720200\t16720500\t0.1373\t74\nchr11\t16907700\t16908000\t0.1276\t108\nchr11\t16915800\t16916100\t0.2566\t56\nchr11\t17028600\t17029800\t0.0379\t63\nchr11\t17049600\t17050800\t0.1717\t62\nchr11\t17341200\t17343000\t0.1627\t78\nchr11\t18247200\t18247800\t0.2735\t78\nchr11\t18266400\t18267600\t0.3147\t79\nchr11\t18486600\t18486900\t0.475\t76\nchr11\t18869700\t18870000\t0.6482\t59\nchr11\t18920400\t18922200\t0\t70\nchr11\t18942600\t18944100\t0\t75\nchr11\t19137600\t19138200\t0.2261\t87\nchr11\t19139400\t19140300\t0.2261\t87\nchr11\t20547900\t20549700\t0.0767\t60\nchr11\t20895000\t20895300\t0.3659\t55\nchr11\t21276900\t21277200\t0.3495\t67\nchr11\t21669300\t21669900\t0.3305\t89\nchr11\t21943200\t21943500\t0.5585\t48\nchr11\t22016100\t22021200\t0.0216\t92\nchr11\t22286400\t22288800\t0.1023\t92\nchr11\t22290000\t22290300\t0.5932\t46\nchr11\t22485000\t22485300\t0.3939\t70\nchr11\t22523100\t22523700\t0.0432\t37\nchr11\t22528200\t22528500\t0.2995\t60\nchr11\t22696800\t22697100\t0.5431\t57\nchr11\t22910100\t22911300\t0.0685\t78\nchr11\t23009400\t23010000\t0.4576\t118\nchr11\t23031900\t23032200\t0.4859\t63\nchr11\t23082900\t23083200\t0.4596\t67\nchr11\t23176200\t23178600\t0.1303\t62\nchr11\t23185500\t23185800\t0.6224\t37\nchr11\t23193900\t23194200\t0.2034\t44\nchr11\t23298300\t23303400\t0.0131\t72\nchr11\t23316600\t23317500\t0.2057\t54\nchr11\t23433300\t23434200\t0.1698\t49\nchr11\t23791500\t23793300\t0.4314\t65\nchr11\t24137100\t24137400\t0.4735\t93\nchr11\t24152400\t24152700\t0.5225\t82\nchr11\t24169800\t24170100\t0.218\t79\nchr11\t24327900\t24333900\t0\t83\nchr11\t24387600\t24389400\t0.0042\t50\nchr11\t24446100\t24446700\t0.4393\t64\nchr11\t24876300\t24876600\t0.4675\t31\nchr11\t24891600\t24891900\t0.3869\t55\nchr11\t24996900\t24997200\t0.3435\t55\nchr11\t25143000\t25144500\t0.2915\t94\nchr11\t25425900\t25426500\t0\t51\nchr11\t25428900\t25429200\t0\t51\nchr11\t25498800\t25499100\t0.4323\t25\nchr11\t25542900\t25543200\t0.5951\t59\nchr11\t25635300\t25635600\t0.2588\t83\nchr11\t25647000\t25647300\t0.2504\t57\nchr11\t25747800\t25748100\t0.6238\t63\nchr11\t26115900\t26116200\t0.3561\t71\nchr11\t26118900\t26119200\t0.6387\t51\nchr11\t26441100\t26441400\t0.6771\t38\nchr11\t26456700\t26457000\t0.3425\t66\nchr11\t26886600\t26888100\t0.2773\t61\nchr11\t26967300\t26970900\t0\t96\nchr11\t27221400\t27225000\t0.0691\t98\nchr11\t27944100\t27944700\t0.4115\t88\nchr11\t28029600\t28031100\t0.0713\t72\nchr11\t28045800\t28046100\t0.3258\t59\nchr11\t28205700\t28207200\t0.0925\t51\nchr11\t28234500\t28235100\t0.3353\t67\nchr11\t28361100\t28361400\t0.5288\t54\nchr11\t28429500\t28430100\t0.1819\t46\nchr11\t28431300\t28431900\t0.3258\t44\nchr11\t29142300\t29143800\t0.333\t54\nchr11\t29154300\t29156400\t0\t71\nchr11\t29417700\t29418300\t0.2312\t71\nchr11\t29648100\t29649600\t0.4018\t74\nchr11\t29726700\t29727000\t0.4778\t56\nchr11\t29743800\t29744100\t0.2535\t45\nchr11\t29789100\t29789400\t0.5094\t72\nchr11\t29796600\t29796900\t0.513\t68\nchr11\t29799000\t29799600\t0.3229\t68\nchr11\t30051600\t30051900\t0.5301\t71\nchr11\t30053100\t30054000\t0.5301\t71\nchr11\t30965700\t30967200\t0\t78\nchr11\t31131000\t31131300\t0.6104\t37\nchr11\t31315800\t31321500\t0\t83\nchr11\t31356600\t31356900\t0.2554\t77\nchr11\t32265000\t32265300\t0.6421\t50\nchr11\t32607000\t32607300\t0.5518\t32\nchr11\t32942100\t32942700\t0.1152\t79\nchr11\t32944200\t32945400\t0.1152\t79\nchr11\t33234000\t33234300\t0.6831\t30\nchr11\t33516000\t33516300\t0.5857\t48\nchr11\t33626100\t33627300\t0.0226\t76\nchr11\t33628500\t33628800\t0.0226\t76\nchr11\t34273800\t34274100\t0.5163\t69\nchr11\t34687200\t34690200\t0.1763\t89\nchr11\t34760400\t34761000\t0.0272\t88\nchr11\t35053800\t35054100\t0.1557\t59\nchr11\t35396100\t35397600\t0.088\t88\nchr11\t35578800\t35579100\t0.2338\t77\nchr11\t35698200\t35699100\t0.1344\t57\nchr11\t35704800\t35705100\t0.14\t85\nchr11\t35707800\t35708100\t0.14\t85\nchr11\t36287100\t36287400\t0.1288\t29\nchr11\t36309900\t36310200\t0.4052\t184\nchr11\t36481800\t36482700\t0.0038\t60\nchr11\t36507000\t36507300\t0.5759\t34\nchr11\t36551700\t36557400\t0\t113\nchr11\t36614100\t36615900\t0.0734\t85\nchr11\t36875400\t36875700\t0.4988\t29\nchr11\t36894000\t36894600\t0.1697\t51\nchr11\t37018200\t37020000\t0.3018\t68\nchr11\t37241400\t37243200\t0.2128\t76\nchr11\t37245000\t37245300\t0.4142\t92\nchr11\t37347900\t37348200\t0.4263\t36\nchr11\t37492800\t37494300\t0.3769\t73\nchr11\t37537500\t37538400\t0.4384\t49\nchr11\t37559700\t37560000\t0.4664\t58\nchr11\t38078100\t38078400\t0.3889\t37\nchr11\t38195700\t38196000\t0.4569\t60\nchr11\t38232900\t38233200\t0.1539\t67\nchr11\t38419800\t38420100\t0.2908\t56\nchr11\t38739000\t38739300\t0.1605\t41\nchr11\t39000000\t39001800\t0.3546\t65\nchr11\t39047400\t39048000\t0.1044\t42\nchr11\t39485400\t39485700\t0.4669\t75\nchr11\t39605400\t39605700\t0.5311\t45\nchr11\t39771900\t39772200\t0.4437\t54\nchr11\t39849300\t39852000\t0.1969\t65\nchr11\t40260000\t40260300\t0.2379\t36\nchr11\t40587300\t40587600\t0.2644\t92\nchr11\t40589700\t40590900\t0.3836\t127\nchr11\t40948500\t40948800\t0.2896\t75\nchr11\t40985400\t40985700\t0.6201\t25\nchr11\t41303400\t41305800\t0.2773\t73\nchr11\t41695500\t41696100\t0.2023\t62\nchr11\t42156600\t42156900\t0.2448\t79\nchr11\t42215100\t42216600\t0.0064\t68\nchr11\t42430200\t42432300\t0.0258\t76\nchr11\t42442500\t42442800\t0.417\t24\nchr11\t42459600\t42460200\t0.358\t71\nchr11\t42573000\t42573300\t0.2487\t35\nchr11\t42680400\t42681000\t0.2641\t69\nchr11\t42791700\t42792300\t0.0353\t71\nchr11\t42798000\t42798600\t0.0136\t51\nchr11\t42897300\t42897600\t0.4681\t48\nchr11\t42945300\t42945600\t0.4059\t63\nchr11\t42952200\t42954300\t0.2313\t99\nchr11\t43346400\t43352100\t0.0133\t118\nchr11\t43757400\t43757700\t0.4628\t35\nchr11\t43778400\t43778700\t0.2841\t103\nchr11\t44663100\t44664600\t0.288\t79\nchr11\t45101700\t45102300\t0.0428\t65\nchr11\t45123900\t45124200\t0.2446\t72\nchr11\t45737700\t45739200\t0.1596\t91\nchr11\t46156800\t46157100\t0.3027\t82\nchr11\t46573800\t46574400\t0.1301\t74\nchr11\t46583700\t46584300\t0.1607\t52\nchr11\t46699500\t46699800\t0.625\t86\nchr11\t46897500\t46897800\t0.5369\t72\nchr11\t47037300\t47037600\t0.4032\t69\nchr11\t47097300\t47098200\t0.0115\t61\nchr11\t47174400\t47174700\t0.4959\t43\nchr11\t47721900\t47722200\t0.4886\t45\nchr11\t48186000\t48186300\t0.3181\t57\nchr11\t48295200\t48295800\t0.2352\t52\nchr11\t48302100\t48302400\t0.2362\t67\nchr11\t48392400\t48393600\t0.2938\t61\nchr11\t48395100\t48395400\t0.2938\t61\nchr11\t48581100\t48581400\t0.2916\t52\nchr11\t48746400\t48746700\t0.4753\t44\nchr11\t48771900\t48773400\t0.2728\t73\nchr11\t48847800\t48854400\t0\t76\nchr11\t48859500\t48859800\t0.1468\t11\nchr11\t48880500\t48888300\t0\t76\nchr11\t48892200\t48900000\t0\t78\nchr11\t48912900\t48913200\t0.5014\t17\nchr11\t48922500\t48922800\t0.5287\t124\nchr11\t48926700\t48927600\t0.3892\t142\nchr11\t48928800\t48929100\t0.5174\t27\nchr11\t48944100\t48944400\t0.1148\t44\nchr11\t48982800\t48983400\t0.3038\t51\nchr11\t49104300\t49106100\t0\t74\nchr11\t49463400\t49463700\t0.5491\t57\nchr11\t49712700\t49714800\t0.0042\t66\nchr11\t49726800\t49729500\t0\t68\nchr11\t49775100\t49780800\t0.1274\t89\nchr11\t49792200\t49797600\t0\t79\nchr11\t50114100\t50134800\t0\t92\nchr11\t50180100\t50180400\t0.3105\t76\nchr11\t50343900\t50364300\t0\t81\nchr11\t50548500\t50548800\t0.2937\t84\nchr11\t50588400\t50589300\t0.1506\t53\nchr11\t50690700\t50691300\t0.5779\t155\nchr11\t50739300\t50739600\t0.5279\t57\nchr11\t50756400\t50756700\t0.6421\t172\nchr11\t50786400\t50786700\t0.6434\t128\nchr11\t50816400\t50816700\t0.3613\t69\nchr11\t51078600\t51090000\t0\t41\nchr11\t51091500\t51430200\t0\t1145\nchr11\t51431400\t51830100\t0\t1145\nchr11\t51831600\t52020900\t0\t1145\nchr11\t52022700\t52128000\t0\t1145\nchr11\t52129200\t52599900\t0\t1145\nchr11\t52601100\t52632300\t0\t1145\nchr11\t52633500\t52652100\t0\t1145\nchr11\t52653300\t52701300\t0\t1145\nchr11\t52703100\t52707000\t0\t1026\nchr11\t52708200\t53015400\t0\t1026\nchr11\t53016600\t53097000\t0\t1026\nchr11\t53098200\t53107500\t0\t1026\nchr11\t53108700\t53215500\t0\t1802\nchr11\t53216700\t53240400\t0\t1107\nchr11\t53241600\t53283300\t0\t1107\nchr11\t53284500\t53470200\t0\t1107\nchr11\t53471700\t53504400\t0\t1107\nchr11\t53505600\t53507100\t0\t1107\nchr11\t53508600\t53518200\t0\t1107\nchr11\t53519400\t53716200\t0\t1107\nchr11\t53717400\t53798400\t0\t1107\nchr11\t53799600\t53818200\t0\t1107\nchr11\t53820300\t53840400\t0\t207\nchr11\t53842200\t53948100\t0\t663\nchr11\t53949300\t54084000\t0\t663\nchr11\t54086100\t54097800\t0\t663\nchr11\t54099300\t54177300\t0\t729\nchr11\t54178500\t54326100\t0\t729\nchr11\t54327300\t54347100\t0\t729\nchr11\t54348300\t54353700\t0.0235\t91\nchr11\t54355500\t54360600\t0\t184\nchr11\t54361800\t54385500\t0\t184\nchr11\t54386700\t54395400\t0.0029\t362\nchr11\t54396900\t54425100\t0\t226\nchr11\t54525900\t54537300\t0\t321\nchr11\t54541500\t54542100\t0.008\t50\nchr11\t54545400\t54546900\t0.0128\t80\nchr11\t54549900\t54550200\t0.0942\t41\nchr11\t54789300\t54789600\t0.3381\t66\nchr11\t55198500\t55199400\t0.5137\t53\nchr11\t55442100\t55442400\t0.3901\t46\nchr11\t55461900\t55462200\t0.4695\t53\nchr11\t55476900\t55477500\t0.1747\t73\nchr11\t55597200\t55597500\t0.4747\t40\nchr11\t55686900\t55691700\t0.0631\t78\nchr11\t55987500\t55988400\t0.333\t70\nchr11\t55991700\t55992000\t0.3207\t162\nchr11\t56144100\t56144400\t0.3716\t33\nchr11\t56451000\t56451300\t0.4388\t83\nchr11\t56497800\t56498100\t0.2579\t65\nchr11\t56552700\t56553000\t0.4794\t42\nchr11\t56588700\t56589000\t0.4488\t83\nchr11\t56717700\t56718000\t0.1902\t65\nchr11\t56724900\t56726700\t0.3367\t77\nchr11\t56912400\t56913600\t0.1677\t50\nchr11\t56965800\t56966100\t0.3254\t63\nchr11\t57995700\t57997800\t0.0851\t85\nchr11\t58010400\t58010700\t0.3213\t43\nchr11\t58048800\t58052700\t0\t63\nchr11\t58371000\t58371300\t0.5785\t60\nchr11\t58399500\t58399800\t0.3403\t44\nchr11\t58453200\t58453500\t0.5844\t23\nchr11\t58697100\t58697400\t0.2865\t73\nchr11\t59041800\t59042100\t0.3516\t38\nchr11\t59645100\t59645400\t0.5449\t39\nchr11\t60048600\t60049500\t0.0007\t81\nchr11\t60051000\t60051600\t0.0007\t81\nchr11\t60438900\t60441000\t0.0161\t85\nchr11\t60473700\t60474300\t0.1831\t62\nchr11\t60492000\t60492300\t0.4777\t29\nchr11\t60532500\t60539100\t0.0012\t76\nchr11\t60597600\t60597900\t0.5409\t89\nchr11\t60603000\t60603900\t0.2637\t88\nchr11\t60816000\t60816300\t0.3677\t89\nchr11\t61084500\t61086300\t0\t83\nchr11\t61166700\t61167000\t0.582\t83\nchr11\t61203900\t61204200\t0\t58\nchr11\t61205700\t61246200\t0\t58\nchr11\t61340400\t61340700\t0.3085\t29\nchr11\t61391100\t61391400\t0.3368\t169\nchr11\t62096400\t62099400\t0\t68\nchr11\t62277900\t62280300\t0\t58\nchr11\t62366100\t62366400\t0.4109\t47\nchr11\t62384700\t62385000\t0.3299\t46\nchr11\t63036900\t63037200\t0.2436\t62\nchr11\t63110400\t63110700\t0.4543\t47\nchr11\t63420300\t63420600\t0.4573\t67\nchr11\t63436200\t63436800\t0.3349\t77\nchr11\t63438900\t63439200\t0.3349\t77\nchr11\t63444600\t63444900\t0.6292\t51\nchr11\t63528600\t63528900\t0.3636\t67\nchr11\t63530400\t63531000\t0.5575\t67\nchr11\t63871500\t63871800\t0.6512\t63\nchr11\t64161600\t64162200\t0.4434\t62\nchr11\t64170600\t64173600\t0.0477\t125\nchr11\t64271100\t64271400\t0.5767\t34\nchr11\t65239800\t65240100\t0.2513\t54\nchr11\t65678700\t65679300\t0.3988\t154\nchr11\t65839200\t65839500\t0.5206\t32\nchr11\t65970900\t65971500\t0.403\t73\nchr11\t66093300\t66095100\t0.2271\t101\nchr11\t66460200\t66460500\t0.2281\t41\nchr11\t66588600\t66589200\t0.2478\t64\nchr11\t66991200\t66991500\t0.5588\t45\nchr11\t67222200\t67222800\t0.0016\t70\nchr11\t67603500\t67604100\t0.0413\t90\nchr11\t67841700\t67842000\t0.3959\t43\nchr11\t67863600\t67863900\t0.365\t30\nchr11\t67868100\t67868700\t0.0194\t85\nchr11\t67919400\t67919700\t0.3658\t57\nchr11\t68644500\t68644800\t0.3903\t38\nchr11\t68892300\t68892600\t0.0738\t30\nchr11\t69068400\t69069900\t0.0596\t127\nchr11\t69082500\t69082800\t0.6669\t52\nchr11\t69813600\t69813900\t0.5711\t100\nchr11\t69886800\t69887100\t0.4941\t39\nchr11\t70126800\t70127100\t0.6331\t71\nchr11\t70341000\t70341300\t0.2109\t50\nchr11\t70344900\t70345200\t0.443\t79\nchr11\t71090400\t71090700\t0.6928\t28\nchr11\t71380500\t71380800\t0.5767\t98\nchr11\t71569500\t71570100\t0.3148\t80\nchr11\t71578500\t71579100\t0.066\t69\nchr11\t71664300\t71664600\t0.5851\t54\nchr11\t71676300\t71676600\t0.3577\t57\nchr11\t72150600\t72150900\t0.2535\t21\nchr11\t72164700\t72165300\t0.3345\t73\nchr11\t73572300\t73572900\t0.3887\t78\nchr11\t74223600\t74224800\t0.3382\t86\nchr11\t74434200\t74434500\t0.6456\t37\nchr11\t74527800\t74528100\t0.1867\t57\nchr11\t74757000\t74762100\t0.0372\t90\nchr11\t74877600\t74878800\t0.2012\t88\nchr11\t74880900\t74882400\t0.2012\t88\nchr11\t74892600\t74892900\t0.4741\t65\nchr11\t74977200\t74977500\t0.4302\t65\nchr11\t75060900\t75061200\t0.6003\t70\nchr11\t75409200\t75410100\t0.2119\t75\nchr11\t75749100\t75752100\t0.1132\t89\nchr11\t75753600\t75754500\t0.1132\t89\nchr11\t76931100\t76931400\t0.5947\t49\nchr11\t76966200\t76966500\t0.4877\t71\nchr11\t77097600\t77099700\t0.0194\t102\nchr11\t77192700\t77193000\t0.6342\t190\nchr11\t77922300\t77922600\t0.5711\t61\nchr11\t78678000\t78683700\t0\t81\nchr11\t79191300\t79191600\t0.2838\t62\nchr11\t79554900\t79557600\t0.1057\t77\nchr11\t79961700\t79962000\t0.2087\t70\nchr11\t81522300\t81522600\t0.4509\t19\nchr11\t81599400\t81599700\t0.4673\t58\nchr11\t81845100\t81845400\t0.4053\t21\nchr11\t82156200\t82161600\t0.001\t80\nchr11\t82282800\t82283100\t0.235\t81\nchr11\t82293300\t82293600\t0.6612\t22\nchr11\t82625100\t82625700\t0.0127\t40\nchr11\t83315400\t83316000\t0.2604\t43\nchr11\t83394900\t83397300\t0.0199\t77\nchr11\t83589600\t83593200\t0.0872\t83\nchr11\t84039300\t84039900\t0.5427\t64\nchr11\t84502200\t84502500\t0.4679\t31\nchr11\t85324800\t85330800\t0\t83\nchr11\t85400400\t85400700\t0.5632\t43\nchr11\t85833000\t85833300\t0.6916\t23\nchr11\t85849500\t85851000\t0.3354\t69\nchr11\t85982400\t85982700\t0.5651\t30\nchr11\t86104800\t86105100\t0.2867\t76\nchr11\t86109900\t86111700\t0.2587\t103\nchr11\t86310000\t86310300\t0.3233\t31\nchr11\t86536200\t86536800\t0.2826\t58\nchr11\t86601900\t86602200\t0.4722\t81\nchr11\t86756100\t86757600\t0.167\t69\nchr11\t86879700\t86880000\t0.6069\t70\nchr11\t87047400\t87053100\t0\t90\nchr11\t87163800\t87165600\t0.0021\t65\nchr11\t87243000\t87244500\t0.3392\t58\nchr11\t87340200\t87345300\t0\t104\nchr11\t87698100\t87698700\t0.107\t57\nchr11\t88030800\t88032300\t0.3894\t98\nchr11\t88185300\t88185600\t0.6914\t27\nchr11\t88637700\t88638000\t0.6347\t56\nchr11\t88648200\t88648500\t0.641\t71\nchr11\t88804200\t88804500\t0.343\t64\nchr11\t88989300\t88990800\t0.35\t69\nchr11\t89173500\t89173800\t0.2569\t58\nchr11\t89314200\t89318100\t0.0524\t85\nchr11\t89486400\t89486700\t0.5541\t52\nchr11\t89745000\t89750100\t0.1111\t89\nchr11\t89751300\t89751600\t0.2112\t63\nchr11\t89752800\t89753100\t0.2112\t63\nchr11\t89754900\t89755800\t0.4235\t52\nchr11\t89758200\t89759700\t0.0032\t54\nchr11\t89760900\t89761200\t0\t75\nchr11\t89763300\t89764500\t0\t75\nchr11\t89766000\t89767200\t0\t75\nchr11\t89769600\t89772000\t0\t71\nchr11\t89773200\t89776500\t0\t71\nchr11\t89778300\t89784600\t0\t71\nchr11\t89787900\t89790300\t0\t83\nchr11\t89791800\t89792400\t0.4697\t68\nchr11\t89793900\t89795700\t0.0638\t70\nchr11\t89797500\t89804100\t0\t89\nchr11\t89805300\t89806800\t0\t89\nchr11\t89809200\t89811900\t0.0114\t75\nchr11\t89817300\t89822100\t0\t84\nchr11\t89823300\t89831700\t0\t84\nchr11\t89833200\t89834100\t0\t84\nchr11\t89835300\t89836500\t0\t84\nchr11\t89837700\t89869800\t0\t86\nchr11\t89871600\t89872200\t0\t86\nchr11\t89873400\t89874900\t0\t98\nchr11\t89876100\t89897700\t0\t98\nchr11\t89900100\t89920500\t0\t111\nchr11\t89923800\t90006600\t0\t102\nchr11\t90008100\t90008700\t0\t102\nchr11\t90010800\t90011400\t0.4924\t66\nchr11\t90012900\t90016500\t0\t90\nchr11\t90018000\t90021600\t0\t90\nchr11\t90023400\t90033000\t0\t90\nchr11\t90034200\t90045900\t0\t90\nchr11\t90047100\t90062100\t0\t75\nchr11\t90063300\t90066600\t0\t75\nchr11\t90067800\t90070500\t0\t75\nchr11\t90072600\t90074100\t0\t66\nchr11\t90075600\t90082500\t0\t66\nchr11\t90084000\t90085200\t0.4513\t45\nchr11\t90086700\t90088500\t0.1023\t80\nchr11\t90090000\t90091800\t0.1023\t80\nchr11\t90093000\t90095100\t0.1023\t80\nchr11\t90096600\t90096900\t0.1023\t80\nchr11\t90186600\t90187200\t0.3557\t59\nchr11\t90400200\t90405600\t0\t124\nchr11\t90966300\t90972000\t0\t76\nchr11\t90976500\t90976800\t0.0914\t121\nchr11\t91019400\t91019700\t0.3657\t50\nchr11\t91235100\t91235700\t0.2636\t94\nchr11\t91309200\t91309800\t0.3977\t50\nchr11\t91578900\t91580100\t0.0623\t75\nchr11\t91681800\t91683600\t0.2401\t75\nchr11\t92030400\t92031000\t0.4554\t37\nchr11\t92032200\t92032500\t0.5257\t56\nchr11\t92077800\t92078100\t0.4319\t57\nchr11\t92095800\t92096100\t0.471\t51\nchr11\t92171700\t92172000\t0.4274\t49\nchr11\t92359500\t92360100\t0.248\t68\nchr11\t92512800\t92513100\t0.5294\t28\nchr11\t92565300\t92565600\t0.4938\t72\nchr11\t92705400\t92706000\t0.5095\t163\nchr11\t93136500\t93142500\t0\t93\nchr11\t93172500\t93176100\t0.2245\t77\nchr11\t93243300\t93243600\t0.3154\t56\nchr11\t93369600\t93369900\t0.4089\t36\nchr11\t93417000\t93417300\t0.3733\t57\nchr11\t93420600\t93426900\t0\t81\nchr11\t93945000\t93945300\t0.1066\t46\nchr11\t93946500\t93948000\t0.0661\t68\nchr11\t94038300\t94042500\t0.0365\t112\nchr11\t94177200\t94177500\t0.3465\t68\nchr11\t94233000\t94235400\t0.0079\t278\nchr11\t94236900\t94237500\t0.1427\t262\nchr11\t94239300\t94240200\t0.1811\t256\nchr11\t94250100\t94250400\t0.3574\t138\nchr11\t94318200\t94318500\t0.5622\t61\nchr11\t94341000\t94341300\t0.2757\t56\nchr11\t94807800\t94808100\t0.1397\t29\nchr11\t95320200\t95322000\t0.0873\t63\nchr11\t95436300\t95442300\t0\t87\nchr11\t95626800\t95628600\t0.1101\t153\nchr11\t95629800\t95630400\t0.1101\t153\nchr11\t96405900\t96408900\t0.0637\t79\nchr11\t96513900\t96514200\t0.3361\t73\nchr11\t96743700\t96744000\t0.6852\t16\nchr11\t96771900\t96772200\t0.1356\t68\nchr11\t96773400\t96776700\t0.1356\t68\nchr11\t96934800\t96936900\t0.0617\t72\nchr11\t97040400\t97041000\t0.2104\t65\nchr11\t97043700\t97044000\t0.2986\t70\nchr11\t97082700\t97083000\t0.563\t39\nchr11\t97378200\t97378500\t0.6019\t66\nchr11\t97774800\t97775100\t0.6261\t25\nchr11\t98325600\t98325900\t0.0984\t50\nchr11\t98342400\t98344800\t0.2414\t65\nchr11\t98435100\t98435400\t0.4932\t68\nchr11\t98604600\t98604900\t0.6851\t70\nchr11\t98649600\t98649900\t0.5237\t48\nchr11\t99580800\t99581400\t0.3347\t58\nchr11\t99602700\t99608100\t0\t90\nchr11\t99761700\t99762300\t0.3638\t62\nchr11\t99782100\t99783900\t0.0073\t60\nchr11\t99998400\t99998700\t0.4458\t65\nchr11\t100035300\t100035900\t0.1631\t68\nchr11\t100286400\t100291200\t0.2596\t102\nchr11\t100411800\t100414200\t0.0793\t76\nchr11\t100452300\t100453200\t0.0472\t124\nchr11\t100456500\t100457700\t0.0825\t67\nchr11\t100464900\t100465200\t0.5063\t66\nchr11\t100475700\t100476300\t0.096\t83\nchr11\t100478700\t100480800\t0.096\t83\nchr11\t100507500\t100507800\t0.4628\t81\nchr11\t100654500\t100654800\t0.4826\t64\nchr11\t100656900\t100657500\t0.4227\t71\nchr11\t101546100\t101546400\t0.1184\t25\nchr11\t101680500\t101681100\t0.4896\t66\nchr11\t101682600\t101682900\t0.4896\t66\nchr11\t101695200\t101704500\t0\t104\nchr11\t101857200\t101857500\t0.6359\t15\nchr11\t101937900\t101938200\t0.6714\t26\nchr11\t102369600\t102374700\t0.0663\t90\nchr11\t102730800\t102731400\t0.6252\t238\nchr11\t102742800\t102744300\t0.0473\t101\nchr11\t103038600\t103039200\t0.1829\t68\nchr11\t103137000\t103137300\t0.4809\t72\nchr11\t103540200\t103540500\t0.6466\t33\nchr11\t104194200\t104195700\t0.1095\t58\nchr11\t104252100\t104252400\t0.3673\t62\nchr11\t104617800\t104618100\t0.4881\t47\nchr11\t104675700\t104677200\t0.0116\t80\nchr11\t104697000\t104698500\t0.2403\t61\nchr11\t105018600\t105018900\t0.1352\t61\nchr11\t105020400\t105020700\t0.1352\t61\nchr11\t105072300\t105072900\t0.4003\t53\nchr11\t106334700\t106335300\t0.2896\t65\nchr11\t106338000\t106338300\t0.5153\t61\nchr11\t106710000\t106710300\t0.0914\t15\nchr11\t107363400\t107367600\t0\t74\nchr11\t107374500\t107378100\t0\t74\nchr11\t107590200\t107590500\t0.607\t52\nchr11\t108262500\t108266100\t0.0641\t85\nchr11\t108358200\t108358800\t0.2605\t94\nchr11\t108360000\t108362700\t0.2605\t94\nchr11\t108378300\t108378900\t0.3919\t61\nchr11\t108684300\t108685500\t0.3141\t85\nchr11\t109177500\t109183500\t0\t71\nchr11\t109403700\t109405200\t0.0788\t77\nchr11\t109572000\t109576800\t0.1538\t79\nchr11\t109878300\t109881900\t0.2008\t80\nchr11\t109947900\t109948200\t0.2559\t52\nchr11\t110209800\t110210400\t0.0064\t83\nchr11\t110211900\t110214900\t0.0064\t83\nchr11\t110618700\t110619300\t0.3022\t39\nchr11\t110658900\t110659500\t0.1998\t88\nchr11\t112136700\t112137000\t0.5837\t19\nchr11\t112187400\t112187700\t0.5607\t60\nchr11\t112324800\t112326000\t0.0761\t65\nchr11\t112575300\t112575600\t0.3398\t62\nchr11\t112679100\t112680600\t0.0917\t68\nchr11\t113011200\t113011500\t0.5226\t58\nchr11\t113608800\t113609100\t0.3483\t64\nchr11\t114629700\t114630000\t0.3265\t74\nchr11\t114633000\t114633300\t0.1999\t16\nchr11\t114635100\t114635400\t0.3134\t78\nchr11\t114840000\t114844200\t0.0083\t87\nchr11\t115857000\t115857300\t0.5353\t69\nchr11\t116571000\t116576100\t0.0033\t79\nchr11\t116898600\t116898900\t0.5944\t64\nchr11\t117135300\t117138300\t0\t80\nchr11\t117206400\t117209400\t0.1361\t102\nchr11\t117250500\t117251100\t0.2537\t76\nchr11\t118330200\t118331400\t0.3452\t70\nchr11\t118678500\t118678800\t0.3715\t53\nchr11\t118691400\t118691700\t0.3843\t50\nchr11\t118721100\t118721700\t0.0937\t66\nchr11\t118729200\t118729800\t0.2881\t79\nchr11\t119270400\t119270700\t0.3976\t29\nchr11\t119507100\t119508600\t0.3104\t42\nchr11\t119648100\t119648400\t0.6403\t90\nchr11\t119743800\t119744100\t0.4865\t88\nchr11\t119848800\t119849100\t0.2419\t15\nchr11\t120082500\t120085200\t0\t49\nchr11\t120328800\t120329100\t0.6605\t143\nchr11\t121173300\t121173600\t0.2609\t62\nchr11\t121185300\t121186200\t0.0418\t214\nchr11\t121360800\t121361100\t0.5577\t28\nchr11\t121601100\t121601400\t0.0673\t86\nchr11\t121752000\t121752600\t0.1798\t72\nchr11\t121821300\t121827000\t0.0009\t74\nchr11\t121859400\t121860900\t0.1484\t60\nchr11\t122016600\t122017800\t0.4173\t37\nchr11\t122476800\t122478600\t0\t50\nchr11\t122694900\t122695200\t0.6623\t86\nchr11\t122826600\t122828100\t0.0961\t74\nchr11\t123118800\t123119100\t0.5282\t59\nchr11\t123709200\t123709500\t0.4991\t56\nchr11\t123896100\t123896400\t0.1068\t98\nchr11\t124236000\t124237500\t0.0556\t81\nchr11\t124245600\t124245900\t0.5003\t48\nchr11\t124386300\t124388400\t0.2662\t87\nchr11\t124392000\t124392600\t0.1833\t34\nchr11\t124505400\t124506600\t0.0746\t88\nchr11\t124553400\t124553700\t0.3234\t64\nchr11\t124913100\t124913400\t0.5605\t153\nchr11\t124914600\t124914900\t0.48\t49\nchr11\t125036100\t125036400\t0.0091\t34\nchr11\t125537400\t125542500\t0\t72\nchr11\t125862300\t125864400\t0.2613\t75\nchr11\t125871000\t125871300\t0.4282\t64\nchr11\t126065100\t126065400\t0.2781\t118\nchr11\t126226200\t126226500\t0.0767\t142\nchr11\t126364200\t126365400\t0.4493\t57\nchr11\t126381300\t126382500\t0.2874\t75\nchr11\t127079400\t127079700\t0.104\t35\nchr11\t127287300\t127289100\t0.0416\t84\nchr11\t127364400\t127365600\t0.0819\t82\nchr11\t127367100\t127368000\t0.2057\t70\nchr11\t127776900\t127780500\t0.0549\t104\nchr11\t127782000\t127782300\t0.0549\t104\nchr11\t127869000\t127869900\t0.0227\t85\nchr11\t127871100\t127872000\t0.3508\t61\nchr11\t127940400\t127941000\t0.3695\t41\nchr11\t127976100\t127976700\t0.4088\t68\nchr11\t128076600\t128076900\t0.4877\t64\nchr11\t128144100\t128144400\t0.6248\t54\nchr11\t128930700\t128931000\t0.3649\t132\nchr11\t129174900\t129176400\t0\t77\nchr11\t129177900\t129178200\t0.5058\t55\nchr11\t129245100\t129245400\t0.3329\t65\nchr11\t129342300\t129343800\t0.0071\t64\nchr11\t129563400\t129564000\t0.0104\t62\nchr11\t130091100\t130092600\t0.1845\t81\nchr11\t130755000\t130756500\t0.5518\t32\nchr11\t130942500\t130943400\t0.2842\t67\nchr11\t131083800\t131084700\t0.4854\t65\nchr11\t131173500\t131174700\t0.1201\t49\nchr11\t131342100\t131342700\t0.2844\t131\nchr11\t131507400\t131508900\t0.4362\t87\nchr11\t131680500\t131680800\t0.6406\t369\nchr11\t131789400\t131789700\t0.6004\t42\nchr11\t132071100\t132071400\t0.6346\t63\nchr11\t132321600\t132324300\t0.0414\t81\nchr11\t132481800\t132483300\t0.1945\t79\nchr11\t133642200\t133642500\t0.141\t88\nchr11\t133644300\t133646100\t0.141\t88\nchr11\t133879800\t133880400\t0.4757\t66\nchr11\t133932600\t133932900\t0.4727\t149\nchr11\t134000100\t134000700\t0.1891\t59\nchr11\t134137800\t134138100\t0.5583\t52\nchr11\t134166000\t134166600\t0.3989\t47\nchr11\t134296200\t134296800\t0.087\t66\nchr11\t134308200\t134308500\t0.5653\t91\nchr11\t134375700\t134376300\t0.4739\t67\nchr11\t134408400\t134408700\t0.6218\t60\nchr11\t134440200\t134440500\t0.6289\t94\nchr11\t134451600\t134451900\t0.4042\t71\nchr11\t134523600\t134524200\t0.5388\t40\nchr11\t134656500\t134657100\t0.5379\t79\nchr11\t134839500\t134840400\t0.0162\t94\nchr11\t134851800\t134852100\t0.6684\t145\nchr11\t134927100\t134928900\t0.157\t87\nchr11\t134961900\t134962200\t0.5921\t61\nchr11\t134985900\t134986500\t0.4847\t63\nchr11\t135040200\t135040800\t0.58\t64\nchr11\t135046800\t135047100\t0.3865\t86\nchr12\t9900\t11700\t0.0749\t82\nchr12\t14100\t20100\t0.1558\t134\nchr12\t23400\t39000\t0\t157\nchr12\t40500\t43500\t0\t148\nchr12\t45600\t45900\t0.4275\t108\nchr12\t63600\t63900\t0.4252\t70\nchr12\t68100\t68400\t0.5823\t84\nchr12\t72600\t73200\t0.2755\t55\nchr12\t77400\t78000\t0.3409\t71\nchr12\t163200\t163500\t0.5252\t97\nchr12\t419400\t422100\t0.0632\t92\nchr12\t453000\t453600\t0.4258\t44\nchr12\t529800\t530100\t0.1478\t69\nchr12\t582900\t583200\t0.5218\t58\nchr12\t590700\t591000\t0.6383\t28\nchr12\t783600\t783900\t0.689\t24\nchr12\t1079400\t1079700\t0.1105\t44\nchr12\t1085100\t1086000\t0.0027\t180\nchr12\t1087800\t1088100\t0.3394\t16\nchr12\t1122000\t1122600\t0.2239\t47\nchr12\t1661100\t1662600\t0.2781\t22\nchr12\t1921500\t1922100\t0.2579\t42\nchr12\t1958700\t1959000\t0.6234\t48\nchr12\t2105700\t2106000\t0.4429\t73\nchr12\t2130300\t2135100\t0\t70\nchr12\t2255700\t2256300\t0.5027\t397\nchr12\t2280600\t2280900\t0.6062\t56\nchr12\t2407500\t2407800\t0.473\t74\nchr12\t2520000\t2520900\t0.0416\t129\nchr12\t2539200\t2539800\t0.0621\t251\nchr12\t2685300\t2685600\t0.5132\t56\nchr12\t2701200\t2701500\t0.3339\t83\nchr12\t2719800\t2720400\t0.6356\t83\nchr12\t2741400\t2741700\t0.5614\t67\nchr12\t3094800\t3096000\t0.3023\t57\nchr12\t3197700\t3198000\t0.6687\t53\nchr12\t3392400\t3394200\t0.1903\t83\nchr12\t3396600\t3396900\t0.1903\t83\nchr12\t3499200\t3505200\t0\t91\nchr12\t4179900\t4180800\t0.3368\t75\nchr12\t4509000\t4513500\t0.0296\t100\nchr12\t4732500\t4733100\t0.2752\t88\nchr12\t4973400\t4974000\t0.4494\t34\nchr12\t5117100\t5122200\t0.0353\t72\nchr12\t5143200\t5143500\t0.5589\t54\nchr12\t5285400\t5286600\t0.3206\t62\nchr12\t5288400\t5290500\t0.1882\t77\nchr12\t5394000\t5394300\t0.5555\t38\nchr12\t5928600\t5930100\t0.4367\t103\nchr12\t5931600\t5932800\t0.3595\t141\nchr12\t6022500\t6023100\t0.1418\t65\nchr12\t6100200\t6100500\t0.5861\t55\nchr12\t6290100\t6291000\t0.1073\t69\nchr12\t7196700\t7197000\t0.3466\t12\nchr12\t7279800\t7280100\t0.5133\t41\nchr12\t7333800\t7334100\t0.4821\t72\nchr12\t7335900\t7336200\t0.1421\t75\nchr12\t7506600\t7506900\t0.4267\t61\nchr12\t7794900\t7795800\t0.5397\t116\nchr12\t7819500\t7820100\t0.003\t61\nchr12\t7839000\t7839300\t0.3406\t67\nchr12\t7843200\t7843800\t0.4507\t69\nchr12\t7896600\t7896900\t0.4727\t67\nchr12\t7898700\t7899000\t0.6098\t73\nchr12\t7924500\t7924800\t0.1292\t49\nchr12\t7954200\t7954500\t0.3128\t65\nchr12\t7971900\t7972500\t0.0996\t74\nchr12\t7980300\t7980600\t0.3494\t26\nchr12\t8184600\t8185500\t0.1142\t50\nchr12\t8199000\t8199300\t0.4597\t75\nchr12\t8387700\t8388600\t0.0124\t87\nchr12\t8391000\t8391600\t0.6921\t17\nchr12\t8394000\t8395500\t0.0024\t102\nchr12\t8415600\t8415900\t0.6563\t35\nchr12\t8420100\t8421300\t0.5849\t25\nchr12\t8438400\t8438700\t0.3534\t20\nchr12\t8462400\t8462700\t0.5143\t41\nchr12\t8472900\t8473200\t0.5634\t33\nchr12\t8625600\t8626800\t0.0719\t79\nchr12\t8787600\t8788500\t0.0007\t62\nchr12\t8795100\t8796000\t0\t67\nchr12\t8932800\t8933400\t0.1333\t69\nchr12\t8939400\t8941200\t0.0036\t68\nchr12\t8964600\t8964900\t0.2151\t86\nchr12\t8966700\t8967000\t0.2151\t86\nchr12\t9062100\t9062400\t0.6945\t23\nchr12\t9285000\t9294000\t0\t90\nchr12\t9295200\t9301800\t0\t90\nchr12\t9303000\t9304200\t0.3886\t72\nchr12\t9306600\t9306900\t0.502\t61\nchr12\t9314400\t9315300\t0.2531\t83\nchr12\t9395400\t9395700\t0.2869\t37\nchr12\t9401100\t9401700\t0.0543\t36\nchr12\t9414900\t9415200\t0.0933\t72\nchr12\t9422700\t9423000\t0.5105\t56\nchr12\t9425100\t9426300\t0.3821\t87\nchr12\t9427800\t9428700\t0\t98\nchr12\t9430200\t9446700\t0\t98\nchr12\t9455100\t9455700\t0.0629\t28\nchr12\t9459000\t9459300\t0.464\t65\nchr12\t9467700\t9468000\t0.0138\t21\nchr12\t9482100\t9482400\t0.3942\t14\nchr12\t9496800\t9497100\t0.0659\t18\nchr12\t9501600\t9502200\t0.3975\t22\nchr12\t9503400\t9503700\t0.625\t10\nchr12\t9512700\t9513000\t0.5589\t16\nchr12\t9523200\t9525600\t0\t80\nchr12\t9549600\t9549900\t0.3735\t16\nchr12\t9556500\t9556800\t0.0369\t14\nchr12\t9559800\t9560100\t0\t15\nchr12\t9561300\t9561600\t0\t15\nchr12\t9563100\t9563400\t0\t29\nchr12\t9567600\t9568500\t0.3527\t67\nchr12\t9570600\t9572100\t0\t38\nchr12\t9573600\t9574200\t0\t22\nchr12\t9577500\t9578100\t0\t15\nchr12\t9580500\t9582300\t0\t67\nchr12\t9952500\t9954000\t0.2318\t65\nchr12\t10337100\t10337400\t0.5522\t49\nchr12\t10344600\t10346400\t0.1088\t79\nchr12\t10348800\t10349100\t0.2629\t71\nchr12\t10419600\t10419900\t0.5081\t23\nchr12\t10423800\t10425300\t0\t38\nchr12\t10426800\t10427700\t0.0031\t52\nchr12\t10437000\t10437900\t0\t21\nchr12\t10439100\t10440900\t0.078\t49\nchr12\t10442400\t10443000\t0.0028\t48\nchr12\t10520100\t10520400\t0.417\t89\nchr12\t10551000\t10551300\t0.4371\t62\nchr12\t10882200\t10882500\t0.4636\t51\nchr12\t11027100\t11027400\t0.3208\t53\nchr12\t11034000\t11034600\t0.0808\t28\nchr12\t11088000\t11088600\t0.065\t38\nchr12\t11091300\t11091600\t0.5041\t17\nchr12\t11095200\t11095500\t0\t19\nchr12\t11106000\t11106300\t0.4075\t18\nchr12\t11148300\t11150100\t0.1286\t59\nchr12\t11213100\t11213400\t0.4115\t68\nchr12\t11298000\t11303400\t0\t67\nchr12\t11319600\t11320200\t0.2752\t75\nchr12\t11352000\t11353800\t0\t75\nchr12\t11391900\t11393100\t0\t67\nchr12\t11395500\t11395800\t0.3848\t47\nchr12\t11841900\t11842200\t0.4552\t84\nchr12\t11936100\t11938800\t0.0281\t70\nchr12\t12322800\t12323100\t0.6824\t16\nchr12\t12413100\t12415200\t0.299\t55\nchr12\t13392000\t13399800\t0\t101\nchr12\t14586300\t14586600\t0.243\t11\nchr12\t14631600\t14631900\t0.2572\t79\nchr12\t15212100\t15212400\t0.4026\t70\nchr12\t15357600\t15357900\t0.3885\t54\nchr12\t15476700\t15477300\t0.0936\t70\nchr12\t16378500\t16378800\t0.3962\t65\nchr12\t16525500\t16526100\t0.3689\t52\nchr12\t16707300\t16710300\t0.0475\t118\nchr12\t17097600\t17097900\t0.6979\t269\nchr12\t17175900\t17179200\t0.0388\t81\nchr12\t17239500\t17239800\t0.5668\t50\nchr12\t17656200\t17656500\t0.3882\t59\nchr12\t17741100\t17741400\t0.6223\t31\nchr12\t17769300\t17770800\t0.0281\t103\nchr12\t17772600\t17773800\t0.0281\t103\nchr12\t17856300\t17860200\t0.0218\t105\nchr12\t18164700\t18165000\t0.4122\t53\nchr12\t18369600\t18370200\t0.212\t65\nchr12\t19000500\t19000800\t0.5396\t33\nchr12\t19173000\t19173300\t0.4671\t40\nchr12\t19340400\t19340700\t0.1178\t66\nchr12\t19728900\t19729200\t0.1494\t74\nchr12\t19730400\t19730700\t0.1494\t74\nchr12\t19815900\t19817400\t0.4909\t100\nchr12\t20156100\t20156400\t0.5568\t48\nchr12\t20553000\t20553600\t0.1403\t65\nchr12\t20670000\t20673600\t0.2462\t94\nchr12\t20709600\t20709900\t0\t16\nchr12\t20773500\t20773800\t0.1748\t45\nchr12\t21085200\t21085800\t0.4719\t63\nchr12\t21210000\t21210300\t0.484\t60\nchr12\t21212100\t21213900\t0.2453\t96\nchr12\t21284700\t21288000\t0.0055\t79\nchr12\t21396000\t21400800\t0.039\t96\nchr12\t21420000\t21425100\t0\t67\nchr12\t21466200\t21466500\t0.4282\t55\nchr12\t21622500\t21622800\t0\t11\nchr12\t21798300\t21799200\t0.2731\t76\nchr12\t21976800\t21978300\t0\t37\nchr12\t22137000\t22137600\t0.114\t87\nchr12\t22139100\t22142100\t0.114\t87\nchr12\t22178100\t22178400\t0.2578\t49\nchr12\t22418700\t22431600\t0\t50\nchr12\t22734900\t22735800\t0.2272\t72\nchr12\t22944600\t22944900\t0.3689\t61\nchr12\t23070900\t23071200\t0.2396\t75\nchr12\t23073600\t23073900\t0.0609\t58\nchr12\t23075100\t23075400\t0.0609\t58\nchr12\t23390400\t23390700\t0.509\t43\nchr12\t24581700\t24582000\t0.3608\t68\nchr12\t25485600\t25488600\t0.1063\t78\nchr12\t25517400\t25517700\t0.5489\t11\nchr12\t25538400\t25542000\t0.2104\t71\nchr12\t26035200\t26035800\t0.1413\t142\nchr12\t26216400\t26217900\t0.1756\t77\nchr12\t26673600\t26674200\t0.0667\t57\nchr12\t26784900\t26786400\t0.03\t33\nchr12\t27124800\t27125100\t0.5471\t54\nchr12\t27131100\t27132000\t0.2361\t77\nchr12\t27281100\t27281400\t0.1179\t22\nchr12\t27643200\t27644100\t0.2817\t71\nchr12\t28003200\t28003500\t0.4555\t69\nchr12\t28007400\t28007700\t0.414\t79\nchr12\t28200300\t28200600\t0.1354\t53\nchr12\t28695600\t28696200\t0.4597\t53\nchr12\t28762800\t28764600\t0.1306\t74\nchr12\t29017200\t29017500\t0.4654\t59\nchr12\t29406600\t29406900\t0.108\t67\nchr12\t29408400\t29408700\t0.108\t67\nchr12\t29584800\t29585100\t0.3645\t63\nchr12\t29814000\t29814300\t0.3395\t65\nchr12\t29823000\t29823300\t0.5422\t61\nchr12\t29913900\t29914200\t0.2609\t77\nchr12\t29932200\t29933100\t0.0067\t98\nchr12\t30036600\t30036900\t0.397\t54\nchr12\t30433200\t30433800\t0.2222\t72\nchr12\t30521100\t30521400\t0.1784\t47\nchr12\t31056600\t31056900\t0.3364\t44\nchr12\t31062900\t31063200\t0.5073\t50\nchr12\t31079100\t31079700\t0.4885\t68\nchr12\t31120200\t31120500\t0.6498\t16\nchr12\t31129200\t31129500\t0.6347\t39\nchr12\t31134000\t31134300\t0.1964\t24\nchr12\t31163700\t31166400\t0.2344\t81\nchr12\t31168500\t31168800\t0.3896\t72\nchr12\t31614600\t31615800\t0.3056\t69\nchr12\t32099700\t32100300\t0.0421\t56\nchr12\t32220600\t32220900\t0.3746\t54\nchr12\t32232000\t32232300\t0.361\t78\nchr12\t32810700\t32811000\t0.173\t25\nchr12\t33346200\t33346500\t0.3843\t41\nchr12\t33738000\t33740400\t0.0824\t68\nchr12\t33793800\t33794100\t0.3079\t86\nchr12\t33976200\t33976500\t0.5037\t51\nchr12\t34018800\t34019100\t0.572\t85\nchr12\t34067700\t34068000\t0.2524\t63\nchr12\t34069800\t34070100\t0.2524\t63\nchr12\t34236000\t34236300\t0.6256\t114\nchr12\t34669800\t34670100\t0.0392\t65\nchr12\t34680900\t34682700\t0.5928\t155\nchr12\t34690200\t34690500\t0.6907\t78\nchr12\t34695000\t34695600\t0.6184\t87\nchr12\t34770000\t34773000\t0\t85\nchr12\t34774200\t34796400\t0\t85\nchr12\t34797600\t34800000\t0\t88\nchr12\t34802700\t34803600\t0\t88\nchr12\t34805700\t34817100\t0\t64\nchr12\t34820400\t34822200\t0\t51\nchr12\t34829400\t34829700\t0.0065\t44\nchr12\t34830900\t34832700\t0.0065\t44\nchr12\t34834500\t34863000\t0\t1117\nchr12\t34864200\t34872900\t0\t1117\nchr12\t34874100\t35482800\t0\t1117\nchr12\t35484000\t35650500\t0\t4118\nchr12\t35651700\t35809800\t0\t4118\nchr12\t35811000\t36189600\t0\t4118\nchr12\t36191100\t36268500\t0\t213\nchr12\t36270000\t36450900\t0\t213\nchr12\t36452400\t36624000\t0\t213\nchr12\t36625200\t36699900\t0\t479\nchr12\t36701100\t36733800\t0\t479\nchr12\t36735000\t36779100\t0\t479\nchr12\t36780300\t36830400\t0\t479\nchr12\t36831600\t37010400\t0\t479\nchr12\t37011600\t37039200\t0\t479\nchr12\t37040700\t37102500\t0\t182\nchr12\t37104300\t37111800\t0\t232\nchr12\t37113000\t37185300\t0\t232\nchr12\t37235400\t37240800\t0\t144\nchr12\t37246200\t37248900\t0\t82\nchr12\t37250700\t37251900\t0\t43\nchr12\t37317300\t37317600\t0.6355\t109\nchr12\t37333200\t37334700\t0\t50\nchr12\t37339800\t37340400\t0.1009\t46\nchr12\t37342500\t37342800\t0.1614\t26\nchr12\t37465500\t37465800\t0.2866\t25\nchr12\t37486500\t37486800\t0.5285\t101\nchr12\t37646700\t37647000\t0.5161\t292\nchr12\t37649100\t37649400\t0.5101\t179\nchr12\t37653600\t37653900\t0.5279\t182\nchr12\t37671000\t37671300\t0.6895\t100\nchr12\t37688400\t37688700\t0.6871\t89\nchr12\t37691100\t37691400\t0.6592\t55\nchr12\t37700100\t37700400\t0.6715\t181\nchr12\t37702800\t37703100\t0.6872\t120\nchr12\t37705800\t37706400\t0.0472\t60\nchr12\t37709700\t37710000\t0.6542\t180\nchr12\t37713000\t37713300\t0.5877\t128\nchr12\t37716300\t37716600\t0.5726\t83\nchr12\t37719300\t37720500\t0.5986\t156\nchr12\t37723500\t37723800\t0.6471\t113\nchr12\t37728300\t37728600\t0.6554\t88\nchr12\t37730700\t37733400\t0.501\t250\nchr12\t37736400\t37737000\t0.1871\t65\nchr12\t37814400\t37815900\t0.1457\t94\nchr12\t38072700\t38073000\t0.2971\t47\nchr12\t38094000\t38094300\t0.0755\t35\nchr12\t38211600\t38212200\t0.0059\t54\nchr12\t38226900\t38227200\t0.276\t44\nchr12\t38313300\t38313600\t0.0745\t41\nchr12\t38627700\t38628000\t0.4012\t59\nchr12\t38799900\t38805600\t0\t84\nchr12\t38963700\t38964000\t0.3546\t69\nchr12\t38967600\t38967900\t0.4597\t45\nchr12\t38990400\t38990700\t0.2959\t73\nchr12\t39488400\t39488700\t0.4555\t84\nchr12\t39613200\t39613500\t0.5663\t33\nchr12\t39665400\t39665700\t0.4542\t26\nchr12\t39696300\t39696600\t0.3236\t56\nchr12\t39790500\t39792300\t0.0042\t63\nchr12\t39800400\t39801300\t0\t66\nchr12\t39836400\t39837600\t0.0357\t60\nchr12\t39901500\t39901800\t0.0425\t97\nchr12\t39979500\t39980100\t0.0268\t87\nchr12\t39981600\t39984000\t0.0268\t87\nchr12\t41007000\t41007300\t0.5694\t50\nchr12\t41040900\t41041200\t0.329\t75\nchr12\t41083500\t41083800\t0.3627\t86\nchr12\t41181000\t41181300\t0.2641\t57\nchr12\t41639700\t41640600\t0.2166\t84\nchr12\t41667600\t41671200\t0.2172\t81\nchr12\t41673300\t41677500\t0.1789\t94\nchr12\t41822400\t41822700\t0.3355\t101\nchr12\t41823900\t41824200\t0.3355\t101\nchr12\t41844300\t41845200\t0\t31\nchr12\t41976900\t41977200\t0.3877\t62\nchr12\t42047100\t42047400\t0.314\t66\nchr12\t42226800\t42227400\t0.5732\t38\nchr12\t42228600\t42229500\t0.0121\t49\nchr12\t42919200\t42919500\t0.3281\t61\nchr12\t43230300\t43231500\t0.3165\t69\nchr12\t43260600\t43260900\t0.2944\t43\nchr12\t43471500\t43476600\t0.0213\t124\nchr12\t43532700\t43534200\t0.0058\t49\nchr12\t43583700\t43585500\t0\t55\nchr12\t43605900\t43606200\t0.1232\t68\nchr12\t43622700\t43624200\t0.2229\t70\nchr12\t43686000\t43686300\t0.1915\t55\nchr12\t43790700\t43791300\t0.1281\t61\nchr12\t43794300\t43794600\t0.4102\t55\nchr12\t43908900\t43912200\t0.0416\t65\nchr12\t44108400\t44114100\t0\t106\nchr12\t44180400\t44180700\t0.5456\t65\nchr12\t44576700\t44577300\t0.1435\t70\nchr12\t44818800\t44819100\t0.4452\t55\nchr12\t44865000\t44865600\t0.3463\t55\nchr12\t44951700\t44956800\t0.0622\t84\nchr12\t44970900\t44971200\t0.5511\t68\nchr12\t45229500\t45229800\t0.319\t237\nchr12\t45372300\t45372600\t0.1296\t83\nchr12\t45374100\t45374700\t0.0559\t101\nchr12\t45376200\t45376800\t0.0559\t101\nchr12\t46056300\t46056600\t0.464\t62\nchr12\t46681500\t46681800\t0.6116\t22\nchr12\t46704900\t46706100\t0.2725\t64\nchr12\t46939500\t46941300\t0.2617\t67\nchr12\t47427900\t47428200\t0.3593\t80\nchr12\t47432400\t47432700\t0.3593\t80\nchr12\t47873400\t47873700\t0.5417\t41\nchr12\t48209700\t48210300\t0.4224\t60\nchr12\t48277200\t48278100\t0.2469\t72\nchr12\t48320700\t48321000\t0.4768\t78\nchr12\t48331800\t48334200\t0.0234\t65\nchr12\t48499800\t48500100\t0.4508\t66\nchr12\t48548400\t48548700\t0.4376\t67\nchr12\t48842400\t48843300\t0.1963\t67\nchr12\t48915300\t48915600\t0.5296\t40\nchr12\t49435800\t49436100\t0.3365\t78\nchr12\t50535900\t50536200\t0.5167\t60\nchr12\t50872200\t50872800\t0.5769\t29\nchr12\t51454500\t51455100\t0.0491\t75\nchr12\t51561600\t51568500\t0\t97\nchr12\t51719100\t51719700\t0.0474\t60\nchr12\t52013100\t52013400\t0.527\t47\nchr12\t52288800\t52291500\t0.001\t82\nchr12\t52302000\t52304400\t0.0202\t93\nchr12\t52410300\t52410600\t0.225\t82\nchr12\t52473300\t52473600\t0.4698\t55\nchr12\t53003400\t53003700\t0.5731\t33\nchr12\t53682300\t53682600\t0.5415\t35\nchr12\t54066900\t54067200\t0.548\t35\nchr12\t54779700\t54780000\t0.1159\t41\nchr12\t54789000\t54794400\t0\t80\nchr12\t54885000\t54885300\t0.6688\t36\nchr12\t54921900\t54922200\t0.5284\t59\nchr12\t55081500\t55082100\t0.2909\t80\nchr12\t55083900\t55084500\t0.2909\t80\nchr12\t55096500\t55101300\t0\t85\nchr12\t55155000\t55155300\t0.3689\t93\nchr12\t55161900\t55162200\t0.3636\t73\nchr12\t55163700\t55164000\t0.3078\t106\nchr12\t55225500\t55226100\t0.4931\t72\nchr12\t55333800\t55334100\t0.508\t36\nchr12\t55344600\t55350000\t0\t75\nchr12\t55387800\t55388100\t0.4892\t45\nchr12\t55409700\t55411800\t0.0049\t62\nchr12\t55413000\t55413600\t0.0233\t98\nchr12\t55486200\t55489800\t0.1927\t75\nchr12\t55521600\t55522200\t0.3122\t87\nchr12\t55594800\t55595100\t0.3767\t48\nchr12\t55690500\t55690800\t0.4649\t70\nchr12\t56075400\t56076600\t0.2028\t77\nchr12\t56400600\t56401200\t0.1159\t79\nchr12\t56788500\t56789100\t0.2583\t59\nchr12\t56938500\t56938800\t0.235\t72\nchr12\t56940300\t56941200\t0.0362\t63\nchr12\t56964300\t56964900\t0.3285\t46\nchr12\t56982000\t56982300\t0.2231\t64\nchr12\t56984700\t56985300\t0.0146\t76\nchr12\t57507000\t57507600\t0.6082\t52\nchr12\t57647700\t57652200\t0.0052\t106\nchr12\t57971100\t57971700\t0.273\t74\nchr12\t58054200\t58054500\t0.268\t65\nchr12\t58057200\t58058400\t0.268\t65\nchr12\t58075200\t58075500\t0.3864\t53\nchr12\t58109700\t58110900\t0.0552\t78\nchr12\t58112400\t58113000\t0.0552\t78\nchr12\t58218600\t58218900\t0.4499\t55\nchr12\t58228500\t58228800\t0.4273\t65\nchr12\t58327500\t58336800\t0.0014\t108\nchr12\t58471800\t58475100\t0.2231\t35\nchr12\t58494300\t58494600\t0.4754\t50\nchr12\t59467800\t59468400\t0.44\t48\nchr12\t59590200\t59590500\t0.5444\t74\nchr12\t59739300\t59739600\t0.1942\t56\nchr12\t59756700\t59757000\t0.1921\t54\nchr12\t59955000\t59955300\t0.3525\t42\nchr12\t60008700\t60009600\t0.0024\t167\nchr12\t60736500\t60736800\t0.4053\t58\nchr12\t61002900\t61003200\t0.3688\t65\nchr12\t61206300\t61206600\t0.5438\t64\nchr12\t61223400\t61223700\t0.471\t55\nchr12\t61400400\t61400700\t0.4803\t69\nchr12\t61471200\t61471500\t0.2977\t41\nchr12\t61540200\t61541700\t0.1974\t85\nchr12\t61733700\t61734300\t0.4047\t77\nchr12\t61942200\t61947000\t0.0109\t88\nchr12\t62496900\t62497200\t0.5118\t23\nchr12\t62838600\t62838900\t0.4071\t47\nchr12\t63189300\t63189600\t0.4854\t60\nchr12\t63545700\t63546000\t0.4709\t46\nchr12\t63547800\t63548100\t0.4829\t77\nchr12\t63592200\t63592800\t0.3926\t65\nchr12\t63670500\t63671100\t0.3066\t51\nchr12\t63740700\t63741000\t0.4089\t65\nchr12\t63742800\t63743100\t0.4016\t57\nchr12\t64055100\t64055400\t0.3347\t61\nchr12\t64140300\t64141200\t0.2441\t60\nchr12\t64196700\t64201800\t0.0108\t80\nchr12\t64287600\t64293000\t0\t89\nchr12\t64846500\t64847100\t0.3735\t64\nchr12\t65350500\t65351700\t0.3252\t78\nchr12\t65550300\t65551200\t0.1118\t83\nchr12\t65552400\t65552700\t0.1118\t83\nchr12\t65687400\t65687700\t0.2018\t60\nchr12\t65813400\t65813700\t0.6121\t27\nchr12\t66057300\t66057900\t0.1246\t480\nchr12\t66134400\t66135900\t0.0581\t39\nchr12\t66444300\t66444600\t0.6054\t58\nchr12\t66579900\t66580800\t0.3277\t71\nchr12\t66582600\t66584100\t0.3277\t71\nchr12\t66585600\t66585900\t0.3999\t54\nchr12\t67136100\t67136400\t0.233\t44\nchr12\t67844100\t67845300\t0.2872\t76\nchr12\t67846500\t67847400\t0.2872\t76\nchr12\t67903800\t67905600\t0.083\t80\nchr12\t67953600\t67954200\t0.1828\t70\nchr12\t68513100\t68513700\t0.2871\t62\nchr12\t68659800\t68660400\t0.1348\t56\nchr12\t68927100\t68927400\t0.4155\t74\nchr12\t68994600\t68995200\t0.0871\t52\nchr12\t69469200\t69469500\t0.5557\t52\nchr12\t69759000\t69759300\t0.5501\t47\nchr12\t69773400\t69779400\t0\t85\nchr12\t69808800\t69809100\t0.498\t62\nchr12\t69861900\t69862200\t0.3379\t82\nchr12\t69940200\t69944400\t0.0987\t81\nchr12\t70013700\t70018800\t0.0004\t98\nchr12\t70201200\t70203600\t0.0008\t120\nchr12\t70682100\t70682400\t0.6483\t51\nchr12\t70769100\t70770300\t0.2245\t77\nchr12\t70866900\t70867200\t0.4373\t71\nchr12\t71098800\t71099700\t0.121\t65\nchr12\t71100900\t71103300\t0.0198\t84\nchr12\t71119200\t71120100\t0\t60\nchr12\t71121900\t71124000\t0\t60\nchr12\t71265000\t71265300\t0.3284\t61\nchr12\t71564100\t71564700\t0\t57\nchr12\t71911500\t71911800\t0.4343\t100\nchr12\t72514800\t72515400\t0.1046\t76\nchr12\t72516600\t72518400\t0.4761\t92\nchr12\t72636300\t72636600\t0.3576\t61\nchr12\t72638100\t72638400\t0.4116\t69\nchr12\t72908400\t72908700\t0.1393\t69\nchr12\t73148100\t73149600\t0.0165\t83\nchr12\t73150800\t73152600\t0.0165\t83\nchr12\t73194600\t73195500\t0.0735\t109\nchr12\t73197000\t73197300\t0.4997\t58\nchr12\t73283700\t73288800\t0\t75\nchr12\t73395600\t73400700\t0.1651\t92\nchr12\t73506000\t73506300\t0.5575\t42\nchr12\t73698000\t73698300\t0.45\t41\nchr12\t73982400\t73983600\t0.0185\t137\nchr12\t74505900\t74507400\t0.3468\t95\nchr12\t74875200\t74880900\t0\t86\nchr12\t75003300\t75003600\t0.5133\t59\nchr12\t75729900\t75730500\t0.1438\t97\nchr12\t76122300\t76122600\t0.3161\t11\nchr12\t76321800\t76322100\t0.2896\t79\nchr12\t77173800\t77178600\t0.0997\t85\nchr12\t77514900\t77515200\t0.4974\t21\nchr12\t77656200\t77656800\t0.1887\t46\nchr12\t78070800\t78071100\t0.4357\t90\nchr12\t78072300\t78073500\t0.0636\t84\nchr12\t79039800\t79040100\t0.4156\t64\nchr12\t79042200\t79042800\t0.2092\t76\nchr12\t79044300\t79044900\t0.2092\t76\nchr12\t79177200\t79178100\t0.0212\t61\nchr12\t79311300\t79311900\t0.4239\t75\nchr12\t79368300\t79368900\t0.426\t80\nchr12\t80148300\t80148600\t0.341\t73\nchr12\t80244900\t80248800\t0.0059\t80\nchr12\t80307000\t80307300\t0.3144\t61\nchr12\t80448600\t80448900\t0.4907\t41\nchr12\t80451300\t80452200\t0\t56\nchr12\t80453400\t80454000\t0\t54\nchr12\t80462400\t80463000\t0.2633\t112\nchr12\t80464200\t80465100\t0\t59\nchr12\t80479500\t80479800\t0.3687\t62\nchr12\t80481900\t80483400\t0.0841\t63\nchr12\t80586300\t80586600\t0.5698\t47\nchr12\t81638700\t81639000\t0.5334\t51\nchr12\t82133400\t82133700\t0.5882\t47\nchr12\t82899900\t82900800\t0.0784\t88\nchr12\t83393700\t83394300\t0.0496\t21\nchr12\t83428800\t83429100\t0.4467\t70\nchr12\t83450400\t83450700\t0.1169\t54\nchr12\t83524500\t83524800\t0.0431\t46\nchr12\t83587500\t83587800\t0.1922\t73\nchr12\t83589600\t83589900\t0.1922\t73\nchr12\t83671800\t83676600\t0\t75\nchr12\t83894400\t83894700\t0.4216\t59\nchr12\t83902200\t83902800\t0.1238\t47\nchr12\t84006300\t84006900\t0.2963\t61\nchr12\t84090600\t84090900\t0.3889\t31\nchr12\t85193100\t85194600\t0.0472\t82\nchr12\t85312800\t85313100\t0.0178\t95\nchr12\t85315200\t85317600\t0.0178\t95\nchr12\t86802600\t86804100\t0.1499\t76\nchr12\t86844900\t86846400\t0.0051\t76\nchr12\t86859300\t86859900\t0.0199\t59\nchr12\t86880000\t86880300\t0.5551\t40\nchr12\t86947500\t86947800\t0.5216\t41\nchr12\t87077400\t87078300\t0.2803\t56\nchr12\t87102000\t87102900\t0.1538\t56\nchr12\t87191700\t87194100\t0.0215\t67\nchr12\t87582600\t87583500\t0.1326\t75\nchr12\t87680400\t87681000\t0.4875\t56\nchr12\t87682800\t87683100\t0.5681\t71\nchr12\t87746700\t87750000\t0\t72\nchr12\t87751500\t87751800\t0.4369\t54\nchr12\t87970500\t87971400\t0.3748\t87\nchr12\t88621800\t88622700\t0.0283\t74\nchr12\t88710300\t88710900\t0.506\t87\nchr12\t88712700\t88713900\t0.2877\t89\nchr12\t88847400\t88848600\t0.2979\t106\nchr12\t88852200\t88852500\t0.1961\t71\nchr12\t88938900\t88940400\t0.4166\t87\nchr12\t89443500\t89443800\t0.2605\t82\nchr12\t89808300\t89808900\t0.5133\t80\nchr12\t89811000\t89811300\t0.3001\t72\nchr12\t89867100\t89867700\t0.3529\t67\nchr12\t90536700\t90543300\t0\t69\nchr12\t90841800\t90842100\t0.6929\t53\nchr12\t91708800\t91709100\t0.4695\t74\nchr12\t91977900\t91978200\t0.4868\t62\nchr12\t92231700\t92232600\t0.1595\t75\nchr12\t92314800\t92319900\t0\t85\nchr12\t92679300\t92682000\t0.2234\t87\nchr12\t92727900\t92728500\t0.4381\t31\nchr12\t92916600\t92921700\t0.0157\t71\nchr12\t93399300\t93399900\t0.0799\t48\nchr12\t93401100\t93402300\t0.1436\t59\nchr12\t93492900\t93494100\t0\t63\nchr12\t93498000\t93499200\t0\t56\nchr12\t93639900\t93640800\t0.3409\t62\nchr12\t93987900\t93989400\t0.3695\t66\nchr12\t94485900\t94486200\t0.4045\t72\nchr12\t94950300\t94950600\t0.2662\t49\nchr12\t95235000\t95235300\t0.5808\t63\nchr12\t95339700\t95340000\t0.3328\t67\nchr12\t95586300\t95586600\t0.5456\t56\nchr12\t95596200\t95596500\t0.5883\t51\nchr12\t95839800\t95842500\t0\t59\nchr12\t95907000\t95907600\t0.4745\t57\nchr12\t95923800\t95926200\t0.2328\t89\nchr12\t95927700\t95928300\t0.2328\t89\nchr12\t95946600\t95949300\t0.0013\t67\nchr12\t96152700\t96153000\t0.4852\t48\nchr12\t96316500\t96321900\t0\t84\nchr12\t96725700\t96726300\t0.4449\t75\nchr12\t96827400\t96827700\t0.1323\t25\nchr12\t96916500\t96916800\t0.3707\t75\nchr12\t97161000\t97161300\t0.0607\t40\nchr12\t97351200\t97351500\t0.3914\t70\nchr12\t97652700\t97656300\t0.1655\t85\nchr12\t97704900\t97709100\t0\t73\nchr12\t97718100\t97719000\t0.0631\t77\nchr12\t97722300\t97723200\t0.3235\t89\nchr12\t97725300\t97729800\t0\t79\nchr12\t97950600\t97950900\t0.6793\t28\nchr12\t98250000\t98250300\t0.4023\t55\nchr12\t98278500\t98279100\t0.0287\t65\nchr12\t98457600\t98457900\t0.5219\t47\nchr12\t98654700\t98655300\t0.1204\t68\nchr12\t99052500\t99052800\t0.5118\t30\nchr12\t99058800\t99059100\t0.5447\t54\nchr12\t101146800\t101147400\t0\t82\nchr12\t101149200\t101151900\t0\t82\nchr12\t101153700\t101154300\t0\t82\nchr12\t101389800\t101390100\t0.497\t79\nchr12\t101509200\t101511600\t0.0433\t70\nchr12\t101586300\t101587200\t0.1689\t69\nchr12\t101704500\t101705700\t0.054\t45\nchr12\t102308100\t102308700\t0.1209\t69\nchr12\t102311400\t102311700\t0.4796\t60\nchr12\t102448200\t102448500\t0.4219\t57\nchr12\t102827400\t102829500\t0.1071\t81\nchr12\t102831300\t102831900\t0.3099\t77\nchr12\t102899700\t102900000\t0.5702\t34\nchr12\t103297800\t103298100\t0.6002\t60\nchr12\t103321200\t103321800\t0.153\t95\nchr12\t103436700\t103437000\t0.299\t76\nchr12\t103440000\t103440300\t0.299\t76\nchr12\t103656600\t103656900\t0.3347\t58\nchr12\t103899600\t103899900\t0.1547\t45\nchr12\t103905300\t103905600\t0.6653\t12\nchr12\t104031600\t104032200\t0.15\t64\nchr12\t104322900\t104323800\t0.1151\t66\nchr12\t104572200\t104572500\t0.4728\t61\nchr12\t104916900\t104917200\t0.3397\t62\nchr12\t105629100\t105633600\t0.0854\t88\nchr12\t105664200\t105664500\t0.4056\t33\nchr12\t105777300\t105781500\t0\t70\nchr12\t106403100\t106403400\t0.3303\t85\nchr12\t106472100\t106474800\t0\t77\nchr12\t106476000\t106477500\t0\t77\nchr12\t106751100\t106752300\t0.4565\t88\nchr12\t107189100\t107189400\t0.4309\t60\nchr12\t108348000\t108348600\t0.0384\t26\nchr12\t108859800\t108860100\t0.6372\t22\nchr12\t108997800\t109002600\t0.0171\t84\nchr12\t109634400\t109635600\t0.3056\t125\nchr12\t110570400\t110571300\t0.023\t73\nchr12\t110866500\t110867700\t0.5145\t61\nchr12\t111296700\t111297000\t0.5362\t49\nchr12\t111829200\t111829500\t0.3129\t49\nchr12\t111831900\t111832200\t0.1301\t75\nchr12\t112323900\t112324200\t0.5547\t23\nchr12\t112621200\t112627200\t0\t105\nchr12\t113451600\t113451900\t0.5303\t35\nchr12\t113871900\t113873700\t0.065\t103\nchr12\t114063900\t114064500\t0.5514\t76\nchr12\t114084000\t114084600\t0.5332\t59\nchr12\t114536100\t114536700\t0.3072\t68\nchr12\t114571500\t114571800\t0.0632\t59\nchr12\t115286400\t115290600\t0.0159\t106\nchr12\t117428400\t117429000\t0.433\t75\nchr12\t118514700\t118515000\t0.6209\t52\nchr12\t118658700\t118659000\t0.454\t62\nchr12\t118681200\t118681500\t0.209\t60\nchr12\t118707600\t118708200\t0.4307\t150\nchr12\t118757700\t118758000\t0.6421\t63\nchr12\t119397600\t119397900\t0.5316\t37\nchr12\t119918100\t119919900\t0.3589\t68\nchr12\t120552900\t120553200\t0.5249\t63\nchr12\t120928500\t120928800\t0.1222\t34\nchr12\t120987900\t120988200\t0.6905\t39\nchr12\t121301100\t121301400\t0.4575\t20\nchr12\t121362300\t121362600\t0.4014\t50\nchr12\t121515000\t121515300\t0.6728\t15\nchr12\t121747200\t121748100\t0.0484\t46\nchr12\t121992900\t121995000\t0.2093\t67\nchr12\t122579100\t122579400\t0.5492\t44\nchr12\t122695800\t122696700\t0.0165\t69\nchr12\t122700000\t122700600\t0.1872\t76\nchr12\t122704200\t122704500\t0.3565\t49\nchr12\t122709300\t122709900\t0.0322\t64\nchr12\t122713500\t122714100\t0.0144\t76\nchr12\t122717700\t122718000\t0.2796\t59\nchr12\t122853300\t122853600\t0.6435\t29\nchr12\t122973300\t122973600\t0.4372\t33\nchr12\t124089300\t124089600\t0.4693\t49\nchr12\t124092600\t124092900\t0.5658\t103\nchr12\t124101300\t124101900\t0.1226\t37\nchr12\t124234800\t124235100\t0.6686\t99\nchr12\t124323300\t124323600\t0.6617\t46\nchr12\t124373400\t124373700\t0.4542\t33\nchr12\t124839600\t124840200\t0.2197\t69\nchr12\t124911900\t124912500\t0.1934\t55\nchr12\t125204400\t125205000\t0.4183\t67\nchr12\t125409600\t125411100\t0.1004\t27\nchr12\t125729700\t125730000\t0.3679\t68\nchr12\t126151500\t126152100\t0.1364\t60\nchr12\t126180600\t126181200\t0.6278\t56\nchr12\t126299100\t126305100\t0\t97\nchr12\t126583500\t126584400\t0\t69\nchr12\t126969000\t126969600\t0.3368\t81\nchr12\t127095000\t127100100\t0.049\t86\nchr12\t127176000\t127176300\t0.443\t34\nchr12\t127545000\t127545900\t0.0013\t39\nchr12\t127568700\t127569000\t0.6049\t43\nchr12\t127871100\t127871700\t0.0355\t70\nchr12\t128041800\t128042400\t0.544\t65\nchr12\t128241600\t128241900\t0.5572\t32\nchr12\t128638800\t128639100\t0.5263\t192\nchr12\t128708100\t128708700\t0.4473\t118\nchr12\t128844600\t128846700\t0.2808\t46\nchr12\t129018000\t129018300\t0.1703\t46\nchr12\t129087900\t129089400\t0.4039\t146\nchr12\t129190200\t129190500\t0.4359\t54\nchr12\t129303000\t129303600\t0.0859\t76\nchr12\t129356100\t129356400\t0.2866\t28\nchr12\t129479700\t129480000\t0.4053\t42\nchr12\t129575700\t129576000\t0.5075\t15\nchr12\t129801600\t129802500\t0.0327\t79\nchr12\t129804000\t129806700\t0.0327\t79\nchr12\t129855300\t129858600\t0\t58\nchr12\t130338300\t130338600\t0.4328\t51\nchr12\t130379400\t130380000\t0.3554\t69\nchr12\t130386600\t130387500\t0.0245\t62\nchr12\t130392000\t130393200\t0.477\t207\nchr12\t130482900\t130483200\t0.4381\t47\nchr12\t130539600\t130539900\t0.5085\t54\nchr12\t130586700\t130587600\t0.0468\t87\nchr12\t130646100\t130646400\t0.5291\t37\nchr12\t130782300\t130782600\t0.5875\t156\nchr12\t130843800\t130844100\t0.1047\t100\nchr12\t130882200\t130882800\t0.1945\t66\nchr12\t130887600\t130887900\t0.2105\t73\nchr12\t131032800\t131033100\t0.4251\t58\nchr12\t131067600\t131067900\t0.5232\t37\nchr12\t131071800\t131072100\t0.4112\t61\nchr12\t131195100\t131195400\t0.038\t61\nchr12\t131200800\t131202600\t0\t81\nchr12\t131206200\t131206800\t0.1545\t67\nchr12\t131225400\t131226000\t0.0162\t76\nchr12\t131235300\t131235600\t0.5025\t69\nchr12\t131244600\t131244900\t0.6811\t43\nchr12\t131278200\t131278500\t0.2476\t66\nchr12\t131297100\t131307900\t0\t78\nchr12\t131367000\t131367300\t0.5236\t75\nchr12\t131392500\t131393400\t0.2243\t56\nchr12\t131395500\t131395800\t0.4328\t231\nchr12\t131400000\t131400300\t0.6368\t47\nchr12\t131413800\t131414700\t0.6272\t40\nchr12\t131433300\t131434200\t0.0373\t49\nchr12\t131439600\t131440200\t0.042\t62\nchr12\t131470500\t131470800\t0.0808\t49\nchr12\t131474700\t131476500\t0\t93\nchr12\t131481000\t131481900\t0.0311\t62\nchr12\t131539200\t131539500\t0.674\t91\nchr12\t131559000\t131559300\t0.4552\t60\nchr12\t131577000\t131577300\t0.5375\t170\nchr12\t131580300\t131581200\t0.3327\t60\nchr12\t131582400\t131582700\t0.5092\t37\nchr12\t131588100\t131588700\t0.1747\t439\nchr12\t131626500\t131627700\t0.1268\t196\nchr12\t131646600\t131646900\t0.5639\t57\nchr12\t131654400\t131658300\t0.0791\t105\nchr12\t131660700\t131663700\t0\t82\nchr12\t131701200\t131701800\t0.111\t28\nchr12\t131766900\t131767200\t0.5255\t49\nchr12\t131810100\t131810700\t0.3983\t57\nchr12\t132135000\t132136200\t0.536\t29\nchr12\t132148800\t132150600\t0.0006\t206\nchr12\t132212100\t132212700\t0.0779\t37\nchr12\t132231300\t132236100\t0\t72\nchr12\t132240900\t132243300\t0.1538\t199\nchr12\t132244500\t132244800\t0.6188\t11\nchr12\t132303600\t132305400\t0.466\t63\nchr12\t132349800\t132350100\t0.4687\t225\nchr12\t132359100\t132359400\t0.6725\t26\nchr12\t132361800\t132362700\t0.2446\t71\nchr12\t132364800\t132365100\t0.4251\t34\nchr12\t132378000\t132378300\t0.1995\t12\nchr12\t132384300\t132384600\t0.5467\t43\nchr12\t132387600\t132387900\t0.5777\t47\nchr12\t132392100\t132392400\t0.3899\t14\nchr12\t132412800\t132413400\t0.588\t37\nchr12\t132463500\t132464400\t0.3734\t125\nchr12\t132684000\t132684900\t0.1793\t92\nchr12\t132688200\t132689100\t0.1648\t40\nchr12\t132692700\t132694500\t0.4516\t37\nchr12\t132759000\t132759300\t0.6324\t98\nchr12\t132787500\t132787800\t0.6342\t44\nchr12\t132793200\t132793800\t0.009\t51\nchr12\t132805200\t132805500\t0.5663\t32\nchr12\t132817200\t132818100\t0.3954\t34\nchr12\t132836100\t132836400\t0.2755\t33\nchr12\t132945300\t132945600\t0.5888\t69\nchr12\t133198200\t133199100\t0.3447\t66\nchr12\t133264800\t133265400\t0\t201\nchr13\t16001700\t16002300\t0.0914\t67\nchr13\t16004100\t16006800\t0.1347\t164\nchr13\t16011000\t16011900\t0.6061\t134\nchr13\t16013100\t16013400\t0.6246\t56\nchr13\t16015800\t16016400\t0.3213\t59\nchr13\t16020600\t16020900\t0.5086\t23\nchr13\t16023000\t16025400\t0.0067\t150\nchr13\t16027200\t16034700\t0.0067\t150\nchr13\t16035900\t16036200\t0.633\t43\nchr13\t16038300\t16065000\t0\t152\nchr13\t16067700\t16069500\t0\t152\nchr13\t16070700\t16074000\t0\t153\nchr13\t16075200\t16077000\t0\t153\nchr13\t16078200\t16129200\t0\t1096\nchr13\t16130400\t16156500\t0.0646\t1637\nchr13\t16157700\t16237500\t0\t1721\nchr13\t16238700\t16256100\t0\t1118\nchr13\t16257600\t16259100\t0.6794\t216\nchr13\t16260600\t16260900\t0.4284\t75\nchr13\t16262100\t16263600\t0\t83\nchr13\t16265400\t16400100\t0\t1930\nchr13\t16401300\t16426800\t0\t4973\nchr13\t16428300\t16906200\t0\t4973\nchr13\t16908000\t16954200\t0\t7157\nchr13\t16955400\t17447400\t0\t7157\nchr13\t17448600\t17449500\t0\t7157\nchr13\t17451000\t17881200\t0\t7157\nchr13\t17882400\t18051300\t0\t7157\nchr13\t18171300\t18171600\t0.5031\t85\nchr13\t18178500\t18179100\t0.4745\t168\nchr13\t18191400\t18192300\t0.3695\t115\nchr13\t18193800\t18197100\t0.1706\t123\nchr13\t18201300\t18203400\t0.2348\t186\nchr13\t18206100\t18206400\t0.4626\t141\nchr13\t18211500\t18215100\t0.104\t51632\nchr13\t18284400\t18284700\t0.4444\t81\nchr13\t18293100\t18293400\t0.4432\t77\nchr13\t18312600\t18312900\t0.3967\t71\nchr13\t18317100\t18318300\t0.2492\t155\nchr13\t18320400\t18320700\t0.5555\t96\nchr13\t18325500\t18326100\t0.4365\t51\nchr13\t18330900\t18331200\t0.57\t180\nchr13\t18333600\t18334200\t0.4278\t117\nchr13\t18336300\t18337200\t0.2203\t207\nchr13\t18339000\t18352500\t0\t92\nchr13\t18353700\t18357300\t0\t92\nchr13\t18408900\t18410400\t0.3518\t55\nchr13\t18411900\t18412200\t0\t75\nchr13\t18414000\t18418200\t0\t75\nchr13\t18419700\t18431100\t0\t75\nchr13\t18432600\t18436500\t0.0002\t58\nchr13\t18440400\t18442200\t0.2048\t61\nchr13\t18448800\t18450000\t0.2029\t45\nchr13\t18452700\t18453300\t0.2452\t72\nchr13\t18456900\t18460500\t0.016\t234\nchr13\t18462300\t18462900\t0.3939\t48\nchr13\t18464100\t18464400\t0.1352\t42\nchr13\t18466200\t18466800\t0.1896\t57\nchr13\t18481200\t18482100\t0.1162\t66\nchr13\t18483900\t18484200\t0.1162\t66\nchr13\t18485700\t18486000\t0.1162\t66\nchr13\t18489000\t18489300\t0.3804\t52\nchr13\t18492000\t18495600\t0.1381\t66\nchr13\t18497400\t18498300\t0.1321\t52\nchr13\t18503100\t18503400\t0.3493\t69\nchr13\t18509100\t18510300\t0.0224\t65\nchr13\t18515700\t18516300\t0.2928\t67\nchr13\t18519300\t18519600\t0.2887\t72\nchr13\t18520800\t18522000\t0.2887\t72\nchr13\t18527100\t18528600\t0.4423\t63\nchr13\t18534300\t18536700\t0.2414\t63\nchr13\t18538500\t18540600\t0.2064\t55\nchr13\t18542700\t18544200\t0.3408\t63\nchr13\t18546900\t18560100\t0\t75\nchr13\t18562800\t18569700\t0.1572\t58\nchr13\t18571200\t18574800\t0.005\t66\nchr13\t18576000\t18577800\t0.005\t66\nchr13\t18579900\t18582000\t0.005\t66\nchr13\t18583500\t18583800\t0.005\t66\nchr13\t18585000\t18585300\t0.005\t66\nchr13\t18588000\t18588900\t0.005\t66\nchr13\t18592500\t18592800\t0.2901\t55\nchr13\t18603600\t18604800\t0\t58\nchr13\t18606300\t18608700\t0.0796\t54\nchr13\t18616800\t18617100\t0.2616\t43\nchr13\t18622800\t18623100\t0.5827\t51\nchr13\t18669900\t18670200\t0.2181\t68\nchr13\t18671400\t18672000\t0.0407\t49\nchr13\t18675600\t18676200\t0.0903\t62\nchr13\t18705300\t18705600\t0.5043\t55\nchr13\t18759000\t18759300\t0.498\t38\nchr13\t18769200\t18771600\t0\t36\nchr13\t18778200\t18779100\t0.4406\t62\nchr13\t18783000\t18783300\t0.6622\t70\nchr13\t18784800\t18785400\t0.0495\t61\nchr13\t18788400\t18790800\t0\t32\nchr13\t18801300\t18801900\t0.0124\t56\nchr13\t18805800\t18806100\t0.2793\t70\nchr13\t18902700\t18903000\t0.1139\t20\nchr13\t19104600\t19104900\t0.1192\t79\nchr13\t19106100\t19108500\t0.1192\t79\nchr13\t19137300\t19138500\t0.028\t168\nchr13\t19199400\t19200000\t0.1821\t51\nchr13\t19273500\t19278900\t0.0816\t69\nchr13\t19353300\t19353900\t0.4084\t78\nchr13\t19431900\t19432200\t0.2636\t38\nchr13\t19497300\t19497600\t0.0535\t34\nchr13\t19499400\t19499700\t0.1444\t71\nchr13\t19500900\t19501500\t0.1444\t71\nchr13\t19559700\t19560300\t0.2105\t78\nchr13\t19594800\t19595100\t0.5686\t61\nchr13\t19701000\t19701300\t0.6089\t76\nchr13\t19778400\t19780800\t0.1148\t73\nchr13\t21261600\t21261900\t0.2881\t67\nchr13\t21377100\t21377700\t0.2003\t347\nchr13\t21447600\t21449100\t0.0983\t50\nchr13\t21856500\t21856800\t0.4188\t54\nchr13\t21949500\t21949800\t0.5208\t49\nchr13\t22361400\t22361700\t0.4636\t40\nchr13\t22481100\t22481400\t0.1837\t33\nchr13\t22522200\t22522500\t0.3627\t121\nchr13\t22575300\t22575600\t0.6016\t61\nchr13\t22577400\t22578000\t0.1814\t60\nchr13\t22580400\t22580700\t0.5523\t77\nchr13\t22942200\t22942500\t0.4172\t74\nchr13\t23446500\t23446800\t0.4615\t76\nchr13\t23483400\t23483700\t0.5827\t30\nchr13\t24321000\t24321300\t0.4582\t15\nchr13\t24355800\t24356100\t0.6767\t67\nchr13\t24587400\t24587700\t0.6282\t119\nchr13\t24808500\t24809100\t0.0331\t73\nchr13\t24810300\t24810600\t0.0331\t73\nchr13\t24961200\t24961800\t0.4105\t107\nchr13\t25004100\t25005000\t0.1223\t48\nchr13\t25479600\t25479900\t0.3768\t86\nchr13\t25504500\t25504800\t0.3793\t49\nchr13\t25992900\t25993200\t0.4227\t80\nchr13\t26072700\t26073300\t0.015\t58\nchr13\t26472600\t26472900\t0.1739\t61\nchr13\t26700600\t26700900\t0.6222\t66\nchr13\t26724000\t26724600\t0.3418\t50\nchr13\t28265700\t28266000\t0.1351\t28\nchr13\t29193900\t29194200\t0.4621\t59\nchr13\t29219100\t29219400\t0.3318\t45\nchr13\t29244600\t29244900\t0.6123\t48\nchr13\t29413500\t29414400\t0.0105\t65\nchr13\t29641800\t29647800\t0\t97\nchr13\t29669400\t29670900\t0.0612\t75\nchr13\t30262500\t30265200\t0.4141\t69\nchr13\t30270600\t30270900\t0.2232\t78\nchr13\t30330600\t30330900\t0.5405\t39\nchr13\t30460200\t30460500\t0.4581\t61\nchr13\t30601500\t30601800\t0.3775\t24\nchr13\t30813900\t30814200\t0.3532\t38\nchr13\t30840000\t30840300\t0.4075\t60\nchr13\t30852000\t30852300\t0.6132\t41\nchr13\t31302300\t31308300\t0\t118\nchr13\t31835400\t31835700\t0.2926\t27\nchr13\t32717100\t32717700\t0.1779\t123\nchr13\t32867700\t32869200\t0\t99\nchr13\t33886800\t33887400\t0.4479\t67\nchr13\t33925200\t33925500\t0.1946\t44\nchr13\t33926700\t33927000\t0.1946\t44\nchr13\t33987600\t33987900\t0.4613\t77\nchr13\t34480200\t34486200\t0\t78\nchr13\t34539900\t34541400\t0.1326\t33\nchr13\t34801200\t34801800\t0.427\t147\nchr13\t35088900\t35089800\t0.0432\t101\nchr13\t36008400\t36013200\t0.0115\t78\nchr13\t36056100\t36056400\t0.0321\t53\nchr13\t36066900\t36067200\t0.4234\t27\nchr13\t36486600\t36488700\t0.1019\t55\nchr13\t37150200\t37153500\t0.2093\t115\nchr13\t37155000\t37155600\t0.2093\t115\nchr13\t37250700\t37251000\t0.5277\t68\nchr13\t37253700\t37254300\t0.2441\t58\nchr13\t37281000\t37281300\t0.4719\t60\nchr13\t37314600\t37315200\t0.0514\t70\nchr13\t37317900\t37318500\t0.0828\t59\nchr13\t37566900\t37567200\t0.6477\t45\nchr13\t37822800\t37824300\t0.3779\t81\nchr13\t37826100\t37826700\t0.1076\t75\nchr13\t38068500\t38070000\t0.3136\t69\nchr13\t38114100\t38114400\t0.28\t65\nchr13\t38115900\t38118000\t0.2716\t69\nchr13\t38289600\t38289900\t0.3657\t58\nchr13\t39000900\t39006000\t0\t76\nchr13\t39138300\t39138600\t0.5389\t64\nchr13\t39959100\t39959700\t0.5022\t65\nchr13\t39986400\t39987300\t0.0174\t58\nchr13\t40005000\t40006200\t0.1266\t64\nchr13\t40356900\t40362300\t0.0813\t81\nchr13\t40735800\t40737000\t0.4848\t95\nchr13\t40740000\t40740900\t0.411\t56\nchr13\t40829700\t40834800\t0.0962\t72\nchr13\t40865700\t40866300\t0.2756\t105\nchr13\t40902600\t40902900\t0.1953\t67\nchr13\t40956000\t40957500\t0.2134\t58\nchr13\t41431500\t41431800\t0.4295\t75\nchr13\t41443200\t41443500\t0.3299\t59\nchr13\t41536500\t41536800\t0.4423\t42\nchr13\t41591700\t41592000\t0.1797\t99\nchr13\t41874000\t41874300\t0.281\t63\nchr13\t42032400\t42033000\t0.5287\t77\nchr13\t42141900\t42142200\t0.516\t46\nchr13\t42181800\t42182100\t0.4815\t58\nchr13\t42372000\t42372300\t0.3617\t20\nchr13\t42385200\t42386400\t0.2965\t78\nchr13\t42425400\t42430800\t0.0284\t101\nchr13\t42557400\t42557700\t0.4719\t69\nchr13\t42856800\t42857100\t0.1935\t82\nchr13\t42965700\t42967200\t0.0579\t50\nchr13\t43161300\t43162800\t0.1906\t69\nchr13\t43351500\t43351800\t0.4828\t54\nchr13\t43531500\t43531800\t0.2728\t38\nchr13\t43966800\t43968000\t0.0966\t78\nchr13\t43971900\t43975200\t0.0096\t86\nchr13\t44036700\t44037600\t0.143\t64\nchr13\t44114100\t44114700\t0.3949\t64\nchr13\t45378000\t45378300\t0.5411\t57\nchr13\t45380400\t45381900\t0.1471\t27\nchr13\t45484500\t45486300\t0.0078\t112\nchr13\t45645600\t45651000\t0.0275\t100\nchr13\t45664200\t45664500\t0.0498\t68\nchr13\t46332600\t46332900\t0.6277\t58\nchr13\t46467000\t46467300\t0.6845\t62\nchr13\t46515000\t46515600\t0.2038\t45\nchr13\t47019300\t47019900\t0.3151\t71\nchr13\t47221800\t47224800\t0.0241\t164\nchr13\t47498700\t47499000\t0.5415\t36\nchr13\t47714400\t47716200\t0.2574\t77\nchr13\t47731200\t47731500\t0.3496\t70\nchr13\t47784000\t47787900\t0.1871\t91\nchr13\t48107400\t48107700\t0.4478\t52\nchr13\t48427200\t48428400\t0\t81\nchr13\t48465600\t48471600\t0\t100\nchr13\t49014000\t49016100\t0.1873\t86\nchr13\t49153500\t49158000\t0.0493\t85\nchr13\t49215600\t49215900\t0.4868\t63\nchr13\t49338300\t49338600\t0.6782\t38\nchr13\t49377600\t49379700\t0.0521\t77\nchr13\t49592100\t49594200\t0.0893\t62\nchr13\t49799400\t49800000\t0.1249\t108\nchr13\t50119200\t50119500\t0.4493\t65\nchr13\t50180400\t50185800\t0\t68\nchr13\t50331600\t50331900\t0.4778\t63\nchr13\t50555400\t50555700\t0.4271\t69\nchr13\t50982900\t50983200\t0.2047\t78\nchr13\t50985900\t50987700\t0.1935\t76\nchr13\t51172800\t51173100\t0.1807\t68\nchr13\t51641400\t51642000\t0.241\t129\nchr13\t51693300\t51693600\t0.3732\t66\nchr13\t51716400\t51716700\t0.5916\t53\nchr13\t51774300\t51775800\t0\t53\nchr13\t52057200\t52059600\t0.0246\t75\nchr13\t52064100\t52064400\t0.6419\t40\nchr13\t52218900\t52220100\t0.0815\t60\nchr13\t52229700\t52234200\t0\t72\nchr13\t52235700\t52236000\t0\t72\nchr13\t52237200\t52239000\t0\t67\nchr13\t52240200\t52240500\t0\t67\nchr13\t52242000\t52242300\t0.3526\t47\nchr13\t52246200\t52249200\t0.0506\t66\nchr13\t52252200\t52254000\t0.0297\t63\nchr13\t52256700\t52257600\t0\t89\nchr13\t52258800\t52260000\t0\t89\nchr13\t52261500\t52263300\t0.0749\t61\nchr13\t52266300\t52268400\t0.0113\t80\nchr13\t52269600\t52274700\t0\t96\nchr13\t52278300\t52278900\t0.0963\t53\nchr13\t52280400\t52281900\t0.4591\t74\nchr13\t52284000\t52284600\t0.2592\t71\nchr13\t52293600\t52294500\t0.2805\t70\nchr13\t52296000\t52299600\t0.0143\t60\nchr13\t52302600\t52306800\t0.013\t75\nchr13\t52321500\t52321800\t0.367\t46\nchr13\t52324800\t52325100\t0.4299\t69\nchr13\t52327200\t52328100\t0.214\t73\nchr13\t52331100\t52334400\t0.0475\t92\nchr13\t52362600\t52362900\t0.5481\t45\nchr13\t52480800\t52481100\t0.5343\t53\nchr13\t52488900\t52492200\t0.0201\t80\nchr13\t52495200\t52496100\t0.1615\t55\nchr13\t52498200\t52498500\t0.2876\t65\nchr13\t52501200\t52501500\t0.417\t52\nchr13\t52505400\t52509900\t0.0371\t71\nchr13\t52513200\t52516800\t0.0249\t60\nchr13\t52518000\t52518900\t0.1327\t47\nchr13\t52520700\t52521000\t0.4172\t41\nchr13\t52523400\t52523700\t0.2115\t68\nchr13\t52527900\t52528500\t0.0209\t65\nchr13\t52530600\t52532400\t0.0209\t65\nchr13\t52533600\t52534200\t0.0209\t65\nchr13\t52535700\t52536000\t0.0252\t53\nchr13\t52538100\t52540200\t0.0252\t53\nchr13\t52543200\t52545000\t0.0845\t66\nchr13\t52546200\t52547100\t0.0056\t54\nchr13\t52549800\t52550100\t0.4345\t68\nchr13\t52552200\t52554300\t0.0412\t64\nchr13\t52557000\t52560300\t0.0588\t72\nchr13\t52564200\t52564500\t0.468\t53\nchr13\t52566000\t52566300\t0\t70\nchr13\t52567500\t52569300\t0\t70\nchr13\t52570500\t52570800\t0\t66\nchr13\t52572300\t52577700\t0\t66\nchr13\t52586100\t52587600\t0.0679\t61\nchr13\t53094000\t53098200\t0.0213\t73\nchr13\t53597400\t53597700\t0.424\t79\nchr13\t53949900\t53950200\t0.4671\t30\nchr13\t54289200\t54289500\t0.5309\t44\nchr13\t54478500\t54478800\t0.4078\t32\nchr13\t54572700\t54573000\t0.5136\t55\nchr13\t55149900\t55150200\t0.5082\t38\nchr13\t55320300\t55320900\t0.3153\t95\nchr13\t55352100\t55352400\t0.3367\t90\nchr13\t55812300\t55813200\t0.1871\t70\nchr13\t56611800\t56612100\t0.2578\t78\nchr13\t56665200\t56665500\t0.4076\t95\nchr13\t57040200\t57040500\t0.3976\t63\nchr13\t57139200\t57173400\t0\t170\nchr13\t57219600\t57220500\t0.3818\t56\nchr13\t57329700\t57330300\t0.4106\t63\nchr13\t57356100\t57356400\t0.4169\t85\nchr13\t57357900\t57359100\t0.2095\t75\nchr13\t57401400\t57401700\t0\t22\nchr13\t58512300\t58514100\t0.0032\t80\nchr13\t58672800\t58678200\t0\t74\nchr13\t59026800\t59030700\t0.2111\t72\nchr13\t59598300\t59598600\t0.3551\t30\nchr13\t59848500\t59851200\t0\t85\nchr13\t59984700\t59986800\t0\t79\nchr13\t60048600\t60048900\t0.4101\t37\nchr13\t60246600\t60246900\t0.4037\t67\nchr13\t60249300\t60249600\t0.4037\t67\nchr13\t60711600\t60711900\t0.5289\t57\nchr13\t60713700\t60715500\t0.2623\t58\nchr13\t60741900\t60744000\t0.0011\t70\nchr13\t60801000\t60801600\t0.2203\t62\nchr13\t60803700\t60804000\t0.5785\t81\nchr13\t60977700\t60978000\t0.3738\t99\nchr13\t61761300\t61761600\t0.6132\t26\nchr13\t61844400\t61844700\t0.4581\t43\nchr13\t62465100\t62465400\t0.5382\t28\nchr13\t63081900\t63082500\t0.4746\t46\nchr13\t63717000\t63727200\t0\t72\nchr13\t63742500\t63742800\t0\t79\nchr13\t63744000\t63744900\t0\t79\nchr13\t63747000\t63756900\t0\t79\nchr13\t63759000\t63769500\t0\t70\nchr13\t63822900\t63832800\t0\t81\nchr13\t63835500\t63835800\t0.2376\t58\nchr13\t63837000\t63837300\t0.2376\t58\nchr13\t64231200\t64232700\t0.0331\t58\nchr13\t64714200\t64714500\t0.613\t100\nchr13\t66034800\t66035100\t0.6138\t58\nchr13\t66738900\t66743400\t0\t71\nchr13\t67027500\t67027800\t0.2714\t57\nchr13\t67325100\t67325700\t0.1997\t37\nchr13\t67327200\t67327500\t0.5273\t60\nchr13\t67527900\t67528200\t0.0451\t903\nchr13\t67562700\t67564500\t0.2469\t69\nchr13\t67618200\t67618500\t0.6041\t34\nchr13\t67681200\t67684500\t0.01\t93\nchr13\t67799100\t67799400\t0.5333\t56\nchr13\t68415900\t68416500\t0.3032\t55\nchr13\t69462300\t69462600\t0.4415\t42\nchr13\t70287600\t70287900\t0.3479\t35\nchr13\t70854600\t70854900\t0.0547\t573\nchr13\t71385000\t71385300\t0.473\t95\nchr13\t71387700\t71389200\t0.3456\t88\nchr13\t71506800\t71507100\t0.3925\t63\nchr13\t71734200\t71734800\t0.0263\t50\nchr13\t72268800\t72269100\t0.1809\t50\nchr13\t72382500\t72382800\t0.256\t25\nchr13\t72612300\t72615300\t0.199\t70\nchr13\t73574400\t73575900\t0.3983\t46\nchr13\t73641300\t73643700\t0.1976\t81\nchr13\t73645200\t73646100\t0.1523\t41\nchr13\t74235900\t74237400\t0.0149\t84\nchr13\t74238900\t74241000\t0.0149\t84\nchr13\t74426700\t74432100\t0\t71\nchr13\t74537700\t74538000\t0.1065\t78\nchr13\t74539500\t74542500\t0.1065\t78\nchr13\t74800200\t74800800\t0.3731\t79\nchr13\t75410700\t75411000\t0.4793\t41\nchr13\t75728400\t75730800\t0.2695\t97\nchr13\t76318500\t76318800\t0.5604\t13\nchr13\t76545300\t76548300\t0.0325\t77\nchr13\t76612800\t76618500\t0\t88\nchr13\t76963800\t76964100\t0.5553\t65\nchr13\t77204400\t77205000\t0.3289\t72\nchr13\t77685000\t77685900\t0.2062\t82\nchr13\t77703900\t77705100\t0\t34\nchr13\t77880600\t77880900\t0.2837\t72\nchr13\t78020100\t78020400\t0.3507\t33\nchr13\t78095100\t78095400\t0.2212\t71\nchr13\t78153900\t78154500\t0.2068\t62\nchr13\t78284400\t78285000\t0.5285\t85\nchr13\t78639600\t78639900\t0.3725\t45\nchr13\t79086900\t79087200\t0.2318\t40\nchr13\t79818300\t79822500\t0\t86\nchr13\t79840500\t79845300\t0\t63\nchr13\t80104200\t80104500\t0.5835\t39\nchr13\t80153100\t80156400\t0.1534\t73\nchr13\t80289900\t80290200\t0.3714\t62\nchr13\t80420100\t80420400\t0.4898\t12\nchr13\t80916600\t80918100\t0.2343\t75\nchr13\t81067800\t81068100\t0.3759\t55\nchr13\t81076500\t81076800\t0.5543\t60\nchr13\t81173100\t81173400\t0.1137\t35\nchr13\t82046400\t82051200\t0.0017\t79\nchr13\t82315200\t82315500\t0.6242\t26\nchr13\t82499400\t82499700\t0.3782\t58\nchr13\t82538400\t82538700\t0.355\t77\nchr13\t82562100\t82562400\t0.4347\t50\nchr13\t82604400\t82605000\t0.445\t50\nchr13\t82628700\t82629000\t0.4836\t19\nchr13\t82742400\t82742700\t0.3816\t51\nchr13\t83522700\t83523300\t0.19\t65\nchr13\t83904900\t83905200\t0.5142\t54\nchr13\t83961300\t83966400\t0\t76\nchr13\t84091500\t84091800\t0.5763\t49\nchr13\t84502500\t84503100\t0.2508\t65\nchr13\t84725700\t84726000\t0.4576\t66\nchr13\t85124400\t85129200\t0.0279\t93\nchr13\t85395300\t85395600\t0\t12\nchr13\t85926000\t85927800\t0.0696\t80\nchr13\t86115000\t86115300\t0.4985\t42\nchr13\t86253000\t86268900\t0\t52\nchr13\t86626200\t86626500\t0.3007\t55\nchr13\t86627700\t86628300\t0.5541\t57\nchr13\t86649300\t86649600\t0.3657\t38\nchr13\t86891100\t86891400\t0.3629\t45\nchr13\t87074400\t87074700\t0.3991\t20\nchr13\t87609300\t87609600\t0.5756\t70\nchr13\t87627900\t87628200\t0.4463\t10\nchr13\t88199100\t88200900\t0.1504\t66\nchr13\t88290900\t88291200\t0.4135\t68\nchr13\t88684200\t88684500\t0.3302\t65\nchr13\t88831200\t88831500\t0.527\t79\nchr13\t88870500\t88870800\t0.501\t58\nchr13\t89090700\t89091300\t0.2359\t101\nchr13\t89509500\t89509800\t0.4244\t49\nchr13\t90325200\t90325800\t0.1218\t69\nchr13\t90653700\t90654300\t0.5014\t71\nchr13\t90669000\t90669300\t0.3463\t61\nchr13\t91056300\t91056600\t0.5745\t46\nchr13\t91604100\t91606200\t0\t72\nchr13\t92125800\t92126100\t0.5485\t48\nchr13\t92475300\t92475600\t0.3169\t63\nchr13\t92595600\t92595900\t0.5512\t49\nchr13\t92643300\t92643600\t0.5093\t51\nchr13\t92685600\t92691600\t0\t70\nchr13\t92742000\t92742300\t0.4982\t85\nchr13\t92755200\t92757000\t0.2967\t69\nchr13\t93063000\t93063300\t0.549\t62\nchr13\t93282600\t93283200\t0.5572\t56\nchr13\t93426900\t93427500\t0.4995\t53\nchr13\t93490800\t93495900\t0.0208\t67\nchr13\t93541200\t93541800\t0.1642\t46\nchr13\t93844500\t93845700\t0.2401\t76\nchr13\t93879900\t93880200\t0.4551\t72\nchr13\t94105800\t94106100\t0.5839\t56\nchr13\t94316400\t94316700\t0.4723\t58\nchr13\t94374600\t94377600\t0.0044\t88\nchr13\t94731900\t94732500\t0.1758\t82\nchr13\t94819200\t94819500\t0.011\t58\nchr13\t95350500\t95350800\t0.1685\t42\nchr13\t95690400\t95690700\t0.5749\t52\nchr13\t95735100\t95739600\t0.1972\t77\nchr13\t95908500\t95909100\t0.3553\t61\nchr13\t95964900\t95965500\t0.4347\t67\nchr13\t96054000\t96054300\t0.4021\t28\nchr13\t96327900\t96330900\t0.3098\t77\nchr13\t97155900\t97158300\t0.0602\t83\nchr13\t97159500\t97159800\t0.0602\t83\nchr13\t97583100\t97583400\t0.442\t47\nchr13\t97611300\t97611600\t0.3647\t60\nchr13\t97667400\t97673400\t0.0087\t75\nchr13\t97734300\t97736100\t0.1516\t101\nchr13\t97764900\t97766400\t0.2602\t72\nchr13\t98069100\t98069400\t0.5511\t34\nchr13\t98812200\t98812500\t0.2284\t98\nchr13\t99115800\t99116700\t0.3713\t65\nchr13\t99241800\t99242100\t0.1887\t74\nchr13\t99462900\t99463200\t0.6845\t157\nchr13\t100451700\t100452000\t0.5878\t66\nchr13\t100698600\t100700100\t0.0868\t83\nchr13\t100701300\t100704000\t0.0757\t71\nchr13\t100761600\t100761900\t0.3554\t92\nchr13\t101643000\t101643300\t0.3879\t67\nchr13\t102526200\t102526500\t0.3052\t85\nchr13\t103950600\t103950900\t0.3862\t26\nchr13\t104051400\t104051700\t0.0469\t67\nchr13\t104081700\t104082000\t0.3939\t82\nchr13\t104508900\t104509200\t0.1496\t27\nchr13\t104654100\t104655000\t0.0483\t65\nchr13\t104958900\t104959200\t0.5206\t62\nchr13\t105055800\t105056100\t0.3929\t46\nchr13\t105299400\t105301200\t0.0526\t79\nchr13\t105382200\t105382800\t0.0517\t62\nchr13\t105384900\t105388200\t0.1546\t88\nchr13\t105802800\t105803100\t0.6767\t11\nchr13\t105844200\t105844500\t0.5159\t26\nchr13\t105999900\t106000200\t0.2402\t32\nchr13\t106214100\t106217700\t0.062\t76\nchr13\t106779900\t106780500\t0.091\t75\nchr13\t106931100\t106931400\t0.3583\t67\nchr13\t106932900\t106933200\t0.4575\t70\nchr13\t107272200\t107272500\t0.2738\t42\nchr13\t107775300\t107775600\t0.354\t69\nchr13\t107920800\t107922300\t0.1425\t67\nchr13\t107923500\t107925600\t0.1425\t67\nchr13\t107935200\t107935800\t0.1467\t82\nchr13\t108237900\t108239700\t0.1092\t76\nchr13\t108510600\t108516000\t0\t76\nchr13\t108829800\t108830400\t0.4578\t67\nchr13\t109008300\t109008600\t0.6316\t42\nchr13\t109218000\t109218600\t0.0024\t58\nchr13\t109383300\t109383600\t0.5667\t44\nchr13\t109488900\t109489500\t0.1397\t89\nchr13\t109569300\t109569600\t0.1459\t13\nchr13\t109717200\t109717500\t0.6294\t53\nchr13\t110252700\t110253300\t0.1655\t32\nchr13\t110385300\t110385900\t0.3777\t176\nchr13\t110481000\t110481900\t0.3933\t109\nchr13\t110497800\t110498100\t0.6433\t49\nchr13\t110530200\t110530500\t0.4488\t45\nchr13\t110580600\t110580900\t0.3045\t54\nchr13\t110587500\t110587800\t0.4806\t30\nchr13\t110955900\t110957100\t0.3076\t67\nchr13\t111045000\t111045300\t0.5582\t62\nchr13\t111052200\t111052500\t0.4512\t14\nchr13\t111254700\t111255300\t0.0128\t63\nchr13\t111340200\t111341700\t0\t145\nchr13\t111429900\t111430200\t0.5998\t50\nchr13\t111545700\t111546000\t0.4333\t66\nchr13\t111591900\t111592200\t0.0828\t64\nchr13\t111669000\t111703800\t0\t47\nchr13\t111753900\t111757200\t0\t55\nchr13\t111758400\t111781800\t0\t55\nchr13\t111783000\t111789000\t0\t46\nchr13\t112014900\t112016100\t0.0327\t345\nchr13\t112148100\t112148400\t0.6835\t62\nchr13\t112278600\t112286100\t0\t143\nchr13\t112287300\t112288500\t0\t143\nchr13\t112290000\t112308000\t0\t180\nchr13\t112393200\t112393500\t0.314\t68\nchr13\t112449900\t112450200\t0.4022\t38\nchr13\t112749900\t112750500\t0.3937\t80\nchr13\t112767000\t112767300\t0.5925\t31\nchr13\t112786200\t112786800\t0.2945\t57\nchr13\t112872900\t112873500\t0.5851\t186\nchr13\t112989300\t112989600\t0.6562\t38\nchr13\t113067300\t113069700\t0.0076\t144\nchr13\t113079900\t113080200\t0.5643\t85\nchr13\t113089200\t113089500\t0.5733\t70\nchr13\t113107200\t113107800\t0.3647\t43\nchr13\t113111400\t113111700\t0.5659\t55\nchr13\t113136600\t113136900\t0.1049\t28\nchr13\t113161800\t113162700\t0.1165\t42\nchr13\t113262600\t113263200\t0.2145\t195\nchr13\t113314500\t113314800\t0.2253\t28\nchr13\t113330400\t113331000\t0.6232\t69\nchr13\t113346000\t113347500\t0.3286\t137\nchr13\t113371500\t113371800\t0.2113\t91\nchr13\t113375400\t113375700\t0.2898\t42\nchr13\t113412900\t113413200\t0.5416\t63\nchr13\t113434800\t113436000\t0.5203\t111\nchr13\t113532900\t113533200\t0.6685\t47\nchr13\t113541600\t113542500\t0\t83\nchr13\t113583900\t113584200\t0.5084\t43\nchr13\t113725800\t113726400\t0.1697\t21\nchr13\t113745300\t113745600\t0.4848\t47\nchr13\t113751900\t113752200\t0.4367\t67\nchr13\t113824200\t113824500\t0.3519\t154\nchr13\t113831700\t113832000\t0.401\t30\nchr13\t113876100\t113876400\t0.5877\t141\nchr13\t113899200\t113900400\t0.0088\t38\nchr13\t113913600\t113913900\t0.55\t78\nchr13\t113940600\t113941500\t0\t32\nchr13\t113944500\t113945100\t0.5614\t67\nchr13\t113983500\t113983800\t0\t46\nchr13\t113985900\t113986200\t0\t46\nchr13\t113987400\t113988600\t0\t15\nchr13\t114005700\t114009000\t0.0363\t69\nchr13\t114019800\t114020100\t0.4651\t25\nchr13\t114028800\t114029700\t0.4161\t67\nchr13\t114040200\t114040500\t0.564\t41\nchr13\t114070800\t114071100\t0.4573\t73\nchr13\t114075600\t114075900\t0.5541\t31\nchr13\t114083700\t114087300\t0\t56\nchr13\t114103500\t114104100\t0.6279\t28\nchr13\t114111300\t114111600\t0.5649\t49\nchr13\t114113700\t114114000\t0.0602\t176\nchr13\t114119700\t114120600\t0.4893\t42\nchr13\t114138300\t114139200\t0.6151\t31\nchr13\t114147600\t114147900\t0.4314\t43\nchr13\t114198900\t114200100\t0.3073\t191\nchr13\t114231000\t114231600\t0.4553\t89\nchr13\t114348900\t114349200\t0.2481\t74\nchr13\t114351900\t114352500\t0.1106\t121\nchr13\t114354000\t114354600\t0.0536\t244\nchr14\t16023600\t16086600\t0\t185\nchr14\t16089600\t16100700\t0\t695\nchr14\t16101900\t16104900\t0.2427\t4332\nchr14\t16133400\t16135200\t0\t193\nchr14\t16139400\t16139700\t0.5082\t161\nchr14\t16404000\t16404300\t0.0118\t47\nchr14\t18225000\t18235500\t0\t112\nchr14\t18237000\t18240000\t0\t159\nchr14\t18241200\t18254400\t0\t159\nchr14\t18255600\t18261600\t0\t159\nchr14\t18264300\t18272100\t0\t126\nchr14\t18273300\t18276900\t0.0048\t105\nchr14\t18278100\t18293400\t0.0013\t97\nchr14\t18296100\t18296400\t0.2828\t48\nchr14\t18297900\t18301800\t0\t87\nchr14\t18303300\t18317100\t0\t103\nchr14\t18319200\t18329700\t0\t103\nchr14\t18330900\t18332400\t0\t103\nchr14\t18334200\t18334800\t0\t103\nchr14\t18336000\t18346800\t0\t103\nchr14\t18348900\t18386100\t0\t103\nchr14\t18387300\t18393600\t0\t103\nchr14\t18395100\t18398400\t0\t103\nchr14\t18400200\t18404400\t0\t103\nchr14\t18405600\t18406800\t0\t103\nchr14\t18408600\t18409200\t0.017\t72\nchr14\t18410700\t18413400\t0.017\t72\nchr14\t18414600\t18417000\t0.0061\t96\nchr14\t18418500\t18422100\t0.0061\t96\nchr14\t18423300\t18425700\t0.0061\t96\nchr14\t18426900\t18430200\t0.0837\t73\nchr14\t18431700\t18439200\t0\t100\nchr14\t18441000\t18446400\t0\t100\nchr14\t18447600\t18453600\t0\t100\nchr14\t18454800\t18458100\t0\t100\nchr14\t18462300\t18487800\t0\t100\nchr14\t18492300\t18493500\t0\t101\nchr14\t18494700\t18496200\t0\t101\nchr14\t18497700\t18503100\t0\t101\nchr14\t18504900\t18511200\t0\t83\nchr14\t18512700\t18514500\t0\t88\nchr14\t18516300\t18520500\t0\t88\nchr14\t18522600\t18523200\t0\t95\nchr14\t18524700\t18538800\t0\t95\nchr14\t18540300\t18553800\t0\t167\nchr14\t18555600\t18559800\t0\t167\nchr14\t18561300\t18585600\t0\t167\nchr14\t18586800\t18605400\t0\t167\nchr14\t18606600\t18625200\t0\t167\nchr14\t18626400\t18649500\t0\t152\nchr14\t18653100\t18655200\t0\t152\nchr14\t18663600\t18663900\t0.2951\t67\nchr14\t18669600\t18670200\t0.4053\t97\nchr14\t18696600\t18697800\t0.0241\t140\nchr14\t18700200\t18705000\t0.0185\t80\nchr14\t18706200\t18706800\t0.0185\t80\nchr14\t18708900\t18712500\t0.0011\t101\nchr14\t18862500\t18952500\t0\t189\nchr14\t18954000\t19096500\t0\t189\nchr14\t19098000\t19098300\t0.5413\t55\nchr14\t19099500\t19118400\t0\t169\nchr14\t19119600\t19134900\t0\t169\nchr14\t19136100\t19161000\t0\t169\nchr14\t19162800\t19163700\t0.4074\t149\nchr14\t19165200\t19166100\t0.4713\t133\nchr14\t19172400\t19172700\t0.402\t123\nchr14\t19173900\t19174500\t0.002\t146\nchr14\t19175700\t19180200\t0.002\t146\nchr14\t19181400\t19181700\t0.002\t146\nchr14\t19182900\t19185000\t0.002\t146\nchr14\t19186800\t19187100\t0.1778\t78\nchr14\t19190700\t19191600\t0.0762\t68\nchr14\t19194600\t19194900\t0.0762\t68\nchr14\t19197600\t19197900\t0.5533\t69\nchr14\t19199100\t19199400\t0.495\t57\nchr14\t19202700\t19204500\t0.2065\t78\nchr14\t19206000\t19215600\t0\t174\nchr14\t19216800\t19280700\t0\t174\nchr14\t19281900\t19376400\t0\t198\nchr14\t19379100\t19380000\t0.3421\t99\nchr14\t19382100\t19414200\t0\t224\nchr14\t19415400\t19488000\t0\t224\nchr14\t19489800\t19510500\t0\t224\nchr14\t19611900\t19615200\t0\t141\nchr14\t19616400\t19664400\t0\t149\nchr14\t19665600\t19666200\t0.1605\t76\nchr14\t19671600\t19672800\t0.181\t123\nchr14\t19676100\t19676400\t0.477\t149\nchr14\t19677900\t19678200\t0.477\t149\nchr14\t19681200\t19723200\t0\t143\nchr14\t19898400\t19898700\t0.361\t47\nchr14\t19963500\t19963800\t0.142\t59\nchr14\t20007900\t20008200\t0.5733\t29\nchr14\t20040900\t20041200\t0.3594\t78\nchr14\t20107800\t20108100\t0.0826\t50\nchr14\t20153100\t20153400\t0.2129\t73\nchr14\t20233800\t20234100\t0.1342\t69\nchr14\t20266500\t20267100\t0.3446\t61\nchr14\t20310300\t20311200\t0.4633\t52\nchr14\t20505600\t20507700\t0.1021\t120\nchr14\t20882100\t20883900\t0\t69\nchr14\t20914200\t20915100\t0.3226\t63\nchr14\t20946300\t20946900\t0.058\t90\nchr14\t21068100\t21068400\t0.5165\t35\nchr14\t21159300\t21159600\t0.3706\t40\nchr14\t21183300\t21183600\t0.4225\t25\nchr14\t21189000\t21189300\t0.4859\t85\nchr14\t21897900\t21899100\t0.2047\t61\nchr14\t22110600\t22110900\t0.4177\t29\nchr14\t22636200\t22640100\t0.1985\t104\nchr14\t22674600\t22676100\t0\t65\nchr14\t22680000\t22681500\t0\t75\nchr14\t23390100\t23390400\t0.3174\t56\nchr14\t23705700\t23706600\t0.49\t35\nchr14\t23760000\t23760300\t0.6078\t58\nchr14\t23919600\t23921700\t0.0207\t62\nchr14\t23957700\t23958000\t0.344\t57\nchr14\t23961900\t23962500\t0.04\t70\nchr14\t23964300\t23964900\t0.04\t70\nchr14\t23966400\t23968200\t0.04\t70\nchr14\t23978400\t23980500\t0.002\t59\nchr14\t23992800\t23993100\t0.2284\t69\nchr14\t23997000\t24000000\t0.2518\t68\nchr14\t24001500\t24006600\t0.0144\t88\nchr14\t24016200\t24016500\t0.5188\t50\nchr14\t24021300\t24023100\t0.0151\t85\nchr14\t24111600\t24113400\t0\t67\nchr14\t24444000\t24444300\t0.6654\t38\nchr14\t24486300\t24490200\t0\t68\nchr14\t24519600\t24519900\t0.5426\t89\nchr14\t24528600\t24528900\t0.3959\t49\nchr14\t24552000\t24552300\t0.488\t41\nchr14\t24584700\t24585000\t0.3721\t51\nchr14\t24930900\t24931200\t0.5735\t35\nchr14\t25204800\t25206300\t0.1738\t84\nchr14\t25207800\t25208100\t0.1799\t74\nchr14\t25209300\t25209900\t0.1799\t74\nchr14\t25404900\t25405200\t0.3509\t73\nchr14\t25677900\t25678200\t0.2668\t11\nchr14\t25779000\t25780800\t0.4193\t54\nchr14\t25947900\t25948500\t0.287\t61\nchr14\t26108100\t26108400\t0.4291\t59\nchr14\t26110200\t26110800\t0.4291\t59\nchr14\t26215800\t26216100\t0.4155\t62\nchr14\t26296500\t26297400\t0.2404\t71\nchr14\t26298600\t26300400\t0.2239\t61\nchr14\t26383800\t26384100\t0.4616\t51\nchr14\t26495700\t26496000\t0.2354\t52\nchr14\t26630100\t26634600\t0.0271\t84\nchr14\t26674500\t26676300\t0.0353\t74\nchr14\t26678100\t26678700\t0.0353\t74\nchr14\t26688900\t26689200\t0.2825\t73\nchr14\t27044400\t27046200\t0.2014\t66\nchr14\t27168900\t27169200\t0.5149\t74\nchr14\t27459000\t27461400\t0.0721\t71\nchr14\t27675900\t27676500\t0.0171\t96\nchr14\t27678000\t27678900\t0.0171\t96\nchr14\t28178100\t28179900\t0.3168\t62\nchr14\t28191300\t28192200\t0.0309\t95\nchr14\t28193400\t28194300\t0.0309\t95\nchr14\t28312800\t28314300\t0.2095\t65\nchr14\t28332000\t28332300\t0.311\t61\nchr14\t28401600\t28402800\t0.2721\t63\nchr14\t28413600\t28415100\t0.2824\t72\nchr14\t28545300\t28545900\t0.2418\t54\nchr14\t29259000\t29259600\t0.2291\t43\nchr14\t29478600\t29481000\t0.0364\t83\nchr14\t29526600\t29526900\t0.618\t41\nchr14\t29620500\t29620800\t0.5787\t62\nchr14\t29727300\t29727600\t0.3743\t58\nchr14\t30363900\t30369000\t0.001\t102\nchr14\t30475500\t30475800\t0.2039\t75\nchr14\t30477300\t30479100\t0.2039\t75\nchr14\t30684900\t30690600\t0\t90\nchr14\t31247100\t31248000\t0.2694\t63\nchr14\t31249200\t31249500\t0.1281\t54\nchr14\t31250700\t31251000\t0.5523\t48\nchr14\t31473900\t31474200\t0.3925\t34\nchr14\t31634700\t31635000\t0.506\t67\nchr14\t31794000\t31798200\t0\t66\nchr14\t31869000\t31869300\t0.6895\t17\nchr14\t32217000\t32217300\t0.3269\t13\nchr14\t32268900\t32269500\t0.0992\t67\nchr14\t32454600\t32454900\t0.4857\t26\nchr14\t32854200\t32854500\t0.426\t64\nchr14\t33898200\t33898500\t0.6425\t81\nchr14\t34185600\t34186200\t0.225\t100\nchr14\t34205100\t34206000\t0.0684\t75\nchr14\t34294500\t34297200\t0\t63\nchr14\t34348800\t34349100\t0.4601\t12\nchr14\t34443300\t34443600\t0.4764\t37\nchr14\t34540800\t34547700\t0\t75\nchr14\t34555200\t34562100\t0\t73\nchr14\t34836000\t34836300\t0.4454\t34\nchr14\t35038500\t35040300\t0.0803\t60\nchr14\t35061600\t35061900\t0.6289\t73\nchr14\t35538600\t35539200\t0.3777\t58\nchr14\t35948400\t35949900\t0.2264\t75\nchr14\t35976300\t35978400\t0.4238\t63\nchr14\t35981100\t35981400\t0.4034\t89\nchr14\t36120000\t36120300\t0.5528\t55\nchr14\t36143100\t36145800\t0.0506\t89\nchr14\t36186600\t36187200\t0.0573\t84\nchr14\t36188400\t36190500\t0.0573\t84\nchr14\t37351800\t37356000\t0.0379\t72\nchr14\t37495500\t37496700\t0.3384\t59\nchr14\t37770900\t37771200\t0.3207\t87\nchr14\t37863300\t37863600\t0.5394\t65\nchr14\t37922100\t37922400\t0.2733\t67\nchr14\t38058000\t38058300\t0.4651\t59\nchr14\t38636100\t38636400\t0.6626\t31\nchr14\t38640600\t38640900\t0.4137\t64\nchr14\t38714700\t38715000\t0.2105\t68\nchr14\t39511800\t39512400\t0.0904\t60\nchr14\t39517200\t39517800\t0.1035\t75\nchr14\t39521700\t39522600\t0.287\t93\nchr14\t39525000\t39525300\t0.4\t76\nchr14\t39629400\t39630900\t0.0139\t77\nchr14\t39659400\t39659700\t0.3908\t41\nchr14\t39935400\t39936600\t0.2272\t75\nchr14\t39942600\t39942900\t0.4716\t72\nchr14\t40327500\t40332000\t0.0309\t87\nchr14\t40349100\t40352700\t0.1455\t79\nchr14\t40422900\t40423800\t0.313\t79\nchr14\t40719000\t40720200\t0.0394\t92\nchr14\t40728600\t40730400\t0.0047\t68\nchr14\t40835700\t40836000\t0.5577\t92\nchr14\t40950300\t40950600\t0.1698\t84\nchr14\t40951800\t40954500\t0.1698\t84\nchr14\t41196000\t41197200\t0.4442\t75\nchr14\t41211600\t41213400\t0.4004\t70\nchr14\t41335200\t41335500\t0.3999\t57\nchr14\t41420400\t41420700\t0.232\t36\nchr14\t41492400\t41492700\t0.2581\t25\nchr14\t41907900\t41908500\t0.3568\t157\nchr14\t42153300\t42153600\t0.4201\t63\nchr14\t42181800\t42182100\t0.373\t32\nchr14\t42954900\t42956400\t0.2169\t78\nchr14\t42968700\t42969600\t0.2038\t84\nchr14\t42971100\t42971400\t0.2038\t84\nchr14\t42999300\t43000200\t0.5277\t74\nchr14\t43062600\t43067400\t0\t120\nchr14\t43256700\t43257000\t0.3508\t31\nchr14\t43266600\t43267200\t0.2773\t46\nchr14\t43371600\t43373700\t0.0537\t79\nchr14\t43374900\t43375500\t0.4223\t49\nchr14\t43391400\t43391700\t0.414\t58\nchr14\t43405500\t43406100\t0.1321\t60\nchr14\t43494900\t43495200\t0.3048\t75\nchr14\t43496700\t43497300\t0.3048\t75\nchr14\t43601400\t43603200\t0.0716\t75\nchr14\t44127600\t44128200\t0.5078\t67\nchr14\t44159100\t44159400\t0.4461\t46\nchr14\t44323200\t44324400\t0.507\t67\nchr14\t44585100\t44585400\t0.1684\t64\nchr14\t44642400\t44645100\t0.0137\t72\nchr14\t44674800\t44675100\t0.3101\t65\nchr14\t44705100\t44711100\t0\t87\nchr14\t44891400\t44892000\t0.1947\t84\nchr14\t44916300\t44916600\t0.233\t17\nchr14\t44987700\t44988000\t0.3256\t81\nchr14\t45145800\t45146100\t0.4719\t47\nchr14\t45384300\t45384600\t0.371\t63\nchr14\t45389100\t45390300\t0.1786\t95\nchr14\t45477300\t45483000\t0.0554\t83\nchr14\t45635400\t45636000\t0.5156\t70\nchr14\t45844500\t45845100\t0.1236\t72\nchr14\t45883800\t45888000\t0.042\t67\nchr14\t45991200\t45991500\t0.2734\t54\nchr14\t46108800\t46109100\t0.3214\t32\nchr14\t46152600\t46152900\t0.2783\t44\nchr14\t46179900\t46180200\t0.3133\t74\nchr14\t46419300\t46419600\t0.5397\t47\nchr14\t46473900\t46474200\t0.4729\t76\nchr14\t46514400\t46514700\t0.5278\t115\nchr14\t46726500\t46727400\t0\t52\nchr14\t46864200\t46864500\t0.3001\t37\nchr14\t47129400\t47130000\t0.2814\t82\nchr14\t47795400\t47798700\t0.2082\t74\nchr14\t47865000\t47865300\t0.5915\t21\nchr14\t47902200\t47903700\t0.0766\t56\nchr14\t47905200\t47905500\t0.2161\t72\nchr14\t48187200\t48192900\t0\t79\nchr14\t48314100\t48315300\t0.1928\t61\nchr14\t48357600\t48357900\t0.4295\t39\nchr14\t48453600\t48454200\t0.1625\t65\nchr14\t48521400\t48521700\t0.3579\t57\nchr14\t48938700\t48939000\t0.1145\t14\nchr14\t49097700\t49098600\t0.1031\t96\nchr14\t49100100\t49102200\t0.1031\t96\nchr14\t49534800\t49535400\t0.1554\t65\nchr14\t49821300\t49821600\t0.2819\t13\nchr14\t49912500\t49912800\t0.5759\t61\nchr14\t50074200\t50074800\t0.0177\t57\nchr14\t51134700\t51135000\t0.319\t21\nchr14\t51153000\t51153300\t0.3994\t73\nchr14\t51794700\t51800400\t0\t76\nchr14\t52065600\t52065900\t0.1727\t45\nchr14\t52255500\t52257900\t0.0272\t75\nchr14\t52638300\t52638900\t0.4306\t58\nchr14\t53268000\t53270400\t0.2175\t70\nchr14\t53909100\t53911200\t0.0289\t81\nchr14\t54004800\t54005100\t0.4157\t87\nchr14\t54203700\t54204300\t0.5919\t39\nchr14\t55024800\t55025400\t0.0474\t65\nchr14\t55988400\t55993200\t0.0342\t91\nchr14\t56014200\t56014500\t0.1232\t92\nchr14\t56016900\t56018100\t0.1232\t92\nchr14\t56442000\t56447400\t0.0011\t89\nchr14\t56667900\t56673300\t0.0055\t113\nchr14\t56988300\t56989500\t0.3366\t68\nchr14\t57112800\t57116400\t0.2882\t67\nchr14\t57339300\t57339600\t0.4521\t75\nchr14\t57342900\t57343200\t0.4239\t70\nchr14\t57454500\t57454800\t0.5797\t53\nchr14\t57535200\t57535500\t0.2782\t68\nchr14\t57552000\t57552600\t0.15\t55\nchr14\t57621000\t57622500\t0.4479\t36\nchr14\t57626100\t57626400\t0.1979\t50\nchr14\t57628200\t57628500\t0.1983\t50\nchr14\t57667800\t57668100\t0.3905\t50\nchr14\t58032900\t58038300\t0\t93\nchr14\t58172400\t58172700\t0.3348\t57\nchr14\t58962300\t58962900\t0.0797\t34\nchr14\t59672700\t59673000\t0.4378\t51\nchr14\t59819400\t59819700\t0.3309\t105\nchr14\t59946600\t59951700\t0.0203\t85\nchr14\t60341400\t60341700\t0.1346\t70\nchr14\t60398700\t60399300\t0.0385\t55\nchr14\t60524700\t60525000\t0.1491\t53\nchr14\t60604500\t60606000\t0\t70\nchr14\t60611700\t60613200\t0\t76\nchr14\t60888600\t60888900\t0.3079\t39\nchr14\t61005300\t61005600\t0.6117\t39\nchr14\t61055100\t61061100\t0\t88\nchr14\t61755300\t61755600\t0.5677\t85\nchr14\t62284800\t62288400\t0.031\t72\nchr14\t62536200\t62541900\t0\t65\nchr14\t62640000\t62640600\t0.3944\t84\nchr14\t62641800\t62642400\t0.3049\t45\nchr14\t62817000\t62817300\t0.6127\t15\nchr14\t62874600\t62875200\t0.2906\t73\nchr14\t62948700\t62949300\t0.2576\t79\nchr14\t63116700\t63122700\t0\t86\nchr14\t63154800\t63155100\t0.6071\t30\nchr14\t63166200\t63166500\t0.269\t73\nchr14\t63864900\t63865500\t0.3042\t65\nchr14\t63870300\t63870600\t0.0846\t59\nchr14\t64893900\t64896900\t0\t65\nchr14\t64978500\t64979400\t0.0101\t86\nchr14\t65692200\t65692500\t0.6383\t66\nchr14\t65855400\t65855700\t0.3944\t70\nchr14\t66834300\t66837300\t0.3431\t76\nchr14\t67869900\t67870800\t0.1586\t68\nchr14\t67872000\t67872600\t0.229\t105\nchr14\t68092800\t68093100\t0.3763\t54\nchr14\t68115000\t68115300\t0.414\t76\nchr14\t70424400\t70425000\t0.0128\t70\nchr14\t70476300\t70476600\t0.0531\t95\nchr14\t70478100\t70482300\t0.0077\t95\nchr14\t70547400\t70553400\t0\t94\nchr14\t70798500\t70798800\t0.3313\t58\nchr14\t70854300\t70854600\t0.5609\t30\nchr14\t70959600\t70960200\t0.0907\t83\nchr14\t71037000\t71038500\t0.0972\t72\nchr14\t71368200\t71370300\t0\t85\nchr14\t71843400\t71847900\t0.0058\t67\nchr14\t71977200\t71978700\t0.1087\t78\nchr14\t71979900\t71981100\t0.1087\t78\nchr14\t72397200\t72397500\t0.3777\t69\nchr14\t73183800\t73184400\t0.5247\t68\nchr14\t73386900\t73387200\t0.6867\t55\nchr14\t73515600\t73516500\t0.1728\t42\nchr14\t73529700\t73530000\t0.5353\t52\nchr14\t73543200\t73543800\t0.0094\t63\nchr14\t73545300\t73545900\t0.3172\t39\nchr14\t73549500\t73550100\t0.2293\t44\nchr14\t73552200\t73552500\t0.3674\t34\nchr14\t73557600\t73557900\t0.3301\t47\nchr14\t73575000\t73575600\t0.1502\t68\nchr14\t73577100\t73577700\t0.4363\t57\nchr14\t73581600\t73582200\t0.1821\t42\nchr14\t73584600\t73584900\t0.6674\t53\nchr14\t74043300\t74043600\t0.6571\t23\nchr14\t74994900\t74995800\t0\t99\nchr14\t76215600\t76215900\t0.5601\t61\nchr14\t76750200\t76751400\t0.4797\t60\nchr14\t77269500\t77270100\t0.285\t178\nchr14\t78082800\t78083100\t0.6512\t61\nchr14\t78362100\t78362400\t0.4753\t42\nchr14\t79048800\t79049100\t0.3605\t32\nchr14\t79128000\t79130100\t0.2353\t91\nchr14\t79257300\t79257600\t0.5183\t148\nchr14\t79308900\t79314900\t0\t80\nchr14\t79751400\t79751700\t0.328\t90\nchr14\t79770300\t79772100\t0.222\t87\nchr14\t80010600\t80010900\t0.5289\t54\nchr14\t80030700\t80031300\t0.3635\t84\nchr14\t80622300\t80622900\t0.3065\t59\nchr14\t80626200\t80626500\t0.4352\t42\nchr14\t80673300\t80673600\t0.4885\t41\nchr14\t80858100\t80858700\t0.1856\t67\nchr14\t81012300\t81012600\t0.5122\t67\nchr14\t81116100\t81120000\t0\t87\nchr14\t81861000\t81861900\t0.0365\t130\nchr14\t81863100\t81864600\t0.0365\t130\nchr14\t81945000\t81945300\t0.42\t55\nchr14\t82348500\t82353300\t0\t77\nchr14\t82473900\t82474200\t0.4711\t47\nchr14\t82675500\t82675800\t0.4309\t15\nchr14\t82885800\t82886100\t0.4749\t58\nchr14\t83169600\t83169900\t0.0379\t47\nchr14\t83202300\t83204700\t0.0635\t74\nchr14\t83524200\t83524500\t0.5397\t55\nchr14\t83641200\t83641500\t0.2234\t73\nchr14\t83642700\t83643000\t0.2234\t73\nchr14\t83644500\t83645100\t0.4206\t90\nchr14\t85212000\t85212300\t0.4441\t73\nchr14\t85846800\t85847700\t0\t19\nchr14\t85885800\t85891500\t0\t80\nchr14\t86075400\t86075700\t0.2416\t66\nchr14\t86097000\t86098500\t0.4959\t68\nchr14\t86106600\t86107500\t0.1489\t63\nchr14\t86109000\t86109300\t0.1489\t63\nchr14\t86245800\t86246400\t0.1277\t69\nchr14\t86473200\t86473800\t0.1164\t68\nchr14\t86878500\t86879100\t0.2639\t45\nchr14\t87391800\t87392100\t0.3015\t42\nchr14\t87415500\t87415800\t0.2409\t76\nchr14\t87448200\t87448500\t0.6583\t47\nchr14\t87753000\t87753300\t0.3825\t45\nchr14\t88445100\t88445400\t0.4195\t62\nchr14\t88789500\t88789800\t0.6256\t52\nchr14\t89360700\t89362800\t0.2027\t80\nchr14\t90207000\t90208200\t0.2539\t77\nchr14\t90209700\t90210000\t0.2539\t77\nchr14\t90246000\t90246600\t0.1611\t42\nchr14\t90525600\t90525900\t0.2943\t61\nchr14\t91190100\t91190400\t0.6207\t67\nchr14\t91293300\t91293600\t0.5515\t188\nchr14\t91431000\t91431300\t0.0086\t102\nchr14\t91432800\t91436400\t0.0086\t102\nchr14\t91557300\t91557600\t0.5579\t29\nchr14\t91640400\t91645800\t0\t88\nchr14\t92640300\t92640600\t0.2054\t38\nchr14\t92910900\t92912400\t0.0165\t92\nchr14\t93413400\t93414000\t0.3083\t64\nchr14\t93415500\t93416400\t0.2675\t85\nchr14\t93722100\t93722400\t0.1243\t50\nchr14\t94590900\t94591200\t0.3329\t126\nchr14\t94637700\t94638000\t0.6299\t47\nchr14\t94658100\t94658700\t0.5408\t72\nchr14\t95389200\t95389500\t0.4688\t78\nchr14\t96708900\t96709200\t0.5147\t78\nchr14\t96883200\t96883800\t0.2431\t66\nchr14\t97136400\t97136700\t0.6944\t88\nchr14\t97261200\t97261500\t0.4519\t31\nchr14\t99332700\t99333000\t0.3797\t51\nchr14\t99420900\t99421200\t0.067\t549\nchr14\t99927900\t99928200\t0.2305\t571\nchr14\t100378800\t100379100\t0.6398\t26\nchr14\t100685700\t100686000\t0.1916\t12\nchr14\t100869300\t100870800\t0\t36\nchr14\t101266800\t101271900\t0.0209\t91\nchr14\t101524500\t101524800\t0.3532\t38\nchr14\t101571900\t101572500\t0.2652\t43\nchr14\t101675700\t101676000\t0.3868\t79\nchr14\t102172500\t102172800\t0.6001\t52\nchr14\t102676200\t102678000\t0.09\t137\nchr14\t102972600\t102972900\t0.4935\t58\nchr14\t102999000\t102999300\t0.5124\t28\nchr14\t103062600\t103062900\t0.3882\t57\nchr14\t104097900\t104098200\t0.4194\t64\nchr14\t104153400\t104153700\t0.5666\t110\nchr14\t104217000\t104217600\t0.2782\t47\nchr14\t104250900\t104252100\t0.009\t155\nchr14\t104299200\t104299500\t0.6432\t89\nchr14\t104720700\t104721000\t0.3782\t45\nchr14\t104889900\t104890200\t0.6739\t39\nchr14\t105110400\t105113100\t0.0016\t79\nchr14\t105192300\t105192600\t0.6261\t37\nchr14\t105229800\t105240900\t0\t254\nchr14\t105271800\t105272100\t0.5292\t47\nchr14\t105276000\t105277500\t0.1955\t58\nchr14\t105459300\t105459900\t0.2065\t25\nchr14\t105520800\t105521400\t0.1125\t92\nchr14\t105546300\t105546600\t0.5978\t79\nchr14\t105557100\t105557400\t0.5274\t53\nchr14\t105559800\t105560400\t0.0357\t61\nchr14\t105561600\t105562200\t0.0357\t61\nchr14\t105566100\t105566700\t0.0228\t65\nchr14\t105572100\t105573000\t0.0043\t74\nchr14\t105574200\t105576000\t0.0043\t74\nchr14\t105578700\t105580200\t0.005\t80\nchr14\t105584700\t105585000\t0.4252\t68\nchr14\t105593700\t105596400\t0.0089\t92\nchr14\t105597600\t105599100\t0.0089\t92\nchr14\t105603900\t105604200\t0.1676\t65\nchr14\t105607500\t105609900\t0.0195\t52\nchr14\t105615300\t105615600\t0.661\t58\nchr14\t105618300\t105620400\t0.3612\t58\nchr14\t105623700\t105624300\t0.4936\t72\nchr14\t105626400\t105627300\t0.199\t83\nchr14\t105638100\t105639900\t0.2742\t81\nchr14\t105642900\t105643200\t0.5662\t42\nchr14\t105645300\t105645900\t0.0995\t117\nchr14\t105661500\t105662100\t0.3999\t102\nchr14\t105663600\t105663900\t0.3999\t102\nchr14\t105672000\t105672300\t0.3162\t55\nchr14\t105677400\t105679200\t0.0597\t71\nchr14\t105680400\t105680700\t0.0597\t71\nchr14\t105682200\t105682500\t0.0597\t71\nchr14\t105685800\t105686400\t0.0652\t64\nchr14\t105692400\t105693600\t0.0008\t75\nchr14\t105695700\t105697500\t0.0199\t121\nchr14\t105698700\t105699600\t0.0199\t121\nchr14\t105704700\t105705000\t0.3251\t85\nchr14\t105714300\t105717300\t0.0048\t87\nchr14\t105719400\t105720600\t0.2441\t75\nchr14\t105722700\t105723000\t0.1678\t53\nchr14\t105726300\t105726900\t0.2132\t82\nchr14\t105735000\t105737400\t0.0126\t47\nchr14\t105740700\t105741600\t0.2089\t81\nchr14\t105743700\t105745200\t0.3389\t75\nchr14\t105755700\t105756900\t0.1898\t66\nchr14\t105762600\t105763200\t0.4802\t96\nchr14\t105768300\t105769200\t0.449\t112\nchr14\t105850500\t105850800\t0.3276\t78\nchr14\t105867300\t105867900\t0.0144\t34\nchr14\t105947100\t105947400\t0.354\t45\nchr14\t106000800\t106001400\t0.1507\t44\nchr14\t106206300\t106206600\t0.418\t36\nchr14\t106300500\t106300800\t0.6109\t29\nchr14\t106335300\t106335900\t0.0161\t125\nchr14\t106337100\t106338000\t0.0161\t125\nchr14\t106341600\t106342200\t0.0211\t103\nchr14\t106359900\t106360800\t0.0154\t98\nchr14\t106362000\t106362600\t0.0154\t98\nchr14\t106366500\t106366800\t0.3471\t101\nchr14\t106368000\t106368300\t0.2203\t85\nchr14\t106403400\t106403700\t0.4352\t53\nchr14\t106463700\t106464600\t0.3459\t23\nchr14\t106468800\t106469100\t0.236\t35\nchr14\t106471800\t106473300\t0\t32\nchr14\t106476600\t106484700\t0\t74\nchr14\t106498500\t106498800\t0.2406\t20\nchr14\t106627800\t106628400\t0.3976\t66\nchr14\t106639800\t106640100\t0.1647\t63\nchr14\t106701600\t106703100\t0\t56\nchr14\t106713900\t106716900\t0.0848\t71\nchr14\t106720200\t106721400\t0.0229\t68\nchr14\t106723800\t106724700\t0.3115\t70\nchr14\t106744500\t106745100\t0.2282\t49\nchr14\t106748100\t106749600\t0\t55\nchr14\t106752000\t106754700\t0.2945\t347\nchr14\t106761300\t106764300\t0.1501\t81\nchr14\t106767300\t106768200\t0.0711\t64\nchr14\t106770900\t106771800\t0.2809\t88\nchr14\t106826700\t106827000\t0.5541\t54\nchr15\t17000100\t17010600\t0\t664\nchr15\t17024400\t17024700\t0.6421\t262\nchr15\t17031900\t17032200\t0.6861\t205\nchr15\t17076300\t17076900\t0.6036\t130\nchr15\t17080500\t17457900\t0\t2089\nchr15\t17459400\t17498400\t0\t345\nchr15\t17499600\t17503500\t0\t345\nchr15\t17504700\t17766600\t0\t139\nchr15\t17767800\t17913900\t0\t139\nchr15\t17915100\t18046500\t0\t129\nchr15\t18048000\t18217800\t0\t333\nchr15\t18219300\t18316200\t0\t333\nchr15\t18317400\t18341100\t0\t526\nchr15\t18342600\t19345200\t0\t526\nchr15\t19346400\t19467300\t0\t438\nchr15\t19468500\t19724700\t0\t438\nchr15\t19775400\t19783500\t0\t125\nchr15\t19784700\t19785000\t0\t125\nchr15\t19786200\t19786500\t0.6117\t46\nchr15\t19788900\t19789500\t0\t41\nchr15\t19817100\t19818900\t0\t69\nchr15\t19820400\t19820700\t0.451\t231\nchr15\t19823400\t19823700\t0.537\t62\nchr15\t19833000\t19833300\t0.6974\t103\nchr15\t19846500\t19846800\t0.3577\t72\nchr15\t19892700\t19893000\t0.5052\t76\nchr15\t19895700\t19896000\t0.5398\t78\nchr15\t19901400\t19902000\t0.5813\t140\nchr15\t19940400\t19940700\t0.6527\t186\nchr15\t19993500\t19994100\t0.0591\t72\nchr15\t19995900\t19998600\t0.0591\t72\nchr15\t19999800\t20003100\t0\t60\nchr15\t20004600\t20009700\t0\t60\nchr15\t20012100\t20012400\t0\t72\nchr15\t20013600\t20016900\t0\t72\nchr15\t20018400\t20031900\t0\t71\nchr15\t20033400\t20036700\t0\t71\nchr15\t20039700\t20041800\t0\t60\nchr15\t20043600\t20046300\t0\t60\nchr15\t20047800\t20054100\t0.0025\t76\nchr15\t20057400\t20057700\t0.3866\t35\nchr15\t20059200\t20095500\t0\t68\nchr15\t20096700\t20144400\t0\t419\nchr15\t20145600\t20153400\t0\t419\nchr15\t20154600\t20157000\t0\t419\nchr15\t20158200\t20186700\t0\t419\nchr15\t20313600\t20316900\t0.2999\t93\nchr15\t20325300\t20325900\t0.3913\t51\nchr15\t20329500\t20332800\t0.01\t77\nchr15\t20335200\t20335500\t0.517\t61\nchr15\t20343000\t20343300\t0.6719\t147\nchr15\t20423100\t20440500\t0\t133\nchr15\t20441700\t20611800\t0\t133\nchr15\t20613300\t20623500\t0\t78\nchr15\t20625300\t20628900\t0\t78\nchr15\t20630100\t20640900\t0\t66\nchr15\t20673600\t20675100\t0\t51\nchr15\t20677200\t20680500\t0\t51\nchr15\t20682000\t20682300\t0.0999\t35\nchr15\t20684400\t20685300\t0.06\t35\nchr15\t20687700\t20688600\t0.4005\t28\nchr15\t20730600\t20733300\t0.009\t63\nchr15\t20734500\t20757300\t0\t45\nchr15\t20760000\t20793600\t0\t55\nchr15\t20796000\t20844000\t0\t58\nchr15\t20845200\t20848200\t0\t54\nchr15\t20849400\t20859600\t0\t54\nchr15\t20860800\t20936100\t0\t54\nchr15\t20937600\t20951100\t0\t54\nchr15\t20952300\t20962200\t0\t54\nchr15\t20963400\t20986500\t0\t54\nchr15\t20989200\t21016800\t0\t67\nchr15\t21018000\t21023700\t0\t67\nchr15\t21024900\t21038700\t0\t67\nchr15\t21039900\t21043200\t0\t67\nchr15\t21045600\t21053100\t0\t67\nchr15\t21054300\t21061200\t0\t67\nchr15\t21063900\t21064500\t0.3193\t36\nchr15\t21065700\t21102600\t0\t428\nchr15\t21103800\t21193200\t0\t428\nchr15\t21242700\t21244500\t0\t41\nchr15\t21247500\t21249600\t0.0867\t43\nchr15\t21251100\t21251400\t0.1077\t34\nchr15\t21253800\t21254400\t0.2156\t42\nchr15\t21256800\t21257100\t0.5094\t38\nchr15\t21273000\t21273300\t0\t69\nchr15\t21274800\t21301500\t0\t69\nchr15\t21302700\t21317400\t0\t50\nchr15\t21318600\t21327000\t0\t50\nchr15\t21329400\t21360600\t0\t70\nchr15\t21362400\t21362700\t0\t30\nchr15\t21364500\t21380400\t0\t46\nchr15\t21381600\t21432900\t0\t65\nchr15\t21434100\t21458400\t0\t54\nchr15\t21459600\t21509400\t0\t66\nchr15\t21510600\t21514500\t0\t32\nchr15\t21515700\t21526200\t0\t32\nchr15\t21527400\t21531000\t0\t32\nchr15\t21532800\t21533100\t0.6272\t26\nchr15\t21537900\t21547200\t0\t59\nchr15\t21548700\t21549000\t0\t59\nchr15\t21550800\t21559800\t0\t59\nchr15\t21561600\t21568200\t0\t59\nchr15\t21569400\t21574800\t0\t59\nchr15\t21576000\t21612900\t0\t59\nchr15\t21614700\t21622800\t0\t51\nchr15\t21624000\t21635700\t0\t51\nchr15\t21636900\t21640500\t0\t30\nchr15\t21641700\t21642000\t0.0318\t13\nchr15\t21643800\t21747900\t0\t54\nchr15\t21749400\t21750300\t0\t54\nchr15\t21751500\t21778500\t0\t61\nchr15\t21828900\t21954600\t0\t61\nchr15\t21955800\t21986700\t0\t61\nchr15\t21988500\t22035900\t0\t58\nchr15\t22037100\t22042800\t0\t58\nchr15\t22044900\t22049100\t0\t54\nchr15\t22050300\t22051500\t0\t54\nchr15\t22052700\t22056000\t0\t54\nchr15\t22057200\t22121100\t0\t54\nchr15\t22122300\t22124700\t0\t54\nchr15\t22125900\t22221000\t0\t54\nchr15\t22299600\t22299900\t0.3074\t43\nchr15\t22302000\t22308000\t0\t58\nchr15\t22359300\t22387200\t0\t144\nchr15\t22388700\t22558200\t0\t144\nchr15\t22560000\t22572300\t0.0052\t82\nchr15\t22573800\t22581300\t0\t76\nchr15\t22583100\t22588800\t0.0171\t70\nchr15\t22591800\t22593900\t0.1487\t69\nchr15\t22596300\t22596600\t0.4255\t57\nchr15\t22602300\t22603200\t0.0145\t72\nchr15\t22605000\t22606200\t0.0145\t72\nchr15\t22607700\t22610400\t0.0145\t72\nchr15\t22612800\t22616700\t0.0145\t72\nchr15\t22625700\t22626000\t0.3265\t51\nchr15\t22631100\t22631400\t0.2897\t56\nchr15\t22639800\t22640100\t0.6411\t63\nchr15\t22659600\t22659900\t0.5374\t37\nchr15\t22662900\t22664400\t0.6092\t41\nchr15\t22669800\t22671600\t0.2006\t60\nchr15\t22673100\t22674900\t0.1243\t66\nchr15\t22676100\t22678800\t0.0653\t60\nchr15\t22680000\t22680600\t0.1562\t63\nchr15\t22686000\t22686900\t0.3937\t62\nchr15\t22690200\t22690500\t0.5396\t40\nchr15\t22694400\t22696200\t0.441\t51\nchr15\t22698000\t22698300\t0.5377\t49\nchr15\t22704600\t22704900\t0.0952\t29\nchr15\t22745100\t22745700\t0.3302\t64\nchr15\t22753500\t22753800\t0.5133\t58\nchr15\t22757100\t22757400\t0.5229\t57\nchr15\t22770300\t22770600\t0.0054\t28\nchr15\t23098500\t23098800\t0.4524\t86\nchr15\t23124000\t23173800\t0\t156\nchr15\t23175000\t23179800\t0\t156\nchr15\t23181600\t23183700\t0\t113\nchr15\t23185500\t23186700\t0\t146\nchr15\t23187900\t23200500\t0\t146\nchr15\t23201700\t23202600\t0\t146\nchr15\t23203800\t23205000\t0\t146\nchr15\t23206200\t23208900\t0\t146\nchr15\t23210100\t23220300\t0.0409\t118\nchr15\t23221500\t23222700\t0.0409\t118\nchr15\t23223900\t23225100\t0.0409\t118\nchr15\t23226300\t23226600\t0.4807\t47\nchr15\t23277000\t23300100\t0\t87\nchr15\t23301900\t23303700\t0.1532\t69\nchr15\t23312700\t23359200\t0\t137\nchr15\t23360400\t23364000\t0\t137\nchr15\t23366700\t23367600\t0.2048\t69\nchr15\t23428500\t23433900\t0\t80\nchr15\t23439900\t23440200\t0.6748\t50\nchr15\t23445000\t23445300\t0.089\t11\nchr15\t23676300\t23676600\t0.3703\t33\nchr15\t23715900\t23717700\t0.3683\t82\nchr15\t23739000\t23739300\t0.2931\t71\nchr15\t23993100\t23993400\t0.3102\t44\nchr15\t24010800\t24011100\t0.5161\t83\nchr15\t24095700\t24096000\t0.5869\t27\nchr15\t24102000\t24102600\t0.3397\t67\nchr15\t24104400\t24104700\t0.3302\t85\nchr15\t24134100\t24135000\t0.0002\t61\nchr15\t24137400\t24138600\t0.0207\t83\nchr15\t24191700\t24192300\t0.0057\t58\nchr15\t24261600\t24261900\t0.2824\t57\nchr15\t24314700\t24315300\t0.59\t79\nchr15\t24351000\t24351300\t0.4082\t53\nchr15\t24357900\t24358200\t0.2368\t55\nchr15\t24412200\t24412500\t0.5027\t69\nchr15\t24918300\t24918900\t0.4441\t14\nchr15\t25459500\t25459800\t0.1934\t63\nchr15\t25527900\t25528500\t0.4428\t166\nchr15\t25758000\t25758900\t0.0241\t304\nchr15\t27852600\t27853500\t0.1756\t142\nchr15\t27998100\t27999000\t0.3456\t65\nchr15\t28069800\t28071000\t0.3914\t72\nchr15\t28146600\t28147200\t0.3307\t63\nchr15\t28200600\t28201200\t0.4741\t59\nchr15\t28202400\t28203300\t0.0054\t65\nchr15\t28205400\t28206600\t0.1991\t71\nchr15\t28211100\t28211400\t0.4154\t64\nchr15\t28212900\t28213500\t0.0468\t54\nchr15\t28233900\t28234800\t0.2326\t80\nchr15\t28239600\t28239900\t0.5293\t64\nchr15\t28294200\t28294500\t0.4464\t55\nchr15\t28302000\t28302900\t0.3276\t62\nchr15\t28305300\t28305900\t0.4165\t65\nchr15\t28318800\t28319100\t0.2612\t56\nchr15\t28321800\t28452300\t0\t145\nchr15\t28453800\t28454100\t0.4147\t60\nchr15\t28455300\t28455600\t0.4184\t52\nchr15\t28465500\t28475700\t0\t184\nchr15\t28477200\t28607100\t0\t184\nchr15\t28608300\t28633200\t0\t184\nchr15\t28634700\t28652400\t0\t184\nchr15\t28654500\t28675800\t0\t184\nchr15\t28677300\t28678500\t0\t184\nchr15\t28679700\t28683300\t0\t64\nchr15\t28686300\t28688400\t0.2336\t62\nchr15\t28696800\t28697400\t0.0291\t66\nchr15\t28699500\t28700700\t0.0291\t66\nchr15\t28703400\t28703700\t0.0291\t66\nchr15\t28705200\t28711200\t0.2253\t81\nchr15\t28720200\t28720500\t0.4502\t81\nchr15\t28723800\t28724100\t0.3585\t57\nchr15\t28732800\t28733100\t0.5294\t38\nchr15\t28738200\t28738500\t0.3277\t58\nchr15\t28743900\t28744200\t0.4168\t78\nchr15\t28746600\t28752000\t0.1696\t62\nchr15\t28753200\t28753800\t0.2013\t65\nchr15\t28759200\t28759800\t0.2547\t53\nchr15\t28763100\t28763400\t0.5228\t50\nchr15\t28770900\t28771200\t0.253\t46\nchr15\t28789200\t28789500\t0.2459\t45\nchr15\t28816200\t28816500\t0.5402\t48\nchr15\t28831500\t28831800\t0.4093\t55\nchr15\t29119200\t29119500\t0.6209\t24\nchr15\t29949600\t29950200\t0.51\t88\nchr15\t30082500\t30093900\t0\t104\nchr15\t30095400\t30123600\t0\t107\nchr15\t30125400\t30153000\t0\t107\nchr15\t30155400\t30156000\t0\t107\nchr15\t30158100\t30175200\t0\t107\nchr15\t30176700\t30181800\t0\t107\nchr15\t30183000\t30195600\t0\t107\nchr15\t30197100\t30227700\t0\t107\nchr15\t30228900\t30375000\t0\t107\nchr15\t30376200\t30442200\t0\t107\nchr15\t30443700\t30444000\t0\t107\nchr15\t30445500\t30483600\t0\t75\nchr15\t30488700\t30490200\t0.3906\t45\nchr15\t30493200\t30503700\t0\t69\nchr15\t30505500\t30511500\t0\t121\nchr15\t30512700\t30596700\t0\t121\nchr15\t30597900\t30602700\t0\t75\nchr15\t30604200\t30605100\t0.0275\t82\nchr15\t30606900\t30607500\t0.0275\t82\nchr15\t30609000\t30617700\t0.0315\t86\nchr15\t30633000\t30633300\t0.4707\t59\nchr15\t30639300\t30640500\t0.0549\t63\nchr15\t30652500\t30653400\t0.1413\t48\nchr15\t30656700\t30657000\t0.4552\t66\nchr15\t30681600\t30682200\t0.1024\t67\nchr15\t30684600\t30684900\t0.2629\t66\nchr15\t30692700\t30693300\t0\t77\nchr15\t30695100\t30695400\t0\t77\nchr15\t30698700\t30701700\t0\t77\nchr15\t30703200\t30705000\t0.2091\t63\nchr15\t30706800\t30707100\t0.2793\t51\nchr15\t30708900\t30710400\t0.2921\t92\nchr15\t30713400\t30714000\t0.2921\t92\nchr15\t30716400\t30716700\t0.535\t41\nchr15\t30750000\t30751800\t0.0428\t69\nchr15\t30754800\t30755700\t0.1171\t71\nchr15\t30800100\t30800700\t0.3785\t70\nchr15\t30831900\t30832500\t0.395\t63\nchr15\t30844800\t30845400\t0.52\t102\nchr15\t31510500\t31511700\t0.0627\t28\nchr15\t31620600\t31620900\t0.2851\t37\nchr15\t31629900\t31631100\t0.4926\t110\nchr15\t31650000\t31650900\t0.0981\t56\nchr15\t31653900\t31655400\t0.1252\t63\nchr15\t31691700\t31692600\t0.0084\t58\nchr15\t31695300\t31696800\t0.125\t82\nchr15\t31698600\t31698900\t0.3002\t66\nchr15\t31700700\t31702500\t0.1716\t59\nchr15\t31704000\t31707300\t0\t84\nchr15\t31710000\t31710300\t0.6419\t51\nchr15\t31711500\t31713000\t0.2852\t62\nchr15\t31720800\t31721100\t0.5264\t73\nchr15\t31723500\t31724100\t0.1813\t57\nchr15\t31912500\t31913100\t0.2718\t51\nchr15\t31998900\t31999200\t0.6237\t33\nchr15\t32153700\t32216400\t0\t80\nchr15\t32225100\t32309700\t0\t79\nchr15\t32311200\t32312700\t0.0211\t60\nchr15\t32314500\t32323200\t0\t73\nchr15\t32324400\t32328900\t0\t73\nchr15\t32330400\t32340900\t0\t73\nchr15\t32342400\t32355600\t0\t73\nchr15\t32356800\t32381100\t0\t73\nchr15\t32382300\t32382900\t0.0022\t63\nchr15\t32385300\t32397300\t0\t110\nchr15\t32398500\t32502600\t0\t110\nchr15\t32504100\t32514300\t0\t58\nchr15\t32518500\t32518800\t0.2982\t49\nchr15\t32523900\t32572800\t0\t75\nchr15\t32575200\t32606400\t0\t145\nchr15\t32612700\t32613300\t0.3663\t29\nchr15\t32622900\t32623200\t0.3656\t65\nchr15\t32629200\t32630400\t0.0579\t56\nchr15\t32962800\t32963100\t0.4648\t49\nchr15\t33350400\t33351900\t0.5191\t81\nchr15\t34381800\t34417500\t0\t114\nchr15\t34419000\t34422900\t0.0005\t85\nchr15\t34424100\t34425000\t0.3038\t75\nchr15\t34523400\t34524000\t0.1112\t63\nchr15\t34527600\t34571700\t0\t95\nchr15\t34638600\t34638900\t0.2976\t26\nchr15\t34716900\t34717200\t0.2083\t57\nchr15\t35655900\t35656800\t0.5114\t50\nchr15\t36103800\t36104100\t0.201\t70\nchr15\t36119100\t36120600\t0.2935\t73\nchr15\t36197700\t36199800\t0.1263\t80\nchr15\t36201000\t36201300\t0.1263\t80\nchr15\t36683100\t36684900\t0.013\t78\nchr15\t37304400\t37304700\t0.4763\t64\nchr15\t37399800\t37400100\t0.5299\t65\nchr15\t37402800\t37403400\t0.3949\t72\nchr15\t37428300\t37428600\t0.4249\t75\nchr15\t37430100\t37432800\t0.1018\t90\nchr15\t37473300\t37475400\t0.3218\t70\nchr15\t37515000\t37515300\t0.1829\t75\nchr15\t38787300\t38787600\t0.1148\t58\nchr15\t38836200\t38836500\t0.3477\t70\nchr15\t38974800\t38975100\t0.2043\t15\nchr15\t39037200\t39037500\t0.3707\t70\nchr15\t39421800\t39426300\t0.0216\t100\nchr15\t39522600\t39523800\t0.1763\t77\nchr15\t40681500\t40684200\t0.0075\t60\nchr15\t41321700\t41322000\t0.3404\t49\nchr15\t41382000\t41384100\t0.0484\t107\nchr15\t41725500\t41725800\t0.3161\t25\nchr15\t43015200\t43015500\t0.5154\t50\nchr15\t43035600\t43035900\t0.6004\t61\nchr15\t43368300\t43368600\t0.393\t30\nchr15\t43560600\t43597500\t0\t85\nchr15\t43599300\t43600500\t0.0334\t76\nchr15\t43605600\t43608600\t0\t98\nchr15\t43610100\t43619400\t0\t98\nchr15\t43620900\t43621200\t0.592\t50\nchr15\t43622400\t43622700\t0.4281\t53\nchr15\t43629000\t43629600\t0.2703\t58\nchr15\t43635900\t43636200\t0.4343\t68\nchr15\t43642500\t43642800\t0.0971\t49\nchr15\t43651800\t43654500\t0.2056\t93\nchr15\t43659900\t43696200\t0\t84\nchr15\t43699200\t43700100\t0.1456\t69\nchr15\t43705200\t43707900\t0\t81\nchr15\t43709400\t43719000\t0\t81\nchr15\t43720500\t43720800\t0.6356\t56\nchr15\t43722300\t43722600\t0.5159\t54\nchr15\t43725300\t43725600\t0.4702\t62\nchr15\t43738500\t43739100\t0.1073\t52\nchr15\t44252100\t44258100\t0\t110\nchr15\t44361000\t44362500\t0.4083\t100\nchr15\t44742000\t44742600\t0.3556\t77\nchr15\t44823600\t44827500\t0\t80\nchr15\t44828700\t44829000\t0.2716\t88\nchr15\t44836800\t44837100\t0.5776\t78\nchr15\t44847300\t44847600\t0.3637\t70\nchr15\t44855400\t44855700\t0.169\t74\nchr15\t44856900\t44857500\t0.169\t74\nchr15\t44888100\t44888700\t0.3241\t59\nchr15\t44922600\t44923200\t0.1014\t58\nchr15\t44936400\t44937300\t0.0814\t76\nchr15\t44943000\t44944200\t0.1975\t74\nchr15\t44948700\t44949000\t0.5123\t79\nchr15\t44967600\t44968200\t0.2735\t57\nchr15\t44998200\t44998800\t0.1658\t71\nchr15\t45031800\t45032100\t0.0398\t68\nchr15\t45033300\t45033600\t0.0398\t68\nchr15\t45043200\t45044700\t0.2875\t60\nchr15\t45055800\t45056400\t0.3169\t68\nchr15\t45063900\t45064200\t0.3443\t63\nchr15\t45071700\t45076800\t0\t76\nchr15\t45111000\t45111300\t0.4069\t65\nchr15\t45135600\t45135900\t0.4096\t51\nchr15\t45293700\t45294000\t0.5494\t71\nchr15\t45462300\t45463500\t0.3075\t72\nchr15\t45598200\t45600000\t0.0008\t71\nchr15\t45775800\t45776100\t0.1986\t49\nchr15\t46047900\t46048200\t0.4769\t63\nchr15\t46107000\t46108500\t0.0961\t73\nchr15\t46362600\t46362900\t0.4131\t67\nchr15\t46368000\t46369200\t0.1938\t54\nchr15\t46608600\t46608900\t0.4581\t44\nchr15\t46745700\t46748700\t0.1353\t105\nchr15\t46998000\t46999500\t0.0076\t67\nchr15\t47132400\t47134200\t0.0728\t60\nchr15\t47166600\t47168100\t0.1953\t86\nchr15\t47169300\t47171100\t0.1953\t86\nchr15\t47251800\t47252100\t0.5239\t54\nchr15\t47279100\t47279400\t0.1814\t61\nchr15\t47281200\t47281500\t0.1814\t61\nchr15\t47318400\t47319000\t0.3623\t57\nchr15\t48529800\t48530100\t0.5045\t47\nchr15\t48578700\t48579000\t0.3834\t40\nchr15\t49261200\t49261500\t0.1148\t61\nchr15\t49263000\t49263900\t0.1148\t61\nchr15\t49277100\t49277400\t0.3501\t36\nchr15\t49354800\t49355100\t0.0177\t77\nchr15\t49356300\t49359900\t0.0177\t77\nchr15\t49396500\t49396800\t0.0046\t95\nchr15\t49398300\t49401900\t0.0046\t95\nchr15\t49779000\t49779300\t0.3293\t88\nchr15\t49782000\t49783500\t0.3293\t88\nchr15\t49797000\t49797300\t0.4024\t65\nchr15\t50833800\t50834100\t0.3008\t23\nchr15\t51032100\t51032400\t0.1916\t89\nchr15\t51033900\t51034200\t0.4252\t92\nchr15\t51036900\t51037200\t0.4252\t92\nchr15\t51118500\t51119100\t0.3512\t61\nchr15\t51174000\t51178800\t0.0619\t95\nchr15\t51417300\t51423300\t0\t93\nchr15\t51583200\t51585300\t0\t41\nchr15\t52233000\t52233300\t0\t18\nchr15\t52907100\t52908000\t0.0082\t43\nchr15\t53135700\t53140500\t0\t94\nchr15\t53156100\t53157000\t0\t63\nchr15\t53225100\t53225400\t0.4841\t46\nchr15\t53381400\t53381700\t0.3892\t55\nchr15\t53495100\t53495700\t0.0242\t80\nchr15\t53496900\t53497200\t0.0242\t80\nchr15\t53541600\t53546100\t0.1294\t88\nchr15\t53685000\t53685600\t0.3919\t85\nchr15\t53687400\t53687700\t0.3919\t85\nchr15\t53805900\t53806200\t0.4159\t28\nchr15\t54051900\t54052500\t0.1057\t66\nchr15\t54477000\t54477600\t0.3362\t61\nchr15\t54926100\t54932100\t0\t121\nchr15\t55065300\t55066500\t0.0837\t75\nchr15\t55067700\t55069800\t0.0837\t75\nchr15\t55302600\t55303800\t0.4234\t52\nchr15\t55645200\t55645500\t0.2786\t44\nchr15\t55986900\t55988400\t0.0034\t62\nchr15\t56067600\t56067900\t0.6067\t57\nchr15\t56136300\t56138400\t0.3286\t82\nchr15\t56311200\t56314500\t0.0787\t119\nchr15\t56331900\t56332200\t0.3603\t24\nchr15\t56575500\t56576100\t0.1565\t72\nchr15\t57687600\t57688200\t0.061\t29\nchr15\t57720000\t57720300\t0.4574\t65\nchr15\t58126200\t58131600\t0.0111\t81\nchr15\t58304400\t58304700\t0.4309\t30\nchr15\t58347300\t58347600\t0.5977\t48\nchr15\t59420700\t59421000\t0\t21\nchr15\t59539200\t59539800\t0.3388\t26\nchr15\t59807400\t59807700\t0.2543\t47\nchr15\t60349800\t60350100\t0.5882\t27\nchr15\t60366600\t60368100\t0.1586\t61\nchr15\t60816000\t60816600\t0.0718\t21\nchr15\t60950100\t60954300\t0.2639\t76\nchr15\t61259400\t61259700\t0.4497\t49\nchr15\t61443900\t61444200\t0.6225\t40\nchr15\t61572000\t61572300\t0.5638\t30\nchr15\t61898400\t61900800\t0.1187\t74\nchr15\t61923900\t61924200\t0.5516\t49\nchr15\t62003700\t62004000\t0.4629\t73\nchr15\t62144400\t62144700\t0.3494\t66\nchr15\t62332800\t62333100\t0.5182\t78\nchr15\t63320700\t63321000\t0.575\t36\nchr15\t64139100\t64139700\t0.1712\t48\nchr15\t64326600\t64332600\t0.0716\t102\nchr15\t65167200\t65167500\t0.4243\t123\nchr15\t65429100\t65429400\t0.5892\t56\nchr15\t65843700\t65844000\t0.4329\t30\nchr15\t65864100\t65864400\t0.2684\t10\nchr15\t66341400\t66341700\t0.3598\t32\nchr15\t66450000\t66452100\t0\t73\nchr15\t67242300\t67242600\t0.5357\t49\nchr15\t67672200\t67672800\t0.4191\t80\nchr15\t67905000\t67905300\t0.5223\t34\nchr15\t68133900\t68136000\t0\t30\nchr15\t68691300\t68691600\t0.17\t20\nchr15\t68757300\t68757600\t0.4101\t38\nchr15\t68859000\t68859900\t0.6185\t68\nchr15\t68918400\t68918700\t0.4299\t55\nchr15\t69473100\t69473400\t0.4784\t36\nchr15\t70130100\t70130400\t0.4493\t53\nchr15\t70279800\t70280100\t0.5035\t51\nchr15\t70618800\t70619100\t0.6057\t40\nchr15\t70729800\t70735200\t0\t87\nchr15\t70984800\t70986000\t0.4516\t83\nchr15\t70988100\t70988400\t0.1327\t71\nchr15\t71094900\t71096100\t0.2187\t83\nchr15\t71134800\t71135400\t0.39\t73\nchr15\t71163600\t71163900\t0.4312\t61\nchr15\t71174400\t71180100\t0\t93\nchr15\t71587200\t71587800\t0.2374\t35\nchr15\t71593200\t71593500\t0.2442\t36\nchr15\t71769000\t71769900\t0.0654\t72\nchr15\t71793600\t71796900\t0.3063\t81\nchr15\t71907300\t71907600\t0.1512\t63\nchr15\t71928000\t71928300\t0.5742\t29\nchr15\t72101400\t72102300\t0.2884\t77\nchr15\t72631500\t72670500\t0\t136\nchr15\t72806400\t72807000\t0.5208\t81\nchr15\t72911100\t72911400\t0.4653\t49\nchr15\t73217100\t73219800\t0.0949\t76\nchr15\t73509600\t73513500\t0.0215\t90\nchr15\t73532700\t73536000\t0.0238\t81\nchr15\t73876200\t73876500\t0.5148\t44\nchr15\t74068500\t74105700\t0\t172\nchr15\t74977200\t74977500\t0.0438\t19\nchr15\t75255000\t75273900\t0\t161\nchr15\t75276600\t75295500\t0\t134\nchr15\t75331500\t75332100\t0.3597\t92\nchr15\t75480900\t75482100\t0.1983\t67\nchr15\t75503400\t75503700\t0.526\t75\nchr15\t75505200\t75505500\t0.2456\t45\nchr15\t75624000\t75624300\t0.5368\t47\nchr15\t75702900\t75704100\t0.0784\t55\nchr15\t75708000\t75708600\t0.1157\t60\nchr15\t75716100\t75716700\t0.2473\t74\nchr15\t76230300\t76230600\t0.3029\t17\nchr15\t76538100\t76538400\t0.0885\t63\nchr15\t77077200\t77077800\t0.33\t33\nchr15\t77205900\t77206500\t0.3742\t63\nchr15\t77257200\t77257500\t0.3554\t58\nchr15\t77618400\t77618700\t0.1664\t260\nchr15\t77876400\t77877000\t0.1788\t57\nchr15\t77880000\t77880300\t0.3042\t55\nchr15\t77883000\t77883600\t0.0744\t64\nchr15\t77888400\t77889000\t0.152\t74\nchr15\t77920500\t77920800\t0.6645\t39\nchr15\t77948100\t77948700\t0\t86\nchr15\t77949900\t77952900\t0\t86\nchr15\t77973300\t77973900\t0.3513\t64\nchr15\t77995800\t77996100\t0.4422\t58\nchr15\t78188400\t78189000\t0.2255\t99\nchr15\t78722700\t78723000\t0.3275\t77\nchr15\t78724500\t78724800\t0.3275\t77\nchr15\t78742800\t78747600\t0\t76\nchr15\t78755400\t78755700\t0.3791\t72\nchr15\t78779700\t78780300\t0.364\t71\nchr15\t78798900\t78799500\t0.4129\t77\nchr15\t79272900\t79275900\t0.1157\t94\nchr15\t79438800\t79439100\t0.4739\t16\nchr15\t79490100\t79490400\t0.5036\t97\nchr15\t79575000\t79575300\t0.4576\t65\nchr15\t79599600\t79599900\t0.5389\t35\nchr15\t79648500\t79649400\t0.0739\t74\nchr15\t79714500\t79714800\t0.4642\t50\nchr15\t79749000\t79749300\t0.4761\t85\nchr15\t81091200\t81091800\t0.079\t71\nchr15\t81162900\t81163200\t0.2982\t55\nchr15\t81655500\t81656100\t0.1239\t63\nchr15\t81659100\t81659700\t0.3052\t46\nchr15\t81662400\t81663000\t0.4939\t59\nchr15\t81669000\t81672600\t0.061\t74\nchr15\t81697800\t81702300\t0.1251\t79\nchr15\t81705000\t81705600\t0.3657\t50\nchr15\t81708300\t81708600\t0.4304\t58\nchr15\t81730800\t81736200\t0.0873\t104\nchr15\t81798900\t81803400\t0.0368\t92\nchr15\t81872100\t81872400\t0.1265\t99\nchr15\t81873600\t81875100\t0.1265\t99\nchr15\t81996300\t82001100\t0.0239\t90\nchr15\t82201800\t82202100\t0.5082\t57\nchr15\t82242300\t82243800\t0\t81\nchr15\t82250100\t82250700\t0.1592\t84\nchr15\t82299900\t82300200\t0.4979\t89\nchr15\t82318800\t82324200\t0\t75\nchr15\t82328100\t82331700\t0\t72\nchr15\t82337400\t82338000\t0.1672\t75\nchr15\t82339200\t82342200\t0\t107\nchr15\t82343400\t82347000\t0.2531\t174\nchr15\t82348200\t82353300\t0\t123\nchr15\t82354800\t82368900\t0\t123\nchr15\t82372500\t82372800\t0.5224\t57\nchr15\t82420800\t82428900\t0\t86\nchr15\t82430100\t82471800\t0\t149\nchr15\t82473000\t82473600\t0.3501\t89\nchr15\t82475100\t82475400\t0.5459\t99\nchr15\t82479000\t82479300\t0.247\t82\nchr15\t82481100\t82481400\t0.247\t82\nchr15\t82483800\t82488300\t0\t85\nchr15\t82489500\t82497300\t0\t85\nchr15\t82500000\t82506900\t0\t115\nchr15\t82508100\t82526400\t0\t115\nchr15\t82606500\t82606800\t0.4779\t27\nchr15\t82882800\t82888800\t0\t77\nchr15\t82989900\t82990500\t0.0062\t50\nchr15\t82997700\t82999200\t0.035\t77\nchr15\t83328900\t83329500\t0.2535\t93\nchr15\t83384100\t83389500\t0.0745\t82\nchr15\t83451000\t83456700\t0\t75\nchr15\t83660700\t83662500\t0.2805\t64\nchr15\t83821200\t83821800\t0.4553\t88\nchr15\t84092700\t84093300\t0.1571\t69\nchr15\t84099600\t84101100\t0\t66\nchr15\t84138900\t84139200\t0.4277\t57\nchr15\t84147300\t84147600\t0.5224\t53\nchr15\t84165600\t84197400\t0\t81\nchr15\t84198900\t84270000\t0\t84\nchr15\t84320100\t84384000\t0\t102\nchr15\t84394500\t84394800\t0.5404\t83\nchr15\t84403800\t84474300\t0\t110\nchr15\t84476100\t84516900\t0\t95\nchr15\t84518100\t84525600\t0\t90\nchr15\t84549600\t84549900\t0.5492\t43\nchr15\t84564300\t84564900\t0.1583\t52\nchr15\t85184100\t85184400\t0.3225\t75\nchr15\t85188600\t85235700\t0\t176\nchr15\t85237800\t85238400\t0\t176\nchr15\t85240200\t85246500\t0\t176\nchr15\t85248900\t85250700\t0.2291\t83\nchr15\t85259100\t85260600\t0.3103\t93\nchr15\t85265700\t85272000\t0.0043\t76\nchr15\t85434900\t85439100\t0.081\t70\nchr15\t85856100\t85856400\t0.2007\t56\nchr15\t85881900\t85882500\t0.2256\t100\nchr15\t85896300\t85896600\t0.496\t86\nchr15\t86528400\t86534100\t0.0024\t90\nchr15\t86999700\t87001200\t0.1134\t65\nchr15\t87510000\t87517200\t0\t96\nchr15\t88361100\t88361400\t0.4361\t62\nchr15\t88538100\t88538400\t0.4948\t58\nchr15\t88540800\t88541100\t0.5567\t62\nchr15\t88552200\t88553700\t0.3637\t69\nchr15\t88555800\t88556100\t0.3162\t68\nchr15\t88855500\t88857000\t0\t130\nchr15\t88940700\t88942800\t0.0017\t78\nchr15\t89046300\t89047200\t0.4169\t82\nchr15\t89636400\t89639700\t0.0974\t78\nchr15\t89663700\t89664000\t0.3999\t53\nchr15\t89853600\t89855700\t0.1086\t81\nchr15\t89868000\t89869500\t0.2278\t70\nchr15\t90359100\t90359400\t0.5498\t63\nchr15\t90636300\t90636600\t0.4682\t50\nchr15\t90647100\t90647400\t0.628\t68\nchr15\t90858900\t90859200\t0.219\t22\nchr15\t91177500\t91178400\t0.3366\t97\nchr15\t91500900\t91501200\t0.6601\t19\nchr15\t91504800\t91506600\t0.2404\t63\nchr15\t91750800\t91751100\t0.4535\t141\nchr15\t91762800\t91763400\t0.0205\t71\nchr15\t92137200\t92140500\t0.1263\t83\nchr15\t93393600\t93393900\t0.2455\t72\nchr15\t93431400\t93432300\t0.5711\t55\nchr15\t93675900\t93681300\t0.013\t88\nchr15\t94101600\t94101900\t0.497\t38\nchr15\t94813500\t94813800\t0.6941\t73\nchr15\t96633300\t96633600\t0.4962\t79\nchr15\t96898200\t96898500\t0.2483\t103\nchr15\t97265700\t97268100\t0\t46\nchr15\t97269300\t97270800\t0.1382\t24\nchr15\t97292400\t97292700\t0.3485\t45\nchr15\t97437000\t97438500\t0.256\t69\nchr15\t98089200\t98089800\t0.027\t62\nchr15\t98096400\t98096700\t0.221\t64\nchr15\t99013500\t99014100\t0.057\t69\nchr15\t99797400\t99797700\t0.6348\t98\nchr15\t99805500\t99808200\t0.3413\t59\nchr15\t100072200\t100072500\t0.3407\t55\nchr15\t100162500\t100162800\t0.4868\t30\nchr15\t100276200\t100276500\t0.6212\t64\nchr15\t100313700\t100314000\t0.5155\t56\nchr15\t100367400\t100367700\t0.2377\t51\nchr15\t100370100\t100370400\t0.3408\t79\nchr15\t100418400\t100422900\t0.0474\t86\nchr15\t100535700\t100536000\t0.489\t51\nchr15\t100555500\t100555800\t0.6775\t26\nchr15\t100557000\t100558500\t0.2726\t43\nchr15\t100706400\t100706700\t0.328\t32\nchr15\t100710300\t100710600\t0.6354\t134\nchr15\t100719000\t100720200\t0\t61\nchr15\t100773600\t100773900\t0.2754\t39\nchr15\t101075100\t101075400\t0.5871\t12\nchr15\t101086200\t101086500\t0.5484\t39\nchr15\t101130600\t101131200\t0.3192\t77\nchr15\t101202300\t101202600\t0.6257\t59\nchr15\t101214600\t101214900\t0.5438\t53\nchr15\t101223600\t101223900\t0.548\t61\nchr15\t101311800\t101312100\t0.2267\t41\nchr15\t101402100\t101402400\t0.4344\t25\nchr15\t101627400\t101632200\t0.133\t96\nchr15\t101692200\t101692500\t0.6962\t45\nchr15\t101730300\t101730600\t0.6246\t57\nchr15\t101745600\t101747100\t0.0732\t62\nchr15\t101752800\t101764200\t0\t190\nchr15\t101766900\t101767200\t0.3441\t39\nchr15\t101860200\t101862300\t0\t76\nchr15\t101863800\t101865600\t0.0626\t84\nchr15\t101867700\t101875800\t0.0081\t84\nchr15\t101878800\t101879700\t0.3456\t59\nchr15\t101889900\t101890200\t0.4306\t45\nchr15\t101892600\t101894700\t0\t86\nchr15\t101896500\t101898600\t0\t86\nchr15\t101900100\t101900400\t0.2156\t55\nchr15\t101905500\t101906100\t0.0101\t71\nchr15\t101907600\t101913000\t0.0101\t71\nchr15\t101915400\t101918700\t0.035\t79\nchr15\t101920500\t101947200\t0\t117\nchr15\t101948400\t101964600\t0\t171\nchr15\t101966400\t101970300\t0\t225\nchr15\t101971800\t101981400\t0\t225\nchr16\t13200\t16800\t0\t153\nchr16\t18000\t23100\t0\t153\nchr16\t25200\t31800\t0.0172\t106\nchr16\t81600\t81900\t0.5798\t39\nchr16\t153300\t154200\t0.0066\t66\nchr16\t160200\t160500\t0.5796\t85\nchr16\t163800\t164700\t0.0017\t53\nchr16\t172500\t173400\t0\t69\nchr16\t176700\t177000\t0.3789\t73\nchr16\t458400\t458700\t0.2609\t175\nchr16\t481500\t482100\t0.259\t55\nchr16\t494700\t495000\t0.3722\t395\nchr16\t585000\t585300\t0.1015\t21\nchr16\t599700\t600000\t0.1702\t77\nchr16\t606000\t606600\t0.5179\t72\nchr16\t611700\t613200\t0.2255\t39\nchr16\t818700\t819000\t0.6346\t236\nchr16\t826500\t826800\t0.5659\t28\nchr16\t846600\t847200\t0.2419\t501\nchr16\t857400\t859800\t0.4072\t108\nchr16\t886500\t886800\t0.4845\t38\nchr16\t895800\t896100\t0.4045\t51\nchr16\t903000\t904800\t0.498\t64\nchr16\t922800\t923100\t0.6177\t41\nchr16\t952800\t955200\t0.2527\t84\nchr16\t960600\t962100\t0\t91\nchr16\t1025100\t1025700\t0.4222\t349\nchr16\t1043400\t1043700\t0.2957\t27\nchr16\t1092600\t1093200\t0.384\t105\nchr16\t1113900\t1114200\t0.5679\t79\nchr16\t1185600\t1186200\t0.4932\t134\nchr16\t1199100\t1199400\t0.6079\t35\nchr16\t1204800\t1205100\t0.588\t61\nchr16\t1228800\t1230000\t0.0084\t63\nchr16\t1231800\t1237800\t0\t68\nchr16\t1239300\t1239600\t0.3466\t79\nchr16\t1240800\t1243200\t0.0034\t67\nchr16\t1248600\t1252500\t0\t80\nchr16\t1253700\t1254600\t0\t80\nchr16\t1284900\t1285200\t0.5767\t58\nchr16\t1397400\t1397700\t0.5869\t18\nchr16\t1459500\t1459800\t0.3693\t28\nchr16\t1599000\t1600500\t0.23\t65\nchr16\t2034300\t2034600\t0.4897\t30\nchr16\t2098500\t2098800\t0.5036\t63\nchr16\t2117700\t2118000\t0.4423\t76\nchr16\t2127900\t2128200\t0.4966\t19\nchr16\t2134200\t2134500\t0.1666\t74\nchr16\t2164800\t2165100\t0.6529\t47\nchr16\t2399400\t2399700\t0.4714\t52\nchr16\t2542800\t2543700\t0.0002\t63\nchr16\t2547300\t2551200\t0\t80\nchr16\t2552400\t2575800\t0\t80\nchr16\t2578500\t2584800\t0\t77\nchr16\t2600400\t2601000\t0.1623\t70\nchr16\t2604600\t2604900\t0.6118\t55\nchr16\t2606400\t2609400\t0\t84\nchr16\t2611800\t2614200\t0\t81\nchr16\t2615400\t2622000\t0\t81\nchr16\t2623500\t2648100\t0\t73\nchr16\t2650800\t2655000\t0\t87\nchr16\t2657700\t2658600\t0.0019\t73\nchr16\t2678700\t2679300\t0.0326\t71\nchr16\t2683500\t2683800\t0.3443\t60\nchr16\t2685600\t2686800\t0.0055\t94\nchr16\t2688600\t2689500\t0\t71\nchr16\t2693700\t2696400\t0\t85\nchr16\t2747400\t2747700\t0.6396\t37\nchr16\t2801400\t2801700\t0.4483\t85\nchr16\t2833500\t2833800\t0.6986\t57\nchr16\t3072600\t3072900\t0.4505\t12\nchr16\t3081600\t3081900\t0.2463\t34\nchr16\t3197700\t3198000\t0.5644\t24\nchr16\t3886500\t3887100\t0.1546\t83\nchr16\t4344300\t4344600\t0.6516\t32\nchr16\t5061300\t5061600\t0.417\t81\nchr16\t5201700\t5203200\t0.2527\t76\nchr16\t5500200\t5500500\t0.3564\t184\nchr16\t5754300\t5755200\t0.0229\t89\nchr16\t5825700\t5826000\t0.4729\t37\nchr16\t6350400\t6350700\t0.4425\t85\nchr16\t7008600\t7009200\t0.1654\t112\nchr16\t7229700\t7230000\t0.4313\t39\nchr16\t7291800\t7292100\t0.2543\t64\nchr16\t7729200\t7729500\t0.5113\t54\nchr16\t7902900\t7903200\t0.4065\t65\nchr16\t8058000\t8060700\t0\t84\nchr16\t8478900\t8479200\t0.6519\t79\nchr16\t8953500\t8954100\t0.0121\t34\nchr16\t9156600\t9156900\t0.465\t70\nchr16\t9293700\t9294000\t0.3463\t90\nchr16\t9317400\t9317700\t0.3334\t57\nchr16\t9584400\t9590100\t0\t83\nchr16\t9686400\t9687000\t0.1808\t86\nchr16\t9730500\t9731100\t0.4013\t77\nchr16\t10288200\t10288500\t0.2954\t49\nchr16\t10479000\t10479300\t0.2345\t67\nchr16\t11335800\t11336100\t0.5294\t44\nchr16\t11925000\t11926500\t0.318\t78\nchr16\t11927700\t11931600\t0\t97\nchr16\t11934900\t11937000\t0.26\t56\nchr16\t11939400\t11943000\t0.0555\t78\nchr16\t11975100\t11975400\t0.5066\t30\nchr16\t12322800\t12323100\t0.6589\t98\nchr16\t12943200\t12943500\t0.5951\t54\nchr16\t13385400\t13385700\t0.4982\t63\nchr16\t14159700\t14160000\t0.5222\t43\nchr16\t14688000\t14769300\t0\t103\nchr16\t14773200\t14774100\t0\t92\nchr16\t14775300\t14778600\t0\t92\nchr16\t14779800\t14800200\t0\t109\nchr16\t14801400\t14803800\t0\t109\nchr16\t14805600\t14811300\t0.0143\t105\nchr16\t14812500\t14813400\t0.0143\t105\nchr16\t14817900\t14818200\t0.2962\t62\nchr16\t14819400\t14821200\t0\t63\nchr16\t14824200\t14824800\t0.0038\t77\nchr16\t14826300\t14827500\t0.0038\t77\nchr16\t14829000\t14829300\t0.0158\t73\nchr16\t14830800\t14835300\t0.0158\t73\nchr16\t14837700\t14844900\t0.0299\t74\nchr16\t14846400\t14855100\t0\t96\nchr16\t14857200\t14858400\t0.1174\t64\nchr16\t14860800\t14861400\t0.418\t53\nchr16\t14863200\t14873700\t0.01\t84\nchr16\t14875200\t14875500\t0.2009\t83\nchr16\t14877600\t14880300\t0.2009\t83\nchr16\t14881800\t14882400\t0.0151\t50\nchr16\t14886300\t14886600\t0.2703\t47\nchr16\t14887800\t14888100\t0\t94\nchr16\t14889900\t14891100\t0\t94\nchr16\t14895000\t14899500\t0\t94\nchr16\t14901300\t14901600\t0\t94\nchr16\t14903100\t14903400\t0.1044\t55\nchr16\t14905200\t14953200\t0\t149\nchr16\t15002700\t15003000\t0.4102\t72\nchr16\t15091200\t15091500\t0.6494\t67\nchr16\t15101400\t15109200\t0\t108\nchr16\t15110700\t15111000\t0\t108\nchr16\t15112200\t15123900\t0\t108\nchr16\t15125100\t15126600\t0.1321\t78\nchr16\t15133200\t15135000\t0.2843\t68\nchr16\t15138000\t15139800\t0\t84\nchr16\t15150600\t15153900\t0\t67\nchr16\t15155400\t15156000\t0.0143\t69\nchr16\t15165600\t15166800\t0.0558\t84\nchr16\t15168600\t15168900\t0.5356\t85\nchr16\t15171900\t15172200\t0.1888\t75\nchr16\t15173400\t15173700\t0.1888\t75\nchr16\t15176100\t15176400\t0.6022\t59\nchr16\t15178800\t15179700\t0.0101\t61\nchr16\t15183300\t15190500\t0\t81\nchr16\t15193500\t15196200\t0.0007\t79\nchr16\t15197400\t15201900\t0.0007\t79\nchr16\t15204300\t15204600\t0.1854\t74\nchr16\t15207600\t15208800\t0.0287\t62\nchr16\t15210300\t15220800\t0\t82\nchr16\t15222000\t15222300\t0\t82\nchr16\t15223500\t15229200\t0\t82\nchr16\t15230400\t15230700\t0.5561\t73\nchr16\t15233700\t15262200\t0\t95\nchr16\t15263700\t15264000\t0\t95\nchr16\t15266100\t15266700\t0.0344\t74\nchr16\t15268200\t15269100\t0.0344\t74\nchr16\t15271500\t15273900\t0\t88\nchr16\t15276300\t15285600\t0.0339\t77\nchr16\t15289200\t15289500\t0.4726\t63\nchr16\t15294300\t15300300\t0.0208\t83\nchr16\t15305100\t15305700\t0.2025\t55\nchr16\t15308100\t15308700\t0.0206\t86\nchr16\t15309900\t15310500\t0.0206\t86\nchr16\t15314400\t15318300\t0\t81\nchr16\t15319500\t15320700\t0\t81\nchr16\t15323100\t15323700\t0.1913\t92\nchr16\t15324900\t15370200\t0\t103\nchr16\t15372900\t15375000\t0.0568\t78\nchr16\t15378300\t15379200\t0.0139\t87\nchr16\t15380700\t15381300\t0.2781\t59\nchr16\t15655800\t15656100\t0.6273\t57\nchr16\t16172100\t16172400\t0.6086\t116\nchr16\t16213800\t16214100\t0.245\t70\nchr16\t16216200\t16220400\t0.0083\t88\nchr16\t16224000\t16226100\t0\t70\nchr16\t16227900\t16228200\t0.015\t70\nchr16\t16229700\t16233900\t0.015\t70\nchr16\t16238100\t16238400\t0.3283\t34\nchr16\t16239600\t16240200\t0\t117\nchr16\t16241400\t16254000\t0\t117\nchr16\t16255200\t16257600\t0\t117\nchr16\t16259400\t16260300\t0\t117\nchr16\t16261500\t16265100\t0\t117\nchr16\t16266300\t16268100\t0\t117\nchr16\t16269600\t16366500\t0\t117\nchr16\t16367700\t16419000\t0\t117\nchr16\t16421400\t16431300\t0\t91\nchr16\t16432800\t16448400\t0\t91\nchr16\t16450500\t16452300\t0\t85\nchr16\t16453500\t16461600\t0\t85\nchr16\t16464300\t16465200\t0.0063\t61\nchr16\t16470000\t16470300\t0.313\t82\nchr16\t16471500\t16473000\t0.313\t82\nchr16\t16475400\t16479900\t0.0137\t79\nchr16\t16482600\t16492500\t0\t86\nchr16\t16493700\t16534800\t0\t86\nchr16\t16539000\t16539300\t0.4906\t67\nchr16\t16551900\t16552200\t0.3551\t57\nchr16\t16555800\t16556100\t0.0459\t82\nchr16\t16557300\t16557900\t0.0459\t82\nchr16\t16559400\t16560000\t0.0627\t70\nchr16\t16563900\t16567500\t0\t72\nchr16\t16571400\t16572000\t0.3737\t72\nchr16\t16573500\t16573800\t0.3737\t72\nchr16\t16589400\t16590000\t0.005\t70\nchr16\t16592100\t16593000\t0.0203\t65\nchr16\t16594200\t16595400\t0.0716\t68\nchr16\t16598400\t16599900\t0.1468\t67\nchr16\t16602000\t16602300\t0.4784\t50\nchr16\t16604100\t16608600\t0.1116\t74\nchr16\t16610400\t16611600\t0.221\t56\nchr16\t16613100\t16613400\t0\t59\nchr16\t16614600\t16615200\t0\t59\nchr16\t16616400\t16618500\t0\t59\nchr16\t16620600\t16624500\t0.0009\t71\nchr16\t16625700\t16626300\t0.0009\t71\nchr16\t16629300\t16629600\t0.4899\t67\nchr16\t16639500\t16642800\t0\t99\nchr16\t16645800\t16651200\t0\t97\nchr16\t16653300\t16686600\t0\t83\nchr16\t16688100\t16692900\t0\t81\nchr16\t16694100\t16699500\t0\t81\nchr16\t16700700\t16739100\t0\t81\nchr16\t16745400\t16748100\t0.2329\t67\nchr16\t16750200\t16750500\t0.3613\t63\nchr16\t16755000\t16756200\t0.2097\t82\nchr16\t16758000\t16758900\t0.0516\t67\nchr16\t16761900\t16762200\t0.4589\t52\nchr16\t16840500\t16846500\t0\t91\nchr16\t17715600\t17715900\t0.6849\t44\nchr16\t18076500\t18078600\t0.0126\t62\nchr16\t18080100\t18080700\t0.1738\t64\nchr16\t18084600\t18086100\t0.3815\t65\nchr16\t18087600\t18087900\t0.1442\t61\nchr16\t18090600\t18091200\t0.1442\t61\nchr16\t18095100\t18102000\t0\t74\nchr16\t18104100\t18113400\t0.0133\t73\nchr16\t18114600\t18116700\t0.0133\t73\nchr16\t18119700\t18120600\t0\t76\nchr16\t18122100\t18129900\t0\t76\nchr16\t18131100\t18139800\t0\t76\nchr16\t18141600\t18142500\t0\t76\nchr16\t18144900\t18148500\t0\t71\nchr16\t18152400\t18153000\t0.269\t70\nchr16\t18154500\t18155100\t0.0567\t65\nchr16\t18156300\t18157500\t0.0567\t65\nchr16\t18160200\t18160500\t0.4949\t53\nchr16\t18177000\t18194700\t0\t93\nchr16\t18197100\t18197400\t0.3482\t54\nchr16\t18200400\t18200700\t0.4559\t70\nchr16\t18202200\t18202800\t0.3126\t72\nchr16\t18204600\t18207300\t0.0972\t76\nchr16\t18218400\t18218700\t0.0183\t72\nchr16\t18220800\t18226200\t0.0183\t72\nchr16\t18228300\t18229800\t0\t78\nchr16\t18232200\t18234900\t0\t78\nchr16\t18236100\t18240600\t0\t78\nchr16\t18245100\t18245400\t0\t78\nchr16\t18246600\t18247500\t0\t78\nchr16\t18250200\t18255000\t0\t78\nchr16\t18256500\t18305400\t0\t156\nchr16\t18306600\t18436200\t0\t156\nchr16\t18486600\t18525000\t0\t87\nchr16\t18527400\t18528000\t0\t87\nchr16\t18529500\t18533100\t0.0485\t95\nchr16\t18534300\t18535200\t0.0133\t83\nchr16\t18537600\t18538200\t0.0257\t87\nchr16\t18540000\t18543300\t0.0257\t87\nchr16\t18545400\t18547500\t0\t87\nchr16\t18548700\t18550200\t0\t87\nchr16\t18551400\t18552600\t0\t87\nchr16\t18553800\t18556200\t0.0142\t90\nchr16\t18558000\t18558600\t0.0142\t90\nchr16\t18562800\t18563100\t0.4866\t47\nchr16\t18566400\t18566700\t0.2005\t64\nchr16\t18570300\t18571500\t0.2583\t69\nchr16\t18580500\t18580800\t0.4786\t64\nchr16\t18597000\t18597300\t0.44\t41\nchr16\t18600300\t18601500\t0.1043\t57\nchr16\t18603000\t18604200\t0.1615\t70\nchr16\t18608700\t18609000\t0.392\t67\nchr16\t18611100\t18613500\t0.1275\t86\nchr16\t18621300\t18658500\t0\t86\nchr16\t18659700\t18665100\t0\t93\nchr16\t18666300\t18670800\t0\t82\nchr16\t18672600\t18695100\t0\t96\nchr16\t18696600\t18706200\t0\t96\nchr16\t18707400\t18714300\t0\t96\nchr16\t18716100\t18719700\t0\t74\nchr16\t18720900\t18724500\t0.034\t50\nchr16\t18726000\t18729600\t0\t60\nchr16\t18731700\t18732900\t0.2128\t85\nchr16\t18736500\t18737100\t0.108\t88\nchr16\t18738600\t18738900\t0.2946\t74\nchr16\t18740100\t18740700\t0.081\t60\nchr16\t18742200\t18742800\t0.2219\t63\nchr16\t18744900\t18746400\t0.2922\t88\nchr16\t18748500\t18749400\t0.3415\t95\nchr16\t18753900\t18755400\t0.2918\t92\nchr16\t18758100\t18759300\t0.3025\t78\nchr16\t18760800\t18761400\t0.0162\t57\nchr16\t18763800\t18764400\t0.0162\t57\nchr16\t18778500\t18778800\t0.3694\t49\nchr16\t18780000\t18780300\t0.2693\t71\nchr16\t18781800\t18782400\t0.2693\t71\nchr16\t18821100\t18827100\t0\t68\nchr16\t18889200\t18889800\t0.189\t59\nchr16\t19003500\t19004100\t0.0875\t69\nchr16\t19219200\t19219500\t0.2792\t28\nchr16\t19786800\t19802700\t0\t51\nchr16\t20185500\t20186400\t0.0047\t89\nchr16\t20442900\t20451600\t0\t71\nchr16\t20456100\t20456400\t0.2488\t53\nchr16\t20481600\t20481900\t0.2823\t35\nchr16\t20484300\t20484600\t0.1726\t53\nchr16\t20490000\t20501400\t0\t83\nchr16\t20522400\t20533500\t0\t80\nchr16\t20539200\t20539500\t0.0782\t66\nchr16\t20566800\t20567100\t0.3281\t18\nchr16\t20571600\t20571900\t0.3826\t60\nchr16\t20576400\t20585100\t0\t82\nchr16\t20757600\t20757900\t0.2979\t79\nchr16\t20767200\t20767500\t0.2226\t40\nchr16\t20858700\t20859000\t0.219\t49\nchr16\t21043200\t21048000\t0.0282\t79\nchr16\t21351300\t21351600\t0.2069\t49\nchr16\t21353400\t21354000\t0.3279\t86\nchr16\t21378000\t21378300\t0.4562\t60\nchr16\t21379500\t21379800\t0\t115\nchr16\t21381000\t21387900\t0\t115\nchr16\t21389100\t21501300\t0\t115\nchr16\t21534900\t21536100\t0.394\t89\nchr16\t21551400\t21551700\t0.4125\t87\nchr16\t21730800\t21731100\t0.4879\t51\nchr16\t21732900\t21734400\t0.0122\t75\nchr16\t21737400\t21757500\t0\t113\nchr16\t21760800\t21762900\t0\t75\nchr16\t21765300\t21766500\t0.0241\t74\nchr16\t21768600\t21771300\t0.0157\t75\nchr16\t21774000\t21774300\t0.3734\t76\nchr16\t21775800\t21801300\t0\t103\nchr16\t21817500\t21817800\t0.3422\t54\nchr16\t21831300\t21884700\t0\t125\nchr16\t21886800\t21890700\t0\t92\nchr16\t21892200\t21933300\t0\t92\nchr16\t22432800\t22435200\t0\t77\nchr16\t22437900\t22539600\t0\t131\nchr16\t22542000\t22542600\t0.1674\t80\nchr16\t22548900\t22549500\t0.2755\t89\nchr16\t22553100\t22573800\t0\t106\nchr16\t22577100\t22578900\t0\t90\nchr16\t22581600\t22582800\t0.2398\t96\nchr16\t22584600\t22587300\t0.0111\t100\nchr16\t22590300\t22590600\t0.5504\t78\nchr16\t22592700\t22599300\t0\t100\nchr16\t22600500\t22613400\t0\t100\nchr16\t22657500\t22657800\t0.1955\t69\nchr16\t22700100\t22700700\t0.055\t59\nchr16\t22818900\t22819200\t0.6372\t18\nchr16\t23517300\t23517600\t0.3684\t35\nchr16\t23599800\t23600100\t0.112\t73\nchr16\t23981700\t23982300\t0.4871\t20\nchr16\t24108300\t24110100\t0.2024\t81\nchr16\t25294500\t25294800\t0.4639\t35\nchr16\t25337100\t25337700\t0.1374\t58\nchr16\t26376900\t26377200\t0.6936\t36\nchr16\t26811600\t26812500\t0.021\t32\nchr16\t27138900\t27139500\t0.3336\t242\nchr16\t27306300\t27306600\t0.5624\t56\nchr16\t27656700\t27657000\t0.4971\t60\nchr16\t28089000\t28089300\t0.6796\t22\nchr16\t28332900\t28334700\t0.0656\t64\nchr16\t28339500\t28376100\t0\t110\nchr16\t28377600\t28471800\t0\t110\nchr16\t28598700\t28601100\t0\t71\nchr16\t28611600\t28615500\t0\t85\nchr16\t28631400\t28631700\t0.2348\t43\nchr16\t28637100\t28637400\t0.1802\t70\nchr16\t28641600\t28641900\t0.1803\t101\nchr16\t28643100\t28737900\t0\t140\nchr16\t28739100\t28809300\t0\t140\nchr16\t29036700\t29066700\t0\t126\nchr16\t29067900\t29068800\t0\t126\nchr16\t29070600\t29071200\t0\t126\nchr16\t29078400\t29078700\t0.408\t59\nchr16\t29082000\t29082300\t0.5956\t66\nchr16\t29087400\t29087700\t0.4544\t54\nchr16\t29097900\t29098200\t0.3524\t50\nchr16\t29104500\t29104800\t0.426\t64\nchr16\t29210100\t29210700\t0.5253\t69\nchr16\t29279400\t29279700\t0.5331\t56\nchr16\t29298600\t29298900\t0.6785\t38\nchr16\t29330400\t29330700\t0.3302\t45\nchr16\t29332500\t29333100\t0.0055\t75\nchr16\t29354400\t29354700\t0.4891\t56\nchr16\t29358600\t29367000\t0\t101\nchr16\t29368200\t29388900\t0\t101\nchr16\t29390100\t29391600\t0.2879\t84\nchr16\t29392800\t29393100\t0.2879\t84\nchr16\t29394900\t29395500\t0.0283\t86\nchr16\t29396700\t29400600\t0.0283\t86\nchr16\t29402100\t29405100\t0.1263\t92\nchr16\t29412000\t29412300\t0.193\t63\nchr16\t29415000\t29417700\t0.1915\t79\nchr16\t29418900\t29419200\t0.1915\t79\nchr16\t29430900\t29556000\t0\t148\nchr16\t29557500\t29568600\t0\t72\nchr16\t29586900\t29587200\t0.1923\t56\nchr16\t29594100\t29594400\t0.5295\t60\nchr16\t29615400\t29615700\t0.3835\t62\nchr16\t29616900\t29617200\t0.3937\t52\nchr16\t29621100\t29622900\t0.3131\t74\nchr16\t29630100\t29630400\t0.3111\t71\nchr16\t29637300\t29637600\t0.2908\t84\nchr16\t30170400\t30170700\t0.3482\t61\nchr16\t30188700\t30276300\t0\t148\nchr16\t30277500\t30282300\t0\t148\nchr16\t30283500\t30295500\t0\t148\nchr16\t30297300\t30297600\t0\t148\nchr16\t30298800\t30308400\t0\t70\nchr16\t30325800\t30327300\t0.3239\t53\nchr16\t30799200\t30799500\t0.5973\t35\nchr16\t31103700\t31105200\t0\t149\nchr16\t31308900\t31309500\t0.0376\t59\nchr16\t31340100\t31341000\t0.0006\t57\nchr16\t31596000\t31596600\t0.013\t65\nchr16\t31759800\t31760700\t0\t59\nchr16\t31950000\t31950300\t0.1682\t72\nchr16\t31953900\t31954200\t0.1682\t72\nchr16\t31955700\t31956300\t0.1682\t72\nchr16\t31958100\t31959600\t0.1949\t69\nchr16\t31960800\t31961700\t0.1728\t79\nchr16\t31964400\t31965000\t0.0202\t54\nchr16\t31966800\t31967100\t0.4976\t37\nchr16\t31968600\t31968900\t0\t80\nchr16\t31970100\t31971000\t0\t80\nchr16\t31972200\t31974300\t0\t80\nchr16\t31977600\t31978200\t0.1481\t68\nchr16\t31987800\t31990500\t0.1739\t70\nchr16\t31992900\t31993200\t0.1992\t72\nchr16\t31995600\t31996800\t0.1992\t72\nchr16\t31998000\t31998300\t0.1992\t72\nchr16\t32014200\t32014800\t0.2459\t53\nchr16\t32017800\t32018400\t0.0647\t61\nchr16\t32023200\t32024400\t0.116\t77\nchr16\t32028600\t32065500\t0\t245\nchr16\t32066700\t32096400\t0\t245\nchr16\t32097600\t32113500\t0.0218\t197\nchr16\t32114700\t32115600\t0.0218\t197\nchr16\t32117100\t32117700\t0.3326\t96\nchr16\t32122500\t32122800\t0.299\t122\nchr16\t32124900\t32125800\t0.299\t122\nchr16\t32127900\t32128200\t0.6848\t85\nchr16\t32130600\t32134500\t0\t98\nchr16\t32135700\t32208900\t0\t98\nchr16\t32210700\t32254200\t0\t95\nchr16\t32255400\t32261400\t0\t95\nchr16\t32264100\t32269200\t0\t90\nchr16\t32270400\t32283900\t0\t90\nchr16\t32285400\t32285700\t0.5401\t318\nchr16\t32286900\t32382000\t0\t107\nchr16\t32386200\t32386500\t0.5333\t57\nchr16\t32389500\t32391300\t0.4513\t55\nchr16\t32395500\t32398800\t0\t69\nchr16\t32411700\t32412000\t0.6722\t55\nchr16\t32413500\t32414700\t0.1102\t98\nchr16\t32416800\t32417400\t0.2561\t117\nchr16\t32420700\t32421300\t0.2212\t97\nchr16\t32423700\t32426700\t0.1355\t94\nchr16\t32429100\t32443800\t0\t87\nchr16\t32450400\t32451300\t0.4052\t121\nchr16\t32452500\t32452800\t0.4052\t121\nchr16\t32455200\t32455500\t0.0862\t104\nchr16\t32457000\t32458500\t0.0862\t104\nchr16\t32459700\t32460000\t0.0862\t104\nchr16\t32464800\t32468100\t0\t86\nchr16\t32470800\t32472000\t0.253\t71\nchr16\t32473500\t32477700\t0.0023\t140\nchr16\t32478900\t32483700\t0.0023\t140\nchr16\t32487600\t32489700\t0\t74\nchr16\t32493300\t32493600\t0.6778\t73\nchr16\t32495100\t32495400\t0.5262\t47\nchr16\t32496900\t32498400\t0.2436\t63\nchr16\t32499600\t32503500\t0\t65\nchr16\t32505300\t32506800\t0\t58\nchr16\t32508000\t32511600\t0\t58\nchr16\t32516400\t32516700\t0.4575\t58\nchr16\t32520900\t32542800\t0\t78\nchr16\t32544000\t32549700\t0\t78\nchr16\t32551200\t32552100\t0\t78\nchr16\t32553300\t32567400\t0\t77\nchr16\t32568600\t32572500\t0\t77\nchr16\t32574000\t32575800\t0\t77\nchr16\t32577000\t32586600\t0\t94\nchr16\t32587800\t32606400\t0\t94\nchr16\t32607600\t32620500\t0\t94\nchr16\t32623200\t32624100\t0\t73\nchr16\t32628000\t32630100\t0.157\t87\nchr16\t32631900\t32632200\t0.291\t61\nchr16\t32634300\t32643900\t0\t79\nchr16\t32646000\t32811300\t0\t272\nchr16\t32812500\t32812800\t0\t272\nchr16\t32814600\t32815800\t0.2898\t98\nchr16\t32818200\t32825400\t0\t172\nchr16\t32826600\t32828100\t0.0432\t133\nchr16\t32829300\t32830200\t0.0432\t133\nchr16\t32832900\t32841900\t0\t227\nchr16\t32843400\t32844900\t0\t227\nchr16\t32846700\t32877300\t0\t119\nchr16\t32878500\t32879100\t0\t119\nchr16\t32880300\t32887800\t0\t119\nchr16\t32889000\t32889900\t0\t119\nchr16\t32895000\t32895300\t0.3982\t90\nchr16\t32898600\t32898900\t0.3281\t63\nchr16\t32902200\t32903400\t0.3283\t92\nchr16\t32906100\t32906400\t0.2679\t79\nchr16\t32908800\t32909100\t0.3171\t89\nchr16\t32912100\t32912700\t0.3171\t89\nchr16\t32914200\t32914500\t0.3171\t89\nchr16\t32920800\t32921700\t0.0811\t97\nchr16\t32924100\t32928000\t0\t105\nchr16\t32929800\t32930100\t0\t105\nchr16\t32931300\t32931600\t0\t105\nchr16\t32936400\t32937300\t0.0262\t91\nchr16\t32939400\t32940300\t0.0262\t91\nchr16\t32949000\t32949300\t0.28\t68\nchr16\t32950500\t32988900\t0\t131\nchr16\t32991600\t32992200\t0\t131\nchr16\t32994000\t33014700\t0\t131\nchr16\t33017400\t33020100\t0\t131\nchr16\t33021300\t33028200\t0\t131\nchr16\t33029400\t33039600\t0\t350\nchr16\t33041400\t33059100\t0.092\t157\nchr16\t33060300\t33060900\t0.092\t157\nchr16\t33065400\t33214500\t0\t169\nchr16\t33264600\t33392400\t0\t1112\nchr16\t33442500\t33516300\t0\t111\nchr16\t33517800\t33609300\t0\t99\nchr16\t33614700\t33615000\t0.4051\t66\nchr16\t33619500\t33620100\t0.0137\t68\nchr16\t33624000\t33624300\t0.3382\t47\nchr16\t33625800\t33626100\t0.1764\t66\nchr16\t33636300\t33636900\t0.2117\t40\nchr16\t33639300\t33639600\t0.6251\t56\nchr16\t33645000\t33645600\t0.0102\t55\nchr16\t33648600\t33660300\t0\t61\nchr16\t33662700\t33664200\t0.3369\t50\nchr16\t33666600\t33667200\t0.3617\t48\nchr16\t33668700\t33669300\t0.3448\t56\nchr16\t33682500\t33682800\t0.5633\t68\nchr16\t33684000\t33684300\t0.3922\t44\nchr16\t33687600\t33688500\t0.1271\t59\nchr16\t33690600\t33692100\t0.0383\t70\nchr16\t33698700\t33699300\t0.0307\t53\nchr16\t33704700\t33705600\t0.1372\t52\nchr16\t33708600\t33708900\t0.3066\t46\nchr16\t33716400\t33718500\t0.2753\t85\nchr16\t33727500\t33736500\t0.004\t217\nchr16\t33739500\t33741300\t0.004\t217\nchr16\t33744000\t33747000\t0.294\t139\nchr16\t33750000\t33751800\t0.2846\t51\nchr16\t33755100\t33755400\t0.2879\t49\nchr16\t33757500\t33764400\t0\t42\nchr16\t33766500\t33768300\t0.076\t45\nchr16\t33778200\t33821400\t0\t66\nchr16\t33822600\t33827100\t0\t66\nchr16\t33828600\t33836700\t0\t111\nchr16\t33838200\t33840900\t0\t111\nchr16\t33843000\t33846000\t0.1581\t69\nchr16\t33847200\t33848400\t0.1581\t69\nchr16\t33849900\t33851400\t0.1581\t69\nchr16\t33852600\t33854100\t0.1581\t69\nchr16\t33855900\t33857700\t0.0029\t77\nchr16\t33859800\t33862200\t0.3496\t76\nchr16\t33864300\t33864600\t0\t99\nchr16\t33865800\t33905100\t0\t99\nchr16\t33907200\t33909600\t0.0507\t52\nchr16\t33912000\t33912300\t0.4568\t56\nchr16\t33914100\t33917700\t0.1034\t73\nchr16\t33920400\t33922500\t0.1406\t70\nchr16\t33923700\t33931500\t0\t90\nchr16\t33933900\t33935700\t0.1171\t62\nchr16\t33936900\t33937200\t0.4839\t56\nchr16\t33939300\t33959700\t0\t111\nchr16\t33961200\t33969600\t0\t111\nchr16\t33971400\t33991800\t0\t100\nchr16\t33996300\t34013100\t0\t98\nchr16\t34062000\t34068000\t0.0047\t2127\nchr16\t34071300\t34073700\t0.0061\t2637\nchr16\t34085100\t34086300\t0.2121\t3841\nchr16\t34096200\t34100100\t0.1597\t2317\nchr16\t34123200\t34123500\t0.6671\t43\nchr16\t34185900\t34189200\t0\t79\nchr16\t34195500\t34195800\t0.6153\t188\nchr16\t34201200\t34201800\t0.6158\t234\nchr16\t34205100\t34205400\t0.6571\t296\nchr16\t34210800\t34211100\t0.5381\t175\nchr16\t34215900\t34216200\t0.2937\t91\nchr16\t34241400\t34241700\t0.2223\t47\nchr16\t34261500\t34261800\t0.4492\t31\nchr16\t34267800\t34268400\t0.1283\t72\nchr16\t34270800\t34271100\t0.1963\t32\nchr16\t34273800\t34274700\t0\t171\nchr16\t34275900\t34277400\t0\t171\nchr16\t34278600\t34281600\t0\t116\nchr16\t34282800\t34289400\t0\t116\nchr16\t34339500\t34494300\t0\t400\nchr16\t34495500\t34506600\t0\t400\nchr16\t34507800\t34517100\t0\t400\nchr16\t34518600\t34521300\t0\t46\nchr16\t34572300\t34576800\t0.0918\t14136\nchr16\t34580700\t34584000\t0.0943\t23468\nchr16\t34586400\t34586700\t0.0383\t6369\nchr16\t34588500\t34590600\t0.0383\t6369\nchr16\t34592400\t34596300\t0.2103\t14692\nchr16\t34661100\t34661400\t0.6402\t110\nchr16\t34744800\t34746600\t0\t64\nchr16\t34752600\t34752900\t0.582\t106\nchr16\t34806000\t34806300\t0.5639\t114\nchr16\t34821600\t34821900\t0.6928\t61\nchr16\t34827300\t34830000\t0.0668\t61\nchr16\t34831200\t34831800\t0\t64\nchr16\t34833000\t34840800\t0\t64\nchr16\t34842000\t34852800\t0\t64\nchr16\t34854300\t34896900\t0\t389\nchr16\t34902300\t34902600\t0.1957\t1295\nchr16\t34911300\t34913100\t0\t53\nchr16\t34960200\t35072400\t0\t57\nchr16\t35080200\t35080500\t0.439\t94\nchr16\t35098800\t35099100\t0.4443\t72\nchr16\t35116800\t35117100\t0.4133\t62\nchr16\t35164200\t35164500\t0.5423\t29\nchr16\t35327700\t35328000\t0.6254\t63\nchr16\t35470800\t35471100\t0.6789\t54\nchr16\t35592900\t35593200\t0.4504\t43\nchr16\t35608800\t35613900\t0\t76\nchr16\t35804100\t35804700\t0.0053\t64\nchr16\t35806500\t35807100\t0.1439\t54\nchr16\t35829000\t35829600\t0.3012\t69\nchr16\t35945400\t35946000\t0.0206\t56\nchr16\t35957100\t35958000\t0.006\t70\nchr16\t35995500\t35995800\t0.6736\t136\nchr16\t35997600\t35997900\t0.6935\t113\nchr16\t36001200\t36001500\t0.6761\t99\nchr16\t36009300\t36010200\t0\t72\nchr16\t36011400\t36012900\t0\t124\nchr16\t36016500\t36017700\t0\t108\nchr16\t36019200\t36019800\t0\t108\nchr16\t36031800\t36032100\t0.6463\t101\nchr16\t36041100\t36041400\t0.6079\t147\nchr16\t36055800\t36056100\t0.6989\t115\nchr16\t36057600\t36057900\t0.5772\t121\nchr16\t36070800\t36071100\t0.5295\t176\nchr16\t36072900\t36073200\t0.3062\t104\nchr16\t36075300\t36075900\t0.3062\t104\nchr16\t36084900\t36085200\t0.5251\t154\nchr16\t36093600\t36093900\t0.6571\t114\nchr16\t36099300\t36099600\t0.5993\t91\nchr16\t36101400\t36101700\t0.6851\t142\nchr16\t36103800\t36105600\t0.6415\t350\nchr16\t36106800\t36107400\t0.4228\t144\nchr16\t36110700\t36111000\t0.6834\t124\nchr16\t36114300\t36114600\t0.5604\t106\nchr16\t36118800\t36119100\t0.6595\t228\nchr16\t36121200\t36121500\t0.6803\t64\nchr16\t36193200\t36193500\t0.5259\t192\nchr16\t36237900\t36238200\t0.6048\t122\nchr16\t36246300\t36249000\t0\t67\nchr16\t36260700\t36261000\t0\t33\nchr16\t36311700\t36313200\t0.1557\t147\nchr16\t36314700\t36321300\t0\t156\nchr16\t36322800\t36325200\t0\t156\nchr16\t36327300\t36333900\t0\t146\nchr16\t36337500\t36747600\t0\t783\nchr16\t36749100\t36993900\t0\t475\nchr16\t36995100\t37725300\t0\t475\nchr16\t37726500\t38109900\t0\t475\nchr16\t38111100\t38268300\t0\t195\nchr16\t38275800\t38276700\t0\t88\nchr16\t38278800\t38279100\t0\t88\nchr16\t46381200\t46389600\t0.0077\t13098\nchr16\t46392000\t46395300\t0.2036\t28465\nchr16\t46397100\t46401600\t0.0285\t28741\nchr16\t46421700\t46422000\t0.6263\t165\nchr16\t46446000\t46446300\t0.4325\t106\nchr16\t46450200\t46451700\t0.2637\t91\nchr16\t46458300\t46459500\t0.3999\t113\nchr16\t46537500\t46537800\t0.362\t63\nchr16\t46539900\t46541400\t0.3488\t68\nchr16\t46623600\t46626300\t0.0124\t94\nchr16\t46693800\t46694400\t0.0533\t61\nchr16\t46999800\t47000100\t0.42\t77\nchr16\t47223000\t47223300\t0.309\t62\nchr16\t47645100\t47646300\t0.0435\t60\nchr16\t47864700\t47865300\t0.1111\t81\nchr16\t48015600\t48015900\t0.0438\t90\nchr16\t48017100\t48020400\t0.0438\t90\nchr16\t48466200\t48466500\t0.6744\t30\nchr16\t48768600\t48774000\t0.0103\t110\nchr16\t48783000\t48783300\t0.5166\t43\nchr16\t48917400\t48918000\t0.059\t31\nchr16\t48951300\t48951600\t0.4922\t59\nchr16\t49135800\t49136700\t0.1108\t80\nchr16\t49381500\t49381800\t0.4892\t53\nchr16\t49945500\t49945800\t0.0069\t29\nchr16\t50442600\t50442900\t0.3549\t113\nchr16\t50928600\t50928900\t0.373\t47\nchr16\t51014100\t51015000\t0.2881\t83\nchr16\t51373500\t51374100\t0.2933\t93\nchr16\t52174800\t52175400\t0.0968\t92\nchr16\t52248900\t52249500\t0.3967\t25\nchr16\t52380900\t52381200\t0.509\t54\nchr16\t53400000\t53400300\t0.2773\t97\nchr16\t53401500\t53402700\t0.2773\t97\nchr16\t54042300\t54048000\t0\t81\nchr16\t54420300\t54420600\t0.6574\t58\nchr16\t54567300\t54567600\t0.5906\t57\nchr16\t55170600\t55170900\t0.018\t212\nchr16\t55602000\t55602300\t0.4379\t72\nchr16\t55761900\t55762200\t0.0262\t76\nchr16\t55770000\t55770300\t0.5999\t24\nchr16\t55773300\t55773900\t0.3208\t68\nchr16\t55788600\t55808400\t0\t84\nchr16\t55818600\t55818900\t0.4889\t62\nchr16\t55820100\t55820400\t0.3402\t69\nchr16\t56157600\t56158800\t0.4763\t72\nchr16\t56739000\t56740500\t0.1617\t86\nchr16\t57200100\t57200400\t0.2877\t94\nchr16\t57218700\t57219000\t0.3557\t53\nchr16\t58119900\t58120200\t0.5975\t84\nchr16\t58816200\t58816500\t0.4258\t61\nchr16\t58839300\t58839600\t0.328\t42\nchr16\t58978800\t58979100\t0.3777\t58\nchr16\t58993800\t58994100\t0.0966\t49\nchr16\t59100900\t59101200\t0.5565\t29\nchr16\t59278500\t59279100\t0.3748\t66\nchr16\t59289900\t59290200\t0.5425\t51\nchr16\t59559600\t59560800\t0.0027\t103\nchr16\t59562300\t59564400\t0.0027\t103\nchr16\t59680800\t59681100\t0.1894\t72\nchr16\t59977800\t59982600\t0.0476\t73\nchr16\t59998200\t59998500\t0.021\t24\nchr16\t60196200\t60197700\t0.0701\t74\nchr16\t60456900\t60457200\t0.5258\t28\nchr16\t60524100\t60525300\t0.0116\t86\nchr16\t60526500\t60528600\t0.0116\t86\nchr16\t60876300\t60879900\t0\t79\nchr16\t61461900\t61462200\t0.5061\t73\nchr16\t61511700\t61512000\t0.391\t30\nchr16\t61782900\t61787700\t0\t81\nchr16\t61802100\t61807200\t0\t79\nchr16\t61920000\t61921200\t0.149\t76\nchr16\t62013000\t62013300\t0.2312\t44\nchr16\t62489400\t62489700\t0.3192\t61\nchr16\t62983800\t62984400\t0.5907\t61\nchr16\t62994000\t62994300\t0.4611\t51\nchr16\t63123300\t63123600\t0.3695\t92\nchr16\t63125100\t63125400\t0.3695\t92\nchr16\t63149400\t63150000\t0.1537\t66\nchr16\t63151800\t63152100\t0.1537\t66\nchr16\t63274500\t63274800\t0.47\t60\nchr16\t63389100\t63393900\t0.0196\t79\nchr16\t63408600\t63408900\t0.6171\t28\nchr16\t63693300\t63693600\t0.4356\t39\nchr16\t64631700\t64632300\t0.361\t79\nchr16\t65129400\t65129700\t0.1243\t15\nchr16\t65237100\t65240100\t0.1906\t63\nchr16\t65359500\t65362200\t0.1462\t77\nchr16\t65465400\t65465700\t0.5909\t50\nchr16\t65486100\t65486400\t0.5126\t42\nchr16\t65556300\t65556600\t0.3823\t82\nchr16\t65690100\t65695800\t0\t86\nchr16\t66379800\t66380100\t0.6412\t39\nchr16\t66760500\t66760800\t0.5245\t48\nchr16\t66789300\t66789600\t0.2214\t28\nchr16\t67479900\t67480200\t0.5491\t31\nchr16\t67712400\t67713000\t0.0656\t87\nchr16\t68583600\t68589300\t0\t110\nchr16\t69246300\t69246900\t0.4993\t57\nchr16\t69665400\t69666300\t0.1256\t74\nchr16\t69943800\t69944100\t0.4098\t65\nchr16\t69946200\t69954300\t0.0238\t87\nchr16\t69956400\t69964200\t0\t91\nchr16\t69965700\t69966000\t0\t91\nchr16\t69967500\t69969300\t0\t111\nchr16\t69971100\t69971700\t0\t111\nchr16\t69973200\t69975900\t0\t111\nchr16\t69989100\t69989700\t0.4201\t65\nchr16\t69995700\t69996900\t0.4167\t88\nchr16\t70037700\t70038000\t0.384\t45\nchr16\t70050600\t70052700\t0.1102\t93\nchr16\t70084500\t70084800\t0.3383\t60\nchr16\t70091400\t70091700\t0.3483\t66\nchr16\t70106100\t70106400\t0.2335\t55\nchr16\t70109400\t70109700\t0.5399\t47\nchr16\t70113600\t70113900\t0.4663\t65\nchr16\t70119300\t70119600\t0.3488\t81\nchr16\t70144200\t70144500\t0.2539\t96\nchr16\t70145700\t70147500\t0.1116\t108\nchr16\t70166700\t70168500\t0.13\t114\nchr16\t70170900\t70194300\t0\t158\nchr16\t70200600\t70201200\t0.0037\t96\nchr16\t70202400\t70202700\t0.0037\t96\nchr16\t70205400\t70206000\t0.1685\t54\nchr16\t70210500\t70210800\t0.3068\t77\nchr16\t70224300\t70224600\t0.4376\t68\nchr16\t70243800\t70244400\t0.3614\t64\nchr16\t70617600\t70617900\t0.6165\t53\nchr16\t70811700\t70812300\t0.0825\t51\nchr16\t70814100\t70817100\t0.0186\t68\nchr16\t70818600\t70820700\t0.0186\t68\nchr16\t70822800\t70824000\t0.0033\t61\nchr16\t70825200\t70833900\t0.0016\t73\nchr16\t70838700\t70840200\t0.1608\t67\nchr16\t70842900\t70850100\t0.0338\t78\nchr16\t70851900\t70854900\t0.0376\t95\nchr16\t70856100\t70858800\t0.0376\t95\nchr16\t70860300\t70863000\t0.0457\t63\nchr16\t70864200\t70864800\t0.2287\t41\nchr16\t70867500\t70870500\t0.0006\t82\nchr16\t70871700\t70881600\t0.0006\t82\nchr16\t70883100\t70885500\t0.0006\t82\nchr16\t70889100\t70889700\t0.0154\t63\nchr16\t70891500\t70892100\t0.0154\t63\nchr16\t70894500\t70895400\t0\t80\nchr16\t70896900\t70897200\t0\t80\nchr16\t70899300\t70901100\t0\t80\nchr16\t70903200\t70904400\t0\t80\nchr16\t70907100\t70907700\t0.0068\t71\nchr16\t70910400\t70915800\t0.0068\t71\nchr16\t70917300\t70920300\t0.0068\t71\nchr16\t70923000\t70929900\t0.0026\t68\nchr16\t70935000\t70936500\t0.0007\t76\nchr16\t70939800\t70941300\t0.1698\t66\nchr16\t70946100\t70950300\t0.2421\t81\nchr16\t70951800\t70954500\t0.0037\t70\nchr16\t70957500\t70959600\t0.1487\t75\nchr16\t70962600\t70963800\t0.0461\t68\nchr16\t70966200\t70966500\t0.0524\t65\nchr16\t70968000\t70968600\t0.0524\t65\nchr16\t70969800\t70970400\t0.0648\t74\nchr16\t70972200\t70977600\t0.0648\t74\nchr16\t70980000\t70980300\t0.4783\t62\nchr16\t70983000\t70983600\t0.0851\t50\nchr16\t70986000\t70988700\t0\t78\nchr16\t70993500\t70998600\t0.1278\t78\nchr16\t71001000\t71001600\t0.1278\t78\nchr16\t71005800\t71006400\t0.3242\t67\nchr16\t71007900\t71010300\t0.0678\t90\nchr16\t71013000\t71019300\t0.0786\t72\nchr16\t71023500\t71025900\t0.0075\t76\nchr16\t71027700\t71028000\t0.1939\t57\nchr16\t71029200\t71029800\t0.1939\t57\nchr16\t71032500\t71033100\t0.1181\t73\nchr16\t71034900\t71036700\t0.0631\t69\nchr16\t71040300\t71041200\t0.0059\t64\nchr16\t71044200\t71046300\t0.0059\t64\nchr16\t71049600\t71051100\t0.3221\t57\nchr16\t71052600\t71052900\t0.5706\t47\nchr16\t71054700\t71055600\t0.3648\t61\nchr16\t71056800\t71058600\t0.0426\t76\nchr16\t71060400\t71061900\t0.3227\t66\nchr16\t71064000\t71064300\t0.442\t34\nchr16\t71070600\t71072400\t0.2527\t71\nchr16\t71074800\t71075100\t0.0403\t66\nchr16\t71076300\t71080500\t0.0403\t66\nchr16\t71083500\t71085600\t0\t76\nchr16\t71086800\t71093700\t0\t76\nchr16\t71094900\t71096100\t0.0056\t74\nchr16\t71098800\t71099700\t0.0056\t74\nchr16\t71100900\t71101500\t0.0056\t74\nchr16\t71103000\t71107200\t0.0079\t69\nchr16\t71108700\t71113500\t0.0408\t69\nchr16\t71114700\t71115000\t0.0408\t69\nchr16\t71117100\t71125200\t0.0763\t76\nchr16\t71127300\t71127600\t0.0188\t81\nchr16\t71128800\t71129400\t0.0188\t81\nchr16\t71130900\t71132700\t0.0188\t81\nchr16\t71135400\t71138700\t0.3453\t63\nchr16\t71139900\t71140800\t0\t75\nchr16\t71142300\t71144400\t0\t75\nchr16\t71146500\t71150100\t0\t75\nchr16\t71154000\t71156100\t0.0723\t63\nchr16\t71157600\t71161200\t0\t70\nchr16\t71164200\t71168700\t0\t70\nchr16\t71589600\t71590200\t0.1493\t79\nchr16\t71602800\t71604300\t0\t75\nchr16\t72056400\t72058800\t0.0061\t72\nchr16\t72060900\t72061500\t0.3913\t77\nchr16\t72077100\t72077400\t0.1899\t48\nchr16\t72342600\t72343200\t0.1431\t83\nchr16\t72344400\t72345000\t0.1431\t83\nchr16\t72497100\t72497400\t0.3713\t63\nchr16\t72525600\t72525900\t0.486\t71\nchr16\t72570600\t72571200\t0.2805\t73\nchr16\t72584100\t72585900\t0.015\t98\nchr16\t72627900\t72633000\t0.028\t80\nchr16\t73147500\t73147800\t0.3703\t39\nchr16\t73824600\t73830300\t0\t80\nchr16\t74333700\t74337000\t0.0882\t88\nchr16\t74361600\t74361900\t0.4862\t119\nchr16\t74376000\t74377200\t0.2978\t96\nchr16\t74381700\t74388000\t0.0194\t116\nchr16\t74389500\t74391000\t0.0194\t116\nchr16\t74392500\t74394000\t0.4006\t119\nchr16\t74399400\t74399700\t0.3076\t62\nchr16\t74402700\t74403300\t0\t166\nchr16\t74404500\t74406600\t0\t166\nchr16\t74407800\t74410200\t0\t166\nchr16\t74411700\t74412300\t0.4099\t176\nchr16\t74414400\t74423400\t0.0416\t132\nchr16\t74427600\t74428800\t0.196\t91\nchr16\t74444400\t74444700\t0.5621\t63\nchr16\t74526300\t74526600\t0.3232\t56\nchr16\t74538000\t74538300\t0.6081\t56\nchr16\t74799300\t74800200\t0.0101\t91\nchr16\t75204600\t75206100\t0.0006\t71\nchr16\t75222900\t75224100\t0.0292\t67\nchr16\t75504900\t75505200\t0.0606\t81\nchr16\t75545400\t75546000\t0.1318\t64\nchr16\t75822000\t75825000\t0.0041\t80\nchr16\t75826800\t75827400\t0.2205\t88\nchr16\t75874500\t75876000\t0.3755\t59\nchr16\t75881700\t75882000\t0.5732\t50\nchr16\t76610700\t76611300\t0.051\t77\nchr16\t76757400\t76758300\t0.0543\t89\nchr16\t76952700\t76953000\t0.5937\t65\nchr16\t78651900\t78652500\t0.059\t903\nchr16\t79695900\t79696500\t0.0539\t77\nchr16\t80086800\t80087100\t0.4921\t84\nchr16\t80089200\t80089800\t0.0509\t81\nchr16\t81082200\t81082800\t0.0282\t73\nchr16\t81085800\t81086400\t0.1958\t174\nchr16\t81191100\t81191400\t0.5621\t28\nchr16\t81978600\t81982200\t0.3655\t90\nchr16\t82139700\t82145100\t0.0116\t102\nchr16\t82275600\t82276200\t0.1766\t97\nchr16\t83637300\t83643300\t0\t75\nchr16\t83658000\t83658600\t0.6882\t80\nchr16\t83950200\t83950800\t0.6205\t59\nchr16\t84455700\t84458400\t0\t66\nchr16\t85404900\t85406700\t0.0517\t93\nchr16\t85408800\t85412700\t0.0371\t72\nchr16\t85451400\t85451700\t0.2875\t42\nchr16\t85519200\t85519500\t0.4334\t98\nchr16\t85807800\t85808100\t0.5498\t16\nchr16\t85972500\t85974000\t0\t220\nchr16\t86063400\t86063700\t0.587\t15\nchr16\t86234700\t86239200\t0.1727\t70\nchr16\t86262600\t86262900\t0.1679\t84\nchr16\t86265000\t86266800\t0.1679\t84\nchr16\t86278800\t86279100\t0.5449\t60\nchr16\t86419200\t86419800\t0.3725\t168\nchr16\t86464200\t86464500\t0.5286\t119\nchr16\t86678400\t86679000\t0.3243\t62\nchr16\t86686500\t86686800\t0.511\t43\nchr16\t86836200\t86836500\t0.5136\t59\nchr16\t86845800\t86846100\t0.5144\t50\nchr16\t86852100\t86852400\t0.6955\t75\nchr16\t87162600\t87163200\t0.2199\t48\nchr16\t87218100\t87218400\t0.5748\t24\nchr16\t87222000\t87222600\t0.4895\t170\nchr16\t87726300\t87726600\t0.0758\t17\nchr16\t87738600\t87739200\t0.4161\t109\nchr16\t87999300\t88001100\t0.0985\t42\nchr16\t88174500\t88174800\t0.5466\t24\nchr16\t88176000\t88176600\t0.4268\t70\nchr16\t88191000\t88191300\t0.298\t189\nchr16\t88192800\t88193400\t0.298\t189\nchr16\t88217700\t88219800\t0.1439\t90\nchr16\t88237200\t88237500\t0.5216\t41\nchr16\t88239900\t88240200\t0.4001\t60\nchr16\t88253400\t88253700\t0.3727\t75\nchr16\t88277700\t88278600\t0.2151\t81\nchr16\t88295100\t88295400\t0.3122\t23\nchr16\t88371900\t88372200\t0.6799\t143\nchr16\t88470600\t88470900\t0.5378\t40\nchr16\t88547100\t88547400\t0.1313\t12\nchr16\t88713000\t88713300\t0.6951\t19\nchr16\t88728600\t88729500\t0.1513\t75\nchr16\t88771800\t88772100\t0.3603\t37\nchr16\t88823400\t88823700\t0.5603\t58\nchr16\t88831200\t88831800\t0.2077\t35\nchr16\t88894200\t88894500\t0.1518\t97\nchr16\t88933200\t88933800\t0.4167\t50\nchr16\t88950600\t88950900\t0.2773\t52\nchr16\t88954800\t88955700\t0.3941\t59\nchr16\t88961700\t88962000\t0.6817\t56\nchr16\t89008200\t89009400\t0.6119\t142\nchr16\t89028900\t89029500\t0.3498\t30\nchr16\t89042400\t89042700\t0.5608\t69\nchr16\t89068800\t89069400\t0.4576\t203\nchr16\t89077500\t89078100\t0.5469\t49\nchr16\t89083500\t89084400\t0.1601\t29\nchr16\t89166000\t89166300\t0.4319\t43\nchr16\t89212800\t89213100\t0.4946\t49\nchr16\t89233200\t89233500\t0.6092\t45\nchr16\t89268000\t89268600\t0.2172\t54\nchr16\t89400000\t89400600\t0.0438\t44\nchr16\t89412000\t89412300\t0.4048\t46\nchr16\t89421300\t89421600\t0.4738\t37\nchr16\t89429400\t89429700\t0.5634\t37\nchr16\t89454600\t89454900\t0.5657\t64\nchr16\t89535900\t89536200\t0.4146\t83\nchr16\t89587800\t89588100\t0.4558\t32\nchr16\t89598600\t89598900\t0.198\t36\nchr16\t89634600\t89635200\t0.3597\t59\nchr16\t89647500\t89648400\t0.0279\t42\nchr16\t89852700\t89853000\t0.5057\t35\nchr16\t89879400\t89880000\t0.3179\t48\nchr16\t89901600\t89902500\t0.0381\t44\nchr16\t90003600\t90004500\t0.0977\t51\nchr16\t90008100\t90008700\t0.457\t67\nchr16\t90052500\t90053100\t0.518\t55\nchr16\t90098400\t90098700\t0.3123\t64\nchr16\t90100800\t90101400\t0.0448\t93\nchr16\t90107100\t90162000\t0\t434\nchr16\t90163200\t90166800\t0\t434\nchr16\t90168000\t90168300\t0.3457\t61\nchr16\t90169500\t90214800\t0\t126\nchr16\t90216000\t90228000\t0\t126\nchr17\t60000\t63300\t0\t34\nchr17\t65700\t89700\t0\t1057\nchr17\t90900\t130500\t0\t1057\nchr17\t131700\t141000\t0\t112\nchr17\t166800\t168600\t0\t28\nchr17\t192000\t192300\t0.1814\t12\nchr17\t201300\t201900\t0.1127\t270\nchr17\t216000\t218400\t0.392\t220\nchr17\t220500\t221700\t0.1\t162\nchr17\t234000\t234300\t0.4544\t43\nchr17\t242100\t242700\t0.412\t65\nchr17\t253800\t257700\t0.0473\t165\nchr17\t273000\t273600\t0.5171\t84\nchr17\t287400\t287700\t0.3276\t15\nchr17\t295500\t296400\t0.3881\t67\nchr17\t300000\t300600\t0.5053\t38\nchr17\t303600\t304200\t0.0886\t84\nchr17\t340500\t341100\t0.44\t26\nchr17\t355800\t356400\t0.2301\t79\nchr17\t363600\t363900\t0.2632\t13\nchr17\t370200\t370500\t0.4869\t50\nchr17\t402900\t404400\t0\t86\nchr17\t504600\t507000\t0.3062\t56\nchr17\t510000\t510300\t0.2472\t44\nchr17\t513900\t514200\t0.4833\t52\nchr17\t572700\t573000\t0.4044\t69\nchr17\t590700\t591000\t0.3946\t50\nchr17\t594900\t595800\t0.4843\t73\nchr17\t599400\t599700\t0.2768\t77\nchr17\t612300\t612600\t0.5402\t62\nchr17\t617700\t618300\t0.1027\t50\nchr17\t619500\t619800\t0.66\t54\nchr17\t646500\t646800\t0.4382\t198\nchr17\t648900\t649500\t0.26\t123\nchr17\t658200\t658500\t0.3875\t85\nchr17\t727500\t728100\t0.2188\t89\nchr17\t768600\t768900\t0.6133\t89\nchr17\t810000\t810300\t0.4619\t86\nchr17\t835800\t836100\t0.5276\t42\nchr17\t860400\t860700\t0.389\t49\nchr17\t867000\t867300\t0.3788\t38\nchr17\t893700\t894600\t0.2535\t46\nchr17\t940800\t942900\t0.3922\t223\nchr17\t952200\t952800\t0.1667\t81\nchr17\t1006800\t1007100\t0.1411\t21\nchr17\t1035300\t1035600\t0.6779\t19\nchr17\t1052400\t1053300\t0.3175\t25\nchr17\t1062300\t1065300\t0.4066\t238\nchr17\t1072200\t1072500\t0.5255\t78\nchr17\t1117200\t1119600\t0.087\t77\nchr17\t1131300\t1131900\t0.4656\t17\nchr17\t1143000\t1143300\t0.5044\t36\nchr17\t1163400\t1164000\t0.5295\t100\nchr17\t1250100\t1250400\t0.6176\t38\nchr17\t1308000\t1311600\t0\t137\nchr17\t1738800\t1741200\t0.2906\t134\nchr17\t2052600\t2052900\t0.0024\t29\nchr17\t2255100\t2255400\t0.5239\t68\nchr17\t2354700\t2356500\t0.225\t111\nchr17\t2447400\t2448900\t0.0066\t74\nchr17\t3000600\t3000900\t0.599\t12\nchr17\t3051300\t3056700\t0\t83\nchr17\t3058500\t3060300\t0\t72\nchr17\t3062100\t3069900\t0\t72\nchr17\t3071100\t3071400\t0.4567\t70\nchr17\t3072900\t3073800\t0.003\t70\nchr17\t3079500\t3080100\t0.2641\t61\nchr17\t3147600\t3149100\t0.0706\t70\nchr17\t3150300\t3150900\t0.0706\t70\nchr17\t3177600\t3177900\t0.0593\t85\nchr17\t3179100\t3182100\t0.0593\t85\nchr17\t3223800\t3224400\t0.43\t58\nchr17\t3230700\t3231600\t0.0241\t64\nchr17\t3232800\t3234000\t0\t65\nchr17\t3235500\t3240600\t0\t65\nchr17\t3241800\t3246000\t0\t65\nchr17\t3247500\t3250200\t0\t101\nchr17\t3252300\t3252900\t0.0076\t63\nchr17\t3274500\t3275100\t0.2808\t80\nchr17\t3278400\t3279000\t0.4848\t57\nchr17\t3320100\t3320400\t0.2351\t81\nchr17\t3326700\t3330000\t0.1003\t98\nchr17\t3350700\t3351900\t0.0243\t61\nchr17\t3420600\t3420900\t0.2491\t61\nchr17\t3455400\t3456000\t0.4219\t72\nchr17\t3464700\t3465000\t0.5807\t52\nchr17\t3687000\t3687900\t0.0149\t18\nchr17\t4089600\t4090200\t0.0791\t76\nchr17\t4271400\t4271700\t0.4846\t56\nchr17\t4462200\t4462800\t0.1108\t107\nchr17\t4638000\t4638300\t0.5459\t90\nchr17\t4639800\t4640100\t0.3856\t57\nchr17\t4794600\t4794900\t0.545\t44\nchr17\t4830600\t4830900\t0.5694\t14\nchr17\t4832700\t4833000\t0.3778\t71\nchr17\t4852800\t4853100\t0.6083\t19\nchr17\t4873200\t4873500\t0.5045\t51\nchr17\t5240100\t5241000\t0.5375\t70\nchr17\t5561400\t5561700\t0.4189\t15\nchr17\t5851500\t5851800\t0.3907\t69\nchr17\t6030300\t6030600\t0.2723\t35\nchr17\t6193800\t6194400\t0.527\t106\nchr17\t6226500\t6226800\t0.4887\t48\nchr17\t6655800\t6657000\t0.6246\t97\nchr17\t6658800\t6659100\t0.195\t45\nchr17\t6866700\t6867000\t0.4467\t56\nchr17\t7597800\t7598100\t0.402\t53\nchr17\t7749300\t7749600\t0.4472\t90\nchr17\t7942800\t7943100\t0.4647\t43\nchr17\t8107800\t8108100\t0.6569\t25\nchr17\t8549700\t8550000\t0.4787\t73\nchr17\t9616200\t9621900\t0\t89\nchr17\t9993600\t9993900\t0.4367\t78\nchr17\t10326900\t10327200\t0.4793\t30\nchr17\t10553700\t10554300\t0.4546\t73\nchr17\t10759200\t10759500\t0.4687\t41\nchr17\t11478000\t11478900\t0.1305\t88\nchr17\t11654100\t11654400\t0.2706\t52\nchr17\t11694600\t11694900\t0.5842\t16\nchr17\t11845500\t11847000\t0.1174\t67\nchr17\t12443100\t12444000\t0.1107\t21\nchr17\t12450000\t12455400\t0.0097\t115\nchr17\t12651900\t12652200\t0.0466\t21\nchr17\t12654900\t12655800\t0.1786\t57\nchr17\t13317300\t13317600\t0.5921\t36\nchr17\t13468200\t13468500\t0.2673\t26\nchr17\t13496100\t13496700\t0.3377\t55\nchr17\t13782600\t13783200\t0.1405\t26\nchr17\t13797000\t13797300\t0.3342\t15\nchr17\t14021100\t14023800\t0\t69\nchr17\t14025300\t14028900\t0.2693\t85\nchr17\t14177400\t14178300\t0.0564\t68\nchr17\t14183100\t14183400\t0.4966\t56\nchr17\t14185200\t14185500\t0.5307\t40\nchr17\t14232600\t14233200\t0.1659\t78\nchr17\t14234400\t14235900\t0.1659\t78\nchr17\t14237400\t14240400\t0.0018\t61\nchr17\t14345100\t14345400\t0.3275\t51\nchr17\t15535200\t15535500\t0.5173\t72\nchr17\t15537000\t15537300\t0.1935\t44\nchr17\t15540000\t15540600\t0.5892\t65\nchr17\t15557700\t15558600\t0.1975\t41\nchr17\t15574200\t15575100\t0.2172\t73\nchr17\t15576900\t15577200\t0.4571\t57\nchr17\t15579900\t15580800\t0.2994\t57\nchr17\t15583200\t15583500\t0.2994\t57\nchr17\t15599100\t15600600\t0.2234\t66\nchr17\t15609000\t15609300\t0.1925\t55\nchr17\t15613500\t15613800\t0.5284\t45\nchr17\t15623100\t15623400\t0.3764\t59\nchr17\t15630600\t15630900\t0.4432\t42\nchr17\t15635400\t15636000\t0.2469\t81\nchr17\t15637200\t15639000\t0.2587\t116\nchr17\t15642600\t15643200\t0.3576\t65\nchr17\t15646200\t15646500\t0.5114\t62\nchr17\t15672300\t15672600\t0.4029\t55\nchr17\t15690900\t15691200\t0.5603\t49\nchr17\t15699900\t15701100\t0.2929\t60\nchr17\t15718200\t15719100\t0.2015\t57\nchr17\t15730200\t15730500\t0.175\t57\nchr17\t15732300\t15733200\t0.3375\t71\nchr17\t15735300\t15735900\t0.3375\t71\nchr17\t15738900\t15739200\t0.6027\t71\nchr17\t15763800\t15764100\t0.5459\t43\nchr17\t15768900\t15769200\t0.5898\t73\nchr17\t15792300\t15794400\t0.1253\t69\nchr17\t15800400\t15801000\t0.4684\t48\nchr17\t15807900\t15808200\t0.4276\t68\nchr17\t15816600\t15816900\t0.4464\t66\nchr17\t15851100\t15851400\t0.3319\t73\nchr17\t15867900\t15868200\t0.2005\t51\nchr17\t15870000\t15870300\t0.2005\t51\nchr17\t15880200\t15880500\t0.223\t44\nchr17\t15960300\t15960600\t0.1668\t24\nchr17\t16667700\t16668000\t0.4139\t44\nchr17\t16693800\t16694100\t0.5076\t56\nchr17\t16701300\t16701600\t0.4742\t62\nchr17\t16705200\t16706700\t0.2981\t68\nchr17\t16718700\t16719000\t0.5193\t48\nchr17\t16721400\t16721700\t0.279\t55\nchr17\t16725600\t16727700\t0.1659\t85\nchr17\t16730100\t16733400\t0.0253\t65\nchr17\t16735200\t16736100\t0.1289\t64\nchr17\t16738200\t16739400\t0.1289\t64\nchr17\t16752600\t16753200\t0.0771\t70\nchr17\t16760400\t16760700\t0.3184\t51\nchr17\t16763400\t16763700\t0.6531\t80\nchr17\t16764900\t16765800\t0.0449\t86\nchr17\t16772400\t16772700\t0.2528\t121\nchr17\t16773900\t16774800\t0.2528\t121\nchr17\t16776900\t16777800\t0.1067\t90\nchr17\t16779000\t16779600\t0.0851\t71\nchr17\t16781700\t16782900\t0.4798\t74\nchr17\t16785900\t16787700\t0.2365\t119\nchr17\t16789200\t16789500\t0.2754\t116\nchr17\t16797900\t16798200\t0.5897\t86\nchr17\t16800600\t16801200\t0.0492\t72\nchr17\t16809300\t16809900\t0.1926\t79\nchr17\t16811100\t16811400\t0.4466\t58\nchr17\t16828500\t16830300\t0.0014\t91\nchr17\t16832700\t16834800\t0.2485\t97\nchr17\t16836000\t16836300\t0.4342\t40\nchr17\t16838700\t16841400\t0.2284\t107\nchr17\t16845600\t16846200\t0\t47\nchr17\t16847700\t16849800\t0.0217\t86\nchr17\t16862100\t16862400\t0.3861\t49\nchr17\t16863900\t16866000\t0.0524\t73\nchr17\t17010300\t17010600\t0.1507\t80\nchr17\t17011800\t17012100\t0.1507\t80\nchr17\t17442000\t17442600\t0.1381\t83\nchr17\t17611200\t17611500\t0.5903\t35\nchr17\t17911800\t17912100\t0.1889\t80\nchr17\t18389100\t18389700\t0.3427\t42\nchr17\t18391200\t18398400\t0\t97\nchr17\t18399600\t18400200\t0\t97\nchr17\t18401400\t18401700\t0\t97\nchr17\t18402900\t18407400\t0\t57\nchr17\t18411900\t18413100\t0\t61\nchr17\t18416400\t18418500\t0\t54\nchr17\t18420300\t18420900\t0.1002\t100\nchr17\t18423000\t18424200\t0.1002\t100\nchr17\t18425400\t18429000\t0\t91\nchr17\t18430200\t18453600\t0\t91\nchr17\t18456300\t18462300\t0\t35\nchr17\t18469500\t18472800\t0\t28\nchr17\t18474000\t18474300\t0\t28\nchr17\t18477600\t18483900\t0\t39\nchr17\t18485400\t18495000\t0\t56\nchr17\t18497700\t18504600\t0\t37\nchr17\t18505800\t18506700\t0\t63\nchr17\t18513600\t18516300\t0\t65\nchr17\t18517500\t18517800\t0\t65\nchr17\t18520500\t18521100\t0\t44\nchr17\t18522300\t18522900\t0\t44\nchr17\t18526200\t18527100\t0\t54\nchr17\t18528300\t18528600\t0\t54\nchr17\t18533400\t18534900\t0\t47\nchr17\t18536100\t18536700\t0\t47\nchr17\t18538200\t18538800\t0\t38\nchr17\t18540900\t18541800\t0\t43\nchr17\t18544500\t18545100\t0.0475\t28\nchr17\t18546600\t18546900\t0.6671\t32\nchr17\t18550200\t18550800\t0\t66\nchr17\t18552600\t18552900\t0\t66\nchr17\t18554100\t18555300\t0\t43\nchr17\t18562500\t18563100\t0.0031\t101\nchr17\t18571800\t18572100\t0.5519\t59\nchr17\t18576300\t18577500\t0.0455\t78\nchr17\t18579300\t18580200\t0.0455\t78\nchr17\t18582000\t18585300\t0.0455\t78\nchr17\t18587700\t18589800\t0.1664\t83\nchr17\t18593700\t18594000\t0.3357\t64\nchr17\t18597000\t18597300\t0.3357\t64\nchr17\t18600900\t18601500\t0\t65\nchr17\t18603600\t18606900\t0\t65\nchr17\t18614700\t18615000\t0.0758\t100\nchr17\t18617400\t18617700\t0.0758\t100\nchr17\t18619500\t18621900\t0.0758\t100\nchr17\t18623100\t18623700\t0.1554\t55\nchr17\t18640800\t18641400\t0.3435\t75\nchr17\t18644100\t18644400\t0.3435\t75\nchr17\t18646200\t18646500\t0.2512\t60\nchr17\t18660600\t18660900\t0.4871\t69\nchr17\t18665400\t18665700\t0.4726\t47\nchr17\t18669000\t18669300\t0.1946\t68\nchr17\t18670800\t18671400\t0.4933\t76\nchr17\t18681600\t18681900\t0.3804\t70\nchr17\t18689700\t18690300\t0.3294\t36\nchr17\t18709800\t18710100\t0.3882\t53\nchr17\t18718500\t18718800\t0.4352\t70\nchr17\t18721800\t18722400\t0.1927\t66\nchr17\t18726000\t18726300\t0.4822\t42\nchr17\t18727800\t18728400\t0.2165\t75\nchr17\t18732900\t18733200\t0.4934\t63\nchr17\t18740400\t18740700\t0.436\t53\nchr17\t18750000\t18750300\t0.5815\t55\nchr17\t18754200\t18754800\t0.4889\t72\nchr17\t18762900\t18764100\t0.1877\t81\nchr17\t18804300\t18804600\t0.3823\t53\nchr17\t18806400\t18806700\t0.2667\t51\nchr17\t18825000\t18827100\t0.007\t72\nchr17\t18830100\t18830400\t0.007\t72\nchr17\t18831600\t18832200\t0.007\t72\nchr17\t18833700\t18834000\t0.007\t72\nchr17\t18835800\t18837300\t0\t77\nchr17\t18839100\t18843600\t0\t77\nchr17\t18888000\t18888600\t0.0037\t64\nchr17\t19025700\t19237200\t0\t116\nchr17\t19627200\t19629000\t0.0305\t67\nchr17\t19640100\t19640400\t0.5242\t11\nchr17\t20323200\t20323800\t0.0892\t63\nchr17\t20331900\t20333100\t0.0882\t61\nchr17\t20334300\t20334600\t0.0882\t61\nchr17\t20337000\t20337600\t0.3162\t52\nchr17\t20340000\t20340300\t0.2627\t44\nchr17\t20348700\t20349000\t0.3778\t50\nchr17\t20351400\t20351700\t0.6045\t36\nchr17\t20356200\t20356500\t0.0365\t54\nchr17\t20360700\t20362500\t0.0909\t66\nchr17\t20367300\t20368800\t0.2484\t65\nchr17\t20370600\t20370900\t0.2484\t65\nchr17\t20382600\t20383800\t0.429\t71\nchr17\t20390400\t20391600\t0.0911\t51\nchr17\t20393400\t20395800\t0.2129\t81\nchr17\t20400900\t20401800\t0.2906\t81\nchr17\t20403600\t20403900\t0.2906\t81\nchr17\t20405400\t20406300\t0.1207\t79\nchr17\t20407500\t20409000\t0.1207\t79\nchr17\t20411100\t20411400\t0.6503\t93\nchr17\t20412600\t20412900\t0.1379\t77\nchr17\t20414400\t20418000\t0.1379\t77\nchr17\t20423400\t20423700\t0.2241\t70\nchr17\t20429100\t20429400\t0.0529\t62\nchr17\t20437800\t20438400\t0.0503\t68\nchr17\t20442000\t20446800\t0\t61\nchr17\t20451300\t20463900\t0\t53\nchr17\t20465100\t20465700\t0\t53\nchr17\t20469900\t20470200\t0.4863\t40\nchr17\t20472600\t20473200\t0.2213\t58\nchr17\t20479800\t20480100\t0.511\t42\nchr17\t20483100\t20484300\t0.1466\t40\nchr17\t20486400\t20487900\t0.2796\t49\nchr17\t20490600\t20491200\t0.4052\t78\nchr17\t20492400\t20493900\t0.4052\t78\nchr17\t20498400\t20499300\t0.1596\t36\nchr17\t20500800\t20501700\t0.0351\t58\nchr17\t20503200\t20514300\t0\t96\nchr17\t20516100\t20518500\t0\t96\nchr17\t20519700\t20521500\t0\t96\nchr17\t20523300\t20524200\t0\t96\nchr17\t20526600\t20528100\t0.4418\t52\nchr17\t20531400\t20533200\t0.1001\t58\nchr17\t20535600\t20538600\t0\t60\nchr17\t20540100\t20540700\t0.3288\t81\nchr17\t20543700\t20553000\t0\t109\nchr17\t20574600\t20574900\t0.5519\t68\nchr17\t20595000\t20597100\t0.1309\t66\nchr17\t20603100\t20603400\t0.27\t60\nchr17\t20610600\t20610900\t0.4669\t64\nchr17\t20632200\t20632500\t0.211\t63\nchr17\t20668800\t20669100\t0.3353\t63\nchr17\t20687700\t20688000\t0.2785\t68\nchr17\t20697900\t20698200\t0.4718\t61\nchr17\t20892600\t20892900\t0.5988\t56\nchr17\t20984100\t20986200\t0.0122\t55\nchr17\t21315900\t21317100\t0.3127\t71\nchr17\t21326700\t21327000\t0.5402\t95\nchr17\t21333300\t21334500\t0.1944\t92\nchr17\t21342600\t21344400\t0.0109\t135\nchr17\t21345900\t21346800\t0.0109\t135\nchr17\t21348000\t21349500\t0.0109\t135\nchr17\t21412800\t21413700\t0.0025\t112\nchr17\t21438300\t21439500\t0.0282\t110\nchr17\t21622800\t21623400\t0.2099\t57\nchr17\t21625800\t21626700\t0.1389\t58\nchr17\t21648300\t21648600\t0.6032\t188\nchr17\t21651900\t21652200\t0.4189\t104\nchr17\t21653400\t21656100\t0.2407\t223\nchr17\t21659400\t21659700\t0.2716\t70\nchr17\t21681900\t21684600\t0.4469\t158\nchr17\t21698100\t21698400\t0.5206\t77\nchr17\t21700200\t21701100\t0.0117\t82\nchr17\t21706200\t21706500\t0.5526\t91\nchr17\t21712500\t21712800\t0.3517\t71\nchr17\t21724200\t21725400\t0.3749\t108\nchr17\t21737400\t21740100\t0.0373\t126\nchr17\t21741300\t21745500\t0.0042\t124\nchr17\t21753600\t21753900\t0.2378\t96\nchr17\t21758700\t21759300\t0.1998\t55\nchr17\t21760800\t21762300\t0.3418\t112\nchr17\t21771000\t21771300\t0.3144\t75\nchr17\t21782400\t21782700\t0.236\t64\nchr17\t21792000\t21792300\t0.4912\t55\nchr17\t21837900\t21838200\t0.6595\t161\nchr17\t21843900\t21844200\t0.6951\t42\nchr17\t21851100\t21862500\t0.3074\t359\nchr17\t21863700\t21992100\t0\t23536\nchr17\t22041900\t22042200\t0.075\t19\nchr17\t22044000\t22044600\t0.127\t202\nchr17\t22045800\t22048500\t0.127\t202\nchr17\t22054500\t22054800\t0.4743\t125\nchr17\t22070700\t22071000\t0.3007\t43\nchr17\t22076700\t22077600\t0.2577\t73\nchr17\t22080000\t22080300\t0.0679\t50\nchr17\t22375500\t22408500\t0\t471\nchr17\t22521300\t22521600\t0.4746\t437\nchr17\t22554600\t22554900\t0.5109\t77\nchr17\t22721100\t22721400\t0.6035\t63\nchr17\t22745400\t22762200\t0\t205\nchr17\t22814100\t22821600\t0\t2064\nchr17\t22822800\t23027700\t0\t2064\nchr17\t23028900\t23031000\t0\t81\nchr17\t23032200\t23093700\t0\t783\nchr17\t23094900\t23175600\t0\t783\nchr17\t23177100\t23192700\t0\t661\nchr17\t23194200\t23219700\t0\t661\nchr17\t23221200\t23221800\t0.0017\t766\nchr17\t23223300\t23231100\t0\t35\nchr17\t23235300\t23235600\t0\t10\nchr17\t23238900\t23242500\t0\t121\nchr17\t23243700\t23247900\t0\t70\nchr17\t23249700\t23251500\t0\t19\nchr17\t23255700\t23258100\t0\t2583\nchr17\t23260200\t23263800\t0\t77\nchr17\t23267100\t23268600\t0\t152\nchr17\t23271000\t23271600\t0\t33\nchr17\t23273400\t23277600\t0\t84\nchr17\t23281200\t23286600\t0\t116\nchr17\t23288700\t23298000\t0\t1530\nchr17\t23300100\t23300400\t0\t14\nchr17\t23304900\t23306700\t0\t20\nchr17\t23309400\t23310000\t0\t34\nchr17\t23315100\t23322300\t0\t67\nchr17\t23323800\t23325000\t0\t11\nchr17\t23328900\t23329200\t0\t10\nchr17\t23332500\t23335500\t0\t45\nchr17\t23339400\t23341500\t0\t28\nchr17\t23343600\t23344200\t0\t15\nchr17\t23346600\t23347200\t0.1001\t31\nchr17\t23349600\t23349900\t0\t26\nchr17\t23352000\t23352300\t0\t11\nchr17\t23353500\t23365800\t0\t173\nchr17\t23369700\t23370000\t0\t14\nchr17\t23371800\t23372700\t0\t44\nchr17\t23376900\t23377200\t0\t12\nchr17\t23379000\t23380800\t0.0103\t55\nchr17\t23383500\t23383800\t0.1492\t15\nchr17\t23385600\t23388600\t0\t64\nchr17\t23389800\t23391300\t0\t70\nchr17\t23394000\t23398200\t0\t42\nchr17\t23399400\t23400300\t0\t69\nchr17\t23403900\t23405700\t0\t17\nchr17\t23407500\t23419200\t0\t283\nchr17\t23421600\t23424000\t0\t43\nchr17\t23428800\t23429400\t0\t38\nchr17\t23430900\t23433300\t0\t161\nchr17\t23436300\t23443200\t0\t225\nchr17\t23445900\t23447100\t0\t57\nchr17\t23448900\t23449800\t0\t54\nchr17\t23452800\t23455800\t0\t15\nchr17\t23457600\t23458500\t0\t17\nchr17\t23460600\t23461500\t0\t92\nchr17\t23462700\t23468400\t0\t248\nchr17\t23470200\t23473800\t0\t63\nchr17\t23475600\t23476200\t0\t18\nchr17\t23477400\t23477700\t0\t18\nchr17\t23479500\t23483700\t0\t68\nchr17\t23485800\t23487900\t0\t69\nchr17\t23489400\t23490000\t0\t14\nchr17\t23492100\t23496300\t0\t150\nchr17\t23497500\t23497800\t0\t11\nchr17\t23500200\t23502900\t0\t79\nchr17\t23506200\t23506500\t0\t11\nchr17\t23508900\t23509500\t0\t13\nchr17\t23511000\t23511300\t0\t13\nchr17\t23513700\t23514000\t0\t12\nchr17\t23515500\t23515800\t0\t15\nchr17\t23520000\t23520900\t0\t15\nchr17\t23523300\t23525700\t0\t48\nchr17\t23526900\t23527200\t0\t30\nchr17\t23529900\t23530200\t0.223\t25\nchr17\t23531400\t23532600\t0\t19\nchr17\t23534400\t23537400\t0\t30\nchr17\t23538600\t23538900\t0\t10\nchr17\t23540100\t23545200\t0\t1314\nchr17\t23546700\t23548800\t0\t23\nchr17\t23554200\t23555100\t0\t32\nchr17\t23559000\t23561400\t0\t44\nchr17\t23563800\t23565300\t0\t45\nchr17\t23566500\t23567700\t0\t45\nchr17\t23569800\t23570700\t0\t166\nchr17\t23572200\t23577000\t0\t62\nchr17\t23579700\t23581200\t0\t18\nchr17\t23583000\t23583900\t0\t452\nchr17\t23586000\t23586900\t0\t15\nchr17\t23590200\t23593200\t0\t48\nchr17\t23594400\t23598600\t0\t76\nchr17\t23600700\t23601000\t0.1131\t17\nchr17\t23603700\t23605500\t0\t94\nchr17\t23606700\t23615700\t0\t94\nchr17\t23617200\t23617500\t0\t12\nchr17\t23620800\t23626800\t0\t170\nchr17\t23628900\t23630700\t0\t12\nchr17\t23632200\t23638800\t0\t214\nchr17\t23640000\t23641800\t0\t56\nchr17\t23644200\t23644800\t0\t34\nchr17\t23646900\t23650800\t0\t78\nchr17\t23656500\t23657100\t0\t37\nchr17\t23663100\t23664000\t0\t12\nchr17\t23666100\t23667300\t0\t17\nchr17\t23668800\t23673000\t0\t80\nchr17\t23676000\t23677800\t0\t48\nchr17\t23680500\t23680800\t0\t15\nchr17\t23682600\t23682900\t0\t11\nchr17\t23686800\t23688000\t0\t74\nchr17\t23691300\t23694000\t0\t17\nchr17\t23698800\t23700000\t0\t12\nchr17\t23701200\t23701800\t0\t12\nchr17\t23703300\t23703600\t0\t12\nchr17\t23708100\t23708400\t0\t11\nchr17\t23711400\t23711700\t0\t13\nchr17\t23714700\t23715000\t0\t13\nchr17\t23716800\t23717100\t0\t11\nchr17\t23719800\t23722200\t0\t58\nchr17\t23727600\t23728800\t0\t26\nchr17\t23731200\t23734500\t0\t93\nchr17\t23736000\t23736300\t0\t30\nchr17\t23740200\t23753100\t0\t69\nchr17\t23755800\t23759100\t0\t53\nchr17\t23760900\t23761200\t0\t13\nchr17\t23762700\t23770500\t0\t55\nchr17\t23773800\t23778000\t0\t37\nchr17\t23779500\t23781000\t0\t37\nchr17\t23783400\t23784900\t0\t12\nchr17\t23786400\t23786700\t0\t10\nchr17\t23791800\t23793600\t0\t38\nchr17\t23795100\t23796600\t0\t39\nchr17\t23800500\t23802000\t0\t30\nchr17\t23803800\t23805600\t0\t713\nchr17\t23810400\t23811600\t0\t18\nchr17\t23817900\t23824800\t0\t60\nchr17\t23826300\t23831700\t0\t52\nchr17\t23832900\t23833200\t0\t12\nchr17\t23842200\t23842500\t0\t13\nchr17\t23844000\t23845500\t0\t30\nchr17\t23849700\t23853600\t0\t68\nchr17\t23857200\t23861100\t0\t305\nchr17\t23863500\t23873700\t0\t93\nchr17\t23875200\t23881800\t0\t149\nchr17\t23884800\t23886600\t0\t39\nchr17\t23887800\t23888700\t0\t39\nchr17\t23892600\t23894100\t0\t46\nchr17\t23896800\t23900100\t0\t72\nchr17\t23901600\t23903100\t0\t81\nchr17\t23904900\t23910900\t0\t49\nchr17\t23912100\t23916600\t0\t82\nchr17\t23917800\t23918100\t0\t12\nchr17\t23919900\t23921400\t0\t60\nchr17\t23922600\t23922900\t0.07\t23\nchr17\t23925000\t23925300\t0\t10\nchr17\t23928900\t23931600\t0\t62\nchr17\t23933700\t23936700\t0\t31\nchr17\t23941200\t23943300\t0\t40\nchr17\t23944500\t23946600\t0\t34\nchr17\t23949900\t23954700\t0\t71\nchr17\t23956200\t23964600\t0\t89\nchr17\t23969100\t23977200\t0\t70\nchr17\t23979000\t23980800\t0\t192\nchr17\t23982000\t23983200\t0\t192\nchr17\t23984400\t23988300\t0\t192\nchr17\t23993700\t23996100\t0\t106\nchr17\t23997300\t23997600\t0\t14\nchr17\t23999100\t24004200\t0\t80\nchr17\t24007200\t24007500\t0\t13\nchr17\t24009300\t24009600\t0\t14\nchr17\t24011100\t24013500\t0\t66\nchr17\t24016200\t24019500\t0\t75\nchr17\t24021300\t24021600\t0.2557\t64\nchr17\t24024000\t24025800\t0\t54\nchr17\t24027300\t24027600\t0\t11\nchr17\t24029100\t24033300\t0\t30\nchr17\t24034800\t24036900\t0\t34\nchr17\t24038700\t24043500\t0\t107\nchr17\t24044700\t24046800\t0\t23\nchr17\t24048000\t24048900\t0\t53\nchr17\t24050100\t24051300\t0\t50\nchr17\t24057300\t24057900\t0\t13\nchr17\t24061800\t24062700\t0\t203\nchr17\t24064200\t24066000\t0\t42\nchr17\t24067200\t24069900\t0\t81\nchr17\t24071700\t24073500\t0\t68\nchr17\t24076800\t24081600\t0\t88\nchr17\t24082800\t24083400\t0\t130\nchr17\t24084900\t24094500\t0\t59\nchr17\t24096900\t24098700\t0\t43\nchr17\t24101400\t24102000\t0\t16\nchr17\t24106500\t24107400\t0\t45\nchr17\t24108900\t24111000\t0\t85\nchr17\t24112500\t24117900\t0\t50\nchr17\t24119400\t24123900\t0\t42\nchr17\t24125700\t24127800\t0\t56\nchr17\t24132300\t24133200\t0\t46\nchr17\t24135000\t24137400\t0\t29\nchr17\t24139200\t24141600\t0\t130\nchr17\t24144300\t24147300\t0\t60\nchr17\t24150600\t24153900\t0\t573\nchr17\t24156600\t24156900\t0.5985\t14\nchr17\t24158100\t24158400\t0.0558\t12\nchr17\t24163800\t24166500\t0\t40\nchr17\t24168300\t24170700\t0\t79\nchr17\t24175200\t24176400\t0\t49\nchr17\t24180000\t24188400\t0\t1036\nchr17\t24191400\t24199200\t0\t52\nchr17\t24200400\t24219900\t0\t81\nchr17\t24223500\t24230400\t0\t154\nchr17\t24232500\t24232800\t0\t11\nchr17\t24235200\t24235500\t0\t20\nchr17\t24237600\t24243600\t0\t69\nchr17\t24245400\t24246300\t0\t35\nchr17\t24248100\t24249300\t0.0009\t19\nchr17\t24250500\t24258900\t0\t116\nchr17\t24261300\t24262500\t0\t35\nchr17\t24263700\t24264000\t0.0396\t20\nchr17\t24265800\t24268800\t0\t35\nchr17\t24270600\t24270900\t0\t11\nchr17\t24275700\t24277200\t0\t67\nchr17\t24278700\t24286500\t0\t67\nchr17\t24288600\t24288900\t0\t12\nchr17\t24291300\t24293100\t0\t41\nchr17\t24296100\t24297000\t0\t42\nchr17\t24298200\t24298500\t0\t12\nchr17\t24299700\t24303000\t0\t68\nchr17\t24304500\t24305400\t0\t41\nchr17\t24306900\t24311400\t0\t43\nchr17\t24312900\t24313200\t0\t27\nchr17\t24316200\t24318000\t0\t65\nchr17\t24319200\t24319500\t0\t12\nchr17\t24324300\t24324600\t0\t11\nchr17\t24327300\t24328500\t0\t50\nchr17\t24330300\t24332100\t0\t49\nchr17\t24333600\t24333900\t0\t10\nchr17\t24335100\t24340200\t0\t27\nchr17\t24344700\t24351300\t0\t59\nchr17\t24354000\t24355200\t0\t569\nchr17\t24359100\t24359700\t0\t26\nchr17\t24363000\t24363900\t0\t27\nchr17\t24366900\t24367500\t0\t41\nchr17\t24371400\t24375300\t0\t66\nchr17\t24380100\t24382500\t0\t44\nchr17\t24384900\t24386700\t0\t54\nchr17\t24388500\t24390300\t0\t41\nchr17\t24391500\t24391800\t0\t12\nchr17\t24395400\t24395700\t0\t12\nchr17\t24397500\t24399900\t0\t1126\nchr17\t24402600\t24403200\t0\t13\nchr17\t24408300\t24410700\t0\t22\nchr17\t24415500\t24421800\t0\t4203\nchr17\t24423300\t24425700\t0\t86\nchr17\t24427200\t24427500\t0\t12\nchr17\t24429300\t24429600\t0\t10\nchr17\t24437700\t24439800\t0\t36\nchr17\t24441000\t24442500\t0\t30\nchr17\t24445200\t24445800\t0.0936\t37\nchr17\t24447300\t24449700\t0\t16\nchr17\t24453000\t24455700\t0\t82\nchr17\t24456900\t24457200\t0\t19\nchr17\t24459000\t24464100\t0\t67\nchr17\t24467100\t24467700\t0\t28\nchr17\t24469200\t24469500\t0\t11\nchr17\t24471300\t24478200\t0\t68\nchr17\t24481500\t24486000\t0\t32\nchr17\t24487200\t24489300\t0\t55\nchr17\t24492000\t24493500\t0\t142\nchr17\t24495600\t24501600\t0\t223\nchr17\t24504300\t24505800\t0\t18\nchr17\t24507300\t24511200\t0\t71\nchr17\t24514200\t24519000\t0\t204\nchr17\t24520200\t24520500\t0\t14\nchr17\t24525600\t24527100\t0\t27\nchr17\t24528300\t24528900\t0\t35\nchr17\t24530700\t24539700\t0\t876\nchr17\t24541500\t24542100\t0\t11\nchr17\t24543900\t24552000\t0\t66\nchr17\t24553200\t24558300\t0\t48\nchr17\t24559500\t24560100\t0\t11\nchr17\t24564900\t24566400\t0\t73\nchr17\t24569700\t24570600\t0\t28\nchr17\t24571800\t24574500\t0\t127\nchr17\t24576600\t24577500\t0\t55\nchr17\t24581400\t24582300\t0\t57\nchr17\t24584100\t24591900\t0\t116\nchr17\t24594600\t24599100\t0\t145\nchr17\t24600900\t24601200\t0\t10\nchr17\t24606300\t24608100\t0\t26\nchr17\t24612900\t24614700\t0\t44\nchr17\t24615900\t24617700\t0\t76\nchr17\t24623400\t24624900\t0\t1118\nchr17\t24627900\t24628200\t0\t11\nchr17\t24630000\t24636300\t0\t75\nchr17\t24638100\t24642300\t0\t53\nchr17\t24643500\t24645300\t0\t50\nchr17\t24648000\t24648300\t0\t11\nchr17\t24649800\t24650100\t0\t10\nchr17\t24651300\t24652200\t0\t34\nchr17\t24654300\t24656700\t0\t20\nchr17\t24657900\t24658200\t0.6411\t13\nchr17\t24660600\t24662100\t0\t24\nchr17\t24663600\t24665100\t0\t38\nchr17\t24668400\t24670200\t0\t53\nchr17\t24672300\t24676200\t0\t159\nchr17\t24677700\t24678000\t0\t14\nchr17\t24681000\t24683400\t0\t54\nchr17\t24685500\t24685800\t0\t12\nchr17\t24688500\t24697800\t0\t67\nchr17\t24699600\t24700200\t0\t13\nchr17\t24702300\t24703500\t0\t156\nchr17\t24707700\t24714600\t0\t66\nchr17\t24716100\t24716700\t0\t13\nchr17\t24718200\t24719100\t0\t567\nchr17\t24722400\t24723900\t0\t18\nchr17\t24729300\t24729600\t0\t12\nchr17\t24734400\t24736800\t0\t149\nchr17\t24740100\t24742500\t0\t1219\nchr17\t24744300\t24744600\t0\t11\nchr17\t24745800\t24748800\t0\t1244\nchr17\t24750600\t24754200\t0\t334\nchr17\t24758400\t24759300\t0\t30\nchr17\t24760500\t24762600\t0\t12\nchr17\t24765300\t24766500\t0\t39\nchr17\t24770100\t24780000\t0\t2349\nchr17\t24781500\t24784200\t0\t74\nchr17\t24786000\t24786300\t0\t10\nchr17\t24790500\t24791100\t0.2394\t24\nchr17\t24792900\t24793500\t0\t30\nchr17\t24795300\t24797400\t0\t38\nchr17\t24800100\t24802200\t0\t39\nchr17\t24809700\t24810300\t0\t16\nchr17\t24812100\t24816900\t0\t71\nchr17\t24819900\t24824700\t0\t88\nchr17\t24828300\t24828600\t0\t10\nchr17\t24830700\t24831000\t0\t14\nchr17\t24833100\t24837300\t0\t34\nchr17\t24839100\t24839400\t0\t12\nchr17\t24841500\t24843300\t0\t44\nchr17\t24845700\t24846000\t0\t20\nchr17\t24847200\t24851400\t0\t67\nchr17\t24852900\t24853500\t0\t14\nchr17\t24855900\t24856500\t0.0019\t21\nchr17\t24857700\t24858000\t0.0703\t12\nchr17\t24859500\t24861300\t0\t80\nchr17\t24863400\t24865500\t0\t14\nchr17\t24866700\t24869700\t0\t151\nchr17\t24872400\t24872700\t0\t11\nchr17\t24873900\t24879600\t0\t63\nchr17\t24882000\t24883500\t0\t22\nchr17\t24885300\t24885600\t0\t11\nchr17\t24888000\t24893700\t0\t2416\nchr17\t24895800\t24896100\t0\t12\nchr17\t24902100\t24903300\t0\t14\nchr17\t24908100\t24908700\t0\t34\nchr17\t24910500\t24910800\t0\t12\nchr17\t24913500\t24913800\t0\t36\nchr17\t24916200\t24918000\t0\t44\nchr17\t24921300\t24924000\t0\t32\nchr17\t24928200\t24929700\t0\t22\nchr17\t24931200\t24931500\t0\t13\nchr17\t24933000\t24936600\t0\t61\nchr17\t24940500\t24941100\t0\t93\nchr17\t24942600\t24946800\t0\t69\nchr17\t24954900\t24956100\t0\t37\nchr17\t24958200\t24961200\t0\t47\nchr17\t24963900\t24967800\t0\t63\nchr17\t24969000\t24969900\t0\t13\nchr17\t24975000\t24976200\t0\t20\nchr17\t24979500\t24988200\t0\t974\nchr17\t24990900\t24991200\t0\t12\nchr17\t24992400\t24997200\t0\t77\nchr17\t24999000\t25007100\t0\t323\nchr17\t25008600\t25010400\t0\t76\nchr17\t25011900\t25012200\t0\t21\nchr17\t25015800\t25016400\t0\t13\nchr17\t25020000\t25021800\t0\t70\nchr17\t25023000\t25025100\t0\t28\nchr17\t25028400\t25028700\t0\t13\nchr17\t25031700\t25040700\t0\t710\nchr17\t25043700\t25045200\t0\t52\nchr17\t25047600\t25050300\t0\t93\nchr17\t25053000\t25056900\t0\t138\nchr17\t25059300\t25064400\t0\t337\nchr17\t25068600\t25069200\t0\t13\nchr17\t25071000\t25077600\t0\t4856\nchr17\t25078800\t25087800\t0\t199\nchr17\t25091400\t25094700\t0\t58\nchr17\t25096200\t25107600\t0\t1253\nchr17\t25111200\t25113000\t0.0546\t40\nchr17\t25115100\t25118400\t0\t185\nchr17\t25120200\t25120800\t0\t75\nchr17\t25122900\t25123200\t0\t11\nchr17\t25124700\t25128000\t0\t50\nchr17\t25130100\t25131000\t0\t43\nchr17\t25132200\t25135800\t0\t68\nchr17\t25139100\t25140900\t0\t2390\nchr17\t25143300\t25143900\t0.001\t63\nchr17\t25149900\t25152000\t0\t43\nchr17\t25154100\t25158300\t0\t57\nchr17\t25165500\t25165800\t0\t16\nchr17\t25167300\t25174800\t0\t76\nchr17\t25180500\t25180800\t0\t17\nchr17\t25182300\t25182600\t0\t54\nchr17\t25184700\t25187700\t0\t720\nchr17\t25190700\t25194600\t0\t50\nchr17\t25197600\t25198800\t0\t18\nchr17\t25201500\t25201800\t0\t16\nchr17\t25203600\t25204800\t0\t61\nchr17\t25207500\t25211700\t0\t197\nchr17\t25213500\t25213800\t0\t10\nchr17\t25217100\t25218000\t0\t17\nchr17\t25219200\t25221600\t0\t30\nchr17\t25227900\t25228200\t0\t18\nchr17\t25232100\t25234500\t0\t29\nchr17\t25237500\t25237800\t0.5853\t33\nchr17\t25239300\t25240500\t0\t129\nchr17\t25242600\t25245600\t0\t494\nchr17\t25247400\t25248000\t0\t26\nchr17\t25251600\t25256700\t0\t76\nchr17\t25257900\t25261200\t0\t35\nchr17\t25263900\t25266600\t0\t55\nchr17\t25268700\t25269600\t0\t28\nchr17\t25270800\t25271400\t0\t28\nchr17\t25273500\t25273800\t0\t12\nchr17\t25275600\t25275900\t0\t11\nchr17\t25277100\t25277400\t0\t10\nchr17\t25281000\t25282200\t0\t107\nchr17\t25283400\t25284300\t0\t28\nchr17\t25288800\t25295400\t0\t50\nchr17\t25298100\t25298700\t0\t17\nchr17\t25301700\t25304700\t0\t77\nchr17\t25306500\t25307100\t0\t30\nchr17\t25309800\t25311900\t0\t21\nchr17\t25314300\t25317900\t0\t82\nchr17\t25320000\t25320300\t0\t11\nchr17\t25322400\t25323000\t0\t135\nchr17\t25324800\t25326600\t0\t76\nchr17\t25328100\t25331700\t0\t217\nchr17\t25332900\t25334700\t0\t50\nchr17\t25338000\t25340400\t0\t38\nchr17\t25341900\t25344900\t0\t59\nchr17\t25346700\t25350600\t0\t34\nchr17\t25352700\t25353900\t0\t302\nchr17\t25356600\t25366200\t0\t211\nchr17\t25368000\t25368600\t0\t43\nchr17\t25371300\t25372500\t0\t36\nchr17\t25375500\t25379400\t0\t36\nchr17\t25382100\t25384800\t0\t5097\nchr17\t25387200\t25387500\t0\t36\nchr17\t25388700\t25392600\t0\t4252\nchr17\t25393800\t25396800\t0\t322\nchr17\t25398300\t25400400\t0\t183\nchr17\t25403700\t25404000\t0\t30\nchr17\t25405200\t25411200\t0\t296\nchr17\t25413900\t25416900\t0\t70\nchr17\t25418700\t25419900\t0\t36\nchr17\t25421100\t25425600\t0\t48\nchr17\t25427100\t25429500\t0\t40\nchr17\t25431000\t25435500\t0\t63\nchr17\t25437300\t25440600\t0\t80\nchr17\t25442700\t25447800\t0\t38\nchr17\t25449900\t25450800\t0\t209\nchr17\t25452300\t25456200\t0\t67\nchr17\t25457700\t25458300\t0\t139\nchr17\t25462200\t25463400\t0\t41\nchr17\t25464600\t25474200\t0\t64\nchr17\t25476000\t25476900\t0\t46\nchr17\t25480200\t25481700\t0\t455\nchr17\t25482900\t25489800\t0\t455\nchr17\t25493700\t25499100\t0\t646\nchr17\t25502700\t25504500\t0\t72\nchr17\t25505700\t25506000\t0\t45\nchr17\t25507800\t25509900\t0\t28\nchr17\t25511400\t25515600\t0\t61\nchr17\t25516800\t25517100\t0\t11\nchr17\t25519500\t25520400\t0\t49\nchr17\t25521600\t25521900\t0\t49\nchr17\t25523700\t25527900\t0\t938\nchr17\t25529400\t25533600\t0\t123\nchr17\t25536600\t25540800\t0\t54\nchr17\t25542600\t25545300\t0\t54\nchr17\t25549200\t25551000\t0\t39\nchr17\t25552200\t25553400\t0\t17\nchr17\t25555500\t25561200\t0\t67\nchr17\t25563900\t25572600\t0\t4118\nchr17\t25574100\t25575300\t0\t66\nchr17\t25578600\t25582800\t0\t70\nchr17\t25586400\t25588800\t0\t83\nchr17\t25591200\t25592400\t0\t45\nchr17\t25594200\t25600200\t0\t55\nchr17\t25603200\t25608900\t0\t74\nchr17\t25610100\t25612800\t0\t74\nchr17\t25614300\t25616700\t0\t18\nchr17\t25620000\t25620600\t0\t22\nchr17\t25621800\t25623000\t0\t30\nchr17\t25624500\t25629300\t0\t59\nchr17\t25631400\t25638600\t0\t132\nchr17\t25639800\t25643100\t0\t74\nchr17\t25644300\t25648800\t0\t66\nchr17\t25650000\t25653600\t0\t261\nchr17\t25655400\t25661400\t0\t307\nchr17\t25665900\t25666800\t0\t28\nchr17\t25668300\t25668900\t0\t32\nchr17\t25670100\t25670400\t0.2988\t12\nchr17\t25672800\t25676700\t0\t58\nchr17\t25677900\t25681200\t0\t58\nchr17\t25683900\t25684800\t0\t62\nchr17\t25686300\t25694100\t0\t62\nchr17\t25696500\t25697700\t0\t33\nchr17\t25700700\t25704900\t0\t108\nchr17\t25708800\t25734900\t0\t150\nchr17\t25737000\t25743600\t0\t55\nchr17\t25745400\t25747500\t0\t55\nchr17\t25749000\t25750200\t0\t38\nchr17\t25751700\t25752000\t0.0773\t13\nchr17\t25753500\t25754700\t0\t35\nchr17\t25757700\t25758000\t0\t10\nchr17\t25759500\t25761900\t0\t31\nchr17\t25763400\t25764600\t0\t21\nchr17\t25766100\t25768200\t0\t118\nchr17\t25769400\t25775100\t0\t3795\nchr17\t25778100\t25781700\t0\t57\nchr17\t25785600\t25790400\t0\t1563\nchr17\t25794600\t25796700\t0\t217\nchr17\t25798200\t25802700\t0\t47\nchr17\t25803900\t25806000\t0\t49\nchr17\t25807500\t25813800\t0\t54\nchr17\t25816200\t25821000\t0\t53\nchr17\t25822500\t25826400\t0\t33\nchr17\t25827900\t25840800\t0\t66\nchr17\t25842900\t25847700\t0\t94\nchr17\t25850100\t25867800\t0\t303\nchr17\t25869300\t25869600\t0\t15\nchr17\t25871700\t25874100\t0\t64\nchr17\t25876200\t25878300\t0\t58\nchr17\t25881300\t25882200\t0\t62\nchr17\t25884600\t25886700\t0\t59\nchr17\t25888800\t25892700\t0\t53\nchr17\t25895100\t25895700\t0\t33\nchr17\t25898400\t25900500\t0\t25\nchr17\t25902300\t25903500\t0\t36\nchr17\t25904700\t25905900\t0\t48\nchr17\t25907700\t25914600\t0\t67\nchr17\t25917600\t25917900\t0\t21\nchr17\t25919100\t25926000\t0\t10231\nchr17\t25927500\t25930800\t0\t79\nchr17\t25934100\t25934700\t0.0314\t18\nchr17\t25936200\t25938300\t0\t21\nchr17\t25939800\t25951500\t0\t159\nchr17\t25953000\t25960200\t0\t226\nchr17\t25961400\t25967700\t0\t226\nchr17\t25969800\t25976400\t0\t233\nchr17\t25977900\t25981200\t0\t42\nchr17\t25982400\t25985700\t0\t51\nchr17\t25986900\t25991700\t0\t43\nchr17\t25994100\t25999500\t0\t110\nchr17\t26001000\t26001600\t0\t37\nchr17\t26003700\t26010000\t0\t146\nchr17\t26011800\t26028300\t0\t437\nchr17\t26029800\t26045400\t0\t205\nchr17\t26048100\t26052600\t0\t83\nchr17\t26053800\t26056200\t0\t30\nchr17\t26057400\t26060700\t0\t52\nchr17\t26062500\t26071200\t0\t183\nchr17\t26075100\t26083200\t0\t457\nchr17\t26084700\t26085600\t0\t74\nchr17\t26087400\t26090700\t0\t48\nchr17\t26091900\t26092800\t0.1069\t50\nchr17\t26094000\t26098500\t0\t296\nchr17\t26100600\t26106900\t0\t1578\nchr17\t26108400\t26115300\t0\t73\nchr17\t26116500\t26120100\t0\t37\nchr17\t26121900\t26123400\t0\t1755\nchr17\t26124600\t26126400\t0\t64\nchr17\t26127900\t26133900\t0\t473\nchr17\t26135400\t26136900\t0\t15\nchr17\t26138100\t26139300\t0\t33\nchr17\t26140500\t26145600\t0\t232\nchr17\t26146800\t26156700\t0\t279\nchr17\t26157900\t26161200\t0\t40\nchr17\t26163600\t26172900\t0\t164\nchr17\t26174400\t26181000\t0\t61\nchr17\t26182800\t26184600\t0\t69\nchr17\t26186100\t26192100\t0\t60\nchr17\t26193900\t26194500\t0\t18\nchr17\t26195700\t26205300\t0\t99\nchr17\t26206500\t26207700\t0\t99\nchr17\t26209800\t26210700\t0\t77\nchr17\t26212200\t26216700\t0\t61\nchr17\t26217900\t26219700\t0\t87\nchr17\t26220900\t26226900\t0\t86\nchr17\t26228400\t26238000\t0\t183\nchr17\t26239200\t26244000\t0\t72\nchr17\t26245500\t26259300\t0\t62\nchr17\t26260800\t26261700\t0\t41\nchr17\t26263500\t26275800\t0\t243\nchr17\t26277600\t26278200\t0\t74\nchr17\t26279700\t26280600\t0\t185\nchr17\t26282400\t26294400\t0\t388\nchr17\t26296500\t26298000\t0\t23\nchr17\t26299200\t26300100\t0.056\t458\nchr17\t26301300\t26303100\t0\t105\nchr17\t26305200\t26305500\t0\t16\nchr17\t26306700\t26311800\t0\t213\nchr17\t26313000\t26318700\t0\t40\nchr17\t26320500\t26332500\t0\t253\nchr17\t26334000\t26337000\t0\t30\nchr17\t26338500\t26339700\t0\t40\nchr17\t26341200\t26345700\t0\t78\nchr17\t26346900\t26349900\t0\t78\nchr17\t26351400\t26353500\t0\t27\nchr17\t26355300\t26358900\t0\t124\nchr17\t26360100\t26364600\t0\t845\nchr17\t26365800\t26367000\t0\t33\nchr17\t26368500\t26373000\t0\t22\nchr17\t26374500\t26385900\t0\t226\nchr17\t26387400\t26391300\t0\t347\nchr17\t26392500\t26396400\t0\t62\nchr17\t26397900\t26404200\t0\t691\nchr17\t26406300\t26415600\t0\t76\nchr17\t26416800\t26423700\t0\t60\nchr17\t26425200\t26428800\t0\t60\nchr17\t26430300\t26436300\t0\t76\nchr17\t26438700\t26447400\t0\t1206\nchr17\t26448900\t26451000\t0\t48\nchr17\t26452200\t26466000\t0\t248\nchr17\t26467500\t26474400\t0\t83\nchr17\t26475900\t26477100\t0\t21\nchr17\t26478300\t26487900\t0\t52\nchr17\t26490000\t26490600\t0\t36\nchr17\t26492100\t26496000\t0\t2782\nchr17\t26497200\t26498700\t0\t39\nchr17\t26500200\t26501700\t0\t35\nchr17\t26502900\t26504400\t0\t69\nchr17\t26505600\t26510100\t0\t73\nchr17\t26511900\t26512200\t0\t16\nchr17\t26514000\t26517900\t0\t29\nchr17\t26519100\t26528400\t0\t66\nchr17\t26529900\t26540100\t0\t66\nchr17\t26541600\t26544900\t0\t256\nchr17\t26546100\t26553600\t0\t256\nchr17\t26554800\t26555700\t0\t45\nchr17\t26557200\t26625900\t0\t19033\nchr17\t26627400\t26627700\t0.6562\t31\nchr17\t26630100\t26630700\t0.2708\t111\nchr17\t26638800\t26639100\t0.6962\t29\nchr17\t26676600\t26676900\t0.297\t63\nchr17\t26718300\t26718900\t0.6365\t152\nchr17\t26721300\t26721600\t0.6429\t118\nchr17\t26726700\t26727000\t0.5559\t104\nchr17\t26728500\t26728800\t0.6551\t140\nchr17\t26730600\t26730900\t0.5346\t107\nchr17\t26735700\t26736000\t0.673\t98\nchr17\t26743200\t26743500\t0.4044\t144\nchr17\t26748600\t26748900\t0.6393\t148\nchr17\t26753700\t26754300\t0.4778\t96\nchr17\t26763600\t26764200\t0.253\t147\nchr17\t26769300\t26769600\t0.6179\t115\nchr17\t26775300\t26775600\t0.6908\t64\nchr17\t26779200\t26779500\t0.6571\t134\nchr17\t26782500\t26813100\t0.0473\t663\nchr17\t26814300\t26822100\t0.0473\t663\nchr17\t26823900\t26885700\t0\t2110\nchr17\t26935800\t26941200\t0.145\t6317\nchr17\t26953200\t26953500\t0.6539\t126\nchr17\t27160800\t27162600\t0.0031\t76\nchr17\t27210300\t27210600\t0.0338\t54\nchr17\t27212100\t27213300\t0.0338\t54\nchr17\t27638400\t27638700\t0.3836\t79\nchr17\t27645600\t27645900\t0.2771\t69\nchr17\t27746100\t27746400\t0.2402\t72\nchr17\t27753000\t27753600\t0.53\t70\nchr17\t27829200\t27831900\t0\t78\nchr17\t27838200\t27840600\t0.0075\t72\nchr17\t27901200\t27901500\t0.3857\t72\nchr17\t28223100\t28224300\t0.265\t85\nchr17\t28455600\t28456500\t0\t26\nchr17\t28576500\t28576800\t0.4387\t59\nchr17\t28581300\t28581600\t0.4313\t46\nchr17\t29202300\t29202600\t0.4405\t54\nchr17\t29895600\t29896500\t0\t38\nchr17\t30439500\t30441900\t0\t99\nchr17\t30616800\t30621900\t0\t71\nchr17\t30625800\t30630600\t0\t76\nchr17\t30632100\t30632400\t0.5302\t79\nchr17\t30635700\t30636000\t0.164\t55\nchr17\t30640200\t30640500\t0.3404\t53\nchr17\t30644100\t30645300\t0.277\t61\nchr17\t30654000\t30655200\t0.0695\t54\nchr17\t30660600\t30660900\t0.4629\t66\nchr17\t30663300\t30663600\t0.2692\t60\nchr17\t30668400\t30669000\t0.0117\t66\nchr17\t30700200\t30700800\t0.1803\t56\nchr17\t30732300\t30732600\t0.0731\t66\nchr17\t30978600\t30981300\t0.1926\t65\nchr17\t31036200\t31036500\t0.2461\t72\nchr17\t31038600\t31038900\t0.2461\t72\nchr17\t31041300\t31041600\t0.2461\t72\nchr17\t31045800\t31046100\t0.5529\t58\nchr17\t31346400\t31348500\t0.2471\t75\nchr17\t31937700\t31938000\t0.0934\t76\nchr17\t31972800\t31973100\t0.3583\t43\nchr17\t32028000\t32028900\t0\t61\nchr17\t32043900\t32044200\t0.4864\t45\nchr17\t32048400\t32048700\t0.5087\t65\nchr17\t32050200\t32050500\t0.5087\t65\nchr17\t32060100\t32061300\t0.3505\t65\nchr17\t32070000\t32071200\t0.1679\t66\nchr17\t32076600\t32076900\t0.402\t57\nchr17\t32079300\t32079600\t0.3901\t67\nchr17\t32084400\t32085000\t0.0559\t58\nchr17\t32088000\t32088300\t0\t57\nchr17\t32090700\t32091600\t0\t57\nchr17\t32679900\t32683800\t0.0028\t96\nchr17\t32817900\t32818200\t0.4974\t38\nchr17\t32887200\t32892900\t0\t79\nchr17\t32921700\t32922900\t0.5796\t61\nchr17\t33542100\t33543000\t0.0525\t63\nchr17\t34083300\t34084200\t0.47\t68\nchr17\t34086000\t34086300\t0.3013\t54\nchr17\t34212300\t34212900\t0.3983\t64\nchr17\t34292700\t34297500\t0.0396\t83\nchr17\t34907700\t34908000\t0.4473\t62\nchr17\t35030100\t35030400\t0.1527\t107\nchr17\t35353500\t35353800\t0.1165\t66\nchr17\t35379300\t35379600\t0.3494\t57\nchr17\t35380800\t35381100\t0.3494\t57\nchr17\t35397000\t35398800\t0.2424\t75\nchr17\t35441700\t35442000\t0.2963\t78\nchr17\t36101100\t36102000\t0.305\t59\nchr17\t36158400\t36158700\t0.4327\t51\nchr17\t36160800\t36168300\t0.0124\t112\nchr17\t36169500\t36180300\t0\t134\nchr17\t36189300\t36189600\t0.4116\t12\nchr17\t36208200\t36209400\t0.0248\t35\nchr17\t36224100\t36230700\t0\t94\nchr17\t36233700\t36234000\t0\t94\nchr17\t36235200\t36236100\t0\t55\nchr17\t36237600\t36238200\t0\t55\nchr17\t36239700\t36443100\t0\t160\nchr17\t36445200\t36445800\t0.2335\t82\nchr17\t36450300\t36453600\t0\t66\nchr17\t36786300\t36786600\t0.3212\t54\nchr17\t37379700\t37380000\t0.2549\t61\nchr17\t37566300\t37566600\t0.1937\t62\nchr17\t37863000\t37863300\t0.4824\t66\nchr17\t37890600\t37901100\t0\t93\nchr17\t37902600\t37966800\t0\t185\nchr17\t37968300\t38250000\t0\t185\nchr17\t38253600\t38253900\t0.0743\t63\nchr17\t38264400\t38265900\t0.4274\t57\nchr17\t38286000\t38286300\t0.6414\t39\nchr17\t38302800\t38303100\t0.3945\t64\nchr17\t38630700\t38632200\t0.0406\t51\nchr17\t38930100\t38930400\t0.2184\t87\nchr17\t40221600\t40221900\t0.2837\t46\nchr17\t41045100\t41045400\t0.5613\t72\nchr17\t41046900\t41047200\t0.4253\t75\nchr17\t41055000\t41055300\t0.2958\t56\nchr17\t41065500\t41065800\t0.2716\t74\nchr17\t41081400\t41082000\t0.1573\t38\nchr17\t41083500\t41084100\t0.1687\t36\nchr17\t41089200\t41089800\t0.4114\t27\nchr17\t41102700\t41103000\t0.5487\t82\nchr17\t41202900\t41206500\t0.0943\t80\nchr17\t41227200\t41227800\t0.0169\t45\nchr17\t41238600\t41239200\t0.0239\t60\nchr17\t41633400\t41633700\t0.6946\t63\nchr17\t42219300\t42219600\t0.2146\t70\nchr17\t42264600\t42265200\t0.2662\t75\nchr17\t42300000\t42300300\t0.329\t64\nchr17\t42337800\t42338400\t0.0909\t41\nchr17\t42550500\t42550800\t0.1898\t45\nchr17\t42660000\t42660300\t0.5044\t39\nchr17\t42973800\t42974100\t0.318\t60\nchr17\t43227600\t43231800\t0\t67\nchr17\t43233000\t43305000\t0\t410\nchr17\t43322700\t43323900\t0\t194\nchr17\t43345800\t43346100\t0.2928\t48\nchr17\t43452900\t43453200\t0.2263\t37\nchr17\t44034600\t44036400\t0.0018\t63\nchr17\t44039400\t44039700\t0.5901\t40\nchr17\t44179800\t44181600\t0.0608\t71\nchr17\t44238900\t44239500\t0.1466\t70\nchr17\t44524800\t44525100\t0.4756\t69\nchr17\t44568900\t44569200\t0.6377\t46\nchr17\t44961600\t44961900\t0.429\t58\nchr17\t44984400\t44985000\t0.3173\t34\nchr17\t45180600\t45181800\t0\t34\nchr17\t45450600\t45451200\t0.3919\t61\nchr17\t45459600\t45459900\t0.5041\t46\nchr17\t45481500\t45481800\t0.3632\t65\nchr17\t45484800\t45485100\t0.3571\t61\nchr17\t45498000\t45498600\t0.0264\t82\nchr17\t45500700\t45501900\t0.0264\t82\nchr17\t45509700\t45522600\t0\t141\nchr17\t45525900\t45529500\t0\t108\nchr17\t45531000\t45536700\t0\t108\nchr17\t45537900\t45561300\t0\t108\nchr17\t45562500\t45563100\t0\t108\nchr17\t45569700\t45570000\t0.2891\t36\nchr17\t45573000\t45573300\t0.3779\t39\nchr17\t45588600\t45588900\t0.6726\t65\nchr17\t45592200\t45592500\t0.5485\t46\nchr17\t45597300\t45600900\t0.0021\t138\nchr17\t45602700\t45603300\t0.0021\t138\nchr17\t45613500\t45613800\t0.5497\t82\nchr17\t45618600\t45618900\t0.236\t51\nchr17\t45621000\t45624000\t0.2044\t82\nchr17\t46221600\t46223100\t0.1677\t92\nchr17\t46224600\t46224900\t0.1677\t92\nchr17\t46226700\t46227000\t0.5402\t60\nchr17\t46228500\t46228800\t0.5968\t74\nchr17\t46232100\t46233600\t0.5279\t102\nchr17\t46237500\t46238100\t0.1447\t56\nchr17\t46242600\t46246800\t0\t105\nchr17\t46293000\t46489200\t0\t150\nchr17\t46491300\t46491900\t0.3945\t73\nchr17\t46493100\t46493400\t0.5294\t74\nchr17\t46494900\t46500000\t0.1951\t133\nchr17\t46503600\t46534200\t0\t114\nchr17\t46535400\t46542300\t0\t114\nchr17\t46543800\t46550400\t0\t115\nchr17\t46551600\t46707000\t0\t125\nchr17\t47016300\t47017500\t0.064\t107\nchr17\t47019000\t47019300\t0.2914\t64\nchr17\t47021400\t47021700\t0.0105\t63\nchr17\t47025600\t47026200\t0.1085\t69\nchr17\t47030100\t47030700\t0.2543\t102\nchr17\t47031900\t47032200\t0.2543\t102\nchr17\t47039100\t47042700\t0\t100\nchr17\t47043900\t47044200\t0\t100\nchr17\t47045700\t47052000\t0\t100\nchr17\t47420700\t47421000\t0.6696\t103\nchr17\t47507100\t47507400\t0.3811\t47\nchr17\t47523000\t47523300\t0.247\t62\nchr17\t47540100\t47540400\t0.5093\t75\nchr17\t47579100\t47579400\t0.3917\t50\nchr17\t47580600\t47580900\t0.4345\t50\nchr17\t47666400\t47666700\t0.5325\t19\nchr17\t48898800\t48899100\t0.3594\t45\nchr17\t49057200\t49057500\t0.3666\t34\nchr17\t49151100\t49151400\t0\t43\nchr17\t49423500\t49424100\t0.0169\t64\nchr17\t50085900\t50086200\t0.5019\t10\nchr17\t50673900\t50674200\t0.6286\t49\nchr17\t50836500\t50836800\t0.5317\t56\nchr17\t50880600\t50880900\t0.3553\t32\nchr17\t50894100\t50894400\t0.2641\t31\nchr17\t51483000\t51484800\t0.222\t113\nchr17\t51624900\t51625200\t0.1893\t73\nchr17\t52185600\t52186500\t0.1435\t64\nchr17\t52405500\t52406100\t0.0545\t82\nchr17\t52408200\t52408500\t0.0545\t82\nchr17\t52655400\t52655700\t0.5827\t52\nchr17\t52657200\t52658400\t0.272\t71\nchr17\t53242800\t53243100\t0.4232\t86\nchr17\t53352300\t53352600\t0.6352\t42\nchr17\t53500800\t53501100\t0.5351\t94\nchr17\t53811000\t53811600\t0.4992\t62\nchr17\t53841600\t53841900\t0.2397\t111\nchr17\t54201600\t54202200\t0.4719\t69\nchr17\t54698100\t54698400\t0.3153\t78\nchr17\t55502400\t55507500\t0.0182\t83\nchr17\t55790400\t55791600\t0.2279\t61\nchr17\t55839600\t55839900\t0.3979\t61\nchr17\t56050200\t56051700\t0.0271\t87\nchr17\t56190000\t56193300\t0.0013\t84\nchr17\t56792700\t56793000\t0.3591\t208\nchr17\t57013200\t57013500\t0.5604\t19\nchr17\t57132000\t57132600\t0.4885\t17\nchr17\t58073400\t58073700\t0.5274\t69\nchr17\t59205300\t59205600\t0.3229\t48\nchr17\t59307900\t59308200\t0.6902\t85\nchr17\t59393400\t59394000\t0.3501\t73\nchr17\t59500800\t59501100\t0.3918\t73\nchr17\t59574000\t59574600\t0\t80\nchr17\t59576100\t59576400\t0\t80\nchr17\t59578200\t59585400\t0\t80\nchr17\t59587200\t59587500\t0.4828\t62\nchr17\t59589300\t59590500\t0.0141\t65\nchr17\t59592600\t59593800\t0.0141\t65\nchr17\t59595300\t59597400\t0.0141\t65\nchr17\t59599200\t59599800\t0.4259\t58\nchr17\t59909100\t59909400\t0.5534\t51\nchr17\t59975700\t59976900\t0.5035\t64\nchr17\t59978100\t59982900\t0.0117\t72\nchr17\t59985000\t59986200\t0.2156\t62\nchr17\t59988000\t59988300\t0.3364\t44\nchr17\t59990100\t59997300\t0\t77\nchr17\t59999100\t60001500\t0\t77\nchr17\t60006900\t60010200\t0.0594\t87\nchr17\t60014400\t60014700\t0.475\t85\nchr17\t60015900\t60016200\t0.475\t85\nchr17\t60017700\t60018000\t0.4676\t71\nchr17\t60020100\t60035400\t0\t93\nchr17\t60042300\t60042600\t0.5295\t57\nchr17\t60099900\t60100200\t0.4594\t18\nchr17\t60111000\t60126600\t0\t86\nchr17\t60206400\t60206700\t0.4058\t53\nchr17\t60213300\t60213600\t0.409\t49\nchr17\t60369000\t60369300\t0.4175\t47\nchr17\t60550800\t60551400\t0.3166\t78\nchr17\t60552600\t60552900\t0.461\t61\nchr17\t60882600\t60886500\t0.0055\t87\nchr17\t60978000\t60979200\t0.3397\t72\nchr17\t61111500\t61114500\t0.0073\t87\nchr17\t61505400\t61505700\t0.4198\t27\nchr17\t62020800\t62021400\t0.2131\t68\nchr17\t62234400\t62235000\t0.0718\t114\nchr17\t62256600\t62256900\t0.247\t84\nchr17\t62263500\t62266800\t0.0448\t74\nchr17\t62268900\t62269500\t0.4706\t64\nchr17\t62271000\t62271300\t0.4272\t68\nchr17\t62272500\t62272800\t0.4272\t68\nchr17\t62274300\t62274600\t0.3558\t61\nchr17\t62788800\t62789100\t0.5585\t41\nchr17\t63457200\t63457500\t0.3504\t98\nchr17\t63862500\t63863100\t0.0306\t65\nchr17\t63872700\t63873300\t0.0589\t92\nchr17\t63886200\t63886800\t0.0547\t64\nchr17\t63895500\t63896400\t0.0076\t80\nchr17\t63915000\t63915600\t0.3315\t73\nchr17\t63921600\t63922200\t0.3193\t59\nchr17\t64364700\t64365000\t0.4485\t63\nchr17\t64797300\t64797600\t0.1958\t65\nchr17\t64828200\t64828500\t0.3677\t66\nchr17\t64831500\t64831800\t0.4507\t65\nchr17\t64855200\t64855500\t0.4734\t65\nchr17\t64864500\t64864800\t0.4828\t73\nchr17\t64867200\t64867500\t0.3968\t72\nchr17\t64873500\t64873800\t0.3165\t84\nchr17\t64881300\t64914900\t0\t119\nchr17\t64918200\t64918500\t0.4811\t78\nchr17\t64956300\t64956600\t0.4367\t67\nchr17\t65764800\t65766300\t0.2482\t57\nchr17\t66269700\t66270000\t0.2375\t68\nchr17\t66596700\t66602400\t0\t88\nchr17\t66798300\t66799800\t0.2375\t1205\nchr17\t66934500\t66934800\t0.4024\t36\nchr17\t67409100\t67409400\t0.4996\t48\nchr17\t67470600\t67471200\t0.0797\t63\nchr17\t67631400\t67631700\t0.3384\t14\nchr17\t68269200\t68269500\t0.0801\t53\nchr17\t68313000\t68313300\t0.4074\t139\nchr17\t68408700\t68410500\t0.0695\t83\nchr17\t68411700\t68412000\t0.4202\t68\nchr17\t68654700\t68656200\t0.3673\t77\nchr17\t68999400\t69000900\t0.0782\t66\nchr17\t69002100\t69003600\t0.0782\t66\nchr17\t69138600\t69138900\t0.2899\t65\nchr17\t69278700\t69279000\t0.4582\t51\nchr17\t69280500\t69280800\t0.2203\t87\nchr17\t69612000\t69613500\t0.3011\t44\nchr17\t69615300\t69616200\t0.388\t74\nchr17\t69740700\t69742200\t0.0812\t99\nchr17\t69808200\t69808500\t0.4969\t34\nchr17\t70154100\t70154400\t0.4565\t51\nchr17\t70163700\t70164300\t0.5895\t65\nchr17\t70458900\t70464900\t0\t90\nchr17\t70544700\t70550700\t0\t101\nchr17\t71352300\t71353800\t0.3058\t84\nchr17\t71355000\t71355300\t0.3058\t84\nchr17\t71356500\t71356800\t0.3058\t84\nchr17\t71608800\t71609400\t0.0089\t27\nchr17\t72060600\t72060900\t0.3434\t49\nchr17\t72236400\t72237000\t0.5657\t97\nchr17\t73147800\t73148400\t0.2875\t43\nchr17\t73332300\t73332600\t0.5559\t63\nchr17\t74301900\t74302200\t0.5978\t42\nchr17\t75194700\t75195000\t0.4749\t21\nchr17\t75401100\t75401400\t0.6546\t46\nchr17\t75477900\t75478200\t0.5449\t23\nchr17\t76679700\t76680000\t0.5947\t51\nchr17\t76991400\t76991700\t0.435\t23\nchr17\t77239800\t77240100\t0.4611\t29\nchr17\t77335500\t77335800\t0.5351\t66\nchr17\t77561400\t77562600\t0.5387\t89\nchr17\t77598900\t77599200\t0.6501\t37\nchr17\t77647200\t77647500\t0.5855\t103\nchr17\t77759700\t77760600\t0.4343\t87\nchr17\t77776500\t77777700\t0.0323\t62\nchr17\t78115500\t78115800\t0.4473\t71\nchr17\t79893900\t79894200\t0.5266\t133\nchr17\t80184600\t80184900\t0.6641\t49\nchr17\t80274600\t80274900\t0.6409\t15\nchr17\t80313900\t80314200\t0.5825\t60\nchr17\t80488500\t80488800\t0.2526\t28\nchr17\t80536800\t80537400\t0.4531\t52\nchr17\t80601600\t80602200\t0\t46\nchr17\t80665200\t80665500\t0.626\t57\nchr17\t80700600\t80700900\t0.6319\t100\nchr17\t80743800\t80744700\t0.4482\t226\nchr17\t80748600\t80749500\t0.2736\t59\nchr17\t80876100\t80876400\t0.6494\t59\nchr17\t80915400\t80915700\t0.4184\t47\nchr17\t80930100\t80930400\t0.6202\t114\nchr17\t80957100\t80957400\t0.5958\t62\nchr17\t80963400\t80963700\t0.1822\t45\nchr17\t81053700\t81054300\t0.4519\t55\nchr17\t81249300\t81249600\t0.4508\t192\nchr17\t81531000\t81532500\t0.4951\t159\nchr17\t81797700\t81798000\t0.4148\t32\nchr17\t81818700\t81819000\t0.444\t53\nchr17\t82162500\t82162800\t0.4546\t44\nchr17\t82448400\t82449000\t0\t62\nchr17\t82575900\t82576200\t0.4474\t28\nchr17\t82579500\t82580700\t0.5445\t71\nchr17\t82586100\t82586700\t0.5362\t147\nchr17\t82671600\t82671900\t0.5296\t25\nchr17\t82692000\t82692300\t0.5739\t60\nchr17\t82696500\t82696800\t0.582\t46\nchr17\t82764600\t82765500\t0.0393\t86\nchr17\t82785000\t82785600\t0.4324\t59\nchr17\t82848900\t82849200\t0.4346\t91\nchr17\t82903800\t82904100\t0.2949\t33\nchr17\t82905600\t82905900\t0.6036\t42\nchr17\t82971600\t82972200\t0.1187\t102\nchr17\t82974900\t82977000\t0.3941\t63\nchr17\t83003400\t83004600\t0.5504\t54\nchr17\t83022300\t83023200\t0.3556\t60\nchr17\t83025300\t83025600\t0.2322\t29\nchr17\t83026800\t83027100\t0.6406\t115\nchr17\t83068200\t83068800\t0.3154\t30\nchr17\t83127600\t83127900\t0.656\t137\nchr17\t83134800\t83135100\t0.6382\t17\nchr17\t83172600\t83173200\t0.6517\t41\nchr17\t83205600\t83206800\t0\t167\nchr17\t83208000\t83239500\t0\t167\nchr17\t83240700\t83247600\t0\t167\nchr18\t9900\t45600\t0\t158\nchr18\t47100\t47400\t0.2698\t126\nchr18\t79200\t79500\t0.5841\t64\nchr18\t86100\t86700\t0.6001\t70\nchr18\t88200\t88500\t0.3603\t65\nchr18\t96900\t98400\t0.3742\t67\nchr18\t106200\t112800\t0.0446\t32919\nchr18\t116100\t118800\t0.0331\t66\nchr18\t126000\t126600\t0.0049\t56\nchr18\t219000\t219600\t0.2311\t71\nchr18\t515100\t515400\t0.3455\t79\nchr18\t536100\t541800\t0\t84\nchr18\t663300\t664800\t0.31\t77\nchr18\t667200\t667500\t0.6163\t35\nchr18\t972300\t974100\t0.0793\t97\nchr18\t975300\t975900\t0.0793\t97\nchr18\t1145700\t1146000\t0.6026\t45\nchr18\t1320900\t1321200\t0.5357\t63\nchr18\t1354500\t1354800\t0.1544\t67\nchr18\t1517100\t1521300\t0.1566\t99\nchr18\t1533900\t1534500\t0.0284\t46\nchr18\t1629300\t1629600\t0.536\t29\nchr18\t1632300\t1634100\t0.2955\t65\nchr18\t1720500\t1721100\t0.0033\t24\nchr18\t2001000\t2001600\t0.1181\t48\nchr18\t2248200\t2249400\t0.236\t91\nchr18\t2251500\t2252400\t0.0771\t168\nchr18\t2343300\t2343600\t0.3125\t110\nchr18\t2426100\t2426400\t0.3032\t56\nchr18\t2542200\t2542500\t0.5201\t51\nchr18\t3736800\t3739500\t0.1639\t84\nchr18\t3741000\t3741300\t0.6973\t71\nchr18\t3997200\t3997500\t0.6689\t33\nchr18\t4473900\t4475700\t0.0683\t84\nchr18\t4477800\t4478100\t0.0683\t84\nchr18\t4510800\t4511100\t0.4459\t185\nchr18\t4649400\t4650600\t0.1137\t60\nchr18\t5007300\t5009700\t0.2381\t74\nchr18\t5281800\t5282100\t0.2181\t86\nchr18\t5332500\t5334600\t0.0142\t56\nchr18\t5681400\t5682300\t0.0029\t69\nchr18\t5684700\t5688300\t0\t94\nchr18\t6034800\t6035100\t0.3878\t68\nchr18\t6272400\t6273600\t0.0151\t107\nchr18\t6419700\t6420300\t0.1714\t101\nchr18\t6541200\t6541500\t0.5819\t52\nchr18\t7099200\t7099500\t0.3688\t56\nchr18\t7399200\t7403100\t0.0679\t74\nchr18\t7625400\t7625700\t0.5427\t130\nchr18\t7692000\t7692300\t0.053\t53\nchr18\t7966800\t7972200\t0.002\t109\nchr18\t8057400\t8063100\t0.0016\t94\nchr18\t8711100\t8711700\t0.1688\t112\nchr18\t9023700\t9024000\t0.4711\t96\nchr18\t9385500\t9385800\t0.4945\t24\nchr18\t9537000\t9537600\t0.3058\t60\nchr18\t9815400\t9816000\t0.0119\t30\nchr18\t10573200\t10574100\t0.0887\t108\nchr18\t10575600\t10576800\t0.1899\t97\nchr18\t10594800\t10595100\t0.4671\t47\nchr18\t10606200\t10608000\t0.0544\t64\nchr18\t10610700\t10611000\t0.4213\t60\nchr18\t10614600\t10616100\t0.1381\t54\nchr18\t10623000\t10623300\t0.4559\t61\nchr18\t10627500\t10627800\t0.5981\t34\nchr18\t10642800\t10644600\t0.114\t78\nchr18\t10645800\t10646400\t0.1295\t42\nchr18\t10911000\t10911600\t0.4144\t73\nchr18\t10914900\t10915500\t0.2506\t62\nchr18\t11611500\t11611800\t0.5211\t76\nchr18\t11620200\t11622300\t0.3053\t92\nchr18\t11623500\t11624100\t0.3053\t92\nchr18\t11634000\t11636700\t0.2514\t65\nchr18\t11641200\t11641500\t0.4711\t73\nchr18\t11643300\t11643600\t0.338\t50\nchr18\t11645400\t11647200\t0.4127\t56\nchr18\t11804100\t11804700\t0.1491\t56\nchr18\t12077700\t12078000\t0.1295\t72\nchr18\t12081600\t12081900\t0.0693\t47\nchr18\t12141600\t12144900\t0\t77\nchr18\t12147000\t12150000\t0\t86\nchr18\t12176700\t12177300\t0.4933\t73\nchr18\t12178800\t12180600\t0.2801\t71\nchr18\t12202800\t12208500\t0.0108\t83\nchr18\t12216600\t12216900\t0.4918\t68\nchr18\t12219600\t12219900\t0.5601\t74\nchr18\t12228000\t12229800\t0.0548\t68\nchr18\t12851100\t12851400\t0.4985\t33\nchr18\t12896400\t12896700\t0.3147\t44\nchr18\t12955200\t12956700\t0.4758\t53\nchr18\t13674600\t13676400\t0.5359\t79\nchr18\t13975800\t13981800\t0\t80\nchr18\t14164800\t14165400\t0.0266\t64\nchr18\t14255100\t14255400\t0.6873\t163\nchr18\t14267100\t14267400\t0.3884\t68\nchr18\t14282700\t14283000\t0.5674\t70\nchr18\t14310900\t14311200\t0.3741\t49\nchr18\t14322300\t14322600\t0.5398\t115\nchr18\t14325600\t14325900\t0.4036\t44\nchr18\t14367000\t14367300\t0.6889\t25\nchr18\t14368800\t14369100\t0.5311\t49\nchr18\t14382300\t14382600\t0.346\t66\nchr18\t14384400\t14385000\t0.1906\t58\nchr18\t14387100\t14389200\t0.0292\t80\nchr18\t14443500\t14443800\t0.4933\t48\nchr18\t14451300\t14452800\t0.2917\t52\nchr18\t14454300\t14454600\t0.1512\t55\nchr18\t14490300\t14490600\t0.3024\t51\nchr18\t14499000\t14499600\t0.4302\t41\nchr18\t14509800\t14510100\t0.5998\t40\nchr18\t14511600\t14511900\t0.3172\t42\nchr18\t14518500\t14518800\t0.2134\t45\nchr18\t14545500\t14545800\t0.5313\t23\nchr18\t14559000\t14559300\t0.5021\t44\nchr18\t14560500\t14560800\t0.1511\t42\nchr18\t14562000\t14562300\t0.2252\t40\nchr18\t14571000\t14571300\t0.589\t43\nchr18\t14589900\t14590200\t0.248\t55\nchr18\t14594400\t14595000\t0.4657\t62\nchr18\t14613000\t14613300\t0.1869\t57\nchr18\t14616000\t14616300\t0.2524\t43\nchr18\t14618100\t14618400\t0.2524\t43\nchr18\t14621700\t14622000\t0.5946\t60\nchr18\t14623500\t14624400\t0.1974\t77\nchr18\t14629200\t14630100\t0.1696\t58\nchr18\t14634000\t14634600\t0.1222\t48\nchr18\t14636100\t14636400\t0.6832\t22\nchr18\t14656500\t14657700\t0.2455\t57\nchr18\t14663400\t14663700\t0.249\t72\nchr18\t14669400\t14669700\t0.3951\t72\nchr18\t14670900\t14671200\t0.3951\t72\nchr18\t14673000\t14673900\t0.2534\t52\nchr18\t14675400\t14675700\t0.626\t44\nchr18\t14689200\t14689500\t0.0249\t12\nchr18\t14718300\t14718600\t0.1676\t54\nchr18\t14720400\t14721600\t0.1676\t54\nchr18\t14727000\t14728500\t0.2759\t53\nchr18\t14800500\t14804400\t0\t54\nchr18\t14806500\t14807700\t0.3072\t34\nchr18\t14811600\t14815500\t0\t60\nchr18\t14819100\t14819400\t0.4278\t48\nchr18\t14822700\t14823300\t0.0226\t64\nchr18\t14856000\t14859900\t0.0196\t67\nchr18\t14861400\t14861700\t0.228\t63\nchr18\t14863800\t14864100\t0.5184\t57\nchr18\t14877300\t14877600\t0.4048\t56\nchr18\t14883900\t14884200\t0.3983\t20\nchr18\t14891400\t14891700\t0.3236\t54\nchr18\t14893800\t14894100\t0.3482\t52\nchr18\t15026700\t15027300\t0.3012\t76\nchr18\t15032100\t15032400\t0.2295\t67\nchr18\t15138000\t15139800\t0.2937\t61\nchr18\t15155100\t15155400\t0.347\t41\nchr18\t15159300\t15159600\t0.1593\t57\nchr18\t15171900\t15172200\t0.2391\t151\nchr18\t15174300\t15175500\t0.6923\t104\nchr18\t15189300\t15189600\t0.6478\t54\nchr18\t15213000\t15216000\t0\t72\nchr18\t15220200\t15220500\t0.5157\t81\nchr18\t15273600\t15273900\t0.3049\t24\nchr18\t15304800\t15305100\t0.4816\t50\nchr18\t15329100\t15329700\t0.5622\t52\nchr18\t15338100\t15338400\t0.4716\t76\nchr18\t15353100\t15353400\t0.3374\t58\nchr18\t15357600\t15357900\t0.3457\t63\nchr18\t15363600\t15363900\t0.2157\t67\nchr18\t15370500\t15370800\t0.5197\t68\nchr18\t15373200\t15373500\t0.5396\t85\nchr18\t15461400\t15661800\t0\t430\nchr18\t15663300\t15666000\t0\t155\nchr18\t15667200\t15691800\t0\t210\nchr18\t15693000\t15720600\t0\t210\nchr18\t15722100\t15751500\t0\t210\nchr18\t15753300\t15758700\t0\t210\nchr18\t15760200\t15769800\t0\t210\nchr18\t15771000\t15781200\t0\t193\nchr18\t15783000\t15783300\t0\t193\nchr18\t15784800\t15786600\t0.0375\t79\nchr18\t15787800\t15788400\t0\t31\nchr18\t15791100\t19415700\t0\t710\nchr18\t19416900\t19622700\t0\t710\nchr18\t19623900\t20198400\t0\t710\nchr18\t20199600\t20562300\t0\t710\nchr18\t20563800\t20564700\t0\t710\nchr18\t20571600\t20574000\t0.0038\t72\nchr18\t20576400\t20577900\t0\t117\nchr18\t20579100\t20586600\t0\t117\nchr18\t20590500\t20592600\t0.0262\t87\nchr18\t20594400\t20598600\t0\t180\nchr18\t20599800\t20735700\t0\t180\nchr18\t20737500\t20739900\t0\t113\nchr18\t20741400\t20742900\t0\t75\nchr18\t20744400\t20781000\t0\t165\nchr18\t20782500\t20785500\t0\t165\nchr18\t20787300\t20798400\t0\t165\nchr18\t20799600\t20808300\t0\t165\nchr18\t20810400\t20812500\t0\t165\nchr18\t20813700\t20815800\t0\t104\nchr18\t20817300\t20823000\t0\t61\nchr18\t20824800\t20825400\t0\t61\nchr18\t20827500\t20828100\t0\t61\nchr18\t20829300\t20829900\t0\t61\nchr18\t20832000\t20832300\t0\t95\nchr18\t20833500\t20839800\t0\t95\nchr18\t20911200\t20920800\t0\t201\nchr18\t20922300\t20932200\t0\t201\nchr18\t20934900\t20936100\t0.1353\t42\nchr18\t20945400\t20946300\t0.0073\t65\nchr18\t20950500\t20950800\t0.6818\t43\nchr18\t20954100\t20954400\t0.0809\t61\nchr18\t20955600\t20955900\t0.2531\t60\nchr18\t20959500\t20959800\t0.4612\t46\nchr18\t21027900\t21028200\t0.5208\t65\nchr18\t21144900\t21145200\t0.3423\t71\nchr18\t21156000\t21156300\t0.323\t53\nchr18\t21160200\t21160500\t0.2103\t45\nchr18\t21738600\t21738900\t0.4444\t78\nchr18\t21883500\t21885300\t0.2373\t90\nchr18\t22077600\t22078200\t0.4918\t82\nchr18\t22273800\t22274100\t0.5179\t16\nchr18\t22530600\t22534200\t0.0243\t72\nchr18\t22581600\t22582200\t0.0083\t30\nchr18\t22721700\t22722600\t0.284\t82\nchr18\t22744500\t22744800\t0.2865\t83\nchr18\t22819500\t22820400\t0.0228\t43\nchr18\t24323700\t24324000\t0.1285\t37\nchr18\t24619200\t24624300\t0.0357\t95\nchr18\t24711000\t24713400\t0.0342\t88\nchr18\t24714900\t24715800\t0.0342\t88\nchr18\t25033500\t25033800\t0.4488\t72\nchr18\t25485000\t25487400\t0\t83\nchr18\t26167800\t26170200\t0.1695\t65\nchr18\t26247900\t26248800\t0.0014\t26\nchr18\t26393400\t26393700\t0.446\t89\nchr18\t26829000\t26829900\t0.3933\t73\nchr18\t27280200\t27285000\t0.1703\t77\nchr18\t27511500\t27512700\t0.388\t69\nchr18\t27514200\t27516000\t0.1694\t76\nchr18\t27531600\t27532200\t0.3022\t59\nchr18\t27737700\t27738600\t0.0132\t105\nchr18\t27739800\t27742200\t0.0132\t105\nchr18\t28217400\t28217700\t0.1535\t39\nchr18\t28242600\t28243500\t0.4296\t63\nchr18\t28416600\t28421400\t0.021\t123\nchr18\t28783800\t28784100\t0\t22\nchr18\t28942200\t28943100\t0.1711\t64\nchr18\t29150700\t29151900\t0.3025\t71\nchr18\t29168100\t29168400\t0.3872\t33\nchr18\t29552700\t29553300\t0.1552\t67\nchr18\t30022200\t30026400\t0\t81\nchr18\t30049800\t30050100\t0.5582\t19\nchr18\t31150200\t31150500\t0.6851\t80\nchr18\t31348500\t31351800\t0.0281\t103\nchr18\t31353000\t31353300\t0.0281\t103\nchr18\t31960500\t31960800\t0.3643\t12\nchr18\t32041500\t32041800\t0.6081\t35\nchr18\t32228400\t32229900\t0.1442\t77\nchr18\t32857200\t32862600\t0.0078\t80\nchr18\t33388500\t33388800\t0.5897\t43\nchr18\t33881100\t33881400\t0.3072\t82\nchr18\t34332000\t34334400\t0.2321\t72\nchr18\t34335900\t34336500\t0.3568\t65\nchr18\t34552800\t34555200\t0.0409\t86\nchr18\t34557000\t34557300\t0.0409\t86\nchr18\t34714200\t34714500\t0.4036\t54\nchr18\t34899300\t34899600\t0.1981\t54\nchr18\t35033700\t35034000\t0.4348\t68\nchr18\t35206800\t35209800\t0.0023\t84\nchr18\t35211000\t35211300\t0.0023\t84\nchr18\t35370600\t35370900\t0.6828\t39\nchr18\t35792700\t35793000\t0.4546\t66\nchr18\t36235200\t36237300\t0.0997\t87\nchr18\t36238500\t36240600\t0.0997\t87\nchr18\t36986400\t36987300\t0.0145\t60\nchr18\t37074900\t37075200\t0.6369\t66\nchr18\t37078500\t37078800\t0.3166\t61\nchr18\t37338000\t37338300\t0.5447\t39\nchr18\t37819800\t37825500\t0\t77\nchr18\t37842300\t37842600\t0.4049\t62\nchr18\t37941000\t37941900\t0.1615\t79\nchr18\t37969800\t37970400\t0.1147\t52\nchr18\t37973400\t37973700\t0.246\t65\nchr18\t39124200\t39124500\t0.2177\t73\nchr18\t39254400\t39255000\t0.1227\t71\nchr18\t39256200\t39256500\t0.1227\t71\nchr18\t39481800\t39482100\t0.5826\t34\nchr18\t39566100\t39571200\t0.0024\t79\nchr18\t39860100\t39861600\t0.0309\t61\nchr18\t39925800\t39926100\t0.187\t73\nchr18\t39927900\t39928500\t0.187\t73\nchr18\t39930000\t39930300\t0.187\t73\nchr18\t40188600\t40190400\t0.331\t71\nchr18\t40845000\t40848000\t0\t92\nchr18\t41634000\t41637600\t0.0488\t88\nchr18\t41775300\t41781000\t0\t91\nchr18\t42265800\t42266100\t0.4019\t51\nchr18\t43291200\t43291800\t0.2927\t63\nchr18\t43298100\t43300200\t0.0946\t83\nchr18\t43325100\t43326600\t0.0769\t92\nchr18\t43451700\t43452600\t0\t46\nchr18\t43872000\t43872300\t0.1508\t61\nchr18\t43873500\t43873800\t0.1508\t61\nchr18\t45030000\t45030600\t0.3416\t66\nchr18\t45080400\t45081000\t0\t37\nchr18\t45235800\t45236400\t0.4017\t27\nchr18\t45681000\t45681300\t0.3399\t28\nchr18\t46546200\t46546800\t0.3995\t153\nchr18\t46802700\t46803000\t0.5714\t50\nchr18\t46962000\t46970100\t0\t351\nchr18\t47019900\t47031300\t0\t325\nchr18\t47348400\t47348700\t0.0737\t57\nchr18\t47349900\t47352300\t0.3127\t80\nchr18\t47401200\t47401500\t0.3447\t51\nchr18\t47642700\t47643300\t0.3279\t72\nchr18\t47660400\t47666400\t0\t89\nchr18\t48276600\t48277500\t0.0521\t54\nchr18\t48281700\t48282300\t0.3079\t69\nchr18\t48469800\t48470100\t0.0721\t24\nchr18\t48510900\t48511500\t0.0436\t108\nchr18\t48870000\t48870600\t0.6321\t80\nchr18\t49202400\t49203900\t0.2051\t105\nchr18\t49220400\t49220700\t0.4203\t81\nchr18\t49292400\t49292700\t0.6588\t66\nchr18\t49577100\t49579200\t0.1285\t87\nchr18\t49771500\t49773300\t0.3059\t70\nchr18\t49774500\t49775100\t0.1698\t67\nchr18\t50149800\t50150400\t0.2194\t61\nchr18\t50343900\t50349600\t0\t88\nchr18\t51676800\t51677400\t0.4206\t55\nchr18\t51741300\t51745800\t0.0113\t112\nchr18\t51830400\t51830700\t0.4482\t70\nchr18\t52405200\t52405500\t0.5914\t58\nchr18\t52792500\t52793100\t0.1119\t881\nchr18\t53086500\t53086800\t0.5342\t16\nchr18\t53110500\t53111100\t0.3073\t57\nchr18\t53173800\t53174100\t0.0651\t57\nchr18\t53175900\t53176500\t0.3035\t80\nchr18\t53399700\t53400000\t0.4807\t19\nchr18\t53427600\t53427900\t0.6555\t38\nchr18\t53515500\t53517300\t0.2391\t79\nchr18\t53562300\t53562600\t0.4408\t54\nchr18\t53741100\t53741400\t0.3773\t69\nchr18\t53861400\t53861700\t0.507\t59\nchr18\t54342600\t54344700\t0.0088\t68\nchr18\t54400200\t54400500\t0.1752\t60\nchr18\t54426600\t54430500\t0\t68\nchr18\t54664500\t54664800\t0.3033\t73\nchr18\t54728700\t54729000\t0.4791\t90\nchr18\t55716000\t55716300\t0.531\t81\nchr18\t55717800\t55720200\t0.3141\t73\nchr18\t55887900\t55891500\t0.0222\t81\nchr18\t56529600\t56530200\t0.0778\t81\nchr18\t57263700\t57265200\t0.1302\t78\nchr18\t57495900\t57496800\t0.376\t77\nchr18\t57642300\t57642600\t0.1141\t113\nchr18\t57720000\t57725400\t0.0601\t92\nchr18\t58134300\t58134600\t0.4145\t23\nchr18\t58170300\t58171500\t0\t67\nchr18\t59113800\t59114100\t0.4596\t50\nchr18\t59404200\t59409600\t0\t107\nchr18\t59925600\t59925900\t0.3444\t36\nchr18\t60030900\t60035100\t0.1316\t78\nchr18\t60927900\t60928500\t0.1113\t76\nchr18\t61005900\t61006200\t0.6294\t57\nchr18\t61023300\t61023900\t0.1516\t38\nchr18\t61074600\t61075500\t0\t72\nchr18\t61145100\t61145400\t0.3074\t71\nchr18\t61311300\t61311600\t0.1643\t66\nchr18\t61313400\t61313700\t0.1643\t66\nchr18\t61513200\t61513500\t0.1748\t75\nchr18\t61514700\t61515000\t0.1748\t75\nchr18\t61561500\t61562100\t0.0272\t69\nchr18\t61716000\t61718400\t0.1092\t75\nchr18\t61903500\t61903800\t0.5733\t41\nchr18\t62039700\t62040000\t0.5978\t55\nchr18\t62052300\t62052600\t0.4832\t72\nchr18\t62096400\t62097600\t0.3457\t56\nchr18\t62581200\t62581800\t0.178\t36\nchr18\t62906400\t62912100\t0\t103\nchr18\t63063600\t63063900\t0.1234\t218\nchr18\t63363300\t63363600\t0.3128\t44\nchr18\t63469500\t63470100\t0.2904\t38\nchr18\t63635400\t63636000\t0.576\t66\nchr18\t63644400\t63644700\t0.4459\t64\nchr18\t63653400\t63653700\t0.3082\t54\nchr18\t63662100\t63662400\t0.4781\t56\nchr18\t63734100\t63734400\t0.5003\t65\nchr18\t63863100\t63866400\t0.0027\t70\nchr18\t64368900\t64369200\t0.3824\t52\nchr18\t64880100\t64880700\t0.285\t63\nchr18\t65295600\t65295900\t0.4118\t79\nchr18\t65393100\t65393400\t0.3363\t25\nchr18\t65582100\t65582400\t0.411\t44\nchr18\t65583900\t65584200\t0.2081\t45\nchr18\t65779500\t65780700\t0.0385\t44\nchr18\t65781900\t65782200\t0.6386\t32\nchr18\t65866200\t65866500\t0.5269\t46\nchr18\t66547800\t66548100\t0.4387\t31\nchr18\t66677400\t66677700\t0.5233\t53\nchr18\t66717300\t66718500\t0.2532\t67\nchr18\t66875700\t66876000\t0.3879\t37\nchr18\t67542600\t67542900\t0.6696\t49\nchr18\t68226600\t68228100\t0.0122\t68\nchr18\t68538300\t68541600\t0\t61\nchr18\t68785500\t68786700\t0.2248\t76\nchr18\t68788500\t68789700\t0.2248\t76\nchr18\t68859300\t68859900\t0.0539\t52\nchr18\t69252900\t69253200\t0.3426\t105\nchr18\t69450000\t69454800\t0.0578\t102\nchr18\t69760800\t69761100\t0.6656\t63\nchr18\t70685100\t70686600\t0.0115\t136\nchr18\t70746600\t70752600\t0\t76\nchr18\t70855500\t70855800\t0.3968\t76\nchr18\t70857300\t70857600\t0.3968\t76\nchr18\t71093700\t71094000\t0.2854\t69\nchr18\t71123700\t71124600\t0.4284\t65\nchr18\t71179500\t71179800\t0.0301\t24\nchr18\t71356800\t71357400\t0.1558\t54\nchr18\t71655600\t71657700\t0.0508\t45\nchr18\t71791800\t71793000\t0.3485\t48\nchr18\t72162300\t72162600\t0.3201\t55\nchr18\t72966600\t72972300\t0\t94\nchr18\t72975600\t72976800\t0.0481\t75\nchr18\t73166700\t73167000\t0.2976\t59\nchr18\t73328700\t73329000\t0.5889\t87\nchr18\t73444200\t73444500\t0.3092\t79\nchr18\t73628700\t73629000\t0.6399\t38\nchr18\t74010000\t74010300\t0.6013\t59\nchr18\t74204700\t74205000\t0.5636\t109\nchr18\t74485200\t74485500\t0.0805\t15\nchr18\t74616600\t74617200\t0.6284\t277\nchr18\t74998500\t74999400\t0.0004\t90\nchr18\t75299700\t75300000\t0.4777\t45\nchr18\t75591000\t75591300\t0.4051\t83\nchr18\t75846900\t75853200\t0\t112\nchr18\t76001400\t76002000\t0.3645\t56\nchr18\t76585500\t76585800\t0.3629\t58\nchr18\t76645800\t76646400\t0.4181\t68\nchr18\t76744200\t76744500\t0.67\t38\nchr18\t76792500\t76792800\t0.5975\t49\nchr18\t76810200\t76810500\t0.3867\t52\nchr18\t76858800\t76859100\t0.5067\t25\nchr18\t76967100\t76967700\t0.3097\t126\nchr18\t77028000\t77028600\t0.0699\t70\nchr18\t77252700\t77253000\t0.5226\t197\nchr18\t77416500\t77419800\t0.2033\t73\nchr18\t77670300\t77670600\t0.3643\t13\nchr18\t77969400\t77969700\t0.6249\t50\nchr18\t78010200\t78010500\t0.6614\t106\nchr18\t78229500\t78229800\t0.6706\t10\nchr18\t78370800\t78373200\t0.0129\t96\nchr18\t78409500\t78409800\t0.5717\t18\nchr18\t78437400\t78438300\t0.0625\t334\nchr18\t78442800\t78443100\t0.4704\t49\nchr18\t78485700\t78486300\t0.4519\t33\nchr18\t78502500\t78503100\t0.0018\t74\nchr18\t78504600\t78504900\t0.6346\t28\nchr18\t78513000\t78514800\t0.2194\t112\nchr18\t78633300\t78633900\t0.2947\t72\nchr18\t78654300\t78654600\t0.5724\t24\nchr18\t78753900\t78754500\t0.1537\t36\nchr18\t78782100\t78782700\t0.3774\t35\nchr18\t78787200\t78787500\t0.4951\t34\nchr18\t78840300\t78840600\t0.6005\t94\nchr18\t78916200\t78917400\t0.5466\t126\nchr18\t79014300\t79017000\t0.1763\t189\nchr18\t79033500\t79036800\t0.2596\t122\nchr18\t79098300\t79098600\t0.4336\t42\nchr18\t79115100\t79116900\t0.0367\t70\nchr18\t79145400\t79146300\t0.488\t81\nchr18\t79200600\t79200900\t0.5813\t459\nchr18\t79245900\t79246200\t0.6712\t36\nchr18\t79284900\t79285200\t0.4845\t62\nchr18\t79287900\t79288200\t0.4172\t61\nchr18\t79308600\t79309500\t0.1281\t121\nchr18\t79326000\t79326600\t0.3208\t72\nchr18\t79341300\t79341600\t0.5903\t62\nchr18\t79356900\t79358700\t0.0552\t111\nchr18\t79367100\t79367400\t0.4007\t65\nchr18\t79374300\t79374600\t0.45\t87\nchr18\t79417200\t79417800\t0.4769\t30\nchr18\t79494300\t79494600\t0.5074\t51\nchr18\t79504800\t79505700\t0.3199\t77\nchr18\t79525200\t79525500\t0.4277\t43\nchr18\t79550100\t79551900\t0\t27\nchr18\t79556400\t79556700\t0.4357\t12\nchr18\t79618500\t79620900\t0.3568\t522\nchr18\t79648500\t79648800\t0.644\t27\nchr18\t79686900\t79687500\t0.3706\t94\nchr18\t79691700\t79692000\t0.3874\t20\nchr18\t79745400\t79746300\t0\t37\nchr18\t79752300\t79753200\t0.0878\t82\nchr18\t79764600\t79765500\t0.1719\t57\nchr18\t79771200\t79771500\t0.593\t75\nchr18\t79780200\t79780500\t0.5169\t30\nchr18\t79808400\t79809300\t0.1089\t66\nchr18\t79830900\t79831500\t0.0503\t61\nchr18\t79885800\t79887000\t0\t69\nchr18\t79919400\t79921800\t0.1145\t109\nchr18\t79998600\t79998900\t0.3776\t66\nchr18\t80015700\t80016300\t0.3031\t72\nchr18\t80028000\t80028300\t0.4373\t74\nchr18\t80071200\t80073300\t0.0439\t110\nchr18\t80075100\t80075700\t0.4657\t35\nchr18\t80207100\t80207400\t0.4176\t50\nchr18\t80258100\t80258700\t0.3921\t105\nchr18\t80262900\t80263500\t0.191\t402\nchr19\t60000\t236700\t0\t171\nchr19\t239100\t240000\t0.083\t95\nchr19\t241200\t243600\t0.083\t95\nchr19\t249600\t251100\t0.2066\t95\nchr19\t270000\t270600\t0.5792\t72\nchr19\t299100\t300600\t0.6059\t58\nchr19\t312600\t313200\t0.2867\t74\nchr19\t332400\t333900\t0.0197\t62\nchr19\t360900\t361800\t0.1338\t78\nchr19\t377400\t377700\t0.6908\t28\nchr19\t382200\t382500\t0.6077\t57\nchr19\t395100\t395400\t0.4611\t40\nchr19\t399900\t400500\t0.1577\t37\nchr19\t411000\t411300\t0.4038\t54\nchr19\t423300\t423600\t0.37\t60\nchr19\t426600\t426900\t0.3432\t46\nchr19\t432000\t434100\t0.1025\t72\nchr19\t491700\t492000\t0.3177\t24\nchr19\t524700\t525300\t0.3196\t96\nchr19\t534600\t534900\t0.5274\t37\nchr19\t540000\t540300\t0.4355\t11\nchr19\t564000\t565500\t0.0924\t41\nchr19\t602100\t602400\t0.5754\t54\nchr19\t605400\t605700\t0.4636\t39\nchr19\t735300\t735900\t0.5519\t67\nchr19\t853800\t854100\t0.5719\t49\nchr19\t950100\t950400\t0.4096\t47\nchr19\t1033800\t1034700\t0.1481\t20\nchr19\t1049400\t1050000\t0.6644\t23\nchr19\t1148400\t1149000\t0.0781\t45\nchr19\t1164600\t1164900\t0.6792\t66\nchr19\t1195200\t1198500\t0\t47\nchr19\t1627800\t1629000\t0.3196\t60\nchr19\t2347800\t2349600\t0.3248\t58\nchr19\t2418300\t2419200\t0.2378\t32\nchr19\t2433000\t2433600\t0.509\t37\nchr19\t2643300\t2643600\t0.6219\t48\nchr19\t2713500\t2714100\t0.202\t110\nchr19\t2772900\t2773800\t0.4628\t61\nchr19\t2928600\t2929200\t0.5578\t28\nchr19\t3177600\t3178200\t0.1305\t47\nchr19\t3332400\t3332700\t0.4504\t25\nchr19\t3648900\t3649800\t0\t90\nchr19\t3937500\t3937800\t0.6811\t28\nchr19\t3973200\t3975000\t0\t43\nchr19\t4011600\t4011900\t0.5436\t43\nchr19\t4035600\t4036200\t0.5005\t170\nchr19\t4512900\t4513200\t0.5132\t63\nchr19\t4618500\t4619400\t0.4681\t43\nchr19\t4947300\t4947600\t0.5588\t69\nchr19\t4960800\t4961400\t0.1641\t50\nchr19\t5044200\t5044500\t0.5621\t49\nchr19\t5076000\t5076600\t0.2967\t97\nchr19\t5498400\t5498700\t0.3579\t48\nchr19\t5610900\t5611800\t0\t58\nchr19\t5648700\t5649600\t0\t61\nchr19\t5702700\t5703000\t0.3301\t64\nchr19\t5731500\t5731800\t0.4867\t40\nchr19\t6069900\t6070200\t0.5724\t170\nchr19\t6356100\t6356400\t0.2947\t64\nchr19\t6693900\t6694200\t0.6923\t50\nchr19\t7007100\t7007700\t0.04\t67\nchr19\t7010100\t7010700\t0.0217\t68\nchr19\t7019100\t7032900\t0\t103\nchr19\t7035000\t7035300\t0.0493\t84\nchr19\t7037100\t7052400\t0\t103\nchr19\t7055400\t7061400\t0\t129\nchr19\t7124400\t7124700\t0.5271\t23\nchr19\t7450500\t7451100\t0.6744\t1047\nchr19\t7765800\t7766100\t0.6327\t48\nchr19\t8268600\t8268900\t0.4875\t71\nchr19\t8272200\t8301300\t0\t53\nchr19\t8449500\t8449800\t0.4907\t17\nchr19\t8543700\t8544000\t0.45\t49\nchr19\t8720100\t8720400\t0.4329\t101\nchr19\t8740800\t8787600\t0\t267\nchr19\t8904000\t8904300\t0.5052\t41\nchr19\t8912400\t8912700\t0.2547\t82\nchr19\t9227700\t9228000\t0.4891\t59\nchr19\t11209500\t11209800\t0.6755\t47\nchr19\t11424600\t11424900\t0.212\t22\nchr19\t11909700\t11910000\t0.3944\t56\nchr19\t12005400\t12007800\t0.1082\t70\nchr19\t12393000\t12393600\t0.3006\t56\nchr19\t12402600\t12402900\t0.6223\t57\nchr19\t12492900\t12493200\t0.411\t39\nchr19\t12621900\t12622200\t0.252\t43\nchr19\t12775800\t12776100\t0.4959\t45\nchr19\t13535700\t13536300\t0.3648\t14\nchr19\t13702800\t13704600\t0.1915\t69\nchr19\t13936800\t13937100\t0.2977\t28\nchr19\t14585700\t14586000\t0.2307\t65\nchr19\t14589900\t14590200\t0.1833\t61\nchr19\t14622300\t14623200\t0\t54\nchr19\t14649600\t14649900\t0.4291\t35\nchr19\t14749500\t14750100\t0.2925\t13\nchr19\t15362400\t15363000\t0.3641\t84\nchr19\t15581100\t15581400\t0.4925\t23\nchr19\t15674100\t15674400\t0.3333\t14\nchr19\t15708000\t15708600\t0.2329\t47\nchr19\t15713400\t15714000\t0.3232\t65\nchr19\t15778200\t15778500\t0.5846\t51\nchr19\t15931500\t15934200\t0.0489\t258\nchr19\t16875600\t16875900\t0.6169\t85\nchr19\t17349000\t17349300\t0.2568\t103\nchr19\t18550500\t18550800\t0.2366\t39\nchr19\t20018100\t20018400\t0.3698\t53\nchr19\t20064000\t20064300\t0.4958\t13\nchr19\t20138100\t20138700\t0.4366\t86\nchr19\t20148600\t20150700\t0.0801\t54\nchr19\t20260200\t20260500\t0.408\t70\nchr19\t20559900\t20560200\t0.3793\t54\nchr19\t20797200\t20797500\t0.4543\t31\nchr19\t20813100\t20813400\t0.4921\t31\nchr19\t20829600\t20829900\t0.6501\t17\nchr19\t20895300\t20895600\t0.4625\t80\nchr19\t20952000\t20953200\t0.1991\t43\nchr19\t21005100\t21005400\t0.4961\t53\nchr19\t21681600\t21681900\t0.375\t65\nchr19\t21720300\t21722700\t0\t57\nchr19\t21776100\t21776400\t0.4566\t54\nchr19\t21864900\t21867000\t0.0265\t74\nchr19\t21875700\t21876000\t0.3102\t71\nchr19\t22106400\t22108500\t0.337\t75\nchr19\t22392300\t22392600\t0.3292\t52\nchr19\t22394100\t22394400\t0.3708\t63\nchr19\t22397700\t22398000\t0.6278\t36\nchr19\t22542300\t22542600\t0.4039\t40\nchr19\t22662600\t22662900\t0.3596\t57\nchr19\t22664400\t22664700\t0.5784\t59\nchr19\t22822500\t22822800\t0.3741\t158\nchr19\t22915800\t22916100\t0.2118\t76\nchr19\t22925700\t22928400\t0.0397\t65\nchr19\t23134500\t23135100\t0.1443\t83\nchr19\t23138100\t23138400\t0.5992\t30\nchr19\t23369700\t23370000\t0.4055\t58\nchr19\t23431800\t23432100\t0.396\t65\nchr19\t23803500\t23803800\t0.4913\t44\nchr19\t23890800\t23891100\t0.5147\t61\nchr19\t24111600\t24112200\t0.5058\t86\nchr19\t24114300\t24114600\t0.1455\t59\nchr19\t24396000\t24396300\t0.5523\t80\nchr19\t24411000\t24413700\t0\t77\nchr19\t24417000\t24417300\t0.4868\t192\nchr19\t24418500\t24449100\t0\t427\nchr19\t24891300\t24895800\t0.0686\t651\nchr19\t24908400\t24908700\t0.006\t87\nchr19\t27270900\t27271200\t0.3095\t92\nchr19\t27276600\t27276900\t0.6268\t122\nchr19\t27301800\t27302100\t0.5397\t125\nchr19\t27309000\t27309300\t0.6673\t113\nchr19\t27315600\t27315900\t0.606\t102\nchr19\t27336600\t27336900\t0.6479\t130\nchr19\t27420300\t27420600\t0.3988\t61\nchr19\t27637500\t27641100\t0.1251\t81\nchr19\t27642600\t27646200\t0.1251\t81\nchr19\t28048500\t28048800\t0.5433\t53\nchr19\t28050600\t28050900\t0.4578\t53\nchr19\t28629000\t28629300\t0.4291\t35\nchr19\t28678200\t28678500\t0.2025\t74\nchr19\t28805100\t28805400\t0.2978\t59\nchr19\t28806600\t28806900\t0.2978\t59\nchr19\t29229600\t29231400\t0\t71\nchr19\t29459400\t29465100\t0\t73\nchr19\t29717700\t29718000\t0.4613\t51\nchr19\t29898000\t29902200\t0\t72\nchr19\t29985000\t29985300\t0.6119\t43\nchr19\t30141300\t30144000\t0\t65\nchr19\t30526500\t30526800\t0.5818\t38\nchr19\t31506900\t31507500\t0.3713\t64\nchr19\t31653600\t31654500\t0\t64\nchr19\t32590200\t32591700\t0.2744\t102\nchr19\t32746200\t32746500\t0.675\t50\nchr19\t32849400\t32849700\t0.2699\t93\nchr19\t33757200\t33757800\t0.5773\t58\nchr19\t34078500\t34080600\t0\t63\nchr19\t34616400\t34616700\t0.1092\t55\nchr19\t34861200\t34865100\t0.049\t94\nchr19\t35358600\t35360700\t0.038\t78\nchr19\t35371200\t35372700\t0.3392\t89\nchr19\t36247200\t36247800\t0.1559\t114\nchr19\t36268800\t36309300\t0\t240\nchr19\t36311100\t36313200\t0\t240\nchr19\t36407100\t36407400\t0.5033\t59\nchr19\t36698400\t36698700\t0.2906\t67\nchr19\t36699900\t36700500\t0.1214\t64\nchr19\t36793500\t36793800\t0.3068\t29\nchr19\t36844800\t36845100\t0.5851\t34\nchr19\t37121100\t37121400\t0.3742\t57\nchr19\t37264500\t37266600\t0\t603\nchr19\t37268700\t37303500\t0\t603\nchr19\t37331400\t37332300\t0.3343\t84\nchr19\t37751100\t37752000\t0.1751\t55\nchr19\t37838100\t37843200\t0\t76\nchr19\t37866300\t37867200\t0.0056\t80\nchr19\t38540400\t38541000\t0.1443\t34\nchr19\t38770500\t38773500\t0\t74\nchr19\t38789100\t38792400\t0\t80\nchr19\t38797200\t38797500\t0.3952\t57\nchr19\t39245100\t39245400\t0.2783\t64\nchr19\t39246600\t39246900\t0.2783\t64\nchr19\t39266100\t39266400\t0.4086\t66\nchr19\t39268200\t39268500\t0.3174\t63\nchr19\t39628500\t39628800\t0.5029\t43\nchr19\t39876600\t39877200\t0.0806\t103\nchr19\t39879600\t39881400\t0.0288\t118\nchr19\t39882900\t39889800\t0\t142\nchr19\t39892800\t39893400\t0.2125\t110\nchr19\t39895800\t39897600\t0.0161\t109\nchr19\t39899100\t39906300\t0\t108\nchr19\t39957000\t39958800\t0.1327\t56\nchr19\t40107300\t40109700\t0.0002\t93\nchr19\t40113900\t40114200\t0.3345\t93\nchr19\t40117200\t40119300\t0.101\t91\nchr19\t40647300\t40650000\t0.0007\t56\nchr19\t40821300\t40821900\t0.3135\t53\nchr19\t40833600\t40833900\t0.5733\t56\nchr19\t40842600\t40843200\t0.1006\t60\nchr19\t40851300\t40851600\t0.4258\t67\nchr19\t40852800\t40853700\t0.491\t73\nchr19\t40874700\t40875300\t0.0681\t67\nchr19\t40884600\t40885500\t0.4438\t72\nchr19\t40941000\t40941300\t0.4648\t53\nchr19\t40965000\t40965600\t0.1602\t80\nchr19\t40998600\t40999200\t0.1843\t61\nchr19\t41103900\t41104200\t0.1806\t64\nchr19\t41121900\t41122200\t0.6303\t34\nchr19\t41125200\t41125800\t0.5687\t84\nchr19\t41490300\t41490600\t0.6401\t70\nchr19\t41644200\t41646300\t0.0206\t78\nchr19\t41749800\t41750100\t0.4844\t67\nchr19\t41788500\t41788800\t0.5913\t71\nchr19\t41842800\t41843100\t0.3766\t72\nchr19\t42370800\t42371100\t0.5661\t66\nchr19\t42530400\t42530700\t0.5931\t37\nchr19\t42671400\t42671700\t0.3907\t66\nchr19\t42748500\t42748800\t0.4464\t79\nchr19\t42769800\t42770400\t0.2481\t74\nchr19\t42789900\t42790200\t0.6393\t43\nchr19\t42807900\t42808200\t0.4758\t78\nchr19\t42809700\t42810300\t0.4758\t78\nchr19\t42843300\t42843600\t0.5906\t20\nchr19\t42955500\t42955800\t0.5283\t66\nchr19\t43051200\t43052400\t0.017\t70\nchr19\t43110600\t43110900\t0.2983\t65\nchr19\t43176600\t43176900\t0.4674\t61\nchr19\t43195800\t43196100\t0.4905\t56\nchr19\t43243200\t43243500\t0.304\t68\nchr19\t43344900\t43345200\t0.4171\t71\nchr19\t43356000\t43360800\t0\t73\nchr19\t43364400\t43365900\t0.014\t88\nchr19\t43369200\t43370400\t0.0435\t73\nchr19\t43374000\t43378800\t0\t71\nchr19\t43388400\t43388700\t0.5572\t67\nchr19\t43864500\t43866300\t0.2311\t67\nchr19\t43878000\t43878300\t0.2417\t47\nchr19\t44222400\t44223000\t0.332\t85\nchr19\t44224800\t44225400\t0.3503\t95\nchr19\t44546100\t44547000\t0.0538\t77\nchr19\t44594400\t44595000\t0.048\t66\nchr19\t44801100\t44801700\t0.471\t46\nchr19\t45648300\t45649200\t0.2218\t41\nchr19\t46038900\t46039800\t0.2929\t71\nchr19\t46078800\t46079100\t0.4615\t49\nchr19\t46438500\t46440900\t0\t37\nchr19\t46452900\t46453200\t0.2246\t11\nchr19\t47051100\t47051400\t0.3542\t63\nchr19\t47397300\t47397600\t0.3974\t59\nchr19\t47804100\t47804400\t0.5565\t75\nchr19\t47859600\t47859900\t0.5669\t60\nchr19\t47903400\t47958900\t0\t501\nchr19\t48483000\t48483300\t0.5495\t38\nchr19\t48669000\t48670200\t0.3813\t287\nchr19\t48834900\t48835500\t0.2757\t29\nchr19\t48890100\t48890400\t0.2661\t98\nchr19\t49023000\t49023600\t0.1063\t58\nchr19\t49024800\t49025100\t0.4398\t61\nchr19\t49027800\t49028400\t0.1246\t70\nchr19\t49032300\t49033200\t0.0232\t78\nchr19\t49035600\t49035900\t0.4818\t56\nchr19\t49040400\t49041000\t0.2993\t84\nchr19\t49044600\t49045200\t0.4775\t66\nchr19\t49047600\t49048200\t0.4184\t94\nchr19\t49054200\t49054800\t0.1489\t63\nchr19\t49167600\t49167900\t0.4567\t65\nchr19\t49959300\t49961100\t0.0411\t76\nchr19\t49969500\t49971300\t0.3294\t85\nchr19\t50074800\t50075100\t0.1661\t59\nchr19\t50079900\t50080200\t0.4168\t69\nchr19\t50091000\t50133600\t0\t1041\nchr19\t50137200\t50139600\t0\t322\nchr19\t50603700\t50604000\t0.5329\t84\nchr19\t50605500\t50605800\t0.3844\t69\nchr19\t50609100\t50609400\t0.0756\t10\nchr19\t50617500\t50617800\t0.1212\t62\nchr19\t50622600\t50623200\t0.4082\t60\nchr19\t50756100\t50756400\t0.3939\t51\nchr19\t50961000\t50961300\t0.3689\t58\nchr19\t51051600\t51051900\t0.0581\t31\nchr19\t51180900\t51181200\t0.5989\t39\nchr19\t51182400\t51183000\t0.4927\t57\nchr19\t51310500\t51311100\t0.1409\t38\nchr19\t51345600\t51345900\t0.6403\t108\nchr19\t51353400\t51354000\t0.4121\t40\nchr19\t51463800\t51464400\t0.314\t68\nchr19\t51629400\t51630300\t0.04\t57\nchr19\t51645900\t51646800\t0.0275\t90\nchr19\t51672600\t51674400\t0\t63\nchr19\t51758100\t51758700\t0.0684\t88\nchr19\t52575600\t52575900\t0.1137\t65\nchr19\t52732200\t52732500\t0.6105\t62\nchr19\t52802700\t52803300\t0.317\t191\nchr19\t52888200\t52888500\t0.0797\t53\nchr19\t53014200\t53014800\t0.0649\t69\nchr19\t53049300\t53049900\t0.0059\t72\nchr19\t53097000\t53097300\t0.0819\t79\nchr19\t53113200\t53113500\t0.0981\t41\nchr19\t53126400\t53127300\t0.0004\t66\nchr19\t53169900\t53170200\t0.3621\t25\nchr19\t53185200\t53188800\t0\t74\nchr19\t53281800\t53282100\t0.2322\t61\nchr19\t53283600\t53284200\t0.4114\t68\nchr19\t53299800\t53300400\t0.3826\t69\nchr19\t53301600\t53301900\t0.1905\t71\nchr19\t53648700\t53649000\t0.5059\t58\nchr19\t53962500\t53962800\t0.4281\t27\nchr19\t53990700\t53991000\t0.6539\t46\nchr19\t54172200\t54172500\t0.5712\t31\nchr19\t54220200\t54220500\t0.4905\t64\nchr19\t54322800\t54323100\t0.4763\t71\nchr19\t54349500\t54349800\t0.5399\t250\nchr19\t54360000\t54360300\t0.0974\t73\nchr19\t54413700\t54414000\t0.6823\t65\nchr19\t54471900\t54472500\t0.5526\t44\nchr19\t54508800\t54510300\t0.3773\t81\nchr19\t54580200\t54581400\t0\t74\nchr19\t54644700\t54645300\t0.3421\t56\nchr19\t54680400\t54680700\t0.5696\t14\nchr19\t54693000\t54693300\t0.6316\t111\nchr19\t54748500\t54750000\t0.2692\t63\nchr19\t54780000\t54781200\t0.1369\t60\nchr19\t54824700\t54825000\t0.671\t21\nchr19\t54833400\t54834000\t0.6151\t30\nchr19\t54844200\t54844500\t0.3422\t27\nchr19\t54964800\t54966000\t0.3147\t47\nchr19\t54970800\t54971100\t0.3664\t28\nchr19\t54998400\t54998700\t0.333\t110\nchr19\t55026900\t55027200\t0.3788\t40\nchr19\t55033200\t55033500\t0.6309\t76\nchr19\t55093500\t55094100\t0.4238\t46\nchr19\t55208400\t55208700\t0.5211\t30\nchr19\t55434600\t55435200\t0.5583\t53\nchr19\t55450200\t55450500\t0.2292\t52\nchr19\t55472100\t55472400\t0.4325\t39\nchr19\t55763400\t55764000\t0.3647\t100\nchr19\t55768200\t55768500\t0.4595\t62\nchr19\t55773000\t55774500\t0.0363\t97\nchr19\t55823700\t55827300\t0\t71\nchr19\t55850100\t55851600\t0.4654\t94\nchr19\t55862100\t55862700\t0.5235\t60\nchr19\t56080200\t56080500\t0.0022\t32\nchr19\t56103900\t56104500\t0.2659\t25\nchr19\t56150700\t56151600\t0.3374\t76\nchr19\t56176200\t56176500\t0.6667\t48\nchr19\t56235000\t56236200\t0.3537\t78\nchr19\t56306400\t56307000\t0.2272\t39\nchr19\t56339100\t56339700\t0.023\t79\nchr19\t56444700\t56445900\t0.0672\t79\nchr19\t56600100\t56600400\t0.3368\t30\nchr19\t56669700\t56670000\t0.2661\t59\nchr19\t56744700\t56745900\t0.1629\t218\nchr19\t57148200\t57148800\t0.1221\t56\nchr19\t57169200\t57169500\t0.2278\t25\nchr19\t57206700\t57207000\t0.4028\t62\nchr19\t57249600\t57249900\t0.4138\t65\nchr19\t57483000\t57483300\t0.3161\t27\nchr19\t57488100\t57488400\t0.3829\t59\nchr19\t57808800\t57809100\t0.4509\t61\nchr19\t57833100\t57835800\t0.0192\t83\nchr19\t57858600\t57858900\t0.4718\t87\nchr19\t57879900\t57882600\t0.0865\t101\nchr19\t57909600\t57909900\t0.6043\t55\nchr19\t58106400\t58106700\t0.1481\t17\nchr19\t58337400\t58337700\t0.1195\t55\nchr19\t58404300\t58404600\t0.2187\t58\nchr19\t58526400\t58526700\t0.6439\t33\nchr19\t58539000\t58542300\t0.4149\t110\nchr19\t58587300\t58587900\t0.0437\t88\nchr19\t58589100\t58589400\t0.0437\t88\nchr19\t58591500\t58606200\t0.002\t99\nchr19\t58607400\t58607700\t0.5808\t26\nchr2\t127200\t127500\t0.3351\t76\nchr2\t197700\t198600\t0.0219\t46\nchr2\t207000\t207600\t0.1359\t138\nchr2\t235500\t236100\t0.6113\t50\nchr2\t293700\t294300\t0.4876\t46\nchr2\t306600\t308700\t0.211\t120\nchr2\t399000\t400800\t0.3463\t72\nchr2\t420300\t421200\t0.0257\t41\nchr2\t426900\t427500\t0.4499\t50\nchr2\t488100\t488400\t0.0756\t14\nchr2\t495300\t495900\t0.0635\t46\nchr2\t604800\t605100\t0.6397\t57\nchr2\t671400\t672000\t0.1278\t61\nchr2\t800400\t803400\t0.0168\t99\nchr2\t804600\t805200\t0.0168\t99\nchr2\t846600\t846900\t0.3029\t45\nchr2\t849600\t849900\t0.6531\t24\nchr2\t861000\t861300\t0.2527\t22\nchr2\t879000\t879600\t0.4135\t64\nchr2\t909900\t910200\t0.6155\t60\nchr2\t913500\t913800\t0.6713\t30\nchr2\t927900\t928500\t0.3437\t111\nchr2\t931800\t932400\t0.042\t110\nchr2\t965100\t965400\t0.6409\t139\nchr2\t970500\t970800\t0.2222\t69\nchr2\t1012800\t1014300\t0.0251\t38\nchr2\t1094400\t1094700\t0.6461\t32\nchr2\t1106700\t1109100\t0\t72\nchr2\t1179900\t1180500\t0.3586\t88\nchr2\t1221600\t1223400\t0.1335\t429\nchr2\t1316700\t1317600\t0.3782\t35\nchr2\t1342500\t1346100\t0\t61\nchr2\t1417200\t1418100\t0.0187\t77\nchr2\t1444500\t1445700\t0.1581\t47\nchr2\t1457100\t1457400\t0.6384\t45\nchr2\t1490100\t1490400\t0.2577\t29\nchr2\t1529100\t1529400\t0.3412\t15\nchr2\t1530900\t1531200\t0.6862\t12\nchr2\t1533600\t1533900\t0.6423\t20\nchr2\t1568700\t1569000\t0.2091\t36\nchr2\t1619400\t1619700\t0.615\t50\nchr2\t1695600\t1695900\t0.6113\t56\nchr2\t1704300\t1704600\t0.6982\t16\nchr2\t1707000\t1707300\t0.5797\t70\nchr2\t1750500\t1750800\t0.2871\t70\nchr2\t1763700\t1764000\t0.4063\t63\nchr2\t1780500\t1780800\t0.6984\t51\nchr2\t1797900\t1798200\t0.5202\t37\nchr2\t1829400\t1829700\t0.6092\t52\nchr2\t2034300\t2036400\t0.0236\t50\nchr2\t2138100\t2138700\t0.0578\t79\nchr2\t2202900\t2203200\t0.3788\t76\nchr2\t2257800\t2259300\t0.0011\t122\nchr2\t2295600\t2295900\t0.5798\t139\nchr2\t2650200\t2650500\t0.4472\t57\nchr2\t2736300\t2736900\t0.4243\t66\nchr2\t2792700\t2793000\t0.4833\t69\nchr2\t3221100\t3221700\t0.0063\t147\nchr2\t3284100\t3284400\t0.5378\t56\nchr2\t3315300\t3316200\t0.0731\t62\nchr2\t3331200\t3332100\t0.0924\t106\nchr2\t3374700\t3375300\t0.0953\t105\nchr2\t3437100\t3438000\t0.3468\t41\nchr2\t3590100\t3592200\t0.0064\t138\nchr2\t3651300\t3651600\t0.5201\t61\nchr2\t3690300\t3690600\t0.5942\t19\nchr2\t3725400\t3725700\t0.6268\t142\nchr2\t3775200\t3775800\t0.0633\t34\nchr2\t3795300\t3798600\t0.1463\t100\nchr2\t4147500\t4147800\t0.3472\t48\nchr2\t4159200\t4160400\t0.2177\t93\nchr2\t4161900\t4163400\t0.2177\t93\nchr2\t4471200\t4471500\t0.4452\t57\nchr2\t4644000\t4648200\t0.2045\t85\nchr2\t4733700\t4739700\t0\t98\nchr2\t4795200\t4795500\t0.5361\t37\nchr2\t5049900\t5050200\t0.2386\t56\nchr2\t5069100\t5069400\t0.2057\t22\nchr2\t5196900\t5199300\t0.0379\t77\nchr2\t5280300\t5280600\t0.3297\t55\nchr2\t5383800\t5384100\t0.5411\t62\nchr2\t5628300\t5628600\t0.399\t87\nchr2\t5637600\t5637900\t0.333\t62\nchr2\t5639700\t5640000\t0.259\t54\nchr2\t5644200\t5644500\t0.2666\t73\nchr2\t5706300\t5706600\t0.5207\t26\nchr2\t5744700\t5745000\t0.5878\t57\nchr2\t6238200\t6238800\t0.0122\t59\nchr2\t6420000\t6420300\t0.6923\t44\nchr2\t7120500\t7121400\t0.277\t94\nchr2\t7133400\t7133700\t0.6756\t65\nchr2\t7337700\t7338000\t0.6225\t62\nchr2\t7488600\t7489200\t0.2343\t48\nchr2\t7877400\t7877700\t0.4698\t51\nchr2\t8041200\t8041800\t0.2863\t83\nchr2\t9406200\t9406500\t0.1486\t29\nchr2\t9740100\t9740400\t0.6089\t58\nchr2\t10399200\t10399500\t0.3314\t226\nchr2\t10536300\t10536600\t0.598\t65\nchr2\t10804500\t10806000\t0.1749\t69\nchr2\t10902000\t10902900\t0.4168\t88\nchr2\t10953600\t10954200\t0.4391\t220\nchr2\t10996200\t11001900\t0\t101\nchr2\t11091900\t11092200\t0.0611\t12\nchr2\t11113500\t11113800\t0.6225\t21\nchr2\t11176500\t11176800\t0.481\t53\nchr2\t11854500\t11854800\t0.5614\t21\nchr2\t12123000\t12123300\t0.5968\t41\nchr2\t12346200\t12347100\t0.3467\t77\nchr2\t12492000\t12492900\t0.3633\t71\nchr2\t12522300\t12526500\t0\t102\nchr2\t12927300\t12927900\t0.0647\t74\nchr2\t13734300\t13735800\t0.1792\t86\nchr2\t13749900\t13750200\t0.3973\t76\nchr2\t13808700\t13809600\t0.3117\t57\nchr2\t13867800\t13868100\t0.383\t48\nchr2\t13882800\t13883100\t0.5123\t76\nchr2\t13946700\t13947000\t0.4236\t78\nchr2\t14489100\t14489400\t0.0657\t63\nchr2\t14501700\t14502300\t0.1877\t77\nchr2\t14504400\t14504700\t0.358\t54\nchr2\t14662200\t14663100\t0.1065\t94\nchr2\t14801700\t14802300\t0.124\t63\nchr2\t14848800\t14849100\t0.0762\t106\nchr2\t14850600\t14853600\t0.0762\t106\nchr2\t15026100\t15026400\t0.3386\t22\nchr2\t15098100\t15098400\t0.6997\t13\nchr2\t15219300\t15220200\t0.3652\t77\nchr2\t15441300\t15441600\t0.4248\t117\nchr2\t15443400\t15443700\t0.4525\t75\nchr2\t15445200\t15445500\t0.3552\t65\nchr2\t15542100\t15542400\t0.3283\t41\nchr2\t15610800\t15612000\t0.3451\t51\nchr2\t15681000\t15681300\t0.6351\t19\nchr2\t16230300\t16233300\t0.209\t108\nchr2\t16234800\t16235100\t0.209\t108\nchr2\t16593900\t16599600\t0\t117\nchr2\t16876800\t16877100\t0.2049\t73\nchr2\t16878600\t16878900\t0.2049\t73\nchr2\t17946300\t17946900\t0.4035\t38\nchr2\t17963700\t17964000\t0.6618\t25\nchr2\t17984100\t17985300\t0\t76\nchr2\t18012300\t18014400\t0.0398\t94\nchr2\t18015600\t18016200\t0.0398\t94\nchr2\t18635700\t18636000\t0.2804\t39\nchr2\t18756000\t18756300\t0.1515\t24\nchr2\t19164600\t19164900\t0.4035\t77\nchr2\t19307100\t19307400\t0.2417\t72\nchr2\t19309500\t19310700\t0.0924\t130\nchr2\t19831500\t19833000\t0.2034\t87\nchr2\t19985400\t19985700\t0.6431\t78\nchr2\t20466900\t20467200\t0.4119\t40\nchr2\t20598600\t20598900\t0.5789\t42\nchr2\t20820600\t20820900\t0.1216\t69\nchr2\t20906400\t20906700\t0.2978\t58\nchr2\t21067500\t21067800\t0.3466\t86\nchr2\t21187500\t21188400\t0.2198\t86\nchr2\t21208800\t21210300\t0.3165\t71\nchr2\t21903600\t21903900\t0.2475\t94\nchr2\t21905400\t21908100\t0.2475\t94\nchr2\t22055100\t22055400\t0.5345\t34\nchr2\t22158900\t22159200\t0.2378\t85\nchr2\t22985100\t22985700\t0.0499\t99\nchr2\t22986900\t22988400\t0.0499\t99\nchr2\t23224800\t23230500\t0\t87\nchr2\t23845800\t23847300\t0\t54\nchr2\t24193800\t24194100\t0.4981\t69\nchr2\t24334800\t24335100\t0.4397\t37\nchr2\t25046400\t25046700\t0.6214\t60\nchr2\t25552800\t25553100\t0.4096\t51\nchr2\t25910400\t25910700\t0.5449\t57\nchr2\t26656200\t26656500\t0.3134\t53\nchr2\t27359100\t27360300\t0.1441\t74\nchr2\t27460200\t27461100\t0.0332\t83\nchr2\t27539400\t27541200\t0.1751\t100\nchr2\t27556800\t27558900\t0\t90\nchr2\t28126500\t28126800\t0.1744\t74\nchr2\t28131000\t28131300\t0.3691\t28\nchr2\t28458600\t28459200\t0.0194\t47\nchr2\t29092800\t29094600\t0.1604\t91\nchr2\t29445900\t29446200\t0.3851\t52\nchr2\t29512500\t29514300\t0.4876\t79\nchr2\t29672700\t29674200\t0.3837\t78\nchr2\t30451500\t30451800\t0.4689\t55\nchr2\t30553500\t30553800\t0.4145\t66\nchr2\t30596700\t30597000\t0.1278\t55\nchr2\t30606300\t30606600\t0.2612\t72\nchr2\t30613800\t30614400\t0.045\t71\nchr2\t30643200\t30643500\t0.6804\t42\nchr2\t30720600\t30720900\t0.366\t72\nchr2\t30816900\t30817500\t0.0104\t59\nchr2\t30852900\t30853500\t0.3803\t77\nchr2\t30868500\t30868800\t0.521\t41\nchr2\t30904800\t30905100\t0.132\t82\nchr2\t30906300\t30909900\t0.132\t82\nchr2\t31119900\t31120200\t0.328\t28\nchr2\t31437300\t31437600\t0.4277\t72\nchr2\t31500000\t31500900\t0.2163\t82\nchr2\t31576200\t31577100\t0.0232\t55\nchr2\t31731600\t31731900\t0.5646\t26\nchr2\t32110800\t32111400\t0.3083\t35\nchr2\t32200500\t32200800\t0.4167\t93\nchr2\t32446800\t32448300\t0.1032\t79\nchr2\t32754300\t32754600\t0.2886\t34\nchr2\t32866500\t32867100\t0.0179\t2767\nchr2\t32868300\t32870400\t0.0179\t2767\nchr2\t32916000\t32916900\t0.0063\t213491\nchr2\t33556200\t33556500\t0.4155\t38\nchr2\t33732000\t33732300\t0.5522\t51\nchr2\t34572600\t34576500\t0\t89\nchr2\t34793100\t34793400\t0.4415\t59\nchr2\t34816500\t34817400\t0.4437\t45\nchr2\t34819500\t34820100\t0.1715\t68\nchr2\t35107800\t35108100\t0.2307\t58\nchr2\t35865600\t35865900\t0.5708\t58\nchr2\t36098700\t36099000\t0.5423\t65\nchr2\t36112800\t36118500\t0\t87\nchr2\t36182400\t36184500\t0.0808\t173\nchr2\t36728400\t36728700\t0.2694\t31\nchr2\t37225500\t37226100\t0.0834\t71\nchr2\t37494000\t37494900\t0.0076\t72\nchr2\t37932300\t37932600\t0.4906\t62\nchr2\t38492700\t38493300\t0.2693\t58\nchr2\t38755500\t38755800\t0.4046\t63\nchr2\t38844300\t38844600\t0.2672\t25\nchr2\t40010400\t40010700\t0.3737\t36\nchr2\t40012800\t40013100\t0.3483\t60\nchr2\t40235700\t40236000\t0.4343\t61\nchr2\t40492500\t40492800\t0.5283\t71\nchr2\t40566900\t40567200\t0.3458\t46\nchr2\t40692600\t40692900\t0.2555\t78\nchr2\t40924800\t40925100\t0.4852\t56\nchr2\t41273400\t41274000\t0.2852\t77\nchr2\t41514900\t41515500\t0.1615\t72\nchr2\t41550000\t41553600\t0\t71\nchr2\t41746200\t41748600\t0.0085\t70\nchr2\t42391500\t42391800\t0.3883\t50\nchr2\t42605100\t42605400\t0.3174\t67\nchr2\t42606600\t42606900\t0.5181\t69\nchr2\t42990900\t42991500\t0.0543\t85\nchr2\t42992700\t42995400\t0.0543\t85\nchr2\t43296900\t43298700\t0.0971\t74\nchr2\t43431600\t43432200\t0.4564\t62\nchr2\t43660500\t43665900\t0\t112\nchr2\t44260800\t44261100\t0.3817\t77\nchr2\t44587500\t44589600\t0.0206\t47\nchr2\t44630700\t44631000\t0.3881\t60\nchr2\t45059700\t45065400\t0\t111\nchr2\t45075900\t45081600\t0\t109\nchr2\t45414900\t45415200\t0.5029\t27\nchr2\t45829800\t45830100\t0.6265\t49\nchr2\t46683000\t46683300\t0.3103\t32\nchr2\t47100300\t47100600\t0.294\t50\nchr2\t48554700\t48557700\t0.0693\t76\nchr2\t48744000\t48744600\t0.0567\t95\nchr2\t49008600\t49011300\t0.1997\t92\nchr2\t49127700\t49128000\t0.6568\t46\nchr2\t49385700\t49386000\t0.3689\t29\nchr2\t49493100\t49493400\t0.4312\t54\nchr2\t49638900\t49639800\t0.055\t75\nchr2\t49875300\t49875600\t0.4352\t80\nchr2\t51381600\t51382200\t0.3029\t74\nchr2\t51735300\t51737400\t0.0321\t88\nchr2\t51852600\t51853200\t0.4032\t48\nchr2\t51854700\t51855000\t0.3182\t37\nchr2\t51939000\t51939900\t0.0615\t79\nchr2\t52040400\t52041000\t0.2377\t61\nchr2\t52155900\t52156200\t0.4802\t43\nchr2\t52173300\t52173600\t0.4862\t55\nchr2\t52715700\t52716000\t0.3584\t46\nchr2\t53398500\t53400900\t0\t128\nchr2\t53589600\t53592900\t0.0393\t81\nchr2\t54873600\t54873900\t0.1709\t55\nchr2\t55736700\t55737000\t0.0959\t117\nchr2\t55739400\t55740000\t0.0959\t117\nchr2\t55774200\t55774500\t0.1371\t50\nchr2\t56172900\t56173500\t0.3665\t95\nchr2\t56552100\t56552400\t0.1106\t55\nchr2\t56555400\t56555700\t0.385\t25\nchr2\t56622900\t56623200\t0.4338\t26\nchr2\t56661900\t56662200\t0.4755\t74\nchr2\t56663700\t56664600\t0.1714\t74\nchr2\t56682600\t56684100\t0.0145\t78\nchr2\t56791200\t56792400\t0.4643\t64\nchr2\t57115500\t57115800\t0.4387\t39\nchr2\t57192300\t57193500\t0\t30\nchr2\t57381600\t57381900\t0.2234\t67\nchr2\t57422100\t57422700\t0.2191\t109\nchr2\t57423900\t57424200\t0.0954\t108\nchr2\t57556800\t57557100\t0.288\t70\nchr2\t57559500\t57561300\t0.3233\t86\nchr2\t57588900\t57589200\t0.4688\t66\nchr2\t57590400\t57592200\t0.0667\t116\nchr2\t57612600\t57613200\t0.2337\t79\nchr2\t58134300\t58134600\t0.4377\t44\nchr2\t58264800\t58265100\t0.4316\t66\nchr2\t58382100\t58385400\t0.1843\t75\nchr2\t59162400\t59163000\t0.1062\t70\nchr2\t59554800\t59559000\t0.1204\t94\nchr2\t59648100\t59648400\t0.4116\t56\nchr2\t59838900\t59839200\t0.2902\t60\nchr2\t60084600\t60089100\t0\t154\nchr2\t60141600\t60146100\t0.1105\t111\nchr2\t60193500\t60194100\t0.3186\t78\nchr2\t60467400\t60467700\t0.5732\t46\nchr2\t60928500\t60929700\t0.1351\t93\nchr2\t61979700\t61980600\t0.0088\t93\nchr2\t62646900\t62648100\t0.4164\t71\nchr2\t62649300\t62649900\t0.4164\t71\nchr2\t62836200\t62841000\t0.1456\t101\nchr2\t63877800\t63878100\t0.4668\t38\nchr2\t64375500\t64376100\t0.4061\t184\nchr2\t64511100\t64513200\t0\t77\nchr2\t64548000\t64548300\t0.3369\t38\nchr2\t65338500\t65338800\t0.2711\t70\nchr2\t65600700\t65601000\t0.4449\t59\nchr2\t65676600\t65676900\t0.5212\t25\nchr2\t66116700\t66117000\t0.489\t75\nchr2\t66141900\t66142800\t0.0368\t71\nchr2\t66178800\t66183000\t0.3136\t90\nchr2\t66211800\t66212100\t0.3432\t78\nchr2\t66391800\t66392400\t0.5015\t65\nchr2\t66395700\t66397200\t0.2948\t85\nchr2\t66627600\t66627900\t0.3001\t75\nchr2\t66642900\t66643200\t0.5404\t74\nchr2\t66718800\t66719100\t0.4123\t64\nchr2\t66909600\t66909900\t0.4648\t61\nchr2\t67176600\t67177200\t0.3163\t69\nchr2\t67906500\t67906800\t0.4452\t61\nchr2\t68445900\t68446200\t0.307\t45\nchr2\t68613900\t68614200\t0.3969\t79\nchr2\t68617800\t68618100\t0.4326\t97\nchr2\t68678400\t68678700\t0.5062\t66\nchr2\t70429500\t70431000\t0.0996\t66\nchr2\t70434300\t70435200\t0.2783\t51\nchr2\t70555800\t70556100\t0.4579\t60\nchr2\t71050800\t71051100\t0.2773\t32\nchr2\t71083200\t71084100\t0.0076\t63\nchr2\t71182800\t71183700\t0.0014\t73\nchr2\t71266500\t71266800\t0.4881\t108\nchr2\t71411400\t71417100\t0\t97\nchr2\t71623200\t71623500\t0.5033\t56\nchr2\t71769000\t71770200\t0.0293\t68\nchr2\t72016200\t72020700\t0.0718\t69\nchr2\t72064800\t72068700\t0.0116\t99\nchr2\t72266100\t72266400\t0.3052\t71\nchr2\t72642000\t72643500\t0.2322\t82\nchr2\t72653100\t72653400\t0.3857\t64\nchr2\t72702300\t72705000\t0.0141\t97\nchr2\t73127400\t73127700\t0.5632\t37\nchr2\t73166700\t73167000\t0.1394\t81\nchr2\t73170600\t73170900\t0.4836\t71\nchr2\t73463400\t73463700\t0.247\t72\nchr2\t73480500\t73480800\t0.3942\t75\nchr2\t73482900\t73484100\t0.3942\t75\nchr2\t73724400\t73724700\t0.2881\t74\nchr2\t73785000\t73807800\t0\t144\nchr2\t74284200\t74284500\t0.4131\t38\nchr2\t74561100\t74561400\t0.6411\t203\nchr2\t74793900\t74795400\t0.1313\t60\nchr2\t74797200\t74797500\t0.3487\t66\nchr2\t74970000\t74971500\t0.437\t66\nchr2\t75330900\t75331800\t0.1244\t93\nchr2\t75576300\t75576600\t0.3984\t51\nchr2\t76299300\t76301700\t0\t106\nchr2\t76480500\t76481100\t0.1398\t75\nchr2\t76648200\t76648800\t0.3838\t70\nchr2\t76705800\t76706100\t0.4106\t65\nchr2\t76776600\t76778400\t0.1296\t87\nchr2\t76798500\t76798800\t0.3244\t81\nchr2\t76800300\t76800900\t0.3244\t81\nchr2\t76906500\t76908000\t0.454\t69\nchr2\t77244000\t77244300\t0.185\t85\nchr2\t77292000\t77292600\t0.3741\t71\nchr2\t77596800\t77598600\t0.1228\t108\nchr2\t77646300\t77647800\t0.0243\t127\nchr2\t77667900\t77668200\t0.2546\t53\nchr2\t77669400\t77670900\t0.2\t53\nchr2\t77672400\t77672700\t0.2\t53\nchr2\t77674800\t77676600\t0.2\t53\nchr2\t77680200\t77684700\t0.0223\t74\nchr2\t77686500\t77688000\t0.0223\t74\nchr2\t77689200\t77689500\t0.0223\t74\nchr2\t77755800\t77757300\t0.0549\t123\nchr2\t77758500\t77758800\t0.0549\t123\nchr2\t77794500\t77795400\t0.1284\t108\nchr2\t78170700\t78171000\t0.4824\t60\nchr2\t78422700\t78423000\t0.4378\t77\nchr2\t78702000\t78702300\t0.4045\t70\nchr2\t78830700\t78831000\t0.5505\t51\nchr2\t79105800\t79109700\t0.0188\t112\nchr2\t79283100\t79285800\t0.0203\t94\nchr2\t79409400\t79410300\t0.3518\t89\nchr2\t81314700\t81315000\t0.2814\t80\nchr2\t81351300\t81353100\t0.0277\t53\nchr2\t81475800\t81476100\t0.3788\t29\nchr2\t81607800\t81609600\t0.1393\t83\nchr2\t82113300\t82113600\t0.3721\t18\nchr2\t82840500\t82841100\t0.3661\t36\nchr2\t82887000\t82887300\t0.6816\t53\nchr2\t83089800\t83094600\t0.1351\t91\nchr2\t83769300\t83773800\t0\t115\nchr2\t83839800\t83840100\t0.3487\t64\nchr2\t83914500\t83915100\t0.1004\t29\nchr2\t83957700\t83958000\t0.3136\t40\nchr2\t84229800\t84230100\t0.2962\t40\nchr2\t84371100\t84372000\t0.0106\t104\nchr2\t84531300\t84531600\t0.2597\t15\nchr2\t84794400\t84795000\t0.2554\t112\nchr2\t85099800\t85100100\t0.4932\t32\nchr2\t85108200\t85108500\t0.4144\t49\nchr2\t85292100\t85292400\t0.5159\t36\nchr2\t85483200\t85485000\t0.0213\t118\nchr2\t85489200\t85489800\t0.0448\t99\nchr2\t85633800\t85634100\t0.421\t43\nchr2\t86544900\t86545200\t0.6389\t24\nchr2\t86654400\t86660700\t0\t112\nchr2\t86711700\t86713800\t0.031\t65\nchr2\t86715300\t86717400\t0.0391\t67\nchr2\t86719200\t86719800\t0.0391\t67\nchr2\t86721900\t86742300\t0\t87\nchr2\t86841000\t86841300\t0.3459\t63\nchr2\t86863500\t86863800\t0.5873\t68\nchr2\t86865900\t86866200\t0.542\t56\nchr2\t86871000\t86871300\t0.578\t65\nchr2\t86891100\t86891400\t0.4309\t64\nchr2\t86902500\t86902800\t0.4977\t91\nchr2\t86905800\t86913300\t0\t85\nchr2\t86915400\t86926500\t0\t121\nchr2\t86927700\t86940600\t0\t121\nchr2\t86945700\t87049500\t0\t100\nchr2\t87052500\t87052800\t0\t87\nchr2\t87054600\t87066600\t0\t87\nchr2\t87068700\t87069900\t0\t87\nchr2\t87071400\t87075000\t0\t87\nchr2\t87077100\t87081300\t0.1687\t80\nchr2\t87082800\t87083400\t0.1687\t80\nchr2\t87084600\t87084900\t0.1687\t80\nchr2\t87089100\t87089700\t0.3716\t52\nchr2\t87093300\t87096000\t0.44\t65\nchr2\t87097200\t87097500\t0.545\t47\nchr2\t87101100\t87102000\t0.345\t62\nchr2\t87104100\t87109200\t0.0551\t65\nchr2\t87110400\t87110700\t0.0551\t65\nchr2\t87111900\t87113100\t0\t94\nchr2\t87114300\t87114900\t0\t94\nchr2\t87116700\t87117000\t0\t94\nchr2\t87118200\t87129900\t0\t94\nchr2\t87132600\t87136200\t0.0675\t66\nchr2\t87139200\t87143100\t0.0305\t93\nchr2\t87150600\t87163200\t0\t89\nchr2\t87164400\t87165900\t0\t89\nchr2\t87167100\t87167400\t0.1269\t62\nchr2\t87169800\t87170100\t0.1269\t62\nchr2\t87171600\t87171900\t0.1269\t62\nchr2\t87173100\t87177000\t0.1389\t58\nchr2\t87178500\t87181800\t0.1389\t58\nchr2\t87183900\t87197400\t0.0117\t73\nchr2\t87199800\t87203100\t0.0774\t68\nchr2\t87205800\t87206100\t0.5035\t69\nchr2\t87207300\t87207900\t0.015\t69\nchr2\t87209100\t87214800\t0.0095\t64\nchr2\t87216300\t87219300\t0.1072\t82\nchr2\t87223800\t87224100\t0.1155\t76\nchr2\t87225300\t87225600\t0.1155\t76\nchr2\t87226800\t87227700\t0.1155\t76\nchr2\t87230700\t87236400\t0.2123\t73\nchr2\t87238800\t87242100\t0.0043\t81\nchr2\t87243300\t87245100\t0.3105\t78\nchr2\t87247200\t87249300\t0.2219\t63\nchr2\t87250500\t87252000\t0.4626\t108\nchr2\t87254400\t87254700\t0.3093\t67\nchr2\t87257700\t87258000\t0.334\t43\nchr2\t87259200\t87260700\t0.3846\t74\nchr2\t87261900\t87262500\t0.2624\t67\nchr2\t87265200\t87268500\t0\t83\nchr2\t87270000\t87273600\t0\t83\nchr2\t87275100\t87279000\t0\t83\nchr2\t87280500\t87281100\t0.0631\t66\nchr2\t87282300\t87282900\t0.0631\t66\nchr2\t87284400\t87286200\t0.2823\t102\nchr2\t87288600\t87290400\t0.2322\t72\nchr2\t87292200\t87292500\t0.3352\t67\nchr2\t87298200\t87298800\t0.0279\t72\nchr2\t87302100\t87303600\t0.0113\t65\nchr2\t87307500\t87312600\t0.0269\t100\nchr2\t87313800\t87314100\t0.636\t67\nchr2\t87315900\t87316200\t0.0855\t61\nchr2\t87319200\t87319500\t0.1\t80\nchr2\t87321000\t87321900\t0.33\t72\nchr2\t87324900\t87326700\t0.1244\t78\nchr2\t87328800\t87329100\t0.5165\t76\nchr2\t87330600\t87332700\t0.2911\t71\nchr2\t87336600\t87336900\t0.1158\t120\nchr2\t87338100\t87339000\t0.1158\t120\nchr2\t87340500\t87341100\t0.1158\t120\nchr2\t87344100\t87344400\t0.3383\t92\nchr2\t87345600\t87346200\t0.3918\t53\nchr2\t87349200\t87351000\t0.0153\t88\nchr2\t87353100\t87353400\t0.0134\t144\nchr2\t87355200\t87358200\t0.0134\t144\nchr2\t87360900\t87363000\t0.0134\t144\nchr2\t87366600\t87375000\t0.0134\t144\nchr2\t87377400\t87391800\t0\t132\nchr2\t87393600\t87395700\t0\t132\nchr2\t87398100\t87398700\t0.6394\t239\nchr2\t87404100\t87410400\t0\t222\nchr2\t87412500\t87414300\t0.3915\t82\nchr2\t87415500\t87424800\t0.1195\t417\nchr2\t87427500\t87431400\t0.4092\t277\nchr2\t87432900\t87434100\t0.0701\t78\nchr2\t87446100\t87451800\t0.1392\t78\nchr2\t87455100\t87457500\t0.2093\t74\nchr2\t87459000\t87459300\t0.2093\t74\nchr2\t87460800\t87461400\t0.2093\t74\nchr2\t87463200\t87463500\t0.2093\t74\nchr2\t87465000\t87465300\t0.2093\t74\nchr2\t87472800\t87474000\t0.1064\t72\nchr2\t87486000\t87486300\t0.5423\t73\nchr2\t87492300\t87492600\t0.5596\t76\nchr2\t87494400\t87494700\t0.3982\t56\nchr2\t87496500\t87499800\t0\t76\nchr2\t87501600\t87507600\t0\t73\nchr2\t87510300\t87516300\t0\t76\nchr2\t87517500\t87521100\t0\t76\nchr2\t87522600\t87524400\t0\t76\nchr2\t87526200\t87527100\t0\t82\nchr2\t87528600\t87531300\t0\t92\nchr2\t87532800\t87538800\t0\t92\nchr2\t87540000\t87551100\t0\t92\nchr2\t87552300\t87552900\t0.2778\t50\nchr2\t87554700\t87557700\t0.0024\t73\nchr2\t87559200\t87566100\t0\t86\nchr2\t87570300\t87574800\t0.0239\t70\nchr2\t87577200\t87577800\t0\t80\nchr2\t87579600\t87579900\t0\t80\nchr2\t87581700\t87582900\t0\t80\nchr2\t87588000\t87588600\t0.3099\t57\nchr2\t87591000\t87593100\t0.2023\t70\nchr2\t87594300\t87617100\t0\t92\nchr2\t87618600\t87634200\t0\t92\nchr2\t87635400\t87636000\t0\t92\nchr2\t87642300\t87643800\t0.5504\t91\nchr2\t87645000\t87645600\t0.2373\t61\nchr2\t87648000\t87649200\t0.0879\t75\nchr2\t87650400\t87651600\t0.0879\t75\nchr2\t87653100\t87654300\t0.0626\t72\nchr2\t87655800\t87657600\t0.0982\t64\nchr2\t87663000\t87669600\t0\t78\nchr2\t87671100\t87671700\t0.4873\t92\nchr2\t87673200\t87674400\t0.0852\t71\nchr2\t87676200\t87678000\t0.0852\t71\nchr2\t87680100\t87682500\t0.0174\t74\nchr2\t87684300\t87685200\t0.3437\t69\nchr2\t87686400\t87687600\t0.014\t72\nchr2\t87690900\t87691200\t0.0439\t67\nchr2\t87693600\t87696600\t0\t74\nchr2\t87698700\t87705900\t0\t74\nchr2\t87708300\t87711900\t0.0044\t74\nchr2\t87714300\t87718800\t0\t103\nchr2\t87720000\t87730500\t0\t103\nchr2\t87731700\t87734700\t0\t103\nchr2\t87735900\t87824100\t0\t103\nchr2\t87826200\t87830100\t0\t51\nchr2\t87831600\t87836100\t0\t69\nchr2\t87837300\t87852300\t0\t69\nchr2\t87854100\t87856500\t0.0419\t62\nchr2\t87858900\t87863400\t0.0011\t60\nchr2\t87865500\t87866100\t0.0077\t64\nchr2\t87867300\t87869700\t0.0077\t64\nchr2\t87871200\t87871500\t0.0855\t60\nchr2\t87873300\t87874800\t0.0855\t60\nchr2\t87879600\t87881700\t0.0113\t52\nchr2\t87885600\t87885900\t0\t77\nchr2\t87887400\t87912900\t0\t77\nchr2\t87914100\t87914700\t0\t77\nchr2\t87916200\t87919200\t0.0219\t51\nchr2\t87920400\t87921000\t0.2452\t39\nchr2\t87922500\t87934200\t0\t58\nchr2\t87935700\t87936900\t0\t58\nchr2\t87938400\t87939300\t0\t55\nchr2\t87941400\t87947100\t0\t61\nchr2\t87948600\t87951300\t0\t61\nchr2\t87953100\t87956700\t0\t52\nchr2\t87958800\t87961200\t0.0033\t51\nchr2\t87962700\t87963900\t0\t79\nchr2\t87965100\t87972600\t0\t79\nchr2\t87974100\t87984000\t0\t79\nchr2\t87987300\t87992700\t0.0042\t66\nchr2\t88021500\t88021800\t0.453\t20\nchr2\t88065000\t88065300\t0.6337\t23\nchr2\t88181100\t88181700\t0.3631\t71\nchr2\t88301400\t88301700\t0.4961\t43\nchr2\t88306500\t88306800\t0.5229\t59\nchr2\t88729800\t88732800\t0\t100\nchr2\t88794300\t88794600\t0.2515\t82\nchr2\t89031000\t89031300\t0.4411\t50\nchr2\t89042700\t89043000\t0.4279\t60\nchr2\t89046300\t89047500\t0.5225\t73\nchr2\t89059500\t89059800\t0.426\t67\nchr2\t89061600\t89061900\t0.426\t67\nchr2\t89066100\t89066400\t0.4123\t55\nchr2\t89070000\t89071800\t0.1162\t82\nchr2\t89075700\t89078100\t0.1931\t76\nchr2\t89079900\t89085600\t0.1931\t76\nchr2\t89088600\t89088900\t0.4286\t58\nchr2\t89091300\t89091600\t0.5837\t54\nchr2\t89096400\t89097000\t0.0497\t65\nchr2\t89105400\t89110800\t0.0129\t71\nchr2\t89116800\t89117100\t0.3618\t66\nchr2\t89121600\t89121900\t0.109\t71\nchr2\t89123100\t89123700\t0.109\t71\nchr2\t89136300\t89136600\t0.3633\t58\nchr2\t89153700\t89154300\t0.2966\t53\nchr2\t89156700\t89158800\t0.0684\t70\nchr2\t89160000\t89160300\t0.3991\t64\nchr2\t89164500\t89165100\t0.3516\t61\nchr2\t89166300\t89166600\t0.4753\t61\nchr2\t89170200\t89170500\t0.3343\t70\nchr2\t89171700\t89173800\t0.0141\t92\nchr2\t89176800\t89177100\t0.1911\t62\nchr2\t89190300\t89190900\t0.2762\t42\nchr2\t89195100\t89195400\t0.3659\t56\nchr2\t89196900\t89197200\t0.2979\t64\nchr2\t89202900\t89203200\t0.5531\t53\nchr2\t89216400\t89217000\t0.4357\t75\nchr2\t89219400\t89219700\t0.4154\t57\nchr2\t89221800\t89222100\t0.2909\t71\nchr2\t89226300\t89227500\t0.5265\t83\nchr2\t89231100\t89231400\t0\t71\nchr2\t89232600\t89232900\t0\t71\nchr2\t89235000\t89239200\t0\t71\nchr2\t89242200\t89242800\t0.0338\t64\nchr2\t89248200\t89252400\t0.0238\t72\nchr2\t89254800\t89260200\t0\t73\nchr2\t89262300\t89262600\t0.0741\t60\nchr2\t89265300\t89266500\t0.0699\t67\nchr2\t89267700\t89269800\t0.0699\t67\nchr2\t89271900\t89285100\t0\t87\nchr2\t89286300\t89295300\t0\t87\nchr2\t89297100\t89298000\t0\t87\nchr2\t89300100\t89301300\t0.5094\t69\nchr2\t89303100\t89304600\t0\t66\nchr2\t89306100\t89310300\t0\t66\nchr2\t89312100\t89312400\t0.5099\t49\nchr2\t89313900\t89330700\t0\t104\nchr2\t89530500\t89578500\t0\t138\nchr2\t89579700\t89583300\t0\t116\nchr2\t89584500\t89593500\t0\t116\nchr2\t89597400\t89597700\t0.2644\t100\nchr2\t89599500\t89602500\t0.2289\t115\nchr2\t89604300\t89604900\t0.2289\t115\nchr2\t89607600\t89607900\t0.2433\t124\nchr2\t89609700\t89610000\t0.4297\t57\nchr2\t89616000\t89616300\t0.4636\t83\nchr2\t89617800\t89618400\t0.4721\t63\nchr2\t89625900\t89626200\t0.6338\t42\nchr2\t89627400\t89629800\t0.2903\t90\nchr2\t89631600\t89634900\t0.0151\t150\nchr2\t89636700\t89638200\t0.0076\t112\nchr2\t89639700\t89642400\t0.1699\t128\nchr2\t89645700\t89646900\t0.0088\t111\nchr2\t89649000\t89652600\t0.0088\t111\nchr2\t89654100\t89654400\t0.0088\t111\nchr2\t89658900\t89660100\t0.1463\t105\nchr2\t89811300\t89813400\t0.4437\t319\nchr2\t89815500\t89818800\t0.3124\t522\nchr2\t89820000\t89820300\t0.3166\t484\nchr2\t89821500\t89822700\t0.3166\t484\nchr2\t89824200\t89841300\t0.1111\t12789\nchr2\t89852100\t89868600\t0\t98\nchr2\t89872200\t89876400\t0\t74\nchr2\t89877900\t89879400\t0\t74\nchr2\t89881200\t89882400\t0\t74\nchr2\t89884200\t89885400\t0\t83\nchr2\t89887200\t89896200\t0\t80\nchr2\t89897400\t89910600\t0\t80\nchr2\t89913300\t89917200\t0\t80\nchr2\t89919600\t89920200\t0.2458\t70\nchr2\t89922300\t89927700\t0\t70\nchr2\t89928900\t89932800\t0\t70\nchr2\t89934000\t89934300\t0\t70\nchr2\t89939700\t89940300\t0.0836\t64\nchr2\t89942700\t89947500\t0\t72\nchr2\t89949600\t89951400\t0\t72\nchr2\t89955000\t89955900\t0.4537\t66\nchr2\t89960400\t89960700\t0.1399\t67\nchr2\t89962800\t89963100\t0.4536\t63\nchr2\t89965800\t89966400\t0.2618\t69\nchr2\t89977800\t89978100\t0.51\t61\nchr2\t89985600\t89985900\t0.2059\t61\nchr2\t89987400\t89987700\t0.5429\t49\nchr2\t89991900\t89992500\t0.2491\t45\nchr2\t90004800\t90005400\t0.2195\t65\nchr2\t90008400\t90010200\t0.0646\t73\nchr2\t90013200\t90013800\t0.4535\t66\nchr2\t90016800\t90017400\t0.3662\t67\nchr2\t90021600\t90021900\t0.4878\t57\nchr2\t90023100\t90025200\t0.2003\t58\nchr2\t90027600\t90028200\t0.3025\t65\nchr2\t90058200\t90060300\t0.022\t70\nchr2\t90083700\t90084000\t0.2116\t62\nchr2\t90090000\t90095100\t0.0802\t61\nchr2\t90098100\t90099300\t0.4091\t73\nchr2\t90102900\t90104400\t0.0509\t73\nchr2\t90109500\t90109800\t0.4323\t55\nchr2\t90111600\t90111900\t0.3705\t51\nchr2\t90114300\t90120000\t0.0931\t69\nchr2\t90122400\t90122700\t0.0931\t69\nchr2\t90124500\t90124800\t0.0931\t69\nchr2\t90128700\t90130500\t0.2593\t70\nchr2\t90132900\t90134400\t0.5327\t66\nchr2\t90138900\t90139200\t0.3706\t65\nchr2\t90153000\t90155400\t0.1782\t64\nchr2\t90157500\t90158100\t0.1782\t64\nchr2\t90159900\t90160500\t0.2299\t43\nchr2\t90162900\t90163200\t0.2299\t43\nchr2\t90230700\t90231000\t0.3816\t65\nchr2\t90232800\t90233100\t0.2905\t72\nchr2\t90234900\t90235500\t0.2905\t72\nchr2\t90237000\t90237600\t0.0738\t95\nchr2\t90240300\t90244200\t0.1821\t91\nchr2\t90246000\t90247200\t0.0021\t101\nchr2\t90248700\t90249900\t0.0021\t101\nchr2\t90251100\t90252900\t0.1622\t130\nchr2\t90254400\t90254700\t0.1622\t130\nchr2\t90258600\t90265200\t0\t181\nchr2\t90266400\t90267000\t0\t181\nchr2\t90268500\t90289200\t0\t181\nchr2\t90291600\t90292500\t0.5261\t307\nchr2\t90299400\t90309000\t0\t97\nchr2\t90310500\t90310800\t0.6001\t43\nchr2\t90313200\t90323100\t0.003\t127\nchr2\t90324300\t90339900\t0\t198\nchr2\t90341400\t90369900\t0\t198\nchr2\t90371100\t90375900\t0\t198\nchr2\t90377100\t90377700\t0\t198\nchr2\t90379500\t90379800\t0.1421\t725\nchr2\t90386400\t90390300\t0.2503\t2573\nchr2\t90391500\t90397200\t0.2503\t2573\nchr2\t90399000\t90402600\t0.1585\t1948\nchr2\t91402500\t91407300\t0\t161\nchr2\t91416000\t91423500\t0\t770\nchr2\t91425300\t91425900\t0.346\t136\nchr2\t91428300\t91431900\t0.0117\t225\nchr2\t91433400\t91441800\t0.0447\t333\nchr2\t91445100\t91445700\t0\t183\nchr2\t91447200\t91451100\t0\t183\nchr2\t91452600\t91461900\t0\t183\nchr2\t91463700\t91466700\t0.0481\t216\nchr2\t91468800\t91472100\t0\t188\nchr2\t91474200\t91476000\t0\t188\nchr2\t91479600\t91487700\t0.0005\t174\nchr2\t91488900\t91494600\t0.0005\t174\nchr2\t91503300\t91503600\t0.6706\t186\nchr2\t91504800\t91527000\t0\t440\nchr2\t91529400\t91533600\t0.0304\t132\nchr2\t91535700\t91548000\t0\t174\nchr2\t91550400\t91558200\t0\t169\nchr2\t91563000\t91564500\t0.125\t144\nchr2\t91567200\t91567500\t0.5442\t124\nchr2\t91569600\t91571100\t0.0023\t135\nchr2\t91574700\t91575300\t0.0194\t120\nchr2\t91579200\t91579500\t0.2819\t110\nchr2\t91591500\t91591800\t0.4118\t113\nchr2\t91600800\t91601700\t0.1142\t140\nchr2\t91603800\t91659300\t0\t152\nchr2\t91660500\t91671900\t0\t152\nchr2\t91673700\t91675800\t0\t152\nchr2\t91678500\t91680600\t0.1018\t81\nchr2\t91681800\t91682400\t0\t217\nchr2\t91683900\t91685700\t0\t217\nchr2\t91688100\t91690500\t0\t217\nchr2\t91691700\t91692900\t0\t217\nchr2\t91694700\t91697700\t0\t217\nchr2\t91698900\t91714500\t0\t217\nchr2\t91715700\t91728900\t0\t217\nchr2\t91733100\t91733400\t0.1128\t63\nchr2\t91752300\t91752600\t0.3618\t74\nchr2\t91762200\t91762500\t0.5595\t65\nchr2\t91789200\t91789500\t0.6487\t111\nchr2\t91791300\t91791900\t0\t119\nchr2\t91794000\t91839300\t0\t119\nchr2\t91860300\t91860600\t0.391\t96\nchr2\t91889700\t91890300\t0.6601\t99\nchr2\t91893000\t91893300\t0.6547\t111\nchr2\t91895100\t91896300\t0.5753\t124\nchr2\t91921800\t91922100\t0.2417\t93\nchr2\t91924200\t91924800\t0.1011\t92\nchr2\t91926300\t91926900\t0.1011\t92\nchr2\t91969200\t91969500\t0.3977\t71\nchr2\t91971000\t91971600\t0.5076\t96\nchr2\t92013300\t92061300\t0\t144\nchr2\t92063400\t92063700\t0\t144\nchr2\t92071500\t92071800\t0.6448\t86\nchr2\t92082000\t92133000\t0\t108\nchr2\t92134500\t92138100\t0\t44\nchr2\t92188200\t92645700\t0\t654\nchr2\t92646900\t92694900\t0\t654\nchr2\t92696100\t92760300\t0\t654\nchr2\t92762100\t92872800\t0\t453\nchr2\t92874000\t92886900\t0\t453\nchr2\t92888700\t92933100\t0\t453\nchr2\t92934300\t92946300\t0\t453\nchr2\t92947800\t92949600\t0\t273\nchr2\t92950800\t92954700\t0\t273\nchr2\t92955900\t92960700\t0\t418\nchr2\t92962200\t93004500\t0\t794\nchr2\t93006300\t93014400\t0\t794\nchr2\t93015600\t93029100\t0\t794\nchr2\t93030300\t93060900\t0\t794\nchr2\t93062400\t93085800\t0\t274\nchr2\t93087000\t93091800\t0\t233\nchr2\t93093300\t93101100\t0\t233\nchr2\t93103200\t93146100\t0\t233\nchr2\t93147300\t93147900\t0\t258\nchr2\t93149100\t93159900\t0\t258\nchr2\t93161100\t93192600\t0\t274\nchr2\t93193800\t93194700\t0\t355\nchr2\t93195900\t93201000\t0\t355\nchr2\t93202500\t93281700\t0\t355\nchr2\t93282900\t93296400\t0\t355\nchr2\t93298200\t93323700\t0\t355\nchr2\t93324900\t93325500\t0\t355\nchr2\t93327300\t93331200\t0\t355\nchr2\t93333000\t93337500\t0\t359\nchr2\t93339000\t93343200\t0\t359\nchr2\t93345900\t93372300\t0\t359\nchr2\t93373500\t93388800\t0\t359\nchr2\t93390000\t93395400\t0\t359\nchr2\t93396600\t93404700\t0\t356\nchr2\t93405900\t93419700\t0\t356\nchr2\t93420900\t93434400\t0\t356\nchr2\t93435600\t93447000\t0\t356\nchr2\t93448500\t93463200\t0\t356\nchr2\t93465300\t93485400\t0\t356\nchr2\t93486900\t93495900\t0\t356\nchr2\t93497100\t93503700\t0\t356\nchr2\t93504900\t93506700\t0\t356\nchr2\t93508200\t93512700\t0\t356\nchr2\t93515100\t93523800\t0\t388\nchr2\t93525000\t93562800\t0\t388\nchr2\t93564000\t93572400\t0\t388\nchr2\t93574800\t93610800\t0\t388\nchr2\t93612000\t93612900\t0\t388\nchr2\t93614700\t93635100\t0\t388\nchr2\t93636900\t93646200\t0\t388\nchr2\t93647400\t93679800\t0\t388\nchr2\t93681600\t93701400\t0\t235\nchr2\t93703200\t93706500\t0\t235\nchr2\t93707700\t93733800\t0\t235\nchr2\t93735000\t93737400\t0\t235\nchr2\t93738900\t93740700\t0\t257\nchr2\t93741900\t93783300\t0\t257\nchr2\t93784800\t93801000\t0\t257\nchr2\t93802500\t93805200\t0\t101\nchr2\t93806400\t93831600\t0\t310\nchr2\t93832800\t93872700\t0\t310\nchr2\t93875700\t93904500\t0\t277\nchr2\t93905700\t93948000\t0\t277\nchr2\t93950700\t93955500\t0\t277\nchr2\t93957000\t93965700\t0\t277\nchr2\t93968100\t93973200\t0\t118\nchr2\t93975600\t93977700\t0\t175\nchr2\t93979200\t93987300\t0\t175\nchr2\t93988500\t94006800\t0\t175\nchr2\t94008600\t94014300\t0\t175\nchr2\t94015500\t94023300\t0\t215\nchr2\t94024800\t94061700\t0\t215\nchr2\t94062900\t94071600\t0\t253\nchr2\t94073400\t94090500\t0\t253\nchr2\t94140600\t94167000\t0\t360\nchr2\t94171200\t94174500\t0\t77\nchr2\t94223100\t94223400\t0.6401\t101\nchr2\t94250100\t94250400\t0.4799\t120\nchr2\t94257600\t94257900\t0.2207\t125\nchr2\t94260000\t94260600\t0.0562\t112\nchr2\t94266300\t94266600\t0.4332\t143\nchr2\t94269900\t94270200\t0.6229\t138\nchr2\t94276500\t94276800\t0.6364\t108\nchr2\t94279500\t94280100\t0.2011\t139\nchr2\t94285200\t94287900\t0.2463\t185\nchr2\t94496400\t94497600\t0.2471\t99\nchr2\t94505400\t94506000\t0.5015\t145\nchr2\t94530600\t94531500\t0.6345\t214\nchr2\t94542300\t94542600\t0.6791\t113\nchr2\t94547100\t94547400\t0.5548\t126\nchr2\t94565100\t94565400\t0.6676\t140\nchr2\t94568700\t94570200\t0.4064\t142\nchr2\t94572300\t94572600\t0.4513\t68\nchr2\t94581600\t94582200\t0.1051\t62\nchr2\t94640400\t94641300\t0.1219\t43\nchr2\t94644300\t94644600\t0.5112\t45\nchr2\t94714200\t94714500\t0.4698\t60\nchr2\t94716900\t94718400\t0.09\t86\nchr2\t94723500\t94724100\t0.2944\t70\nchr2\t94740000\t94740300\t0.1102\t57\nchr2\t94828200\t94828500\t0.2326\t71\nchr2\t94834200\t94835400\t0.497\t52\nchr2\t94844700\t94845000\t0.3695\t47\nchr2\t94846800\t94847100\t0.3951\t60\nchr2\t95244000\t95244300\t0.2269\t77\nchr2\t95406000\t95406300\t0.3274\t69\nchr2\t95421000\t95424300\t0\t73\nchr2\t95426700\t95431200\t0\t84\nchr2\t95433300\t95480100\t0\t97\nchr2\t95487600\t95489700\t0\t72\nchr2\t95580300\t95580600\t0.4608\t56\nchr2\t95587200\t95589300\t0\t72\nchr2\t95591700\t95592000\t0.3781\t60\nchr2\t95596500\t95643600\t0\t86\nchr2\t95645400\t95648400\t0\t81\nchr2\t95649900\t95655600\t0\t63\nchr2\t95748900\t95749200\t0.4188\t66\nchr2\t95765400\t95765700\t0.3845\t80\nchr2\t95766900\t95767200\t0.4463\t63\nchr2\t95772900\t95798400\t0\t93\nchr2\t95810700\t95811000\t0.294\t76\nchr2\t95821200\t95821800\t0.2478\t65\nchr2\t95823000\t95823300\t0.2478\t65\nchr2\t95843400\t95843700\t0.2491\t64\nchr2\t95868600\t95868900\t0.2865\t71\nchr2\t95871900\t95872200\t0.1468\t70\nchr2\t95877000\t95877900\t0.129\t71\nchr2\t95879700\t95880300\t0.3521\t66\nchr2\t95881800\t95882100\t0.3521\t66\nchr2\t95895000\t95895600\t0.1546\t61\nchr2\t95898300\t95901900\t0\t69\nchr2\t95903700\t95907900\t0\t70\nchr2\t95909100\t95909700\t0.247\t56\nchr2\t95913000\t95913300\t0.3458\t50\nchr2\t95918700\t95919000\t0.5812\t46\nchr2\t95935800\t95937000\t0.386\t209\nchr2\t95940300\t95940900\t0.0184\t147\nchr2\t95942100\t95943300\t0.3581\t108\nchr2\t95946300\t95946600\t0.1212\t102\nchr2\t95952000\t95952300\t0.6201\t202\nchr2\t95958600\t95959200\t0.452\t202\nchr2\t95960700\t95961000\t0.4137\t82\nchr2\t95963400\t95964000\t0.0919\t63\nchr2\t95982300\t95982900\t0.0804\t54\nchr2\t95992200\t95992500\t0.5406\t77\nchr2\t96010500\t96011100\t0.1217\t82\nchr2\t96019800\t96020100\t0.5252\t63\nchr2\t96026400\t96051900\t0\t80\nchr2\t96053100\t96053400\t0.0112\t75\nchr2\t96054900\t96059700\t0.0112\t75\nchr2\t96383100\t96384000\t0.2894\t89\nchr2\t96444000\t96446100\t0.0214\t107\nchr2\t96461100\t96462600\t0.1698\t101\nchr2\t96776700\t96777000\t0.2438\t315\nchr2\t96805500\t96805800\t0.0836\t50\nchr2\t97018800\t97019100\t0.4306\t58\nchr2\t97049400\t97050300\t0.0101\t73\nchr2\t97051800\t97053900\t0.0101\t73\nchr2\t97069200\t97069500\t0.6989\t21\nchr2\t97071300\t97072800\t0\t77\nchr2\t97075800\t97076400\t0.1823\t56\nchr2\t97078200\t97078500\t0.5073\t38\nchr2\t97085100\t97085400\t0.3454\t75\nchr2\t97090800\t97091400\t0.2835\t42\nchr2\t97094400\t97095000\t0.0475\t67\nchr2\t97114200\t97114800\t0.0838\t51\nchr2\t97118400\t97120500\t0\t68\nchr2\t97122000\t97122900\t0.4888\t60\nchr2\t97125900\t97127100\t0.2497\t61\nchr2\t97141200\t97141800\t0.2203\t47\nchr2\t97150800\t97151400\t0.5019\t127\nchr2\t97156500\t97157700\t0.0651\t92\nchr2\t97162200\t97162800\t0.0328\t152\nchr2\t97164000\t97164300\t0.191\t139\nchr2\t97166100\t97166700\t0.191\t139\nchr2\t97170900\t97171500\t0.3463\t69\nchr2\t97174800\t97176600\t0.2025\t74\nchr2\t97177800\t97178100\t0.2025\t74\nchr2\t97193100\t97193400\t0.2315\t21\nchr2\t97198800\t97199100\t0.6913\t91\nchr2\t97213200\t97215300\t0.0452\t84\nchr2\t97217700\t97218000\t0.0755\t116\nchr2\t97219500\t97222200\t0.0755\t116\nchr2\t97223400\t97224000\t0.0755\t116\nchr2\t97232400\t97267200\t0\t130\nchr2\t97269000\t97293300\t0\t91\nchr2\t97294500\t97347900\t0\t91\nchr2\t97360500\t97413900\t0\t93\nchr2\t97415400\t97439400\t0\t93\nchr2\t97489500\t97524000\t0\t130\nchr2\t97542000\t97544400\t0.0073\t67\nchr2\t97576500\t97577700\t0.1957\t60\nchr2\t97580700\t97581300\t0.026\t74\nchr2\t97583100\t97584900\t0.026\t74\nchr2\t97588500\t97589100\t0.1438\t53\nchr2\t97602600\t97603800\t0\t81\nchr2\t97605600\t97608000\t0\t81\nchr2\t97611000\t97615800\t0.0072\t79\nchr2\t97617000\t97617300\t0.5588\t43\nchr2\t97620000\t97621500\t0.4359\t42\nchr2\t97630200\t97630500\t0.3086\t67\nchr2\t97687500\t97687800\t0.4476\t68\nchr2\t98061600\t98062200\t0.332\t68\nchr2\t98265600\t98266800\t0.1671\t107\nchr2\t98268000\t98268300\t0.3599\t76\nchr2\t98595000\t98595300\t0.3309\t71\nchr2\t99136500\t99136800\t0.5825\t32\nchr2\t99300600\t99301200\t0.2777\t48\nchr2\t99307500\t99307800\t0.0596\t70\nchr2\t99740400\t99740700\t0.606\t58\nchr2\t99966300\t99966600\t0.3608\t77\nchr2\t100081200\t100081500\t0.6308\t58\nchr2\t100085100\t100085700\t0.4741\t64\nchr2\t100088400\t100090200\t0\t69\nchr2\t100091400\t100092000\t0.1353\t64\nchr2\t100093200\t100093500\t0.387\t59\nchr2\t100095000\t100095300\t0.5041\t66\nchr2\t100096500\t100103100\t0.0012\t94\nchr2\t100109100\t100109400\t0.3635\t69\nchr2\t101358600\t101359200\t0.5002\t62\nchr2\t101481300\t101481600\t0.4957\t30\nchr2\t101748600\t101750400\t0.1974\t101\nchr2\t102533700\t102534000\t0.4465\t62\nchr2\t102566400\t102572400\t0\t84\nchr2\t102875700\t102876300\t0.2337\t84\nchr2\t104222700\t104223000\t0.4819\t57\nchr2\t104824200\t104824500\t0.6689\t102\nchr2\t105054600\t105054900\t0.2925\t22\nchr2\t105208200\t105208500\t0\t63\nchr2\t105209700\t105212100\t0\t63\nchr2\t105251700\t105252000\t0.3709\t63\nchr2\t105586500\t105587400\t0.002\t66\nchr2\t106131000\t106137000\t0\t105\nchr2\t106204800\t106205100\t0.2782\t64\nchr2\t106217100\t106217400\t0.5939\t59\nchr2\t106240800\t106241700\t0.3687\t56\nchr2\t106243800\t106246800\t0.2726\t82\nchr2\t106255200\t106255800\t0.3545\t68\nchr2\t106320000\t106320300\t0.3362\t198\nchr2\t106373100\t106373400\t0.37\t52\nchr2\t106378800\t106379100\t0.5245\t50\nchr2\t106385700\t106386000\t0.4038\t53\nchr2\t106392900\t106397100\t0.332\t60\nchr2\t106398600\t106398900\t0.332\t60\nchr2\t106400700\t106401300\t0.1418\t72\nchr2\t106404300\t106408500\t0.0189\t88\nchr2\t106411200\t106412400\t0.0017\t92\nchr2\t106414500\t106417500\t0.0017\t92\nchr2\t106419000\t106419900\t0.0017\t92\nchr2\t106422300\t106423800\t0.0017\t92\nchr2\t106425300\t106431300\t0\t102\nchr2\t106432500\t106437300\t0\t102\nchr2\t106438800\t106448700\t0\t102\nchr2\t106449900\t106450200\t0\t102\nchr2\t106452000\t106463100\t0\t102\nchr2\t106464900\t106465200\t0.5655\t64\nchr2\t106466400\t106467600\t0.2666\t82\nchr2\t106468800\t106469400\t0.3\t46\nchr2\t106477800\t106478100\t0.4051\t70\nchr2\t106480200\t106480500\t0.6391\t39\nchr2\t106482900\t106483200\t0.3343\t55\nchr2\t106485300\t106485600\t0.251\t30\nchr2\t106499700\t106500300\t0.2602\t79\nchr2\t106507800\t106508100\t0.3234\t70\nchr2\t106901400\t106902000\t0.2873\t85\nchr2\t107189400\t107190000\t0.2408\t66\nchr2\t107310000\t107310300\t0.3983\t46\nchr2\t107826000\t107829300\t0\t73\nchr2\t107831700\t107846100\t0\t73\nchr2\t107847300\t107857200\t0\t73\nchr2\t107858700\t107870700\t0\t79\nchr2\t107872200\t107876100\t0.0042\t68\nchr2\t107878500\t107880900\t0.0042\t68\nchr2\t107882400\t107882700\t0.0042\t68\nchr2\t107884500\t107884800\t0.2347\t47\nchr2\t107886300\t107892600\t0.1061\t59\nchr2\t107894700\t107895900\t0.055\t48\nchr2\t107899500\t107902500\t0.1293\t79\nchr2\t107907900\t107909100\t0.3326\t46\nchr2\t107910900\t107914200\t0.1469\t65\nchr2\t107922900\t107923200\t0.0894\t53\nchr2\t107970000\t107970300\t0.3492\t87\nchr2\t108496200\t108496500\t0.5122\t66\nchr2\t108511500\t108511800\t0.6061\t66\nchr2\t108524400\t108524700\t0.2\t25\nchr2\t108651900\t108653400\t0.1149\t71\nchr2\t108655200\t108659400\t0.0085\t88\nchr2\t108660900\t108661200\t0.0774\t60\nchr2\t108666300\t108666900\t0.1547\t64\nchr2\t108672300\t108673200\t0.0078\t63\nchr2\t108745200\t108746700\t0.1717\t64\nchr2\t108761100\t108762600\t0.025\t59\nchr2\t108765300\t108765600\t0.6025\t60\nchr2\t108769200\t108769500\t0.4141\t48\nchr2\t108800700\t108802500\t0\t86\nchr2\t109199100\t109200000\t0.1484\t11428\nchr2\t109307700\t109311600\t0.0061\t82\nchr2\t109461300\t109461600\t0.5572\t58\nchr2\t109738200\t109739400\t0.2027\t64\nchr2\t109740600\t109742400\t0.0543\t62\nchr2\t109744200\t109763100\t0\t131\nchr2\t109764900\t109765200\t0\t131\nchr2\t109767000\t110048400\t0\t131\nchr2\t110049600\t110095200\t0\t131\nchr2\t110137800\t110138100\t0.4448\t69\nchr2\t110228400\t110268000\t0\t110\nchr2\t110269200\t110365800\t0\t110\nchr2\t110367600\t110386800\t0\t110\nchr2\t110388000\t110424300\t0\t111\nchr2\t110425800\t110627400\t0\t111\nchr2\t110629200\t110630700\t0.0178\t74\nchr2\t110632200\t110632800\t0.4313\t72\nchr2\t110696100\t110696700\t0\t74\nchr2\t110697900\t110699400\t0\t74\nchr2\t111141300\t111141600\t0.3896\t68\nchr2\t111216300\t111216600\t0.4223\t62\nchr2\t111223800\t111224700\t0.1603\t82\nchr2\t111253500\t111257100\t0.2267\t62\nchr2\t111259500\t111260100\t0.0426\t66\nchr2\t111263400\t111264600\t0.0183\t77\nchr2\t111265800\t111266100\t0.0183\t77\nchr2\t111268500\t111274800\t0.0126\t80\nchr2\t111276600\t111277800\t0.3542\t65\nchr2\t111279300\t111288000\t0\t72\nchr2\t111292800\t111294000\t0.0379\t88\nchr2\t111295800\t111297000\t0.0379\t88\nchr2\t111299100\t111303900\t0.0379\t88\nchr2\t111305400\t111305700\t0.0379\t88\nchr2\t111308100\t111309000\t0.1326\t74\nchr2\t111311700\t111312000\t0.1326\t74\nchr2\t111314700\t111315600\t0\t90\nchr2\t111316800\t111318600\t0\t90\nchr2\t111319800\t111326100\t0\t90\nchr2\t111327300\t111332400\t0\t90\nchr2\t111334200\t111350400\t0\t90\nchr2\t111351900\t111356400\t0\t90\nchr2\t111357900\t111360000\t0.3313\t71\nchr2\t111362400\t111362700\t0.1935\t56\nchr2\t111365700\t111366000\t0.223\t56\nchr2\t111368100\t111369300\t0\t78\nchr2\t111373200\t111373500\t0\t78\nchr2\t111375900\t111380400\t0.0725\t73\nchr2\t111384300\t111386700\t0.0132\t88\nchr2\t111388500\t111391500\t0.0132\t88\nchr2\t111393000\t111394800\t0\t72\nchr2\t111398100\t111398400\t0.1628\t60\nchr2\t111399600\t111411000\t0.0129\t82\nchr2\t111412500\t111415800\t0.2594\t83\nchr2\t111417600\t111417900\t0.4407\t60\nchr2\t111419700\t111420000\t0.3361\t98\nchr2\t111421500\t111422100\t0.3361\t98\nchr2\t111423600\t111424500\t0.0003\t80\nchr2\t111429600\t111441000\t0.0205\t89\nchr2\t111442500\t111454500\t0\t81\nchr2\t111456000\t111456300\t0.1807\t72\nchr2\t111457500\t111457800\t0.1807\t72\nchr2\t111459000\t111459300\t0.4012\t57\nchr2\t111475200\t111475500\t0.05\t74\nchr2\t111477000\t111477300\t0.05\t74\nchr2\t111485100\t111485400\t0.2588\t74\nchr2\t111489000\t111489600\t0.2588\t74\nchr2\t111491100\t111491400\t0.2588\t74\nchr2\t111492900\t111495300\t0.2588\t74\nchr2\t111498900\t111504600\t0.0859\t64\nchr2\t111515700\t111517800\t0.0886\t58\nchr2\t111525900\t111528000\t0.1083\t70\nchr2\t111529500\t111529800\t0.1083\t70\nchr2\t111531900\t111533700\t0.1083\t70\nchr2\t111539700\t111542700\t0.0013\t62\nchr2\t111545400\t111546300\t0.0854\t47\nchr2\t111547500\t111547800\t0.0093\t74\nchr2\t111549000\t111554700\t0.0093\t74\nchr2\t111558000\t111559500\t0.0309\t61\nchr2\t111561000\t111561300\t0.4046\t53\nchr2\t111562500\t111563400\t0.0109\t65\nchr2\t111569100\t111569400\t0.0327\t75\nchr2\t111571200\t111577200\t0.0327\t75\nchr2\t111578700\t111581100\t0.0327\t75\nchr2\t111582600\t111586500\t0\t100\nchr2\t111588000\t111591600\t0\t100\nchr2\t111593100\t111596400\t0\t100\nchr2\t111599100\t111602400\t0.0345\t81\nchr2\t111603600\t111603900\t0.2148\t65\nchr2\t111606900\t111607200\t0.2148\t65\nchr2\t111609600\t111611100\t0.1749\t72\nchr2\t111612300\t111614400\t0.1749\t72\nchr2\t111720900\t111726900\t0.0147\t68\nchr2\t111729300\t111730500\t0.0893\t75\nchr2\t111731700\t111732000\t0.0893\t75\nchr2\t111733500\t111733800\t0.0893\t75\nchr2\t111738000\t111740400\t0.0795\t61\nchr2\t111741600\t111741900\t0.3436\t79\nchr2\t111747300\t111749700\t0.0425\t87\nchr2\t111750900\t111756600\t0.1193\t64\nchr2\t111758100\t111758700\t0.1066\t71\nchr2\t111759900\t111760200\t0.1066\t71\nchr2\t111762600\t111764100\t0.0457\t65\nchr2\t111765600\t111765900\t0.4656\t69\nchr2\t111768600\t111772200\t0.0213\t89\nchr2\t111774000\t111774900\t0.0213\t89\nchr2\t111776400\t111777300\t0.0213\t89\nchr2\t111778500\t111781500\t0.0213\t89\nchr2\t111784500\t111789600\t0.0811\t65\nchr2\t111791100\t111791400\t0.0811\t65\nchr2\t111793500\t111794100\t0.0811\t65\nchr2\t111795300\t111795900\t0.3126\t59\nchr2\t111798000\t111798300\t0.3126\t59\nchr2\t111799500\t111807900\t0.0221\t71\nchr2\t111809100\t111820800\t0.0027\t80\nchr2\t111822000\t111822900\t0.0027\t80\nchr2\t111850500\t111850800\t0.3799\t75\nchr2\t111852000\t111852300\t0.5633\t37\nchr2\t111860400\t111861900\t0.1864\t82\nchr2\t111885600\t111886200\t0.3877\t81\nchr2\t112113600\t112115400\t0.0007\t51\nchr2\t112139400\t112139700\t0.5094\t16\nchr2\t112284300\t112284600\t0.3577\t56\nchr2\t112346400\t112346700\t0.6907\t58\nchr2\t112356900\t112357200\t0.3241\t61\nchr2\t112361400\t112409700\t0\t108\nchr2\t112411200\t112415100\t0\t108\nchr2\t112416600\t112425000\t0\t108\nchr2\t112426200\t112428900\t0\t108\nchr2\t112433400\t112433700\t0.5056\t37\nchr2\t112444800\t112445400\t0.3273\t62\nchr2\t112447200\t112447500\t0.5078\t55\nchr2\t112503900\t112509000\t0\t98\nchr2\t112776600\t112776900\t0.0398\t12\nchr2\t113130600\t113130900\t0.3616\t60\nchr2\t113391600\t113392200\t0.3662\t93\nchr2\t113394000\t113395800\t0.0557\t66\nchr2\t113411100\t113412900\t0.0274\t136\nchr2\t113415300\t113417100\t0.0274\t136\nchr2\t113419200\t113419500\t0.4169\t56\nchr2\t113425200\t113427300\t0.0852\t61\nchr2\t113430300\t113432400\t0.2714\t89\nchr2\t113433900\t113434500\t0.2714\t89\nchr2\t113440800\t113441100\t0.2407\t71\nchr2\t113443800\t113444100\t0.1726\t55\nchr2\t113447100\t113455200\t0.1724\t94\nchr2\t113457300\t113460300\t0.0533\t68\nchr2\t113463900\t113469900\t0.0944\t73\nchr2\t113472900\t113473200\t0.2859\t75\nchr2\t113474700\t113475300\t0.2859\t75\nchr2\t113478900\t113486400\t0.0461\t112\nchr2\t113488800\t113498700\t0.0078\t94\nchr2\t113500800\t113501400\t0.6461\t68\nchr2\t113505000\t113507400\t0.4728\t139\nchr2\t113509500\t113509800\t0.1192\t89\nchr2\t113513400\t113514600\t0.3396\t127\nchr2\t113517300\t113517600\t0.2189\t84\nchr2\t113519400\t113520600\t0.1367\t106\nchr2\t113522700\t113526000\t0.1367\t106\nchr2\t113527200\t113528100\t0.0208\t157\nchr2\t113531700\t113532900\t0.0208\t157\nchr2\t113534700\t113535300\t0.0208\t157\nchr2\t113537400\t113540400\t0.0208\t157\nchr2\t113544000\t113544900\t0\t178\nchr2\t113546700\t113551200\t0\t178\nchr2\t113552400\t113554500\t0\t178\nchr2\t113558700\t113560200\t0.438\t133\nchr2\t113562300\t113562900\t0.0924\t148\nchr2\t113564100\t113564700\t0.0924\t148\nchr2\t113568600\t113568900\t0.5956\t69\nchr2\t113574600\t113574900\t0.4142\t127\nchr2\t113576700\t113582400\t0.0638\t164\nchr2\t113584200\t113584500\t0.5032\t134\nchr2\t113586000\t113586900\t0.1161\t145\nchr2\t113588700\t113591100\t0.1161\t145\nchr2\t113593800\t113598300\t0.1437\t174\nchr2\t113601300\t113602200\t0.5455\t82\nchr2\t113605500\t113605800\t0.3257\t83\nchr2\t113607300\t113607600\t0.0137\t87\nchr2\t113608800\t113620500\t0.0137\t87\nchr2\t113622000\t113622300\t0.5225\t39\nchr2\t113623500\t113625000\t0.1635\t75\nchr2\t113627700\t113628900\t0.1635\t75\nchr2\t113633100\t113633400\t0.389\t64\nchr2\t113641500\t113642100\t0.0203\t73\nchr2\t113643900\t113645700\t0.0203\t73\nchr2\t113651100\t113653500\t0.0792\t82\nchr2\t113656500\t113656800\t0.533\t132\nchr2\t113979600\t113979900\t0.615\t56\nchr2\t114084300\t114085200\t0.0999\t69\nchr2\t114097800\t114098400\t0.1911\t71\nchr2\t114371400\t114372000\t0.4466\t32\nchr2\t114748500\t114749100\t0.1687\t60\nchr2\t115006500\t115009200\t0.0474\t90\nchr2\t115376700\t115377000\t0.2477\t66\nchr2\t115426200\t115426500\t0.3786\t69\nchr2\t115438800\t115439100\t0.4384\t59\nchr2\t115487100\t115488900\t0.0461\t77\nchr2\t115800900\t115801200\t0.4294\t113\nchr2\t116037600\t116037900\t0.5105\t68\nchr2\t116050200\t116054400\t0.1467\t104\nchr2\t116121900\t116122200\t0.227\t81\nchr2\t116405400\t116405700\t0.3391\t101\nchr2\t116929800\t116930100\t0.1147\t87\nchr2\t116931300\t116931600\t0.1147\t87\nchr2\t117460200\t117461400\t0.0309\t111\nchr2\t117528000\t117529500\t0.2598\t73\nchr2\t117594300\t117594600\t0.3121\t91\nchr2\t117624600\t117625800\t0.23\t91\nchr2\t117627300\t117628500\t0.23\t91\nchr2\t117649800\t117650400\t0\t34\nchr2\t117651600\t117651900\t0\t34\nchr2\t117653100\t117654900\t0.242\t64\nchr2\t117676800\t117677100\t0.3874\t370\nchr2\t117749700\t117752100\t0.1202\t91\nchr2\t117767100\t117767400\t0.4152\t73\nchr2\t117780300\t117780600\t0.3473\t106\nchr2\t117783300\t117783600\t0.3723\t42\nchr2\t117804900\t117808200\t0.206\t71\nchr2\t117909600\t117909900\t0.2941\t36\nchr2\t118092900\t118093500\t0.5648\t31\nchr2\t118137300\t118142700\t0.0483\t143\nchr2\t118302900\t118305000\t0\t65\nchr2\t118485900\t118488000\t0.0128\t91\nchr2\t118867500\t118868400\t0\t99\nchr2\t118895700\t118901100\t0\t93\nchr2\t118999800\t119000100\t0.2836\t91\nchr2\t119001300\t119001600\t0.2836\t91\nchr2\t119444400\t119444700\t0.3603\t21\nchr2\t119843400\t119844600\t0.3669\t71\nchr2\t120188100\t120188400\t0.3306\t108\nchr2\t120192900\t120193200\t0.3238\t68\nchr2\t120321000\t120321300\t0.519\t37\nchr2\t120391500\t120391800\t0.5646\t199\nchr2\t121163700\t121164000\t0.5272\t65\nchr2\t121438800\t121439100\t0.379\t61\nchr2\t121478700\t121479000\t0.509\t74\nchr2\t122013900\t122017800\t0.0395\t95\nchr2\t122049000\t122051700\t0.1184\t85\nchr2\t122265300\t122266200\t0.118\t85\nchr2\t122346600\t122348400\t0.1417\t78\nchr2\t122350500\t122351400\t0.1417\t78\nchr2\t122668800\t122669100\t0.4885\t67\nchr2\t122783100\t122783700\t0.1352\t79\nchr2\t123256800\t123257700\t0.1721\t74\nchr2\t123631500\t123631800\t0.3283\t84\nchr2\t123633300\t123633900\t0.3283\t84\nchr2\t123684600\t123685200\t0.1922\t72\nchr2\t123705000\t123705600\t0.1781\t91\nchr2\t123950400\t123950700\t0.4379\t66\nchr2\t123955800\t123956100\t0.3491\t27\nchr2\t124035900\t124036200\t0.4095\t54\nchr2\t124140300\t124145700\t0\t115\nchr2\t124357500\t124361100\t0.063\t86\nchr2\t124408800\t124409700\t0.023\t80\nchr2\t124411500\t124413900\t0.023\t80\nchr2\t124458000\t124458300\t0.6926\t52\nchr2\t124593300\t124598700\t0.0062\t94\nchr2\t125417400\t125418000\t0.0916\t76\nchr2\t125734500\t125734800\t0.6553\t61\nchr2\t125752200\t125753100\t0.231\t56\nchr2\t126118800\t126119400\t0.3696\t72\nchr2\t126178200\t126183300\t0\t111\nchr2\t126453000\t126453300\t0.3599\t70\nchr2\t126455100\t126455400\t0.4905\t67\nchr2\t127119000\t127120500\t0.0369\t88\nchr2\t127752300\t127752600\t0.4414\t53\nchr2\t127786800\t127789800\t0.0503\t85\nchr2\t128113800\t128114100\t0.5723\t23\nchr2\t128225700\t128226000\t0.6619\t56\nchr2\t128265900\t128266200\t0.4866\t63\nchr2\t128340600\t128341200\t0.1742\t38\nchr2\t128417700\t128418600\t0.1456\t84\nchr2\t128859600\t128864700\t0\t93\nchr2\t128964900\t128965800\t0.1787\t70\nchr2\t128967000\t128967300\t0.3496\t27\nchr2\t129411000\t129417300\t0\t94\nchr2\t129645900\t129646200\t0.3903\t52\nchr2\t129682500\t129687000\t0\t110\nchr2\t129980100\t129980400\t0.359\t68\nchr2\t130041600\t130043100\t0\t66\nchr2\t130044300\t130044600\t0\t66\nchr2\t130048500\t130050600\t0.4843\t60\nchr2\t130051800\t130052100\t0.6287\t37\nchr2\t130053900\t130054200\t0.3672\t75\nchr2\t130056000\t130056900\t0.3154\t79\nchr2\t130058400\t130058700\t0.3154\t79\nchr2\t130060200\t130060500\t0.3671\t78\nchr2\t130064100\t130064700\t0.0168\t90\nchr2\t130066500\t130067400\t0.0168\t90\nchr2\t130069200\t130069500\t0.5209\t67\nchr2\t130071600\t130072200\t0\t85\nchr2\t130074300\t130074600\t0\t85\nchr2\t130076100\t130100700\t0\t85\nchr2\t130101900\t130102200\t0.4161\t38\nchr2\t130103700\t130107000\t0.0399\t71\nchr2\t130108500\t130108800\t0.2136\t56\nchr2\t130110900\t130111200\t0.1938\t57\nchr2\t130112400\t130112700\t0.1938\t57\nchr2\t130114800\t130115100\t0.1938\t57\nchr2\t130119600\t130119900\t0.0926\t63\nchr2\t130121400\t130125300\t0.0926\t63\nchr2\t130138200\t130138500\t0.5225\t39\nchr2\t130151400\t130151700\t0.491\t81\nchr2\t130215300\t130215600\t0.6114\t55\nchr2\t130220400\t130220700\t0.4709\t77\nchr2\t130222800\t130223400\t0.0253\t72\nchr2\t130238700\t130239000\t0.233\t58\nchr2\t130245000\t130245300\t0.464\t67\nchr2\t130269000\t130269300\t0.5031\t61\nchr2\t130277100\t130277400\t0.4018\t59\nchr2\t130398000\t130398300\t0.5913\t52\nchr2\t130401600\t130402500\t0\t80\nchr2\t130405200\t130409700\t0\t80\nchr2\t130410900\t130414800\t0.1117\t61\nchr2\t130416000\t130420500\t0.0031\t78\nchr2\t130425000\t130425300\t0.3898\t70\nchr2\t130426800\t130428900\t0\t87\nchr2\t130430100\t130449300\t0\t87\nchr2\t130450800\t130451100\t0.2441\t71\nchr2\t130453200\t130453500\t0.3199\t63\nchr2\t130458900\t130476900\t0\t107\nchr2\t130478100\t130483200\t0\t107\nchr2\t130484400\t130559700\t0\t107\nchr2\t130560900\t130617600\t0\t107\nchr2\t130618800\t130623900\t0\t107\nchr2\t130626000\t130635900\t0.0042\t93\nchr2\t130638300\t130639800\t0.2901\t72\nchr2\t130642200\t130656000\t0\t102\nchr2\t130657200\t130662000\t0\t80\nchr2\t130672200\t130691400\t0\t98\nchr2\t130692600\t130695000\t0\t98\nchr2\t130696200\t130696500\t0\t98\nchr2\t130701000\t130705500\t0.0022\t69\nchr2\t130706700\t130710600\t0.1084\t69\nchr2\t130712400\t130716300\t0\t71\nchr2\t130719000\t130719900\t0\t71\nchr2\t130822200\t130822500\t0.3717\t55\nchr2\t130857300\t130863900\t0\t61\nchr2\t131208000\t131208600\t0.5011\t53\nchr2\t131210700\t131211000\t0.2345\t72\nchr2\t131213400\t131213700\t0.2408\t65\nchr2\t131214900\t131215800\t0.2408\t65\nchr2\t131217000\t131218200\t0.2408\t65\nchr2\t131223900\t131224500\t0.3815\t63\nchr2\t131226300\t131227800\t0.1358\t68\nchr2\t131232000\t131232600\t0.2875\t74\nchr2\t131234100\t131235300\t0.0964\t74\nchr2\t131236800\t131237100\t0\t99\nchr2\t131238300\t131262300\t0\t99\nchr2\t131263500\t131265300\t0\t99\nchr2\t131268000\t131268600\t0\t99\nchr2\t131269800\t131270100\t0.4376\t66\nchr2\t131272500\t131276100\t0\t103\nchr2\t131278800\t131279100\t0.486\t58\nchr2\t131282700\t131283000\t0.3318\t78\nchr2\t131284800\t131285100\t0.3318\t78\nchr2\t131287500\t131289000\t0.0104\t71\nchr2\t131291400\t131291700\t0.0104\t71\nchr2\t131294400\t131298000\t0.0104\t71\nchr2\t131300700\t131301000\t0.1876\t63\nchr2\t131363400\t131363700\t0.4264\t61\nchr2\t131380800\t131381100\t0.4136\t59\nchr2\t131387700\t131388000\t0.428\t40\nchr2\t131435400\t131435700\t0.3331\t56\nchr2\t131450700\t131451300\t0.1153\t68\nchr2\t131453700\t131454000\t0.6043\t47\nchr2\t131459100\t131459400\t0.5967\t49\nchr2\t131466300\t131466600\t0.3217\t42\nchr2\t131521200\t131521500\t0.4177\t74\nchr2\t131531400\t131532600\t0.4085\t65\nchr2\t131544600\t131544900\t0.3445\t79\nchr2\t131693400\t131695800\t0.1176\t89\nchr2\t131761800\t131763000\t0.2689\t80\nchr2\t131766300\t131768700\t0\t100\nchr2\t131778300\t131778600\t0.4386\t58\nchr2\t131791800\t131796600\t0\t89\nchr2\t131797800\t131800800\t0.1497\t80\nchr2\t131814300\t131816400\t0.0742\t83\nchr2\t131820000\t131820300\t0.5152\t58\nchr2\t131856900\t131857500\t0.4154\t49\nchr2\t131979900\t131980200\t0.4184\t57\nchr2\t131985900\t131986200\t0.3124\t55\nchr2\t132016800\t132017100\t0.5519\t217\nchr2\t132085500\t132085800\t0.3577\t49\nchr2\t132090600\t132090900\t0.2555\t45\nchr2\t132099000\t132099300\t0.2878\t55\nchr2\t132189300\t132190500\t0.5287\t73\nchr2\t132193800\t132194100\t0.5868\t56\nchr2\t132210600\t132210900\t0.6933\t97\nchr2\t132233400\t132233700\t0.3874\t96\nchr2\t132236700\t132237000\t0.5174\t75\nchr2\t132393900\t132394800\t0.1478\t252\nchr2\t132565500\t132566400\t0.3128\t72\nchr2\t132591000\t132591300\t0.5006\t48\nchr2\t133101000\t133101600\t0.2964\t50\nchr2\t133116300\t133116600\t0.3612\t51\nchr2\t133299900\t133302600\t0.0149\t98\nchr2\t133308600\t133308900\t0.5148\t40\nchr2\t133465800\t133466400\t0.4439\t80\nchr2\t133549500\t133552500\t0.1137\t109\nchr2\t133616100\t133619100\t0.2054\t65\nchr2\t133702800\t133703100\t0.6893\t35\nchr2\t133911600\t133915800\t0.0105\t121\nchr2\t134209200\t134212500\t0\t114\nchr2\t134607000\t134609700\t0.082\t120\nchr2\t134650800\t134655600\t0.0203\t97\nchr2\t134826600\t134826900\t0.5377\t72\nchr2\t134828700\t134831100\t0.132\t106\nchr2\t135032700\t135034800\t0.3027\t51\nchr2\t135117300\t135117900\t0.5633\t234\nchr2\t135235500\t135235800\t0.3745\t49\nchr2\t135293700\t135294000\t0.3977\t68\nchr2\t135482100\t135482400\t0.382\t80\nchr2\t136817400\t136818300\t0.3338\t79\nchr2\t136890300\t136890600\t0.5793\t24\nchr2\t137238600\t137238900\t0.3657\t62\nchr2\t137310300\t137310600\t0.269\t67\nchr2\t137311800\t137312100\t0.269\t67\nchr2\t137394000\t137394900\t0.1175\t83\nchr2\t137396100\t137396700\t0.1175\t83\nchr2\t137397900\t137398500\t0.1175\t83\nchr2\t137484300\t137485200\t0.1178\t63\nchr2\t137486400\t137488200\t0.1178\t63\nchr2\t138246600\t138247200\t0.0298\t53\nchr2\t138251100\t138251700\t0.0823\t60\nchr2\t138459300\t138459600\t0.3572\t76\nchr2\t139027800\t139028100\t0.2512\t48\nchr2\t139103700\t139104000\t0.3308\t88\nchr2\t139308000\t139308300\t0.4278\t78\nchr2\t139309800\t139310100\t0.4278\t78\nchr2\t139372800\t139373100\t0.1955\t127\nchr2\t139533300\t139533600\t0.1673\t69\nchr2\t139535700\t139536000\t0.1673\t69\nchr2\t139878600\t139880400\t0.0723\t70\nchr2\t140828400\t140828700\t0.3586\t22\nchr2\t141045000\t141045300\t0.6351\t32\nchr2\t141071100\t141071400\t0.2822\t75\nchr2\t141963600\t141965700\t0.0134\t120\nchr2\t142172700\t142173000\t0.55\t36\nchr2\t142608300\t142608900\t0.2461\t88\nchr2\t142611000\t142613100\t0.4361\t68\nchr2\t142677000\t142677300\t0.2995\t25\nchr2\t142808700\t142810500\t0.2897\t75\nchr2\t143007300\t143012100\t0.0501\t111\nchr2\t143637900\t143638500\t0.1878\t53\nchr2\t143662200\t143663400\t0.0579\t82\nchr2\t143665200\t143667300\t0.0579\t82\nchr2\t143861100\t143866800\t0\t137\nchr2\t143921400\t143922300\t0.0971\t51\nchr2\t143992200\t143992500\t0.158\t48\nchr2\t144246300\t144246600\t0.5372\t45\nchr2\t144897600\t144897900\t0.0436\t81\nchr2\t144899100\t144899700\t0.0436\t81\nchr2\t145715100\t145715400\t0.3921\t51\nchr2\t146408100\t146411100\t0.0565\t88\nchr2\t147113400\t147113700\t0.4388\t38\nchr2\t147155100\t147155400\t0.1288\t98\nchr2\t147727800\t147732900\t0.0592\t81\nchr2\t147744000\t147745800\t0.0749\t66\nchr2\t147931200\t147931500\t0.4151\t117\nchr2\t148149000\t148151400\t0.1017\t98\nchr2\t148153500\t148154100\t0.0902\t52\nchr2\t148188900\t148194600\t0\t88\nchr2\t148326600\t148326900\t0.4104\t60\nchr2\t149403300\t149403600\t0.2172\t100\nchr2\t149405700\t149406000\t0.3459\t78\nchr2\t149505900\t149506200\t0.3352\t70\nchr2\t149545800\t149546100\t0.384\t62\nchr2\t149549700\t149550000\t0.3387\t72\nchr2\t149770500\t149770800\t0.2646\t46\nchr2\t149851800\t149852400\t0.2967\t89\nchr2\t149854500\t149855100\t0.3077\t74\nchr2\t149902800\t149903100\t0.2214\t49\nchr2\t149945700\t149951100\t0\t111\nchr2\t150180300\t150180600\t0.35\t70\nchr2\t151579200\t151608900\t0\t95\nchr2\t151698900\t151704600\t0.0003\t117\nchr2\t151875000\t151875600\t0.3233\t72\nchr2\t152066400\t152067000\t0.5522\t75\nchr2\t152357100\t152357700\t0.2259\t30\nchr2\t152997900\t152999100\t0.5198\t80\nchr2\t153007800\t153013200\t0\t115\nchr2\t153222300\t153222600\t0.1363\t541\nchr2\t153253200\t153253500\t0.4349\t53\nchr2\t153398700\t153399300\t0.324\t76\nchr2\t153401400\t153401700\t0.554\t70\nchr2\t153538500\t153539100\t0.021\t132\nchr2\t153629700\t153630300\t0.261\t66\nchr2\t153720000\t153724800\t0.1246\t75\nchr2\t153864600\t153866100\t0.0073\t101\nchr2\t154051200\t154051500\t0.5676\t57\nchr2\t154955100\t154956600\t0.3286\t82\nchr2\t154980900\t154981200\t0.2604\t59\nchr2\t154989000\t154990500\t0.0803\t81\nchr2\t155034600\t155034900\t0.5191\t37\nchr2\t155191800\t155192400\t0.3958\t58\nchr2\t155331600\t155331900\t0.5541\t23\nchr2\t155443800\t155446500\t0.0037\t80\nchr2\t155500800\t155501100\t0.0656\t140\nchr2\t155966700\t155969400\t0.2278\t87\nchr2\t156255000\t156260400\t0.1247\t98\nchr2\t156367800\t156369900\t0.0384\t64\nchr2\t156450600\t156451200\t0.2701\t61\nchr2\t156529200\t156530400\t0.436\t72\nchr2\t156774600\t156774900\t0.4337\t77\nchr2\t156965400\t156965700\t0.331\t63\nchr2\t157369500\t157374300\t0.0162\t112\nchr2\t157378500\t157379700\t0.0191\t68\nchr2\t157516200\t157516800\t0.3429\t76\nchr2\t157518600\t157521000\t0.0215\t73\nchr2\t157547100\t157548600\t0.0742\t62\nchr2\t157566900\t157572300\t0\t102\nchr2\t157576800\t157577100\t0.2448\t38\nchr2\t157632900\t157633200\t0.4964\t54\nchr2\t157818900\t157819200\t0.6933\t41\nchr2\t158351700\t158352300\t0.3072\t66\nchr2\t158355600\t158357100\t0.1978\t74\nchr2\t158523300\t158528700\t0.0005\t81\nchr2\t158780400\t158780700\t0.1536\t58\nchr2\t158851800\t158852400\t0.1111\t62\nchr2\t158872800\t158873400\t0.0473\t71\nchr2\t159280500\t159280800\t0.4174\t49\nchr2\t159292800\t159295200\t0\t91\nchr2\t159519300\t159519600\t0.6063\t53\nchr2\t159663900\t159665700\t0.0064\t109\nchr2\t159991800\t159992700\t0.0939\t69\nchr2\t159999300\t159999600\t0.5264\t15\nchr2\t160120200\t160120800\t0.2937\t54\nchr2\t160713300\t160714200\t0.1602\t45\nchr2\t160757100\t160759500\t0.0017\t91\nchr2\t160768200\t160768800\t0.2997\t63\nchr2\t160770000\t160771500\t0\t75\nchr2\t160800600\t160801500\t0.1221\t95\nchr2\t160851300\t160851600\t0.0099\t82\nchr2\t160852800\t160855800\t0.0099\t82\nchr2\t160860600\t160860900\t0.4157\t83\nchr2\t160939200\t160939500\t0.4281\t40\nchr2\t160999200\t160999800\t0.3091\t63\nchr2\t161539200\t161540700\t0.0459\t70\nchr2\t161926500\t161926800\t0.3864\t69\nchr2\t161928000\t161928300\t0.3864\t69\nchr2\t162569400\t162569700\t0.4977\t71\nchr2\t162571500\t162572700\t0.124\t58\nchr2\t164121000\t164123400\t0.0018\t127\nchr2\t164262000\t164263800\t0.0847\t92\nchr2\t165040500\t165041700\t0.3275\t64\nchr2\t165411000\t165411300\t0.2031\t49\nchr2\t165486300\t165492000\t0.0102\t120\nchr2\t165592800\t165593100\t0.5062\t60\nchr2\t165731700\t165737400\t0.0027\t137\nchr2\t166099500\t166101300\t0.0198\t147\nchr2\t166200000\t166200300\t0.3931\t48\nchr2\t166310400\t166310700\t0.312\t52\nchr2\t166502700\t166503300\t0.2258\t79\nchr2\t166703100\t166704900\t0.2889\t70\nchr2\t166859400\t166859700\t0.456\t74\nchr2\t166988400\t166994400\t0\t114\nchr2\t167085000\t167085300\t0.4476\t67\nchr2\t167216100\t167216700\t0.0077\t92\nchr2\t167466600\t167466900\t0.1813\t941\nchr2\t167665200\t167665500\t0.4871\t68\nchr2\t167837400\t167841000\t0.2814\t119\nchr2\t168039300\t168039600\t0.0894\t24\nchr2\t169079700\t169080000\t0.6714\t48\nchr2\t169248900\t169254600\t0\t111\nchr2\t169262400\t169263600\t0.3697\t76\nchr2\t169785000\t169785600\t0\t63\nchr2\t169787100\t169787400\t0\t63\nchr2\t169970700\t169971600\t0.3096\t61\nchr2\t169972800\t169973400\t0.1888\t74\nchr2\t170150400\t170150700\t0.3294\t65\nchr2\t170649300\t170649600\t0.4651\t38\nchr2\t171819000\t171819300\t0.5771\t13\nchr2\t171865800\t171866700\t0.1162\t78\nchr2\t171900300\t171900600\t0.3597\t66\nchr2\t172110900\t172111200\t0.4914\t33\nchr2\t172190400\t172190700\t0.4694\t77\nchr2\t172315500\t172321200\t0\t129\nchr2\t173528400\t173529900\t0.3912\t67\nchr2\t173699400\t173705400\t0.0027\t103\nchr2\t174269700\t174274200\t0.0293\t90\nchr2\t174404700\t174410400\t0.0402\t86\nchr2\t174720300\t174720900\t0.2718\t47\nchr2\t175083000\t175083300\t0.2634\t70\nchr2\t175411800\t175412100\t0.3194\t67\nchr2\t175482000\t175488000\t0\t90\nchr2\t175588800\t175593300\t0.0225\t102\nchr2\t175691700\t175694400\t0.1359\t90\nchr2\t175700700\t175701000\t0.1973\t72\nchr2\t175704000\t175704300\t0.4583\t70\nchr2\t175760100\t175765500\t0\t66\nchr2\t175813200\t175814100\t0.0106\t46\nchr2\t175962900\t175963200\t0.1763\t86\nchr2\t176798700\t176799000\t0.374\t87\nchr2\t177924900\t177925500\t0.482\t58\nchr2\t177945300\t177947100\t0.195\t77\nchr2\t177973200\t177978900\t0\t137\nchr2\t178653300\t178662900\t0\t87\nchr2\t178984500\t178985700\t0.3673\t70\nchr2\t179061900\t179062500\t0.1091\t79\nchr2\t179201400\t179201700\t0.5483\t53\nchr2\t179319000\t179319300\t0.3306\t54\nchr2\t179389500\t179389800\t0.4852\t73\nchr2\t179391600\t179391900\t0.3709\t52\nchr2\t179735100\t179735700\t0.1422\t71\nchr2\t179963400\t179963700\t0.6609\t48\nchr2\t180300000\t180300300\t0.5684\t62\nchr2\t180453000\t180453300\t0.4128\t47\nchr2\t180580800\t180581100\t0.4\t45\nchr2\t180833700\t180839400\t0\t114\nchr2\t181182000\t181182300\t0.4817\t82\nchr2\t181347000\t181347300\t0.5113\t107\nchr2\t182025300\t182030700\t0.0544\t96\nchr2\t182175300\t182177100\t0.043\t82\nchr2\t182213100\t182217600\t0\t114\nchr2\t182385600\t182385900\t0.546\t57\nchr2\t182430300\t182430900\t0.0327\t82\nchr2\t182560200\t182560500\t0.3636\t53\nchr2\t182747700\t182749500\t0.1617\t68\nchr2\t182881800\t182882100\t0.6639\t55\nchr2\t182971200\t182971500\t0.5051\t42\nchr2\t183385200\t183385500\t0.2563\t48\nchr2\t183590100\t183591000\t0.1833\t65\nchr2\t183853500\t183853800\t0.4546\t69\nchr2\t183971100\t183971400\t0.3657\t70\nchr2\t184231500\t184231800\t0.4635\t66\nchr2\t184947300\t184950900\t0\t131\nchr2\t185419500\t185424600\t0.0157\t91\nchr2\t185586300\t185586600\t0.3048\t78\nchr2\t185765700\t185767200\t0.238\t93\nchr2\t185774700\t185775300\t0.2498\t65\nchr2\t185841900\t185842500\t0.4137\t84\nchr2\t185844000\t185847000\t0.0601\t54\nchr2\t185865300\t185868300\t0.1606\t102\nchr2\t185869500\t185870400\t0.1791\t88\nchr2\t185982600\t185982900\t0.3807\t71\nchr2\t186153300\t186153600\t0.6399\t50\nchr2\t186402000\t186402900\t0.1791\t84\nchr2\t186477000\t186477300\t0.2155\t96\nchr2\t186922500\t186923100\t0.0959\t77\nchr2\t186952800\t186953700\t0.0979\t91\nchr2\t187235100\t187235400\t0.1259\t66\nchr2\t187287900\t187288200\t0.0764\t18\nchr2\t187357500\t187357800\t0.6933\t53\nchr2\t187598100\t187598700\t0.409\t71\nchr2\t188124300\t188129100\t0.0186\t98\nchr2\t188716200\t188716500\t0.2313\t97\nchr2\t188825100\t188827500\t0.0398\t97\nchr2\t189027000\t189030000\t0.0292\t114\nchr2\t189196200\t189196500\t0.3214\t47\nchr2\t189200400\t189200700\t0.1305\t49\nchr2\t189718800\t189719100\t0.5148\t54\nchr2\t190143600\t190143900\t0.1732\t56\nchr2\t191694600\t191694900\t0.3718\t55\nchr2\t191742900\t191743200\t0.2252\t43\nchr2\t191763300\t191765700\t0.0564\t92\nchr2\t192131100\t192131400\t0.6038\t75\nchr2\t192268500\t192273900\t0\t89\nchr2\t192835800\t192836400\t0.2195\t61\nchr2\t192862800\t192863100\t0.349\t66\nchr2\t193032600\t193032900\t0.4905\t92\nchr2\t193212600\t193218600\t0.0032\t153\nchr2\t193533900\t193534200\t0.4008\t34\nchr2\t193597200\t193597800\t0.3937\t66\nchr2\t193649100\t193649700\t0.2935\t80\nchr2\t193674300\t193674600\t0.5971\t53\nchr2\t193706700\t193707300\t0.049\t75\nchr2\t193821900\t193822500\t0.2901\t78\nchr2\t193908300\t193908600\t0.4967\t47\nchr2\t193914000\t193914300\t0\t16\nchr2\t194447700\t194448900\t0.0585\t57\nchr2\t194859300\t194859600\t0.4679\t75\nchr2\t195063600\t195065100\t0.3366\t64\nchr2\t195067500\t195071400\t0.0493\t83\nchr2\t195233700\t195234000\t0.4099\t68\nchr2\t195260700\t195261300\t0.3672\t81\nchr2\t195375000\t195375600\t0.2297\t80\nchr2\t195376800\t195377100\t0.2297\t80\nchr2\t195527400\t195528600\t0.0873\t99\nchr2\t195567300\t195569100\t0.1823\t87\nchr2\t196521600\t196521900\t0.1644\t96\nchr2\t196523400\t196526400\t0.1644\t96\nchr2\t196749900\t196750200\t0.3616\t38\nchr2\t196905600\t196911600\t0\t103\nchr2\t197067300\t197068200\t0.1037\t111\nchr2\t197635500\t197640000\t0.1055\t91\nchr2\t197687700\t197692500\t0.0054\t97\nchr2\t197695500\t197695800\t0.1141\t70\nchr2\t197697300\t197697600\t0.3423\t51\nchr2\t197730000\t197731500\t0.2008\t77\nchr2\t197732700\t197733600\t0.2008\t77\nchr2\t197922000\t197922900\t0.1655\t62\nchr2\t198450300\t198450600\t0.3104\t62\nchr2\t198575100\t198575400\t0.5603\t32\nchr2\t198582900\t198586200\t0.0562\t111\nchr2\t198934500\t198935100\t0.2172\t78\nchr2\t200250600\t200250900\t0.4683\t65\nchr2\t200500500\t200501700\t0.3679\t94\nchr2\t200682600\t200683800\t0.1174\t74\nchr2\t200822100\t200823000\t0.0142\t62\nchr2\t201082800\t201083100\t0.4988\t58\nchr2\t201282000\t201284700\t0.0566\t70\nchr2\t201484200\t201484800\t0.2515\t84\nchr2\t201592200\t201592500\t0.4153\t85\nchr2\t201593700\t201594000\t0.3964\t86\nchr2\t202021800\t202022100\t0.4145\t71\nchr2\t202578300\t202578600\t0.5745\t63\nchr2\t202606200\t202606800\t0.1264\t68\nchr2\t202887600\t202887900\t0.4925\t64\nchr2\t203408700\t203409000\t0.5327\t34\nchr2\t203986800\t203987100\t0.587\t76\nchr2\t204386100\t204386400\t0.311\t76\nchr2\t204582900\t204583500\t0.0772\t78\nchr2\t204767100\t204770400\t0\t96\nchr2\t204991200\t204996900\t0.0248\t76\nchr2\t205044300\t205044600\t0.1335\t120\nchr2\t205206900\t205209300\t0.1285\t94\nchr2\t206071200\t206071500\t0.1866\t130\nchr2\t206171100\t206171400\t0.3511\t73\nchr2\t206172600\t206172900\t0.3511\t73\nchr2\t206355600\t206356200\t0.2363\t93\nchr2\t206374800\t206375400\t0\t25\nchr2\t206400000\t206400900\t0.2003\t51\nchr2\t206577600\t206577900\t0.4924\t64\nchr2\t206910000\t206913900\t0.0161\t114\nchr2\t207004800\t207006300\t0.0248\t94\nchr2\t207037200\t207037500\t0.2922\t62\nchr2\t207273600\t207273900\t0.0685\t51\nchr2\t207609900\t207612000\t0\t99\nchr2\t207702600\t207702900\t0.4514\t30\nchr2\t208094400\t208094700\t0.0373\t31\nchr2\t208196400\t208196700\t0.2053\t35\nchr2\t208587000\t208587300\t0.2983\t43\nchr2\t208746900\t208747200\t0.3795\t75\nchr2\t208803000\t208803300\t0.4033\t37\nchr2\t208805400\t208806000\t0.4121\t67\nchr2\t208812900\t208817400\t0.1851\t86\nchr2\t208835400\t208835700\t0.4556\t80\nchr2\t208897200\t208898100\t0.2913\t80\nchr2\t208899300\t208899600\t0.2913\t80\nchr2\t209129100\t209133600\t0.0007\t85\nchr2\t209163900\t209168100\t0.05\t89\nchr2\t209332200\t209333100\t0.0235\t99\nchr2\t209746800\t209748300\t0.3112\t94\nchr2\t209751000\t209751300\t0.3936\t65\nchr2\t210069600\t210069900\t0.6032\t37\nchr2\t210639300\t210639600\t0.5109\t43\nchr2\t210666300\t210666600\t0.4945\t74\nchr2\t211002900\t211003200\t0.5431\t69\nchr2\t211220400\t211224600\t0.0589\t110\nchr2\t211227000\t211227300\t0.5172\t59\nchr2\t211633500\t211633800\t0.3014\t32\nchr2\t211661700\t211662000\t0.4595\t37\nchr2\t211686600\t211686900\t0.677\t24\nchr2\t211872900\t211873200\t0.333\t70\nchr2\t211889100\t211894500\t0.0212\t76\nchr2\t212148600\t212149200\t0.3361\t52\nchr2\t212701800\t212702700\t0.1545\t83\nchr2\t212709900\t212710200\t0.3823\t26\nchr2\t213345300\t213345600\t0.1878\t61\nchr2\t213367500\t213368100\t0.2004\t60\nchr2\t213567300\t213572400\t0\t103\nchr2\t213676800\t213677100\t0.4128\t84\nchr2\t213783300\t213784500\t0.016\t53\nchr2\t213833400\t213833700\t0.5814\t10\nchr2\t214684200\t214689300\t0.0111\t101\nchr2\t214718700\t214719000\t0.5351\t32\nchr2\t214834500\t214836300\t0.2907\t79\nchr2\t215926500\t215926800\t0.5979\t50\nchr2\t216225900\t216228300\t0\t45\nchr2\t216324000\t216324600\t0.1461\t76\nchr2\t216325800\t216326100\t0.1461\t76\nchr2\t216459600\t216459900\t0.4044\t67\nchr2\t217311300\t217311600\t0.1284\t80\nchr2\t217677000\t217677300\t0.485\t43\nchr2\t217805400\t217805700\t0.626\t101\nchr2\t217809300\t217809600\t0.4914\t122\nchr2\t218846100\t218846400\t0.5272\t79\nchr2\t218932200\t218932500\t0.2838\t81\nchr2\t218971800\t218972100\t0.518\t35\nchr2\t219932400\t219937800\t0\t113\nchr2\t220546200\t220546500\t0.5223\t34\nchr2\t221366700\t221367000\t0.6353\t25\nchr2\t221383800\t221384100\t0.1259\t41\nchr2\t221860800\t221861100\t0.4253\t51\nchr2\t221985900\t221988600\t0.0404\t106\nchr2\t221989800\t221990400\t0.0404\t106\nchr2\t222147900\t222155100\t0.0165\t100\nchr2\t222816000\t222817200\t0.1754\t40\nchr2\t222895500\t222897600\t0\t65\nchr2\t222932700\t222933000\t0.1835\t25\nchr2\t223942500\t223942800\t0.4395\t39\nchr2\t225173400\t225173700\t0.3141\t53\nchr2\t225174900\t225175200\t0.2975\t69\nchr2\t225267300\t225267900\t0.4011\t76\nchr2\t225322500\t225323100\t0.1028\t80\nchr2\t225643800\t225645000\t0.3197\t81\nchr2\t225851700\t225852000\t0.4937\t55\nchr2\t225873600\t225875100\t0.2481\t72\nchr2\t225939900\t225940200\t0.3728\t52\nchr2\t226364100\t226364400\t0.6831\t23\nchr2\t226470000\t226470600\t0\t19\nchr2\t226507800\t226508100\t0.5762\t72\nchr2\t226574400\t226575300\t0.0078\t92\nchr2\t227067900\t227070000\t0.2363\t108\nchr2\t227203500\t227203800\t0.2548\t33\nchr2\t228035100\t228035400\t0.3186\t69\nchr2\t228201300\t228201900\t0.2585\t69\nchr2\t228230100\t228231900\t0.1009\t78\nchr2\t228420900\t228421200\t0.2471\t74\nchr2\t228422400\t228423900\t0.2471\t74\nchr2\t228569700\t228570000\t0.4848\t85\nchr2\t228756600\t228761700\t0\t136\nchr2\t228831000\t228831300\t0.3552\t68\nchr2\t228855000\t228855900\t0.1859\t83\nchr2\t229184100\t229185000\t0.169\t34\nchr2\t230197200\t230197500\t0.3837\t51\nchr2\t230310600\t230310900\t0.4551\t92\nchr2\t230337900\t230341500\t0.0889\t90\nchr2\t230400900\t230401200\t0.2839\t68\nchr2\t230460600\t230460900\t0\t31\nchr2\t231005100\t231005700\t0.4855\t171\nchr2\t231579000\t231579300\t0.3682\t13\nchr2\t231823200\t231825000\t0\t89\nchr2\t231826200\t231828900\t0\t89\nchr2\t231837600\t231840000\t0.0178\t62\nchr2\t231842400\t231846600\t0.0148\t124\nchr2\t231847800\t231848100\t0.4749\t60\nchr2\t232149300\t232155000\t0\t94\nchr2\t232176900\t232181100\t0\t113\nchr2\t232357200\t232357500\t0.5152\t75\nchr2\t232359000\t232360800\t0.1151\t131\nchr2\t232380900\t232381200\t0.5204\t64\nchr2\t232408800\t232409100\t0.3861\t47\nchr2\t232427100\t232427400\t0.4416\t72\nchr2\t232449300\t232449600\t0.4765\t44\nchr2\t232730700\t232731000\t0.3739\t40\nchr2\t232905900\t232906200\t0.6883\t35\nchr2\t232995000\t232995600\t0.3673\t53\nchr2\t233186700\t233187000\t0.6888\t68\nchr2\t233561400\t233562600\t0.2367\t88\nchr2\t233567400\t233568000\t0.1087\t20\nchr2\t233578200\t233580300\t0.1051\t72\nchr2\t233581500\t233581800\t0.1051\t72\nchr2\t233723700\t233724300\t0.0921\t73\nchr2\t234562500\t234563100\t0.0889\t25\nchr2\t234645600\t234649500\t0\t90\nchr2\t234888600\t234894300\t0.102\t93\nchr2\t235043400\t235043700\t0.0714\t66\nchr2\t235186200\t235186500\t0.663\t30\nchr2\t235525500\t235526100\t0.3608\t75\nchr2\t235764900\t235765200\t0.3449\t18\nchr2\t236379300\t236379900\t0.2668\t59\nchr2\t236384700\t236387100\t0.0089\t117\nchr2\t236388300\t236388900\t0.0089\t117\nchr2\t236409900\t236412000\t0.1252\t113\nchr2\t236437200\t236439300\t0.1705\t76\nchr2\t236481600\t236482200\t0.2852\t54\nchr2\t236868300\t236868600\t0.46\t42\nchr2\t237030900\t237031200\t0.6904\t45\nchr2\t237187800\t237189300\t0.1643\t87\nchr2\t237343500\t237343800\t0.2692\t107\nchr2\t237464700\t237465000\t0.6231\t68\nchr2\t237522000\t237522300\t0.6197\t61\nchr2\t237547200\t237547800\t0.5821\t57\nchr2\t238110000\t238110600\t0.4575\t209\nchr2\t238296000\t238296600\t0.0098\t87\nchr2\t238397700\t238398000\t0.4719\t33\nchr2\t238417800\t238418400\t0.2669\t58\nchr2\t238717500\t238718700\t0.0225\t75\nchr2\t238776600\t238777500\t0.4177\t79\nchr2\t238870200\t238871400\t0.6079\t92\nchr2\t238880400\t238881300\t0.0434\t33\nchr2\t239068800\t239069700\t0.1973\t42\nchr2\t239085900\t239086200\t0.5581\t55\nchr2\t239218500\t239218800\t0.3004\t84\nchr2\t239527500\t239528100\t0.0013\t60\nchr2\t239644500\t239645100\t0.0069\t310\nchr2\t239658900\t239659200\t0.5216\t12\nchr2\t239665500\t239665800\t0.6641\t48\nchr2\t239755200\t239755800\t0.5699\t70\nchr2\t239816100\t239818200\t0.4569\t151\nchr2\t240019500\t240019800\t0.316\t15\nchr2\t240042000\t240042300\t0.6591\t25\nchr2\t240045600\t240045900\t0.3586\t46\nchr2\t240158100\t240158700\t0.5252\t68\nchr2\t240354600\t240354900\t0.0168\t38\nchr2\t240547200\t240549300\t0.0457\t120\nchr2\t240625800\t240626400\t0.4806\t168\nchr2\t240641400\t240641700\t0.0572\t24\nchr2\t240675000\t240685200\t0\t82\nchr2\t240689100\t240699900\t0\t87\nchr2\t240780900\t240781500\t0.3831\t26\nchr2\t240842700\t240843000\t0.4028\t18\nchr2\t240907800\t240909300\t0\t54\nchr2\t240923700\t240924000\t0.1092\t14\nchr2\t240976200\t240981000\t0.0352\t76\nchr2\t240984900\t240985500\t0.4793\t21\nchr2\t241161000\t241161300\t0.6858\t59\nchr2\t241205700\t241206900\t0.1216\t31\nchr2\t241355700\t241356000\t0.2945\t47\nchr2\t241457400\t241457700\t0.5979\t60\nchr2\t241561500\t241561800\t0.2368\t50\nchr2\t241570500\t241571100\t0.2685\t99\nchr2\t241572900\t241573200\t0.6269\t36\nchr2\t241590000\t241591200\t0.5971\t309\nchr2\t241760100\t241760400\t0.2034\t79\nchr2\t241767000\t241767300\t0\t15\nchr2\t241805400\t241805700\t0.126\t16\nchr2\t241807500\t241808100\t0.2089\t46\nchr2\t241819500\t241820100\t0.324\t142\nchr2\t241846800\t241848300\t0.5522\t123\nchr2\t241896600\t241896900\t0.5449\t85\nchr2\t242006700\t242010600\t0.0172\t172\nchr2\t242046900\t242047500\t0.0511\t73\nchr2\t242079300\t242079600\t0.1833\t67\nchr2\t242083200\t242085300\t0.2756\t75\nchr2\t242110500\t242111100\t0.2727\t74\nchr2\t242114400\t242117700\t0.1256\t93\nchr2\t242123100\t242124300\t0.398\t69\nchr2\t242127000\t242142900\t0.0056\t78\nchr2\t242145900\t242146200\t0\t80\nchr2\t242148000\t242157300\t0\t80\nchr2\t242158800\t242170800\t0\t204\nchr2\t242172000\t242183700\t0\t204\nchr20\t60000\t67500\t0.1475\t1203\nchr20\t130200\t135600\t0\t93\nchr20\t160500\t162600\t0.1176\t66\nchr20\t1114500\t1115400\t0.1014\t63\nchr20\t1258800\t1260000\t0.2048\t73\nchr20\t1301700\t1302600\t0\t149\nchr20\t1573200\t1575900\t0.0098\t66\nchr20\t1606200\t1609200\t0.0055\t54\nchr20\t1742400\t1744800\t0.0011\t77\nchr20\t2442900\t2443800\t0.2378\t73\nchr20\t2822700\t2825700\t0.0083\t65\nchr20\t2883300\t2883600\t0.3772\t37\nchr20\t2910000\t2910600\t0.3374\t30\nchr20\t3057300\t3057600\t0.3439\t21\nchr20\t3477000\t3477600\t0.2756\t55\nchr20\t3497100\t3497400\t0.4123\t54\nchr20\t3498900\t3499500\t0.1616\t59\nchr20\t3517500\t3517800\t0.5203\t50\nchr20\t3793800\t3794100\t0.3956\t48\nchr20\t4032600\t4035600\t0.0203\t53\nchr20\t4286700\t4287300\t0.2443\t77\nchr20\t4386600\t4389600\t0.0464\t86\nchr20\t5027100\t5028300\t0.2251\t71\nchr20\t5277300\t5279100\t0.2088\t91\nchr20\t5380200\t5381400\t0.1342\t56\nchr20\t5418900\t5419500\t0.2303\t66\nchr20\t5453100\t5453400\t0.4669\t32\nchr20\t5503500\t5503800\t0.5698\t52\nchr20\t5849700\t5850000\t0.4346\t55\nchr20\t6170400\t6170700\t0.5877\t27\nchr20\t6189600\t6189900\t0.015\t79\nchr20\t6191100\t6192000\t0.015\t79\nchr20\t6316200\t6319200\t0.0535\t98\nchr20\t6320700\t6321600\t0.0535\t98\nchr20\t6720900\t6721200\t0.4772\t57\nchr20\t7116300\t7122000\t0\t81\nchr20\t7124700\t7125300\t0.0302\t47\nchr20\t7293600\t7293900\t0.5229\t24\nchr20\t7299300\t7299600\t0.2919\t52\nchr20\t7717500\t7717800\t0.4975\t41\nchr20\t8112000\t8112600\t0.0432\t76\nchr20\t8465700\t8466000\t0.5539\t68\nchr20\t8486400\t8486700\t0.3566\t47\nchr20\t8595300\t8600700\t0\t105\nchr20\t9015600\t9015900\t0.3939\t30\nchr20\t9188400\t9189600\t0.3496\t117\nchr20\t9199800\t9200100\t0.3806\t33\nchr20\t9858600\t9861600\t0\t75\nchr20\t10807500\t10808700\t0.3624\t71\nchr20\t11632800\t11638800\t0\t75\nchr20\t12123900\t12126900\t0.2179\t91\nchr20\t12362100\t12362400\t0.2709\t73\nchr20\t12444600\t12444900\t0.5076\t70\nchr20\t12487200\t12487500\t0.3725\t61\nchr20\t12558600\t12558900\t0.5222\t30\nchr20\t12587400\t12587700\t0.3507\t89\nchr20\t12633900\t12635700\t0.1229\t68\nchr20\t12663600\t12664800\t0.3062\t100\nchr20\t12667500\t12667800\t0.3062\t100\nchr20\t12755100\t12755700\t0.143\t21\nchr20\t12756900\t12757200\t0.2769\t27\nchr20\t12801000\t12807000\t0\t74\nchr20\t13360200\t13360500\t0.4726\t90\nchr20\t14273400\t14273700\t0.3044\t71\nchr20\t14579100\t14579400\t0.4437\t46\nchr20\t15000300\t15000600\t0.387\t53\nchr20\t15135300\t15136200\t0.2358\t56\nchr20\t15234000\t15234300\t0.384\t33\nchr20\t15810300\t15810600\t0.4596\t62\nchr20\t16226400\t16228200\t0.0111\t47\nchr20\t16260000\t16260300\t0.228\t61\nchr20\t16549500\t16550400\t0.1687\t72\nchr20\t16993500\t16994400\t0.1203\t78\nchr20\t17032500\t17032800\t0.3598\t25\nchr20\t17122800\t17123100\t0.0173\t20\nchr20\t18009600\t18009900\t0.3117\t64\nchr20\t18071700\t18072000\t0.347\t40\nchr20\t18195000\t18195300\t0.5157\t79\nchr20\t18499500\t18499800\t0.5054\t36\nchr20\t18601800\t18606000\t0\t86\nchr20\t18861600\t18861900\t0.5809\t80\nchr20\t18950100\t18954300\t0.0032\t87\nchr20\t19080900\t19081200\t0.4178\t30\nchr20\t19087800\t19089300\t0.0176\t72\nchr20\t19118700\t19119000\t0.189\t41\nchr20\t19262100\t19262400\t0.538\t61\nchr20\t19419900\t19421400\t0.0159\t68\nchr20\t19677900\t19678200\t0.5132\t39\nchr20\t19755300\t19755600\t0.0534\t47\nchr20\t19924200\t19924500\t0.535\t25\nchr20\t20314800\t20315100\t0.4287\t29\nchr20\t20346000\t20346300\t0.4478\t27\nchr20\t20356500\t20358000\t0.362\t67\nchr20\t21254100\t21254400\t0.3222\t55\nchr20\t21747300\t21747600\t0.0899\t87\nchr20\t21888600\t21889500\t0.1903\t72\nchr20\t21891000\t21893400\t0.0414\t91\nchr20\t21910800\t21912000\t0.0503\t98\nchr20\t21915000\t21915300\t0.27\t74\nchr20\t21929100\t21929400\t0.5199\t54\nchr20\t21932400\t21932700\t0.2969\t69\nchr20\t22083000\t22083300\t0.6769\t13\nchr20\t22674600\t22674900\t0.6004\t66\nchr20\t23262600\t23263500\t0.0284\t62\nchr20\t23426100\t23432100\t0\t107\nchr20\t23478300\t23478600\t0.3778\t73\nchr20\t23589600\t23595000\t0\t106\nchr20\t23715600\t23715900\t0.412\t42\nchr20\t24408300\t24408900\t0.5011\t57\nchr20\t24552900\t24553200\t0.4376\t57\nchr20\t24625500\t24625800\t0.5123\t90\nchr20\t25313100\t25313400\t0.5154\t204\nchr20\t25332000\t25335900\t0\t79\nchr20\t25562100\t25562700\t0.2475\t63\nchr20\t25602600\t25602900\t0.5307\t37\nchr20\t25716300\t25716900\t0.3748\t42\nchr20\t25753500\t25754700\t0.26\t74\nchr20\t25765500\t25772400\t0\t139\nchr20\t25778400\t25778700\t0.1196\t52\nchr20\t25779900\t25847100\t0\t104\nchr20\t25930200\t25930500\t0.6435\t103\nchr20\t26010900\t26077500\t0\t118\nchr20\t26079300\t26079900\t0.6078\t143\nchr20\t26084100\t26091600\t0\t131\nchr20\t26093100\t26093400\t0.6296\t74\nchr20\t26101500\t26102100\t0.4504\t56\nchr20\t26238900\t26239200\t0.4258\t61\nchr20\t26246700\t26247000\t0.1387\t73\nchr20\t26282100\t26282400\t0.6292\t94\nchr20\t26303700\t26304600\t0.3101\t62\nchr20\t26310300\t26311200\t0\t70\nchr20\t26313900\t26314500\t0.0244\t79\nchr20\t26336400\t26336700\t0.6879\t120\nchr20\t26339700\t26342400\t0.2631\t281\nchr20\t26366700\t26367000\t0.0993\t41\nchr20\t26384700\t26386200\t0.4312\t27\nchr20\t26436300\t26481000\t0\t929\nchr20\t26482200\t26514300\t0\t982\nchr20\t26516100\t26544000\t0\t982\nchr20\t26545500\t26556300\t0\t317\nchr20\t26557500\t26577000\t0\t449\nchr20\t26578200\t26584500\t0\t449\nchr20\t26585700\t26590500\t0\t449\nchr20\t26598300\t28196100\t0\t2005\nchr20\t28197300\t28499400\t0\t2005\nchr20\t28504800\t28557000\t0\t481\nchr20\t28567500\t28569300\t0.2977\t126\nchr20\t28574700\t28576800\t0.4431\t102\nchr20\t28581600\t28582200\t0.6509\t131\nchr20\t28584300\t28584900\t0.5878\t124\nchr20\t28596000\t28596300\t0.2275\t98\nchr20\t28599900\t28600200\t0.5542\t124\nchr20\t28604700\t28605300\t0.062\t75\nchr20\t28625700\t28626600\t0.3326\t64\nchr20\t28635900\t28637400\t0.0164\t99\nchr20\t28640400\t28640700\t0.4072\t118\nchr20\t28643700\t28646700\t0\t311\nchr20\t28648500\t28694700\t0\t133\nchr20\t28696200\t28717800\t0\t133\nchr20\t28719300\t28728900\t0\t133\nchr20\t28732200\t28732500\t0.6703\t322\nchr20\t28745400\t28746600\t0.5514\t529\nchr20\t28748100\t28749600\t0.5256\t406\nchr20\t28776900\t28778700\t0.1606\t84\nchr20\t28783500\t28783800\t0.6614\t115\nchr20\t28794300\t28794600\t0.6041\t110\nchr20\t28802700\t28803000\t0.5563\t137\nchr20\t28834800\t28835400\t0.563\t115\nchr20\t28840800\t28841400\t0.6457\t553\nchr20\t28842600\t28843500\t0\t224\nchr20\t28861500\t28861800\t0.4962\t162\nchr20\t28865400\t28866000\t0.5847\t109\nchr20\t28888200\t28890600\t0.4142\t1218\nchr20\t28897200\t28899000\t0.1563\t1809\nchr20\t28900800\t28901100\t0.6968\t270\nchr20\t28940100\t28940700\t0.0386\t141\nchr20\t28957800\t28958100\t0.6827\t115\nchr20\t28959300\t29013900\t0\t125\nchr20\t29028300\t29028600\t0.3824\t90\nchr20\t29031600\t29031900\t0.5586\t180\nchr20\t29057400\t29057700\t0.4889\t173\nchr20\t29058900\t29059200\t0.6303\t236\nchr20\t29066100\t29066400\t0.6735\t110\nchr20\t29067900\t29071800\t0.04\t302\nchr20\t29074800\t29075400\t0.5923\t249\nchr20\t29077500\t29077800\t0.5178\t147\nchr20\t29080800\t29081400\t0.0396\t202\nchr20\t29082600\t29083200\t0.2565\t224\nchr20\t29088900\t29089200\t0.5832\t77\nchr20\t29098200\t29098500\t0.4858\t118\nchr20\t29106300\t29106600\t0.5733\t153\nchr20\t29128800\t29131500\t0\t73\nchr20\t29133600\t29134500\t0\t31\nchr20\t29136000\t29138100\t0\t57\nchr20\t29139300\t29139900\t0.0744\t49\nchr20\t29143500\t29143800\t0\t32\nchr20\t29145000\t29145600\t0\t44\nchr20\t29147100\t29150400\t0.0473\t43\nchr20\t29153100\t29158800\t0\t40\nchr20\t29161200\t29162100\t0.2563\t18\nchr20\t29163300\t29168100\t0\t57\nchr20\t29170200\t29171400\t0.0748\t69\nchr20\t29173500\t29174100\t0.1824\t15\nchr20\t29175300\t29179200\t0\t42\nchr20\t29181300\t29181600\t0.4431\t27\nchr20\t29183700\t29185200\t0\t40\nchr20\t29187900\t29190300\t0\t41\nchr20\t29192400\t29196900\t0\t56\nchr20\t29198100\t29202600\t0\t79\nchr20\t29203800\t29204400\t0\t79\nchr20\t29207400\t29207700\t0.4687\t161\nchr20\t29208900\t29209200\t0.5876\t63\nchr20\t29211900\t29212200\t0.5204\t88\nchr20\t29214900\t29215500\t0.6323\t145\nchr20\t29218800\t29219100\t0.5177\t206\nchr20\t29222700\t29223000\t0.6904\t142\nchr20\t29228400\t29228700\t0.6119\t57\nchr20\t29253000\t29253300\t0.28\t38\nchr20\t29258100\t29259000\t0.5428\t88\nchr20\t29261700\t29262000\t0.2134\t539\nchr20\t29337000\t29337300\t0.6393\t108\nchr20\t29348100\t29348400\t0.602\t141\nchr20\t29351100\t29351400\t0.6745\t83\nchr20\t29352600\t29352900\t0.6715\t53\nchr20\t29356200\t29356800\t0.4222\t71\nchr20\t29389500\t29390100\t0.598\t145\nchr20\t29402100\t29402400\t0.6891\t26\nchr20\t29411100\t29411700\t0.6563\t650\nchr20\t29451300\t29451900\t0.2251\t36\nchr20\t29457300\t29458500\t0.6259\t64\nchr20\t29475300\t29475600\t0.6331\t59\nchr20\t29478900\t29480100\t0.6695\t122\nchr20\t29481300\t29481600\t0.581\t75\nchr20\t29483100\t29484600\t0.1427\t124\nchr20\t29485800\t29486400\t0.6408\t63\nchr20\t29493300\t29494800\t0.1119\t187\nchr20\t29496300\t29497200\t0.3857\t306\nchr20\t29499300\t29500200\t0.5032\t198\nchr20\t29502000\t29504400\t0.5244\t138\nchr20\t29505900\t29508300\t0.0315\t180\nchr20\t29509800\t29510100\t0.6361\t49\nchr20\t29511300\t29511600\t0.6991\t158\nchr20\t29521200\t29523000\t0.4926\t144\nchr20\t29535000\t29535300\t0.5836\t68\nchr20\t29547300\t29547600\t0.3632\t34\nchr20\t29584800\t29586000\t0.011\t50\nchr20\t29637300\t29637600\t0.3632\t72\nchr20\t29694600\t29695500\t0.6716\t197\nchr20\t29697600\t29697900\t0.5785\t194\nchr20\t29702400\t29702700\t0.5744\t690\nchr20\t29704500\t29705100\t0.4856\t60\nchr20\t29709000\t29709300\t0.6637\t138\nchr20\t29712300\t29712600\t0.5497\t127\nchr20\t29714700\t29715300\t0.6718\t154\nchr20\t29719500\t29719800\t0.6979\t102\nchr20\t29722500\t29722800\t0.6635\t115\nchr20\t29799600\t29799900\t0.6918\t73\nchr20\t29810400\t29810700\t0.5505\t331\nchr20\t29828100\t29828400\t0.639\t248\nchr20\t29838300\t29838600\t0.6494\t102\nchr20\t29844900\t29845200\t0.6067\t128\nchr20\t29847900\t29848200\t0.5912\t50\nchr20\t29849400\t29850600\t0.662\t133\nchr20\t29859000\t29859300\t0.5797\t256\nchr20\t29863500\t29863800\t0.6227\t139\nchr20\t29870700\t29871000\t0.6523\t242\nchr20\t29879400\t29880300\t0.6284\t384\nchr20\t29881500\t29881800\t0.6284\t384\nchr20\t29883900\t29885400\t0.0318\t165\nchr20\t29889600\t29889900\t0.585\t102\nchr20\t29895600\t29896200\t0.5362\t100\nchr20\t29901600\t29901900\t0.2431\t47\nchr20\t29903100\t29903700\t0.5751\t75\nchr20\t29904900\t29905200\t0.4586\t155\nchr20\t29908200\t29908500\t0.6897\t78\nchr20\t29909700\t29910600\t0\t24\nchr20\t29913600\t29914500\t0\t219\nchr20\t29915700\t29920800\t0\t219\nchr20\t29922000\t29923800\t0\t219\nchr20\t29925000\t29934300\t0\t219\nchr20\t29937000\t29941200\t0\t94\nchr20\t29942700\t29943000\t0.6391\t121\nchr20\t29944800\t29945100\t0.4065\t20\nchr20\t29947200\t29948100\t0\t88\nchr20\t29949600\t29952000\t0\t88\nchr20\t29953500\t29955600\t0\t96\nchr20\t29957100\t29958000\t0\t61\nchr20\t29960100\t29964900\t0\t75\nchr20\t29966700\t29975100\t0\t41\nchr20\t29976300\t29976900\t0\t41\nchr20\t29979900\t29983500\t0\t117\nchr20\t29985300\t29986500\t0\t77\nchr20\t29987700\t29990400\t0\t77\nchr20\t29991600\t30001500\t0\t77\nchr20\t30003900\t30006900\t0\t77\nchr20\t30008100\t30016200\t0\t77\nchr20\t30018900\t30024000\t0\t125\nchr20\t30025500\t30026400\t0\t53\nchr20\t30027600\t30029400\t0\t61\nchr20\t30030900\t30033000\t0\t61\nchr20\t30034500\t30037500\t0.0304\t39\nchr20\t30088500\t30098400\t0\t73\nchr20\t30102000\t30125100\t0\t111\nchr20\t30127200\t30127800\t0.0044\t50\nchr20\t30129300\t30129900\t0\t15\nchr20\t30131100\t30137700\t0\t68\nchr20\t30147600\t30147900\t0.5563\t67\nchr20\t30149400\t30150000\t0.61\t81\nchr20\t30151800\t30153900\t0.5297\t214\nchr20\t30157800\t30159600\t0.4586\t87\nchr20\t30163500\t30163800\t0.6416\t45\nchr20\t30166800\t30167100\t0.5156\t62\nchr20\t30200700\t30201000\t0.4775\t51\nchr20\t30215700\t30216000\t0.5957\t86\nchr20\t30227700\t30228900\t0.4217\t33\nchr20\t30237900\t30238800\t0.0117\t60\nchr20\t30271200\t30272400\t0.0126\t60\nchr20\t30283800\t30284100\t0.6512\t587\nchr20\t30299700\t30300000\t0.4514\t84\nchr20\t30353700\t30354000\t0.6472\t173\nchr20\t30356400\t30356700\t0.4559\t120\nchr20\t30357900\t30358200\t0.6701\t68\nchr20\t30375000\t30375300\t0.4615\t133\nchr20\t30379200\t30379500\t0.597\t102\nchr20\t30392700\t30393000\t0.5519\t195\nchr20\t30394800\t30395400\t0.2229\t105\nchr20\t30403500\t30403800\t0.6799\t151\nchr20\t30414900\t30415200\t0.3633\t80\nchr20\t30418500\t30418800\t0.6791\t176\nchr20\t30420300\t30420600\t0.632\t165\nchr20\t30423300\t30423600\t0.6404\t260\nchr20\t30503100\t30503400\t0.6736\t80\nchr20\t30575400\t30575700\t0.3487\t57\nchr20\t30756600\t30756900\t0.2173\t117\nchr20\t30841200\t30842700\t0.189\t291\nchr20\t30849300\t30850800\t0.61\t157\nchr20\t30866700\t30867300\t0.607\t239\nchr20\t30869700\t30870300\t0.3016\t94\nchr20\t30879600\t30880200\t0.6506\t129\nchr20\t30881700\t30882000\t0.6506\t129\nchr20\t30936600\t30936900\t0.44\t110\nchr20\t30959400\t30959700\t0.643\t99\nchr20\t30963900\t30964200\t0.6723\t95\nchr20\t30975300\t30975600\t0.2725\t62\nchr20\t30977400\t30977700\t0.6376\t189\nchr20\t30981000\t30981300\t0.6595\t168\nchr20\t30986100\t30986700\t0.4498\t65\nchr20\t30994800\t30998700\t0.6019\t421\nchr20\t31000500\t31001100\t0.6273\t431\nchr20\t31051500\t31107000\t0\t8016\nchr20\t31156800\t31159200\t0.1848\t4493\nchr20\t31162200\t31178700\t0.1794\t2365\nchr20\t31179900\t31238100\t0\t5715\nchr20\t31239300\t31245300\t0.1216\t23471\nchr20\t31336200\t31336500\t0.3037\t75\nchr20\t31426500\t31426800\t0.5321\t80\nchr20\t31471200\t31471500\t0.619\t89\nchr20\t32175300\t32177400\t0.0556\t122\nchr20\t32723400\t32724900\t0\t70\nchr20\t32926500\t32927100\t0.3177\t45\nchr20\t33456000\t33456300\t0.0085\t30\nchr20\t33699600\t33699900\t0.2503\t18\nchr20\t34223400\t34225200\t0.0376\t76\nchr20\t34227900\t34231500\t0\t110\nchr20\t34527900\t34528500\t0.5886\t46\nchr20\t34659000\t34659300\t0.5628\t68\nchr20\t35153100\t35154900\t0.2117\t80\nchr20\t35262600\t35262900\t0.2396\t87\nchr20\t36000900\t36001200\t0.4431\t51\nchr20\t36327600\t36327900\t0.4426\t40\nchr20\t36690300\t36690900\t0.3049\t56\nchr20\t36965700\t36966000\t0.4918\t61\nchr20\t36976500\t36976800\t0.6839\t43\nchr20\t36979800\t36981600\t0.0163\t47\nchr20\t37000500\t37001700\t0.5288\t91\nchr20\t38333700\t38334000\t0.3198\t62\nchr20\t38460900\t38461200\t0.1819\t77\nchr20\t38463900\t38464200\t0.6176\t17\nchr20\t39368700\t39372600\t0.012\t82\nchr20\t39740400\t39742200\t0.0434\t63\nchr20\t39782100\t39782400\t0.4835\t68\nchr20\t39802800\t39806100\t0.3242\t86\nchr20\t39978300\t39979500\t0.0459\t54\nchr20\t40620900\t40625100\t0.0045\t83\nchr20\t40917300\t40917600\t0.406\t24\nchr20\t41128200\t41128500\t0.2845\t55\nchr20\t41554500\t41554800\t0.3635\t52\nchr20\t41971200\t41971800\t0.0099\t83\nchr20\t42207300\t42208200\t0.1111\t73\nchr20\t42211500\t42211800\t0.3403\t83\nchr20\t42515700\t42516000\t0.4309\t71\nchr20\t42615600\t42616800\t0.2763\t59\nchr20\t42618600\t42619800\t0.187\t91\nchr20\t43095900\t43096200\t0.6823\t33\nchr20\t43175700\t43176300\t0.0797\t52\nchr20\t43395900\t43397100\t0\t40\nchr20\t43815000\t43820400\t0.0476\t93\nchr20\t44047500\t44047800\t0.1698\t50\nchr20\t44132700\t44133000\t0.506\t11\nchr20\t45591000\t45591300\t0.6994\t128\nchr20\t45687900\t45689100\t0.4618\t54\nchr20\t45738900\t45739200\t0.5125\t70\nchr20\t46788900\t46789500\t0.6331\t167\nchr20\t47525100\t47525400\t0.2034\t111\nchr20\t47827200\t47827500\t0.331\t73\nchr20\t47828700\t47833200\t0\t94\nchr20\t47834700\t47836200\t0\t72\nchr20\t47837400\t47837700\t0\t72\nchr20\t47893200\t47894700\t0.0127\t78\nchr20\t47898300\t47902500\t0\t74\nchr20\t47903700\t47904000\t0\t74\nchr20\t47978400\t47978700\t0.3658\t55\nchr20\t48368100\t48368400\t0.3548\t74\nchr20\t48494400\t48495000\t0.0547\t84\nchr20\t48504300\t48516000\t0.0857\t223\nchr20\t48590700\t48591000\t0.5817\t67\nchr20\t48870900\t48871800\t0.0116\t26\nchr20\t49617300\t49617900\t0.4836\t123\nchr20\t49921800\t49922100\t0.5454\t61\nchr20\t50209500\t50209800\t0.3926\t361\nchr20\t51455700\t51456000\t0.3754\t52\nchr20\t53163300\t53163600\t0.255\t123\nchr20\t53204100\t53204400\t0.5139\t65\nchr20\t53456400\t53457900\t0.0368\t83\nchr20\t53459400\t53460000\t0.0368\t83\nchr20\t53474400\t53477700\t0.0044\t81\nchr20\t53504400\t53509800\t0.2021\t86\nchr20\t54072900\t54073200\t0.4078\t73\nchr20\t54249600\t54250500\t0\t64\nchr20\t54375300\t54375600\t0.5354\t66\nchr20\t54676200\t54676500\t0.4228\t30\nchr20\t54785100\t54785700\t0.4221\t70\nchr20\t54787800\t54788400\t0.3028\t91\nchr20\t54810900\t54812700\t0.2455\t71\nchr20\t54819000\t54819300\t0.1127\t234\nchr20\t54933900\t54934200\t0.5289\t47\nchr20\t55076100\t55076400\t0.1948\t73\nchr20\t55497600\t55497900\t0.4083\t43\nchr20\t55532100\t55532700\t0.3906\t46\nchr20\t55848900\t55849500\t0.4327\t49\nchr20\t55859700\t55865400\t0\t74\nchr20\t55888200\t55888500\t0.0614\t38\nchr20\t55902000\t55902600\t0.6206\t55\nchr20\t55903800\t55904100\t0.3204\t59\nchr20\t55944900\t55945500\t0.0357\t21\nchr20\t55967100\t55967400\t0.6501\t39\nchr20\t56082300\t56082600\t0.1091\t70\nchr20\t56109000\t56109600\t0.0599\t94\nchr20\t56281500\t56282100\t0.4787\t38\nchr20\t58687500\t58687800\t0.3451\t75\nchr20\t59133000\t59133300\t0.2007\t84\nchr20\t59532900\t59535300\t0.1865\t109\nchr20\t60409200\t60410400\t0\t138\nchr20\t60445200\t60445500\t0.4449\t40\nchr20\t60615900\t60618600\t0.1357\t62\nchr20\t61242900\t61243200\t0.376\t59\nchr20\t61283100\t61283400\t0.2659\t48\nchr20\t61289700\t61290300\t0.143\t87\nchr20\t61350300\t61350600\t0.3743\t41\nchr20\t61641600\t61641900\t0.432\t48\nchr20\t61653000\t61653900\t0.123\t32\nchr20\t61675500\t61675800\t0.2688\t50\nchr20\t61689300\t61689600\t0.3108\t62\nchr20\t61783800\t61784700\t0.1949\t47\nchr20\t61854900\t61855200\t0.6794\t44\nchr20\t61943100\t61944600\t0\t45\nchr20\t61945800\t61948500\t0.228\t121\nchr20\t61951200\t61951500\t0.2769\t21\nchr20\t61971300\t61971600\t0.6937\t58\nchr20\t61978200\t61978500\t0.3357\t50\nchr20\t61986000\t61986300\t0.6374\t38\nchr20\t61995600\t61995900\t0.3613\t33\nchr20\t62057700\t62058900\t0.071\t77\nchr20\t62082900\t62083200\t0.3606\t43\nchr20\t62270700\t62271000\t0.2404\t44\nchr20\t62373600\t62373900\t0.6786\t55\nchr20\t62509200\t62509800\t0.6642\t43\nchr20\t62683800\t62684100\t0.5287\t59\nchr20\t62755500\t62755800\t0.5554\t39\nchr20\t62961000\t62961300\t0.2756\t44\nchr20\t62966100\t62966400\t0.6545\t26\nchr20\t62989800\t62990100\t0.1371\t62\nchr20\t63028800\t63029400\t0.3811\t76\nchr20\t63068400\t63068700\t0.3669\t136\nchr20\t63156900\t63157200\t0.1406\t38\nchr20\t63266700\t63267000\t0.4288\t39\nchr20\t63372300\t63372600\t0.5004\t23\nchr20\t63442800\t63443700\t0.4666\t203\nchr20\t63445800\t63446100\t0.6815\t62\nchr20\t63571200\t63571800\t0.4863\t100\nchr20\t63607200\t63609900\t0.1235\t189\nchr20\t63669600\t63670500\t0\t62\nchr20\t63677700\t63678000\t0.3652\t71\nchr20\t63693300\t63693900\t0.394\t365\nchr20\t63824700\t63825000\t0.3108\t17\nchr20\t63879900\t63880500\t0.5263\t47\nchr20\t63919500\t63920100\t0.3251\t42\nchr20\t63942000\t63942300\t0.371\t20\nchr20\t63965100\t63965400\t0.0594\t48\nchr20\t64011900\t64012800\t0.0031\t84\nchr20\t64087200\t64089000\t0.0152\t286\nchr20\t64090800\t64091400\t0.3819\t50\nchr20\t64118400\t64118700\t0.4217\t22\nchr20\t64127100\t64127400\t0.6451\t23\nchr20\t64131900\t64133700\t0.2071\t77\nchr20\t64135200\t64135500\t0.3438\t60\nchr20\t64173600\t64176300\t0.0083\t99\nchr20\t64178400\t64178700\t0.6032\t97\nchr20\t64270800\t64271400\t0.014\t49\nchr20\t64286700\t64302300\t0\t89\nchr20\t64304100\t64309500\t0.0204\t106\nchr20\t64310700\t64312800\t0.0204\t106\nchr20\t64314600\t64315200\t0.0204\t106\nchr20\t64317000\t64317300\t0.3709\t83\nchr20\t64319100\t64319400\t0.3582\t35\nchr20\t64321500\t64322100\t0.2459\t64\nchr20\t64325700\t64327200\t0.0698\t44\nchr21\t5010000\t5033100\t0\t50\nchr21\t5034600\t5037900\t0\t51\nchr21\t5039400\t5062500\t0\t51\nchr21\t5067300\t5070900\t0.0802\t59\nchr21\t5072100\t5097300\t0\t49\nchr21\t5098800\t5102700\t0\t66\nchr21\t5104800\t5110500\t0\t66\nchr21\t5111700\t5112000\t0.0296\t46\nchr21\t5113200\t5113500\t0.0296\t46\nchr21\t5114700\t5115000\t0.0296\t46\nchr21\t5116500\t5117400\t0\t57\nchr21\t5118600\t5142300\t0\t57\nchr21\t5143500\t5166300\t0\t48\nchr21\t5231700\t5232000\t0.6057\t181\nchr21\t5255100\t5264100\t0\t130\nchr21\t5265300\t5289600\t0\t130\nchr21\t5298300\t5312100\t0.0043\t195\nchr21\t5313600\t5349300\t0\t690\nchr21\t5350800\t5357400\t0\t690\nchr21\t5359500\t5371500\t0\t690\nchr21\t5375100\t5390400\t0.0132\t233\nchr21\t5391600\t5393400\t0.1974\t128\nchr21\t5443500\t5448900\t0\t72\nchr21\t5499000\t5506800\t0\t51\nchr21\t5508000\t5627700\t0\t79\nchr21\t5677500\t5796000\t0\t93\nchr21\t5846100\t5916600\t0\t84\nchr21\t5966700\t5985300\t0\t42\nchr21\t5988000\t6097500\t0\t53\nchr21\t6099600\t6161400\t0\t47\nchr21\t6211500\t6312600\t0\t86\nchr21\t6314100\t6375900\t0\t216\nchr21\t6429000\t6429300\t0.3473\t39\nchr21\t6431100\t6431400\t0.1337\t31\nchr21\t6434400\t6437700\t0.2077\t42\nchr21\t6439200\t6580200\t0\t152\nchr21\t6630300\t6675000\t0\t122\nchr21\t6676500\t6738900\t0\t122\nchr21\t6789600\t6915600\t0\t77\nchr21\t6917400\t6932400\t0\t55\nchr21\t6933600\t6934200\t0\t55\nchr21\t6984300\t7149600\t0\t89\nchr21\t7199700\t7228500\t0\t185\nchr21\t7229700\t7232100\t0.1106\t270\nchr21\t7233300\t7239600\t0.1106\t270\nchr21\t7241400\t7245900\t0.0614\t430\nchr21\t7248000\t7248600\t0.0039\t606\nchr21\t7249800\t7254900\t0.0039\t606\nchr21\t7257300\t7262400\t0.029\t2269\nchr21\t7263900\t7266000\t0.029\t2269\nchr21\t7268700\t7271700\t0\t157\nchr21\t7274400\t7281000\t0\t157\nchr21\t7283100\t7286100\t0.113\t160\nchr21\t7287600\t7289100\t0.0003\t315\nchr21\t7292400\t7297200\t0.0043\t245\nchr21\t7298700\t7303200\t0.0043\t245\nchr21\t7304700\t7307100\t0.0043\t245\nchr21\t7308600\t7312500\t0.0043\t245\nchr21\t7313700\t7320900\t0.0043\t245\nchr21\t7322400\t7323900\t0.0043\t245\nchr21\t7377900\t7383900\t0\t44\nchr21\t7385100\t7500900\t0\t79\nchr21\t7551000\t7693800\t0\t91\nchr21\t7743900\t7865700\t0\t64\nchr21\t7917900\t7918200\t0.5906\t455\nchr21\t7926000\t7930200\t0.2991\t1485\nchr21\t7938000\t7938600\t0.2479\t2314\nchr21\t7942200\t7942800\t0.3584\t578\nchr21\t7944000\t7944900\t0.2277\t1733\nchr21\t7948500\t7951500\t0.4122\t646\nchr21\t7954800\t7957800\t0.3721\t1085\nchr21\t7970700\t7975800\t0.0106\t351\nchr21\t7977300\t8022900\t0\t314\nchr21\t8024100\t8044800\t0\t385\nchr21\t8046000\t8047500\t0\t184\nchr21\t8100000\t8261100\t0\t6167\nchr21\t8310900\t8472600\t0\t9156\nchr21\t8523000\t8526900\t0.0223\t54\nchr21\t8528100\t8530200\t0.2226\t55\nchr21\t8532900\t8544900\t0\t77\nchr21\t8546100\t8548800\t0\t77\nchr21\t8550000\t8553900\t0\t101\nchr21\t8555100\t8620800\t0\t101\nchr21\t8622600\t8624400\t0\t101\nchr21\t8625600\t8635200\t0\t101\nchr21\t8637000\t8638200\t0\t101\nchr21\t8639400\t8651100\t0\t53\nchr21\t8652600\t8653800\t0\t53\nchr21\t8655600\t8661900\t0\t58\nchr21\t8663700\t8664000\t0\t110\nchr21\t8665500\t8684100\t0\t110\nchr21\t8685300\t8685600\t0.5343\t50\nchr21\t8687700\t8688000\t0.6395\t40\nchr21\t8690700\t8691300\t0.0117\t70\nchr21\t8694900\t8695200\t0.5034\t60\nchr21\t8698200\t8698500\t0.3311\t91\nchr21\t8700600\t8701200\t0.3311\t91\nchr21\t8703900\t8706600\t0.255\t86\nchr21\t8776200\t8776500\t0.4269\t129\nchr21\t8779500\t8779800\t0.6901\t152\nchr21\t8781000\t8781300\t0.3726\t148\nchr21\t8782500\t8784300\t0.3726\t148\nchr21\t8785800\t8786700\t0.4972\t163\nchr21\t8790000\t8833800\t0\t298\nchr21\t8835000\t8838000\t0\t298\nchr21\t8840100\t8843100\t0\t298\nchr21\t8844900\t8886600\t0\t298\nchr21\t8986500\t8988900\t0\t2094\nchr21\t9016200\t9017100\t0.0116\t166\nchr21\t9019500\t9020100\t0.5673\t127\nchr21\t9030600\t9031200\t0.1509\t230\nchr21\t9032700\t9036600\t0.3347\t239\nchr21\t9038700\t9039300\t0.1046\t34\nchr21\t9040500\t9072000\t0\t137\nchr21\t9073200\t9074400\t0\t75\nchr21\t9075600\t9083400\t0\t75\nchr21\t9085200\t9085800\t0.4513\t18\nchr21\t9089400\t9103200\t0\t126\nchr21\t9104700\t9105000\t0\t126\nchr21\t9106800\t9116700\t0\t126\nchr21\t9117900\t9118800\t0.0518\t110\nchr21\t9120300\t9195900\t0\t181\nchr21\t9246000\t9377100\t0\t2350\nchr21\t9527100\t9571200\t0\t205\nchr21\t9572400\t9610500\t0\t205\nchr21\t9611700\t9614100\t0.012\t115\nchr21\t9615300\t9615900\t0.0186\t111\nchr21\t9617100\t9619500\t0.0186\t111\nchr21\t9620700\t9626100\t0.0186\t111\nchr21\t9627600\t9629400\t0.0027\t88\nchr21\t9631500\t9631800\t0.0044\t140\nchr21\t9633000\t9636600\t0.0044\t140\nchr21\t9637800\t9646800\t0\t146\nchr21\t9659100\t9710700\t0\t141\nchr21\t9711900\t9720300\t0\t141\nchr21\t9734700\t9735300\t0.1943\t143\nchr21\t9797700\t9804900\t0\t2099\nchr21\t9806100\t9837300\t0\t2099\nchr21\t9849000\t9849300\t0.3908\t190\nchr21\t9855000\t9855300\t0.6077\t148\nchr21\t9863400\t9863700\t0.4236\t94\nchr21\t9880500\t9880800\t0.3304\t152\nchr21\t9895500\t9896100\t0.4165\t128\nchr21\t9906600\t9906900\t0.2537\t146\nchr21\t9998100\t9998400\t0.378\t75\nchr21\t10015500\t10015800\t0.5128\t87\nchr21\t10030500\t10032600\t0\t105\nchr21\t10034700\t10041900\t0\t105\nchr21\t10043400\t10046400\t0\t105\nchr21\t10048500\t10055700\t0\t117\nchr21\t10056900\t10079100\t0\t117\nchr21\t10080600\t10086000\t0\t103\nchr21\t10087800\t10090200\t0.0043\t101\nchr21\t10091400\t10092900\t0.0043\t101\nchr21\t10094100\t10096200\t0\t118\nchr21\t10098000\t10104900\t0.0013\t136\nchr21\t10107000\t10111500\t0.0016\t135\nchr21\t10113000\t10118700\t0.0016\t135\nchr21\t10120800\t10121100\t0\t162\nchr21\t10122300\t10122600\t0\t162\nchr21\t10124400\t10169700\t0\t162\nchr21\t10269600\t10274400\t0.1199\t15121\nchr21\t10324200\t10326300\t0.275\t16528\nchr21\t10335300\t10336800\t0.3088\t181\nchr21\t10344000\t10344300\t0.4792\t213\nchr21\t10363800\t10374000\t0\t391\nchr21\t10391100\t10393200\t0.1636\t394\nchr21\t10395300\t10395600\t0.2973\t353\nchr21\t10397100\t10397400\t0.2973\t353\nchr21\t10398600\t10400400\t0.4674\t388\nchr21\t10406100\t10406400\t0.6264\t167\nchr21\t10407600\t10407900\t0.6519\t158\nchr21\t10410000\t10410300\t0.4767\t218\nchr21\t10426500\t10427100\t0.5719\t449\nchr21\t10434900\t10435500\t0.1238\t263\nchr21\t10441500\t10441800\t0.1166\t120\nchr21\t10443600\t10443900\t0.643\t138\nchr21\t10446600\t10446900\t0.5843\t243\nchr21\t10467900\t10468200\t0.4757\t142\nchr21\t10470600\t10470900\t0.6011\t217\nchr21\t10472700\t10473000\t0.5435\t253\nchr21\t10477500\t10477800\t0.2028\t145\nchr21\t10479000\t10479900\t0.0833\t153\nchr21\t10487100\t10488000\t0.198\t126\nchr21\t10491600\t10501500\t0\t207\nchr21\t10502700\t10510200\t0\t207\nchr21\t10651800\t10652700\t0.1186\t6680\nchr21\t10653900\t10656900\t0.1186\t6680\nchr21\t10658400\t10661100\t0.2461\t1950\nchr21\t10662300\t10662600\t0.2461\t1950\nchr21\t10664100\t10677000\t0.2317\t3467\nchr21\t10678200\t10681500\t0.3128\t574\nchr21\t10683300\t10683600\t0.6083\t320\nchr21\t10684800\t10688700\t0.3774\t514\nchr21\t10691400\t10694400\t0.1738\t30778\nchr21\t10696200\t10698600\t0.4679\t374\nchr21\t10700400\t10719900\t0.1717\t2181\nchr21\t10722000\t10733400\t0.2272\t1201\nchr21\t10734600\t10738200\t0.2272\t1201\nchr21\t10743600\t10743900\t0.559\t123\nchr21\t10782600\t10782900\t0.6587\t238\nchr21\t12980700\t12981600\t0.6481\t248\nchr21\t12984300\t12984600\t0.6235\t395\nchr21\t13020600\t13020900\t0.3612\t105\nchr21\t13027200\t13027500\t0.5184\t70\nchr21\t13029900\t13031100\t0.2766\t62\nchr21\t13032600\t13032900\t0.4527\t44\nchr21\t13038900\t13039200\t0.4857\t57\nchr21\t13043700\t13045200\t0.1419\t74\nchr21\t13046400\t13047000\t0.0221\t94\nchr21\t13048800\t13052400\t0.0221\t94\nchr21\t13056000\t13057800\t0.0221\t94\nchr21\t13059000\t13059900\t0.2225\t74\nchr21\t13061400\t13065000\t0.0238\t72\nchr21\t13069500\t13071300\t0.2033\t67\nchr21\t13087200\t13088700\t0.3185\t68\nchr21\t13090500\t13090800\t0.5583\t56\nchr21\t13092300\t13092600\t0.0615\t54\nchr21\t13094400\t13095900\t0.227\t59\nchr21\t13106700\t13107000\t0.4695\t64\nchr21\t13109400\t13110000\t0.3879\t68\nchr21\t13112400\t13112700\t0.3879\t68\nchr21\t13113900\t13114200\t0.4043\t68\nchr21\t13115400\t13115700\t0.3963\t82\nchr21\t13117200\t13117500\t0.3963\t82\nchr21\t13120800\t13121400\t0.3917\t74\nchr21\t13122900\t13123800\t0.3917\t74\nchr21\t13131300\t13131900\t0.5068\t75\nchr21\t13137300\t13138800\t0.0037\t69\nchr21\t13140900\t13141200\t0.4262\t56\nchr21\t13144200\t13144500\t0.4495\t62\nchr21\t13147500\t13147800\t0.3657\t87\nchr21\t13155300\t13156800\t0.3072\t66\nchr21\t13158600\t13158900\t0.3072\t66\nchr21\t13162800\t13164000\t0.1345\t62\nchr21\t13166700\t13167300\t0.1345\t62\nchr21\t13170900\t13172400\t0.2468\t62\nchr21\t13175100\t13177200\t0\t80\nchr21\t13178400\t13178700\t0\t80\nchr21\t13179900\t13185900\t0\t80\nchr21\t13187700\t13188000\t0\t80\nchr21\t13191000\t13192500\t0.1765\t80\nchr21\t13193700\t13196100\t0.1765\t80\nchr21\t13197300\t13197900\t0.1765\t80\nchr21\t13199700\t13201200\t0.2112\t96\nchr21\t13202700\t13203000\t0.0904\t74\nchr21\t13204200\t13205700\t0.0904\t74\nchr21\t13208700\t13210200\t0.0904\t74\nchr21\t13212000\t13212300\t0.0904\t74\nchr21\t13216500\t13216800\t0.2667\t57\nchr21\t13219500\t13219800\t0.5364\t62\nchr21\t13335600\t13335900\t0.4583\t67\nchr21\t13347600\t13348200\t0.4426\t45\nchr21\t13361700\t13362000\t0.4721\t57\nchr21\t13375500\t13375800\t0.2169\t64\nchr21\t13390800\t13391400\t0.2115\t53\nchr21\t13416600\t13416900\t0.4312\t75\nchr21\t13462500\t13462800\t0.525\t51\nchr21\t13470000\t13470300\t0.4696\t57\nchr21\t13483800\t13484100\t0.1919\t73\nchr21\t13494000\t13494300\t0.2682\t66\nchr21\t13500000\t13501200\t0.4058\t52\nchr21\t13523700\t13524300\t0.3683\t57\nchr21\t13528500\t13528800\t0.6305\t65\nchr21\t13532400\t13534800\t0.1693\t63\nchr21\t13542000\t13542300\t0.4418\t58\nchr21\t13546500\t13546800\t0.5868\t66\nchr21\t13563600\t13564200\t0.4376\t59\nchr21\t13567800\t13568100\t0.2705\t50\nchr21\t13586100\t13594500\t0\t47\nchr21\t13596000\t13608300\t0.001\t50\nchr21\t13610100\t13610400\t0\t47\nchr21\t13611900\t13644900\t0\t47\nchr21\t13646100\t13649400\t0\t47\nchr21\t13651200\t13654200\t0\t49\nchr21\t13656300\t13663800\t0\t49\nchr21\t13666800\t13668600\t0\t29\nchr21\t13669800\t13673700\t0\t34\nchr21\t13674900\t13711200\t0\t38\nchr21\t13712400\t13717500\t0\t23\nchr21\t13719000\t13732500\t0\t27\nchr21\t13733700\t13780500\t0\t50\nchr21\t13782300\t13799100\t0\t64\nchr21\t13805400\t13805700\t0.5611\t70\nchr21\t13862100\t13862400\t0.4545\t76\nchr21\t13866600\t13866900\t0.119\t27\nchr21\t13881300\t13881900\t0.3526\t77\nchr21\t13904100\t13904700\t0.3968\t66\nchr21\t13931700\t13932000\t0.3921\t43\nchr21\t13975500\t13976100\t0.0027\t40\nchr21\t13984200\t13984500\t0.0357\t54\nchr21\t13992600\t13993500\t0.0168\t66\nchr21\t14059500\t14060100\t0.0877\t52\nchr21\t14068200\t14068800\t0.1606\t40\nchr21\t14097900\t14098200\t0.6688\t99\nchr21\t14407800\t14408100\t0.0966\t51\nchr21\t14587800\t14588400\t0.2189\t68\nchr21\t14647500\t14649000\t0.4596\t81\nchr21\t14927700\t14933100\t0.0127\t104\nchr21\t15031500\t15031800\t0.5543\t86\nchr21\t15554400\t15555900\t0.2513\t83\nchr21\t15836400\t15837300\t0.2844\t52\nchr21\t16398000\t16398300\t0.4284\t32\nchr21\t16544400\t16544700\t0.2787\t59\nchr21\t16971000\t16971300\t0.6488\t24\nchr21\t17167500\t17167800\t0.171\t29\nchr21\t17172600\t17172900\t0.034\t25\nchr21\t17291700\t17292900\t0.0045\t95\nchr21\t17305500\t17306100\t0.0801\t51\nchr21\t17331000\t17333100\t0.3763\t78\nchr21\t17377200\t17382000\t0.0522\t84\nchr21\t17718600\t17721000\t0.1518\t71\nchr21\t18561000\t18561300\t0.3244\t47\nchr21\t18568800\t18570000\t0.3133\t74\nchr21\t18871500\t18872700\t0.2019\t63\nchr21\t18873900\t18875100\t0.2019\t63\nchr21\t19008900\t19009200\t0.3514\t66\nchr21\t19071900\t19075800\t0.0491\t83\nchr21\t19959000\t19959300\t0.3831\t62\nchr21\t20076900\t20077200\t0.0996\t49\nchr21\t20199600\t20201400\t0.1161\t66\nchr21\t21301800\t21302100\t0.2022\t67\nchr21\t21660900\t21661200\t0.3857\t60\nchr21\t22957500\t22958100\t0.3094\t55\nchr21\t23001600\t23003100\t0.1547\t35\nchr21\t23072400\t23072700\t0.5892\t22\nchr21\t23147100\t23147400\t0.4975\t93\nchr21\t24391800\t24392100\t0.0599\t15\nchr21\t25919100\t25924200\t0\t93\nchr21\t26359200\t26359500\t0.4926\t81\nchr21\t27544200\t27544500\t0.1416\t83\nchr21\t27575700\t27577800\t0.2385\t64\nchr21\t27627000\t27627600\t0.5141\t149\nchr21\t27893400\t27893700\t0.4119\t56\nchr21\t29011500\t29012700\t0.4846\t60\nchr21\t29229600\t29229900\t0.4175\t31\nchr21\t29421300\t29422500\t0.1107\t68\nchr21\t29781600\t29781900\t0.4174\t44\nchr21\t30420900\t30421200\t0.4611\t74\nchr21\t30840000\t30841800\t0.0202\t95\nchr21\t31784400\t31785300\t0.2873\t301\nchr21\t32224500\t32226300\t0.006\t87\nchr21\t32771700\t32772000\t0.5364\t66\nchr21\t33239700\t33240000\t0.6029\t57\nchr21\t33321300\t33324000\t0.2625\t169\nchr21\t33336000\t33336600\t0.4369\t47\nchr21\t33926100\t33927900\t0.1607\t87\nchr21\t33929100\t33930300\t0.1607\t87\nchr21\t34374300\t34495500\t0\t47\nchr21\t34701000\t34701300\t0.624\t50\nchr21\t35493900\t35499600\t0.0053\t94\nchr21\t35789700\t35790000\t0.4216\t67\nchr21\t36496800\t36497400\t0.2061\t169\nchr21\t37589400\t37589700\t0.553\t40\nchr21\t38109300\t38109600\t0.1155\t13\nchr21\t38188800\t38189400\t0.5671\t41\nchr21\t38218500\t38218800\t0.416\t45\nchr21\t38828400\t38830500\t0.0202\t72\nchr21\t38874300\t38874600\t0.4657\t39\nchr21\t38972400\t38972700\t0.4145\t55\nchr21\t39583800\t39584100\t0.44\t16\nchr21\t39786300\t39786600\t0.264\t71\nchr21\t39974400\t39975300\t0.3369\t266\nchr21\t40023300\t40028400\t0\t88\nchr21\t40033800\t40038900\t0\t70\nchr21\t40114200\t40114500\t0.5268\t51\nchr21\t40182600\t40182900\t0.4661\t31\nchr21\t40306200\t40306800\t0.4345\t62\nchr21\t40378500\t40378800\t0.4651\t45\nchr21\t40915800\t40917600\t0.0442\t73\nchr21\t41031000\t41031300\t0.2293\t15\nchr21\t41313300\t41313900\t0.5844\t64\nchr21\t41690100\t41690400\t0.4742\t59\nchr21\t41805900\t41806800\t0.4122\t494\nchr21\t41856000\t41856300\t0.2654\t24\nchr21\t42078300\t42078600\t0.2628\t11\nchr21\t42283800\t42284100\t0.2368\t21\nchr21\t42588000\t42590400\t0.0432\t41\nchr21\t42615300\t42615900\t0.4852\t62\nchr21\t42778500\t42779100\t0.4849\t60\nchr21\t42957300\t42957600\t0.1622\t1902\nchr21\t43035900\t43036200\t0.2369\t40\nchr21\t43037400\t43037700\t0.2369\t40\nchr21\t43039500\t43040700\t0.2369\t40\nchr21\t43042500\t43046100\t0\t66\nchr21\t43047300\t43087200\t0\t66\nchr21\t43089000\t43187400\t0\t56\nchr21\t43335900\t43337400\t0.4887\t185\nchr21\t43377000\t43438500\t0\t59\nchr21\t43440300\t43550700\t0\t55\nchr21\t43553400\t43572000\t0\t55\nchr21\t43583100\t43583400\t0.0403\t24\nchr21\t44095800\t44145900\t0\t46\nchr21\t44147100\t44148900\t0\t46\nchr21\t44150100\t44194800\t0\t46\nchr21\t44196900\t44197200\t0\t15\nchr21\t44201100\t44253300\t0\t46\nchr21\t44371200\t44371500\t0.6127\t55\nchr21\t44410200\t44410500\t0.2899\t31\nchr21\t44422800\t44423100\t0.1979\t32\nchr21\t44481600\t44481900\t0.5926\t60\nchr21\t44487000\t44487300\t0.1539\t64\nchr21\t44504400\t44504700\t0.6736\t63\nchr21\t44825100\t44825700\t0.4312\t104\nchr21\t44981700\t44982300\t0.1984\t85\nchr21\t45268800\t45269100\t0.5728\t49\nchr21\t45500400\t45501900\t0.3509\t71\nchr21\t45524100\t45524700\t0.1882\t67\nchr21\t45633300\t45634500\t0.1596\t78\nchr21\t45637500\t45637800\t0.5311\t32\nchr21\t45746100\t45747000\t0.1334\t74\nchr21\t45797700\t45799200\t0.5282\t241\nchr21\t45924300\t45925200\t0.4092\t266\nchr21\t45988200\t45988500\t0.3459\t40\nchr21\t46010700\t46011000\t0.2921\t17\nchr21\t46034400\t46035300\t0.0249\t128\nchr21\t46090800\t46091100\t0.4801\t199\nchr21\t46169400\t46170900\t0.208\t119\nchr21\t46184400\t46184700\t0.2168\t200\nchr21\t46201200\t46202400\t0.0904\t103\nchr21\t46292400\t46294800\t0.1325\t160\nchr21\t46413000\t46413300\t0.6679\t81\nchr21\t46682700\t46700100\t0\t125\nchr22\t10509900\t10521900\t0\t137\nchr22\t10523100\t10571700\t0\t137\nchr22\t10573500\t10615200\t0\t65\nchr22\t10616400\t10630800\t0\t65\nchr22\t10632900\t10641300\t0\t52\nchr22\t10642500\t10660200\t0\t64\nchr22\t10670400\t10670700\t0.3805\t74\nchr22\t10674300\t10676100\t0.1213\t56\nchr22\t10677600\t10679400\t0.096\t80\nchr22\t10681200\t10684200\t0.096\t80\nchr22\t10685700\t10686300\t0.1957\t97\nchr22\t10688100\t10690500\t0.158\t162\nchr22\t10697400\t10700100\t0.4895\t63\nchr22\t10702800\t10703400\t0.2622\t44\nchr22\t10706100\t10710000\t0.0682\t97\nchr22\t10717200\t10730400\t0.2591\t1599\nchr22\t10760100\t10760400\t0.3529\t166\nchr22\t10765200\t10766400\t0.1735\t230\nchr22\t10834500\t10874400\t0\t142\nchr22\t10954500\t10955100\t0.3125\t223\nchr22\t10963500\t10963800\t0.0399\t97\nchr22\t11016600\t11025900\t0\t384\nchr22\t11042400\t11042700\t0.0402\t489\nchr22\t11043900\t11048400\t0.0402\t489\nchr22\t11049900\t11050800\t0.0451\t275\nchr22\t11052300\t11053200\t0.215\t256\nchr22\t11058900\t11059200\t0.4593\t142\nchr22\t11119200\t11160900\t0\t78\nchr22\t11211000\t11217600\t0\t585\nchr22\t11220600\t11250300\t0\t193\nchr22\t11251500\t11284800\t0\t193\nchr22\t11320200\t11323200\t0\t357\nchr22\t11329800\t11330100\t0.6318\t339\nchr22\t11332500\t11332800\t0.1977\t108\nchr22\t11334600\t11336100\t0.1977\t108\nchr22\t11368800\t11372100\t0.0029\t1115\nchr22\t11430000\t11430300\t0.2654\t29\nchr22\t11433000\t11434200\t0\t40\nchr22\t11438400\t11438700\t0.2063\t33\nchr22\t11440200\t11440500\t0.2973\t39\nchr22\t11443800\t11444100\t0.5778\t17\nchr22\t11445600\t11447400\t0\t32\nchr22\t11449500\t11450400\t0\t47\nchr22\t11451600\t11452500\t0\t47\nchr22\t11454000\t11456400\t0\t48\nchr22\t11458500\t11459700\t0\t104\nchr22\t11460900\t11466000\t0\t104\nchr22\t11470500\t11471700\t0\t28\nchr22\t11472900\t11473200\t0\t28\nchr22\t11475600\t11477400\t0\t28\nchr22\t11481300\t11481600\t0.4795\t10\nchr22\t11484000\t11486100\t0\t35\nchr22\t11488500\t11490300\t0.512\t24\nchr22\t11492400\t11493600\t0.244\t22\nchr22\t11548500\t11548800\t0.3266\t140\nchr22\t11557500\t11560500\t0\t270\nchr22\t11681700\t11682000\t0.6513\t128\nchr22\t11683200\t11697000\t0\t151\nchr22\t11698500\t11724300\t0\t219\nchr22\t11774700\t11786400\t0\t157\nchr22\t11787600\t11795400\t0\t157\nchr22\t11796600\t11800200\t0\t157\nchr22\t11802300\t11818200\t0\t825\nchr22\t11820000\t11821200\t0\t134\nchr22\t11823000\t11827500\t0\t163\nchr22\t11828700\t11869800\t0\t163\nchr22\t11871600\t11872800\t0\t163\nchr22\t11874000\t11878800\t0\t41\nchr22\t11880900\t11883900\t0\t79\nchr22\t11885100\t11885700\t0\t79\nchr22\t11893800\t11894100\t0.0099\t78\nchr22\t11895300\t11899500\t0\t61\nchr22\t11901000\t11959500\t0\t282\nchr22\t11963100\t11963400\t0\t46\nchr22\t11966100\t11970300\t0\t101\nchr22\t11972100\t11976900\t0\t101\nchr22\t12031200\t12031500\t0.6972\t96\nchr22\t12034200\t12034500\t0.6081\t189\nchr22\t12042600\t12043200\t0.2457\t162\nchr22\t12046200\t12046800\t0.104\t109\nchr22\t12048300\t12051600\t0.3917\t151\nchr22\t12054000\t12055500\t0.2925\t168\nchr22\t12058200\t12068700\t0\t128\nchr22\t12069900\t12082200\t0\t171\nchr22\t12083400\t12087900\t0\t171\nchr22\t12089100\t12093000\t0.0083\t107\nchr22\t12095700\t12102300\t0.025\t155\nchr22\t12103800\t12105300\t0.025\t155\nchr22\t12106800\t12107700\t0.025\t155\nchr22\t12109200\t12109500\t0.025\t155\nchr22\t12113100\t12114300\t0.0023\t194\nchr22\t12115800\t12119100\t0.0023\t194\nchr22\t12123000\t12132000\t0\t136\nchr22\t12133800\t12142800\t0.0014\t246\nchr22\t12144000\t12152700\t0.0014\t246\nchr22\t12154500\t12157500\t0.0014\t246\nchr22\t12159000\t12166500\t0.0014\t246\nchr22\t12167700\t12169200\t0.0014\t246\nchr22\t12172200\t12172500\t0.016\t892\nchr22\t12174900\t12178800\t0.016\t892\nchr22\t12180000\t12180300\t0.016\t892\nchr22\t12181500\t12182700\t0.0042\t100\nchr22\t12183900\t12189300\t0.1295\t148\nchr22\t12193500\t12194100\t0.5397\t158\nchr22\t12200100\t12200400\t0.4692\t160\nchr22\t12201600\t12202200\t0.4692\t160\nchr22\t12204000\t12204300\t0.5989\t141\nchr22\t12209400\t12209700\t0.3612\t156\nchr22\t12211200\t12213900\t0.3612\t156\nchr22\t12215400\t12215700\t0.1463\t98\nchr22\t12218100\t12222900\t0.256\t215\nchr22\t12225000\t12225300\t0.4271\t84\nchr22\t12275700\t12298200\t0\t313\nchr22\t12299400\t12303000\t0\t313\nchr22\t12304500\t12314100\t0\t313\nchr22\t12315300\t12316500\t0\t313\nchr22\t12317700\t12349800\t0\t313\nchr22\t12351300\t12357600\t0\t356\nchr22\t12359100\t12375000\t0\t356\nchr22\t12392700\t12393000\t0.6652\t150\nchr22\t12398100\t12399600\t0.3949\t165\nchr22\t12488700\t12489000\t0.6681\t278\nchr22\t12490500\t12498000\t0\t310\nchr22\t12499500\t12513000\t0\t310\nchr22\t12514200\t12537000\t0\t235\nchr22\t12538200\t12543300\t0\t197\nchr22\t12544500\t12545100\t0.0024\t273\nchr22\t12546600\t12548100\t0.0024\t273\nchr22\t12549900\t12589200\t0.0024\t273\nchr22\t12625500\t12625800\t0.6361\t229\nchr22\t12691800\t12692700\t0.5247\t1279\nchr22\t12694800\t12695100\t0.6449\t128\nchr22\t12698700\t12699000\t0\t13\nchr22\t12709200\t12709500\t0.1481\t123\nchr22\t12711300\t12719400\t0.1481\t123\nchr22\t12720600\t12721200\t0.1481\t123\nchr22\t12723000\t12726300\t0.139\t55\nchr22\t12776700\t12788700\t0.0376\t169\nchr22\t12790500\t12797700\t0.0376\t169\nchr22\t12799800\t12803400\t0.025\t161\nchr22\t12804600\t12805500\t0.025\t161\nchr22\t12806700\t12818100\t0.025\t161\nchr22\t12868200\t12904800\t0\t239\nchr22\t15155100\t15165900\t0\t95\nchr22\t15167400\t15208200\t0\t87\nchr22\t15209400\t15227400\t0\t86\nchr22\t15228600\t15316800\t0\t88\nchr22\t15318300\t15329100\t0\t88\nchr22\t15331200\t15338100\t0\t86\nchr22\t15339300\t15352800\t0\t86\nchr22\t15354000\t15361200\t0\t96\nchr22\t15362400\t15369900\t0\t96\nchr22\t15372000\t15387900\t0\t96\nchr22\t15390600\t15390900\t0.4512\t65\nchr22\t15393000\t15396300\t0\t88\nchr22\t15397800\t15407700\t0\t88\nchr22\t15408900\t15419400\t0\t91\nchr22\t15420600\t15422700\t0\t91\nchr22\t15424200\t15427500\t0.0048\t82\nchr22\t15428700\t15430800\t0.0048\t82\nchr22\t15432300\t15439800\t0\t88\nchr22\t15441000\t15447900\t0\t88\nchr22\t15450000\t15466200\t0\t88\nchr22\t15467400\t15468600\t0\t139\nchr22\t15469800\t15470100\t0\t139\nchr22\t15471600\t15543900\t0\t139\nchr22\t15545100\t15576600\t0\t156\nchr22\t15578700\t15612900\t0\t162\nchr22\t15614100\t15614400\t0\t162\nchr22\t15615600\t15618000\t0\t162\nchr22\t15619200\t15625500\t0\t162\nchr22\t15627000\t15627600\t0.0305\t67\nchr22\t15629100\t15630300\t0.2347\t116\nchr22\t15634800\t15710700\t0\t209\nchr22\t15711900\t15738000\t0\t209\nchr22\t15739800\t15745500\t0\t209\nchr22\t15747300\t15747600\t0.0626\t105\nchr22\t15750300\t15760500\t0.0053\t160\nchr22\t15762300\t15765600\t0\t183\nchr22\t15767400\t15771600\t0\t183\nchr22\t15773400\t15774300\t0.0233\t185\nchr22\t15775500\t15828600\t0\t190\nchr22\t15830400\t15834000\t0.0015\t163\nchr22\t15835500\t15838500\t0.0015\t163\nchr22\t15839700\t15840300\t0.0015\t163\nchr22\t15842100\t15861000\t0\t177\nchr22\t15864000\t15907800\t0\t161\nchr22\t15909000\t15916500\t0\t103\nchr22\t15918300\t15918900\t0.0741\t64\nchr22\t15923400\t15923700\t0.4917\t58\nchr22\t15924900\t15926400\t0.5152\t64\nchr22\t15927900\t15928200\t0.3157\t66\nchr22\t15931200\t15933000\t0.2082\t74\nchr22\t15941100\t15944700\t0.0362\t68\nchr22\t15946500\t15947400\t0.3419\t93\nchr22\t15951000\t15951600\t0.2018\t59\nchr22\t15954900\t15972000\t0\t46\nchr22\t15973500\t15980700\t0\t89\nchr22\t15982200\t15983700\t0\t89\nchr22\t15984900\t16020600\t0\t89\nchr22\t16046400\t16047900\t0.6376\t103\nchr22\t16057200\t16057500\t0.6567\t128\nchr22\t16062300\t16062600\t0.6514\t84\nchr22\t16064400\t16064700\t0.6623\t114\nchr22\t16164900\t16165200\t0.0694\t21\nchr22\t16188600\t16188900\t0.5432\t25\nchr22\t16228800\t16229100\t0.5824\t105\nchr22\t16238100\t16238400\t0.4648\t40\nchr22\t16256100\t16256400\t0.6958\t72\nchr22\t16258200\t16258500\t0.4679\t56\nchr22\t16262100\t16262400\t0.6476\t185\nchr22\t16265400\t16265700\t0.5905\t122\nchr22\t16275600\t16275900\t0.4326\t151\nchr22\t16305600\t16314600\t0\t32\nchr22\t16315800\t16316100\t0\t74\nchr22\t16319100\t16323600\t0\t51\nchr22\t16325100\t16325400\t0.5398\t22\nchr22\t16328100\t16385700\t0\t11424\nchr22\t16409700\t16410000\t0.3013\t94\nchr22\t16435500\t16435800\t0.5305\t61\nchr22\t16438800\t16439100\t0.5509\t123\nchr22\t16461300\t16461600\t0.4187\t46\nchr22\t16479000\t16522800\t0\t87\nchr22\t16545600\t16546200\t0.3325\t75\nchr22\t16548000\t16548300\t0.3325\t75\nchr22\t16558500\t16558800\t0.5608\t98\nchr22\t16563000\t16563300\t0.6357\t73\nchr22\t16565400\t16565700\t0.6862\t91\nchr22\t16581000\t16581300\t0.3209\t54\nchr22\t16636200\t16636500\t0.637\t30\nchr22\t16701000\t16701600\t0.0393\t70\nchr22\t16880700\t16881300\t0.548\t66\nchr22\t16885500\t16885800\t0.6656\t73\nchr22\t16895400\t16895700\t0.445\t61\nchr22\t16959000\t16959300\t0.3749\t49\nchr22\t17018100\t17018400\t0.1362\t136\nchr22\t17033100\t17034300\t0.3226\t98\nchr22\t17037000\t17037300\t0.2576\t108\nchr22\t17103900\t17104200\t0.6936\t30\nchr22\t17146800\t17147400\t0.1944\t66\nchr22\t17876700\t17877300\t0.4925\t188\nchr22\t18009300\t18010200\t0\t32\nchr22\t18161100\t18162600\t0.0168\t67\nchr22\t18165000\t18165600\t0.233\t68\nchr22\t18170700\t18171600\t0.017\t66\nchr22\t18176100\t18178500\t0.0484\t86\nchr22\t18179700\t18203700\t0\t987\nchr22\t18205200\t18206100\t0\t1414\nchr22\t18207600\t18231600\t0\t52\nchr22\t18233100\t18234600\t0\t52\nchr22\t18236700\t18238500\t0.0142\t1239\nchr22\t18339900\t18346500\t0\t37\nchr22\t18347700\t18354300\t0\t43\nchr22\t18357900\t18368700\t0\t58\nchr22\t18371700\t18387900\t0\t2035\nchr22\t18390600\t18417300\t0\t63\nchr22\t18418500\t18419700\t0\t1194\nchr22\t18420900\t18433500\t0\t675\nchr22\t18484200\t18485100\t0\t38\nchr22\t18486300\t18487800\t0\t21\nchr22\t18489000\t18491100\t0\t31\nchr22\t18492300\t18502500\t0\t50\nchr22\t18504000\t18505200\t0\t50\nchr22\t18507600\t18518100\t0\t50\nchr22\t18520800\t18536100\t0\t60\nchr22\t18538500\t18568800\t0\t60\nchr22\t18570000\t18571200\t0\t70\nchr22\t18572400\t18588600\t0\t70\nchr22\t18590400\t18598200\t0\t70\nchr22\t18599400\t18607800\t0\t70\nchr22\t18609000\t18616500\t0\t62\nchr22\t18617700\t18633900\t0\t62\nchr22\t18635100\t18636600\t0\t62\nchr22\t18637800\t18638700\t0\t62\nchr22\t18639900\t18640200\t0\t28\nchr22\t18641700\t18648600\t0\t28\nchr22\t18650100\t18652500\t0\t28\nchr22\t18653700\t18654900\t0\t28\nchr22\t18656400\t18657600\t0\t61\nchr22\t18658800\t18659400\t0\t61\nchr22\t18709500\t18720300\t0\t36\nchr22\t18722100\t18727800\t0\t89\nchr22\t18729900\t18731700\t0.3272\t12678\nchr22\t18733500\t18739200\t0\t7475\nchr22\t18741600\t18742200\t0\t36\nchr22\t18743400\t18744600\t0\t23\nchr22\t18746100\t18748500\t0\t49\nchr22\t18749700\t18751500\t0\t49\nchr22\t18752700\t18761700\t0\t51\nchr22\t18762900\t18765300\t0\t51\nchr22\t18767100\t18782400\t0\t43\nchr22\t18784200\t18799200\t0\t47\nchr22\t18800400\t18813600\t0\t43\nchr22\t18815100\t18816900\t0\t34\nchr22\t18819600\t18837900\t0\t50\nchr22\t18839100\t18840300\t0\t32\nchr22\t18841500\t18842100\t0\t32\nchr22\t18843300\t18913200\t0\t8657\nchr22\t18914400\t18916500\t0\t8657\nchr22\t18918300\t18947700\t0\t123\nchr22\t18963600\t18963900\t0.4501\t44\nchr22\t19025700\t19026900\t0.0494\t56\nchr22\t19072500\t19072800\t0.5728\t94\nchr22\t19907700\t19908000\t0.6268\t23\nchr22\t20162400\t20164500\t0.2691\t94\nchr22\t20325300\t20327700\t0.0425\t47\nchr22\t20328900\t20329200\t0.0864\t66\nchr22\t20331000\t20332800\t0.0864\t66\nchr22\t20334000\t20334900\t0.0244\t47\nchr22\t20338200\t20348400\t0\t1137\nchr22\t20349900\t20350500\t0.0541\t73\nchr22\t20352000\t20353500\t0.1668\t47\nchr22\t20357700\t20358000\t0.4055\t31\nchr22\t20366100\t20366700\t0.0382\t77\nchr22\t20371500\t20372400\t0.0924\t73\nchr22\t20374800\t20376300\t0.0192\t64\nchr22\t20679300\t20679900\t0.226\t47\nchr22\t20683200\t20684100\t0.219\t60\nchr22\t20689200\t20690400\t0.1145\t67\nchr22\t20696400\t20698500\t0.0021\t48\nchr22\t20705700\t20707200\t0.3519\t74\nchr22\t20708400\t20709000\t0.1947\t55\nchr22\t20733300\t20735400\t0.3462\t62\nchr22\t21057600\t21057900\t0.2559\t45\nchr22\t21112200\t21163800\t0\t116\nchr22\t21165600\t21216000\t0\t452\nchr22\t21217800\t21327000\t0\t379\nchr22\t21329700\t21355200\t0\t63\nchr22\t21356400\t21357000\t0\t55\nchr22\t21358800\t21363000\t0.1039\t43\nchr22\t21364200\t21377700\t0\t100\nchr22\t21379500\t21405600\t0\t100\nchr22\t21407400\t21442800\t0\t100\nchr22\t21460500\t21476700\t0\t62\nchr22\t21477900\t21479400\t0\t62\nchr22\t21480900\t21485100\t0.001\t54\nchr22\t21486600\t21542100\t0\t81\nchr22\t21543300\t21555300\t0\t81\nchr22\t21558000\t21559200\t0.4369\t74\nchr22\t21883500\t21883800\t0.4648\t90\nchr22\t21955200\t21957600\t0\t90\nchr22\t22160100\t22161300\t0.3692\t46\nchr22\t22220700\t22224000\t0.0231\t85\nchr22\t22267800\t22268400\t0.4152\t81\nchr22\t22270500\t22270800\t0.386\t70\nchr22\t22278600\t22279200\t0.2814\t104\nchr22\t22281000\t22281300\t0.2814\t104\nchr22\t22296300\t22296600\t0.4086\t46\nchr22\t22630200\t22633200\t0.1377\t97\nchr22\t22634700\t22637400\t0.1377\t97\nchr22\t22638600\t22639800\t0.1377\t97\nchr22\t22643400\t22644900\t0.1079\t67\nchr22\t22650000\t22650300\t0.2507\t33\nchr22\t22828500\t22828800\t0.6547\t27\nchr22\t22877100\t22877400\t0.2481\t51\nchr22\t22899900\t22900500\t0.0405\t72\nchr22\t22905600\t22905900\t0.0704\t80\nchr22\t23310900\t23311200\t0.1467\t72\nchr22\t23316300\t23318400\t0.445\t71\nchr22\t23329500\t23330100\t0.4051\t43\nchr22\t23344500\t23344800\t0.1897\t55\nchr22\t23448600\t23449800\t0.4971\t61\nchr22\t23477700\t23478000\t0.4366\t50\nchr22\t23540100\t23540700\t0.2428\t60\nchr22\t23595000\t23595300\t0.5567\t61\nchr22\t23601900\t23602500\t0.1783\t63\nchr22\t23853600\t23856300\t0\t134\nchr22\t23940000\t23942100\t0.0893\t64\nchr22\t23946600\t23949300\t0\t26\nchr22\t23951100\t23952000\t0.3798\t49\nchr22\t23957100\t23969100\t0\t49\nchr22\t23972100\t23980500\t0\t51\nchr22\t23982000\t23984400\t0\t31\nchr22\t23988900\t23992200\t0.0392\t53\nchr22\t23999400\t23999700\t0.0329\t49\nchr22\t24000900\t24001200\t0.0329\t49\nchr22\t24193200\t24195300\t0.0563\t88\nchr22\t24251700\t24252600\t0.0376\t57\nchr22\t24258300\t24260400\t0.4548\t92\nchr22\t24293700\t24294300\t0.0581\t82\nchr22\t24297000\t24297300\t0.3342\t63\nchr22\t24317100\t24317400\t0.5255\t33\nchr22\t24643500\t24647700\t0.4664\t75\nchr22\t24651900\t24652500\t0.4222\t84\nchr22\t24658200\t24659700\t0.3717\t89\nchr22\t24671100\t24672000\t0.0085\t73\nchr22\t24674400\t24674700\t0.5184\t31\nchr22\t25000200\t25000500\t0.2714\t22\nchr22\t25228200\t25228500\t0.2127\t65\nchr22\t25254000\t25254300\t0.5516\t68\nchr22\t25266600\t25267200\t0.152\t60\nchr22\t25309800\t25310100\t0.3228\t67\nchr22\t25311900\t25312200\t0.388\t69\nchr22\t25345500\t25346100\t0.6411\t55\nchr22\t25455900\t25456200\t0.4911\t72\nchr22\t25523700\t25524000\t0.1532\t70\nchr22\t25613400\t25613700\t0.308\t66\nchr22\t25615500\t25615800\t0.2402\t54\nchr22\t26427300\t26427900\t0.4923\t70\nchr22\t26772000\t26773500\t0.3252\t82\nchr22\t28194600\t28195800\t0\t70\nchr22\t28212600\t28213800\t0\t61\nchr22\t28554000\t28554300\t0.5882\t72\nchr22\t28663500\t28669200\t0\t113\nchr22\t28781400\t28781700\t0.6311\t45\nchr22\t29120100\t29120400\t0.536\t198\nchr22\t29403900\t29404200\t0.5487\t63\nchr22\t29421600\t29421900\t0.4378\t66\nchr22\t29644500\t29644800\t0.5035\t86\nchr22\t30060000\t30060300\t0.4418\t69\nchr22\t30839100\t30839400\t0.6279\t48\nchr22\t31011000\t31011900\t0.2181\t67\nchr22\t31026600\t31028100\t0.0972\t54\nchr22\t31590300\t31593900\t0.1627\t57\nchr22\t32145900\t32146200\t0.4876\t36\nchr22\t32156400\t32156700\t0.1777\t37\nchr22\t32295000\t32299800\t0.0306\t67\nchr22\t32329800\t32330100\t0.6362\t22\nchr22\t32346600\t32346900\t0.2415\t53\nchr22\t32931900\t32932200\t0.1505\t95\nchr22\t34396500\t34396800\t0.6255\t50\nchr22\t34549800\t34555200\t0\t78\nchr22\t34677600\t34682400\t0.02\t53\nchr22\t34779600\t34779900\t0.4564\t45\nchr22\t35652900\t35653200\t0.4198\t44\nchr22\t35694900\t35695200\t0.4736\t68\nchr22\t35700900\t35701200\t0.4271\t76\nchr22\t36090300\t36090900\t0.5531\t62\nchr22\t36126300\t36126900\t0.4872\t72\nchr22\t36138000\t36138900\t0\t69\nchr22\t36187200\t36188100\t0\t77\nchr22\t36201000\t36201300\t0.4329\t61\nchr22\t36255600\t36255900\t0.3433\t51\nchr22\t37097700\t37098000\t0.5971\t58\nchr22\t37227000\t37227300\t0.2244\t29\nchr22\t37329000\t37329300\t0.6384\t74\nchr22\t38229600\t38230200\t0.2375\t66\nchr22\t38384100\t38386200\t0.165\t88\nchr22\t38806200\t38808300\t0.135\t82\nchr22\t39599400\t39599700\t0.5908\t32\nchr22\t39841500\t39843000\t0.2303\t58\nchr22\t40007400\t40007700\t0.5195\t59\nchr22\t40500900\t40502400\t0.1344\t69\nchr22\t40536300\t40538400\t0.0283\t82\nchr22\t40744200\t40746600\t0\t61\nchr22\t40775400\t40775700\t0.3544\t56\nchr22\t41295600\t41295900\t0.4226\t58\nchr22\t42123300\t42125700\t0\t73\nchr22\t42129900\t42130500\t0.1422\t67\nchr22\t42135600\t42138000\t0\t79\nchr22\t42143400\t42144000\t0.0188\t67\nchr22\t42225300\t42225600\t0.6593\t59\nchr22\t42324000\t42324300\t0.5534\t145\nchr22\t42483900\t42484200\t0.477\t60\nchr22\t42501600\t42505800\t0\t73\nchr22\t42513300\t42513600\t0.0705\t62\nchr22\t42518100\t42519300\t0.2469\t61\nchr22\t42555000\t42559200\t0\t77\nchr22\t42575100\t42575700\t0.1676\t69\nchr22\t42580500\t42580800\t0.595\t74\nchr22\t42980400\t42982500\t0.1118\t80\nchr22\t43078800\t43079100\t0.4978\t80\nchr22\t43281000\t43281300\t0.3349\t26\nchr22\t43432500\t43432800\t0.5802\t57\nchr22\t43496100\t43497000\t0.4123\t44\nchr22\t43499700\t43500000\t0.5503\t78\nchr22\t43834500\t43835100\t0.5472\t36\nchr22\t44113200\t44113500\t0.4956\t98\nchr22\t44115300\t44115900\t0.5295\t71\nchr22\t44302500\t44302800\t0.5907\t55\nchr22\t44800500\t44801100\t0.0118\t31\nchr22\t45327900\t45328500\t0.2558\t136\nchr22\t45916200\t45916500\t0.5322\t42\nchr22\t46605900\t46606500\t0.1489\t31\nchr22\t46631400\t46632000\t0.2235\t73\nchr22\t46635000\t46635600\t0.5304\t108\nchr22\t46772100\t46772700\t0.0849\t28\nchr22\t46859100\t46860000\t0.0712\t57\nchr22\t46941300\t46941600\t0.5647\t32\nchr22\t47070600\t47070900\t0.4861\t56\nchr22\t47117400\t47117700\t0.6848\t43\nchr22\t47144700\t47145000\t0.6476\t52\nchr22\t47170500\t47170800\t0.4228\t118\nchr22\t47176200\t47176500\t0.6422\t64\nchr22\t47400000\t47400300\t0.6722\t68\nchr22\t47603100\t47603400\t0.6927\t69\nchr22\t47732400\t47732700\t0.2424\t94\nchr22\t48290100\t48290700\t0.0146\t43\nchr22\t48498000\t48498300\t0.4945\t39\nchr22\t48667800\t48668400\t0.505\t25\nchr22\t48679200\t48679800\t0.4891\t47\nchr22\t48862200\t48863100\t0.5343\t72\nchr22\t48985800\t48991500\t0\t78\nchr22\t49071000\t49071300\t0.6979\t13\nchr22\t49265400\t49266300\t0.1012\t73\nchr22\t49384200\t49385100\t0.0086\t38\nchr22\t49387800\t49388100\t0.6006\t29\nchr22\t49494300\t49494600\t0.5106\t86\nchr22\t49552800\t49553100\t0.666\t67\nchr22\t49672500\t49672800\t0.2866\t43\nchr22\t49802100\t49802700\t0.368\t62\nchr22\t49879500\t49879800\t0.6061\t32\nchr22\t50028600\t50029500\t0.2043\t119\nchr22\t50312700\t50313000\t0.5686\t47\nchr22\t50629200\t50629500\t0.3992\t61\nchr22\t50640000\t50640300\t0.4499\t55\nchr22\t50643600\t50644200\t0.336\t420\nchr22\t50680200\t50682600\t0.5425\t81\nchr22\t50685300\t50686500\t0.4341\t83\nchr22\t50741700\t50742000\t0.5432\t64\nchr22\t50763600\t50763900\t0.0085\t79\nchr22\t50765100\t50767200\t0.0085\t79\nchr22\t50769000\t50769300\t0.2535\t65\nchr22\t50777400\t50777700\t0.1312\t54\nchr22\t50781900\t50783100\t0.2594\t79\nchr22\t50784300\t50784600\t0.0304\t76\nchr22\t50786700\t50789100\t0.0304\t76\nchr22\t50790300\t50790900\t0\t304\nchr22\t50792400\t50794500\t0\t304\nchr22\t50797200\t50808600\t0\t304\nchr3\t10200\t11100\t0.1615\t113\nchr3\t18600\t18900\t0.0784\t25\nchr3\t134700\t135600\t0.0731\t40\nchr3\t261900\t262500\t0.1039\t172\nchr3\t483000\t483600\t0.1157\t24\nchr3\t582000\t582300\t0.4562\t48\nchr3\t584100\t584400\t0.4562\t48\nchr3\t588300\t588600\t0.5979\t54\nchr3\t595800\t597000\t0.4344\t50\nchr3\t697800\t698700\t0.2009\t92\nchr3\t760500\t761100\t0.3758\t76\nchr3\t810300\t810600\t0.0307\t84\nchr3\t811800\t814800\t0.0307\t84\nchr3\t876300\t876900\t0.0763\t119\nchr3\t960900\t961500\t0.4311\t43\nchr3\t1388700\t1389300\t0.0479\t96\nchr3\t1390800\t1393500\t0.0479\t96\nchr3\t1565400\t1566000\t0.0939\t71\nchr3\t1596900\t1597200\t0.315\t132\nchr3\t1638300\t1638900\t0.4588\t57\nchr3\t1657800\t1658700\t0.011\t169\nchr3\t1671600\t1672200\t0.49\t54\nchr3\t1707300\t1707600\t0.1284\t22\nchr3\t1811400\t1811700\t0.3648\t49\nchr3\t2007000\t2008500\t0\t118\nchr3\t2060700\t2061300\t0.5339\t71\nchr3\t2084100\t2084400\t0.5575\t53\nchr3\t2269800\t2270100\t0.63\t31\nchr3\t2454000\t2454600\t0.0133\t54\nchr3\t3047400\t3047700\t0.447\t65\nchr3\t3131400\t3132600\t0.0091\t100\nchr3\t3482400\t3482700\t0.3386\t63\nchr3\t3671400\t3672000\t0.2514\t77\nchr3\t3721200\t3721800\t0.1947\t67\nchr3\t3723000\t3723300\t0.1947\t67\nchr3\t3790200\t3790500\t0.6215\t25\nchr3\t3831600\t3831900\t0.2837\t24\nchr3\t3895200\t3896100\t0.2501\t67\nchr3\t3963300\t3969000\t0\t86\nchr3\t4025400\t4027800\t0\t99\nchr3\t4039200\t4039500\t0.2301\t23\nchr3\t4254300\t4258500\t0.0669\t72\nchr3\t4266600\t4268100\t0.1616\t112\nchr3\t4365000\t4365900\t0.3684\t64\nchr3\t4917300\t4922400\t0\t137\nchr3\t5119200\t5119500\t0.47\t42\nchr3\t5239200\t5239500\t0.5549\t53\nchr3\t5283300\t5283600\t0.4015\t53\nchr3\t5526900\t5527200\t0.4563\t74\nchr3\t6146700\t6147000\t0.2897\t44\nchr3\t6268200\t6268500\t0.5621\t45\nchr3\t6318300\t6320700\t0.3049\t73\nchr3\t6388500\t6389100\t0.5786\t48\nchr3\t6428700\t6429000\t0.6066\t72\nchr3\t6486900\t6488100\t0.111\t78\nchr3\t6546600\t6548400\t0.3003\t67\nchr3\t6699600\t6700200\t0.1861\t61\nchr3\t6764700\t6765000\t0.2697\t59\nchr3\t6766800\t6767100\t0.5514\t66\nchr3\t6829200\t6829500\t0.4611\t68\nchr3\t7099500\t7099800\t0.6733\t42\nchr3\t7524300\t7524600\t0.475\t52\nchr3\t8334900\t8336400\t0.0154\t71\nchr3\t8390700\t8391000\t0.3332\t71\nchr3\t8411700\t8412600\t0.4486\t34\nchr3\t8440800\t8441100\t0.3984\t56\nchr3\t8612400\t8612700\t0.1351\t37\nchr3\t8613900\t8615400\t0\t109\nchr3\t8616900\t8617500\t0\t109\nchr3\t8655000\t8655300\t0.0952\t28\nchr3\t8718600\t8721900\t0.24\t89\nchr3\t8924400\t8925000\t0.182\t52\nchr3\t10052700\t10053300\t0.131\t107\nchr3\t10070700\t10071000\t0.2133\t75\nchr3\t10297500\t10298400\t0.0706\t79\nchr3\t10355700\t10356300\t0.5064\t75\nchr3\t10458300\t10458600\t0.5348\t63\nchr3\t11167200\t11167500\t0.5594\t46\nchr3\t11487000\t11489700\t0.0274\t40\nchr3\t11502300\t11502600\t0.2934\t43\nchr3\t11902200\t11902500\t0.5682\t39\nchr3\t11942400\t11943600\t0.2716\t80\nchr3\t12028800\t12033300\t0.0227\t107\nchr3\t12297900\t12298200\t0.4318\t63\nchr3\t12448500\t12448800\t0.6462\t22\nchr3\t12668100\t12668400\t0.5385\t38\nchr3\t14091300\t14091900\t0.2893\t63\nchr3\t14968500\t14968800\t0.4289\t48\nchr3\t15188100\t15189300\t0.0389\t116\nchr3\t15190500\t15192600\t0.0389\t116\nchr3\t15592500\t15593100\t0.4873\t28\nchr3\t15749100\t15749400\t0.4374\t42\nchr3\t16970400\t16971000\t0.1819\t81\nchr3\t17097000\t17099400\t0.1059\t103\nchr3\t17698500\t17699700\t0.1365\t90\nchr3\t17703900\t17706000\t0.2455\t74\nchr3\t17858400\t17859300\t0.1242\t84\nchr3\t17907000\t17907300\t0.5347\t60\nchr3\t18326100\t18326700\t0.1455\t103\nchr3\t18328800\t18329100\t0.0664\t90\nchr3\t18391200\t18391500\t0.6278\t65\nchr3\t18517200\t18519000\t0.0792\t96\nchr3\t18930900\t18936000\t0\t81\nchr3\t18958800\t18959100\t0.3359\t67\nchr3\t18961200\t18961800\t0.0647\t97\nchr3\t18963000\t18963300\t0.3068\t71\nchr3\t18979800\t18980400\t0.2393\t71\nchr3\t19009800\t19010700\t0.0079\t71\nchr3\t19097700\t19098300\t0.102\t72\nchr3\t19099500\t19101300\t0.102\t72\nchr3\t19371000\t19372500\t0.4022\t81\nchr3\t19375200\t19375500\t0.4973\t59\nchr3\t19502100\t19503300\t0.4183\t86\nchr3\t19624800\t19625100\t0.3426\t68\nchr3\t19855800\t19858200\t0.1864\t92\nchr3\t19860000\t19860300\t0.1864\t92\nchr3\t20353800\t20354400\t0.105\t78\nchr3\t20355600\t20355900\t0.105\t78\nchr3\t21250500\t21251100\t0.0249\t100\nchr3\t21252300\t21253800\t0.0249\t100\nchr3\t21278100\t21278400\t0.265\t87\nchr3\t21416100\t21416400\t0.3119\t42\nchr3\t21486000\t21486300\t0.1132\t66\nchr3\t21490800\t21491100\t0.0748\t59\nchr3\t21569100\t21569400\t0.3114\t85\nchr3\t21983400\t21988800\t0\t84\nchr3\t22050900\t22056300\t0\t95\nchr3\t22100100\t22100400\t0.1616\t62\nchr3\t22312800\t22313100\t0.5304\t73\nchr3\t22433700\t22434300\t0.3435\t88\nchr3\t22697400\t22697700\t0.4907\t73\nchr3\t22739400\t22740000\t0.4407\t93\nchr3\t22803000\t22804500\t0.0111\t84\nchr3\t22806600\t22807200\t0.0895\t144\nchr3\t23267700\t23268000\t0.5595\t68\nchr3\t23298600\t23298900\t0.4731\t77\nchr3\t23544600\t23544900\t0.5401\t97\nchr3\t24090000\t24095100\t0\t88\nchr3\t24282000\t24282600\t0.1494\t70\nchr3\t24330000\t24330300\t0.4637\t70\nchr3\t25760700\t25761000\t0.6013\t68\nchr3\t26295000\t26296500\t0.1612\t89\nchr3\t26384700\t26390700\t0\t105\nchr3\t26398200\t26403900\t0\t89\nchr3\t26495100\t26495700\t0.3218\t92\nchr3\t26728800\t26729100\t0.2334\t79\nchr3\t26730300\t26731200\t0.2334\t79\nchr3\t26745300\t26745600\t0.2229\t48\nchr3\t26784600\t26784900\t0.4882\t35\nchr3\t26787300\t26787600\t0.4397\t63\nchr3\t26843400\t26843700\t0.5221\t45\nchr3\t26884200\t26884500\t0.3538\t83\nchr3\t26917800\t26918100\t0.2177\t73\nchr3\t26991600\t26991900\t0.3205\t100\nchr3\t27093000\t27093600\t0\t82\nchr3\t27204300\t27206100\t0.1867\t112\nchr3\t27817500\t27818700\t0.0684\t90\nchr3\t27819900\t27821100\t0.3438\t81\nchr3\t28060800\t28064700\t0.2349\t78\nchr3\t28354500\t28355100\t0.198\t57\nchr3\t28366200\t28366800\t0.0367\t68\nchr3\t28414500\t28419900\t0\t74\nchr3\t28493400\t28494900\t0\t83\nchr3\t28688700\t28689000\t0.2836\t75\nchr3\t28732500\t28732800\t0.6817\t45\nchr3\t28851600\t28851900\t0.2945\t147\nchr3\t29109000\t29111400\t0.0005\t83\nchr3\t29578800\t29579100\t0.6277\t45\nchr3\t29996100\t29996700\t0.3759\t73\nchr3\t30364800\t30365100\t0.1699\t134\nchr3\t30412800\t30414300\t0.035\t91\nchr3\t30820800\t30821100\t0.4141\t72\nchr3\t31965300\t31965600\t0.3812\t18\nchr3\t32279400\t32280000\t0.0847\t102\nchr3\t32729700\t32730000\t0.4266\t49\nchr3\t33511800\t33512700\t0\t93\nchr3\t33675300\t33676500\t0.3967\t81\nchr3\t34413300\t34418400\t0\t100\nchr3\t34653000\t34656600\t0\t91\nchr3\t35015400\t35016000\t0.3868\t69\nchr3\t35820000\t35820300\t0.4025\t74\nchr3\t35902200\t35902800\t0.2433\t83\nchr3\t36066600\t36066900\t0.3308\t46\nchr3\t36104700\t36105300\t0.2951\t84\nchr3\t36237900\t36239100\t0.2829\t57\nchr3\t36300600\t36301200\t0.5027\t42\nchr3\t38081100\t38082000\t0.1864\t78\nchr3\t38084400\t38084700\t0.598\t242\nchr3\t38184900\t38185200\t0.5165\t56\nchr3\t38341500\t38343300\t0\t67\nchr3\t38388900\t38389500\t0.3282\t77\nchr3\t38406900\t38407200\t0.201\t95\nchr3\t39228000\t39228600\t0.1376\t91\nchr3\t39468900\t39469200\t0.6522\t35\nchr3\t39585000\t39585900\t0.3618\t77\nchr3\t39676800\t39677100\t0.2748\t44\nchr3\t39984900\t39985800\t0.1\t82\nchr3\t40040100\t40042200\t0.1816\t80\nchr3\t40084200\t40085100\t0.4137\t43\nchr3\t40157100\t40157700\t0.1844\t67\nchr3\t40203900\t40204200\t0.006\t351\nchr3\t40219800\t40220100\t0.2086\t113\nchr3\t40239300\t40240200\t0.1\t84\nchr3\t40758300\t40758600\t0.4822\t81\nchr3\t40759800\t40760100\t0.4822\t81\nchr3\t40903200\t40903800\t0.1698\t78\nchr3\t40906200\t40907100\t0.4018\t59\nchr3\t40955100\t40955400\t0.4467\t74\nchr3\t40956900\t40957200\t0.3875\t70\nchr3\t41377500\t41377800\t0.3352\t72\nchr3\t41481600\t41481900\t0.3893\t71\nchr3\t41493900\t41494200\t0.3486\t52\nchr3\t41689800\t41690100\t0.264\t108\nchr3\t41776500\t41779800\t0.0026\t134\nchr3\t41805600\t41806200\t0.334\t64\nchr3\t41829000\t41829300\t0.3965\t63\nchr3\t42241200\t42243600\t0.2531\t78\nchr3\t42282900\t42283200\t0.1898\t85\nchr3\t42796800\t42799200\t0\t60\nchr3\t42976800\t42977100\t0.4814\t63\nchr3\t42989700\t42990000\t0.295\t44\nchr3\t43065300\t43070700\t0.0059\t109\nchr3\t43167300\t43167600\t0.4204\t64\nchr3\t43486800\t43487100\t0.2352\t85\nchr3\t43488300\t43488600\t0.2352\t85\nchr3\t43568400\t43571100\t0.1767\t83\nchr3\t43655700\t43656000\t0.6113\t57\nchr3\t44502900\t44503200\t0.367\t63\nchr3\t44567700\t44568000\t0.3231\t42\nchr3\t44750400\t44751000\t0.0447\t55\nchr3\t45133500\t45133800\t0.3028\t47\nchr3\t45680700\t45681000\t0.5475\t113\nchr3\t45726900\t45727200\t0.0744\t30\nchr3\t46140300\t46140600\t0.4663\t87\nchr3\t46149300\t46152300\t0.0887\t99\nchr3\t46174800\t46175100\t0.3377\t52\nchr3\t46495200\t46495500\t0.3215\t77\nchr3\t46508400\t46508700\t0.5712\t58\nchr3\t46772700\t46774500\t0.0041\t93\nchr3\t46783200\t46788600\t0\t101\nchr3\t46800900\t46801800\t0.0069\t63\nchr3\t47259600\t47260500\t0.2729\t87\nchr3\t48055500\t48057600\t0.0415\t92\nchr3\t48202500\t48202800\t0.6\t47\nchr3\t48210600\t48213300\t0.0045\t86\nchr3\t48615600\t48615900\t0.436\t44\nchr3\t48843900\t48844800\t0.3393\t75\nchr3\t49160400\t49160700\t0.4418\t48\nchr3\t49456800\t49457100\t0.2502\t37\nchr3\t50084400\t50085600\t0.3501\t67\nchr3\t50887200\t50887800\t0.1505\t63\nchr3\t50897700\t50898300\t0.1061\t58\nchr3\t50973300\t50977200\t0.0895\t77\nchr3\t51201000\t51201300\t0.5051\t68\nchr3\t51204000\t51204900\t0.1295\t76\nchr3\t51527100\t51527400\t0.5266\t97\nchr3\t51863400\t51864900\t0.0144\t67\nchr3\t52499700\t52500000\t0.4033\t51\nchr3\t52675800\t52676100\t0.1508\t32\nchr3\t52898400\t52898700\t0.4094\t57\nchr3\t53365500\t53370900\t0\t99\nchr3\t53691600\t53691900\t0.5446\t11\nchr3\t53921700\t53926800\t0.1434\t94\nchr3\t54287400\t54287700\t0.228\t60\nchr3\t54394500\t54400200\t0\t96\nchr3\t54459300\t54460200\t0.3417\t70\nchr3\t54809400\t54809700\t0.3215\t38\nchr3\t55046100\t55051200\t0\t64\nchr3\t55137600\t55142100\t0\t92\nchr3\t55833900\t55834200\t0.3806\t80\nchr3\t56514000\t56515500\t0.0439\t79\nchr3\t56543400\t56544000\t0.043\t73\nchr3\t57028200\t57028800\t0.1478\t76\nchr3\t57250800\t57251100\t0.5097\t42\nchr3\t57329400\t57329700\t0.2461\t70\nchr3\t57448800\t57449100\t0.5912\t63\nchr3\t57747000\t57748800\t0.3045\t53\nchr3\t58549200\t58551000\t0.1293\t82\nchr3\t58815300\t58815600\t0.3912\t82\nchr3\t58817400\t58819800\t0.1562\t104\nchr3\t58821600\t58822200\t0.1562\t104\nchr3\t58843800\t58848300\t0.0513\t125\nchr3\t58854600\t58855200\t0.2609\t76\nchr3\t58870500\t58870800\t0.3596\t43\nchr3\t58889700\t58891200\t0.0485\t75\nchr3\t59127900\t59128200\t0.5224\t48\nchr3\t60098100\t60098400\t0.2452\t51\nchr3\t60377400\t60377700\t0.5761\t34\nchr3\t60713100\t60713700\t0.4547\t77\nchr3\t60860100\t60860400\t0.5276\t52\nchr3\t61397700\t61400100\t0.0028\t78\nchr3\t61672200\t61672500\t0.2102\t76\nchr3\t62599500\t62599800\t0.0131\t24\nchr3\t62847300\t62851800\t0.0021\t141\nchr3\t63136500\t63142200\t0\t141\nchr3\t63153000\t63155700\t0\t97\nchr3\t63211800\t63217500\t0\t112\nchr3\t63589500\t63591900\t0.0087\t237\nchr3\t63736800\t63738600\t0.0895\t83\nchr3\t63780900\t63781200\t0.2278\t62\nchr3\t64982100\t64982700\t0.4302\t63\nchr3\t65510400\t65514600\t0.0188\t113\nchr3\t65697300\t65699700\t0.0623\t92\nchr3\t66063600\t66063900\t0.0622\t32\nchr3\t66170700\t66171000\t0.5108\t46\nchr3\t66874200\t66874800\t0.0157\t23\nchr3\t67152900\t67153500\t0.3543\t75\nchr3\t67264800\t67265400\t0.3095\t87\nchr3\t67443600\t67446300\t0.0714\t67\nchr3\t67814400\t67815600\t0.08\t119\nchr3\t67903200\t67904400\t0.4069\t64\nchr3\t68076900\t68077500\t0.1096\t82\nchr3\t68123700\t68124000\t0.563\t60\nchr3\t68613300\t68613600\t0.3556\t43\nchr3\t69313800\t69314100\t0.4458\t52\nchr3\t69437700\t69438000\t0.0638\t43\nchr3\t69478800\t69479100\t0.5213\t54\nchr3\t69628200\t69628500\t0.2672\t52\nchr3\t70287000\t70289700\t0.1145\t83\nchr3\t70448100\t70448400\t0.5513\t77\nchr3\t71435400\t71436000\t0.1199\t186\nchr3\t72431100\t72431400\t0.667\t41\nchr3\t72730800\t72731400\t0.3954\t56\nchr3\t72736200\t72736500\t0.405\t48\nchr3\t74087100\t74087400\t0.5368\t65\nchr3\t74451900\t74452500\t0.1467\t83\nchr3\t74454000\t74454600\t0.1467\t83\nchr3\t74589300\t74589900\t0.1245\t111\nchr3\t74703000\t74703300\t0.0619\t128\nchr3\t74716200\t74716500\t0.3126\t32\nchr3\t74955600\t74955900\t0.0772\t76\nchr3\t74970000\t74971200\t0.1122\t54\nchr3\t75000000\t75000300\t0.3667\t43\nchr3\t75065100\t75065400\t0.6897\t43\nchr3\t75092100\t75096000\t0.0578\t77\nchr3\t75120000\t75120600\t0.085\t147\nchr3\t75121800\t75123000\t0.085\t147\nchr3\t75275700\t75276300\t0.3866\t67\nchr3\t75566700\t75567900\t0.5827\t47\nchr3\t75638100\t75638700\t0.4269\t96\nchr3\t75668700\t75669300\t0.5798\t5232\nchr3\t75685200\t75685500\t0.653\t108\nchr3\t75750000\t75750300\t0.6744\t97\nchr3\t75752100\t75753900\t0.5649\t211\nchr3\t75846900\t75847200\t0.2396\t63\nchr3\t75867000\t75867300\t0.358\t70\nchr3\t76059000\t76059300\t0.5038\t64\nchr3\t76149900\t76150200\t0.6217\t54\nchr3\t76414500\t76414800\t0.4862\t36\nchr3\t76619100\t76619400\t0.4725\t61\nchr3\t76730700\t76731000\t0.1813\t17\nchr3\t77165100\t77165400\t0.5127\t51\nchr3\t77290200\t77290800\t0.3021\t38\nchr3\t77428200\t77428500\t0.6276\t38\nchr3\t77655900\t77656200\t0.4935\t62\nchr3\t77763900\t77769600\t0\t100\nchr3\t78489900\t78492000\t0.2\t82\nchr3\t78582300\t78583800\t0.0264\t28\nchr3\t78680700\t78681000\t0.4416\t69\nchr3\t78795900\t78796500\t0.0674\t62\nchr3\t78948900\t78949500\t0.2451\t61\nchr3\t79129800\t79134900\t0\t92\nchr3\t79612200\t79612500\t0.4248\t65\nchr3\t80320800\t80321100\t0.4224\t51\nchr3\t80441400\t80442600\t0.0523\t70\nchr3\t80837100\t80838000\t0.2232\t94\nchr3\t80876100\t80877300\t0\t82\nchr3\t80892600\t80897100\t0.0768\t75\nchr3\t81051600\t81057300\t0\t110\nchr3\t81487500\t81488100\t0.2296\t78\nchr3\t81576000\t81576300\t0.4841\t43\nchr3\t81720900\t81721200\t0.0618\t44\nchr3\t81738000\t81738300\t0.4135\t85\nchr3\t81858300\t81858600\t0.2582\t20\nchr3\t82152900\t82154100\t0.0256\t51\nchr3\t82300800\t82301100\t0.4357\t64\nchr3\t82334400\t82336800\t0.3552\t65\nchr3\t82338300\t82339200\t0.1141\t74\nchr3\t82465200\t82465500\t0.1938\t13\nchr3\t82866900\t82867500\t0.1967\t70\nchr3\t83037900\t83039400\t0\t100\nchr3\t83804100\t83806200\t0\t75\nchr3\t84508500\t84508800\t0.6196\t76\nchr3\t85104000\t85104300\t0.457\t55\nchr3\t85154700\t85155000\t0.4579\t82\nchr3\t85293300\t85293900\t0.2743\t57\nchr3\t85897200\t85897500\t0.3459\t48\nchr3\t86018100\t86019600\t0.044\t70\nchr3\t86860200\t86860500\t0.1175\t60\nchr3\t87481500\t87482400\t0.1325\t82\nchr3\t87844500\t87845700\t0.0908\t89\nchr3\t88050300\t88050600\t0.58\t35\nchr3\t88119000\t88119300\t0.2824\t71\nchr3\t88503600\t88504200\t0.179\t94\nchr3\t88505700\t88506600\t0.179\t94\nchr3\t88508400\t88508700\t0.179\t94\nchr3\t88551900\t88552200\t0.2832\t89\nchr3\t88629900\t88630200\t0.4232\t40\nchr3\t88872000\t88873800\t0.1663\t92\nchr3\t89219700\t89220000\t0.3354\t45\nchr3\t89345700\t89351700\t0.0094\t88\nchr3\t89460600\t89466900\t0\t136\nchr3\t89610900\t89611200\t0.4693\t35\nchr3\t89752800\t89753100\t0.3209\t70\nchr3\t89869200\t89874600\t0.0022\t91\nchr3\t89941500\t89943900\t0.3604\t66\nchr3\t89960100\t89960400\t0.0181\t109\nchr3\t89961600\t89962200\t0.0181\t109\nchr3\t89984700\t89985000\t0.3441\t52\nchr3\t90156600\t90156900\t0.3752\t93\nchr3\t90169500\t90175500\t0.0053\t202\nchr3\t90290700\t90291000\t0.6394\t125\nchr3\t90298200\t90298500\t0.678\t112\nchr3\t90303900\t90305100\t0.2483\t101\nchr3\t90334500\t90334800\t0.2837\t75\nchr3\t90336000\t90339300\t0\t94\nchr3\t90394200\t90394500\t0.6389\t75\nchr3\t90404400\t90404700\t0.6985\t97\nchr3\t90406200\t90408600\t0.0956\t184\nchr3\t90410400\t90410700\t0.6967\t150\nchr3\t90419100\t90419700\t0.2852\t88\nchr3\t90443100\t90443400\t0.5502\t165\nchr3\t90455700\t90456000\t0.6751\t126\nchr3\t90457800\t90458100\t0.655\t90\nchr3\t90478200\t90478500\t0.621\t88\nchr3\t90480000\t90480300\t0.6196\t153\nchr3\t90485100\t90486600\t0.6422\t118\nchr3\t90498000\t90498300\t0.6828\t145\nchr3\t90506100\t90506400\t0.6401\t174\nchr3\t90507900\t90508200\t0.6643\t136\nchr3\t90510000\t90511500\t0.4989\t409\nchr3\t90513000\t90515700\t0\t206\nchr3\t90517800\t90518100\t0.673\t99\nchr3\t90519300\t90524100\t0.5614\t402\nchr3\t90525300\t90526200\t0.0064\t70\nchr3\t90527400\t90527700\t0.6869\t120\nchr3\t90529800\t90532200\t0.5416\t238\nchr3\t90533400\t90536100\t0.4972\t238\nchr3\t90537900\t90541200\t0.6167\t449\nchr3\t90542400\t90543900\t0.3575\t693\nchr3\t90545400\t90546000\t0.3575\t693\nchr3\t90547500\t90548100\t0.643\t178\nchr3\t90549300\t90555300\t0.5919\t200\nchr3\t90558900\t90559800\t0.1323\t115\nchr3\t90561300\t90565200\t0\t303\nchr3\t90568800\t90569400\t0\t40\nchr3\t90571800\t90573000\t0.6632\t101\nchr3\t90575100\t90579900\t0.5248\t404\nchr3\t90581700\t90583500\t0.1733\t299\nchr3\t90584700\t90593400\t0.273\t292\nchr3\t90596100\t90596400\t0.6797\t78\nchr3\t90598800\t90599100\t0.6896\t95\nchr3\t90601200\t90602100\t0.6197\t197\nchr3\t90604800\t90605400\t0.6327\t195\nchr3\t90610200\t90614700\t0.5678\t238\nchr3\t90616200\t90621900\t0.4764\t389\nchr3\t90623100\t90624000\t0.5558\t228\nchr3\t90627000\t90628500\t0.5623\t132\nchr3\t90629700\t90630600\t0.6568\t117\nchr3\t90632700\t90635400\t0.5042\t477\nchr3\t90637200\t90638700\t0.5881\t161\nchr3\t90640500\t90642300\t0.4967\t165\nchr3\t90643800\t90644100\t0.609\t137\nchr3\t90645600\t90648000\t0.3353\t155\nchr3\t90650100\t90657300\t0.5925\t517\nchr3\t90660000\t90660300\t0.6554\t352\nchr3\t90662400\t90666000\t0.532\t176\nchr3\t90667800\t90687000\t0.095\t600\nchr3\t90688200\t90711900\t0.1068\t218\nchr3\t90713700\t90721200\t0\t348\nchr3\t90772500\t90777600\t0\t256\nchr3\t90778800\t90832200\t0\t1009\nchr3\t90833400\t90847500\t0\t1009\nchr3\t90849000\t90885000\t0\t994\nchr3\t90886200\t90892200\t0\t772\nchr3\t90894000\t90961800\t0\t494\nchr3\t90963300\t90975300\t0\t494\nchr3\t90976500\t91039200\t0\t637\nchr3\t91040400\t91050900\t0\t637\nchr3\t91052400\t91057200\t0\t637\nchr3\t91058700\t91059000\t0\t637\nchr3\t91060200\t91061700\t0\t383\nchr3\t91063200\t91075200\t0\t383\nchr3\t91076700\t91085700\t0\t415\nchr3\t91086900\t91103700\t0\t415\nchr3\t91104900\t91105800\t0\t415\nchr3\t91107000\t91110600\t0\t78\nchr3\t91112400\t91115700\t0.0243\t101\nchr3\t91118100\t91122300\t0\t172\nchr3\t91123500\t91125600\t0\t526\nchr3\t91126800\t91137300\t0\t526\nchr3\t91138800\t91149600\t0\t526\nchr3\t91150800\t91152900\t0\t526\nchr3\t91154400\t91155300\t0.0195\t356\nchr3\t91156500\t91156800\t0\t156\nchr3\t91158900\t91171800\t0\t420\nchr3\t91173300\t91180500\t0\t420\nchr3\t91181700\t91197600\t0\t836\nchr3\t91198800\t91201200\t0\t202\nchr3\t91202400\t91208700\t0\t202\nchr3\t91210200\t91210500\t0\t202\nchr3\t91211700\t91212300\t0\t398\nchr3\t91213500\t91225800\t0\t398\nchr3\t91229100\t91233900\t0\t247\nchr3\t91235700\t91236600\t0\t81\nchr3\t91238100\t91243200\t0\t374\nchr3\t91244700\t91247400\t0.0016\t343\nchr3\t91248900\t91249800\t0.0016\t343\nchr3\t91256400\t91257000\t0.0758\t62\nchr3\t91260300\t91261200\t0\t18\nchr3\t91262400\t91264500\t0.2464\t68\nchr3\t91277700\t91285800\t0\t210\nchr3\t91385100\t91385700\t0.0246\t46\nchr3\t91392900\t91394700\t0.1413\t67\nchr3\t91425900\t91426200\t0.4999\t61\nchr3\t91519200\t91522200\t0.5685\t160\nchr3\t91523400\t91523700\t0.694\t107\nchr3\t91526100\t91526400\t0.68\t110\nchr3\t91533000\t91533300\t0.5808\t178\nchr3\t91542600\t91713900\t0\t2208\nchr3\t91715100\t93026400\t0\t2208\nchr3\t93027600\t93655500\t0\t2208\nchr3\t93705600\t93713400\t0\t163\nchr3\t93717000\t93717300\t0.2699\t17\nchr3\t93727800\t93728100\t0.4078\t77\nchr3\t93748500\t93749100\t0.4217\t67\nchr3\t93766200\t93766500\t0.6898\t96\nchr3\t93778200\t93778500\t0.5541\t203\nchr3\t93783300\t93785100\t0.6172\t154\nchr3\t93789300\t93791400\t0.0115\t83\nchr3\t93792600\t93792900\t0.653\t132\nchr3\t94238700\t94240500\t0.271\t84\nchr3\t94439100\t94439700\t0.3285\t92\nchr3\t94749000\t94751100\t0.1558\t74\nchr3\t94850400\t94850700\t0.1895\t74\nchr3\t95166300\t95166900\t0.5884\t48\nchr3\t95397300\t95397600\t0.3389\t44\nchr3\t95661600\t95662200\t0.4015\t66\nchr3\t95802900\t95803800\t0.2133\t68\nchr3\t95805000\t95805600\t0.2133\t68\nchr3\t95853000\t95853600\t0.4517\t74\nchr3\t96079800\t96080100\t0.3002\t74\nchr3\t96163800\t96164100\t0.3784\t61\nchr3\t97598700\t97600500\t0.1935\t85\nchr3\t97641900\t97642500\t0.1939\t69\nchr3\t97644300\t97645500\t0.1939\t69\nchr3\t97716300\t97716600\t0.2898\t56\nchr3\t97906200\t97907700\t0.1516\t84\nchr3\t97909200\t97910100\t0.3219\t70\nchr3\t98176200\t98176500\t0.4594\t12\nchr3\t98178300\t98178600\t0.5094\t61\nchr3\t98466000\t98467800\t0.0842\t74\nchr3\t98766300\t98766600\t0.6648\t78\nchr3\t98835000\t98835600\t0.1642\t67\nchr3\t98836800\t98838600\t0.1642\t67\nchr3\t99038400\t99038700\t0.5636\t29\nchr3\t99273000\t99274200\t0.2275\t86\nchr3\t99290100\t99290400\t0.4598\t73\nchr3\t99291600\t99291900\t0.2858\t74\nchr3\t99293100\t99293400\t0.2858\t74\nchr3\t99318600\t99318900\t0.0277\t36\nchr3\t99362700\t99363300\t0.3046\t103\nchr3\t99371100\t99371700\t0.21\t63\nchr3\t100066500\t100066800\t0.5893\t28\nchr3\t100221600\t100221900\t0.2919\t61\nchr3\t100473300\t100474200\t0.1035\t81\nchr3\t100514700\t100515300\t0.4423\t87\nchr3\t100572600\t100572900\t0.4031\t67\nchr3\t100587900\t100588200\t0.3152\t35\nchr3\t101145600\t101145900\t0.2928\t66\nchr3\t101198400\t101198700\t0.1679\t61\nchr3\t101439000\t101440500\t0.024\t81\nchr3\t101694000\t101694600\t0.1036\t61\nchr3\t101697900\t101698200\t0.4495\t144\nchr3\t101700000\t101700300\t0.5994\t110\nchr3\t101746200\t101747100\t0.1855\t76\nchr3\t101749500\t101750400\t0.2185\t56\nchr3\t101797500\t101798100\t0.0682\t76\nchr3\t102216300\t102216600\t0.3965\t68\nchr3\t102495600\t102495900\t0.1516\t57\nchr3\t102564900\t102565200\t0.2746\t48\nchr3\t103028400\t103028700\t0.388\t91\nchr3\t103131600\t103132800\t0.3553\t60\nchr3\t103220700\t103226400\t0\t64\nchr3\t103233000\t103236600\t0\t102\nchr3\t103556400\t103562400\t0\t118\nchr3\t103710900\t103711200\t0.4327\t68\nchr3\t103829100\t103829400\t0.2573\t29\nchr3\t105297600\t105301200\t0.0742\t63\nchr3\t105521100\t105521400\t0.5192\t61\nchr3\t105563700\t105564000\t0.2727\t50\nchr3\t105587400\t105592200\t0\t101\nchr3\t106072800\t106074000\t0.333\t39\nchr3\t106110300\t106111200\t0.032\t75\nchr3\t106112400\t106112700\t0.2326\t26\nchr3\t106665900\t106668000\t0.0646\t106\nchr3\t106669800\t106670400\t0.0646\t106\nchr3\t106950300\t106950900\t0.0951\t73\nchr3\t106976100\t106981200\t0.0067\t91\nchr3\t107338800\t107339100\t0.2821\t60\nchr3\t107583600\t107583900\t0.6071\t51\nchr3\t107692800\t107695500\t0.0821\t85\nchr3\t107886000\t107889000\t0.0324\t133\nchr3\t108259800\t108260100\t0.4548\t70\nchr3\t108261600\t108261900\t0.4563\t79\nchr3\t108263100\t108263400\t0.4563\t79\nchr3\t108372300\t108372600\t0.4291\t61\nchr3\t108373800\t108375300\t0.1273\t85\nchr3\t108575400\t108576000\t0.4477\t75\nchr3\t108633600\t108633900\t0.6282\t37\nchr3\t108749400\t108755400\t0\t112\nchr3\t109164000\t109164600\t0.3653\t90\nchr3\t109193700\t109194000\t0.6594\t14\nchr3\t109200000\t109205700\t0\t122\nchr3\t109456200\t109456500\t0.3226\t54\nchr3\t109511100\t109511700\t0.4098\t81\nchr3\t109757700\t109758000\t0.2296\t71\nchr3\t109761600\t109762800\t0.3164\t80\nchr3\t110087100\t110087400\t0.5283\t31\nchr3\t110117700\t110120700\t0\t106\nchr3\t110348100\t110348400\t0.3224\t93\nchr3\t110441400\t110445900\t0.0056\t76\nchr3\t110633100\t110636400\t0.0342\t81\nchr3\t110889900\t110890500\t0.0972\t38\nchr3\t110912100\t110912400\t0.6445\t58\nchr3\t110914800\t110915100\t0.4852\t67\nchr3\t111019800\t111024600\t0.0127\t83\nchr3\t111388200\t111388500\t0.4047\t65\nchr3\t111490200\t111490500\t0.454\t60\nchr3\t111491700\t111492600\t0.0979\t81\nchr3\t111556800\t111561900\t0\t84\nchr3\t111753000\t111756000\t0.1915\t90\nchr3\t111830400\t111830700\t0.3942\t52\nchr3\t112162800\t112163400\t0.181\t98\nchr3\t112183500\t112184400\t0\t77\nchr3\t112205700\t112206000\t0.6179\t34\nchr3\t112419600\t112420200\t0.5819\t47\nchr3\t112659600\t112661100\t0.3693\t83\nchr3\t112662600\t112664100\t0.406\t72\nchr3\t112727700\t112728000\t0.4097\t86\nchr3\t112729200\t112729800\t0.4097\t86\nchr3\t113024400\t113033400\t0\t90\nchr3\t113049300\t113049600\t0.5024\t72\nchr3\t113476500\t113476800\t0.3351\t67\nchr3\t114280200\t114282600\t0.1078\t91\nchr3\t114662400\t114663300\t0.2781\t73\nchr3\t114747600\t114747900\t0.2771\t16\nchr3\t115305600\t115305900\t0.6308\t25\nchr3\t115312800\t115313100\t0.5331\t97\nchr3\t115315200\t115315800\t0.1317\t80\nchr3\t115670100\t115670400\t0.4883\t39\nchr3\t116204700\t116206500\t0.0591\t94\nchr3\t116208000\t116208300\t0.0591\t94\nchr3\t116360100\t116365800\t0\t95\nchr3\t116427000\t116427300\t0.5107\t49\nchr3\t116459100\t116459400\t0.4365\t52\nchr3\t116507700\t116508000\t0.4063\t79\nchr3\t116644500\t116646000\t0.0096\t61\nchr3\t116986200\t116986500\t0.2677\t76\nchr3\t117112200\t117112500\t0.3583\t49\nchr3\t117309900\t117310200\t0.3353\t58\nchr3\t117335400\t117335700\t0.2238\t79\nchr3\t118049100\t118049400\t0.3763\t77\nchr3\t118845300\t118845900\t0.2126\t67\nchr3\t118854900\t118855200\t0.5498\t37\nchr3\t118914600\t118916100\t0.0214\t384\nchr3\t118917600\t118920000\t0.0214\t384\nchr3\t119001900\t119003400\t0.0697\t77\nchr3\t119004600\t119007300\t0.0697\t77\nchr3\t119049900\t119050200\t0.1986\t64\nchr3\t119107800\t119109300\t0.0837\t115\nchr3\t120373500\t120377700\t0\t83\nchr3\t120414600\t120414900\t0.3571\t28\nchr3\t120575100\t120580500\t0\t91\nchr3\t120582900\t120583200\t0.5175\t58\nchr3\t121032600\t121033500\t0.0589\t118\nchr3\t121088100\t121089000\t0.0712\t87\nchr3\t121314000\t121314600\t0.4535\t78\nchr3\t121401300\t121401900\t0.355\t49\nchr3\t121455000\t121455600\t0.2073\t88\nchr3\t121522200\t121522500\t0.359\t41\nchr3\t121689300\t121689600\t0.3781\t75\nchr3\t121932900\t121934100\t0.3336\t72\nchr3\t121936500\t121937700\t0.0666\t79\nchr3\t122042100\t122047200\t0.0079\t103\nchr3\t122072100\t122072400\t0.2744\t74\nchr3\t122134500\t122134800\t0.2949\t66\nchr3\t122163900\t122165700\t0.2129\t61\nchr3\t122419500\t122419800\t0.5913\t50\nchr3\t122670300\t122670600\t0.1885\t65\nchr3\t122780100\t122780400\t0.349\t54\nchr3\t123478800\t123479100\t0.2542\t34\nchr3\t123517800\t123518100\t0.5432\t36\nchr3\t123966900\t123967200\t0.5064\t59\nchr3\t123975300\t123975600\t0.3509\t66\nchr3\t123991200\t123992400\t0.1243\t66\nchr3\t124109700\t124110300\t0.2977\t34\nchr3\t124153200\t124153500\t0.4717\t89\nchr3\t124366200\t124368300\t0.0226\t69\nchr3\t124628100\t124628400\t0.6889\t19\nchr3\t124749300\t124750500\t0.4194\t69\nchr3\t124789500\t124790400\t0\t55\nchr3\t125007000\t125007300\t0.5098\t68\nchr3\t125100600\t125100900\t0.5411\t36\nchr3\t125171100\t125172000\t0.0808\t47\nchr3\t125891400\t125891700\t0.3334\t59\nchr3\t125938800\t125939700\t0.0197\t114\nchr3\t125941500\t125942400\t0.0197\t114\nchr3\t125968500\t125970300\t0.0304\t78\nchr3\t125976900\t125977200\t0.2409\t71\nchr3\t125985000\t125985300\t0.3591\t55\nchr3\t125986500\t125986800\t0.4936\t37\nchr3\t126221700\t126222300\t0.3513\t80\nchr3\t126324000\t126326400\t0.0034\t76\nchr3\t126332400\t126337500\t0.0103\t124\nchr3\t127433700\t127435200\t0.0205\t102\nchr3\t127592400\t127592700\t0.4328\t55\nchr3\t127611600\t127611900\t0.5021\t36\nchr3\t128953800\t128956200\t0.0065\t70\nchr3\t129087600\t129090900\t0\t80\nchr3\t129361800\t129363300\t0.3987\t71\nchr3\t130160400\t130160700\t0.6164\t31\nchr3\t130238700\t130239000\t0.4675\t63\nchr3\t130254600\t130254900\t0.4517\t71\nchr3\t130499400\t130499700\t0.2365\t17\nchr3\t130628700\t130634100\t0\t95\nchr3\t130868400\t130869300\t0.3492\t59\nchr3\t130910400\t130912800\t0.0661\t61\nchr3\t131097600\t131097900\t0.3786\t66\nchr3\t131274000\t131274300\t0.1955\t55\nchr3\t131334300\t131334600\t0.2766\t77\nchr3\t131408100\t131410800\t0\t97\nchr3\t131814600\t131814900\t0.3566\t43\nchr3\t131958900\t131959200\t0.4749\t35\nchr3\t132100500\t132101100\t0.4531\t52\nchr3\t132127800\t132128100\t0.2333\t101\nchr3\t132138000\t132139500\t0.3424\t72\nchr3\t132277200\t132277500\t0.5281\t62\nchr3\t132374100\t132375900\t0.1201\t85\nchr3\t132470100\t132472200\t0.0191\t107\nchr3\t132601200\t132601800\t0.4537\t71\nchr3\t132633900\t132634200\t0.4253\t80\nchr3\t132762000\t132762300\t0.4063\t83\nchr3\t132763500\t132763800\t0.3745\t63\nchr3\t132765000\t132765900\t0.3564\t84\nchr3\t132799200\t132799500\t0.5704\t79\nchr3\t132807000\t132810000\t0\t79\nchr3\t132882000\t132882300\t0.6783\t67\nchr3\t132946200\t132951900\t0\t83\nchr3\t133001400\t133001700\t0.3968\t77\nchr3\t133473600\t133473900\t0.489\t59\nchr3\t133555800\t133556400\t0.3162\t72\nchr3\t133727400\t133727700\t0.1296\t37\nchr3\t133785000\t133786200\t0.0023\t53\nchr3\t134554200\t134554500\t0.6204\t49\nchr3\t134555700\t134556300\t0.159\t77\nchr3\t134701200\t134701500\t0.5449\t27\nchr3\t134955000\t134955600\t0\t36\nchr3\t135025200\t135030000\t0.154\t80\nchr3\t135195600\t135196200\t0.2333\t76\nchr3\t135252600\t135254400\t0.0387\t90\nchr3\t135255600\t135257100\t0.2834\t69\nchr3\t135282000\t135282600\t0.3194\t65\nchr3\t135284100\t135284400\t0.3194\t65\nchr3\t135400200\t135401400\t0.3683\t73\nchr3\t135586800\t135587100\t0.026\t102\nchr3\t135588300\t135590400\t0.026\t102\nchr3\t135659700\t135664500\t0.0002\t84\nchr3\t135677400\t135678000\t0.3076\t83\nchr3\t135824100\t135824400\t0.2485\t63\nchr3\t135933000\t135933600\t0.284\t80\nchr3\t136063500\t136064100\t0.5184\t67\nchr3\t136227000\t136227600\t0.2087\t82\nchr3\t136479600\t136485000\t0\t82\nchr3\t136531200\t136531500\t0.549\t71\nchr3\t136875600\t136875900\t0.3474\t89\nchr3\t136963500\t136969500\t0\t97\nchr3\t137043300\t137043900\t0.2604\t66\nchr3\t137094000\t137095800\t0\t84\nchr3\t137152500\t137152800\t0.1806\t69\nchr3\t137191800\t137192100\t0.6368\t84\nchr3\t137310300\t137310600\t0.5235\t69\nchr3\t137353500\t137354700\t0.0016\t83\nchr3\t137455200\t137460600\t0.007\t84\nchr3\t137633700\t137638800\t0\t83\nchr3\t137759100\t137759400\t0.5163\t57\nchr3\t138050700\t138051000\t0.4981\t109\nchr3\t138662400\t138662700\t0.3175\t75\nchr3\t139067100\t139068300\t0.3536\t57\nchr3\t139143600\t139144200\t0.0368\t98\nchr3\t139145700\t139146000\t0.3107\t71\nchr3\t139191300\t139191600\t0.2989\t68\nchr3\t139334400\t139334700\t0.2195\t71\nchr3\t139335900\t139336500\t0.0362\t61\nchr3\t139593600\t139593900\t0.1429\t97\nchr3\t139800600\t139800900\t0.4274\t87\nchr3\t140171400\t140172000\t0.5445\t41\nchr3\t140490000\t140490300\t0.4378\t114\nchr3\t140548800\t140549100\t0.4856\t75\nchr3\t140550300\t140550600\t0.4856\t75\nchr3\t140783700\t140784000\t0.1555\t31\nchr3\t140786400\t140786700\t0.5093\t52\nchr3\t141112500\t141112800\t0.5752\t34\nchr3\t141665700\t141666000\t0.4752\t15\nchr3\t141757200\t141762000\t0\t97\nchr3\t142010700\t142011600\t0.0596\t105\nchr3\t142291500\t142291800\t0.2905\t94\nchr3\t142295700\t142296000\t0.2905\t94\nchr3\t142393200\t142393500\t0.2477\t64\nchr3\t142554900\t142555500\t0.5342\t369\nchr3\t143046600\t143047500\t0.236\t56\nchr3\t143085900\t143086200\t0.2698\t55\nchr3\t144739500\t144739800\t0.2884\t78\nchr3\t145253100\t145253400\t0.2421\t62\nchr3\t145460100\t145461600\t0.2211\t83\nchr3\t145494600\t145494900\t0.4577\t62\nchr3\t145576200\t145576800\t0.369\t75\nchr3\t145821600\t145823100\t0.2276\t73\nchr3\t145921800\t145922400\t0.2651\t79\nchr3\t145928700\t145929600\t0.0174\t71\nchr3\t145930800\t145932900\t0.0859\t128\nchr3\t146096100\t146097900\t0.2049\t62\nchr3\t146732700\t146735100\t0.0033\t214\nchr3\t147096300\t147096900\t0.3376\t64\nchr3\t147108600\t147109200\t0.3218\t85\nchr3\t147726900\t147727500\t0.1788\t44\nchr3\t148303800\t148304400\t0.2675\t72\nchr3\t148430100\t148431300\t0.1373\t80\nchr3\t148451700\t148452000\t0.6033\t21\nchr3\t148563600\t148567500\t0.0246\t84\nchr3\t149380800\t149381100\t0.4826\t66\nchr3\t149804700\t149805000\t0.3369\t72\nchr3\t149829900\t149830800\t0.0023\t61\nchr3\t149838900\t149839500\t0.0336\t73\nchr3\t149982000\t149982300\t0.3908\t58\nchr3\t150160200\t150160500\t0.6023\t35\nchr3\t150493200\t150493500\t0.2986\t36\nchr3\t150615900\t150616500\t0.0796\t92\nchr3\t150819300\t150822000\t0.0012\t94\nchr3\t151244400\t151245900\t0.3025\t80\nchr3\t151353900\t151354200\t0.6005\t54\nchr3\t151613700\t151614000\t0.5192\t82\nchr3\t151887600\t151888200\t0.3013\t60\nchr3\t151898400\t151898700\t0.1282\t68\nchr3\t152249100\t152249400\t0.23\t86\nchr3\t152250600\t152250900\t0.23\t86\nchr3\t152594100\t152595300\t0.0473\t74\nchr3\t153114000\t153114300\t0.256\t86\nchr3\t153237300\t153238200\t0.2879\t75\nchr3\t153240300\t153240600\t0.1275\t68\nchr3\t153510600\t153511200\t0.3162\t98\nchr3\t153549300\t153549900\t0.4461\t66\nchr3\t153801600\t153801900\t0.302\t75\nchr3\t153999000\t153999600\t0.0924\t97\nchr3\t154216800\t154217100\t0.3575\t74\nchr3\t154290900\t154291200\t0.482\t50\nchr3\t154418100\t154418400\t0.3147\t81\nchr3\t154911000\t154914600\t0\t91\nchr3\t155119500\t155123700\t0.0161\t91\nchr3\t155210100\t155210400\t0.1638\t80\nchr3\t155439000\t155439600\t0.3305\t79\nchr3\t155471400\t155471700\t0.1555\t81\nchr3\t155472900\t155475000\t0.1555\t81\nchr3\t155506500\t155511300\t0\t78\nchr3\t155543700\t155545200\t0.2676\t80\nchr3\t155546700\t155547300\t0.2894\t54\nchr3\t155693100\t155693400\t0.5046\t50\nchr3\t155928600\t155930700\t0.241\t72\nchr3\t156279900\t156282900\t0.2806\t81\nchr3\t156395400\t156395700\t0.415\t68\nchr3\t156881400\t156882300\t0.2435\t82\nchr3\t157727700\t157729500\t0.1335\t85\nchr3\t157883400\t157883700\t0.3656\t59\nchr3\t157901400\t157902300\t0.1973\t88\nchr3\t158020500\t158025600\t0\t112\nchr3\t158228700\t158229000\t0.5695\t72\nchr3\t158399100\t158399400\t0.3695\t29\nchr3\t158424900\t158425200\t0.4201\t81\nchr3\t158512200\t158513100\t0.2617\t102\nchr3\t158635200\t158640600\t0.0073\t82\nchr3\t158957400\t158957700\t0.3109\t39\nchr3\t159056400\t159056700\t0.3599\t56\nchr3\t159085500\t159085800\t0.5001\t72\nchr3\t159095400\t159101100\t0\t110\nchr3\t159383100\t159384300\t0.3672\t73\nchr3\t159396300\t159397200\t0.2829\t74\nchr3\t159427200\t159427500\t0.3518\t80\nchr3\t160323000\t160323300\t0.2884\t65\nchr3\t160324800\t160325100\t0.1685\t76\nchr3\t160974600\t160976700\t0.2271\t58\nchr3\t161002500\t161004900\t0.1135\t70\nchr3\t161529000\t161529300\t0.4377\t49\nchr3\t161907600\t161907900\t0.0401\t62\nchr3\t162307800\t162308100\t0.5058\t51\nchr3\t162318900\t162319200\t0.1153\t31\nchr3\t162379500\t162381000\t0.2181\t103\nchr3\t162382200\t162383700\t0.2181\t103\nchr3\t162407100\t162411000\t0.0007\t68\nchr3\t163005000\t163005600\t0.1719\t50\nchr3\t163146600\t163147800\t0.4306\t51\nchr3\t163191900\t163192200\t0.4458\t64\nchr3\t163236900\t163242900\t0\t80\nchr3\t163634400\t163636500\t0.0391\t83\nchr3\t163761600\t163761900\t0.4763\t62\nchr3\t164293500\t164296500\t0.0207\t108\nchr3\t164633100\t164633400\t0.3184\t101\nchr3\t164703600\t164706300\t0.0145\t119\nchr3\t165110100\t165110700\t0.4466\t65\nchr3\t165316200\t165317700\t0.2046\t88\nchr3\t165573300\t165573900\t0.0905\t69\nchr3\t165576300\t165576600\t0.3287\t88\nchr3\t165585900\t165587400\t0.1512\t121\nchr3\t165589200\t165590400\t0.1512\t121\nchr3\t165962400\t165962700\t0.2793\t50\nchr3\t166021200\t166023600\t0.3317\t57\nchr3\t166228500\t166232400\t0.0494\t79\nchr3\t166537800\t166538100\t0.4252\t51\nchr3\t167017500\t167018100\t0.2109\t25\nchr3\t167204400\t167204700\t0.2956\t61\nchr3\t167277900\t167278800\t0.3255\t74\nchr3\t167280300\t167280600\t0.3255\t74\nchr3\t167594700\t167596800\t0.2228\t84\nchr3\t167802600\t167802900\t0.1959\t72\nchr3\t168016800\t168017100\t0.6404\t81\nchr3\t168351600\t168355200\t0\t86\nchr3\t168766200\t168766500\t0.2068\t62\nchr3\t168768300\t168768600\t0.2518\t67\nchr3\t168770400\t168772200\t0.1535\t72\nchr3\t169417200\t169417500\t0.5016\t80\nchr3\t169483500\t169483800\t0.2448\t56\nchr3\t169680000\t169685400\t0.0176\t78\nchr3\t170401800\t170402100\t0.082\t26\nchr3\t170805900\t170806500\t0.0894\t546\nchr3\t170878800\t170882100\t0.0537\t99\nchr3\t170925900\t170927700\t0.202\t86\nchr3\t171449700\t171450000\t0.5226\t47\nchr3\t171503100\t171503400\t0.3044\t25\nchr3\t171628800\t171629100\t0.3597\t75\nchr3\t171630300\t171630900\t0.3597\t75\nchr3\t172094100\t172094400\t0.6461\t65\nchr3\t173852100\t173852400\t0.4478\t45\nchr3\t174260100\t174264600\t0.0559\t88\nchr3\t174484200\t174484800\t0.3384\t70\nchr3\t174829200\t174830400\t0.137\t78\nchr3\t174897900\t174898200\t0.4137\t27\nchr3\t175320900\t175323300\t0.222\t80\nchr3\t175436700\t175437600\t0.0397\t89\nchr3\t175697700\t175698000\t0.6574\t14\nchr3\t175782000\t175783200\t0.2136\t73\nchr3\t175784400\t175785900\t0.2136\t73\nchr3\t175905900\t175906200\t0.3332\t72\nchr3\t176020200\t176021100\t0.5274\t75\nchr3\t176419500\t176419800\t0.3695\t44\nchr3\t176824200\t176824500\t0.3328\t48\nchr3\t176827800\t176829600\t0.2027\t99\nchr3\t176831100\t176831700\t0.1108\t98\nchr3\t176924700\t176925600\t0.2587\t86\nchr3\t177389100\t177394200\t0\t96\nchr3\t177413400\t177413700\t0.5792\t103\nchr3\t177645300\t177645600\t0.5075\t27\nchr3\t177660000\t177660600\t0.3122\t92\nchr3\t178014600\t178014900\t0.5033\t85\nchr3\t178720200\t178720800\t0.2911\t67\nchr3\t178782000\t178782900\t0.064\t73\nchr3\t178862400\t178865700\t0.1265\t90\nchr3\t178938000\t178938300\t0.2562\t59\nchr3\t178940400\t178940700\t0.3587\t68\nchr3\t179119500\t179121900\t0.2563\t91\nchr3\t179130000\t179130900\t0.3429\t82\nchr3\t179243100\t179243400\t0.3352\t51\nchr3\t179727900\t179728200\t0.6842\t63\nchr3\t180375000\t180375300\t0.255\t77\nchr3\t180427200\t180427500\t0.3699\t66\nchr3\t180452100\t180452400\t0.5395\t73\nchr3\t180485400\t180485700\t0.4992\t67\nchr3\t181134300\t181134900\t0.2216\t53\nchr3\t181150500\t181152000\t0.3509\t91\nchr3\t181772700\t181773000\t0.5848\t47\nchr3\t182427000\t182430900\t0.086\t98\nchr3\t182589900\t182590200\t0.4169\t65\nchr3\t183018300\t183018600\t0.6826\t69\nchr3\t183174300\t183174900\t0.1633\t83\nchr3\t183234900\t183238200\t0\t89\nchr3\t183607500\t183609600\t0.0879\t73\nchr3\t183738600\t183740100\t0\t82\nchr3\t184502700\t184503300\t0.5387\t108\nchr3\t184753500\t184755000\t0.1754\t184\nchr3\t185003100\t185003700\t0.2002\t74\nchr3\t185184300\t185184600\t0.6558\t52\nchr3\t185230500\t185231700\t0\t52\nchr3\t185299500\t185299800\t0.4242\t43\nchr3\t185382900\t185383200\t0.6451\t60\nchr3\t185562600\t185571600\t0.0152\t169\nchr3\t185689800\t185690100\t0.6261\t59\nchr3\t186312000\t186312300\t0.5725\t36\nchr3\t186379800\t186380100\t0.3169\t70\nchr3\t186702000\t186702300\t0.6659\t44\nchr3\t186864000\t186867300\t0\t41\nchr3\t187108800\t187109100\t0.1874\t47\nchr3\t187224300\t187224600\t0.5067\t39\nchr3\t187413300\t187418100\t0\t111\nchr3\t187424700\t187428600\t0\t64\nchr3\t187863600\t187864200\t0.2476\t46\nchr3\t187866000\t187868400\t0.0104\t106\nchr3\t187892700\t187895700\t0.0159\t117\nchr3\t188544600\t188545200\t0.0565\t30\nchr3\t188587200\t188587500\t0.5875\t36\nchr3\t188638200\t188639700\t0.448\t82\nchr3\t188755800\t188756100\t0.4878\t87\nchr3\t189007500\t189007800\t0.4351\t65\nchr3\t189018300\t189018600\t0.1641\t71\nchr3\t189020700\t189022500\t0.1641\t71\nchr3\t189445500\t189445800\t0.4206\t48\nchr3\t189519900\t189520200\t0.4787\t72\nchr3\t190200600\t190200900\t0.6725\t20\nchr3\t190287300\t190287600\t0.2128\t84\nchr3\t190572900\t190573200\t0.4056\t51\nchr3\t191042400\t191044500\t0.0141\t103\nchr3\t191465700\t191466000\t0.2646\t54\nchr3\t191467200\t191467500\t0.2646\t54\nchr3\t191550600\t191551800\t0.2473\t97\nchr3\t191863200\t191863500\t0.2387\t53\nchr3\t192138300\t192138600\t0.043\t27\nchr3\t192149400\t192155100\t0.0016\t76\nchr3\t192739200\t192744900\t0.031\t77\nchr3\t192960600\t192963600\t0.0112\t103\nchr3\t193888800\t193889400\t0.1459\t86\nchr3\t194400600\t194401200\t0.0394\t65\nchr3\t194629800\t194630700\t0.6371\t59\nchr3\t194663400\t194663700\t0.2229\t34\nchr3\t194991000\t194991300\t0.6195\t56\nchr3\t195088500\t195088800\t0.0518\t84\nchr3\t195091200\t195093300\t0.0518\t84\nchr3\t195215100\t195218400\t0.0515\t108\nchr3\t195478500\t195505200\t0.0202\t356\nchr3\t195615300\t195619500\t0.109\t155\nchr3\t195624000\t195627000\t0\t153\nchr3\t195629100\t195629400\t0.0409\t109\nchr3\t195630600\t195632100\t0.0409\t109\nchr3\t195634200\t195636900\t0.0276\t151\nchr3\t195638100\t195640800\t0.0507\t127\nchr3\t195644400\t195644700\t0.0046\t243\nchr3\t195650100\t195653100\t0.1548\t144\nchr3\t195658200\t195665100\t0.1629\t123\nchr3\t195666600\t195668100\t0.2635\t104\nchr3\t195670200\t195670500\t0.3124\t51\nchr3\t195679200\t195679500\t0.3445\t89\nchr3\t195681000\t195681900\t0\t139\nchr3\t195688500\t195688800\t0.3216\t81\nchr3\t195710700\t195711300\t0.5225\t453\nchr3\t195712800\t195714300\t0.3956\t370\nchr3\t195723300\t195726000\t0.0018\t124\nchr3\t195750600\t195750900\t0.2404\t89\nchr3\t195771000\t195771300\t0.683\t71\nchr3\t195775500\t195777900\t0.1591\t109\nchr3\t195780600\t195782100\t0.5404\t90\nchr3\t195783300\t195783600\t0.5442\t34\nchr3\t195786900\t195788100\t0.148\t60\nchr3\t195815700\t195816300\t0.1495\t46\nchr3\t195824400\t195825000\t0.0633\t77\nchr3\t195874800\t195875400\t0.6047\t35\nchr3\t195880800\t195881400\t0.4823\t34\nchr3\t195927600\t195928500\t0.003\t78\nchr3\t195936900\t195937500\t0.041\t96\nchr3\t195952200\t195955200\t0.0002\t141\nchr3\t195959700\t195960000\t0.3575\t122\nchr3\t195967200\t195968100\t0\t125\nchr3\t195972900\t195973500\t0.3057\t70\nchr3\t195981000\t195981300\t0.3603\t120\nchr3\t195983400\t195983700\t0.5094\t67\nchr3\t195985800\t195987600\t0.0411\t144\nchr3\t195989100\t195989700\t0.0411\t144\nchr3\t195993900\t195994200\t0.5562\t108\nchr3\t195996300\t195996600\t0.6093\t140\nchr3\t196271700\t196272300\t0.2113\t44\nchr3\t196378800\t196379100\t0.6783\t52\nchr3\t196511400\t196511700\t0.4977\t53\nchr3\t196542300\t196542600\t0.5271\t82\nchr3\t196761000\t196761900\t0.0092\t67\nchr3\t196784400\t196784700\t0.1014\t62\nchr3\t196811100\t196811400\t0.6267\t54\nchr3\t196898700\t196899000\t0.5931\t112\nchr3\t196973700\t196974000\t0.342\t42\nchr3\t197030100\t197030400\t0.3693\t65\nchr3\t197132700\t197133000\t0.2253\t56\nchr3\t197391300\t197391600\t0.6399\t104\nchr3\t197436300\t197438400\t0.0399\t81\nchr3\t197454900\t197455200\t0.5288\t172\nchr3\t197459400\t197460000\t0.3224\t367\nchr3\t197620800\t197621100\t0.342\t81\nchr3\t197622300\t197625300\t0.0517\t189\nchr3\t197626500\t197627700\t0.0517\t189\nchr3\t197630100\t197630400\t0.4958\t71\nchr3\t197631600\t197635800\t0.081\t95\nchr3\t197638200\t197639400\t0.3543\t74\nchr3\t197641800\t197645400\t0.1457\t81\nchr3\t197647800\t197650800\t0\t153\nchr3\t197652600\t197656800\t0\t153\nchr3\t197658300\t197658600\t0\t153\nchr3\t197660400\t197661300\t0.505\t153\nchr3\t197662800\t197667300\t0\t180\nchr3\t197876700\t197877600\t0.0438\t61\nchr3\t197921400\t197921700\t0.6691\t58\nchr3\t198003600\t198005400\t0\t69\nchr3\t198011400\t198011700\t0.305\t67\nchr3\t198015300\t198015600\t0.6202\t60\nchr3\t198099000\t198104100\t0.0506\t101\nchr3\t198141300\t198141900\t0.0632\t98\nchr3\t198143100\t198143700\t0.0632\t98\nchr3\t198145500\t198147000\t0.2599\t72\nchr3\t198149400\t198149700\t0.2599\t72\nchr3\t198152100\t198154800\t0\t84\nchr3\t198156000\t198161700\t0\t84\nchr3\t198162900\t198163200\t0\t84\nchr3\t198164400\t198166500\t0\t84\nchr3\t198168600\t198169200\t0.5476\t197\nchr3\t198171300\t198172500\t0.0788\t57\nchr3\t198175200\t198235500\t0\t99\nchr4\t9900\t10200\t0.2781\t50\nchr4\t11400\t15300\t0\t222\nchr4\t16800\t37200\t0\t222\nchr4\t38700\t41100\t0.0266\t204\nchr4\t42300\t45300\t0.0207\t187\nchr4\t46500\t50700\t0.0207\t187\nchr4\t51900\t68700\t0\t218\nchr4\t151800\t152700\t0.4507\t74\nchr4\t519600\t519900\t0.6895\t40\nchr4\t555000\t555600\t0.5863\t270\nchr4\t668700\t669300\t0.6268\t34\nchr4\t707700\t708000\t0.6043\t44\nchr4\t717000\t717300\t0.5489\t70\nchr4\t731700\t732000\t0.2435\t25\nchr4\t736800\t737100\t0.4942\t39\nchr4\t744900\t747600\t0\t17\nchr4\t758700\t759900\t0\t45\nchr4\t927000\t927600\t0.4274\t44\nchr4\t1046400\t1046700\t0.6635\t130\nchr4\t1054200\t1054800\t0.6566\t42\nchr4\t1095900\t1096500\t0.4014\t53\nchr4\t1145400\t1146000\t0.4971\t55\nchr4\t1240200\t1240500\t0.5042\t33\nchr4\t1278900\t1279200\t0.1125\t34\nchr4\t1333800\t1334100\t0.5044\t41\nchr4\t1335600\t1336200\t0.5617\t57\nchr4\t1356900\t1357200\t0.5537\t88\nchr4\t1364100\t1364400\t0.5897\t52\nchr4\t1397400\t1398600\t0.0603\t231\nchr4\t1429200\t1429500\t0.595\t46\nchr4\t1434300\t1435800\t0.006\t1045\nchr4\t1441500\t1442100\t0\t134\nchr4\t1520700\t1521000\t0.2427\t36\nchr4\t1545300\t1547100\t0\t47\nchr4\t1581000\t1581300\t0.6513\t41\nchr4\t1625100\t1625400\t0.3357\t27\nchr4\t1707000\t1707300\t0.2036\t89\nchr4\t1827300\t1829400\t0.1111\t62\nchr4\t2430000\t2430600\t0.4865\t56\nchr4\t2440200\t2440500\t0.4715\t32\nchr4\t2511300\t2511600\t0.0818\t48\nchr4\t2522100\t2522400\t0.558\t52\nchr4\t2808900\t2809200\t0.121\t20\nchr4\t3227400\t3227700\t0.0368\t55\nchr4\t3309000\t3309300\t0.6946\t40\nchr4\t3509400\t3510000\t0.0035\t85\nchr4\t3511800\t3512100\t0.5968\t28\nchr4\t3537000\t3538200\t0.0804\t50\nchr4\t3540600\t3540900\t0.6031\t78\nchr4\t3542100\t3543000\t0.0374\t46\nchr4\t3610500\t3610800\t0.1545\t34\nchr4\t3613500\t3613800\t0.1628\t33\nchr4\t3876300\t3876600\t0.6393\t60\nchr4\t4020000\t4020900\t0.0537\t64\nchr4\t4023000\t4023600\t0.5823\t39\nchr4\t4068600\t4069200\t0.0963\t67\nchr4\t4414200\t4414500\t0.447\t67\nchr4\t4954800\t4959600\t0.1563\t79\nchr4\t5271900\t5273700\t0.051\t70\nchr4\t5316300\t5317500\t0.0001\t1156\nchr4\t5439000\t5439300\t0.1996\t73\nchr4\t5440800\t5442300\t0.0913\t129\nchr4\t5492400\t5492700\t0.4262\t79\nchr4\t5597700\t5598000\t0.3059\t89\nchr4\t5728200\t5728500\t0.4322\t72\nchr4\t5762400\t5764800\t0.2216\t66\nchr4\t5766300\t5766900\t0.2216\t66\nchr4\t5779500\t5780100\t0.102\t68\nchr4\t6003600\t6004800\t0.6105\t204\nchr4\t6336600\t6336900\t0.6561\t37\nchr4\t6511500\t6512700\t0.4289\t145\nchr4\t6579000\t6579600\t0.3907\t132\nchr4\t6756000\t6756300\t0.473\t69\nchr4\t6879900\t6880200\t0.2808\t98\nchr4\t6977100\t6977400\t0.4885\t49\nchr4\t7090500\t7090800\t0.1894\t50\nchr4\t7363500\t7364100\t0.0795\t38\nchr4\t7386600\t7387500\t0.0186\t62\nchr4\t7449000\t7449300\t0.2517\t35\nchr4\t7482000\t7482300\t0.5922\t21\nchr4\t7543800\t7544100\t0.6565\t85\nchr4\t7695600\t7695900\t0.5761\t80\nchr4\t7835100\t7835700\t0.2975\t57\nchr4\t7863900\t7864200\t0.5451\t521\nchr4\t7994100\t7995000\t0.0634\t73\nchr4\t8620200\t8637000\t0\t370\nchr4\t8687100\t8687400\t0.675\t41\nchr4\t8842200\t8842500\t0.5857\t71\nchr4\t9033300\t9033600\t0.5704\t79\nchr4\t9084900\t9085200\t0.1985\t60\nchr4\t9156300\t9156600\t0.6192\t27\nchr4\t9203700\t9204000\t0.0566\t17\nchr4\t9211200\t9211500\t0\t30\nchr4\t9213000\t9273000\t0\t799\nchr4\t9322800\t9369000\t0\t1454\nchr4\t9566100\t9566400\t0.3264\t49\nchr4\t9613800\t9617700\t0\t36\nchr4\t9852300\t9852600\t0.5615\t59\nchr4\t9874800\t9875100\t0.6515\t72\nchr4\t10145400\t10145700\t0.6668\t56\nchr4\t10514400\t10514700\t0.4003\t57\nchr4\t10610100\t10610400\t0.404\t34\nchr4\t10776900\t10778700\t0.2195\t69\nchr4\t10824900\t10825200\t0.2107\t77\nchr4\t10826700\t10828500\t0.2107\t77\nchr4\t11015400\t11017200\t0.2593\t54\nchr4\t11061000\t11061600\t0.3392\t69\nchr4\t11063100\t11065500\t0.1987\t105\nchr4\t11077500\t11078400\t0.4357\t77\nchr4\t11144100\t11145600\t0.0246\t81\nchr4\t11146800\t11148600\t0.0246\t81\nchr4\t11169600\t11170200\t0.0876\t54\nchr4\t11236500\t11239800\t0.1526\t86\nchr4\t11379600\t11379900\t0.1576\t73\nchr4\t11381400\t11383800\t0.1576\t73\nchr4\t11388000\t11388300\t0.4709\t46\nchr4\t11560500\t11560800\t0.3806\t99\nchr4\t11793600\t11793900\t0.1851\t91\nchr4\t11796300\t11798400\t0.1851\t91\nchr4\t12093300\t12093600\t0.2549\t84\nchr4\t12108000\t12108300\t0.5914\t19\nchr4\t12339300\t12339600\t0.4204\t48\nchr4\t12345300\t12346800\t0.1573\t83\nchr4\t12509400\t12510300\t0.0685\t68\nchr4\t12750000\t12750300\t0.236\t86\nchr4\t12752700\t12753600\t0.1248\t81\nchr4\t12904200\t12904500\t0.5524\t87\nchr4\t12906000\t12909300\t0\t61\nchr4\t13062000\t13062300\t0.6614\t27\nchr4\t13131600\t13132800\t0.0683\t63\nchr4\t13662900\t13663500\t0.2074\t100\nchr4\t14010000\t14014200\t0.08\t76\nchr4\t14481300\t14481600\t0.4147\t65\nchr4\t14484000\t14484300\t0.4147\t65\nchr4\t14486100\t14486400\t0.3465\t75\nchr4\t14660700\t14665800\t0.255\t63\nchr4\t14755200\t14761200\t0\t98\nchr4\t14840400\t14840700\t0.533\t54\nchr4\t15174900\t15175200\t0.2865\t82\nchr4\t15176700\t15179400\t0.2865\t82\nchr4\t15204000\t15204300\t0.3221\t63\nchr4\t15280200\t15281700\t0.0631\t85\nchr4\t15282900\t15284400\t0.0631\t85\nchr4\t15791400\t15792300\t0.0105\t85\nchr4\t15841800\t15847500\t0\t97\nchr4\t15867600\t15867900\t0.073\t73\nchr4\t16392600\t16392900\t0.3021\t79\nchr4\t16406100\t16406400\t0.4649\t104\nchr4\t16422300\t16422600\t0.2703\t67\nchr4\t16942800\t16949100\t0\t85\nchr4\t17459100\t17459700\t0.3945\t60\nchr4\t17734500\t17734800\t0.5672\t42\nchr4\t17850000\t17851200\t0.2317\t76\nchr4\t17940300\t17940600\t0.1593\t148\nchr4\t18175500\t18177600\t0.0996\t76\nchr4\t18966000\t18966300\t0.2257\t68\nchr4\t19008000\t19008600\t0.098\t86\nchr4\t19077900\t19083900\t0\t94\nchr4\t19168500\t19169400\t0.1763\t75\nchr4\t19226100\t19226400\t0.332\t10\nchr4\t19334700\t19337400\t0.0499\t76\nchr4\t19519800\t19520400\t0.2492\t27\nchr4\t19638300\t19640100\t0.0648\t81\nchr4\t19641600\t19641900\t0.4227\t41\nchr4\t19949100\t19951800\t0.0251\t81\nchr4\t20518500\t20518800\t0.2677\t24\nchr4\t20661000\t20661600\t0.1187\t125\nchr4\t20669400\t20670900\t0.2886\t91\nchr4\t20932200\t20932500\t0.4659\t28\nchr4\t21159300\t21165600\t0\t122\nchr4\t21582000\t21582300\t0.3195\t190\nchr4\t21687000\t21687300\t0.4224\t72\nchr4\t22048800\t22049100\t0.5261\t55\nchr4\t22107000\t22107600\t0.0922\t80\nchr4\t22148700\t22149900\t0.2227\t89\nchr4\t22151700\t22152000\t0.2227\t89\nchr4\t22307400\t22307700\t0.2313\t45\nchr4\t22718700\t22719000\t0.4706\t56\nchr4\t23099100\t23099700\t0.0688\t57\nchr4\t23372100\t23372400\t0.4742\t59\nchr4\t23615100\t23620800\t0\t104\nchr4\t23642400\t23643000\t0.2718\t50\nchr4\t23644800\t23645400\t0.1956\t59\nchr4\t23724300\t23724600\t0.3996\t75\nchr4\t23784000\t23785200\t0.3857\t53\nchr4\t24504000\t24504300\t0.5079\t98\nchr4\t26166000\t26167800\t0.1502\t91\nchr4\t26209500\t26209800\t0.424\t89\nchr4\t26592600\t26592900\t0.4317\t97\nchr4\t26736000\t26736300\t0.1996\t73\nchr4\t26923200\t26927700\t0\t116\nchr4\t27070500\t27072300\t0.1606\t78\nchr4\t27073800\t27075300\t0.1606\t78\nchr4\t27376200\t27381600\t0.0002\t88\nchr4\t28020900\t28021200\t0.4783\t58\nchr4\t28256400\t28256700\t0.6021\t58\nchr4\t28525500\t28525800\t0.3065\t73\nchr4\t29440200\t29440500\t0.4316\t72\nchr4\t29531700\t29532300\t0.2088\t46\nchr4\t29659500\t29659800\t0.3022\t29\nchr4\t30278100\t30278700\t0.3794\t61\nchr4\t30886200\t30886500\t0.2307\t91\nchr4\t31405200\t31405500\t0.5684\t21\nchr4\t31491300\t31491600\t0.2074\t51\nchr4\t31816500\t31816800\t0.5869\t19\nchr4\t31818600\t31818900\t0.4431\t27\nchr4\t31966800\t31967700\t0.1382\t53\nchr4\t32126700\t32127300\t0.2877\t53\nchr4\t32360700\t32364600\t0.0387\t95\nchr4\t32517000\t32518200\t0.1578\t78\nchr4\t32936700\t32937000\t0.4011\t62\nchr4\t34200900\t34201200\t0.3703\t56\nchr4\t34511400\t34511700\t0.5349\t36\nchr4\t34654800\t34655100\t0.1774\t105\nchr4\t35322900\t35323800\t0.3191\t69\nchr4\t35606100\t35606700\t0.2681\t52\nchr4\t35634600\t35634900\t0.6371\t115\nchr4\t36468300\t36468600\t0.0354\t19\nchr4\t36841200\t36841500\t0.245\t22\nchr4\t36906600\t36906900\t0.3776\t63\nchr4\t37054200\t37054500\t0.5094\t47\nchr4\t37103400\t37105200\t0.0197\t94\nchr4\t37330800\t37331400\t0.3312\t59\nchr4\t37558800\t37559400\t0.1653\t47\nchr4\t37585200\t37585500\t0.4557\t43\nchr4\t37604700\t37605000\t0.6896\t102\nchr4\t37884000\t37884300\t0.37\t20\nchr4\t39001800\t39002700\t0.233\t63\nchr4\t39029400\t39029700\t0.3383\t21\nchr4\t39297000\t39297600\t0.2686\t70\nchr4\t39594300\t39595500\t0.3241\t83\nchr4\t39813300\t39813600\t0.5499\t21\nchr4\t40140600\t40140900\t0.6572\t75\nchr4\t40146900\t40147200\t0.2099\t54\nchr4\t40294500\t40295100\t0.5372\t205\nchr4\t40764900\t40765500\t0.1398\t71\nchr4\t40766700\t40767000\t0.3363\t72\nchr4\t41237100\t41237400\t0.314\t57\nchr4\t41402400\t41402700\t0.4493\t89\nchr4\t41907000\t41907300\t0.5884\t57\nchr4\t42275100\t42275400\t0.3709\t60\nchr4\t42982200\t42983400\t0.1021\t69\nchr4\t43096500\t43096800\t0.3625\t84\nchr4\t43185300\t43186200\t0.2291\t49\nchr4\t43213500\t43214100\t0.1119\t65\nchr4\t43287000\t43289700\t0\t116\nchr4\t43415100\t43415700\t0.2555\t92\nchr4\t43691700\t43692000\t0.5684\t73\nchr4\t43817700\t43818900\t0.0464\t61\nchr4\t44076300\t44076900\t0.3027\t52\nchr4\t44079300\t44079900\t0.2373\t47\nchr4\t44317200\t44317500\t0.3436\t41\nchr4\t44505300\t44505600\t0.0021\t24\nchr4\t44507400\t44507700\t0.3305\t13\nchr4\t44975100\t44976900\t0.0255\t73\nchr4\t45023400\t45024900\t0\t17\nchr4\t45511500\t45512100\t0.2171\t77\nchr4\t45699600\t45699900\t0.5092\t55\nchr4\t45722700\t45723000\t0.5783\t40\nchr4\t45824400\t45825000\t0.2008\t71\nchr4\t46053900\t46056300\t0\t87\nchr4\t46117800\t46118100\t0.6696\t15\nchr4\t46569300\t46569600\t0.2671\t85\nchr4\t46795200\t46797000\t0.0185\t70\nchr4\t47262000\t47262300\t0.6276\t44\nchr4\t47297100\t47297400\t0.566\t51\nchr4\t47613600\t47613900\t0.4501\t53\nchr4\t47622300\t47622600\t0.2921\t62\nchr4\t48052200\t48057600\t0\t95\nchr4\t48362700\t48364800\t0.03\t55\nchr4\t48414600\t48417900\t0\t74\nchr4\t48714300\t48714900\t0.2692\t67\nchr4\t48735000\t48735900\t0.1055\t88\nchr4\t48918900\t48919200\t0.2376\t79\nchr4\t48920700\t48921000\t0.6692\t32\nchr4\t49091100\t49156800\t0.001\t43802\nchr4\t49158900\t49162800\t0.1845\t164\nchr4\t49164300\t49164900\t0.1845\t164\nchr4\t49166400\t49169100\t0.3394\t150\nchr4\t49172100\t49173000\t0.4614\t105\nchr4\t49174500\t49174800\t0.1185\t247\nchr4\t49176600\t49176900\t0.1185\t247\nchr4\t49179300\t49187700\t0.1185\t247\nchr4\t49189200\t49189800\t0.2207\t118\nchr4\t49191900\t49192500\t0.4868\t89\nchr4\t49193700\t49194300\t0.4469\t202\nchr4\t49196100\t49198500\t0.4469\t202\nchr4\t49200300\t49203300\t0.1695\t190\nchr4\t49206900\t49207200\t0.3323\t88\nchr4\t49210800\t49211100\t0.5227\t116\nchr4\t49223400\t49224900\t0.4468\t158\nchr4\t49227300\t49227600\t0.5649\t79\nchr4\t49228800\t49229100\t0.3408\t185\nchr4\t49230600\t49232700\t0.3408\t185\nchr4\t49237800\t49239000\t0.4832\t176\nchr4\t49243800\t49244400\t0.1178\t194\nchr4\t49246500\t49255800\t0.0829\t302\nchr4\t49257000\t49262100\t0.0829\t302\nchr4\t49263300\t49270200\t0.001\t262\nchr4\t49272000\t49286700\t0\t315\nchr4\t49290000\t49293000\t0.0474\t222\nchr4\t49295100\t49299000\t0\t304\nchr4\t49300500\t49307100\t0\t304\nchr4\t49309200\t49312500\t0\t178\nchr4\t49316700\t49320600\t0.0056\t306\nchr4\t49323600\t49337100\t0\t230\nchr4\t49487400\t49488300\t0.2707\t67\nchr4\t49489500\t49490100\t0.5346\t64\nchr4\t49492800\t49493400\t0.1612\t99\nchr4\t49496700\t49497000\t0.593\t72\nchr4\t49500000\t49500300\t0.2351\t77\nchr4\t49502100\t49502400\t0.4673\t65\nchr4\t49509300\t49509900\t0.1738\t96\nchr4\t49514700\t49515000\t0.5953\t447\nchr4\t49519500\t49524000\t0.0637\t144\nchr4\t49525500\t49549200\t0.0268\t195\nchr4\t49551000\t49553400\t0.3241\t161\nchr4\t49556400\t49556700\t0.4049\t228\nchr4\t49562700\t49565100\t0.2924\t108\nchr4\t49566300\t49566600\t0.2924\t108\nchr4\t49567800\t49568100\t0.6395\t65\nchr4\t49570500\t49572000\t0.1389\t249\nchr4\t49577100\t49577400\t0.4794\t150\nchr4\t49581300\t49583100\t0.0197\t138\nchr4\t49584900\t49586700\t0.3624\t123\nchr4\t49589100\t49589400\t0.2993\t112\nchr4\t49591800\t49599000\t0\t201\nchr4\t49601400\t49602000\t0\t201\nchr4\t49604400\t49608000\t0.2034\t87\nchr4\t49609200\t49615500\t0.2757\t123\nchr4\t49617300\t49618500\t0.3097\t128\nchr4\t49620000\t49620600\t0.3591\t73\nchr4\t49625700\t49629000\t0.0631\t21391\nchr4\t49631100\t49658100\t0.0631\t21391\nchr4\t49708200\t49718700\t0\t25282\nchr4\t49719900\t49730700\t0\t889\nchr4\t49732200\t49732500\t0.0265\t285\nchr4\t49733700\t50156100\t0\t2664\nchr4\t50157600\t50196900\t0\t252\nchr4\t50200800\t50670300\t0\t3717\nchr4\t50671500\t50829000\t0\t9189\nchr4\t50830200\t51028500\t0\t9189\nchr4\t51029700\t51047400\t0\t950\nchr4\t51048600\t51123600\t0\t2549\nchr4\t51124800\t51141600\t0\t916\nchr4\t51143400\t51396900\t0\t872\nchr4\t51398400\t51405300\t0\t3549\nchr4\t51406500\t51520500\t0\t3549\nchr4\t51521700\t51627900\t0\t3549\nchr4\t51629100\t51743400\t0\t928\nchr4\t51793800\t51814800\t0\t522\nchr4\t51936000\t51936300\t0.4366\t53\nchr4\t52219800\t52220400\t0.1692\t75\nchr4\t52275900\t52276200\t0.3634\t76\nchr4\t52464300\t52465800\t0.4333\t67\nchr4\t52538700\t52544100\t0.01\t108\nchr4\t52609800\t52610100\t0.438\t34\nchr4\t52816500\t52822500\t0.0025\t115\nchr4\t53237100\t53238000\t0.461\t78\nchr4\t53247600\t53247900\t0.5623\t47\nchr4\t53252100\t53252400\t0.5382\t62\nchr4\t53329200\t53329500\t0.6262\t88\nchr4\t53333100\t53333400\t0.5075\t79\nchr4\t53565300\t53565600\t0.1056\t100\nchr4\t53567100\t53567400\t0.1056\t100\nchr4\t53569200\t53570400\t0.1056\t100\nchr4\t53726400\t53727900\t0.0328\t57\nchr4\t53737500\t53739000\t0.0118\t56\nchr4\t53877900\t53878200\t0.3721\t109\nchr4\t53879400\t53879700\t0.3721\t109\nchr4\t53882700\t53883000\t0.2611\t95\nchr4\t54922200\t54923100\t0.1869\t65\nchr4\t55058400\t55061700\t0.1252\t83\nchr4\t55619400\t55625100\t0\t89\nchr4\t55847100\t55847700\t0.1322\t85\nchr4\t56216700\t56217000\t0.4232\t59\nchr4\t56248800\t56249400\t0.2809\t47\nchr4\t56366700\t56367000\t0.3454\t79\nchr4\t57282000\t57282300\t0.5936\t30\nchr4\t57562500\t57568200\t0.0306\t103\nchr4\t57643800\t57645900\t0.1123\t81\nchr4\t57790500\t57790800\t0.205\t74\nchr4\t57856200\t57856500\t0.2319\t65\nchr4\t57869100\t57869400\t0.347\t14\nchr4\t58021200\t58022100\t0.1089\t83\nchr4\t58024800\t58025100\t0.3473\t89\nchr4\t58229400\t58230900\t0.1209\t58\nchr4\t58328100\t58328400\t0.4321\t46\nchr4\t58576500\t58578000\t0.0011\t76\nchr4\t58778100\t58779000\t0.2305\t72\nchr4\t58927500\t58927800\t0.4453\t50\nchr4\t58930500\t58930800\t0.4849\t69\nchr4\t59079000\t59084700\t0\t87\nchr4\t59184300\t59184600\t0.1167\t46\nchr4\t59301000\t59301900\t0.21\t75\nchr4\t59303700\t59304600\t0.21\t75\nchr4\t59519100\t59519400\t0.1063\t35\nchr4\t59720400\t59721300\t0.1531\t71\nchr4\t60104700\t60106200\t0\t88\nchr4\t60122400\t60122700\t0.005\t190\nchr4\t60281100\t60281400\t0.6033\t29\nchr4\t60423600\t60423900\t0.252\t96\nchr4\t60572400\t60573000\t0.4228\t43\nchr4\t60591900\t60592500\t0.1801\t64\nchr4\t60703500\t60703800\t0.1548\t23\nchr4\t60833700\t60835200\t0.1987\t123\nchr4\t61367400\t61368000\t0.186\t77\nchr4\t61643400\t61644300\t0.4612\t59\nchr4\t61747500\t61749000\t0.4319\t64\nchr4\t61874700\t61875000\t0.5026\t49\nchr4\t61939800\t61945800\t0\t89\nchr4\t62427000\t62427300\t0.3259\t81\nchr4\t62604600\t62607900\t0.2065\t90\nchr4\t62727000\t62733000\t0.0073\t96\nchr4\t63027900\t63028500\t0.4625\t58\nchr4\t63246900\t63247200\t0.4861\t54\nchr4\t63328800\t63329100\t0.093\t44\nchr4\t63368700\t63369000\t0.4084\t64\nchr4\t63534600\t63537000\t0.166\t86\nchr4\t63576900\t63577200\t0.3515\t30\nchr4\t63653700\t63654600\t0.1464\t66\nchr4\t63918000\t63918600\t0.1746\t40\nchr4\t64155300\t64155600\t0.6005\t85\nchr4\t64237500\t64237800\t0.1534\t70\nchr4\t64333800\t64334100\t0.447\t40\nchr4\t64666500\t64667100\t0.1647\t46\nchr4\t64838400\t64839600\t0\t71\nchr4\t64841100\t64842000\t0\t71\nchr4\t64860600\t64863300\t0\t82\nchr4\t64900200\t64900800\t0.1098\t92\nchr4\t64993800\t64994100\t0.1902\t30\nchr4\t65053500\t65054400\t0.4081\t70\nchr4\t65055600\t65055900\t0.5022\t49\nchr4\t65180100\t65180700\t0.079\t58\nchr4\t65182200\t65182500\t0.4543\t82\nchr4\t65200500\t65201100\t0.3384\t71\nchr4\t65289000\t65293500\t0.2466\t64\nchr4\t65708400\t65709000\t0.3679\t57\nchr4\t65994000\t65995800\t0.2327\t59\nchr4\t66657000\t66657300\t0.4988\t74\nchr4\t66672300\t66672600\t0.5794\t46\nchr4\t66711900\t66712200\t0.4857\t62\nchr4\t66783900\t66784200\t0.2919\t27\nchr4\t66968400\t66969000\t0.5481\t72\nchr4\t67096800\t67097100\t0.4066\t67\nchr4\t67178400\t67182900\t0.0413\t72\nchr4\t67398600\t67400100\t0.0077\t57\nchr4\t67887900\t67889400\t0\t77\nchr4\t67967700\t67968900\t0.1244\t109\nchr4\t67970400\t67973100\t0.0245\t88\nchr4\t68084700\t68085300\t0.2442\t55\nchr4\t68088300\t68088600\t0.4277\t64\nchr4\t68094000\t68094300\t0.1145\t36\nchr4\t68120400\t68120700\t0.3559\t46\nchr4\t68171100\t68171400\t0.4629\t30\nchr4\t68198100\t68205000\t0\t58\nchr4\t68511000\t68515200\t0\t72\nchr4\t68560500\t68560800\t0.2225\t26\nchr4\t68566500\t68567100\t0.2755\t31\nchr4\t68595600\t68596200\t0.4079\t39\nchr4\t68668500\t68668800\t0.6059\t41\nchr4\t69232200\t69234000\t0.391\t53\nchr4\t69259200\t69259500\t0.5178\t44\nchr4\t69270000\t69270900\t0.0061\t56\nchr4\t69368100\t69368400\t0.1465\t47\nchr4\t69379200\t69379800\t0.0825\t53\nchr4\t69406800\t69407100\t0.2857\t53\nchr4\t69423000\t69423300\t0.4753\t60\nchr4\t69666900\t69667500\t0.2255\t87\nchr4\t70016700\t70017000\t0.5317\t100\nchr4\t70329000\t70334400\t0\t92\nchr4\t70839900\t70840200\t0.5609\t56\nchr4\t70918200\t70918500\t0.6675\t83\nchr4\t71021100\t71021400\t0.5165\t66\nchr4\t71053800\t71057700\t0.1389\t79\nchr4\t71102100\t71102400\t0.0188\t90\nchr4\t71103900\t71106900\t0.0188\t90\nchr4\t71114700\t71115000\t0.3155\t64\nchr4\t71420700\t71422500\t0.2376\t80\nchr4\t72051900\t72052200\t0.5319\t27\nchr4\t72129300\t72129900\t0.0412\t67\nchr4\t72399900\t72400800\t0.241\t65\nchr4\t72478200\t72478800\t0.366\t79\nchr4\t72515400\t72515700\t0.3783\t67\nchr4\t72894000\t72894300\t0.3972\t94\nchr4\t73554300\t73554900\t0.2823\t104\nchr4\t73580700\t73581000\t0.3841\t73\nchr4\t74248500\t74248800\t0.2057\t69\nchr4\t74562900\t74563200\t0.4054\t36\nchr4\t74717100\t74723700\t0\t80\nchr4\t75128100\t75129000\t0.1795\t78\nchr4\t75130500\t75132600\t0.179\t98\nchr4\t75270600\t75272700\t0\t39\nchr4\t75273900\t75275400\t0\t39\nchr4\t75406200\t75406500\t0.2535\t66\nchr4\t75443100\t75446400\t0.0304\t92\nchr4\t75603000\t75603300\t0.534\t53\nchr4\t76828200\t76829700\t0\t66\nchr4\t76916100\t76918800\t0.0241\t120\nchr4\t77514300\t77514600\t0.1331\t88\nchr4\t77685600\t77685900\t0.2256\t72\nchr4\t78106200\t78111600\t0\t88\nchr4\t78259200\t78259500\t0.4754\t57\nchr4\t78306300\t78306900\t0.1893\t83\nchr4\t78348000\t78354000\t0\t90\nchr4\t79221300\t79223400\t0.1587\t89\nchr4\t79268700\t79271400\t0\t90\nchr4\t79284600\t79284900\t0.2386\t37\nchr4\t79432800\t79433100\t0.3987\t35\nchr4\t79556400\t79556700\t0.1338\t45\nchr4\t79704900\t79710600\t0\t91\nchr4\t79937700\t79944600\t0\t113\nchr4\t79967100\t79973100\t0\t103\nchr4\t80381400\t80381700\t0\t18\nchr4\t80691000\t80691600\t0.195\t70\nchr4\t80890500\t80892000\t0.4367\t115\nchr4\t81070500\t81070800\t0.5124\t40\nchr4\t81188700\t81189000\t0.3271\t35\nchr4\t81536700\t81537300\t0.2199\t71\nchr4\t81594000\t81594300\t0.3575\t116\nchr4\t81932100\t81932400\t0.5296\t63\nchr4\t81933900\t81934500\t0.4449\t66\nchr4\t82008300\t82010100\t0.0047\t67\nchr4\t82023600\t82023900\t0.2213\t67\nchr4\t82087800\t82088100\t0.5066\t59\nchr4\t82112700\t82114200\t0.3472\t87\nchr4\t82180800\t82181100\t0.6666\t108\nchr4\t82258800\t82259100\t0.6263\t49\nchr4\t83182200\t83183100\t0.4691\t41\nchr4\t83184600\t83186700\t0.1103\t82\nchr4\t83649600\t83649900\t0.1854\t25\nchr4\t83953800\t83955000\t0.1521\t83\nchr4\t84073800\t84075300\t0.0488\t111\nchr4\t84076500\t84078300\t0.0488\t111\nchr4\t84129300\t84132000\t0.0627\t81\nchr4\t84299400\t84299700\t0.2986\t91\nchr4\t84300900\t84301200\t0.2986\t91\nchr4\t84303000\t84304500\t0.2986\t91\nchr4\t84523800\t84524100\t0.5069\t58\nchr4\t84759600\t84761100\t0.3105\t109\nchr4\t85643100\t85643400\t0.4943\t47\nchr4\t85891200\t85893900\t0\t69\nchr4\t86071800\t86074200\t0.3082\t69\nchr4\t86137500\t86140200\t0.0054\t94\nchr4\t86251500\t86254800\t0.0085\t92\nchr4\t86628600\t86629500\t0.3619\t52\nchr4\t86637600\t86637900\t0.2425\t76\nchr4\t86865300\t86866200\t0.2133\t74\nchr4\t86868600\t86868900\t0.2133\t74\nchr4\t86996400\t86996700\t0.2884\t79\nchr4\t87347100\t87353100\t0\t84\nchr4\t87562800\t87565200\t0\t87\nchr4\t87711000\t87711300\t0.2268\t52\nchr4\t87712800\t87715800\t0.0475\t76\nchr4\t87796200\t87797700\t0.0861\t80\nchr4\t87936300\t87937500\t0.5068\t59\nchr4\t88116600\t88116900\t0.247\t31\nchr4\t88161300\t88161900\t0.0066\t97\nchr4\t88551300\t88551600\t0.1953\t78\nchr4\t88698900\t88699200\t0.3872\t30\nchr4\t88895400\t88896000\t0.2531\t78\nchr4\t88924800\t88925100\t0.4563\t73\nchr4\t89094300\t89094600\t0.3557\t72\nchr4\t89199300\t89199600\t0.3065\t58\nchr4\t90154500\t90156000\t0.1176\t79\nchr4\t90230400\t90231000\t0.3549\t75\nchr4\t90232500\t90232800\t0.3549\t75\nchr4\t90324300\t90324600\t0.268\t38\nchr4\t90675600\t90681600\t0\t90\nchr4\t90748500\t90748800\t0.2545\t66\nchr4\t91137000\t91138800\t0.0605\t110\nchr4\t91239300\t91241400\t0\t46\nchr4\t91424100\t91424400\t0.5647\t61\nchr4\t91442400\t91442700\t0.4789\t42\nchr4\t91479900\t91480200\t0.4281\t58\nchr4\t91786500\t91789200\t0.149\t94\nchr4\t91790400\t91790700\t0.2279\t96\nchr4\t91978500\t91984200\t0\t97\nchr4\t92107800\t92108100\t0.4087\t48\nchr4\t92133000\t92133300\t0.4841\t130\nchr4\t92199900\t92200500\t0.5311\t65\nchr4\t92276400\t92276700\t0.5414\t49\nchr4\t92954700\t92955300\t0.1761\t98\nchr4\t93591000\t93591300\t0.4822\t70\nchr4\t93593100\t93593700\t0.3237\t57\nchr4\t93608700\t93613800\t0\t100\nchr4\t93638400\t93644400\t0\t72\nchr4\t93682200\t93682500\t0.2997\t72\nchr4\t93884100\t93884700\t0.0713\t84\nchr4\t94577700\t94578300\t0.6261\t58\nchr4\t94793400\t94795200\t0.1894\t98\nchr4\t94836900\t94839900\t0.1464\t71\nchr4\t94949400\t94949700\t0.558\t28\nchr4\t95172000\t95173500\t0.1798\t81\nchr4\t95174700\t95175000\t0.1798\t81\nchr4\t95258700\t95259000\t0.3979\t42\nchr4\t95328000\t95328600\t0.346\t54\nchr4\t95592300\t95593200\t0.568\t70\nchr4\t95916000\t95918700\t0.1607\t101\nchr4\t95920200\t95920800\t0.1607\t101\nchr4\t96129300\t96129600\t0.6879\t39\nchr4\t96402600\t96402900\t0.1237\t75\nchr4\t96411000\t96414000\t0.4065\t80\nchr4\t96796500\t96797700\t0.1224\t77\nchr4\t96869100\t96872100\t0.1613\t105\nchr4\t96975900\t96976200\t0.4754\t56\nchr4\t97189500\t97189800\t0.4292\t43\nchr4\t97635900\t97636500\t0.347\t60\nchr4\t97638600\t97638900\t0.1789\t56\nchr4\t97669500\t97669800\t0.0694\t33\nchr4\t97780200\t97780800\t0.0035\t59\nchr4\t97798500\t97799100\t0.0266\t70\nchr4\t98320500\t98325600\t0.1043\t83\nchr4\t98414100\t98414400\t0.3814\t69\nchr4\t98591400\t98598300\t0.0008\t126\nchr4\t98763000\t98763600\t0.4376\t71\nchr4\t98880300\t98880600\t0.0172\t48\nchr4\t98957700\t98958000\t0.4625\t56\nchr4\t99102000\t99102300\t0.5036\t32\nchr4\t99149100\t99149400\t0.383\t24\nchr4\t99348900\t99349200\t0.332\t80\nchr4\t99769200\t99769500\t0.3091\t59\nchr4\t100000800\t100005600\t0\t84\nchr4\t100044600\t100044900\t0.0947\t88\nchr4\t100046400\t100048200\t0.0947\t88\nchr4\t100178400\t100178700\t0.628\t13\nchr4\t100381200\t100381500\t0.3037\t80\nchr4\t100677300\t100677600\t0.1336\t49\nchr4\t100718100\t100719000\t0.1168\t76\nchr4\t101295000\t101295300\t0.574\t49\nchr4\t101405700\t101407200\t0.0844\t65\nchr4\t101508300\t101508600\t0.338\t82\nchr4\t101749500\t101750100\t0.0212\t25\nchr4\t101839800\t101840100\t0.5974\t27\nchr4\t101866800\t101867100\t0.1737\t65\nchr4\t102044400\t102046200\t0.0486\t103\nchr4\t102204900\t102210600\t0.0078\t88\nchr4\t102221100\t102221700\t0.0709\t45\nchr4\t102409200\t102409800\t0.4324\t46\nchr4\t102463800\t102464400\t0.1842\t51\nchr4\t102617700\t102618000\t0.3643\t83\nchr4\t102620100\t102620400\t0.6496\t65\nchr4\t102697500\t102698700\t0.3525\t88\nchr4\t102699900\t102700200\t0.3525\t88\nchr4\t102951900\t102954300\t0\t81\nchr4\t103251300\t103251600\t0.3407\t103\nchr4\t103253100\t103254000\t0.3407\t103\nchr4\t103688400\t103688700\t0.1973\t85\nchr4\t103817100\t103818300\t0.2059\t80\nchr4\t103834500\t103834800\t0.6158\t28\nchr4\t104031000\t104031300\t0.5557\t80\nchr4\t104041200\t104041500\t0.4442\t53\nchr4\t104442300\t104442600\t0.202\t106\nchr4\t104687100\t104692200\t0.0812\t91\nchr4\t104787900\t104788500\t0.1034\t72\nchr4\t104790000\t104790300\t0.1034\t72\nchr4\t104791800\t104793000\t0.1034\t72\nchr4\t104803200\t104804700\t0.0917\t49\nchr4\t104805900\t104806200\t0.4289\t65\nchr4\t105307500\t105308700\t0.0148\t73\nchr4\t105340200\t105340500\t0.2954\t69\nchr4\t105449100\t105449400\t0.5685\t58\nchr4\t105499200\t105499500\t0.3873\t52\nchr4\t105568200\t105568500\t0.5578\t67\nchr4\t105986700\t105987000\t0.1153\t73\nchr4\t106121100\t106121700\t0.3648\t76\nchr4\t106123800\t106124100\t0.4987\t71\nchr4\t106218300\t106218900\t0.2072\t79\nchr4\t106571100\t106576800\t0\t108\nchr4\t106638300\t106639800\t0.0341\t85\nchr4\t106641000\t106641300\t0.0341\t85\nchr4\t106721100\t106721400\t0.398\t73\nchr4\t106937100\t106938300\t0.2497\t78\nchr4\t107082900\t107084400\t0.021\t106\nchr4\t107206800\t107210700\t0\t82\nchr4\t107222700\t107223300\t0.1654\t35\nchr4\t107307600\t107308500\t0.2868\t46\nchr4\t107355600\t107358000\t0\t77\nchr4\t107846400\t107847000\t0.3563\t89\nchr4\t108041100\t108041400\t0.3365\t44\nchr4\t108077400\t108077700\t0.5924\t44\nchr4\t108186600\t108186900\t0.5806\t32\nchr4\t108409200\t108410700\t0.1102\t90\nchr4\t108435900\t108436200\t0.4476\t55\nchr4\t109269300\t109269600\t0.1704\t87\nchr4\t109596000\t109597800\t0.0292\t102\nchr4\t110084100\t110084400\t0.514\t20\nchr4\t110406900\t110410200\t0.0164\t82\nchr4\t110462100\t110462400\t0.1324\t32\nchr4\t110688000\t110688300\t0.121\t58\nchr4\t110690700\t110691300\t0.121\t58\nchr4\t110757600\t110759100\t0.0798\t63\nchr4\t110871600\t110871900\t0.1828\t67\nchr4\t110873400\t110875200\t0.1828\t67\nchr4\t111059400\t111059700\t0.4022\t65\nchr4\t111099000\t111099300\t0.5936\t69\nchr4\t111248400\t111249000\t0.3217\t85\nchr4\t111339300\t111340200\t0.0978\t71\nchr4\t111341400\t111342600\t0.0978\t71\nchr4\t111396000\t111396900\t0.346\t73\nchr4\t111458400\t111461400\t0.1175\t85\nchr4\t111895800\t111901500\t0\t91\nchr4\t111965700\t111966000\t0.0945\t69\nchr4\t111967200\t111967500\t0.0945\t69\nchr4\t112087500\t112090800\t0.2051\t78\nchr4\t112092000\t112092300\t0.2051\t78\nchr4\t112193700\t112194000\t0.5181\t84\nchr4\t112483200\t112483500\t0.2868\t45\nchr4\t112548900\t112549200\t0.6496\t23\nchr4\t112578300\t112578600\t0.2771\t37\nchr4\t112705800\t112706100\t0.5031\t45\nchr4\t112956900\t112957200\t0.4571\t57\nchr4\t113064900\t113065200\t0.09\t22\nchr4\t113334600\t113334900\t0.6704\t14\nchr4\t113427600\t113428500\t0.2672\t66\nchr4\t113489400\t113491500\t0.2235\t76\nchr4\t113492700\t113493900\t0.568\t67\nchr4\t113854200\t113854800\t0.2331\t133\nchr4\t113930700\t113931000\t0.2717\t73\nchr4\t113988000\t113988600\t0.3594\t83\nchr4\t114150000\t114150300\t0.434\t96\nchr4\t114168300\t114168900\t0.2954\t66\nchr4\t114448200\t114448500\t0.5834\t57\nchr4\t114847200\t114847500\t0.5119\t30\nchr4\t114918300\t114918600\t0.5798\t31\nchr4\t115009800\t115010100\t0.2131\t40\nchr4\t115176600\t115177200\t0.3573\t78\nchr4\t116203800\t116206200\t0.0315\t66\nchr4\t116330400\t116330700\t0.4042\t31\nchr4\t116407800\t116408100\t0.199\t65\nchr4\t116410800\t116411100\t0.4813\t56\nchr4\t116686500\t116687700\t0.1493\t75\nchr4\t116775300\t116777100\t0.1555\t119\nchr4\t117924300\t117924900\t0.2564\t82\nchr4\t118066200\t118066500\t0\t17\nchr4\t118150500\t118150800\t0.405\t67\nchr4\t118162500\t118163100\t0.4349\t77\nchr4\t118427100\t118427700\t0.1379\t51\nchr4\t118436400\t118436700\t0.4759\t67\nchr4\t118505100\t118505400\t0.5538\t48\nchr4\t118514100\t118514400\t0.3561\t53\nchr4\t118535400\t118535700\t0.5423\t53\nchr4\t118549500\t118549800\t0.5825\t63\nchr4\t118554600\t118554900\t0.6867\t50\nchr4\t118596300\t118596600\t0.3824\t69\nchr4\t118602600\t118605000\t0.3318\t104\nchr4\t118608600\t118611300\t0.0108\t88\nchr4\t118613100\t118614900\t0.0108\t88\nchr4\t118616100\t118616400\t0.0108\t88\nchr4\t118618200\t118619400\t0.2282\t99\nchr4\t118621200\t118624500\t0.0002\t84\nchr4\t118644900\t118647900\t0.2587\t71\nchr4\t118652100\t118655100\t0.1754\t66\nchr4\t118656300\t118656600\t0.1754\t66\nchr4\t118658100\t118658400\t0.2147\t66\nchr4\t118662300\t118664400\t0.0507\t72\nchr4\t118667400\t118667700\t0.3263\t82\nchr4\t118689600\t118689900\t0.4952\t121\nchr4\t119063400\t119064000\t0.4147\t55\nchr4\t119077800\t119078400\t0.1186\t62\nchr4\t119274600\t119279700\t0.0106\t75\nchr4\t119342700\t119343600\t0.0482\t77\nchr4\t119414400\t119419500\t0\t78\nchr4\t119421000\t119426400\t0\t78\nchr4\t119428200\t119434200\t0\t78\nchr4\t119435400\t119436300\t0.303\t57\nchr4\t119456700\t119459100\t0.2121\t74\nchr4\t119461200\t119461500\t0.3238\t24\nchr4\t119886900\t119887500\t0.236\t77\nchr4\t119948700\t119954400\t0\t111\nchr4\t120128100\t120128700\t0.2208\t74\nchr4\t120252600\t120253800\t0.3077\t70\nchr4\t120255300\t120255600\t0.3391\t63\nchr4\t120586200\t120586500\t0.5162\t46\nchr4\t120644700\t120645000\t0.3812\t52\nchr4\t120647400\t120647700\t0.3197\t54\nchr4\t120743400\t120746700\t0.1407\t83\nchr4\t120887700\t120888000\t0.5886\t40\nchr4\t121128900\t121129200\t0.2897\t69\nchr4\t121310700\t121311000\t0.1227\t61\nchr4\t121527000\t121527300\t0.4208\t35\nchr4\t122112900\t122114100\t0.2885\t92\nchr4\t122115300\t122115600\t0.3389\t93\nchr4\t122332800\t122333400\t0.0359\t63\nchr4\t122378100\t122378400\t0.5453\t25\nchr4\t122497800\t122498100\t0.2823\t67\nchr4\t122572800\t122573100\t0.2742\t62\nchr4\t122652600\t122656800\t0\t83\nchr4\t122801100\t122801400\t0.6622\t23\nchr4\t122942100\t122942400\t0.296\t85\nchr4\t123000600\t123001200\t0.1228\t67\nchr4\t123022500\t123022800\t0.4136\t61\nchr4\t123723000\t123723300\t0.2151\t100\nchr4\t124022400\t124023900\t0.0008\t65\nchr4\t124152900\t124155000\t0\t98\nchr4\t124231800\t124232400\t0.2423\t69\nchr4\t124286400\t124287000\t0.3529\t75\nchr4\t124406100\t124407900\t0.122\t90\nchr4\t124996500\t124996800\t0.3844\t47\nchr4\t125257500\t125259000\t0.2293\t83\nchr4\t126550200\t126550500\t0.6299\t75\nchr4\t126770100\t126770400\t0.549\t68\nchr4\t126928800\t126934200\t0.0894\t103\nchr4\t127021200\t127026600\t0.0136\t94\nchr4\t127063200\t127064700\t0.3237\t89\nchr4\t127129800\t127130400\t0.5538\t38\nchr4\t127227300\t127227600\t0.3213\t60\nchr4\t127531200\t127531500\t0.4317\t69\nchr4\t127590300\t127592100\t0.1887\t91\nchr4\t127593900\t127594200\t0.1887\t91\nchr4\t127651800\t127653600\t0.1134\t103\nchr4\t127654800\t127655100\t0.1134\t103\nchr4\t127680300\t127680600\t0.3932\t63\nchr4\t127863000\t127863300\t0.1891\t90\nchr4\t128214000\t128219700\t0\t80\nchr4\t128647500\t128647800\t0.1174\t74\nchr4\t129249900\t129250200\t0.423\t24\nchr4\t129295500\t129298200\t0\t80\nchr4\t129854400\t129855600\t0.2029\t80\nchr4\t129858600\t129859200\t0.2857\t68\nchr4\t129878700\t129879000\t0.2256\t80\nchr4\t129962400\t129962700\t0.2581\t77\nchr4\t129964500\t129965400\t0.2581\t77\nchr4\t130016400\t130019700\t0.0018\t79\nchr4\t130425000\t130425300\t0.175\t201\nchr4\t131201400\t131202300\t0\t64\nchr4\t131209800\t131210400\t0.4779\t85\nchr4\t131354400\t131355900\t0.3451\t85\nchr4\t131723700\t131724600\t0.0596\t91\nchr4\t131726100\t131727000\t0.0438\t101\nchr4\t131731200\t131732700\t0.4342\t70\nchr4\t131733900\t131764200\t0\t496\nchr4\t131887500\t131887800\t0.5161\t58\nchr4\t131890200\t131890500\t0.402\t61\nchr4\t132484800\t132485100\t0.3443\t60\nchr4\t132632400\t132633000\t0.4682\t71\nchr4\t132635700\t132636300\t0.1058\t53\nchr4\t132698700\t132699000\t0.5872\t35\nchr4\t132898500\t132898800\t0.2554\t25\nchr4\t132945000\t132946500\t0.0342\t82\nchr4\t132947700\t132950100\t0.0342\t82\nchr4\t133491900\t133492200\t0.3674\t63\nchr4\t133735800\t133737300\t0.1904\t78\nchr4\t133786500\t133788000\t0.0458\t74\nchr4\t134209500\t134210100\t0.1642\t71\nchr4\t134590200\t134591100\t0\t26\nchr4\t135006300\t135006600\t0.4504\t56\nchr4\t135079800\t135085200\t0.0008\t75\nchr4\t135179400\t135180000\t0.1925\t58\nchr4\t135391200\t135391500\t0.2205\t43\nchr4\t135407100\t135407400\t0.3566\t119\nchr4\t135449100\t135449400\t0.0089\t71\nchr4\t135451500\t135452700\t0.0089\t71\nchr4\t136293600\t136299600\t0\t100\nchr4\t137164800\t137165100\t0.4996\t14\nchr4\t137167500\t137168400\t0.4015\t80\nchr4\t137497200\t137502300\t0.0793\t88\nchr4\t137843400\t137844000\t0.3399\t58\nchr4\t137933100\t137933400\t0.5094\t28\nchr4\t138066900\t138067200\t0.5254\t37\nchr4\t138547800\t138552300\t0\t87\nchr4\t138854700\t138855000\t0.2474\t69\nchr4\t138881700\t138882600\t0.2095\t68\nchr4\t139428300\t139430400\t0.1132\t92\nchr4\t139707600\t139707900\t0.4621\t95\nchr4\t139944600\t139944900\t0.199\t73\nchr4\t139990200\t139990800\t0.3577\t80\nchr4\t140318100\t140318700\t0.1328\t70\nchr4\t140414400\t140418600\t0.0857\t107\nchr4\t140520300\t140520600\t0.3112\t63\nchr4\t140779800\t140780700\t0.0075\t80\nchr4\t140895900\t140896800\t0.0105\t67\nchr4\t140956800\t140957100\t0.3054\t58\nchr4\t141068700\t141071100\t0.1315\t116\nchr4\t141182100\t141183000\t0.0018\t93\nchr4\t141203100\t141203400\t0.5089\t25\nchr4\t141270300\t141270600\t0.5984\t53\nchr4\t141823800\t141824100\t0.5284\t70\nchr4\t141877500\t141879000\t0.1222\t67\nchr4\t141880500\t141882600\t0.1222\t67\nchr4\t142137300\t142137600\t0.1079\t61\nchr4\t142255800\t142256100\t0.5767\t61\nchr4\t142259100\t142259400\t0.361\t61\nchr4\t142525500\t142525800\t0.0483\t48\nchr4\t142624800\t142625400\t0.2853\t77\nchr4\t142627200\t142627800\t0.3739\t64\nchr4\t143100300\t143106300\t0\t74\nchr4\t143588700\t143589000\t0.4812\t56\nchr4\t143717100\t143717400\t0.3676\t65\nchr4\t143808900\t143811600\t0.0115\t74\nchr4\t143877600\t143878200\t0.2561\t64\nchr4\t143884200\t143889000\t0.0092\t61\nchr4\t143892900\t143893200\t0.3023\t65\nchr4\t143970300\t143970600\t0.6667\t10\nchr4\t143998500\t143998800\t0.2594\t81\nchr4\t144006900\t144007200\t0.452\t54\nchr4\t144124800\t144125100\t0.0479\t72\nchr4\t144126600\t144128700\t0.0479\t72\nchr4\t144239100\t144239400\t0.4604\t71\nchr4\t144748200\t144748500\t0.1056\t65\nchr4\t144772200\t144773700\t0.3592\t73\nchr4\t144810000\t144810900\t0.0301\t124\nchr4\t145369500\t145375200\t0\t102\nchr4\t145397700\t145398000\t0.58\t35\nchr4\t146286300\t146286600\t0.6959\t220\nchr4\t146350500\t146355300\t0.1103\t75\nchr4\t146554800\t146555100\t0.4817\t71\nchr4\t146618700\t146622000\t0.0683\t100\nchr4\t146665200\t146667300\t0.1273\t94\nchr4\t146999400\t146999700\t0.4103\t40\nchr4\t147358200\t147358500\t0.3922\t24\nchr4\t147421200\t147421500\t0.5414\t46\nchr4\t147435600\t147435900\t0.4601\t66\nchr4\t147451800\t147453300\t0.0456\t68\nchr4\t147468300\t147468600\t0.4196\t74\nchr4\t147783900\t147784200\t0.0162\t216\nchr4\t147905400\t147905700\t0.0643\t35\nchr4\t148320300\t148320600\t0.3993\t80\nchr4\t148322400\t148322700\t0.3993\t80\nchr4\t148768500\t148768800\t0.4897\t68\nchr4\t148863000\t148863300\t0.4431\t41\nchr4\t149130300\t149130600\t0.1597\t92\nchr4\t149817000\t149818200\t0.2803\t96\nchr4\t149851800\t149853900\t0.2632\t74\nchr4\t149916900\t149918700\t0.168\t107\nchr4\t149920500\t149921400\t0.168\t107\nchr4\t150030000\t150030300\t0.2575\t30\nchr4\t150291300\t150291900\t0.023\t83\nchr4\t150489000\t150489300\t0.6212\t11\nchr4\t150638400\t150639300\t0.0428\t92\nchr4\t150658500\t150661200\t0\t75\nchr4\t151214400\t151214700\t0.5118\t26\nchr4\t151254600\t151254900\t0.2148\t78\nchr4\t151390800\t151391700\t0.3133\t72\nchr4\t151419600\t151420500\t0.001\t60\nchr4\t152865900\t152866200\t0.4412\t69\nchr4\t153129300\t153129600\t0.5861\t153\nchr4\t155282100\t155285700\t0\t95\nchr4\t155538600\t155538900\t0\t11\nchr4\t156013800\t156014100\t0.6661\t39\nchr4\t156048300\t156050100\t0.0017\t105\nchr4\t156107100\t156107400\t0.475\t78\nchr4\t156284700\t156285300\t0.1407\t78\nchr4\t156286500\t156287100\t0.1407\t78\nchr4\t156304800\t156305700\t0.0154\t98\nchr4\t156370800\t156372900\t0.0072\t85\nchr4\t156605100\t156605400\t0.2138\t57\nchr4\t156759300\t156759900\t0.5833\t67\nchr4\t157177500\t157177800\t0.4395\t66\nchr4\t157256100\t157256400\t0.6521\t10\nchr4\t157495500\t157497000\t0.4927\t32\nchr4\t157635900\t157637700\t0.116\t57\nchr4\t157708200\t157708500\t0.4605\t31\nchr4\t158084400\t158085000\t0.0188\t78\nchr4\t158086500\t158087400\t0.1073\t93\nchr4\t158088600\t158089200\t0.1073\t93\nchr4\t158364300\t158364600\t0.3611\t95\nchr4\t158433000\t158433300\t0.106\t25\nchr4\t158435400\t158436300\t0.1601\t22\nchr4\t158473500\t158474700\t0\t72\nchr4\t158476500\t158476800\t0\t72\nchr4\t158544900\t158545200\t0.338\t72\nchr4\t158734800\t158735100\t0.5222\t58\nchr4\t158983800\t158985300\t0.2493\t63\nchr4\t159523500\t159523800\t0.5546\t22\nchr4\t159709800\t159710100\t0.437\t60\nchr4\t159711300\t159711900\t0.3537\t63\nchr4\t159806100\t159806700\t0.2124\t99\nchr4\t159939300\t159939600\t0.4679\t63\nchr4\t160123200\t160124100\t0.2077\t55\nchr4\t160151100\t160151400\t0.3107\t56\nchr4\t160152600\t160154400\t0.3107\t56\nchr4\t160476600\t160476900\t0.1946\t75\nchr4\t160575600\t160575900\t0.2249\t80\nchr4\t160578900\t160579200\t0.3631\t73\nchr4\t160659000\t160660800\t0.012\t82\nchr4\t161028600\t161030100\t0.5428\t40\nchr4\t161084700\t161085300\t0.49\t58\nchr4\t161288400\t161288700\t0.5477\t46\nchr4\t161618100\t161618700\t0.1007\t76\nchr4\t161636700\t161639100\t0.0261\t79\nchr4\t161974200\t161974800\t0.1004\t79\nchr4\t162153600\t162153900\t0.2556\t32\nchr4\t162466500\t162467100\t0.152\t70\nchr4\t162873300\t162873600\t0.5096\t51\nchr4\t162942000\t162942300\t0.4841\t58\nchr4\t163203900\t163204200\t0.3586\t29\nchr4\t163207500\t163207800\t0.1935\t122\nchr4\t163209300\t163212300\t0.1935\t122\nchr4\t163573800\t163574700\t0.3209\t91\nchr4\t163580700\t163581000\t0.5612\t43\nchr4\t163634700\t163636500\t0.0843\t63\nchr4\t163637700\t163638000\t0.0843\t63\nchr4\t163737600\t163737900\t0.2428\t49\nchr4\t163824300\t163824900\t0.2087\t47\nchr4\t163979100\t163980600\t0.1311\t74\nchr4\t164102100\t164106600\t0.0478\t67\nchr4\t164143200\t164143500\t0.1484\t84\nchr4\t164144700\t164146200\t0.1484\t84\nchr4\t164242200\t164243400\t0.3046\t71\nchr4\t164245800\t164247300\t0.3423\t61\nchr4\t164352000\t164355600\t0\t91\nchr4\t164470200\t164470500\t0.1398\t92\nchr4\t164553600\t164558400\t0.0415\t72\nchr4\t164915100\t164916000\t0.1404\t49\nchr4\t164969400\t164970300\t0.3682\t82\nchr4\t165957900\t165958800\t0.1497\t88\nchr4\t166235700\t166236000\t0.3445\t82\nchr4\t166266900\t166267200\t0.4417\t75\nchr4\t166448100\t166449300\t0.0036\t87\nchr4\t166464600\t166466400\t0.1251\t92\nchr4\t166468200\t166469100\t0.1251\t92\nchr4\t166554900\t166555500\t0.4991\t75\nchr4\t166570500\t166575900\t0\t93\nchr4\t166579800\t166580700\t0.0742\t593\nchr4\t166603500\t166603800\t0.539\t86\nchr4\t166755900\t166761900\t0\t99\nchr4\t166851900\t166852200\t0.4828\t78\nchr4\t167276100\t167277000\t0.385\t72\nchr4\t167280600\t167280900\t0.3378\t71\nchr4\t167345100\t167345400\t0.4274\t67\nchr4\t167347800\t167348400\t0.1468\t54\nchr4\t167709300\t167709600\t0.4349\t52\nchr4\t168155700\t168156000\t0.0642\t273\nchr4\t168442500\t168442800\t0.0227\t89\nchr4\t168444000\t168447300\t0.0227\t89\nchr4\t168703200\t168703800\t0.3594\t78\nchr4\t168793200\t168793500\t0.6595\t44\nchr4\t169515600\t169521300\t0\t86\nchr4\t169545300\t169545600\t0.5301\t69\nchr4\t169778400\t169778700\t0.2947\t77\nchr4\t169792500\t169793400\t0.2198\t54\nchr4\t169839300\t169839600\t0.3951\t55\nchr4\t169878900\t169879200\t0.2068\t60\nchr4\t170238300\t170238600\t0.4475\t23\nchr4\t170255700\t170256300\t0.1693\t79\nchr4\t170356200\t170358000\t0.2124\t71\nchr4\t170433900\t170434200\t0.286\t68\nchr4\t170435400\t170436600\t0.0916\t71\nchr4\t170463900\t170464200\t0.2649\t21\nchr4\t170783700\t170784900\t0.4503\t102\nchr4\t170991600\t170991900\t0.342\t47\nchr4\t171093900\t171094200\t0.2003\t126\nchr4\t171296400\t171296700\t0.4629\t45\nchr4\t171548100\t171548400\t0.536\t54\nchr4\t172178700\t172179600\t0.2974\t69\nchr4\t172341000\t172341300\t0.5949\t78\nchr4\t173220900\t173221200\t0.4781\t63\nchr4\t173483700\t173484000\t0.2593\t14\nchr4\t173867100\t173867700\t0.0509\t47\nchr4\t174224700\t174225000\t0.6586\t16\nchr4\t174780000\t174782400\t0.1582\t85\nchr4\t174857700\t174859800\t0.0107\t64\nchr4\t175021200\t175021500\t0.4614\t66\nchr4\t175023000\t175025700\t0.1491\t75\nchr4\t175206300\t175209000\t0.0722\t83\nchr4\t175257600\t175257900\t0.4578\t56\nchr4\t175535100\t175535400\t0.3135\t78\nchr4\t175637100\t175637700\t0.0629\t258\nchr4\t175812300\t175812600\t0.4147\t86\nchr4\t176693400\t176696700\t0.308\t94\nchr4\t176935200\t176935500\t0.2561\t71\nchr4\t176948100\t176948400\t0.5492\t34\nchr4\t177235800\t177236100\t0.3561\t25\nchr4\t177593100\t177593400\t0.4912\t20\nchr4\t177845700\t177846000\t0.1177\t83\nchr4\t177847200\t177847500\t0.1177\t83\nchr4\t177998700\t178000200\t0.1479\t72\nchr4\t178017600\t178020900\t0.368\t74\nchr4\t178862100\t178862400\t0.4201\t66\nchr4\t179377500\t179377800\t0.3127\t63\nchr4\t179534100\t179534400\t0.5092\t38\nchr4\t179640600\t179640900\t0.4999\t53\nchr4\t179642100\t179642400\t0.2336\t68\nchr4\t180128400\t180129600\t0.0816\t97\nchr4\t180237900\t180238800\t0.3517\t55\nchr4\t180495900\t180496500\t0.5298\t86\nchr4\t180628200\t180628500\t0.6142\t28\nchr4\t180823500\t180823800\t0.3972\t24\nchr4\t180918600\t180918900\t0.5842\t33\nchr4\t180943800\t180945600\t0.052\t44\nchr4\t180955500\t180957000\t0\t68\nchr4\t181239000\t181242000\t0\t550\nchr4\t181409100\t181414800\t0.0672\t86\nchr4\t181773900\t181775100\t0.0017\t84\nchr4\t182124900\t182125200\t0.3622\t55\nchr4\t182358600\t182358900\t0.415\t79\nchr4\t182360100\t182360400\t0.1711\t56\nchr4\t182780100\t182783100\t0.1285\t69\nchr4\t182832000\t182834700\t0.0213\t42\nchr4\t183277500\t183277800\t0.1859\t74\nchr4\t183336900\t183337200\t0\t35\nchr4\t183382500\t183382800\t0.2982\t18\nchr4\t183487200\t183487500\t0.6955\t41\nchr4\t183553200\t183553500\t0.5971\t36\nchr4\t183639900\t183640800\t0.0011\t58\nchr4\t183735000\t183735300\t0\t22\nchr4\t183736500\t183737700\t0.1183\t76\nchr4\t183851100\t183852300\t0.3248\t103\nchr4\t184140300\t184140900\t0.0896\t67\nchr4\t184209600\t184212600\t0.175\t92\nchr4\t184213800\t184214100\t0.175\t92\nchr4\t184858200\t184858800\t0.2965\t48\nchr4\t184966500\t184967700\t0.1565\t48\nchr4\t185234400\t185234700\t0.2781\t37\nchr4\t185443800\t185444100\t0.5181\t36\nchr4\t185796600\t185796900\t0.214\t43\nchr4\t185826900\t185827800\t0.4625\t318\nchr4\t185999700\t186000000\t0.6063\t80\nchr4\t186057000\t186057900\t0.5403\t20\nchr4\t186110400\t186115800\t0\t87\nchr4\t186371400\t186372000\t0.0095\t88\nchr4\t186428100\t186428400\t0.6743\t27\nchr4\t186436200\t186436500\t0.6097\t27\nchr4\t186477000\t186478500\t0.3459\t106\nchr4\t186546900\t186547200\t0.3898\t91\nchr4\t186626100\t186627000\t0.6912\t53\nchr4\t186821400\t186821700\t0.6747\t77\nchr4\t186841800\t186842100\t0.3554\t63\nchr4\t186874500\t186874800\t0.4894\t23\nchr4\t186959700\t186972900\t0.2512\t77\nchr4\t187053000\t187053600\t0.2686\t91\nchr4\t187066800\t187067100\t0.2551\t52\nchr4\t187214400\t187214700\t0.6158\t46\nchr4\t187304400\t187305000\t0\t68\nchr4\t187529100\t187529400\t0.6552\t27\nchr4\t187876800\t187877100\t0.5158\t66\nchr4\t187896600\t187896900\t0.4007\t50\nchr4\t187948500\t187949700\t0\t73\nchr4\t187955100\t187956600\t0\t66\nchr4\t188151900\t188154600\t0.0681\t21\nchr4\t188197200\t188197500\t0.3788\t18\nchr4\t188216400\t188216700\t0.6439\t11\nchr4\t188269500\t188269800\t0.5795\t15\nchr4\t188394300\t188394600\t0.3957\t37\nchr4\t188445000\t188448900\t0.0065\t65\nchr4\t188504400\t188505000\t0.2662\t182\nchr4\t188558700\t188562000\t0.0947\t97\nchr4\t188739600\t188741700\t0.0433\t80\nchr4\t188874300\t188874600\t0.5458\t30\nchr4\t188904900\t188905200\t0.5389\t69\nchr4\t188973900\t188975100\t0.3393\t43\nchr4\t189011400\t189011700\t0.4976\t38\nchr4\t189036000\t189036300\t0.1786\t176\nchr4\t189048600\t189048900\t0.2906\t16\nchr4\t189051900\t189052200\t0.6669\t56\nchr4\t189108600\t189108900\t0.458\t52\nchr4\t189137100\t189143100\t0\t72\nchr4\t189155400\t189155700\t0.1257\t53\nchr4\t189232800\t189235200\t0.4316\t81\nchr4\t189277500\t189277800\t0.5923\t16\nchr4\t189280200\t189280500\t0.6516\t83\nchr4\t189296700\t189297000\t0.2666\t67\nchr4\t189307500\t189309300\t0.2123\t76\nchr4\t189314400\t189315000\t0.0744\t105\nchr4\t189332700\t189333000\t0\t21\nchr4\t189380100\t189380700\t0.5222\t96\nchr4\t189400200\t189400500\t0.2065\t106\nchr4\t189403800\t189404100\t0.2819\t58\nchr4\t189460800\t189461400\t0.0254\t70\nchr4\t189466800\t189467100\t0.6199\t57\nchr4\t189490500\t189492000\t0.1042\t130\nchr4\t189630000\t189630300\t0.2785\t70\nchr4\t189645300\t189646500\t0.3403\t69\nchr4\t189651600\t189652200\t0.1493\t99\nchr4\t189653700\t189654000\t0.1493\t99\nchr4\t189669300\t189676500\t0\t43\nchr4\t189677700\t189686100\t0\t46\nchr4\t189688200\t189702900\t0\t60\nchr4\t189705000\t189705300\t0.4716\t71\nchr4\t189728400\t189728700\t0.504\t61\nchr4\t189798300\t189798600\t0.2476\t63\nchr4\t189810600\t189810900\t0.3499\t67\nchr4\t189820500\t189820800\t0.6278\t46\nchr4\t189835800\t189837300\t0.1925\t1488\nchr4\t189846000\t189847200\t0.3817\t246\nchr4\t189881100\t189881700\t0.5662\t504\nchr4\t189980700\t189981000\t0.6246\t26\nchr4\t190002900\t190003200\t0.6796\t70\nchr4\t190021500\t190032000\t0.0161\t567\nchr4\t190038000\t190040100\t0.0262\t61\nchr4\t190042500\t190046400\t0\t100\nchr4\t190047900\t190050000\t0\t100\nchr4\t190051800\t190056300\t0\t100\nchr4\t190057500\t190059000\t0.1497\t133\nchr4\t190060200\t190061400\t0.1497\t133\nchr4\t190065300\t190106100\t0\t815\nchr4\t190113300\t190119300\t0.0484\t284\nchr4\t190121100\t190123200\t0.0484\t284\nchr4\t190173000\t190204800\t0\t20904\nchr5\t9900\t12000\t0\t1344\nchr5\t43200\t43800\t0.1825\t66\nchr5\t73200\t73500\t0.6259\t97\nchr5\t83400\t85200\t0.2601\t64\nchr5\t100500\t101100\t0.1758\t53\nchr5\t165300\t166500\t0.5813\t69\nchr5\t209100\t209700\t0.2422\t39\nchr5\t211500\t213000\t0.1488\t39\nchr5\t216300\t216900\t0.3972\t49\nchr5\t254100\t254400\t0.342\t52\nchr5\t259800\t262200\t0.1675\t68\nchr5\t279900\t280200\t0.4253\t44\nchr5\t293400\t294000\t0.1222\t80\nchr5\t309600\t309900\t0.1876\t71\nchr5\t344400\t344700\t0.1329\t54\nchr5\t356400\t359400\t0\t54\nchr5\t391500\t392400\t0.3038\t117\nchr5\t394200\t394500\t0.3591\t59\nchr5\t415200\t415800\t0.4309\t136\nchr5\t474300\t474600\t0.2955\t47\nchr5\t486900\t487500\t0.2205\t19\nchr5\t495300\t495900\t0.0356\t34\nchr5\t552300\t553500\t0.2797\t148\nchr5\t561900\t565800\t0.0341\t43\nchr5\t628500\t633000\t0\t238\nchr5\t649200\t651000\t0.2839\t67\nchr5\t678300\t678600\t0.6334\t69\nchr5\t679800\t680400\t0.5346\t55\nchr5\t687300\t690900\t0\t77\nchr5\t694500\t695400\t0\t67\nchr5\t697800\t698100\t0.1368\t72\nchr5\t699600\t699900\t0.4069\t50\nchr5\t711900\t712500\t0.1478\t68\nchr5\t723600\t727800\t0.1159\t75\nchr5\t734400\t741600\t0\t76\nchr5\t746700\t747300\t0.0764\t58\nchr5\t754800\t756300\t0.0185\t72\nchr5\t765000\t765300\t0.5574\t66\nchr5\t767700\t769500\t0\t70\nchr5\t779400\t783000\t0\t75\nchr5\t785700\t786900\t0.0045\t67\nchr5\t789000\t789600\t0.3893\t52\nchr5\t796200\t796500\t0.35\t86\nchr5\t809100\t812100\t0.0297\t89\nchr5\t825900\t827100\t0\t67\nchr5\t828600\t830700\t0.0154\t62\nchr5\t832200\t832800\t0.1663\t76\nchr5\t838800\t839400\t0.0692\t55\nchr5\t847500\t848700\t0.119\t82\nchr5\t878700\t880500\t0\t90\nchr5\t897300\t900000\t0\t61\nchr5\t975900\t976200\t0.6358\t33\nchr5\t981900\t982200\t0.6037\t53\nchr5\t1022100\t1026300\t0.169\t96\nchr5\t1070100\t1073400\t0.0532\t45\nchr5\t1170300\t1170600\t0.256\t58\nchr5\t1191300\t1192500\t0.3747\t18\nchr5\t1272600\t1273800\t0.1948\t54\nchr5\t1289400\t1291500\t0.1549\t103\nchr5\t1327800\t1328400\t0.438\t75\nchr5\t1329600\t1329900\t0.3258\t69\nchr5\t1332900\t1333800\t0.6381\t184\nchr5\t1339500\t1339800\t0.5114\t41\nchr5\t1422300\t1422600\t0.6586\t108\nchr5\t1456200\t1456800\t0.5491\t69\nchr5\t1539600\t1540200\t0.6064\t182\nchr5\t1569900\t1570200\t0.2046\t99\nchr5\t1574400\t1574700\t0.2764\t48\nchr5\t1586400\t1587000\t0.4751\t73\nchr5\t1598100\t1598700\t0.3915\t62\nchr5\t1625700\t1626000\t0.3704\t45\nchr5\t1644600\t1644900\t0.2396\t28\nchr5\t1663800\t1664100\t0.0993\t14\nchr5\t1682400\t1682700\t0.5003\t39\nchr5\t1710600\t1715700\t0.0234\t92\nchr5\t1842900\t1843200\t0.3115\t88\nchr5\t1857900\t1858200\t0.4332\t66\nchr5\t1968300\t1971300\t0\t83\nchr5\t2004600\t2004900\t0.6661\t61\nchr5\t2145300\t2147100\t0.3159\t396\nchr5\t2490600\t2491500\t0.3372\t131\nchr5\t2907600\t2907900\t0.4818\t46\nchr5\t3202200\t3202500\t0.5621\t73\nchr5\t3276000\t3276300\t0.5231\t58\nchr5\t3440700\t3441000\t0.2234\t84\nchr5\t3442500\t3444000\t0.2234\t84\nchr5\t3445800\t3446100\t0.6846\t105\nchr5\t3480300\t3480600\t0.3007\t66\nchr5\t3499200\t3499500\t0.1537\t26\nchr5\t3637800\t3639300\t0\t47\nchr5\t3900300\t3900600\t0.4035\t80\nchr5\t4003200\t4003500\t0.6433\t70\nchr5\t4148700\t4149000\t0.412\t45\nchr5\t4496700\t4501800\t0\t81\nchr5\t4616400\t4620900\t0.157\t82\nchr5\t5217000\t5217300\t0.4268\t53\nchr5\t5304900\t5305500\t0.4461\t115\nchr5\t5610600\t5610900\t0.685\t46\nchr5\t6363900\t6364200\t0.2695\t36\nchr5\t6571200\t6571800\t0.3505\t33\nchr5\t6774000\t6774300\t0.1265\t16\nchr5\t6966600\t6971400\t0\t64\nchr5\t7056900\t7057500\t0.0579\t91\nchr5\t7127400\t7127700\t0.4438\t66\nchr5\t7141200\t7141500\t0.3544\t29\nchr5\t7172700\t7173000\t0.2262\t40\nchr5\t7174800\t7176300\t0.2284\t55\nchr5\t7194000\t7199700\t0.0135\t83\nchr5\t7221900\t7222200\t0.5783\t22\nchr5\t7232700\t7235100\t0.1042\t105\nchr5\t7300800\t7301100\t0.4027\t20\nchr5\t7573800\t7574100\t0.3435\t32\nchr5\t7603800\t7606200\t0\t73\nchr5\t8085300\t8086500\t0.4366\t66\nchr5\t8088300\t8088600\t0.5111\t63\nchr5\t8160600\t8160900\t0.4525\t65\nchr5\t8162400\t8162700\t0.2136\t68\nchr5\t8163900\t8164200\t0.2136\t68\nchr5\t8274000\t8274600\t0.274\t75\nchr5\t8379000\t8379300\t0.2595\t62\nchr5\t8745900\t8746200\t0.5135\t96\nchr5\t8937900\t8938200\t0.1371\t35\nchr5\t9259500\t9262800\t0\t88\nchr5\t9400500\t9400800\t0.4337\t33\nchr5\t9411600\t9411900\t0.36\t32\nchr5\t9584400\t9586200\t0.0276\t132\nchr5\t10005300\t10005600\t0.4616\t35\nchr5\t10273200\t10273500\t0.3827\t22\nchr5\t10275000\t10275300\t0.4125\t33\nchr5\t10346400\t10347000\t0.0411\t69\nchr5\t10443300\t10443600\t0.5894\t48\nchr5\t10638900\t10639800\t0.4412\t37\nchr5\t12057600\t12057900\t0.5857\t56\nchr5\t12197400\t12198000\t0.0741\t70\nchr5\t12254100\t12254400\t0.425\t50\nchr5\t12453300\t12455100\t0\t74\nchr5\t12491400\t12491700\t0.2564\t47\nchr5\t12492900\t12493800\t0.2313\t69\nchr5\t13137300\t13137600\t0.4723\t62\nchr5\t13329900\t13330500\t0.0038\t11\nchr5\t13416600\t13422600\t0\t75\nchr5\t13855200\t13855500\t0.6332\t43\nchr5\t14346900\t14347500\t0.1198\t265\nchr5\t14634000\t14635200\t0.0511\t102\nchr5\t14808600\t14809200\t0.2506\t71\nchr5\t15274500\t15274800\t0.4944\t69\nchr5\t15276000\t15277200\t0.5058\t67\nchr5\t15296100\t15297000\t0.1341\t69\nchr5\t15399900\t15402000\t0.1305\t47\nchr5\t15404700\t15405000\t0.445\t53\nchr5\t15569100\t15569700\t0.2373\t80\nchr5\t15906600\t15912600\t0\t88\nchr5\t16336800\t16337700\t0.1684\t84\nchr5\t16339500\t16341300\t0.1684\t84\nchr5\t17101200\t17101800\t0.0807\t92\nchr5\t17517900\t17530500\t0\t549\nchr5\t17580600\t17599500\t0\t722\nchr5\t17707500\t17707800\t0.3737\t59\nchr5\t17749800\t17750100\t0.0438\t55\nchr5\t17751900\t17752200\t0.1899\t84\nchr5\t17840400\t17841000\t0.0139\t66\nchr5\t18096900\t18097200\t0.3832\t29\nchr5\t18474000\t18474600\t0.0862\t86\nchr5\t18842400\t18842700\t0.4877\t52\nchr5\t19051500\t19051800\t0.2322\t94\nchr5\t19161600\t19162200\t0.0042\t79\nchr5\t19163700\t19167000\t0.0042\t79\nchr5\t19863900\t19864200\t0.4746\t64\nchr5\t20555400\t20555700\t0.3583\t133\nchr5\t20644200\t20646900\t0.0024\t99\nchr5\t20700300\t20700900\t0.217\t45\nchr5\t20702100\t20703300\t0.2006\t53\nchr5\t20730900\t20731200\t0.324\t58\nchr5\t20738400\t20738700\t0.295\t71\nchr5\t20749800\t20750100\t0.4012\t59\nchr5\t20752200\t20752800\t0.3278\t67\nchr5\t20754000\t20757600\t0.0051\t57\nchr5\t20759400\t20759700\t0.0015\t70\nchr5\t20761500\t20765100\t0.0015\t70\nchr5\t20766600\t20768400\t0.0015\t70\nchr5\t20769900\t20771400\t0.3286\t51\nchr5\t20774100\t20775300\t0.4249\t61\nchr5\t20779200\t20779500\t0.4896\t60\nchr5\t20792700\t20793000\t0.2695\t49\nchr5\t20802600\t20802900\t0.5492\t65\nchr5\t20811900\t20812200\t0.63\t50\nchr5\t20823000\t20823300\t0.4699\t48\nchr5\t20841600\t20842200\t0.2631\t47\nchr5\t20861100\t20861400\t0.5855\t35\nchr5\t20868300\t20868600\t0\t26\nchr5\t20870700\t20871300\t0.166\t47\nchr5\t20874000\t20874300\t0.6562\t49\nchr5\t20921100\t20921400\t0.4419\t51\nchr5\t20932500\t20932800\t0.3809\t54\nchr5\t21108000\t21113100\t0.0494\t88\nchr5\t21271500\t21271800\t0.3653\t38\nchr5\t21294000\t21294300\t0.3937\t55\nchr5\t21299100\t21300300\t0.1353\t85\nchr5\t21315000\t21315300\t0.5279\t52\nchr5\t21332100\t21332400\t0.408\t47\nchr5\t21338100\t21338400\t0.1479\t62\nchr5\t21340800\t21341400\t0.5761\t67\nchr5\t21478500\t21478800\t0.6904\t154\nchr5\t21480300\t21480900\t0.0802\t251\nchr5\t21484800\t21485400\t0.0713\t189\nchr5\t21490200\t21491100\t0.0964\t139\nchr5\t21494700\t21495300\t0.0565\t207\nchr5\t21499800\t21500400\t0.3136\t64\nchr5\t21506100\t21507000\t0.3873\t45\nchr5\t21516600\t21517200\t0.451\t79\nchr5\t21519600\t21519900\t0.4612\t74\nchr5\t21544200\t21544500\t0.4009\t48\nchr5\t21841500\t21841800\t0.4904\t71\nchr5\t21938400\t21938700\t0.3686\t48\nchr5\t21969900\t21970200\t0.5641\t64\nchr5\t21999600\t21999900\t0.4784\t53\nchr5\t22012500\t22013100\t0.2044\t56\nchr5\t22134600\t22134900\t0.2597\t64\nchr5\t22157100\t22157400\t0.1816\t56\nchr5\t22164600\t22165200\t0.442\t64\nchr5\t22168800\t22169100\t0.288\t61\nchr5\t22321200\t22321500\t0.3878\t52\nchr5\t22488900\t22489200\t0.6674\t48\nchr5\t22821600\t22821900\t0.3017\t68\nchr5\t23526900\t23527200\t0.6794\t64\nchr5\t24091500\t24091800\t0.4265\t21\nchr5\t24370500\t24373200\t0\t69\nchr5\t24452700\t24453000\t0.4998\t30\nchr5\t25079100\t25081500\t0.1359\t68\nchr5\t25082700\t25083000\t0.1359\t68\nchr5\t25113900\t25114200\t0.4208\t69\nchr5\t25116600\t25117500\t0.2071\t74\nchr5\t25119000\t25119300\t0.2071\t74\nchr5\t25207500\t25207800\t0.0386\t94\nchr5\t25275300\t25275600\t0.4118\t48\nchr5\t25314600\t25314900\t0.4514\t47\nchr5\t25381500\t25384200\t0.2106\t96\nchr5\t25777200\t25777500\t0.0924\t19\nchr5\t25831500\t25832100\t0.2937\t46\nchr5\t26100600\t26101200\t0.4235\t70\nchr5\t26111100\t26111400\t0\t17\nchr5\t26477100\t26478000\t0.1295\t66\nchr5\t26479500\t26479800\t0.137\t112\nchr5\t26481300\t26481900\t0.137\t112\nchr5\t27047100\t27047700\t0.3412\t53\nchr5\t27209700\t27210000\t0.2892\t69\nchr5\t27211500\t27211800\t0.398\t50\nchr5\t27426600\t27426900\t0.2791\t40\nchr5\t27919500\t27919800\t0.2146\t54\nchr5\t28064700\t28065000\t0.1754\t75\nchr5\t28197000\t28197300\t0.2408\t52\nchr5\t28200900\t28201200\t0.1019\t72\nchr5\t28502400\t28504800\t0.1895\t63\nchr5\t28613100\t28613400\t0.475\t62\nchr5\t28757700\t28758000\t0.4952\t88\nchr5\t28760400\t28760700\t0.4404\t81\nchr5\t28799700\t28802700\t0.1748\t72\nchr5\t28803900\t28804200\t0.3748\t83\nchr5\t28846500\t28847100\t0.3662\t75\nchr5\t28874700\t28875000\t0.5293\t66\nchr5\t29190600\t29191200\t0.0956\t76\nchr5\t29458800\t29459100\t0.2461\t28\nchr5\t29486100\t29490300\t0\t72\nchr5\t29877000\t29878500\t0.0493\t92\nchr5\t30012600\t30014100\t0.0853\t53\nchr5\t30426000\t30427800\t0.0546\t101\nchr5\t30486900\t30488400\t0.5428\t81\nchr5\t30490200\t30491700\t0.4334\t130\nchr5\t30818100\t30823500\t0.1184\t110\nchr5\t30860100\t30860400\t0.3609\t51\nchr5\t31203300\t31203600\t0.3866\t64\nchr5\t32185500\t32185800\t0.3674\t73\nchr5\t32208000\t32209500\t0.1095\t115\nchr5\t32516400\t32517000\t0.3675\t76\nchr5\t32822700\t32828100\t0\t83\nchr5\t32911500\t32912400\t0.1122\t81\nchr5\t33123000\t33123300\t0.0507\t109\nchr5\t33124500\t33128100\t0.0507\t109\nchr5\t33200700\t33201000\t0.4609\t41\nchr5\t33355500\t33355800\t0.4048\t28\nchr5\t33570600\t33571200\t0.3697\t85\nchr5\t33952800\t33954000\t0.0497\t97\nchr5\t34068900\t34069200\t0.2665\t57\nchr5\t34082100\t34082400\t0.6033\t64\nchr5\t34086300\t34087200\t0.2049\t59\nchr5\t34090200\t34090500\t0.2534\t36\nchr5\t34093200\t34093500\t0.2467\t50\nchr5\t34094700\t34098300\t0\t59\nchr5\t34099500\t34100100\t0.1834\t60\nchr5\t34101900\t34102200\t0.3227\t42\nchr5\t34104000\t34107300\t0\t52\nchr5\t34108800\t34109400\t0.3765\t68\nchr5\t34111500\t34111800\t0.5372\t56\nchr5\t34122600\t34122900\t0.5249\t59\nchr5\t34126200\t34126500\t0.5062\t54\nchr5\t34130400\t34130700\t0.443\t72\nchr5\t34135500\t34136100\t0.4585\t51\nchr5\t34148100\t34153800\t0\t95\nchr5\t34164300\t34164600\t0.539\t47\nchr5\t34165800\t34166100\t0.2465\t42\nchr5\t34168200\t34168500\t0.5517\t69\nchr5\t34173300\t34173900\t0.1884\t47\nchr5\t34178700\t34179300\t0.0312\t225\nchr5\t34180500\t34180800\t0.0312\t225\nchr5\t34182900\t34184100\t0.0224\t168\nchr5\t34186500\t34189200\t0.0976\t205\nchr5\t34194000\t34195200\t0.299\t226\nchr5\t34196400\t34196700\t0.299\t226\nchr5\t34198200\t34200300\t0.0113\t57\nchr5\t34204800\t34206900\t0.1681\t58\nchr5\t34212600\t34212900\t0.3219\t66\nchr5\t34227000\t34227300\t0.3918\t68\nchr5\t34231800\t34233600\t0.1284\t79\nchr5\t34241400\t34241700\t0.2516\t48\nchr5\t34245000\t34245600\t0.0692\t61\nchr5\t34248000\t34250400\t0.2087\t57\nchr5\t34251600\t34251900\t0.2087\t57\nchr5\t34254000\t34254600\t0.2087\t57\nchr5\t34269300\t34269600\t0.573\t52\nchr5\t34275900\t34276200\t0.2388\t20\nchr5\t34281000\t34281300\t0.5022\t53\nchr5\t34305000\t34307700\t0.0008\t77\nchr5\t34331100\t34331400\t0.606\t35\nchr5\t34340100\t34340400\t0.2653\t58\nchr5\t34344300\t34344600\t0.479\t38\nchr5\t34363800\t34364100\t0.2093\t65\nchr5\t34401000\t34401300\t0.4143\t41\nchr5\t34439100\t34439400\t0.3481\t116\nchr5\t35018700\t35019600\t0.2635\t80\nchr5\t35021400\t35021700\t0.2157\t79\nchr5\t35499900\t35500200\t0.495\t86\nchr5\t35568900\t35570100\t0.2551\t68\nchr5\t35614200\t35614500\t0.5983\t44\nchr5\t36291900\t36293400\t0.0775\t71\nchr5\t36321000\t36322200\t0.0467\t69\nchr5\t37159200\t37159500\t0.6068\t60\nchr5\t37458000\t37460700\t0\t64\nchr5\t37466100\t37466400\t0.6364\t66\nchr5\t38170500\t38171100\t0.3974\t75\nchr5\t38172300\t38174100\t0.0875\t88\nchr5\t38625900\t38626200\t0.3895\t69\nchr5\t38627400\t38627700\t0.3895\t69\nchr5\t38629200\t38629500\t0.3895\t69\nchr5\t38821200\t38821500\t0.5228\t56\nchr5\t39787800\t39793500\t0\t139\nchr5\t39916800\t39917100\t0.4026\t51\nchr5\t40542000\t40547400\t0.067\t101\nchr5\t40800600\t40801800\t0.0908\t81\nchr5\t40856700\t40857000\t0.2248\t79\nchr5\t41235300\t41238300\t0.0707\t81\nchr5\t41403300\t41403900\t0.1492\t66\nchr5\t41488200\t41489100\t0.3975\t67\nchr5\t41492100\t41492400\t0.382\t109\nchr5\t41599500\t41599800\t0.1492\t57\nchr5\t41604000\t41604300\t0.5557\t43\nchr5\t41846100\t41846700\t0.3274\t74\nchr5\t41847900\t41848200\t0.3274\t74\nchr5\t41953500\t41953800\t0.3661\t69\nchr5\t42165900\t42167700\t0\t64\nchr5\t42735300\t42740100\t0.001\t95\nchr5\t42981000\t42982200\t0.0761\t80\nchr5\t43086600\t43089000\t0.0608\t81\nchr5\t43577700\t43578000\t0.3468\t54\nchr5\t43605300\t43605600\t0.4778\t34\nchr5\t43718400\t43718700\t0.2422\t82\nchr5\t43720200\t43722000\t0.2422\t82\nchr5\t44152200\t44154300\t0\t94\nchr5\t44688300\t44688900\t0.6341\t20\nchr5\t44730600\t44731200\t0.2215\t74\nchr5\t45350400\t45351600\t0.2731\t70\nchr5\t45495000\t45495600\t0.0505\t66\nchr5\t45548700\t45549000\t0.5244\t64\nchr5\t45658800\t45665400\t0\t82\nchr5\t45977400\t45978300\t0.2269\t59\nchr5\t46030800\t46032300\t0.3788\t54\nchr5\t46323300\t46323600\t0.6168\t116\nchr5\t46327800\t46328100\t0.6429\t80\nchr5\t46434600\t46434900\t0.6798\t181\nchr5\t46486200\t46492200\t0\t70\nchr5\t46493700\t46501200\t0\t136\nchr5\t46503000\t46503300\t0\t136\nchr5\t46504500\t46507800\t0\t48\nchr5\t46509300\t46515300\t0\t112\nchr5\t46518000\t46524000\t0\t101\nchr5\t46526400\t46526700\t0.2418\t12\nchr5\t46528200\t46529700\t0\t23\nchr5\t46530900\t46533600\t0\t56\nchr5\t46535100\t46538400\t0\t106\nchr5\t46540200\t46542900\t0.0305\t40\nchr5\t46545000\t46551300\t0\t98\nchr5\t46553100\t46554000\t0\t43\nchr5\t46555500\t46557300\t0.0487\t63\nchr5\t46559100\t46562400\t0\t71\nchr5\t46563600\t46570200\t0\t170\nchr5\t46572000\t46575600\t0\t129\nchr5\t46576800\t46584300\t0\t153\nchr5\t46585500\t46586400\t0\t60\nchr5\t46587600\t46599300\t0\t111\nchr5\t46600500\t46610100\t0\t192\nchr5\t46611300\t46616100\t0\t192\nchr5\t46617300\t46625100\t0\t207\nchr5\t46626600\t46627200\t0\t207\nchr5\t46628400\t46635000\t0\t98\nchr5\t46637100\t46638900\t0\t57\nchr5\t46640400\t46643100\t0\t81\nchr5\t46644900\t46674900\t0\t222\nchr5\t46676400\t46676700\t0\t222\nchr5\t46677900\t46684800\t0\t222\nchr5\t46686000\t46687500\t0\t212\nchr5\t46688700\t46689300\t0\t212\nchr5\t46691700\t46695000\t0\t116\nchr5\t46696200\t46702500\t0\t116\nchr5\t46705200\t46705500\t0.4054\t48\nchr5\t46707300\t46709100\t0\t119\nchr5\t46710300\t46716300\t0\t203\nchr5\t46717800\t46718400\t0\t62\nchr5\t46719600\t46722300\t0\t167\nchr5\t46723800\t46726500\t0\t240\nchr5\t46728000\t46728900\t0\t240\nchr5\t46730100\t46740300\t0\t240\nchr5\t46742400\t46749300\t0\t400\nchr5\t46750800\t46769400\t0\t400\nchr5\t46771800\t46784400\t0\t142\nchr5\t46785900\t46790700\t0\t142\nchr5\t46792200\t46926000\t0\t288\nchr5\t46927500\t46957500\t0\t162\nchr5\t46959300\t47068500\t0\t417\nchr5\t47073900\t47079600\t0\t114\nchr5\t47082300\t47099700\t0\t107\nchr5\t47101800\t47102400\t0.1463\t76\nchr5\t47104800\t47231700\t0\t767\nchr5\t47232900\t47242200\t0\t767\nchr5\t47243400\t47255700\t0\t767\nchr5\t47256900\t47295300\t0\t767\nchr5\t47296500\t47297400\t0\t767\nchr5\t47299200\t47300400\t0.4335\t51\nchr5\t47307000\t47309100\t0.0121\t262\nchr5\t49591500\t49593000\t0\t100\nchr5\t49601100\t49603200\t0.1512\t59888\nchr5\t49609800\t49617300\t0\t297\nchr5\t49622700\t49623000\t0.321\t40\nchr5\t49624800\t49625100\t0.5652\t39\nchr5\t49626600\t49627200\t0.0071\t398\nchr5\t49630500\t49633800\t0\t15366\nchr5\t49642500\t49648500\t0.0554\t2508\nchr5\t49649700\t49650300\t0.0554\t2508\nchr5\t49656000\t49662000\t0.1929\t49149\nchr5\t49665900\t49677300\t0\t17908\nchr5\t49678500\t49686300\t0\t17908\nchr5\t49687500\t49693500\t0\t108\nchr5\t49695000\t49720500\t0\t254\nchr5\t49721700\t49728600\t0\t493\nchr5\t49729800\t49769700\t0\t493\nchr5\t49770900\t50008500\t0\t1046\nchr5\t50009700\t50059500\t0\t1046\nchr5\t50109600\t50145300\t0\t617\nchr5\t50205600\t50205900\t0.54\t157\nchr5\t50229600\t50229900\t0.6417\t111\nchr5\t51252600\t51252900\t0.0716\t99\nchr5\t51254400\t51255300\t0.0716\t99\nchr5\t51331200\t51335400\t0.0513\t93\nchr5\t51354000\t51354300\t0.3558\t75\nchr5\t51535500\t51535800\t0.5562\t67\nchr5\t51708000\t51708300\t0.3102\t25\nchr5\t52018800\t52019400\t0.1668\t93\nchr5\t52089000\t52089300\t0.1042\t87\nchr5\t52090500\t52090800\t0.1042\t87\nchr5\t52100100\t52100400\t0.4567\t44\nchr5\t52164300\t52164600\t0.1451\t46\nchr5\t52192500\t52193100\t0.1705\t73\nchr5\t52246800\t52247100\t0.2173\t66\nchr5\t52248300\t52248900\t0.2173\t66\nchr5\t52540200\t52540500\t0.2277\t26\nchr5\t52613100\t52613400\t0.158\t66\nchr5\t52722000\t52722600\t0.2248\t71\nchr5\t52935900\t52936200\t0.2624\t31\nchr5\t53004900\t53005200\t0.5807\t69\nchr5\t53280000\t53280600\t0.3211\t112\nchr5\t54181800\t54184200\t0.1067\t59\nchr5\t54789300\t54789600\t0.4709\t60\nchr5\t54806700\t54807300\t0.3098\t84\nchr5\t55202700\t55203000\t0.6489\t32\nchr5\t55571400\t55572000\t0.1956\t83\nchr5\t55587900\t55588200\t0.1735\t75\nchr5\t55695600\t55696500\t0.1793\t54\nchr5\t55752600\t55754700\t0.134\t66\nchr5\t56799900\t56800200\t0.2368\t91\nchr5\t57352500\t57352800\t0.0187\t86\nchr5\t57354000\t57356700\t0.0187\t86\nchr5\t57377700\t57378600\t0.1883\t80\nchr5\t57471900\t57475500\t0.0505\t79\nchr5\t57866100\t57867300\t0.4377\t66\nchr5\t58290600\t58291200\t0.1269\t48\nchr5\t58384200\t58390200\t0\t89\nchr5\t58422000\t58422300\t0.3277\t61\nchr5\t58552500\t58553700\t0.1616\t88\nchr5\t58554900\t58555500\t0.2526\t67\nchr5\t58597200\t58597800\t0.1233\t20\nchr5\t58757100\t58757400\t0.3059\t60\nchr5\t59200200\t59200500\t0.4973\t35\nchr5\t59284500\t59285100\t0.0048\t67\nchr5\t59396100\t59400600\t0.2892\t67\nchr5\t59762400\t59762700\t0.4868\t44\nchr5\t60038700\t60039000\t0.4578\t58\nchr5\t60430800\t60431100\t0.4325\t92\nchr5\t60501300\t60501600\t0.3443\t71\nchr5\t60570600\t60572100\t0.2159\t92\nchr5\t61107900\t61108500\t0.3924\t75\nchr5\t61260600\t61260900\t0.5033\t45\nchr5\t61375800\t61377000\t0.151\t61\nchr5\t62512500\t62513100\t0.2589\t62\nchr5\t62598300\t62598600\t0.4366\t36\nchr5\t62799300\t62803500\t0.1572\t74\nchr5\t62817600\t62823300\t0\t73\nchr5\t62868300\t62868600\t0.3029\t58\nchr5\t63083100\t63083700\t0.3937\t92\nchr5\t63277500\t63277800\t0.3056\t28\nchr5\t63324900\t63325200\t0.4898\t34\nchr5\t63408600\t63408900\t0.4673\t33\nchr5\t63777000\t63777300\t0.5938\t54\nchr5\t63942300\t63943800\t0.0725\t81\nchr5\t64130700\t64132800\t0.2507\t103\nchr5\t64267200\t64267500\t0.5675\t62\nchr5\t64359000\t64359300\t0.4174\t58\nchr5\t64466700\t64470600\t0\t68\nchr5\t64477800\t64481400\t0\t102\nchr5\t64710000\t64714200\t0.0028\t77\nchr5\t65164500\t65169600\t0\t86\nchr5\t65372400\t65372700\t0.3984\t88\nchr5\t65374200\t65374500\t0.3984\t88\nchr5\t65499900\t65500500\t0.2436\t65\nchr5\t65732700\t65733000\t0.4129\t88\nchr5\t65940000\t65940300\t0.6204\t81\nchr5\t66258600\t66261000\t0.2975\t75\nchr5\t66751800\t66753900\t0.074\t83\nchr5\t67250100\t67252200\t0.3054\t58\nchr5\t67539900\t67540200\t0.4185\t54\nchr5\t67737000\t67737300\t0.3446\t75\nchr5\t67740300\t67740600\t0.2556\t86\nchr5\t67742100\t67742400\t0.2556\t86\nchr5\t67820400\t67820700\t0.4694\t25\nchr5\t67821900\t67823400\t0.1797\t79\nchr5\t67890900\t67891200\t0.081\t76\nchr5\t67892400\t67894800\t0.081\t76\nchr5\t68007900\t68009700\t0.0167\t63\nchr5\t68262600\t68263200\t0.4586\t45\nchr5\t69223500\t69223800\t0.5149\t95\nchr5\t69457200\t69457500\t0.4509\t82\nchr5\t69475500\t69476100\t0.4096\t61\nchr5\t69480300\t69480900\t0.3663\t48\nchr5\t69534000\t69548400\t0\t62\nchr5\t69550500\t69554400\t0\t62\nchr5\t69555900\t69558900\t0\t76\nchr5\t69560400\t69561600\t0\t388\nchr5\t69562800\t69632700\t0\t388\nchr5\t69634200\t69791400\t0\t388\nchr5\t69792600\t70028700\t0\t388\nchr5\t70029900\t70046400\t0\t388\nchr5\t70048800\t70442400\t0\t141\nchr5\t70443900\t71008800\t0\t336\nchr5\t71015400\t71054100\t0\t86\nchr5\t71055300\t71077800\t0\t89\nchr5\t71079600\t71095800\t0\t89\nchr5\t71097000\t71103300\t0\t421\nchr5\t71104500\t71364300\t0\t421\nchr5\t71367900\t71368200\t0.2164\t69\nchr5\t71390700\t71391000\t0.4425\t59\nchr5\t71398200\t71398500\t0.2063\t66\nchr5\t71402100\t71402400\t0.3993\t54\nchr5\t71524800\t71525100\t0.3382\t75\nchr5\t71604600\t71605200\t0.0968\t73\nchr5\t71606400\t71609700\t0.0968\t73\nchr5\t71851800\t71853600\t0.0451\t60\nchr5\t72484200\t72484500\t0.5203\t44\nchr5\t72532200\t72532500\t0.5721\t68\nchr5\t73048800\t73049100\t0.5449\t34\nchr5\t73644000\t73644300\t0.4455\t81\nchr5\t73875300\t73877700\t0.205\t102\nchr5\t74702100\t74702400\t0.3497\t68\nchr5\t74711100\t74711400\t0.3136\t74\nchr5\t75606000\t75606600\t0.0197\t76\nchr5\t75642300\t75648000\t0.0048\t109\nchr5\t75700500\t75701400\t0.1621\t67\nchr5\t75819300\t75819600\t0.529\t79\nchr5\t75882900\t75883500\t0.2255\t76\nchr5\t75897600\t75897900\t0.6499\t111\nchr5\t75954900\t75956400\t0.3788\t81\nchr5\t76121400\t76121700\t0.3495\t66\nchr5\t76170000\t76173000\t0.0479\t85\nchr5\t76233000\t76233600\t0.1999\t102\nchr5\t76360200\t76360800\t0.2775\t92\nchr5\t76362000\t76362300\t0.4442\t107\nchr5\t76983900\t76984500\t0.3242\t63\nchr5\t77042100\t77044200\t0.2174\t65\nchr5\t77386800\t77387100\t0.5082\t34\nchr5\t77477700\t77478000\t0.4153\t70\nchr5\t77612700\t77613000\t0.4391\t62\nchr5\t77614200\t77614500\t0.4391\t62\nchr5\t77794500\t77795100\t0.071\t65\nchr5\t78278400\t78278700\t0.4656\t27\nchr5\t78452400\t78452700\t0.3865\t73\nchr5\t78455100\t78456300\t0.2099\t56\nchr5\t78469800\t78470100\t0.4604\t78\nchr5\t78582300\t78583800\t0.2134\t88\nchr5\t78619800\t78620400\t0.0901\t46\nchr5\t78807900\t78808200\t0.662\t39\nchr5\t78867900\t78870300\t0.344\t63\nchr5\t78871500\t78872700\t0.344\t63\nchr5\t78981000\t78982200\t0.2902\t53\nchr5\t79096500\t79098600\t0.1367\t79\nchr5\t79779000\t79784700\t0\t108\nchr5\t79907100\t79907400\t0.2717\t48\nchr5\t80626200\t80628600\t0.1747\t67\nchr5\t80692800\t80693400\t0.3621\t47\nchr5\t80743500\t80743800\t0.3094\t34\nchr5\t81033000\t81033600\t0.0579\t59\nchr5\t81054300\t81054900\t0.1548\t81\nchr5\t81197100\t81197400\t0.5101\t60\nchr5\t81406200\t81406500\t0.3282\t37\nchr5\t81455400\t81455700\t0.4006\t24\nchr5\t81596100\t81597000\t0.0147\t72\nchr5\t81616200\t81621900\t0\t87\nchr5\t82047900\t82048500\t0.4526\t67\nchr5\t82125900\t82126800\t0.0052\t71\nchr5\t82134000\t82134900\t0\t70\nchr5\t82139700\t82141200\t0.132\t57\nchr5\t82369500\t82371900\t0.0023\t77\nchr5\t82429800\t82433100\t0.0092\t91\nchr5\t82504500\t82506000\t0.0797\t89\nchr5\t82867200\t82870500\t0.2191\t79\nchr5\t82937700\t82938300\t0.0262\t50\nchr5\t83263500\t83264100\t0.3192\t78\nchr5\t83316600\t83320200\t0\t69\nchr5\t83458200\t83461500\t0.0807\t97\nchr5\t83463300\t83463600\t0.0807\t97\nchr5\t83610300\t83610600\t0.4909\t21\nchr5\t83902500\t83903400\t0.2242\t87\nchr5\t84176100\t84176400\t0.2734\t213\nchr5\t84208500\t84208800\t0.5612\t42\nchr5\t84319200\t84319500\t0.3647\t42\nchr5\t84471600\t84472200\t0.4635\t67\nchr5\t84652200\t84652500\t0.16\t24\nchr5\t84659100\t84659400\t0.0984\t25\nchr5\t85358700\t85359600\t0.0861\t65\nchr5\t85638900\t85639500\t0.0641\t60\nchr5\t85641000\t85642500\t0.3334\t104\nchr5\t85662600\t85663200\t0.0491\t80\nchr5\t86446200\t86446500\t0.4996\t46\nchr5\t86510700\t86516700\t0.0083\t94\nchr5\t86847900\t86848200\t0.4369\t77\nchr5\t86921700\t86922000\t0.6558\t12\nchr5\t87091200\t87091800\t0.0578\t72\nchr5\t87470700\t87471300\t0.0274\t51\nchr5\t88011300\t88011600\t0.4535\t65\nchr5\t88055100\t88057500\t0.4544\t64\nchr5\t88616400\t88616700\t0.4072\t66\nchr5\t88736400\t88736700\t0.5388\t48\nchr5\t88901100\t88901700\t0.548\t45\nchr5\t88904100\t88904400\t0.1865\t37\nchr5\t88913100\t88913400\t0.5437\t60\nchr5\t89186100\t89186700\t0.4524\t124\nchr5\t89624400\t89624700\t0.2673\t56\nchr5\t89625900\t89626200\t0.4417\t64\nchr5\t89737800\t89738100\t0.4893\t128\nchr5\t90075000\t90075900\t0.1149\t84\nchr5\t90077100\t90079200\t0.1149\t84\nchr5\t90209700\t90210300\t0.4193\t57\nchr5\t90211800\t90213000\t0.1132\t82\nchr5\t90443100\t90444600\t0.0229\t85\nchr5\t90564600\t90564900\t0.5598\t38\nchr5\t90594900\t90595500\t0.4896\t66\nchr5\t90663300\t90666000\t0.3252\t70\nchr5\t90667200\t90667500\t0.3252\t70\nchr5\t90818100\t90820500\t0.3672\t91\nchr5\t90925800\t90926100\t0.1742\t74\nchr5\t90928800\t90929100\t0.1742\t74\nchr5\t91273500\t91274700\t0.2542\t77\nchr5\t91278900\t91279200\t0.2109\t20\nchr5\t92054700\t92055000\t0.3853\t79\nchr5\t92184900\t92185200\t0.5353\t29\nchr5\t92194800\t92198100\t0.0126\t88\nchr5\t92299200\t92301900\t0.0818\t109\nchr5\t92356800\t92357100\t0.5785\t59\nchr5\t92892900\t92893200\t0.421\t61\nchr5\t93137700\t93138000\t0.3421\t83\nchr5\t93148800\t93149100\t0.1465\t69\nchr5\t93213900\t93218400\t0.0468\t93\nchr5\t93261900\t93266400\t0.0976\t86\nchr5\t93341400\t93341700\t0.5514\t37\nchr5\t93485700\t93486300\t0.2476\t61\nchr5\t94580700\t94581000\t0.3546\t59\nchr5\t94773900\t94774200\t0.2858\t57\nchr5\t95061300\t95061600\t0.5442\t39\nchr5\t95201400\t95201700\t0.4098\t60\nchr5\t95210400\t95210700\t0.2313\t78\nchr5\t95492400\t95492700\t0.0796\t251\nchr5\t95829300\t95829600\t0.4404\t51\nchr5\t95927400\t95927700\t0.5441\t34\nchr5\t96007500\t96008100\t0.5042\t54\nchr5\t96103500\t96105300\t0.0657\t76\nchr5\t96106800\t96107100\t0.2258\t61\nchr5\t96241800\t96242100\t0.2667\t70\nchr5\t96400800\t96401100\t0.3246\t69\nchr5\t96681300\t96681600\t0.6225\t69\nchr5\t96732000\t96732600\t0.2159\t48\nchr5\t97294200\t97295400\t0.3366\t72\nchr5\t97382400\t97382700\t0.2503\t66\nchr5\t97515900\t97518600\t0.1031\t80\nchr5\t97524600\t97524900\t0.46\t64\nchr5\t97632000\t97632900\t0.1585\t71\nchr5\t97641900\t97642800\t0.3195\t81\nchr5\t97810800\t97812600\t0.2236\t75\nchr5\t97813800\t97815600\t0.2348\t98\nchr5\t98138700\t98139300\t0.2448\t67\nchr5\t98278200\t98278500\t0.2969\t55\nchr5\t98508300\t98508600\t0.4117\t48\nchr5\t98548200\t98552400\t0.0426\t80\nchr5\t98704800\t98705100\t0.1931\t55\nchr5\t98821800\t98822100\t0.4111\t62\nchr5\t98851500\t98851800\t0.36\t31\nchr5\t99249600\t99249900\t0.5469\t57\nchr5\t99401700\t99402300\t0.0156\t59\nchr5\t99409800\t99412200\t0.0368\t67\nchr5\t99415500\t99415800\t0.1594\t59\nchr5\t99417300\t99417600\t0.1594\t59\nchr5\t99419100\t99419400\t0.5407\t48\nchr5\t99423300\t99424800\t0\t74\nchr5\t99426000\t99430500\t0\t74\nchr5\t99432300\t99433800\t0\t74\nchr5\t99455100\t99455700\t0.4905\t92\nchr5\t99474600\t99474900\t0.3287\t51\nchr5\t99481800\t99482100\t0.3163\t67\nchr5\t99484200\t99484800\t0.1483\t41\nchr5\t99489300\t99489600\t0.3591\t67\nchr5\t99493200\t99493500\t0.1792\t44\nchr5\t99495000\t99496800\t0.1979\t59\nchr5\t99498000\t99499800\t0\t67\nchr5\t99502200\t99502500\t0.531\t61\nchr5\t99503700\t99504000\t0.4445\t51\nchr5\t99517500\t99521700\t0.151\t66\nchr5\t99523800\t99525900\t0.3486\t97\nchr5\t99529800\t99530700\t0.3473\t51\nchr5\t99533100\t99533400\t0.5387\t43\nchr5\t99537300\t99540000\t0.0409\t51\nchr5\t99576600\t99578700\t0.1045\t66\nchr5\t99583800\t99585000\t0.1788\t74\nchr5\t99690900\t99692400\t0.1197\t74\nchr5\t99733500\t99735600\t0.0489\t70\nchr5\t99829200\t99829500\t0.3099\t56\nchr5\t99848700\t99849000\t0.4475\t64\nchr5\t99855300\t99855900\t0.0088\t84\nchr5\t99857100\t99861900\t0.0088\t84\nchr5\t99896400\t99898500\t0.1137\t62\nchr5\t100058100\t100059300\t0.0352\t55\nchr5\t100062000\t100062600\t0.1254\t98\nchr5\t100069800\t100071300\t0.2235\t60\nchr5\t100075500\t100076400\t0.0021\t87\nchr5\t100081500\t100082100\t0.4295\t52\nchr5\t100085700\t100086000\t0.1287\t67\nchr5\t100087800\t100088100\t0.1087\t78\nchr5\t100090800\t100091100\t0.4534\t67\nchr5\t100092900\t100093200\t0.2818\t55\nchr5\t100100100\t100100400\t0.3377\t54\nchr5\t100332600\t100333500\t0\t71\nchr5\t100335000\t100341900\t0\t71\nchr5\t100347900\t100348200\t0.0038\t59\nchr5\t100349400\t100350000\t0.0038\t59\nchr5\t100351800\t100355400\t0.0418\t67\nchr5\t100359300\t100359600\t0.3365\t62\nchr5\t100362900\t100363800\t0.0095\t54\nchr5\t100375200\t100376100\t0.1989\t77\nchr5\t100383600\t100383900\t0.1799\t62\nchr5\t100386000\t100386300\t0.4734\t91\nchr5\t100388700\t100389300\t0.1659\t78\nchr5\t100391100\t100392600\t0.1659\t78\nchr5\t100395300\t100397400\t0.0362\t80\nchr5\t100423800\t100424100\t0.202\t20\nchr5\t100587900\t100588200\t0.5243\t37\nchr5\t101020200\t101021400\t0.4492\t84\nchr5\t101058900\t101059500\t0.3789\t73\nchr5\t101108700\t101109000\t0.5408\t46\nchr5\t101110500\t101110800\t0.1996\t63\nchr5\t101126700\t101127000\t0.1793\t74\nchr5\t101181000\t101181300\t0.3345\t71\nchr5\t101184000\t101185800\t0.3345\t71\nchr5\t101290200\t101290800\t0.3109\t67\nchr5\t101302800\t101303700\t0.1365\t81\nchr5\t101923500\t101924100\t0.4007\t50\nchr5\t102131400\t102137400\t0\t82\nchr5\t102189600\t102194400\t0.0006\t76\nchr5\t102207000\t102207600\t0.3457\t71\nchr5\t102675600\t102675900\t0.1402\t77\nchr5\t102683700\t102684900\t0.1998\t77\nchr5\t103048800\t103052700\t0.0678\t58\nchr5\t103695000\t103695300\t0.5114\t41\nchr5\t103726500\t103726800\t0.6139\t50\nchr5\t103998300\t103999200\t0.1605\t85\nchr5\t104074500\t104078100\t0.1363\t97\nchr5\t104079300\t104079600\t0.1363\t97\nchr5\t104357700\t104360700\t0.0252\t73\nchr5\t104447100\t104448900\t0.0007\t90\nchr5\t104450700\t104451300\t0.1225\t57\nchr5\t104518500\t104524500\t0\t98\nchr5\t104719500\t104719800\t0.285\t71\nchr5\t104721900\t104722800\t0.285\t71\nchr5\t105053100\t105053400\t0.6699\t56\nchr5\t105166500\t105166800\t0.5108\t37\nchr5\t105255300\t105255600\t0.2717\t53\nchr5\t105464700\t105465000\t0.2525\t73\nchr5\t105513300\t105515400\t0.1262\t79\nchr5\t105517200\t105518700\t0.0381\t95\nchr5\t106148100\t106149300\t0\t87\nchr5\t106388700\t106389000\t0.557\t21\nchr5\t106427100\t106428300\t0.2163\t66\nchr5\t106535400\t106535700\t0.5688\t88\nchr5\t106564200\t106564500\t0.3666\t14\nchr5\t106626300\t106626600\t0.4177\t33\nchr5\t106695600\t106696500\t0.2534\t76\nchr5\t106714500\t106715100\t0.4371\t68\nchr5\t106717200\t106717500\t0.5191\t64\nchr5\t106771500\t106771800\t0.3795\t58\nchr5\t106902600\t106902900\t0.1538\t82\nchr5\t108558600\t108558900\t0.2377\t76\nchr5\t109013400\t109014300\t0.4712\t73\nchr5\t109259400\t109265400\t0\t95\nchr5\t109341300\t109343100\t0.2965\t61\nchr5\t109353900\t109354200\t0.6058\t27\nchr5\t109462500\t109462800\t0.3592\t86\nchr5\t109532100\t109532400\t0.2858\t38\nchr5\t110172600\t110172900\t0.1841\t70\nchr5\t110597400\t110597700\t0.3791\t58\nchr5\t110655300\t110655600\t0.157\t55\nchr5\t110776500\t110776800\t0.3954\t72\nchr5\t110885400\t110885700\t0.529\t59\nchr5\t110990100\t110990400\t0.1583\t44\nchr5\t111085500\t111086100\t0.495\t57\nchr5\t111088200\t111089100\t0.1981\t63\nchr5\t111302400\t111308100\t0.0015\t156\nchr5\t111355800\t111356100\t0.3734\t76\nchr5\t111576000\t111577200\t0.4162\t70\nchr5\t111885000\t111885300\t0.4208\t65\nchr5\t111886500\t111886800\t0.4208\t65\nchr5\t112133400\t112134900\t0.345\t81\nchr5\t113106000\t113106300\t0.597\t47\nchr5\t113491800\t113492100\t0.4453\t73\nchr5\t113545800\t113546100\t0.5017\t36\nchr5\t113853900\t113854200\t0.4055\t78\nchr5\t114230400\t114231600\t0.0085\t59\nchr5\t114357300\t114357900\t0.2952\t65\nchr5\t114641700\t114642000\t0.1743\t92\nchr5\t114675300\t114675600\t0.3768\t68\nchr5\t114944400\t114944700\t0.4678\t30\nchr5\t115061100\t115061400\t0.2253\t56\nchr5\t115410600\t115413300\t0.1216\t71\nchr5\t115421100\t115422000\t0.1101\t67\nchr5\t116149500\t116151000\t0.3507\t66\nchr5\t116252100\t116253900\t0.1031\t79\nchr5\t116558400\t116558700\t0.364\t27\nchr5\t116821200\t116821800\t0.3569\t85\nchr5\t116922300\t116922600\t0.251\t45\nchr5\t117339600\t117341100\t0.2058\t72\nchr5\t117342600\t117342900\t0.3139\t103\nchr5\t117358800\t117359100\t0.4231\t46\nchr5\t117491700\t117492300\t0.1766\t72\nchr5\t117528000\t117529500\t0.2697\t70\nchr5\t117531300\t117531600\t0.2697\t70\nchr5\t117541800\t117542400\t0.5861\t34\nchr5\t117543600\t117543900\t0.1526\t59\nchr5\t117851700\t117852000\t0.6027\t50\nchr5\t117908100\t117908400\t0.1311\t40\nchr5\t117931500\t117931800\t0.2104\t61\nchr5\t118046100\t118046400\t0.0367\t25\nchr5\t118177500\t118178100\t0.4103\t58\nchr5\t118388400\t118388700\t0.3759\t69\nchr5\t118495200\t118495500\t0.3771\t58\nchr5\t118542000\t118542600\t0.1264\t96\nchr5\t118991400\t118991700\t0.5965\t45\nchr5\t119295900\t119296200\t0.3483\t59\nchr5\t119605200\t119605500\t0.3012\t52\nchr5\t119679600\t119679900\t0.6697\t48\nchr5\t119685000\t119690400\t0\t74\nchr5\t119778600\t119779800\t0.427\t83\nchr5\t120179100\t120179400\t0.5796\t96\nchr5\t120195000\t120195600\t0.1535\t77\nchr5\t120281400\t120281700\t0.2431\t71\nchr5\t120311400\t120312000\t0.062\t63\nchr5\t120666600\t120666900\t0.2673\t85\nchr5\t121411800\t121412100\t0.0899\t83\nchr5\t121419600\t121419900\t0.4252\t42\nchr5\t121951800\t121953000\t0.0038\t77\nchr5\t121996200\t121997100\t0.0444\t79\nchr5\t122240400\t122244900\t0.0007\t116\nchr5\t122379000\t122381700\t0.07\t76\nchr5\t122510400\t122513400\t0.1955\t76\nchr5\t122627700\t122628000\t0.5424\t35\nchr5\t122911500\t122912400\t0.2367\t58\nchr5\t122914500\t122914800\t0.2874\t66\nchr5\t122938800\t122939100\t0.6504\t44\nchr5\t123236700\t123238800\t0\t58\nchr5\t123240900\t123241200\t0.2602\t62\nchr5\t123931500\t123932100\t0.5212\t77\nchr5\t123935100\t123935400\t0.4269\t70\nchr5\t124017600\t124017900\t0.4374\t61\nchr5\t125028000\t125028600\t0.5098\t61\nchr5\t125359200\t125364600\t0.0051\t87\nchr5\t125616000\t125616600\t0.0098\t187\nchr5\t125676300\t125676900\t0.1382\t77\nchr5\t125920200\t125920500\t0.4161\t64\nchr5\t125922300\t125922600\t0.5344\t61\nchr5\t125993400\t125993700\t0.5232\t39\nchr5\t126163800\t126164400\t0.2845\t17\nchr5\t126528600\t126529500\t0.2762\t89\nchr5\t126738300\t126738600\t0.5055\t81\nchr5\t126891300\t126892500\t0.2345\t79\nchr5\t126893700\t126894300\t0.0887\t71\nchr5\t126904800\t126907800\t0.055\t79\nchr5\t127103700\t127104000\t0.2688\t51\nchr5\t127542600\t127542900\t0.3382\t69\nchr5\t127734900\t127737000\t0.1571\t70\nchr5\t127738200\t127738500\t0.1571\t70\nchr5\t127747800\t127749000\t0.0279\t80\nchr5\t127750500\t127751100\t0.0279\t80\nchr5\t127878900\t127879800\t0.02\t69\nchr5\t128294400\t128295900\t0.0913\t83\nchr5\t128605200\t128607300\t0.1948\t123\nchr5\t128820600\t128820900\t0.32\t60\nchr5\t129313200\t129313500\t0.1615\t56\nchr5\t129550200\t129550500\t0.1838\t30\nchr5\t129578100\t129578400\t0.1812\t61\nchr5\t129897000\t129897300\t0.5016\t55\nchr5\t130265100\t130266900\t0.1663\t107\nchr5\t130597200\t130597500\t0.6509\t24\nchr5\t130733400\t130734000\t0.0187\t92\nchr5\t130735200\t130737900\t0.0187\t92\nchr5\t130753200\t130754400\t0.3745\t69\nchr5\t130872900\t130873200\t0.4026\t67\nchr5\t131073300\t131074200\t0.1495\t64\nchr5\t131308500\t131309700\t0.4447\t88\nchr5\t131515800\t131516100\t0.4864\t75\nchr5\t131778600\t131779200\t0.2606\t60\nchr5\t131876400\t131876700\t0.3036\t68\nchr5\t131888100\t131888400\t0.4068\t53\nchr5\t132514200\t132519900\t0\t81\nchr5\t133108800\t133109700\t0.1967\t56\nchr5\t133133700\t133134000\t0.4928\t62\nchr5\t133183800\t133185300\t0.4167\t71\nchr5\t133583400\t133589100\t0\t91\nchr5\t133626000\t133626300\t0.2195\t11\nchr5\t134557500\t134558400\t0.0044\t56\nchr5\t134881200\t134881800\t0.0445\t71\nchr5\t135982800\t135983700\t0.1419\t72\nchr5\t136411200\t136411500\t0.2184\t55\nchr5\t136782900\t136784700\t0.276\t78\nchr5\t136787400\t136788000\t0.276\t78\nchr5\t137044800\t137050500\t0\t94\nchr5\t137160600\t137160900\t0.6606\t24\nchr5\t137319600\t137319900\t0.5785\t61\nchr5\t137338500\t137338800\t0.3687\t63\nchr5\t137499900\t137500500\t0.2954\t93\nchr5\t137686800\t137688000\t0.4256\t97\nchr5\t137972100\t137972400\t0.2989\t74\nchr5\t137973600\t137974200\t0.2989\t74\nchr5\t138519900\t138520200\t0.2104\t49\nchr5\t138777000\t138777600\t0.3199\t151\nchr5\t138811200\t138811500\t0.6095\t39\nchr5\t139005600\t139011300\t0.0097\t90\nchr5\t139083300\t139084800\t0\t75\nchr5\t140517000\t140517900\t0.2297\t76\nchr5\t140592600\t140593200\t0.2565\t63\nchr5\t140835000\t140835300\t0.147\t75\nchr5\t140848800\t140849400\t0.0917\t68\nchr5\t141106800\t141107100\t0.2314\t45\nchr5\t141178200\t141178500\t0.4828\t48\nchr5\t141183900\t141184200\t0.4739\t37\nchr5\t141214200\t141214500\t0.2799\t54\nchr5\t141229500\t141229800\t0.3882\t70\nchr5\t141387900\t141388200\t0.1986\t59\nchr5\t141398100\t141398400\t0.3258\t72\nchr5\t142041600\t142042200\t0.0436\t78\nchr5\t142043400\t142044300\t0.0436\t78\nchr5\t142074900\t142077000\t0\t61\nchr5\t143856000\t143856300\t0.4094\t74\nchr5\t144051000\t144051300\t0.5567\t54\nchr5\t144053100\t144053400\t0.5293\t78\nchr5\t144069900\t144071400\t0.1212\t53\nchr5\t144551400\t144553500\t0.0549\t63\nchr5\t144713400\t144717600\t0.0195\t87\nchr5\t144743400\t144743700\t0.5014\t48\nchr5\t144891000\t144892200\t0.106\t72\nchr5\t144996600\t144996900\t0.4064\t54\nchr5\t145149900\t145152900\t0\t81\nchr5\t145173000\t145173300\t0.2887\t84\nchr5\t145183200\t145183800\t0\t20\nchr5\t145336200\t145336500\t0.3249\t57\nchr5\t145372800\t145373100\t0.0903\t44\nchr5\t145419300\t145421100\t0.0792\t70\nchr5\t145423500\t145423800\t0.0792\t70\nchr5\t145447500\t145447800\t0.237\t72\nchr5\t145486800\t145487100\t0.2997\t49\nchr5\t146609400\t146615400\t0\t80\nchr5\t146678400\t146680200\t0.0167\t77\nchr5\t147011700\t147012000\t0.0855\t71\nchr5\t147013200\t147014400\t0.0855\t71\nchr5\t147477600\t147477900\t0.45\t52\nchr5\t147716100\t147720600\t0.0878\t75\nchr5\t147941100\t147942300\t0.135\t89\nchr5\t147943800\t147945900\t0.135\t89\nchr5\t147958500\t147960900\t0.0329\t73\nchr5\t148022400\t148024200\t0.0146\t79\nchr5\t148082700\t148083000\t0.6115\t38\nchr5\t148143900\t148144200\t0.3769\t56\nchr5\t148233000\t148234800\t0.0872\t45\nchr5\t148252200\t148254000\t0\t74\nchr5\t148327500\t148327800\t0.4138\t82\nchr5\t148611000\t148613400\t0.1717\t72\nchr5\t148944900\t148947900\t0.3132\t79\nchr5\t149655000\t149655600\t0.4306\t55\nchr5\t150366600\t150366900\t0.4176\t28\nchr5\t150747600\t150747900\t0.4044\t71\nchr5\t150929100\t150929400\t0.5466\t37\nchr5\t150968100\t150968400\t0.3648\t71\nchr5\t152076900\t152082900\t0\t80\nchr5\t152207700\t152213100\t0.0019\t81\nchr5\t152323500\t152323800\t0.5505\t46\nchr5\t152340300\t152346000\t0\t99\nchr5\t152479200\t152479500\t0.4252\t71\nchr5\t152615100\t152616000\t0.1916\t71\nchr5\t152654700\t152655300\t0.3696\t74\nchr5\t152657400\t152657700\t0.3056\t64\nchr5\t152715600\t152715900\t0.4017\t52\nchr5\t152742300\t152744100\t0.1046\t58\nchr5\t152746500\t152746800\t0.3221\t67\nchr5\t152764800\t152767500\t0.2943\t86\nchr5\t152816100\t152816400\t0.4634\t50\nchr5\t152886000\t152892300\t0\t105\nchr5\t152939700\t152940600\t0.0218\t76\nchr5\t153036900\t153037200\t0.1133\t78\nchr5\t153071400\t153075900\t0\t84\nchr5\t153326400\t153327600\t0.4096\t44\nchr5\t153728400\t153728700\t0.2326\t62\nchr5\t154556100\t154556400\t0.4171\t35\nchr5\t154617000\t154617300\t0.4744\t57\nchr5\t155161200\t155161500\t0.3062\t58\nchr5\t155170500\t155171400\t0.0979\t73\nchr5\t155612100\t155612400\t0.0378\t47\nchr5\t155615100\t155615700\t0.1826\t61\nchr5\t155660100\t155660700\t0.0799\t72\nchr5\t156062100\t156067800\t0\t82\nchr5\t156657600\t156666900\t0\t114\nchr5\t157085100\t157085400\t0.3835\t42\nchr5\t157408200\t157408500\t0.5648\t31\nchr5\t157437000\t157438800\t0.0034\t85\nchr5\t157692000\t157692300\t0.422\t61\nchr5\t158183700\t158184000\t0.2798\t78\nchr5\t158259900\t158260200\t0.634\t59\nchr5\t159036300\t159037800\t0.0043\t73\nchr5\t159165300\t159165600\t0.5654\t45\nchr5\t159500400\t159500700\t0.3608\t73\nchr5\t160498500\t160498800\t0.4045\t68\nchr5\t160596300\t160596600\t0.3908\t96\nchr5\t160709700\t160715700\t0\t85\nchr5\t160874700\t160876200\t0.0064\t75\nchr5\t160877400\t160879500\t0.0064\t75\nchr5\t161004300\t161004600\t0.3272\t25\nchr5\t161072700\t161073600\t0.1966\t100\nchr5\t161075100\t161075700\t0.1966\t100\nchr5\t161216100\t161216400\t0.4213\t45\nchr5\t161607600\t161607900\t0.1186\t65\nchr5\t161609700\t161610600\t0.1894\t71\nchr5\t161712000\t161712600\t0.0739\t126\nchr5\t162031500\t162032100\t0.3071\t67\nchr5\t162290700\t162291300\t0.1964\t24\nchr5\t162316500\t162316800\t0.5965\t83\nchr5\t162736800\t162737100\t0.2078\t74\nchr5\t162741000\t162741300\t0.5759\t45\nchr5\t162789900\t162790200\t0.3626\t91\nchr5\t162811800\t162812100\t0.6279\t71\nchr5\t162850800\t162851100\t0.3747\t69\nchr5\t162906000\t162906600\t0.0231\t57\nchr5\t163059900\t163060200\t0.0102\t41\nchr5\t163131300\t163131600\t0.6565\t32\nchr5\t163683600\t163683900\t0.5223\t64\nchr5\t164328900\t164329200\t0.654\t11\nchr5\t164391600\t164391900\t0.3789\t40\nchr5\t164443200\t164443500\t0.3474\t42\nchr5\t164889000\t164889300\t0.3677\t15\nchr5\t165800700\t165801300\t0.4669\t34\nchr5\t166141200\t166147200\t0.0086\t111\nchr5\t166420800\t166421400\t0.0059\t89\nchr5\t166966800\t166972800\t0\t89\nchr5\t167105700\t167106000\t0.5107\t34\nchr5\t167350800\t167351100\t0.6227\t23\nchr5\t167859000\t167861100\t0.1111\t76\nchr5\t168144900\t168146100\t0.0537\t81\nchr5\t168541800\t168542100\t0.4082\t58\nchr5\t168573900\t168574200\t0.5791\t66\nchr5\t168642600\t168643200\t0.0965\t29\nchr5\t168717000\t168717300\t0.0701\t70\nchr5\t168741600\t168742800\t0.1263\t69\nchr5\t169508100\t169508400\t0.3938\t82\nchr5\t169582500\t169582800\t0.6842\t54\nchr5\t169665000\t169665300\t0.092\t20\nchr5\t169834200\t169834800\t0.4062\t60\nchr5\t169997400\t169997700\t0.4387\t65\nchr5\t170004600\t170004900\t0.3013\t53\nchr5\t170214900\t170215500\t0.4207\t102\nchr5\t170240100\t170240400\t0.1802\t72\nchr5\t170241900\t170243400\t0.1802\t72\nchr5\t170858400\t170858700\t0.6468\t69\nchr5\t171059700\t171062100\t0.0373\t84\nchr5\t171084300\t171087900\t0\t84\nchr5\t171402300\t171404700\t0.12\t56\nchr5\t171941400\t171941700\t0.4581\t61\nchr5\t173281500\t173281800\t0.4987\t55\nchr5\t173402700\t173408700\t0\t87\nchr5\t173462700\t173463000\t0.124\t37\nchr5\t173546700\t173547000\t0.5702\t21\nchr5\t174018600\t174019800\t0.1473\t88\nchr5\t174117900\t174118200\t0.6045\t46\nchr5\t174477000\t174478200\t0.4521\t60\nchr5\t174539700\t174540000\t0.2217\t85\nchr5\t175134600\t175134900\t0.3338\t33\nchr5\t175137600\t175138500\t0.071\t58\nchr5\t175400700\t175403400\t0.0277\t147\nchr5\t175720200\t175722300\t0.3443\t75\nchr5\t175905900\t175907400\t0.2494\t73\nchr5\t175909800\t175910100\t0.3073\t86\nchr5\t175911300\t175911900\t0.3073\t86\nchr5\t175913700\t175914000\t0.3073\t86\nchr5\t175917600\t175918800\t0.0621\t75\nchr5\t175939500\t175939800\t0.5163\t89\nchr5\t175941300\t175941600\t0.1872\t69\nchr5\t175943100\t175944300\t0.1872\t69\nchr5\t175945500\t175949700\t0\t99\nchr5\t175951500\t175951800\t0\t99\nchr5\t175953000\t175958400\t0\t99\nchr5\t175962600\t175965000\t0.1657\t59\nchr5\t175967100\t175975800\t0\t72\nchr5\t175977000\t176001900\t0\t87\nchr5\t176007600\t176007900\t0.3453\t68\nchr5\t176009700\t176010300\t0.1935\t80\nchr5\t176013600\t176022000\t0\t113\nchr5\t176023200\t176034600\t0\t113\nchr5\t176037900\t176038200\t0.4591\t39\nchr5\t176042400\t176043000\t0.3826\t61\nchr5\t176044800\t176048400\t0.0065\t76\nchr5\t176051100\t176051400\t0.3243\t58\nchr5\t176052900\t176054400\t0.1533\t80\nchr5\t176057400\t176057700\t0.0011\t142\nchr5\t176058900\t176064300\t0.0011\t142\nchr5\t176065800\t176066100\t0.0076\t65\nchr5\t176067300\t176068200\t0.0076\t65\nchr5\t176069700\t176070900\t0.1269\t82\nchr5\t176072700\t176076300\t0.1269\t82\nchr5\t176079900\t176080200\t0.0073\t69\nchr5\t176081700\t176082600\t0.0073\t69\nchr5\t176084400\t176098800\t0\t76\nchr5\t176101800\t176103000\t0\t77\nchr5\t176104200\t176107500\t0\t77\nchr5\t176109000\t176115900\t0\t77\nchr5\t176117400\t176118600\t0\t77\nchr5\t176123100\t176123700\t0.0613\t64\nchr5\t176127300\t176128500\t0.2334\t41\nchr5\t176196300\t176196900\t0.1025\t76\nchr5\t176207400\t176208300\t0.3689\t52\nchr5\t176215200\t176216400\t0.0348\t68\nchr5\t176224200\t176224500\t0.2259\t68\nchr5\t176226000\t176228400\t0.0034\t74\nchr5\t176231700\t176232000\t0.1264\t62\nchr5\t176238600\t176241600\t0\t64\nchr5\t176243700\t176244600\t0.0114\t62\nchr5\t176254500\t176254800\t0.5194\t47\nchr5\t176266500\t176268600\t0.0347\t63\nchr5\t176274000\t176274300\t0.2585\t50\nchr5\t176276700\t176278800\t0.0284\t67\nchr5\t176305200\t176306700\t0.447\t70\nchr5\t176871000\t176871600\t0.1837\t30\nchr5\t176960700\t176963100\t0.0085\t60\nchr5\t177451500\t177451800\t0.2648\t23\nchr5\t177461100\t177461400\t0.4897\t50\nchr5\t177517800\t177519000\t0\t39\nchr5\t177643800\t177645900\t0.0012\t49\nchr5\t177647400\t177647700\t0.5558\t56\nchr5\t177649200\t177649500\t0.4581\t58\nchr5\t177666000\t177666900\t0.0268\t69\nchr5\t177669000\t177669600\t0.2517\t61\nchr5\t177670800\t177673200\t0.0097\t68\nchr5\t177678600\t177679200\t0.2429\t61\nchr5\t177682200\t177684600\t0\t70\nchr5\t177686100\t177686400\t0.3084\t70\nchr5\t177694200\t177695400\t0.0395\t67\nchr5\t177703500\t177704100\t0.3231\t72\nchr5\t177709800\t177710100\t0.2889\t53\nchr5\t177714300\t177714900\t0.0171\t62\nchr5\t177717900\t177718500\t0\t108\nchr5\t177719700\t177736200\t0\t108\nchr5\t177739200\t177748800\t0\t91\nchr5\t177750300\t177753000\t0\t91\nchr5\t177756300\t177758400\t0.2319\t90\nchr5\t177760200\t177763500\t0.0034\t81\nchr5\t177764700\t177768900\t0.0197\t105\nchr5\t177770100\t177770400\t0.3873\t82\nchr5\t177772200\t177778200\t0\t102\nchr5\t177779400\t177784800\t0.0914\t90\nchr5\t177788700\t177789600\t0.0914\t90\nchr5\t177791100\t177791400\t0.3189\t61\nchr5\t177795600\t177799800\t0.0056\t72\nchr5\t177801000\t177804600\t0\t89\nchr5\t177806100\t177807600\t0.47\t50\nchr5\t177809100\t177819300\t0\t108\nchr5\t177820500\t177830700\t0\t108\nchr5\t177832500\t177836100\t0.0272\t75\nchr5\t177843000\t177846300\t0.05\t95\nchr5\t177847500\t177847800\t0.05\t95\nchr5\t177850200\t177852600\t0.05\t95\nchr5\t177853800\t177866100\t0\t88\nchr5\t177867900\t177871200\t0\t59\nchr5\t177872400\t177881400\t0\t79\nchr5\t177885300\t177892200\t0\t101\nchr5\t177894000\t177902700\t0\t101\nchr5\t177903900\t177906600\t0\t101\nchr5\t177909600\t177909900\t0.0199\t20\nchr5\t177914100\t177915000\t0.054\t19\nchr5\t177916800\t177917100\t0.4388\t26\nchr5\t177920100\t177921600\t0.0381\t57\nchr5\t177924300\t177925500\t0.3571\t53\nchr5\t177927300\t177929700\t0.1378\t73\nchr5\t177931200\t177932400\t0.2983\t86\nchr5\t177942000\t177942900\t0.0066\t59\nchr5\t177944100\t177945000\t0.0066\t59\nchr5\t177948900\t177949200\t0.0846\t44\nchr5\t177952500\t177952800\t0.4416\t34\nchr5\t177961500\t177962700\t0.0048\t250\nchr5\t177979200\t177980400\t0.3577\t24\nchr5\t177999000\t177999300\t0.5391\t54\nchr5\t178006200\t178006800\t0.1297\t47\nchr5\t178009500\t178011900\t0.2683\t63\nchr5\t178013100\t178013700\t0.0391\t78\nchr5\t178014900\t178023600\t0.0038\t75\nchr5\t178025400\t178025700\t0.2462\t94\nchr5\t178027200\t178027500\t0.2462\t94\nchr5\t178030200\t178033500\t0.0525\t73\nchr5\t178034700\t178036500\t0.0798\t79\nchr5\t178038000\t178039200\t0.0339\t72\nchr5\t178045800\t178046700\t0.0563\t61\nchr5\t178047900\t178053300\t0.0101\t91\nchr5\t178095600\t178096500\t0.1855\t23\nchr5\t178239600\t178239900\t0.489\t47\nchr5\t178294200\t178294500\t0.5818\t50\nchr5\t178395000\t178396800\t0\t29\nchr5\t178448100\t178448400\t0.353\t59\nchr5\t178518000\t178519200\t0.5519\t68\nchr5\t178525200\t178525800\t0.0081\t146\nchr5\t178728900\t178729200\t0.381\t70\nchr5\t178860900\t178861200\t0.3817\t56\nchr5\t178900500\t178900800\t0.1652\t43\nchr5\t179103900\t179104800\t0.3016\t67\nchr5\t179106000\t179106600\t0.4825\t74\nchr5\t179245500\t179245800\t0.3822\t47\nchr5\t179262900\t179263200\t0.6479\t67\nchr5\t179313300\t179313900\t0.3369\t67\nchr5\t179364300\t179364600\t0.6298\t15\nchr5\t179447100\t179448900\t0\t65\nchr5\t179501100\t179503500\t0.0016\t77\nchr5\t179514300\t179514600\t0.3211\t85\nchr5\t179516700\t179517300\t0.2135\t58\nchr5\t179634000\t179637000\t0\t83\nchr5\t179641800\t179642100\t0.1638\t31\nchr5\t179644200\t179644500\t0.0847\t55\nchr5\t179646300\t179646900\t0.0184\t80\nchr5\t179655600\t179658600\t0\t95\nchr5\t179871900\t179872200\t0.4062\t54\nchr5\t180486000\t180486300\t0.1785\t43\nchr5\t180534600\t180534900\t0.3238\t53\nchr5\t180615600\t180616200\t0.3881\t58\nchr5\t180617400\t180618300\t0.2608\t41\nchr5\t180634800\t180635700\t0.428\t91\nchr5\t180658500\t180658800\t0.4082\t208\nchr5\t180903300\t180907200\t0.0677\t89\nchr5\t180917100\t180917400\t0.5124\t55\nchr5\t180948600\t180948900\t0.5238\t58\nchr5\t181000500\t181000800\t0.4936\t52\nchr5\t181004100\t181004400\t0.5043\t57\nchr5\t181045800\t181046400\t0.5472\t152\nchr5\t181088700\t181091700\t0\t95\nchr5\t181095900\t181098000\t0\t70\nchr5\t181101300\t181104300\t0\t74\nchr5\t181113600\t181113900\t0.608\t68\nchr5\t181160700\t181161300\t0.3683\t42\nchr5\t181183200\t181183500\t0.246\t58\nchr5\t181289700\t181290300\t0.5637\t84\nchr5\t181293000\t181356300\t0\t156\nchr5\t181357500\t181478400\t0\t156\nchr6\t60000\t147000\t0\t101\nchr6\t371100\t372000\t0.5177\t391\nchr6\t424500\t424800\t0.4943\t23\nchr6\t468900\t469500\t0.5828\t222\nchr6\t519000\t520800\t0\t53\nchr6\t601200\t602400\t0\t84\nchr6\t639300\t639600\t0.6227\t44\nchr6\t675600\t677100\t0.4435\t54\nchr6\t712500\t712800\t0.3472\t51\nchr6\t861900\t863700\t0\t432\nchr6\t909300\t910800\t0\t103\nchr6\t1141800\t1142400\t0.2636\t118\nchr6\t1205400\t1205700\t0.6074\t66\nchr6\t1234800\t1235400\t0.3159\t74\nchr6\t1244100\t1244400\t0.5697\t87\nchr6\t1318800\t1320900\t0\t42\nchr6\t1429500\t1429800\t0.0582\t77\nchr6\t1431900\t1432500\t0.0582\t77\nchr6\t1441200\t1441500\t0.6184\t39\nchr6\t1534500\t1534800\t0.4392\t66\nchr6\t1897800\t1898100\t0.5311\t111\nchr6\t1926900\t1927500\t0.4431\t139\nchr6\t2417700\t2423700\t0\t87\nchr6\t2801400\t2801700\t0.54\t31\nchr6\t3063000\t3063300\t0.6455\t29\nchr6\t3090900\t3093900\t0\t52\nchr6\t3153900\t3154500\t0.1225\t75\nchr6\t3222000\t3222300\t0.6679\t75\nchr6\t3224700\t3225300\t0.0508\t68\nchr6\t4050000\t4050300\t0.375\t12\nchr6\t4193700\t4194600\t0.0713\t65\nchr6\t4254600\t4254900\t0.3216\t60\nchr6\t4329000\t4333500\t0.0691\t73\nchr6\t4572900\t4573200\t0.1706\t83\nchr6\t4809600\t4809900\t0.5785\t51\nchr6\t4831800\t4834800\t0.281\t97\nchr6\t5037000\t5038200\t0.1734\t66\nchr6\t5135100\t5135400\t0.3886\t12\nchr6\t5690400\t5690700\t0.4375\t63\nchr6\t5835000\t5835300\t0.3507\t68\nchr6\t5887500\t5889000\t0.2776\t81\nchr6\t5890800\t5891400\t0.2776\t81\nchr6\t6029100\t6029400\t0.5051\t38\nchr6\t6068700\t6069000\t0.5777\t34\nchr6\t6141600\t6143700\t0.1151\t93\nchr6\t6186000\t6189600\t0.1821\t86\nchr6\t6213300\t6216900\t0.0684\t73\nchr6\t6261600\t6262200\t0.0069\t196\nchr6\t6295500\t6296100\t0.2\t93\nchr6\t6299100\t6299400\t0.2\t93\nchr6\t6429000\t6429300\t0.3075\t62\nchr6\t6443100\t6443400\t0.3832\t75\nchr6\t6716100\t6716400\t0.5327\t17\nchr6\t7272900\t7273500\t0.6786\t60\nchr6\t7717200\t7717500\t0.1653\t36\nchr6\t7856700\t7857000\t0.557\t58\nchr6\t7943700\t7944000\t0.4184\t65\nchr6\t8216700\t8217300\t0.0513\t69\nchr6\t8254200\t8254500\t0.5875\t24\nchr6\t8566500\t8568000\t0.1709\t65\nchr6\t8770500\t8775600\t0\t80\nchr6\t8827500\t8828100\t0.265\t61\nchr6\t8962200\t8963100\t0.3459\t69\nchr6\t9811800\t9816300\t0.0706\t68\nchr6\t9966300\t9966600\t0.0997\t82\nchr6\t9968100\t9971100\t0.0997\t82\nchr6\t10786500\t10787100\t0.4314\t53\nchr6\t10984500\t10984800\t0.4318\t41\nchr6\t11014200\t11014800\t0.4428\t60\nchr6\t11019600\t11019900\t0.1792\t55\nchr6\t11444100\t11444400\t0.4124\t37\nchr6\t11556000\t11556300\t0.6397\t39\nchr6\t11617200\t11617500\t0.059\t10\nchr6\t11624400\t11624700\t0.6029\t74\nchr6\t11903100\t11903400\t0.5038\t34\nchr6\t12550500\t12550800\t0.3832\t89\nchr6\t12553500\t12553800\t0.2582\t58\nchr6\t14298300\t14298600\t0.6714\t52\nchr6\t14482200\t14482800\t0.3143\t80\nchr6\t14484300\t14485500\t0.2088\t86\nchr6\t15188400\t15190500\t0.2131\t58\nchr6\t15725700\t15726000\t0.3612\t67\nchr6\t15806400\t15806700\t0.1818\t69\nchr6\t15983700\t15984300\t0.2923\t46\nchr6\t16010700\t16011300\t0.1394\t94\nchr6\t16013700\t16014000\t0.1394\t94\nchr6\t16614900\t16615200\t0.4326\t33\nchr6\t16860300\t16862100\t0\t87\nchr6\t17434800\t17435700\t0.2116\t72\nchr6\t18910800\t18912900\t0\t74\nchr6\t19131000\t19131300\t0.4375\t68\nchr6\t19155300\t19155600\t0.3991\t33\nchr6\t19347300\t19347600\t0.018\t23\nchr6\t19636800\t19637100\t0.5746\t41\nchr6\t19765200\t19770900\t0\t74\nchr6\t20101800\t20102100\t0.388\t57\nchr6\t20244300\t20244600\t0.4454\t78\nchr6\t20339400\t20339700\t0.5443\t59\nchr6\t20614800\t20616600\t0.0346\t67\nchr6\t20765100\t20765400\t0.3961\t46\nchr6\t20959500\t20959800\t0.0644\t850\nchr6\t21192000\t21192300\t0.2429\t39\nchr6\t21364200\t21364500\t0.5219\t76\nchr6\t21551700\t21552000\t0.6834\t58\nchr6\t21797700\t21798000\t0.4127\t86\nchr6\t21851400\t21852300\t0.5552\t32\nchr6\t22176300\t22180200\t0.0258\t87\nchr6\t22461600\t22463100\t0.189\t86\nchr6\t22837200\t22837500\t0.6774\t55\nchr6\t22869900\t22870200\t0.4892\t64\nchr6\t22930200\t22930500\t0.1429\t23\nchr6\t23062800\t23063400\t0.3947\t52\nchr6\t23232900\t23233500\t0.1267\t76\nchr6\t23234700\t23235000\t0.1267\t76\nchr6\t23300100\t23300400\t0.2228\t59\nchr6\t23685900\t23686200\t0.4709\t33\nchr6\t23701800\t23702100\t0.3446\t80\nchr6\t23798700\t23799000\t0.4995\t55\nchr6\t23806500\t23807100\t0.3785\t75\nchr6\t23809200\t23809500\t0.6373\t68\nchr6\t23948400\t23949300\t0\t25\nchr6\t24046500\t24046800\t0.2113\t69\nchr6\t24085200\t24085500\t0.4237\t54\nchr6\t24469200\t24469800\t0.1092\t54\nchr6\t24676200\t24676500\t0.4093\t79\nchr6\t24811800\t24817800\t0\t88\nchr6\t25184100\t25184400\t0.5574\t59\nchr6\t26368800\t26369100\t0.2617\t64\nchr6\t26406000\t26406600\t0.466\t66\nchr6\t26634300\t26638200\t0.0151\t69\nchr6\t26667600\t26667900\t0.4934\t71\nchr6\t26669100\t26669400\t0.3785\t52\nchr6\t26671200\t26738700\t0\t105\nchr6\t26746500\t26747100\t0.1105\t46\nchr6\t26751600\t26754000\t0\t48\nchr6\t26755500\t26756100\t0.1587\t56\nchr6\t26757300\t26757900\t0.1587\t56\nchr6\t26762700\t26830500\t0\t83\nchr6\t26833800\t26834100\t0.1768\t51\nchr6\t26838600\t26839200\t0.3167\t56\nchr6\t26844000\t26844300\t0.0693\t55\nchr6\t26861700\t26862000\t0.2978\t58\nchr6\t26868900\t26869500\t0.2164\t56\nchr6\t26876400\t26876700\t0.2134\t57\nchr6\t26885100\t26885400\t0.0762\t131\nchr6\t26894700\t26895000\t0.1943\t82\nchr6\t26900400\t26901000\t0.3926\t56\nchr6\t26919000\t26919300\t0.4836\t45\nchr6\t26944800\t26945100\t0.4697\t63\nchr6\t26947200\t26947500\t0.3853\t32\nchr6\t26955300\t26955600\t0.5099\t62\nchr6\t26961000\t26961300\t0.1588\t44\nchr6\t26987100\t26987400\t0.3327\t46\nchr6\t26999700\t27000600\t0.2605\t74\nchr6\t27484200\t27486300\t0.1521\t70\nchr6\t27826800\t27827100\t0.5472\t73\nchr6\t27945000\t27945600\t0.18\t87\nchr6\t28022100\t28022400\t0.3418\t81\nchr6\t28026000\t28026600\t0.074\t115\nchr6\t28626000\t28627200\t0.4186\t85\nchr6\t29115300\t29115900\t0.1653\t84\nchr6\t29122800\t29124300\t0.004\t64\nchr6\t29194200\t29195700\t0.0054\t59\nchr6\t29364600\t29364900\t0.4201\t23\nchr6\t29717700\t29720400\t0\t28\nchr6\t29847300\t29847600\t0.1708\t19\nchr6\t29933400\t29933700\t0\t21\nchr6\t30081300\t30081900\t0.387\t81\nchr6\t30084300\t30084600\t0.387\t81\nchr6\t30249600\t30250500\t0.1664\t61\nchr6\t30706500\t30706800\t0.4962\t82\nchr6\t31244100\t31245300\t0\t45\nchr6\t31389300\t31389600\t0.3019\t79\nchr6\t31453800\t31456200\t0.088\t49\nchr6\t31486200\t31486800\t0.1163\t71\nchr6\t31815900\t31817400\t0\t72\nchr6\t31827900\t31829700\t0\t75\nchr6\t31853400\t31855200\t0.1357\t97\nchr6\t31980900\t32005200\t0\t81\nchr6\t32007900\t32037900\t0\t92\nchr6\t32041200\t32045700\t0\t87\nchr6\t32410200\t32410800\t0.3233\t45\nchr6\t32468100\t32469600\t0.3766\t59\nchr6\t32530800\t32531100\t0.5147\t38\nchr6\t32569200\t32569500\t0.6079\t16\nchr6\t32572800\t32573100\t0.5469\t22\nchr6\t32579700\t32580300\t0.0357\t30\nchr6\t32595300\t32596500\t0.4329\t31\nchr6\t32657400\t32657700\t0.3328\t24\nchr6\t32709000\t32709300\t0.4735\t34\nchr6\t33043800\t33044400\t0.3633\t59\nchr6\t33059100\t33059400\t0.2635\t29\nchr6\t33484200\t33484800\t0.0464\t77\nchr6\t33525600\t33525900\t0.257\t65\nchr6\t33810600\t33810900\t0.5015\t66\nchr6\t34071300\t34071600\t0.627\t68\nchr6\t34072800\t34073100\t0.6157\t115\nchr6\t34209900\t34210200\t0.5802\t45\nchr6\t34397100\t34398300\t0.0343\t68\nchr6\t35136600\t35137500\t0.0616\t30\nchr6\t35384400\t35385600\t0.1501\t77\nchr6\t35827500\t35828700\t0.0077\t71\nchr6\t38954400\t38954700\t0.4368\t40\nchr6\t38963400\t38964300\t0\t60\nchr6\t39455700\t39460500\t0\t76\nchr6\t39677700\t39678000\t0.3453\t38\nchr6\t40063800\t40064100\t0.4408\t85\nchr6\t40245600\t40245900\t0.6349\t48\nchr6\t40491600\t40492200\t0.4729\t70\nchr6\t41128500\t41129100\t0.1673\t94\nchr6\t41130300\t41130900\t0.1673\t94\nchr6\t41436300\t41436600\t0.3564\t28\nchr6\t41985600\t41985900\t0.1198\t29\nchr6\t42210300\t42210600\t0.336\t51\nchr6\t42286500\t42287100\t0.1004\t72\nchr6\t42845100\t42845400\t0.5204\t57\nchr6\t42887700\t42888000\t0.2938\t56\nchr6\t43580100\t43581600\t0.348\t75\nchr6\t44044500\t44044800\t0.5224\t188\nchr6\t44181600\t44182200\t0.3613\t81\nchr6\t44391000\t44391300\t0.6771\t27\nchr6\t44401800\t44402400\t0.3517\t62\nchr6\t44752500\t44753100\t0.1215\t83\nchr6\t44757300\t44757600\t0.4849\t62\nchr6\t44759100\t44759400\t0.3974\t60\nchr6\t44871000\t44876400\t0\t107\nchr6\t44887500\t44887800\t0.5606\t63\nchr6\t44893500\t44894100\t0.2815\t61\nchr6\t44901600\t44901900\t0.5436\t56\nchr6\t45017100\t45017400\t0.4356\t88\nchr6\t45063000\t45068400\t0.1079\t82\nchr6\t45180000\t45180600\t0.3607\t62\nchr6\t45670200\t45674400\t0.0291\t96\nchr6\t46019400\t46019700\t0.5553\t35\nchr6\t46142100\t46142400\t0.5229\t42\nchr6\t46213800\t46214400\t0.0346\t73\nchr6\t47050500\t47051700\t0.2321\t73\nchr6\t47101800\t47102100\t0.3314\t47\nchr6\t47505600\t47506800\t0.105\t74\nchr6\t47758800\t47759100\t0.1871\t34\nchr6\t47888700\t47889300\t0.1394\t56\nchr6\t48364800\t48368700\t0.0464\t81\nchr6\t48495300\t48495900\t0.298\t50\nchr6\t48507900\t48508500\t0.4381\t68\nchr6\t48738900\t48742500\t0.0812\t107\nchr6\t48901200\t48902100\t0.0042\t79\nchr6\t49391100\t49392000\t0.318\t68\nchr6\t49765800\t49766400\t0.1187\t92\nchr6\t50171400\t50171700\t0.6799\t21\nchr6\t50484900\t50485200\t0.6171\t45\nchr6\t50798400\t50798700\t0.6726\t58\nchr6\t50893800\t50895000\t0.2071\t67\nchr6\t51125700\t51127500\t0.2256\t55\nchr6\t51333000\t51333900\t0.3368\t66\nchr6\t51391500\t51391800\t0.4313\t46\nchr6\t51652500\t51652800\t0.3169\t35\nchr6\t51666900\t51667800\t0.3738\t62\nchr6\t51669300\t51669900\t0.4221\t59\nchr6\t51874800\t51880800\t0\t94\nchr6\t51897600\t51898500\t0.2497\t81\nchr6\t51981600\t51982800\t0.2871\t76\nchr6\t52204500\t52206300\t0.1756\t119\nchr6\t52756800\t52757400\t0.0548\t61\nchr6\t52767000\t52767300\t0.5597\t67\nchr6\t52771200\t52771500\t0.4924\t68\nchr6\t52798200\t52798800\t0.1698\t77\nchr6\t52807200\t52807500\t0.267\t28\nchr6\t52866000\t52866600\t0.3886\t49\nchr6\t52922700\t52923600\t0.4413\t69\nchr6\t53400900\t53401200\t0.519\t99\nchr6\t54838200\t54839700\t0.0611\t79\nchr6\t54915600\t54915900\t0.5533\t35\nchr6\t54963900\t54964500\t0.0537\t82\nchr6\t54965700\t54967500\t0.0537\t82\nchr6\t54999600\t54999900\t0.0547\t18\nchr6\t55313700\t55314000\t0.4094\t63\nchr6\t55365300\t55367400\t0.1145\t83\nchr6\t55397100\t55397400\t0.5125\t75\nchr6\t55543200\t55543500\t0.0161\t132\nchr6\t55641900\t55642200\t0.1778\t32\nchr6\t55647900\t55649100\t0.2939\t60\nchr6\t55686900\t55687200\t0.3033\t68\nchr6\t55909500\t55909800\t0.497\t54\nchr6\t56114700\t56115000\t0.3573\t86\nchr6\t56825100\t56825400\t0.175\t70\nchr6\t56893500\t56896200\t0.0002\t55\nchr6\t57046800\t57048000\t0\t71\nchr6\t57090300\t57091500\t0\t69\nchr6\t57349200\t57349500\t0.5084\t43\nchr6\t57378900\t57379500\t0.2217\t52\nchr6\t57387600\t57387900\t0.5673\t59\nchr6\t57403800\t57405600\t0.1455\t55\nchr6\t57509100\t57509400\t0.5884\t62\nchr6\t57554100\t57554400\t0.2176\t47\nchr6\t57556800\t57557400\t0.3493\t62\nchr6\t57560100\t57560400\t0.6726\t64\nchr6\t57565200\t57565500\t0.2315\t53\nchr6\t57573900\t57574800\t0.4042\t62\nchr6\t57630000\t57630300\t0.4505\t38\nchr6\t57737700\t57738000\t0.3472\t65\nchr6\t57773100\t57773400\t0.5627\t66\nchr6\t57797100\t57799500\t0\t52\nchr6\t57814800\t57816300\t0.3457\t40\nchr6\t57819300\t57822300\t0.0498\t62\nchr6\t57828600\t57828900\t0.307\t58\nchr6\t57830400\t57831600\t0.2041\t66\nchr6\t57835500\t57835800\t0.5767\t56\nchr6\t57874500\t57874800\t0.5136\t59\nchr6\t57876300\t57876600\t0.672\t53\nchr6\t57880800\t57881400\t0.2247\t55\nchr6\t57885600\t57885900\t0.2414\t62\nchr6\t57909300\t57910200\t0.2349\t47\nchr6\t57912300\t57912600\t0.5247\t64\nchr6\t57917400\t57918600\t0.324\t75\nchr6\t57939300\t57939900\t0.21\t58\nchr6\t58014900\t58015200\t0.3159\t58\nchr6\t58169400\t58169700\t0.5212\t36\nchr6\t58182600\t58182900\t0.5105\t53\nchr6\t58448100\t58448400\t0.5353\t35\nchr6\t58449900\t58453500\t0\t2483\nchr6\t58554000\t59829900\t0\t4686\nchr6\t60230100\t60231300\t0.6339\t429\nchr6\t60237600\t60238500\t0.5348\t420\nchr6\t60240300\t60241800\t0.4873\t537\nchr6\t60251100\t60251400\t0.4333\t32\nchr6\t60280500\t60281100\t0.0624\t42\nchr6\t60289200\t60289500\t0.488\t60\nchr6\t60306300\t60307200\t0\t85\nchr6\t60333000\t60333300\t0.6421\t48\nchr6\t60426600\t60426900\t0.4676\t58\nchr6\t60446700\t60447000\t0.1657\t44\nchr6\t60449400\t60450000\t0.2641\t59\nchr6\t60459000\t60459300\t0.1869\t69\nchr6\t60463800\t60464100\t0.2461\t46\nchr6\t60473100\t60473400\t0.436\t50\nchr6\t60494700\t60495000\t0.4282\t46\nchr6\t60510600\t60510900\t0.0481\t60\nchr6\t60528900\t60529200\t0.4933\t53\nchr6\t60533400\t60534300\t0\t43\nchr6\t60618900\t60619200\t0.3708\t124\nchr6\t60703800\t60705000\t0.1224\t68\nchr6\t60756600\t60756900\t0.3114\t53\nchr6\t60766500\t60766800\t0.4187\t51\nchr6\t60804000\t60804300\t0.1391\t68\nchr6\t60861300\t60863400\t0.0555\t82\nchr6\t60936900\t60937200\t0.2629\t52\nchr6\t61183500\t61183800\t0.651\t20\nchr6\t61322700\t61356900\t0\t78\nchr6\t61381500\t61383000\t0.578\t121\nchr6\t61400700\t61402200\t0.6063\t135\nchr6\t61406700\t61407900\t0.5859\t162\nchr6\t61413600\t61414500\t0.6196\t120\nchr6\t61425000\t61473600\t0\t94\nchr6\t61480500\t61493100\t0\t39\nchr6\t61662600\t61662900\t0.4442\t77\nchr6\t61671900\t61674000\t0.1961\t68\nchr6\t61720800\t61722000\t0.2323\t63\nchr6\t61930500\t61930800\t0.5361\t64\nchr6\t62062200\t62064600\t0.3536\t81\nchr6\t62532900\t62533200\t0.2894\t75\nchr6\t62827200\t62827500\t0.3804\t42\nchr6\t63054600\t63054900\t0.4369\t40\nchr6\t63408300\t63408600\t0.2112\t75\nchr6\t63419700\t63420000\t0.4141\t80\nchr6\t63473700\t63474000\t0.2366\t40\nchr6\t64536900\t64537200\t0.5817\t65\nchr6\t64636800\t64637100\t0.5774\t27\nchr6\t64660200\t64660500\t0.4073\t58\nchr6\t64704300\t64704600\t0.3782\t41\nchr6\t64942200\t64942500\t0.1266\t48\nchr6\t65140800\t65141100\t0.2518\t152\nchr6\t65256600\t65257500\t0.0787\t82\nchr6\t65302500\t65305200\t0.1183\t78\nchr6\t65307600\t65308500\t0.1084\t66\nchr6\t65312100\t65312400\t0.407\t54\nchr6\t65314200\t65314500\t0.2137\t54\nchr6\t65315700\t65316000\t0.322\t62\nchr6\t65323200\t65323500\t0.5196\t53\nchr6\t65550300\t65552100\t0\t66\nchr6\t65619600\t65619900\t0.4827\t67\nchr6\t65885700\t65886000\t0.5666\t20\nchr6\t65938800\t65939100\t0.4834\t31\nchr6\t66077700\t66078300\t0.0806\t60\nchr6\t66525600\t66525900\t0.6028\t41\nchr6\t66602700\t66603600\t0.1241\t63\nchr6\t66864000\t66864300\t0.1548\t48\nchr6\t67062000\t67062300\t0.3879\t21\nchr6\t67156200\t67156500\t0.4485\t40\nchr6\t67260300\t67260600\t0.4228\t72\nchr6\t67685100\t67685700\t0.2376\t52\nchr6\t67786800\t67787100\t0.3246\t71\nchr6\t67871100\t67871400\t0.5584\t67\nchr6\t68288700\t68289300\t0.2133\t70\nchr6\t68432400\t68433000\t0.0257\t62\nchr6\t68517900\t68518200\t0.0584\t66\nchr6\t68532300\t68532600\t0.5845\t32\nchr6\t68629500\t68629800\t0.6463\t41\nchr6\t69367800\t69368100\t0.6332\t57\nchr6\t69439800\t69440100\t0.4458\t54\nchr6\t69441300\t69441600\t0.4458\t54\nchr6\t69496500\t69496800\t0.3188\t58\nchr6\t69499500\t69499800\t0.3741\t64\nchr6\t69501000\t69501300\t0.3741\t64\nchr6\t69516000\t69521700\t0.1506\t102\nchr6\t69556500\t69556800\t0.2525\t68\nchr6\t69745200\t69745500\t0.4958\t69\nchr6\t70010700\t70016400\t0\t93\nchr6\t70757100\t70757400\t0.4143\t72\nchr6\t70767600\t70767900\t0.1926\t61\nchr6\t70786200\t70786500\t0.1454\t82\nchr6\t70935900\t70936200\t0.266\t80\nchr6\t70938000\t70938300\t0.266\t80\nchr6\t70948200\t70948800\t0.3506\t48\nchr6\t71128500\t71129400\t0.1723\t76\nchr6\t71141400\t71143500\t0.3211\t75\nchr6\t71265600\t71265900\t0.3378\t64\nchr6\t71318400\t71318700\t0.2483\t69\nchr6\t71827200\t71827800\t0.1386\t72\nchr6\t71861700\t71862000\t0.4996\t45\nchr6\t72110400\t72110700\t0.2283\t69\nchr6\t72500100\t72500400\t0.6142\t48\nchr6\t72570900\t72576000\t0\t96\nchr6\t72801300\t72801600\t0.1571\t60\nchr6\t72809100\t72809400\t0.6079\t44\nchr6\t72988800\t72994500\t0\t94\nchr6\t73436400\t73436700\t0.0533\t563\nchr6\t73517700\t73518000\t0.4605\t71\nchr6\t73659900\t73660200\t0.5735\t38\nchr6\t73661400\t73661700\t0.4656\t60\nchr6\t73711500\t73711800\t0.2965\t18\nchr6\t73836300\t73836600\t0.1342\t78\nchr6\t73838100\t73838400\t0.1342\t78\nchr6\t73839600\t73840200\t0.1342\t78\nchr6\t73920300\t73920900\t0.1106\t85\nchr6\t73959300\t73959900\t0.4036\t77\nchr6\t74097900\t74099700\t0.1272\t70\nchr6\t74155800\t74157000\t0\t88\nchr6\t74208900\t74209800\t0.2002\t86\nchr6\t74246700\t74247600\t0.1077\t44\nchr6\t74486100\t74486400\t0.4049\t75\nchr6\t74533500\t74533800\t0.627\t43\nchr6\t74594100\t74594700\t0.4825\t47\nchr6\t74724900\t74725200\t0.615\t17\nchr6\t75095400\t75095700\t0.4335\t73\nchr6\t75248100\t75248400\t0.0856\t22\nchr6\t75441000\t75441300\t0.5964\t45\nchr6\t76107900\t76109700\t0.0177\t84\nchr6\t76193400\t76193700\t0.4922\t89\nchr6\t76197000\t76197300\t0.4763\t26\nchr6\t76746300\t76746900\t0\t20\nchr6\t76891200\t76891500\t0.2002\t56\nchr6\t76900500\t76900800\t0.3386\t61\nchr6\t76964100\t76964700\t0.0584\t63\nchr6\t76976700\t76977300\t0.0957\t65\nchr6\t77043300\t77044800\t0.0338\t73\nchr6\t77061300\t77061600\t0.3384\t76\nchr6\t77083200\t77083800\t0.4062\t77\nchr6\t77085000\t77086500\t0.4062\t77\nchr6\t77157900\t77158200\t0.4027\t41\nchr6\t77591100\t77591400\t0.0826\t12\nchr6\t77696400\t77696700\t0.3892\t71\nchr6\t77717100\t77726100\t0\t120\nchr6\t77731200\t77731500\t0.3423\t54\nchr6\t77917500\t77918700\t0.4039\t76\nchr6\t77919900\t77920200\t0.4039\t76\nchr6\t78128100\t78128400\t0.231\t36\nchr6\t78543000\t78543900\t0.2075\t84\nchr6\t78858900\t78859500\t0.0289\t95\nchr6\t78976200\t78977100\t0.1046\t69\nchr6\t79691700\t79692000\t0.4423\t75\nchr6\t80493900\t80494200\t0.2994\t57\nchr6\t80496000\t80496300\t0.581\t44\nchr6\t80569800\t80571600\t0.0334\t75\nchr6\t80796000\t80796600\t0.4895\t79\nchr6\t80800800\t80803800\t0.0437\t83\nchr6\t80824800\t80825100\t0.4002\t72\nchr6\t80850300\t80850600\t0.4855\t64\nchr6\t80916900\t80920800\t0\t89\nchr6\t81435900\t81436200\t0.3323\t88\nchr6\t81468000\t81468300\t0.53\t34\nchr6\t81473400\t81473700\t0.3138\t68\nchr6\t81641700\t81642000\t0.3585\t44\nchr6\t81663000\t81665400\t0.1082\t71\nchr6\t82092300\t82092600\t0.4262\t85\nchr6\t82104300\t82104600\t0.5891\t65\nchr6\t82389600\t82390200\t0.0308\t64\nchr6\t82391700\t82394700\t0.0308\t64\nchr6\t82451700\t82452000\t0.511\t31\nchr6\t82560300\t82561200\t0.0628\t87\nchr6\t82562400\t82565400\t0.3122\t142\nchr6\t83318100\t83319000\t0.0844\t70\nchr6\t83334300\t83340000\t0\t75\nchr6\t83440500\t83442300\t0.3356\t68\nchr6\t83797800\t83798700\t0.0641\t86\nchr6\t83800200\t83802600\t0.0641\t86\nchr6\t84243900\t84244200\t0.2091\t79\nchr6\t84364800\t84367800\t0.3172\t68\nchr6\t84603300\t84603600\t0.353\t46\nchr6\t84608400\t84609000\t0\t53\nchr6\t84610200\t84614400\t0\t53\nchr6\t84628500\t84630600\t0.0817\t87\nchr6\t84631800\t84632400\t0.4022\t53\nchr6\t85316700\t85317000\t0.6006\t35\nchr6\t85434600\t85434900\t0.5307\t40\nchr6\t85985400\t85986900\t0\t68\nchr6\t85998900\t86005200\t0\t84\nchr6\t86021700\t86023800\t0.2561\t70\nchr6\t86025000\t86025300\t0.2561\t70\nchr6\t86052600\t86053800\t0.1047\t90\nchr6\t86211900\t86212500\t0.3875\t81\nchr6\t86225700\t86226000\t0.4899\t67\nchr6\t86492400\t86492700\t0.4631\t72\nchr6\t86507100\t86507400\t0.4506\t31\nchr6\t86577300\t86577600\t0.486\t59\nchr6\t86645700\t86648700\t0.0019\t81\nchr6\t86667300\t86667900\t0.2147\t60\nchr6\t86807700\t86808900\t0.1674\t76\nchr6\t86810400\t86811600\t0.1674\t76\nchr6\t86900100\t86900400\t0.603\t49\nchr6\t86902500\t86902800\t0.2654\t61\nchr6\t86925000\t86925300\t0.3368\t83\nchr6\t86926500\t86926800\t0.3368\t83\nchr6\t87009900\t87010800\t0.1965\t67\nchr6\t87128700\t87129000\t0.6575\t29\nchr6\t87239400\t87239700\t0.5969\t94\nchr6\t87324300\t87324600\t0.4652\t52\nchr6\t87326400\t87327900\t0.1709\t92\nchr6\t87576300\t87576600\t0.3479\t35\nchr6\t87680400\t87680700\t0.4697\t117\nchr6\t87736800\t87737100\t0.6472\t31\nchr6\t87750600\t87751200\t0.0526\t66\nchr6\t88319400\t88319700\t0.3696\t78\nchr6\t88337100\t88337400\t0.4756\t97\nchr6\t88353300\t88353600\t0.2516\t78\nchr6\t88356600\t88356900\t0.4527\t71\nchr6\t88381800\t88382400\t0.0092\t87\nchr6\t88411500\t88412100\t0.4345\t56\nchr6\t88434900\t88435200\t0.4088\t71\nchr6\t88448700\t88449300\t0.1695\t53\nchr6\t88773000\t88773300\t0.3397\t69\nchr6\t88946700\t88949100\t0.0183\t94\nchr6\t89166300\t89166600\t0.4346\t44\nchr6\t89225400\t89231100\t0\t80\nchr6\t89295600\t89295900\t0.397\t50\nchr6\t90528000\t90528300\t0.5647\t42\nchr6\t91047600\t91049400\t0.1682\t85\nchr6\t91051500\t91051800\t0.1682\t85\nchr6\t91209300\t91209600\t0.35\t61\nchr6\t91870500\t91871100\t0.2793\t63\nchr6\t92098200\t92098500\t0.4395\t41\nchr6\t92983500\t92984400\t0.2718\t95\nchr6\t93632700\t93634500\t0.1458\t86\nchr6\t93635700\t93636600\t0.1458\t86\nchr6\t93865800\t93871500\t0.0015\t112\nchr6\t94198200\t94203900\t0\t71\nchr6\t94763100\t94763400\t0.4849\t67\nchr6\t94829700\t94830000\t0.6194\t57\nchr6\t94856400\t94857000\t0.4383\t78\nchr6\t94911000\t94911900\t0.2748\t65\nchr6\t95303100\t95303400\t0.4679\t22\nchr6\t95363400\t95363700\t0.2452\t50\nchr6\t95665200\t95667600\t0\t57\nchr6\t95759100\t95759400\t0.6773\t73\nchr6\t95760600\t95763900\t0.0022\t88\nchr6\t95979900\t95983800\t0.053\t109\nchr6\t96193200\t96193500\t0.6671\t37\nchr6\t96655200\t96655500\t0.6907\t38\nchr6\t97663800\t97664100\t0.6576\t73\nchr6\t98083200\t98083800\t0.4835\t48\nchr6\t98243400\t98243700\t0.4069\t23\nchr6\t98245800\t98246100\t0.5824\t43\nchr6\t98417100\t98417700\t0.0038\t79\nchr6\t98418900\t98422500\t0.0038\t79\nchr6\t98704500\t98706900\t0.2628\t84\nchr6\t98866800\t98868300\t0.2128\t60\nchr6\t99002400\t99002700\t0.5049\t68\nchr6\t99142500\t99142800\t0.0614\t55\nchr6\t99206400\t99206700\t0.3852\t59\nchr6\t99483600\t99483900\t0.6364\t23\nchr6\t99649500\t99650100\t0.13\t76\nchr6\t99823800\t99825900\t0.0017\t104\nchr6\t99827100\t99829500\t0.0017\t104\nchr6\t100026600\t100026900\t0.5973\t46\nchr6\t100071000\t100071600\t0.3962\t76\nchr6\t100197600\t100200600\t0.0371\t85\nchr6\t100201800\t100202400\t0.0371\t85\nchr6\t100355400\t100356000\t0.1343\t128\nchr6\t100357200\t100360200\t0.1343\t128\nchr6\t100369200\t100369500\t0.3452\t83\nchr6\t101148000\t101148300\t0.4814\t24\nchr6\t101152800\t101153100\t0.2944\t65\nchr6\t101154600\t101154900\t0.2944\t65\nchr6\t101790600\t101790900\t0.5161\t90\nchr6\t101863800\t101864100\t0.4616\t65\nchr6\t102090000\t102090300\t0.2451\t73\nchr6\t102171000\t102171900\t0.4361\t88\nchr6\t102334500\t102334800\t0.2204\t74\nchr6\t102463800\t102464400\t0.0748\t49\nchr6\t102535500\t102535800\t0.3271\t95\nchr6\t102609900\t102610200\t0.3557\t66\nchr6\t102722700\t102724500\t0.1089\t86\nchr6\t102753000\t102753300\t0.1523\t56\nchr6\t102754800\t102757500\t0.0616\t69\nchr6\t103192800\t103193100\t0.3945\t86\nchr6\t103557900\t103558200\t0.2523\t106\nchr6\t103589400\t103589700\t0.5455\t53\nchr6\t103654800\t103656300\t0.0509\t67\nchr6\t103710000\t103714800\t0.0353\t85\nchr6\t104003400\t104003700\t0.6393\t19\nchr6\t104093100\t104093400\t0.3449\t61\nchr6\t104452800\t104457300\t0\t98\nchr6\t104464200\t104464500\t0.6348\t41\nchr6\t104489400\t104495400\t0\t84\nchr6\t104738100\t104738400\t0.2623\t86\nchr6\t104740800\t104742300\t0.2623\t86\nchr6\t105120000\t105120300\t0.4577\t11\nchr6\t105248400\t105249300\t0.2322\t66\nchr6\t105683700\t105684000\t0.5037\t66\nchr6\t105719100\t105720900\t0.2474\t107\nchr6\t105823800\t105824100\t0.1556\t17\nchr6\t105854400\t105854700\t0.241\t82\nchr6\t106061100\t106061400\t0.5268\t63\nchr6\t106401600\t106402800\t0.0801\t70\nchr6\t106535700\t106536000\t0.5928\t23\nchr6\t106720800\t106721400\t0.0561\t63\nchr6\t106723200\t106723500\t0.1067\t59\nchr6\t107464800\t107465100\t0.2622\t92\nchr6\t107519100\t107519400\t0.3449\t52\nchr6\t107520900\t107521200\t0.3358\t68\nchr6\t107710200\t107710500\t0.6265\t19\nchr6\t107782800\t107783700\t0.0725\t50\nchr6\t107854800\t107859900\t0.0829\t95\nchr6\t107887200\t107887500\t0.252\t49\nchr6\t107953500\t107953800\t0.6958\t46\nchr6\t108436200\t108436500\t0.68\t117\nchr6\t108664500\t108664800\t0.2232\t64\nchr6\t108681300\t108681600\t0.4826\t68\nchr6\t108889800\t108890100\t0.6792\t46\nchr6\t109046100\t109047900\t0.3149\t93\nchr6\t109246200\t109250700\t0.0859\t87\nchr6\t109621200\t109621800\t0.0213\t67\nchr6\t109684500\t109684800\t0.6732\t57\nchr6\t110155500\t110158500\t0\t69\nchr6\t110230500\t110232000\t0.2864\t43\nchr6\t111904200\t111907500\t0.0385\t75\nchr6\t112033200\t112033500\t0.3596\t110\nchr6\t112508400\t112509000\t0.0576\t65\nchr6\t112533300\t112533600\t0.4436\t72\nchr6\t112535400\t112535700\t0.3511\t65\nchr6\t112629600\t112629900\t0.1788\t59\nchr6\t112703700\t112709700\t0\t104\nchr6\t112813800\t112818900\t0\t70\nchr6\t112872300\t112872900\t0.0398\t83\nchr6\t112914600\t112919700\t0.0019\t94\nchr6\t113228100\t113232300\t0.0377\t72\nchr6\t113531700\t113532000\t0.0703\t86\nchr6\t113534700\t113536800\t0.0703\t86\nchr6\t113549700\t113550000\t0.3919\t68\nchr6\t113605800\t113607600\t0.0141\t78\nchr6\t113815500\t113815800\t0.6289\t47\nchr6\t114435000\t114435300\t0.4478\t44\nchr6\t114721800\t114723000\t0\t69\nchr6\t114724200\t114726000\t0\t69\nchr6\t114801600\t114802800\t0.0396\t63\nchr6\t114845700\t114846000\t0.3714\t51\nchr6\t114970500\t114972000\t0.2625\t96\nchr6\t114973800\t114974100\t0.5281\t40\nchr6\t115010100\t115012800\t0.0367\t60\nchr6\t115034400\t115034700\t0.2977\t99\nchr6\t115085100\t115085700\t0.1162\t62\nchr6\t115178100\t115178400\t0.2756\t67\nchr6\t115179900\t115181100\t0.2756\t67\nchr6\t115303500\t115303800\t0.5764\t46\nchr6\t115578900\t115580100\t0.053\t66\nchr6\t115960200\t115965900\t0\t127\nchr6\t116640900\t116641200\t0.3298\t44\nchr6\t116693700\t116694000\t0.3592\t91\nchr6\t116818200\t116819400\t0.134\t74\nchr6\t116820900\t116822700\t0.134\t74\nchr6\t117092400\t117093600\t0.1095\t85\nchr6\t117102300\t117108000\t0\t69\nchr6\t117182700\t117184200\t0.339\t105\nchr6\t117185700\t117187500\t0.3511\t129\nchr6\t117246600\t117250500\t0\t70\nchr6\t117707400\t117707700\t0.0996\t55\nchr6\t117709200\t117709500\t0.4168\t51\nchr6\t117924000\t117924600\t0.4658\t88\nchr6\t117997800\t117998400\t0.2076\t79\nchr6\t118002000\t118002300\t0.5756\t69\nchr6\t118128000\t118128300\t0.2139\t78\nchr6\t118646100\t118646400\t0.3011\t2638\nchr6\t119275200\t119275500\t0.3657\t24\nchr6\t120463500\t120464100\t0.5803\t69\nchr6\t120520500\t120520800\t0.4846\t66\nchr6\t120639000\t120639300\t0.2588\t57\nchr6\t120641100\t120642000\t0.2588\t57\nchr6\t120678600\t120678900\t0.4661\t67\nchr6\t120690900\t120694500\t0.348\t88\nchr6\t120727800\t120728100\t0.5425\t82\nchr6\t120751800\t120752400\t0.5684\t77\nchr6\t120823500\t120823800\t0.4\t71\nchr6\t121162800\t121168500\t0\t97\nchr6\t121566600\t121566900\t0.1904\t77\nchr6\t121568100\t121568700\t0.1904\t77\nchr6\t121623300\t121623600\t0.2771\t122\nchr6\t122377500\t122377800\t0.5805\t70\nchr6\t122540700\t122541300\t0.3359\t79\nchr6\t122847900\t122850000\t0.1044\t74\nchr6\t122889000\t122889600\t0.079\t112\nchr6\t122934000\t122934300\t0.4747\t60\nchr6\t123180600\t123182100\t0.0749\t61\nchr6\t123444000\t123446100\t0.0321\t80\nchr6\t123475200\t123477600\t0.0837\t78\nchr6\t123760500\t123760800\t0.4938\t43\nchr6\t124139100\t124139400\t0.3833\t42\nchr6\t124165800\t124167300\t0.0637\t92\nchr6\t124177800\t124178100\t0.1002\t20\nchr6\t124347000\t124347300\t0.6725\t95\nchr6\t124358700\t124359000\t0.3785\t51\nchr6\t124708800\t124709400\t0.4508\t79\nchr6\t124710600\t124710900\t0.4508\t79\nchr6\t124727700\t124728900\t0.0543\t74\nchr6\t124730400\t124731300\t0.0543\t74\nchr6\t124807500\t124807800\t0.4396\t41\nchr6\t124839900\t124841700\t0.0048\t70\nchr6\t125288700\t125289300\t0.1746\t219\nchr6\t125319000\t125322000\t0.0003\t82\nchr6\t125387700\t125389800\t0\t54\nchr6\t125702700\t125703600\t0.2278\t96\nchr6\t126043200\t126043500\t0.5942\t58\nchr6\t126622500\t126622800\t0.6577\t32\nchr6\t127596000\t127599000\t0.1972\t79\nchr6\t127617000\t127618200\t0.188\t83\nchr6\t127930500\t127930800\t0.3889\t65\nchr6\t128296800\t128297100\t0.5577\t77\nchr6\t128668500\t128669100\t0.2237\t55\nchr6\t128906100\t128909700\t0.0526\t87\nchr6\t128922300\t128923200\t0.2843\t75\nchr6\t128998500\t129004500\t0\t86\nchr6\t129129600\t129129900\t0.3864\t54\nchr6\t129167700\t129172200\t0.1454\t90\nchr6\t129518700\t129519000\t0.3495\t67\nchr6\t130116900\t130117500\t0.3897\t63\nchr6\t131143800\t131144400\t0.1589\t71\nchr6\t131541900\t131542200\t0.3551\t45\nchr6\t131698200\t131712000\t0\t101\nchr6\t131714100\t131714700\t0\t101\nchr6\t131856600\t131857500\t0.2645\t82\nchr6\t132006000\t132006300\t0.5514\t136\nchr6\t133020900\t133026600\t0\t93\nchr6\t133050300\t133050600\t0.4998\t25\nchr6\t133145400\t133146000\t0.3696\t101\nchr6\t133470000\t133473000\t0\t67\nchr6\t133520100\t133521900\t0.0836\t93\nchr6\t133650000\t133653900\t0.0038\t83\nchr6\t133663800\t133666200\t0.0039\t74\nchr6\t134132100\t134132400\t0.4446\t48\nchr6\t134496300\t134496600\t0.5616\t31\nchr6\t134659200\t134660100\t0.0764\t65\nchr6\t135363900\t135364800\t0.3929\t62\nchr6\t135510300\t135511500\t0.2161\t83\nchr6\t135893100\t135893400\t0.6307\t62\nchr6\t135980700\t135981000\t0.3688\t62\nchr6\t136276200\t136276500\t0.4606\t58\nchr6\t136815900\t136816200\t0.3639\t70\nchr6\t136851000\t136853100\t0.0091\t74\nchr6\t138049500\t138049800\t0.5712\t78\nchr6\t138189900\t138190200\t0.2097\t268\nchr6\t138626700\t138627000\t0.2681\t38\nchr6\t138823500\t138824100\t0.3046\t50\nchr6\t139557900\t139558200\t0.3661\t34\nchr6\t139657800\t139658100\t0.5571\t59\nchr6\t140652300\t140652600\t0.6249\t34\nchr6\t140681100\t140683200\t0\t58\nchr6\t140877900\t140878200\t0.1244\t75\nchr6\t141567600\t141571500\t0.0207\t128\nchr6\t141619200\t141621900\t0.0675\t66\nchr6\t141748800\t141750600\t0.3321\t70\nchr6\t141751800\t141752100\t0.3321\t70\nchr6\t141796200\t141796500\t0.4707\t43\nchr6\t141816000\t141816300\t0.3875\t85\nchr6\t141817500\t141819000\t0.3875\t85\nchr6\t141820200\t141820500\t0.3875\t85\nchr6\t141918000\t141921000\t0.036\t87\nchr6\t141922200\t141922800\t0.0347\t61\nchr6\t141926700\t141927900\t0.0047\t81\nchr6\t142422600\t142424700\t0.0632\t79\nchr6\t142974600\t142974900\t0.5465\t66\nchr6\t143213400\t143213700\t0.3971\t347\nchr6\t143303700\t143304600\t0.3926\t78\nchr6\t144433200\t144433500\t0.6594\t53\nchr6\t145072500\t145073700\t0.1134\t82\nchr6\t145503300\t145505100\t0.0346\t68\nchr6\t145596900\t145597200\t0.3505\t58\nchr6\t145663500\t145667400\t0.0236\t80\nchr6\t145681200\t145681800\t0.2749\t69\nchr6\t145719000\t145719300\t0.4293\t62\nchr6\t145770000\t145770600\t0.019\t65\nchr6\t145852500\t145855500\t0.1249\t106\nchr6\t145983000\t145983300\t0.2994\t70\nchr6\t146522100\t146522700\t0.2068\t65\nchr6\t147287100\t147287400\t0.4359\t28\nchr6\t147720900\t147721200\t0.1935\t74\nchr6\t147795900\t147796200\t0.4016\t65\nchr6\t147797400\t147797700\t0.4016\t65\nchr6\t148160100\t148160700\t0.0671\t65\nchr6\t148162800\t148163100\t0.4968\t49\nchr6\t148738200\t148738800\t0\t52\nchr6\t149177700\t149178000\t0.5531\t28\nchr6\t149444100\t149444400\t0.5487\t73\nchr6\t149944500\t149945400\t0.1911\t78\nchr6\t149947200\t149947500\t0.3482\t70\nchr6\t150019800\t150020400\t0.4355\t58\nchr6\t150022200\t150023100\t0.075\t59\nchr6\t150197700\t150198300\t0.4605\t178\nchr6\t151685100\t151685400\t0.5932\t28\nchr6\t151847400\t151848300\t0.1339\t56\nchr6\t151931700\t151933500\t0.099\t82\nchr6\t152251500\t152251800\t0.4679\t53\nchr6\t152633700\t152634000\t0.2986\t67\nchr6\t152709000\t152712600\t0\t69\nchr6\t152987700\t152989500\t0.0146\t55\nchr6\t153195900\t153196200\t0.4569\t60\nchr6\t153397800\t153398100\t0.3835\t72\nchr6\t153914400\t153914700\t0.467\t93\nchr6\t154263300\t154263600\t0.395\t31\nchr6\t154420500\t154420800\t0.4041\t41\nchr6\t154524900\t154525500\t0.2254\t83\nchr6\t154724100\t154724400\t0.5328\t25\nchr6\t155731500\t155731800\t0.5409\t61\nchr6\t156011100\t156011400\t0.2656\t65\nchr6\t156034200\t156039900\t0\t77\nchr6\t156178800\t156179100\t0.3188\t44\nchr6\t156325200\t156330600\t0.013\t69\nchr6\t156362100\t156367200\t0\t95\nchr6\t156483000\t156483300\t0.3673\t64\nchr6\t157147500\t157147800\t0.6884\t87\nchr6\t157283700\t157284000\t0.3457\t87\nchr6\t157310700\t157312200\t0.1232\t1394\nchr6\t157314000\t157314300\t0.6693\t775\nchr6\t157774200\t157774500\t0.5381\t213\nchr6\t158127300\t158127900\t0\t48\nchr6\t158238600\t158241300\t0.0125\t60\nchr6\t158455200\t158455500\t0.6617\t47\nchr6\t158705100\t158705400\t0.5758\t42\nchr6\t159231000\t159231300\t0.4163\t30\nchr6\t159402900\t159403200\t0.5318\t98\nchr6\t159457500\t159457800\t0.3288\t71\nchr6\t159547200\t159549600\t0.0104\t67\nchr6\t159651900\t159652500\t0.3162\t30\nchr6\t160091100\t160092300\t0.4626\t65\nchr6\t160100700\t160101000\t0.1063\t434\nchr6\t160125900\t160126200\t0.5778\t76\nchr6\t160409100\t160409700\t0.1139\t53\nchr6\t160611900\t160647000\t0\t282\nchr6\t160679700\t160683300\t0.2399\t74\nchr6\t160752900\t160753200\t0.4839\t54\nchr6\t161646000\t161646300\t0.2316\t48\nchr6\t161874000\t161874300\t0\t114\nchr6\t161900400\t161900700\t0.1605\t28\nchr6\t161982300\t161983800\t0\t86\nchr6\t162074100\t162074400\t0.3143\t11\nchr6\t162114000\t162114600\t0.4071\t72\nchr6\t162339900\t162340200\t0.3262\t53\nchr6\t162838800\t162844200\t0\t108\nchr6\t162990000\t162995400\t0.0015\t86\nchr6\t163329300\t163329600\t0.6651\t98\nchr6\t163976400\t163976700\t0.4723\t54\nchr6\t164076300\t164076900\t0.4418\t71\nchr6\t164474100\t164474700\t0.4036\t68\nchr6\t164723400\t164723700\t0.3412\t28\nchr6\t164784000\t164784300\t0.3466\t79\nchr6\t164797800\t164798700\t0.1733\t86\nchr6\t164958000\t164958300\t0.4267\t65\nchr6\t165123300\t165123600\t0.131\t83\nchr6\t165303300\t165306300\t0\t81\nchr6\t165370200\t165370500\t0.149\t152\nchr6\t165749100\t165749400\t0.6816\t113\nchr6\t166272600\t166272900\t0.6119\t86\nchr6\t166396200\t166396500\t0.6981\t50\nchr6\t166426200\t166428900\t0.0281\t133\nchr6\t166517400\t166517700\t0.5337\t51\nchr6\t166581900\t166582200\t0.6691\t71\nchr6\t166585500\t166586100\t0.0225\t56\nchr6\t166748700\t166749300\t0.3654\t24\nchr6\t166783800\t166784700\t0.2166\t57\nchr6\t166794000\t166794300\t0.4399\t51\nchr6\t167084700\t167085000\t0.1878\t88\nchr6\t167167800\t167168400\t0.5773\t47\nchr6\t167170800\t167171100\t0.2234\t87\nchr6\t167173500\t167177100\t0.0701\t87\nchr6\t167181300\t167183400\t0.0968\t71\nchr6\t167194200\t167194500\t0.6314\t77\nchr6\t167196600\t167196900\t0.3992\t69\nchr6\t167204400\t167204700\t0.1593\t52\nchr6\t167208000\t167208300\t0.536\t64\nchr6\t167266200\t167266500\t0.5025\t72\nchr6\t167315700\t167316000\t0.2265\t59\nchr6\t167319600\t167319900\t0.1408\t48\nchr6\t167332500\t167335200\t0.084\t94\nchr6\t167358000\t167358600\t0.108\t45\nchr6\t167365500\t167365800\t0.4353\t40\nchr6\t167372700\t167373000\t0.0005\t78\nchr6\t167374200\t167375100\t0.0005\t78\nchr6\t167376600\t167376900\t0.0005\t78\nchr6\t167378100\t167381400\t0.1818\t73\nchr6\t167383800\t167390700\t0.1303\t64\nchr6\t167421900\t167422200\t0.545\t11\nchr6\t167423700\t167424000\t0.1499\t17\nchr6\t167433000\t167434800\t0.5244\t108\nchr6\t167562300\t167562600\t0.3071\t72\nchr6\t167732700\t167733300\t0.5119\t77\nchr6\t167940300\t167941800\t0.1299\t137\nchr6\t167977500\t167977800\t0.2755\t60\nchr6\t168001800\t168002100\t0.6323\t60\nchr6\t168168600\t168168900\t0.4691\t89\nchr6\t168235200\t168235800\t0.459\t60\nchr6\t168245700\t168246300\t0.2571\t69\nchr6\t168316500\t168318000\t0\t80\nchr6\t168357900\t168358800\t0.6074\t54\nchr6\t168560700\t168562200\t0.0944\t33\nchr6\t168571800\t168573300\t0.4135\t55\nchr6\t168589800\t168590100\t0.5439\t57\nchr6\t168592800\t168594900\t0.0205\t105\nchr6\t168596100\t168596400\t0.6307\t91\nchr6\t168653700\t168655200\t0.0073\t72\nchr6\t168659400\t168659700\t0.6053\t158\nchr6\t168693000\t168693300\t0.1718\t55\nchr6\t168694500\t168695100\t0.2563\t55\nchr6\t168705600\t168705900\t0.6687\t70\nchr6\t168795900\t168796200\t0.5601\t43\nchr6\t168840300\t168840900\t0.3667\t159\nchr6\t168846900\t168847800\t0.1791\t138\nchr6\t168850200\t168850500\t0.6107\t61\nchr6\t168909600\t168909900\t0.6785\t39\nchr6\t168931800\t168932100\t0.465\t61\nchr6\t168942000\t168942300\t0.4958\t50\nchr6\t168975300\t168975600\t0.3864\t56\nchr6\t168976800\t168978600\t0.0725\t74\nchr6\t168990900\t168991800\t0.4809\t42\nchr6\t169024800\t169025100\t0.5631\t29\nchr6\t169032900\t169033200\t0.1067\t34\nchr6\t169127400\t169128900\t0.4327\t82\nchr6\t169195800\t169196100\t0.5885\t43\nchr6\t169372200\t169372500\t0.6228\t56\nchr6\t169377000\t169377600\t0.2309\t60\nchr6\t169425300\t169425600\t0.4766\t28\nchr6\t169509300\t169509600\t0.4938\t57\nchr6\t169781700\t169782300\t0.5726\t71\nchr6\t169900500\t169902000\t0.3103\t68\nchr6\t169987500\t169988400\t0.1783\t62\nchr6\t170052600\t170052900\t0.6419\t19\nchr6\t170064900\t170065200\t0.2219\t28\nchr6\t170087400\t170088000\t0.5822\t61\nchr6\t170114100\t170114400\t0.6754\t132\nchr6\t170145900\t170146500\t0.1753\t220\nchr6\t170190600\t170191800\t0.4364\t48\nchr6\t170214900\t170220900\t0\t115\nchr6\t170236800\t170238000\t0.5195\t66\nchr6\t170246100\t170246700\t0.0675\t49\nchr6\t170266800\t170267700\t0.2964\t28\nchr6\t170344200\t170344500\t0.5751\t52\nchr6\t170376900\t170377800\t0.3651\t192\nchr6\t170394300\t170394600\t0.6285\t75\nchr6\t170399400\t170400000\t0.635\t298\nchr6\t170421600\t170421900\t0.6173\t92\nchr6\t170466000\t170467200\t0.5596\t103\nchr6\t170495100\t170496900\t0.4323\t107\nchr6\t170612100\t170626500\t0\t88\nchr6\t170627700\t170710800\t0\t88\nchr6\t170712300\t170736600\t0\t111\nchr6\t170738400\t170745900\t0\t75\nchr7\t9900\t34200\t0\t109\nchr7\t36300\t37200\t0.0115\t95\nchr7\t38400\t40500\t0.2265\t80\nchr7\t47400\t49500\t0.0555\t77\nchr7\t69300\t70200\t0.4663\t79\nchr7\t73200\t75000\t0.1026\t55\nchr7\t77400\t77700\t0.6689\t40\nchr7\t103200\t104100\t0.0292\t49\nchr7\t129000\t129300\t0.5016\t107\nchr7\t172800\t173100\t0.4245\t44\nchr7\t177600\t178200\t0.4918\t66\nchr7\t206400\t207300\t0.3256\t145\nchr7\t215400\t216000\t0.2207\t18\nchr7\t221400\t222000\t0\t22\nchr7\t243000\t243900\t0.0643\t59\nchr7\t257700\t258000\t0.6882\t143\nchr7\t262800\t264000\t0.2947\t77\nchr7\t297000\t297300\t0.5607\t56\nchr7\t336600\t336900\t0.6997\t45\nchr7\t355800\t356100\t0.5242\t65\nchr7\t361500\t361800\t0.2079\t68\nchr7\t393600\t394200\t0.3259\t76\nchr7\t419400\t420000\t0.2812\t33\nchr7\t457200\t457500\t0.6073\t32\nchr7\t470400\t471000\t0.1143\t12\nchr7\t478800\t479100\t0.2156\t15\nchr7\t552000\t552300\t0.4445\t97\nchr7\t566700\t567000\t0.4507\t14\nchr7\t588600\t588900\t0.6952\t64\nchr7\t608700\t609000\t0.2257\t45\nchr7\t629700\t630000\t0.5801\t33\nchr7\t636000\t636600\t0.1177\t73\nchr7\t747900\t748200\t0.0804\t29\nchr7\t847500\t847800\t0.4073\t41\nchr7\t889800\t890100\t0.3444\t21\nchr7\t905400\t906600\t0.4403\t290\nchr7\t933600\t934200\t0.4899\t34\nchr7\t942600\t943800\t0.5754\t27\nchr7\t990000\t990300\t0.2444\t18\nchr7\t1002900\t1003200\t0.671\t19\nchr7\t1016100\t1016400\t0.4313\t41\nchr7\t1031400\t1031700\t0.3394\t49\nchr7\t1037100\t1040100\t0.0868\t91\nchr7\t1067400\t1067700\t0.65\t47\nchr7\t1069500\t1070400\t0.0781\t70\nchr7\t1107900\t1108200\t0.1939\t41\nchr7\t1116600\t1117500\t0.244\t105\nchr7\t1145400\t1148100\t0\t100\nchr7\t1156200\t1156500\t0.0433\t20\nchr7\t1272000\t1274100\t0.0192\t338\nchr7\t1319700\t1320300\t0.0851\t55\nchr7\t1763700\t1764000\t0.5678\t31\nchr7\t1861500\t1861800\t0.0133\t56\nchr7\t1929600\t1930500\t0.264\t75\nchr7\t1937700\t1938000\t0.0247\t68\nchr7\t1990800\t1991400\t0\t67\nchr7\t1996200\t1996500\t0.5415\t91\nchr7\t2035200\t2035800\t0\t71\nchr7\t2049900\t2050200\t0.659\t57\nchr7\t2058000\t2058600\t0.4896\t23\nchr7\t2101200\t2101500\t0.5719\t54\nchr7\t2267400\t2269200\t0.3993\t64\nchr7\t2278800\t2279400\t0.2426\t57\nchr7\t2377500\t2378100\t0.4638\t105\nchr7\t2533800\t2534100\t0.5637\t59\nchr7\t2676900\t2678400\t0.5964\t66\nchr7\t3127200\t3127500\t0.4916\t70\nchr7\t3603000\t3603300\t0.6541\t55\nchr7\t3708300\t3708600\t0.0944\t61\nchr7\t3813600\t3816300\t0.1099\t76\nchr7\t3963000\t3963600\t0.5222\t58\nchr7\t3975900\t3977400\t0.0393\t150\nchr7\t4263600\t4264200\t0.235\t49\nchr7\t4313100\t4313400\t0.1439\t35\nchr7\t4496100\t4496400\t0.4414\t79\nchr7\t4545000\t4545300\t0.1479\t110\nchr7\t4582500\t4600200\t0\t89\nchr7\t5121000\t5121600\t0.171\t60\nchr7\t5155800\t5156700\t0.0014\t64\nchr7\t5160300\t5160900\t0.0059\t64\nchr7\t5449200\t5449500\t0.2004\t31\nchr7\t5548800\t5549100\t0.2418\t40\nchr7\t5610900\t5611200\t0.6865\t55\nchr7\t5807700\t5808300\t0.4205\t77\nchr7\t5812500\t5812800\t0.5084\t64\nchr7\t5847600\t5848200\t0.3923\t69\nchr7\t5898600\t5899200\t0.0431\t68\nchr7\t5900700\t5901300\t0.1358\t44\nchr7\t5905200\t5905500\t0.4346\t60\nchr7\t5913300\t5914200\t0\t99\nchr7\t5915700\t5926500\t0\t99\nchr7\t5929200\t5942400\t0\t93\nchr7\t5945100\t5976900\t0\t105\nchr7\t5979900\t5980800\t0.0055\t65\nchr7\t5985900\t5986200\t0.4423\t70\nchr7\t6738600\t6738900\t0.4267\t72\nchr7\t6742200\t6742500\t0.0069\t73\nchr7\t6744300\t6745200\t0.0069\t73\nchr7\t6747600\t6780300\t0\t118\nchr7\t6782400\t6795900\t0\t118\nchr7\t6797700\t6810000\t0\t118\nchr7\t6811200\t6811500\t0.271\t30\nchr7\t6819600\t6819900\t0.4267\t44\nchr7\t6823800\t6824100\t0.4298\t63\nchr7\t6825300\t6826200\t0.1925\t68\nchr7\t6974400\t6974700\t0.2423\t79\nchr7\t7465500\t7470900\t0\t87\nchr7\t7544400\t7547100\t0\t79\nchr7\t8298900\t8301600\t0.0384\t103\nchr7\t8303100\t8304000\t0.0384\t103\nchr7\t8352000\t8353800\t0.0927\t104\nchr7\t8726400\t8726700\t0.3069\t49\nchr7\t8727900\t8730300\t0.3287\t77\nchr7\t8858700\t8859600\t0.4689\t70\nchr7\t9321900\t9322200\t0.444\t31\nchr7\t9400200\t9401100\t0.0164\t73\nchr7\t9402300\t9402600\t0.165\t70\nchr7\t9427200\t9428400\t0.4596\t70\nchr7\t9595200\t9596400\t0\t40\nchr7\t9655800\t9656100\t0.6295\t34\nchr7\t9738900\t9740400\t0.2178\t58\nchr7\t9808500\t9809400\t0.0109\t102\nchr7\t9990000\t9990300\t0.2772\t80\nchr7\t10166700\t10171500\t0.0227\t86\nchr7\t10464600\t10466400\t0.002\t40\nchr7\t10566900\t10567200\t0.3312\t68\nchr7\t10589400\t10590300\t0.3128\t77\nchr7\t12182700\t12183300\t0.114\t74\nchr7\t12242100\t12242400\t0.4704\t26\nchr7\t12485100\t12486000\t0.0209\t83\nchr7\t12499800\t12500100\t0.0403\t76\nchr7\t12501600\t12502500\t0.0403\t76\nchr7\t12527100\t12527400\t0.675\t70\nchr7\t12972300\t12972600\t0.4492\t43\nchr7\t13085700\t13086000\t0.0857\t67\nchr7\t13103100\t13103700\t0.4323\t54\nchr7\t13203000\t13203300\t0.4742\t43\nchr7\t13272300\t13272600\t0.2344\t76\nchr7\t13623600\t13623900\t0.5152\t28\nchr7\t13630800\t13631100\t0.0632\t45\nchr7\t13650000\t13650300\t0.3013\t149\nchr7\t13767900\t13770000\t0.1829\t59\nchr7\t13806900\t13808700\t0.404\t77\nchr7\t14211300\t14212200\t0.0039\t60\nchr7\t14281200\t14282400\t0.0461\t96\nchr7\t14315100\t14318400\t0.0044\t87\nchr7\t14649600\t14652300\t0.0571\t63\nchr7\t14706000\t14709900\t0.0319\t78\nchr7\t14843400\t14843700\t0.4838\t55\nchr7\t15529800\t15530400\t0.0058\t35\nchr7\t15549000\t15552900\t0.2687\t92\nchr7\t15573000\t15573300\t0.4365\t66\nchr7\t15942300\t15942600\t0.2446\t177\nchr7\t15944100\t15946200\t0.2446\t177\nchr7\t16197900\t16198500\t0.1405\t78\nchr7\t16217100\t16220700\t0.1044\t77\nchr7\t16789200\t16789800\t0\t58\nchr7\t17017500\t17018700\t0.2141\t76\nchr7\t18007200\t18007500\t0.346\t56\nchr7\t18105000\t18105600\t0.2406\t47\nchr7\t18135300\t18137400\t0.293\t85\nchr7\t18984900\t18986700\t0.0005\t84\nchr7\t19190100\t19191300\t0.2928\t64\nchr7\t19193100\t19193400\t0.4356\t63\nchr7\t19197900\t19198200\t0.3962\t90\nchr7\t19458900\t19460100\t0.105\t79\nchr7\t19494900\t19495200\t0.5627\t31\nchr7\t19683600\t19683900\t0.1765\t79\nchr7\t19685700\t19687200\t0.2136\t71\nchr7\t20002800\t20003100\t0.2783\t72\nchr7\t20073300\t20073600\t0.4894\t63\nchr7\t20538300\t20538900\t0.4337\t67\nchr7\t20667900\t20669700\t0.3009\t95\nchr7\t22462500\t22464000\t0.378\t65\nchr7\t22493700\t22494300\t0.3483\t42\nchr7\t22511400\t22511700\t0.6515\t64\nchr7\t22529700\t22534200\t0\t81\nchr7\t22644600\t22644900\t0.5785\t72\nchr7\t22801500\t22801800\t0.1765\t85\nchr7\t23036400\t23042700\t0.0119\t104\nchr7\t23045400\t23045700\t0.3631\t83\nchr7\t23323200\t23325000\t0.0826\t105\nchr7\t23326500\t23326800\t0.3595\t59\nchr7\t23636400\t23638500\t0.2861\t42\nchr7\t23952600\t23953200\t0.2821\t63\nchr7\t23996700\t23997000\t0.0065\t35\nchr7\t24001500\t24005100\t0\t61\nchr7\t24102000\t24102300\t0.4381\t70\nchr7\t24355800\t24356100\t0.1198\t36\nchr7\t24545700\t24546000\t0.5147\t29\nchr7\t24584100\t24584700\t0.2864\t109\nchr7\t24638400\t24638700\t0.2392\t43\nchr7\t24675600\t24675900\t0.2302\t21\nchr7\t24677400\t24677700\t0.437\t60\nchr7\t24897300\t24897600\t0.5925\t56\nchr7\t25005000\t25005300\t0\t12\nchr7\t25017900\t25020000\t0.0675\t38\nchr7\t25041900\t25047900\t0\t168\nchr7\t25355100\t25355400\t0.6261\t63\nchr7\t25450800\t25451100\t0.4988\t79\nchr7\t25601700\t25602300\t0.0765\t86\nchr7\t25604700\t25608900\t0.0005\t98\nchr7\t25744500\t25745100\t0.085\t99\nchr7\t25746300\t25746600\t0.085\t99\nchr7\t25747800\t25749600\t0.085\t99\nchr7\t25925100\t25925700\t0.3863\t69\nchr7\t26176500\t26176800\t0.4793\t63\nchr7\t26262300\t26262900\t0.1467\t64\nchr7\t26283900\t26284200\t0.3128\t12\nchr7\t27045900\t27046200\t0.6675\t42\nchr7\t27308700\t27309000\t0.4029\t32\nchr7\t27456600\t27456900\t0.5118\t62\nchr7\t27503100\t27503400\t0.3128\t60\nchr7\t27743700\t27744000\t0.3185\t23\nchr7\t28743900\t28744200\t0.5415\t31\nchr7\t28839000\t28839600\t0.1022\t68\nchr7\t29580600\t29584200\t0.0215\t151\nchr7\t29585400\t29585700\t0.0215\t151\nchr7\t29961000\t29961600\t0.109\t63\nchr7\t30056100\t30056400\t0.2721\t90\nchr7\t30415500\t30417300\t0.1592\t72\nchr7\t30419700\t30420000\t0.1592\t72\nchr7\t30439500\t30445200\t0\t122\nchr7\t30495900\t30496200\t0.3437\t43\nchr7\t30636900\t30641400\t0.0222\t92\nchr7\t30857400\t30857700\t0.5225\t34\nchr7\t31031100\t31031400\t0.5417\t37\nchr7\t31280700\t31281000\t0.5057\t45\nchr7\t31484400\t31485600\t0\t60\nchr7\t31586100\t31586400\t0.3916\t67\nchr7\t31621800\t31622100\t0.6393\t56\nchr7\t31623900\t31624800\t0.2871\t80\nchr7\t31656900\t31657200\t0.6602\t32\nchr7\t32085000\t32085900\t0.5126\t40\nchr7\t32097900\t32098200\t0.5689\t53\nchr7\t32308800\t32309100\t0.4081\t70\nchr7\t32350500\t32353500\t0\t87\nchr7\t32386200\t32386800\t0.0911\t69\nchr7\t32464800\t32468100\t0.0163\t86\nchr7\t32469300\t32470200\t0.0163\t86\nchr7\t32579100\t32579400\t0.5154\t30\nchr7\t32620500\t32620800\t0.3307\t38\nchr7\t32683200\t32685000\t0\t88\nchr7\t32686500\t32686800\t0\t88\nchr7\t32698800\t32699400\t0.1687\t64\nchr7\t32700600\t32703300\t0.1687\t64\nchr7\t32710200\t32710500\t0\t79\nchr7\t32711700\t32713800\t0\t79\nchr7\t32737800\t32738100\t0.3023\t15\nchr7\t32746500\t32746800\t0.5093\t61\nchr7\t32825100\t32825700\t0.0593\t86\nchr7\t32829300\t32829600\t0.4357\t52\nchr7\t32970900\t32971200\t0.3757\t68\nchr7\t33170100\t33170700\t0.4079\t81\nchr7\t33522600\t33525900\t0.002\t85\nchr7\t33549000\t33549600\t0.4295\t53\nchr7\t33859200\t33859500\t0.3592\t22\nchr7\t33988800\t33993300\t0.2844\t77\nchr7\t34169700\t34171500\t0.2779\t93\nchr7\t34173000\t34174200\t0.493\t71\nchr7\t34200300\t34202100\t0.0535\t78\nchr7\t34266000\t34267800\t0.0598\t83\nchr7\t34515000\t34516200\t0.0327\t101\nchr7\t34517400\t34519200\t0.0327\t101\nchr7\t34790700\t34791000\t0.0705\t38\nchr7\t34799700\t34801500\t0\t32\nchr7\t34816200\t34817700\t0\t40\nchr7\t34907700\t34908000\t0.1849\t55\nchr7\t34910700\t34912200\t0.255\t70\nchr7\t34914900\t34915200\t0.645\t83\nchr7\t34918200\t34918500\t0.6095\t69\nchr7\t34954800\t34955100\t0.4134\t39\nchr7\t35044500\t35046000\t0.4207\t58\nchr7\t35082600\t35082900\t0.3137\t51\nchr7\t35094900\t35095200\t0.3158\t88\nchr7\t35097900\t35098200\t0.4882\t83\nchr7\t35115900\t35116800\t0.0565\t95\nchr7\t35139900\t35140200\t0.4313\t35\nchr7\t35153700\t35154300\t0.4438\t52\nchr7\t36435600\t36435900\t0.4656\t40\nchr7\t36554700\t36555300\t0.188\t100\nchr7\t36556500\t36557100\t0.3222\t65\nchr7\t37164600\t37164900\t0.4371\t50\nchr7\t37167300\t37167600\t0.5114\t57\nchr7\t37293000\t37293300\t0.0411\t20\nchr7\t37298700\t37300800\t0\t72\nchr7\t37437600\t37437900\t0.6879\t20\nchr7\t37469700\t37470000\t0.5035\t71\nchr7\t37612500\t37616700\t0.1009\t106\nchr7\t37807500\t37809300\t0.1103\t78\nchr7\t37959000\t37959300\t0.3808\t34\nchr7\t38028600\t38029500\t0.0213\t110\nchr7\t38240100\t38240400\t0.6164\t49\nchr7\t38473500\t38473800\t0.4838\t20\nchr7\t38696100\t38696400\t0.144\t64\nchr7\t39007800\t39009000\t0.2235\t111\nchr7\t39010200\t39012900\t0.2235\t111\nchr7\t39274200\t39276000\t0.0573\t77\nchr7\t39677400\t39678000\t0.0628\t47\nchr7\t39787200\t39787500\t0.6059\t27\nchr7\t39808500\t39808800\t0.4439\t40\nchr7\t39853200\t39854100\t0.003\t61\nchr7\t40249200\t40249500\t0.4937\t30\nchr7\t40335300\t40335600\t0.5646\t56\nchr7\t40944300\t40944600\t0.4228\t68\nchr7\t42564900\t42565500\t0.5527\t41\nchr7\t42582900\t42583200\t0.5012\t139\nchr7\t42786600\t42787200\t0.1812\t81\nchr7\t43060200\t43064700\t0.0833\t88\nchr7\t43413000\t43416000\t0.0142\t85\nchr7\t43686300\t43686600\t0.4932\t61\nchr7\t43776900\t43777500\t0.19\t103\nchr7\t43980900\t43981200\t0.3405\t72\nchr7\t43998600\t44000100\t0.4084\t72\nchr7\t44002200\t44004900\t0.0402\t99\nchr7\t44006400\t44006700\t0.0402\t99\nchr7\t44016600\t44016900\t0.5881\t77\nchr7\t44022000\t44022300\t0.4711\t55\nchr7\t44027400\t44027700\t0.2768\t94\nchr7\t44030400\t44031900\t0.2768\t94\nchr7\t44033100\t44033400\t0.3523\t82\nchr7\t44039400\t44040300\t0.3548\t76\nchr7\t44198700\t44199000\t0.2556\t59\nchr7\t44455800\t44456100\t0.4961\t48\nchr7\t44910900\t44911200\t0.607\t26\nchr7\t45083400\t45084300\t0\t58\nchr7\t45378900\t45379200\t0.2946\t64\nchr7\t45693300\t45693900\t0.3221\t56\nchr7\t45758400\t45758700\t0.5095\t47\nchr7\t45760200\t45760500\t0.3796\t59\nchr7\t45811200\t45812700\t0.2273\t59\nchr7\t45948300\t45948600\t0.1165\t70\nchr7\t46141500\t46143000\t0.4071\t72\nchr7\t46326600\t46326900\t0.3652\t32\nchr7\t46821300\t46825500\t0\t81\nchr7\t47109600\t47109900\t0.5607\t41\nchr7\t47111700\t47112300\t0\t23\nchr7\t47524500\t47524800\t0.5337\t48\nchr7\t47959200\t47960400\t0.3657\t58\nchr7\t48463800\t48464100\t0.4954\t124\nchr7\t48791100\t48792300\t0.1792\t93\nchr7\t48850500\t48851400\t0.0168\t44\nchr7\t48860100\t48860400\t0.3506\t70\nchr7\t48864000\t48865500\t0.2291\t78\nchr7\t48907500\t48908400\t0.096\t72\nchr7\t48912000\t48912900\t0.3303\t57\nchr7\t48921600\t48921900\t0.2635\t58\nchr7\t49534800\t49535100\t0.1129\t50\nchr7\t49653600\t49653900\t0.4271\t72\nchr7\t49664700\t49665000\t0.2632\t51\nchr7\t49680000\t49686300\t0\t86\nchr7\t50122200\t50123400\t0.2895\t79\nchr7\t50901000\t50904000\t0.1206\t73\nchr7\t51571800\t51572100\t0.4211\t41\nchr7\t51594600\t51594900\t0.4257\t76\nchr7\t51624300\t51624600\t0.5579\t39\nchr7\t51683100\t51683400\t0.3987\t67\nchr7\t51787800\t51788100\t0.3618\t75\nchr7\t51891300\t51892200\t0.0748\t72\nchr7\t51894300\t51895200\t0.0748\t72\nchr7\t52892700\t52894500\t0.1276\t76\nchr7\t53026500\t53031900\t0.1372\t82\nchr7\t54221100\t54231000\t0\t77\nchr7\t54232500\t54233700\t0\t77\nchr7\t54309000\t54309600\t0.4994\t84\nchr7\t54311400\t54321300\t0\t76\nchr7\t54667800\t54668100\t0.5926\t38\nchr7\t55219200\t55221300\t0.0054\t93\nchr7\t55401600\t55402200\t0.242\t82\nchr7\t55470900\t55473000\t0.2419\t76\nchr7\t55692900\t55693200\t0.3947\t66\nchr7\t55707300\t55707600\t0.5156\t56\nchr7\t55716600\t55716900\t0.3868\t65\nchr7\t55744200\t55744500\t0.3596\t154\nchr7\t55747200\t55749300\t0.3106\t67\nchr7\t56150700\t56152200\t0.0471\t52\nchr7\t56335800\t56336100\t0.6865\t83\nchr7\t56370300\t56374800\t0\t2733\nchr7\t56377200\t56379300\t0.2242\t66\nchr7\t56382900\t56383200\t0.2242\t66\nchr7\t56585400\t56590800\t0.0033\t115\nchr7\t56748300\t56748900\t0.0147\t67\nchr7\t56750100\t56750700\t0.0147\t67\nchr7\t56794500\t56794800\t0.4389\t62\nchr7\t56799600\t56799900\t0.4637\t47\nchr7\t56805300\t56805600\t0.4888\t78\nchr7\t56807700\t56808000\t0.4885\t76\nchr7\t56813700\t56814000\t0\t91\nchr7\t56816700\t56823000\t0\t91\nchr7\t56824800\t56825100\t0.354\t67\nchr7\t56833500\t56834100\t0.0231\t62\nchr7\t56835900\t56837700\t0.1518\t71\nchr7\t56838900\t56839200\t0.1518\t71\nchr7\t56840400\t56842800\t0.1862\t75\nchr7\t56844600\t56845500\t0.012\t82\nchr7\t56848200\t56849100\t0.1799\t61\nchr7\t56852100\t56853000\t0.1036\t62\nchr7\t56854200\t56855700\t0.1036\t62\nchr7\t56857800\t56858100\t0.2881\t61\nchr7\t56864400\t56870700\t0.1263\t71\nchr7\t56875500\t56878800\t0.0009\t98\nchr7\t56883000\t56886000\t0\t76\nchr7\t56887500\t56889300\t0.1257\t75\nchr7\t56891100\t56891400\t0.029\t79\nchr7\t56894100\t56895600\t0.2358\t86\nchr7\t56896800\t56898000\t0.2358\t86\nchr7\t56899800\t56900100\t0.0097\t65\nchr7\t56902200\t56904000\t0.0097\t65\nchr7\t56907300\t56909100\t0.04\t78\nchr7\t56914500\t56916900\t0.0373\t75\nchr7\t56919000\t56919300\t0.4084\t65\nchr7\t56921100\t56945100\t0\t99\nchr7\t56946300\t56993700\t0\t105\nchr7\t56995800\t56997300\t0\t57\nchr7\t57004800\t57007500\t0\t49\nchr7\t57009000\t57012300\t0\t49\nchr7\t57013500\t57048300\t0\t98\nchr7\t57050700\t57051300\t0\t60\nchr7\t57053100\t57054000\t0.1754\t93\nchr7\t57055200\t57055500\t0.3751\t71\nchr7\t57057300\t57057600\t0.5014\t64\nchr7\t57064800\t57065400\t0.2785\t62\nchr7\t57068100\t57075300\t0\t85\nchr7\t57076800\t57083400\t0\t85\nchr7\t57087600\t57087900\t0.3736\t73\nchr7\t57090000\t57091500\t0.2578\t58\nchr7\t57105600\t57105900\t0.3775\t61\nchr7\t57126300\t57126600\t0.4987\t64\nchr7\t57486000\t57497100\t0.1739\t557\nchr7\t57509100\t57509400\t0.123\t16\nchr7\t57611100\t57638100\t0\t175\nchr7\t57639600\t57640200\t0.1295\t68\nchr7\t57825300\t57825600\t0.3875\t97\nchr7\t57827400\t57854400\t0\t224\nchr7\t57887700\t57888300\t0.6837\t180\nchr7\t57898200\t57900300\t0.2466\t100\nchr7\t57905700\t57906000\t0.6868\t101\nchr7\t57908400\t57908700\t0.6748\t87\nchr7\t57918600\t57918900\t0.6989\t155\nchr7\t57926400\t57926700\t0.6666\t88\nchr7\t57935100\t57936000\t0.6401\t134\nchr7\t57937500\t57937800\t0.4875\t177\nchr7\t57945600\t57945900\t0.3198\t61\nchr7\t57961800\t57962100\t0.6512\t96\nchr7\t57977100\t57977400\t0.6327\t118\nchr7\t57983400\t57985200\t0.0118\t92\nchr7\t58008300\t58008600\t0.6267\t128\nchr7\t58032900\t58033500\t0.5692\t159\nchr7\t58036200\t58036800\t0.3405\t393\nchr7\t58067400\t58067700\t0.5166\t246\nchr7\t58074000\t58074900\t0.6165\t213\nchr7\t58079100\t58079400\t0.6812\t295\nchr7\t58080900\t58081200\t0.593\t207\nchr7\t58083600\t58085100\t0.593\t207\nchr7\t58096800\t58097100\t0.2401\t127\nchr7\t58170000\t58177200\t0\t1801\nchr7\t58179300\t58189500\t0\t1801\nchr7\t58191300\t58515000\t0\t1801\nchr7\t58516200\t58541100\t0\t1801\nchr7\t58542300\t58727100\t0\t1010\nchr7\t58728600\t58912200\t0\t4073\nchr7\t58913400\t58926900\t0\t4073\nchr7\t58928100\t59028900\t0\t4073\nchr7\t59030100\t59112000\t0\t4073\nchr7\t59113500\t59127600\t0\t4073\nchr7\t59128800\t59249100\t0\t1772\nchr7\t59250300\t59253900\t0\t1772\nchr7\t59255100\t59355300\t0\t2549\nchr7\t59356500\t59509200\t0\t4155\nchr7\t59511000\t59680800\t0\t321\nchr7\t59682600\t59752800\t0\t2715\nchr7\t59754000\t59824500\t0\t2715\nchr7\t59826000\t59888400\t0\t2715\nchr7\t59889600\t59891400\t0\t2715\nchr7\t59892600\t59951400\t0\t2715\nchr7\t59952600\t59958600\t0\t2715\nchr7\t59959800\t60038100\t0\t2715\nchr7\t60039300\t60117600\t0\t854\nchr7\t60118800\t60303900\t0\t1800\nchr7\t60305100\t60469800\t0\t1800\nchr7\t60471000\t60478200\t0\t1800\nchr7\t60480000\t60573000\t0\t1901\nchr7\t60574200\t60828300\t0\t1355\nchr7\t60878400\t60911700\t0\t79\nchr7\t60931200\t60932400\t0.5659\t136\nchr7\t60938100\t60938400\t0.6281\t140\nchr7\t60950100\t60950400\t0.4913\t104\nchr7\t60951900\t60952500\t0.4913\t104\nchr7\t60953700\t60955200\t0.5354\t182\nchr7\t60986400\t60986700\t0.5201\t144\nchr7\t61012200\t61012500\t0.4726\t108\nchr7\t61031400\t61031700\t0.4806\t129\nchr7\t61071900\t61075200\t0\t79\nchr7\t61102800\t61103100\t0.4907\t233\nchr7\t61105200\t61107600\t0.6264\t162\nchr7\t61114500\t61130100\t0\t87\nchr7\t61131300\t61135800\t0\t87\nchr7\t61137000\t61139700\t0\t87\nchr7\t61141200\t61182900\t0\t208\nchr7\t61184100\t61194300\t0\t208\nchr7\t61195800\t61249500\t0\t208\nchr7\t61250700\t61262400\t0\t208\nchr7\t61264500\t61266300\t0\t232\nchr7\t61267500\t61327800\t0\t232\nchr7\t61379700\t61404000\t0\t424\nchr7\t61405200\t61527600\t0\t424\nchr7\t61578000\t61725000\t0\t107\nchr7\t61728900\t61729500\t0.0075\t66\nchr7\t61758300\t61765200\t0\t85\nchr7\t61768200\t61769400\t0.0159\t69\nchr7\t61777500\t61780800\t0\t90\nchr7\t61794900\t61797600\t0.0166\t62\nchr7\t61799400\t61799700\t0.3661\t56\nchr7\t61802400\t61811400\t0\t94\nchr7\t61812900\t61813200\t0\t94\nchr7\t61816500\t61816800\t0.5957\t49\nchr7\t61838400\t61843500\t0\t103\nchr7\t61867800\t61868400\t0.1028\t39\nchr7\t61967700\t61970400\t0.0117\t52\nchr7\t61972500\t61976100\t0\t266\nchr7\t62026500\t62027400\t0\t63\nchr7\t62028600\t62028900\t0.688\t41\nchr7\t62030100\t62154600\t0\t117\nchr7\t62158500\t62159100\t0.0092\t69\nchr7\t62174100\t62174400\t0.4397\t55\nchr7\t62177400\t62184300\t0\t87\nchr7\t62187000\t62188500\t0\t87\nchr7\t62190000\t62193300\t0\t87\nchr7\t62209500\t62210100\t0.0356\t80\nchr7\t62211900\t62212200\t0.2175\t56\nchr7\t62214000\t62216400\t0\t68\nchr7\t62218800\t62226000\t0\t83\nchr7\t62255100\t62255400\t0.5142\t120\nchr7\t62263800\t62264400\t0.323\t84\nchr7\t62269200\t62269500\t0.6523\t146\nchr7\t62270700\t62271000\t0.1631\t23\nchr7\t62273700\t62274000\t0.5864\t120\nchr7\t62277300\t62292900\t0\t166\nchr7\t62295300\t62295600\t0.475\t163\nchr7\t62333100\t62333400\t0.1268\t68\nchr7\t62335200\t62335500\t0.2233\t276\nchr7\t62338800\t62339100\t0.6407\t125\nchr7\t62354400\t62354700\t0.5722\t125\nchr7\t62359800\t62376000\t0\t181\nchr7\t62382300\t62382600\t0.486\t156\nchr7\t62402700\t62403000\t0.2544\t768\nchr7\t62441100\t62441400\t0.6239\t204\nchr7\t62454600\t62455200\t0.2631\t1117\nchr7\t62506800\t62511300\t0\t474\nchr7\t62515800\t62516400\t0.0401\t33\nchr7\t62544000\t62544300\t0.065\t10\nchr7\t62587800\t62588400\t0.1264\t57\nchr7\t62607600\t62608200\t0.2776\t75\nchr7\t62728800\t62729100\t0.358\t63\nchr7\t62864100\t62864400\t0.3525\t64\nchr7\t62970900\t62971800\t0.3194\t73\nchr7\t63064200\t63064500\t0.4648\t95\nchr7\t63122100\t63122400\t0.0224\t42\nchr7\t63148800\t63154800\t0\t74\nchr7\t63276000\t63276300\t0.4587\t72\nchr7\t63277500\t63277800\t0.4587\t72\nchr7\t63284400\t63284700\t0.5761\t40\nchr7\t63290700\t63291000\t0\t91\nchr7\t63292500\t63365400\t0\t91\nchr7\t63379500\t63379800\t0.6066\t44\nchr7\t63382500\t63457500\t0\t89\nchr7\t63470700\t63471600\t0.2879\t64\nchr7\t63484800\t63493800\t0\t89\nchr7\t63495300\t63503400\t0\t89\nchr7\t63504900\t63506400\t0.0307\t51\nchr7\t63507900\t63508200\t0.3361\t37\nchr7\t63509700\t63511500\t0.3361\t37\nchr7\t63513000\t63513600\t0.1506\t48\nchr7\t63515100\t63515700\t0.1506\t48\nchr7\t63516900\t63518700\t0.025\t63\nchr7\t63525600\t63526200\t0.1109\t69\nchr7\t63528900\t63531900\t0\t83\nchr7\t63533100\t63559200\t0\t102\nchr7\t63561300\t63561900\t0.0251\t56\nchr7\t63567300\t63567600\t0.6928\t17\nchr7\t63570000\t63570300\t0.3003\t26\nchr7\t63579600\t63579900\t0.3255\t85\nchr7\t63583200\t63653100\t0\t103\nchr7\t63654600\t63655800\t0\t103\nchr7\t63657600\t63662700\t0.0127\t62\nchr7\t63663900\t63664200\t0.0127\t62\nchr7\t63665400\t63665700\t0.0127\t62\nchr7\t63667200\t63669600\t0\t62\nchr7\t63672600\t63675600\t0.0135\t65\nchr7\t63676800\t63677700\t0.0135\t65\nchr7\t63679800\t63682800\t0.0135\t65\nchr7\t63684900\t63686400\t0.001\t75\nchr7\t63687600\t63695100\t0.001\t75\nchr7\t63698100\t63701400\t0.0229\t78\nchr7\t63703500\t63703800\t0.0229\t78\nchr7\t63705300\t63710700\t0.0229\t78\nchr7\t63712200\t63712800\t0.0229\t78\nchr7\t63716700\t63717000\t0.4601\t70\nchr7\t63718800\t63719400\t0.4601\t70\nchr7\t63721500\t63725100\t0.1352\t65\nchr7\t63727800\t63728700\t0\t78\nchr7\t63731400\t63732300\t0\t78\nchr7\t63734100\t63735300\t0.0707\t74\nchr7\t63738000\t63741600\t0.0707\t74\nchr7\t63742800\t63743400\t0.16\t74\nchr7\t63750000\t63765000\t0\t192\nchr7\t63768300\t63768900\t0.2262\t50\nchr7\t63770700\t63771000\t0.2639\t47\nchr7\t63773700\t63774600\t0.0265\t50\nchr7\t63776700\t63777000\t0.0265\t50\nchr7\t63779100\t63780600\t0.3515\t62\nchr7\t63781800\t63784200\t0.4729\t65\nchr7\t63825000\t63825600\t0.0347\t54\nchr7\t63827100\t63827400\t0.2332\t60\nchr7\t63846600\t63846900\t0.4229\t41\nchr7\t64154400\t64154700\t0.4174\t61\nchr7\t64645200\t64647600\t0.2358\t72\nchr7\t64808700\t64809300\t0.3343\t44\nchr7\t64856100\t64856400\t0\t37\nchr7\t64967100\t64968000\t0.148\t28\nchr7\t65028000\t65028600\t0.0159\t59\nchr7\t65067600\t65067900\t0.4428\t55\nchr7\t65073000\t65075100\t0.0091\t60\nchr7\t65098800\t65099100\t0.3227\t58\nchr7\t65106900\t65107800\t0\t46\nchr7\t65109300\t65109900\t0.2455\t69\nchr7\t65112600\t65142600\t0\t99\nchr7\t65143800\t65144100\t0\t99\nchr7\t65146800\t65151300\t0\t78\nchr7\t65153100\t65156100\t0\t78\nchr7\t65161200\t65176500\t0\t78\nchr7\t65179200\t65181900\t0.1407\t75\nchr7\t65185200\t65185800\t0.0749\t60\nchr7\t65187300\t65187600\t0.0093\t75\nchr7\t65190600\t65190900\t0.0093\t75\nchr7\t65192100\t65196900\t0.0093\t75\nchr7\t65199900\t65200200\t0.2284\t56\nchr7\t65202000\t65205000\t0.2284\t56\nchr7\t65207100\t65208300\t0.2284\t56\nchr7\t65215800\t65216100\t0.3949\t58\nchr7\t65217900\t65218200\t0.4211\t62\nchr7\t65258100\t65261700\t0\t59\nchr7\t65340600\t65341200\t0.269\t86\nchr7\t65489400\t65490600\t0.1192\t470\nchr7\t65505900\t65508600\t0\t67\nchr7\t65511900\t65513700\t0.1789\t91\nchr7\t65514900\t65515500\t0.1731\t77\nchr7\t65517000\t65517600\t0.3465\t66\nchr7\t65519400\t65560200\t0\t117\nchr7\t65562900\t65583600\t0\t103\nchr7\t65586300\t65586600\t0.1678\t94\nchr7\t65588100\t65589000\t0.1678\t94\nchr7\t65630700\t65682900\t0\t105\nchr7\t65685600\t65688300\t0.0018\t78\nchr7\t65691300\t65691900\t0.0575\t53\nchr7\t65694300\t65694600\t0.017\t83\nchr7\t65697900\t65702400\t0.017\t83\nchr7\t65705700\t65706300\t0.2943\t55\nchr7\t65708100\t65708400\t0.0674\t63\nchr7\t65710500\t65710800\t0.0674\t63\nchr7\t65721600\t65721900\t0.4038\t55\nchr7\t65724000\t65724300\t0.5117\t61\nchr7\t65757000\t65757300\t0.4577\t64\nchr7\t65762400\t65764500\t0\t67\nchr7\t65788200\t65788500\t0.3316\t57\nchr7\t65847300\t65847600\t0.4605\t37\nchr7\t65864700\t65865000\t0.0414\t61\nchr7\t65945700\t65946300\t0.1976\t58\nchr7\t65948400\t65948700\t0.0626\t55\nchr7\t66001200\t66001500\t0.1049\t45\nchr7\t66003600\t66004200\t0.1818\t64\nchr7\t66099000\t66099300\t0.6434\t32\nchr7\t66286800\t66292800\t0\t80\nchr7\t66393000\t66395100\t0.0994\t60\nchr7\t66636300\t66636600\t0.4378\t56\nchr7\t66673500\t66673800\t0.5253\t53\nchr7\t66820500\t66820800\t0.6331\t38\nchr7\t67031100\t67031700\t0.0238\t76\nchr7\t67071900\t67072200\t0.2512\t54\nchr7\t67173600\t67174200\t0.5911\t41\nchr7\t67177200\t67178100\t0.5029\t42\nchr7\t67179600\t67179900\t0.5029\t42\nchr7\t67185900\t67186200\t0.1337\t42\nchr7\t67201200\t67201500\t0.2921\t22\nchr7\t67215000\t67216500\t0.2209\t48\nchr7\t67232700\t67233300\t0\t25\nchr7\t67273800\t67274100\t0.2968\t70\nchr7\t67275300\t67275900\t0.031\t59\nchr7\t67278300\t67279500\t0.2489\t86\nchr7\t67280700\t67283100\t0.2489\t86\nchr7\t67284300\t67284600\t0.2489\t86\nchr7\t67287900\t67288500\t0.2714\t86\nchr7\t67290300\t67290600\t0.2714\t86\nchr7\t67292700\t67293000\t0.4671\t44\nchr7\t67294500\t67294800\t0.4671\t44\nchr7\t67324500\t67324800\t0.407\t62\nchr7\t67326300\t67326600\t0.5309\t59\nchr7\t67333200\t67333500\t0.4101\t50\nchr7\t67335300\t67335900\t0.0678\t50\nchr7\t67338300\t67338900\t0.4753\t60\nchr7\t68652000\t68653200\t0.1804\t64\nchr7\t69062700\t69063600\t0.3535\t64\nchr7\t69611700\t69612000\t0.377\t36\nchr7\t70162200\t70162500\t0.4695\t31\nchr7\t70197300\t70203900\t0\t87\nchr7\t70872000\t70872300\t0.6693\t23\nchr7\t71102100\t71102400\t0.2939\t41\nchr7\t71679900\t71680800\t0.3054\t72\nchr7\t71747700\t71748000\t0.2281\t14\nchr7\t72106500\t72106800\t0.6011\t30\nchr7\t72209100\t72209400\t0.6548\t66\nchr7\t72295500\t72296700\t0.2759\t73\nchr7\t72526800\t72527400\t0.0033\t82\nchr7\t72529500\t72530400\t0.0033\t82\nchr7\t72560400\t72560700\t0.5576\t73\nchr7\t72580800\t72581400\t0.267\t38\nchr7\t72626100\t72626400\t0.4414\t67\nchr7\t72739800\t72740100\t0.5295\t56\nchr7\t72795600\t72796500\t0.022\t58\nchr7\t72851400\t72853200\t0.0064\t74\nchr7\t72864900\t72865200\t0.2062\t71\nchr7\t72870600\t72871200\t0.4167\t64\nchr7\t72872400\t72872700\t0.3777\t59\nchr7\t72874500\t72876000\t0.0435\t67\nchr7\t72880800\t72881700\t0.5147\t55\nchr7\t72885600\t72885900\t0.4299\t51\nchr7\t72896400\t72896700\t0.4428\t23\nchr7\t72940200\t72942900\t0.2098\t75\nchr7\t72946800\t72947400\t0.2862\t72\nchr7\t72950700\t73005600\t0\t116\nchr7\t73007100\t73122900\t0\t116\nchr7\t73124100\t73134300\t0\t116\nchr7\t73135500\t73237200\t0\t116\nchr7\t73238400\t73242900\t0\t116\nchr7\t73244400\t73244700\t0.4564\t79\nchr7\t73250100\t73252800\t0.1095\t59\nchr7\t73254900\t73260000\t0\t68\nchr7\t73261500\t73270200\t0\t71\nchr7\t73273800\t73274400\t0.0047\t78\nchr7\t73275600\t73282200\t0.0047\t78\nchr7\t73284000\t73286400\t0.1931\t59\nchr7\t73292400\t73297800\t0.019\t73\nchr7\t73302000\t73302600\t0.5005\t67\nchr7\t73776000\t73776300\t0.348\t36\nchr7\t73797600\t73797900\t0.2538\t91\nchr7\t73835400\t73837200\t0.3505\t62\nchr7\t74196600\t74196900\t0.4126\t51\nchr7\t74728500\t74731500\t0\t67\nchr7\t74733000\t74782500\t0\t103\nchr7\t74784000\t74841000\t0\t103\nchr7\t74842800\t74865600\t0\t92\nchr7\t74867100\t74869200\t0.079\t68\nchr7\t74871300\t74871600\t0.1568\t64\nchr7\t74873100\t74873400\t0.1568\t64\nchr7\t74875500\t74879700\t0.1568\t64\nchr7\t74882400\t74892900\t0\t99\nchr7\t74894100\t74907000\t0\t99\nchr7\t74908200\t74908500\t0.0771\t45\nchr7\t74910900\t74920500\t0\t90\nchr7\t74926200\t74935500\t0\t98\nchr7\t74937900\t74945400\t0\t98\nchr7\t74946600\t74976900\t0\t98\nchr7\t74978400\t74984400\t0\t98\nchr7\t75075000\t75079800\t0.0234\t81\nchr7\t75081300\t75092100\t0\t92\nchr7\t75093900\t75101400\t0\t92\nchr7\t75106500\t75113700\t0\t97\nchr7\t75114900\t75117300\t0\t97\nchr7\t75119100\t75153000\t0\t97\nchr7\t75155700\t75156300\t0.0597\t73\nchr7\t75157500\t75272100\t0\t99\nchr7\t75273900\t75414300\t0\t92\nchr7\t75417900\t75418200\t0.6626\t53\nchr7\t75422400\t75423600\t0.2653\t66\nchr7\t75425100\t75427500\t0.01\t76\nchr7\t75443400\t75448800\t0\t75\nchr7\t75451200\t75451800\t0\t75\nchr7\t75455400\t75455700\t0.3893\t64\nchr7\t75456900\t75457800\t0.2414\t87\nchr7\t75459000\t75459900\t0.2414\t87\nchr7\t75463800\t75464100\t0.4273\t69\nchr7\t75478800\t75480300\t0.1676\t63\nchr7\t75489000\t75491100\t0.1757\t66\nchr7\t75496200\t75498000\t0.1031\t81\nchr7\t75499800\t75500400\t0.1031\t81\nchr7\t75504300\t75504900\t0.3092\t87\nchr7\t75506400\t75507900\t0.0241\t62\nchr7\t75510000\t75510300\t0.0241\t62\nchr7\t75516600\t75516900\t0.6105\t48\nchr7\t75706800\t75708000\t0.0055\t61\nchr7\t75828900\t75829200\t0.1555\t59\nchr7\t75834600\t75834900\t0.1045\t75\nchr7\t76103700\t76104000\t0.4397\t63\nchr7\t76170000\t76170300\t0.3583\t60\nchr7\t76266000\t76266300\t0.1145\t14\nchr7\t76434000\t76434900\t0.2062\t70\nchr7\t76438800\t76439100\t0\t88\nchr7\t76440900\t76442700\t0\t88\nchr7\t76446000\t76449600\t0\t73\nchr7\t76452900\t76469100\t0\t78\nchr7\t76470300\t76471200\t0\t78\nchr7\t76472400\t76473900\t0\t78\nchr7\t76475400\t76476300\t0.0318\t56\nchr7\t76477800\t76479300\t0.0318\t56\nchr7\t76483500\t76497900\t0\t68\nchr7\t76500000\t76500600\t0.244\t54\nchr7\t76504200\t76504500\t0.1546\t54\nchr7\t76519200\t76519500\t0.0351\t12\nchr7\t76521600\t76522500\t0\t24\nchr7\t76524900\t76525800\t0\t80\nchr7\t76527000\t76547400\t0\t80\nchr7\t76551300\t76551600\t0.2868\t57\nchr7\t76553400\t76553700\t0.3538\t37\nchr7\t76573200\t76573500\t0.3144\t44\nchr7\t76584300\t76584600\t0.3652\t57\nchr7\t76590600\t76590900\t0.5833\t77\nchr7\t76599900\t76600200\t0.2725\t40\nchr7\t76602900\t76603200\t0.5841\t22\nchr7\t76605000\t76607100\t0.0165\t105\nchr7\t76609200\t76611000\t0\t61\nchr7\t76612200\t76615200\t0\t61\nchr7\t76617300\t76618200\t0\t72\nchr7\t76619700\t76620300\t0\t72\nchr7\t76621800\t76622400\t0\t72\nchr7\t76626900\t76630800\t0\t72\nchr7\t76632900\t76636500\t0\t72\nchr7\t76638300\t76638600\t0.0468\t57\nchr7\t76639800\t76644300\t0.0468\t57\nchr7\t76648500\t76649100\t0.0342\t45\nchr7\t76651800\t76652700\t0.0478\t64\nchr7\t76660800\t76661100\t0.1608\t52\nchr7\t76666500\t76666800\t0.3322\t59\nchr7\t76672800\t76673100\t0.1961\t52\nchr7\t76681500\t76681800\t0.2642\t55\nchr7\t76695600\t76695900\t0.1886\t51\nchr7\t76729500\t76730100\t0.0796\t73\nchr7\t76732200\t76734000\t0.0796\t73\nchr7\t76737000\t76737300\t0.2046\t67\nchr7\t76738800\t76739100\t0.4401\t47\nchr7\t76740300\t76741500\t0.4113\t66\nchr7\t76745100\t76746900\t0.2011\t61\nchr7\t76748100\t76748400\t0.5259\t58\nchr7\t76749600\t76749900\t0.4466\t19\nchr7\t76768500\t76769100\t0.1548\t57\nchr7\t76781400\t76781700\t0.6055\t56\nchr7\t76790700\t76791300\t0.2686\t62\nchr7\t76817700\t76818000\t0.4668\t54\nchr7\t76845300\t76845600\t0.4799\t51\nchr7\t76849200\t76849500\t0.3414\t37\nchr7\t76863300\t76863600\t0.3057\t57\nchr7\t76869300\t76869600\t0.3082\t47\nchr7\t76870800\t76871100\t0.253\t58\nchr7\t76873800\t76874100\t0.376\t57\nchr7\t76880400\t76881600\t0.3252\t45\nchr7\t76892400\t76892700\t0.5112\t50\nchr7\t76896900\t76897200\t0.3863\t59\nchr7\t76951200\t76954500\t0.1595\t73\nchr7\t76956300\t76962300\t0\t71\nchr7\t76963800\t76969200\t0.039\t90\nchr7\t76973400\t76974300\t0.0352\t80\nchr7\t76977000\t76977300\t0.0352\t80\nchr7\t76982100\t76985700\t0.0142\t82\nchr7\t76987200\t76987500\t0.089\t79\nchr7\t76988700\t76989000\t0.089\t79\nchr7\t76990500\t76991700\t0.0057\t101\nchr7\t76993200\t76993500\t0.0057\t101\nchr7\t76994700\t76996500\t0.4817\t69\nchr7\t77004000\t77004300\t0.4303\t76\nchr7\t77012100\t77019900\t0\t75\nchr7\t77021400\t77048400\t0\t101\nchr7\t77054100\t77054700\t0.0794\t96\nchr7\t77055900\t77059800\t0.0794\t96\nchr7\t77061000\t77062500\t0.0794\t96\nchr7\t77075700\t77076000\t0.5226\t28\nchr7\t77078400\t77080200\t0.0507\t69\nchr7\t77087100\t77087400\t0.4941\t58\nchr7\t77092500\t77094300\t0.0022\t52\nchr7\t77096700\t77099400\t0.1538\t58\nchr7\t77100900\t77101800\t0.1538\t58\nchr7\t77106600\t77106900\t0.2576\t46\nchr7\t77108100\t77108400\t0.4503\t50\nchr7\t77113200\t77114700\t0.2398\t63\nchr7\t77115900\t77116800\t0.022\t52\nchr7\t77157000\t77157300\t0.0348\t73\nchr7\t77166300\t77166600\t0.4515\t50\nchr7\t77508600\t77510400\t0.0371\t78\nchr7\t78297300\t78297600\t0.591\t70\nchr7\t78330300\t78330600\t0.4871\t38\nchr7\t78536100\t78536400\t0.5507\t34\nchr7\t78668400\t78668700\t0.359\t69\nchr7\t78867000\t78867300\t0.4144\t53\nchr7\t79230900\t79234500\t0.0426\t77\nchr7\t79885500\t79887000\t0.1995\t69\nchr7\t79939200\t79939800\t0.2259\t72\nchr7\t80112900\t80113200\t0.5133\t34\nchr7\t80328900\t80329200\t0.6223\t53\nchr7\t80713800\t80714100\t0.1857\t98\nchr7\t80715900\t80716200\t0.3443\t69\nchr7\t80718300\t80718600\t0.3124\t53\nchr7\t81058500\t81058800\t0.6282\t60\nchr7\t81172500\t81172800\t0.3807\t16\nchr7\t81426600\t81426900\t0.5539\t81\nchr7\t81785100\t81786000\t0.1629\t49\nchr7\t82059900\t82060200\t0.5912\t19\nchr7\t82400100\t82401600\t0.3979\t54\nchr7\t82611600\t82611900\t0.5089\t40\nchr7\t82642200\t82642500\t0.5756\t45\nchr7\t82806900\t82807200\t0.1676\t80\nchr7\t83025300\t83025600\t0.1101\t77\nchr7\t83026800\t83029800\t0.1101\t77\nchr7\t83291700\t83292000\t0.4472\t68\nchr7\t83298000\t83298600\t0.3899\t63\nchr7\t83389800\t83390400\t0.504\t59\nchr7\t83606400\t83606700\t0.2852\t53\nchr7\t83747400\t83747700\t0.3094\t45\nchr7\t83989500\t83993400\t0.1386\t81\nchr7\t84053100\t84054000\t0.1591\t59\nchr7\t84064500\t84065400\t0.1133\t82\nchr7\t84067800\t84068100\t0.1513\t109\nchr7\t84080700\t84081000\t0.5834\t22\nchr7\t84099000\t84099300\t0.6287\t24\nchr7\t84121500\t84121800\t0.616\t22\nchr7\t84152100\t84152400\t0.3861\t72\nchr7\t84318300\t84318600\t0.3603\t46\nchr7\t84707700\t84708000\t0.3018\t67\nchr7\t85250700\t85251000\t0.1916\t50\nchr7\t85253100\t85254900\t0.2907\t67\nchr7\t85330200\t85334700\t0.1293\t93\nchr7\t85418700\t85419000\t0.5091\t42\nchr7\t85656900\t85657500\t0.3929\t67\nchr7\t86198100\t86198400\t0.4621\t60\nchr7\t86204400\t86204700\t0.3674\t76\nchr7\t86205900\t86206200\t0.3674\t76\nchr7\t86343300\t86344800\t0.2127\t69\nchr7\t86457000\t86458800\t0.0645\t73\nchr7\t86484600\t86484900\t0.3863\t62\nchr7\t86807100\t86807400\t0.2874\t34\nchr7\t86986200\t86987100\t0.1812\t43\nchr7\t87042000\t87042300\t0.3216\t94\nchr7\t87043800\t87045300\t0.104\t64\nchr7\t87062700\t87065100\t0.0626\t70\nchr7\t87087900\t87088200\t0.4829\t47\nchr7\t87242700\t87243600\t0.3051\t100\nchr7\t87626100\t87626700\t0.3732\t39\nchr7\t87703800\t87704100\t0.2983\t96\nchr7\t87750600\t87750900\t0.4753\t81\nchr7\t87950400\t87952200\t0.0818\t67\nchr7\t88221900\t88222500\t0.2978\t66\nchr7\t88439700\t88440000\t0.3564\t23\nchr7\t88462200\t88462500\t0.3626\t23\nchr7\t88551900\t88553100\t0.1058\t65\nchr7\t88554300\t88554600\t0.4866\t54\nchr7\t88872600\t88872900\t0.4902\t70\nchr7\t89195100\t89195700\t0.1305\t102\nchr7\t89343000\t89343300\t0.6689\t37\nchr7\t89462400\t89463600\t0.3133\t63\nchr7\t89682900\t89683200\t0.5029\t70\nchr7\t89789400\t89792400\t0.1496\t61\nchr7\t89899200\t89900400\t0.2336\t109\nchr7\t90074400\t90075300\t0.0026\t57\nchr7\t90113100\t90113400\t0.3413\t59\nchr7\t90117000\t90117300\t0.1516\t55\nchr7\t90160500\t90160800\t0.537\t60\nchr7\t90202200\t90202500\t0.5146\t67\nchr7\t90523200\t90523800\t0.3175\t75\nchr7\t90954600\t90954900\t0.6428\t29\nchr7\t91174500\t91176000\t0.0669\t76\nchr7\t91177200\t91178400\t0.0669\t76\nchr7\t91217400\t91218000\t0.1438\t86\nchr7\t91390800\t91391100\t0.4688\t87\nchr7\t91392600\t91392900\t0.3666\t66\nchr7\t91488300\t91488600\t0.4943\t63\nchr7\t91511700\t91512000\t0.4562\t54\nchr7\t91587300\t91588200\t0.0547\t84\nchr7\t91702500\t91702800\t0.4718\t35\nchr7\t91903800\t91908300\t0.0853\t92\nchr7\t92013000\t92013300\t0.3359\t62\nchr7\t92185500\t92185800\t0.2953\t62\nchr7\t92261100\t92261400\t0.5783\t68\nchr7\t92561100\t92562000\t0.058\t52\nchr7\t92574600\t92574900\t0.3632\t73\nchr7\t93346800\t93347700\t0.3924\t61\nchr7\t93369900\t93370500\t0.2322\t67\nchr7\t93589200\t93589500\t0.491\t64\nchr7\t93788100\t93793200\t0\t68\nchr7\t94159200\t94160400\t0.0454\t116\nchr7\t95100900\t95101200\t0.6135\t63\nchr7\t95832000\t95835300\t0.1117\t83\nchr7\t95837100\t95837700\t0.4413\t94\nchr7\t95942700\t95943000\t0.26\t59\nchr7\t96553200\t96557700\t0.2754\t65\nchr7\t96582000\t96583500\t0.2344\t45\nchr7\t96846600\t96852600\t0\t90\nchr7\t97533300\t97533600\t0.1327\t65\nchr7\t97535700\t97536000\t0.5988\t58\nchr7\t97614000\t97619700\t0.0112\t86\nchr7\t97701600\t97702500\t0.2101\t77\nchr7\t97765800\t97766100\t0.2601\t65\nchr7\t97778400\t97779000\t0.2438\t62\nchr7\t97780200\t97780500\t0.4389\t62\nchr7\t99809700\t99815100\t0\t94\nchr7\t99888000\t99888300\t0.6026\t34\nchr7\t99952500\t99952800\t0.5534\t53\nchr7\t100300500\t100300800\t0.4285\t69\nchr7\t100302000\t100302300\t0.4285\t69\nchr7\t100308900\t100314900\t0.0593\t69\nchr7\t100322100\t100322400\t0.4593\t45\nchr7\t100334700\t100335000\t0.2694\t53\nchr7\t100345200\t100345500\t0.6118\t48\nchr7\t100740300\t100742700\t0.0428\t59\nchr7\t100957500\t100959000\t0.5707\t1375\nchr7\t100962000\t100962300\t0.4991\t33\nchr7\t100993500\t101004300\t0.0156\t400\nchr7\t101017800\t101018100\t0.5436\t61\nchr7\t101358000\t101359800\t0.0445\t75\nchr7\t101691000\t101691300\t0.4019\t30\nchr7\t102341700\t102342300\t0.0021\t85\nchr7\t102343500\t102345600\t0.0021\t85\nchr7\t102346800\t102357900\t0\t135\nchr7\t102361500\t102361800\t0.6145\t52\nchr7\t102371700\t102372000\t0.4311\t69\nchr7\t102476400\t102541500\t0\t151\nchr7\t102543000\t102554100\t0\t151\nchr7\t102555300\t102576900\t0\t117\nchr7\t102579000\t102691200\t0\t139\nchr7\t102702900\t102703500\t0.3972\t58\nchr7\t102713700\t102714300\t0.2846\t67\nchr7\t102733800\t102734100\t0.6038\t50\nchr7\t102755100\t102755400\t0.3942\t76\nchr7\t102756600\t102756900\t0.2407\t74\nchr7\t102762900\t102763200\t0.2004\t56\nchr7\t102764400\t102764700\t0.2004\t56\nchr7\t102767100\t102770700\t0.3747\t63\nchr7\t102771900\t102773400\t0.1693\t70\nchr7\t102777300\t102777600\t0.3689\t62\nchr7\t102785100\t102785400\t0.3535\t59\nchr7\t102791100\t102792900\t0.1546\t67\nchr7\t102960900\t102962100\t0.3968\t73\nchr7\t103521000\t103521300\t0.529\t63\nchr7\t103822500\t103822800\t0.6498\t31\nchr7\t103873200\t103873800\t0.276\t71\nchr7\t103909800\t103911900\t0.2532\t65\nchr7\t104173800\t104174100\t0.6319\t61\nchr7\t104213700\t104214000\t0.465\t86\nchr7\t104392200\t104392500\t0.401\t83\nchr7\t104457600\t104457900\t0.2898\t60\nchr7\t104507400\t104508300\t0.1272\t73\nchr7\t104520300\t104520900\t0.5227\t37\nchr7\t104547000\t104547300\t0.2717\t19\nchr7\t104558100\t104560800\t0.0745\t114\nchr7\t104562900\t104563200\t0.0745\t114\nchr7\t104748300\t104749500\t0.4554\t72\nchr7\t104752200\t104752800\t0.4233\t70\nchr7\t104974800\t104975100\t0.4924\t40\nchr7\t105405600\t105405900\t0.4163\t27\nchr7\t105410100\t105410400\t0.3786\t65\nchr7\t105733500\t105733800\t0.6717\t195\nchr7\t106101300\t106101600\t0.0666\t1123\nchr7\t106245000\t106246800\t0\t82\nchr7\t106323600\t106323900\t0.4529\t89\nchr7\t107418300\t107418600\t0.179\t51\nchr7\t107422800\t107423100\t0.0652\t57\nchr7\t107647500\t107647800\t0.2941\t59\nchr7\t107769900\t107770500\t0.2184\t286\nchr7\t107864100\t107864400\t0.6245\t60\nchr7\t108256200\t108256500\t0.2012\t71\nchr7\t108507900\t108510000\t0.0042\t72\nchr7\t108615900\t108616200\t0.2782\t49\nchr7\t108672000\t108672300\t0.548\t78\nchr7\t108938100\t108938700\t0.1414\t94\nchr7\t109013400\t109014000\t0.1898\t56\nchr7\t109094700\t109098300\t0\t75\nchr7\t109899600\t109899900\t0.1016\t25\nchr7\t109906200\t109908600\t0\t76\nchr7\t109915200\t109915500\t0.3385\t33\nchr7\t110058900\t110059200\t0.3819\t64\nchr7\t110402100\t110402400\t0.0686\t36\nchr7\t110476500\t110476800\t0.3609\t62\nchr7\t110558700\t110562600\t0.0014\t78\nchr7\t110707200\t110712600\t0\t84\nchr7\t110902500\t110903100\t0.4989\t47\nchr7\t111243600\t111249600\t0\t120\nchr7\t111447000\t111450000\t0.0475\t73\nchr7\t111455400\t111458100\t0\t65\nchr7\t111502800\t111503100\t0.2704\t75\nchr7\t111610800\t111611100\t0.1276\t58\nchr7\t111616200\t111616500\t0.5402\t48\nchr7\t111963300\t111969000\t0\t90\nchr7\t112551900\t112552800\t0.0947\t91\nchr7\t112920300\t112921800\t0.2518\t80\nchr7\t112975500\t112981200\t0\t69\nchr7\t113240100\t113240400\t0.6135\t27\nchr7\t113259900\t113261700\t0.4074\t72\nchr7\t113385000\t113385600\t0.256\t69\nchr7\t113429400\t113430900\t0.2242\t81\nchr7\t113493000\t113499300\t0\t72\nchr7\t113523300\t113523600\t0.3322\t74\nchr7\t113534400\t113537100\t0.2909\t69\nchr7\t113618400\t113618700\t0.4597\t40\nchr7\t113661300\t113661900\t0.2193\t75\nchr7\t113738700\t113739000\t0.3976\t52\nchr7\t113744400\t113745300\t0.1135\t120\nchr7\t113776200\t113782200\t0\t141\nchr7\t114453900\t114454800\t0.3548\t88\nchr7\t114515100\t114515400\t0.3407\t70\nchr7\t115026000\t115026600\t0.3049\t54\nchr7\t115028700\t115029900\t0.3049\t54\nchr7\t115171200\t115171500\t0.479\t53\nchr7\t115261500\t115263600\t0.0349\t81\nchr7\t115399800\t115400100\t0.5428\t57\nchr7\t115948500\t115949100\t0.5081\t68\nchr7\t116109000\t116109300\t0.4941\t59\nchr7\t116412000\t116412300\t0.3179\t64\nchr7\t116413500\t116413800\t0.3179\t64\nchr7\t116718600\t116721000\t0.1747\t97\nchr7\t116722500\t116723400\t0.1747\t97\nchr7\t117031200\t117031800\t0.2043\t101\nchr7\t117525300\t117529500\t0\t70\nchr7\t118104000\t118104300\t0.3049\t71\nchr7\t118343100\t118343700\t0.0417\t63\nchr7\t118551900\t118552500\t0.1925\t83\nchr7\t118629300\t118629600\t0.4755\t43\nchr7\t118703700\t118704000\t0.1945\t68\nchr7\t118963500\t118965300\t0.0863\t67\nchr7\t119589000\t119589600\t0.0717\t72\nchr7\t119591100\t119592000\t0.0717\t72\nchr7\t119650200\t119650500\t0.6201\t58\nchr7\t119657100\t119658000\t0.2356\t66\nchr7\t119981400\t119981700\t0.5304\t37\nchr7\t120323400\t120325500\t0.0567\t63\nchr7\t121241100\t121241400\t0.4283\t32\nchr7\t121349700\t121350000\t0.3379\t56\nchr7\t121443600\t121444200\t0.1833\t67\nchr7\t121649400\t121650000\t0.1321\t30\nchr7\t122231700\t122233500\t0.2072\t58\nchr7\t122239500\t122244300\t0.164\t88\nchr7\t122280300\t122282100\t0.0677\t83\nchr7\t122283300\t122283900\t0.0677\t83\nchr7\t122569500\t122570700\t0.2882\t68\nchr7\t122680800\t122681100\t0.3655\t43\nchr7\t123042600\t123042900\t0.1439\t35\nchr7\t123429300\t123429600\t0.2222\t71\nchr7\t123446700\t123447000\t0.4139\t79\nchr7\t123448800\t123449100\t0.3335\t38\nchr7\t123524100\t123524400\t0.2845\t63\nchr7\t123526500\t123526800\t0.2845\t63\nchr7\t123780900\t123781500\t0.0687\t79\nchr7\t123897900\t123898200\t0.4306\t68\nchr7\t123900000\t123900300\t0.4159\t70\nchr7\t123996900\t123997200\t0.2458\t32\nchr7\t124047300\t124047600\t0.4806\t64\nchr7\t124094400\t124094700\t0.229\t95\nchr7\t124096500\t124096800\t0.229\t95\nchr7\t124581000\t124581300\t0.5346\t66\nchr7\t124628700\t124629000\t0.5155\t21\nchr7\t125179800\t125180400\t0.0189\t43\nchr7\t125221200\t125222100\t0.0531\t83\nchr7\t125384700\t125385000\t0.3474\t64\nchr7\t125702100\t125702400\t0.2802\t119\nchr7\t125838900\t125839200\t0.3959\t63\nchr7\t125883900\t125884200\t0.4071\t40\nchr7\t126168300\t126168900\t0.1966\t71\nchr7\t126345300\t126345900\t0.4233\t61\nchr7\t126601500\t126603300\t0.3683\t76\nchr7\t126829200\t126829500\t0.1377\t76\nchr7\t127963500\t127966800\t0.0104\t80\nchr7\t127980000\t127980600\t0.4776\t34\nchr7\t128107800\t128108100\t0.4871\t36\nchr7\t128294100\t128295600\t0.2481\t83\nchr7\t128297400\t128297700\t0.2481\t83\nchr7\t128626500\t128626800\t0.4358\t63\nchr7\t128636700\t128637000\t0.3488\t56\nchr7\t128648400\t128649900\t0.4094\t75\nchr7\t128655300\t128655600\t0.3019\t72\nchr7\t128669100\t128669400\t0.3752\t34\nchr7\t129409800\t129410100\t0.465\t40\nchr7\t129867300\t129867600\t0.1903\t61\nchr7\t130480800\t130481400\t0.1145\t75\nchr7\t130537200\t130537500\t0.3973\t69\nchr7\t130541700\t130542000\t0.238\t71\nchr7\t130578000\t130582800\t0.0142\t93\nchr7\t130702200\t130703700\t0.0049\t78\nchr7\t132132300\t132132600\t0.6062\t75\nchr7\t132664800\t132665100\t0.4645\t48\nchr7\t133178100\t133178400\t0.3374\t62\nchr7\t133422900\t133423200\t0.2122\t25\nchr7\t133524000\t133524600\t0.1419\t60\nchr7\t133889400\t133894800\t0\t67\nchr7\t134665200\t134665500\t0.543\t83\nchr7\t135044700\t135045000\t0.6931\t21\nchr7\t135325200\t135325500\t0.5309\t29\nchr7\t136094400\t136095900\t0.3357\t72\nchr7\t136107900\t136108200\t0.4696\t59\nchr7\t136414800\t136419900\t0.0844\t89\nchr7\t136763100\t136764600\t0.2292\t70\nchr7\t136774800\t136776600\t0.3515\t73\nchr7\t136777800\t136778100\t0.2868\t60\nchr7\t136779300\t136779600\t0.2868\t60\nchr7\t136797000\t136798200\t0.1515\t69\nchr7\t136834800\t136836600\t0.3385\t99\nchr7\t136972800\t136973700\t0.2055\t58\nchr7\t137137200\t137137500\t0.1038\t79\nchr7\t137139000\t137139300\t0.1038\t79\nchr7\t137166900\t137167200\t0.2572\t35\nchr7\t137184300\t137184600\t0.3919\t83\nchr7\t137186400\t137186700\t0.3919\t83\nchr7\t137334300\t137334600\t0.0563\t64\nchr7\t137427900\t137428200\t0.2193\t61\nchr7\t137429700\t137430300\t0.1447\t49\nchr7\t138621900\t138622200\t0.3489\t181\nchr7\t139213800\t139214100\t0.5256\t65\nchr7\t139522500\t139522800\t0.4214\t47\nchr7\t139794600\t139795800\t0.1774\t119\nchr7\t139950600\t139950900\t0.5789\t69\nchr7\t140363100\t140363700\t0.3957\t62\nchr7\t140764200\t140764500\t0.3334\t69\nchr7\t141037500\t141037800\t0.2864\t69\nchr7\t141062100\t141067800\t0\t77\nchr7\t141336900\t141337200\t0.6529\t79\nchr7\t141414000\t141414300\t0.4205\t38\nchr7\t141882300\t141883500\t0.0971\t83\nchr7\t141920700\t141926700\t0\t97\nchr7\t141981000\t141981600\t0.0522\t83\nchr7\t141983100\t141984300\t0.0522\t83\nchr7\t142042500\t142045200\t0\t31\nchr7\t142132800\t142133100\t0.1495\t19\nchr7\t142267500\t142267800\t0.3865\t39\nchr7\t142893600\t142893900\t0.3286\t28\nchr7\t143522100\t143529900\t0\t82\nchr7\t143531100\t143537100\t0\t94\nchr7\t143538300\t143539200\t0\t94\nchr7\t143540700\t143561700\t0\t94\nchr7\t143562900\t143610300\t0\t94\nchr7\t143612400\t143650800\t0\t67\nchr7\t143700900\t143727900\t0\t90\nchr7\t143738700\t143739600\t0.4071\t69\nchr7\t143742600\t143788800\t0\t89\nchr7\t143790600\t143798700\t0\t89\nchr7\t143799900\t143844900\t0\t106\nchr7\t143852700\t143874600\t0\t104\nchr7\t144119700\t144120300\t0.1706\t85\nchr7\t144179400\t144197700\t0\t85\nchr7\t144199200\t144226200\t0\t103\nchr7\t144228600\t144234900\t0\t103\nchr7\t144236100\t144253800\t0\t86\nchr7\t144256500\t144264000\t0.001\t100\nchr7\t144265200\t144351600\t0\t111\nchr7\t144353400\t144377100\t0\t93\nchr7\t144460800\t144461100\t0.4272\t44\nchr7\t144488400\t144489000\t0.4745\t63\nchr7\t144664200\t144664500\t0.5807\t41\nchr7\t144685500\t144685800\t0.3511\t77\nchr7\t144692100\t144693000\t0.2816\t69\nchr7\t145192500\t145192800\t0.4227\t35\nchr7\t145238400\t145239300\t0.3114\t70\nchr7\t145305000\t145305900\t0.1345\t58\nchr7\t145341300\t145341900\t0.4796\t53\nchr7\t145343100\t145343400\t0.245\t62\nchr7\t145559700\t145561200\t0.3942\t47\nchr7\t145563300\t145563600\t0.4271\t58\nchr7\t146015400\t146017200\t0.0978\t87\nchr7\t146132700\t146134800\t0.336\t79\nchr7\t146604000\t146604900\t0.1283\t73\nchr7\t146643000\t146643300\t0.3281\t41\nchr7\t146821800\t146823300\t0.363\t72\nchr7\t146907300\t146910000\t0.0143\t86\nchr7\t146912100\t146912400\t0.2214\t46\nchr7\t146968800\t146969100\t0.4194\t74\nchr7\t147084000\t147084300\t0.137\t12\nchr7\t147322500\t147323400\t0.1978\t62\nchr7\t147842700\t147848400\t0\t76\nchr7\t148365900\t148366200\t0.6537\t21\nchr7\t148647600\t148648500\t0.0954\t54\nchr7\t149121000\t149121300\t0.4311\t34\nchr7\t149890200\t149891400\t0.3388\t57\nchr7\t149892600\t149892900\t0.6554\t12\nchr7\t149899200\t149899500\t0.3886\t56\nchr7\t149906700\t149907300\t0.0152\t59\nchr7\t149909400\t149910300\t0.2971\t37\nchr7\t149916000\t149916900\t0.3539\t51\nchr7\t149920200\t149920500\t0.5191\t49\nchr7\t149922000\t149922300\t0.6552\t56\nchr7\t149934600\t149935500\t0\t47\nchr7\t149939700\t149940000\t0.5032\t75\nchr7\t149947200\t149948400\t0.2996\t46\nchr7\t149950500\t149951400\t0.0067\t87\nchr7\t149953800\t149954100\t0.1471\t60\nchr7\t149965200\t149965500\t0.4868\t19\nchr7\t149968800\t149969100\t0.5484\t63\nchr7\t149973900\t149974200\t0.1088\t37\nchr7\t149976900\t149978100\t0.3335\t79\nchr7\t149986800\t149987100\t0.2128\t62\nchr7\t149990400\t149990700\t0.0903\t63\nchr7\t149997000\t149997300\t0.2815\t91\nchr7\t150000300\t150001800\t0.0219\t60\nchr7\t150006300\t150006600\t0.4043\t74\nchr7\t150008700\t150009000\t0.4043\t74\nchr7\t150010800\t150011100\t0.2642\t73\nchr7\t150012900\t150013200\t0.2554\t54\nchr7\t150021300\t150021600\t0.4989\t57\nchr7\t150027300\t150027600\t0.0832\t67\nchr7\t150030000\t150030300\t0.0832\t67\nchr7\t150036900\t150037200\t0.6611\t39\nchr7\t150040500\t150040800\t0.4612\t66\nchr7\t150046500\t150046800\t0.2361\t58\nchr7\t150052500\t150052800\t0.2323\t71\nchr7\t150056700\t150057000\t0.2305\t55\nchr7\t150060600\t150064500\t0\t77\nchr7\t150065700\t150066000\t0.2741\t82\nchr7\t150071400\t150075300\t0.1134\t69\nchr7\t150078300\t150078600\t0.1722\t39\nchr7\t150080100\t150080400\t0.3983\t52\nchr7\t150091200\t150091800\t0.0071\t65\nchr7\t150096000\t150096300\t0.3864\t70\nchr7\t150109800\t150110100\t0.4631\t51\nchr7\t150121500\t150121800\t0.4914\t56\nchr7\t150129000\t150129300\t0.5174\t56\nchr7\t150145500\t150146100\t0.053\t56\nchr7\t150147900\t150148200\t0.1165\t54\nchr7\t150151800\t150152100\t0.3308\t15\nchr7\t150153300\t150153900\t0.1215\t59\nchr7\t150170700\t150171300\t0.3592\t63\nchr7\t150187500\t150187800\t0.0863\t69\nchr7\t150189600\t150189900\t0.0565\t54\nchr7\t150192000\t150192300\t0.381\t73\nchr7\t150199200\t150199500\t0.1209\t60\nchr7\t150204300\t150204600\t0.4802\t60\nchr7\t150213600\t150214200\t0.4392\t63\nchr7\t150217500\t150219000\t0.2193\t83\nchr7\t150220200\t150220800\t0.2193\t83\nchr7\t150238200\t150239400\t0.143\t56\nchr7\t150247500\t150247800\t0.1333\t53\nchr7\t150258300\t150258600\t0.4725\t78\nchr7\t150261900\t150262200\t0.2161\t73\nchr7\t150268500\t150270300\t0\t77\nchr7\t150271500\t150271800\t0.5036\t65\nchr7\t150282600\t150283200\t0.4274\t58\nchr7\t150295800\t150297000\t0.0815\t64\nchr7\t150298500\t150298800\t0.1966\t55\nchr7\t150300600\t150300900\t0.4805\t81\nchr7\t150557400\t150557700\t0.2607\t47\nchr7\t150674400\t150674700\t0.1995\t48\nchr7\t150711300\t150711600\t0.2195\t74\nchr7\t150909600\t150910800\t0.3309\t153\nchr7\t151603200\t151603500\t0.4772\t45\nchr7\t151737900\t151738200\t0.2271\t74\nchr7\t151855200\t151855500\t0.6875\t47\nchr7\t152584800\t152586900\t0.0259\t65\nchr7\t152662500\t152662800\t0.405\t45\nchr7\t152772600\t152772900\t0.5911\t26\nchr7\t152775900\t152776500\t0.5275\t57\nchr7\t152785500\t152786400\t0.007\t65\nchr7\t152793300\t152793600\t0.2544\t45\nchr7\t152801700\t152802600\t0.1485\t52\nchr7\t152808900\t152809200\t0.5612\t60\nchr7\t152811000\t152811300\t0.1079\t61\nchr7\t152812500\t152814300\t0.1079\t61\nchr7\t152816700\t152817000\t0.1255\t35\nchr7\t152826600\t152828100\t0.4908\t70\nchr7\t152839500\t152841600\t0\t81\nchr7\t153112500\t153112800\t0.5836\t16\nchr7\t153312000\t153312300\t0.3189\t56\nchr7\t153706800\t153707400\t0.0676\t54\nchr7\t153711000\t153711300\t0.1541\t66\nchr7\t153721500\t153722100\t0.1611\t72\nchr7\t153730800\t153731100\t0.1849\t57\nchr7\t153748500\t153748800\t0.0507\t50\nchr7\t153750300\t153751200\t0.1234\t63\nchr7\t153755100\t153755400\t0.3495\t62\nchr7\t153775200\t153775500\t0.4156\t59\nchr7\t153777300\t153777900\t0.1181\t63\nchr7\t153779400\t153780000\t0.1181\t63\nchr7\t153795900\t153796500\t0.3051\t58\nchr7\t153817200\t153817500\t0.5787\t17\nchr7\t153819000\t153819300\t0.38\t53\nchr7\t153820800\t153821700\t0.0259\t53\nchr7\t153853800\t153855000\t0.1958\t68\nchr7\t153969300\t153969600\t0.5317\t57\nchr7\t153971700\t153972000\t0.4859\t60\nchr7\t153990000\t153990300\t0.6022\t54\nchr7\t154004400\t154004700\t0.4071\t64\nchr7\t154008900\t154009500\t0.1727\t69\nchr7\t154025100\t154027200\t0.2148\t67\nchr7\t154029000\t154029300\t0.1932\t74\nchr7\t154034700\t154035000\t0.2145\t74\nchr7\t154036200\t154040100\t0\t71\nchr7\t154043700\t154044000\t0.1627\t61\nchr7\t154047900\t154049100\t0\t60\nchr7\t154050600\t154050900\t0\t60\nchr7\t154053900\t154054200\t0.3872\t70\nchr7\t154062300\t154062600\t0.5352\t37\nchr7\t154066800\t154067400\t0.0992\t61\nchr7\t154068600\t154070100\t0.4316\t64\nchr7\t154075500\t154075800\t0.353\t51\nchr7\t154083900\t154084800\t0.4002\t61\nchr7\t154086300\t154086600\t0.2938\t56\nchr7\t154088400\t154088700\t0.277\t65\nchr7\t154095900\t154096500\t0.0464\t90\nchr7\t154099500\t154100700\t0.3685\t68\nchr7\t154106100\t154106700\t0.2845\t70\nchr7\t154109700\t154110000\t0.2063\t66\nchr7\t154118400\t154119900\t0.1165\t70\nchr7\t154128000\t154128300\t0.5218\t65\nchr7\t154139100\t154139400\t0.5464\t49\nchr7\t154142700\t154143000\t0.0104\t82\nchr7\t154145700\t154146300\t0.0104\t82\nchr7\t154148400\t154149600\t0.0104\t82\nchr7\t154161300\t154162200\t0.0136\t72\nchr7\t154456800\t154458000\t0\t65\nchr7\t154575300\t154575600\t0.5293\t63\nchr7\t154660800\t154662900\t0.0635\t54\nchr7\t154749600\t154749900\t0.552\t54\nchr7\t155034900\t155035200\t0.3952\t84\nchr7\t155124300\t155124600\t0.6731\t39\nchr7\t155140500\t155140800\t0.4083\t28\nchr7\t155159700\t155160000\t0.6375\t43\nchr7\t155328600\t155330100\t0.4403\t148\nchr7\t155335200\t155335500\t0.6779\t112\nchr7\t155341200\t155341500\t0.1159\t169\nchr7\t155348100\t155348400\t0.5636\t12\nchr7\t155350200\t155350800\t0.171\t69\nchr7\t155366400\t155367600\t0.0318\t101\nchr7\t155406900\t155407500\t0.2722\t100\nchr7\t155573700\t155574000\t0.3577\t47\nchr7\t155579400\t155579700\t0.5547\t59\nchr7\t155792100\t155792400\t0.6553\t35\nchr7\t155934000\t155934300\t0.487\t17\nchr7\t156154200\t156156000\t0\t320\nchr7\t156266700\t156267000\t0.653\t59\nchr7\t156597300\t156597600\t0.5177\t44\nchr7\t156720000\t156720300\t0.4971\t66\nchr7\t156834900\t156835200\t0.5136\t119\nchr7\t156911100\t156911400\t0.3751\t71\nchr7\t157385700\t157386000\t0.4018\t58\nchr7\t157441500\t157441800\t0.4444\t37\nchr7\t157461300\t157461600\t0.5643\t133\nchr7\t157470300\t157470600\t0.1719\t79\nchr7\t157480200\t157480500\t0.6744\t52\nchr7\t157482600\t157482900\t0.6484\t52\nchr7\t157554000\t157554300\t0.239\t37\nchr7\t157647000\t157648500\t0.1406\t45\nchr7\t157696800\t157697400\t0.5917\t72\nchr7\t157710900\t157711200\t0.0107\t29\nchr7\t157716600\t157717200\t0.4229\t79\nchr7\t157725300\t157726200\t0.4069\t102\nchr7\t157731600\t157734000\t0.1766\t43\nchr7\t157747200\t157747500\t0.6911\t145\nchr7\t157748700\t157749300\t0.448\t90\nchr7\t157761000\t157761600\t0.3301\t61\nchr7\t157834200\t157834500\t0.6064\t71\nchr7\t157838700\t157839000\t0.3828\t58\nchr7\t157858200\t157859700\t0.0439\t22\nchr7\t157861800\t157862100\t0.573\t60\nchr7\t157866900\t157867500\t0.532\t53\nchr7\t157902300\t157902600\t0.6294\t84\nchr7\t157924800\t157925400\t0.3051\t148\nchr7\t157972500\t157972800\t0.4917\t51\nchr7\t157983000\t157983300\t0.1937\t51\nchr7\t157994700\t157995000\t0.3452\t12\nchr7\t158000700\t158001000\t0.1985\t28\nchr7\t158058300\t158060400\t0.475\t95\nchr7\t158087700\t158090100\t0.2276\t150\nchr7\t158099100\t158099700\t0.1965\t13\nchr7\t158126100\t158126400\t0.6144\t28\nchr7\t158146800\t158148900\t0.0809\t481\nchr7\t158151300\t158151600\t0.6329\t369\nchr7\t158158500\t158159100\t0.4179\t113\nchr7\t158188200\t158188500\t0.5522\t35\nchr7\t158198700\t158199000\t0.361\t49\nchr7\t158236800\t158237700\t0.0645\t48\nchr7\t158266200\t158266500\t0.4194\t46\nchr7\t158314800\t158315400\t0.491\t127\nchr7\t158319900\t158320200\t0.5684\t26\nchr7\t158330100\t158330700\t0.3832\t95\nchr7\t158334600\t158335800\t0.4604\t20\nchr7\t158338500\t158340000\t0\t51\nchr7\t158342400\t158342700\t0.6674\t59\nchr7\t158348400\t158349600\t0\t67\nchr7\t158351700\t158352300\t0.3623\t82\nchr7\t158360100\t158361300\t0.0717\t272\nchr7\t158376900\t158377200\t0.5813\t37\nchr7\t158407200\t158407500\t0.5262\t44\nchr7\t158425200\t158426400\t0.3164\t63\nchr7\t158427600\t158427900\t0.5859\t17\nchr7\t158436300\t158436600\t0.5682\t58\nchr7\t158454000\t158455800\t0.1578\t97\nchr7\t158460000\t158460300\t0.4447\t85\nchr7\t158464200\t158464500\t0.3787\t53\nchr7\t158493300\t158493900\t0.4983\t61\nchr7\t158508600\t158508900\t0.3956\t57\nchr7\t158521500\t158522400\t0.3584\t115\nchr7\t158551800\t158552100\t0.3367\t63\nchr7\t158595000\t158595300\t0.5516\t1135\nchr7\t158648700\t158649000\t0.3368\t228\nchr7\t158667300\t158668200\t0.4676\t56\nchr7\t158721900\t158722200\t0.1518\t12\nchr7\t158803800\t158804400\t0.6372\t50\nchr7\t158838900\t158839200\t0.1226\t40\nchr7\t158915700\t158917200\t0.2381\t131\nchr7\t158950500\t158950800\t0.4163\t80\nchr7\t158982000\t158982300\t0.2211\t55\nchr7\t158998500\t158998800\t0.5558\t50\nchr7\t159006000\t159006300\t0.3863\t25\nchr7\t159088800\t159090900\t0.0185\t106\nchr7\t159129300\t159129900\t0.5843\t57\nchr7\t159132000\t159132300\t0.3336\t93\nchr7\t159152400\t159152700\t0.4408\t57\nchr7\t159164100\t159165000\t0\t40\nchr7\t159171300\t159172200\t0.3202\t90\nchr7\t159175500\t159175800\t0.6332\t62\nchr7\t159202800\t159203700\t0.2358\t354\nchr7\t159333900\t159334200\t0.361\t62\nchr8\t60300\t79500\t0\t100\nchr8\t80700\t201600\t0\t100\nchr8\t202800\t203100\t0.3563\t71\nchr8\t207300\t207600\t0.2803\t84\nchr8\t209400\t211200\t0.2803\t84\nchr8\t231600\t232200\t0.3788\t55\nchr8\t282300\t282600\t0.3514\t48\nchr8\t303900\t305400\t0.0337\t79\nchr8\t374400\t374700\t0.6665\t125\nchr8\t378000\t378300\t0.1707\t78\nchr8\t399300\t399600\t0.0768\t55\nchr8\t402300\t402900\t0.1096\t75\nchr8\t440700\t441000\t0.5092\t65\nchr8\t588000\t588300\t0.6047\t65\nchr8\t659100\t659700\t0.072\t70\nchr8\t669000\t669600\t0.1689\t63\nchr8\t676200\t676500\t0.314\t29\nchr8\t679800\t680400\t0.216\t105\nchr8\t696000\t696600\t0.6124\t23\nchr8\t714000\t714600\t0\t50\nchr8\t747600\t748200\t0.466\t67\nchr8\t774600\t776100\t0.0591\t97\nchr8\t795600\t795900\t0.682\t60\nchr8\t807300\t807600\t0.074\t51\nchr8\t840000\t840300\t0.1552\t48\nchr8\t848400\t848700\t0.2068\t34\nchr8\t895800\t896100\t0.1485\t40\nchr8\t929100\t929400\t0.5656\t12\nchr8\t933600\t934200\t0.0172\t30\nchr8\t939000\t939300\t0.4575\t61\nchr8\t977700\t978600\t0.3138\t91\nchr8\t990300\t993300\t0.0112\t103\nchr8\t1006500\t1006800\t0.6828\t71\nchr8\t1013700\t1015800\t0.2977\t43\nchr8\t1033800\t1036200\t0.0358\t51\nchr8\t1103400\t1103700\t0.6236\t46\nchr8\t1109100\t1110000\t0.0909\t56\nchr8\t1180800\t1181100\t0.6016\t75\nchr8\t1206300\t1206600\t0.4163\t248\nchr8\t1215300\t1215900\t0.254\t109\nchr8\t1236000\t1236900\t0.2093\t38\nchr8\t1238700\t1239900\t0.187\t28\nchr8\t1247400\t1248300\t0.4078\t42\nchr8\t1297500\t1298100\t0.5074\t88\nchr8\t1315500\t1315800\t0.5884\t56\nchr8\t1350300\t1351200\t0.2703\t85\nchr8\t1354500\t1355100\t0.4554\t78\nchr8\t1375200\t1376100\t0.5104\t49\nchr8\t1384500\t1385700\t0.2479\t107\nchr8\t1392900\t1393200\t0.0876\t23\nchr8\t1394400\t1394700\t0.0195\t16\nchr8\t1396800\t1400100\t0\t29\nchr8\t1401900\t1402200\t0.1493\t28\nchr8\t1406400\t1407600\t0.163\t43\nchr8\t1449900\t1450500\t0.4788\t105\nchr8\t1461300\t1461900\t0.4681\t31\nchr8\t1470900\t1471500\t0.0551\t60\nchr8\t1521300\t1521900\t0.2901\t55\nchr8\t1607700\t1613400\t0.0194\t126\nchr8\t1642200\t1644000\t0.2423\t49\nchr8\t1679100\t1679400\t0.5929\t64\nchr8\t1691700\t1692300\t0\t56\nchr8\t1785300\t1785600\t0.2657\t77\nchr8\t1816200\t1816500\t0.6035\t77\nchr8\t1832700\t1833300\t0.603\t108\nchr8\t1852200\t1852500\t0.3471\t45\nchr8\t1968600\t1969200\t0.1208\t43\nchr8\t1990500\t1991100\t0.1201\t29\nchr8\t2191200\t2191800\t0.0872\t12\nchr8\t2238600\t2239200\t0.1718\t70\nchr8\t2244300\t2246100\t0.1263\t84\nchr8\t2247600\t2248200\t0.2173\t94\nchr8\t2250600\t2279100\t0\t86\nchr8\t2280300\t2335500\t0\t87\nchr8\t2336700\t2338800\t0\t70\nchr8\t2340600\t2341500\t0\t75\nchr8\t2369100\t2369700\t0.4046\t64\nchr8\t2379300\t2379600\t0.4123\t35\nchr8\t2383200\t2385000\t0\t89\nchr8\t2386500\t2444100\t0\t138\nchr8\t2445300\t2471100\t0\t138\nchr8\t2472600\t2475600\t0\t138\nchr8\t2477700\t2478300\t0.5611\t59\nchr8\t2480400\t2481900\t0.0038\t62\nchr8\t3660300\t3660600\t0.5028\t75\nchr8\t5057400\t5057700\t0.5115\t58\nchr8\t5122800\t5123400\t0.4112\t89\nchr8\t6297000\t6297600\t0.0219\t60\nchr8\t6300000\t6300600\t0.081\t65\nchr8\t6845400\t6846000\t0.5751\t58\nchr8\t6972600\t6972900\t0.4545\t169\nchr8\t6974400\t7014300\t0\t170\nchr8\t7016400\t7018500\t0.0609\t124\nchr8\t7104000\t7104300\t0.5936\t47\nchr8\t7155000\t7157100\t0\t83\nchr8\t7160400\t7166400\t0.0075\t51\nchr8\t7167600\t7175400\t0.0075\t51\nchr8\t7180500\t7183800\t0\t39\nchr8\t7185000\t7185300\t0\t39\nchr8\t7187100\t7194300\t0\t49\nchr8\t7196400\t7196700\t0.605\t23\nchr8\t7197900\t7198200\t0.079\t21\nchr8\t7200300\t7200900\t0.3666\t30\nchr8\t7205400\t7205700\t0.0495\t39\nchr8\t7208700\t7227900\t0\t70\nchr8\t7229400\t7267800\t0\t129\nchr8\t7269000\t7295400\t0\t129\nchr8\t7297800\t7298100\t0.4327\t44\nchr8\t7299300\t7300200\t0\t31\nchr8\t7301700\t7311900\t0\t59\nchr8\t7314000\t7318500\t0\t52\nchr8\t7320000\t7327500\t0\t52\nchr8\t7329300\t7333200\t0\t52\nchr8\t7335000\t7335900\t0.007\t60\nchr8\t7337100\t7343400\t0\t81\nchr8\t7345800\t7346700\t0.4205\t73\nchr8\t7353600\t7353900\t0.5154\t72\nchr8\t7370700\t7374000\t0\t81\nchr8\t7377000\t7378800\t0.0258\t81\nchr8\t7380900\t7381500\t0.0704\t66\nchr8\t7383900\t7384200\t0.334\t36\nchr8\t7385700\t7386000\t0.3503\t82\nchr8\t7393500\t7393800\t0.3073\t92\nchr8\t7396500\t7396800\t0.5333\t29\nchr8\t7399200\t7415400\t0\t97\nchr8\t7416600\t7417500\t0\t97\nchr8\t7420500\t7421100\t0.3257\t62\nchr8\t7423500\t7434000\t0\t97\nchr8\t7435200\t7445100\t0\t97\nchr8\t7446300\t7471800\t0\t97\nchr8\t7473000\t7475100\t0.0178\t67\nchr8\t7476600\t7480800\t0.0178\t67\nchr8\t7482300\t7506300\t0\t109\nchr8\t7507500\t7547400\t0\t109\nchr8\t7551000\t7556700\t0\t106\nchr8\t7558800\t7564500\t0\t132\nchr8\t7567200\t7605600\t0\t600\nchr8\t7607400\t7616400\t0.001\t137\nchr8\t7667400\t7679400\t0\t109\nchr8\t7681200\t7682400\t0\t547\nchr8\t7683600\t7718700\t0\t547\nchr8\t7719900\t7769100\t0\t547\nchr8\t7772100\t7772700\t0\t81\nchr8\t7773900\t7833300\t0\t103\nchr8\t7835100\t7835700\t0\t103\nchr8\t7837800\t7859700\t0\t95\nchr8\t7860900\t7875900\t0\t91\nchr8\t7877400\t7886100\t0\t74\nchr8\t7890600\t7890900\t0.1497\t65\nchr8\t7893900\t7912500\t0\t92\nchr8\t7916400\t7916700\t0.0498\t20\nchr8\t7917900\t7918800\t0\t47\nchr8\t7923900\t7924200\t0.0503\t11\nchr8\t7925400\t7926600\t0\t55\nchr8\t7927800\t7931100\t0\t55\nchr8\t7933200\t7935000\t0\t70\nchr8\t7938000\t7941600\t0\t75\nchr8\t7943100\t7944300\t0\t42\nchr8\t7945800\t7947900\t0\t42\nchr8\t7949700\t7950000\t0.0841\t12\nchr8\t7952700\t7972200\t0\t37\nchr8\t7973700\t7975200\t0\t39\nchr8\t7977000\t7990500\t0\t92\nchr8\t7991700\t8015400\t0\t92\nchr8\t8016600\t8059500\t0\t573\nchr8\t8061900\t8080500\t0\t123\nchr8\t8081700\t8082900\t0\t32\nchr8\t8084400\t8084700\t0\t32\nchr8\t8086800\t8087100\t0\t17\nchr8\t8091000\t8091600\t0.0257\t23\nchr8\t8093100\t8100900\t0\t48\nchr8\t8102100\t8106000\t0\t26\nchr8\t8108400\t8109600\t0\t25\nchr8\t8112000\t8119500\t0\t145\nchr8\t8121000\t8123100\t0\t145\nchr8\t8124300\t8138400\t0\t145\nchr8\t8139600\t8143200\t0\t145\nchr8\t8145000\t8170500\t0\t145\nchr8\t8171700\t8180400\t0\t145\nchr8\t8182500\t8206200\t0\t145\nchr8\t8207700\t8208600\t0\t145\nchr8\t8211000\t8211600\t0\t45\nchr8\t8214300\t8214600\t0\t45\nchr8\t8230200\t8230800\t0.0352\t41\nchr8\t8233800\t8234100\t0.0596\t78\nchr8\t8471100\t8476800\t0\t81\nchr8\t9656700\t9658500\t0.145\t58\nchr8\t9736500\t9740100\t0\t65\nchr8\t10932600\t10937700\t0.007\t87\nchr8\t12038100\t12039600\t0\t36\nchr8\t12041400\t12047400\t0\t47\nchr8\t12049800\t12061800\t0\t47\nchr8\t12063000\t12072900\t0\t45\nchr8\t12075000\t12077100\t0\t20\nchr8\t12079800\t12081300\t0\t13\nchr8\t12082500\t12088800\t0\t101\nchr8\t12090300\t12104400\t0\t101\nchr8\t12106500\t12111900\t0\t37\nchr8\t12113400\t12115500\t0\t29\nchr8\t12117300\t12117600\t0\t48\nchr8\t12118800\t12119100\t0\t48\nchr8\t12121200\t12121500\t0\t23\nchr8\t12124500\t12125100\t0.3621\t59\nchr8\t12148200\t12149700\t0\t122\nchr8\t12151200\t12174300\t0\t122\nchr8\t12176100\t12178200\t0\t122\nchr8\t12179400\t12194100\t0\t122\nchr8\t12195600\t12196500\t0\t99\nchr8\t12198000\t12210600\t0\t164\nchr8\t12211800\t12230700\t0\t164\nchr8\t12285300\t12318600\t0\t52\nchr8\t12322500\t12322800\t0.6904\t24\nchr8\t12328800\t12330900\t0.0606\t43\nchr8\t12332100\t12333900\t0.0606\t43\nchr8\t12337200\t12351300\t0\t116\nchr8\t12352800\t12357900\t0\t55\nchr8\t12359700\t12373500\t0\t56\nchr8\t12381300\t12381600\t0.531\t56\nchr8\t12390600\t12392100\t0.1055\t59\nchr8\t12393600\t12422100\t0\t134\nchr8\t12423300\t12442800\t0\t134\nchr8\t12444000\t12484800\t0\t134\nchr8\t12486300\t12521400\t0\t137\nchr8\t12522600\t12532200\t0\t135\nchr8\t12533400\t12537900\t0\t135\nchr8\t12567600\t12568200\t0.1653\t121\nchr8\t12592200\t12593100\t0.4698\t135\nchr8\t12594900\t12595200\t0.1692\t156\nchr8\t12599100\t12609900\t0\t119\nchr8\t12625500\t12626100\t0.0381\t96\nchr8\t12671100\t12671400\t0.469\t26\nchr8\t12807900\t12808200\t0.2995\t50\nchr8\t13312200\t13312500\t0.4951\t18\nchr8\t13920600\t13920900\t0.1277\t21\nchr8\t14804100\t14806500\t0.0551\t86\nchr8\t15143700\t15144000\t0.4961\t27\nchr8\t15556500\t15561300\t0.0044\t103\nchr8\t15576600\t15581400\t0.0167\t97\nchr8\t16632900\t16633200\t0.4205\t67\nchr8\t16672800\t16674900\t0.1635\t76\nchr8\t16707600\t16707900\t0.5159\t90\nchr8\t16946400\t16948800\t0.083\t78\nchr8\t17104800\t17105100\t0.47\t35\nchr8\t17819400\t17819700\t0.3365\t14\nchr8\t18002100\t18002700\t0.046\t56\nchr8\t18568800\t18569400\t0.2338\t48\nchr8\t18597000\t18598500\t0\t78\nchr8\t18756900\t18757200\t0.3486\t59\nchr8\t18794100\t18794700\t0\t68\nchr8\t18910200\t18910500\t0.1298\t78\nchr8\t19386900\t19387500\t0.4648\t65\nchr8\t19461300\t19461900\t0.6611\t106\nchr8\t19974600\t19974900\t0.4984\t43\nchr8\t20680500\t20680800\t0.3369\t174\nchr8\t20682900\t20683800\t0.4288\t84\nchr8\t20685000\t20685600\t0.0991\t61\nchr8\t21243300\t21243600\t0.2835\t62\nchr8\t21828900\t21829500\t0.1359\t76\nchr8\t21830700\t21831000\t0.1359\t76\nchr8\t23312100\t23314200\t0.1549\t54\nchr8\t23645400\t23646900\t0.382\t69\nchr8\t23648100\t23648400\t0.382\t69\nchr8\t23649600\t23650200\t0.382\t69\nchr8\t23817900\t23818500\t0.2619\t61\nchr8\t24255000\t24257700\t0.0081\t78\nchr8\t24451500\t24452100\t0.554\t67\nchr8\t24560400\t24560700\t0.4639\t56\nchr8\t24708000\t24708300\t0.6844\t120\nchr8\t24783900\t24785400\t0.3576\t57\nchr8\t25122000\t25122300\t0.4628\t18\nchr8\t25216200\t25217100\t0\t40\nchr8\t25656000\t25656600\t0.1468\t63\nchr8\t25730700\t25735500\t0.0346\t65\nchr8\t26005200\t26005500\t0.0446\t17\nchr8\t26396100\t26401500\t0\t97\nchr8\t26590500\t26590800\t0.3591\t108\nchr8\t26676000\t26676300\t0.3907\t62\nchr8\t26792700\t26793000\t0.3883\t50\nchr8\t26937900\t26938500\t0.0935\t82\nchr8\t27060900\t27061500\t0.0135\t55\nchr8\t27113700\t27119400\t0\t106\nchr8\t27550500\t27551100\t0.0278\t77\nchr8\t27552600\t27553200\t0.0278\t77\nchr8\t28292400\t28292700\t0.2216\t43\nchr8\t28816500\t28818900\t0.2353\t118\nchr8\t28839900\t28840800\t0.1123\t96\nchr8\t28880400\t28882200\t0.3366\t82\nchr8\t29120400\t29121900\t0.0084\t83\nchr8\t29378400\t29378700\t0.4376\t38\nchr8\t29598900\t29599200\t0.3607\t67\nchr8\t29600700\t29601000\t0.3607\t67\nchr8\t29666400\t29666700\t0.2312\t27\nchr8\t29762700\t29764200\t0.3966\t73\nchr8\t30246000\t30247200\t0.2982\t66\nchr8\t30388200\t30388800\t0.4013\t76\nchr8\t30393900\t30408000\t0\t39\nchr8\t30985800\t30987300\t0.1627\t67\nchr8\t31234200\t31234800\t0.4648\t77\nchr8\t31853400\t31853700\t0.1847\t74\nchr8\t31947000\t31947300\t0.3344\t98\nchr8\t32816400\t32819700\t0\t68\nchr8\t33019500\t33020100\t0.4357\t69\nchr8\t33261900\t33263100\t0.0526\t76\nchr8\t33657600\t33658200\t0.2075\t73\nchr8\t34040700\t34041000\t0.6401\t45\nchr8\t34612200\t34612800\t0.3882\t79\nchr8\t35172000\t35176800\t0.0004\t103\nchr8\t35523600\t35525100\t0\t45\nchr8\t35528400\t35532900\t0\t101\nchr8\t36106200\t36106500\t0.381\t38\nchr8\t36390000\t36394200\t0.2272\t126\nchr8\t36478800\t36480900\t0.2929\t81\nchr8\t36484800\t36488700\t0.0252\t96\nchr8\t36831600\t36831900\t0.234\t60\nchr8\t37150200\t37150500\t0.312\t13\nchr8\t37193400\t37194300\t0\t74\nchr8\t37403700\t37404000\t0.574\t68\nchr8\t37462500\t37462800\t0.5819\t80\nchr8\t37927500\t37927800\t0.428\t88\nchr8\t39491100\t39492000\t0.0059\t46\nchr8\t39589800\t39590100\t0.5141\t48\nchr8\t40432500\t40438200\t0\t80\nchr8\t40648500\t40649100\t0.1323\t71\nchr8\t40650300\t40653000\t0.1323\t71\nchr8\t40721100\t40721400\t0.4615\t54\nchr8\t40805100\t40805400\t0.539\t52\nchr8\t41018700\t41019000\t0.1613\t66\nchr8\t41033700\t41034300\t0.1698\t61\nchr8\t41503200\t41503800\t0.0807\t44\nchr8\t41625900\t41626200\t0.3484\t60\nchr8\t42327900\t42328200\t0.557\t19\nchr8\t42717000\t42717300\t0.6312\t47\nchr8\t42730800\t42731100\t0.301\t21\nchr8\t43032600\t43032900\t0.3318\t100\nchr8\t43178700\t43181100\t0.1045\t86\nchr8\t43237500\t43242300\t0.2996\t592\nchr8\t43260900\t43261500\t0.0277\t73\nchr8\t43263600\t43263900\t0.5381\t43\nchr8\t43309800\t43310100\t0.3615\t74\nchr8\t43393800\t43395000\t0.4669\t74\nchr8\t43677900\t43678200\t0.4875\t50\nchr8\t43740000\t43740300\t0.5234\t44\nchr8\t43904700\t43906800\t0.0003\t132\nchr8\t43938000\t43939800\t0\t102\nchr8\t43941900\t43950300\t0\t102\nchr8\t43951500\t43953300\t0\t98\nchr8\t43955100\t43959900\t0\t98\nchr8\t43961400\t43962000\t0\t98\nchr8\t43965900\t43983900\t0\t87\nchr8\t44034000\t45877200\t0\t433\nchr8\t45930600\t45930900\t0\t23\nchr8\t45932400\t45933000\t0\t35\nchr8\t45936600\t45939900\t0\t99\nchr8\t45941100\t45946200\t0\t99\nchr8\t45948000\t45957000\t0\t99\nchr8\t45958500\t45966900\t0\t73\nchr8\t45968700\t45969300\t0.0632\t58\nchr8\t46602600\t46602900\t0.4553\t65\nchr8\t46983900\t46984800\t0.1117\t79\nchr8\t47160300\t47160600\t0.3899\t35\nchr8\t47161800\t47162400\t0.1361\t94\nchr8\t47163600\t47163900\t0.1361\t94\nchr8\t47176200\t47176500\t0.2741\t56\nchr8\t47234700\t47235300\t0.0528\t99\nchr8\t47301600\t47302200\t0.3474\t62\nchr8\t47318700\t47319000\t0.1917\t47\nchr8\t47331900\t47333100\t0.0299\t126\nchr8\t48794400\t48794700\t0.2987\t76\nchr8\t48795900\t48796800\t0.2987\t76\nchr8\t48943800\t48944400\t0.0347\t85\nchr8\t49790700\t49791000\t0.558\t59\nchr8\t50088300\t50088900\t0.2643\t80\nchr8\t50102400\t50102700\t0.385\t62\nchr8\t50166000\t50166900\t0\t51\nchr8\t50485500\t50486700\t0.2472\t70\nchr8\t51534600\t51535800\t0.0571\t86\nchr8\t51599700\t51600000\t0.2894\t19\nchr8\t51825300\t51825600\t0.3808\t36\nchr8\t52572600\t52572900\t0.4653\t65\nchr8\t52698600\t52698900\t0.5702\t53\nchr8\t53064900\t53065200\t0.5314\t54\nchr8\t53610600\t53615400\t0.0498\t55\nchr8\t53695500\t53695800\t0.6233\t82\nchr8\t53948400\t53948700\t0.4132\t28\nchr8\t54031800\t54032700\t0.0081\t83\nchr8\t54059400\t54059700\t0.5077\t30\nchr8\t54125700\t54126300\t0.2784\t55\nchr8\t54594000\t54594300\t0.2646\t63\nchr8\t55709100\t55709400\t0.5255\t67\nchr8\t56271600\t56271900\t0.3555\t44\nchr8\t56417100\t56419500\t0.1547\t89\nchr8\t56815500\t56815800\t0.3474\t67\nchr8\t56917200\t56917500\t0.5154\t79\nchr8\t57070800\t57071100\t0.2241\t71\nchr8\t57158700\t57160800\t0.1778\t61\nchr8\t57206400\t57209400\t0.0003\t596\nchr8\t57210900\t57214200\t0.0126\t609\nchr8\t57662400\t57662700\t0.5761\t51\nchr8\t58165800\t58166100\t0.5768\t38\nchr8\t58176600\t58176900\t0.3982\t66\nchr8\t58322700\t58323300\t0.3619\t66\nchr8\t58374600\t58375200\t0.3882\t91\nchr8\t58483500\t58484700\t0.0807\t65\nchr8\t58915200\t58920600\t0\t75\nchr8\t58950000\t58950300\t0.4273\t45\nchr8\t59169300\t59173200\t0.0673\t67\nchr8\t59870700\t59871900\t0.3685\t83\nchr8\t59873400\t59874900\t0.4114\t85\nchr8\t59886000\t59886300\t0.3658\t94\nchr8\t60164400\t60164700\t0.285\t61\nchr8\t60547800\t60549300\t0.4136\t80\nchr8\t60760200\t60760800\t0.3686\t60\nchr8\t60884400\t60884700\t0.5342\t54\nchr8\t61116600\t61117500\t0.308\t87\nchr8\t61120200\t61120500\t0.2611\t84\nchr8\t61268400\t61271400\t0.0827\t87\nchr8\t61752000\t61753800\t0.0095\t47\nchr8\t61997100\t61998000\t0.2796\t72\nchr8\t62017500\t62017800\t0.5461\t36\nchr8\t63227400\t63227700\t0.588\t67\nchr8\t63484500\t63486000\t0.2538\t86\nchr8\t63487500\t63487800\t0.2453\t78\nchr8\t63489000\t63489600\t0.2453\t78\nchr8\t63797700\t63802800\t0.0122\t97\nchr8\t64106100\t64106700\t0.2505\t60\nchr8\t64241400\t64241700\t0.2617\t66\nchr8\t64245000\t64245900\t0.5629\t63\nchr8\t64646100\t64646400\t0.386\t76\nchr8\t64685100\t64687200\t0.1411\t58\nchr8\t65121600\t65122200\t0.1778\t73\nchr8\t65124600\t65125800\t0.3255\t89\nchr8\t65391600\t65391900\t0.563\t51\nchr8\t65680800\t65681100\t0.591\t67\nchr8\t65814300\t65814600\t0.4821\t43\nchr8\t66024600\t66026400\t0\t87\nchr8\t66321000\t66321300\t0.6554\t82\nchr8\t66577200\t66577500\t0.3095\t55\nchr8\t66703500\t66703800\t0.5995\t57\nchr8\t66949800\t66953700\t0.1332\t91\nchr8\t67273200\t67273500\t0.6033\t48\nchr8\t67384800\t67385100\t0.4863\t56\nchr8\t67461000\t67461600\t0.4414\t50\nchr8\t67592400\t67593900\t0.1692\t71\nchr8\t67652400\t67652700\t0.3957\t81\nchr8\t68278200\t68278500\t0.399\t52\nchr8\t68362800\t68367900\t0.0082\t124\nchr8\t68418000\t68418300\t0.52\t59\nchr8\t68614800\t68615400\t0.3437\t101\nchr8\t68746500\t68746800\t0.2388\t82\nchr8\t68748900\t68749200\t0.2388\t82\nchr8\t68906100\t68907000\t0.3354\t39\nchr8\t69019800\t69020100\t0.2728\t86\nchr8\t69021300\t69021600\t0.2728\t86\nchr8\t69022800\t69023100\t0.2418\t94\nchr8\t69024300\t69024600\t0.2418\t94\nchr8\t69245400\t69246000\t0.4176\t50\nchr8\t69255600\t69260100\t0.1533\t94\nchr8\t69445500\t69445800\t0.524\t38\nchr8\t69689100\t69689700\t0.0514\t146\nchr8\t69841200\t69841500\t0.6576\t48\nchr8\t69879300\t69879600\t0.4265\t64\nchr8\t70435200\t70435500\t0.4164\t25\nchr8\t70671300\t70672500\t0.0517\t56\nchr8\t70684800\t70685100\t0.4002\t57\nchr8\t70696500\t70697700\t0.3745\t95\nchr8\t70736700\t70738200\t0.1974\t90\nchr8\t71406900\t71412300\t0.0079\t107\nchr8\t71639100\t71639400\t0.5254\t40\nchr8\t71785800\t71786100\t0.3523\t53\nchr8\t72148200\t72153000\t0.045\t66\nchr8\t72480000\t72480300\t0.0639\t86\nchr8\t72482100\t72485400\t0.0639\t86\nchr8\t72875700\t72881700\t0\t93\nchr8\t73255500\t73255800\t0.4985\t71\nchr8\t73301100\t73301400\t0.5209\t67\nchr8\t73720500\t73720800\t0.2726\t28\nchr8\t73862400\t73863300\t0.3105\t77\nchr8\t74399700\t74400000\t0.3421\t63\nchr8\t74430900\t74431200\t0.4266\t29\nchr8\t74595300\t74599200\t0.1755\t81\nchr8\t74680800\t74681100\t0.4623\t71\nchr8\t74733300\t74733900\t0.2672\t75\nchr8\t74868900\t74870700\t0.4512\t92\nchr8\t74871900\t74872500\t0.3532\t55\nchr8\t74943900\t74948100\t0.102\t80\nchr8\t74964600\t74964900\t0.3958\t36\nchr8\t75105000\t75105300\t0.4765\t55\nchr8\t75134100\t75134400\t0.5806\t54\nchr8\t75279000\t75279300\t0.0279\t91\nchr8\t75280500\t75283200\t0.0279\t91\nchr8\t75293400\t75293700\t0.5698\t46\nchr8\t75324900\t75328800\t0.2249\t109\nchr8\t75444300\t75448200\t0\t74\nchr8\t75621300\t75627000\t0\t70\nchr8\t76311300\t76313400\t0.359\t70\nchr8\t76425300\t76426200\t0\t58\nchr8\t76644900\t76645500\t0.3808\t33\nchr8\t77090700\t77092500\t0.478\t71\nchr8\t77303100\t77303700\t0.4416\t59\nchr8\t77473200\t77473500\t0.2324\t44\nchr8\t77645400\t77645700\t0.3286\t41\nchr8\t77944800\t77945100\t0.4738\t73\nchr8\t78356100\t78356700\t0.4556\t82\nchr8\t78768300\t78768600\t0.4109\t64\nchr8\t79170600\t79174500\t0\t71\nchr8\t79273500\t79273800\t0.5468\t77\nchr8\t80072400\t80072700\t0.4059\t49\nchr8\t80135700\t80136000\t0.2276\t64\nchr8\t80358600\t80359200\t0.0125\t87\nchr8\t80666700\t80667000\t0.3716\t66\nchr8\t81134100\t81134400\t0.2326\t45\nchr8\t81327600\t81330600\t0.245\t74\nchr8\t81428700\t81430200\t0.2223\t73\nchr8\t81768600\t81770100\t0.1745\t75\nchr8\t81771600\t81772500\t0.1092\t88\nchr8\t81773700\t81774000\t0.1092\t88\nchr8\t82117500\t82117800\t0.5527\t93\nchr8\t82284300\t82285500\t0.2576\t51\nchr8\t82508100\t82509300\t0.4226\t76\nchr8\t82658100\t82658400\t0.6646\t40\nchr8\t82838400\t82838700\t0.6092\t52\nchr8\t83341200\t83341800\t0.2907\t40\nchr8\t83439300\t83441100\t0.0894\t79\nchr8\t83448300\t83448900\t0.0802\t70\nchr8\t83450400\t83453100\t0.0802\t70\nchr8\t83845200\t83845500\t0.5919\t23\nchr8\t83883600\t83884200\t0\t27\nchr8\t83891400\t83891700\t0.3934\t58\nchr8\t84015300\t84015600\t0.4674\t81\nchr8\t84017700\t84018000\t0.4002\t56\nchr8\t84050400\t84050700\t0.2959\t54\nchr8\t84310800\t84311100\t0.6589\t21\nchr8\t84389700\t84390000\t0.4063\t79\nchr8\t84420600\t84423000\t0.1842\t86\nchr8\t84464400\t84466500\t0.0535\t82\nchr8\t84568500\t84568800\t0.4477\t38\nchr8\t84615600\t84620400\t0.0074\t185\nchr8\t84856800\t84857100\t0.3882\t41\nchr8\t84972300\t84973200\t0.3655\t78\nchr8\t85043400\t85043700\t0.1693\t28\nchr8\t85642800\t85644000\t0\t1042\nchr8\t85645200\t85664400\t0\t1042\nchr8\t85714200\t85828800\t0\t2037\nchr8\t86306700\t86307000\t0.6788\t30\nchr8\t86586600\t86588700\t0.1868\t85\nchr8\t86804100\t86804400\t0.1781\t70\nchr8\t86806800\t86807100\t0.4547\t75\nchr8\t86819100\t86819400\t0.6726\t11\nchr8\t87224100\t87225300\t0.1791\t75\nchr8\t87227400\t87227700\t0.1791\t75\nchr8\t87322500\t87327300\t0.1693\t73\nchr8\t87377700\t87378300\t0.4317\t59\nchr8\t87413700\t87414000\t0.4552\t64\nchr8\t87421500\t87422100\t0.5216\t77\nchr8\t87425700\t87426000\t0.4744\t76\nchr8\t87484200\t87487200\t0.2286\t91\nchr8\t87625500\t87627000\t0.0653\t87\nchr8\t87629100\t87630000\t0.0653\t87\nchr8\t87737400\t87737700\t0.5537\t26\nchr8\t88149900\t88154700\t0.0302\t89\nchr8\t88251600\t88252200\t0.1668\t71\nchr8\t88345800\t88346100\t0.1275\t64\nchr8\t88380000\t88380300\t0.1809\t12\nchr8\t88533300\t88533600\t0.4652\t56\nchr8\t88646400\t88646700\t0.495\t64\nchr8\t88686300\t88691700\t0\t72\nchr8\t88855800\t88856100\t0.5874\t87\nchr8\t89030400\t89030700\t0.6933\t34\nchr8\t89088900\t89089200\t0.3009\t68\nchr8\t89191500\t89191800\t0.473\t77\nchr8\t89391000\t89391300\t0.4737\t71\nchr8\t89444100\t89444700\t0.2756\t70\nchr8\t89512500\t89512800\t0.4642\t76\nchr8\t89537700\t89540100\t0.4681\t61\nchr8\t89552400\t89557200\t0.0307\t68\nchr8\t89699700\t89700000\t0.3789\t70\nchr8\t90057000\t90057300\t0.3577\t33\nchr8\t90684300\t90685800\t0.0348\t101\nchr8\t91170600\t91170900\t0.2035\t67\nchr8\t91193100\t91194300\t0.0993\t69\nchr8\t91306800\t91307700\t0.1406\t79\nchr8\t91520100\t91527900\t0\t76\nchr8\t91558800\t91564500\t0\t90\nchr8\t91796400\t91796700\t0.3771\t77\nchr8\t91798800\t91799100\t0.2092\t94\nchr8\t91895400\t91896000\t0.1773\t84\nchr8\t92364600\t92364900\t0.3462\t87\nchr8\t92367000\t92367600\t0.3462\t87\nchr8\t92368800\t92369100\t0.3741\t75\nchr8\t92382900\t92384100\t0.2742\t59\nchr8\t92484300\t92484600\t0.594\t49\nchr8\t92578200\t92578800\t0.5016\t71\nchr8\t93406200\t93412500\t0\t140\nchr8\t93468000\t93468600\t0.2935\t87\nchr8\t93485100\t93485400\t0.1799\t48\nchr8\t93668700\t93669000\t0.3632\t63\nchr8\t94415400\t94416300\t0.1936\t80\nchr8\t94590000\t94592400\t0\t76\nchr8\t94804200\t94804500\t0.5239\t44\nchr8\t95188500\t95188800\t0.3715\t44\nchr8\t95207400\t95207700\t0.3716\t81\nchr8\t95368500\t95372100\t0.0939\t81\nchr8\t95373900\t95375100\t0.0939\t81\nchr8\t95410200\t95410500\t0.4602\t60\nchr8\t95552100\t95557800\t0.0304\t83\nchr8\t95621100\t95621400\t0.4976\t76\nchr8\t95747400\t95747700\t0.421\t61\nchr8\t95796900\t95797200\t0.6418\t75\nchr8\t95992500\t95992800\t0.5072\t71\nchr8\t96085800\t96086100\t0.3706\t34\nchr8\t96118500\t96119400\t0.1411\t96\nchr8\t96121200\t96122400\t0.1411\t96\nchr8\t96556500\t96557400\t0.2088\t87\nchr8\t96576300\t96576600\t0.4683\t16\nchr8\t96695100\t96695400\t0.1892\t52\nchr8\t96738900\t96740700\t0.2035\t81\nchr8\t96741900\t96742200\t0.2035\t81\nchr8\t97039800\t97040100\t0.5789\t75\nchr8\t97188000\t97188300\t0.4513\t28\nchr8\t97296000\t97301400\t0.0152\t120\nchr8\t97583100\t97583400\t0.4403\t26\nchr8\t97590900\t97591500\t0.265\t73\nchr8\t97592700\t97593600\t0.265\t73\nchr8\t97771200\t97771500\t0.2794\t75\nchr8\t98261100\t98266200\t0.2329\t75\nchr8\t98288400\t98288700\t0.3979\t80\nchr8\t98584500\t98586600\t0.2381\t75\nchr8\t98588400\t98589300\t0.4084\t121\nchr8\t98615100\t98620500\t0.0462\t88\nchr8\t98652300\t98652900\t0.2071\t80\nchr8\t98739600\t98739900\t0.5785\t65\nchr8\t99052200\t99052500\t0.0775\t60\nchr8\t99083400\t99084000\t0.2628\t68\nchr8\t99220800\t99221400\t0.1743\t44\nchr8\t99293100\t99294000\t0.1339\t80\nchr8\t99426000\t99427500\t0.0329\t68\nchr8\t99543600\t99543900\t0.5977\t61\nchr8\t99691500\t99695400\t0\t79\nchr8\t99849900\t99850200\t0.2795\t54\nchr8\t100426500\t100426800\t0.6407\t211\nchr8\t100790700\t100791000\t0.6049\t72\nchr8\t100856700\t100857000\t0.5257\t61\nchr8\t100891500\t100891800\t0.214\t37\nchr8\t101652300\t101652600\t0.4956\t81\nchr8\t101676000\t101676300\t0.3726\t62\nchr8\t101678700\t101681100\t0.1486\t86\nchr8\t101682600\t101684100\t0.3164\t87\nchr8\t101893500\t101894400\t0.1275\t75\nchr8\t101896800\t101897400\t0.1993\t45\nchr8\t102003900\t102004200\t0.2991\t70\nchr8\t102135000\t102136800\t0.2491\t71\nchr8\t102138000\t102138900\t0.2491\t71\nchr8\t103091700\t103092000\t0.6135\t29\nchr8\t103292700\t103293300\t0.3674\t65\nchr8\t103603500\t103608000\t0.0797\t77\nchr8\t103783800\t103785300\t0.1139\t70\nchr8\t103786800\t103788600\t0.383\t80\nchr8\t104058000\t104059800\t0.4039\t74\nchr8\t104285400\t104285700\t0.3767\t62\nchr8\t104292300\t104292600\t0.3578\t59\nchr8\t104526300\t104526900\t0.2353\t70\nchr8\t104627400\t104628300\t0.254\t62\nchr8\t104739900\t104745600\t0\t75\nchr8\t105169200\t105169500\t0.0012\t24\nchr8\t105308400\t105308700\t0.3806\t80\nchr8\t105360600\t105361200\t0.2246\t52\nchr8\t105366900\t105368100\t0.0031\t62\nchr8\t105879300\t105879600\t0.5731\t15\nchr8\t106488000\t106489200\t0.3407\t85\nchr8\t106716300\t106716600\t0.5234\t19\nchr8\t106894500\t106894800\t0.3763\t75\nchr8\t107241300\t107241900\t0.2823\t86\nchr8\t107243100\t107244000\t0.2823\t86\nchr8\t107245800\t107246400\t0.2823\t86\nchr8\t107556600\t107556900\t0.343\t52\nchr8\t107713800\t107714100\t0.4951\t60\nchr8\t107891100\t107891700\t0.1317\t40\nchr8\t107893200\t107893800\t0.2401\t90\nchr8\t108932100\t108932400\t0.4885\t69\nchr8\t108947100\t108947400\t0.3486\t47\nchr8\t109498200\t109498500\t0.6442\t32\nchr8\t109591500\t109591800\t0.4274\t58\nchr8\t110153400\t110153700\t0.3065\t78\nchr8\t110301300\t110301600\t0.4929\t36\nchr8\t110429100\t110429400\t0.4478\t62\nchr8\t110728200\t110728500\t0.5202\t67\nchr8\t110888100\t110888400\t0.0564\t29\nchr8\t110952600\t110957100\t0.0172\t74\nchr8\t111156000\t111156300\t0.0965\t23\nchr8\t111424800\t111425100\t0.4557\t52\nchr8\t111634800\t111636000\t0.1845\t78\nchr8\t112213500\t112213800\t0.3862\t58\nchr8\t112595400\t112596000\t0.0549\t70\nchr8\t112597500\t112599600\t0.0549\t70\nchr8\t112911600\t112911900\t0.1442\t210\nchr8\t112928400\t112929300\t0.4931\t76\nchr8\t113019900\t113020200\t0.4586\t46\nchr8\t113269800\t113270100\t0.3895\t66\nchr8\t113302800\t113304900\t0.078\t79\nchr8\t113451600\t113452500\t0.0702\t56\nchr8\t113511300\t113512500\t0.2314\t50\nchr8\t113522700\t113523000\t0.3129\t42\nchr8\t113568300\t113569500\t0.2777\t57\nchr8\t113609700\t113612100\t0.3303\t61\nchr8\t113674500\t113674800\t0.1035\t81\nchr8\t113780100\t113780400\t0.2638\t56\nchr8\t113906700\t113907600\t0.0692\t68\nchr8\t113908800\t113911200\t0.0692\t68\nchr8\t114000900\t114003600\t0.1511\t80\nchr8\t114005100\t114005400\t0.1511\t80\nchr8\t114043800\t114046200\t0.2358\t72\nchr8\t114164700\t114165000\t0.3204\t52\nchr8\t114177300\t114178200\t0.2311\t69\nchr8\t114284700\t114285000\t0.6464\t98\nchr8\t114286200\t114286500\t0.2974\t68\nchr8\t114506100\t114509700\t0.0847\t83\nchr8\t114581700\t114582600\t0.168\t72\nchr8\t114583800\t114584400\t0.168\t72\nchr8\t114632100\t114633600\t0.0736\t61\nchr8\t114634800\t114635100\t0.2448\t67\nchr8\t114654000\t114654300\t0.5177\t42\nchr8\t115216500\t115216800\t0.1978\t69\nchr8\t115476000\t115476300\t0.3492\t18\nchr8\t116191500\t116191800\t0.3388\t35\nchr8\t116678100\t116680800\t0.0955\t88\nchr8\t117211200\t117211500\t0.5979\t24\nchr8\t117639300\t117639600\t0.4704\t57\nchr8\t117700500\t117700800\t0.2934\t29\nchr8\t118215900\t118216200\t0.3555\t81\nchr8\t118719300\t118719600\t0.3725\t53\nchr8\t118875600\t118875900\t0.0781\t53\nchr8\t118977300\t118977600\t0.4172\t78\nchr8\t119159700\t119162700\t0.0036\t81\nchr8\t119163900\t119164200\t0.0036\t81\nchr8\t119235900\t119236500\t0.0197\t68\nchr8\t119475300\t119476500\t0.2519\t70\nchr8\t119498700\t119499300\t0.3546\t37\nchr8\t120190800\t120191400\t0.4637\t71\nchr8\t120351000\t120354300\t0.0046\t71\nchr8\t120522000\t120522300\t0.1721\t35\nchr8\t120636300\t120636600\t0.2827\t83\nchr8\t120645600\t120649800\t0.0217\t85\nchr8\t120886200\t120886800\t0.3927\t64\nchr8\t121423500\t121423800\t0.5282\t21\nchr8\t121508400\t121509900\t0.3907\t82\nchr8\t121518900\t121519200\t0.4104\t76\nchr8\t121656600\t121656900\t0.1848\t71\nchr8\t121782000\t121782300\t0.2049\t57\nchr8\t122245200\t122250300\t0.0467\t82\nchr8\t122327100\t122331900\t0.2322\t84\nchr8\t122445300\t122445600\t0.2152\t65\nchr8\t122479800\t122480700\t0.3724\t70\nchr8\t122704500\t122704800\t0.5528\t40\nchr8\t123315000\t123316500\t0.2322\t81\nchr8\t123855900\t123856200\t0.5075\t23\nchr8\t123860100\t123863700\t0.034\t84\nchr8\t123865200\t123865500\t0.034\t84\nchr8\t124171800\t124172100\t0.4381\t74\nchr8\t124908300\t124908600\t0.4742\t60\nchr8\t125215200\t125215500\t0.4866\t59\nchr8\t125333400\t125333700\t0.5287\t44\nchr8\t125583000\t125589000\t0\t85\nchr8\t125741100\t125741400\t0.5332\t106\nchr8\t126203100\t126203400\t0.4902\t70\nchr8\t126236700\t126237000\t0.1965\t21\nchr8\t126313500\t126318300\t0.0197\t69\nchr8\t126344100\t126344400\t0.3677\t62\nchr8\t126346800\t126347400\t0.4079\t98\nchr8\t126801300\t126804000\t0.0722\t89\nchr8\t126888600\t126888900\t0.422\t76\nchr8\t126980700\t126985500\t0.0071\t63\nchr8\t127192800\t127193400\t0.2683\t54\nchr8\t127203300\t127204200\t0.1562\t51\nchr8\t127312200\t127312500\t0.3236\t96\nchr8\t127313700\t127314000\t0.3236\t96\nchr8\t127315800\t127316100\t0.3511\t25\nchr8\t127317300\t127320600\t0.0484\t74\nchr8\t127380000\t127381800\t0.0013\t57\nchr8\t127434300\t127434600\t0.4437\t72\nchr8\t127630200\t127630800\t0.2566\t75\nchr8\t128118000\t128118900\t0.327\t59\nchr8\t128328900\t128329200\t0.3659\t48\nchr8\t128347500\t128347800\t0.527\t70\nchr8\t128452800\t128459100\t0\t92\nchr8\t128613300\t128613600\t0.4729\t46\nchr8\t128709600\t128709900\t0.2136\t75\nchr8\t128711400\t128711700\t0.2136\t75\nchr8\t128715600\t128719200\t0.0498\t57\nchr8\t128748000\t128748900\t0.3943\t70\nchr8\t128750100\t128750400\t0.3943\t70\nchr8\t128825100\t128827200\t0.1021\t71\nchr8\t128892000\t128897100\t0.0915\t59\nchr8\t129152100\t129157500\t0.0904\t72\nchr8\t129327600\t129329400\t0.0595\t94\nchr8\t129496200\t129497700\t0.0289\t40\nchr8\t129606000\t129606300\t0.4362\t40\nchr8\t130049400\t130050000\t0.4889\t42\nchr8\t131064300\t131064600\t0.4064\t89\nchr8\t131066400\t131066700\t0.4064\t89\nchr8\t131156100\t131156400\t0.4844\t20\nchr8\t131550600\t131550900\t0.3706\t56\nchr8\t131637900\t131639400\t0.312\t87\nchr8\t131772300\t131776800\t0.0213\t98\nchr8\t131871600\t131872500\t0.1703\t83\nchr8\t132617700\t132618900\t0.0511\t77\nchr8\t133313100\t133314900\t0\t60\nchr8\t133317300\t133317600\t0.4347\t34\nchr8\t133411200\t133411500\t0.3764\t47\nchr8\t133728900\t133729500\t0.3202\t65\nchr8\t134070900\t134076900\t0\t98\nchr8\t134189700\t134190600\t0.2371\t91\nchr8\t134243100\t134243700\t0.4296\t87\nchr8\t134416200\t134417400\t0.2952\t57\nchr8\t134497800\t134499300\t0.335\t60\nchr8\t134930400\t134930700\t0.6234\t57\nchr8\t135259800\t135261000\t0.1285\t70\nchr8\t135262200\t135264300\t0.0609\t83\nchr8\t135340200\t135340800\t0.2326\t59\nchr8\t135876300\t135881700\t0\t69\nchr8\t135884100\t135885000\t0.1787\t71\nchr8\t135954600\t135955500\t0.0074\t86\nchr8\t135959700\t135960000\t0.4522\t44\nchr8\t136190700\t136194600\t0.1389\t84\nchr8\t136437300\t136443900\t0\t134\nchr8\t136575300\t136575600\t0.585\t44\nchr8\t136704600\t136704900\t0.2952\t30\nchr8\t136748100\t136749600\t0.4462\t74\nchr8\t136890900\t136891200\t0.4128\t65\nchr8\t136917900\t136918200\t0.3491\t62\nchr8\t136955700\t136956000\t0.6171\t15\nchr8\t136991700\t136992300\t0.4207\t19\nchr8\t137236200\t137236800\t0.0495\t27\nchr8\t137295600\t137295900\t0.6273\t21\nchr8\t137558700\t137559300\t0.2577\t89\nchr8\t137560500\t137560800\t0.2281\t65\nchr8\t138037200\t138037500\t0.3008\t59\nchr8\t138042900\t138043200\t0.4185\t68\nchr8\t138045600\t138045900\t0.5407\t66\nchr8\t138121800\t138122100\t0.459\t45\nchr8\t138952500\t138952800\t0.0535\t71\nchr8\t139460100\t139463400\t0.1756\t112\nchr8\t139872600\t139872900\t0.4809\t52\nchr8\t140157000\t140157300\t0.4425\t132\nchr8\t140196000\t140196600\t0.1362\t102\nchr8\t140292600\t140293200\t0.3371\t59\nchr8\t140338800\t140339100\t0.6322\t55\nchr8\t140497800\t140499600\t0.3421\t67\nchr8\t140622300\t140623200\t0.1398\t43\nchr8\t140928900\t140929200\t0.3703\t41\nchr8\t141262200\t141262500\t0.1921\t65\nchr8\t141335100\t141335700\t0.021\t83\nchr8\t141429600\t141429900\t0.4208\t52\nchr8\t141445500\t141445800\t0.5823\t47\nchr8\t141492300\t141493200\t0\t325\nchr8\t141540900\t141541200\t0.5352\t81\nchr8\t141550500\t141551400\t0.2214\t40\nchr8\t141632100\t141634500\t0\t62\nchr8\t141713700\t141714000\t0.4446\t156\nchr8\t141873900\t141874200\t0.6396\t162\nchr8\t141970800\t141971100\t0.0677\t53\nchr8\t142242000\t142242300\t0.5657\t192\nchr8\t142255500\t142256400\t0.4424\t157\nchr8\t142287300\t142287600\t0.6823\t50\nchr8\t142390500\t142391100\t0.2071\t98\nchr8\t142685100\t142685400\t0.4618\t56\nchr8\t142760700\t142761300\t0.2302\t75\nchr8\t142881000\t142882200\t0.2491\t117\nchr8\t142898100\t142898700\t0.3789\t61\nchr8\t143041800\t143042100\t0.3938\t46\nchr8\t143085000\t143085300\t0.4484\t59\nchr8\t143167200\t143168100\t0.4575\t22\nchr8\t143205000\t143205900\t0.3583\t74\nchr8\t143256000\t143256300\t0.6195\t37\nchr8\t143340000\t143340300\t0.6531\t22\nchr8\t143458500\t143458800\t0.2622\t57\nchr8\t143487000\t143488500\t0.4929\t52\nchr8\t143492700\t143493000\t0.4634\t50\nchr8\t143641500\t143641800\t0.3764\t76\nchr8\t143661600\t143662500\t0.2343\t88\nchr8\t143692500\t143692800\t0.3108\t38\nchr8\t143695800\t143696100\t0.4388\t54\nchr8\t143858100\t143866500\t0\t150\nchr8\t143981400\t143982000\t0.2027\t142\nchr8\t144021600\t144021900\t0.5707\t33\nchr8\t144125400\t144126000\t0.4887\t792\nchr8\t144231000\t144231300\t0.2118\t75\nchr8\t144281100\t144281400\t0.4415\t54\nchr8\t144380400\t144382200\t0.4128\t102\nchr8\t144531300\t144531900\t0.0396\t171\nchr8\t144556500\t144556800\t0.5958\t118\nchr8\t144612000\t144612900\t0.0068\t63\nchr8\t144624600\t144626400\t0.1235\t60\nchr8\t144634200\t144634800\t0.0431\t32\nchr8\t144687000\t144687600\t0.3703\t67\nchr8\t144811500\t144811800\t0.6969\t50\nchr8\t144838800\t144839100\t0.5389\t83\nchr8\t144921600\t144921900\t0.6232\t106\nchr9\t9900\t39900\t0\t182\nchr9\t49200\t53400\t0.0617\t132\nchr9\t55800\t56700\t0.0771\t133\nchr9\t64200\t72600\t0\t160\nchr9\t74700\t75000\t0.6027\t60\nchr9\t76200\t78000\t0.0222\t125\nchr9\t84300\t84600\t0.3841\t96\nchr9\t87000\t87300\t0.2607\t81\nchr9\t88800\t89100\t0.1925\t101\nchr9\t90300\t90600\t0.1925\t101\nchr9\t92100\t92400\t0.1925\t101\nchr9\t96300\t96900\t0.1799\t86\nchr9\t100200\t100500\t0.3055\t106\nchr9\t102000\t102300\t0.3055\t106\nchr9\t107400\t107700\t0.3139\t89\nchr9\t118800\t126600\t0.0606\t106\nchr9\t128100\t128400\t0.002\t133\nchr9\t130200\t138600\t0.002\t133\nchr9\t140700\t153600\t0.1041\t73\nchr9\t155100\t155400\t0.1041\t73\nchr9\t156900\t157200\t0.2045\t68\nchr9\t159000\t159300\t0.2045\t68\nchr9\t164100\t166500\t0.0895\t65\nchr9\t167700\t171000\t0.0808\t95\nchr9\t172500\t173400\t0.2202\t58\nchr9\t176100\t176400\t0.1479\t53\nchr9\t180600\t180900\t0.5914\t75\nchr9\t183600\t185400\t0.0012\t77\nchr9\t187800\t188100\t0.384\t38\nchr9\t189600\t190200\t0.1762\t74\nchr9\t192600\t192900\t0.5018\t14\nchr9\t194100\t195300\t0.2737\t29\nchr9\t200100\t200400\t0.4821\t62\nchr9\t320100\t322200\t0\t60\nchr9\t380100\t381000\t0\t57\nchr9\t399900\t401100\t0.3634\t111\nchr9\t608100\t608400\t0.4635\t45\nchr9\t707400\t708300\t0.0013\t84\nchr9\t808800\t809100\t0.3369\t121\nchr9\t998700\t999000\t0.2021\t49\nchr9\t1224900\t1229700\t0.0053\t80\nchr9\t1338000\t1338900\t0\t78\nchr9\t1570500\t1570800\t0.3575\t57\nchr9\t1572000\t1572300\t0.3342\t82\nchr9\t1809300\t1809600\t0.5115\t50\nchr9\t3147300\t3147600\t0.3637\t49\nchr9\t3504300\t3504900\t0.2378\t30\nchr9\t3780600\t3780900\t0.1316\t40\nchr9\t4188300\t4188600\t0.5371\t47\nchr9\t4346700\t4347000\t0.26\t24\nchr9\t4608000\t4608600\t0.0984\t90\nchr9\t4610100\t4611300\t0.3189\t66\nchr9\t4713900\t4714200\t0.6313\t273\nchr9\t5239800\t5243100\t0\t76\nchr9\t5302800\t5304300\t0\t56\nchr9\t5337900\t5339700\t0\t71\nchr9\t5680800\t5681100\t0.461\t44\nchr9\t5684100\t5684400\t0.4075\t97\nchr9\t5685900\t5686200\t0.5725\t64\nchr9\t5962200\t5964900\t0.009\t68\nchr9\t6137700\t6141600\t0.1928\t95\nchr9\t6179100\t6179700\t0.1712\t98\nchr9\t6182400\t6182700\t0.1712\t98\nchr9\t6387900\t6388200\t0.3341\t35\nchr9\t6623100\t6623400\t0.343\t69\nchr9\t6659700\t6660000\t0.6265\t35\nchr9\t6808200\t6808500\t0.2193\t59\nchr9\t6999300\t6999600\t0.2873\t31\nchr9\t7667400\t7668300\t0.0211\t74\nchr9\t7867500\t7867800\t0.4123\t59\nchr9\t8002500\t8002800\t0.3868\t77\nchr9\t8017800\t8018100\t0.1389\t53\nchr9\t8334600\t8334900\t0.1419\t33\nchr9\t9413100\t9413400\t0.2793\t42\nchr9\t9472200\t9472500\t0.6228\t38\nchr9\t9642000\t9642300\t0.2654\t55\nchr9\t9931800\t9933000\t0.1648\t73\nchr9\t9936600\t9936900\t0.2811\t62\nchr9\t9950400\t9950700\t0.3582\t47\nchr9\t10018500\t10018800\t0.6241\t44\nchr9\t10020300\t10022400\t0\t40\nchr9\t10136700\t10137600\t0\t90\nchr9\t10142100\t10143000\t0.311\t67\nchr9\t10498800\t10499100\t0.2606\t33\nchr9\t10763100\t10763400\t0.6731\t41\nchr9\t10850700\t10851000\t0.4401\t63\nchr9\t12335100\t12339000\t0.0957\t78\nchr9\t12354600\t12354900\t0.5568\t46\nchr9\t12476700\t12478200\t0.0531\t69\nchr9\t12556800\t12559500\t0\t67\nchr9\t12884100\t12884400\t0.3815\t78\nchr9\t13038300\t13040400\t0.0681\t72\nchr9\t13043100\t13043400\t0.0681\t72\nchr9\t14664900\t14669400\t0.0155\t83\nchr9\t14874300\t14874600\t0.3216\t47\nchr9\t15326400\t15327000\t0.2868\t63\nchr9\t15394800\t15395100\t0.5786\t26\nchr9\t15406200\t15407700\t0.0065\t43\nchr9\t15945300\t15945600\t0.535\t67\nchr9\t15948300\t15948600\t0.4108\t49\nchr9\t16066500\t16068300\t0.2828\t67\nchr9\t16465800\t16467600\t0\t69\nchr9\t16905600\t16905900\t0.4917\t35\nchr9\t17258100\t17258400\t0.4276\t68\nchr9\t17264100\t17264700\t0.49\t49\nchr9\t17285400\t17287800\t0.1519\t83\nchr9\t17289300\t17289600\t0.4153\t79\nchr9\t17338200\t17338500\t0.6547\t40\nchr9\t17541900\t17542200\t0.3432\t65\nchr9\t17543700\t17544600\t0.3432\t65\nchr9\t17576400\t17576700\t0.1145\t40\nchr9\t17685900\t17686800\t0.0629\t59\nchr9\t17764800\t17765400\t0.1421\t73\nchr9\t17780700\t17781300\t0.017\t60\nchr9\t17909100\t17909400\t0.367\t54\nchr9\t17912400\t17912700\t0.0514\t26\nchr9\t17923200\t17925600\t0.2098\t105\nchr9\t17944500\t17945400\t0.0754\t59\nchr9\t17973300\t17973600\t0.1743\t23\nchr9\t18000000\t18000300\t0.6066\t50\nchr9\t18168600\t18168900\t0.4382\t44\nchr9\t18197400\t18198900\t0.108\t85\nchr9\t18578700\t18579000\t0.3502\t55\nchr9\t18645600\t18645900\t0.2087\t61\nchr9\t18711600\t18712200\t0.3559\t100\nchr9\t18713700\t18717000\t0.3559\t100\nchr9\t18751800\t18752100\t0.4514\t13\nchr9\t18840000\t18841200\t0.4517\t83\nchr9\t19058400\t19058700\t0.6723\t50\nchr9\t19392300\t19392600\t0.4106\t46\nchr9\t19536300\t19542000\t0.0128\t84\nchr9\t19837200\t19837500\t0.5724\t48\nchr9\t19906200\t19906500\t0.3389\t59\nchr9\t20655900\t20658000\t0.0304\t69\nchr9\t20751300\t20752200\t0.2657\t72\nchr9\t20767200\t20768400\t0.3596\t64\nchr9\t20920200\t20920800\t0.4029\t73\nchr9\t20937000\t20937300\t0.2011\t52\nchr9\t21367500\t21367800\t0.1713\t66\nchr9\t21440700\t21441000\t0.178\t65\nchr9\t21537300\t21538500\t0.0006\t107\nchr9\t21539700\t21541800\t0.1682\t83\nchr9\t21705000\t21705300\t0.351\t82\nchr9\t22093200\t22093800\t0.4261\t66\nchr9\t22095600\t22095900\t0.3759\t66\nchr9\t22348800\t22352400\t0.0746\t58\nchr9\t22353600\t22354200\t0.1106\t111\nchr9\t22504200\t22504500\t0.6837\t32\nchr9\t22568100\t22568400\t0.3197\t45\nchr9\t22597500\t22597800\t0.6227\t50\nchr9\t22700700\t22702200\t0.052\t64\nchr9\t22734900\t22736400\t0.2147\t48\nchr9\t22999500\t22999800\t0.0251\t23\nchr9\t23075100\t23075400\t0.1368\t28\nchr9\t23936100\t23937300\t0.0312\t57\nchr9\t24226200\t24226500\t0.24\t80\nchr9\t24575100\t24577200\t0.0318\t78\nchr9\t24579300\t24579600\t0.0318\t78\nchr9\t24753600\t24753900\t0.3781\t30\nchr9\t25073400\t25074000\t0.1617\t107\nchr9\t25161600\t25161900\t0.4988\t12\nchr9\t25285800\t25286100\t0.2672\t52\nchr9\t25484700\t25485000\t0.5437\t66\nchr9\t26254200\t26254500\t0.3586\t44\nchr9\t26586900\t26587200\t0.5013\t68\nchr9\t26963400\t26964300\t0.1229\t75\nchr9\t27691200\t27696300\t0.0681\t89\nchr9\t28097400\t28097700\t0.1949\t40\nchr9\t28112100\t28117500\t0\t85\nchr9\t28189200\t28189800\t0.3076\t102\nchr9\t28201200\t28201500\t0.389\t56\nchr9\t28349100\t28353300\t0.234\t84\nchr9\t28554300\t28555500\t0.369\t95\nchr9\t28991400\t28991700\t0.4323\t27\nchr9\t28994400\t28994700\t0.5701\t43\nchr9\t29306100\t29306700\t0.1966\t66\nchr9\t29452800\t29453100\t0.5177\t67\nchr9\t29624700\t29625000\t0.0911\t22\nchr9\t30110700\t30111000\t0.4998\t59\nchr9\t30171300\t30171600\t0.2917\t93\nchr9\t30427800\t30429300\t0.3837\t56\nchr9\t30541800\t30542400\t0.4282\t43\nchr9\t30544200\t30545400\t0.2373\t35\nchr9\t30637200\t30637500\t0.4997\t53\nchr9\t30957000\t30957300\t0.4877\t60\nchr9\t31056600\t31056900\t0.1262\t12\nchr9\t31060500\t31060800\t0.32\t12\nchr9\t31294500\t31294800\t0.5524\t83\nchr9\t31296900\t31299900\t0.0765\t78\nchr9\t31552200\t31553700\t0.1267\t77\nchr9\t31620300\t31620600\t0.5664\t26\nchr9\t31632900\t31633500\t0.264\t72\nchr9\t31934400\t31934700\t0.513\t59\nchr9\t32152200\t32152500\t0.2477\t77\nchr9\t32154600\t32154900\t0.3548\t64\nchr9\t32189700\t32190000\t0.3111\t81\nchr9\t32212800\t32213400\t0.3022\t64\nchr9\t32225400\t32225700\t0.3949\t75\nchr9\t32711100\t32713800\t0.0216\t46\nchr9\t32715600\t32716200\t0.3751\t33\nchr9\t32730300\t32730600\t0.4442\t70\nchr9\t32731800\t32734800\t0.2253\t77\nchr9\t33183300\t33183600\t0.5082\t35\nchr9\t33252000\t33252300\t0.579\t36\nchr9\t33398100\t33398400\t0.4445\t59\nchr9\t33423600\t33424200\t0.3451\t74\nchr9\t33539700\t33540000\t0.3962\t89\nchr9\t33542100\t33542400\t0.3341\t54\nchr9\t33563400\t33563700\t0.4203\t66\nchr9\t33579000\t33579300\t0.3023\t45\nchr9\t34138200\t34138500\t0.3667\t67\nchr9\t34244400\t34245900\t0\t68\nchr9\t34273200\t34275000\t0\t69\nchr9\t34530900\t34531200\t0.6256\t77\nchr9\t34725300\t34725600\t0.39\t56\nchr9\t34762800\t34763100\t0.3937\t87\nchr9\t34847400\t34847700\t0.3317\t104\nchr9\t34872600\t34873200\t0.2157\t72\nchr9\t35372400\t35374200\t0\t48\nchr9\t35803200\t35803500\t0.6152\t44\nchr9\t35804700\t35805000\t0.4632\t47\nchr9\t35884200\t35884500\t0.2678\t51\nchr9\t35913300\t35914500\t0.3722\t136\nchr9\t36057900\t36058500\t0.4389\t62\nchr9\t36309300\t36309600\t0.3801\t33\nchr9\t36347100\t36347400\t0.1753\t232\nchr9\t36614400\t36615900\t0.2102\t76\nchr9\t37047600\t37047900\t0.5517\t60\nchr9\t37093200\t37093500\t0.2615\t76\nchr9\t38095800\t38096100\t0.4847\t47\nchr9\t38241300\t38243700\t0.0138\t56\nchr9\t38325300\t38325900\t0.1918\t53\nchr9\t38556000\t38556600\t0.306\t40\nchr9\t38564700\t38565300\t0.4122\t54\nchr9\t38580600\t38580900\t0.271\t59\nchr9\t38604300\t38604600\t0.4318\t51\nchr9\t38774100\t38779200\t0\t48\nchr9\t38781000\t38782500\t0.051\t78\nchr9\t38783700\t38784900\t0.0923\t57\nchr9\t38786400\t38789100\t0.0923\t57\nchr9\t38792400\t38792700\t0.4295\t58\nchr9\t38798100\t38798400\t0.1305\t45\nchr9\t38800800\t38801100\t0.2731\t27\nchr9\t38808300\t38808600\t0.3182\t37\nchr9\t38809800\t38810100\t0.454\t42\nchr9\t38811900\t38814600\t0.1935\t44\nchr9\t38816100\t38816400\t0.0544\t56\nchr9\t38818500\t38821800\t0.0544\t56\nchr9\t38823600\t38825100\t0.0176\t56\nchr9\t38827200\t38827500\t0.6021\t50\nchr9\t38829000\t38829600\t0\t84\nchr9\t38830800\t38916600\t0\t84\nchr9\t38918700\t38922000\t0\t152\nchr9\t38923200\t38988900\t0\t152\nchr9\t38991600\t38991900\t0.532\t109\nchr9\t38998500\t38998800\t0.0713\t97\nchr9\t39000600\t39002100\t0.459\t129\nchr9\t39007200\t39007500\t0.4425\t66\nchr9\t39010200\t39010500\t0.5602\t42\nchr9\t39014700\t39015600\t0.5486\t170\nchr9\t39018300\t39018900\t0.4208\t83\nchr9\t39029100\t39030600\t0.1851\t152\nchr9\t39032100\t39033600\t0.1851\t152\nchr9\t39053100\t39053400\t0.2562\t85\nchr9\t39060900\t39061500\t0.2873\t149\nchr9\t39065400\t39066600\t0.4276\t68\nchr9\t39070200\t39070500\t0.1633\t101\nchr9\t39071700\t39073200\t0.1633\t101\nchr9\t39075000\t39075600\t0.4512\t97\nchr9\t39079800\t39080100\t0.4682\t81\nchr9\t39091800\t39092400\t0.4241\t89\nchr9\t39102600\t39102900\t0.4395\t122\nchr9\t39128400\t39128700\t0.6662\t67\nchr9\t39144600\t39145500\t0.4868\t93\nchr9\t39150300\t39150900\t0\t59\nchr9\t39152100\t39248400\t0\t59\nchr9\t39252000\t39252900\t0\t44\nchr9\t39254100\t39288000\t0\t55\nchr9\t39289500\t39358500\t0\t81\nchr9\t39359700\t39360600\t0\t81\nchr9\t39362100\t39446400\t0\t83\nchr9\t39447900\t39449400\t0.2507\t66\nchr9\t39452400\t39454200\t0.114\t71\nchr9\t39455700\t39456000\t0.114\t71\nchr9\t39457200\t39457500\t0.114\t71\nchr9\t39458700\t39459000\t0.5116\t70\nchr9\t39462600\t39462900\t0.5355\t79\nchr9\t39465000\t39466200\t0.1469\t59\nchr9\t39469200\t39469500\t0.1398\t66\nchr9\t39471300\t39472200\t0.1398\t66\nchr9\t39473700\t39474300\t0.2844\t65\nchr9\t39475800\t39476100\t0.2844\t65\nchr9\t39479100\t39480600\t0.343\t58\nchr9\t39483300\t39483600\t0.4006\t53\nchr9\t39486000\t39498600\t0\t131\nchr9\t39499800\t39532500\t0\t131\nchr9\t39534000\t39537600\t0\t111\nchr9\t39543000\t39543900\t0.2878\t109\nchr9\t39545100\t39545400\t0.4268\t91\nchr9\t39548700\t39549600\t0.015\t92\nchr9\t39553200\t39554100\t0.5101\t121\nchr9\t39555900\t39556200\t0.5417\t97\nchr9\t39557700\t39558000\t0.5321\t121\nchr9\t39561600\t39561900\t0.4226\t82\nchr9\t39563100\t39565500\t0.3203\t49\nchr9\t39567300\t39569700\t0.099\t60\nchr9\t39572700\t39573900\t0.0628\t78\nchr9\t39576000\t39576300\t0.0628\t78\nchr9\t39591300\t39591600\t0\t111\nchr9\t39593700\t39604800\t0\t111\nchr9\t39607500\t39607800\t0\t117\nchr9\t39609600\t39810600\t0\t117\nchr9\t39812100\t39824100\t0\t117\nchr9\t39839100\t40016100\t0\t101\nchr9\t40017300\t40024800\t0\t101\nchr9\t40026000\t40035600\t0\t101\nchr9\t40036800\t40038600\t0\t101\nchr9\t40039800\t40045500\t0\t101\nchr9\t40047000\t40062900\t0\t101\nchr9\t40064100\t40129500\t0\t100\nchr9\t40131300\t40174500\t0\t100\nchr9\t40177800\t40189800\t0\t72\nchr9\t40191000\t40192200\t0.1841\t56\nchr9\t40197000\t40222800\t0\t93\nchr9\t40226700\t40390200\t0\t147\nchr9\t40391400\t40501800\t0\t95\nchr9\t40503000\t40533900\t0\t95\nchr9\t40535700\t40536300\t0\t95\nchr9\t40537500\t40543500\t0\t95\nchr9\t40545600\t40553400\t0\t130\nchr9\t40554900\t40572900\t0\t130\nchr9\t40574100\t40578900\t0\t105\nchr9\t40581900\t40586700\t0\t98\nchr9\t40588200\t40591500\t0\t98\nchr9\t40593000\t40650600\t0\t117\nchr9\t40651800\t40695900\t0\t80\nchr9\t40697700\t40716000\t0\t82\nchr9\t40717200\t40720500\t0\t82\nchr9\t40722900\t40725600\t0\t82\nchr9\t40726800\t40735200\t0\t95\nchr9\t40736700\t40745100\t0\t95\nchr9\t40746300\t40755000\t0\t95\nchr9\t40758900\t40771200\t0\t76\nchr9\t40772400\t40780200\t0.0035\t79\nchr9\t40783200\t40789200\t0.0173\t96\nchr9\t40791600\t40799100\t0\t91\nchr9\t40801200\t40801800\t0\t91\nchr9\t40803300\t40805700\t0\t91\nchr9\t40808100\t40809900\t0\t91\nchr9\t40811400\t40812000\t0\t91\nchr9\t40814100\t40824600\t0.025\t123\nchr9\t40825800\t40827900\t0\t125\nchr9\t40829700\t40830600\t0\t125\nchr9\t40833600\t40835400\t0\t70\nchr9\t40836600\t40836900\t0.0024\t156\nchr9\t40838400\t40843500\t0.0024\t156\nchr9\t40847700\t40849800\t0.0782\t96\nchr9\t40851000\t40857900\t0.0178\t87\nchr9\t40860000\t40860300\t0\t98\nchr9\t40861500\t40867500\t0\t98\nchr9\t40893600\t40893900\t0.6425\t414\nchr9\t40901700\t40902000\t0.5751\t258\nchr9\t40906800\t40907100\t0.6722\t321\nchr9\t40910400\t40913100\t0.5953\t495\nchr9\t40915200\t40915500\t0.5783\t344\nchr9\t40927800\t40928100\t0.6656\t420\nchr9\t40932600\t40932900\t0.5584\t49\nchr9\t40964700\t40965000\t0.4274\t92\nchr9\t40967400\t40968000\t0.0942\t159\nchr9\t40979400\t40980000\t0.4105\t257\nchr9\t40990200\t40990500\t0.4428\t134\nchr9\t41003400\t41004000\t0.4114\t171\nchr9\t41016900\t41017500\t0.409\t192\nchr9\t41019900\t41020200\t0.3518\t192\nchr9\t41022600\t41022900\t0.4869\t120\nchr9\t41043600\t41043900\t0.3284\t162\nchr9\t41047200\t41048100\t0.4217\t172\nchr9\t41052000\t41052600\t0.4127\t143\nchr9\t41057400\t41058300\t0.0854\t136\nchr9\t41073300\t41073600\t0.4322\t147\nchr9\t41076600\t41078100\t0.2073\t154\nchr9\t41081400\t41081700\t0.1175\t121\nchr9\t41084400\t41084700\t0.2537\t136\nchr9\t41092200\t41092500\t0.4531\t135\nchr9\t41097300\t41097600\t0.6061\t215\nchr9\t41100000\t41100300\t0.3715\t151\nchr9\t41101800\t41110500\t0\t321\nchr9\t41112000\t41225700\t0\t321\nchr9\t41230800\t41231100\t0.674\t309\nchr9\t41233500\t41234100\t0.2686\t213\nchr9\t41238600\t41238900\t0.6245\t45\nchr9\t41241600\t41242200\t0.5573\t155\nchr9\t41253300\t41253600\t0.544\t134\nchr9\t41255700\t41258700\t0.1989\t200\nchr9\t41259900\t41270700\t0\t267\nchr9\t41272200\t41289000\t0\t170\nchr9\t41291400\t41292000\t0\t170\nchr9\t41293200\t41295300\t0\t170\nchr9\t41297100\t41301900\t0\t170\nchr9\t41304000\t41305500\t0.0347\t69\nchr9\t41306700\t41307600\t0.0347\t69\nchr9\t41310600\t41312700\t0\t92\nchr9\t41314200\t41314800\t0.2433\t52\nchr9\t41316900\t41318100\t0.0187\t76\nchr9\t41319300\t41324400\t0.0303\t107\nchr9\t41326200\t41326500\t0.0086\t132\nchr9\t41327700\t41328300\t0.0086\t132\nchr9\t41329800\t41334000\t0.0086\t132\nchr9\t41335800\t41344500\t0\t92\nchr9\t41346000\t41348700\t0\t92\nchr9\t41351100\t41352300\t0\t105\nchr9\t41353800\t41354100\t0\t105\nchr9\t41355600\t41356800\t0\t105\nchr9\t41358300\t41367900\t0\t105\nchr9\t41370000\t41376600\t0.0082\t83\nchr9\t41378100\t41378400\t0.4747\t78\nchr9\t41380200\t41380500\t0.4747\t78\nchr9\t41381700\t41385300\t0\t68\nchr9\t41386800\t41388300\t0\t68\nchr9\t41390100\t41392500\t0\t94\nchr9\t41394000\t41400900\t0\t94\nchr9\t41402100\t41405700\t0\t94\nchr9\t41407200\t41413800\t0\t94\nchr9\t41415000\t41415600\t0.0386\t67\nchr9\t41416800\t41417100\t0.0386\t67\nchr9\t41418300\t41418600\t0.5941\t47\nchr9\t41421600\t41424600\t0.1064\t84\nchr9\t41427300\t41427600\t0.1093\t136\nchr9\t41429100\t41431500\t0.1093\t136\nchr9\t41434500\t41438700\t0\t74\nchr9\t41440200\t41445300\t0\t74\nchr9\t41446500\t41447400\t0\t74\nchr9\t41448600\t41457900\t0\t74\nchr9\t41460600\t41462100\t0.1144\t76\nchr9\t41466900\t41468400\t0.0514\t79\nchr9\t41469900\t41472900\t0.0514\t79\nchr9\t41474100\t41475300\t0.0514\t79\nchr9\t41476800\t41477400\t0.3569\t54\nchr9\t41478600\t41481600\t0\t100\nchr9\t41484300\t41485800\t0\t100\nchr9\t41487300\t41488500\t0\t100\nchr9\t41490000\t41495700\t0\t100\nchr9\t41498100\t41498400\t0\t100\nchr9\t41499600\t41502300\t0\t100\nchr9\t41503800\t41507400\t0.2194\t84\nchr9\t41509500\t41509800\t0.0148\t88\nchr9\t41513100\t41518800\t0.0148\t88\nchr9\t41520300\t41520900\t0.0148\t88\nchr9\t41522100\t41528700\t0\t109\nchr9\t41532300\t41533500\t0.0388\t80\nchr9\t41539200\t41539500\t0\t120\nchr9\t41541600\t41559900\t0\t120\nchr9\t41563200\t41563800\t0.4568\t145\nchr9\t41573100\t41626800\t0\t169\nchr9\t41628000\t41632800\t0\t169\nchr9\t41635800\t41637900\t0.0045\t81\nchr9\t41639700\t41641500\t0.279\t60\nchr9\t41642700\t41643000\t0.279\t60\nchr9\t41648700\t41649300\t0.3708\t109\nchr9\t41660100\t41663100\t0\t121\nchr9\t41664300\t41670300\t0\t121\nchr9\t41673900\t41674200\t0.3109\t82\nchr9\t41675400\t41691900\t0\t103\nchr9\t41694000\t41696400\t0\t103\nchr9\t41697900\t41706300\t0.0004\t117\nchr9\t41709600\t41710200\t0.5006\t115\nchr9\t41711700\t41715600\t0.1267\t108\nchr9\t41718000\t41738700\t0\t109\nchr9\t41739900\t41753700\t0\t125\nchr9\t41756700\t41775000\t0\t119\nchr9\t41776800\t41777100\t0\t119\nchr9\t41786100\t41787300\t0.0941\t111\nchr9\t41792400\t41793000\t0.2103\t135\nchr9\t41795100\t41795400\t0.1784\t101\nchr9\t41805600\t41805900\t0.0239\t128\nchr9\t41808300\t41808900\t0\t157\nchr9\t41810100\t41916900\t0\t157\nchr9\t41920200\t41920500\t0.2539\t130\nchr9\t41921700\t41922000\t0.2539\t130\nchr9\t41927100\t41927400\t0.1994\t60\nchr9\t41936400\t41936700\t0.5158\t104\nchr9\t41944200\t41944500\t0.4749\t62\nchr9\t41946300\t41946900\t0.4295\t57\nchr9\t41948700\t41949300\t0.3261\t75\nchr9\t41952600\t41954100\t0.4128\t115\nchr9\t41956500\t41957700\t0.0066\t88\nchr9\t41958900\t41959200\t0.0066\t88\nchr9\t41965800\t41966100\t0.5137\t94\nchr9\t41969100\t41976600\t0\t87\nchr9\t41978100\t41989500\t0\t87\nchr9\t41991300\t41992500\t0.14\t93\nchr9\t41994000\t42028500\t0\t103\nchr9\t42030000\t42035400\t0\t103\nchr9\t42036900\t42053100\t0\t77\nchr9\t42056700\t42062700\t0\t95\nchr9\t42063900\t42074400\t0\t95\nchr9\t42075900\t42076800\t0\t95\nchr9\t42078000\t42079500\t0\t95\nchr9\t42080700\t42088200\t0\t95\nchr9\t42090300\t42093000\t0\t74\nchr9\t42099900\t42107100\t0\t63\nchr9\t42114000\t42115800\t0.3188\t67\nchr9\t42118800\t42119100\t0.4541\t68\nchr9\t42122700\t42123000\t0.4023\t50\nchr9\t42126000\t42126300\t0.5018\t72\nchr9\t42128400\t42129900\t0.1669\t59\nchr9\t42131700\t42132000\t0.405\t35\nchr9\t42135300\t42137700\t0.4139\t56\nchr9\t42148200\t42148500\t0.4134\t43\nchr9\t42162900\t42163800\t0.4294\t52\nchr9\t42180000\t42180300\t0.3499\t67\nchr9\t42185100\t42186600\t0.2686\t67\nchr9\t42187800\t42189000\t0.1007\t75\nchr9\t42192900\t42193200\t0.2585\t57\nchr9\t42198300\t42198900\t0.1179\t49\nchr9\t42201000\t42201300\t0.2956\t49\nchr9\t42202500\t42204600\t0.1578\t78\nchr9\t42207000\t42207600\t0.3721\t66\nchr9\t42212100\t42213000\t0.5382\t67\nchr9\t42214200\t42214500\t0.5382\t67\nchr9\t42216900\t42217200\t0.3205\t60\nchr9\t42220800\t42221100\t0.545\t65\nchr9\t42225900\t42226200\t0.1536\t77\nchr9\t42228300\t42228600\t0.4234\t58\nchr9\t42298800\t42300300\t0.4824\t73\nchr9\t42314400\t42314700\t0.2788\t34\nchr9\t42318300\t42318600\t0.2497\t90\nchr9\t42324600\t42324900\t0.4318\t89\nchr9\t42348000\t42352500\t0.0304\t128\nchr9\t42356400\t42357300\t0.1889\t94\nchr9\t42360600\t42360900\t0.3719\t79\nchr9\t42364800\t42365100\t0.492\t61\nchr9\t42370500\t42371100\t0.2839\t81\nchr9\t42386100\t42386400\t0.2412\t69\nchr9\t42395400\t42395700\t0.4332\t61\nchr9\t42401400\t42402600\t0.0241\t42\nchr9\t42408300\t42417600\t0\t99\nchr9\t42419100\t42419700\t0.0129\t36\nchr9\t42437400\t42437700\t0.4764\t94\nchr9\t42439800\t42441300\t0.2758\t112\nchr9\t42442800\t42443100\t0.5258\t79\nchr9\t42450000\t42450300\t0.2182\t58\nchr9\t42463800\t42464100\t0.5894\t50\nchr9\t42465600\t42465900\t0.3021\t70\nchr9\t42485100\t42485400\t0.4992\t61\nchr9\t42495600\t42500700\t0\t79\nchr9\t42508500\t42533700\t0\t81\nchr9\t42535500\t42538200\t0\t70\nchr9\t42539400\t42660900\t0\t116\nchr9\t42662100\t42693300\t0\t116\nchr9\t42729600\t42729900\t0.0322\t51\nchr9\t42733200\t42733500\t0.1256\t75\nchr9\t42741000\t42741600\t0.2516\t75\nchr9\t42760800\t42761100\t0.1779\t49\nchr9\t42766500\t42766800\t0.3744\t56\nchr9\t42776700\t42777000\t0.4643\t41\nchr9\t42784500\t42785100\t0.0223\t51\nchr9\t42818400\t42829800\t0.0113\t67\nchr9\t42857100\t42857700\t0.0011\t57\nchr9\t42862200\t42862500\t0.3788\t76\nchr9\t42863700\t42865200\t0.3788\t76\nchr9\t42871200\t42871800\t0.614\t50\nchr9\t42882000\t42882900\t0.2037\t83\nchr9\t42884100\t42885900\t0.4863\t67\nchr9\t42887400\t42887700\t0.4625\t66\nchr9\t42888900\t42889200\t0.4625\t66\nchr9\t42894900\t42895200\t0.3887\t59\nchr9\t42896400\t42897000\t0.23\t74\nchr9\t42898500\t42898800\t0.4712\t60\nchr9\t42907800\t42908100\t0.3132\t76\nchr9\t42910200\t42910500\t0.4389\t64\nchr9\t42914700\t42915000\t0.4376\t45\nchr9\t42917400\t42917700\t0.4462\t73\nchr9\t42919200\t42919500\t0.327\t52\nchr9\t42958800\t42959100\t0.4088\t74\nchr9\t42970500\t42970800\t0.0293\t61\nchr9\t42977400\t42977700\t0.3447\t64\nchr9\t42980100\t42980400\t0.5187\t53\nchr9\t42986400\t42986700\t0.4648\t59\nchr9\t42993600\t42993900\t0\t99\nchr9\t42996000\t43004100\t0\t99\nchr9\t43009200\t43009800\t0.0959\t55\nchr9\t43011600\t43011900\t0.524\t68\nchr9\t43017300\t43017600\t0.2946\t56\nchr9\t43026000\t43026300\t0.4421\t79\nchr9\t43029000\t43029600\t0.3126\t54\nchr9\t43032300\t43035000\t0.0085\t85\nchr9\t43037400\t43037700\t0.4189\t64\nchr9\t43040100\t43040700\t0.088\t53\nchr9\t43042500\t43046100\t0.1417\t63\nchr9\t43052700\t43053600\t0.0929\t61\nchr9\t43059300\t43060800\t0.3081\t52\nchr9\t43062000\t43062300\t0.1959\t62\nchr9\t43063800\t43065000\t0.1959\t62\nchr9\t43067100\t43070400\t0.0726\t64\nchr9\t43072800\t43073100\t0.2255\t78\nchr9\t43076400\t43078500\t0.2255\t78\nchr9\t43080900\t43081500\t0.3948\t87\nchr9\t43083000\t43083300\t0.3948\t87\nchr9\t43085700\t43086000\t0.5665\t48\nchr9\t43091700\t43092000\t0.3956\t68\nchr9\t43093200\t43093500\t0.3956\t68\nchr9\t43095000\t43097100\t0.1177\t70\nchr9\t43099800\t43101000\t0.1177\t70\nchr9\t43104600\t43107000\t0.152\t72\nchr9\t43111800\t43112100\t0.4391\t66\nchr9\t43113600\t43113900\t0.4466\t48\nchr9\t43131300\t43134000\t0.0358\t73\nchr9\t43135800\t43136100\t0.3992\t57\nchr9\t43150200\t43150800\t0.2484\t77\nchr9\t43152900\t43153800\t0.3983\t58\nchr9\t43159500\t43159800\t0.3494\t72\nchr9\t43170900\t43171500\t0.5852\t167\nchr9\t43174200\t43174500\t0.4936\t51\nchr9\t43194300\t43195500\t0.0115\t68\nchr9\t43210800\t43211400\t0.6255\t236\nchr9\t43214400\t43216500\t0.0116\t276\nchr9\t43240200\t43242600\t0.1375\t79\nchr9\t43263900\t43264200\t0.3762\t68\nchr9\t43275000\t43281300\t0\t75\nchr9\t43283100\t43332300\t0\t142\nchr9\t43333800\t43370100\t0\t171\nchr9\t43371300\t43377300\t0\t171\nchr9\t43382400\t43382700\t0.1462\t46\nchr9\t43383900\t43443600\t0\t413\nchr9\t43445100\t43455600\t0\t583\nchr9\t43456800\t44124600\t0\t583\nchr9\t44125800\t44251500\t0\t626\nchr9\t44252700\t44799000\t0\t626\nchr9\t44800200\t44868300\t0\t626\nchr9\t44869500\t44920200\t0\t626\nchr9\t44921400\t45019200\t0\t626\nchr9\t45020400\t45031500\t0\t626\nchr9\t45033600\t45034500\t0\t308\nchr9\t45036000\t45074400\t0\t308\nchr9\t45075600\t45112800\t0\t308\nchr9\t45114600\t45152100\t0\t265\nchr9\t45153300\t45164700\t0\t265\nchr9\t45165900\t45182700\t0\t265\nchr9\t45184200\t45205800\t0\t265\nchr9\t45207600\t45215400\t0\t265\nchr9\t45216600\t45261900\t0\t239\nchr9\t45263400\t45264600\t0\t239\nchr9\t45265800\t45298500\t0\t239\nchr9\t45300900\t45306000\t0\t239\nchr9\t45307200\t45322500\t0\t239\nchr9\t45324000\t45368400\t0\t361\nchr9\t45369600\t45384300\t0\t361\nchr9\t45385500\t45422700\t0\t361\nchr9\t45424200\t45484200\t0\t361\nchr9\t45485700\t45518700\t0\t361\nchr9\t60519600\t60521100\t0.634\t139\nchr9\t60523200\t60529200\t0.4756\t278\nchr9\t60548400\t60549000\t0.1185\t47\nchr9\t60550200\t60552600\t0\t195\nchr9\t60553800\t60570900\t0\t195\nchr9\t60572400\t60616500\t0\t311\nchr9\t60617700\t60656700\t0\t489\nchr9\t60657900\t60688200\t0\t489\nchr9\t60740400\t60740700\t0.5718\t31\nchr9\t60744000\t60744300\t0.1796\t31\nchr9\t60747300\t60765300\t0\t68\nchr9\t60766500\t60767700\t0\t68\nchr9\t60768900\t60779400\t0\t68\nchr9\t60829500\t60875100\t0\t54\nchr9\t60876600\t60885000\t0\t54\nchr9\t60886800\t60887700\t0\t54\nchr9\t60891000\t60893100\t0\t85\nchr9\t60894900\t61003800\t0\t85\nchr9\t61053900\t61142100\t0\t74\nchr9\t61143600\t61145400\t0\t74\nchr9\t61146900\t61161900\t0\t98\nchr9\t61163100\t61180500\t0\t98\nchr9\t61181700\t61213800\t0\t94\nchr9\t61218900\t61224600\t0\t70\nchr9\t61225800\t61227600\t0.0029\t52\nchr9\t61230600\t61231800\t0.0259\t74\nchr9\t61282200\t61329600\t0\t81\nchr9\t61331400\t61345800\t0\t81\nchr9\t61347300\t61363800\t0\t62\nchr9\t61366200\t61367100\t0.2502\t56\nchr9\t61370700\t61373700\t0.0679\t45\nchr9\t61374900\t61397100\t0\t59\nchr9\t61398300\t61400100\t0\t59\nchr9\t61401600\t61405800\t0\t59\nchr9\t61407300\t61468800\t0\t63\nchr9\t61528800\t61529400\t0.1386\t81\nchr9\t61551900\t61553400\t0.5993\t96\nchr9\t61556400\t61556700\t0.5695\t69\nchr9\t61558200\t61558500\t0.4316\t109\nchr9\t61568700\t61569000\t0.3287\t87\nchr9\t61570200\t61570500\t0.3287\t87\nchr9\t61575300\t61575600\t0.2392\t43\nchr9\t61585500\t61590900\t0\t94\nchr9\t61593300\t61593600\t0.5263\t64\nchr9\t61596900\t61597200\t0.4934\t53\nchr9\t61611600\t61612200\t0.4625\t70\nchr9\t61625400\t61625700\t0.4375\t73\nchr9\t61636500\t61638600\t0.1171\t97\nchr9\t61644300\t61645200\t0.0774\t72\nchr9\t61646400\t61663800\t0\t87\nchr9\t61668300\t61668600\t0.6055\t330\nchr9\t61686600\t61686900\t0.4271\t84\nchr9\t61785300\t61912800\t0\t1182\nchr9\t61914000\t61979400\t0\t1182\nchr9\t61983300\t61983900\t0.3529\t82\nchr9\t61986300\t61992000\t0\t78\nchr9\t61993200\t62039100\t0\t78\nchr9\t62040300\t62049600\t0\t78\nchr9\t62050800\t62149500\t0\t78\nchr9\t62249700\t62439600\t0\t133\nchr9\t62440800\t62717400\t0\t133\nchr9\t62718600\t62748900\t0\t133\nchr9\t62803500\t62803800\t0.4218\t175\nchr9\t62810100\t62810400\t0.3434\t139\nchr9\t62811900\t62813700\t0.0172\t283\nchr9\t62817600\t62817900\t0.3937\t152\nchr9\t62820000\t62823000\t0.2225\t323\nchr9\t62825100\t62827200\t0.2225\t323\nchr9\t62829900\t62835000\t0\t196\nchr9\t62836500\t62837400\t0\t196\nchr9\t62839800\t62842500\t0.2316\t189\nchr9\t62844000\t62844300\t0.0361\t169\nchr9\t62845500\t62850000\t0.0361\t169\nchr9\t62851200\t62851500\t0.0361\t169\nchr9\t62852700\t62856000\t0.0361\t169\nchr9\t62859600\t62860200\t0.6163\t124\nchr9\t62883600\t62903400\t0\t128\nchr9\t62904600\t62958300\t0\t128\nchr9\t63008400\t63023400\t0\t62\nchr9\t63024900\t63202800\t0\t125\nchr9\t63252900\t63257400\t0\t75\nchr9\t63258600\t63260100\t0\t115\nchr9\t63261900\t63262800\t0\t115\nchr9\t63264000\t63266100\t0\t115\nchr9\t63267900\t63296100\t0\t115\nchr9\t63297300\t63312300\t0\t115\nchr9\t63314400\t63325500\t0\t115\nchr9\t63331200\t63341100\t0\t94\nchr9\t63342300\t63345000\t0\t94\nchr9\t63346200\t63346500\t0.1407\t79\nchr9\t63348900\t63349500\t0.1407\t79\nchr9\t63352500\t63353100\t0.1794\t76\nchr9\t63354600\t63354900\t0.1794\t76\nchr9\t63356100\t63360300\t0\t76\nchr9\t63363000\t63379200\t0\t126\nchr9\t63381300\t63449100\t0\t126\nchr9\t63451200\t63492300\t0\t72\nchr9\t63543000\t63548100\t0.096\t64\nchr9\t63566100\t63570900\t0.0008\t88\nchr9\t63576000\t63576300\t0.3576\t55\nchr9\t63590100\t63591300\t0.3448\t83\nchr9\t63594600\t63594900\t0.4344\t56\nchr9\t63598500\t63599100\t0.0814\t49\nchr9\t63600300\t63603300\t0.0814\t49\nchr9\t63619200\t63619500\t0.2315\t66\nchr9\t63636900\t63637200\t0.0464\t64\nchr9\t63639000\t63640200\t0.0464\t64\nchr9\t63643200\t63643500\t0.1138\t64\nchr9\t63644700\t63646500\t0.1138\t64\nchr9\t63649200\t63652500\t0\t62\nchr9\t63653700\t63654900\t0.228\t67\nchr9\t63660600\t63664500\t0.0029\t74\nchr9\t63666600\t63671700\t0.0029\t74\nchr9\t63673800\t63675600\t0.2345\t67\nchr9\t63677100\t63677400\t0.2345\t67\nchr9\t63679200\t63679500\t0.2345\t67\nchr9\t63687000\t63687300\t0.1914\t68\nchr9\t63689700\t63690300\t0.1914\t68\nchr9\t63698400\t63699000\t0.5275\t56\nchr9\t63709200\t63709800\t0.5701\t52\nchr9\t63711300\t63711600\t0.4098\t72\nchr9\t63712800\t63713100\t0.4098\t72\nchr9\t63717300\t63718800\t0.2896\t90\nchr9\t63720000\t63720300\t0.2896\t90\nchr9\t63737100\t63737700\t0.4367\t174\nchr9\t63744600\t63744900\t0.4344\t27\nchr9\t63747600\t63747900\t0.4649\t45\nchr9\t63765600\t63770400\t0.0567\t164\nchr9\t63772500\t63774600\t0.0926\t149\nchr9\t63776400\t63781200\t0.121\t157\nchr9\t63783900\t63784200\t0.5615\t265\nchr9\t63793200\t63794700\t0.4029\t202\nchr9\t63797700\t63798000\t0.4979\t278\nchr9\t63799500\t63800100\t0.4979\t278\nchr9\t63801900\t63804300\t0.1709\t187\nchr9\t63807300\t63808800\t0.2897\t186\nchr9\t63810000\t63812100\t0.2897\t186\nchr9\t63818700\t63819900\t0.5876\t452\nchr9\t63822900\t63823200\t0.6858\t183\nchr9\t63826500\t63829800\t0.3363\t320\nchr9\t63833400\t63835800\t0.1884\t122\nchr9\t63840300\t63841200\t0.5794\t103\nchr9\t63842700\t63843000\t0.6787\t73\nchr9\t63858300\t63858600\t0.5981\t200\nchr9\t63861300\t63862800\t0.4782\t187\nchr9\t63867000\t63870300\t0.161\t291\nchr9\t63871800\t63872700\t0.161\t291\nchr9\t63875400\t63877500\t0.4173\t165\nchr9\t63879600\t63879900\t0.3883\t113\nchr9\t63881400\t63882300\t0.0592\t409\nchr9\t63884100\t63885900\t0.0592\t409\nchr9\t63887100\t63887400\t0.0592\t409\nchr9\t63888900\t63889200\t0.3829\t96\nchr9\t63894600\t63895500\t0.3776\t165\nchr9\t63898500\t63898800\t0.5599\t182\nchr9\t63918300\t63918600\t0.3972\t60\nchr9\t63969000\t63969900\t0.3089\t147\nchr9\t63971100\t63975300\t0.3089\t147\nchr9\t63978000\t63978300\t0.4657\t48\nchr9\t63982500\t63984000\t0.1122\t153\nchr9\t63985200\t63985500\t0.1122\t153\nchr9\t63986700\t63992400\t0.1152\t162\nchr9\t63997500\t64000500\t0.0129\t168\nchr9\t64002000\t64003200\t0.0129\t168\nchr9\t64004400\t64007100\t0.0129\t168\nchr9\t64008900\t64009500\t0.0129\t168\nchr9\t64091100\t64091700\t0.4933\t163\nchr9\t64185300\t64215000\t0\t45\nchr9\t64315200\t64335300\t0\t128\nchr9\t64339500\t64366500\t0\t113\nchr9\t64367700\t64402800\t0\t113\nchr9\t64404000\t64407900\t0\t113\nchr9\t64409400\t64445700\t0\t108\nchr9\t64447200\t64451100\t0.0071\t119\nchr9\t64453800\t64455900\t0.1227\t87\nchr9\t64457400\t64463100\t0\t149\nchr9\t64464300\t64470600\t0\t149\nchr9\t64472400\t64477500\t0\t149\nchr9\t64478700\t64480500\t0\t149\nchr9\t64485000\t64488000\t0.1757\t92\nchr9\t64489800\t64494000\t0.0353\t100\nchr9\t64497600\t64498200\t0.1778\t82\nchr9\t64500000\t64508100\t0\t117\nchr9\t64509300\t64525800\t0\t117\nchr9\t64527900\t64559400\t0\t117\nchr9\t64560600\t64773600\t0\t117\nchr9\t64775100\t64781700\t0.0019\t93\nchr9\t64783500\t64803900\t0\t107\nchr9\t64805100\t64806300\t0\t107\nchr9\t64807500\t64845300\t0\t74\nchr9\t64846500\t64911600\t0\t80\nchr9\t64912800\t64920600\t0\t80\nchr9\t64921800\t64936200\t0\t80\nchr9\t64937700\t64938300\t0.4761\t119\nchr9\t64944900\t64950300\t0.0837\t78\nchr9\t64952100\t64997700\t0\t134\nchr9\t65070000\t65070300\t0.2041\t38\nchr9\t65073900\t65074200\t0.6974\t224\nchr9\t65079600\t65080200\t0.0007\t48\nchr9\t65130300\t65258100\t0\t86\nchr9\t65259600\t65325000\t0\t156\nchr9\t65375100\t65376600\t0\t82\nchr9\t65378700\t65380800\t0.4044\t78\nchr9\t65385300\t65386500\t0.606\t212\nchr9\t65391900\t65392200\t0.323\t123\nchr9\t65478300\t65478600\t0.3987\t89\nchr9\t65487300\t65487600\t0.4289\t71\nchr9\t65489400\t65489700\t0.3272\t66\nchr9\t65493600\t65493900\t0.3301\t69\nchr9\t65502600\t65502900\t0.3065\t62\nchr9\t65510700\t65514300\t0.1086\t75\nchr9\t65516700\t65522100\t0\t106\nchr9\t65523600\t65523900\t0\t106\nchr9\t65530500\t65532000\t0.1538\t71\nchr9\t65535900\t65536500\t0.245\t72\nchr9\t65542500\t65545800\t0.1032\t86\nchr9\t65551500\t65552700\t0.5297\t71\nchr9\t65558700\t65561400\t0.2526\t114\nchr9\t65563200\t65563500\t0.6166\t118\nchr9\t65567700\t65568900\t0.2893\t92\nchr9\t65575200\t65576700\t0\t94\nchr9\t65577900\t65594700\t0\t94\nchr9\t65645100\t65657100\t0\t261\nchr9\t65659500\t65661000\t0.1989\t82\nchr9\t65663400\t65663700\t0.0431\t63\nchr9\t65665500\t65679300\t0\t217\nchr9\t65681400\t65693100\t0\t217\nchr9\t65694600\t65713800\t0\t217\nchr9\t65715600\t65716200\t0\t217\nchr9\t65718300\t65762400\t0\t217\nchr9\t65763600\t65900400\t0\t128\nchr9\t65901600\t66157800\t0\t128\nchr9\t66159000\t66162300\t0\t128\nchr9\t66163500\t66170100\t0\t128\nchr9\t66172800\t66173400\t0.454\t102\nchr9\t66174900\t66197400\t0\t74\nchr9\t66201900\t66278100\t0\t100\nchr9\t66280200\t66336900\t0\t100\nchr9\t66338400\t66390900\t0\t100\nchr9\t66591300\t66600600\t0\t98\nchr9\t66601800\t66616800\t0\t98\nchr9\t66618300\t66673500\t0\t105\nchr9\t66674700\t66774600\t0\t145\nchr9\t66775800\t66776100\t0.4447\t87\nchr9\t66777900\t66778200\t0.6124\t72\nchr9\t66779700\t66780600\t0.0476\t52\nchr9\t66783300\t66783600\t0.4212\t97\nchr9\t66788400\t66788700\t0.4065\t56\nchr9\t66791100\t66792300\t0.0078\t77\nchr9\t66795300\t66795900\t0.226\t60\nchr9\t66797400\t66797700\t0.2981\t62\nchr9\t66799500\t66799800\t0.3335\t69\nchr9\t66801000\t66801300\t0.3924\t66\nchr9\t66806100\t66807300\t0.3868\t49\nchr9\t66808800\t66809400\t0.0984\t64\nchr9\t66810900\t66812100\t0.0984\t64\nchr9\t66813300\t66813600\t0.3684\t23\nchr9\t66814800\t66816000\t0.1352\t104\nchr9\t66819300\t66822000\t0.1287\t113\nchr9\t66825900\t66826500\t0\t132\nchr9\t66827700\t66842700\t0\t132\nchr9\t66843900\t66877500\t0\t132\nchr9\t66878700\t66879300\t0.5244\t52\nchr9\t66881700\t66882000\t0.475\t58\nchr9\t66884700\t66886200\t0.2576\t52\nchr9\t66889200\t66889500\t0.4237\t62\nchr9\t66890700\t66891600\t0.4237\t62\nchr9\t66893100\t66894000\t0.1111\t79\nchr9\t66895800\t66896100\t0.1111\t79\nchr9\t66898800\t66899100\t0.4625\t55\nchr9\t66902400\t66902700\t0.4596\t60\nchr9\t66906300\t66906600\t0.4089\t68\nchr9\t66907800\t66908100\t0.4089\t68\nchr9\t66909300\t66909600\t0.0565\t74\nchr9\t66911100\t66912600\t0.0565\t74\nchr9\t66915600\t66917400\t0.0565\t74\nchr9\t66918900\t66919500\t0.0565\t74\nchr9\t66921900\t66930300\t0.0349\t71\nchr9\t66933300\t66937200\t0.0349\t71\nchr9\t66939600\t66940800\t0.0629\t56\nchr9\t66943500\t66943800\t0.518\t77\nchr9\t66945000\t66946500\t0.518\t77\nchr9\t66947700\t66948600\t0.1049\t72\nchr9\t66952200\t66952500\t0.3554\t38\nchr9\t66953700\t66957900\t0\t73\nchr9\t66959100\t66960900\t0\t73\nchr9\t66962400\t66972300\t0\t73\nchr9\t66973800\t66975300\t0\t73\nchr9\t66979500\t67038300\t0\t86\nchr9\t67039500\t67043700\t0\t86\nchr9\t67045200\t67051500\t0\t86\nchr9\t67053000\t67054200\t0\t86\nchr9\t67056600\t67056900\t0.4424\t48\nchr9\t67059300\t67062600\t0.0309\t77\nchr9\t67064400\t67065000\t0.0309\t77\nchr9\t67069800\t67070100\t0.2766\t70\nchr9\t67071600\t67073400\t0.2766\t70\nchr9\t67077600\t67078200\t0.337\t62\nchr9\t67080600\t67087500\t0\t78\nchr9\t67094400\t67096500\t0\t60\nchr9\t67099200\t67109400\t0\t71\nchr9\t67110600\t67133100\t0\t71\nchr9\t67134300\t67148700\t0\t76\nchr9\t67150200\t67193400\t0\t76\nchr9\t67194600\t67196100\t0\t151\nchr9\t67197300\t67397700\t0\t151\nchr9\t67399500\t67607700\t0\t124\nchr9\t67610700\t67611900\t0.3151\t89\nchr9\t67613100\t67614600\t0\t90\nchr9\t67616100\t67623000\t0\t90\nchr9\t67624200\t67624500\t0\t90\nchr9\t67626600\t67637100\t0\t113\nchr9\t67641000\t67756800\t0\t1810\nchr9\t67758000\t67758600\t0\t1810\nchr9\t67760400\t67776600\t0\t1810\nchr9\t67777800\t67822500\t0\t1810\nchr9\t67824600\t67831500\t0\t110\nchr9\t67833000\t67848600\t0\t97\nchr9\t67850700\t67854000\t0.3974\t79\nchr9\t67855800\t67858800\t0.102\t92\nchr9\t67860600\t67864800\t0\t109\nchr9\t67866000\t67884600\t0\t109\nchr9\t67885800\t67920600\t0\t109\nchr9\t68220600\t68332800\t0\t204\nchr9\t68334000\t68334300\t0.3636\t100\nchr9\t68336400\t68336700\t0.3636\t100\nchr9\t68344500\t68345100\t0.4651\t212\nchr9\t68352300\t68355000\t0.2756\t106\nchr9\t68359200\t68360700\t0.4687\t91\nchr9\t68364600\t68365500\t0.1476\t160\nchr9\t68367600\t68368500\t0.2135\t96\nchr9\t68374200\t68374800\t0.414\t126\nchr9\t68384100\t68386200\t0.1759\t121\nchr9\t68388000\t68388600\t0.1759\t121\nchr9\t68390700\t68391000\t0.5005\t166\nchr9\t68394600\t68394900\t0.3525\t90\nchr9\t68409000\t68409600\t0.2088\t80\nchr9\t68411700\t68412300\t0.2\t104\nchr9\t68414700\t68415000\t0.5191\t118\nchr9\t68592600\t68592900\t0.5551\t48\nchr9\t69416400\t69418200\t0\t81\nchr9\t69437400\t69439200\t0\t86\nchr9\t69477300\t69481200\t0\t80\nchr9\t69506400\t69510900\t0\t90\nchr9\t69680700\t69681000\t0.4523\t51\nchr9\t69761100\t69761400\t0.4078\t56\nchr9\t69763200\t69763800\t0.2008\t51\nchr9\t69838800\t69839400\t0.1036\t76\nchr9\t70038000\t70038900\t0.2992\t6102\nchr9\t70199100\t70204800\t0.0423\t90\nchr9\t70432500\t70433400\t0\t77\nchr9\t70701900\t70737600\t0\t45\nchr9\t70896600\t70897200\t0.3837\t52\nchr9\t71497200\t71498400\t0.3947\t68\nchr9\t71654400\t71654700\t0.4821\t29\nchr9\t72153300\t72153600\t0.4907\t55\nchr9\t72451500\t72451800\t0.3676\t71\nchr9\t72839700\t72842100\t0.4125\t82\nchr9\t73123800\t73124400\t0.5759\t33\nchr9\t73193400\t73193700\t0.4625\t47\nchr9\t73321200\t73321500\t0.5111\t31\nchr9\t73386300\t73386600\t0.5078\t54\nchr9\t73835400\t73836300\t0.205\t69\nchr9\t73851900\t73852500\t0.3924\t72\nchr9\t74198400\t74198700\t0.196\t71\nchr9\t74258100\t74259900\t0.1414\t52\nchr9\t74346600\t74346900\t0.6986\t59\nchr9\t74426100\t74426700\t0.0495\t82\nchr9\t74427900\t74430300\t0.0495\t82\nchr9\t75204300\t75205800\t0.2401\t55\nchr9\t75341100\t75341400\t0.4777\t63\nchr9\t75417900\t75418200\t0.5539\t72\nchr9\t76063200\t76064700\t0.0105\t51\nchr9\t76175100\t76175400\t0.1739\t450\nchr9\t76306800\t76307100\t0.5461\t11\nchr9\t76509600\t76509900\t0.2385\t27\nchr9\t76671000\t76675800\t0.1018\t79\nchr9\t76791300\t76791600\t0.1685\t62\nchr9\t77371800\t77372100\t0.3527\t66\nchr9\t77398800\t77399100\t0.6278\t43\nchr9\t77682600\t77682900\t0.4876\t58\nchr9\t78652800\t78653100\t0.5997\t68\nchr9\t78738000\t78738300\t0.5057\t58\nchr9\t78789300\t78789600\t0.4954\t15\nchr9\t78864300\t78864600\t0.3609\t44\nchr9\t78875100\t78875400\t0.265\t42\nchr9\t78878100\t78878400\t0.4008\t49\nchr9\t79075500\t79076700\t0.2627\t80\nchr9\t79098000\t79098600\t0.026\t59\nchr9\t79099800\t79100400\t0.5293\t62\nchr9\t79110900\t79111200\t0.6229\t37\nchr9\t79177500\t79178700\t0.5082\t58\nchr9\t79181400\t79181700\t0.235\t54\nchr9\t79442400\t79443900\t0.3201\t68\nchr9\t79495800\t79498800\t0.1218\t69\nchr9\t79548000\t79548300\t0.348\t63\nchr9\t79853700\t79854000\t0.2236\t69\nchr9\t80230200\t80230500\t0.5328\t55\nchr9\t80251200\t80251800\t0.2519\t80\nchr9\t80545200\t80545500\t0.2524\t14\nchr9\t80611500\t80613000\t0.2727\t75\nchr9\t80656200\t80656500\t0.449\t69\nchr9\t80742900\t80744100\t0.0062\t81\nchr9\t81015600\t81015900\t0.3507\t25\nchr9\t81436800\t81437100\t0.3937\t78\nchr9\t81709500\t81711900\t0.0104\t90\nchr9\t81918600\t81948900\t0\t63\nchr9\t82420800\t82421100\t0.4199\t80\nchr9\t82753500\t82754400\t0.2635\t66\nchr9\t82755600\t82755900\t0.2635\t66\nchr9\t82770000\t82773300\t0.2724\t76\nchr9\t83049600\t83055300\t0.0011\t110\nchr9\t83223300\t83224800\t0.2252\t86\nchr9\t83226000\t83226900\t0.2252\t86\nchr9\t83273100\t83273400\t0.6302\t85\nchr9\t83821200\t83822100\t0\t63\nchr9\t83826000\t83826900\t0.0171\t78\nchr9\t83843100\t83843400\t0.1933\t44\nchr9\t83900100\t83900700\t0.3731\t56\nchr9\t84167400\t84167700\t0.4367\t73\nchr9\t85074300\t85075200\t0.1191\t85\nchr9\t85165200\t85166100\t0.0118\t68\nchr9\t85195800\t85196100\t0.1604\t52\nchr9\t85780200\t85780500\t0.1632\t39\nchr9\t85811400\t85812300\t0.0136\t123\nchr9\t85828500\t85829100\t0.2727\t57\nchr9\t86107500\t86109600\t0\t64\nchr9\t86159400\t86160300\t0.1369\t76\nchr9\t86606100\t86609400\t0.1385\t78\nchr9\t87047100\t87047700\t0.3523\t90\nchr9\t87757500\t87757800\t0.3666\t64\nchr9\t87912900\t87919800\t0\t79\nchr9\t87923400\t87923700\t0.4888\t55\nchr9\t87926700\t87930000\t0.0005\t74\nchr9\t87933000\t87935400\t0.0145\t52\nchr9\t87939900\t87942000\t0.0126\t53\nchr9\t88110900\t88111200\t0.4756\t44\nchr9\t88112700\t88113000\t0.3361\t25\nchr9\t88117500\t88118100\t0.0275\t71\nchr9\t88119300\t88119900\t0.0275\t71\nchr9\t88123200\t88126200\t0.0506\t72\nchr9\t88129200\t88129500\t0.597\t62\nchr9\t88133100\t88135200\t0.0015\t79\nchr9\t88136700\t88140600\t0.0015\t79\nchr9\t88244100\t88245900\t0.007\t83\nchr9\t88375200\t88375500\t0.4366\t76\nchr9\t88625700\t88626900\t0.0029\t83\nchr9\t88958700\t88959000\t0.2668\t61\nchr9\t89161800\t89163300\t0.242\t81\nchr9\t89371800\t89372100\t0.6872\t36\nchr9\t90150000\t90155700\t0\t143\nchr9\t90416400\t90416700\t0.4542\t84\nchr9\t90884400\t90884700\t0.6566\t54\nchr9\t90935700\t90936000\t0.515\t69\nchr9\t91225800\t91230300\t0.0841\t97\nchr9\t91797000\t91798200\t0.0269\t63\nchr9\t92084100\t92086200\t0.2999\t81\nchr9\t92201700\t92202000\t0.5735\t38\nchr9\t92216400\t92218800\t0.1995\t84\nchr9\t92226900\t92227500\t0.0599\t107\nchr9\t92451900\t92452200\t0.3683\t78\nchr9\t92579100\t92579400\t0.111\t70\nchr9\t92830200\t92830500\t0.4073\t68\nchr9\t92899200\t92899500\t0.3767\t49\nchr9\t92901000\t92902500\t0.3795\t86\nchr9\t93335400\t93336300\t0.0203\t68\nchr9\t93515400\t93516000\t0.0359\t77\nchr9\t93740400\t93741000\t0.3126\t39\nchr9\t94089300\t94090800\t0.0413\t93\nchr9\t94092300\t94093800\t0.2456\t99\nchr9\t94113600\t94119600\t0\t124\nchr9\t94307700\t94308600\t0.0608\t72\nchr9\t94313100\t94313400\t0\t74\nchr9\t94314900\t94319400\t0\t74\nchr9\t94321500\t94321800\t0.2931\t66\nchr9\t94326900\t94329300\t0.0812\t66\nchr9\t94331100\t94331700\t0.058\t62\nchr9\t94332900\t94335300\t0.0558\t70\nchr9\t94338000\t94338600\t0.0367\t73\nchr9\t94340400\t94343100\t0.0367\t73\nchr9\t94344300\t94344600\t0.0367\t73\nchr9\t94345800\t94346700\t0.0367\t73\nchr9\t94347900\t94351500\t0\t77\nchr9\t94352700\t94353600\t0\t77\nchr9\t94354800\t94355100\t0.3468\t30\nchr9\t94356600\t94357500\t0.4355\t69\nchr9\t94362900\t94365900\t0.0255\t63\nchr9\t94373400\t94373700\t0.2853\t38\nchr9\t94375800\t94377000\t0.1794\t62\nchr9\t94378800\t94379100\t0.3737\t59\nchr9\t94380300\t94381200\t0.1808\t61\nchr9\t94392000\t94396200\t0.0363\t71\nchr9\t94398600\t94398900\t0.2349\t58\nchr9\t94405800\t94406100\t0.5194\t43\nchr9\t94411200\t94413000\t0.3126\t64\nchr9\t94437000\t94437900\t0.1684\t64\nchr9\t94530600\t94530900\t0.1437\t34\nchr9\t95503800\t95504100\t0.3832\t71\nchr9\t95697900\t95703600\t0\t84\nchr9\t96157800\t96158100\t0.5372\t89\nchr9\t96706800\t96707700\t0.1754\t59\nchr9\t96802200\t96802500\t0.2522\t87\nchr9\t96824100\t96825000\t0.3876\t72\nchr9\t96900300\t96900600\t0.6222\t64\nchr9\t96902400\t96902700\t0.304\t37\nchr9\t96903900\t96905100\t0.1786\t63\nchr9\t96906900\t96907200\t0.0017\t81\nchr9\t96908400\t96909300\t0.0017\t81\nchr9\t96914400\t96915000\t0.341\t63\nchr9\t96916800\t96919500\t0.038\t61\nchr9\t96921300\t96921600\t0.4557\t46\nchr9\t96922800\t96924600\t0.0806\t74\nchr9\t96925800\t96926400\t0.3425\t73\nchr9\t96928500\t96929100\t0.0124\t70\nchr9\t96930600\t96930900\t0.5399\t61\nchr9\t96936000\t96936300\t0.4048\t70\nchr9\t96938100\t96940200\t0\t97\nchr9\t96941700\t96942600\t0\t97\nchr9\t96947400\t96948300\t0.0511\t72\nchr9\t96950100\t96951000\t0.1184\t72\nchr9\t96975300\t96975600\t0.1974\t86\nchr9\t96976800\t96977100\t0.3164\t50\nchr9\t96989100\t96989400\t0.1243\t54\nchr9\t96993000\t96996000\t0.0963\t75\nchr9\t97006800\t97008000\t0.2146\t71\nchr9\t97012200\t97012500\t0.3979\t52\nchr9\t97022400\t97025400\t0.0999\t68\nchr9\t97195500\t97196700\t0.0326\t71\nchr9\t97197900\t97199100\t0.0326\t71\nchr9\t97209300\t97210800\t0.3866\t82\nchr9\t97582200\t97584000\t0.2024\t87\nchr9\t97586400\t97586700\t0.2024\t87\nchr9\t98214300\t98214600\t0.1431\t54\nchr9\t98266500\t98266800\t0.4078\t51\nchr9\t98514000\t98514300\t0.4393\t24\nchr9\t98681100\t98681400\t0.136\t33\nchr9\t99247200\t99247500\t0.4606\t100\nchr9\t99499800\t99502800\t0.0681\t96\nchr9\t99504000\t99504600\t0.0409\t60\nchr9\t99687300\t99687600\t0.5695\t32\nchr9\t99853500\t99855000\t0\t75\nchr9\t100528500\t100529700\t0.195\t83\nchr9\t100692000\t100693800\t0.0216\t84\nchr9\t100695300\t100696500\t0.2947\t89\nchr9\t100983300\t100986900\t0\t82\nchr9\t101102100\t101108100\t0\t77\nchr9\t101681700\t101682300\t0\t20\nchr9\t101831400\t101831700\t0.615\t66\nchr9\t102091800\t102092400\t0.2789\t96\nchr9\t102148200\t102149700\t0.169\t78\nchr9\t102151500\t102151800\t0.383\t75\nchr9\t102219600\t102219900\t0.3626\t107\nchr9\t102221700\t102222000\t0.4506\t60\nchr9\t102313500\t102313800\t0.609\t57\nchr9\t102363900\t102364200\t0.0169\t25\nchr9\t102400200\t102400500\t0.5829\t32\nchr9\t102790800\t102793800\t0.2045\t77\nchr9\t103046100\t103046400\t0.2061\t64\nchr9\t103162200\t103162500\t0.4638\t68\nchr9\t103239000\t103239900\t0.3592\t75\nchr9\t103356900\t103357200\t0.2872\t59\nchr9\t103370400\t103370700\t0.4429\t32\nchr9\t103739400\t103740300\t0.2758\t73\nchr9\t103947600\t103947900\t0.2739\t60\nchr9\t104012100\t104012400\t0.5505\t78\nchr9\t104061900\t104062500\t0.4157\t60\nchr9\t104324100\t104324400\t0.4189\t53\nchr9\t105354000\t105354300\t0.3646\t42\nchr9\t105372600\t105372900\t0.5375\t55\nchr9\t105490500\t105491100\t0.3996\t61\nchr9\t105526800\t105527400\t0.3047\t59\nchr9\t105576600\t105581100\t0.0276\t83\nchr9\t105631500\t105632100\t0.1683\t90\nchr9\t105762300\t105764100\t0.2572\t87\nchr9\t105778500\t105779400\t0.1524\t73\nchr9\t105781500\t105781800\t0.1524\t73\nchr9\t106183500\t106185000\t0.0838\t56\nchr9\t106212300\t106212900\t0.0295\t61\nchr9\t106319700\t106320000\t0.4509\t75\nchr9\t106407600\t106407900\t0.2845\t79\nchr9\t107027400\t107028000\t0.0259\t94\nchr9\t107256000\t107258400\t0\t74\nchr9\t107271300\t107273100\t0.0033\t64\nchr9\t107670600\t107670900\t0.3116\t33\nchr9\t107716800\t107717100\t0.6357\t13\nchr9\t107775300\t107778300\t0\t52\nchr9\t108502500\t108506700\t0.2168\t90\nchr9\t108594600\t108595200\t0.3048\t83\nchr9\t109668000\t109668300\t0.4807\t26\nchr9\t110232600\t110232900\t0.5628\t29\nchr9\t110412900\t110413500\t0.334\t84\nchr9\t110417100\t110423100\t0\t73\nchr9\t110791200\t110797200\t0\t88\nchr9\t111081000\t111081300\t0.502\t81\nchr9\t111200400\t111201300\t0.4017\t69\nchr9\t111318000\t111319500\t0.2362\t68\nchr9\t111640200\t111642600\t0.0573\t105\nchr9\t111669600\t111669900\t0.0867\t21\nchr9\t111875400\t111875700\t0.6738\t130\nchr9\t112513500\t112515900\t0.0049\t60\nchr9\t112798200\t112804200\t0\t90\nchr9\t113060400\t113090100\t0\t259\nchr9\t113105400\t113111700\t0\t80\nchr9\t113112900\t113119200\t0\t83\nchr9\t113250000\t113250300\t0.4698\t62\nchr9\t113267100\t113267400\t0.2401\t66\nchr9\t113333400\t113333700\t0.6532\t55\nchr9\t113439000\t113443500\t0.0019\t77\nchr9\t113900700\t113901000\t0.6115\t40\nchr9\t114322800\t114323100\t0.1977\t79\nchr9\t114326400\t114327600\t0.1214\t71\nchr9\t114329400\t114330000\t0.1838\t57\nchr9\t114333300\t114334500\t0.2484\t85\nchr9\t114944100\t114944400\t0.4083\t32\nchr9\t115069500\t115069800\t0.6011\t35\nchr9\t115347300\t115347600\t0.506\t29\nchr9\t115527600\t115528800\t0.1395\t68\nchr9\t115769100\t115770000\t0.0378\t92\nchr9\t115919400\t115919700\t0.1001\t78\nchr9\t117066900\t117071700\t0.0075\t81\nchr9\t118018500\t118018800\t0.5426\t50\nchr9\t119133900\t119134500\t0.102\t72\nchr9\t119170500\t119174700\t0.0206\t69\nchr9\t119621700\t119626500\t0.0007\t81\nchr9\t120055500\t120061200\t0\t113\nchr9\t120305400\t120305700\t0.341\t61\nchr9\t120494700\t120497400\t0.0254\t109\nchr9\t120552000\t120552300\t0.3653\t77\nchr9\t121416900\t121417800\t0.3337\t70\nchr9\t121419300\t121419600\t0.4293\t85\nchr9\t121429200\t121430100\t0.2981\t97\nchr9\t121971000\t121971600\t0.115\t42\nchr9\t122569800\t122570400\t0.337\t93\nchr9\t122595300\t122595600\t0.6021\t92\nchr9\t122627100\t122627700\t0.1288\t70\nchr9\t122765100\t122766300\t0.5521\t77\nchr9\t122866800\t122868000\t0.2346\t78\nchr9\t123293400\t123293700\t0.1833\t52\nchr9\t123404400\t123405900\t0.0201\t58\nchr9\t123905400\t123908700\t0.0344\t76\nchr9\t123976500\t123978900\t0\t64\nchr9\t123991200\t123993600\t0\t95\nchr9\t125328300\t125328900\t0.2278\t60\nchr9\t125623200\t125625300\t0.029\t85\nchr9\t125778600\t125779800\t0.0787\t72\nchr9\t126013200\t126014100\t0.2442\t75\nchr9\t126484500\t126485400\t0\t45\nchr9\t126951300\t126951600\t0.5015\t85\nchr9\t128138700\t128139000\t0.4487\t79\nchr9\t128795400\t128795700\t0.478\t99\nchr9\t130064100\t130064400\t0.6207\t44\nchr9\t130277700\t130278000\t0.2813\t117\nchr9\t130777500\t130778100\t0.3938\t67\nchr9\t131172000\t131172300\t0.3363\t73\nchr9\t131356800\t131357400\t0.0678\t77\nchr9\t132270000\t132270300\t0.5156\t66\nchr9\t132526500\t132529500\t0\t65\nchr9\t133019700\t133021200\t0.2898\t80\nchr9\t133062300\t133062600\t0.2877\t66\nchr9\t133068600\t133071600\t0.1435\t75\nchr9\t133082700\t133086300\t0\t75\nchr9\t133123800\t133124100\t0.6313\t59\nchr9\t133185300\t133185600\t0.1544\t30\nchr9\t133312800\t133315200\t0.2099\t92\nchr9\t133383300\t133383600\t0.6109\t105\nchr9\t133514100\t133514400\t0.0255\t26\nchr9\t133563900\t133564500\t0.4995\t63\nchr9\t133668900\t133669200\t0.4431\t18\nchr9\t133745100\t133745400\t0.2477\t68\nchr9\t133827300\t133828500\t0.2235\t32\nchr9\t134012100\t134014500\t0\t197\nchr9\t134092800\t134093100\t0.3418\t67\nchr9\t134114400\t134118900\t0\t69\nchr9\t134182800\t134183100\t0.631\t215\nchr9\t134466600\t134466900\t0.4041\t25\nchr9\t134475900\t134476500\t0.3245\t116\nchr9\t134481000\t134481300\t0.4184\t59\nchr9\t134550000\t134550300\t0.6467\t56\nchr9\t134586900\t134589000\t0.1683\t78\nchr9\t134644200\t134644500\t0.5486\t25\nchr9\t134729400\t134730000\t0.4115\t66\nchr9\t134865900\t134867400\t0.1875\t71\nchr9\t135528000\t135528300\t0.3769\t64\nchr9\t135541800\t135542100\t0.4222\t52\nchr9\t135549000\t135549300\t0.6495\t42\nchr9\t135981600\t135982200\t0.3109\t49\nchr9\t136101600\t136101900\t0.3093\t67\nchr9\t136355100\t136355400\t0.0271\t25\nchr9\t136580100\t136581300\t0.0357\t57\nchr9\t136696800\t136697100\t0.4528\t11\nchr9\t136802700\t136803300\t0.1716\t100\nchr9\t137049900\t137050200\t0.6224\t105\nchr9\t137145000\t137145300\t0.4893\t19\nchr9\t137288400\t137289000\t0.2844\t51\nchr9\t137322600\t137323500\t0.1391\t57\nchr9\t137327700\t137329800\t0.3897\t393\nchr9\t137341800\t137342400\t0.4446\t56\nchr9\t137355300\t137355600\t0.5907\t174\nchr9\t137379000\t137379600\t0.5256\t167\nchr9\t137394300\t137394600\t0.4836\t33\nchr9\t137451300\t137451600\t0.5686\t33\nchr9\t137503800\t137504100\t0.6751\t69\nchr9\t137517300\t137517600\t0.6777\t48\nchr9\t137525700\t137526000\t0.5178\t58\nchr9\t137565300\t137568600\t0.042\t71\nchr9\t137597400\t137597700\t0.2639\t45\nchr9\t137675700\t137676000\t0.42\t51\nchr9\t137693700\t137694000\t0.3613\t24\nchr9\t137715900\t137716500\t0.1242\t259\nchr9\t137719800\t137720100\t0.5426\t108\nchr9\t137722800\t137723400\t0.6669\t36\nchr9\t137818500\t137819700\t0.015\t86\nchr9\t137844900\t137846400\t0\t244\nchr9\t137874300\t137874600\t0.5826\t57\nchr9\t137884200\t137886000\t0.2862\t67\nchr9\t137887500\t137888100\t0.1619\t62\nchr9\t137976900\t137977500\t0.4754\t59\nchr9\t138018000\t138019500\t0\t54\nchr9\t138125400\t138127200\t0.4883\t70\nchr9\t138135600\t138136200\t0.3734\t61\nchr9\t138137700\t138138000\t0.4962\t64\nchr9\t138163200\t138163800\t0.1011\t64\nchr9\t138169800\t138170100\t0.3542\t45\nchr9\t138176100\t138176400\t0.6533\t51\nchr9\t138183900\t138188100\t0.0033\t73\nchr9\t138190800\t138196800\t0\t46\nchr9\t138204900\t138206100\t0.0011\t93\nchr9\t138209400\t138209700\t0.2554\t66\nchr9\t138213300\t138216900\t0\t252\nchr9\t138218100\t138334800\t0\t252\nchrX\t10200\t14400\t0\t46\nchrX\t16800\t19500\t0\t46\nchrX\t21000\t24600\t0\t33\nchrX\t94800\t95100\t0\t34\nchrX\t96300\t100200\t0\t34\nchrX\t222600\t228000\t0\t42\nchrX\t229500\t230100\t0.0351\t26\nchrX\t231300\t234900\t0.091\t46\nchrX\t236100\t236700\t0.091\t46\nchrX\t243900\t245400\t0.1335\t64\nchrX\t246900\t247200\t0.1335\t64\nchrX\t249900\t250800\t0.0036\t58\nchrX\t268200\t274800\t0.1001\t513\nchrX\t277800\t278100\t0.6067\t52\nchrX\t280500\t281100\t0.4785\t24\nchrX\t297000\t298800\t0.1506\t100\nchrX\t309900\t310200\t0.4935\t213\nchrX\t315600\t316200\t0.2671\t129\nchrX\t321300\t324000\t0.0965\t306\nchrX\t342300\t344100\t0.4381\t62\nchrX\t407100\t408600\t0.3387\t64\nchrX\t416700\t417000\t0.6921\t72\nchrX\t432600\t432900\t0.4625\t144\nchrX\t512100\t516000\t0.0585\t106\nchrX\t527100\t528600\t0.0145\t109\nchrX\t555000\t555600\t0.5119\t111\nchrX\t584100\t584400\t0.6747\t65\nchrX\t598500\t598800\t0.4125\t15\nchrX\t647100\t648300\t0.0118\t53\nchrX\t678600\t678900\t0.5705\t60\nchrX\t724800\t725400\t0.3145\t207\nchrX\t728700\t729300\t0.5268\t93\nchrX\t825300\t825600\t0.4511\t41\nchrX\t839400\t840600\t0.0734\t58\nchrX\t918300\t918900\t0.4865\t122\nchrX\t938700\t939000\t0.6108\t25\nchrX\t971400\t971700\t0.5391\t71\nchrX\t1048500\t1050000\t0.3474\t94\nchrX\t1127400\t1128900\t0.2277\t111\nchrX\t1143300\t1144200\t0.3474\t129\nchrX\t1146300\t1147200\t0.3375\t103\nchrX\t1173900\t1174800\t0.1663\t224\nchrX\t1263900\t1264500\t0.0556\t74\nchrX\t1296600\t1298700\t0.1405\t94\nchrX\t1360800\t1361100\t0.6944\t62\nchrX\t1365600\t1367100\t0.5642\t21\nchrX\t1368900\t1376700\t0\t68\nchrX\t1409700\t1410300\t0\t25\nchrX\t1453800\t1454100\t0.4585\t34\nchrX\t1489800\t1490100\t0.3792\t74\nchrX\t1641000\t1641300\t0.3159\t13\nchrX\t1696800\t1698900\t0.0735\t57\nchrX\t1705800\t1706400\t0.2726\t60\nchrX\t1708200\t1708800\t0.2726\t60\nchrX\t1735800\t1736100\t0.4273\t52\nchrX\t1763700\t1764900\t0.2162\t28\nchrX\t1855800\t1856400\t0.1546\t64\nchrX\t1887600\t1888500\t0.1661\t108\nchrX\t1947600\t1949400\t0\t39\nchrX\t2133000\t2134800\t0\t33\nchrX\t2186700\t2187000\t0.6266\t166\nchrX\t2214000\t2214300\t0.4618\t22\nchrX\t2227800\t2228400\t0.2219\t28\nchrX\t2265000\t2265300\t0.6554\t55\nchrX\t2277000\t2277600\t0.293\t19\nchrX\t2296500\t2296800\t0.6293\t43\nchrX\t2314200\t2314500\t0.5868\t77\nchrX\t2362800\t2363400\t0.3709\t59\nchrX\t2382300\t2382900\t0.4872\t271\nchrX\t2773500\t2773800\t0.2276\t37\nchrX\t2845200\t2845500\t0.0508\t19\nchrX\t3524400\t3525000\t0.3362\t216\nchrX\t3554700\t3555000\t0.4794\t85\nchrX\t3557700\t3558600\t0.3978\t34\nchrX\t3641700\t3642000\t0.1933\t34\nchrX\t3702600\t3702900\t0.2562\t32\nchrX\t3823800\t3824700\t0.0158\t26\nchrX\t3830400\t3837900\t0\t35\nchrX\t3839100\t3842400\t0\t34\nchrX\t3843600\t3866700\t0\t40\nchrX\t3867900\t3880800\t0\t40\nchrX\t3882000\t3937500\t0\t40\nchrX\t3966900\t3968400\t0\t66\nchrX\t4267200\t4267500\t0.1625\t26\nchrX\t4608900\t4609200\t0.6076\t15\nchrX\t4681800\t4682100\t0.3092\t13\nchrX\t4986600\t4986900\t0.325\t22\nchrX\t5107800\t5109000\t0.0046\t53\nchrX\t5481300\t5486400\t0.0255\t49\nchrX\t5652300\t5652600\t0.0411\t15\nchrX\t5669700\t5670000\t0.2126\t11\nchrX\t5764800\t5766000\t0.1374\t53\nchrX\t5790000\t5790300\t0.6305\t10\nchrX\t5814900\t5817000\t0.0103\t67\nchrX\t6273300\t6273600\t0.4019\t28\nchrX\t6447600\t6447900\t0.4556\t30\nchrX\t6480600\t6481200\t0.3235\t46\nchrX\t6528000\t6529800\t0.1405\t36\nchrX\t6532800\t6534600\t0.1014\t43\nchrX\t6584100\t6588900\t0\t62\nchrX\t6934500\t6938400\t0.007\t64\nchrX\t7491300\t7491600\t0.4922\t36\nchrX\t7589100\t7592100\t0.0365\t118\nchrX\t7608000\t7608300\t0.135\t52\nchrX\t7842900\t7844400\t0.4499\t26\nchrX\t7848600\t7850400\t0.1013\t39\nchrX\t8169300\t8171100\t0.0883\t55\nchrX\t8465100\t8467500\t0.1441\t41\nchrX\t8541600\t8541900\t0.376\t24\nchrX\t8992200\t8992500\t0.6052\t28\nchrX\t9052800\t9053100\t0.2161\t26\nchrX\t9054600\t9054900\t0.1274\t30\nchrX\t9082200\t9082500\t0.675\t17\nchrX\t9404700\t9405600\t0.4719\t89\nchrX\t9406800\t9410400\t0.2624\t89\nchrX\t9412200\t9414000\t0.4398\t83\nchrX\t10249800\t10250400\t0.1978\t49\nchrX\t10668900\t10669200\t0.4942\t33\nchrX\t10805400\t10805700\t0.4985\t36\nchrX\t10880100\t10880400\t0.0595\t14\nchrX\t10967100\t10967700\t0.2436\t39\nchrX\t10975500\t10975800\t0.3731\t28\nchrX\t11000100\t11002200\t0.0923\t57\nchrX\t11078400\t11078700\t0.3202\t19\nchrX\t11218800\t11220000\t0.08\t69\nchrX\t11390400\t11390700\t0.4111\t48\nchrX\t11518800\t11519400\t0.3545\t41\nchrX\t11574300\t11574600\t0.2569\t47\nchrX\t11660400\t11660700\t0.5699\t28\nchrX\t11674800\t11675100\t0.3935\t27\nchrX\t11707200\t11713200\t0\t99\nchrX\t11842200\t11842800\t0.2064\t47\nchrX\t11845500\t11845800\t0.4753\t45\nchrX\t11935200\t11941500\t0\t84\nchrX\t12005400\t12005700\t0.4387\t34\nchrX\t12276900\t12277200\t0.3366\t50\nchrX\t12560700\t12561000\t0.1427\t35\nchrX\t12621900\t12623700\t0.002\t15\nchrX\t12857400\t12857700\t0.2644\t45\nchrX\t12927000\t12928800\t0.1754\t62\nchrX\t13612200\t13612500\t0.1553\t40\nchrX\t13674300\t13674900\t0.3802\t42\nchrX\t13683000\t13683300\t0.4855\t35\nchrX\t13881600\t13883700\t0\t21\nchrX\t14085300\t14085900\t0.1188\t44\nchrX\t14104500\t14108400\t0.1727\t56\nchrX\t14286600\t14286900\t0.3537\t50\nchrX\t14812200\t14813100\t0.2973\t46\nchrX\t15000000\t15000300\t0.4629\t39\nchrX\t15030000\t15030900\t0.2747\t66\nchrX\t15092400\t15092700\t0.2693\t41\nchrX\t15433500\t15434100\t0.5951\t23\nchrX\t15647400\t15648000\t0.0421\t37\nchrX\t15703800\t15704400\t0.0702\t30\nchrX\t16230900\t16232400\t0.2652\t46\nchrX\t16234200\t16235100\t0.0383\t54\nchrX\t16260900\t16261200\t0.3441\t16\nchrX\t16323600\t16324200\t0.0116\t42\nchrX\t16325400\t16325700\t0.1524\t74\nchrX\t16326900\t16327200\t0.1524\t74\nchrX\t16336500\t16338000\t0.2195\t56\nchrX\t16362300\t16362600\t0.2103\t44\nchrX\t16364400\t16364700\t0.2103\t44\nchrX\t16377600\t16378500\t0\t29\nchrX\t16409700\t16410000\t0\t25\nchrX\t16499400\t16499700\t0.1259\t66\nchrX\t16501800\t16503300\t0.1259\t66\nchrX\t16596600\t16598100\t0.2612\t63\nchrX\t16672800\t16673100\t0.3542\t26\nchrX\t16964700\t16965300\t0.5655\t30\nchrX\t16968300\t16968600\t0.6138\t40\nchrX\t16999800\t17000100\t0.4049\t35\nchrX\t17055000\t17055900\t0.0905\t57\nchrX\t17096400\t17096700\t0.3088\t31\nchrX\t17118000\t17118300\t0.4892\t39\nchrX\t17184300\t17184600\t0.2167\t50\nchrX\t17231400\t17234100\t0.2736\t68\nchrX\t17319300\t17320500\t0.0023\t48\nchrX\t17342700\t17347200\t0.0969\t74\nchrX\t17502600\t17502900\t0.3323\t36\nchrX\t17737200\t17737500\t0.0802\t169\nchrX\t17761200\t17761500\t0.3363\t34\nchrX\t17763300\t17763600\t0.4488\t31\nchrX\t17784000\t17784600\t0.3489\t49\nchrX\t18105000\t18105300\t0.4688\t55\nchrX\t18106500\t18108600\t0.0239\t87\nchrX\t18109800\t18110700\t0.0239\t87\nchrX\t18233100\t18233400\t0.3124\t31\nchrX\t18234900\t18235200\t0.4726\t36\nchrX\t18237600\t18237900\t0.4357\t34\nchrX\t18531600\t18531900\t0.5173\t25\nchrX\t18863100\t18863400\t0.5649\t46\nchrX\t19143300\t19148700\t0\t84\nchrX\t19236600\t19236900\t0.6896\t21\nchrX\t19243200\t19243500\t0.3942\t35\nchrX\t19452000\t19452300\t0.4813\t16\nchrX\t19780200\t19780500\t0.301\t35\nchrX\t19887600\t19887900\t0.3264\t40\nchrX\t19941600\t19946100\t0\t72\nchrX\t20127000\t20127300\t0.5389\t34\nchrX\t20335500\t20337000\t0.0322\t60\nchrX\t20416500\t20416800\t0.1372\t49\nchrX\t20506200\t20506500\t0.4326\t28\nchrX\t20649900\t20650200\t0.5252\t42\nchrX\t20673900\t20674200\t0.5558\t23\nchrX\t20704500\t20704800\t0.2546\t50\nchrX\t20723400\t20724600\t0.1181\t46\nchrX\t20784600\t20784900\t0.2787\t45\nchrX\t20812200\t20812500\t0.3961\t51\nchrX\t21099600\t21099900\t0.4092\t34\nchrX\t21264300\t21264600\t0.4242\t39\nchrX\t22613400\t22614000\t0.221\t36\nchrX\t22658700\t22660800\t0.2413\t67\nchrX\t23076300\t23077500\t0.2001\t39\nchrX\t23238600\t23244600\t0\t73\nchrX\t23457900\t23458200\t0.4335\t37\nchrX\t23517000\t23517300\t0.6408\t32\nchrX\t23530800\t23531100\t0.5325\t30\nchrX\t23887200\t23887500\t0.3274\t66\nchrX\t23973000\t23974500\t0\t36\nchrX\t24043500\t24043800\t0.1102\t41\nchrX\t24045900\t24046200\t0.6236\t33\nchrX\t24053100\t24053400\t0.1093\t42\nchrX\t24083100\t24083700\t0.5104\t26\nchrX\t24134100\t24135900\t0\t37\nchrX\t24274500\t24275100\t0.4326\t20\nchrX\t24312900\t24313200\t0.3478\t38\nchrX\t24336900\t24337500\t0.3642\t45\nchrX\t24363000\t24363300\t0.366\t27\nchrX\t24708300\t24710100\t0.0224\t96\nchrX\t24805800\t24806100\t0.6619\t19\nchrX\t25702800\t25703100\t0.3964\t24\nchrX\t25815000\t25815300\t0.6316\t25\nchrX\t25824300\t25824600\t0.0766\t11\nchrX\t25929900\t25930200\t0.2294\t14\nchrX\t26113500\t26113800\t0.4219\t43\nchrX\t26163000\t26163300\t0.4393\t38\nchrX\t26179800\t26180400\t0.3984\t43\nchrX\t26196300\t26196600\t0.286\t36\nchrX\t26313900\t26320500\t0\t104\nchrX\t26423100\t26423400\t0.4452\t49\nchrX\t26490300\t26490600\t0.514\t50\nchrX\t26686500\t26686800\t0.444\t49\nchrX\t26867400\t26868000\t0.5052\t40\nchrX\t27109500\t27110400\t0.0159\t60\nchrX\t27157500\t27158100\t0.6594\t40\nchrX\t27226200\t27227100\t0.1976\t56\nchrX\t27323100\t27323400\t0.2938\t55\nchrX\t27514500\t27514800\t0.4608\t31\nchrX\t27927600\t27928200\t0.0764\t50\nchrX\t28095300\t28095600\t0.2468\t34\nchrX\t28206900\t28212600\t0.0012\t77\nchrX\t28230000\t28230300\t0.0338\t96\nchrX\t28727400\t28727700\t0.4176\t30\nchrX\t28950000\t28951200\t0.1399\t52\nchrX\t28956600\t28956900\t0.3029\t54\nchrX\t29332200\t29334900\t0.0481\t128\nchrX\t29356200\t29356500\t0.0794\t449\nchrX\t29582400\t29583900\t0.004\t61\nchrX\t29916000\t29916300\t0.3013\t65\nchrX\t29981700\t29982000\t0.3661\t45\nchrX\t29984100\t29986500\t0.2868\t60\nchrX\t30018900\t30019200\t0.0269\t24\nchrX\t30324000\t30324300\t0.4356\t48\nchrX\t30325500\t30325800\t0.554\t74\nchrX\t30545400\t30546000\t0.3506\t38\nchrX\t30599700\t30603900\t0.2009\t63\nchrX\t30770400\t30771600\t0.2449\t52\nchrX\t30873300\t30873600\t0.3142\t40\nchrX\t31067100\t31067400\t0.6584\t37\nchrX\t31080000\t31080600\t0.4067\t60\nchrX\t31184400\t31185000\t0.269\t33\nchrX\t31190400\t31190700\t0.4196\t37\nchrX\t31227900\t31228200\t0.4466\t36\nchrX\t31374000\t31374300\t0.4459\t42\nchrX\t31511700\t31513500\t0.2293\t49\nchrX\t31530600\t31535700\t0\t64\nchrX\t31749600\t31750500\t0.4086\t55\nchrX\t31798200\t31798500\t0.1544\t109\nchrX\t31897500\t31897800\t0.0938\t54\nchrX\t32244300\t32246700\t0.1308\t60\nchrX\t32400600\t32400900\t0.4249\t44\nchrX\t32486700\t32487000\t0.4187\t35\nchrX\t32733600\t32733900\t0.3304\t58\nchrX\t33190500\t33190800\t0.0069\t20\nchrX\t33304500\t33305100\t0.3744\t38\nchrX\t33524100\t33524400\t0.4986\t25\nchrX\t34248300\t34253100\t0.0073\t53\nchrX\t34415700\t34416300\t0.0839\t47\nchrX\t34417500\t34419300\t0.0839\t47\nchrX\t34819500\t34820700\t0.2006\t47\nchrX\t35222100\t35222700\t0.2254\t57\nchrX\t35314800\t35317200\t0.0184\t61\nchrX\t35916900\t35917200\t0.2675\t37\nchrX\t35939400\t35940000\t0.2007\t45\nchrX\t36170700\t36171000\t0.1989\t58\nchrX\t36172200\t36172500\t0.1989\t58\nchrX\t36174600\t36175200\t0.1989\t58\nchrX\t36229800\t36231600\t0.4764\t45\nchrX\t36234000\t36234300\t0.3699\t48\nchrX\t36298200\t36298500\t0.4519\t36\nchrX\t36465300\t36470700\t0.0193\t70\nchrX\t36986700\t36988800\t0.0352\t36\nchrX\t36998100\t36999300\t0.0142\t35\nchrX\t37038600\t37039200\t0.4438\t43\nchrX\t37056600\t37056900\t0.5626\t34\nchrX\t37085100\t37099200\t0\t42\nchrX\t37399200\t37399800\t0.4478\t60\nchrX\t37516500\t37517400\t0.3402\t29\nchrX\t37554300\t37555800\t0.0144\t40\nchrX\t37569300\t37571400\t0.0062\t38\nchrX\t37630500\t37630800\t0.3764\t57\nchrX\t38521500\t38521800\t0.4242\t28\nchrX\t38535300\t38536500\t0.2134\t62\nchrX\t38604000\t38604300\t0.2844\t45\nchrX\t38605500\t38606100\t0.2844\t45\nchrX\t39097800\t39098100\t0.6149\t42\nchrX\t39130800\t39131100\t0.3917\t42\nchrX\t39715200\t39715500\t0.2932\t37\nchrX\t40110600\t40110900\t0.182\t127\nchrX\t40210800\t40211100\t0.3716\t51\nchrX\t40499400\t40499700\t0.6793\t18\nchrX\t40557300\t40557600\t0.5062\t17\nchrX\t40645800\t40646100\t0.5085\t18\nchrX\t41282100\t41282400\t0.5259\t47\nchrX\t41427300\t41428200\t0.0585\t49\nchrX\t41613300\t41613600\t0.1955\t58\nchrX\t41775000\t41775300\t0.4993\t39\nchrX\t42006900\t42007200\t0.3438\t42\nchrX\t42202500\t42205500\t0.0239\t78\nchrX\t42425700\t42428100\t0.1128\t61\nchrX\t42473400\t42474900\t0.125\t52\nchrX\t42564600\t42564900\t0.367\t50\nchrX\t42652800\t42653100\t0\t33\nchrX\t42888900\t42894300\t0\t89\nchrX\t42912900\t42913200\t0.5758\t28\nchrX\t43304400\t43311900\t0\t294\nchrX\t43574700\t43575300\t0.2384\t46\nchrX\t43588500\t43589400\t0.0779\t30\nchrX\t43671000\t43671900\t0.0757\t61\nchrX\t43674000\t43674900\t0.0757\t61\nchrX\t43809900\t43810200\t0.5291\t38\nchrX\t43989300\t43990200\t0\t36\nchrX\t43992600\t43993500\t0.0072\t42\nchrX\t44282400\t44282700\t0.1779\t78\nchrX\t44441100\t44441400\t0\t15\nchrX\t44443800\t44445900\t0.0165\t21\nchrX\t44601300\t44601900\t0.5527\t29\nchrX\t45039600\t45042000\t0.0774\t94\nchrX\t45108600\t45108900\t0.2553\t52\nchrX\t45589800\t45590100\t0.0756\t31\nchrX\t45604500\t45604800\t0.5503\t30\nchrX\t45687900\t45688800\t0\t36\nchrX\t45691500\t45692400\t0\t36\nchrX\t45942900\t45943200\t0.4218\t30\nchrX\t46275600\t46275900\t0.476\t53\nchrX\t46394700\t46395000\t0.3049\t33\nchrX\t46473000\t46473300\t0.4666\t28\nchrX\t46509300\t46509900\t0.2775\t47\nchrX\t46656000\t46661100\t0.1145\t66\nchrX\t47036400\t47037000\t0.0988\t69\nchrX\t47073000\t47073300\t0.4026\t41\nchrX\t47148600\t47148900\t0.3262\t13\nchrX\t47267400\t47267700\t0.4196\t49\nchrX\t47327100\t47327700\t0.1316\t22\nchrX\t47469000\t47469300\t0.4834\t26\nchrX\t47509800\t47512500\t0.1013\t37\nchrX\t47669400\t47669700\t0.1814\t60\nchrX\t47784000\t47787600\t0\t80\nchrX\t47789100\t47791800\t0.0087\t73\nchrX\t47903100\t47904000\t0.1325\t75\nchrX\t47906100\t47907600\t0.2386\t31\nchrX\t48004500\t48012000\t0\t42\nchrX\t48013200\t48015600\t0.0331\t38\nchrX\t48017700\t48020100\t0\t36\nchrX\t48039900\t48040500\t0.4696\t39\nchrX\t48091800\t48092700\t0\t35\nchrX\t48095100\t48096000\t0\t31\nchrX\t48127200\t48138000\t0\t53\nchrX\t48140400\t48142500\t0.1644\t50\nchrX\t48172800\t48173400\t0.2391\t52\nchrX\t48198900\t48199200\t0.2169\t25\nchrX\t48232500\t48233700\t0.0795\t55\nchrX\t48259800\t48260100\t0.1437\t30\nchrX\t48308400\t48308700\t0.1829\t27\nchrX\t48320100\t48320400\t0.3062\t28\nchrX\t48339000\t48339300\t0.3102\t24\nchrX\t48367500\t48396300\t0\t54\nchrX\t48399300\t48427800\t0\t43\nchrX\t48659100\t48659400\t0.3907\t58\nchrX\t49009500\t49009800\t0.4509\t56\nchrX\t49011000\t49011300\t0.4509\t56\nchrX\t49305300\t49305600\t0.3392\t63\nchrX\t49317600\t49348500\t0\t150\nchrX\t49528500\t49590000\t0\t165\nchrX\t49591800\t49604100\t0\t138\nchrX\t49620900\t49621200\t0.5069\t49\nchrX\t49623000\t49623300\t0.5784\t50\nchrX\t49781100\t49781400\t0.4712\t24\nchrX\t49814100\t49814400\t0.4162\t48\nchrX\t49942800\t49943700\t0.2818\t41\nchrX\t49966500\t49968900\t0\t83\nchrX\t50019300\t50025600\t0\t91\nchrX\t50057400\t50057700\t0.0714\t61\nchrX\t50060100\t50065800\t0\t80\nchrX\t50144700\t50145000\t0.5579\t20\nchrX\t50175600\t50175900\t0.3784\t51\nchrX\t50296200\t50296800\t0.1\t40\nchrX\t50739600\t50740200\t0.0623\t33\nchrX\t50761800\t50762100\t0.3459\t57\nchrX\t50990700\t50991900\t0\t29\nchrX\t51033000\t51033600\t0.0463\t33\nchrX\t51079800\t51081000\t0\t40\nchrX\t51111300\t51112800\t0.0116\t79\nchrX\t51114600\t51117600\t0.0116\t79\nchrX\t51160500\t51161100\t0.5268\t34\nchrX\t51202200\t51202500\t0.4724\t36\nchrX\t51217800\t51218100\t0.5227\t55\nchrX\t51246900\t51248400\t0.3004\t62\nchrX\t51260400\t51261300\t0.2384\t53\nchrX\t51264300\t51264600\t0.2474\t47\nchrX\t51265800\t51267300\t0.0795\t68\nchrX\t51280500\t51280800\t0.2413\t54\nchrX\t51429300\t51429900\t0.0113\t39\nchrX\t51498300\t51498600\t0.392\t33\nchrX\t51618000\t51618600\t0.0424\t25\nchrX\t51646200\t51646500\t0.4214\t49\nchrX\t51648600\t51648900\t0.1979\t69\nchrX\t51668100\t51693000\t0\t48\nchrX\t51700500\t51725100\t0\t46\nchrX\t51840900\t51841200\t0.5468\t38\nchrX\t51994200\t51994500\t0.4214\t50\nchrX\t52020600\t52020900\t0.4717\t37\nchrX\t52041000\t52077000\t0\t44\nchrX\t52134300\t52134600\t0.349\t35\nchrX\t52176900\t52212900\t0\t45\nchrX\t52223400\t52226100\t0.0928\t66\nchrX\t52267200\t52268100\t0.0114\t19\nchrX\t52343700\t52344000\t0.5322\t32\nchrX\t52384200\t52384800\t0.2089\t58\nchrX\t52445100\t52445700\t0.0663\t39\nchrX\t52456200\t52461300\t0\t45\nchrX\t52473600\t52502100\t0\t75\nchrX\t52510800\t52539300\t0\t65\nchrX\t52644000\t52644600\t0\t28\nchrX\t52670400\t52788000\t0\t52\nchrX\t52789800\t52791300\t0.0047\t37\nchrX\t52799100\t52804200\t0.005\t42\nchrX\t52825800\t52827300\t0.2131\t38\nchrX\t52882800\t52920000\t0\t45\nchrX\t52935900\t52973400\t0\t46\nchrX\t53338200\t53339400\t0\t30\nchrX\t53504700\t53505000\t0.4589\t58\nchrX\t53524500\t53524800\t0.4314\t27\nchrX\t53577600\t53580000\t0.1103\t77\nchrX\t53597400\t53597700\t0.1834\t21\nchrX\t53698500\t53699700\t0.2476\t52\nchrX\t53722200\t53722500\t0.2803\t50\nchrX\t53760900\t53761200\t0.5305\t48\nchrX\t53769300\t53770500\t0.2188\t45\nchrX\t53772000\t53772600\t0.0088\t29\nchrX\t53788500\t53788800\t0.3117\t40\nchrX\t53967300\t53967900\t0.3283\t78\nchrX\t54065400\t54065700\t0.3998\t20\nchrX\t54078000\t54078300\t0.3908\t34\nchrX\t54102300\t54102900\t0.055\t29\nchrX\t54108900\t54109500\t0.0327\t35\nchrX\t54118800\t54124800\t0\t72\nchrX\t54572100\t54572700\t0.4137\t63\nchrX\t54764400\t54766800\t0.0428\t53\nchrX\t54768000\t54770100\t0.0428\t53\nchrX\t54789900\t54790200\t0.3342\t40\nchrX\t54823200\t54823500\t0.0576\t30\nchrX\t54828000\t54829800\t0.1133\t48\nchrX\t54967500\t54968400\t0\t45\nchrX\t54970500\t54971400\t0\t45\nchrX\t55036800\t55037100\t0.4127\t34\nchrX\t55077900\t55079700\t0\t42\nchrX\t55091700\t55093800\t0\t35\nchrX\t55271700\t55272000\t0.422\t32\nchrX\t55280700\t55281000\t0.5169\t43\nchrX\t55291500\t55291800\t0.4273\t37\nchrX\t55453800\t55480200\t0\t49\nchrX\t55493100\t55519500\t0\t44\nchrX\t55527900\t55528200\t0.5458\t33\nchrX\t55586700\t55587000\t0.2582\t32\nchrX\t55806600\t55807200\t0.1024\t67\nchrX\t56056500\t56056800\t0.3839\t25\nchrX\t56137200\t56137500\t0.2972\t43\nchrX\t56164200\t56165100\t0.14\t32\nchrX\t56189700\t56190000\t0.4802\t15\nchrX\t56432100\t56441100\t0\t41\nchrX\t56457000\t56457300\t0.387\t41\nchrX\t56695800\t56701800\t0\t89\nchrX\t56755800\t56756100\t0.4544\t29\nchrX\t56767800\t56781000\t0\t63\nchrX\t56915100\t56915400\t0.307\t32\nchrX\t57120300\t57120900\t0.1136\t31\nchrX\t57131100\t57131400\t0.4632\t36\nchrX\t57136200\t57136800\t0.1188\t32\nchrX\t57297600\t57298800\t0\t37\nchrX\t57325500\t57327000\t0.0059\t35\nchrX\t57335400\t57335700\t0.6845\t59\nchrX\t57438600\t57438900\t0.5979\t35\nchrX\t57594000\t57594300\t0.5938\t36\nchrX\t57800100\t57800700\t0.2019\t55\nchrX\t57851400\t57851700\t0.334\t56\nchrX\t57908400\t57908700\t0.4966\t31\nchrX\t58133400\t58135800\t0\t46\nchrX\t58394700\t58395000\t0.3074\t35\nchrX\t58465800\t58466100\t0.5191\t29\nchrX\t58467600\t58469100\t0.0173\t69\nchrX\t58480500\t58485300\t0\t49\nchrX\t58486500\t58487700\t0\t42\nchrX\t58493700\t58494600\t0\t40\nchrX\t58498800\t58506000\t0\t44\nchrX\t58518300\t58518600\t0.6084\t60\nchrX\t58537800\t58538100\t0\t115\nchrX\t58539300\t58555500\t0\t115\nchrX\t58606200\t58874700\t0\t196\nchrX\t58875900\t58935000\t0\t267\nchrX\t58936200\t58988700\t0\t267\nchrX\t58989900\t59144700\t0\t179\nchrX\t59145900\t59185800\t0\t107\nchrX\t59187600\t59189700\t0\t43\nchrX\t59190900\t59316600\t0\t205\nchrX\t59317800\t59327100\t0\t205\nchrX\t59329200\t59425200\t0\t229\nchrX\t59427000\t59457300\t0\t229\nchrX\t59458500\t59594400\t0\t229\nchrX\t59598600\t59666100\t0\t207\nchrX\t59667300\t59695500\t0\t207\nchrX\t59696700\t59735100\t0\t207\nchrX\t59736600\t59824200\t0\t207\nchrX\t59825400\t59889600\t0\t150\nchrX\t59891100\t59921400\t0\t232\nchrX\t59922600\t59961000\t0\t232\nchrX\t59962200\t60066600\t0\t405\nchrX\t60067800\t60153300\t0\t405\nchrX\t60154500\t60208800\t0\t114\nchrX\t60210300\t60264900\t0\t321\nchrX\t60266400\t60405000\t0\t321\nchrX\t60406200\t60483000\t0\t321\nchrX\t60484800\t60486600\t0\t321\nchrX\t60487800\t60774600\t0\t321\nchrX\t60776100\t60971100\t0\t321\nchrX\t60972300\t60987900\t0\t321\nchrX\t60989100\t61022400\t0\t321\nchrX\t61024800\t61203000\t0\t361\nchrX\t61204200\t61286100\t0\t361\nchrX\t61287300\t61368600\t0\t328\nchrX\t61369800\t61437300\t0\t328\nchrX\t61438800\t61467300\t0\t328\nchrX\t61468500\t61511400\t0\t328\nchrX\t61513800\t61581900\t0\t328\nchrX\t61583100\t61738500\t0\t328\nchrX\t61739700\t61819800\t0\t328\nchrX\t61821300\t61862700\t0\t328\nchrX\t61863900\t61929600\t0\t328\nchrX\t61930800\t61955700\t0\t312\nchrX\t61956900\t61997700\t0\t312\nchrX\t61998900\t62159400\t0\t312\nchrX\t62160600\t62189100\t0\t312\nchrX\t62190300\t62247000\t0\t312\nchrX\t62248200\t62321700\t0\t222\nchrX\t62323200\t62412600\t0\t222\nchrX\t62462700\t62466000\t0\t240\nchrX\t62467200\t62488200\t0\t117\nchrX\t62489400\t62495700\t0\t117\nchrX\t62497800\t62499600\t0\t44\nchrX\t62500800\t62506200\t0\t44\nchrX\t62511000\t62511900\t0.4953\t113\nchrX\t62513100\t62514000\t0.6427\t129\nchrX\t62535300\t62535600\t0.6455\t50\nchrX\t62555100\t62555400\t0.5221\t73\nchrX\t62563200\t62564100\t0.493\t54\nchrX\t62565600\t62565900\t0.493\t54\nchrX\t62567100\t62568300\t0.5982\t60\nchrX\t62570700\t62571000\t0.3311\t86\nchrX\t62572500\t62573400\t0.3311\t86\nchrX\t62575200\t62575500\t0.5995\t59\nchrX\t62577300\t62577600\t0.6678\t47\nchrX\t62583600\t62587200\t0.5337\t72\nchrX\t62589300\t62589600\t0.6046\t65\nchrX\t62595600\t62596200\t0.6323\t77\nchrX\t62603100\t62603700\t0.2658\t22\nchrX\t62612700\t62613000\t0.5949\t61\nchrX\t62640300\t62640600\t0.6701\t52\nchrX\t62646900\t62648700\t0.433\t168\nchrX\t62661600\t62662200\t0.5919\t49\nchrX\t62671200\t62671500\t0.6825\t44\nchrX\t63062100\t63062700\t0.4062\t51\nchrX\t63129300\t63185400\t0\t47\nchrX\t63188700\t63190500\t0.0148\t67\nchrX\t63193500\t63249900\t0\t47\nchrX\t63319500\t63319800\t0.2815\t55\nchrX\t63393600\t63394200\t0.2914\t50\nchrX\t63518100\t63518400\t0.2184\t61\nchrX\t63597900\t63598800\t0.338\t42\nchrX\t63600900\t63601500\t0.338\t42\nchrX\t64013400\t64019100\t0.0418\t60\nchrX\t64110900\t64112400\t0.0033\t49\nchrX\t64114200\t64115100\t0.0033\t49\nchrX\t64134000\t64135200\t0.0029\t44\nchrX\t64254000\t64258500\t0\t91\nchrX\t64296900\t64300800\t0.1922\t54\nchrX\t64516500\t64519200\t0.0195\t58\nchrX\t64649100\t64649700\t0.4107\t42\nchrX\t65002500\t65003100\t0.3959\t45\nchrX\t65189100\t65189400\t0.1918\t52\nchrX\t65190900\t65191500\t0.1918\t52\nchrX\t65207700\t65211300\t0\t83\nchrX\t65383800\t65384400\t0.2453\t55\nchrX\t65456400\t65458200\t0.1056\t66\nchrX\t65614800\t65617800\t0.0603\t65\nchrX\t65619000\t65619600\t0.379\t50\nchrX\t65824800\t65825100\t0.3658\t47\nchrX\t65834100\t65834700\t0.1593\t43\nchrX\t65876700\t65877000\t0.3114\t42\nchrX\t66066900\t66067500\t0.016\t70\nchrX\t66080100\t66080700\t0.0984\t45\nchrX\t66137100\t66138300\t0.0109\t75\nchrX\t66180900\t66186300\t0\t87\nchrX\t66229800\t66231000\t0.2133\t48\nchrX\t66467100\t66467400\t0.6917\t30\nchrX\t66550200\t66550500\t0.4872\t21\nchrX\t66560100\t66560700\t0.1511\t36\nchrX\t66646500\t66646800\t0.1682\t54\nchrX\t66649200\t66649500\t0.6012\t53\nchrX\t66713700\t66715500\t0.3534\t46\nchrX\t66747300\t66747600\t0.1565\t37\nchrX\t66925500\t66926700\t0.2321\t45\nchrX\t66929100\t66930000\t0.2321\t45\nchrX\t66944400\t66944700\t0.4784\t53\nchrX\t66953400\t66954000\t0.0846\t75\nchrX\t66995100\t66995400\t0.6246\t21\nchrX\t67060200\t67060800\t0.068\t66\nchrX\t67169100\t67170300\t0\t55\nchrX\t67193400\t67193700\t0.3823\t49\nchrX\t67259100\t67259400\t0.4681\t55\nchrX\t67312800\t67313100\t0.5662\t36\nchrX\t67415100\t67415700\t0.3213\t430\nchrX\t67836300\t67836600\t0.3241\t39\nchrX\t68042700\t68043300\t0.0332\t54\nchrX\t68082900\t68083200\t0.449\t47\nchrX\t68170200\t68170500\t0.3205\t41\nchrX\t68217900\t68221500\t0.0222\t55\nchrX\t68325900\t68327700\t0.0088\t37\nchrX\t68379300\t68379600\t0.4205\t40\nchrX\t68394000\t68394300\t0.6587\t33\nchrX\t68475000\t68475300\t0.4572\t40\nchrX\t68630100\t68630400\t0.5712\t35\nchrX\t68652600\t68653800\t0.3235\t79\nchrX\t69057900\t69058200\t0.377\t47\nchrX\t69339000\t69339600\t0.3454\t47\nchrX\t69355200\t69355500\t0.3317\t66\nchrX\t69453900\t69454200\t0.3246\t51\nchrX\t69677100\t69677400\t0.1952\t57\nchrX\t69680400\t69680700\t0.1952\t57\nchrX\t69749100\t69749400\t0.0367\t50\nchrX\t69784200\t69786600\t0.1427\t44\nchrX\t69822900\t69826800\t0.0339\t54\nchrX\t69949800\t69951000\t0.09\t47\nchrX\t69982800\t69987000\t0\t85\nchrX\t70099500\t70104300\t0.0117\t74\nchrX\t70347600\t70347900\t0.4923\t31\nchrX\t70364400\t70364700\t0.2706\t46\nchrX\t70372200\t70372500\t0.4908\t58\nchrX\t70566000\t70566300\t0.3248\t42\nchrX\t70600500\t70603500\t0.0031\t63\nchrX\t70631700\t70632000\t0.0429\t31\nchrX\t70642500\t70644900\t0.011\t67\nchrX\t70679400\t70680600\t0.2979\t61\nchrX\t70716000\t70716300\t0.4278\t38\nchrX\t70728600\t70729200\t0.2831\t32\nchrX\t70748700\t70749000\t0.2471\t42\nchrX\t70938600\t70940100\t0.2148\t63\nchrX\t71340600\t71341200\t0.252\t53\nchrX\t71349600\t71352600\t0\t34\nchrX\t71414100\t71416200\t0\t41\nchrX\t71520600\t71523000\t0\t20\nchrX\t71591400\t71595000\t0.2089\t39\nchrX\t71683500\t71798100\t0\t49\nchrX\t71812500\t71812800\t0.4414\t32\nchrX\t71897400\t71897700\t0.2572\t34\nchrX\t71903400\t71903700\t0.0306\t27\nchrX\t72177900\t72180000\t0.0361\t88\nchrX\t72444600\t72445200\t0.3171\t49\nchrX\t72654900\t72655200\t0.6551\t19\nchrX\t72680700\t72683100\t0.0672\t70\nchrX\t72741600\t72741900\t0.525\t43\nchrX\t72743400\t72757200\t0\t61\nchrX\t72758400\t72962400\t0\t61\nchrX\t72963600\t72979200\t0\t61\nchrX\t72996300\t73005000\t0\t39\nchrX\t73009500\t73011900\t0\t64\nchrX\t73033200\t73033800\t0.1668\t47\nchrX\t73078200\t73086900\t0\t44\nchrX\t73106100\t73112700\t0\t94\nchrX\t73290900\t73292100\t0.0093\t65\nchrX\t73381200\t73387200\t0\t78\nchrX\t73512600\t73512900\t0.2213\t54\nchrX\t73516200\t73516800\t0.4403\t55\nchrX\t73599900\t73600500\t0.2428\t50\nchrX\t73604100\t73604400\t0.2855\t33\nchrX\t73642500\t73642800\t0.5978\t26\nchrX\t73887600\t73890600\t0.0605\t60\nchrX\t74166900\t74168100\t0.6103\t33\nchrX\t74568000\t74568300\t0.5476\t32\nchrX\t74661300\t74661600\t0.4214\t47\nchrX\t74790000\t74790300\t0.369\t37\nchrX\t74792100\t74794500\t0.1932\t60\nchrX\t74874000\t74874900\t0.2478\t45\nchrX\t74876400\t74877000\t0.3681\t45\nchrX\t74991000\t74992500\t0.0584\t87\nchrX\t75184200\t75184800\t0.4198\t45\nchrX\t75218400\t75218700\t0.1423\t58\nchrX\t75437400\t75437700\t0.2466\t39\nchrX\t75510600\t75513300\t0\t55\nchrX\t75537900\t75538500\t0.2908\t57\nchrX\t75541200\t75541500\t0.3482\t43\nchrX\t75590100\t75590700\t0.3679\t45\nchrX\t75677100\t75677400\t0.334\t38\nchrX\t76003200\t76007700\t0.0014\t51\nchrX\t76034100\t76034400\t0.141\t27\nchrX\t76057500\t76057800\t0.2355\t55\nchrX\t76070700\t76071000\t0.5098\t44\nchrX\t76074000\t76074300\t0.2244\t45\nchrX\t76092900\t76093200\t0.2199\t36\nchrX\t76113000\t76113300\t0.3491\t40\nchrX\t76141800\t76146000\t0\t42\nchrX\t76149300\t76153200\t0\t42\nchrX\t76217100\t76219200\t0.2403\t47\nchrX\t76270800\t76272300\t0.1092\t57\nchrX\t76277700\t76278000\t0.144\t44\nchrX\t76293000\t76293300\t0.1588\t54\nchrX\t76323000\t76327200\t0.0104\t84\nchrX\t76374600\t76376100\t0.1709\t45\nchrX\t76481400\t76481700\t0.3452\t57\nchrX\t76548000\t76548300\t0.4724\t29\nchrX\t76581900\t76582200\t0.1434\t24\nchrX\t76652400\t76652700\t0.4898\t51\nchrX\t76750500\t76750800\t0.5966\t28\nchrX\t76947300\t76947600\t0.4202\t39\nchrX\t76980300\t76980600\t0.4916\t49\nchrX\t76983900\t76984200\t0.6928\t44\nchrX\t77048400\t77048700\t0.6327\t48\nchrX\t77145300\t77145900\t0.2279\t31\nchrX\t77205000\t77208600\t0\t58\nchrX\t77246100\t77246700\t0.2049\t56\nchrX\t77247900\t77248200\t0.2988\t43\nchrX\t77278500\t77278800\t0.635\t30\nchrX\t77307300\t77307600\t0.1703\t25\nchrX\t77352000\t77352300\t0.5116\t42\nchrX\t78058200\t78059100\t0.2017\t48\nchrX\t78072300\t78072600\t0.5353\t29\nchrX\t78154200\t78154500\t0.385\t61\nchrX\t78172500\t78173100\t0.005\t35\nchrX\t78184200\t78184500\t0.4465\t61\nchrX\t78196500\t78197400\t0\t26\nchrX\t78229800\t78230700\t0.0694\t59\nchrX\t78269100\t78269400\t0.005\t14\nchrX\t78403200\t78404100\t0.2157\t56\nchrX\t78410700\t78411000\t0.4341\t46\nchrX\t78414000\t78414300\t0.2482\t33\nchrX\t78441300\t78441900\t0\t52\nchrX\t78853800\t78854400\t0.19\t62\nchrX\t79086000\t79086900\t0.0477\t50\nchrX\t79200300\t79200600\t0.2972\t50\nchrX\t79224300\t79224600\t0.1521\t43\nchrX\t79699500\t79699800\t0.4247\t22\nchrX\t79743300\t79743900\t0.2971\t77\nchrX\t79765800\t79770900\t0.0311\t63\nchrX\t79816800\t79817100\t0.6018\t12\nchrX\t79927800\t79928400\t0.067\t68\nchrX\t79930200\t79931700\t0.067\t68\nchrX\t80001600\t80001900\t0.4544\t35\nchrX\t80154300\t80154600\t0.306\t58\nchrX\t80187900\t80188200\t0.1358\t33\nchrX\t80384100\t80384400\t0.458\t24\nchrX\t80392500\t80392800\t0.3771\t28\nchrX\t80406300\t80407800\t0.0749\t68\nchrX\t80409600\t80410800\t0.0749\t68\nchrX\t80534100\t80536800\t0.0575\t57\nchrX\t80872200\t80872500\t0.1678\t34\nchrX\t80977200\t80978100\t0.1854\t53\nchrX\t81043500\t81043800\t0.358\t27\nchrX\t81066900\t81067500\t0.2296\t62\nchrX\t81591600\t81591900\t0.3267\t51\nchrX\t81734100\t81734400\t0.5369\t41\nchrX\t81810000\t81810300\t0.3535\t38\nchrX\t81832800\t81833100\t0.0762\t41\nchrX\t81841200\t81847200\t0\t71\nchrX\t81972600\t81973200\t0.1751\t61\nchrX\t81975900\t81976800\t0.1955\t54\nchrX\t82013100\t82013700\t0.196\t65\nchrX\t82119600\t82120200\t0.3519\t39\nchrX\t82160100\t82160400\t0.3745\t26\nchrX\t82491300\t82492800\t0.1387\t87\nchrX\t82546500\t82546800\t0.3819\t48\nchrX\t82713300\t82713600\t0.4392\t41\nchrX\t82856400\t82859100\t0.0035\t55\nchrX\t82903500\t82904100\t0.224\t46\nchrX\t83059500\t83065500\t0\t70\nchrX\t83316000\t83316300\t0.2889\t66\nchrX\t83396700\t83397000\t0.4152\t46\nchrX\t83542800\t83549100\t0\t61\nchrX\t83568300\t83568900\t0.2952\t42\nchrX\t83673600\t83673900\t0.3533\t36\nchrX\t83731500\t83731800\t0.2173\t41\nchrX\t83838000\t83838600\t0.1262\t71\nchrX\t83840100\t83843400\t0.1262\t71\nchrX\t83917500\t83918100\t0.2918\t44\nchrX\t84163500\t84163800\t0.3965\t17\nchrX\t84373800\t84375300\t0.4569\t46\nchrX\t84385200\t84385500\t0.521\t24\nchrX\t84435600\t84436200\t0.2376\t95\nchrX\t84604500\t84606000\t0.0495\t94\nchrX\t84817500\t84817800\t0.3899\t85\nchrX\t84858300\t84858900\t0.2536\t25\nchrX\t84871800\t84872100\t0.3733\t28\nchrX\t84993900\t84994500\t0.2496\t50\nchrX\t85060200\t85060500\t0.1954\t30\nchrX\t85095600\t85095900\t0.5822\t21\nchrX\t85254300\t85254600\t0.0712\t25\nchrX\t85321500\t85321800\t0.4766\t19\nchrX\t85422600\t85422900\t0.2953\t43\nchrX\t85425300\t85425600\t0.1569\t53\nchrX\t85529700\t85530000\t0.3172\t64\nchrX\t85531500\t85531800\t0.3172\t64\nchrX\t85533300\t85534200\t0.3172\t64\nchrX\t85892100\t85892400\t0.6855\t33\nchrX\t86074800\t86075400\t0.3538\t36\nchrX\t86114100\t86114700\t0.0396\t43\nchrX\t86116500\t86117700\t0.0396\t43\nchrX\t86289900\t86290200\t0.2795\t63\nchrX\t86294700\t86295000\t0.4156\t52\nchrX\t86350200\t86354700\t0\t73\nchrX\t86396100\t86396700\t0.3004\t46\nchrX\t86446500\t86449500\t0\t87\nchrX\t86557500\t86562000\t0\t74\nchrX\t86623800\t86624100\t0.4573\t23\nchrX\t86871300\t86871900\t0.3014\t31\nchrX\t86901000\t86901300\t0.6454\t24\nchrX\t86970600\t86973300\t0.0983\t62\nchrX\t87117300\t87120000\t0.0321\t45\nchrX\t87121200\t87122100\t0.0321\t45\nchrX\t87499500\t87500100\t0.1061\t34\nchrX\t87532500\t87532800\t0.3147\t44\nchrX\t87555600\t87555900\t0.3602\t46\nchrX\t87821400\t87827400\t0\t88\nchrX\t87828900\t87829500\t0.3472\t36\nchrX\t88033500\t88036500\t0.006\t73\nchrX\t88208700\t88209300\t0.2124\t69\nchrX\t88210500\t88210800\t0.2124\t69\nchrX\t88212600\t88213800\t0.2124\t69\nchrX\t88488000\t88488300\t0.4448\t24\nchrX\t88548600\t88548900\t0.3813\t37\nchrX\t88743000\t88743300\t0.5097\t30\nchrX\t88782300\t88783200\t0.2839\t69\nchrX\t88784400\t88784700\t0.2839\t69\nchrX\t89060700\t89061300\t0.3686\t47\nchrX\t89211600\t89212200\t0.224\t20\nchrX\t89229000\t89229600\t0.5629\t29\nchrX\t89245800\t89246100\t0.2036\t29\nchrX\t89256900\t89257200\t0.2686\t33\nchrX\t89274600\t89274900\t0.4966\t32\nchrX\t89280900\t89281200\t0.3759\t35\nchrX\t89284500\t89285400\t0.2304\t42\nchrX\t89287800\t89288100\t0.2304\t42\nchrX\t89290800\t89291100\t0.5153\t21\nchrX\t89294700\t89296500\t0.2741\t41\nchrX\t89297700\t89298000\t0.4245\t22\nchrX\t89299200\t89299500\t0.3972\t21\nchrX\t89306100\t89306700\t0.1978\t28\nchrX\t89316600\t89316900\t0.424\t17\nchrX\t89323200\t89323800\t0.0229\t29\nchrX\t89325600\t89325900\t0.3068\t31\nchrX\t89329500\t89330100\t0.413\t27\nchrX\t89341800\t89342100\t0.4366\t24\nchrX\t89343300\t89343600\t0.4366\t24\nchrX\t89353800\t89354100\t0.3483\t33\nchrX\t89357400\t89358000\t0.1686\t34\nchrX\t89364300\t89364600\t0.3728\t30\nchrX\t89368500\t89368800\t0.5442\t29\nchrX\t89376300\t89377800\t0.4214\t34\nchrX\t89386200\t89386500\t0.5432\t25\nchrX\t89390700\t89391000\t0.1996\t26\nchrX\t89396400\t89396700\t0.3963\t27\nchrX\t89399700\t89403600\t0.0572\t33\nchrX\t89406300\t89406600\t0.0466\t27\nchrX\t89408400\t89409000\t0.0466\t27\nchrX\t89415900\t89416500\t0.0365\t32\nchrX\t89422500\t89424000\t0.2199\t38\nchrX\t89426100\t89426400\t0.4065\t28\nchrX\t89428200\t89428500\t0.4348\t17\nchrX\t89431500\t89433000\t0.3985\t30\nchrX\t89434200\t89435400\t0.3985\t30\nchrX\t89437200\t89437500\t0.501\t27\nchrX\t89447100\t89448300\t0.1191\t28\nchrX\t89458200\t89458500\t0.212\t35\nchrX\t89459700\t89460000\t0.212\t35\nchrX\t89466900\t89467200\t0.2901\t28\nchrX\t89474400\t89474700\t0.6922\t11\nchrX\t89477400\t89477700\t0.115\t39\nchrX\t89479200\t89479500\t0.115\t39\nchrX\t89485800\t89486100\t0.6214\t14\nchrX\t89504100\t89505600\t0.1145\t44\nchrX\t89506800\t89507700\t0.1145\t44\nchrX\t89512500\t89514300\t0.2628\t29\nchrX\t89515500\t89517300\t0.3625\t36\nchrX\t89520900\t89521200\t0.4516\t35\nchrX\t89530200\t89530500\t0.4984\t31\nchrX\t89535300\t89536500\t0.2952\t29\nchrX\t89538000\t89538600\t0.4538\t23\nchrX\t89541000\t89541300\t0.4929\t21\nchrX\t89542500\t89544300\t0.1479\t25\nchrX\t89546100\t89547300\t0.1784\t29\nchrX\t89549400\t89550000\t0.4973\t39\nchrX\t89552700\t89553000\t0.5736\t35\nchrX\t89559000\t89561400\t0.1295\t33\nchrX\t89572500\t89574000\t0.1899\t30\nchrX\t89578500\t89578800\t0.3808\t24\nchrX\t89582100\t89582400\t0.1837\t30\nchrX\t89600700\t89601000\t0.5695\t27\nchrX\t89616000\t89616300\t0.6636\t19\nchrX\t89619300\t89619900\t0.0325\t33\nchrX\t89628000\t89628300\t0.5982\t13\nchrX\t89629800\t89630700\t0.175\t29\nchrX\t89636700\t89637000\t0.4813\t25\nchrX\t89641200\t89641500\t0.4471\t28\nchrX\t89643300\t89643600\t0.4951\t25\nchrX\t89655900\t89656200\t0.1173\t36\nchrX\t89659500\t89659800\t0.3262\t36\nchrX\t89664900\t89665500\t0.4122\t36\nchrX\t89678400\t89678700\t0.4802\t26\nchrX\t89685000\t89685600\t0.0164\t25\nchrX\t89693100\t89693400\t0.2345\t39\nchrX\t89707200\t89708700\t0.0181\t31\nchrX\t89709900\t89711100\t0.0872\t32\nchrX\t89720400\t89723100\t0.3498\t31\nchrX\t89726100\t89726400\t0.3831\t22\nchrX\t89729400\t89730000\t0.1111\t27\nchrX\t89745000\t89745300\t0.4157\t24\nchrX\t89767800\t89768400\t0.3934\t36\nchrX\t89773200\t89775600\t0.1285\t35\nchrX\t89778000\t89778300\t0.3227\t29\nchrX\t89782500\t89782800\t0.2818\t28\nchrX\t89788500\t89790000\t0.4636\t30\nchrX\t89791800\t89792100\t0.5685\t26\nchrX\t89796300\t89796600\t0.274\t29\nchrX\t89802000\t89802300\t0.1118\t37\nchrX\t89816100\t89816400\t0.3455\t31\nchrX\t89818200\t89818500\t0.3499\t29\nchrX\t89828400\t89829000\t0.0897\t30\nchrX\t89830500\t89830800\t0.0897\t30\nchrX\t89848200\t89851800\t0\t31\nchrX\t89853300\t89853600\t0.2933\t28\nchrX\t89856000\t89856600\t0.0712\t31\nchrX\t89859600\t89859900\t0.4273\t26\nchrX\t89872200\t89872500\t0.2514\t31\nchrX\t89877300\t89877600\t0.3892\t28\nchrX\t89881200\t89881500\t0.1886\t33\nchrX\t89883000\t89885400\t0.1886\t33\nchrX\t89889000\t89889600\t0.386\t35\nchrX\t89892900\t89893500\t0.3524\t27\nchrX\t89898900\t89899200\t0.3105\t31\nchrX\t89908500\t89910600\t0.3649\t27\nchrX\t89914500\t89914800\t0.0907\t27\nchrX\t89916300\t89916600\t0.0907\t27\nchrX\t89924100\t89924400\t0.3874\t21\nchrX\t89927700\t89928900\t0.3103\t23\nchrX\t89933100\t89933400\t0.3809\t55\nchrX\t89936700\t89937000\t0.3884\t33\nchrX\t89946600\t89947500\t0.2743\t31\nchrX\t89960400\t89960700\t0.4848\t36\nchrX\t89973000\t89973300\t0.5296\t26\nchrX\t89976000\t89976300\t0.2273\t31\nchrX\t89987700\t89988000\t0.3175\t33\nchrX\t89991300\t89991600\t0.0923\t40\nchrX\t89993100\t89995500\t0.0923\t40\nchrX\t90001200\t90001800\t0.3256\t27\nchrX\t90004200\t90004500\t0.327\t32\nchrX\t90096600\t90096900\t0.3415\t25\nchrX\t90102300\t90103200\t0.3273\t33\nchrX\t90123900\t90124800\t0.223\t26\nchrX\t90128700\t90129600\t0.1099\t26\nchrX\t90132900\t90133200\t0.1829\t11\nchrX\t90138000\t90138300\t0.0841\t33\nchrX\t90144300\t90144600\t0.15\t13\nchrX\t90145800\t90146400\t0.0119\t38\nchrX\t90150300\t90150600\t0.1308\t31\nchrX\t90179400\t90179700\t0.033\t23\nchrX\t90182100\t90182400\t0.2378\t29\nchrX\t90186300\t90186900\t0.0853\t34\nchrX\t90218700\t90221100\t0.1124\t29\nchrX\t90222900\t90223200\t0.5855\t29\nchrX\t90224400\t90224700\t0.1454\t25\nchrX\t90230700\t90231000\t0.3918\t28\nchrX\t90234900\t90235200\t0.0208\t45\nchrX\t90236400\t90236700\t0.2923\t27\nchrX\t90238200\t90238800\t0.2923\t27\nchrX\t90244800\t90245100\t0.3427\t35\nchrX\t90254700\t90255000\t0.2697\t32\nchrX\t90257400\t90257700\t0.5941\t27\nchrX\t90264000\t90264300\t0.6476\t24\nchrX\t90267300\t90267600\t0.4052\t18\nchrX\t90268800\t90269100\t0.5459\t30\nchrX\t90272100\t90273000\t0.0403\t28\nchrX\t90274500\t90274800\t0.4953\t19\nchrX\t90279600\t90279900\t0.2292\t30\nchrX\t90284400\t90284700\t0.1282\t25\nchrX\t90307500\t90308400\t0\t29\nchrX\t90316500\t90317100\t0.24\t30\nchrX\t90320700\t90321000\t0.1289\t11\nchrX\t90346800\t90347100\t0.1524\t28\nchrX\t90349800\t90350100\t0.5603\t24\nchrX\t90390900\t90391200\t0.288\t28\nchrX\t90393300\t90393600\t0.4496\t22\nchrX\t90397500\t90398100\t0.0493\t29\nchrX\t90399900\t90400200\t0.6321\t21\nchrX\t90409800\t90410100\t0.4705\t20\nchrX\t90413700\t90414000\t0.5118\t23\nchrX\t90418200\t90418500\t0.4146\t27\nchrX\t90423000\t90423300\t0.2424\t33\nchrX\t90437700\t90438000\t0.4255\t22\nchrX\t90441300\t90441600\t0.2564\t27\nchrX\t90444000\t90444300\t0.4734\t24\nchrX\t90445800\t90446400\t0.1019\t30\nchrX\t90460800\t90461400\t0.2694\t28\nchrX\t90465000\t90465300\t0.1659\t27\nchrX\t90483300\t90484800\t0.4027\t34\nchrX\t90489000\t90489600\t0.5197\t40\nchrX\t90528300\t90528900\t0.1102\t21\nchrX\t90542400\t90542700\t0.2748\t24\nchrX\t90555300\t90555600\t0.2726\t26\nchrX\t90573600\t90573900\t0.4708\t22\nchrX\t90575100\t90575700\t0.0723\t33\nchrX\t90579600\t90580200\t0.4036\t38\nchrX\t90594000\t90594300\t0.439\t31\nchrX\t90610200\t90610500\t0.4295\t28\nchrX\t90622500\t90622800\t0.5201\t28\nchrX\t90645600\t90645900\t0.4498\t17\nchrX\t90647100\t90647400\t0.2906\t26\nchrX\t90670500\t90672000\t0.3996\t24\nchrX\t90674400\t90674700\t0.3063\t24\nchrX\t90684600\t90685200\t0.2078\t19\nchrX\t90686700\t90687000\t0.4688\t26\nchrX\t90693300\t90693900\t0.2903\t32\nchrX\t90700500\t90700800\t0.4597\t23\nchrX\t90702600\t90702900\t0.4214\t29\nchrX\t90725700\t90726000\t0.3769\t29\nchrX\t90728700\t90729600\t0.3831\t29\nchrX\t90749100\t90749700\t0.5821\t20\nchrX\t90753300\t90753600\t0.5655\t23\nchrX\t90757200\t90757500\t0.4142\t27\nchrX\t90792300\t90792600\t0.2022\t25\nchrX\t90793800\t90794100\t0.3885\t24\nchrX\t90795900\t90796200\t0.4852\t23\nchrX\t90803100\t90803400\t0.4932\t25\nchrX\t90810000\t90810300\t0.0492\t31\nchrX\t90832500\t90832800\t0.6416\t19\nchrX\t90864000\t90864300\t0.2044\t25\nchrX\t90868200\t90869700\t0.0129\t36\nchrX\t90890700\t90891000\t0.248\t32\nchrX\t90901500\t90902100\t0.4329\t27\nchrX\t90904800\t90905100\t0.3917\t23\nchrX\t90908400\t90908700\t0.022\t30\nchrX\t90910500\t90911100\t0.0433\t34\nchrX\t90921300\t90921600\t0.2814\t30\nchrX\t90926400\t90926700\t0.2321\t25\nchrX\t90934800\t90935100\t0.0245\t23\nchrX\t90951000\t90951300\t0.5943\t34\nchrX\t90953700\t90954000\t0.6212\t29\nchrX\t90956700\t90957000\t0.4801\t36\nchrX\t90960300\t90961500\t0.132\t25\nchrX\t90963600\t90964800\t0.0976\t25\nchrX\t90966300\t90968100\t0\t36\nchrX\t90969900\t90970200\t0.4156\t27\nchrX\t90977400\t90978300\t0.2173\t29\nchrX\t90981000\t90981300\t0.3719\t26\nchrX\t90996900\t90997200\t0.6962\t16\nchrX\t90998700\t90999000\t0.26\t25\nchrX\t91005900\t91006200\t0.3825\t32\nchrX\t91020900\t91021200\t0.616\t26\nchrX\t91144200\t91144500\t0.4929\t27\nchrX\t91146900\t91148100\t0.2612\t21\nchrX\t91151100\t91151400\t0.3048\t34\nchrX\t91154400\t91154700\t0.3048\t34\nchrX\t91160700\t91161600\t0.1683\t28\nchrX\t91163400\t91165200\t0.2502\t33\nchrX\t91168200\t91169100\t0.1135\t33\nchrX\t91175400\t91175700\t0.3437\t32\nchrX\t91183200\t91183500\t0.3712\t32\nchrX\t91187700\t91188000\t0.4356\t14\nchrX\t91203000\t91203300\t0.3239\t30\nchrX\t91212000\t91212300\t0.3901\t19\nchrX\t91214100\t91216200\t0.1664\t35\nchrX\t91231200\t91231800\t0.4916\t32\nchrX\t91242300\t91242600\t0.6076\t24\nchrX\t91244400\t91246200\t0.3107\t25\nchrX\t91334700\t91335000\t0.3013\t46\nchrX\t91336200\t91336500\t0.3013\t46\nchrX\t91358400\t91358700\t0.0428\t53\nchrX\t91360200\t91361100\t0.0428\t53\nchrX\t91480800\t91481100\t0.3759\t36\nchrX\t91484400\t91484700\t0.5821\t34\nchrX\t91485900\t91487100\t0.3882\t35\nchrX\t91488300\t91488600\t0.4077\t17\nchrX\t91500000\t91500300\t0.3669\t26\nchrX\t91507500\t91510200\t0\t33\nchrX\t91512600\t91512900\t0.2917\t52\nchrX\t91518900\t91519200\t0.3758\t23\nchrX\t91520400\t91521000\t0.2939\t28\nchrX\t91530000\t91530300\t0.1548\t32\nchrX\t91533900\t91534200\t0.3514\t36\nchrX\t91542000\t91542300\t0.5135\t26\nchrX\t91556700\t91557300\t0.4105\t25\nchrX\t91566000\t91566600\t0.0998\t29\nchrX\t91572300\t91572600\t0.3622\t46\nchrX\t91575300\t91575600\t0.3347\t20\nchrX\t91580400\t91582200\t0.2603\t33\nchrX\t91592700\t91593000\t0.2225\t27\nchrX\t91612200\t91612800\t0.3872\t30\nchrX\t91614900\t91615200\t0.4913\t24\nchrX\t91631100\t91631400\t0.2109\t56\nchrX\t91632600\t91632900\t0.2109\t56\nchrX\t91641000\t91641300\t0.3023\t28\nchrX\t91646100\t91646400\t0.2805\t28\nchrX\t91650600\t91652700\t0.135\t34\nchrX\t91664700\t91665600\t0.0474\t38\nchrX\t91666800\t91667400\t0.0474\t38\nchrX\t91680300\t91682700\t0.2572\t44\nchrX\t91689900\t91690200\t0.2955\t32\nchrX\t91702500\t91702800\t0.5047\t26\nchrX\t91740900\t91741200\t0.2993\t25\nchrX\t91742700\t91743300\t0.3412\t39\nchrX\t91744800\t91746300\t0.0621\t34\nchrX\t91754400\t91755000\t0.3754\t43\nchrX\t91757400\t91758000\t0.2254\t42\nchrX\t91762200\t91763100\t0.5181\t36\nchrX\t91766400\t91766700\t0.6416\t23\nchrX\t91770900\t91772100\t0.2769\t30\nchrX\t91778400\t91779900\t0.1299\t35\nchrX\t91786500\t91786800\t0.2864\t26\nchrX\t91789200\t91790100\t0.2929\t36\nchrX\t91797300\t91797600\t0.3951\t31\nchrX\t91811700\t91812000\t0.2019\t34\nchrX\t91814400\t91815000\t0.4148\t34\nchrX\t91819800\t91821900\t0.1294\t52\nchrX\t91826400\t91827000\t0.1567\t33\nchrX\t91831500\t91832100\t0.2707\t30\nchrX\t91841700\t91842900\t0.2665\t27\nchrX\t91849800\t91850100\t0.474\t28\nchrX\t91852800\t91853100\t0.4334\t23\nchrX\t91856100\t91856400\t0.2966\t30\nchrX\t91862400\t91863000\t0.0673\t25\nchrX\t91864500\t91864800\t0.563\t29\nchrX\t91874700\t91875000\t0.3863\t23\nchrX\t91877100\t91877400\t0.2138\t34\nchrX\t91891500\t91892100\t0.4728\t19\nchrX\t91896600\t91897800\t0.0098\t26\nchrX\t91928400\t91928700\t0.2324\t26\nchrX\t91932300\t91932600\t0.551\t21\nchrX\t91935000\t91936200\t0.5583\t35\nchrX\t91938300\t91938600\t0.3979\t23\nchrX\t91943100\t91944300\t0.3206\t33\nchrX\t91947300\t91947600\t0.3206\t33\nchrX\t91951500\t91951800\t0.2746\t21\nchrX\t91959900\t91961400\t0.1478\t33\nchrX\t91972200\t91972500\t0.283\t37\nchrX\t91979400\t91980300\t0.0888\t30\nchrX\t91984200\t91984500\t0.4642\t12\nchrX\t91986000\t91986300\t0.4133\t24\nchrX\t91991100\t91991400\t0.4849\t23\nchrX\t91993800\t91994100\t0.463\t25\nchrX\t91996500\t91997100\t0.0024\t30\nchrX\t92000700\t92002200\t0.2996\t32\nchrX\t92016900\t92017200\t0.3978\t30\nchrX\t92025300\t92028900\t0.2464\t38\nchrX\t92035500\t92036100\t0.021\t33\nchrX\t92044500\t92044800\t0.4656\t23\nchrX\t92047200\t92047500\t0.5952\t23\nchrX\t92052300\t92052900\t0.1669\t22\nchrX\t92055000\t92055600\t0.006\t30\nchrX\t92060100\t92060400\t0.4175\t22\nchrX\t92066100\t92066400\t0.2071\t22\nchrX\t92151900\t92152200\t0.1799\t21\nchrX\t92154900\t92155500\t0.0429\t31\nchrX\t92161800\t92162100\t0.0948\t36\nchrX\t92164800\t92165100\t0.3652\t31\nchrX\t92167800\t92168100\t0.1237\t22\nchrX\t92219700\t92220300\t0.021\t26\nchrX\t92254800\t92255100\t0.3475\t42\nchrX\t92286600\t92286900\t0.1368\t24\nchrX\t92291400\t92291700\t0.5251\t28\nchrX\t92294700\t92295000\t0.3784\t27\nchrX\t92296800\t92297100\t0.1761\t43\nchrX\t92307900\t92308200\t0.3973\t37\nchrX\t92324700\t92325000\t0.4682\t30\nchrX\t92327700\t92328000\t0.4439\t19\nchrX\t92330700\t92331000\t0.503\t28\nchrX\t92349000\t92349300\t0.1759\t16\nchrX\t92356500\t92356800\t0.1967\t30\nchrX\t92362200\t92363100\t0.0137\t23\nchrX\t92371200\t92372700\t0.1899\t33\nchrX\t92374200\t92374500\t0.3002\t16\nchrX\t92379900\t92381400\t0.3076\t24\nchrX\t92385000\t92385300\t0.6853\t16\nchrX\t92388900\t92389200\t0.1943\t25\nchrX\t92390700\t92391000\t0.6243\t30\nchrX\t92405100\t92405400\t0.2628\t32\nchrX\t92410200\t92410500\t0.5461\t25\nchrX\t92412900\t92414400\t0.0954\t33\nchrX\t92425800\t92426100\t0.2831\t28\nchrX\t92448000\t92448600\t0.2404\t39\nchrX\t92455200\t92457000\t0.0158\t31\nchrX\t92458200\t92459700\t0.0158\t31\nchrX\t92468700\t92469000\t0.2578\t22\nchrX\t92470200\t92470500\t0.2578\t22\nchrX\t92476800\t92477100\t0.1024\t32\nchrX\t92481900\t92482200\t0.3224\t26\nchrX\t92483400\t92483700\t0.0776\t23\nchrX\t92488800\t92489100\t0.0918\t27\nchrX\t92494200\t92495100\t0.3151\t29\nchrX\t92503200\t92503500\t0.3857\t26\nchrX\t92511900\t92512200\t0.3443\t26\nchrX\t92543100\t92543400\t0.6394\t29\nchrX\t92562000\t92562300\t0.574\t30\nchrX\t92570400\t92571000\t0.4404\t30\nchrX\t92572200\t92572500\t0.594\t40\nchrX\t92574000\t92574300\t0.2292\t37\nchrX\t92581800\t92582100\t0.3187\t27\nchrX\t92583300\t92583600\t0.2839\t29\nchrX\t92588100\t92588400\t0.3479\t15\nchrX\t92592000\t92592300\t0.1386\t35\nchrX\t92593800\t92594100\t0.1386\t35\nchrX\t92595300\t92595900\t0.0765\t26\nchrX\t92598600\t92598900\t0.2825\t25\nchrX\t92602500\t92602800\t0.3297\t27\nchrX\t92615700\t92616600\t0.0229\t32\nchrX\t92622000\t92622300\t0.2421\t25\nchrX\t92629500\t92629800\t0.4881\t32\nchrX\t92638800\t92639100\t0.4914\t43\nchrX\t92643000\t92644500\t0.1093\t34\nchrX\t92662200\t92662500\t0.5038\t30\nchrX\t92670300\t92670600\t0.6128\t27\nchrX\t92680800\t92681100\t0.6689\t26\nchrX\t92689800\t92690100\t0.3381\t33\nchrX\t92704800\t92705100\t0.1313\t21\nchrX\t92710500\t92710800\t0.4733\t27\nchrX\t92713500\t92713800\t0.4898\t24\nchrX\t92718000\t92718300\t0.4667\t26\nchrX\t92738700\t92739000\t0.3512\t22\nchrX\t92742600\t92742900\t0.1807\t27\nchrX\t92745000\t92747100\t0.1466\t32\nchrX\t92748300\t92748900\t0.2599\t32\nchrX\t92751000\t92751300\t0.2851\t34\nchrX\t92758200\t92759700\t0.187\t32\nchrX\t92760900\t92761200\t0.187\t32\nchrX\t92773800\t92774100\t0.3691\t47\nchrX\t92775300\t92775600\t0.3297\t27\nchrX\t92781300\t92781600\t0.5749\t36\nchrX\t92787300\t92787600\t0.4993\t34\nchrX\t92795700\t92797200\t0.1888\t23\nchrX\t92805900\t92806800\t0\t33\nchrX\t92817900\t92818200\t0.1101\t43\nchrX\t92835600\t92836500\t0.1758\t31\nchrX\t92838900\t92839200\t0.2952\t39\nchrX\t92842800\t92843100\t0.4512\t23\nchrX\t92852100\t92852400\t0.6427\t24\nchrX\t92854500\t92854800\t0.1151\t30\nchrX\t92856000\t92856300\t0.3028\t25\nchrX\t92886600\t92888400\t0.2867\t37\nchrX\t92891700\t92892000\t0.6098\t23\nchrX\t92894700\t92895000\t0.2092\t24\nchrX\t92907600\t92907900\t0.6171\t19\nchrX\t92909100\t92909400\t0.5588\t32\nchrX\t92925000\t92926200\t0.5092\t35\nchrX\t92941500\t92942100\t0.3583\t29\nchrX\t92946600\t92946900\t0.4356\t16\nchrX\t92951700\t92952000\t0.5302\t21\nchrX\t92954400\t92955000\t0.0185\t30\nchrX\t92961000\t92961300\t0.3527\t36\nchrX\t92962800\t92963100\t0.2491\t20\nchrX\t92970300\t92970900\t0.3203\t24\nchrX\t92988900\t92989200\t0.5984\t28\nchrX\t92995500\t92995800\t0.4255\t36\nchrX\t93007500\t93007800\t0.608\t36\nchrX\t93037800\t93038100\t0.2287\t19\nchrX\t93039900\t93040200\t0.2395\t24\nchrX\t93058200\t93058800\t0.1715\t29\nchrX\t93079800\t93081600\t0.2436\t32\nchrX\t93110400\t93112200\t0.33\t31\nchrX\t93310800\t93311700\t0\t65\nchrX\t93632700\t93633000\t0.1575\t36\nchrX\t93942300\t93943800\t0.1857\t59\nchrX\t93945000\t93945600\t0.1857\t59\nchrX\t94439100\t94439400\t0.3529\t39\nchrX\t94699800\t94700100\t0.3663\t78\nchrX\t94805400\t94805700\t0.465\t38\nchrX\t94863600\t94864800\t0.0741\t53\nchrX\t94866000\t94866900\t0.2263\t35\nchrX\t95140200\t95140500\t0.0901\t16\nchrX\t95352900\t95354100\t0.3413\t51\nchrX\t95370600\t95370900\t0.6858\t33\nchrX\t95439300\t95439600\t0.2926\t57\nchrX\t95544300\t95544600\t0.4446\t44\nchrX\t95546700\t95547000\t0.4446\t44\nchrX\t95600700\t95602200\t0.0223\t50\nchrX\t95810100\t95812500\t0\t70\nchrX\t95852100\t95852700\t0.2969\t38\nchrX\t96054900\t96055200\t0.3898\t45\nchrX\t96057900\t96063600\t0\t60\nchrX\t96078600\t96080100\t0.2811\t57\nchrX\t96174600\t96174900\t0.3929\t40\nchrX\t96187500\t96188100\t0.2625\t66\nchrX\t96189900\t96190200\t0.4031\t50\nchrX\t96523500\t96523800\t0.3938\t23\nchrX\t96589800\t96590100\t0.5868\t41\nchrX\t96836700\t96837000\t0.2019\t29\nchrX\t96897900\t96898200\t0.0733\t54\nchrX\t96939600\t96939900\t0.2666\t27\nchrX\t97510500\t97510800\t0\t77\nchrX\t97512300\t97514400\t0\t77\nchrX\t97578600\t97578900\t0\t59\nchrX\t97580100\t97583400\t0\t59\nchrX\t97649400\t97649700\t0.2562\t38\nchrX\t97908300\t97908600\t0.659\t30\nchrX\t98305500\t98306100\t0.1132\t74\nchrX\t98424300\t98426700\t0.053\t72\nchrX\t98427900\t98428200\t0.053\t72\nchrX\t98429700\t98430000\t0.053\t72\nchrX\t98669400\t98669700\t0.2446\t46\nchrX\t98687700\t98692800\t0\t72\nchrX\t98831400\t98831700\t0.1437\t12\nchrX\t99178200\t99178500\t0.328\t28\nchrX\t99287100\t99287400\t0.3882\t61\nchrX\t99402000\t99403500\t0.29\t54\nchrX\t99485700\t99487200\t0.0946\t49\nchrX\t99596100\t99596700\t0.4213\t39\nchrX\t99808200\t99808500\t0.4572\t56\nchrX\t99864300\t99865200\t0.3408\t49\nchrX\t100055100\t100056600\t0.2463\t54\nchrX\t100136100\t100136700\t0.1989\t53\nchrX\t100138200\t100140000\t0.1989\t53\nchrX\t100165800\t100166400\t0.0949\t58\nchrX\t100167600\t100169100\t0.0592\t47\nchrX\t100257300\t100261500\t0.0188\t84\nchrX\t100501200\t100502100\t0\t50\nchrX\t100550700\t100557300\t0.0745\t73\nchrX\t100724100\t100724400\t0.5425\t26\nchrX\t100869600\t100870200\t0.1476\t75\nchrX\t100971000\t100973400\t0.0231\t57\nchrX\t101273400\t101273700\t0.492\t51\nchrX\t101471700\t101475000\t0.0199\t74\nchrX\t101541600\t101541900\t0.3755\t64\nchrX\t101581500\t101581800\t0.2355\t60\nchrX\t101597700\t101601900\t0\t49\nchrX\t101611800\t101616300\t0\t42\nchrX\t101712000\t101713200\t0.3733\t46\nchrX\t101838600\t101839800\t0.2856\t32\nchrX\t101855700\t101856000\t0.468\t33\nchrX\t101858400\t101858700\t0.4873\t16\nchrX\t101897100\t101897400\t0.6497\t20\nchrX\t101994300\t101994600\t0.3443\t52\nchrX\t101995800\t101997000\t0.1886\t48\nchrX\t102047400\t102051000\t0.0752\t48\nchrX\t102111600\t102112200\t0.3038\t45\nchrX\t102189000\t102189300\t0.4287\t44\nchrX\t102198000\t102338100\t0\t54\nchrX\t102348900\t102489300\t0\t50\nchrX\t102579000\t102579300\t0.4792\t39\nchrX\t102586800\t102587100\t0.3431\t43\nchrX\t102588300\t102588600\t0.3431\t43\nchrX\t102616200\t102617700\t0.2049\t61\nchrX\t102670800\t102671700\t0.2704\t66\nchrX\t102689700\t102690000\t0.4282\t34\nchrX\t102777600\t102777900\t0.3408\t49\nchrX\t102779100\t102779400\t0.3408\t49\nchrX\t102780900\t102781200\t0.4548\t30\nchrX\t102811200\t102812100\t0\t55\nchrX\t102828300\t102828600\t0.3514\t57\nchrX\t102873000\t102873300\t0.4467\t49\nchrX\t103136700\t103137000\t0.4844\t70\nchrX\t103235400\t103235700\t0.3269\t39\nchrX\t103286700\t103287300\t0.3229\t51\nchrX\t103380900\t103381200\t0.3883\t19\nchrX\t103488600\t103488900\t0.6963\t10\nchrX\t103872900\t103873200\t0.2438\t53\nchrX\t103891500\t103897200\t0.0581\t55\nchrX\t103898700\t103899000\t0.1939\t25\nchrX\t103911600\t103911900\t0.1432\t24\nchrX\t103956000\t103987500\t0\t40\nchrX\t104027100\t104032800\t0.0013\t68\nchrX\t104051100\t104082900\t0\t46\nchrX\t104417100\t104417400\t0.1414\t52\nchrX\t104531100\t104531700\t0.1423\t35\nchrX\t104549700\t104550300\t0.0567\t37\nchrX\t104632500\t104632800\t0.4181\t42\nchrX\t104672400\t104672700\t0.3785\t39\nchrX\t104761800\t104762100\t0.5721\t37\nchrX\t104914500\t104914800\t0.4301\t60\nchrX\t104946600\t104947800\t0.2168\t56\nchrX\t104949300\t104949600\t0.2168\t56\nchrX\t105040800\t105041100\t0.129\t59\nchrX\t105042600\t105042900\t0.4451\t40\nchrX\t105216900\t105217200\t0.3894\t32\nchrX\t105352800\t105353100\t0.2853\t48\nchrX\t105381900\t105382800\t0.3151\t69\nchrX\t105391500\t105392100\t0.2782\t37\nchrX\t105739800\t105740100\t0.5392\t26\nchrX\t105797400\t105797700\t0.0715\t76\nchrX\t105799200\t105801300\t0.0715\t76\nchrX\t105920700\t105921600\t0.3223\t47\nchrX\t105947100\t105947400\t0.4563\t31\nchrX\t105992100\t105992700\t0.0892\t48\nchrX\t106079700\t106081200\t0.1458\t61\nchrX\t106134000\t106135500\t0.2331\t53\nchrX\t106232700\t106233000\t0.1234\t17\nchrX\t106266600\t106278300\t0\t47\nchrX\t106288200\t106299600\t0\t48\nchrX\t106308600\t106308900\t0.161\t18\nchrX\t106382700\t106384500\t0.1567\t51\nchrX\t106469400\t106475400\t0\t78\nchrX\t106602600\t106603200\t0.0829\t44\nchrX\t106756800\t106757700\t0.1045\t63\nchrX\t106814400\t106814700\t0.2837\t45\nchrX\t106828200\t106829700\t0.3311\t80\nchrX\t106851900\t106852500\t0.294\t45\nchrX\t107009400\t107010000\t0.2884\t40\nchrX\t107035500\t107036400\t0\t54\nchrX\t107105100\t107105700\t0.536\t44\nchrX\t107156400\t107161800\t0.0641\t69\nchrX\t107326800\t107327400\t0.1515\t31\nchrX\t107364900\t107367000\t0.0089\t76\nchrX\t107368500\t107369700\t0.0089\t76\nchrX\t107501400\t107501700\t0.5163\t28\nchrX\t107612400\t107613900\t0\t67\nchrX\t107967300\t107968500\t0.2218\t56\nchrX\t108015000\t108015300\t0.5342\t41\nchrX\t108281100\t108281400\t0.0837\t92\nchrX\t108451500\t108451800\t0.3421\t64\nchrX\t108530400\t108530700\t0.3934\t33\nchrX\t108773700\t108774000\t0.0247\t44\nchrX\t108858300\t108858600\t0.3053\t51\nchrX\t108918900\t108919200\t0.3734\t30\nchrX\t108982500\t108982800\t0.358\t26\nchrX\t109035300\t109035900\t0.1749\t57\nchrX\t109055400\t109058400\t0.009\t57\nchrX\t109067700\t109068000\t0.4393\t44\nchrX\t109115700\t109116000\t0.0797\t51\nchrX\t109117500\t109117800\t0.0797\t51\nchrX\t109175700\t109176000\t0.223\t49\nchrX\t109197300\t109197600\t0.5277\t26\nchrX\t109435200\t109435500\t0.3082\t42\nchrX\t109490100\t109490400\t0.5833\t39\nchrX\t109646400\t109646700\t0.3934\t34\nchrX\t109648800\t109649100\t0.21\t53\nchrX\t109650300\t109650600\t0.21\t53\nchrX\t109834500\t109834800\t0.2792\t61\nchrX\t109868700\t109869000\t0.4315\t42\nchrX\t110034600\t110035200\t0.3643\t43\nchrX\t110122200\t110122500\t0.3419\t29\nchrX\t110222100\t110222400\t0.1329\t49\nchrX\t110608200\t110609700\t0.2315\t41\nchrX\t110643600\t110643900\t0.4378\t43\nchrX\t110817000\t110819400\t0.086\t65\nchrX\t110820600\t110821800\t0.086\t65\nchrX\t110832600\t110833200\t0.3094\t53\nchrX\t111315300\t111316200\t0.0021\t63\nchrX\t111500700\t111501000\t0.3509\t35\nchrX\t111547800\t111548100\t0.1989\t66\nchrX\t111574200\t111574500\t0.296\t62\nchrX\t111577200\t111577500\t0.5585\t33\nchrX\t111588900\t111594300\t0.0061\t76\nchrX\t111638100\t111640800\t0.0204\t84\nchrX\t111721200\t111721500\t0.1134\t10\nchrX\t111936600\t111938400\t0.2316\t39\nchrX\t112174200\t112175400\t0.435\t28\nchrX\t112329900\t112332000\t0.1438\t69\nchrX\t112349400\t112350000\t0.2626\t63\nchrX\t112431900\t112434300\t0.0975\t58\nchrX\t112505400\t112507800\t0.2662\t68\nchrX\t112719300\t112720200\t0.2053\t55\nchrX\t112721400\t112721700\t0.2053\t55\nchrX\t112722900\t112723200\t0.2053\t55\nchrX\t113325000\t113325900\t0.1692\t51\nchrX\t113337900\t113343000\t0.0231\t80\nchrX\t113446200\t113446500\t0.6379\t61\nchrX\t113449800\t113451300\t0.1966\t35\nchrX\t113633700\t113634300\t0.2018\t42\nchrX\t113688600\t113689800\t0.083\t43\nchrX\t113740500\t113740800\t0.1961\t39\nchrX\t113900700\t113901000\t0.309\t32\nchrX\t114261300\t114261600\t0.594\t43\nchrX\t114458100\t114458400\t0.4043\t21\nchrX\t114470700\t114471000\t0.3435\t33\nchrX\t114492600\t114493200\t0.1291\t81\nchrX\t114558900\t114559200\t0.3478\t42\nchrX\t114602400\t114603300\t0.358\t59\nchrX\t114705600\t114706500\t0.0294\t44\nchrX\t114720600\t114721500\t0.1508\t45\nchrX\t114722700\t114724200\t0.1508\t45\nchrX\t114742800\t114743400\t0.0423\t32\nchrX\t114802800\t114803400\t0.3747\t25\nchrX\t114807000\t114807300\t0.5741\t13\nchrX\t114831000\t114833100\t0.0355\t43\nchrX\t114834900\t114836100\t0.5416\t44\nchrX\t114847200\t114847500\t0.4839\t25\nchrX\t114856200\t114856500\t0.1444\t39\nchrX\t114977100\t114977400\t0.3359\t31\nchrX\t115080900\t115081200\t0.2207\t40\nchrX\t115119300\t115120800\t0.0811\t108\nchrX\t115242000\t115242300\t0.4738\t34\nchrX\t115346400\t115348200\t0.1968\t44\nchrX\t115474500\t115474800\t0.2927\t21\nchrX\t115668900\t115669800\t0.2351\t36\nchrX\t115705800\t115706100\t0.2544\t14\nchrX\t115724400\t115725000\t0\t16\nchrX\t115726200\t115735500\t0\t257\nchrX\t115736700\t115737000\t0\t30\nchrX\t115839000\t115840500\t0.2618\t18\nchrX\t115842300\t115889400\t0\t297\nchrX\t116164200\t116164500\t0.2133\t40\nchrX\t116187300\t116187600\t0.2281\t41\nchrX\t116312100\t116313300\t0.2296\t46\nchrX\t116514900\t116516400\t0.3763\t41\nchrX\t116517900\t116518500\t0.3763\t41\nchrX\t116557200\t116557500\t0.0203\t18\nchrX\t116817900\t116818200\t0.4683\t39\nchrX\t116944200\t116945100\t0.2831\t49\nchrX\t116965200\t116967000\t0.1061\t74\nchrX\t116970000\t116970300\t0.4527\t83\nchrX\t117181500\t117182100\t0.3651\t41\nchrX\t117265500\t117266700\t0.4291\t46\nchrX\t117320400\t117320700\t0.3986\t42\nchrX\t117425400\t117426000\t0.2166\t41\nchrX\t117728100\t117732300\t0.1031\t57\nchrX\t117829200\t117829500\t0.2761\t38\nchrX\t117874200\t117878700\t0.1209\t52\nchrX\t117952200\t117952800\t0.3181\t48\nchrX\t117963600\t117964200\t0.3102\t57\nchrX\t118009200\t118010700\t0.0427\t55\nchrX\t118019700\t118020000\t0.394\t45\nchrX\t118033800\t118037400\t0.1528\t53\nchrX\t118071600\t118071900\t0.4078\t58\nchrX\t118288500\t118288800\t0.4011\t42\nchrX\t118401000\t118401900\t0.0342\t50\nchrX\t118486200\t118486800\t0.3773\t39\nchrX\t118799700\t118800000\t0.6372\t31\nchrX\t118853100\t118853400\t0.1789\t33\nchrX\t118905300\t118905600\t0.5051\t25\nchrX\t118908600\t118908900\t0.5982\t20\nchrX\t119038500\t119039400\t0.0341\t34\nchrX\t119165100\t119166000\t0.2541\t48\nchrX\t119435400\t119441400\t0\t77\nchrX\t119805600\t119806500\t0.0526\t57\nchrX\t119808300\t119808600\t0.2328\t35\nchrX\t119824200\t119824500\t0.2881\t31\nchrX\t119925900\t119926200\t0.4012\t34\nchrX\t119965200\t119965500\t0.5782\t60\nchrX\t119968200\t119968500\t0.3707\t43\nchrX\t120038400\t120067500\t0\t46\nchrX\t120069000\t120086400\t0\t46\nchrX\t120149700\t120198000\t0\t48\nchrX\t120346200\t120346800\t0.1433\t34\nchrX\t120385500\t120385800\t0.2501\t46\nchrX\t120388500\t120389400\t0.0657\t41\nchrX\t120509400\t120509700\t0.3744\t14\nchrX\t120773100\t120773400\t0.3697\t26\nchrX\t120873600\t120874200\t0.3767\t27\nchrX\t120875700\t120879300\t0\t40\nchrX\t120930000\t120986700\t0\t55\nchrX\t121017600\t121018200\t0.3683\t53\nchrX\t121174200\t121174500\t0.4515\t19\nchrX\t121195500\t121195800\t0.3279\t23\nchrX\t121263900\t121268100\t0.0141\t72\nchrX\t121440900\t121441200\t0.3074\t54\nchrX\t121532100\t121533300\t0.1512\t70\nchrX\t121567500\t121567800\t0.4235\t43\nchrX\t121690500\t121692600\t0.0212\t70\nchrX\t121695900\t121698000\t0\t86\nchrX\t121728000\t121728900\t0.0188\t80\nchrX\t121827600\t121828200\t0.5285\t45\nchrX\t121878900\t121880100\t0.2693\t41\nchrX\t121882200\t121882800\t0.2797\t38\nchrX\t122181000\t122181600\t0.3264\t28\nchrX\t122256600\t122256900\t0.4862\t48\nchrX\t122331900\t122332500\t0.4226\t26\nchrX\t122395500\t122397000\t0.177\t52\nchrX\t122482200\t122482500\t0.6944\t42\nchrX\t122547000\t122548500\t0.2956\t60\nchrX\t123014700\t123015000\t0.4843\t59\nchrX\t123051600\t123052200\t0.1991\t54\nchrX\t123056100\t123057300\t0.2514\t37\nchrX\t123058500\t123058800\t0.2236\t23\nchrX\t123798300\t123798600\t0.3374\t35\nchrX\t123815700\t123816000\t0.3331\t25\nchrX\t123960600\t123960900\t0.4633\t35\nchrX\t124128600\t124128900\t0.5824\t32\nchrX\t124179300\t124179900\t0.3145\t61\nchrX\t124334400\t124334700\t0.4474\t29\nchrX\t124409400\t124410000\t0.4168\t62\nchrX\t124494900\t124496100\t0.2773\t65\nchrX\t124586700\t124587000\t0.525\t32\nchrX\t124752600\t124753800\t0.3534\t41\nchrX\t125043000\t125044200\t0.0154\t56\nchrX\t125051700\t125052000\t0.522\t34\nchrX\t125351100\t125351400\t0.4233\t51\nchrX\t125511600\t125511900\t0.1741\t78\nchrX\t125514300\t125515200\t0.1741\t78\nchrX\t125609700\t125613600\t0.0911\t51\nchrX\t125658900\t125659200\t0.3041\t56\nchrX\t125779500\t125780400\t0.0324\t84\nchrX\t125842800\t125843400\t0.0771\t64\nchrX\t125928000\t125928300\t0.3429\t59\nchrX\t125936400\t125936700\t0.3531\t50\nchrX\t126051900\t126052200\t0.2624\t29\nchrX\t126105600\t126108900\t0.1952\t55\nchrX\t126186300\t126189900\t0.2448\t45\nchrX\t126231900\t126234300\t0.2784\t74\nchrX\t126263700\t126264000\t0.3704\t34\nchrX\t126287700\t126288600\t0.2763\t58\nchrX\t126437400\t126437700\t0.5835\t26\nchrX\t126462300\t126462600\t0.4083\t58\nchrX\t126642000\t126642300\t0.5478\t67\nchrX\t126914100\t126915600\t0.0533\t47\nchrX\t127117200\t127122600\t0.0018\t79\nchrX\t127161000\t127161300\t0.2655\t46\nchrX\t127219200\t127219500\t0.4614\t35\nchrX\t127254900\t127255200\t0.2951\t39\nchrX\t127332000\t127332300\t0.2931\t43\nchrX\t127362600\t127368300\t0.0097\t59\nchrX\t127483500\t127484400\t0.1128\t56\nchrX\t127508700\t127509000\t0.3405\t27\nchrX\t127593900\t127594500\t0.2355\t33\nchrX\t127612500\t127613100\t0.4821\t43\nchrX\t127800300\t127800600\t0.3524\t44\nchrX\t128136900\t128137200\t0.3811\t32\nchrX\t128382600\t128382900\t0.6842\t20\nchrX\t128667600\t128667900\t0.0257\t23\nchrX\t128735400\t128735700\t0.3109\t45\nchrX\t128785200\t128788200\t0.0935\t67\nchrX\t128916900\t128917200\t0.5645\t30\nchrX\t128943900\t128944800\t0.116\t64\nchrX\t129045900\t129049200\t0.1099\t64\nchrX\t129085200\t129085500\t0.294\t46\nchrX\t129166800\t129168000\t0.1938\t56\nchrX\t129341700\t129342900\t0.1946\t49\nchrX\t129392700\t129393000\t0.3669\t43\nchrX\t129406500\t129407400\t0.3143\t44\nchrX\t129481800\t129482400\t0.2713\t56\nchrX\t129536700\t129537000\t0.4455\t38\nchrX\t129563700\t129564000\t0.3615\t49\nchrX\t129851700\t129852000\t0.112\t44\nchrX\t130255200\t130255500\t0.2709\t46\nchrX\t130405800\t130406100\t0.4729\t22\nchrX\t130451400\t130451700\t0.3351\t83\nchrX\t130478100\t130478400\t0.3821\t39\nchrX\t130496100\t130497000\t0.1704\t44\nchrX\t130517700\t130523400\t0\t78\nchrX\t130569300\t130570200\t0.1007\t56\nchrX\t130571700\t130572000\t0.405\t46\nchrX\t130674900\t130675200\t0.1764\t54\nchrX\t130786500\t130787100\t0.071\t51\nchrX\t130821300\t130821600\t0.1835\t40\nchrX\t130948800\t130949700\t0.0133\t60\nchrX\t130959600\t130965000\t0.0075\t80\nchrX\t131003100\t131006400\t0\t64\nchrX\t131117700\t131118000\t0.4074\t41\nchrX\t131124900\t131127600\t0.0017\t84\nchrX\t131152800\t131153400\t0.186\t49\nchrX\t131155200\t131157000\t0.186\t49\nchrX\t131245500\t131250600\t0.1353\t67\nchrX\t131327700\t131328300\t0.3234\t39\nchrX\t131379000\t131380200\t0.1231\t66\nchrX\t131382600\t131382900\t0.1231\t66\nchrX\t131487600\t131488200\t0.2065\t74\nchrX\t131496600\t131496900\t0.3184\t42\nchrX\t131504100\t131505000\t0.1408\t64\nchrX\t131579100\t131581200\t0.2318\t54\nchrX\t131583300\t131584500\t0.1896\t48\nchrX\t131626200\t131626500\t0.4144\t33\nchrX\t131664600\t131669700\t0.222\t58\nchrX\t131839800\t131840100\t0.2982\t31\nchrX\t132011400\t132011700\t0.4258\t40\nchrX\t132135300\t132138600\t0.0119\t66\nchrX\t132156300\t132159600\t0.2178\t69\nchrX\t132197100\t132197400\t0.4145\t41\nchrX\t132866400\t132867000\t0.0524\t57\nchrX\t133344000\t133344300\t0.4298\t36\nchrX\t133354500\t133354800\t0.2876\t36\nchrX\t133863600\t133863900\t0.4023\t32\nchrX\t134330100\t134330400\t0.4668\t39\nchrX\t134788200\t134788500\t0.1084\t10\nchrX\t135027600\t135027900\t0.2377\t41\nchrX\t135116100\t135158100\t0\t48\nchrX\t135174600\t135175200\t0.1226\t29\nchrX\t135214500\t135256500\t0\t44\nchrX\t135598500\t135599100\t0.3268\t36\nchrX\t135615600\t135619200\t0\t56\nchrX\t135621300\t135621900\t0.0971\t44\nchrX\t135658500\t135658800\t0.4943\t29\nchrX\t135666900\t135667500\t0.2644\t24\nchrX\t135669600\t135673500\t0\t55\nchrX\t135686100\t135686400\t0.2217\t46\nchrX\t135718500\t135734700\t0\t91\nchrX\t135748800\t135813000\t0\t143\nchrX\t135814500\t135847500\t0\t143\nchrX\t135849000\t135864900\t0\t72\nchrX\t135866100\t135882300\t0\t58\nchrX\t135883500\t135888900\t0\t83\nchrX\t135945600\t135946200\t0.053\t49\nchrX\t136075800\t136076100\t0.114\t22\nchrX\t136332300\t136332600\t0.2431\t64\nchrX\t136440300\t136445700\t0.0063\t106\nchrX\t136949100\t136949400\t0.3526\t29\nchrX\t137000400\t137000700\t0.5224\t37\nchrX\t137111700\t137112300\t0.3954\t51\nchrX\t137673900\t137674500\t0.1362\t59\nchrX\t137785800\t137786400\t0.3936\t27\nchrX\t138062100\t138064200\t0\t67\nchrX\t138155100\t138155400\t0.3821\t33\nchrX\t138300900\t138301800\t0.2246\t55\nchrX\t138341700\t138342300\t0.1578\t47\nchrX\t138460200\t138460500\t0.3211\t44\nchrX\t138505200\t138506100\t0.4177\t50\nchrX\t138780300\t138780600\t0.1072\t61\nchrX\t138782400\t138784200\t0.1328\t61\nchrX\t138878100\t138878400\t0.5489\t39\nchrX\t139064100\t139064400\t0.4744\t26\nchrX\t139068000\t139069500\t0.0417\t62\nchrX\t139302600\t139303200\t0.5275\t25\nchrX\t139445400\t139445700\t0.2784\t42\nchrX\t139503300\t139503600\t0.2609\t24\nchrX\t139528200\t139528500\t0.6186\t42\nchrX\t139852200\t139852500\t0.2235\t50\nchrX\t139991400\t139992000\t0.32\t70\nchrX\t140013000\t140013900\t0\t34\nchrX\t140017800\t140018400\t0.0957\t22\nchrX\t140074800\t140075100\t0\t33\nchrX\t140137200\t140138400\t0.2234\t39\nchrX\t140219100\t140220900\t0.0169\t26\nchrX\t140233200\t140233500\t0.4299\t21\nchrX\t140412000\t140412300\t0.2196\t15\nchrX\t140419200\t140420100\t0.0513\t97\nchrX\t140567700\t140568300\t0.2733\t61\nchrX\t140723400\t140724300\t0.5714\t190\nchrX\t140995500\t140996100\t0.139\t35\nchrX\t141007200\t141033000\t0\t92\nchrX\t141034200\t141042900\t0\t92\nchrX\t141044700\t141045000\t0.0477\t49\nchrX\t141048000\t141049200\t0.3004\t43\nchrX\t141052500\t141112800\t0\t48\nchrX\t141117300\t141117900\t0.0591\t60\nchrX\t141230400\t141232500\t0.0102\t42\nchrX\t141233700\t141234000\t0.348\t35\nchrX\t141238200\t141239700\t0.1474\t53\nchrX\t141241200\t141243600\t0.1474\t53\nchrX\t141244800\t141245400\t0.1474\t53\nchrX\t141248700\t141249600\t0.0009\t29\nchrX\t141267300\t141267900\t0.4079\t39\nchrX\t141285900\t141286200\t0.3486\t37\nchrX\t141356700\t141358200\t0.1946\t38\nchrX\t141421200\t141427200\t0\t82\nchrX\t141474600\t141521400\t0\t50\nchrX\t141523500\t141535800\t0\t50\nchrX\t141537600\t141539400\t0\t28\nchrX\t141542100\t141543000\t0\t77\nchrX\t141544500\t141585300\t0\t77\nchrX\t141586800\t141595800\t0\t59\nchrX\t141598200\t141600900\t0\t59\nchrX\t141687600\t141690000\t0.0468\t36\nchrX\t141697800\t141698400\t0.0421\t50\nchrX\t141699600\t141700500\t0.0421\t50\nchrX\t141790500\t141790800\t0.1709\t20\nchrX\t141824400\t141825600\t0.1034\t67\nchrX\t141880500\t141880800\t0.6284\t30\nchrX\t141896100\t141896400\t0.2961\t23\nchrX\t141910500\t141910800\t0.5338\t28\nchrX\t141912000\t141912900\t0\t36\nchrX\t142122900\t142123200\t0.6562\t37\nchrX\t142125900\t142126200\t0.5976\t21\nchrX\t142171500\t142172100\t0.3489\t81\nchrX\t142189800\t142192500\t0.0046\t33\nchrX\t142285800\t142286400\t0.426\t39\nchrX\t142338900\t142344000\t0.0031\t88\nchrX\t142377600\t142377900\t0.1384\t51\nchrX\t142385700\t142387500\t0.2534\t50\nchrX\t142389000\t142389600\t0.2762\t59\nchrX\t142390800\t142391100\t0.2762\t59\nchrX\t142478400\t142483500\t0.0225\t104\nchrX\t142852800\t142853100\t0.6121\t38\nchrX\t142908900\t142910100\t0.2412\t74\nchrX\t143154300\t143155500\t0.1576\t48\nchrX\t143355000\t143355600\t0.164\t77\nchrX\t143990700\t143991300\t0.2347\t23\nchrX\t144078000\t144081600\t0\t56\nchrX\t144082800\t144087300\t0\t56\nchrX\t144088500\t144100800\t0\t56\nchrX\t144102000\t144117000\t0\t56\nchrX\t144118200\t144118500\t0.2348\t34\nchrX\t144120000\t144123000\t0\t55\nchrX\t144124200\t144153900\t0\t55\nchrX\t144156600\t144176700\t0\t56\nchrX\t144177900\t144180300\t0\t56\nchrX\t144181800\t144201300\t0\t56\nchrX\t144202500\t144207000\t0\t56\nchrX\t144208500\t144212400\t0\t43\nchrX\t144324000\t144326700\t0\t55\nchrX\t144404700\t144405900\t0.2595\t65\nchrX\t144504300\t144504600\t0.4303\t37\nchrX\t144764700\t144765000\t0.4372\t53\nchrX\t144775800\t144776100\t0.6095\t30\nchrX\t144966900\t144967500\t0.154\t50\nchrX\t145353900\t145354200\t0.3501\t36\nchrX\t145437900\t145438200\t0.4481\t33\nchrX\t145974900\t145975800\t0\t75\nchrX\t145996200\t145996500\t0.6778\t31\nchrX\t146111400\t146112900\t0.031\t63\nchrX\t146406300\t146406600\t0.5986\t26\nchrX\t146445000\t146445300\t0.3012\t51\nchrX\t146470800\t146471100\t0.2503\t39\nchrX\t146618100\t146620800\t0.0375\t59\nchrX\t146802000\t146822400\t0\t44\nchrX\t146861700\t146862300\t0.0412\t47\nchrX\t146883000\t146883300\t0.4001\t36\nchrX\t146902200\t146904600\t0.1175\t65\nchrX\t146970600\t146970900\t0.3222\t30\nchrX\t147145500\t147145800\t0.1988\t44\nchrX\t147190500\t147190800\t0.5884\t31\nchrX\t147221100\t147221400\t0.2697\t35\nchrX\t147222600\t147222900\t0.2697\t35\nchrX\t147279900\t147280200\t0\t24\nchrX\t147281700\t147286800\t0\t71\nchrX\t147408900\t147412500\t0.0332\t65\nchrX\t147513600\t147513900\t0.2997\t36\nchrX\t147653700\t147659700\t0\t82\nchrX\t147992400\t147992700\t0.4075\t25\nchrX\t148017600\t148017900\t0.5123\t48\nchrX\t148123500\t148127400\t0.0723\t65\nchrX\t148170000\t148171800\t0.0477\t45\nchrX\t148300200\t148300500\t0.1053\t26\nchrX\t148304700\t148305000\t0.4003\t35\nchrX\t148326600\t148326900\t0.3069\t27\nchrX\t148351800\t148352100\t0.2015\t26\nchrX\t148581300\t148581600\t0.5161\t50\nchrX\t148656600\t148656900\t0.5074\t36\nchrX\t148731600\t148732500\t0.1489\t54\nchrX\t148971300\t148973100\t0\t53\nchrX\t148975500\t148976100\t0.5052\t33\nchrX\t149142900\t149143200\t0.6669\t28\nchrX\t149178300\t149183400\t0\t86\nchrX\t149215200\t149215800\t0\t66\nchrX\t149336100\t149340000\t0.005\t61\nchrX\t149418600\t149418900\t0.587\t21\nchrX\t149436600\t149436900\t0.0099\t370\nchrX\t149438400\t149441700\t0.0099\t370\nchrX\t149487900\t149488200\t0.388\t32\nchrX\t149527200\t149527800\t0.3451\t26\nchrX\t149533200\t149533800\t0.4414\t31\nchrX\t149538300\t149538900\t0.07\t35\nchrX\t149542800\t149544300\t0.0458\t40\nchrX\t149547600\t149562000\t0\t56\nchrX\t149573400\t149598600\t0\t50\nchrX\t149599800\t149602200\t0\t50\nchrX\t149654700\t149681100\t0\t51\nchrX\t149685000\t149685300\t0.4103\t40\nchrX\t149700600\t149701200\t0.4182\t46\nchrX\t149722200\t149748600\t0\t56\nchrX\t149767200\t149796000\t0\t41\nchrX\t149917500\t149931000\t0\t38\nchrX\t149932800\t149933100\t0\t38\nchrX\t149935200\t149936700\t0.0451\t37\nchrX\t149940900\t149941500\t0.102\t35\nchrX\t149946600\t149946900\t0.1209\t32\nchrX\t149973900\t149974200\t0.2421\t37\nchrX\t150000900\t150001200\t0.0157\t131\nchrX\t150022200\t150022500\t0.1802\t46\nchrX\t150067200\t150067500\t0.4519\t45\nchrX\t150131700\t150134700\t0.0194\t73\nchrX\t150168900\t150171300\t0.1248\t63\nchrX\t150214800\t150216000\t0.0386\t28\nchrX\t150340800\t150342300\t0.0413\t35\nchrX\t150401100\t150401700\t0.4626\t42\nchrX\t150417300\t150420300\t0.0091\t64\nchrX\t150816900\t150817200\t0.559\t43\nchrX\t151330500\t151336200\t0\t75\nchrX\t151506900\t151507200\t0.6143\t22\nchrX\t151655100\t151655400\t0.6023\t26\nchrX\t151703700\t151704000\t0.3836\t46\nchrX\t151914300\t151917600\t0\t25\nchrX\t152151900\t152152200\t0.5579\t29\nchrX\t152236200\t152236800\t0.2308\t59\nchrX\t152239200\t152240700\t0.2308\t59\nchrX\t152349600\t152350500\t0.1667\t55\nchrX\t152359800\t152360400\t0.0649\t76\nchrX\t152385900\t152386200\t0.4349\t39\nchrX\t152415900\t152417700\t0.146\t49\nchrX\t152502600\t152502900\t0.4102\t59\nchrX\t152545800\t152547600\t0.121\t91\nchrX\t152549100\t152550300\t0.121\t91\nchrX\t152678700\t152696700\t0\t43\nchrX\t152698200\t152700900\t0\t56\nchrX\t152702100\t152725200\t0\t45\nchrX\t152743200\t152766300\t0\t45\nchrX\t152767500\t152770200\t0\t45\nchrX\t152771700\t152789700\t0\t45\nchrX\t152983800\t152987700\t0\t41\nchrX\t153066600\t153074400\t0\t43\nchrX\t153075600\t153083400\t0\t48\nchrX\t153106200\t153148500\t0\t47\nchrX\t153251400\t153293700\t0\t54\nchrX\t153313200\t153316500\t0\t46\nchrX\t153389700\t153390300\t0.6823\t23\nchrX\t154144200\t154148100\t0\t53\nchrX\t154149600\t154239000\t0\t84\nchrX\t154240500\t154294200\t0\t57\nchrX\t154303200\t154303500\t0.6842\t18\nchrX\t154338000\t154347300\t0\t43\nchrX\t154360800\t154361100\t0.3281\t60\nchrX\t154384800\t154394100\t0\t39\nchrX\t154456500\t154456800\t0.6774\t41\nchrX\t154556100\t154591200\t0\t52\nchrX\t154613100\t154648200\t0\t44\nchrX\t154653300\t154654500\t0\t34\nchrX\t154768800\t154769100\t0.4429\t31\nchrX\t154844700\t154845000\t0.4609\t50\nchrX\t154881000\t154890300\t0\t76\nchrX\t154941900\t154942500\t0.2303\t53\nchrX\t155006100\t155007000\t0.0018\t43\nchrX\t155148000\t155148600\t0.0122\t36\nchrX\t155160900\t155161500\t0.3361\t50\nchrX\t155164200\t155164500\t0.2916\t27\nchrX\t155199900\t155201700\t0.3132\t43\nchrX\t155299500\t155304900\t0.0216\t78\nchrX\t155336700\t155369700\t0\t46\nchrX\t155372100\t155386500\t0\t42\nchrX\t155402400\t155403000\t0.3902\t50\nchrX\t155426700\t155427000\t0.3865\t34\nchrX\t155454000\t155468400\t0\t41\nchrX\t155471400\t155504400\t0\t49\nchrX\t155510700\t155511000\t0.2953\t34\nchrX\t155516100\t155522100\t0\t77\nchrX\t155568900\t155569200\t0\t26\nchrX\t155571300\t155571900\t0\t26\nchrX\t155573700\t155574000\t0.5881\t18\nchrX\t155672700\t155673000\t0.3597\t37\nchrX\t155693700\t155694000\t0.3998\t66\nchrX\t155700600\t155703900\t0\t76\nchrX\t155902200\t155903100\t0.4944\t64\nchrX\t156007500\t156007800\t0.5583\t80\nchrX\t156010200\t156030900\t0\t1368\nchrY\t2807700\t2809500\t0.0171\t34\nchrY\t2833800\t2834100\t0.5342\t24\nchrY\t2850900\t2851200\t0.5179\t29\nchrY\t2998500\t2998800\t0.2732\t33\nchrY\t3051900\t3052200\t0.6095\t30\nchrY\t3055200\t3060300\t0.3152\t41\nchrY\t3061800\t3062100\t0.1699\t29\nchrY\t3063900\t3064500\t0.1699\t29\nchrY\t3071400\t3072000\t0.1232\t23\nchrY\t3078000\t3079500\t0.2092\t31\nchrY\t3081600\t3081900\t0.3652\t27\nchrY\t3083400\t3083700\t0.4882\t35\nchrY\t3085800\t3087300\t0.2905\t33\nchrY\t3089400\t3089700\t0.5605\t22\nchrY\t3097500\t3099000\t0.3257\t28\nchrY\t3101700\t3104100\t0.2882\t29\nchrY\t3114300\t3116100\t0.2469\t28\nchrY\t3123000\t3123300\t0.3419\t23\nchrY\t3125100\t3125400\t0.1464\t16\nchrY\t3133500\t3134100\t0.4604\t25\nchrY\t3161100\t3163500\t0.3895\t39\nchrY\t3169800\t3170100\t0.3281\t22\nchrY\t3171300\t3171600\t0.5741\t37\nchrY\t3186000\t3186300\t0.4568\t23\nchrY\t3188100\t3188400\t0.5905\t34\nchrY\t3191100\t3192300\t0.0784\t33\nchrY\t3198600\t3198900\t0.2399\t24\nchrY\t3201900\t3203100\t0.288\t29\nchrY\t3205200\t3205800\t0.2793\t39\nchrY\t3215100\t3216300\t0.1449\t36\nchrY\t3228600\t3230100\t0.2332\t26\nchrY\t3238200\t3238500\t0.1977\t41\nchrY\t3239700\t3240000\t0.6858\t38\nchrY\t3269400\t3269700\t0.4556\t24\nchrY\t3272100\t3272400\t0.5698\t21\nchrY\t3275400\t3276000\t0.105\t36\nchrY\t3281100\t3281400\t0.661\t18\nchrY\t3285900\t3286800\t0.3177\t36\nchrY\t3304800\t3305100\t0.2171\t23\nchrY\t3316200\t3317700\t0.4146\t28\nchrY\t3327600\t3327900\t0.4837\t41\nchrY\t3346500\t3347100\t0.0623\t27\nchrY\t3352800\t3353100\t0.3309\t31\nchrY\t3354300\t3354600\t0.3523\t26\nchrY\t3366000\t3366300\t0.5631\t27\nchrY\t3368100\t3369600\t0.0117\t27\nchrY\t3371700\t3372300\t0.2939\t28\nchrY\t3377700\t3378900\t0.2016\t29\nchrY\t3380100\t3380400\t0.2016\t29\nchrY\t3384000\t3384300\t0.1825\t17\nchrY\t3387600\t3388200\t0.2632\t32\nchrY\t3415800\t3416100\t0.1608\t38\nchrY\t3422100\t3423600\t0.1717\t27\nchrY\t3425700\t3426300\t0.5356\t36\nchrY\t3430500\t3430800\t0.3068\t36\nchrY\t3432600\t3432900\t0.4262\t29\nchrY\t3436200\t3437700\t0.5177\t30\nchrY\t3439500\t3439800\t0.4485\t28\nchrY\t3444300\t3449700\t0\t85\nchrY\t3456300\t3457200\t0.2976\t33\nchrY\t3458700\t3459000\t0.2976\t33\nchrY\t3483300\t3483600\t0.3727\t34\nchrY\t3485100\t3485400\t0.3727\t34\nchrY\t3488100\t3488400\t0.1869\t20\nchrY\t3502800\t3506400\t0.0044\t31\nchrY\t3510900\t3511500\t0.1575\t35\nchrY\t3514500\t3514800\t0.423\t24\nchrY\t3526200\t3527700\t0.3384\t36\nchrY\t3536700\t3537000\t0.2137\t33\nchrY\t3540000\t3541200\t0.3229\t30\nchrY\t3546600\t3546900\t0.2544\t29\nchrY\t3548100\t3548400\t0.2544\t29\nchrY\t3550200\t3550500\t0.1672\t31\nchrY\t3556200\t3557400\t0.2555\t31\nchrY\t3565800\t3566100\t0.3033\t25\nchrY\t3567300\t3567600\t0.6029\t29\nchrY\t3570600\t3573900\t0.2969\t28\nchrY\t3581400\t3581700\t0.2565\t22\nchrY\t3586200\t3586500\t0.3037\t31\nchrY\t3590700\t3591000\t0.5726\t43\nchrY\t3594300\t3594600\t0.3906\t30\nchrY\t3603600\t3605100\t0.2372\t29\nchrY\t3615900\t3616200\t0.5484\t28\nchrY\t3628500\t3628800\t0.243\t38\nchrY\t3630300\t3630600\t0.5396\t34\nchrY\t3633300\t3633600\t0.4986\t33\nchrY\t3643500\t3643800\t0.6273\t28\nchrY\t3645300\t3645600\t0.206\t34\nchrY\t3648300\t3649500\t0.2097\t34\nchrY\t3650700\t3653100\t0.2097\t34\nchrY\t3658800\t3659400\t0.37\t36\nchrY\t3660600\t3662100\t0.5349\t32\nchrY\t3666600\t3666900\t0.3767\t24\nchrY\t3672900\t3673200\t0.582\t33\nchrY\t3693900\t3694800\t0.4698\t36\nchrY\t3698700\t3699300\t0.2759\t30\nchrY\t3708000\t3708300\t0.0621\t34\nchrY\t3715800\t3716400\t0.2054\t34\nchrY\t3720300\t3720600\t0.1094\t33\nchrY\t3749700\t3750000\t0.3101\t41\nchrY\t3752400\t3752700\t0.4719\t27\nchrY\t3755400\t3756000\t0.3245\t30\nchrY\t3771600\t3771900\t0.2512\t28\nchrY\t3774000\t3774300\t0.4638\t28\nchrY\t3787800\t3789300\t0.1149\t30\nchrY\t3793500\t3793800\t0.0811\t30\nchrY\t3800100\t3800400\t0.3711\t27\nchrY\t3804000\t3804600\t0.1398\t38\nchrY\t3805800\t3806100\t0.3153\t30\nchrY\t3807600\t3807900\t0.3153\t30\nchrY\t3814200\t3814500\t0.2853\t32\nchrY\t3824100\t3824400\t0.275\t24\nchrY\t3841500\t3842400\t0.643\t34\nchrY\t3861000\t3861600\t0.3661\t24\nchrY\t3884400\t3885300\t0.0009\t23\nchrY\t3893100\t3894600\t0.3316\t32\nchrY\t3897600\t3897900\t0.2174\t28\nchrY\t3921900\t3922200\t0.4685\t41\nchrY\t3923400\t3924000\t0.3901\t32\nchrY\t3936600\t3937200\t0.2362\t17\nchrY\t3967800\t3969300\t0.3487\t31\nchrY\t3974400\t3975300\t0\t32\nchrY\t3986700\t3987000\t0.3433\t24\nchrY\t3990600\t3990900\t0.3825\t22\nchrY\t3995400\t3995700\t0.3253\t25\nchrY\t3999900\t4000200\t0.5768\t30\nchrY\t4018200\t4018800\t0.2037\t30\nchrY\t4023000\t4023300\t0.0474\t25\nchrY\t4038600\t4039200\t0.3535\t22\nchrY\t4042800\t4043100\t0.4519\t31\nchrY\t4061100\t4061400\t0.5989\t25\nchrY\t4066800\t4067400\t0.3522\t29\nchrY\t4070100\t4070400\t0.4829\t35\nchrY\t4086900\t4087200\t0.5333\t30\nchrY\t4099200\t4099500\t0.5224\t25\nchrY\t4106100\t4106700\t0.1154\t32\nchrY\t4120200\t4120500\t0.2809\t20\nchrY\t4133100\t4133400\t0.2358\t29\nchrY\t4151400\t4151700\t0.4988\t25\nchrY\t4152900\t4153500\t0.0848\t42\nchrY\t4171800\t4172100\t0.3911\t26\nchrY\t4176000\t4176300\t0.3933\t22\nchrY\t4180500\t4180800\t0.5027\t26\nchrY\t4182900\t4183200\t0.5075\t19\nchrY\t4200000\t4200300\t0.4729\t36\nchrY\t4221600\t4223100\t0.2875\t48\nchrY\t4227900\t4228200\t0.3013\t24\nchrY\t4256700\t4257000\t0.5651\t29\nchrY\t4266600\t4267200\t0.0203\t26\nchrY\t4269000\t4269300\t0.525\t29\nchrY\t4275600\t4275900\t0.1471\t35\nchrY\t4278300\t4278600\t0.6355\t33\nchrY\t4282800\t4283100\t0.4742\t31\nchrY\t4284600\t4284900\t0.6116\t25\nchrY\t4291200\t4291500\t0.4497\t28\nchrY\t4310400\t4312500\t0.468\t29\nchrY\t4315500\t4315800\t0.5443\t27\nchrY\t4331100\t4331400\t0.4097\t13\nchrY\t4335300\t4335900\t0.334\t19\nchrY\t4339200\t4339500\t0.2948\t28\nchrY\t4374000\t4374600\t0.2584\t26\nchrY\t4375800\t4376100\t0.3492\t25\nchrY\t4383300\t4383600\t0.5968\t37\nchrY\t4384800\t4386300\t0.2681\t26\nchrY\t4391700\t4392300\t0.2615\t23\nchrY\t4446300\t4446600\t0.4112\t19\nchrY\t4450500\t4452300\t0.1134\t33\nchrY\t4458600\t4458900\t0.4529\t39\nchrY\t4464900\t4465200\t0.3698\t29\nchrY\t4475700\t4476300\t0.5832\t29\nchrY\t4479000\t4479300\t0.2667\t15\nchrY\t4482600\t4482900\t0.0659\t25\nchrY\t4486200\t4486500\t0.6131\t28\nchrY\t4491300\t4491600\t0.3741\t30\nchrY\t4501800\t4502400\t0.2402\t22\nchrY\t4511100\t4511400\t0.1936\t51\nchrY\t4532100\t4532400\t0.2953\t29\nchrY\t4536600\t4536900\t0.3136\t22\nchrY\t4539900\t4540200\t0.0612\t34\nchrY\t4541700\t4542300\t0.157\t41\nchrY\t4551000\t4551300\t0.3849\t38\nchrY\t4553100\t4553400\t0.3849\t38\nchrY\t4574100\t4574700\t0.4723\t34\nchrY\t4595700\t4596000\t0.4237\t29\nchrY\t4614900\t4615200\t0.4313\t24\nchrY\t4618200\t4618500\t0.5307\t29\nchrY\t4624500\t4625400\t0.1667\t35\nchrY\t4627200\t4628100\t0.4463\t24\nchrY\t4632000\t4632600\t0.2087\t29\nchrY\t4647000\t4647300\t0.3909\t28\nchrY\t4651500\t4651800\t0.588\t13\nchrY\t4662600\t4662900\t0.6018\t24\nchrY\t4666500\t4667100\t0.3533\t40\nchrY\t4679400\t4679700\t0.1216\t21\nchrY\t4689000\t4689300\t0.3372\t17\nchrY\t4694400\t4695300\t0.2419\t37\nchrY\t4705500\t4705800\t0.4515\t27\nchrY\t4707600\t4707900\t0.2301\t31\nchrY\t4709100\t4709400\t0.2301\t31\nchrY\t4711200\t4711500\t0.4956\t29\nchrY\t4715400\t4715700\t0.5329\t26\nchrY\t4722300\t4722600\t0.4702\t28\nchrY\t4725900\t4727400\t0.4032\t33\nchrY\t4741200\t4741500\t0.2666\t37\nchrY\t4748700\t4749600\t0.189\t42\nchrY\t4750800\t4751400\t0.189\t42\nchrY\t4760100\t4760400\t0.498\t22\nchrY\t4761600\t4762200\t0.4191\t21\nchrY\t4771500\t4771800\t0.2249\t30\nchrY\t4775400\t4775700\t0.5536\t30\nchrY\t4797900\t4798500\t0.171\t30\nchrY\t4807200\t4807800\t0.0639\t33\nchrY\t4816500\t4816800\t0.4361\t35\nchrY\t4821600\t4822500\t0.325\t37\nchrY\t4833900\t4834200\t0.3356\t25\nchrY\t4850100\t4850400\t0.2573\t24\nchrY\t4851900\t4852200\t0.1844\t28\nchrY\t4862400\t4862700\t0.6345\t23\nchrY\t4889700\t4890000\t0.1458\t24\nchrY\t4891200\t4891800\t0.137\t37\nchrY\t4895100\t4895400\t0.3863\t29\nchrY\t4904100\t4905000\t0.1569\t27\nchrY\t4906500\t4907100\t0.1569\t27\nchrY\t4919700\t4920000\t0.213\t29\nchrY\t4921200\t4921800\t0.213\t29\nchrY\t4929000\t4929300\t0.2753\t35\nchrY\t4949100\t4954800\t0\t74\nchrY\t4961400\t4961700\t0.1948\t29\nchrY\t4963200\t4963800\t0.2397\t29\nchrY\t4965300\t4966800\t0.0809\t36\nchrY\t4975200\t4975800\t0.2322\t50\nchrY\t4977900\t4979100\t0.3625\t42\nchrY\t4983000\t4983300\t0.3247\t29\nchrY\t4987200\t4987500\t0.3502\t21\nchrY\t4992600\t4992900\t0.4413\t35\nchrY\t5000400\t5000700\t0.2643\t44\nchrY\t5007300\t5007900\t0.6166\t21\nchrY\t5010300\t5012100\t0.2261\t31\nchrY\t5013900\t5014200\t0.4642\t27\nchrY\t5033100\t5033400\t0.2977\t27\nchrY\t5035800\t5036400\t0.3899\t31\nchrY\t5042100\t5043000\t0.2367\t45\nchrY\t5047800\t5048400\t0.1593\t32\nchrY\t5052900\t5053200\t0.4753\t33\nchrY\t5054400\t5054700\t0.4753\t33\nchrY\t5063100\t5064300\t0.2215\t30\nchrY\t5071200\t5071500\t0.3107\t28\nchrY\t5074200\t5074500\t0.3686\t21\nchrY\t5077500\t5077800\t0.2886\t28\nchrY\t5084100\t5084400\t0.1962\t23\nchrY\t5085900\t5086200\t0.4165\t34\nchrY\t5096100\t5096400\t0.1737\t25\nchrY\t5098500\t5098800\t0.2114\t32\nchrY\t5118600\t5119800\t0.102\t27\nchrY\t5137200\t5137500\t0.4458\t27\nchrY\t5139900\t5142300\t0.2212\t46\nchrY\t5146800\t5147100\t0.6776\t30\nchrY\t5151900\t5152200\t0.3987\t21\nchrY\t5155800\t5156100\t0.4976\t26\nchrY\t5158200\t5159700\t0.4636\t24\nchrY\t5166300\t5166900\t0.2946\t32\nchrY\t5169000\t5169300\t0.4925\t23\nchrY\t5170800\t5171100\t0.4072\t26\nchrY\t5175000\t5176500\t0.0085\t51\nchrY\t5184300\t5186100\t0.3547\t29\nchrY\t5196600\t5198100\t0.1548\t42\nchrY\t5203800\t5205000\t0.0646\t29\nchrY\t5208900\t5209200\t0.4873\t30\nchrY\t5210400\t5210700\t0.2188\t34\nchrY\t5218500\t5218800\t0.2735\t29\nchrY\t5220900\t5221500\t0.0199\t38\nchrY\t5225100\t5225700\t0.4036\t29\nchrY\t5228100\t5228400\t0.5646\t17\nchrY\t5246100\t5246400\t0.6271\t20\nchrY\t5250000\t5253300\t0.1358\t33\nchrY\t5259900\t5260800\t0\t30\nchrY\t5265300\t5265900\t0.4053\t30\nchrY\t5276700\t5277300\t0.0227\t28\nchrY\t5279400\t5280000\t0.0082\t23\nchrY\t5284800\t5285100\t0.4146\t28\nchrY\t5290800\t5291100\t0.3218\t27\nchrY\t5313600\t5313900\t0.6006\t30\nchrY\t5362500\t5362800\t0.4866\t24\nchrY\t5376900\t5377200\t0.0534\t33\nchrY\t5379900\t5380500\t0.167\t32\nchrY\t5386500\t5387100\t0.4598\t36\nchrY\t5393100\t5394000\t0.257\t36\nchrY\t5400900\t5401200\t0.0938\t23\nchrY\t5407200\t5407500\t0.5539\t38\nchrY\t5409000\t5409600\t0.2669\t25\nchrY\t5411100\t5411400\t0.1499\t40\nchrY\t5414100\t5414400\t0.3019\t19\nchrY\t5438100\t5439000\t0.2711\t28\nchrY\t5442000\t5442300\t0.6551\t35\nchrY\t5445000\t5445300\t0.3752\t24\nchrY\t5463000\t5463600\t0.2337\t36\nchrY\t5473800\t5474400\t0.105\t28\nchrY\t5482800\t5484300\t0.41\t31\nchrY\t5485800\t5486100\t0.2428\t34\nchrY\t5492400\t5492700\t0.4101\t43\nchrY\t5502000\t5502600\t0.3774\t32\nchrY\t5509500\t5510700\t0.3076\t26\nchrY\t5517900\t5520000\t0.3663\t29\nchrY\t5523600\t5523900\t0.2467\t24\nchrY\t5526300\t5527800\t0.2625\t33\nchrY\t5538900\t5539200\t0.5271\t38\nchrY\t5556000\t5556300\t0.4453\t30\nchrY\t5558100\t5558400\t0.4423\t44\nchrY\t5561400\t5564100\t0.3215\t42\nchrY\t5568600\t5569500\t0.0023\t26\nchrY\t5571600\t5573100\t0.2278\t33\nchrY\t5582100\t5582400\t0.3327\t27\nchrY\t5583600\t5583900\t0.3327\t27\nchrY\t5587800\t5588100\t0.5885\t18\nchrY\t5595000\t5595300\t0.4118\t31\nchrY\t5596500\t5597100\t0.0957\t34\nchrY\t5601900\t5602200\t0.3445\t28\nchrY\t5606100\t5612400\t0.0078\t99\nchrY\t5613900\t5614200\t0.0078\t99\nchrY\t5618400\t5618700\t0.6542\t23\nchrY\t5622300\t5622600\t0.5408\t41\nchrY\t5631000\t5631300\t0.3556\t22\nchrY\t5633400\t5633700\t0.5201\t28\nchrY\t5648700\t5649000\t0.4585\t28\nchrY\t5662200\t5662500\t0.4181\t22\nchrY\t5673300\t5673600\t0.314\t23\nchrY\t5676000\t5676300\t0.5717\t28\nchrY\t5689800\t5690100\t0.3998\t30\nchrY\t5691600\t5691900\t0.3998\t30\nchrY\t5693100\t5693700\t0.5258\t37\nchrY\t5700900\t5701200\t0.358\t26\nchrY\t5702400\t5702700\t0.1791\t32\nchrY\t5705400\t5705700\t0.4276\t27\nchrY\t5706900\t5707500\t0.4276\t27\nchrY\t5711100\t5711400\t0.1511\t26\nchrY\t5712900\t5713200\t0.1511\t26\nchrY\t5714400\t5715000\t0.1151\t27\nchrY\t5717700\t5718000\t0.3253\t29\nchrY\t5721600\t5721900\t0.4388\t29\nchrY\t5734800\t5735400\t0.0142\t30\nchrY\t5740800\t5741400\t0.4653\t33\nchrY\t5755800\t5756100\t0.5375\t29\nchrY\t5759700\t5760300\t0.0212\t32\nchrY\t5771100\t5771400\t0.3272\t42\nchrY\t5778900\t5779200\t0.5163\t21\nchrY\t5794500\t5794800\t0.5662\t34\nchrY\t5797800\t5798100\t0.3929\t24\nchrY\t5821500\t5821800\t0.2435\t19\nchrY\t5827200\t5827500\t0.3887\t27\nchrY\t5830200\t5830500\t0.271\t26\nchrY\t5834700\t5835000\t0.2834\t26\nchrY\t5855400\t5855700\t0.2365\t22\nchrY\t5859300\t5859600\t0.1865\t21\nchrY\t5861700\t5862000\t0.1383\t35\nchrY\t5863200\t5863500\t0.1383\t35\nchrY\t5865000\t5866200\t0.1383\t35\nchrY\t5867700\t5868000\t0.1787\t42\nchrY\t5874900\t5876100\t0.077\t31\nchrY\t5890500\t5892300\t0.3194\t38\nchrY\t5904000\t5904300\t0.436\t23\nchrY\t5906100\t5906400\t0.4424\t22\nchrY\t5912100\t5913900\t0.3423\t34\nchrY\t5922600\t5923200\t0.0457\t28\nchrY\t5934600\t5934900\t0.2321\t30\nchrY\t5952300\t5953200\t0.1699\t24\nchrY\t5955600\t5955900\t0.4632\t39\nchrY\t5957100\t5957700\t0.5376\t31\nchrY\t5960400\t5960700\t0.4011\t24\nchrY\t5969100\t5969400\t0.3433\t22\nchrY\t5971500\t5971800\t0.196\t20\nchrY\t6003300\t6005400\t0.2408\t37\nchrY\t6011700\t6012000\t0.1019\t20\nchrY\t6017100\t6017400\t0.4543\t30\nchrY\t6023400\t6023700\t0.6323\t31\nchrY\t6041700\t6042000\t0.4868\t29\nchrY\t6057300\t6057900\t0.4089\t33\nchrY\t6070200\t6070800\t0.1071\t31\nchrY\t6078900\t6079500\t0.5778\t35\nchrY\t6086400\t6087000\t0.1826\t21\nchrY\t6105300\t6105600\t0.3722\t25\nchrY\t6111900\t6112200\t0.4706\t32\nchrY\t6123900\t6124200\t0.2931\t30\nchrY\t6146100\t6146400\t0.3258\t31\nchrY\t6154200\t6154500\t0.4974\t25\nchrY\t6156300\t6156600\t0.6234\t23\nchrY\t6174300\t6174900\t0.046\t36\nchrY\t6191700\t6193200\t0.2732\t27\nchrY\t6221400\t6221700\t0.5576\t19\nchrY\t6224700\t6225000\t0.5613\t28\nchrY\t6235800\t6261900\t0\t173\nchrY\t6263100\t6266400\t0\t173\nchrY\t6267600\t6267900\t0.141\t38\nchrY\t6269100\t6269400\t0.141\t38\nchrY\t6270900\t6271500\t0.19\t37\nchrY\t6273900\t6276300\t0\t54\nchrY\t6278400\t6278700\t0\t54\nchrY\t6280500\t6336900\t0\t54\nchrY\t6338400\t6477000\t0\t51\nchrY\t6480300\t6480600\t0.6185\t30\nchrY\t6482100\t6482400\t0.574\t28\nchrY\t6486300\t6487200\t0.3793\t28\nchrY\t6490800\t6494100\t0\t35\nchrY\t6501900\t6502500\t0.2343\t36\nchrY\t6508500\t6509100\t0.3733\t34\nchrY\t6511200\t6513600\t0\t30\nchrY\t6519300\t6522000\t0.0034\t30\nchrY\t6523200\t6525000\t0.0121\t26\nchrY\t6526800\t6528000\t0.2509\t30\nchrY\t6530700\t6531000\t0.5539\t25\nchrY\t6540900\t6541500\t0.3909\t34\nchrY\t6550800\t6551100\t0.6093\t28\nchrY\t6563100\t6563700\t0.3564\t30\nchrY\t6567600\t6567900\t0.3893\t27\nchrY\t6579900\t6580200\t0.2385\t28\nchrY\t6591000\t6591600\t0.4209\t27\nchrY\t6618900\t6619500\t0.4297\t45\nchrY\t6621900\t6622200\t0.3057\t22\nchrY\t6624900\t6625200\t0.6746\t21\nchrY\t6633300\t6633600\t0.3554\t41\nchrY\t6640200\t6640800\t0.1268\t34\nchrY\t6659100\t6659400\t0.1841\t30\nchrY\t6665400\t6665700\t0.1232\t28\nchrY\t6675300\t6706500\t0\t42\nchrY\t6709200\t6709500\t0.0046\t30\nchrY\t6715800\t6716100\t0.5777\t33\nchrY\t6731700\t6732000\t0.5111\t29\nchrY\t6740400\t6740700\t0.6488\t31\nchrY\t6744900\t6745200\t0.2271\t30\nchrY\t6854100\t6854700\t0.2063\t52\nchrY\t6856800\t6857100\t0.4023\t52\nchrY\t7086900\t7087200\t0.1159\t16\nchrY\t7134900\t7135200\t0.6792\t76\nchrY\t7154700\t7155300\t0.2343\t136\nchrY\t7157100\t7159500\t0.1533\t64\nchrY\t7251900\t7252200\t0.5279\t45\nchrY\t7253700\t7254600\t0.1293\t46\nchrY\t7287600\t7287900\t0.4052\t35\nchrY\t7341000\t7341600\t0.3307\t27\nchrY\t7459800\t7460100\t0.6631\t38\nchrY\t7572000\t7572300\t0.3439\t34\nchrY\t7574400\t7574700\t0.4084\t47\nchrY\t7578000\t7582200\t0\t40\nchrY\t7583700\t7584000\t0.5191\t24\nchrY\t7587900\t7589100\t0\t43\nchrY\t7590600\t7593000\t0\t43\nchrY\t7594500\t7598400\t0\t43\nchrY\t7599600\t7601400\t0\t43\nchrY\t7602900\t7603500\t0\t43\nchrY\t7605300\t7631100\t0\t43\nchrY\t7634400\t7638900\t0\t36\nchrY\t7668000\t7668300\t0.5988\t26\nchrY\t8136000\t8136300\t0.4338\t29\nchrY\t8425200\t8425500\t0.2937\t43\nchrY\t8446200\t8446500\t0.4084\t33\nchrY\t8521500\t8521800\t0.5522\t33\nchrY\t9134100\t9134400\t0.3706\t50\nchrY\t9158100\t9158400\t0.0691\t26\nchrY\t9333600\t9334200\t0.0694\t107\nchrY\t9335700\t9403800\t0\t215\nchrY\t9453600\t9502500\t0\t223\nchrY\t9503700\t9537000\t0\t221\nchrY\t9545400\t9546000\t0.2455\t73\nchrY\t9590700\t9591900\t0.1291\t48\nchrY\t9630000\t9630300\t0.3526\t21\nchrY\t9633000\t9634500\t0.3039\t29\nchrY\t9636000\t9637800\t0\t35\nchrY\t9639000\t9642000\t0\t35\nchrY\t9648300\t9651000\t0\t34\nchrY\t9653100\t9653400\t0.2803\t30\nchrY\t9659700\t9660000\t0.2809\t26\nchrY\t9667800\t9671400\t0\t36\nchrY\t9674700\t9675600\t0.434\t36\nchrY\t9687600\t9802500\t0\t53\nchrY\t9813000\t9836700\t0\t44\nchrY\t9837900\t9894300\t0\t44\nchrY\t9895500\t9895800\t0.5903\t29\nchrY\t9898500\t9903600\t0\t39\nchrY\t9905400\t9907200\t0\t39\nchrY\t9908400\t9918600\t0\t39\nchrY\t9942000\t9947100\t0\t76\nchrY\t10071300\t10074000\t0.5187\t170\nchrY\t10076700\t10077000\t0.6303\t68\nchrY\t10078200\t10079700\t0.5974\t94\nchrY\t10086300\t10087800\t0.5391\t97\nchrY\t10097100\t10097400\t0.5505\t58\nchrY\t10113600\t10113900\t0.6681\t53\nchrY\t10119000\t10119300\t0.5771\t85\nchrY\t10137600\t10137900\t0.6962\t49\nchrY\t10220400\t10221000\t0.2941\t32\nchrY\t10232100\t10232400\t0.6017\t107\nchrY\t10244100\t10244700\t0.5833\t116\nchrY\t10246200\t10266900\t0\t69\nchrY\t10317000\t10544100\t0\t80\nchrY\t10594200\t10621800\t0\t67\nchrY\t10626600\t10633500\t0\t4684\nchrY\t10645800\t10650000\t0\t4661\nchrY\t10651500\t10674000\t0.0561\t4167\nchrY\t10676700\t10679400\t0.2861\t270\nchrY\t10682400\t10694100\t0.1031\t3324\nchrY\t10744200\t10852800\t0.0669\t4048\nchrY\t10855800\t10890600\t0.0733\t1144\nchrY\t10891800\t10896600\t0.1275\t1073\nchrY\t10898100\t10902300\t0.0994\t435\nchrY\t10903800\t10904400\t0.5404\t59\nchrY\t10905900\t10908000\t0.4521\t97\nchrY\t10909500\t10909800\t0.4271\t232\nchrY\t10911600\t10913100\t0.5856\t181\nchrY\t10914300\t10914900\t0.5628\t89\nchrY\t10916400\t10916700\t0.6849\t45\nchrY\t10920300\t10965900\t0.0673\t1357\nchrY\t10967400\t11040900\t0.0718\t8125\nchrY\t11083800\t11084100\t0.6294\t86\nchrY\t11091300\t11091600\t0.4601\t64\nchrY\t11097000\t11098200\t0.4654\t55\nchrY\t11100900\t11101200\t0.6631\t19\nchrY\t11106300\t11106600\t0.3334\t65\nchrY\t11108400\t11108700\t0.5195\t170\nchrY\t11125200\t11125800\t0.2906\t70\nchrY\t11144700\t11145000\t0.2597\t57\nchrY\t11163900\t11164800\t0.2148\t60\nchrY\t11182200\t11186100\t0.5485\t150\nchrY\t11192100\t11193300\t0.4225\t70\nchrY\t11194800\t11196300\t0.3914\t127\nchrY\t11203200\t11203800\t0.3595\t50\nchrY\t11219700\t11220000\t0.3419\t70\nchrY\t11222100\t11222400\t0.339\t128\nchrY\t11229000\t11230200\t0.3892\t75\nchrY\t11239800\t11240700\t0.1767\t138\nchrY\t11247600\t11248800\t0.3167\t69\nchrY\t11250900\t11251200\t0.5807\t51\nchrY\t11254500\t11254800\t0.3198\t64\nchrY\t11256900\t11257200\t0.5835\t49\nchrY\t11259900\t11260200\t0.3164\t49\nchrY\t11261700\t11262900\t0.4216\t106\nchrY\t11264400\t11265300\t0.4216\t106\nchrY\t11267100\t11267400\t0.2753\t53\nchrY\t11273100\t11273400\t0.606\t130\nchrY\t11280300\t11282400\t0.5089\t95\nchrY\t11284200\t11284500\t0.5089\t95\nchrY\t11288100\t11288400\t0.6308\t71\nchrY\t11289600\t11293200\t0.2616\t2484\nchrY\t11294400\t11295000\t0.6635\t1497\nchrY\t11296200\t11315100\t0.101\t14535\nchrY\t11316300\t11334300\t0.2071\t7569\nchrY\t11347200\t11347500\t0.5112\t69\nchrY\t11355000\t11355300\t0.2326\t56\nchrY\t11356800\t11357100\t0.6124\t22\nchrY\t11365500\t11366100\t0.4842\t73\nchrY\t11391300\t11393100\t0.3215\t46\nchrY\t11408400\t11408700\t0.5293\t52\nchrY\t11490600\t11500800\t0.2079\t257\nchrY\t11502300\t11514600\t0.2079\t257\nchrY\t11516700\t11526300\t0.1624\t336\nchrY\t11527500\t11529300\t0.1439\t837\nchrY\t11532300\t11592900\t0\t3239\nchrY\t11643600\t11643900\t0.1362\t15657\nchrY\t11645100\t11654100\t0.1362\t15657\nchrY\t11655600\t11660400\t0.1362\t15657\nchrY\t11662200\t11664600\t0.4291\t85\nchrY\t11665800\t11666400\t0.2009\t293\nchrY\t11668200\t11671500\t0.2457\t146\nchrY\t11672700\t11678700\t0.2342\t162\nchrY\t11679900\t11749500\t0.0966\t31584\nchrY\t11755200\t11757000\t0.307\t49\nchrY\t11861100\t11861400\t0.4215\t38\nchrY\t11863200\t11863500\t0.4799\t33\nchrY\t11935500\t11935800\t0.2012\t43\nchrY\t11990400\t11990700\t0.4301\t33\nchrY\t12220500\t12221100\t0.3719\t53\nchrY\t12313800\t12315000\t0\t40\nchrY\t12319800\t12321300\t0\t40\nchrY\t12372000\t12372300\t0.5969\t1442\nchrY\t12497700\t12498000\t0.6086\t29\nchrY\t12849600\t12851400\t0.018\t32\nchrY\t12985800\t12986100\t0.5993\t22\nchrY\t13029000\t13029300\t0.6984\t45\nchrY\t13113000\t13114200\t0\t41\nchrY\t13120500\t13122000\t0\t33\nchrY\t13131000\t13131300\t0.2575\t59\nchrY\t13166700\t13167000\t0.1983\t42\nchrY\t13179300\t13181700\t0.1998\t57\nchrY\t13183800\t13184100\t0.225\t38\nchrY\t13529100\t13529400\t0.2279\t107\nchrY\t13561800\t13562100\t0.2394\t56\nchrY\t13563600\t13564200\t0.0696\t89\nchrY\t13726800\t13727100\t0.2661\t71\nchrY\t13770000\t13770300\t0.3283\t30\nchrY\t13772100\t13772700\t0.2858\t49\nchrY\t13900500\t13901700\t0.2682\t37\nchrY\t13955700\t13956300\t0.503\t43\nchrY\t13984500\t14019600\t0\t46\nchrY\t14023200\t14058300\t0\t49\nchrY\t14180700\t14181000\t0.4791\t22\nchrY\t14193900\t14194200\t0.587\t28\nchrY\t14489400\t14489700\t0.2429\t27\nchrY\t14673000\t14673300\t0.3525\t35\nchrY\t14722500\t14723100\t0.4488\t33\nchrY\t14884800\t14885100\t0.4036\t42\nchrY\t14923800\t14924400\t0.2166\t49\nchrY\t14962800\t14963100\t0.3831\t42\nchrY\t15032100\t15032400\t0.4142\t40\nchrY\t15087900\t15088200\t0.3482\t45\nchrY\t15237300\t15237600\t0.4653\t23\nchrY\t15723000\t15723300\t0.2223\t52\nchrY\t15875100\t15883500\t0\t124\nchrY\t15896400\t15904500\t0\t105\nchrY\t16159800\t16269600\t0\t51\nchrY\t16315800\t16425600\t0\t57\nchrY\t16535700\t16536000\t0.4921\t39\nchrY\t16870500\t16870800\t0.2222\t61\nchrY\t16914000\t16914300\t0.1624\t47\nchrY\t16917300\t16917600\t0.3236\t54\nchrY\t16990500\t16991100\t0.5834\t40\nchrY\t17061300\t17066700\t0\t76\nchrY\t17075400\t17076000\t0.4449\t38\nchrY\t17077500\t17077800\t0.3672\t34\nchrY\t17098500\t17098800\t0.3272\t38\nchrY\t17181600\t17181900\t0.5503\t20\nchrY\t17228100\t17228400\t0.3208\t26\nchrY\t17375100\t17377500\t0\t62\nchrY\t17435400\t17435700\t0.4422\t23\nchrY\t17455800\t17951100\t0\t63\nchrY\t17954700\t18640200\t0\t64\nchrY\t18680100\t18870000\t0\t50\nchrY\t18992100\t18992400\t0.4908\t30\nchrY\t19353600\t19353900\t0.6478\t33\nchrY\t19413300\t19413600\t0.4034\t57\nchrY\t19446000\t19446300\t0.6116\t20\nchrY\t19582800\t19584000\t0\t32\nchrY\t19667700\t19668300\t0.1543\t55\nchrY\t19678200\t19679100\t0.02\t48\nchrY\t19780500\t19781400\t0\t34\nchrY\t20053800\t20062800\t0\t85\nchrY\t20064000\t20065500\t0\t85\nchrY\t20069400\t20070900\t0\t50\nchrY\t20073600\t20073900\t0.6611\t17\nchrY\t20077800\t20078700\t0.1089\t42\nchrY\t20079900\t20091000\t0\t88\nchrY\t20092200\t20092500\t0.6248\t65\nchrY\t20094900\t20095500\t0.0923\t18\nchrY\t20096700\t20100300\t0\t42\nchrY\t20102100\t20108700\t0\t112\nchrY\t20112300\t20115300\t0\t127\nchrY\t20120100\t20124900\t0\t93\nchrY\t20127300\t20131500\t0\t52\nchrY\t20133000\t20136000\t0\t51\nchrY\t20139300\t20139600\t0.4184\t38\nchrY\t20142300\t20154300\t0\t78\nchrY\t20158200\t20177100\t0\t96\nchrY\t20179500\t20183100\t0\t44\nchrY\t20184900\t20207700\t0\t239\nchrY\t20258400\t20262900\t0\t131\nchrY\t20264400\t20265600\t0\t84\nchrY\t20268000\t20274300\t0\t84\nchrY\t20277300\t20277600\t0.5358\t82\nchrY\t20280000\t20280300\t0.4999\t59\nchrY\t20285400\t20295600\t0\t380\nchrY\t20318700\t20321400\t0\t56\nchrY\t20322900\t20344800\t0\t229\nchrY\t20346000\t20350800\t0.4309\t254\nchrY\t20371200\t20371800\t0.2192\t58\nchrY\t20473200\t20475600\t0.0241\t64\nchrY\t20690400\t20690700\t0.2685\t30\nchrY\t20872500\t20872800\t0.6289\t33\nchrY\t20958900\t20959500\t0.1668\t53\nchrY\t21008700\t21021600\t0\t40\nchrY\t21051600\t21063300\t0\t42\nchrY\t21065100\t21066600\t0\t29\nchrY\t21293100\t21293400\t0.2017\t43\nchrY\t21330600\t21330900\t0.4724\t27\nchrY\t21403500\t21403800\t0.3228\t39\nchrY\t21426600\t21426900\t0.2782\t36\nchrY\t21477300\t21477600\t0.3739\t43\nchrY\t21493800\t21567300\t0\t73\nchrY\t21615900\t21616200\t0.4783\t32\nchrY\t21705900\t21706200\t0.0565\t36\nchrY\t21714600\t21738900\t0\t23\nchrY\t21741600\t21750000\t0\t26\nchrY\t21756000\t21789000\t0\t41\nchrY\t21862200\t22208700\t0\t86\nchrY\t22241100\t22242000\t0.318\t16\nchrY\t22274700\t22275000\t0.4872\t25\nchrY\t22288800\t22289400\t0.1461\t52\nchrY\t22313400\t22314000\t0.4668\t29\nchrY\t22341900\t22342800\t0.1696\t74\nchrY\t22344300\t22344900\t0.1696\t74\nchrY\t22377600\t22725900\t0\t53\nchrY\t22730700\t22734600\t0.0225\t42\nchrY\t22735800\t22739700\t0.0225\t42\nchrY\t22741500\t22742400\t0.0225\t42\nchrY\t22743600\t26311500\t0\t69\nchrY\t26345100\t26345400\t0.5778\t31\nchrY\t26407500\t26407800\t0.4148\t30\nchrY\t26436900\t26437200\t0.6871\t129\nchrY\t26440500\t26441100\t0.3966\t170\nchrY\t26511600\t26511900\t0.4686\t24\nchrY\t26514600\t26514900\t0.6505\t30\nchrY\t26589000\t26589300\t0.444\t45\nchrY\t26637900\t26670000\t0.06\t1063\nchrY\t26671800\t26673300\t0.1076\t600\nchrY\t56673000\t56771700\t0\t28529\nchrY\t56825700\t56830500\t0.4436\t1724\nchrY\t56832600\t56837100\t0.4786\t3185\nchrY\t56838900\t56839500\t0.6016\t925\nchrY\t56842200\t56842500\t0.6384\t926\nchrY\t56846100\t56847300\t0.6157\t547\nchrY\t56850300\t56851200\t0.4243\t1367\nchrY\t56884500\t56884800\t0.5545\t46\n"
  },
  {
    "path": "tracks/region_generator.R",
    "content": "library(data.table)\noptions(scipen = 999)\n\n# Load hg38 chromosome sizes from UCSC\nchr_sizes <- fread(\"https://hgdownload.soe.ucsc.edu/goldenPath/hg38/bigZips/hg38.chrom.sizes\", col.names = c(\"chrom\", \"size\"))\nchr_sizes <- chr_sizes[chrom %in% paste0(\"chr\", c(1:22, \"X\"))]\n\n# Centromere positions (approximate from UCSC Table Browser / literature)\ncentromeres <- fread(\"\nchrom start end\nchr1 121700000 124600000\nchr2 91800000 94000000\nchr3 87800000 94000000\nchr4 48200000 50700000\nchr5 46100000 50700000\nchr6 58600000 63400000\nchr7 58000000 62700000\nchr8 43900000 48100000\nchr9 47100000 50700000\nchr10 39100000 42900000\nchr11 51400000 55800000\nchr12 34700000 38600000\nchr13 16000000 19500000\nchr14 16000000 19000000\nchr15 17000000 20500000\nchr16 35300000 38200000\nchr17 22100000 25800000\nchr18 15400000 18700000\nchr19 24400000 28000000\nchr20 25800000 30000000\nchr21 10900000 14300000\nchr22 12000000 15400000\nchrX 58000000 61900000\n\")\n\n# Construct p and q arms\nbed <- rbindlist(lapply(1:nrow(chr_sizes), function(i) {\n  chrom <- chr_sizes$chrom[i]\n  size  <- chr_sizes$size[i]\n  cent  <- centromeres[chrom == chrom]\n\n  if (nrow(cent) == 0) return(NULL)\n\n  data.table(\n    chrom = c(chrom, chrom),\n    start = c(0, cent$end),\n    end   = c(cent$start, size)\n  )\n}))\n\n# Natural chromosome order: chr1 chr22, chrX\nbed[, chrom := factor(chrom, levels = paste0(\"chr\", c(1:22, \"X\")))]\n\n# Sort by chromosome and start position\nsetorder(bed, chrom, start)\n\n# Write to BED file\nfwrite(bed, \"hg38_arms_excl_centromeres.bed\", sep = \"\\t\", col.names = FALSE)\n"
  }
]