├── BalancedRowsumsCalculation.ipynb ├── CalculatingFilledBinFractionByDistance.ipynb ├── ContactMapVisualizationExampleNotebook.ipynb ├── LICENSE ├── LoopStrengthRCMC.ipynb ├── MicrocompartmentLoops_PlusMin1kb.bedpe ├── PileupsRCMC.ipynb ├── README.md ├── captureprobes_mm10.bed ├── captureprobes_mm39.bed ├── loopFeatureOverlap.R ├── microcbowtie2.py └── spikeinChIP_PE_alignment.py /BalancedRowsumsCalculation.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# import libraries\n", 10 | "import numpy as np\n", 11 | "import matplotlib.pyplot as plt\n", 12 | "import pandas as pd\n", 13 | "import os\n", 14 | "import cooltools\n", 15 | "import cooler" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "## Load in microcompartment loop anchors" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 10, 28 | "metadata": {}, 29 | "outputs": [ 30 | { 31 | "data": { 32 | "text/html": [ 33 | "
\n", 34 | "\n", 47 | "\n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | "
chrstartend
0chr53127300031275000
1chr53129550031297500
2chr53130670031308700
3chr53131050031312500
4chr53133620031338200
............
127chr88578575085787750
128chr88579730085799300
129chr88580200085804000
130chr88580650085808500
131chr88580900085811000
\n", 125 | "

132 rows × 3 columns

