protected MacrocycleAnalysis(List <Atom> atoms, IEnumerable <Bond> bonds)
 {
     Atoms = atoms;
     Bonds = bonds;
     _guid = Guid.NewGuid();
     //set special atoms
     _cachedNeighbors = AtomUtil.BuildNeighborCache(Atoms, Bonds);
     Alpha            = Atoms.Where(IsAlpha).ToList();
     Beta             = Atoms.Where(s => Neighbors(s).Count == 2 && Neighbors(s).Count(IsAlpha) == 1).ToList();
     N4Cavity         = Atoms.Where(s => Neighbors(s).Where(IsAlpha).Count(n => DFSUtil.BackTrack(n, s, Neighbors, 5).Count == 5) == 2)
                        .ToList();
     Meso = Atoms.Except(Alpha).Except(Beta).Except(N4Cavity).ToList();
 }