docs: def ball_and_sticks(self, ball_radius=0.05, stick_radius=0.02, colorlist=None, opacity=1.0):
          """Display the system using a ball and stick representation.
          """
  
          # Add the spheres
  
          if colorlist is None:
              colorlist = [get_atom_color(t) for t in self.topology['atom_types']]
          sizes = [ball_radius] * len(self.topology['atom_types'])
  
          spheres = self.add_representation('spheres', {'coordinates': self.coordinates.astype('float32'),
                                                        'colors': colorlist,
                                                        'radii': sizes,
                                                        'opacity': opacity})
  
          def update(self=self, spheres=spheres):
              self.update_representation(spheres, {'coordinates': self.coordinates.astype('float32')})
  
          self.update_callbacks.append(update)
  
          # Add the cylinders
  
          if 'bonds' in self.topology and self.topology['bonds'] is not None:
              start_idx, end_idx = zip(*self.topology['bonds'])
              # Added this so bonds don't go through atoms when opacity<1.0
              new_start_coords = []
              new_end_coords = []
              for bond_ind, bond in enumerate(self.topology['bonds']):
                  trim_amt = (ball_radius**2 - stick_radius**2)**0.5 if ball_radius>stick_radius else 0
                  start_coord = self.coordinates[bond[0]]
                  end_coord = self.coordinates[bond[1]]
                  vec = (end_coord-start_coord)/np.linalg.norm(end_coord-start_coord)
                  new_start_coords.append(start_coord+vec*trim_amt)
                  new_end_coords.append(end_coord-vec*trim_amt)
  
              cylinders = self.add_representation('cylinders', {'startCoords': np.array(new_start_coords,dtype='float32'),
                                                    'endCoords': np.array(new_end_coords,dtype='float32'),
                                                    'colors': [0xcccccc] * len(new_start_coords),
                                                    'radii': [stick_radius] * len(new_start_coords),
                                                    'opacity': opacity})
              # Update closure
              def update(self=self, rep=cylinders, start_idx=start_idx, end_idx=end_idx):
                  self.update_representation(rep, {'startCoords': self.coordinates[list(start_idx)],
                                                   'endCoords': self.coordinates[list(end_idx)]})
  
              self.update_callbacks.append(update)
          self.autozoom(self.coordinates)