// Copyright 2016 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.genomics.v1;

import "google/api/annotations.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/struct.proto";

option cc_enable_arenas = true;
option go_package = "google.golang.org/genproto/googleapis/genomics/v1;genomics";
option java_multiple_files = true;
option java_outer_classname = "VariantsProto";
option java_package = "com.google.genomics.v1";


service StreamingVariantService {
  // Returns a stream of all the variants matching the search request, ordered
  // by reference name, position, and ID.
  rpc StreamVariants(StreamVariantsRequest) returns (stream StreamVariantsResponse) {
    option (google.api.http) = { post: "/v1/variants:stream" body: "*" };
  }
}

service VariantServiceV1 {
  // Creates variant data by asynchronously importing the provided information.
  //
  // For the definitions of variant sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  //
  // The variants for import will be merged with any existing variant that
  // matches its reference sequence, start, end, reference bases, and
  // alternative bases. If no such variant exists, a new one will be created.
  //
  // When variants are merged, the call information from the new variant
  // is added to the existing variant, and Variant info fields are merged
  // as specified in
  // [infoMergeConfig][google.genomics.v1.ImportVariantsRequest.info_merge_config].
  // As a special case, for single-sample VCF files, QUAL and FILTER fields will
  // be moved to the call level; these are sometimes interpreted in a
  // call-specific context.
  // Imported VCF headers are appended to the metadata already in a variant set.
  rpc ImportVariants(ImportVariantsRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = { post: "/v1/variants:import" body: "*" };
  }

  // Creates a new variant set.
  //
  // For the definitions of variant sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  //
  // The provided variant set must have a valid `datasetId` set - all other
  // fields are optional. Note that the `id` field will be ignored, as this is
  // assigned by the server.
  rpc CreateVariantSet(CreateVariantSetRequest) returns (VariantSet) {
    option (google.api.http) = { post: "/v1/variantsets" body: "variant_set" };
  }

  // Exports variant set data to an external destination.
  //
  // For the definitions of variant sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  rpc ExportVariantSet(ExportVariantSetRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = { post: "/v1/variantsets/{variant_set_id}:export" body: "*" };
  }

  // Gets a variant set by ID.
  //
  // For the definitions of variant sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  rpc GetVariantSet(GetVariantSetRequest) returns (VariantSet) {
    option (google.api.http) = { get: "/v1/variantsets/{variant_set_id}" };
  }

  // Returns a list of all variant sets matching search criteria.
  //
  // For the definitions of variant sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  //
  // Implements
  // [GlobalAllianceApi.searchVariantSets](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variantmethods.avdl#L49).
  rpc SearchVariantSets(SearchVariantSetsRequest) returns (SearchVariantSetsResponse) {
    option (google.api.http) = { post: "/v1/variantsets/search" body: "*" };
  }

  // Deletes a variant set including all variants, call sets, and calls within.
  // This is not reversible.
  //
  // For the definitions of variant sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  rpc DeleteVariantSet(DeleteVariantSetRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { delete: "/v1/variantsets/{variant_set_id}" };
  }

  // Updates a variant set using patch semantics.
  //
  // For the definitions of variant sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  rpc UpdateVariantSet(UpdateVariantSetRequest) returns (VariantSet) {
    option (google.api.http) = { patch: "/v1/variantsets/{variant_set_id}" body: "variant_set" };
  }

  // Gets a list of variants matching the criteria.
  //
  // For the definitions of variants and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  //
  // Implements
  // [GlobalAllianceApi.searchVariants](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variantmethods.avdl#L126).
  rpc SearchVariants(SearchVariantsRequest) returns (SearchVariantsResponse) {
    option (google.api.http) = { post: "/v1/variants/search" body: "*" };
  }

  // Creates a new variant.
  //
  // For the definitions of variants and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  rpc CreateVariant(CreateVariantRequest) returns (Variant) {
    option (google.api.http) = { post: "/v1/variants" body: "variant" };
  }

  // Updates a variant.
  //
  // For the definitions of variants and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  //
  // This method supports patch semantics. Returns the modified variant without
  // its calls.
  rpc UpdateVariant(UpdateVariantRequest) returns (Variant) {
    option (google.api.http) = { patch: "/v1/variants/{variant_id}" body: "variant" };
  }

  // Deletes a variant.
  //
  // For the definitions of variants and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  rpc DeleteVariant(DeleteVariantRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { delete: "/v1/variants/{variant_id}" };
  }

  // Gets a variant by ID.
  //
  // For the definitions of variants and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  rpc GetVariant(GetVariantRequest) returns (Variant) {
    option (google.api.http) = { get: "/v1/variants/{variant_id}" };
  }

  // Merges the given variants with existing variants.
  //
  // For the definitions of variants and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  //
  // Each variant will be
  // merged with an existing variant that matches its reference sequence,
  // start, end, reference bases, and alternative bases. If no such variant
  // exists, a new one will be created.
  //
  // When variants are merged, the call information from the new variant
  // is added to the existing variant. Variant info fields are merged as
  // specified in the
  // [infoMergeConfig][google.genomics.v1.MergeVariantsRequest.info_merge_config]
  // field of the MergeVariantsRequest.
  //
  // Please exercise caution when using this method!  It is easy to introduce
  // mistakes in existing variants and difficult to back out of them.  For
  // example,
  // suppose you were trying to merge a new variant with an existing one and
  // both
  // variants contain calls that belong to callsets with the same callset ID.
  //
  //     // Existing variant - irrelevant fields trimmed for clarity
  //     {
  //         "variantSetId": "10473108253681171589",
  //         "referenceName": "1",
  //         "start": "10582",
  //         "referenceBases": "G",
  //         "alternateBases": [
  //             "A"
  //         ],
  //         "calls": [
  //             {
  //                 "callSetId": "10473108253681171589-0",
  //                 "callSetName": "CALLSET0",
  //                 "genotype": [
  //                     0,
  //                     1
  //                 ],
  //             }
  //         ]
  //     }
  //
  //     // New variant with conflicting call information
  //     {
  //         "variantSetId": "10473108253681171589",
  //         "referenceName": "1",
  //         "start": "10582",
  //         "referenceBases": "G",
  //         "alternateBases": [
  //             "A"
  //         ],
  //         "calls": [
  //             {
  //                 "callSetId": "10473108253681171589-0",
  //                 "callSetName": "CALLSET0",
  //                 "genotype": [
  //                     1,
  //                     1
  //                 ],
  //             }
  //         ]
  //     }
  //
  // The resulting merged variant would overwrite the existing calls with those
  // from the new variant:
  //
  //     {
  //         "variantSetId": "10473108253681171589",
  //         "referenceName": "1",
  //         "start": "10582",
  //         "referenceBases": "G",
  //         "alternateBases": [
  //             "A"
  //         ],
  //         "calls": [
  //             {
  //                 "callSetId": "10473108253681171589-0",
  //                 "callSetName": "CALLSET0",
  //                 "genotype": [
  //                     1,
  //                     1
  //                 ],
  //             }
  //         ]
  //     }
  //
  // This may be the desired outcome, but it is up to the user to determine if
  // if that is indeed the case.
  rpc MergeVariants(MergeVariantsRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { post: "/v1/variants:merge" body: "*" };
  }

  // Gets a list of call sets matching the criteria.
  //
  // For the definitions of call sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  //
  // Implements
  // [GlobalAllianceApi.searchCallSets](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variantmethods.avdl#L178).
  rpc SearchCallSets(SearchCallSetsRequest) returns (SearchCallSetsResponse) {
    option (google.api.http) = { post: "/v1/callsets/search" body: "*" };
  }

  // Creates a new call set.
  //
  // For the definitions of call sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  rpc CreateCallSet(CreateCallSetRequest) returns (CallSet) {
    option (google.api.http) = { post: "/v1/callsets" body: "call_set" };
  }

  // Updates a call set.
  //
  // For the definitions of call sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  //
  // This method supports patch semantics.
  rpc UpdateCallSet(UpdateCallSetRequest) returns (CallSet) {
    option (google.api.http) = { patch: "/v1/callsets/{call_set_id}" body: "call_set" };
  }

  // Deletes a call set.
  //
  // For the definitions of call sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  rpc DeleteCallSet(DeleteCallSetRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { delete: "/v1/callsets/{call_set_id}" };
  }

  // Gets a call set by ID.
  //
  // For the definitions of call sets and other genomics resources, see
  // [Fundamentals of Google
  // Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
  rpc GetCallSet(GetCallSetRequest) returns (CallSet) {
    option (google.api.http) = { get: "/v1/callsets/{call_set_id}" };
  }
}

