def analysis_step(self, iteration, instance):
        '''
        function : Perform CoCo Analysis on the output of the simulation from the current iteration. Using the .ncdf
         files generated in all the instance, generate the .crd file to be used in the next simulation.

        coco :-

                Purpose : Runs CoCo analysis on a set of .ncdf files and generates a coordinate file.

                Arguments : --grid          = Number of points along each dimension of the CoCo histogram
                            --dims          = The number of projections to consider from the input pcz file
                            --frontpoints   = Number of CUs
                            --topfile       = Topology filename
                            --mdfile        = MD Input filename
                            --output        = Output filename
                            --cycle         = Current iteration number
        '''
        k1 = Kernel(name="custom.coco")
        k1.arguments = ["--grid={0}".format(Kconfig.grid),
                       "--dims={0}".format(Kconfig.dims),
                       "--frontpoints=64".format(Kconfig.num_CUs),
                       "--topfile={0}".format(os.path.basename(Kconfig.top_file)),
                       "--mdfile=*.ncdf",
                       "--output=pdbs",
                       "--atom_selection={0}".format(Kconfig.atom_selection)]
        #k1.cores = min(Kconfig.num_CUs,RPconfig.PILOTSIZE)
        k1.cores = 64
        k1.uses_mpi = True

        k1.link_input_data = ['$SHARED/{0}'.format(os.path.basename(Kconfig.top_file))]

        for iter in range(1,iteration+1):
