consenrich 0.6.3b1__cp311-cp311-macosx_11_0_arm64.whl → 0.7.0b1__cp311-cp311-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of consenrich might be problematic. Click here for more details.

consenrich/consenrich.py CHANGED
@@ -39,11 +39,11 @@ def _listOrEmpty(list_):
39
39
 
40
40
 
41
41
  def _getMinR(cfg, numBams: int) -> float:
42
+ fallBackMinR: float = 1.0
42
43
  try:
43
44
  raw = cfg.get("observationParams.minR", None)
44
- return float(raw) if raw is not None else (1 / numBams) + 1e-4
45
+ return float(raw) if raw is not None else fallBackMinR
45
46
  except (TypeError, ValueError, KeyError):
46
- fallBackMinR: float = 1.0e-2
47
47
  logger.warning(
48
48
  f"Invalid or missing 'observationParams.minR' in config. Using `{fallBackMinR}`."
49
49
  )
@@ -174,7 +174,21 @@ def getInputArgs(config_path: str) -> core.inputParams:
174
174
  for i, bamFile in enumerate(bamFilesControl):
175
175
  misc_util.checkBamFile(bamFile)
176
176
 
177
- return core.inputParams(bamFiles=bamFiles, bamFilesControl=bamFilesControl)
177
+ # if we've made it here, we can check pairedEnd
178
+ pairedEndList = misc_util.bamsArePairedEnd(bamFiles)
179
+ _isPairedEnd: Optional[bool] = config.get("inputParams.pairedEnd", None)
180
+ if _isPairedEnd is None:
181
+ # only set auto if not provided in config
182
+ _isPairedEnd = all(pairedEndList)
183
+ if _isPairedEnd:
184
+ logger.info(
185
+ "Paired-end BAM files detected"
186
+ )
187
+ else:
188
+ logger.info(
189
+ "One or more single-end BAM files detected"
190
+ )
191
+ return core.inputParams(bamFiles=bamFiles, bamFilesControl=bamFilesControl, pairedEnd=_isPairedEnd)
178
192
 
179
193
 
180
194
  def getGenomeArgs(config_path: str) -> core.genomeParams:
@@ -294,6 +308,7 @@ def readConfig(config_path: str) -> Dict[str, Any]:
294
308
  genomeParams = getGenomeArgs(config_path)
295
309
  countingParams = getCountingArgs(config_path)
296
310
  minR_default = _getMinR(config, len(inputParams.bamFiles))
311
+ minQ_default = (minR_default / (len(inputParams.bamFiles))) + 0.10 # protect condition number
297
312
  matchingExcludeRegionsBedFile_default: Optional[str] = (
298
313
  genomeParams.blacklistFile
299
314
  )
@@ -304,12 +319,12 @@ def readConfig(config_path: str) -> Dict[str, Any]:
304
319
  "countingArgs": countingParams,
305
320
  "processArgs": core.processParams(
306
321
  deltaF=config.get("processParams.deltaF", 0.5),
307
- minQ=config.get("processParams.minQ", 0.25),
322
+ minQ=config.get("processParams.minQ", minQ_default),
308
323
  maxQ=config.get("processParams.maxQ", 500.0),
309
324
  offDiagQ=config.get("processParams.offDiagQ", 0.0),
310
325
  dStatAlpha=config.get("processParams.dStatAlpha", 3.0),
311
326
  dStatd=config.get("processParams.dStatd", 10.0),
312
- dStatPC=config.get("processParams.dStatPC", 2.0),
327
+ dStatPC=config.get("processParams.dStatPC", 1.0),
313
328
  scaleResidualsByP11=config.get(
314
329
  "processParams.scaleResidualsByP11", False
315
330
  ),
@@ -351,8 +366,9 @@ def readConfig(config_path: str) -> Dict[str, Any]:
351
366
  offsetStr=config.get("samParams.offsetStr", "0,0"),
352
367
  extendBP=config.get("samParams.extendBP", []),
353
368
  maxInsertSize=config.get("samParams.maxInsertSize", 1000),
354
- pairedEndMode=config.get("samParams.pairedEndMode", 0),
355
- inferFragmentLength=config.get("samParams.inferFragmentLength", 0),
369
+ pairedEndMode=config.get("samParams.pairedEndMode", 1 if inputParams.pairedEnd is not None and int(inputParams.pairedEnd) > 0 else 0),
370
+ inferFragmentLength=config.get("samParams.inferFragmentLength", 1 if inputParams.pairedEnd is not None and int(inputParams.pairedEnd) == 0 else 0),
371
+ countEndsOnly=config.get("samParams.countEndsOnly", False),
356
372
  ),