// Metadata describes a single piece of variant call metadata.
// These data include a top level key and either a single value string (value)
// or a list of key-value pairs (info.)
// Value and info are mutually exclusive.
message VariantSetMetadata {
  enum Type {
    TYPE_UNSPECIFIED = 0;

    INTEGER = 1;

    FLOAT = 2;

    FLAG = 3;

    CHARACTER = 4;

    STRING = 5;
  }

  // The top-level key.
  string key = 1;

  // The value field for simple metadata
  string value = 2;

  // User-provided ID field, not enforced by this API.
  // Two or more pieces of structured metadata with identical
  // id and key fields are considered equivalent.
  string id = 4;

  // The type of data. Possible types include: Integer, Float,
  // Flag, Character, and String.
  Type type = 5;

  // The number of values that can be included in a field described by this
  // metadata.
  string number = 8;

  // A textual description of this metadata.
  string description = 7;

  // Remaining structured metadata key-value pairs. This must be of the form
  // map<string, string[]> (string key mapping to a list of string values).
  map<string, google.protobuf.ListValue> info = 3;
}

// A variant set is a collection of call sets and variants. It contains summary
// statistics of those contents. A variant set belongs to a dataset.
//
// For more genomics resource definitions, see [Fundamentals of Google
// Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
message VariantSet {
  // The dataset to which this variant set belongs.
  string dataset_id = 1;

  // The server-generated variant set ID, unique across all variant sets.
  string id = 2;

  // The reference set to which the variant set is mapped. The reference set
  // describes the alignment provenance of the variant set, while the
  // `referenceBounds` describe the shape of the actual variant data. The
  // reference set's reference names are a superset of those found in the
  // `referenceBounds`.
  //
  // For example, given a variant set that is mapped to the GRCh38 reference set
  // and contains a single variant on reference 'X', `referenceBounds` would
  // contain only an entry for 'X', while the associated reference set
  // enumerates all possible references: '1', '2', 'X', 'Y', 'MT', etc.
  string reference_set_id = 6;

  // A list of all references used by the variants in a variant set
  // with associated coordinate upper bounds for each one.
  repeated ReferenceBound reference_bounds = 5;

  // The metadata associated with this variant set.
  repeated VariantSetMetadata metadata = 4;

  // User-specified, mutable name.
  string name = 7;

  // A textual description of this variant set.
  string description = 8;
}

