* @return null or bs
	 */
	private BitSet getIdentifierOrNull(String identifier) {
		// a primitive lookup scheme when [ ] are not used
		// nam
		// na?
		// nam45
		// nam45C
		// nam45^
		// nam45^A
		// nam45^AC -- note, no colon here -- if present, handled separately
		// nam4? does NOT match anything for PDB files, but might for others
		// atom specifiers:
		// H?
		// H32
		// H3?

		// in the case of a ?, we take the whole thing

		BitSet bs = getSpecNameOrNull(identifier);
		if (bs != null || identifier.indexOf("?") > 0)
			return bs;

		int pt = identifier.indexOf("*");
		if (pt > 0)
			return getSpecNameOrNull(identifier.substring(0, pt) + "??????????" + identifier.substring(pt + 1));
		int len = identifier.length();
		pt = 0;
		while (pt < len && Character.isLetter(identifier.charAt(pt)))
			++pt;
		bs = getSpecNameOrNull(identifier.substring(0, pt));
		if (pt == len)
			return bs;
		if (bs == null)
			bs = new BitSet();
		//
		// look for a sequence number or sequence number ^ insertion code
		//
		int pt0 = pt;
		while (pt < len && Character.isDigit(identifier.charAt(pt)))
			++pt;
		int seqNumber = 0;
		try {
			seqNumber = Integer.parseInt(identifier.substring(pt0, pt));
		}
		catch (NumberFormatException nfe) {
			return null;
		}
		char insertionCode = ' ';
		if (pt < len && identifier.charAt(pt) == '^')
			if (++pt < len)
				insertionCode = identifier.charAt(pt);
		int seqcode = Group.getSeqcode(seqNumber, insertionCode);
		BitSet bsInsert = getSpecSeqcode(seqcode, false);
		if (bsInsert == null) {
			if (insertionCode != ' ')
				bsInsert = getSpecSeqcode(Character.toUpperCase(identifier.charAt(pt)), false);
			if (bsInsert == null)
				return null;
			pt++;
		}
		bs.and(bsInsert);
		if (pt >= len)
			return bs;
		//
		// look for a chain spec -- no colon
		//
		char chainID = identifier.charAt(pt++);
		bs.and(getSpecChain(chainID));
		if (pt == len)
			return bs;
		//
		// not applicable
		//
		return null;
	}