<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def from_start_and_end(cls, start, end, aa=None, helix_type='alpha'):
 """Creates a `Helix` between `start` and `end`. Parameters start : 3D Vector (tuple or list or numpy.array) The coordinate of the start of the helix primitive. end : 3D Vector (tuple or list or numpy.array) The coordinate of the end of the helix primitive. aa : int, optional Number of amino acids in the `Helix`. If `None, an appropriate number of residues are added. helix_type : str, optional Type of helix, can be: 'alpha', 'pi', '3-10', 'PPI', 'PPII', 'collagen'. """

        start = numpy.array(start)
        end = numpy.array(end)
        if aa is None:
            rise_per_residue = _helix_parameters[helix_type][1]
            aa = int((numpy.linalg.norm(end - start) / rise_per_residue) + 1)
        instance = cls(aa=aa, helix_type=helix_type)
        instance.move_to(start=start, end=end)
        return instance