// A variant represents a change in DNA sequence relative to a reference
// sequence. For example, a variant could represent a SNP or an insertion.
// Variants belong to a variant set.
//
// For more genomics resource definitions, see [Fundamentals of Google
// Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
//
// Each of the calls on a variant represent a determination of genotype with
// respect to that variant. For example, a call might assign probability of 0.32
// to the occurrence of a SNP named rs1234 in a sample named NA12345. A call
// belongs to a call set, which contains related calls typically from one
// sample.
message Variant {
  // The ID of the variant set this variant belongs to.
  string variant_set_id = 15;

  // The server-generated variant ID, unique across all variants.
  string id = 2;

  // Names for the variant, for example a RefSNP ID.
  repeated string names = 3;

  // The date this variant was created, in milliseconds from the epoch.
  int64 created = 12;

  // The reference on which this variant occurs.
  // (such as `chr20` or `X`)
  string reference_name = 14;

  // The position at which this variant occurs (0-based).
  // This corresponds to the first base of the string of reference bases.
  int64 start = 16;

  // The end position (0-based) of this variant. This corresponds to the first
  // base after the last base in the reference allele. So, the length of
  // the reference allele is (end - start). This is useful for variants
  // that don't explicitly give alternate bases, for example large deletions.
  int64 end = 13;

  // The reference bases for this variant. They start at the given
  // position.
  string reference_bases = 6;

  // The bases that appear instead of the reference bases.
  repeated string alternate_bases = 7;

  // A measure of how likely this variant is to be real.
  // A higher value is better.
  double quality = 8;

  // A list of filters (normally quality filters) this variant has failed.
  // `PASS` indicates this variant has passed all filters.
  repeated string filter = 9;

  // A map of additional variant information. This must be of the form
  // map<string, string[]> (string key mapping to a list of string values).
  map<string, google.protobuf.ListValue> info = 10;

  // The variant calls for this particular variant. Each one represents the
  // determination of genotype with respect to this variant.
  repeated VariantCall calls = 11;
}