357
373
  "detrendArgs": core.detrendParams(
358
374
  detrendWindowLengthBP=config.get(
@@ -380,7 +396,7 @@ def readConfig(config_path: str) -> Dict[str, Any]:
380
396
  "matchingParams.minSignalAtMaxima", "q:0.75"
381
397
  ),
382
398
  merge=config.get("matchingParams.merge", True),
383
- mergeGapBP=config.get("matchingParams.mergeGapBP", 50),
399
+ mergeGapBP=config.get("matchingParams.mergeGapBP", None),
384
400
  useScalingFunction=config.get(
385
401
  "matchingParams.useScalingFunction", True
386
402
  ),
@@ -492,7 +508,7 @@ def main():
492
508
  "--match-no-merge", action="store_true", dest="matchNoMerge"
493
509
  )
494
510
  parser.add_argument(
495
- "--match-merge-gap", type=int, default=50, dest="matchMergeGapBP"
511
+ "--match-merge-gap", type=int, default=None, dest="matchMergeGapBP"
496
512
  )
497
513
  parser.add_argument(
498
514
  "--match-use-wavelet", action="store_true", dest="matchUseWavelet"
@@ -748,6 +764,7 @@ def main():
748
764
  inferFragmentLength=samArgs.inferFragmentLength,
749
765
  applyAsinh=countingArgs.applyAsinh,
750
766
  applyLog=countingArgs.applyLog,
767
+ countEndsOnly=samArgs.countEndsOnly
751
768
  )
752
769
  if countingArgs.rescaleToTreatmentCoverage:
753
770
  finalSF = max(1.0, initialTreatmentScaleFactors[j_])
@@ -768,12 +785,13 @@ def main():
768
785
  samArgs.samThreads,
769
786
  samArgs.samFlagExclude,
770
787
  offsetStr=samArgs.offsetStr,
771
- extendBP=samArgs.extendBP,
788
+ extendBP=extendBP_,
772
789
  maxInsertSize=samArgs.maxInsertSize,
773
790
  pairedEndMode=samArgs.pairedEndMode,
774
791
  inferFragmentLength=samArgs.inferFragmentLength,
775
792
  applyAsinh=countingArgs.applyAsinh,
776
793
  applyLog=countingArgs.applyLog,
794
+ countEndsOnly=samArgs.countEndsOnly
777
795
  )
778
796
  sparseMap = None
779
797
  if genomeArgs.sparseBedFile and not observationArgs.useALV:
consenrich/core.py CHANGED
@@ -194,6 +194,8 @@ class samParams(NamedTuple):
194
194
  extend reads from 5'. Ignored if `pairedEndMode > 0` or `extendBP` set. This parameter is particularly
195
195
  important when targeting broader marks (e.g., ChIP-seq H3K27me3).
196
196
  :type inferFragmentLength: int
197
+ :param countEndsOnly: If True, only the 5' ends of reads are counted. Overrides `inferFragmentLength` and `pairedEndMode`.
198
+ :type countEndsOnly: Optional[bool]
197
199
 
198
200
  .. tip::
199
201
 
@@ -210,6 +212,7 @@ class samParams(NamedTuple):
210
212
  maxInsertSize: Optional[int] = 1000
211
213
  pairedEndMode: Optional[int] = 0
