public Sample copy(boolean copyAdditionalIDs) {
    Sample newSample = new Sample();

    newSample.modelNodeToDataNode = new HashMap<Integer, Integer>();
    newSample.dataNodeToModelNode = new HashMap<Integer, Integer>();
    newSample.dataIDToDataNodeID = new HashMap<String, Integer>();
    newSample.relationshipIDs = new HashMap<String, RelationshipForSample>();

    newSample.mismatch = this.mismatch;
    newSample.mnmrReference = this.mnmrReference;
    newSample.mnmrSet = this.mnmrSet;
    newSample.additionalRelationshipIDs = new HashMap<String, ArrayList<String>>();
    newSample.ID = this.ID;

    if (copyAdditionalIDs) {
      newSample.hasAdditionalIDs = this.hasAdditionalIDs;
      newSample.additionalIDCount = this.additionalIDCount;
      copyHashMap(this.additionalRelationshipIDs, newSample.additionalRelationshipIDs);
    }

    copyHashMap(this.dataIDToDataNodeID, newSample.dataIDToDataNodeID);
    copyHashMap(this.dataNodeToModelNode, newSample.dataNodeToModelNode);
    copyHashMap(this.relationshipIDs, newSample.relationshipIDs);
    copyHashMap(this.modelNodeToDataNode, newSample.modelNodeToDataNode);

    return newSample;
  }