// A call represents the determination of genotype with respect to a particular
// variant. It may include associated information such as quality and phasing.
// For example, a call might assign a probability of 0.32 to the occurrence of
// a SNP named rs1234 in a call set with the name NA12345.
message VariantCall {
  // The ID of the call set this variant call belongs to.
  string call_set_id = 8;

  // The name of the call set this variant call belongs to.
  string call_set_name = 9;

  // The genotype of this variant call. Each value represents either the value
  // of the `referenceBases` field or a 1-based index into
  // `alternateBases`. If a variant had a `referenceBases`
  // value of `T` and an `alternateBases`
  // value of `["A", "C"]`, and the `genotype` was
  // `[2, 1]`, that would mean the call
  // represented the heterozygous value `CA` for this variant.
  // If the `genotype` was instead `[0, 1]`, the
  // represented value would be `TA`. Ordering of the
  // genotype values is important if the `phaseset` is present.
  // If a genotype is not called (that is, a `.` is present in the
  // GT string) -1 is returned.
  repeated int32 genotype = 7;

  // If this field is present, this variant call's genotype ordering implies
  // the phase of the bases and is consistent with any other variant calls in
  // the same reference sequence which have the same phaseset value.
  // When importing data from VCF, if the genotype data was phased but no
  // phase set was specified this field will be set to `*`.
  string phaseset = 5;

  // The genotype likelihoods for this variant call. Each array entry
  // represents how likely a specific genotype is for this call. The value
  // ordering is defined by the GL tag in the VCF spec.
  // If Phred-scaled genotype likelihood scores (PL) are available and
  // log10(P) genotype likelihood scores (GL) are not, PL scores are converted
  // to GL scores.  If both are available, PL scores are stored in `info`.
  repeated double genotype_likelihood = 6;

  // A map of additional variant call information. This must be of the form
  // map<string, string[]> (string key mapping to a list of string values).
  map<string, google.protobuf.ListValue> info = 2;
}

// A call set is a collection of variant calls, typically for one sample. It
// belongs to a variant set.
//
// For more genomics resource definitions, see [Fundamentals of Google
// Genomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)
message CallSet {
  // The server-generated call set ID, unique across all call sets.
  string id = 1;

  // The call set name.
  string name = 2;

  // The sample ID this call set corresponds to.
  string sample_id = 7;

  // The IDs of the variant sets this call set belongs to. This field must
  // have exactly length one, as a call set belongs to a single variant set.
  // This field is repeated for compatibility with the
  // [GA4GH 0.5.1
  // API](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variants.avdl#L76).
  repeated string variant_set_ids = 6;

  // The date this call set was created in milliseconds from the epoch.
  int64 created = 5;

  // A map of additional call set information. This must be of the form
  // map<string, string[]> (string key mapping to a list of string values).
  map<string, google.protobuf.ListValue> info = 4;
}

// ReferenceBound records an upper bound for the starting coordinate of
// variants in a particular reference.
message ReferenceBound {
  // The name of the reference associated with this reference bound.
  string reference_name = 1;

  // An upper bound (inclusive) on the starting coordinate of any
  // variant in the reference sequence.
  int64 upper_bound = 2;
}

// The variant data import request.
message ImportVariantsRequest {
  enum Format {
    FORMAT_UNSPECIFIED = 0;

    // VCF (Variant Call Format). The VCF files may be gzip compressed. gVCF is
    // also supported.
    FORMAT_VCF = 1;

    // Complete Genomics masterVarBeta format. The masterVarBeta files may
    // be bzip2 compressed.
    FORMAT_COMPLETE_GENOMICS = 2;
  }

  // Required. The variant set to which variant data should be imported.
  string variant_set_id = 1;

  // A list of URIs referencing variant files in Google Cloud Storage. URIs can
  // include wildcards [as described
  // here](https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames).
  // Note that recursive wildcards ('**') are not supported.
  repeated string source_uris = 2;

  // The format of the variant data being imported. If unspecified, defaults to
  // to `VCF`.
  Format format = 3;

  // Convert reference names to the canonical representation.
  // hg19 haploytypes (those reference names containing "_hap")
  // are not modified in any way.
  // All other reference names are modified according to the following rules:
  // The reference name is capitalized.
  // The "chr" prefix is dropped for all autosomes and sex chromsomes.
  // For example "chr17" becomes "17" and "chrX" becomes "X".
  // All mitochondrial chromosomes ("chrM", "chrMT", etc) become "MT".
  bool normalize_reference_names = 5;

  // A mapping between info field keys and the InfoMergeOperations to
  // be performed on them. This is plumbed down to the MergeVariantRequests
  // generated by the resulting import job.
  map<string, InfoMergeOperation> info_merge_config = 6;
}

// The variant data import response.
message ImportVariantsResponse {
  // IDs of the call sets created during the import.
  repeated string call_set_ids = 1;
}

