def predictKernelPolCluster(self,
                                DicoData,
                                SM,
                                iDirection=None,
                                ApplyJones=None,
                                ApplyTimeJones=None,
                                Noise=None):

        DicoData = NpShared.DicoToShared("%sDicoMemChunk" % (self.IdMemShared),
                                         DicoData,
                                         DelInput=False)
        if ApplyTimeJones != None:
            ApplyTimeJones = NpShared.DicoToShared("%sApplyTimeJones" %
                                                   (self.IdMemShared),
                                                   ApplyTimeJones,
                                                   DelInput=False)

        nrow, nch, _ = DicoData["data"].shape

        RowList = np.int64(np.linspace(0, nrow, self.NCPU + 1))
        row0 = RowList[0:-1]
        row1 = RowList[1::]

        work_queue = multiprocessing.Queue()
        result_queue = multiprocessing.Queue()

        workerlist = []
        NCPU = self.NCPU

        NpShared.DelArray("%sPredictData" % (self.IdMemShared))
        PredictArray = NpShared.SharedArray.create(
            "%sPredictData" % (self.IdMemShared),
            DicoData["data"].shape,
            dtype=DicoData["data"].dtype)

        for ii in range(NCPU):
            W = WorkerPredict(work_queue,
                              result_queue,
                              self.IdMemShared,
                              SM=SM,
                              DoSmearing=self.DoSmearing,
                              BeamAtFacet=self._BeamAtFacet)
            workerlist.append(W)
            workerlist[ii].start()

        NJobs = row0.size
        for iJob in range(NJobs):
            ThisJob = row0[iJob], row1[iJob]
            work_queue.put(ThisJob)

        while int(result_queue.qsize()) < NJobs:
            time.sleep(0.1)
            continue

        for ii in range(NCPU):
            workerlist[ii].shutdown()
            workerlist[ii].terminate()
            workerlist[ii].join()

        return PredictArray
    def GiveCovariance(self,
                       DicoDataIn,
                       ApplyTimeJones,
                       SM,
                       Mode="DDECovariance"):

        DicoData = NpShared.DicoToShared("%sDicoMemChunk" % (self.IdMemShared),
                                         DicoDataIn,
                                         DelInput=False)

        if ApplyTimeJones != None:
            ApplyTimeJones = NpShared.DicoToShared("%sApplyTimeJones" %
                                                   (self.IdMemShared),
                                                   ApplyTimeJones,
                                                   DelInput=False)

        nrow, nch, _ = DicoData["data"].shape

        RowList = np.int64(np.linspace(0, nrow, self.NCPU + 1))
        row0 = RowList[0:-1]
        row1 = RowList[1::]

        work_queue = multiprocessing.Queue()
        result_queue = multiprocessing.Queue()

        workerlist = []
        NCPU = self.NCPU

        # NpShared.DelArray("%sCorrectedData"%(self.IdMemShared))
        # CorrectedData=NpShared.SharedArray.create("%sCorrectedData"%(self.IdMemShared),DicoData["data"].shape,dtype=DicoData["data"].dtype)
        # CorrectedData=

        for ii in range(NCPU):
            W = WorkerPredict(work_queue,
                              result_queue,
                              self.IdMemShared,
                              Mode=Mode,
                              DoSmearing=self.DoSmearing,
                              SM=SM,
                              BeamAtFacet=self._BeamAtFacet)
            workerlist.append(W)
            workerlist[ii].start()

        NJobs = row0.size
        for iJob in range(NJobs):
            ThisJob = row0[iJob], row1[iJob]
            work_queue.put(ThisJob)

        while int(result_queue.qsize()) < NJobs:
            time.sleep(0.1)
            continue

        for ii in range(NCPU):
            workerlist[ii].shutdown()
            workerlist[ii].terminate()
            workerlist[ii].join()

        DicoDataIn["W"] = DicoData["W"]