Beispiel #1
0
 def TCShotlist(self, Taglist=None, Shotlist=None, Detail=False):
     Shotlist = list(Shotlist)
     input = Shotlist.copy()
     reader = Reader(root_path=self.hdf5path)
     n = 1
     IncompleteNumber = []
     for i in Shotlist:
         print("第{}个".format(n))
         n += 1
         ShotTag = reader.tags(int(i))
         for j in Taglist:
             if j in ShotTag:
                 continue
             else:
                 IncompleteNumber.append(i)
                 break
     for i in IncompleteNumber:
         for j in Shotlist:
             if int(i) == int(j):
                 Shotlist.remove(j)
     outlist = Shotlist
     if Detail:
         print("Number of input shots    : {}".format(len(input)))
         print("Number of excluded shots : {}".format(len(IncompleteNumber)))
         print("Number of output shots   : {}".format(len(outlist)))
     return outlist
Beispiel #2
0
 def __init__(self, root=None):
     """connect to mdsplus server and init data importer"""
     if root:
         self.exporter = Exporter(root)
         self.reader = Reader(root)
     else:
         self.exporter = Exporter()
         self.reader = Reader()
     # log
     log_dir = os.path.abspath('') + os.sep + 'log'
     if not os.path.exists(log_dir):
         os.makedirs(log_dir)
     self.logger = logging.getLogger(__name__)
     self.logger.setLevel(level=logging.INFO)
     handler = logging.FileHandler(
         log_dir + os.sep + 'JTEXTDataExporter_log_{}.txt'.format(
             time.strftime("%Y_%m_%d %H:%M:%S", time.localtime(
                 time.time()))))
     handler.setLevel(logging.INFO)
     formatter = logging.Formatter(
         '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
     handler.setFormatter(formatter)
     console = logging.StreamHandler()
     console.setLevel(logging.INFO)
     self.logger.addHandler(handler)
     self.logger.addHandler(console)
Beispiel #3
0
    def run(self):
        reader = Reader(self.hdf5_path)
        for plugin in self.plugins.values():
            signals = plugin.requested_signal()
            for shot in self.shots:
                self.logger.info('Run module {} @shot {}.\n'.format(
                    plugin.__class__.__name__, shot))
                try:
                    data = reader.read_many(shot=shot, tags=signals)
                    result = plugin.generate(data)
                except Exception as e:
                    self.logger.info('An error occurs in module {} @shot {}.\n{}\n{}'.format(
                        plugin.__class__.__name__, shot, e, traceback.format_exc()))
                    result = {}
                if self.output['type'] == "mongodb":
                    from pymongo import MongoClient
                    client = MongoClient(self.output['host'], int(self.output['port']))

                    db = client[self.output['database']]
                    if self.config.has_option('output', 'username'):
                        db.authenticate(self.config.get('output', 'username'), self.config.get('output', 'password'))
                    col = db[self.output['collection']]
                    result['shot'] = shot
                    col.update_one(
                        {"shot": shot},
                        {"$set": result},
                        upsert=True
                    )
                elif self.output['type'] == "stdio":
                    print(result)
                else:
                    raise RuntimeError('配置文件output type选项不正确,可选为:mongodb,stdio')
    def run(self):
        data_reader = Reader()
        ddb = Query()
        for shot in self._shots:
            # if shot < 1065500 or shot > 1065599:
            #     continue
            print(shot)
            try:
                tags = ddb.tag(shot)
                if tags['IsDisrupt']:
                    t1 = tags['CqTime']
                else:
                    t1 = tags['RampDownTime']
                new_dig_length = int((t1 * 1000 - 50) * self._sample_rate)
                data = data_reader.read_many(shot, self._tags)
                digs = []
                for tag, (dig, time) in data.items():
                    dig = dig[(0.05 <= time) & (time <= t1)]
                    if self._normalized:
                        dig = (dig - self._normalize_param[tag]['min']) / \
                              (self._normalize_param[tag]['max'] - self._normalize_param[tag]['min'])
                    digs.append(signal.resample(dig, new_dig_length))

                digs = np.array(digs)
                y_ = y(new_dig_length, self._sample_rate, tags['IsDisrupt'])
                index = 0
                path = os.path.join(self._npy_path, '{}'.format(shot))
                if not os.path.exists(path):
                    os.makedirs(path)
                while index + self._frame_size <= new_dig_length:
                    frame = digs[:, index:index + self._frame_size]
                    y_frame = y_[index:index + self._frame_size]
                    np.save(
                        os.path.join(
                            path, 'x_{}.npy'.format(int(index / self._step))),
                        frame)
                    np.save(
                        os.path.join(
                            path, 'y_{}.npy'.format(int(index / self._step))),
                        y_frame)
                    index += self._step
                if index + self._frame_size - new_dig_length < self._frame_size / 2:
                    frame = digs[:, new_dig_length -
                                 self._frame_size:new_dig_length]
                    y_frame = y_[new_dig_length -
                                 self._frame_size:new_dig_length]
                    np.save(
                        os.path.join(
                            path, 'x_{}.npy'.format(int(index / self._step))),
                        frame)
                    np.save(
                        os.path.join(
                            path, 'y_{}.npy'.format(int(index / self._step))),
                        y_frame)
            except Exception as e:
                print(e)
                traceback.print_exc()
    def save_full_npy(self, shots):
        data_reader = Reader()
        ddb = Query()
        path = os.path.join(self._npy_path, 'full')
        if not os.path.exists(path):
            os.makedirs(path)
        print('####Start generate val DataSet####')
        for shot in shots:
            try:
                print(shot)

                tags = ddb.tag(shot)
                if tags['IsDisrupt']:
                    t1 = tags['CqTime']
                else:
                    t1 = tags['RampDownTime']
                new_dig_length = int((t1 * 1000 - 50) * self._sample_rate)
                data = data_reader.read_many(shot, self._tags)
                digs = []
                for tag, (dig, time) in data.items():
                    dig = dig[(0.05 <= time) & (time <= t1)]
                    if self._normalized:
                        dig = (dig - self._normalize_param[tag]['min']) / \
                              (self._normalize_param[tag]['max'] - self._normalize_param[tag]['min'])
                    digs.append(signal.resample(dig, new_dig_length))

                digs = np.array(digs)
                y_ = y(new_dig_length, self._sample_rate, tags['IsDisrupt'])
                index = 0
                x = list()
                labels = list()
                while index + self._frame_size <= new_dig_length:
                    frame = digs[:, index:index + self._frame_size]
                    y_frame = y_[index:index + self._frame_size]
                    # index += self.frame_size
                    x.append(frame)
                    labels.append(y_frame[-1])
                    index += self._step
                x = np.array(x)
                labels = np.array(labels)
                np.save(os.path.join(path, 'x_{}.npy'.format(shot)), x)
                np.save(os.path.join(path, 'y_{}.npy'.format(shot)), labels)
            except Exception as e:
                print(e)
                traceback.print_exc()
Beispiel #6
0
    def plot_one(self,
                 Tag=None,
                 Shot=None,
                 Savepath=None,
                 xline=None,
                 yline=None,
                 Showplot=False):
        if Savepath:
            root_path = Savepath
            if not os.path.exists(root_path):
                raise ValueError(
                    'No such saving path, you need to create one! ')
        else:
            root_path = os.getcwd() + os.sep + "plot"
            print(root_path)
            if not os.path.exists(root_path):
                os.makedirs(root_path)

        reader = Reader(root_path=self.hdf5path)
        try:
            data = reader.read_one(int(Shot), Tag)
            tag_name = Tag[1:]
            plt.figure((str(Shot) + tag_name))
            plt.plot(data[1], data[0], 'g')
            if xline:
                if not isNum(xline):
                    raise ValueError('xline needs to be number ')
                plt.axvline(round(xline, 3))
            if yline:
                if not isNum(yline):
                    raise ValueError('yline needs to be number ')
                plt.axhline(round(yline, 3))
            name = str(Shot) + r" " + tag_name
            path = root_path + os.sep + r"{}.png".format(name)
            plt.savefig(path)
            if Showplot:
                plt.show()
            plt.close()
        except Exception as err:
            print("Shot:{}".format(shot) + " Tag:{}  ".format(tag_name) +
                  "No data")
            plt.close()
            pass
Beispiel #7
0
    def generate(self):
        data_reader = Reader()
        ddb = Query()
        for categories, shots in self._shots.items():
            if not os.path.exists(os.path.join(self._directory, categories)):
                os.makedirs(os.path.join(self._directory, categories))
            for shot in shots:
                print(shot)
                try:
                    tags = ddb.tag(shot)
                    if tags['IsDisrupt']:
                        t1 = tags['CqTime']
                    else:
                        t1 = tags['RampDownTime']
                    new_dig_length = int(
                        (t1 * 1000 - self._start_time) * self._sample_rate)
                    data = data_reader.read_many(shot, self._tags)
                    digs = []
                    for tag, (dig, time) in data.items():
                        dig = dig[(self._start_time / 1000 <= time)
                                  & (time <= t1)]
                        # 归一化
                        if self._normalized:
                            dig = (dig - self._normalize_param[tag]['min']) / \
                                  (self._normalize_param[tag]['max'] - self._normalize_param[tag]['min'])
                        # 重采样
                        digs.append(signal.resample(dig, new_dig_length))

                    digs = np.array(digs)

                    f = h5py.File(
                        os.path.join(self._directory, categories,
                                     '{}.hdf5'.format(shot)))
                    dataset = f.create_dataset('diagnosis', data=digs)
                    for key, value in tags.items():
                        dataset.attrs.create(key, value)
                    f.close()

                except Exception as e:
                    print(e)
                    traceback.print_exc()
Beispiel #8
0
 def TagNum(self, Taglist=None, Shotlist=None):
     Taglist  = list(Taglist)
     Shotlist = list(Shotlist)
     for i in range(len(Taglist)):
         Taglist[i] = Taglist[i][1:len(Taglist[i])]
     result = {}
     for i in Taglist:
         result.update({i: 0})
     reader = Reader(root_path=self.hdf5path)
     n = 1
     for i in Shotlist:
         print("第{}个".format(n))
         n += 1
         ShotTag = reader.tags(int(i))
         for k in range(len(ShotTag)):
             ShotTag[k] = ShotTag[k][1:len(ShotTag[k])]
         for j in Taglist:
             for tag in ShotTag:
                 if j == tag :
                     result[j] = result[j]+1
     pprint.pprint(result)
Beispiel #9
0
 def Vpfiltshot(self, Shotlist=None, Threshold=None, Detail=False):
     Shotlist = list(Shotlist)
     input = Shotlist
     if not Threshold:
         Threshold = 0.015
     reader = Reader(root_path=self.hdf5path)
     breakvp = []
     n = 1
     for shot in Shotlist:
         print("第{}个".format(n))
         n += 1
         data = reader.read_one(int(shot), r"\vp2")
         # 低通滤波
         ba = signal.butter(8, 0.01, "lowpass")
         fdata = signal.filtfilt(ba[0], ba[1], data[0])
         if max(fdata) < Threshold:
             breakvp.append(shot)
     output = breakvp
     if Detail:
         print("Number of input shots    : {}".format(len(input)))
         print("Number of output shots   : {}".format(len(output)))
     return output
Beispiel #10
0
    def plot_much(self,
                  Taglist=None,
                  Shotlist=None,
                  Savepath=None,
                  ShowDownTime=False,
                  ShowIpFlat=False,
                  xline=None,
                  yline=None):
        if Savepath:
            root_path = Savepath
            if not os.path.exists(root_path):
                raise ValueError(
                    'No such saving path, you need to create one! ')
        else:
            root_path = os.getcwd() + os.sep + "plot"
            print(root_path)
            if not os.path.exists(root_path):
                os.makedirs(root_path)
        for tag in Taglist:
            tag_name = tag[1:]
            file_path = root_path + os.sep + tag_name
            if not os.path.exists(file_path):
                os.makedirs(file_path)

        reader = Reader(root_path=self.hdf5path)
        db = Query()
        for tag in Taglist:
            tag_name = tag[1:]
            file_path = root_path + os.sep + tag_name
            n = 1
            for shot in Shotlist:
                print("Shot:{}".format(shot) + " Tag:{}  ".format(tag_name) +
                      "No.{}".format(n))
                n += 1
                try:
                    shot_info = db.tag(int(shot))
                    data = reader.read_one(int(shot), tag)
                    plt.figure((str(shot) + tag_name))
                    plt.plot(data[1], data[0], 'g')
                    if ShowDownTime:
                        if shot_info["IsValidShot"]:
                            if shot_info["IsDisrupt"]:
                                plt.axvline(round(shot_info["CqTime"], 3),
                                            c='r')
                            else:
                                plt.axvline(round(shot_info["RampDownTime"],
                                                  3),
                                            c='r')
                    if ShowIpFlat:
                        if tag == r"\ip":
                            if shot_info["IsValidShot"]:
                                plt.axhline(round(shot_info["IpFlat"], 3),
                                            c='k')
                    if xline:
                        if not isNum(xline):
                            raise ValueError('xline needs to be number ')
                        plt.axvline(round(xline, 3))
                    if yline:
                        if not isNum(yline):
                            raise ValueError('yline needs to be number ')
                        plt.axhline(round(yline, 3))
                    path = file_path + os.sep + r"{}.png".format(shot)
                    plt.savefig(path)
                    plt.close()
                except Exception as err:
                    print("Shot:{}".format(shot) +
                          " Tag:{}  ".format(tag_name) + "No data")
                    plt.close()
                    pass
Beispiel #11
0
class JTEXTDataExporter:
    def __init__(self, root=None):
        """connect to mdsplus server and init data importer"""
        if root:
            self.exporter = Exporter(root)
            self.reader = Reader(root)
        else:
            self.exporter = Exporter()
            self.reader = Reader()
        # log
        log_dir = os.path.abspath('') + os.sep + 'log'
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(level=logging.INFO)
        handler = logging.FileHandler(
            log_dir + os.sep + 'JTEXTDataExporter_log_{}.txt'.format(
                time.strftime("%Y_%m_%d %H:%M:%S", time.localtime(
                    time.time()))))
        handler.setLevel(logging.INFO)
        formatter = logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        console = logging.StreamHandler()
        console.setLevel(logging.INFO)
        self.logger.addHandler(handler)
        self.logger.addHandler(console)

    def download(self, shots=None, tags=None, sample_rate=None):
        """Download J-TEXT data
        @:param shots: shot list
        @:param tags: tag list
        @:param sr: sample rate for resample(kHz), if sr<sr0: do resample, else: do nothing
        :return: null
        """
        if shots is None or len(shots) == 0:
            raise ValueError('Param Error, ' 'shot list can\'t be Empty!')
        if tags is None or len(tags) == 0:
            raise ValueError('Param Error, ' 'tag list can\'t be Empty!')
        self.logger.info('Start download data')
        for shot in shots:
            try:
                c = connection.Connection('211.67.27.245')
                c.openTree('jtext', shot=shot)
                for tag in tags:
                    try:
                        if tag in self.reader.tags(shot):
                            self.logger.info(
                                'shot:{}, tag:{}, already exits.'.format(
                                    shot, tag))
                            continue
                        data = np.array(c.get(tag))
                        time = np.array(
                            c.get(r'DIM_OF(BUILD_PATH({}))'.format(tag)))
                        if data.shape[0] == 0 or time.shape[0] == 0:
                            self.logger.info(
                                'shot:{}, tag:{}, Shape of signal or dim_of(signal) is 0'
                            )
                        elif abs(data.shape[0] - time.shape[0]) > 10:
                            self.logger.info(
                                'shot:{}, tag:{}, Shape of signal and dim_of(signal) not equal'
                            )
                        else:
                            if 0 < data.shape[0] - time.shape[0] < 10:
                                data = data[:time.shape[0]]
                            if 0 < time.shape[0] - data.shape[0] < 10:
                                time = time[:data.shape[0]]
                            sr0 = int(len(data) /
                                      (time[-1] - time[0]) / 10) * 10

                            if sample_rate and sample_rate < sr0 / 100:
                                num = sample_rate * (int(
                                    round(time[-1] * 1000 - time[0] * 1000)))
                                data = signal.resample(data, num)
                                duration = (time[-1] - time[0]) / num
                                time = []
                                for i in range(num):
                                    time.append(i * duration)
                            result = self.exporter.save(shot, tag, data, time)
                            if result == 0:
                                self.logger.info(
                                    'shot:{}, tag:{}, Finish.'.format(
                                        shot, tag))
                            elif result == -1:
                                self.logger.info(
                                    'shot:{}, tag:{}, already exits.'.format(
                                        shot, tag))
                    except Exception as e:
                        self.logger.info(
                            'shot:{}, tag:{}, error occurs:{}.'.format(
                                shot, tag, e))
                c.closeTree('jtext', shot=shot)
                c.disconnect()
            except Exception as err:
                self.logger.info('shot {} is Empty, reason: {}\n{}'.format(
                    shot, err, traceback.format_exc()))
                if 'SS-W-SUCCESS' in '{}'.format(err):
                    self.logger.info('stop at shot {}\n{}'.format(
                        shot, traceback.format_exc()))
                    exit(-1)
                      r"TrainNormal.npy")
TrainBreak = np.load(root_path + os.sep + r"TrainData" + os.sep +
                     r"TrainBreak.npy")
TrainNormal = list(TrainNormal)
TrainBreak = list(TrainBreak)
print(len(TrainNormal))
print(len(TrainBreak))
TrainShot = TrainNormal + TrainBreak

save_path = root_path + os.sep + r"ReduceSampling"
if not os.path.exists(save_path):
    os.makedirs(save_path)

n = 1
mistake = []
reader = Reader()
db = Query()
for shot in TrainShot:
    print("Shot:{}  ".format(shot) + "No.{}".format(n))
    n += 1
    try:
        shot_info = db.tag(int(shot))
        file = h5py.File(save_path + os.sep + r"{}.hdf5".format(shot))
        if not shot_info["IsDisrupt"]:
            DownTime = shot_info["RampDownTime"]
            for shottag in all_tags:
                dataset = reader.read_one(int(shot), shottag)
                data = dataset[0]
                time = dataset[1]
                data = data[time <= DownTime]
                time = time[time <= DownTime]