// The CreateVariantSet request
message CreateVariantSetRequest {
  // Required. The variant set to be created. Must have a valid `datasetId`.
  VariantSet variant_set = 1;
}

// The variant data export request.
message ExportVariantSetRequest {
  enum Format {
    FORMAT_UNSPECIFIED = 0;

    // Export the data to Google BigQuery.
    FORMAT_BIGQUERY = 1;
  }

  // Required. The ID of the variant set that contains variant data which
  // should be exported. The caller must have READ access to this variant set.
  string variant_set_id = 1;

  // If provided, only variant call information from the specified call sets
  // will be exported. By default all variant calls are exported.
  repeated string call_set_ids = 2;

  // Required. The Google Cloud project ID that owns the destination
  // BigQuery dataset. The caller must have WRITE access to this project.  This
  // project will also own the resulting export job.
  string project_id = 3;

  // The format for the exported data.
  Format format = 4;

  // Required. The BigQuery dataset to export data to. This dataset must already
  // exist. Note that this is distinct from the Genomics concept of "dataset".
  string bigquery_dataset = 5;

  // Required. The BigQuery table to export data to.
  // If the table doesn't exist, it will be created. If it already exists, it
  // will be overwritten.
  string bigquery_table = 6;
}

// The variant set request.
message GetVariantSetRequest {
  // Required. The ID of the variant set.
  string variant_set_id = 1;
}

// The search variant sets request.
message SearchVariantSetsRequest {
  // Exactly one dataset ID must be provided here. Only variant sets which
  // belong to this dataset will be returned.
  repeated string dataset_ids = 1;

  // The continuation token, which is used to page through large result sets.
  // To get the next page of results, set this parameter to the value of
  // `nextPageToken` from the previous response.
  string page_token = 2;

  // The maximum number of results to return in a single page. If unspecified,
  // defaults to 1024.
  int32 page_size = 3;
}

// The search variant sets response.
message SearchVariantSetsResponse {
  // The variant sets belonging to the requested dataset.
  repeated VariantSet variant_sets = 1;

  // The continuation token, which is used to page through large result sets.
  // Provide this value in a subsequent request to return the next page of
  // results. This field will be empty if there aren't any additional results.
  string next_page_token = 2;
}

// The delete variant set request.
message DeleteVariantSetRequest {
  // The ID of the variant set to be deleted.
  string variant_set_id = 1;
}

message UpdateVariantSetRequest {
  // The ID of the variant to be updated (must already exist).
  string variant_set_id = 1;

  // The new variant data. Only the variant_set.metadata will be considered
  // for update.
  VariantSet variant_set = 2;

  // An optional mask specifying which fields to update. Supported fields:
  //
  // * [metadata][google.genomics.v1.VariantSet.metadata].
  // * [name][google.genomics.v1.VariantSet.name].
  // * [description][google.genomics.v1.VariantSet.description].
  //
  // Leaving `updateMask` unset is equivalent to specifying all mutable
  // fields.
  google.protobuf.FieldMask update_mask = 5;
}

// The variant search request.
message SearchVariantsRequest {
  // At most one variant set ID must be provided. Only variants from this
  // variant set will be returned. If omitted, a call set id must be included in
  // the request.
  repeated string variant_set_ids = 1;

  // Only return variants which have exactly this name.
  string variant_name = 2;

  // Only return variant calls which belong to call sets with these ids.
  // Leaving this blank returns all variant calls. If a variant has no
  // calls belonging to any of these call sets, it won't be returned at all.
  repeated string call_set_ids = 3;

  // Required. Only return variants in this reference sequence.
  string reference_name = 4;

  // The beginning of the window (0-based, inclusive) for which
  // overlapping variants should be returned. If unspecified, defaults to 0.
  int64 start = 5;

  // The end of the window, 0-based exclusive. If unspecified or 0, defaults to
  // the length of the reference.
  int64 end = 6;

  // The continuation token, which is used to page through large result sets.
  // To get the next page of results, set this parameter to the value of
  // `nextPageToken` from the previous response.
  string page_token = 7;

  // The maximum number of variants to return in a single page. If unspecified,
  // defaults to 5000. The maximum value is 10000.
  int32 page_size = 8;

  // The maximum number of calls to return in a single page. Note that this
  // limit may be exceeded in the event that a matching variant contains more
  // calls than the requested maximum. If unspecified, defaults to 5000. The
  // maximum value is 10000.
  int32 max_calls = 9;
}

