<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def set_helical_axis(self, filename, step_range=False, step=None):
 """ To read and set local helical-axis positions from an input file. Parameters filename : str Input file, which is generated from do_x3dna. e.g. HelAxis_g.dat step_range : bool * ``step_range = True`` : read axis coordinates of base-steps for the given range of base-steps * ``step_range = False``: read axis coordinates of all base-steps step : list List containing lower and higher limit of base-steps range. * This option only works with ``step_range=True``. * This list should not contain more than two number. * First number should be less than second number. Example for base-step 4 to 15: ``step = [4,15] # step_range = True`` """


        if (step_range):
            if not isinstance(step, list):
                raise AssertionError("type %s is not list" % type(step))
            if (len(step) > 2):
                print (
                    "ERROR: Range for helical axis should be list of two numbers, e.g. step=[1, 20] \n")
                exit(1)

        if (step_range) and (step == None):
            raise ValueError(
                "See, documentation for step  and step_range usage!!!")

        # Check if requested parameters found within input file
        gotParametersInputFile = checkParametersInputFile(filename)
        if gotParametersInputFile is None:
            raise IOError(' Something wrong in input file {0}.\n Cannot read parameters.\n File should be an output from do_x3dna.'.format(filename))
        for p in helicalAxisParameters:
            if p not in gotParametersInputFile:
                raise ValueError(' Helical axis not found in input file. \n This file contains following parameters: \n {0}'.format(gotParametersInputFile))

        targetParameters = { 1:'helical x-axis', 2:'helical y-axis', 3:'helical z-axis' }

        if (step_range):
            if (len(step) != 2):
                raise ValueError("See, documentation for step usage!!!")

            if step[0] > step[1]:
                raise ValueError("See, documentation for step usage!!!")
            data, time = read_param_file(filename, [1, 2, 3], step, True, startBP=self.startBP)
        else:
            data, time = read_param_file(filename, [1, 2, 3], [1, self.num_step], True, startBP=self.startBP)

        self._set_time(time)

        if (step_range):
            bp_idx, param_idx = get_idx_of_bp_parameters(step, [], True, startBP=self.startBP)
        else:
            bp_idx, param_idx = get_idx_of_bp_parameters([1, self.num_step], [], True, startBP=self.startBP)

        for i in range(len(data)):
            for j in range(len(data[i])):
                bp_num = str( bp_idx[i]+self.startBP )
                param = targetParameters[j+1]
                self._set_data(data[i][j], 'bps', bp_num, param, scaleoffset=2)