diff --git a/README.md b/README.md index c8abf0b..c025515 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Quick getting started. 1) Get the data for a PDB structure and print the number of chains: ```java -StructureDataInterface dataInterface = new GenericDecoder(ReaderUtils.getDataFromUrl("4cup")); +StructureDataInterface dataInterface = new GenericDecoder(ReaderUtils.getDataFromUrl("4CUP")); System.out.println("PDB Code: "+dataInterface.getStructureId()+" has "+dataInterface.getNumChains()+" chains"); ``` diff --git a/mmtf-codec/src/main/java/org/rcsb/mmtf/decoder/DecoderUtils.java b/mmtf-codec/src/main/java/org/rcsb/mmtf/decoder/DecoderUtils.java index 40cd04e..d349e36 100644 --- a/mmtf-codec/src/main/java/org/rcsb/mmtf/decoder/DecoderUtils.java +++ b/mmtf-codec/src/main/java/org/rcsb/mmtf/decoder/DecoderUtils.java @@ -66,12 +66,6 @@ public static void addXtalographicInfo(StructureDataInterface dataApi, Structure */ public static void addEntityInfo(StructureDataInterface dataApi, StructureAdapterInterface structInflator) { for (int i=0; i entities; /** The total number of bonds in the structure */ private int totalNumBonds; /** The list of groups */ private List pdbGroupList; /** The NCS operation matrix list */ private double[][] ncsOperMatrixList; + + /** Temporary list of entities */ + private transient List entities; @Override @@ -413,10 +414,10 @@ public String getDepositionDate() { public void initStructure(int totalNumBonds, int totalNumAtoms, int totalNumGroups, int totalNumChains, int totalNumModels, String structureId) { this.totalNumBonds = totalNumBonds; - // Intitialise the bond level info + // Initialize the bond level info interGroupBondIndices = new ArrayList<>(); interGroupBondOrders = new ArrayList<>(); - // Intitialise the atom level arrays + // Initialize the atom level arrays cartnX = new float[totalNumAtoms]; cartnY= new float[totalNumAtoms]; cartnZ = new float[totalNumAtoms]; @@ -424,37 +425,42 @@ public void initStructure(int totalNumBonds, int totalNumAtoms, int totalNumGrou bFactor = new float[totalNumAtoms]; atomId = new int[totalNumAtoms]; altId = new char[totalNumAtoms]; - // Initialise the group level data + // Initialize the group level data groupNum = new int[totalNumGroups]; - // List for storing the group level information - pdbGroupList = new ArrayList<>(); insertionCodeList = new char[totalNumGroups]; seqResGroupList = new int[totalNumGroups]; secStructInfo = new int[totalNumGroups]; - // Intialise the chain level data + // List for storing the group level information + pdbGroupList = new ArrayList<>(); + // Initialize the chain level data chainList = new String[totalNumChains]; publicChainIds = new String[totalNumChains]; groupsPerChain = new int[totalNumChains]; - // Initialise the model level information + // Initialize the model level information numModels = totalNumModels; // Set the name pdbId = structureId; bioAssembly = new ArrayList<>(); - entities = new ArrayList<>(); chainsPerModel = new int[totalNumModels]; + + // temporary data structure + entities = new ArrayList<>(); } @Override public void finalizeStructure() { // Convert the entities array to a list entityList = entities.toArray(new Entity[0]); + // clear temporary data structure to avoid "memory leak" + entities.clear(); + // Cleanup the group list groupMap = new ArrayList<>(new HashSet<>(pdbGroupList)); groupList = new int[pdbGroupList.size()]; for(int i=0; i interGroupBondsToAdd = new ArrayList<>(); - List interGroupRedIndsToAdd = new ArrayList<>(); - for (int i=0; i atomIndicesToAdd = getIndicesToAdd(structureDataInterface, groupType, chainType); - int bondsToAdd = findBondsToAdd(atomIndicesToAdd, structureDataInterface, groupType,atomCounter+1); - // If there's an atom to add in this group - add it - if(atomIndicesToAdd.size()>0){ - adapterToStructureData.setGroupInfo(structureDataInterface.getGroupName(groupType), structureDataInterface.getGroupIds()[groupCounter], - structureDataInterface.getInsCodes()[groupCounter], structureDataInterface.getGroupChemCompType(groupType), atomIndicesToAdd.size(), - bondsToAdd, structureDataInterface.getGroupSingleLetterCode(groupType), structureDataInterface.getGroupSequenceIndices()[groupCounter], - structureDataInterface.getSecStructList()[groupCounter]); - numGroups++; + public static StructureDataInterface getReduced(StructureDataInterface full) { + // maps atom indices in full structure to reduced structure + Map atomMap = new HashMap<>(); + + // get indices to C-alpha and P atoms for polypeptides and polynucleotides, respectively + Integer[] centerAtomIndices = getCenterAtomGroupIndices(full); + + // Set header and metadata + AdapterToStructureData reduced = new AdapterToStructureData(); + + reduced.setMmtfProducer(full.getMmtfProducer()); + SummaryData dataSummary = getDataSummaryData(full, centerAtomIndices); + reduced.initStructure(dataSummary.numBonds, dataSummary.numAtoms, dataSummary.numGroups, + dataSummary.numChains, full.getNumModels(), full.getStructureId()); + + DecoderUtils.addXtalographicInfo(full, reduced); + DecoderUtils.addHeaderInfo(full, reduced); + DecoderUtils.generateBioAssembly(full, reduced); + DecoderUtils.addEntityInfo(full, reduced); + + // traverse data structure and copy data to reduced representation. + // Note, atomCount, groupCount, and chainCount keep track of the total number of atoms, groups, and chains. + // They are required to index the data structure. + + for (int i = 0, atomCount = 0, groupCount = 0, chainCount = 0, reducedAtomCount = -1; i atomIndicesToAdd = getIndicesToAdd(full, groupType, chainType, centerAtomIndices); + int bondsToAdd = getNumIntraGroupBonds(atomIndicesToAdd, full, groupType, centerAtomIndices); + + if (atomIndicesToAdd.size() > 0) { + + // Set Group information + reduced.setGroupInfo(full.getGroupName(groupType), full.getGroupIds()[groupCount], + full.getInsCodes()[groupCount], full.getGroupChemCompType(groupType), atomIndicesToAdd.size(), + bondsToAdd, full.getGroupSingleLetterCode(groupType), full.getGroupSequenceIndices()[groupCount], + full.getSecStructList()[groupCount]); + + reducedGroupsPerChain ++; } - for(int l=0; l0){ - for(int l=0; l 0){ + + // Set bond information + for(int l=0; l atomMap) { + + for (int i = 0; i < full.getInterGroupBondOrders().length; i++) { + int bondIndOne = full.getInterGroupBondIndices()[i*2]; + int bondIndTwo = full.getInterGroupBondIndices()[i*2+1]; + int bondOrder = full.getInterGroupBondOrders()[i]; + + // some atoms may not exist in the reduced structure. + // check the atom map to see if both atoms of a bond still exist. + Integer indexOne = atomMap.get(bondIndOne); + + if (indexOne != null) { + Integer indexTwo = atomMap.get(bondIndTwo); + if (indexTwo != null) { + reduced.setInterGroupBond(indexOne, indexTwo, bondOrder); + } } } - adapterToStructureData.finalizeStructure(); - // Return the AdapterToStructureData - return adapterToStructureData; } /** - * Find if bonds need adding - to be used in later processing. + * Gets the number of intramolecular bonds for a specified group type. * @param indicesToAdd the indices of the atoms to add * @param structureDataInterface the {@link StructureDataInterface} of the total structure * @param groupType the index of the groupType - * @param atomCounter the current atom counter position * @return the integer number of bonds to add */ - private static int findBondsToAdd(List indicesToAdd, StructureDataInterface structureDataInterface, int groupType, int atomCounter) { - // Add the bonds if we've copied all the elements - int interGroupBonds = 0; - if(indicesToAdd.size()>1){ - if (structureDataInterface.getGroupChemCompType(groupType).toUpperCase().contains("SACCHARIDE")){ - for(int i=0; i indicesToAdd, StructureDataInterface structureDataInterface, int groupType, Integer[] centerAtomIndices) { + + if (indicesToAdd.size() == 1 && centerAtomIndices[groupType] != null) { + // in case there is only 1 atom (c-Alpha or P) and it's in a polymer, there cannot be any bonds + return 0; + } else if (indicesToAdd.size() == 0) { + return 0; + } else { + return structureDataInterface.getGroupBondOrders(groupType).length; } - return 0; } - - - /** - * Get the number of bonds, atoms and groups as a map. + * Gets the number of chains, groups, atoms, and bonds in the reduced structure * @param structureDataInterface the input {@link StructureDataInterface} * @return the {@link SummaryData} object describing the data */ - private static SummaryData getDataSummaryData(StructureDataInterface structureDataInterface) { + private static SummaryData getDataSummaryData(StructureDataInterface structureDataInterface, Integer[] centerAtomIndices) { SummaryData summaryData = new SummaryData(); summaryData.numChains = 0; summaryData.numGroups = 0; summaryData.numAtoms = 0; summaryData.numBonds = 0; - int groupCounter = -1; - int chainCounter=-1; - int atomCounter = 0; - for (int i=0; i indicesToAdd = getIndicesToAdd(structureDataInterface, groupType, chainType); - // If there's an atom to add in this group - add it - if(indicesToAdd.size()>0){ + String chainType = EncoderUtils.getTypeFromChainId(structureDataInterface, chainCount); + + for (int k = 0; k < structureDataInterface.getGroupsPerChain()[chainCount]; k++, groupCount++){ + int groupType = structureDataInterface.getGroupTypeIndices()[groupCount]; + Set indicesToAdd = getIndicesToAdd(structureDataInterface, groupType, chainType, centerAtomIndices); + + if (indicesToAdd.size() > 0) { summaryData.numGroups++; } - for(int l=0; l getIndicesToAdd(StructureDataInterface structureDataInterface, int groupType, - String chainType) { - // The list to return - List outList = new ArrayList<>(); + private static Set getIndicesToAdd(StructureDataInterface structure, int groupIndex, + String chainType, Integer[] centerAtomIndices) { + + Set atomIndices = Collections.emptySet(); + + Integer atomIndex = centerAtomIndices[groupIndex]; + // Get chain type - if(chainType.equals("polymer")){ - for(int i=0; i(structure.getNumAtomsInGroup(groupIndex)); + for(int i = 0; i < structure.getNumAtomsInGroup(groupIndex); i++) { + atomIndices.add(i); } } - } - // Check if it's a non-polymer - else if (chainType.equals("non-polymer")){ - for(int i=0; i(structure.getNumAtomsInGroup(groupIndex)); + for (int i = 0; i < structure.getNumAtomsInGroup(groupIndex); i++){ + atomIndices.add(i); } } - else if(chainType.equals("water")){ - // We skip water - } - else{ - System.err.println("Unrecoginised entity type: "+chainType); - } - return outList; + + return atomIndices; } + /** + * Returns an index to the position to the C-alpha atom in a group with the specified group index. + * @param structureDataInterface + * @param groupIndex index of group + * @return index of C-alpha atom if present, otherwise null + */ + private static Integer indexOfcAlpha(StructureDataInterface structureDataInterface, int groupIndex) { + for(int i = 0; i pdbIds = Arrays.asList("173D","1AA6","1AUY","1BNA","1CAG","1IGT", + "1L2Q","1LPV","1MSH","1O2F","1SKM","1O2F","1SKM","3NJW","3ZYB","4CK4", + "4CUP", "4OPJ","4P3R","4QXX","4V5A","4Y60","5EMG","5ESW","5MNX"); + + for (String pdbId: pdbIds) { + StructureDataInterface full = getDefaultFullData(pdbId); + StructureDataInterface reduced = ReducedEncoder.getReduced(getDefaultFullData(pdbId)); + compareFullVsReduced(full.getStructureId(), full, reduced); + } + } + + // check + // spacegroup for NMR structure P1 + // + private static void compareFullVsReduced(String structureId, StructureDataInterface full, StructureDataInterface reduced) { + compareMetaData(structureId, full, reduced); + compareAtomData(structureId, full, reduced); + compareUnitCellData(structureId, full, reduced); + compareBioAssemblyData(structureId, full, reduced); + compareChainData(structureId, full, reduced); + compareGroupData(structureId, full, reduced); + compareInterBondData(structureId, full, reduced); + } + + private static void compareMetaData(String structureId, StructureDataInterface full, StructureDataInterface reduced) { + assertEquals(structureId + ":Entities", full.getNumEntities(), reduced.getNumEntities()); + assertEquals(structureId + ":Models", full.getNumModels(), reduced.getNumModels()); + assertEquals(structureId + ":DepositionDate", full.getDepositionDate(), reduced.getDepositionDate()); + assertEquals(structureId + ":ReleaseDate", full.getReleaseDate(), reduced.getReleaseDate()); + assertEquals(structureId + ":MmtfProducer", full.getMmtfProducer(), reduced.getMmtfProducer()); + assertEquals(structureId + ":MmtfVersion", full.getMmtfVersion(), reduced.getMmtfVersion()); + assertEquals(structureId + ":Resolution", full.getResolution(), reduced.getResolution(), 0.001); + assertEquals(structureId + ":Rfree", full.getRfree(), reduced.getRfree(), 0.001); + assertEquals(structureId + ":Rwork", full.getRwork(), reduced.getRwork(), 0.001); + assertEquals(structureId + ":StructureId", full.getStructureId(), reduced.getStructureId()); + assertArrayEquals(structureId + ":ExperimentalMethods", full.getExperimentalMethods(), reduced.getExperimentalMethods()); + } + + private static void compareAtomData(String structureId, StructureDataInterface full, StructureDataInterface reduced) { + assertEquals(structureId + ":NumAtoms", reduced.getNumAtoms(), reduced.getxCoords().length); + assertEquals(structureId + ":NumAtoms", reduced.getNumAtoms(), reduced.getyCoords().length); + assertEquals(structureId + ":NumAtoms", reduced.getNumAtoms(), reduced.getzCoords().length); + assertEquals(structureId + ":NumAtoms", reduced.getNumAtoms(), reduced.getbFactors().length); + assertEquals(structureId + ":NumAtoms", reduced.getNumAtoms(), reduced.getAltLocIds().length); + assertEquals(structureId + ":NumAtoms", reduced.getNumAtoms(), reduced.getAtomIds().length); + } + + private static void compareBioAssemblyData(String structureId, StructureDataInterface full, StructureDataInterface reduced) { + assertEquals(structureId + ":NumBioassemblies", full.getNumBioassemblies(), reduced.getNumBioassemblies()); + + for (int i = 0; i < full.getNumBioassemblies(); i++) { + assertEquals(structureId + ":BioassemblyName", full.getBioassemblyName(i), reduced.getBioassemblyName(i)); + assertEquals(structureId + ":NumTransInBioassembly", full.getNumTransInBioassembly(i), reduced.getNumTransInBioassembly(i)); + + for (int j = 0; j < full.getNumTransInBioassembly(i); j++) { + assertArrayEquals(structureId + ":MatrixForTransform", full.getMatrixForTransform(i, j), reduced.getMatrixForTransform(i, j), 0.00001); + assertArrayEquals(structureId + ":ChainIndexListForTransform", full.getChainIndexListForTransform(i, j), reduced.getChainIndexListForTransform(i, j)); + } + } + } + + private static void compareUnitCellData(String structureId, StructureDataInterface full, StructureDataInterface reduced) { + // TODO missing, null for NMR + if (full.getUnitCell() != null || reduced.getUnitCell() != null) { + assertEquals(structureId + ":SpaceGroup", full.getSpaceGroup(), reduced.getSpaceGroup()); + assertArrayEquals(structureId + ":UnitCell", full.getUnitCell(), reduced.getUnitCell(), 0.0001f); + if (full.getNcsOperatorList() != null) { + for (int i = 0; i < full.getNcsOperatorList().length; i++) { + assertArrayEquals(structureId + ":NcsOperatorList", full.getNcsOperatorList()[i], reduced.getNcsOperatorList()[i], 0.0001); + } + } + } + } + + private static void compareChainData(String structureId, StructureDataInterface full, StructureDataInterface reduced) { + assertArrayEquals(structureId + "ChainNames", full.getChainNames(), reduced.getChainNames()); + assertArrayEquals(structureId + "ChainIds", full.getChainIds(), reduced.getChainIds()); + assertArrayEquals(structureId + "ChainsPerModel", full.getChainsPerModel(), reduced.getChainsPerModel()); + } + + private static void compareGroupData(String structureId, StructureDataInterface full, StructureDataInterface reduced) { + List traceNames = Arrays.asList("CA","P"); + + // this checks only first model, since the data are interleaved for multiple models, they cannot be compared directly + int n = reduced.getNumGroups()/reduced.getNumModels(); + assertArrayEquals(structureId + ":GroupIds", Arrays.copyOf(full.getGroupIds(),n), Arrays.copyOf(reduced.getGroupIds(),n)); + assertTrue(structureId + ":GroupSequenceIndices", full.getGroupSequenceIndices().length >= reduced.getGroupSequenceIndices().length); + assertArrayEquals(structureId + ":GroupSequenceIndices", Arrays.copyOf(full.getGroupSequenceIndices(),n), Arrays.copyOf(reduced.getGroupSequenceIndices(),n)); + assertEquals(structureId + ":NumGroups", full.getNumGroups(), full.getGroupSequenceIndices().length); + assertEquals(structureId + ":NumGroups", reduced.getNumGroups(), reduced.getGroupSequenceIndices().length); + assertEquals(structureId + ":NumGroups", full.getNumGroups(), full.getGroupTypeIndices().length); + assertEquals(structureId + ":NumGroups", reduced.getNumGroups(), reduced.getGroupTypeIndices().length); + + for (int i = 0; i < reduced.getNumGroups()/reduced.getNumModels(); i++) { + int fId = full.getGroupTypeIndices()[i]; + int rId = reduced.getGroupTypeIndices()[i]; + + assertEquals(structureId + ":GroupChemCompType", full.getGroupChemCompType(fId), reduced.getGroupChemCompType(rId)); + assertEquals(structureId + ":GroupName", full.getGroupName(fId), reduced.getGroupName(rId)); + assertEquals(structureId + ":GroupSingleLetterCode", full.getGroupSingleLetterCode(fId), reduced.getGroupSingleLetterCode(rId)); + + // there will be fewer atoms and bonds per group for peptide and nucleotide groups + assertTrue(structureId + ":NumAtomsInGroup", full.getNumAtomsInGroup(fId) >= reduced.getNumAtomsInGroup(rId)); + assertTrue(structureId + ":GroupAtomCharges", full.getGroupAtomCharges(fId).length >= reduced.getGroupAtomCharges(rId).length); + assertTrue(structureId + ":GroupAtomNames", full.getGroupAtomNames(fId).length >= reduced.getGroupAtomNames(rId).length); + assertTrue(structureId + ":GroupElementNames", full.getGroupElementNames(fId).length >= reduced.getGroupElementNames(rId).length); + + // if number of atoms per group are the same, then these data must be identical + if (full.getNumAtomsInGroup(fId) == reduced.getNumAtomsInGroup(rId)) { + assertArrayEquals(structureId + ":GroupAtomCharges", full.getGroupAtomCharges(fId), reduced.getGroupAtomCharges(rId)); + assertArrayEquals(structureId + ":GroupAtomNames", full.getGroupAtomNames(fId), reduced.getGroupAtomNames(rId)); + } else { + assertTrue(structureId + ":GroupAtomNames", traceNames.containsAll(Arrays.asList(reduced.getGroupAtomNames(rId)))); + } + + assertTrue(structureId + ":GroupBondIndices", full.getGroupBondIndices(fId).length >= reduced.getGroupBondIndices(rId).length); + assertTrue(structureId + ":GroupBondOrders", full.getGroupBondOrders(fId).length >= reduced.getGroupBondOrders(rId).length); + + // for all other groups, the bond info should be identical + if (full.getGroupBondIndices(fId).length == reduced.getGroupBondIndices(rId).length) { + assertArrayEquals(structureId + ":GroupBondIndices", full.getGroupBondIndices(fId), reduced.getGroupBondIndices(rId)); + for (int bo: reduced.getGroupBondOrders(rId)) { + assertTrue(structureId + ":GroupBondOrders", bo >0 && bo < 5); + } + assertArrayEquals(structureId + ":GroupBondOrders", full.getGroupBondOrders(fId), reduced.getGroupBondOrders(rId)); + } + } + } + + private static void compareInterBondData(String structureId, StructureDataInterface full, StructureDataInterface reduced) { + assertTrue(structureId + ":InterGroupBondIndices", full.getInterGroupBondIndices().length >= reduced.getInterGroupBondIndices().length); + assertTrue(structureId + ":InterGroupBondOrder", full.getInterGroupBondOrders().length >= reduced.getInterGroupBondOrders().length); + for (int bo: reduced.getInterGroupBondOrders()) { + assertTrue(structureId + ":InterGroupBondOrders", bo >0 && bo < 5); + } + } + + /** + * Gets the default data for the full format. + * @return a {@link StructureDataInterface} for the full data. + * @throws IOException + */ + private StructureDataInterface getDefaultFullData(String pdbId) throws IOException, ParseException { + Path p = Utils.getResource("/mmtf/" + pdbId + ".mmtf"); + return new GenericDecoder(ReaderUtils.getDataFromFile(p)); + } +} diff --git a/mmtf-codec/src/test/resources/mmtf/173D.mmtf b/mmtf-codec/src/test/resources/mmtf/173D.mmtf new file mode 100644 index 0000000..0261fa6 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/173D.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/1AA6.mmtf b/mmtf-codec/src/test/resources/mmtf/1AA6.mmtf new file mode 100644 index 0000000..b8d575a Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/1AA6.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/1AUY.mmtf b/mmtf-codec/src/test/resources/mmtf/1AUY.mmtf new file mode 100644 index 0000000..d7ab88d Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/1AUY.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/1BNA.mmtf b/mmtf-codec/src/test/resources/mmtf/1BNA.mmtf new file mode 100644 index 0000000..2250984 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/1BNA.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/1CAG.mmtf b/mmtf-codec/src/test/resources/mmtf/1CAG.mmtf new file mode 100644 index 0000000..33cc729 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/1CAG.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/1IGT.mmtf b/mmtf-codec/src/test/resources/mmtf/1IGT.mmtf new file mode 100644 index 0000000..842875e Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/1IGT.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/1L2Q.mmtf b/mmtf-codec/src/test/resources/mmtf/1L2Q.mmtf new file mode 100644 index 0000000..5f38798 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/1L2Q.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/1LPV.mmtf b/mmtf-codec/src/test/resources/mmtf/1LPV.mmtf new file mode 100644 index 0000000..09c716e Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/1LPV.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/1MSH.mmtf b/mmtf-codec/src/test/resources/mmtf/1MSH.mmtf new file mode 100644 index 0000000..c0517ed Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/1MSH.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/1O2F.mmtf b/mmtf-codec/src/test/resources/mmtf/1O2F.mmtf new file mode 100644 index 0000000..549f4f4 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/1O2F.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/1SKM.mmtf b/mmtf-codec/src/test/resources/mmtf/1SKM.mmtf new file mode 100644 index 0000000..eb34f9b Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/1SKM.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/3NJW.mmtf b/mmtf-codec/src/test/resources/mmtf/3NJW.mmtf new file mode 100644 index 0000000..61ae301 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/3NJW.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/3ZYB.mmtf b/mmtf-codec/src/test/resources/mmtf/3ZYB.mmtf new file mode 100644 index 0000000..1e5d435 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/3ZYB.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/4CK4.mmtf b/mmtf-codec/src/test/resources/mmtf/4CK4.mmtf new file mode 100644 index 0000000..3524826 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/4CK4.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/4cup.mmtf b/mmtf-codec/src/test/resources/mmtf/4CUP.mmtf similarity index 100% rename from mmtf-codec/src/test/resources/mmtf/4cup.mmtf rename to mmtf-codec/src/test/resources/mmtf/4CUP.mmtf diff --git a/mmtf-codec/src/test/resources/mmtf/4OPJ.mmtf b/mmtf-codec/src/test/resources/mmtf/4OPJ.mmtf new file mode 100644 index 0000000..6f69ed9 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/4OPJ.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/4P3R.mmtf b/mmtf-codec/src/test/resources/mmtf/4P3R.mmtf new file mode 100644 index 0000000..9348843 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/4P3R.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/4QXX.mmtf b/mmtf-codec/src/test/resources/mmtf/4QXX.mmtf new file mode 100644 index 0000000..2cd27a4 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/4QXX.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/4V5A.mmtf b/mmtf-codec/src/test/resources/mmtf/4V5A.mmtf new file mode 100644 index 0000000..1a3e4c6 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/4V5A.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/4Y60.mmtf b/mmtf-codec/src/test/resources/mmtf/4Y60.mmtf new file mode 100644 index 0000000..f1c33d1 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/4Y60.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/5EMG.mmtf b/mmtf-codec/src/test/resources/mmtf/5EMG.mmtf new file mode 100644 index 0000000..6567b26 Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/5EMG.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/5ESW.mmtf b/mmtf-codec/src/test/resources/mmtf/5ESW.mmtf new file mode 100644 index 0000000..9bfcacc Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/5ESW.mmtf differ diff --git a/mmtf-codec/src/test/resources/mmtf/5MNX.mmtf b/mmtf-codec/src/test/resources/mmtf/5MNX.mmtf new file mode 100644 index 0000000..56dd1ff Binary files /dev/null and b/mmtf-codec/src/test/resources/mmtf/5MNX.mmtf differ