def user_SetParameter(self, parameter, value, datasets, level):

        # algorithm
        if parameter == "algorithm":

            # Switch off the clustering
            if value == "none":
                test = True
                for dataset in datasets:
                    if not test:
                        break
                    for file in dataset.filenames:
                        if file.endswith('lhe') or \
                           file.endswith('lhe.gz') or \
                           file.endswith('hep') or \
                           file.endswith('hep.gz') or \
                           file.endswith('hepmc') or \
                           file.endswith('hepmc.gz'):
                            test = False
                            break
                if not test:
                    logging.getLogger('MA5').error(
                        "some datasets contain partonic/hadronic file format. Clustering algorithm cannot be switched off."
                    )
                    return

            # Switch on the clustering
            elif value in ["kt","antikt","cambridge","genkt",\
                           "gridjet","cdfmidpoint","cdfjetclu",\
                           "siscone"]:

                # Only in reco mode
                if level != MA5RunningType.RECO:
                    logging.getLogger('MA5').error(
                        "clustering algorithm is only available in RECO mode")
                    return

                test = True
                for dataset in datasets:
                    if not test:
                        break
                    for file in dataset.filenames:
                        if file.endswith('lhco') or \
                           file.endswith('lhco.gz') or \
                           file.endswith('root'):
                            test = False
                            break
                if not test:
                    logging.getLogger('MA5').error(
                        "some datasets contain reconstructed file format. Clustering algorithm cannot be switched on."
                    )
                    return

            if value == "kt":
                self.algorithm = "kt"
                self.clustering = ClusteringKt()
            elif value == "antikt":
                self.algorithm = "antikt"
                self.clustering = ClusteringAntiKt()
            elif value == "cambridge":
                self.algorithm = "cambridge"
                self.clustering = ClusteringCambridge()
            elif value == "genkt":
                self.algorithm = "genkt"
                self.clustering = ClusteringGenKt()
            elif value == "gridjet":
                self.algorithm = "gridjet"
                self.clustering = ClusteringGridJet()
            elif value == "cdfmidpoint":
                self.algorithm = "cdfmidpoint"
                self.clustering = ClusteringCDFMidPoint()
            elif value == "cdfjetclu":
                self.algorithm = "cdfjetclu"
                self.clustering = ClusteringCDFJetClu()
            elif value == "siscone":
                self.algorithm = "siscone"
                self.clustering = ClusteringSisCone()
            elif value == "none":
                self.algorithm = "none"
                self.clustering = 0
            else:
                logging.getLogger('MA5').error("algorithm called '" + value +
                                               "' is not found.")
            return

        # other rejection if no algo specified
        if self.algorithm == "none":
            logging.getLogger('MA5').error(
                "'clustering' has no parameter called '" + parameter + "'")
            return

        # exclusive_id
        if parameter == "exclusive_id":
            if value == "true":
                self.exclusive_id = True
            elif value == "false":
                self.exclusive_id = False
            else:
                logging.getLogger('MA5').error("The allowed values for 'exclusive_id' " +\
                              "parameter are 'true' or 'false'.")
            return

        # other
        elif parameter.startswith('bjet_id.'):
            return self.beauty.user_SetParameter(parameter, value)
        elif parameter.startswith('tau_id.'):
            return self.tau.user_SetParameter(parameter, value)
        else:
            return self.clustering.user_SetParameter(parameter, value)