// The variant search response.
message SearchVariantsResponse {
  // The list of matching Variants.
  repeated Variant variants = 1;

  // The continuation token, which is used to page through large result sets.
  // Provide this value in a subsequent request to return the next page of
  // results. This field will be empty if there aren't any additional results.
  string next_page_token = 2;
}

message CreateVariantRequest {
  // The variant to be created.
  Variant variant = 1;
}

message UpdateVariantRequest {
  // The ID of the variant to be updated.
  string variant_id = 1;

  // The new variant data.
  Variant variant = 2;

  // An optional mask specifying which fields to update. At this time, mutable
  // fields are [names][google.genomics.v1.Variant.names] and
  // [info][google.genomics.v1.Variant.info]. Acceptable values are "names" and
  // "info". If unspecified, all mutable fields will be updated.
  google.protobuf.FieldMask update_mask = 3;
}

message DeleteVariantRequest {
  // The ID of the variant to be deleted.
  string variant_id = 1;
}

message GetVariantRequest {
  // The ID of the variant.
  string variant_id = 1;
}

message MergeVariantsRequest {
  // The destination variant set.
  string variant_set_id = 1;

  // The variants to be merged with existing variants.
  repeated Variant variants = 2;

  // A mapping between info field keys and the InfoMergeOperations to
  // be performed on them.
  map<string, InfoMergeOperation> info_merge_config = 3;
}

// The call set search request.
message SearchCallSetsRequest {
  // Restrict the query to call sets within the given variant sets. At least one
  // ID must be provided.
  repeated string variant_set_ids = 1;

  // Only return call sets for which a substring of the name matches this
  // string.
  string name = 2;

  // The continuation token, which is used to page through large result sets.
  // To get the next page of results, set this parameter to the value of
  // `nextPageToken` from the previous response.
  string page_token = 3;

  // The maximum number of results to return in a single page. If unspecified,
  // defaults to 1024.
  int32 page_size = 4;
}

// The call set search response.
message SearchCallSetsResponse {
  // The list of matching call sets.
  repeated CallSet call_sets = 1;

  // The continuation token, which is used to page through large result sets.
  // Provide this value in a subsequent request to return the next page of
  // results. This field will be empty if there aren't any additional results.
  string next_page_token = 2;
}

message CreateCallSetRequest {
  // The call set to be created.
  CallSet call_set = 1;
}

message UpdateCallSetRequest {
  // The ID of the call set to be updated.
  string call_set_id = 1;

  // The new call set data.
  CallSet call_set = 2;

  // An optional mask specifying which fields to update. At this time, the only
  // mutable field is [name][google.genomics.v1.CallSet.name]. The only
  // acceptable value is "name". If unspecified, all mutable fields will be
  // updated.
  google.protobuf.FieldMask update_mask = 3;
}

message DeleteCallSetRequest {
  // The ID of the call set to be deleted.
  string call_set_id = 1;
}

message GetCallSetRequest {
  // The ID of the call set.
  string call_set_id = 1;
}

// The stream variants request.
message StreamVariantsRequest {
  // The Google Cloud project ID which will be billed
  // for this access. The caller must have WRITE access to this project.
  // Required.
  string project_id = 1;

  // The variant set ID from which to stream variants.
  string variant_set_id = 2;

  // Only return variant calls which belong to call sets with these IDs.
  // Leaving this blank returns all variant calls.
  repeated string call_set_ids = 3;

  // Required. Only return variants in this reference sequence.
  string reference_name = 4;

  // The beginning of the window (0-based, inclusive) for which
  // overlapping variants should be returned.
  int64 start = 5;

  // The end of the window (0-based, exclusive) for which overlapping
  // variants should be returned.
  int64 end = 6;
}

message StreamVariantsResponse {
  repeated Variant variants = 1;
}

// Operations to be performed during import on Variant info fields.
// These operations are set for each info field in the info_merge_config
// map of ImportVariantsRequest, which is plumbed down to the
// MergeVariantRequests generated by the import job.
enum InfoMergeOperation {
  INFO_MERGE_OPERATION_UNSPECIFIED = 0;

  // By default, Variant info fields are persisted if the Variant doesn't
  // already exist in the variantset.  If the Variant is equivalent to a
  // Variant already in the variantset, the incoming Variant's info field
  // is ignored in favor of that of the already persisted Variant.
  IGNORE_NEW = 1;

  // This operation removes an info field from the incoming Variant
  // and persists this info field in each of the incoming Variant's Calls.
  MOVE_TO_CALLS = 2;
}