#            for i in range(1,Kconfig.num_CUs+1):
	     for i in range(1+(instance-1)*64, instance*64 + 1):
                k1.link_input_data = k1.link_input_data + ['$SIMULATION_ITERATION_{0}_INSTANCE_{1}/md{0}.ncdf > md_{0}_{1}.ncdf'.format(iter,i)]


        k1.copy_output_data = list()
        for i in range(0,64):
            k1.copy_output_data = k1.copy_output_data + ['pdbs{1}.pdb > $SHARED/pentaopt{0}{2}.pdb'.format(iteration,i,(instance-1)*64+i)]


        if(iteration%Kconfig.nsave==0):
            k1.download_output_data = ['coco.log > output/iter{0}/coco.log'.format(iteration,instance)]


        k2 = Kernel(name="custom.tleap",instance_type='single')
        k2.arguments = ["--numofsims={0}".format(Kconfig.num_CUs),
                        "--cycle={0}".format(iteration)]

        k2.link_input_data = ['$SHARED/postexec.py > postexec.py']
        for i in range(0,Kconfig.num_CUs):
            k2.link_input_data = k2.link_input_data + ['$SHARED/pentaopt{0}{1}.pdb > pentaopt{0}{1}.pdb'.format(iteration,i)]

        return [k1,k2]
    def analysis_step(self, iteration, instance):
        '''
        function : Perform CoCo Analysis on the output of the simulation from the current iteration. Using the .xtc
         files generated in all instances, generate .gro files (as many as the num_CUs) to be used in the next simulations. 
        

        coco :-

                Purpose : Runs CoCo analysis on a set of MD trajectory files in this case xtc files and generates several coordinates file to be

                Arguments : --grid           = Number of points along each dimension of the CoCo histogram
                            --dims           = The number of projections to consider from the input pcz file
                            --frontpoints    = Number of CUs
                            --topfile        = Topology filename
                            --mdfile         = MD Input filename
                            --output         = Output filename
                            --cycle          = Current iteration number
                            --atom_selection = Selection of the biological part of the system we want to consider for analysis
        '''

        k1_ana_kernel = Kernel(name="md.coco")

        k1_ana_kernel.link_input_data = ['$PRE_LOOP/{0}'.format(os.path.basename(Kconfig.top_file)),
                                                                '$SIMULATION_ITERATION_{0}_INSTANCE_1/md-{1}_0.gro > md-{1}_0.gro'.format(iteration,iteration-1)]
        for iter in range(1,iteration+1):
            for i in range(1,Kconfig.num_CUs+1):        
                k1_ana_kernel.link_input_data = k1_ana_kernel.link_input_data + ['$SIMULATION_ITERATION_{0}_INSTANCE_{1}/md-{2}_{3}.xtc > md-{2}_{3}.xtc'.format(iter,i,iter-1,i-1)]

        
        k1_ana_kernel.cores = 1
        k1_ana_kernel.uses_mpi = False
        
        outbase, ext = os.path.basename(Kconfig.output).split('.')

        #Not sure why this if condition is required
        #if ext == '':
	#		ext = '.pdb'
                
        k1_ana_kernel.arguments = ["--grid={0}".format(Kconfig.grid),
                                   "--dims={0}".format(Kconfig.dims),
                                   "--frontpoints={0}".format(Kconfig.num_CUs),
                                   "--topfile=md-{0}_0.gro".format(iteration-1),
                                   "--mdfile=*.xtc",
                                   "--output={0}_{1}.{2}".format(outbase,iteration-1,ext),
                                   "--atom_selection={0}".format(Kconfig.sel)]

        k1_ana_kernel.copy_output_data = []
        for i in range(0,Kconfig.num_CUs):
            k1_ana_kernel.copy_output_data += ["{0}_{1}{2}.gro > $PRE_LOOP/{0}_{1}{2}.gro".format(outbase,iteration-1,i,ext)]

        k1_ana_kernel.download_output_data = ["coco.log > output/coco-iter{0}.log".format(iteration-1)]	
        

        return [k1_ana_kernel]
    def analysis_stage(self, iteration, instance):
        '''
        function : Perform CoCo Analysis on the output of the simulation from the current iteration. Using the .ncdf
         files generated in all the instance, generate the .crd file to be used in the next simulation.

        coco :-

                Purpose : Runs CoCo analysis on a set of .ncdf files and generates a coordinate file.

                Arguments : --grid          = Number of points along each dimension of the CoCo histogram
                            --dims          = The number of projections to consider from the input pcz file
                            --frontpoints   = Number of CUs
                            --topfile       = Topology filename
                            --mdfile        = MD Input filename
                            --output        = Output filename
                            --cycle         = Current iteration number
        '''
        k1 = Kernel(name="custom.coco")
        k1.arguments = ["--grid={0}".format(Kconfig.grid),
                       "--dims={0}".format(Kconfig.dims),
                       "--frontpoints={0}".format(Kconfig.num_CUs),
                       "--topfile={0}".format(os.path.basename(Kconfig.ref_file)),
                       "--mdfile=*.nc",
                       "--output=coco.rst7",
                       "--atom_selection={0}".format(Kconfig.atom_selection)]
        k1.cores = min(Kconfig.num_CUs,RPconfig.PILOTSIZE)
        k1.uses_mpi = True

        k1.link_input_data = ['$SHARED/{0}'.format(os.path.basename(Kconfig.ref_file))]
        for iter in range(1,iteration+1):
            for i in range(1,Kconfig.num_CUs+1):
                k1.link_input_data = k1.link_input_data + ['$SIMULATION_ITERATION_{0}_INSTANCE_{1}/md{0}.nc > md_{0}_{1}.nc'.format(iter,i)]

        k1.copy_output_data = list()
        for i in range(0,Kconfig.num_CUs):
            k1.copy_output_data = k1.copy_output_data + ['coco{1}.rst7 > $SHARED/min_{0}_{1}.rst7'.format(iteration,i)]

        if(iteration%Kconfig.nsave==0):
            k1.download_output_data = ['coco.log > output/iter{0}/coco.log'.format(iteration,instance)]


        return k1
    def analysis_step(self, iteration, instance):
        '''
        function : Perform CoCo Analysis on the output of the simulation from the current iteration. Using the .ncdf
         files generated in all the instance, generate the .crd file to be used in the next simulation.

        coco :-

                Purpose : Runs CoCo analysis on a set of .ncdf files and generates a coordinate file.

                Arguments : --grid          = Number of points along each dimension of the CoCo histogram
                            --dims          = The number of projections to consider from the input pcz file
                            --frontpoints   = Number of CUs
                            --topfile       = Topology filename
                            --mdfile        = MD Input filename
                            --output        = Output filename
                            --cycle         = Current iteration number
        '''
        k1 = Kernel(name="md.coco")
        k1.arguments = [
            "--grid={0}".format(Kconfig.grid),
            "--dims={0}".format(Kconfig.dims),
            "--frontpoints={0}".format(Kconfig.num_CUs),
            "--topfile={0}".format(os.path.basename(Kconfig.top_file)),
            "--mdfile=*.ncdf", "--output=pdbs",
            "--atom_selection={0}".format(Kconfig.atom_selection)
        ]
        k1.cores = min(Kconfig.num_CUs, RPconfig.PILOTSIZE)
        k1.uses_mpi = True

        k1.link_input_data = [
            '$PRE_LOOP/{0}'.format(os.path.basename(Kconfig.top_file))
        ]
        for iter in range(1, iteration + 1):
            for i in range(1, Kconfig.num_CUs + 1):
                k1.link_input_data = k1.link_input_data + [
                    '$SIMULATION_ITERATION_{0}_INSTANCE_{1}/md{0}.ncdf > md_{0}_{1}.ncdf'
                    .format(iter, i)
                ]

        k1.copy_output_data = list()
        for i in range(0, Kconfig.num_CUs):
            k1.copy_output_data = k1.copy_output_data + [
                'pdbs{1}.pdb > $PRE_LOOP/pentaopt{0}{1}.pdb'.format(
                    iteration, i)
            ]

        if (iteration % Kconfig.nsave == 0):
            k1.download_output_data = [
                'coco.log > output/iter{0}/coco.log'.format(
                    iteration, instance)
            ]

        k2 = Kernel(name="md.tleap")
        k2.arguments = [
            "--numofsims={0}".format(Kconfig.num_CUs),
            "--cycle={0}".format(iteration)
        ]

        k2.link_input_data = ['$PRE_LOOP/postexec.py > postexec.py']
        for i in range(0, Kconfig.num_CUs):
            k2.link_input_data = k2.link_input_data + [
                '$PRE_LOOP/pentaopt{0}{1}.pdb > pentaopt{0}{1}.pdb'.format(
                    iteration, i)
            ]

        return [k1, k2]
    def analysis_step(self, iteration, instance):
        '''
        function : Perform CoCo Analysis on the output of the simulation from the current iteration. Using the .xtc
         files generated in all instances, generate .gro files (as many as the num_CUs) to be used in the next simulations. 
        

        coco :-

                Purpose : Runs CoCo analysis on a set of MD trajectory files in this case xtc files and generates several coordinates file to be

                Arguments : --grid           = Number of points along each dimension of the CoCo histogram
                            --dims           = The number of projections to consider from the input pcz file
                            --frontpoints    = Number of CUs
                            --topfile        = Topology filename
                            --mdfile         = MD Input filename
                            --output         = Output filename
                            --cycle          = Current iteration number
                            --atom_selection = Selection of the biological part of the system we want to consider for analysis
        '''

        k1_ana_kernel = Kernel(name="md.coco")

        k1_ana_kernel.link_input_data = [
            '$PRE_LOOP/{0}'.format(os.path.basename(Kconfig.top_file)),
            '$SIMULATION_ITERATION_{0}_INSTANCE_1/md-{1}_0.gro > md-{1}_0.gro'.
            format(iteration, iteration - 1)
        ]
        for iter in range(1, iteration + 1):
            for i in range(1, Kconfig.num_CUs + 1):
                k1_ana_kernel.link_input_data = k1_ana_kernel.link_input_data + [
                    '$SIMULATION_ITERATION_{0}_INSTANCE_{1}/md-{2}_{3}.xtc > md-{2}_{3}.xtc'
                    .format(iter, i, iter - 1, i - 1)
                ]

        k1_ana_kernel.cores = 1
        k1_ana_kernel.uses_mpi = False

        outbase, ext = os.path.basename(Kconfig.output).split('.')

        #Not sure why this if condition is required
        #if ext == '':
        #		ext = '.pdb'

        k1_ana_kernel.arguments = [
            "--grid={0}".format(Kconfig.grid),
            "--dims={0}".format(Kconfig.dims),
            "--frontpoints={0}".format(Kconfig.num_CUs),
            "--topfile=md-{0}_0.gro".format(iteration - 1), "--mdfile=*.xtc",
            "--output={0}_{1}.{2}".format(outbase, iteration - 1, ext),
            "--atom_selection={0}".format(Kconfig.sel)
        ]

        k1_ana_kernel.copy_output_data = []
        for i in range(0, Kconfig.num_CUs):
            k1_ana_kernel.copy_output_data += [
                "{0}_{1}{2}.gro > $PRE_LOOP/{0}_{1}{2}.gro".format(
                    outbase, iteration - 1, i, ext)
            ]

        k1_ana_kernel.download_output_data = [
            "coco.log > output/coco-iter{0}.log".format(iteration - 1)
        ]

        return [k1_ana_kernel]
    def analysis_stage(self, iteration, instance):
        '''
        function : Perform CoCo Analysis on the output of the simulation from the current iterMod. Using the .xtc
         files generated in all instances, generate .gro files (as many as the num_CUs) to be used in the next simulations.


        coco :-

                Purpose : Runs CoCo analysis on a set of MD trajectory files in this case xtc files and generates several coordinates file to be

                Arguments : --grid           = Number of points along each dimension of the CoCo histogram
                            --dims           = The number of projections to consider from the input pcz file
                            --frontpoints    = Number of CUs
                            --topfile        = Topology filename
                            --mdfile         = MD Input filename
                            --output         = Output filename
                            --cycle          = Current iterMod number
                            --atom_selection = Selection of the biological part of the system we want to consider for analysis
        '''
        #shareDir="$SHARED"
        #shareDir="/work/fbettenc/radical.pilot.sandbox/rp.session.js-17-187.jetstream-cloud.org.hal9000.017508.0005-pilot.0000/staging_area"
        shareDir = "/work/fbettenc/p14b01_pool/staging_area"

        prev_sim_last_iter_to_use = 48
        iterMod = iteration + prev_sim_last_iter_to_use
        k1_ana_kernel = Kernel(name="custom.coco")

        outbase, ext = os.path.basename(Kconfig.output).split('.')
        if ext == '':
            ext = '.pdb'

        k1_ana_kernel.arguments = [
            "--grid={0}".format(Kconfig.grid),
            "--dims={0}".format(Kconfig.dims),
            "--frontpoints={0}".format(Kconfig.num_CUs),
            "--topfile=md-{0}_0.gro".format(iterMod - 1), "--mdfile=*.xtc",
            "--output={0}_{1}_.gro".format(outbase, iterMod - 1),
            "--atom_selection={0}".format(Kconfig.sel)
        ]
        # k1_ana_kernel.cores = min(Kconfig.num_CUs,RPconfig.PILOTSIZE)
        k1_ana_kernel.cores = min(
            Kconfig.num_CUs * (iterMod + 1), RPconfig.PILOTSIZE
        )  # set to iterMod+1 bec at first iter coco analysis of k8 output so coco is iter ahead sort of

        print " "
        print "iter,iterMod,AnaCUcores = ", iteration, ", ", iterMod, ", ", k1_ana_kernel.cores
        print " "

        k1_ana_kernel.uses_mpi = True
        k1_ana_kernel.link_input_data = [
            shareDir +
            '/md-{1}_0.gro > md-{1}_0.gro'.format(iterMod, iterMod - 1)
        ]
        for iter in range(1, iterMod + 1):
            for i in range(1, Kconfig.num_CUs + 1):
                k1_ana_kernel.link_input_data = k1_ana_kernel.link_input_data + [
                    shareDir + '/md-{2}_{3}.xtc > md-{2}_{3}.xtc'.format(
                        iter, i, iter - 1, i - 1)
                ]

        k1_ana_kernel.copy_output_data = []
        for i in range(0, Kconfig.num_CUs):
            #k1_ana_kernel.copy_output_data += ["{0}_{1}_{2}.gro > $SHARED/{0}_{1}_{2}.gro".format(outbase,iterMod-1,i,ext)]
            k1_ana_kernel.copy_output_data += [
                "{0}_{1}_{2}.gro > ".format(outbase, iterMod - 1, i, ext) +
                shareDir +
                "/{0}_{1}_{2}.gro".format(outbase, iterMod - 1, i, ext)
            ]

        k1_ana_kernel.download_output_data = [
            "coco.log > output/coco-iter{0}.log".format(iterMod - 1)
        ]

        return [k1_ana_kernel]
    def analysis_stage(self, iteration, instance):
        '''
        function : Perform CoCo Analysis on the output of the simulation from 
        the current iteration. Using the .xtc files generated in all instances,
        generate .gro files (as many as the num_CUs) to be used in the next 
        simulations. 
        

        coco :-

            Purpose : Runs CoCo analysis on a set of MD trajectory files 
                      in this case xtc files and generates several 
                      coordinates file to be used in next cycle

            Arguments : --grid           = Number of points along each dimension
                                           of the CoCo histogram
                        --dims           = The number of projections to 
                                           consider from the input pcz file
                        --frontpoints    = Number of CUs
                        --topfile        = Topology filename
                        --mdfile         = MD Input filename
                        --output         = Output filename
                        --cycle          = Current iteration number
                        --atom_selection = Selection of the biological part of 
                                           the system we want to consider for 
                                           analysis
        '''

        k1 = Kernel(name="custom.coco")
        iter1 = iteration - 1

        outbase, ext = opb(Kconfig.output).split('.')
        if ext == '':
            ext = '.pdb'

        k1.arguments = [
            "--grid={0}".format(Kconfig.grid),
            "--dims={0}".format(Kconfig.dims),
            "--frontpoints={0}".format(Kconfig.num_CUs),
            "--topfile=md-{0}_0.gro".format(iter1), "--mdfile=*.xtc",
            "--output={0}_{1}.gro".format(outbase, iter1),
            "--atom_selection={0}".format(Kconfig.sel)
        ]
        k1.cores = min(Kconfig.num_CUs, RPconfig.PILOTSIZE)
        k1.uses_mpi = True
        lind = '$SHARED/md-{0}_0.gro > md-{0}_0.gro'
        k1.link_input_data = [lind.format(iter1)]
        lind = '$SHARED/md-{0}_{1}.xtc > md-{0}_{1}.xtc'
        for iter in range(iteration):
            for i in range(Kconfig.num_CUs):
                k1.link_input_data += [lind.format(iter, i)]

        k1.copy_output_data = []
        cout = '{0}_{1}{2}.gro > $SHARED/{0}_{1}{2}.gro'
        for i in range(Kconfig.num_CUs):
            k1.copy_output_data += [cout.format(outbase, iter1, i)]

        dod = "coco.log > output/coco-iter{0}.log"
        k1.download_output_data = [dod.format(iter1)]

        return [k1]