package IMP;
option optimize_for = LITE_RUNTIME;

message Reference {
  repeated string author=1;
  required string title=2;
  required string journal=3;
  required uint32 year=4;
}

message Color {
  required float red=1;
  required float green=2;
  required float blue=3;
}

message Coordinates {
  required double x=1;
  required double y=2;
  required double z=3;
}

message Label {
  required string text=1;
  required Coordinates coordinates=2;
  optional float standoff=3;
}

message Geometry {
  optional string name=1;
  repeated Coordinates vertex=2;
  // -1 delimited faces
  repeated int32 face=3 [packed=true];
  // -1 delimited edges
  repeated int32 edge=4 [packed=true];
  // positive values if the edge should be a cylinder
  repeated float edge_radius=6 [packed=true];
  // a positive value for anything that should be displayed as a ball
  repeated float vertex_radius=5 [packed=true];
  repeated Geometry geometry=7;
  repeated Label label=8;
}

message Structure {
  message RepresentationID {
    required uint32 id=1;
  }

  message Representation {
    required uint32 id = 1;
    // store the pdb name for atoms or tlc for residues
    // or anything else for other things
    optional string name = 2;
    // the sequence as one letter codes
    optional string sequence =11;
    optional Coordinates coordinates =3;
    optional double radius =6;
    //repeated uint32 children= 8 [packed=true];
    optional RepresentationID parent =9;
    optional double mass= 10;
    optional uint32 element=13;
    // say 0 for none, 1 for helix, 2 for beta
    optional uint32 secondary_structure=17;
    repeated uint32 residue_index=14 [packed=true];
    optional Color color=15;
    optional Geometry geometry=16;
  }

  message Bond {
    required uint32 id=1;
    optional uint32 type=2;
    repeated RepresentationID endpoint=3;  
  }


  message Feature {
    required uint32 id=1;
    required string name=2;
    repeated RepresentationID representation=3;
    optional float value=4;
    optional Color color=5;
  }

  repeated Representation representation=1;
  repeated Bond bond=2;
  optional Reference reference=3;
  repeated Feature feature=4;
}
message File {
  repeated Structure structure=1;
  optional Reference reference=3;
}