<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def make_parcellation(self, parcellation, parc_type=None, parc_params=None, network='defaults', update_pipeline=True, removeconfounds=False, tag=None, njobs=None, clean_params=None, yeonetworkn=None):
 """ Reduces the data from voxel to parcellation space. Files get saved in a teneto folder in the derivatives with a roi tag at the end. Parameters parcellation : str specify which parcellation that you would like to use. For MNI: 'power2012_264', 'gordon2014_333'. TAL: 'shen2013_278' parc_type : str can be 'sphere' or 'region'. If nothing is specified, the default for that parcellation will be used. parc_params : dict **kwargs for nilearn functions network : str if "defaults", it selects static parcellation, _if available_ (other options will be made available soon). removeconfounds : bool if true, regresses out confounds that are specfied in self.set_confounds with linear regression. update_pipeline : bool TenetoBIDS gets updated with the parcellated files being selected. tag : str or list any additional tag that must be in file name. After the tag there must either be a underscore or period (following bids). clean_params : dict **kwargs for nilearn function nilearn.signal.clean yeonetworkn : int (7 or 17) Only relevant for when parcellation is schaeffer2018. Use 7 or 17 template networks njobs : n number of processes to run. Overrides TenetoBIDS.njobs Returns ------- To load these files call TenetoBIDS.load_parcellation. NOTE ---- These functions make use of nilearn. Please cite nilearn if used in a publicaiton. """

        if not njobs:
            njobs = self.njobs
        self.add_history(inspect.stack()[0][3], locals(), 1)

        parc_name = parcellation.split('_')[0].lower()

        # Check confounds have been specified
        if not self.confounds and removeconfounds:
            raise ValueError(
                'Specified confounds are not found. Make sure that you have run self.set_confunds([\'Confound1\',\'Confound2\']) first.')

        # Check confounds have been specified
        if update_pipeline == False and removeconfounds:
            raise ValueError(
                'Pipeline must be updated in order to remove confounds within this funciton.')

        # In theory these should be the same. So at the moment, it goes through each element and checks they are matched.
        # A matching algorithem may be needed if cases arise where this isnt the case
        files = self.get_selected_files(quiet=1)
        # Load network communities, if possible.
        self.set_network_communities(parcellation, netn=yeonetworkn)

        if not tag:
            tag = ''
        else:
            tag = 'desc-' + tag

        if not parc_params:
            parc_params = {}

        with ProcessPoolExecutor(max_workers=njobs) as executor:
            job = {executor.submit(self._run_make_parcellation, f, i, tag, parcellation,
                                   parc_name, parc_type, parc_params) for i, f in enumerate(files)}
            for j in as_completed(job):
                j.result()

        if update_pipeline == True:
            if not self.confound_pipeline and len(self.get_selected_files(quiet=1, pipeline='confound')) > 0:
                self.set_confound_pipeline(self.pipeline)
            self.set_pipeline('teneto_' + teneto.__version__)
            self.set_pipeline_subdir('parcellation')
            if tag:
                self.set_bids_tags({'desc': tag.split('-')[1]})
            self.set_bids_suffix('roi')
            if removeconfounds:
                self.removeconfounds(
                    clean_params=clean_params, transpose=None, njobs=njobs)