212
214
  inferFragmentLength: Optional[int] = 0
215
+ countEndsOnly: Optional[bool] = False
213
216
 
214
217
 
215
218
  class detrendParams(NamedTuple):
@@ -251,6 +254,7 @@ class inputParams(NamedTuple):
251
254
 
252
255
  bamFiles: List[str]
253
256
  bamFilesControl: Optional[List[str]]
257
+ pairedEnd: Optional[bool]
254
258
 
255
259
 
256
260
  class genomeParams(NamedTuple):
@@ -309,9 +313,9 @@ class countingParams(NamedTuple):
309
313
 
310
314
 
311
315
  class matchingParams(NamedTuple):
312
- r"""Parameters related to the matching algorithm packaged with this software.
316
+ r"""Parameters related to the matching algorithm.
313
317
 
314
- See :ref:`matching` for details.
318
+ See :ref:`matching` for an overview of the approach.
315
319
 
316
320
  :param templateNames: A list of str values -- wavelet bases used for matching, e.g., `[haar, db2, sym4]`
317
321
  :type templateNames: List[str]
@@ -327,15 +331,13 @@ class matchingParams(NamedTuple):
327
331
  :type alpha: float
328
332
  :param minMatchLengthBP: Within a window of `minMatchLengthBP` length (bp), relative maxima in
329
333
  the signal-template convolution must be greater in value than others to qualify as matches.
330
- *Set to a negative value to disable this filter*.
331
334
  :type minMatchLengthBP: int
332
- :param minSignalAtMaxima: Secondary significance threshold coupled with `alpha`. Require the *signal value*
335
+ :param minSignalAtMaxima: Secondary significance threshold coupled with `alpha`. Requires the *signal value*
333
336
  at relative maxima in the response sequence to be greater than this threshold. Comparisons are made in log-scale.
334
337
  If a `float` value is provided, the minimum signal value must be greater than this (absolute) value. *Set to a
335
338
  negative value to disable the threshold*.
336
- If a `str` value is provided, looks for 'q:quantileValue', e.g., 'q:0.75'. The
339
+ If a `str` value is provided, looks for 'q:quantileValue', e.g., 'q:0.90'. The
337
340
  threshold is then set to the corresponding quantile of the non-zero signal estimates.
338
- Defaults to str value 'q:0.75' --- the 75th percentile of signal values.
339
341
  :type minSignalAtMaxima: Optional[str | float]
340
342
  :param useScalingFunction: If True, use (only) the scaling function to build the matching template.
341
343
  If False, use (only) the wavelet function.
@@ -343,20 +345,21 @@ class matchingParams(NamedTuple):
343
345
  :param excludeRegionsBedFile: A BED file with regions to exclude from matching
344
346
  :type excludeRegionsBedFile: Optional[str]
345
347
 
346
- :seealso: :class:`consenrich.core.matchingParams`, :func:`cconsenrich.csampleBlockStats`, :ref:`matching`
348
+ :seealso: :func:`cconsenrich.csampleBlockStats`, :ref:`matching`
349
+
347
350
  """
348
351
 
349
352
  templateNames: List[str]
350
353
  cascadeLevels: List[int]
351
354
  iters: int
352
355
  alpha: float
356
+ useScalingFunction: Optional[bool]
353
357
  minMatchLengthBP: Optional[int]
354
358
  maxNumMatches: Optional[int]
355
- minSignalAtMaxima: Optional[str | float] = "q:0.75"
356
- merge: bool = False
357
- mergeGapBP: int = 25
358
- useScalingFunction: bool = True
359
- excludeRegionsBedFile: Optional[str] = None
359
+ minSignalAtMaxima: Optional[str | float]
360
+ merge: Optional[bool]
361
+ mergeGapBP: Optional[int]
362
+ excludeRegionsBedFile: Optional[str]
360
363
 
361
364
 
362
365
  def _numIntervals(start: int, end: int, step: int) -> int:
@@ -518,6 +521,7 @@ def readBamSegments(
518
521
  maxInsertSize: Optional[int] = 1000,
519
522
  pairedEndMode: Optional[int] = 0,
520
523
  inferFragmentLength: Optional[int] = 0,
524
+ countEndsOnly: Optional[bool] = False,
521
525
  ) -> npt.NDArray[np.float32]:
522
526
  r"""Calculate tracks of read counts (or a function thereof) for each BAM file.