\n", 126 | "
" 127 | ], 128 | "text/plain": [ 129 | " chr start end\n", 130 | "0 chr5 31273000 31275000\n", 131 | "1 chr5 31295500 31297500\n", 132 | "2 chr5 31306700 31308700\n", 133 | "3 chr5 31310500 31312500\n", 134 | "4 chr5 31336200 31338200\n", 135 | ".. ... ... ...\n", 136 | "127 chr8 85785750 85787750\n", 137 | "128 chr8 85797300 85799300\n", 138 | "129 chr8 85802000 85804000\n", 139 | "130 chr8 85806500 85808500\n", 140 | "131 chr8 85809000 85811000\n", 141 | "\n", 142 | "[132 rows x 3 columns]" 143 | ] 144 | }, 145 | "execution_count": 10, 146 | "metadata": {}, 147 | "output_type": "execute_result" 148 | } 149 | ], 150 | "source": [ 151 | "# Load in the locations of all unique microcompartment anchors in BED format with chromosome, start (anchor coordinate minus 1 kb) and end (anchor coordinate plus 1 kb) columns\n", 152 | "anchors = pd.read_csv(r'FILE_PATH_TO_ANCHOR_LIST.bed', sep='\\t', header=None, names=['chr','start','end'])\n", 153 | "anchors" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 11, 159 | "metadata": {}, 160 | "outputs": [], 161 | "source": [ 162 | "# Calculate the anchor coordinate by averaging the start & end coordinates, and create a DataFrame containing just the chromosome and anchor coordinate\n", 163 | "anchors['midpoint'] = (anchors['end'] + anchors['start']) // 2\n", 164 | "anchorList = anchors[['chr','midpoint']]\n", 165 | "\n", 166 | "# Subset the DataFrame of anchors to separate out the microcompartment anchors in Klf1 (on chr8) and in Ppm1g (on chr5)\n", 167 | "anchorDataframeKlf1 = anchorList[anchorList['chr'] == 'chr8']\n", 168 | "anchorDataframePpm1g = anchorList[anchorList['chr'] == 'chr5']\n", 169 | "\n", 170 | "# Convert the region-separated anchor lists from DataFrames to lists for ease of downstream use\n", 171 | "anchorListKlf1 = anchorDataframeKlf1['midpoint'].tolist()\n", 172 | "anchorListPpm1g = anchorDataframePpm1g['midpoint'].tolist()" 173 | ] 174 | }, 175 | { 176 | "cell_type": "markdown", 177 | "metadata": {}, 178 | "source": [ 179 | "## Calculate rowsums and plot their distribution\n", 180 | "### Whole-region balancing calculations" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 47, 186 | "metadata": {}, 187 | "outputs": [ 188 | { 189 | "data": { 190 | "image/png": "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\n", 191 | "text/plain": [ 192 | "
" 193 | ] 194 | }, 195 | "metadata": { 196 | "needs_background": "light" 197 | }, 198 | "output_type": "display_data" 199 | } 200 | ], 201 | "source": [ 202 | "# Usage: Plot different datasets & regions by updating the filename and \"region = regionsRCMC[x]\" attributes, respectively \n", 203 | "\n", 204 | "saveDir = f'DIRECTORY_PATH'\n", 205 | "fileName = f'FILE_NAME.svg' # swap out .svg for the desired output file format\n", 206 | "\n", 207 | "# Specify the data resolution at which balanced rowsums will be calculated\n", 208 | "resolution = 250\n", 209 | "\n", 210 | "# Load in the desired dataset\n", 211 | "clr_Data = cooler.Cooler('FILE_PATH_TO_MCOOL::resolutions/'+str(resolution))\n", 212 | "\n", 213 | "# List the Capture regions for region-by-region calculations\n", 214 | "## For an apples-to-apples comparison, balanced rowsums are calculated at the RCMC regions for both the RCMC dataset as well as the genome-wide Micro-C (Hsieh 2020) and Hi-C (Bonev 2017) datasets\n", 215 | "regionsRCMC = ['chr3:33804149-35704149','chr5:31257344-32382344','chr6:122451959-122876959','chr8:84846629-85856629','chr18:58032072-59034072']\n", 216 | "\n", 217 | "# Specify which specific region you would like to calculate rowsums for\n", 218 | "region = regionsRCMC[3]\n", 219 | "\n", 220 | "# Load in the balanced contact matrix for the specified region\n", 221 | "regionMat = clr_Data.matrix(balance=True).fetch(region)\n", 222 | "\n", 223 | "# Create arrays of zeroes corresponding to the lengths (rows & columns) of the loaded in contact matrices\n", 224 | "## The code here calculates both the rowsums and columnsums; they should be the same distribution, so you only need 1 of the 2\n", 225 | "rowSum = np.zeros(len(regionMat))\n", 226 | "columnSum = np.zeros(len(regionMat[0]))\n", 227 | "\n", 228 | "\n", 229 | "# Iterate through the matrix bin-by-bin, summing up the balanced contact bin values for each row & column\n", 230 | "## Only need to iterate through one half of the contact matrix (i.e., the half above the diagonal or the half below it) to capture it all due to reflected symmetry\n", 231 | "i = 0\n", 232 | "while i < len(regionMat):\n", 233 | " j = i # Ensures that we keep our iteration to one side of the diagonal instead of spanning the whole matrix \n", 234 | " while j < len(regionMat[0]):\n", 235 | " val = regionMat[i][j] # Extracts the balanced value of the contact bin\n", 236 | " if np.isnan(val):\n", 237 | " val = 0 # NaN values can cause calculation errors, so this sets them to 0\n", 238 | " rowSum[i] += val # Adds the balanced value to the corresponding rowsum\n", 239 | " columnSum[j] += val # Adds the balanced value to the corresponding columnsum\n", 240 | " \n", 241 | " if j != i: # If j = i, then we're on the diagonal and there's no need to add in the reflected twin of the contact bin\n", 242 | " rowSum[j] += val # Adds the balanced value of the reflected twin to the corresponding rowsum\n", 243 | " columnSum[i] += val # Adds the balanced value of the reflected twin to the corresponding columnsum\n", 244 | " j += 1\n", 245 | " i += 1\n", 246 | "\n", 247 | "# Plotting the rowsums and columnsums yields the same distribution, so this just runs ahead with the rowsums\n", 248 | "## This filters out the rowsums that are 0 (i.e., those that correspond to empty stripes, either due to probe coverage or hard-to-map sites)\n", 249 | "rowSumFilt = []\n", 250 | "for i in rowSum:\n", 251 | " if i > 0:\n", 252 | " rowSumFilt.append(i)\n", 253 | "\n", 254 | "\n", 255 | "# Plot a histogram of the rowsums\n", 256 | "## Change the number of histogram bins as desired (100 used here)\n", 257 | "## Change the range of visualization to capture and visually center the entire distribution\n", 258 | "plt.hist(rowSumFilt,100,range=[3.75,8.25],align='mid',color='blue') # Klf1\n", 259 | "# plt.hist(rowSumFilt,100,range=[1.1,3.4],align='mid',color='blue') # Ppm1g\n", 260 | "# plt.hist(rowSumFilt,100,range=[0.3,1.0],align='mid',color='blue') # Fbn2\n", 261 | "# plt.hist(rowSumFilt,100,range=[0.5,1.3],align='mid',color='blue') # Sox2\n", 262 | "\n", 263 | "# plt.savefig(saveDir + fileName, dpi=1200)" 264 | ] 265 | }, 266 | { 267 | "cell_type": "markdown", 268 | "metadata": {}, 269 | "source": [ 270 | "### Microcompartment-containing bins balancing calculations" 271 | ] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "execution_count": 37, 276 | "metadata": {}, 277 | "outputs": [ 278 | { 279 | "data": { 280 | "image/png": "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\n", 281 | "text/plain": [ 282 | "
" 283 | ] 284 | }, 285 | "metadata": { 286 | "needs_background": "light" 287 | }, 288 | "output_type": "display_data" 289 | } 290 | ], 291 | "source": [ 292 | "# Same approach as above, though now limited to only those contact bins containing microcompartment anchors\n", 293 | "# Usage: Plot different datasets & regions by updating the filename, \"region = regionsRCMC[x]\", and \"anchorReg = x\" attributes \n", 294 | "\n", 295 | "saveDir = f'DIRECTORY_PATH'\n", 296 | "fileName = f'FILE_NAME.svg' # swap out .svg for the desired output file format\n", 297 | "\n", 298 | "# Specify the data resolution at which balanced rowsums will be calculated\n", 299 | "resolution = 250\n", 300 | "\n", 301 | "# Load in the desired dataset\n", 302 | "clr_Data = cooler.Cooler('FILE_PATH_TO_MCOOL::resolutions/'+str(resolution))\n", 303 | "\n", 304 | "# List the Capture regions for region-by-region calculations\n", 305 | "## For an apples-to-apples comparison, balanced rowsums are calculated at the RCMC regions for both the RCMC dataset as well as the genome-wide Micro-C (Hsieh 2020) and Hi-C (Bonev 2017) datasets\n", 306 | "regionsRCMC = ['chr3:33804149-35704149','chr5:31257344-32382344','chr6:122451959-122876959','chr8:84846629-85856629','chr18:58032072-59034072']\n", 307 | "\n", 308 | "# Specify which specific region you would like to calculate rowsums for\n", 309 | "region = regionsRCMC[1]\n", 310 | "\n", 311 | "# Load in the balanced contact matrix for the specified region\n", 312 | "regionMat = clr_Data.matrix(balance=True).fetch(region)\n", 313 | "\n", 314 | "# Specify the region of interest (either Klf1 or Ppm1g) for which to load in microcompartment anchors\n", 315 | "anchorReg = 'Ppm1g'\n", 316 | "if anchorReg == 'Klf1':\n", 317 | " anchors = anchorListKlf1\n", 318 | " offset = 84846629 # This offset is the start coordinate of the Klf1 region, allowing genomic coordinate conversion to bins\n", 319 | "if anchorReg == 'Ppm1g':\n", 320 | " anchors = anchorListPpm1g\n", 321 | " offset = 31257344 # This offset is the start coordinate of the Ppm1g region, allowing genomic coordinate conversion to bins\n", 322 | "\n", 323 | "# Create a list of bins which contain microcompartment anchors\n", 324 | "bins = []\n", 325 | "for i in anchors:\n", 326 | " bins.append((i - offset) // resolution)\n", 327 | "\n", 328 | "# Create arrays of zeroes corresponding to the lengths (rows & columns) of the loaded in contact matrices\n", 329 | "## The code here calculates both the rowsums and columnsums; they should be the same distribution, so you only need 1 of the 2\n", 330 | "rowSum = np.zeros(len(regionMat))\n", 331 | "columnSum = np.zeros(len(regionMat[0]))\n", 332 | "\n", 333 | "\n", 334 | "# Iterate through the matrix bin-by-bin, summing up the balanced contact bin values for each row & column that contains a microcompartment anchor\n", 335 | "## Only need to iterate through one half of the contact matrix (i.e., the half above the diagonal or the half below it) to capture it all due to reflected symmetry\n", 336 | "i = 0\n", 337 | "while i < len(regionMat):\n", 338 | " j = i # Ensures that we keep our iteration to one side of the diagonal instead of spanning the whole matrix \n", 339 | " while j < len(regionMat[0]):\n", 340 | " if((i in bins) or (j in bins)): # The only difference from the calculation for the whole-region calculation, this if statement ensures that rowsums and columnsumes are only calculated for bins containing a microcompartment anchor \n", 341 | " val = regionMat[i][j] # Extracts the balanced value of the contact bin\n", 342 | " if np.isnan(val):\n", 343 | " val = 0 # NaN values can cause calculation errors, so this sets them to 0\n", 344 | " rowSum[i] += val # Adds the balanced value to the corresponding rowsum\n", 345 | " columnSum[j] += val # Adds the balanced value to the corresponding columnsum\n", 346 | "\n", 347 | " if j != i: # If j = i, then we're on the diagonal & there's no need to add in the reflected twin of the contact bin\n", 348 | " rowSum[j] += val # Adds the balanced value of the reflected twin to the corresponding rowsum\n", 349 | " columnSum[i] += val # Adds the balanced value of the reflected twin to the corresponding columnsum\n", 350 | " j += 1\n", 351 | " i += 1\n", 352 | "\n", 353 | "\n", 354 | "# Plotting the rowsums and columnsums yields the same distribution, so this just runs ahead with the rowsums\n", 355 | "## This selects for bins containing microcompartment anchors and filters out the rowsums that are 0\n", 356 | "## Note: Filtering for non-zero bins likely changes nothing since microcompartment anchor-containing bins are guaranteed not empty. Keeping it nonetheless for homogeneity with the whole-region calculation.\n", 357 | "rowSumFilt = []\n", 358 | "for x in bins:\n", 359 | " microcompRowSum = rowSum[x] # Extract the rowsum value of a microcompartment anchor-containing bin\n", 360 | " if microcompRowSum > 0:\n", 361 | " rowSumFilt.append(microcompRowSum) # Add the rowsum to the list of microcompartment rowsums if its greater than 0\n", 362 | " rowSumFilt.append()\n", 363 | "\n", 364 | " \n", 365 | "# Plot a histogram of the rowsums\n", 366 | "## Change the number of histogram bins as desired (100 used here)\n", 367 | "## Change the range of visualization to capture and visually center the entire distribution\n", 368 | "# plt.hist(rowSumFilt,100,range=[3.75,8.25],align='mid',color='navy') # Klf1\n", 369 | "plt.hist(rowSumFilt,100,range=[1.1,3.4],align='mid',color='navy') # Ppm1g\n", 370 | "\n", 371 | "# plt.savefig(saveDir + fileName, dpi=1200)" 372 | ] 373 | }, 374 | { 375 | "cell_type": "code", 376 | "execution_count": null, 377 | "metadata": {}, 378 | "outputs": [], 379 | "source": [] 380 | } 381 | ], 382 | "metadata": { 383 | "kernelspec": { 384 | "display_name": "Python [conda env:coolToolsEnv]", 385 | "language": "python", 386 | "name": "conda-env-coolToolsEnv-py" 387 | }, 388 | "language_info": { 389 | "codemirror_mode": { 390 | "name": "ipython", 391 | "version": 3 392 | }, 393 | "file_extension": ".py", 394 | "mimetype": "text/x-python", 395 | "name": "python", 396 | "nbconvert_exporter": "python", 397 | "pygments_lexer": "ipython3", 398 | "version": "3.8.12" 399 | } 400 | }, 401 | "nbformat": 4, 402 | "nbformat_minor": 4 403 | } 404 | -------------------------------------------------------------------------------- /CalculatingFilledBinFractionByDistance.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Counting fraction of filled bins across contact distances" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 2, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "# import core packages\n", 17 | "import warnings\n", 18 | "warnings.filterwarnings(\"ignore\")\n", 19 | "from itertools import combinations\n", 20 | "\n", 21 | "import matplotlib.pyplot as plt\n", 22 | "from matplotlib import colors\n", 23 | "%matplotlib inline\n", 24 | "plt.style.use('seaborn-poster')\n", 25 | "import numpy as np\n", 26 | "import pandas as pd\n", 27 | "\n", 28 | "# import open2c libraries\n", 29 | "import bioframe\n", 30 | "import cooler\n", 31 | "import cooltools\n", 32 | "\n", 33 | "from packaging import version\n", 34 | "if version.parse(cooltools.__version__) < version.parse('0.5.0'):\n", 35 | " raise AssertionError(\"tutorials rely on cooltools version 0.5.0 or higher,\"+\n", 36 | " \"please check your cooltools version and update to the latest\")\n", 37 | "\n", 38 | " \n", 39 | "resolution = 100 # input the desired data resolution for analysis\n", 40 | "distances = [1000,2500,5000,10000,25000,50000,100000,250000,500000,1000000] # input the desired contact distance diagonals in bp\n", 41 | "\n", 42 | "# Load in each of the datasets at the specified resolution\n", 43 | "clr_RCMC = cooler.Cooler('FILE_PATH_TO_MCOOL::resolutions/' + str(resolution))\n", 44 | "clr_TMCC = cooler.Cooler('FILE_PATH_TO_MCOOL::resolutions/' + str(resolution))\n", 45 | "clr_Hsieh = cooler.Cooler('FILE_PATH_TO_MCOOL::resolutions/' + str(resolution))\n", 46 | "clr_Bonev = cooler.Cooler('FILE_PATH_TO_MCOOL::resolutions/' + str(resolution))\n", 47 | "\n", 48 | "# List the Capture regions for RCMC & TMCC\n", 49 | "## To ensure an apples-to-apples comparison, the genome-wide Micro-C (Hsieh 2020) and Hi-C (Bonev 2017) datasets will be analyzed for the same regions as RCMC instead of across the entire genome\n", 50 | "regionsRCMC = ['chr3:33804149-35704149','chr5:31257344-32382344','chr6:122451959-122876959','chr8:84846629-85856629','chr18:58032072-59034072']\n", 51 | "regionsTMCC = ['chr3:34365200-35640000','chr6:122606805-122856450']\n", 52 | "\n", 53 | "\n", 54 | "# Variables for storing fill fraction data\n", 55 | "countsAcrossDistances = [] # Stores the fraction of all non-empty bins for each dataset (across all regions) for each of the specified contact distances\n", 56 | "nonZeroFracsByRegionAcrossDistances = [] # Stores the fraction of all non-empty bins for each dataset (region-separated) for each of the specified contact distances\n", 57 | "\n", 58 | "for distance in distances:\n", 59 | " compiledCounts = [] # Stores the total number of bins and number of non-empty bins for each region of each dataset at the given contact distance\n", 60 | "\n", 61 | " coolers = [clr_RCMC,clr_TMCC,clr_Hsieh,clr_Bonev]\n", 62 | " coolerIt = 0 # An iterating variable for going through each of the datasets\n", 63 | " while coolerIt < len(coolers):\n", 64 | " if coolerIt == 1:\n", 65 | " regions = regionsTMCC # Use the TMCC regions for calculation for the TMCC dataset\n", 66 | " else:\n", 67 | " regions = regionsRCMC # Use the RCMC regions for calculation for the RCMC, Hsieh, & Bonev datasets\n", 68 | "\n", 69 | " totBins = [] # Counts the number of total contact bins for at the given contact distance\n", 70 | " nonZeroBins = [] # Counts the number of contact bins that have at least one read in them at the given contact distance\n", 71 | "\n", 72 | " for i in regions: \n", 73 | " # Iterating region by region for the given dataset, load in the contact matrix\n", 74 | " # Keep balancing off to count raw read counts\n", 75 | " regionMat = coolers[coolerIt].matrix(balance=False).fetch(i)\n", 76 | " \n", 77 | " bins = len(regionMat) # Get the number of genomic bins across the matrix\n", 78 | " offset = distance // resolution - 1 # Calculate the number of fewer genomic bins at the given contact distance\n", 79 | " binsAtDiag = bins - offset # Calculate the total number of contact bins at the contact distance\n", 80 | " totBins.append(binsAtDiag)\n", 81 | "\n", 82 | " # Set the stage for iterating across the contact diagonal at the given distance to count the number of empty bins\n", 83 | " x = offset\n", 84 | " y = 0\n", 85 | " nonZeroCount = 0\n", 86 | " \n", 87 | " # Iterate through the contact diagonal tallying non-empty bins until the end of the diagonal\n", 88 | " while x < len(regionMat):\n", 89 | " val = regionMat[y][x]\n", 90 | " if val > 0:\n", 91 | " nonZeroCount += 1\n", 92 | " x += 1\n", 93 | " y += 1\n", 94 | " nonZeroBins.append(nonZeroCount)\n", 95 | "\n", 96 | " binCounts = [totBins,nonZeroBins] # Combine the total bin & non-empty bin counts into a tuple\n", 97 | " compiledCounts.append(binCounts) # Add the combined tuple for the given dataset & region to compiledCounts\n", 98 | "\n", 99 | " coolerIt += 1 # Onwards to the next cooler in the dataset list\n", 100 | "\n", 101 | " # print(compiledCounts) # Sanity check that the code is working \n", 102 | "\n", 103 | " totNonZeroFrac = [] # Stores the across-regions fraction of non-empty bins for each dataset at a given contact distance\n", 104 | " nonZeroFracsByRegion = [] # The region-separated version of totNonZeroFrac\n", 105 | "\n", 106 | " # Iterate through compiledCounts to extract filled bin fractions\n", 107 | " for i in compiledCounts:\n", 108 | " sumPossible = sum(i[0]) # Sums the total number of bins across all regions for a dataset\n", 109 | " sumNonZero = sum(i[1]) # Sums the total number of non-empty bins across all regions for a dataset\n", 110 | " totNonZeroFrac.append(sumNonZero / sumPossible) # Adds the non-empty bin fraction to totNonZeroFrac\n", 111 | "\n", 112 | " regionFracs = [] # An array to hold the non-empty bin fraction by region for a given dataset\n", 113 | " for j in range(len(i[0])): # Iterate across the regions\n", 114 | " fracNonZero = i[1][j] / i[0][j] # Calculate non-empty bin fraction for the given region\n", 115 | " regionFracs.append(fracNonZero) # Add the calculated fraction to regionFracs\n", 116 | " nonZeroFracsByRegion.append(regionFracs) # Add the array of non-empty bin fractions by region to nonZeroFracsByRegion\n", 117 | "\n", 118 | " # print(totNonZeroFrac) # Double-check that totNonZeroFrac is calculating as expected\n", 119 | " # print(nonZeroFracsByRegion) # Double-check that nonZeroFracsByRegion is calculating as expected\n", 120 | " \n", 121 | " countsAcrossDistances.append(totNonZeroFrac) # Add totNonZeroFrac, which contains the non-zero bin fraction for each dataset at the given contact distance, to countsAcrossDistances\n", 122 | " nonZeroFracsByRegionAcrossDistances.append(nonZeroFracsByRegion) # Add nonZeroFracsByRegion, which contains the region-separated non-zero bin fraction for each dataset at the given contact distance, to nonZeroFracsByRegionAcrossDistances\n", 123 | " \n", 124 | "countsAcrossDistances # Print the output of countsAcrossDistances to confirm that it produces a logical result" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 3, 130 | "metadata": {}, 131 | "outputs": [], 132 | "source": [ 133 | "# Separate the nested array of countsAcrossDistance by dataset for ease of calculation & plotting\n", 134 | "RCMCcounts = []\n", 135 | "TMCCcounts = []\n", 136 | "Hsiehcounts = []\n", 137 | "Bonevcounts = []\n", 138 | "\n", 139 | "for i in countsAcrossDistances:\n", 140 | " RCMCcounts.append(i[0])\n", 141 | " TMCCcounts.append(i[1])\n", 142 | " Hsiehcounts.append(i[2])\n", 143 | " Bonevcounts.append(i[3])" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": 6, 149 | "metadata": {}, 150 | "outputs": [], 151 | "source": [ 152 | "# Separate out the nested array of nonZeroFracsByRegionAcrossDistances to extract the RCMC & TMCC region counts for ease of calculation & plotting\n", 153 | "RCMCRegionCounts = []\n", 154 | "TMCCRegionCounts = []\n", 155 | "\n", 156 | "for distanceSet in nonZeroFracsByRegionAcrossDistances:\n", 157 | " RCMCRegionCounts.append(distanceSet[0])\n", 158 | " TMCCRegionCounts.append(distanceSet[1])" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 7, 164 | "metadata": {}, 165 | "outputs": [], 166 | "source": [ 167 | "# Separate out the nested array of region counts by individual region for RCMC & TMCC for ease of plotting\n", 168 | "RCMC_Sox2 = []\n", 169 | "RCMC_Ppm1g = []\n", 170 | "RCMC_Nanog = []\n", 171 | "RCMC_Klf1 = []\n", 172 | "RCMC_Fbn2 = []\n", 173 | "TMCC_Sox2 = []\n", 174 | "TMCC_Nanog = []\n", 175 | "\n", 176 | "for i in RCMCRegionCounts:\n", 177 | " RCMC_Sox2.append(i[0])\n", 178 | " RCMC_Ppm1g.append(i[1])\n", 179 | " RCMC_Nanog.append(i[2])\n", 180 | " RCMC_Klf1.append(i[3])\n", 181 | " RCMC_Fbn2.append(i[4])\n", 182 | " \n", 183 | "for j in TMCCRegionCounts:\n", 184 | " TMCC_Sox2.append(j[0])\n", 185 | " TMCC_Nanog.append(j[1])" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": 21, 191 | "metadata": {}, 192 | "outputs": [ 193 | { 194 | "data": { 195 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAIkCAYAAACDe721AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAADDIElEQVR4nOzde3yT5cH/8c/VtKUtFqEgUOToUJhjQ0tREClgAZ0oilDoBAubzt8znVPHNgFbBVs8wzOdbm6OjVHBSgvVIZ5Qa+sUB7Ube5yrR0CYgCfEYoHS9Pr9kSYmbdomJT2l3/frlVd6X/d1J1diLfnmOhlrLSIiIiIiIicioq0bICIiIiIiHZ+ChYiIiIiInDAFCxEREREROWEKFiIiIiIicsIULERERERE5IQpWIiIiIiIyAmLbOsGtEe9evWygwcPbutmiIiIiIi0O2+++eZn1tpT6pYrWPgxePBgSktL27oZIiIiIiLtjjFmt79yDYUSEREREZETpmAhIiIiIiInTMFCREREREROmIKFiIiIiIicMAULERERERE5YVoVSkRERKQdqKmpoaqqipqamrZuinQyERERREZGEhl5YtFAPRYiIiIibez48eN88sknHD9+vK2bIp1QdXU1X3311Qn/DqrHQkRERKQN1dTU8Pnnn9OnTx+MMW3dHOnEampq+PTTT+ndu3ezfhfVYyEiIiLShqqqqujatatChbS5iIgI4uLiOHbsWPOuD3F7RERERCQINTU1OByOtm6GCAAOh6PZ83zaNFgYY/obY35jjNlqjKk0xlhjzOAAr40xxtxnjNlnjDlS+xgpLdxkERERERHxo617LIYCs4GDwKtBXrsK+DFwG3AJsA943hhzVigbKCIiIiIiTWvrYFFire1jrb0YyA/0ImPMSOBK4GZr7aPW2pdwBZSPgDtapqkiIiIiHceRI3Djja57kdbQpsHCWtvchZqnA8eBJ7weqxrIAy40xnQJQfNajdPpDGk9cdH7KiIindWRIzBtGjz4oOu+NcOFMabJ2+DBgwFYunQpxhhiY2M5dOhQvcdavXq155r333/f55y1lrVr15KamkrPnj2Jioqif//+pKenU1RU1BovVepo6x6L5voOsNNaW1mn/N9ANK4hVh1CVVUVaWlp5OTkNFovJyeHtLQ0qqqqWqllHZveVxER6azcocL92bqoqHXD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gTKv42zg3z8A93D4SZNcx9ledcpqr5OGufcICXRvnKIiV/1wChc11vLUrgoe2f66Z3dxcM2pOHLrrT5zLv64/W88sv11ntpVoZ4LEZEOru5Ebe+eC3+rRbU3c+bMYfr06SxatKjeh3W36OhoFi5cyNNPP82GDRv81tmyZQuVlYEtzOKes1FXee2S7e4VoyZMmMDmzZt99tSoqKhg06ZNTJgwwVO2bt06cnNz+cMf/sATTzzBP//5T2677Tafx66srGTatGns3LmTF154gaFDhwbU1vZO+1i0IQeQB8yxllHGuEY+1c65WLTItSRtbOw3I6LetJY8Y2g/i8O1P8GGCjd3uAiXeSwRxvBs+Xa2lP/dU3bN6PM9cyoyU1LYffi4J3RsKf87g+KjuOK01DZpr4iInLiGVn/yLnfft9dhUT169KCwsLDJeosXL2bHjh3MmTOHBQsWcOmll5KQkMDevXvZsGEDGzdurDc8qSEjRoxg0qRJzJgxgyFDhvDVV1/xzDPP8MgjjzB79mwGDhwIQFZWFk8//TSpqanccsstGGO45557qKys9ASHnTt38pOf/ISrr76atLQ0AJYvX86iRYuYOnUqk2q/2Js5cyavvfYaDzzwAF9//TVvvPGGpz3f+ta3/C5H2xGox6KtOasgPw28vkGIjYUHHqjzAbckx1XP2bG3em9pixYFHyrciopc14cDZ00Nn1d85jmeMvxcvpU40rOs7mv7K/lW4kimDD/XU+fzis9wttBGQCIi0rIaW1K2saVoOyqHw8H69etZvXo1H3zwAQsWLOCCCy7gl7/8JVFRURQXFwe06zbAPffcQ01NDbfddhtTp05lzpw5bN26lbvvvtuzShXA9773PV555RW6devG/PnzueqqqzjppJMoLi5m5MiRVFdXc+WVV9K3b18e8NrF+Be/+AWpqalcddVVfP755wA899xzWGv52c9+xtixY31umzdvDu2b1YqM1dCHepKTk21paWmLP4+zxklafppnl8yGVmvw/mMxY/iMFtspMxw0t8cCXEPPwqXHAqDK6SS9oICe8b34VuJIT7n37uMAH+zbwecVn5E3axbR2n1aRKTVuYfsBLqhW136PCGhFMjvozHmTWttct1yDYVqQ+6dMt1/CPx1T7b3nTLbG/fyvcGGi3ALFQDRDgf5aWk4IiJ8Ngz0DhXjE+NYdHYqzpoaHBHqwBQR6YgcEQ7yZuWRXpBOUmJSg8Oc3OVl+8rIm5WnzxMScuqx8KO1eizcAhkT6V0uTTtyBC6+FF55qem6E1PhmU3hFSr8uf+fn/mEikgDvzirV9s1SEREgBPvsXBz1jgDCguB1uvorLU4nY0vedPYTtid1Yn0WOgrynagI++U2V45YqHb87UbDzZiyCpXPUeYh4rX9lf6hApw9Vy451yIiEjHF2hY6AyhAqC4uJioqKhGb7t27WrrZoYVxbR2wh0a3GGiI+2U2d44gXTgrw7gRzAE2Hl1/XpDVrk2HtxZWz8fwnLFLe9hUOA7x8JdPq7viX1LJiIi0t6MGjWK7du3N1qnX79+rdSazkFDofxo7aFQ3mKXx/qEipjIGI7cGkYbLLQSfxsPeocLd6hwy8Zno/OwUTdUjE+MY1zfuAbLRUSk9YVqKJRIKGgoVJjoyDtltjeZ+G4suPNH3wyL6uyhAlw9FOMTv/mD8eq+Sg2LEhERkROiYNFOdPSdMtsjf+HCcaxzhIoaazlQWe059tcjUTdcHKis1s7bIiIi0mwKFu2Av9Wfjtx6JOw2s2kLdcOFM/qbn8M1VIBr5+3LBsdzxsnRjQ5zcoeLM06O5rLB8UQY08otFRERkXChORZ+tOYci6aWlNWSs6ERC3gPMosBOsPMlRprAwoLgdYTEZHQ0xwLaU80x6KDctY4KdtX5jn2FxrqLkVbtq8MZ03jazKLrxx8QwW1x52h/yfQsKBQISIiIidKy822Ie2U2fLqrg4Vwzchw12u/h8RERGRE6ceizYW7YgmPy2/yeFNmSmZ5KflE+2IbrSefKNuqMjGNfzJe85FFp2j50JERMJfoAtwtPRCHcaYJm+DBw8GYOnSpRhjiI2N5dChQ/Uea/Xq1Z5r3n//fZ9z1lrWrl1LamoqPXv2JCoqiv79+5Oenk5RUVHA7fV+DmMM8fHxjBw5koceeojq6uqmHyDE/vKXvzBz5kwGDRqEMYYFCxa0ehuaSz0W7YB2ygw9f6HCHd3c91l17tVzISIiHZWzxvLUrgr6xEU2ui/Ra/srOVBZzWWD43FEtMww2K1bt/ocz5gxg5EjR7J06VJPWZcuXXzqREVFUVBQwNVX++5ou2bNGuLj46moqPApdzqdpKenU1hYyPz587nhhhtISEhgz5495Ofnk5qaysGDBzn55JMDbnd+fj79+/fnq6++Ij8/nxtuuIFPPvmEO+64I+DHCIXHHnuMTz/9lClTppCfn9+qz32iFCwk7DiBUlsDxtUh52/1p7rhotTW4DQRYbnztoiIhLca6woV7x6q4t1DVQB+w4X3/kZP7arg8iEtsxrgmDFjfI67dOlCr1696pV7u+KKK8jNzfUJFnv27KG4uJiMjAxWr17tU/+uu+6ioKCAgoICZs6c6XNu7ty5vPDCC0RFRQXV7rPOOouhQ4cCMHXqVN5//31+/etft3qweP7554mIcH2Gee6551r1uU+UhkJJ+KlxQkE6/GcjvJwJDS3TW5LjOv+fja76mhQvIiIdUIQx9In75rtif5ue1t00tU9cZLtauCMjI4OSkhJ2797tKcvNzWXgwIGkpKT41K2qqmLFihVMmzatXqhwmzp16gmvsjV69GgqKir45JNPABg8eDDz5s3j0UcfZejQocTExJCUlFRv2NWCBQvo378/paWlnHfeecTGxjJs2DA2b94MwMqVKxk8eDDdunXjsssu49NPP/W53h0qmlJZWclPfvITevbsSXx8PDNmzOD111/HGFMviLUWBQsJO44IB8l9vgf5afDqcr97gHiW8X11OeSnkdznexpqJiIiHVbdTU+9w0XdUNHY/kZtZfz48QwePJi1a9d6ynJzc5k3bx6mTgAqLS3lyy+/ZPr06S3app07d+JwODjppJM8ZcXFxaxcuZLly5eTl5dHly5d+P73v88777zjc+1XX31FRkYG11xzDYWFhfTu3ZuZM2eycOFCioqKePjhh/n1r39NUVER119/fbPad+211/KnP/2JX/ziF2zcuJFhw4Yxd+7cE3rNJ0pDoSQsuSfDu/cAcd9npmTW3xtk4jLtDSIiIh2eOyy4Q8Sr+yrZur+Saq+52u0xVIBrwve8efPIzc1lyZIlbNu2jfLycjIyMnjttdd86u7ZsweAQYMGhbQNTqeT6upqKioqWL9+PRs3buTSSy/16fk4cOAAr732GgMHDgQgNTWVQYMGkZOTQ25urqdeRUUFjzzyiKe3pV+/fowcOZKnn36at99+G4fD9WXmW2+9xW9+8xucTqenLBDvvPMO69at4+677+ZXv/oVAFOmTKGyspLf/OY3J/xeNJd6LCRs1d0DJKsoi9jlsdpwUCQEnM7Ahg4GWk9EQqNuz0VHCBVuGRkZlJeXs337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\n", 196 | "text/plain": [ 197 | "
" 198 | ] 199 | }, 200 | "metadata": { 201 | "needs_background": "light" 202 | }, 203 | "output_type": "display_data" 204 | } 205 | ], 206 | "source": [ 207 | "# Plot the fraction of filled bins across contact distances both by region and averaged across regions\n", 208 | "\n", 209 | "import matplotlib.pyplot as plt\n", 210 | "\n", 211 | "saveDir = f'DIRECTORY_PATH'\n", 212 | "fileName = f'FILE_NAME.svg' # swap out .svg for the desired output file format\n", 213 | "\n", 214 | "plt.scatter(distances, RCMCcounts, marker = 'D', c = 'blue', label='RCMC')\n", 215 | "plt.scatter(distances, RCMC_Sox2, marker = 'x', c = 'green', label='RCMC_Sox2')\n", 216 | "plt.scatter(distances, RCMC_Ppm1g, marker = 'x', c = 'skyblue', label='RCMC_Ppm1g')\n", 217 | "plt.scatter(distances, RCMC_Nanog, marker = 'x', c = 'teal', label='RCMC_Nanog')\n", 218 | "plt.scatter(distances, RCMC_Klf1, marker = 'x', c = 'black', label='RCMC_Klf1')\n", 219 | "plt.scatter(distances, RCMC_Fbn2, marker = 'x', c = 'cyan', label='RCMC_Fbn2')\n", 220 | "plt.scatter(distances, TMCCcounts, marker = 's', c = 'red', label='TMCC')\n", 221 | "plt.scatter(distances, TMCC_Sox2, marker = '+', c = 'purple', label='TMCC_Sox2')\n", 222 | "plt.scatter(distances, TMCC_Nanog, marker = '+', c = 'pink', label='TMCC_Nanog')\n", 223 | "plt.scatter(distances, Hsiehcounts, marker = 'v', c = 'orange', label='Hsieh')\n", 224 | "plt.scatter(distances, Bonevcounts, marker = 'o', c = 'gray', label='Bonev')\n", 225 | "plt.xscale(\"log\")\n", 226 | "plt.xlabel(\"Contact Distance (bp) at 100 bp Resolution\")\n", 227 | "plt.ylabel(\"Fraction of Nonzero Bins\")\n", 228 | "plt.legend()\n", 229 | "\n", 230 | "# plt.savefig(saveDir + fileName, dpi=1200)\n", 231 | "plt.show()" 232 | ] 233 | }, 234 | { 235 | "cell_type": "code", 236 | "execution_count": null, 237 | "metadata": {}, 238 | "outputs": [], 239 | "source": [] 240 | } 241 | ], 242 | "metadata": { 243 | "kernelspec": { 244 | "display_name": "Python [conda env:coolToolsEnv]", 245 | "language": "python", 246 | "name": "conda-env-coolToolsEnv-py" 247 | }, 248 | "language_info": { 249 | "codemirror_mode": { 250 | "name": "ipython", 251 | "version": 3 252 | }, 253 | "file_extension": ".py", 254 | "mimetype": "text/x-python", 255 | "name": "python", 256 | "nbconvert_exporter": "python", 257 | "pygments_lexer": "ipython3", 258 | "version": "3.8.12" 259 | } 260 | }, 261 | "nbformat": 4, 262 | "nbformat_minor": 5 263 | } 264 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Hansen lab at MIT 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LoopStrengthRCMC.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "abd813be", 6 | "metadata": {}, 7 | "source": [ 8 | "# Loop strength calculation" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "id": "dfcad04e", 14 | "metadata": {}, 15 | "source": [ 16 | "## Imports" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": null, 22 | "id": "73bb3370", 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "# import standard python libraries\n", 27 | "import matplotlib as mpl\n", 28 | "%matplotlib inline\n", 29 | "mpl.rcParams['figure.dpi'] = 96\n", 30 | "import numpy as np\n", 31 | "import matplotlib.pyplot as plt\n", 32 | "import pandas as pd\n", 33 | "import seaborn as sns\n", 34 | "\n", 35 | "# import libraries for biological data analysis\n", 36 | "from coolpuppy import coolpup\n", 37 | "from plotpuppy import plotpup\n", 38 | "import cooler\n", 39 | "import bioframe\n", 40 | "import cooltools\n", 41 | "from cooltools import expected_cis\n", 42 | "from cooltools.lib import plotting\n", 43 | "\n", 44 | "import bbi" 45 | ] 46 | }, 47 | { 48 | "cell_type": "markdown", 49 | "id": "e71fbaa6", 50 | "metadata": {}, 51 | "source": [ 52 | "## Inputs" 53 | ] 54 | }, 55 | { 56 | "cell_type": "markdown", 57 | "id": "70c700df", 58 | "metadata": {}, 59 | "source": [ 60 | "First, get the loops and mcools to analyse, set up variables, etc" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": null, 66 | "id": "068a8eac", 67 | "metadata": {}, 68 | "outputs": [], 69 | "source": [ 70 | "#mcool resolution to read\n", 71 | "resolution = 250\n", 72 | "#List of mcool locations as strings\n", 73 | "conditions = [\"mcoollocation1\", \"mcoollocation2\", \"mcoollocation3\"]\n", 74 | "#List of loop types as strings\n", 75 | "loopTypesNames = [\"loop\", \"type\", \"names\"]\n", 76 | "#List of loop file locations (bedpe)\n", 77 | "loopFiles = [\"looplocation1\", \"looplocation2\", \"looplocation3\"]\n", 78 | "\n", 79 | "#Specify the RCMC regions of the mcools to look at (format: chromosome (string), start (number), end (number), name of region (string))\n", 80 | "regions = pd.DataFrame([['chrA',1,100,'regionname1'],['chrB',1,100,'regionname2'],['chrC',1,100,'regionname3']],\n", 81 | " columns=['chrom', 'start', 'end', 'name'])\n", 82 | "#Cis expected file locations from cooltools - .tsv file - one for each mcool\n", 83 | "expectedFiles = [\"expectedlocation1\", \"expectedlocation2\", \"expectedlocation3\"]\n", 84 | "#Set save directory\n", 85 | "saveDir = '/a/directory/on/your/system/'\n", 86 | "\n", 87 | "#Set the size of the area flanking the dot\n", 88 | "flankDist = 10000\n", 89 | "#Don't set this to be even... This is the size of the area to measure around the dot \n", 90 | "#(and by extension the size of the boxes at the edges of the region too)\n", 91 | "#For this reason, it needs to be odd to have integer box sizes on each side.\n", 92 | "dotWindow = 5\n" 93 | ] 94 | }, 95 | { 96 | "cell_type": "markdown", 97 | "id": "e7cf57de", 98 | "metadata": {}, 99 | "source": [ 100 | "Run the imports" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": null, 106 | "id": "d76f2cee", 107 | "metadata": {}, 108 | "outputs": [], 109 | "source": [ 110 | "#######Don't change this section#######\n", 111 | "#Creat an empty list to store the imported loop locations\n", 112 | "loopTypes = []\n", 113 | "#List of column names to use for imported loops (this is constant - do not change)\n", 114 | "colNames = ['chrom1', 'start1', 'end1', 'chrom2', 'start2', 'end2']\n", 115 | "#Read in files, put them in loopTypes\n", 116 | "for file in loopFiles:\n", 117 | " temploops = pd.read_csv(file, sep='\\t', names=colNames, header=None)\n", 118 | " loopTypes.append(temploops)" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "id": "3ba156f7", 124 | "metadata": {}, 125 | "source": [ 126 | "## Enrichment calculation" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": null, 132 | "id": "e4a3696a", 133 | "metadata": {}, 134 | "outputs": [], 135 | "source": [ 136 | "## Enrichment calculation\n", 137 | "\n", 138 | "#Viraat's new calculation\n", 139 | "#Modified 2022/10/04 by Miles to try to avoid NaN values and correct an issue with the background sum, \n", 140 | "#and generally make the code a little more streamlined\n", 141 | "def enrichmentCalc(mtx, dotWindow):\n", 142 | " #Dimension of array side (should be square)\n", 143 | " sideLength = len(mtx)\n", 144 | " #Middle of side length\n", 145 | " midPoint = (sideLength - 1) // 2\n", 146 | " #Half size of box around centre pixel (one pixel smaller if even-sized dot window - don't do this)\n", 147 | " buffer = (dotWindow - 1) // 2\n", 148 | " \n", 149 | " #Get sum of pixels around dot\n", 150 | " dotSum = np.nansum(mtx[midPoint-buffer:midPoint+buffer+1, midPoint-buffer:midPoint+buffer+1])\n", 151 | " \n", 152 | " #Subset the matrix and calculate the mean without NaN values\n", 153 | " backgroundSum1 = np.nansum(mtx[0:dotWindow, 0:dotWindow])\n", 154 | " backgroundSum2 = np.nansum(mtx[sideLength-dotWindow:sideLength, sideLength-dotWindow:sideLength])\n", 155 | " \n", 156 | " #Calculate enrichment (NB this assumes all boxes are the same size.\n", 157 | " #If you set an even dotWindow value, they won't be)\n", 158 | " enrichment = dotSum / ((backgroundSum1 + backgroundSum2)/2)\n", 159 | " \n", 160 | " return enrichment" 161 | ] 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "id": "5e1e9fad", 166 | "metadata": {}, 167 | "source": [ 168 | "# Get the strengths" 169 | ] 170 | }, 171 | { 172 | "cell_type": "markdown", 173 | "id": "666fd62a", 174 | "metadata": {}, 175 | "source": [ 176 | "Function for getting strength of each loop (uses the pileup function from cooltools to do observed/expected)" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": null, 182 | "id": "afd62abd", 183 | "metadata": {}, 184 | "outputs": [], 185 | "source": [ 186 | "def loopStrengthGet(loop, flankDist, clr, regions, expected, dotWindow):\n", 187 | " loopf = loop.to_frame().T\n", 188 | " loopf = loopf.astype({'start1':'int64','end1':'int64','start2':'int64','end2':'int64'})\n", 189 | " stack = cooltools.pileup(clr, loopf, view_df=regions, expected_df=expected, flank=flankDist)\n", 190 | " mtx = np.nanmean(stack, axis=2)\n", 191 | " enrichment = enrichmentCalc(mtx, dotWindow)\n", 192 | " \n", 193 | " return enrichment" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": null, 199 | "id": "01ca3113", 200 | "metadata": { 201 | "scrolled": true 202 | }, 203 | "outputs": [], 204 | "source": [ 205 | "#Zip the names and loop info into a dictionary for easier referencing\n", 206 | "loopDict = dict(zip(loopTypesNames, loopTypes))\n", 207 | "#Stop the code if you used an even value for dotWindow, since it won't work\n", 208 | "if dotWindow % 2 == 0:\n", 209 | " print(\"You need to use an odd number for dotWindow in the inputs section\")\n", 210 | "else:\n", 211 | " #Loop through the conditions\n", 212 | " for i, condition in enumerate(conditions):\n", 213 | " #Get the cooler data\n", 214 | " clr = cooler.Cooler(condition+'::/resolutions/'+str(resolution))\n", 215 | " #Get the corresponding expected data\n", 216 | " expected = pd.read_csv(expectedFiles[i], sep='\\t')\n", 217 | "\n", 218 | " #Loop through loopDict\n", 219 | " for loopsName in loopDict:\n", 220 | " #Read out the loops\n", 221 | " loops = loopDict[loopsName]\n", 222 | " #For each row (ie loop), do pileup, get enrichment, write to new column [condition]_strength\n", 223 | " loops[f'{condition}_strength'] = loops.apply(loopStrengthGet, axis = 1, flankDist = flankDist, clr = clr, regions = regions, expected = expected, dotWindow = dotWindow)\n", 224 | "\n", 225 | " loopDict[loopsName] = loops\n", 226 | " " 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "id": "bdc3359f", 232 | "metadata": {}, 233 | "source": [ 234 | "## Output files - one for each loop type" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": null, 240 | "id": "50c922d5", 241 | "metadata": {}, 242 | "outputs": [], 243 | "source": [ 244 | "for name, df in loopDict.items():\n", 245 | " df.to_csv(saveDir + name + '.bedpe', sep = '\\t', index = False, header = True)" 246 | ] 247 | } 248 | ], 249 | "metadata": { 250 | "kernelspec": { 251 | "display_name": "Python [conda env:coolpuppy]", 252 | "language": "python", 253 | "name": "conda-env-coolpuppy-py" 254 | }, 255 | "language_info": { 256 | "codemirror_mode": { 257 | "name": "ipython", 258 | "version": 3 259 | }, 260 | "file_extension": ".py", 261 | "mimetype": "text/x-python", 262 | "name": "python", 263 | "nbconvert_exporter": "python", 264 | "pygments_lexer": "ipython3", 265 | "version": "3.7.12" 266 | } 267 | }, 268 | "nbformat": 4, 269 | "nbformat_minor": 5 270 | } 271 | -------------------------------------------------------------------------------- /MicrocompartmentLoops_PlusMin1kb.bedpe: -------------------------------------------------------------------------------- 1 | chr5 31273000 31275000 chr5 31336200 31338200 2 | chr5 31273000 31275000 chr5 31349200 31351200 3 | chr5 31273000 31275000 chr5 31358700 31360700 4 | chr5 31273000 31275000 chr5 31376700 31378700 5 | chr5 31273000 31275000 chr5 31397100 31399100 6 | chr5 31273000 31275000 chr5 31408000 31410000 7 | chr5 31273000 31275000 chr5 31447500 31449500 8 | chr5 31273000 31275000 chr5 31452200 31454200 9 | chr5 31273000 31275000 chr5 31608600 31610600 10 | chr5 31273000 31275000 chr5 31645300 31647300 11 | chr5 31273000 31275000 chr5 31651000 31653000 12 | chr5 31273000 31275000 chr5 31787500 31789500 13 | chr5 31273000 31275000 chr5 31791000 31793000 14 | chr5 31273000 31275000 chr5 31854000 31856000 15 | chr5 31273000 31275000 chr5 32015400 32017400 16 | chr5 31273000 31275000 chr5 32291000 32293000 17 | chr5 31295500 31297500 chr5 31336200 31338200 18 | chr5 31295500 31297500 chr5 31349200 31351200 19 | chr5 31295500 31297500 chr5 31358700 31360700 20 | chr5 31295500 31297500 chr5 31376700 31378700 21 | chr5 31295500 31297500 chr5 31397100 31399100 22 | chr5 31295500 31297500 chr5 31408000 31410000 23 | chr5 31295500 31297500 chr5 31447500 31449500 24 | chr5 31295500 31297500 chr5 31452200 31454200 25 | chr5 31295500 31297500 chr5 31483000 31485000 26 | chr5 31295500 31297500 chr5 31608600 31610600 27 | chr5 31295500 31297500 chr5 32291000 32293000 28 | chr5 31306700 31308700 chr5 31336200 31338200 29 | chr5 31306700 31308700 chr5 31349200 31351200 30 | chr5 31306700 31308700 chr5 31358700 31360700 31 | chr5 31306700 31308700 chr5 31376700 31378700 32 | chr5 31306700 31308700 chr5 31397100 31399100 33 | chr5 31306700 31308700 chr5 31408000 31410000 34 | chr5 31306700 31308700 chr5 31447500 31449500 35 | chr5 31306700 31308700 chr5 31452200 31454200 36 | chr5 31306700 31308700 chr5 31483000 31485000 37 | chr5 31306700 31308700 chr5 31608600 31610600 38 | chr5 31310500 31312500 chr5 31336200 31338200 39 | chr5 31310500 31312500 chr5 31349200 31351200 40 | chr5 31310500 31312500 chr5 31358700 31360700 41 | chr5 31310500 31312500 chr5 31376700 31378700 42 | chr5 31310500 31312500 chr5 31397100 31399100 43 | chr5 31310500 31312500 chr5 31408000 31410000 44 | chr5 31310500 31312500 chr5 31447500 31449500 45 | chr5 31310500 31312500 chr5 31452200 31454200 46 | chr5 31310500 31312500 chr5 31608600 31610600 47 | chr5 31310500 31312500 chr5 31683000 31685000 48 | chr5 31336200 31338200 chr5 31349200 31351200 49 | chr5 31336200 31338200 chr5 31358700 31360700 50 | chr5 31336200 31338200 chr5 31376700 31378700 51 | chr5 31336200 31338200 chr5 31397100 31399100 52 | chr5 31336200 31338200 chr5 31408000 31410000 53 | chr5 31336200 31338200 chr5 31447500 31449500 54 | chr5 31336200 31338200 chr5 31452200 31454200 55 | chr5 31336200 31338200 chr5 31608600 31610600 56 | chr5 31336200 31338200 chr5 31645300 31647300 57 | chr5 31336200 31338200 chr5 31651000 31653000 58 | chr5 31336200 31338200 chr5 31683000 31685000 59 | chr5 31336200 31338200 chr5 31854000 31856000 60 | chr5 31336200 31338200 chr5 32015400 32017400 61 | chr5 31336200 31338200 chr5 32291000 32293000 62 | chr5 31344650 31346650 chr5 31483000 31485000 63 | chr5 31349200 31351200 chr5 31358700 31360700 64 | chr5 31349200 31351200 chr5 31376700 31378700 65 | chr5 31349200 31351200 chr5 31397100 31399100 66 | chr5 31349200 31351200 chr5 31408000 31410000 67 | chr5 31349200 31351200 chr5 31447500 31449500 68 | chr5 31349200 31351200 chr5 31452200 31454200 69 | chr5 31349200 31351200 chr5 31608600 31610600 70 | chr5 31349200 31351200 chr5 31645300 31647300 71 | chr5 31349200 31351200 chr5 31651000 31653000 72 | chr5 31349200 31351200 chr5 31683000 31685000 73 | chr5 31349200 31351200 chr5 31854000 31856000 74 | chr5 31349200 31351200 chr5 32015400 32017400 75 | chr5 31349200 31351200 chr5 32291000 32293000 76 | chr5 31351450 31353450 chr5 31376700 31378700 77 | chr5 31351450 31353450 chr5 31397100 31399100 78 | chr5 31351450 31353450 chr5 31447500 31449500 79 | chr5 31358700 31360700 chr5 31376700 31378700 80 | chr5 31358700 31360700 chr5 31397100 31399100 81 | chr5 31358700 31360700 chr5 31408000 31410000 82 | chr5 31358700 31360700 chr5 31447500 31449500 83 | chr5 31358700 31360700 chr5 31452200 31454200 84 | chr5 31358700 31360700 chr5 31608600 31610600 85 | chr5 31358700 31360700 chr5 31645300 31647300 86 | chr5 31358700 31360700 chr5 31651000 31653000 87 | chr5 31358700 31360700 chr5 31683000 31685000 88 | chr5 31358700 31360700 chr5 31854000 31856000 89 | chr5 31358700 31360700 chr5 32291000 32293000 90 | chr5 31369650 31371650 chr5 31483000 31485000 91 | chr5 31376700 31378700 chr5 31397100 31399100 92 | chr5 31376700 31378700 chr5 31408000 31410000 93 | chr5 31376700 31378700 chr5 31447500 31449500 94 | chr5 31376700 31378700 chr5 31452200 31454200 95 | chr5 31376700 31378700 chr5 31483000 31485000 96 | chr5 31376700 31378700 chr5 31608600 31610600 97 | chr5 31376700 31378700 chr5 31645300 31647300 98 | chr5 31376700 31378700 chr5 31651000 31653000 99 | chr5 31376700 31378700 chr5 31683000 31685000 100 | chr5 31376700 31378700 chr5 31753200 31755200 101 | chr5 31376700 31378700 chr5 31770300 31772300 102 | chr5 31376700 31378700 chr5 31787500 31789500 103 | chr5 31376700 31378700 chr5 31791000 31793000 104 | chr5 31376700 31378700 chr5 31854000 31856000 105 | chr5 31376700 31378700 chr5 32015400 32017400 106 | chr5 31376700 31378700 chr5 32291000 32293000 107 | chr5 31397100 31399100 chr5 31408000 31410000 108 | chr5 31397100 31399100 chr5 31447500 31449500 109 | chr5 31397100 31399100 chr5 31452200 31454200 110 | chr5 31397100 31399100 chr5 31483000 31485000 111 | chr5 31397100 31399100 chr5 31608600 31610600 112 | chr5 31397100 31399100 chr5 31645300 31647300 113 | chr5 31397100 31399100 chr5 31651000 31653000 114 | chr5 31397100 31399100 chr5 31683000 31685000 115 | chr5 31397100 31399100 chr5 31753200 31755200 116 | chr5 31397100 31399100 chr5 31770300 31772300 117 | chr5 31397100 31399100 chr5 31787500 31789500 118 | chr5 31397100 31399100 chr5 31791000 31793000 119 | chr5 31397100 31399100 chr5 31854000 31856000 120 | chr5 31397100 31399100 chr5 32291000 32293000 121 | chr5 31397100 31399100 chr5 32339700 32341700 122 | chr5 31408000 31410000 chr5 31447500 31449500 123 | chr5 31408000 31410000 chr5 31452200 31454200 124 | chr5 31408000 31410000 chr5 31483000 31485000 125 | chr5 31408000 31410000 chr5 31608600 31610600 126 | chr5 31408000 31410000 chr5 31645300 31647300 127 | chr5 31408000 31410000 chr5 31651000 31653000 128 | chr5 31408000 31410000 chr5 31683000 31685000 129 | chr5 31408000 31410000 chr5 31854000 31856000 130 | chr5 31408000 31410000 chr5 32291000 32293000 131 | chr5 31408000 31410000 chr5 32339700 32341700 132 | chr5 31447500 31449500 chr5 31608600 31610600 133 | chr5 31447500 31449500 chr5 31645300 31647300 134 | chr5 31447500 31449500 chr5 31651000 31653000 135 | chr5 31447500 31449500 chr5 31683000 31685000 136 | chr5 31447500 31449500 chr5 31770300 31772300 137 | chr5 31447500 31449500 chr5 31791000 31793000 138 | chr5 31447500 31449500 chr5 31854000 31856000 139 | chr5 31447500 31449500 chr5 32015400 32017400 140 | chr5 31447500 31449500 chr5 32291000 32293000 141 | chr5 31447500 31449500 chr5 32339700 32341700 142 | chr5 31452200 31454200 chr5 31608600 31610600 143 | chr5 31452200 31454200 chr5 31645300 31647300 144 | chr5 31452200 31454200 chr5 31651000 31653000 145 | chr5 31452200 31454200 chr5 31753200 31755200 146 | chr5 31452200 31454200 chr5 31791000 31793000 147 | chr5 31452200 31454200 chr5 31854000 31856000 148 | chr5 31452200 31454200 chr5 32291000 32293000 149 | chr5 31452200 31454200 chr5 32339700 32341700 150 | chr5 31483000 31485000 chr5 31626700 31628700 151 | chr5 31608600 31610600 chr5 31645300 31647300 152 | chr5 31608600 31610600 chr5 31651000 31653000 153 | chr5 31608600 31610600 chr5 31683000 31685000 154 | chr5 31608600 31610600 chr5 31753200 31755200 155 | chr5 31608600 31610600 chr5 31770300 31772300 156 | chr5 31608600 31610600 chr5 31787500 31789500 157 | chr5 31608600 31610600 chr5 31791000 31793000 158 | chr5 31608600 31610600 chr5 31854000 31856000 159 | chr5 31608600 31610600 chr5 32015400 32017400 160 | chr5 31608600 31610600 chr5 32291000 32293000 161 | chr5 31608600 31610600 chr5 32339700 32341700 162 | chr5 31645300 31647300 chr5 31651000 31653000 163 | chr5 31645300 31647300 chr5 31683000 31685000 164 | chr5 31645300 31647300 chr5 31753200 31755200 165 | chr5 31645300 31647300 chr5 31791000 31793000 166 | chr5 31645300 31647300 chr5 31854000 31856000 167 | chr5 31645300 31647300 chr5 32015400 32017400 168 | chr5 31645300 31647300 chr5 32291000 32293000 169 | chr5 31645300 31647300 chr5 32339700 32341700 170 | chr5 31651000 31653000 chr5 31683000 31685000 171 | chr5 31651000 31653000 chr5 31753200 31755200 172 | chr5 31651000 31653000 chr5 31791000 31793000 173 | chr5 31651000 31653000 chr5 31854000 31856000 174 | chr5 31651000 31653000 chr5 32015400 32017400 175 | chr5 31651000 31653000 chr5 32291000 32293000 176 | chr5 31651000 31653000 chr5 32339700 32341700 177 | chr5 31683000 31685000 chr5 31753200 31755200 178 | chr5 31683000 31685000 chr5 31770300 31772300 179 | chr5 31683000 31685000 chr5 31787500 31789500 180 | chr5 31683000 31685000 chr5 31791000 31793000 181 | chr5 31683000 31685000 chr5 31854000 31856000 182 | chr5 31683000 31685000 chr5 32291000 32293000 183 | chr5 31683000 31685000 chr5 32339700 32341700 184 | chr5 31720000 31722000 chr5 31753200 31755200 185 | chr5 31720000 31722000 chr5 31770300 31772300 186 | chr5 31720000 31722000 chr5 31854000 31856000 187 | chr5 31720000 31722000 chr5 32083000 32085000 188 | chr5 31720000 31722000 chr5 32291000 32293000 189 | chr5 31720000 31722000 chr5 32339700 32341700 190 | chr5 31720000 31722000 chr5 32354200 32356200 191 | chr5 31720000 31722000 chr5 32372000 32374000 192 | chr5 31753200 31755200 chr5 31770300 31772300 193 | chr5 31753200 31755200 chr5 31787500 31789500 194 | chr5 31753200 31755200 chr5 31791000 31793000 195 | chr5 31753200 31755200 chr5 31854000 31856000 196 | chr5 31753200 31755200 chr5 32015400 32017400 197 | chr5 31753200 31755200 chr5 32083000 32085000 198 | chr5 31753200 31755200 chr5 32291000 32293000 199 | chr5 31753200 31755200 chr5 32339700 32341700 200 | chr5 31753200 31755200 chr5 32354200 32356200 201 | chr5 31753200 31755200 chr5 32372000 32374000 202 | chr5 31759000 31761000 chr5 31770300 31772300 203 | chr5 31759000 31761000 chr5 31787500 31789500 204 | chr5 31759000 31761000 chr5 31791000 31793000 205 | chr5 31759000 31761000 chr5 31854000 31856000 206 | chr5 31759000 31761000 chr5 32291000 32293000 207 | chr5 31759000 31761000 chr5 32339700 32341700 208 | chr5 31759000 31761000 chr5 32354200 32356200 209 | chr5 31759000 31761000 chr5 32372000 32374000 210 | chr5 31767000 31769000 chr5 31791000 31793000 211 | chr5 31767000 31769000 chr5 31854000 31856000 212 | chr5 31767000 31769000 chr5 32291000 32293000 213 | chr5 31767000 31769000 chr5 32339700 32341700 214 | chr5 31770300 31772300 chr5 31791000 31793000 215 | chr5 31770300 31772300 chr5 31854000 31856000 216 | chr5 31770300 31772300 chr5 32015400 32017400 217 | chr5 31770300 31772300 chr5 32291000 32293000 218 | chr5 31770300 31772300 chr5 32339700 32341700 219 | chr5 31770300 31772300 chr5 32354200 32356200 220 | chr5 31787500 31789500 chr5 31854000 31856000 221 | chr5 31787500 31789500 chr5 32015400 32017400 222 | chr5 31787500 31789500 chr5 32291000 32293000 223 | chr5 31787500 31789500 chr5 32339700 32341700 224 | chr5 31787500 31789500 chr5 32354200 32356200 225 | chr5 31791000 31793000 chr5 31854000 31856000 226 | chr5 31791000 31793000 chr5 32015400 32017400 227 | chr5 31791000 31793000 chr5 32291000 32293000 228 | chr5 31791000 31793000 chr5 32339700 32341700 229 | chr5 31791000 31793000 chr5 32354200 32356200 230 | chr5 31854000 31856000 chr5 32015400 32017400 231 | chr5 31854000 31856000 chr5 32291000 32293000 232 | chr5 31854000 31856000 chr5 32339700 32341700 233 | chr5 31854000 31856000 chr5 32354200 32356200 234 | chr5 31854000 31856000 chr5 32372000 32374000 235 | chr5 31865800 31867800 chr5 32296200 32298200 236 | chr5 31865800 31867800 chr5 32354200 32356200 237 | chr5 32015400 32017400 chr5 32291000 32293000 238 | chr5 32083000 32085000 chr5 32291000 32293000 239 | chr5 32083000 32085000 chr5 32296200 32298200 240 | chr5 32083000 32085000 chr5 32354200 32356200 241 | chr5 32174000 32176000 chr5 32291000 32293000 242 | chr5 32174000 32176000 chr5 32339700 32341700 243 | chr5 32291000 32293000 chr5 32339700 32341700 244 | chr5 32291000 32293000 chr5 32354200 32356200 245 | chr5 32291000 32293000 chr5 32372000 32374000 246 | chr5 32296200 32298200 chr5 32354200 32356200 247 | chr5 32339700 32341700 chr5 32354200 32356200 248 | chr5 32339700 32341700 chr5 32372000 32374000 249 | chr5 32354200 32356200 chr5 32372000 32374000 250 | chr8 84856500 84858500 chr8 84873500 84875500 251 | chr8 84873500 84875500 chr8 84906300 84908300 252 | chr8 84873500 84875500 chr8 84912250 84914250 253 | chr8 84873500 84875500 chr8 84917700 84919700 254 | chr8 84873500 84875500 chr8 84924200 84926200 255 | chr8 84873500 84875500 chr8 84936250 84938250 256 | chr8 84873500 84875500 chr8 84949150 84951150 257 | chr8 84873500 84875500 chr8 84962800 84964800 258 | chr8 84873500 84875500 chr8 84975300 84977300 259 | chr8 84873500 84875500 chr8 84983000 84985000 260 | chr8 84873500 84875500 chr8 84996000 84998000 261 | chr8 84873500 84875500 chr8 85011500 85013500 262 | chr8 84873500 84875500 chr8 85083500 85085500 263 | chr8 84873500 84875500 chr8 85141000 85143000 264 | chr8 84873500 84875500 chr8 85227800 85229800 265 | chr8 84873500 84875500 chr8 85285000 85287000 266 | chr8 84873500 84875500 chr8 85327000 85329000 267 | chr8 84873500 84875500 chr8 85359000 85361000 268 | chr8 84873500 84875500 chr8 85365000 85367000 269 | chr8 84873500 84875500 chr8 85373100 85375100 270 | chr8 84873500 84875500 chr8 85375800 85377800 271 | chr8 84873500 84875500 chr8 85378600 85380600 272 | chr8 84873500 84875500 chr8 85386000 85388000 273 | chr8 84873500 84875500 chr8 85388300 85390300 274 | chr8 84873500 84875500 chr8 85389700 85391700 275 | chr8 84873500 84875500 chr8 85412800 85414800 276 | chr8 84873500 84875500 chr8 85414700 85416700 277 | chr8 84873500 84875500 chr8 85448750 85450750 278 | chr8 84873500 84875500 chr8 85467800 85469800 279 | chr8 84873500 84875500 chr8 85526000 85528000 280 | chr8 84873500 84875500 chr8 85566300 85568300 281 | chr8 84873500 84875500 chr8 85572600 85574600 282 | chr8 84873500 84875500 chr8 85582500 85584500 283 | chr8 84873500 84875500 chr8 85620000 85622000 284 | chr8 84873500 84875500 chr8 85629000 85631000 285 | chr8 84873500 84875500 chr8 85641000 85643000 286 | chr8 84873500 84875500 chr8 85751500 85753500 287 | chr8 84873500 84875500 chr8 85762400 85764400 288 | chr8 84906300 84908300 chr8 84917700 84919700 289 | chr8 84906300 84908300 chr8 84924200 84926200 290 | chr8 84906300 84908300 chr8 84936250 84938250 291 | chr8 84906300 84908300 chr8 84949150 84951150 292 | chr8 84906300 84908300 chr8 84962800 84964800 293 | chr8 84906300 84908300 chr8 84983000 84985000 294 | chr8 84906300 84908300 chr8 84996000 84998000 295 | chr8 84906300 84908300 chr8 85083500 85085500 296 | chr8 84906300 84908300 chr8 85141000 85143000 297 | chr8 84906300 84908300 chr8 85227800 85229800 298 | chr8 84906300 84908300 chr8 85265000 85267000 299 | chr8 84906300 84908300 chr8 85285000 85287000 300 | chr8 84906300 84908300 chr8 85327000 85329000 301 | chr8 84906300 84908300 chr8 85365000 85367000 302 | chr8 84906300 84908300 chr8 85375800 85377800 303 | chr8 84906300 84908300 chr8 85378600 85380600 304 | chr8 84906300 84908300 chr8 85389700 85391700 305 | chr8 84906300 84908300 chr8 85412800 85414800 306 | chr8 84906300 84908300 chr8 85526000 85528000 307 | chr8 84906300 84908300 chr8 85572600 85574600 308 | chr8 84906300 84908300 chr8 85702000 85704000 309 | chr8 84912250 84914250 chr8 84936250 84938250 310 | chr8 84912250 84914250 chr8 84949150 84951150 311 | chr8 84912250 84914250 chr8 84956550 84958550 312 | chr8 84912250 84914250 chr8 84962800 84964800 313 | chr8 84912250 84914250 chr8 84983000 84985000 314 | chr8 84912250 84914250 chr8 84996000 84998000 315 | chr8 84912250 84914250 chr8 85011500 85013500 316 | chr8 84912250 84914250 chr8 85083500 85085500 317 | chr8 84912250 84914250 chr8 85122000 85124000 318 | chr8 84912250 84914250 chr8 85141000 85143000 319 | chr8 84912250 84914250 chr8 85227800 85229800 320 | chr8 84912250 84914250 chr8 85327000 85329000 321 | chr8 84912250 84914250 chr8 85365000 85367000 322 | chr8 84912250 84914250 chr8 85373100 85375100 323 | chr8 84912250 84914250 chr8 85375800 85377800 324 | chr8 84912250 84914250 chr8 85378600 85380600 325 | chr8 84912250 84914250 chr8 85389700 85391700 326 | chr8 84912250 84914250 chr8 85412800 85414800 327 | chr8 84912250 84914250 chr8 85526000 85528000 328 | chr8 84912250 84914250 chr8 85572600 85574600 329 | chr8 84912250 84914250 chr8 85702000 85704000 330 | chr8 84917700 84919700 chr8 84962800 84964800 331 | chr8 84917700 84919700 chr8 84983000 84985000 332 | chr8 84917700 84919700 chr8 84996000 84998000 333 | chr8 84917700 84919700 chr8 85011500 85013500 334 | chr8 84917700 84919700 chr8 85083500 85085500 335 | chr8 84917700 84919700 chr8 85122000 85124000 336 | chr8 84917700 84919700 chr8 85141000 85143000 337 | chr8 84917700 84919700 chr8 85227800 85229800 338 | chr8 84917700 84919700 chr8 85327000 85329000 339 | chr8 84917700 84919700 chr8 85365000 85367000 340 | chr8 84917700 84919700 chr8 85373100 85375100 341 | chr8 84917700 84919700 chr8 85375800 85377800 342 | chr8 84917700 84919700 chr8 85378600 85380600 343 | chr8 84917700 84919700 chr8 85386000 85388000 344 | chr8 84917700 84919700 chr8 85388300 85390300 345 | chr8 84917700 84919700 chr8 85389700 85391700 346 | chr8 84917700 84919700 chr8 85404000 85406000 347 | chr8 84917700 84919700 chr8 85412800 85414800 348 | chr8 84917700 84919700 chr8 85526000 85528000 349 | chr8 84917700 84919700 chr8 85536500 85538500 350 | chr8 84917700 84919700 chr8 85557500 85559500 351 | chr8 84917700 84919700 chr8 85572600 85574600 352 | chr8 84917700 84919700 chr8 85597000 85599000 353 | chr8 84917700 84919700 chr8 85629000 85631000 354 | chr8 84917700 84919700 chr8 85641000 85643000 355 | chr8 84917700 84919700 chr8 85702000 85704000 356 | chr8 84917700 84919700 chr8 85715600 85717600 357 | chr8 84917700 84919700 chr8 85751500 85753500 358 | chr8 84917700 84919700 chr8 85762400 85764400 359 | chr8 84917700 84919700 chr8 85797300 85799300 360 | chr8 84924200 84926200 chr8 84962800 84964800 361 | chr8 84924200 84926200 chr8 84983000 84985000 362 | chr8 84924200 84926200 chr8 84996000 84998000 363 | chr8 84924200 84926200 chr8 85083500 85085500 364 | chr8 84924200 84926200 chr8 85122000 85124000 365 | chr8 84924200 84926200 chr8 85141000 85143000 366 | chr8 84924200 84926200 chr8 85227800 85229800 367 | chr8 84924200 84926200 chr8 85365000 85367000 368 | chr8 84924200 84926200 chr8 85373100 85375100 369 | chr8 84924200 84926200 chr8 85375800 85377800 370 | chr8 84924200 84926200 chr8 85378600 85380600 371 | chr8 84924200 84926200 chr8 85386000 85388000 372 | chr8 84924200 84926200 chr8 85388300 85390300 373 | chr8 84924200 84926200 chr8 85389700 85391700 374 | chr8 84924200 84926200 chr8 85412800 85414800 375 | chr8 84924200 84926200 chr8 85526000 85528000 376 | chr8 84924200 84926200 chr8 85557500 85559500 377 | chr8 84924200 84926200 chr8 85572600 85574600 378 | chr8 84924200 84926200 chr8 85629000 85631000 379 | chr8 84924200 84926200 chr8 85641000 85643000 380 | chr8 84924200 84926200 chr8 85702000 85704000 381 | chr8 84924200 84926200 chr8 85715600 85717600 382 | chr8 84924200 84926200 chr8 85751500 85753500 383 | chr8 84936250 84938250 chr8 84962800 84964800 384 | chr8 84936250 84938250 chr8 84983000 84985000 385 | chr8 84936250 84938250 chr8 84996000 84998000 386 | chr8 84936250 84938250 chr8 85011500 85013500 387 | chr8 84936250 84938250 chr8 85141000 85143000 388 | chr8 84936250 84938250 chr8 85227800 85229800 389 | chr8 84949150 84951150 chr8 84962800 84964800 390 | chr8 84949150 84951150 chr8 84983000 84985000 391 | chr8 84949150 84951150 chr8 84996000 84998000 392 | chr8 84949150 84951150 chr8 85141000 85143000 393 | chr8 84949150 84951150 chr8 85227800 85229800 394 | chr8 84956550 84958550 chr8 84983000 84985000 395 | chr8 84962800 84964800 chr8 84975300 84977300 396 | chr8 84962800 84964800 chr8 84983000 84985000 397 | chr8 84962800 84964800 chr8 84996000 84998000 398 | chr8 84962800 84964800 chr8 85083500 85085500 399 | chr8 84962800 84964800 chr8 85141000 85143000 400 | chr8 84962800 84964800 chr8 85227800 85229800 401 | chr8 84962800 84964800 chr8 85285000 85287000 402 | chr8 84962800 84964800 chr8 85327000 85329000 403 | chr8 84962800 84964800 chr8 85365000 85367000 404 | chr8 84962800 84964800 chr8 85373100 85375100 405 | chr8 84962800 84964800 chr8 85378600 85380600 406 | chr8 84962800 84964800 chr8 85388300 85390300 407 | chr8 84962800 84964800 chr8 85412800 85414800 408 | chr8 84962800 84964800 chr8 85526000 85528000 409 | chr8 84962800 84964800 chr8 85536500 85538500 410 | chr8 84962800 84964800 chr8 85566300 85568300 411 | chr8 84962800 84964800 chr8 85572600 85574600 412 | chr8 84962800 84964800 chr8 85629000 85631000 413 | chr8 84962800 84964800 chr8 85633600 85635600 414 | chr8 84962800 84964800 chr8 85641000 85643000 415 | chr8 84975300 84977300 chr8 84983000 84985000 416 | chr8 84975300 84977300 chr8 84996000 84998000 417 | chr8 84975300 84977300 chr8 85083500 85085500 418 | chr8 84975300 84977300 chr8 85141000 85143000 419 | chr8 84975300 84977300 chr8 85227800 85229800 420 | chr8 84975300 84977300 chr8 85327000 85329000 421 | chr8 84975300 84977300 chr8 85365000 85367000 422 | chr8 84975300 84977300 chr8 85373100 85375100 423 | chr8 84975300 84977300 chr8 85375800 85377800 424 | chr8 84975300 84977300 chr8 85386000 85388000 425 | chr8 84975300 84977300 chr8 85388300 85390300 426 | chr8 84975300 84977300 chr8 85389700 85391700 427 | chr8 84975300 84977300 chr8 85412800 85414800 428 | chr8 84975300 84977300 chr8 85566300 85568300 429 | chr8 84975300 84977300 chr8 85572600 85574600 430 | chr8 84975300 84977300 chr8 85629000 85631000 431 | chr8 84975300 84977300 chr8 85641000 85643000 432 | chr8 84983000 84985000 chr8 84996000 84998000 433 | chr8 84983000 84985000 chr8 85083500 85085500 434 | chr8 84983000 84985000 chr8 85141000 85143000 435 | chr8 84983000 84985000 chr8 85227800 85229800 436 | chr8 84983000 84985000 chr8 85285000 85287000 437 | chr8 84983000 84985000 chr8 85296000 85298000 438 | chr8 84983000 84985000 chr8 85305400 85307400 439 | chr8 84983000 84985000 chr8 85317600 85319600 440 | chr8 84983000 84985000 chr8 85323000 85325000 441 | chr8 84983000 84985000 chr8 85327000 85329000 442 | chr8 84983000 84985000 chr8 85365000 85367000 443 | chr8 84983000 84985000 chr8 85373100 85375100 444 | chr8 84983000 84985000 chr8 85375800 85377800 445 | chr8 84983000 84985000 chr8 85378600 85380600 446 | chr8 84983000 84985000 chr8 85386000 85388000 447 | chr8 84983000 84985000 chr8 85388300 85390300 448 | chr8 84983000 84985000 chr8 85389700 85391700 449 | chr8 84983000 84985000 chr8 85412800 85414800 450 | chr8 84983000 84985000 chr8 85430200 85432200 451 | chr8 84983000 84985000 chr8 85433000 85435000 452 | chr8 84983000 84985000 chr8 85526000 85528000 453 | chr8 84983000 84985000 chr8 85566300 85568300 454 | chr8 84983000 84985000 chr8 85572600 85574600 455 | chr8 84983000 84985000 chr8 85597000 85599000 456 | chr8 84983000 84985000 chr8 85629000 85631000 457 | chr8 84983000 84985000 chr8 85633600 85635600 458 | chr8 84983000 84985000 chr8 85641000 85643000 459 | chr8 84996000 84998000 chr8 85083500 85085500 460 | chr8 84996000 84998000 chr8 85122000 85124000 461 | chr8 84996000 84998000 chr8 85141000 85143000 462 | chr8 84996000 84998000 chr8 85227800 85229800 463 | chr8 84996000 84998000 chr8 85285000 85287000 464 | chr8 84996000 84998000 chr8 85305400 85307400 465 | chr8 84996000 84998000 chr8 85323000 85325000 466 | chr8 84996000 84998000 chr8 85327000 85329000 467 | chr8 84996000 84998000 chr8 85365000 85367000 468 | chr8 84996000 84998000 chr8 85373100 85375100 469 | chr8 84996000 84998000 chr8 85375800 85377800 470 | chr8 84996000 84998000 chr8 85378600 85380600 471 | chr8 84996000 84998000 chr8 85386000 85388000 472 | chr8 84996000 84998000 chr8 85388300 85390300 473 | chr8 84996000 84998000 chr8 85389700 85391700 474 | chr8 84996000 84998000 chr8 85412800 85414800 475 | chr8 84996000 84998000 chr8 85430200 85432200 476 | chr8 84996000 84998000 chr8 85433000 85435000 477 | chr8 84996000 84998000 chr8 85448750 85450750 478 | chr8 84996000 84998000 chr8 85455750 85457750 479 | chr8 84996000 84998000 chr8 85526000 85528000 480 | chr8 84996000 84998000 chr8 85536500 85538500 481 | chr8 84996000 84998000 chr8 85566300 85568300 482 | chr8 84996000 84998000 chr8 85572600 85574600 483 | chr8 84996000 84998000 chr8 85597000 85599000 484 | chr8 84996000 84998000 chr8 85620000 85622000 485 | chr8 84996000 84998000 chr8 85629000 85631000 486 | chr8 84996000 84998000 chr8 85633600 85635600 487 | chr8 84996000 84998000 chr8 85641000 85643000 488 | chr8 84996000 84998000 chr8 85751500 85753500 489 | chr8 85011500 85013500 chr8 85083500 85085500 490 | chr8 85014650 85016650 chr8 85083500 85085500 491 | chr8 85017500 85019500 chr8 85083500 85085500 492 | chr8 85017500 85019500 chr8 85296000 85298000 493 | chr8 85017500 85019500 chr8 85320000 85322000 494 | chr8 85083500 85085500 chr8 85141000 85143000 495 | chr8 85083500 85085500 chr8 85227800 85229800 496 | chr8 85083500 85085500 chr8 85285000 85287000 497 | chr8 85083500 85085500 chr8 85296000 85298000 498 | chr8 85083500 85085500 chr8 85320000 85322000 499 | chr8 85083500 85085500 chr8 85365000 85367000 500 | chr8 85083500 85085500 chr8 85373100 85375100 501 | chr8 85083500 85085500 chr8 85375800 85377800 502 | chr8 85089500 85091500 chr8 85141000 85143000 503 | chr8 85089500 85091500 chr8 85171500 85173500 504 | chr8 85089500 85091500 chr8 85179500 85181500 505 | chr8 85089500 85091500 chr8 85207000 85209000 506 | chr8 85089500 85091500 chr8 85227800 85229800 507 | chr8 85089500 85091500 chr8 85235250 85237250 508 | chr8 85089500 85091500 chr8 85239700 85241700 509 | chr8 85089500 85091500 chr8 85262700 85264700 510 | chr8 85089500 85091500 chr8 85279800 85281800 511 | chr8 85089500 85091500 chr8 85293400 85295400 512 | chr8 85089500 85091500 chr8 85296000 85298000 513 | chr8 85089500 85091500 chr8 85321200 85323200 514 | chr8 85089500 85091500 chr8 85365000 85367000 515 | chr8 85089500 85091500 chr8 85373100 85375100 516 | chr8 85122000 85124000 chr8 85141000 85143000 517 | chr8 85122000 85124000 chr8 85227800 85229800 518 | chr8 85122000 85124000 chr8 85365000 85367000 519 | chr8 85122000 85124000 chr8 85373100 85375100 520 | chr8 85122000 85124000 chr8 85375800 85377800 521 | chr8 85122000 85124000 chr8 85378600 85380600 522 | chr8 85122000 85124000 chr8 85414700 85416700 523 | chr8 85141000 85143000 chr8 85227800 85229800 524 | chr8 85141000 85143000 chr8 85265000 85267000 525 | chr8 85141000 85143000 chr8 85285000 85287000 526 | chr8 85141000 85143000 chr8 85296000 85298000 527 | chr8 85141000 85143000 chr8 85305400 85307400 528 | chr8 85141000 85143000 chr8 85327000 85329000 529 | chr8 85141000 85143000 chr8 85365000 85367000 530 | chr8 85141000 85143000 chr8 85373100 85375100 531 | chr8 85141000 85143000 chr8 85375800 85377800 532 | chr8 85141000 85143000 chr8 85378600 85380600 533 | chr8 85141000 85143000 chr8 85386000 85388000 534 | chr8 85141000 85143000 chr8 85388300 85390300 535 | chr8 85141000 85143000 chr8 85389700 85391700 536 | chr8 85141000 85143000 chr8 85412800 85414800 537 | chr8 85141000 85143000 chr8 85526000 85528000 538 | chr8 85141000 85143000 chr8 85572600 85574600 539 | chr8 85141000 85143000 chr8 85597000 85599000 540 | chr8 85141000 85143000 chr8 85629000 85631000 541 | chr8 85141000 85143000 chr8 85641000 85643000 542 | chr8 85227800 85229800 chr8 85265000 85267000 543 | chr8 85227800 85229800 chr8 85285000 85287000 544 | chr8 85227800 85229800 chr8 85296000 85298000 545 | chr8 85227800 85229800 chr8 85327000 85329000 546 | chr8 85227800 85229800 chr8 85365000 85367000 547 | chr8 85227800 85229800 chr8 85373100 85375100 548 | chr8 85227800 85229800 chr8 85375800 85377800 549 | chr8 85227800 85229800 chr8 85378600 85380600 550 | chr8 85227800 85229800 chr8 85386000 85388000 551 | chr8 85227800 85229800 chr8 85388300 85390300 552 | chr8 85227800 85229800 chr8 85389700 85391700 553 | chr8 85227800 85229800 chr8 85412800 85414800 554 | chr8 85227800 85229800 chr8 85430200 85432200 555 | chr8 85227800 85229800 chr8 85448750 85450750 556 | chr8 85227800 85229800 chr8 85526000 85528000 557 | chr8 85227800 85229800 chr8 85536500 85538500 558 | chr8 85227800 85229800 chr8 85557500 85559500 559 | chr8 85227800 85229800 chr8 85566300 85568300 560 | chr8 85227800 85229800 chr8 85572600 85574600 561 | chr8 85227800 85229800 chr8 85597000 85599000 562 | chr8 85227800 85229800 chr8 85620000 85622000 563 | chr8 85227800 85229800 chr8 85629000 85631000 564 | chr8 85227800 85229800 chr8 85633600 85635600 565 | chr8 85227800 85229800 chr8 85641000 85643000 566 | chr8 85227800 85229800 chr8 85715600 85717600 567 | chr8 85227800 85229800 chr8 85751500 85753500 568 | chr8 85227800 85229800 chr8 85762400 85764400 569 | chr8 85227800 85229800 chr8 85797300 85799300 570 | chr8 85285000 85287000 chr8 85365000 85367000 571 | chr8 85285000 85287000 chr8 85526000 85528000 572 | chr8 85285000 85287000 chr8 85536500 85538500 573 | chr8 85285000 85287000 chr8 85557500 85559500 574 | chr8 85305400 85307400 chr8 85320000 85322000 575 | chr8 85305400 85307400 chr8 85365000 85367000 576 | chr8 85305400 85307400 chr8 85536500 85538500 577 | chr8 85305400 85307400 chr8 85538700 85540700 578 | chr8 85317600 85319600 chr8 85538700 85540700 579 | chr8 85323000 85325000 chr8 85538700 85540700 580 | chr8 85327000 85329000 chr8 85365000 85367000 581 | chr8 85327000 85329000 chr8 85373100 85375100 582 | chr8 85327000 85329000 chr8 85375800 85377800 583 | chr8 85327000 85329000 chr8 85378600 85380600 584 | chr8 85327000 85329000 chr8 85386000 85388000 585 | chr8 85327000 85329000 chr8 85389700 85391700 586 | chr8 85327000 85329000 chr8 85412800 85414800 587 | chr8 85327000 85329000 chr8 85526000 85528000 588 | chr8 85327000 85329000 chr8 85572600 85574600 589 | chr8 85327000 85329000 chr8 85629000 85631000 590 | chr8 85327000 85329000 chr8 85641000 85643000 591 | chr8 85365000 85367000 chr8 85412800 85414800 592 | chr8 85365000 85367000 chr8 85414700 85416700 593 | chr8 85365000 85367000 chr8 85430200 85432200 594 | chr8 85365000 85367000 chr8 85435000 85437000 595 | chr8 85365000 85367000 chr8 85448750 85450750 596 | chr8 85365000 85367000 chr8 85455750 85457750 597 | chr8 85365000 85367000 chr8 85463300 85465300 598 | chr8 85365000 85367000 chr8 85467800 85469800 599 | chr8 85365000 85367000 chr8 85526000 85528000 600 | chr8 85365000 85367000 chr8 85536500 85538500 601 | chr8 85365000 85367000 chr8 85538700 85540700 602 | chr8 85365000 85367000 chr8 85541200 85543200 603 | chr8 85365000 85367000 chr8 85557500 85559500 604 | chr8 85365000 85367000 chr8 85572600 85574600 605 | chr8 85365000 85367000 chr8 85597000 85599000 606 | chr8 85365000 85367000 chr8 85620000 85622000 607 | chr8 85365000 85367000 chr8 85629000 85631000 608 | chr8 85365000 85367000 chr8 85633600 85635600 609 | chr8 85365000 85367000 chr8 85641000 85643000 610 | chr8 85365000 85367000 chr8 85691000 85693000 611 | chr8 85365000 85367000 chr8 85695000 85697000 612 | chr8 85365000 85367000 chr8 85702000 85704000 613 | chr8 85365000 85367000 chr8 85711500 85713500 614 | chr8 85365000 85367000 chr8 85715600 85717600 615 | chr8 85365000 85367000 chr8 85751500 85753500 616 | chr8 85365000 85367000 chr8 85762400 85764400 617 | chr8 85365000 85367000 chr8 85797300 85799300 618 | chr8 85373100 85375100 chr8 85412800 85414800 619 | chr8 85373100 85375100 chr8 85414700 85416700 620 | chr8 85373100 85375100 chr8 85448750 85450750 621 | chr8 85373100 85375100 chr8 85455750 85457750 622 | chr8 85373100 85375100 chr8 85463300 85465300 623 | chr8 85373100 85375100 chr8 85467800 85469800 624 | chr8 85373100 85375100 chr8 85526000 85528000 625 | chr8 85373100 85375100 chr8 85557500 85559500 626 | chr8 85373100 85375100 chr8 85566300 85568300 627 | chr8 85373100 85375100 chr8 85572600 85574600 628 | chr8 85373100 85375100 chr8 85597000 85599000 629 | chr8 85373100 85375100 chr8 85620000 85622000 630 | chr8 85373100 85375100 chr8 85629000 85631000 631 | chr8 85373100 85375100 chr8 85633600 85635600 632 | chr8 85373100 85375100 chr8 85641000 85643000 633 | chr8 85373100 85375100 chr8 85691000 85693000 634 | chr8 85373100 85375100 chr8 85695000 85697000 635 | chr8 85373100 85375100 chr8 85702000 85704000 636 | chr8 85373100 85375100 chr8 85711500 85713500 637 | chr8 85373100 85375100 chr8 85715600 85717600 638 | chr8 85373100 85375100 chr8 85751500 85753500 639 | chr8 85373100 85375100 chr8 85762400 85764400 640 | chr8 85373100 85375100 chr8 85785750 85787750 641 | chr8 85373100 85375100 chr8 85797300 85799300 642 | chr8 85375800 85377800 chr8 85412800 85414800 643 | chr8 85375800 85377800 chr8 85414700 85416700 644 | chr8 85375800 85377800 chr8 85448750 85450750 645 | chr8 85375800 85377800 chr8 85455750 85457750 646 | chr8 85375800 85377800 chr8 85463300 85465300 647 | chr8 85375800 85377800 chr8 85467800 85469800 648 | chr8 85375800 85377800 chr8 85526000 85528000 649 | chr8 85375800 85377800 chr8 85557500 85559500 650 | chr8 85375800 85377800 chr8 85566300 85568300 651 | chr8 85375800 85377800 chr8 85572600 85574600 652 | chr8 85375800 85377800 chr8 85597000 85599000 653 | chr8 85375800 85377800 chr8 85629000 85631000 654 | chr8 85375800 85377800 chr8 85633600 85635600 655 | chr8 85375800 85377800 chr8 85641000 85643000 656 | chr8 85375800 85377800 chr8 85691000 85693000 657 | chr8 85375800 85377800 chr8 85702000 85704000 658 | chr8 85375800 85377800 chr8 85711500 85713500 659 | chr8 85375800 85377800 chr8 85715600 85717600 660 | chr8 85375800 85377800 chr8 85751500 85753500 661 | chr8 85375800 85377800 chr8 85762400 85764400 662 | chr8 85375800 85377800 chr8 85797300 85799300 663 | chr8 85378600 85380600 chr8 85412800 85414800 664 | chr8 85378600 85380600 chr8 85414700 85416700 665 | chr8 85378600 85380600 chr8 85430200 85432200 666 | chr8 85378600 85380600 chr8 85448750 85450750 667 | chr8 85378600 85380600 chr8 85455750 85457750 668 | chr8 85378600 85380600 chr8 85463300 85465300 669 | chr8 85378600 85380600 chr8 85467800 85469800 670 | chr8 85378600 85380600 chr8 85557500 85559500 671 | chr8 85378600 85380600 chr8 85566300 85568300 672 | chr8 85378600 85380600 chr8 85572600 85574600 673 | chr8 85378600 85380600 chr8 85597000 85599000 674 | chr8 85378600 85380600 chr8 85620000 85622000 675 | chr8 85378600 85380600 chr8 85629000 85631000 676 | chr8 85378600 85380600 chr8 85633600 85635600 677 | chr8 85378600 85380600 chr8 85641000 85643000 678 | chr8 85378600 85380600 chr8 85691000 85693000 679 | chr8 85378600 85380600 chr8 85695000 85697000 680 | chr8 85378600 85380600 chr8 85702000 85704000 681 | chr8 85378600 85380600 chr8 85711500 85713500 682 | chr8 85378600 85380600 chr8 85715600 85717600 683 | chr8 85378600 85380600 chr8 85751500 85753500 684 | chr8 85378600 85380600 chr8 85762400 85764400 685 | chr8 85378600 85380600 chr8 85797300 85799300 686 | chr8 85386000 85388000 chr8 85412800 85414800 687 | chr8 85386000 85388000 chr8 85430200 85432200 688 | chr8 85386000 85388000 chr8 85448750 85450750 689 | chr8 85386000 85388000 chr8 85455750 85457750 690 | chr8 85386000 85388000 chr8 85463300 85465300 691 | chr8 85386000 85388000 chr8 85467800 85469800 692 | chr8 85386000 85388000 chr8 85526000 85528000 693 | chr8 85386000 85388000 chr8 85557500 85559500 694 | chr8 85386000 85388000 chr8 85566300 85568300 695 | chr8 85386000 85388000 chr8 85572600 85574600 696 | chr8 85386000 85388000 chr8 85597000 85599000 697 | chr8 85386000 85388000 chr8 85629000 85631000 698 | chr8 85386000 85388000 chr8 85633600 85635600 699 | chr8 85386000 85388000 chr8 85641000 85643000 700 | chr8 85386000 85388000 chr8 85691000 85693000 701 | chr8 85386000 85388000 chr8 85695000 85697000 702 | chr8 85386000 85388000 chr8 85702000 85704000 703 | chr8 85386000 85388000 chr8 85711500 85713500 704 | chr8 85386000 85388000 chr8 85715600 85717600 705 | chr8 85386000 85388000 chr8 85751500 85753500 706 | chr8 85386000 85388000 chr8 85762400 85764400 707 | chr8 85386000 85388000 chr8 85797300 85799300 708 | chr8 85388300 85390300 chr8 85412800 85414800 709 | chr8 85388300 85390300 chr8 85448750 85450750 710 | chr8 85388300 85390300 chr8 85526000 85528000 711 | chr8 85388300 85390300 chr8 85557500 85559500 712 | chr8 85388300 85390300 chr8 85566300 85568300 713 | chr8 85388300 85390300 chr8 85572600 85574600 714 | chr8 85388300 85390300 chr8 85597000 85599000 715 | chr8 85388300 85390300 chr8 85629000 85631000 716 | chr8 85388300 85390300 chr8 85633600 85635600 717 | chr8 85388300 85390300 chr8 85641000 85643000 718 | chr8 85388300 85390300 chr8 85691000 85693000 719 | chr8 85388300 85390300 chr8 85695000 85697000 720 | chr8 85388300 85390300 chr8 85702000 85704000 721 | chr8 85388300 85390300 chr8 85711500 85713500 722 | chr8 85388300 85390300 chr8 85715600 85717600 723 | chr8 85388300 85390300 chr8 85751500 85753500 724 | chr8 85388300 85390300 chr8 85762400 85764400 725 | chr8 85388300 85390300 chr8 85797300 85799300 726 | chr8 85389700 85391700 chr8 85412800 85414800 727 | chr8 85389700 85391700 chr8 85414700 85416700 728 | chr8 85389700 85391700 chr8 85430200 85432200 729 | chr8 85389700 85391700 chr8 85435000 85437000 730 | chr8 85389700 85391700 chr8 85448750 85450750 731 | chr8 85389700 85391700 chr8 85455750 85457750 732 | chr8 85389700 85391700 chr8 85463300 85465300 733 | chr8 85389700 85391700 chr8 85467800 85469800 734 | chr8 85389700 85391700 chr8 85526000 85528000 735 | chr8 85389700 85391700 chr8 85549300 85551300 736 | chr8 85389700 85391700 chr8 85557500 85559500 737 | chr8 85389700 85391700 chr8 85566300 85568300 738 | chr8 85389700 85391700 chr8 85572600 85574600 739 | chr8 85389700 85391700 chr8 85597000 85599000 740 | chr8 85389700 85391700 chr8 85620000 85622000 741 | chr8 85389700 85391700 chr8 85629000 85631000 742 | chr8 85389700 85391700 chr8 85633600 85635600 743 | chr8 85389700 85391700 chr8 85641000 85643000 744 | chr8 85389700 85391700 chr8 85691000 85693000 745 | chr8 85389700 85391700 chr8 85695000 85697000 746 | chr8 85389700 85391700 chr8 85702000 85704000 747 | chr8 85389700 85391700 chr8 85711500 85713500 748 | chr8 85389700 85391700 chr8 85715600 85717600 749 | chr8 85389700 85391700 chr8 85751500 85753500 750 | chr8 85389700 85391700 chr8 85762400 85764400 751 | chr8 85389700 85391700 chr8 85785750 85787750 752 | chr8 85389700 85391700 chr8 85797300 85799300 753 | chr8 85412800 85414800 chr8 85448750 85450750 754 | chr8 85412800 85414800 chr8 85463300 85465300 755 | chr8 85412800 85414800 chr8 85467800 85469800 756 | chr8 85412800 85414800 chr8 85526000 85528000 757 | chr8 85412800 85414800 chr8 85557500 85559500 758 | chr8 85412800 85414800 chr8 85566300 85568300 759 | chr8 85412800 85414800 chr8 85572600 85574600 760 | chr8 85412800 85414800 chr8 85582500 85584500 761 | chr8 85412800 85414800 chr8 85597000 85599000 762 | chr8 85412800 85414800 chr8 85620000 85622000 763 | chr8 85412800 85414800 chr8 85629000 85631000 764 | chr8 85412800 85414800 chr8 85633600 85635600 765 | chr8 85412800 85414800 chr8 85639000 85641000 766 | chr8 85412800 85414800 chr8 85641000 85643000 767 | chr8 85412800 85414800 chr8 85663000 85665000 768 | chr8 85412800 85414800 chr8 85671400 85673400 769 | chr8 85412800 85414800 chr8 85691000 85693000 770 | chr8 85412800 85414800 chr8 85695000 85697000 771 | chr8 85412800 85414800 chr8 85702000 85704000 772 | chr8 85412800 85414800 chr8 85711500 85713500 773 | chr8 85412800 85414800 chr8 85715600 85717600 774 | chr8 85412800 85414800 chr8 85751500 85753500 775 | chr8 85412800 85414800 chr8 85762400 85764400 776 | chr8 85412800 85414800 chr8 85797300 85799300 777 | chr8 85414700 85416700 chr8 85448750 85450750 778 | chr8 85414700 85416700 chr8 85455750 85457750 779 | chr8 85414700 85416700 chr8 85463300 85465300 780 | chr8 85414700 85416700 chr8 85467800 85469800 781 | chr8 85414700 85416700 chr8 85526000 85528000 782 | chr8 85414700 85416700 chr8 85557500 85559500 783 | chr8 85414700 85416700 chr8 85566300 85568300 784 | chr8 85414700 85416700 chr8 85572600 85574600 785 | chr8 85414700 85416700 chr8 85597000 85599000 786 | chr8 85414700 85416700 chr8 85620000 85622000 787 | chr8 85414700 85416700 chr8 85629000 85631000 788 | chr8 85414700 85416700 chr8 85633600 85635600 789 | chr8 85414700 85416700 chr8 85639000 85641000 790 | chr8 85414700 85416700 chr8 85641000 85643000 791 | chr8 85414700 85416700 chr8 85715600 85717600 792 | chr8 85414700 85416700 chr8 85751500 85753500 793 | chr8 85414700 85416700 chr8 85762400 85764400 794 | chr8 85414700 85416700 chr8 85785750 85787750 795 | chr8 85414700 85416700 chr8 85797300 85799300 796 | chr8 85423500 85425500 chr8 85536500 85538500 797 | chr8 85423500 85425500 chr8 85538700 85540700 798 | chr8 85423500 85425500 chr8 85541200 85543200 799 | chr8 85425500 85427500 chr8 85536500 85538500 800 | chr8 85425500 85427500 chr8 85538700 85540700 801 | chr8 85425500 85427500 chr8 85541200 85543200 802 | chr8 85425500 85427500 chr8 85597000 85599000 803 | chr8 85430200 85432200 chr8 85526000 85528000 804 | chr8 85430200 85432200 chr8 85536500 85538500 805 | chr8 85430200 85432200 chr8 85541200 85543200 806 | chr8 85430200 85432200 chr8 85597000 85599000 807 | chr8 85430200 85432200 chr8 85629000 85631000 808 | chr8 85430200 85432200 chr8 85633600 85635600 809 | chr8 85430200 85432200 chr8 85641000 85643000 810 | chr8 85430200 85432200 chr8 85715600 85717600 811 | chr8 85433000 85435000 chr8 85526000 85528000 812 | chr8 85433000 85435000 chr8 85597000 85599000 813 | chr8 85433000 85435000 chr8 85629000 85631000 814 | chr8 85433000 85435000 chr8 85633600 85635600 815 | chr8 85433000 85435000 chr8 85641000 85643000 816 | chr8 85433000 85435000 chr8 85715600 85717600 817 | chr8 85435000 85437000 chr8 85463300 85465300 818 | chr8 85435000 85437000 chr8 85526000 85528000 819 | chr8 85435000 85437000 chr8 85536500 85538500 820 | chr8 85435000 85437000 chr8 85538700 85540700 821 | chr8 85435000 85437000 chr8 85541200 85543200 822 | chr8 85435000 85437000 chr8 85549300 85551300 823 | chr8 85435000 85437000 chr8 85597000 85599000 824 | chr8 85435000 85437000 chr8 85629000 85631000 825 | chr8 85435000 85437000 chr8 85633600 85635600 826 | chr8 85435000 85437000 chr8 85715600 85717600 827 | chr8 85448750 85450750 chr8 85526000 85528000 828 | chr8 85448750 85450750 chr8 85536500 85538500 829 | chr8 85448750 85450750 chr8 85557500 85559500 830 | chr8 85448750 85450750 chr8 85566300 85568300 831 | chr8 85448750 85450750 chr8 85572600 85574600 832 | chr8 85448750 85450750 chr8 85597000 85599000 833 | chr8 85448750 85450750 chr8 85629000 85631000 834 | chr8 85448750 85450750 chr8 85633600 85635600 835 | chr8 85448750 85450750 chr8 85639000 85641000 836 | chr8 85448750 85450750 chr8 85641000 85643000 837 | chr8 85455750 85457750 chr8 85526000 85528000 838 | chr8 85455750 85457750 chr8 85536500 85538500 839 | chr8 85455750 85457750 chr8 85557500 85559500 840 | chr8 85455750 85457750 chr8 85566300 85568300 841 | chr8 85455750 85457750 chr8 85572600 85574600 842 | chr8 85455750 85457750 chr8 85597000 85599000 843 | chr8 85455750 85457750 chr8 85629000 85631000 844 | chr8 85455750 85457750 chr8 85633600 85635600 845 | chr8 85455750 85457750 chr8 85639000 85641000 846 | chr8 85455750 85457750 chr8 85641000 85643000 847 | chr8 85463300 85465300 chr8 85526000 85528000 848 | chr8 85463300 85465300 chr8 85536500 85538500 849 | chr8 85463300 85465300 chr8 85538700 85540700 850 | chr8 85463300 85465300 chr8 85541200 85543200 851 | chr8 85463300 85465300 chr8 85549300 85551300 852 | chr8 85463300 85465300 chr8 85597000 85599000 853 | chr8 85463300 85465300 chr8 85620000 85622000 854 | chr8 85463300 85465300 chr8 85629000 85631000 855 | chr8 85463300 85465300 chr8 85633600 85635600 856 | chr8 85463300 85465300 chr8 85639000 85641000 857 | chr8 85463300 85465300 chr8 85641000 85643000 858 | chr8 85463300 85465300 chr8 85715600 85717600 859 | chr8 85467800 85469800 chr8 85526000 85528000 860 | chr8 85467800 85469800 chr8 85536500 85538500 861 | chr8 85467800 85469800 chr8 85538700 85540700 862 | chr8 85467800 85469800 chr8 85557500 85559500 863 | chr8 85467800 85469800 chr8 85566300 85568300 864 | chr8 85467800 85469800 chr8 85572600 85574600 865 | chr8 85467800 85469800 chr8 85597000 85599000 866 | chr8 85467800 85469800 chr8 85620000 85622000 867 | chr8 85467800 85469800 chr8 85629000 85631000 868 | chr8 85467800 85469800 chr8 85633600 85635600 869 | chr8 85467800 85469800 chr8 85639000 85641000 870 | chr8 85467800 85469800 chr8 85641000 85643000 871 | chr8 85467800 85469800 chr8 85715600 85717600 872 | chr8 85497500 85499500 chr8 85526000 85528000 873 | chr8 85499300 85501300 chr8 85526000 85528000 874 | chr8 85511000 85513000 chr8 85526000 85528000 875 | chr8 85511000 85513000 chr8 85597000 85599000 876 | chr8 85511000 85513000 chr8 85620000 85622000 877 | chr8 85511000 85513000 chr8 85629000 85631000 878 | chr8 85511000 85513000 chr8 85641000 85643000 879 | chr8 85526000 85528000 chr8 85536500 85538500 880 | chr8 85526000 85528000 chr8 85549300 85551300 881 | chr8 85526000 85528000 chr8 85557500 85559500 882 | chr8 85526000 85528000 chr8 85566300 85568300 883 | chr8 85526000 85528000 chr8 85572600 85574600 884 | chr8 85526000 85528000 chr8 85597000 85599000 885 | chr8 85526000 85528000 chr8 85620000 85622000 886 | chr8 85526000 85528000 chr8 85629000 85631000 887 | chr8 85526000 85528000 chr8 85633600 85635600 888 | chr8 85526000 85528000 chr8 85639000 85641000 889 | chr8 85526000 85528000 chr8 85641000 85643000 890 | chr8 85526000 85528000 chr8 85663000 85665000 891 | chr8 85526000 85528000 chr8 85671400 85673400 892 | chr8 85526000 85528000 chr8 85691000 85693000 893 | chr8 85526000 85528000 chr8 85695000 85697000 894 | chr8 85526000 85528000 chr8 85702000 85704000 895 | chr8 85526000 85528000 chr8 85705600 85707600 896 | chr8 85526000 85528000 chr8 85711500 85713500 897 | chr8 85526000 85528000 chr8 85715600 85717600 898 | chr8 85526000 85528000 chr8 85751500 85753500 899 | chr8 85526000 85528000 chr8 85762400 85764400 900 | chr8 85536500 85538500 chr8 85572600 85574600 901 | chr8 85536500 85538500 chr8 85597000 85599000 902 | chr8 85536500 85538500 chr8 85629000 85631000 903 | chr8 85536500 85538500 chr8 85633600 85635600 904 | chr8 85536500 85538500 chr8 85715600 85717600 905 | chr8 85536500 85538500 chr8 85751500 85753500 906 | chr8 85536500 85538500 chr8 85762400 85764400 907 | chr8 85538700 85540700 chr8 85597000 85599000 908 | chr8 85541200 85543200 chr8 85597000 85599000 909 | chr8 85549300 85551300 chr8 85597000 85599000 910 | chr8 85549300 85551300 chr8 85629000 85631000 911 | chr8 85549300 85551300 chr8 85797300 85799300 912 | chr8 85557500 85559500 chr8 85572600 85574600 913 | chr8 85557500 85559500 chr8 85582500 85584500 914 | chr8 85557500 85559500 chr8 85597000 85599000 915 | chr8 85557500 85559500 chr8 85620000 85622000 916 | chr8 85557500 85559500 chr8 85629000 85631000 917 | chr8 85557500 85559500 chr8 85633600 85635600 918 | chr8 85557500 85559500 chr8 85641000 85643000 919 | chr8 85557500 85559500 chr8 85691000 85693000 920 | chr8 85557500 85559500 chr8 85702000 85704000 921 | chr8 85557500 85559500 chr8 85705600 85707600 922 | chr8 85557500 85559500 chr8 85715600 85717600 923 | chr8 85557500 85559500 chr8 85751500 85753500 924 | chr8 85557500 85559500 chr8 85762400 85764400 925 | chr8 85557500 85559500 chr8 85785750 85787750 926 | chr8 85557500 85559500 chr8 85797300 85799300 927 | chr8 85566300 85568300 chr8 85572600 85574600 928 | chr8 85566300 85568300 chr8 85582500 85584500 929 | chr8 85566300 85568300 chr8 85597000 85599000 930 | chr8 85566300 85568300 chr8 85620000 85622000 931 | chr8 85566300 85568300 chr8 85629000 85631000 932 | chr8 85566300 85568300 chr8 85633600 85635600 933 | chr8 85566300 85568300 chr8 85641000 85643000 934 | chr8 85566300 85568300 chr8 85691000 85693000 935 | chr8 85566300 85568300 chr8 85702000 85704000 936 | chr8 85566300 85568300 chr8 85705600 85707600 937 | chr8 85566300 85568300 chr8 85715600 85717600 938 | chr8 85566300 85568300 chr8 85751500 85753500 939 | chr8 85566300 85568300 chr8 85762400 85764400 940 | chr8 85566300 85568300 chr8 85785750 85787750 941 | chr8 85566300 85568300 chr8 85797300 85799300 942 | chr8 85572600 85574600 chr8 85582500 85584500 943 | chr8 85572600 85574600 chr8 85597000 85599000 944 | chr8 85572600 85574600 chr8 85620000 85622000 945 | chr8 85572600 85574600 chr8 85629000 85631000 946 | chr8 85572600 85574600 chr8 85633600 85635600 947 | chr8 85572600 85574600 chr8 85641000 85643000 948 | chr8 85572600 85574600 chr8 85691000 85693000 949 | chr8 85572600 85574600 chr8 85695000 85697000 950 | chr8 85572600 85574600 chr8 85702000 85704000 951 | chr8 85572600 85574600 chr8 85705600 85707600 952 | chr8 85572600 85574600 chr8 85711500 85713500 953 | chr8 85572600 85574600 chr8 85715600 85717600 954 | chr8 85572600 85574600 chr8 85751500 85753500 955 | chr8 85572600 85574600 chr8 85762400 85764400 956 | chr8 85572600 85574600 chr8 85785750 85787750 957 | chr8 85572600 85574600 chr8 85797300 85799300 958 | chr8 85582500 85584500 chr8 85597000 85599000 959 | chr8 85582500 85584500 chr8 85620000 85622000 960 | chr8 85582500 85584500 chr8 85629000 85631000 961 | chr8 85582500 85584500 chr8 85633600 85635600 962 | chr8 85582500 85584500 chr8 85641000 85643000 963 | chr8 85582500 85584500 chr8 85691000 85693000 964 | chr8 85582500 85584500 chr8 85715600 85717600 965 | chr8 85582500 85584500 chr8 85751500 85753500 966 | chr8 85582500 85584500 chr8 85762400 85764400 967 | chr8 85582500 85584500 chr8 85797300 85799300 968 | chr8 85597000 85599000 chr8 85620000 85622000 969 | chr8 85597000 85599000 chr8 85629000 85631000 970 | chr8 85597000 85599000 chr8 85633600 85635600 971 | chr8 85597000 85599000 chr8 85641000 85643000 972 | chr8 85597000 85599000 chr8 85663000 85665000 973 | chr8 85597000 85599000 chr8 85671400 85673400 974 | chr8 85597000 85599000 chr8 85691000 85693000 975 | chr8 85597000 85599000 chr8 85695000 85697000 976 | chr8 85597000 85599000 chr8 85715600 85717600 977 | chr8 85597000 85599000 chr8 85751500 85753500 978 | chr8 85597000 85599000 chr8 85762400 85764400 979 | chr8 85597000 85599000 chr8 85785750 85787750 980 | chr8 85597000 85599000 chr8 85797300 85799300 981 | chr8 85620000 85622000 chr8 85629000 85631000 982 | chr8 85620000 85622000 chr8 85633600 85635600 983 | chr8 85620000 85622000 chr8 85641000 85643000 984 | chr8 85620000 85622000 chr8 85663000 85665000 985 | chr8 85620000 85622000 chr8 85671400 85673400 986 | chr8 85620000 85622000 chr8 85691000 85693000 987 | chr8 85620000 85622000 chr8 85695000 85697000 988 | chr8 85620000 85622000 chr8 85715600 85717600 989 | chr8 85620000 85622000 chr8 85751500 85753500 990 | chr8 85620000 85622000 chr8 85762400 85764400 991 | chr8 85620000 85622000 chr8 85797300 85799300 992 | chr8 85629000 85631000 chr8 85633600 85635600 993 | chr8 85629000 85631000 chr8 85641000 85643000 994 | chr8 85629000 85631000 chr8 85663000 85665000 995 | chr8 85629000 85631000 chr8 85671400 85673400 996 | chr8 85629000 85631000 chr8 85691000 85693000 997 | chr8 85629000 85631000 chr8 85695000 85697000 998 | chr8 85629000 85631000 chr8 85702000 85704000 999 | chr8 85629000 85631000 chr8 85711500 85713500 1000 | chr8 85629000 85631000 chr8 85715600 85717600 1001 | chr8 85629000 85631000 chr8 85751500 85753500 1002 | chr8 85629000 85631000 chr8 85762400 85764400 1003 | chr8 85629000 85631000 chr8 85797300 85799300 1004 | chr8 85633600 85635600 chr8 85641000 85643000 1005 | chr8 85633600 85635600 chr8 85663000 85665000 1006 | chr8 85633600 85635600 chr8 85671400 85673400 1007 | chr8 85633600 85635600 chr8 85691000 85693000 1008 | chr8 85633600 85635600 chr8 85695000 85697000 1009 | chr8 85633600 85635600 chr8 85702000 85704000 1010 | chr8 85633600 85635600 chr8 85711500 85713500 1011 | chr8 85633600 85635600 chr8 85715600 85717600 1012 | chr8 85633600 85635600 chr8 85751500 85753500 1013 | chr8 85633600 85635600 chr8 85762400 85764400 1014 | chr8 85633600 85635600 chr8 85797300 85799300 1015 | chr8 85641000 85643000 chr8 85663000 85665000 1016 | chr8 85641000 85643000 chr8 85671400 85673400 1017 | chr8 85641000 85643000 chr8 85691000 85693000 1018 | chr8 85641000 85643000 chr8 85695000 85697000 1019 | chr8 85641000 85643000 chr8 85702000 85704000 1020 | chr8 85641000 85643000 chr8 85711500 85713500 1021 | chr8 85641000 85643000 chr8 85715600 85717600 1022 | chr8 85641000 85643000 chr8 85751500 85753500 1023 | chr8 85641000 85643000 chr8 85762400 85764400 1024 | chr8 85641000 85643000 chr8 85797300 85799300 1025 | chr8 85654000 85656000 chr8 85682700 85684700 1026 | chr8 85654000 85656000 chr8 85715600 85717600 1027 | chr8 85663000 85665000 chr8 85682700 85684700 1028 | chr8 85663000 85665000 chr8 85691000 85693000 1029 | chr8 85663000 85665000 chr8 85715600 85717600 1030 | chr8 85663000 85665000 chr8 85751500 85753500 1031 | chr8 85663000 85665000 chr8 85762400 85764400 1032 | chr8 85663000 85665000 chr8 85797300 85799300 1033 | chr8 85671400 85673400 chr8 85691000 85693000 1034 | chr8 85671400 85673400 chr8 85715600 85717600 1035 | chr8 85671400 85673400 chr8 85751500 85753500 1036 | chr8 85671400 85673400 chr8 85762400 85764400 1037 | chr8 85671400 85673400 chr8 85797300 85799300 1038 | chr8 85682700 85684700 chr8 85715600 85717600 1039 | chr8 85691000 85693000 chr8 85702000 85704000 1040 | chr8 85691000 85693000 chr8 85711500 85713500 1041 | chr8 85691000 85693000 chr8 85715600 85717600 1042 | chr8 85691000 85693000 chr8 85751500 85753500 1043 | chr8 85691000 85693000 chr8 85762400 85764400 1044 | chr8 85691000 85693000 chr8 85785750 85787750 1045 | chr8 85691000 85693000 chr8 85797300 85799300 1046 | chr8 85691000 85693000 chr8 85806500 85808500 1047 | chr8 85691000 85693000 chr8 85809000 85811000 1048 | chr8 85695000 85697000 chr8 85702000 85704000 1049 | chr8 85695000 85697000 chr8 85711500 85713500 1050 | chr8 85695000 85697000 chr8 85715600 85717600 1051 | chr8 85695000 85697000 chr8 85751500 85753500 1052 | chr8 85695000 85697000 chr8 85762400 85764400 1053 | chr8 85695000 85697000 chr8 85785750 85787750 1054 | chr8 85695000 85697000 chr8 85797300 85799300 1055 | chr8 85695000 85697000 chr8 85806500 85808500 1056 | chr8 85695000 85697000 chr8 85809000 85811000 1057 | chr8 85702000 85704000 chr8 85711500 85713500 1058 | chr8 85702000 85704000 chr8 85715600 85717600 1059 | chr8 85702000 85704000 chr8 85723500 85725500 1060 | chr8 85702000 85704000 chr8 85751500 85753500 1061 | chr8 85702000 85704000 chr8 85762400 85764400 1062 | chr8 85702000 85704000 chr8 85785750 85787750 1063 | chr8 85702000 85704000 chr8 85797300 85799300 1064 | chr8 85702000 85704000 chr8 85802000 85804000 1065 | chr8 85702000 85704000 chr8 85806500 85808500 1066 | chr8 85702000 85704000 chr8 85809000 85811000 1067 | chr8 85705600 85707600 chr8 85751500 85753500 1068 | chr8 85705600 85707600 chr8 85762400 85764400 1069 | chr8 85705600 85707600 chr8 85797300 85799300 1070 | chr8 85711500 85713500 chr8 85751500 85753500 1071 | chr8 85711500 85713500 chr8 85762400 85764400 1072 | chr8 85711500 85713500 chr8 85797300 85799300 1073 | chr8 85715600 85717600 chr8 85751500 85753500 1074 | chr8 85715600 85717600 chr8 85762400 85764400 1075 | chr8 85715600 85717600 chr8 85785750 85787750 1076 | chr8 85715600 85717600 chr8 85797300 85799300 1077 | chr8 85715600 85717600 chr8 85806500 85808500 1078 | chr8 85715600 85717600 chr8 85809000 85811000 1079 | chr8 85751500 85753500 chr8 85762400 85764400 1080 | chr8 85751500 85753500 chr8 85785750 85787750 1081 | chr8 85751500 85753500 chr8 85797300 85799300 1082 | chr8 85751500 85753500 chr8 85806500 85808500 1083 | chr8 85751500 85753500 chr8 85809000 85811000 1084 | chr8 85762400 85764400 chr8 85785750 85787750 1085 | chr8 85762400 85764400 chr8 85797300 85799300 1086 | chr8 85762400 85764400 chr8 85806500 85808500 1087 | chr8 85762400 85764400 chr8 85809000 85811000 1088 | chr8 85785750 85787750 chr8 85797300 85799300 1089 | chr8 85785750 85787750 chr8 85806500 85808500 1090 | chr8 85797300 85799300 chr8 85806500 85808500 1091 | chr8 85797300 85799300 chr8 85809000 85811000 1092 | -------------------------------------------------------------------------------- /PileupsRCMC.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "a2f31b9f", 6 | "metadata": {}, 7 | "source": [ 8 | "# Plotting pileups" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "id": "717f5fcc", 14 | "metadata": {}, 15 | "source": [ 16 | "## Imports" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": null, 22 | "id": "da763af9", 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "# import standard python libraries\n", 27 | "import matplotlib as mpl\n", 28 | "%matplotlib inline\n", 29 | "mpl.rcParams['figure.dpi'] = 96\n", 30 | "import numpy as np\n", 31 | "import matplotlib.pyplot as plt\n", 32 | "import pandas as pd\n", 33 | "import seaborn as sns\n", 34 | "\n", 35 | "# import libraries for biological data analysis\n", 36 | "from coolpuppy import coolpup\n", 37 | "from plotpuppy import plotpup\n", 38 | "import cooler\n", 39 | "import bioframe\n", 40 | "import cooltools\n", 41 | "from cooltools import expected_cis\n", 42 | "from cooltools.lib import plotting\n", 43 | "\n", 44 | "import bbi" 45 | ] 46 | }, 47 | { 48 | "cell_type": "markdown", 49 | "id": "98de4e75", 50 | "metadata": {}, 51 | "source": [ 52 | "## Enrichment calculation" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": null, 58 | "id": "3a79fc85", 59 | "metadata": {}, 60 | "outputs": [], 61 | "source": [ 62 | "#Viraat's new calculation\n", 63 | "#Modified 2022/10/04 by Miles to try to avoid NaN values and correct an issue with the background sum, \n", 64 | "#and generally make the code a little more streamlined\n", 65 | "def enrichmentCalc(mtx, dotWindow):\n", 66 | " #Dimension of array side (should be square)\n", 67 | " sideLength = len(mtx)\n", 68 | " #Middle of side length\n", 69 | " midPoint = (sideLength - 1) // 2\n", 70 | " #Half size of box around centre pixel (one pixel smaller if even-sized dot window - don't do this)\n", 71 | " buffer = (dotWindow - 1) // 2\n", 72 | " \n", 73 | " #Get sum of pixels around dot\n", 74 | " dotSum = np.nansum(mtx[midPoint-buffer:midPoint+buffer+1, midPoint-buffer:midPoint+buffer+1])\n", 75 | " \n", 76 | " #Subset the matrix and calculate the mean without NaN values\n", 77 | " backgroundSum1 = np.nansum(mtx[0:dotWindow, 0:dotWindow])\n", 78 | " backgroundSum2 = np.nansum(mtx[sideLength-dotWindow:sideLength, sideLength-dotWindow:sideLength])\n", 79 | " \n", 80 | " #Calculate enrichment (NB this assumes all boxes are the same size.\n", 81 | " #If you set an even dotWindow value, they won't be)\n", 82 | " enrichment = dotSum / ((backgroundSum1 + backgroundSum2)/2)\n", 83 | " \n", 84 | " return enrichment" 85 | ] 86 | }, 87 | { 88 | "cell_type": "markdown", 89 | "id": "a19e8ae8", 90 | "metadata": {}, 91 | "source": [ 92 | "## Inputs" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": null, 98 | "id": "295f6354", 99 | "metadata": {}, 100 | "outputs": [], 101 | "source": [ 102 | "#mcool resolution to read\n", 103 | "resolution = 250\n", 104 | "#List of mcool locations as strings\n", 105 | "clrfiles = [\"mcoollocation1\", \"mcoollocation2\", \"mcoollocation3\"]\n", 106 | "#List of mcool conditions as strings\n", 107 | "conditions = [\"condition1\", \"condition2\", \"condition3\"]\n", 108 | "#List of loop types as strings\n", 109 | "loopTypesNames = [\"loop\", \"type\", \"names\"]\n", 110 | "#List of loop file locations (bedpe)\n", 111 | "loopFiles = [\"looplocation1\", \"looplocation2\", \"looplocation3\"]\n", 112 | "\n", 113 | "#Specify the RCMC regions of the mcools to look at (format: chromosome (string), start (number), end (number), name of region (string))\n", 114 | "regions = pd.DataFrame([['chrA',1,100,'regionname1'],['chrB',1,100,'regionname2'],['chrC',1,100,'regionname3']],\n", 115 | " columns=['chrom', 'start', 'end', 'name'])\n", 116 | "#Cis expected file locations from cooltools - .tsv file - one for each mcool\n", 117 | "expectedFiles = [\"expectedlocation1\", \"expectedlocation2\", \"expectedlocation3\"]\n", 118 | "#Set save directory\n", 119 | "saveDir = '/a/directory/on/your/system/'\n", 120 | "\n", 121 | "#Set the size of the area flanking the dot\n", 122 | "flankDist = 10000\n", 123 | "#Don't set this to be even... This is the size of the area to measure around the dot \n", 124 | "#(and by extension the size of the boxes at the edges of the region too)\n", 125 | "#For this reason, it needs to be odd to have integer box sizes on each side.\n", 126 | "dotWindow = 5\n", 127 | "\n" 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "id": "aaa6af6c", 133 | "metadata": {}, 134 | "source": [ 135 | "Read in the loops" 136 | ] 137 | }, 138 | { 139 | "cell_type": "code", 140 | "execution_count": null, 141 | "id": "e9f08a9b", 142 | "metadata": {}, 143 | "outputs": [], 144 | "source": [ 145 | "#######Don't change this section#######\n", 146 | "#Creat an empty list to store the imported loop locations\n", 147 | "loopTypes = []\n", 148 | "#List of column names to use for imported loops (this is constant - do not change)\n", 149 | "colNames = ['chrom1', 'start1', 'end1', 'chrom2', 'start2', 'end2']\n", 150 | "#Read in files, put them in loopTypes\n", 151 | "for file in loopFiles:\n", 152 | " temploops = pd.read_csv(file, sep='\\t', names=colNames, header=None)\n", 153 | " loopTypes.append(temploops)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "markdown", 158 | "id": "c6de3c38", 159 | "metadata": {}, 160 | "source": [ 161 | "## Run the script" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": null, 167 | "id": "f27175dd", 168 | "metadata": {}, 169 | "outputs": [], 170 | "source": [ 171 | "#Loop through each cooler\n", 172 | "for i, clrfile in enumerate(clrfiles):\n", 173 | " #Get condition name\n", 174 | " condition = conditions[i]\n", 175 | " #Get expected file\n", 176 | " expected = pd.read_csv(expectedFiles[i], sep='\\t')\n", 177 | " #Read in cooler\n", 178 | " clr = cooler.Cooler(clrfile+'::/resolutions/'+str(resolution))\n", 179 | " #Loop through different loop types\n", 180 | " for j in range(len(loopTypes)):\n", 181 | " loops = loopTypes[j]\n", 182 | " loopsName = loopTypesNames[j]\n", 183 | " #Calculate pileups\n", 184 | " stack = cooltools.pileup(clr, loops, view_df=regions, expected_df=expected, flank=flankDist)\n", 185 | " #Flatten stack by calculating means\n", 186 | " mtx = np.nanmean(stack, axis=2)\n", 187 | " #Calculate enrichment\n", 188 | " enrichment = enrichmentCalc(mtx, dotWindow)\n", 189 | " #Plot figure\n", 190 | " plt.imshow(\n", 191 | " np.log2(mtx),\n", 192 | " vmax = 2.5,\n", 193 | " vmin = -2.5,\n", 194 | " cmap='coolwarm')\n", 195 | " \n", 196 | " plt.colorbar(label = 'log2 mean obs/exp')\n", 197 | " ticks_pixels = np.linspace(0, flankDist*2//resolution,5)\n", 198 | " ticks_kbp = ((ticks_pixels-ticks_pixels[-1]/2)*resolution//1000).astype(int)\n", 199 | " plt.xticks(ticks_pixels, ticks_kbp)\n", 200 | " plt.yticks(ticks_pixels, ticks_kbp)\n", 201 | " plt.xlabel('relative position, kbp')\n", 202 | " plt.ylabel('relative position, kbp')\n", 203 | " plt.text(1, 1, round(enrichment, 2))\n", 204 | " plt.savefig(saveDir+'LoopPileups_'+condition+'_'+loopsName+'_'+str(resolution)+'bp_'+str(flankDist)+'bp.pdf', dpi=1200)\n", 205 | " plt.clf()\n", 206 | "\n" 207 | ] 208 | } 209 | ], 210 | "metadata": { 211 | "kernelspec": { 212 | "display_name": "Python [conda env:coolpuppy]", 213 | "language": "python", 214 | "name": "conda-env-coolpuppy-py" 215 | }, 216 | "language_info": { 217 | "codemirror_mode": { 218 | "name": "ipython", 219 | "version": 3 220 | }, 221 | "file_extension": ".py", 222 | "mimetype": "text/x-python", 223 | "name": "python", 224 | "nbconvert_exporter": "python", 225 | "pygments_lexer": "ipython3", 226 | "version": "3.7.12" 227 | } 228 | }, 229 | "nbformat": 4, 230 | "nbformat_minor": 5 231 | } 232 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RCMC Analysis Code 2 | This repository contains source code for the article [Region Capture Micro-C reveals coalescence of enhancers and promoters into nested microcompartments](https://www.nature.com/articles/s41588-023-01391-1), used in the analysis of RCMC data. 3 | 4 | Code is provided either in the form of Python/R scripts or as Jupyter notebooks to be run in conda environments containing the required packages. Additionally, genomic positions of microcompartments identified in the paper are included in bedpe format. 5 | 6 | ## Code summary 7 | ### Micro-C alignment (microcbowtie2.py) 8 | Required packages: 9 | - bowtie2 10 | - samtools 11 | - sambamba 12 | - pairtools 13 | - cooler 14 | - pairix 15 | 16 | Python script used to align reads in .fastq format from paired-end sequencing of Micro-C experiments and produces as output .pairs, .cool and .mcool files compatible with downstream applications such as HiGlass. 17 | 18 | Example usage: 19 | 20 | ``` 21 | python /path/to/script/microcbowtie2.py --file_1 pair1.fastq --file_2 pair2.fasq -g mm39 -t 36 -o exampleoutput 22 | ``` 23 | 24 | ### ChIP-seq alignment (spikeinChIP_PE_alignment.py) 25 | Required packages: 26 | - bowtie2 27 | - samtools 28 | - sambamba 29 | 30 | Python script used to align reads in .fastq format from paired-end sequencing of ChIP-seq experiments and produces aligned .bam files. .fastq information is input as a .tsv with each line containing the path to the first pair .fastq, the path to the second pair .fastq, and the desired output name of the aligned file. 31 | 32 | Example usage: 33 | 34 | ``` 35 | python /path/to/script/spikeinChIP_PE_alignment.py -f list_of_fastqs.tsv -g mm39 -t 36 -o alignmentcountsout 36 | ``` 37 | 38 | ### Finding chromatin features overlapping microcompartment anchors (loopFeatureOverlap.R) 39 | Required packages: 40 | - plyr 41 | - dplyr 42 | - reshape2 43 | - purrr 44 | - grid 45 | - IRanges 46 | - GenomicRanges 47 | - arrangements 48 | - foreach 49 | 50 | R script used to classify microcompartment interactions by finding overlap between identified microcompartments (.bedpe) and chromatin features (.bed) such as promoters, enhancers, CTCF binding sites, etc. It outputs individual .bedpe files of interactions according to combinatorial classification of chromatin features (e.g for enhancer (E) and promoter (P): P-P, E-E, E-P, E-null, P-null, null-null), including interactions which have no overlap (null category). Classification can be mutually exclusive (E-P cannot also be P-P) or inclusive. 51 | 52 | Example usage: 53 | 54 | ``` 55 | Rscript /path/to/script/loopFeatureOverlap.R -l interactions.bedpe -b promoter.bed,enhancer.bed -i P,E -o outputdirectory/ 56 | ``` 57 | 58 | ### Calculating strength of individual interactions (LoopStrengthRCMC.ipynb) or aggregate pileup analysis (PileupsRCMC.ipynb) 59 | Required packages: 60 | - seaborn 61 | - coolpuppy 62 | - cooltools 63 | - cooler 64 | 65 | Jupyter notebooks used to calculate strengths of individual microcompartments (LoopStrengthRCMC.ipynb) or generate aggregate pileup analysis figures (PileupsRCMC.ipynb). Each one takes .mcool files of contacts from RCMC, a list of interactions to calculate for (.bedpe format), expected files generated by cooltools for each .mcool, and the captured region, and calculates background corrected observed/expected interaction strengths, either for each interaction individually (output as a .bedpe with additional columns for strengths for each .mcool) or as a pileup (output as a .pdf of the aggregate interaction annotated with the calculated strength). 66 | 67 | ### Visualization of contact maps and genomic tracks (ContactMapVisualizationExampleNotebook.ipynb) 68 | Required packages: 69 | - cooltools 70 | - cooler 71 | - coolbox 72 | - matplotlib 73 | 74 | Jupyter notebook used to generate visualizations of contact maps and genomics tracks for figures. Contact map visualization is accomplished using cooltools and requires a .mcool file of contacts from RCMC or a comparable method. Genomic track visualization is accomplished using coolbox and requires a .mcool file of contacts, gene annotations (.gtf format or similar), and ChIP-seq, RNA-seq, and ATAC-seq datasets (.bw format). 75 | 76 | ### Calculation of read-containing bin fraction by contact distance (CalculatingFilledBinFractionByDistance.ipynb) 77 | Required packages: 78 | - cooltools 79 | - cooler 80 | - matplotlib 81 | 82 | Jupyter notebook used to calculate the fraction of bins in .mcool-derived contact maps which contain at least one read pair at a given resolution and contact distance from the diagonal. The notebook takes an unbalanced .mcool of contacts from RCMC or a comparable method, tabulates the occupied contact bin fraction at specified contact distances, and generates a plot of occupied bin fraction by contact distance. 83 | 84 | ### Calculation of row sums in ICE-balanced .mcools (BalancedRowsumsCalculation.ipynb) 85 | Required packages: 86 | - cooltools 87 | - cooler 88 | - matplotlib 89 | 90 | Jupyter notebook used to confirm successful ICE balancing of .mcool files by calculating and plotting row sums. Two variations of the calculation are provided in the notebook – one for calculating row sums across an entire region, and one for calculating row sums only for bins containing contact anchor sites. Both variations take ICE-balanced .mcool files of contacts from RCMC or a comparable method, and the latter additionally takes a list of contact anchor sites (.bed format). The distributions of calculated row sums in either variation are plotted as histograms. 91 | 92 | ### List of manually-annotated microcompartment loops (MicrocompartmentLoops_PlusMin1kb.bedpe) 93 | BEDPE format file listing all 1091 manually-annotated microcompartment loops across the Ppm1g (chr5) and Klf1 (chr8) regions used in the microcompartment analysis scripts above. Coordinates are provided for the mm39 reference genome, and loop anchors are listed as plus-and-minus 1kb from each anchor’s point coordinate. Columns in the file are as follows: the first is the chromosome of the left loop anchor, the second is the coordinate of the left loop anchor minus 1 kb, the third is the coordinate of the left loop anchor plus 1 kb, and the remaining three columns are the same for the right loop anchor. 94 | 95 | ### Lists of probes used for capturing regions of interest (captureprobes_mm10.bed, captureprobes_mm39.bed) 96 | BED format file listing the genomic locations of all probes used for capturing the Sox2 (chr3), Ppm1g (chr5), Nanog (chr6), Klf1 (chr8), and Fbn2 (chr18) regions used in capture. Coordinates are provided for both the mm10 and mm39 reference genomes, and loop anchors are listed as plus-and-minus 1kb from each anchor’s point coordinate. Columns in the file are as follows: the first is the chromosome the region is located on, the second is the start coordinate of the probe, and the third is the end coordinate of the probe. 97 | 98 | ## How to cite 99 | This work is shared under an MIT license. If you make use of analysis scripts or data from this work, please cite as follows: 100 | 101 | Goel, V.Y., Huseyin, M.K. & Hansen, A.S. Region Capture Micro-C reveals coalescence of enhancers and promoters into nested microcompartments. *Nat Genet* (2023). https://doi.org/10.1038/s41588-023-01391-1 102 | 103 | Also refer to our deposited and citable code on Zenodo: 104 | 105 | Goel, Viraat Y, Huseyin, Miles K, & Hansen, Anders S. (2023). Code supporting Region Capture Micro-C reveals coalescence of enhancers and promoters into nested microcompartments (1.0). Zenodo. https://doi.org/10.5281/zenodo.7641852 106 | -------------------------------------------------------------------------------- /loopFeatureOverlap.R: -------------------------------------------------------------------------------- 1 | #New version of loopFeatureOverlap.py, written in R using Granges instead of Python-based Pyranges version, which had an output issue 2 | 3 | #Imports 4 | library('plyr') 5 | library('dplyr') 6 | require('reshape2') 7 | library('purrr') 8 | library('grid') 9 | # library('ChIPpeakAnno') 10 | library('IRanges') 11 | library('GenomicRanges') 12 | library('arrangements') 13 | library('foreach') 14 | 15 | #Get args 16 | if(!require(optparse)) { 17 | stop("Please install the optparse package and try again!", call. = FALSE) 18 | } 19 | 20 | library(optparse) 21 | 22 | parser <- OptionParser(add_help_option = TRUE) 23 | parser <- add_option(parser, c("-o", "--outdir"), action = "store", type = "character", help = "Directory to output bed files", default = "na") 24 | parser <- add_option(parser, c("-l", "--loops"), action = "store", type = "character", help = "Input bedpe or tsv file containing loops in bedpe format", default = "na") 25 | parser <- add_option(parser, c("-b", "--bed"), action = "store", type = "character", help = "Input bed file or files - if multiple, separate with commas", default = "na") 26 | parser <- add_option(parser, c("-i", "--id"), action = "store", type = "character", help = "Feature names to use for each bed file - will be used to name output files. If multiple, separate with commas", default = "na") 27 | parser <- add_option(parser, c("-e", "--exclusive"), action = "store_true", help = "When set, defines loop anchors with only a single feature - overlap with multiple features is not allowed", default = FALSE) 28 | args <- parse_args(parser) 29 | 30 | ######################################################################### 31 | #Convert args to variables 32 | path.loops <- args$loops 33 | outdir <- args$outdir 34 | features <- args$bed 35 | ids <- args$id 36 | 37 | ######################################################################### 38 | #Read in loops 39 | loops <- read.delim(path.loops, header = FALSE, col.names = c("chr1", "start1", "end1", "chr2", "start2", "end2"), sep = "", dec = ".") #opens up the file 40 | 41 | #Read in features 42 | featureslist <- unlist(strsplit(features, ",")) 43 | idlist <- unlist(strsplit(ids, ",")) 44 | 45 | #Check features and ids are same length 46 | if (length(featureslist) != length(idlist)) { 47 | stop("Make sure the same numbers of bed files and IDs are provided") 48 | } 49 | 50 | #We only want and know the names of the first three columns, so write a little import function: 51 | import_feature_data <- function(filename) { 52 | #Get number of columns 53 | num.cols.to.blank <- max(count.fields(filename, sep = "\t")) - 3 54 | df <- read.delim(filename, header = FALSE, sep = "", dec = ".", colClasses = c('character', rep('numeric', 2), rep("NULL", num.cols.to.blank))) 55 | colnames(df) <- c("chr", "start", "end") 56 | return(df) 57 | } 58 | 59 | features.data <- lapply(featureslist, import_feature_data) 60 | 61 | #Ensure output directory ends with a / 62 | if(!endsWith(outdir, '/')) { 63 | outdir <- paste0(outdir, '/') 64 | } 65 | 66 | if (outdir == "na") { 67 | stop("Please provide an option for --out", call. = FALSE) 68 | } 69 | 70 | ######################################################################### 71 | #Make Granges objects 72 | #For features 73 | features.data.granges <- lapply(features.data, makeGRangesFromDataFrame, keep.extra.columns = FALSE) 74 | #For loops 75 | #First make separate dfs for each anchor 76 | #Make anchors function 77 | make_anchors_separate <- function(loops) { 78 | #Add loop_id column for merging 79 | loops$loop_id <- seq.int(nrow(loops)) 80 | #Split loops into two bed-like files 81 | loops.1 <- data.frame(chr = loops$chr1, start = loops$start1, end = loops$end1, loop_id = loops$loop_id) 82 | loops.2 <- data.frame(chr = loops$chr2, start = loops$start2, end = loops$end2, loop_id = loops$loop_id) 83 | #Merge with original to add back the lost info 84 | return(list(loops.1, loops.2)) 85 | } 86 | #Then make Granges 87 | loops.anchors.list <- make_anchors_separate(loops) 88 | #Make separate dfs (maybe don't need to do this?) 89 | loops.anchors.1 <- loops.anchors.list[[1]] 90 | loops.anchors.2 <- loops.anchors.list[[2]] 91 | #Make granges 92 | loops.anchors.list.granges <- lapply(loops.anchors.list, makeGRangesFromDataFrame, keep.extra.columns = FALSE) 93 | 94 | ######################################################################### 95 | #Compare Granges objects 96 | #Start counter 97 | feature.count <- 1 98 | 99 | #Loop through the features and count overlaps 100 | for (feature in features.data.granges) { 101 | loops.anchors.1[[idlist[feature.count]]] <- countOverlaps(loops.anchors.list.granges[[1]], feature) 102 | loops.anchors.2[[idlist[feature.count]]] <- countOverlaps(loops.anchors.list.granges[[2]], feature) 103 | feature.count <- feature.count + 1 104 | } 105 | 106 | 107 | #Change column names for loops.anchors.2 so they don't match 108 | colnames(loops.anchors.2) <- paste0(colnames(loops.anchors.2), '2') 109 | 110 | #Next, merge based on loop_id(2) columns 111 | loops.anchors.remerge <- merge(loops.anchors.1, loops.anchors.2, by.x = "loop_id", by.y = "loop_id2") 112 | 113 | ######################################################################## 114 | #Determine loop classes 115 | 116 | #First need to generate loop classes based on ids 117 | #Add null to the class list (for anchors with no features) 118 | idlist.null <- append(idlist, "null") 119 | 120 | #Then make all combinations (this is combinations with replacement) 121 | position <- 1 122 | combination.object <- icombinations(idlist.null, k = 2, replace = TRUE) 123 | 124 | id.combined.list <- vector("list", length(combination.object$collect())/2) 125 | 126 | foreach(x = icombinations(idlist.null, k = 2, replace = TRUE), .combine = c) %do% { 127 | id.combined.list[[position]] <- paste(idlist.null[x[1]], idlist.null[x[2]], sep = "-") 128 | position <- position + 1 129 | } 130 | 131 | #Classify loops. Which version is run depends on whether inclusive or exclusive loops are desired. 132 | if (args$exclusive) { 133 | #Make named list of dfs 134 | output.list <- setNames(replicate(length(id.combined.list), data.frame()), id.combined.list) 135 | 136 | #Exclusive version 137 | for (i1 in 1:length(idlist)) { 138 | item1 <- idlist[[i1]] 139 | #print(item1) 140 | for (i2 in 1:length(idlist)) { 141 | item2 <- idlist[[i2]] 142 | #print(item2) 143 | if (i1 == i2 | i1 < i2) { 144 | #Get the loop type from the indices 145 | looptype <- paste(idlist[[i1]], idlist[[i2]], sep = '-') 146 | #Get the relevant loops 147 | temp.df <- loops.anchors.remerge 148 | #Loop through all ids, check they're 0 except the ones matching the requirements 149 | for (id in idlist) { 150 | if (id == idlist[[i1]]) { 151 | temp.df <- temp.df[which(temp.df[[id]] > 0),] 152 | } else if (id != idlist[[i1]]) { 153 | temp.df <- temp.df[which(temp.df[[id]] == 0),] 154 | } 155 | if (id == idlist[[i2]]) { 156 | temp.df <- temp.df[which(temp.df[[paste0(id, '2')]] > 0),] 157 | } else if (id != idlist[[i2]]) { 158 | temp.df <- temp.df[which(temp.df[[paste0(id, '2')]] == 0),] 159 | } 160 | } 161 | output.list[[looptype]] <- rbind(output.list[[looptype]], temp.df) 162 | 163 | } else if (i1 > i2) { 164 | #Get the loop type from the indices - need to invert here so that E-P2 and P-E2 loops are both put into 165 | #the same category 166 | looptype <- paste(idlist[[i2]], idlist[[i1]], sep = '-') 167 | #Get the relevant loops 168 | temp.df <- loops.anchors.remerge 169 | 170 | for (id in idlist) { 171 | if (id == idlist[[i1]]) { 172 | temp.df <- temp.df[which(temp.df[[id]] > 0),] 173 | } else if (id != idlist[[i1]]) { 174 | temp.df <- temp.df[which(temp.df[[id]] == 0),] 175 | } 176 | if (id == idlist[[i2]]) { 177 | temp.df <- temp.df[which(temp.df[[paste0(id, '2')]] > 0),] 178 | } else if (id != idlist[[i2]]) { 179 | temp.df <- temp.df[which(temp.df[[paste0(id, '2')]] == 0),] 180 | } 181 | } 182 | output.list[[looptype]] <- rbind(output.list[[looptype]], temp.df) 183 | } 184 | } 185 | looptype <- paste(idlist[[i1]], "null", sep = '-') 186 | #Generate X-null 187 | temp.df.1 <- loops.anchors.remerge 188 | #Loop through the ID columns of the other anchor and select only rows with 0 for each column 189 | for (id in idlist) { 190 | if (id == idlist[[i1]]) { 191 | temp.df.1 <- temp.df.1[which(temp.df.1[[id]] > 0),] 192 | } else if (id != idlist[[i1]]) { 193 | temp.df.1 <- temp.df.1[which(temp.df.1[[id]] == 0),] 194 | } 195 | temp.df.1 <- temp.df.1[which(temp.df.1[[paste0(id, '2')]] == 0),] 196 | } 197 | #Generate null-X 198 | temp.df.2 <- loops.anchors.remerge[which(loops.anchors.remerge[[paste0(idlist[[i1]], '2')]] > 0),] 199 | 200 | for (id in idlist) { 201 | temp.df.2 <- temp.df.2[which(temp.df.2[[id]] == 0),] 202 | if (id == idlist[[i1]]) { 203 | temp.df.2 <- temp.df.2[which(temp.df.2[[paste0(id, '2')]] > 0),] 204 | } else if (id != idlist[[i1]]) { 205 | temp.df.2 <- temp.df.2[which(temp.df.2[[paste0(id, '2')]] == 0),] 206 | } 207 | } 208 | #Combine them 209 | temp.df <- rbind(temp.df.1, temp.df.2) 210 | output.list[[looptype]] <- rbind(output.list[[looptype]], temp.df) 211 | 212 | } 213 | looptype <- "null-null" 214 | temp.df <- loops.anchors.remerge 215 | 216 | for (id in idlist) { 217 | temp.df <- temp.df[which(temp.df[[id]] == 0 & temp.df[[paste0(id, '2')]] == 0),] 218 | } 219 | output.list[[looptype]] <- rbind(output.list[[looptype]], temp.df) 220 | } else { 221 | #Make named list of dfs 222 | output.list <- setNames(replicate(length(id.combined.list), data.frame()), id.combined.list) 223 | 224 | #Inclusive version 225 | for (i1 in 1:length(idlist)) { 226 | item1 <- idlist[[i1]] 227 | #print(item1) 228 | for (i2 in 1:length(idlist)) { 229 | item2 <- idlist[[i2]] 230 | #print(item2) 231 | if (i1 == i2 | i1 < i2) { 232 | #Get the loop type from the indices 233 | looptype <- paste(idlist[[i1]], idlist[[i2]], sep = '-') 234 | #Get the relevant loops 235 | temp.df <- loops.anchors.remerge[which(loops.anchors.remerge[[idlist[[i1]]]] > 0 & loops.anchors.remerge[[paste0(idlist[[i2]], "2")]] > 0), ] 236 | output.list[[looptype]] <- rbind(output.list[[looptype]], temp.df) 237 | } else if (i1 > i2) { 238 | #Get the loop type from the indices - need to invert here so that E-P2 and P-E2 loops are both put into 239 | #the same category 240 | looptype <- paste(idlist[[i2]], idlist[[i1]], sep = '-') 241 | #Get the relevant loops 242 | temp.df <- loops.anchors.remerge[which(loops.anchors.remerge[[idlist[[i1]]]] > 0 & loops.anchors.remerge[[paste0(idlist[[i2]], "2")]] > 0), ] 243 | output.list[[looptype]] <- rbind(output.list[[looptype]], temp.df) 244 | } 245 | } 246 | looptype <- paste(idlist[[i1]], "null", sep = '-') 247 | #Generate X-null 248 | temp.df.1 <- loops.anchors.remerge[which(loops.anchors.remerge[[idlist[[i1]]]] > 0),] 249 | #Loop through the ID columns of the other anchor and select only rows with 0 for each column 250 | for (id in idlist) { 251 | temp.df.1 <- temp.df.1[which(temp.df.1[[paste0(id, '2')]] == 0),] 252 | } 253 | #Generate null-X 254 | temp.df.2 <- loops.anchors.remerge[which(loops.anchors.remerge[[paste0(idlist[[i1]], '2')]] > 0),] 255 | 256 | for (id in idlist) { 257 | temp.df.2 <- temp.df.2[which(temp.df.2[[id]] == 0),] 258 | } 259 | #Combine them 260 | temp.df <- rbind(temp.df.1, temp.df.2) 261 | output.list[[looptype]] <- rbind(output.list[[looptype]], temp.df) 262 | 263 | } 264 | looptype <- "null-null" 265 | temp.df <- loops.anchors.remerge 266 | 267 | for (id in idlist) { 268 | temp.df <- temp.df[which(temp.df[[id]] == 0 & temp.df[[paste0(id, '2')]] == 0),] 269 | } 270 | output.list[[looptype]] <- rbind(output.list[[looptype]], temp.df) 271 | } 272 | 273 | #Remove any duplicates from the dfs (inclusive calling can result in many) 274 | output.list.nodups <- lapply(output.list, distinct) 275 | 276 | #Print the lengs of each df to give the result: 277 | sapply(output.list.nodups, nrow) 278 | 279 | #Output the dataframes 280 | for (i in 1:length(output.list.nodups)) { 281 | temp.df <- output.list.nodups[[i]] 282 | #Get only the relevant columns 283 | output.df <- data.frame(chr = temp.df$chr, start = temp.df$start, end = temp.df$end, chr2 = temp.df$chr2, start2 = temp.df$start2, end2 = temp.df$end2) 284 | write.table(output.df, file = paste0(outdir, names(output.list)[[i]], '.bedpe'), row.names = FALSE, col.names = FALSE, quote = FALSE, sep = "\t") 285 | } 286 | -------------------------------------------------------------------------------- /microcbowtie2.py: -------------------------------------------------------------------------------- 1 | #Aligning and processing a single fastq file through a pipeline similar to distiller but instead using bowtie2 2 | 3 | from sys import exit 4 | import subprocess as sp 5 | import argparse 6 | import multiprocessing 7 | import uuid 8 | 9 | parser = argparse.ArgumentParser(description = "run bowtie2 and pairtools on fastq files to produce pairsam files") 10 | bamopts = parser.add_mutually_exclusive_group() 11 | parser.add_argument("--file_1", "-1", help = "first demuxed fastq of paired end reads - required", nargs = "*") 12 | parser.add_argument("--file_2", "-2", help = "second demuxed fastq of paired end reads - required", nargs = "*") 13 | parser.add_argument("--genome", "-g", help = "genome to align to - mouse or human - required") 14 | parser.add_argument("--genometype", "-y", help = "genome type - use if your genome is a modified version of a standard genome - should be one of hg19, hg38, mm10, or mm39") 15 | parser.add_argument("--threads", "-t", help = "number of threads to use for bowtie2 - default is 1", default = "1") 16 | parser.add_argument("--resolutions", "-r", help = "list of resolutions to output in decreasing order - all resolutions must be a multiple of the smallest resolution - default: 10000000 5000000 2500000 1000000 500000 250000 100000 50000 25000 10000 5000 2000 1000", nargs = "*") 17 | parser.add_argument("--out", "-o", help = "name for output files - defaults to name of first file") 18 | parser.add_argument("--outdir", help = "a directory to store output files - default is current directory", default = "./") 19 | bamopts.add_argument("--bowtieonly", "-b", help = "only run bowtie2 and make bams - can be useful for post initial analysis QC steps", action = "store_true") 20 | bamopts.add_argument("--keepbams", "-k", help = "keep bam files while doing a normal full analysis", action = "store_true") 21 | args = parser.parse_args() 22 | 23 | file1 = args.file_1 24 | file2 = args.file_2 25 | genome = args.genome 26 | gentype = args.genometype 27 | threads = args.threads 28 | outname = args.out 29 | outdir = args.outdir 30 | reslist = args.resolutions 31 | bowtieonly = args.bowtieonly 32 | keepbams = args.keepbams 33 | 34 | #Check requirements are fulfilled: 35 | condapacks = sp.run("conda list".split(), capture_output=True) 36 | condapacksstr = str(condapacks.stdout) 37 | if bowtieonly: 38 | if "bowtie2" not in condapacksstr or "samtools" not in condapacksstr or "sambamba" not in condapacksstr: 39 | print("Please make sure bowtie2, samtools and sambamba are installed in your current conda environment (check conda list)") 40 | exit() 41 | elif not bowtieonly: 42 | if "bowtie2" not in condapacksstr or "pairtools" not in condapacksstr or "cooler" not in condapacksstr or "pairix" not in condapacksstr: 43 | print("Please make sure bowtie2, pairtools, pairix and cooler are installed in your current conda environment (check with 'conda list')") 44 | exit() 45 | 46 | #Check that outdir ends with a /, add one if it doesn't 47 | if args.outdir is not None and not outdir.endswith("/"): 48 | outdir = outdir + "/" 49 | 50 | #Check a genome was specified 51 | if args.genome is None: 52 | print("Genome not specified - check help for formatting") 53 | parser.print_usage() 54 | exit() 55 | 56 | #Check if file1 and file2 are single files or multiple 57 | if file1 is None or file2 is None: 58 | print("Input files not specified - check help for formatting") 59 | parser.print_usage() 60 | exit() 61 | elif len(file1) > 1 and type(file1) == list and type(file2) == list and len(file1) == len(file2): 62 | multifile = 1 63 | if args.out is None: 64 | outlist = [fname + "_" + genome for fname in file1] 65 | outname = outlist[0] 66 | else: 67 | outlist = list() 68 | for i in range(len(file1)): 69 | outlist.append(outname + "_" + str(i + 1)) 70 | #Input to pair merging step needs all of the outputs together 71 | pairnamelist = [outdir + oname + ".pairs" for oname in outlist] 72 | pairnamest = " ".join(pairnamelist) 73 | bamlist = [outdir + oname + ".sorted.bam" for oname in outlist] 74 | bamst = " ".join(bamlist) 75 | bailist = [outdir + oname + ".sorted.bam.bai" for oname in outlist] 76 | baist = " ".join(bailist) 77 | elif len(file1) == 1 and len(file2) == 1: 78 | multifile = 0 79 | #If nargs = *, always makes a list, even if only one element 80 | file1 = "".join(file1) 81 | file2 = "".join(file2) 82 | if args.out is None: 83 | outname = file1 + "_" + genome 84 | pairnamest = outdir + outname + ".pairs" 85 | else: 86 | print("Mismatch in number of input files, check arguments") 87 | exit() 88 | 89 | #Check that a sensible number of threads has been requested - more protections here are possible - at the moment users are trusted to be sensible 90 | cpucount = multiprocessing.cpu_count() 91 | if args.threads is None: 92 | print("Defaulting to one thread") 93 | threads = 1 94 | elif int(args.threads) >= cpucount: 95 | print("Too many threads requested, resetting to default") 96 | threads = 1 97 | 98 | #Check that the user has entered a valid genome to align to 99 | if args.genometype is None: 100 | gentype = args.genome 101 | 102 | if gentype == "mm10" or gentype == "mm39": 103 | toprint = "Aligning to mouse genome {}".format(genome) 104 | print(toprint) 105 | elif gentype == "hg19" or gentype == "hg38": 106 | toprint = "Aligning to human genome {}".format(genome) 107 | print(toprint) 108 | else: 109 | if gentype == genome: 110 | print("Genome option not recognised or not entered. Please use mm10/39 or hg19/38 or ask Miles to change the script to accommodate your new organism/genome. If you are using a modified version of base genome, use the -g option to indicate the base genome name.") 111 | exit() 112 | else: #If they're using a modified genome, make sure the base genome exists so that the files are redirected properly 113 | print("Genome/base genome option not recognised. Please use mm10/39 or hg19/38 or ask Miles to change the script to accommodate your new organism/genome.") 114 | exit() 115 | 116 | #Set up resolutions as needed 117 | if args.resolutions is None: 118 | reslist = ["10000000", "5000000", "2500000", "1000000", "500000", "250000", "100000", "50000", "25000", "10000", "5000", "2000", "1000"] 119 | resst = ",".join(reslist) 120 | #Extract minimum resolution 121 | minres = reslist[-1] 122 | 123 | #Process ID (used to make unique sorttemp, so these are not overlapping for multiple processes in the same outdir) 124 | uniqueid = str(uuid.uuid4()) 125 | 126 | # commands as strings 127 | line1 = "mkdir {0}{10}sorttemp -p" 128 | line2 = "bowtie2 -x /mnt/md0/DataRepository/genomes/{1}/{2} --threads {3} -1 {4} -2 {5} --reorder --local --very-sensitive-local {11}| pairtools parse --add-columns mapq --walks-policy mask -c /mnt/md0/DataRepository/chromsizes/{1}/{2}.sorted.chrom.sizes --assembly {2} --min-mapq 2 --drop-sam --drop-readid --nproc-in {3} | pairtools sort --tmpdir {0}{10}sorttemp --nproc {3} -o {0}{6}.pairs | cat" #Can add drop-sam and drop-readid options later 129 | line3 = "pairtools merge --tmpdir {0}{10}sorttemp --nproc {3} {7} | pairtools dedup --max-mismatch 1 --mark-dups --output {0}{6}.nodups.pairs.gz --output-unmapped {0}{6}.unmapped.pairs.gz --output-dups {0}{6}.dups.pairs.gz --output-stats {0}{6}.dedup.stats | cat" 130 | line4 = "pairtools dedup --max-mismatch 1 --mark-dups --output {0}{6}.nodups.pairs.gz --output-unmapped {0}{6}.unmapped.pairs.gz --output-dups {0}{6}.dups.pairs.gz --output-stats {0}{6}.dedup.stats {0}{7}" 131 | line5 = "pairix {0}{6}.nodups.pairs.gz" 132 | line6 = "bgzip -cd -@ 3 {0}{6}.nodups.pairs.gz | cooler cload pairs -c1 2 -p1 3 -c2 4 -p2 5 --assembly {2} /mnt/md0/DataRepository/chromsizes/{1}/{2}.sorted.chrom.sizes:{8} - {0}{6}.{8}.cool" 133 | line7 = "cooler zoomify --nproc {3} --balance --out {0}{6}.{8}.mcool --resolutions {9} {0}{6}.{8}.cool" 134 | line8 = "rmdir {0}{10}sorttemp" 135 | 136 | #For running only bowtie2 and making bams 137 | bline1 = "mkdir {0}{6}temp -p" 138 | bline2 = "bowtie2 -x /mnt/md0/DataRepository/genomes/{1}/{2} --threads {3} -1 {4} -2 {5} --reorder --local --very-sensitive-local | samtools view -bS -o {0}{6}.bam" 139 | bline3 = "sambamba sort -t {3} -m 6GB --tmpdir {0}{7}temp {0}{6}.bam {0}{6}.sorted.bam && rm {0}{6}.bam" 140 | bline4 = "sambamba merge -t {3} {0}{6}.sorted.merged.bam {7} && rm {7} {8}" 141 | bline5 = "sambamba markdup -t {3} --tmpdir {0}{6}temp --overflow-list-size 10000000 -r {0}{6}.sorted.merged.bam {0}{6}.nodups.sorted.merged.bam && rm {0}{6}.sorted.merged.ba*" 142 | bline6 = "sambamba markdup -t {3} --tmpdir {0}{6}temp -r {0}{6}.sorted.bam {0}{6}.nodups.sorted.bam && rm {0}{6}.sorted.ba*" 143 | bline7 = "rmdir {0}{6}temp" 144 | 145 | multilines = [line1, line2, line3, line5, line6, line7, line8] 146 | lines = [line1, line2, line4, line5, line6, line7, line8] 147 | 148 | multiblines = [bline1, bline2, bline3, bline4, bline5, bline7] 149 | blines = [bline1, bline2, bline3, bline6, bline7] 150 | 151 | truncmultiblines = [bline1, bline3, bline4, bline5, bline7] 152 | truncblines = [bline1, bline3, bline6, bline7] 153 | 154 | #Process the files depending on the run mode 155 | if not multifile and not bowtieonly: 156 | #Include command if bams are wanted 157 | if keepbams: 158 | keepbamcmd = "| tee >(samtools view -bS > {0}{1}.bam) ".format(outdir, outname) 159 | else: 160 | keepbamcmd = "" 161 | for line in lines: 162 | # add file name and split by whitespace 163 | tokenized_line = line.format(outdir, gentype, genome, threads, file1, file2, outname, pairnamest, minres, resst, uniqueid, keepbamcmd) 164 | print(tokenized_line) 165 | # run 166 | sp.run(tokenized_line, shell=True, executable="/bin/bash") 167 | elif multifile and not bowtieonly: 168 | for line in multilines: 169 | if line == line2: 170 | for x in range(len(file1)): 171 | #Include command if bams are wanted 172 | if keepbams: 173 | keepbamcmd = "| tee >(samtools view -bS > {0}{1}.bam) ".format(outdir, outlist[x]) 174 | else: 175 | keepbamcmd = "" 176 | # add file name and split by whitespace 177 | tokenized_line = line.format(outdir, gentype, genome, threads, file1[x], file2[x], outlist[x], pairnamest, minres, resst, uniqueid, keepbamcmd) 178 | print(tokenized_line) 179 | # run 180 | sp.run(tokenized_line, shell=True, executable="/bin/bash") 181 | else: 182 | # add file name and split by whitespace 183 | tokenized_line = line.format(outdir, gentype, genome, threads, file1[1], file2[1], outname, pairnamest, minres, resst, uniqueid) 184 | print(tokenized_line) 185 | # run 186 | sp.run(tokenized_line, shell=True) 187 | elif bowtieonly and multifile: 188 | for line in multiblines: 189 | if line == bline2 or line == bline3: 190 | for x in range(len(file1)): 191 | tokenized_line = line.format(outdir, gentype, genome, threads, file1[x], file2[x], outlist[x], outname) 192 | print(tokenized_line) 193 | sp.run(tokenized_line, shell=True) 194 | else: 195 | tokenized_line = line.format(outdir, gentype, genome, threads, file1[1], file2[1], outname, bamst, baist) 196 | print(tokenized_line) 197 | sp.run(tokenized_line, shell=True) 198 | elif bowtieonly and not multifile: 199 | for line in blines: 200 | tokenized_line = line.format(outdir, gentype, genome, threads, file1, file2, outname, outname) 201 | print(tokenized_line) 202 | sp.run(tokenized_line, shell=True) 203 | 204 | #After everything finishes, merge and process bams as required if doing full analysis 205 | if keepbams and not bowtieonly: 206 | if not multifile: 207 | for line in truncblines: 208 | tokenized_line = line.format(outdir, gentype, genome, threads, file1, file2, outname, outname) 209 | print(tokenized_line) 210 | sp.run(tokenized_line, shell=True) 211 | elif multifile: 212 | for line in truncmultiblines: 213 | if line == bline3: 214 | for x in range(len(file1)): 215 | tokenized_line = line.format(outdir, gentype, genome, threads, file1[x], file2[x], outlist[x], outname) 216 | print(tokenized_line) 217 | sp.run(tokenized_line, shell=True) 218 | else: 219 | tokenized_line = line.format(outdir, gentype, genome, threads, file1[1], file2[1], outname, bamst, baist) 220 | print(tokenized_line) 221 | sp.run(tokenized_line, shell=True) 222 | -------------------------------------------------------------------------------- /spikeinChIP_PE_alignment.py: -------------------------------------------------------------------------------- 1 | #Aligning and processing paired end fastq files for spike-in ChIP-seq using bowtie2 2 | 3 | from sys import exit 4 | import subprocess as sp 5 | import argparse 6 | import multiprocessing 7 | import uuid 8 | import pandas as pd 9 | 10 | parser = argparse.ArgumentParser(description = "run bowtie2 on paired end fastq files with spikein to produce aligned bam files") 11 | parser.add_argument("--filename", "-f", help = "a tab-separated file containing one each line the path to the fastq with the first ends of pairs, the path to the fastq with the second ends of pairs, and the desired output name for the aligned file") 12 | # parser.add_argument("--file_1", "-1", help = "first demuxed fastq of paired end reads - required", nargs = "*") 13 | # parser.add_argument("--file_2", "-2", help = "second demuxed fastq of paired end reads - required", nargs = "*") 14 | parser.add_argument("--genome", "-g", help = "genome build to align to - mouse or human - required") 15 | parser.add_argument("--spikegenome", "-s", help = "spikein genome build to align to - mouse or human - required") 16 | parser.add_argument("--threads", "-t", help = "number of threads to use for bowtie2 - default is 1", default = "1") 17 | parser.add_argument("--outname", "-o", help = "name for the table to store counts") 18 | parser.add_argument("--outdir", help = "a directory to store output files - default is current directory", default = "./") 19 | args = parser.parse_args() 20 | 21 | # file1 = args.file_1 22 | # file2 = args.file_2 23 | genome = args.genome 24 | spikegenome = args.spikegenome 25 | threads = args.threads 26 | outname = args.outname 27 | outdir = args.outdir 28 | 29 | #Read in file to determine what to process 30 | files = pd.read_csv(args.filename, sep='\t', header=None, names = ['end1', 'end2', 'name']) 31 | file1 = files.end1.values.tolist() 32 | file2 = files.end2.values.tolist() 33 | outnames = files.name.values.tolist() 34 | 35 | #Check requirements are fulfilled: 36 | condapacks = sp.run("conda list".split(), capture_output=True) 37 | condapacksstr = str(condapacks.stdout) 38 | 39 | if "bowtie2" not in condapacksstr or "samtools" not in condapacksstr or "sambamba" not in condapacksstr: 40 | print("Please make sure bowtie2, samtools and sambamba are installed in your current conda environment (check conda list)") 41 | exit() 42 | 43 | #Check that outdir ends with a /, add one if it doesn't 44 | if args.outdir is not None and not outdir.endswith("/"): 45 | outdir = outdir + "/" 46 | 47 | #Check a genome was specified 48 | if args.genome is None or args.spikegenome is None: 49 | print("Genomes not specified - check help for formatting") 50 | parser.print_usage() 51 | exit() 52 | 53 | #Check if file1, file2, and outnames are present and the same lengths 54 | if file1 is None or file2 is None or outnames is None: 55 | print("Input files not specified - check help for formatting") 56 | parser.print_usage() 57 | exit() 58 | elif type(file1) == list and type(file1) == list and type(outnames) == list and len(file1) > 1: 59 | if len(file1) != len(file2) or len(file1) != len(outnames) or len(file2) != len(outnames): 60 | print("Mismatch in number of input files or output names, check arguments") 61 | exit() 62 | 63 | #Check that a sensible number of threads has been requested - more protections here are possible - at the moment users are trusted to be sensible 64 | cpucount = multiprocessing.cpu_count() 65 | if args.threads is None: 66 | print("Defaulting to one thread") 67 | threads = 1 68 | elif int(args.threads) >= cpucount: 69 | print("Too many threads requested, resetting to default") 70 | threads = 1 71 | else: 72 | print(f"Running alignment with {threads} threads...") 73 | 74 | #Check that the user has entered a valid genome to align to 75 | if genome == "mm10" or genome == "mm39": 76 | print(f"Aligning to mouse genome {genome}") 77 | elif genome == "hg19" or genome == "hg38": 78 | print(f"Aligning to human genome {genome}") 79 | else: 80 | print("Genome option not recognised or not entered. Please use mm10/39 or hg19/38 or ask Miles to change the script to accommodate your new organism/genome") 81 | exit() 82 | 83 | #Process ID (used to make unique sorttemp, so these are not overlapping for multiple processes in the same outdir) 84 | uniqueid = str(uuid.uuid4()) 85 | 86 | #Create a place to store counts 87 | allcountslist = [] 88 | 89 | #Process the files 90 | for i, fastq1 in enumerate(file1): 91 | fastq2 = file2[i] 92 | name = outnames[i] 93 | print(f"Aligning {name} to {genome} and {spikegenome}") 94 | #Explanation: align to genome and spikein genome, then remove multiply aligned reads with grep (XS: indicates the score of the next best aligning read, if it exists), then make a bam of all mapped reads (-F4 removes reads with a SAM flag of 4, which means unmapped) 95 | sp.run(f"bowtie2 -p {threads} --no-mixed --no-discordant -1 {fastq1} -2 {fastq2} -x /mnt/md0/DataRepository/genomes/{genome}.{spikegenome}/{genome}.{spikegenome} | grep -v XS: - | samtools view -bh -F4 - > {outdir}{name}_UniqMapped.bam", shell=True, executable="/bin/bash") 96 | #Sort aligned reads 97 | sp.run(f"sambamba sort --tmpdir {outdir}{uniqueid}/ -t {threads} -m 30G -o {outdir}{name}_UniqMapped_sorted.bam {outdir}{name}_UniqMapped.bam", shell=True, executable="/bin/bash") 98 | #Remove duplicates 99 | sp.run(f"sambamba markdup --tmpdir {outdir}{uniqueid}/ -r -t {threads} {outdir}{name}_UniqMapped_sorted.bam {outdir}{name}_UniqMapped_sorted_rmdup.bam", shell=True, executable="/bin/bash") 100 | 101 | #Next, need to separate out reads from each genome: 102 | print(f"Extracting reads aligning uniquely to {genome}") 103 | #Use samtools view to open the file, grep to remove those with the spikein genome name in them, then change the chromosomes with the genome name to just the chromosome numbers as normally used, then put the file back into bam. 104 | sp.run(f"samtools view -h {outdir}{name}_UniqMapped_sorted_rmdup.bam | grep -v {spikegenome} | sed s/{genome}_chr/chr/g | samtools view -bhS - > {outdir}{name}_{genome}.UniqMapped_sorted_rmdup.bam", shell=True, executable="/bin/bash") 105 | #Do the same thing for the spikein 106 | print(f"Extracting reads aligning uniquely to {spikegenome}.") 107 | sp.run(f"samtools view -h {outdir}{name}_UniqMapped_sorted_rmdup.bam | grep -v {genome} | sed s/{spikegenome}_chr/chr/g | samtools view -bhS - > {outdir}{name}_{spikegenome}.UniqMapped_sorted_rmdup.bam", shell=True, executable="/bin/bash") 108 | #Index outputs 109 | sp.run(f"sambamba index -t {threads} {outdir}{name}_UniqMapped_sorted_rmdup.bam", shell=True, executable="/bin/bash") 110 | sp.run(f"sambamba index -t {threads} {outdir}{name}_{genome}.UniqMapped_sorted_rmdup.bam", shell=True, executable="/bin/bash") 111 | sp.run(f"sambamba index -t {threads} {outdir}{name}_{spikegenome}.UniqMapped_sorted_rmdup.bam", shell=True, executable="/bin/bash") 112 | #Now clean up 113 | sp.run(f"rm {outdir}{name}_UniqMapped.bam", shell=True, executable="/bin/bash") 114 | sp.run(f"rm {outdir}{name}_UniqMapped_sorted.bam", shell=True, executable="/bin/bash") 115 | 116 | #Finally, count reads in each file: 117 | totalCount = sp.run(f"sambamba view -c -t {threads} {outdir}{name}_UniqMapped_sorted_rmdup.bam", capture_output=True, shell=True, executable="/bin/bash") 118 | genomeCount = sp.run(f"sambamba view -c -t {threads} {outdir}{name}_{genome}.UniqMapped_sorted_rmdup.bam", capture_output=True, shell=True, executable="/bin/bash") 119 | spikegenomeCount = sp.run(f"sambamba view -c -t {threads} {outdir}{name}_{spikegenome}.UniqMapped_sorted_rmdup.bam", capture_output=True, shell=True, executable="/bin/bash") 120 | countsList = [totalCount.stdout.decode('ascii').strip(), genomeCount.stdout.decode('ascii').strip(), spikegenomeCount.stdout.decode('ascii').strip()] 121 | allcountslist.append(countsList) 122 | 123 | sp.run(f"rm {outdir}{uniqueid}/ -r", shell=True, executable="/bin/bash") 124 | countstable = pd.DataFrame(allcountslist, columns = ['allcounts', 'genomecounts', 'spikecounts']) 125 | outtable = pd.concat([files, countstable], axis=1) 126 | outtable.to_csv(outdir + outname + '.tsv', sep = '\t', index = False, header = True) 127 | --------------------------------------------------------------------------------