void initializeBspf() {
		if (bspf == null) {
			long timeBegin = 0;
			if (showRebondTimes)
				timeBegin = System.currentTimeMillis();
			bspf = new Bspf(3);
			if (MIX_BSPT_ORDER) {
				Logger.debug("mixing bspt order");
				int stride = 3;
				int step = (atomCount + stride - 1) / stride;
				for (int i = 0; i < step; ++i)
					for (int j = 0; j < stride; ++j) {
						int k = i * stride + j;
						if (k >= atomCount)
							continue;
						Atom atom = atoms[k];
						if (!atom.isDeleted())
							bspf.addTuple(atom.modelIndex, atom);
					}
			}
			else {
				Logger.debug("sequential bspt order");
				for (int i = atomCount; --i >= 0;) {
					Atom atom = atoms[i];
					if (!atom.isDeleted())
						bspf.addTuple(atom.modelIndex, atom);
				}
			}
			if (showRebondTimes) {
				long timeEnd = System.currentTimeMillis();
				Logger.debug("time to build bspf=" + (timeEnd - timeBegin) + " ms");
				bspf.stats();
				// bspf.dump();
			}
		}
	}