523
527
 
@@ -553,6 +557,9 @@ def readBamSegments(
553
557
  :type pairedEndMode: int
554
558
  :param inferFragmentLength: See :class:`samParams`.
555
559
  :type inferFragmentLength: int
560
+ :param countEndsOnly: If True, only the 5' ends of reads are counted. This overrides `inferFragmentLength` and `pairedEndMode`.
561
+ :type countEndsOnly: Optional[bool]
562
+
556
563
  """
557
564
 
558
565
  if len(bamFiles) == 0:
@@ -567,6 +574,12 @@ def readBamSegments(
567
574
  offsetStr = ((str(offsetStr) or "0,0").replace(" ", "")).split(",")
568
575
  numIntervals = ((end - start) + stepSize - 1) // stepSize
569
576
  counts = np.empty((len(bamFiles), numIntervals), dtype=np.float32)
577
+
578
+ if isinstance(countEndsOnly, bool) and countEndsOnly:
579
+ # note: setting this option ignores inferFragmentLength, pairedEndMode
580
+ inferFragmentLength = 0
581
+ pairedEndMode = 0
582
+
570
583
  for j, bam in enumerate(bamFiles):
571
584
  logger.info(f"Reading {chromosome}: {bam}")
572
585
  arr = cconsenrich.creadBamSegment(
consenrich/detrorm.py CHANGED
@@ -39,7 +39,7 @@ def getScaleFactor1x(
39
39
  :type bamFile: str
40
40
  :param effectiveGenomeSize: Effective genome size in base pairs. See :func:`consenrich.constants.getEffectiveGenomeSize`.
41
41
  :type effectiveGenomeSize: int
42
- :param readLength: Read length (base pairs). See :func:`consenrich.core.getReadLength`.
42
+ :param readLength: read length or fragment length
43
43
  :type readLength: int
44
44
  :param excludeChroms: List of chromosomes to exclude from the analysis.
45
45
  :type excludeChroms: List[str]
@@ -125,9 +125,9 @@ def getPairScaleFactors(
125
125
  :type effectiveGenomeSizeA: int
126
126
  :param effectiveGenomeSizeB: Effective genome size for the second BAM file.
127
127
  :type effectiveGenomeSizeB: int
128
- :param readLengthA: Read length for the first BAM file.
128
+ :param readLengthA: read length or fragment length for the first BAM file.
129
129
  :type readLengthA: int
130
- :param readLengthB: Read length for the second BAM file.
130
+ :param readLengthB: read length or fragment length for the second BAM file.
131
131
  :type readLengthB: int
132
132
  :param excludeChroms: List of chromosomes to exclude from the analysis.
133
133
  :type excludeChroms: List[str]
@@ -167,9 +167,18 @@ def getPairScaleFactors(
167
167
  else:
168
168
  scaleFactorA *= coverageB / coverageA
169
169
  scaleFactorB = 1.0
170
+
170
171
  logger.info(
171
172
  f"Final scale factors: {bamFileA}: {scaleFactorA}, {bamFileB}: {scaleFactorB}"
172
173
  )
174
+
175
+ ratio = max(scaleFactorA, scaleFactorB) / min(scaleFactorA, scaleFactorB)
176
+ if ratio > 5.0:
177
+ logger.warning(
178
+ f"Scale factors differ > 5x....\n"
179
+ f"\n\tAre effective genome sizes {effectiveGenomeSizeA} and {effectiveGenomeSizeB} correct?"
180
+ f"\n\tAre read/fragment lengths {readLengthA},{readLengthB} correct?"
181
+ )
173
182
  return scaleFactorA, scaleFactorB
174
183
 
175
184
 
consenrich/matching.py CHANGED
@@ -53,7 +53,7 @@ def matchExistingBedGraph(
53
53
  recenterAtPointSource: bool = True,
54
54
  useScalingFunction: bool = True,
55
55
  excludeRegionsBedFile: Optional[str] = None,
56
- mergeGapBP: int = 50,
56
+ mergeGapBP: Optional[int] = None,
57
57
  merge: bool = True,
58
58
  weights: Optional[npt.NDArray[np.float64]] = None,
59
59
  randSeed: int = 42,
@@ -74,6 +74,9 @@ def matchExistingBedGraph(
74
74
  f"Please use a suffix '.bedGraph' for `bedGraphFile`, got: {bedGraphFile}"
75
75
  )
76
76
 
77
+ if mergeGapBP is None:
78
+ mergeGapBP = (minMatchLengthBP // 2) + 1 if minMatchLengthBP is not None else 75
79
+
77
80
  allowedTemplates = [
78
81
  x for x in pw.wavelist(kind="discrete") if "bio" not in x
79
82
  ]
@@ -210,8 +213,6 @@ def matchWavelet(
210
213
  ) -> pd.DataFrame:
211
214
  r"""Detect structured peaks by cross-correlating Consenrich tracks with wavelet- or scaling-function templates.
212
215
 
213
- See :ref:`matching` for an overview of the approach.
214
-
215
216
  :param chromosome: Chromosome name for the input intervals and values.
216
217
  :type chromosome: str
217
218
  :param values: 'Consensus' signal estimates derived from multiple samples, e.g., from Consenrich.
@@ -230,7 +231,6 @@ def matchWavelet(
230
231
  :type alpha: float
231
232
  :param minMatchLengthBP: Within a window of `minMatchLengthBP` length (bp), relative maxima in
232
233
  the signal-template convolution must be greater in value than others to qualify as matches.
233
- *Set to a negative value to disable this filter*.
234
234
  :type minMatchLengthBP: int
235
235
  :param minSignalAtMaxima: Secondary significance threshold coupled with `alpha`. Require the *signal value*
236
236
  at relative maxima in the response sequence to be greater than this threshold. Comparisons are made in log-scale.
@@ -238,7 +238,7 @@ def matchWavelet(
238
238
  negative value to disable the threshold*.
239
239
  If a `str` value is provided, looks for 'q:quantileValue', e.g., 'q:0.75'. The
240
240
  threshold is then set to the corresponding quantile of the non-zero signal estimates.
241
- Defaults to str value 'q:0.75' --- the 75th percentile of signal values.
241
+ Defaults to str value 'q:0.75' --- the 90th percentile of signal values.
242
242
  :type minSignalAtMaxima: Optional[str | float]
243
243
  :param useScalingFunction: If True, use (only) the scaling function to build the matching template.
244
244
  If False, use (only) the wavelet function.
consenrich/misc_util.py CHANGED
@@ -62,6 +62,35 @@ def checkBamFile(bamFile: str) -> bool:
62
62
  return has_index
63
63
 
64
64
 
65
+ def bamsArePairedEnd(bamFiles: List[str], maxReads: int = 1_000) -> List[bool]:
66
+ """
67
+ Take a list of BAM files, return a list (bool) indicating whether
68
+ each BAM contains paired-end reads (True) or only single-end reads (False).
69
+
70
+ :param bamFiles: List of paths to BAM files
71
+ :type bamFiles: List[str]
72
+ :param maxReads: Maximum number of reads to check in each BAM file
73
+ :type maxReads: int
74
+ :return: List of booleans corresponding to each BAM file
75
+ :rtype: List[bool]
76
+ """
77
+
78
+ results = []
79
+ for path in bamFiles:
80
+ paired = False
81
+ seen = 0
82
+ with sam.AlignmentFile(path, "rb") as bam:
83
+ for rec in bam.fetch(until_eof=True):
84
+ if rec.is_paired:
85
+ paired = True
86
+ break
87
+ seen += 1
88
+ if maxReads is not None and seen >= maxReads:
89
+ break
90
+ results.append(paired)
91
+ return results
92
+
93
+
65
94
  def getChromSizesDict(
66
95
  sizes_file: str,
67
96
  excludeRegex: str = r"^chr[A-Za-z0-9]+$",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: consenrich
3
- Version: 0.6.3b1
3
+ Version: 0.7.0b1
4
4
  Summary: Genome-wide estimation of signals hidden in noisy multi-sample HTS datasets
5
5
  Author-email: "Nolan H. Hamilton" <nolan.hamilton@unc.edu>
6
6
  Requires-Python: >=3.11
@@ -43,8 +43,8 @@ Consenrich is an adaptive linear state estimator that yields genome-wide, uncert
43
43
 
44
44
  Special emphasis is placed on computational efficiency, model interpretability, and practical utility for downstream tasks that require well-resolved genome-wide signal estimates and uncertainty quantification across samples, such as:
45
45
 
46
- * Consensus detection of open chromatin regions, TF footprints, nucleosome occupancy, histone modification
47
- * Candidate selection and boundary refinement for differential analyses, fine-mapping, reporter assays, etc.
46
+ * Consensus detection of open chromatin regions, TF binding, histone modification, etc.
47
+ * Candidate prioritization for differential analyses, functional validation, integrative modeling, etc.
48
48
 
49
49
  [**See the Documentation**](https://nolan-h-hamilton.github.io/Consenrich/) for usage examples, installation details, configuration options, and an API reference.
50
50
 
@@ -1,19 +1,13 @@
1
- consenrich-0.6.3b1.dist-info/RECORD,,
2
- consenrich-0.6.3b1.dist-info/WHEEL,sha256=sunMa2yiYbrNLGeMVDqEA0ayyJbHlex7SCn1TZrEq60,136
3
- consenrich-0.6.3b1.dist-info/entry_points.txt,sha256=EXIGcSTyc16vtPkfHJNs-aaSVoq6Pn5Ev5GeW1JCYn0,58
4
- consenrich-0.6.3b1.dist-info/top_level.txt,sha256=jsWw8GC11dOKPcdULXk-ggW357CO-vTNW6ssryqa21Q,11
5
- consenrich-0.6.3b1.dist-info/METADATA,sha256=MAf49unrS7M1GZ0pU2s5TJAk2ZYJ3pJ6nfxlUXiMFm8,2563
6
- consenrich-0.6.3b1.dist-info/licenses/LICENSE,sha256=w09-aT0LFrH_cL3ShJWz-xusRpbThwTpdmBD08tc8EI,1074
7
- consenrich/detrorm.py,sha256=aJf4uZy2qgDIFfkOpTPJw2akVZ6H8-K64UZ63C6aZBw,8508
8
- consenrich/misc_util.py,sha256=SoUCgiON_9dbRbrZQoN2NlitDn6fhOgxe4hBYmWvZaI,2726
1
+ consenrich/detrorm.py,sha256=KeAgkPkcvFa1-DW0PKlyf64qy7m19KMnGHe6xE60SDw,8876
2
+ consenrich/misc_util.py,sha256=OIjYvwbkW2SbTNhqFO1LnVFuHJK3syU2M1Vzo2SeLc4,3675
9
3
  consenrich/constants.py,sha256=5YdNjeyeR1iGbYJXACpxLFS2xVBoyN9bqC7InXPdqKw,5063
10
4
  consenrich/__init__.py,sha256=lg02bx0LdXDIQ7Q-tky01xo0tOXYTcJeXqaCXNSFFyA,320
11
- consenrich/core.py,sha256=RYRBVNoRCFlOYaD_KHApzIy9CcYIoewPT160o8IlM24,52302
12
- consenrich/matching.py,sha256=UdZfuoDxeiPLgwtu246rYnNrF4QQRUUeezo5Xcbn_4Y,27725
13
- consenrich/consenrich.py,sha256=f2ZvuQO5AsSS5oo2vxekMGpeEzLSsee04CKXFknr7FI,35486
14
- consenrich/cconsenrich.cpython-311-darwin.so,sha256=tlE_iCFWNfkpQQthQrC_y5VJ8Qdg640mw_B-YLvs8YE,392816
5
+ consenrich/core.py,sha256=jm7g_qfdL5dktPluIKUcdYrxXGzbjPMjYEkL9md43J0,52760
6
+ consenrich/matching.py,sha256=-r88HoXN-1r_PXK98nvf2KYox7goHRHFrqYdWXGPhms,27738
7
+ consenrich/consenrich.py,sha256=E2OoBbw7qTRYkikwogbZNecihuZvzlZFaHVWfxu55E8,36469
8
+ consenrich/cconsenrich.cpython-311-darwin.so,sha256=XmIiLr60cY_D5bWRS4vmn_Cqwj93vR1UEyiTWmsIGGw,392816
15
9
  consenrich/cconsenrich.pyx,sha256=Wht-d6sUJ-zma0rNHx4DcAIsooFaSR_BdftjJxCLRv8,32604
16
- consenrich/cconsenrich.c,sha256=fL1mF_9kyb1rt1Hi4ryX-0FdFwUT-KzYCRS_HCye_Cc,2052512
10
+ consenrich/cconsenrich.c,sha256=MnuLySBFOhWr5b0ZrrcZYES2qmuj0bgG_AzsnC4uGVI,2052512
17
11
  consenrich/data/hg19.sizes,sha256=ewnSktA_Ps1BoiU3yeLNaJxJO-taq3uKE4-6JUnly1o,365
18
12
  consenrich/data/mm10.sizes,sha256=sgHMQGBr6yEm4hKqeN3auQJdlMX4ZdqDQ23EdDmWedU,320
19
13
  consenrich/data/hg38_blacklist.bed,sha256=zbamE4bP5JJT-ivyDp61LjvaI00Wo-vd0oKtFxy_u4E,14940
@@ -35,3 +29,9 @@ consenrich/data/mm10_sparse.bed,sha256=ukvVuheKf4gxzAzXUbKZ1sewsmP-WOsUz60ySENkm
35
29
  consenrich/data/ce10.sizes,sha256=1crlJDro3lhUpECU_2g9eVIUFM27mw0uMzWqtdmThgA,88
36
30
  consenrich/data/dm6.sizes,sha256=0MNGeHSdAwu-Ym_ApUlHoDybDZDNyqYhbVbR_srZiEY,100
37
31
  consenrich/data/dm6_sparse.bed,sha256=H9wvrZs2ACdtUbDZhLXEEJ4xL5OpKOxhU_Pqf2EyDOM,445849
32
+ consenrich-0.7.0b1.dist-info/RECORD,,
33
+ consenrich-0.7.0b1.dist-info/WHEEL,sha256=sunMa2yiYbrNLGeMVDqEA0ayyJbHlex7SCn1TZrEq60,136
34
+ consenrich-0.7.0b1.dist-info/entry_points.txt,sha256=EXIGcSTyc16vtPkfHJNs-aaSVoq6Pn5Ev5GeW1JCYn0,58
35
+ consenrich-0.7.0b1.dist-info/top_level.txt,sha256=jsWw8GC11dOKPcdULXk-ggW357CO-vTNW6ssryqa21Q,11
36
+ consenrich-0.7.0b1.dist-info/METADATA,sha256=AxzGS0IcXuR8QTnyRdIzCsR3xp5ivWfVhDtA9ZtctO0,2539
37
+ consenrich-0.7.0b1.dist-info/licenses/LICENSE,sha256=w09-aT0LFrH_cL3ShJWz-xusRpbThwTpdmBD08tc8EI,1074