public void loadPDBInfo(final TaskMonitor monitor, final CyNetwork network, String idColumn,
	                        final List<CyIdentifiable> ids) {
		Map<CyIdentifiable, List<String>> idMap = getIdentifiers(network, idColumn, ids);
		if (idMap == null || idMap.size() == 0) return;

		// Get the valid IDs from the PDB
		monitor.setStatusMessage("Validating PDB IDs");
		Map<String, CyIdentifiable> reverseMap = new HashMap<String, CyIdentifiable>();
		String queryString = NetUtils.buildPDBQuery(reverseMap, idMap);
		try {
			NetUtils.validatePDBIds(queryString, reverseMap);
		} catch (Exception e) {
			monitor.showMessage(TaskMonitor.Level.ERROR, "Failed to validate PDB IDs: "+e.getMessage());
			return;
		}

		// Now, we know that all of the IDs in the reverseMap are valid PDB IDs.  Now get the
		// chains for each ID
		queryString = NetUtils.buildPDBQuery(reverseMap);
		try {
			// This will get all of the chains from PDB and give us a new
			// map that goes from chains to CyIdentifiable
			pdbChainMap = new HashMap<CyIdentifiable, List<PDBStructure>>();
			reverseMap = NetUtils.getPDBChains(queryString, reverseMap, pdbChainMap);
		} catch (Exception e) {
			e.printStackTrace();
			monitor.showMessage(TaskMonitor.Level.ERROR, "Failed to get PDB Chains: "+e.getMessage());
			return;
		}

		// Clear out our maps that we're going to override
		for (CyIdentifiable cyId: pdbChainMap.keySet()) {
			hitMap.remove(cyId);
			featureMap.remove(cyId);
		}

		// Now we can actually query the CDD
		queryString = NetUtils.buildCDDQuery(reverseMap);
		loadCDDInfo(monitor, network, queryString, reverseMap);

		// Finally, update our pointer to the PDB column
		PDBStructure.updatePDBColumn(network, idColumn);
	}