// 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/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 = "ReadGroupProto";
option java_package = "com.google.genomics.v1";


// A read group is all the data that's processed the same way by the sequencer.
message ReadGroup {
  message Experiment {
    // A client-supplied library identifier; a library is a collection of DNA
    // fragments which have been prepared for sequencing from a sample. This
    // field is important for quality control as error or bias can be introduced
    // during sample preparation.
    string library_id = 1;

    // The platform unit used as part of this experiment, for example
    // flowcell-barcode.lane for Illumina or slide for SOLiD. Corresponds to the
    // @RG PU field in the SAM spec.
    string platform_unit = 2;

    // The sequencing center used as part of this experiment.
    string sequencing_center = 3;

    // The instrument model used as part of this experiment. This maps to
    // sequencing technology in the SAM spec.
    string instrument_model = 4;
  }

  message Program {
    // The command line used to run this program.
    string command_line = 1;

    // The user specified locally unique ID of the program. Used along with
    // `prevProgramId` to define an ordering between programs.
    string id = 2;

    // The display name of the program. This is typically the colloquial name of
    // the tool used, for example 'bwa' or 'picard'.
    string name = 3;

    // The ID of the program run before this one.
    string prev_program_id = 4;

    // The version of the program run.
    string version = 5;
  }

  // The server-generated read group ID, unique for all read groups.
  // Note: This is different than the @RG ID field in the SAM spec. For that
  // value, see [name][google.genomics.v1.ReadGroup.name].
  string id = 1;

  // The dataset to which this read group belongs.
  string dataset_id = 2;

  // The read group name. This corresponds to the @RG ID field in the SAM spec.
  string name = 3;

  // A free-form text description of this read group.
  string description = 4;

  // A client-supplied sample identifier for the reads in this read group.
  string sample_id = 5;

  // The experiment used to generate this read group.
  Experiment experiment = 6;

  // The predicted insert size of this read group. The insert size is the length
  // the sequenced DNA fragment from end-to-end, not including the adapters.
  int32 predicted_insert_size = 7;

  // The programs used to generate this read group. Programs are always
  // identical for all read groups within a read group set. For this reason,
  // only the first read group in a returned set will have this field
  // populated.
  repeated Program programs = 10;

  // The reference set the reads in this read group are aligned to.
  string reference_set_id = 11;

  // A map of additional read group 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 = 12;
}
