[Bioc-devel] VRanges-class positive strandness and locateVariants() strandawareness
Michael Lawrence
lawrence.michael at gene.com
Thu Jun 11 19:19:12 CEST 2015
Val,
I wasn't suggesting that LOCSTRAND be added to the locateVariants()
output. Rather, it would be added to the VRanges during the merge.
Michael
On Thu, Jun 11, 2015 at 10:10 AM, Valerie Obenchain
<vobencha at fredhutch.org> wrote:
> locateVariants(), predictCoding() and the family of mapToTranscripts()
> functions all return strand according to the annotation matched. The only
> time the strand of the output could possibly be different from the strand of
> the input 'query' is when 'ignore.strand = TRUE' (FALSE by default).
>
> I wouldn't think you (Robert) are using 'ignore.strand = TRUE', are you? By
> just using the default, the output will have the same strand as the input
> 'query' (unless 'query' is '*' of course).
>
> That said, do you still feel it's necessary to add a LOCSTRAND column to the
> output?
>
> Val
>
>
> On 06/11/2015 09:38 AM, Michael Lawrence wrote:
>>
>> I didn't realize that locateVariants() returned an object with its
>> strand matching that of the subject. I would have expected the subject
>> strand to be stored in a LOCSTRAND column, as you suggest. Anyway, it
>> sounds like you want to merge the locateVariants() output with the
>> input. Merging the output strand as LOCSTRAND on the VRanges sounds
>> like a reasonable approach, for now. I don't know if Val is listening,
>> but it sounds like it would be nice to have convenient functions for
>> merging locateVariants() output with its input. The one for VRanges
>> might do something like the above.
>>
>> Michael
>>
>> On Thu, Jun 11, 2015 at 9:14 AM, Robert Castelo <robert.castelo at upf.edu>
>> wrote:
>>>
>>> Of course, the inclusion of strand would imply an interpretation of the
>>> variant and its strand (e.g., "-") with respect to an annotated feature.
>>> I
>>> can see a practical problem of integrity of the information on a VRanges
>>> object, by which a mandatory column, such as strand, depends on a
>>> non-mandatory column, such as some feature annotation stored as a
>>> metadata
>>> column.
>>>
>>> A solution would be to add the transcript identifier (TXID) as mandatory
>>> column on the VRanges object but I suspect this is a big change to do, so
>>> adding a LOCSTRAND column (next to LOCSTART and LOCEND generated by
>>> locateVariants) in the metadata columns of the VRanges object would allow
>>> me
>>> to use a VRanges object as a container of variant x allele x sample x
>>> annotation.
>>>
>>> Just to clear up the issue of merging strand and variant: a noisy variant
>>> (a
>>> variant that is not silent) and has a, e.g., loss-of-function effect such
>>> as
>>> the gain of a stop codon, is usually interpreted in the strand of the
>>> transcript and coding sequence in which the stop codon is gained, saying
>>> something like and A changed to a T producting the stop codon TAA. Ref
>>> and
>>> alt alleles are called in the strand of the reference chromosome, so if
>>> the
>>> transcript was annotated in the negative strand, we would know that we
>>> need
>>> to reverse-complement ref and alt to interpret the variant, although I
>>> see
>>> no need to do anything on the VRanges object to ref and alt because we
>>> know
>>> they are always in the strand of the reference chromosome. Only if you
>>> want
>>> to detect this stop-gain event (with predictCoding) then you would have
>>> to
>>> reverse-complement the ref and alt alleles. Conversely, if the variant
>>> falls
>>> in an intergenic region, then obviously the strand plays no role in the
>>> interpretation of the variant and nothing needs to be done when
>>> interpreting
>>> the ref and alt alleles.
>>>
>>>
>>> On 6/11/15 5:47 PM, Michael Lawrence wrote:
>>>>
>>>>
>>>> The fact that the position describes the variant, but the strand
>>>> refers to the transcript is confusing to me. What is the concrete use
>>>> case for merging the two features like that? VRanges constrains its
>>>> strand for at least 2 reasons: (1) to be less error prone [of course
>>>> this runs completely counter to flexibility] and (2) simplicity [we
>>>> don't have to worry about what "-" means for ref/alt, overlap, etc].
>>>>
>>>> On Thu, Jun 11, 2015 at 6:05 AM, Robert Castelo <robert.castelo at upf.edu>
>>>> wrote:
>>>>>
>>>>>
>>>>> one option for me is just to add a metadata column with the strand of
>>>>> the
>>>>> overlapping feature. however, i'm interested to fully understand the
>>>>> rationale behind this aspect of the design of the VRanges object.
>>>>>
>>>>> a VRanges object unrolls variants in a VCF file per alternative allele
>>>>> and
>>>>> sample. variants in VCF files are obtained from tallying reads aligned
>>>>> on
>>>>> a
>>>>> reference genome. so, my understanding is that the reference allele is
>>>>> the
>>>>> allele of the reference genome against which the reads were aligned
>>>>> while
>>>>> the alternate allele(s) are allele calls different from the reference.
>>>>> from
>>>>> this perspective, my interpretation is that ref and alt alleles have
>>>>> already
>>>>> a strand, which is the strand of the reference chromosome against which
>>>>> the
>>>>> reads were aligned to. i'm interested in this interpretation of the
>>>>> strand
>>>>> of the variants because i'm interested in the interpretation of
>>>>> sequence-features containing the reference and the alternate alleles,
>>>>> such
>>>>> as differences in a binding site with the reference and the alternate
>>>>> allele.
>>>>>
>>>>> if we relax the meaning of elements in a VRanges object to, not only
>>>>> variants x allele x sample, but to variants x allele x sample x
>>>>> annotated-feature, then i think it would make sense to have the
>>>>> strand-specific annotation in the strand slot of the VRanges object.
>>>>>
>>>>> while this idea may be good or not for a number of reasons, i'm now
>>>>> mostly
>>>>> interested in knowing whether i'm misinterpreting the design of VRanges
>>>>> objects, and maybe variant calling in general or i'm in a more or less
>>>>> right
>>>>> path in using a VRanges object to hold variant annotations.
>>>>>
>>>>>
>>>>> thanks!!!
>>>>>
>>>>> robert.
>>>>>
>>>>>
>>>>> On 06/11/2015 04:30 AM, Michael Lawrence wrote:
>>>>>>
>>>>>>
>>>>>> I guess it depends on what the strand should mean. Would having a
>>>>>> negative strand indicate that the ref/alt should be complemented? I'm
>>>>>> not sure it's a good idea to conflate the strand of the variant itself
>>>>>> with the strand of an overlapping feature.
>>>>>>
>>>>>> On Wed, Jun 10, 2015 at 1:17 PM, Robert
>>>>>> Castelo<robert.castelo at upf.edu>
>>>>>> wrote:
>>>>>>>
>>>>>>>
>>>>>>> my understanding was that VRanges is a container for variants and
>>>>>>> variant
>>>>>>> annotations and strand is just one annotation more. when we use
>>>>>>> locateVariants() a variant can be annotated to multiple transcripts
>>>>>>> where
>>>>>>> in
>>>>>>> one overlaps an exon, in another an intron and so on. In all those
>>>>>>> transcripts annotations there is a strand annotation, the strand of
>>>>>>> the
>>>>>>> transcript. if the transcript is annotated in the negative strand of
>>>>>>> the
>>>>>>> reference chromosome then the annotation of a transcript region to a
>>>>>>> variant
>>>>>>> is going to be also on the negative strand.
>>>>>>>
>>>>>>> both locateVariants() and predictCoding() return GRanges objects with
>>>>>>> strand
>>>>>>> annotations according to the transcripts being annotated. I thought
>>>>>>> it
>>>>>>> made
>>>>>>> sense in VariantFiltering to use VRanges objects as a container for
>>>>>>> variants and annotations and, for this reason, I would like to carry
>>>>>>> on
>>>>>>> the
>>>>>>> strand annotation into the VRanges object. Is there a strong reason
>>>>>>> for
>>>>>>> a
>>>>>>> VRanges object, derived from GRanges, not to have strand?
>>>>>>>
>>>>>>>
>>>>>>> On 6/10/15 6:26 PM, Michael Lawrence wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> VRanges is supposed to enforce strand. The goal is to use "*"
>>>>>>>> always,
>>>>>>>> for simplicity and consistency with the result of readVcf(). Is
>>>>>>>> there
>>>>>>>> a use case for negative strand variants?
>>>>>>>>
>>>>>>>> On Wed, Jun 10, 2015 at 5:54 AM, Robert
>>>>>>>> Castelo<robert.castelo at upf.edu>
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Michael,
>>>>>>>>>
>>>>>>>>> regarding our email exchange three weeks ago, I found a couple of
>>>>>>>>> places
>>>>>>>>> in
>>>>>>>>> VariantAnnotation that IMO need to be updated to avoid enforcing
>>>>>>>>> strand
>>>>>>>>> on
>>>>>>>>> VRanges.
>>>>>>>>>
>>>>>>>>> these places occur when constructing and validating VRanges
>>>>>>>>> objects,
>>>>>>>>> concretely at:
>>>>>>>>>
>>>>>>>>> 1. file R/methods-VRanges-class.R at the VRanges class constructor:
>>>>>>>>>
>>>>>>>>> VRanges<-
>>>>>>>>> function(seqnames = Rle(), ranges = IRanges(),
>>>>>>>>> ref = character(), alt = NA_character_,
>>>>>>>>> totalDepth = NA_integer_, refDepth = NA_integer_,
>>>>>>>>> altDepth = NA_integer_, ..., sampleNames =
>>>>>>>>> NA_character_,
>>>>>>>>> softFilterMatrix = FilterMatrix(matrix(nrow =
>>>>>>>>> length(gr),
>>>>>>>>> ncol =
>>>>>>>>> 0L),
>>>>>>>>> FilterRules()),
>>>>>>>>> hardFilters = FilterRules())
>>>>>>>>> {
>>>>>>>>> gr<- GRanges(seqnames, ranges,
>>>>>>>>> strand = .rleRecycleVector("*",
>>>>>>>>> length(ranges)),
>>>>>>>>> ...)
>>>>>>>>> [...]
>>>>>>>>>
>>>>>>>>> that precludes setting the strand at construction time:
>>>>>>>>>
>>>>>>>>> library(VariantAnnotation)
>>>>>>>>> VRanges(seqnames="chr1", ranges=IRanges(1, 5), ref="T", alt="C",
>>>>>>>>> strand="-")
>>>>>>>>> Error in GRanges(seqnames, ranges, strand = .rleRecycleVector("*",
>>>>>>>>> length(ranges)), :
>>>>>>>>> formal argument "strand" matched by multiple actual arguments
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> 2. R/AllClasses.R at the VRanges class validity function
>>>>>>>>> .valid.VRanges():
>>>>>>>>>
>>>>>>>>> .valid.VRanges.strand<- function(object) {
>>>>>>>>> if (any(object at strand == "-"))
>>>>>>>>> paste("'strand' must always be '+' or '*'")
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> [...]
>>>>>>>>>
>>>>>>>>> .valid.VRanges<- function(object)
>>>>>>>>> {
>>>>>>>>> c(.valid.VRanges.ref(object),
>>>>>>>>> .valid.VRanges.alt(object),
>>>>>>>>> .valid.VRanges.strand(object),
>>>>>>>>> .valid.VRanges.depth(object))
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> that prompts an error when variants annotated on the negative
>>>>>>>>> strand
>>>>>>>>> are
>>>>>>>>> detected:
>>>>>>>>>
>>>>>>>>> library(VariantAnnotation)
>>>>>>>>> example(VRanges)
>>>>>>>>> strand(vr)<- "-"
>>>>>>>>> c(vr)
>>>>>>>>> Error in validObject(.Object) :
>>>>>>>>> invalid class “VRanges” object: 'strand' must always be '+'
>>>>>>>>> or
>>>>>>>>> '*'
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> cheers,
>>>>>>>>>
>>>>>>>>> robert.
>>>>>>>>>
>>>>>>>>> On 05/22/2015 09:49 PM, Michael Lawrence wrote:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> This changed recently. VariantAnnotation in devel no longer
>>>>>>>>>> enforces
>>>>>>>>>> a
>>>>>>>>>> strand on VRanges, or at least it allows the "*" case.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Fri, May 22, 2015 at 11:33 AM, Robert
>>>>>>>>>> Castelo<robert.castelo at upf.edu
>>>>>>>>>> <mailto:robert.castelo at upf.edu>> wrote:
>>>>>>>>>>
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> I have encountered myself in a strange situation when
>>>>>>>>>> using
>>>>>>>>>> the
>>>>>>>>>> function locateVariants() from VariantAnnotation with an
>>>>>>>>>> input
>>>>>>>>>> VRanges object. The problem is that some of the expected
>>>>>>>>>> coding
>>>>>>>>>> annotations are not showing up when using locateVariants()
>>>>>>>>>> with
>>>>>>>>>> default parameters.
>>>>>>>>>>
>>>>>>>>>> After investigating this situation I think I found the
>>>>>>>>>> reason,
>>>>>>>>>> which
>>>>>>>>>> does not look like a bug but I would like that you give me
>>>>>>>>>> some
>>>>>>>>>> clarification about the logic behind using
>>>>>>>>>> locateVariants()
>>>>>>>>>> with
>>>>>>>>>> VRanges objects.
>>>>>>>>>>
>>>>>>>>>> The documentation of the VRanges-class says that in this
>>>>>>>>>> class
>>>>>>>>>> of
>>>>>>>>>> objects "The strand is always constrained to be positive
>>>>>>>>>> (+).".
>>>>>>>>>> I
>>>>>>>>>> guess there may be a good reason for this but I could not
>>>>>>>>>> find
>>>>>>>>>> it
>>>>>>>>>> in
>>>>>>>>>> the documentation or googling about it.
>>>>>>>>>>
>>>>>>>>>> This means that when you coerce a CollapsedVCF object
>>>>>>>>>> (obtained,
>>>>>>>>>> for
>>>>>>>>>> example, from a VCF file via readVcf()) to a VRanges
>>>>>>>>>> object,
>>>>>>>>>> even
>>>>>>>>>> though variants in the VCF may have no strand, they get a
>>>>>>>>>> positive
>>>>>>>>>> strand in the VRanges object.
>>>>>>>>>>
>>>>>>>>>> The problem arises then, when you call locateVariants()
>>>>>>>>>> with
>>>>>>>>>> this
>>>>>>>>>> VRanges object, because features on the negative strand
>>>>>>>>>> are
>>>>>>>>>> never
>>>>>>>>>> going to overlap with the variants since, by default, the
>>>>>>>>>> argument
>>>>>>>>>> ignore.strand=FALSE.
>>>>>>>>>>
>>>>>>>>>> Let me illustrate this with a toy example. Consider the
>>>>>>>>>> SNP
>>>>>>>>>> rs1129038
>>>>>>>>>>
>>>>>>>>>> (http://www.ncbi.nlm.nih.gov/projects/SNP/snp_ref.cgi?rs=1129038)
>>>>>>>>>> at
>>>>>>>>>> chr15:28356859 with allels A/G. It is located on the 3'
>>>>>>>>>> UTR
>>>>>>>>>> of
>>>>>>>>>> the
>>>>>>>>>> gene HERC2 coded on the negative strand of the human
>>>>>>>>>> reference
>>>>>>>>>> genome. Let's build a toy VRanges object having this
>>>>>>>>>> variant:
>>>>>>>>>>
>>>>>>>>>> library(VariantAnnotation)
>>>>>>>>>> vr<- VRanges(seqnames="chr15",
>>>>>>>>>> ranges=IRanges(28356859, 28356859),
>>>>>>>>>> ref="A", alt="G",
>>>>>>>>>> refDepth=5, altDepth=7,
>>>>>>>>>> totalDepth=12, sampleNames="A")
>>>>>>>>>> strand(vr)
>>>>>>>>>> factor-Rle of length 1 with 1 run
>>>>>>>>>> Lengths: 1
>>>>>>>>>> Values : +
>>>>>>>>>> Levels(3): + - *
>>>>>>>>>>
>>>>>>>>>> Let's build now its CollapsedVCF counterpart by using the
>>>>>>>>>> corresponding coercion method and set the strand to "*":
>>>>>>>>>>
>>>>>>>>>> vcf<- asVCF(vr)
>>>>>>>>>> strand(vcf)<- "*"
>>>>>>>>>>
>>>>>>>>>> Now run locateVariants() on both objects with UCSC
>>>>>>>>>> annotations:
>>>>>>>>>>
>>>>>>>>>> library(TxDb.Hsapiens.UCSC.hg19.knownGene)
>>>>>>>>>> txdb<- TxDb.Hsapiens.UCSC.hg19.knownGene
>>>>>>>>>>
>>>>>>>>>> locateVariants(vcf, txdb, region=AllVariants())
>>>>>>>>>> GRanges object with 2 ranges and 9 metadata columns:
>>>>>>>>>> seqnames ranges strand | LOCATION
>>>>>>>>>> LOCSTART
>>>>>>>>>> LOCEND QUERYID TXID CDSID
>>>>>>>>>> <Rle> <IRanges> <Rle> |<factor> <integer> <integer>
>>>>>>>>>> <integer>
>>>>>>>>>> <character> <IntegerList>
>>>>>>>>>> [1] chr15 [28356859, 28356859] * | threeUTR
>>>>>>>>>> 50
>>>>>>>>>> 50
>>>>>>>>>> 1 55386
>>>>>>>>>> [2] chr15 [28356859, 28356859] * | threeUTR
>>>>>>>>>> 50
>>>>>>>>>> 50
>>>>>>>>>> 1 55387
>>>>>>>>>> GENEID PRECEDEID FOLLOWID
>>>>>>>>>> <character> <CharacterList> <CharacterList>
>>>>>>>>>> [1] 8924
>>>>>>>>>> [2] 8924
>>>>>>>>>> -------
>>>>>>>>>> seqinfo: 1 sequence from an unspecified genome; no
>>>>>>>>>> seqlengths
>>>>>>>>>>
>>>>>>>>>> locateVariants(vr, txdb, region=AllVariants())
>>>>>>>>>> GRanges object with 1 range and 9 metadata columns:
>>>>>>>>>> seqnames ranges strand | LOCATION
>>>>>>>>>> LOCSTART
>>>>>>>>>> LOCEND QUERYID TXID CDSID
>>>>>>>>>> <Rle> <IRanges> <Rle> |<factor> <integer> <integer>
>>>>>>>>>> <integer>
>>>>>>>>>> <integer> <IntegerList>
>>>>>>>>>> [1] chr15 [28356859, 28356859] + |
>>>>>>>>>> intergenic<NA>
>>>>>>>>>> <NA>
>>>>>>>>>> 1<NA>
>>>>>>>>>> GENEID PRECEDEID
>>>>>>>>>> FOLLOWID
>>>>>>>>>> <character> <CharacterList> <CharacterList>
>>>>>>>>>> [1]<NA> 100132565,100289656,100616223,...
>>>>>>>>>> 2567
>>>>>>>>>> -------
>>>>>>>>>> seqinfo: 1 sequence from an unspecified genome; no
>>>>>>>>>> seqlengths
>>>>>>>>>>
>>>>>>>>>> Note that while we get the 3' UTR annotation from the
>>>>>>>>>> strandless
>>>>>>>>>> VCF
>>>>>>>>>> object we do not get it from the VRanges object with the
>>>>>>>>>> positive
>>>>>>>>>> strand. To make my point clear: this positive strand shows
>>>>>>>>>> up
>>>>>>>>>> when
>>>>>>>>>> you coerce a strandless VCF object to a VRanges one,
>>>>>>>>>> because
>>>>>>>>>> positive strandness seems to be the convention for VRanges
>>>>>>>>>> objects:
>>>>>>>>>>
>>>>>>>>>> as(vcf, VRanges)
>>>>>>>>>> VRanges object with 1 range and 1 metadata column:
>>>>>>>>>> seqnames ranges strand ref
>>>>>>>>>> alt totalDepth refDepth altDepth
>>>>>>>>>> <Rle> <IRanges> <Rle> <character> <characterOrRle>
>>>>>>>>>> <integerOrRle>
>>>>>>>>>> <integerOrRle> <integerOrRle>
>>>>>>>>>> [1] chr15 [28356859, 28356859] + A
>>>>>>>>>> G 12 5 7
>>>>>>>>>> sampleNames softFilterMatrix | QUAL
>>>>>>>>>> <factorOrRle> <matrix> |<numeric>
>>>>>>>>>> [1] A |<NA>
>>>>>>>>>> -------
>>>>>>>>>> seqinfo: 1 sequence from an unspecified genome; no
>>>>>>>>>> seqlengths
>>>>>>>>>> hardFilters: NULL
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Of course, if I run locateVariants() with the argument
>>>>>>>>>> ignore.strand=TRUE, then I get the expected annotation:
>>>>>>>>>>
>>>>>>>>>> locateVariants(vr, txdb, region=AllVariants(),
>>>>>>>>>> ignore.strand=TRUE)
>>>>>>>>>> GRanges object with 2 ranges and 9 metadata columns:
>>>>>>>>>> seqnames ranges strand | LOCATION
>>>>>>>>>> LOCSTART
>>>>>>>>>> LOCEND QUERYID TXID CDSID
>>>>>>>>>> <Rle> <IRanges> <Rle> |<factor> <integer> <integer>
>>>>>>>>>> <integer>
>>>>>>>>>> <character> <IntegerList>
>>>>>>>>>> [1] chr15 [28356859, 28356859] + | threeUTR
>>>>>>>>>> 677
>>>>>>>>>> 677 1 55386
>>>>>>>>>> [2] chr15 [28356859, 28356859] + | threeUTR
>>>>>>>>>> 677
>>>>>>>>>> 677 1 55387
>>>>>>>>>> GENEID PRECEDEID FOLLOWID
>>>>>>>>>> <character> <CharacterList> <CharacterList>
>>>>>>>>>> [1] 8924
>>>>>>>>>> [2] 8924
>>>>>>>>>> -------
>>>>>>>>>> seqinfo: 1 sequence from an unspecified genome; no
>>>>>>>>>> seqlengths
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> So, my question is, given that VRanges objects are
>>>>>>>>>> enforced
>>>>>>>>>> to
>>>>>>>>>> have
>>>>>>>>>> a positive strand, would not be better to have
>>>>>>>>>> ignore.strand=TRUE
>>>>>>>>>> as
>>>>>>>>>> default in locateVariants?
>>>>>>>>>>
>>>>>>>>>> Alternatively, I would recommend that locateVariants()
>>>>>>>>>> issues
>>>>>>>>>> a
>>>>>>>>>> warning, or maybe an error, when the input object is
>>>>>>>>>> VRanges
>>>>>>>>>> and
>>>>>>>>>> ignore.strand=FALSE.
>>>>>>>>>>
>>>>>>>>>> Finally, out of curiosity, why a VRanges object enforces
>>>>>>>>>> the
>>>>>>>>>> positive strand in all its genomic ranges? Would not be
>>>>>>>>>> better
>>>>>>>>>> just
>>>>>>>>>> taking the strand of the CollapsedVCF object when coercing
>>>>>>>>>> the
>>>>>>>>>> CollapsedVCF object to VRanges?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> thanks!!
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> robert.
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Bioc-devel at r-project.org<mailto:Bioc-devel at r-project.org>
>>>>>>>>>> mailing
>>>>>>>>>> list
>>>>>>>>>> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Robert Castelo, PhD
>>>>>>>>> Associate Professor
>>>>>>>>> Dept. of Experimental and Health Sciences
>>>>>>>>> Universitat Pompeu Fabra (UPF)
>>>>>>>>> Barcelona Biomedical Research Park (PRBB)
>>>>>>>>> Dr Aiguader 88
>>>>>>>>> E-08003 Barcelona, Spain
>>>>>>>>> telf: +34.933.160.514
>>>>>>>>> fax: +34.933.160.550
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> Bioc-devel at r-project.org mailing list
>>>>>>>>> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>> --
>>>>> Robert Castelo, PhD
>>>>> Associate Professor
>>>>> Dept. of Experimental and Health Sciences
>>>>> Universitat Pompeu Fabra (UPF)
>>>>> Barcelona Biomedical Research Park (PRBB)
>>>>> Dr Aiguader 88
>>>>> E-08003 Barcelona, Spain
>>>>> telf: +34.933.160.514
>>>>> fax: +34.933.160.550
>>>
>>>
>>>
>>
>> _______________________________________________
>> Bioc-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>>
>
>
> --
> Computational Biology / Fred Hutchinson Cancer Research Center
> 1100 Fairview Ave. N, Seattle, WA 98109
>
> Email: vobencha at fredhutch.org
> Phone: (206) 667-3158
More information about the Bioc-devel
mailing list