Module labcom.Retriever

計測データの取り出しを制御する。

計測名、ショット番号、サブショット番号、チャネル番号を指定して取り出す。 計測データはArcDataオブジェクトに格納される。 複数のチャネルを指定した場合は、配列に格納される。

Retrieve+dbStoreパッケージがインストールされている必要がある。

Classes

class RetrieveError (func, msg, code)
Expand source code
class RetrieveError(Exception):
    '''
    '''
    def __init__(self,func,msg,code):
        self.func = func
        self.msg = msg
        self.code = code

Ancestors

  • builtins.Exception
  • builtins.BaseException
class Retriever (timeout=0, server=None, path=None, port=0)
Expand source code
class Retriever(object):
    RANGE_NOSET = 0
    RANGE_EXP = 1
    RANGE_TRIG = 2
    RANGE_SAMPLES = 3
    RANGE_FRAMES = 4
    '''
[ クラス名 ] Retriever
< パブリックメンバー >
  timeout(int)     : 取得時の待ち時間(秒) 0は待ち時間なし
  server(string)   : データ取得ホスト(ホスト指定)
  path(string)     : データ取得時のパス(ホスト指定)
  port(int)        : データ転送サーバ(transd)のサービスポート番号

< 説明 >
  LABCOM計測データの取得制御クラス
      
    '''
#
#< プライベートメンバー >
#  __desc(int)      : オープンされたRetrieve記述子(0<、0の場合、オープンされていない)
#  __diag(string)   : 取得したデータの計測名
#  __shot(int)      : 取得したデータのショット番号
#  __sub_shot(int)  : 取得したデータのサブショット番号
#      

    def __init__(self, timeout=0, server=None, path=None, port=0):
        '''
    [ コンストラクタ ]
    < 引数 >
      timeout(int)      : データの出現を待つ時間(秒) 
              default=0 : no wait
      server(string)    : データ取得ホスト(ホスト指定)
              default=None : INDEXのSHOTテーブルを参照する。
      path(string)      : データ取得時のパス(ホスト指定)
              default=None : INDEXのSHOTテーブルを参照する。
      port(int)         : データ転送サーバ(transd)のサービスポート番号
              default=None : INDEXのSHOTテーブル等を参照する。
        '''
        self.timeout = timeout
        self.server = server
        self.path = path
        self.port = port
        self.raw_mode = 0
        self.__desc = 0
        self.__diag =''
        self.__shot = 0
        self.__sub_shot = 0
        self.__range_type = Retriever.RANGE_NOSET
        self.__range_str = ''

    def __del__(self):
        '''
        '''
        self._end()
        

    def _end(self):
        '''
   [ 関数名 ] _end
   < 引数 >
     なし
   < 返値 >
     なし
   < 説明 >
     retrieveをクローズする。
        '''
        if 0 < self.__desc :
            _retrieve.close(self.__desc)
            _retrieve.release()
        self.__desc = 0
        

    def get(self, diag, shot, sub_shot, channels, range_type=0, range_str='', first_read=True) :
        """
    [ 関数名 ] get
    < 引数 >
      diag(string)   : 取得したいデータの計測名
      shot(int)      : 取得したいデータのショット番号
      sub_shot(int)  : 取得したいデータのサブショット番号
      channels(int,str,[],())
                       : 取得したいデータのチャネル番号,信号名 
      range_type(int)  : 取得範囲の種別
      range_str(string): 取得範囲の文字列
      first_read(bool) : True, read channel data at first.
                                  
    < 返値 >
      ArcDataオブジェクトまたは配列
    < 説明 >
      計測データを取得する。
      可能であれば、電圧値に変換する。
    < 例外 >
      TypeError     : チャネル番号の型があわない。
      ValueError    : チャネル番号が不正である。
      RetrieveError : retrieveライブラリでエラーが発生した。

        """
#
#      前回のget(),get_frames()時と同じdiag,shot,sub_shotでないならば、close、openする。
#      このメソッドの中ではcloseしないが、エラーが発生したらcloseする。
#     closeはデストラクタで行う。
#
        is_list = False
        try:
            if( 1 > self.__desc or shot != self.__shot or 
                sub_shot != self.__sub_shot or diag != self.__diag or
                range_type != self.__range_type or range_str != self.__range_str) :
                self._end()
                if self.server is None or self.path is None :
                    self.__desc = _retrieve.open_range(diag, '', shot, sub_shot, 
                                                self.timeout, range_type, range_str)
                else:
                    self.__desc = _retrieve.open_direct(
                                  diag, self.server, self.path, shot, sub_shot, 
                                                self.port, self.timeout)
                self.__diag = diag;
                self.__shot = shot;
                self.__sub_shot = sub_shot;
                self.__range_type = range_type;
                if Retriever.RANGE_NOSET == range_type :
                    self.__range_str = '';
                else :
                    self.__range_str = range_str;
                    
            n_channel, s_year, s_month, s_day, s_hour , s_min , s_sec, \
              s_management, s_comment, s_server = \
                                        _retrieve.shot_info(self.__desc)
            if isinstance(channels, list ) or isinstance(channels, tuple ) :
                is_list = True
                l_channel = channels
            elif isinstance(channels, int ) :
                if channels == 0 :
                    is_list = True
                    l_channel = list(range(1,n_channel+1))
                else :
                    l_channel = [channels]
            elif isinstance(channels, str ) :
                l_channel = [channels]
            else :
                raise TypeError("channel")
 
            for x_channel in l_channel :
                if isinstance(x_channel, int ) :
                    if n_channel < x_channel or 1 > x_channel :
                        raise ValueError("Illegal channel number(%d)" % x_channel)
                                
            if first_read :
                _retrieve.make_ch_pool(self.__desc, l_channel)

            if is_list :
                ret_obj = []
                
            for x_channel in l_channel :                
                ch_no, byte_length, comp_length, param_count, data_type, \
                   image_type, value_len, is_nframe, c_management, c_comment \
                   = _retrieve.ch_info(self.__desc, x_channel)
                   
                params = _retrieve.ch_params(self.__desc, ch_no)
                
                if 0 == is_nframe :
                    data_length, image_type = _retrieve.to_data_len(
                                            byte_length, image_type, value_len)
                    if 0 == self.raw_mode :
                        try:
                            syn_num = _retrieve.ch_v_synthesized_number(self.__desc, ch_no)
                            if 0 < syn_num :
                                data_length = data_length // syn_num
                                block = _retrieve.ch_volts_dbl(self.__desc, ch_no, data_length)
                                image_type = 'FLT64'
                            else :
                                block = _retrieve.ch_data(self.__desc, ch_no, byte_length)

                        except _retrieve.error as xxx_todo_changeme:
                            (efunc,emes,ecode) = xxx_todo_changeme.args
                            if -122 == ecode : 
                                block = _retrieve.ch_data(self.__desc, ch_no, byte_length)
                                warnings.warn("Data type is not voltage.")
                            else :
                                   raise RetrieveError(efunc,emes,ecode)
                    else:
                        try:
                            block = _retrieve.ch_data(self.__desc, ch_no, byte_length)

                        except _retrieve.error as xxx_todo_changeme:
                            (efunc,emes,ecode) = xxx_todo_changeme.args
                            raise RetrieveError(efunc,emes,ecode)

                    try:
                        sampling_cycle, trigger_delay, start_timing, first_adjust, num_times \
                          = _retrieve.time_info( self.__desc, ch_no)
                    except:
                        sampling_cycle = None
                        start_timing = None
                        num_times = None
                        first_adjust= None
                        
                    ary = ArcData( start_timing+first_adjust, sampling_cycle, None, params, num_times)
#                ary.set_samples(image_type, block, byte_length)
                    ary.set_samples(image_type, block)
                     
                else:
                    length, image_type, frame_x, frame_y = _retrieve.frame_info(
                                                    self.__desc, ch_no, 1)
                    bytes = _retrieve.bytes_per_data(image_type, value_len)
                    byte_length = frame_x * frame_y * bytes
                    ary = ArcData( None, None, None, params)
                    ary.init_frames(image_type, frame_x, frame_y)
                    for fno in range(1, is_nframe+1) :
                        length, image_type, frame_x, frame_y = _retrieve.frame_info(
                                                    self.__desc, ch_no, fno)
                        block = _retrieve.frame_data(self.__desc, ch_no, fno, length)
#                    ary.add_frame(block, length)
                        ary.add_frame(block)
                        
                if is_list :
                    ret_obj.append( ary)
                                   
        except _retrieve.error as xxx_todo_changeme1:
            (efunc,emes,ecode) = xxx_todo_changeme1.args
            self._end()
            raise RetrieveError(efunc,emes,ecode)
            return
        
        if is_list  :
            return ret_obj
        else :
            return ary

        
    def get_frames(self, diag, shot, sub_shot, channel, frames, first_read=True) :
        """
    [ 関数名 ] get_frames
    < 引数 >
      diag(string)      : 取得したいデータの計測名
      shot(int)         : 取得したいデータのショット番号
      sub_shot(int)     : 取得したいデータのサブショット番号
      channel(int,str)  : 取得したいデータのチャネル番号 
      frames(int,[],()) : 取得したいデータのフレーム番号 
      first_read(bool)  : True, read channel data at first.
                                  
    < 返値 >
      ArcDataオブジェクト
    < 説明 >
      フレームを指定して、データを取得できる。 ただし、フレーム構造の計測データ(画像)のみである。
    < 例外 >
      TypeError     : チャネル番号が型があわない。
      ValueError    : チャネル番号が不正である。
      RetrieveError : retrieveライブラリでエラーが発生した。

        """
#
#      前回のget(),get_frames()時と同じdiag,shot,sub_shotでないならば、close、openする。
#      このメソッドの中ではcloseしないが、エラーが発生したらcloseする。
#      closeはデストラクタで行う。
#
        try:
            if( 1 > self.__desc or shot != self.__shot or 
                sub_shot != self.__sub_shot or diag != self.__diag ) :
                self._end()
                if self.server is None or self.path is None :
                    self.__desc = _retrieve.open(diag, '', shot, sub_shot, 
                                                self.timeout)
                else:
                    self.__desc = _retrieve.open_direct(
                                  diag, self.server, self.path, shot, sub_shot, 
                                                self.port, self.timeout)
                self.__diag = diag;
                self.__shot = shot;
                self.__sub_shot = sub_shot;
                    
                    
            n_channel, s_year, s_month, s_day, s_hour , s_min , s_sec, \
              s_management, s_comment, s_server = \
                                        _retrieve.shot_info(self.__desc)
                                        
            if isinstance(channel, int ) :
                if n_channel < channel or 1 > channel :
                    raise ValueError("Illegal channel number(%d)" % channel)
            elif not isinstance(channel, str ) :
                raise ValueError("channel")
            
            ch_no, byte_length, comp_length, param_count, data_type, \
                   image_type, value_len, is_nframe, c_management, c_comment \
                   = _retrieve.ch_info(self.__desc, channel)
            if 1 > is_nframe :
                raise TypeError("channel")  
                
            if isinstance(frames, list ) or isinstance(frames, tuple ) :
                l_frame = frames
            elif isinstance(frames, int ) :
                if frames == 0 :
                    l_frame = list(range(1,is_nframe+1))
                else :
                    l_frame = [frames]
            else :
                raise TypeError("frame")
 
            for fno in l_frame :
                if isinstance(fno, int ) :
                    if is_nframe < fno or 1 > fno :
                        raise ValueError("Illegal frame number(%d)" % fno)
                    
                else :
                    raise TypeError("frame")
                
            params = _retrieve.ch_params(self.__desc, ch_no)
            
            if first_read :
                _retrieve.make_ch_pool(self.__desc, ch_no)
         
            length, image_type, frame_x, frame_y = _retrieve.frame_info(
                                            self.__desc, ch_no, 1)
            bytes = _retrieve.bytes_per_data(image_type, value_len)
            byte_length = frame_x * frame_y * bytes
            ary = ArcData( None, None, None, params)
            ary.init_frames(image_type, frame_x, frame_y)
            for fno in l_frame :
                length, image_type, frame_x, frame_y = _retrieve.frame_info(
                                            self.__desc, ch_no, fno)
                block = _retrieve.frame_data(self.__desc, ch_no, fno, length)
                ary.add_frame(block)
                                   
        except _retrieve.error as xxx_todo_changeme2:
            (efunc,emes,ecode) = xxx_todo_changeme2.args
            self._end()
            raise RetrieveError(efunc,emes,ecode)
            return
        
        return ary
        
    
    @classmethod
    def version(cls):
        return _retrieve.version()

[ コンストラクタ ] < 引数 > timeout(int) : データの出現を待つ時間(秒) default=0 : no wait server(string) : データ取得ホスト(ホスト指定) default=None : INDEXのSHOTテーブルを参照する。 path(string) : データ取得時のパス(ホスト指定) default=None : INDEXのSHOTテーブルを参照する。 port(int) : データ転送サーバ(transd)のサービスポート番号 default=None : INDEXのSHOTテーブル等を参照する。

Class variables

var RANGE_EXP

The type of the None singleton.

var RANGE_FRAMES

[ クラス名 ] Retriever < パブリックメンバー > timeout(int) : 取得時の待ち時間(秒) 0は待ち時間なし server(string) : データ取得ホスト(ホスト指定) path(string) : データ取得時のパス(ホスト指定) port(int) : データ転送サーバ(transd)のサービスポート番号

< 説明 > LABCOM計測データの取得制御クラス

var RANGE_NOSET

The type of the None singleton.

var RANGE_SAMPLES

The type of the None singleton.

var RANGE_TRIG

The type of the None singleton.

Static methods

def version()

Methods

def get(self, diag, shot, sub_shot, channels, range_type=0, range_str='', first_read=True)
Expand source code
    def get(self, diag, shot, sub_shot, channels, range_type=0, range_str='', first_read=True) :
        """
    [ 関数名 ] get
    < 引数 >
      diag(string)   : 取得したいデータの計測名
      shot(int)      : 取得したいデータのショット番号
      sub_shot(int)  : 取得したいデータのサブショット番号
      channels(int,str,[],())
                       : 取得したいデータのチャネル番号,信号名 
      range_type(int)  : 取得範囲の種別
      range_str(string): 取得範囲の文字列
      first_read(bool) : True, read channel data at first.
                                  
    < 返値 >
      ArcDataオブジェクトまたは配列
    < 説明 >
      計測データを取得する。
      可能であれば、電圧値に変換する。
    < 例外 >
      TypeError     : チャネル番号の型があわない。
      ValueError    : チャネル番号が不正である。
      RetrieveError : retrieveライブラリでエラーが発生した。

        """
#
#      前回のget(),get_frames()時と同じdiag,shot,sub_shotでないならば、close、openする。
#      このメソッドの中ではcloseしないが、エラーが発生したらcloseする。
#     closeはデストラクタで行う。
#
        is_list = False
        try:
            if( 1 > self.__desc or shot != self.__shot or 
                sub_shot != self.__sub_shot or diag != self.__diag or
                range_type != self.__range_type or range_str != self.__range_str) :
                self._end()
                if self.server is None or self.path is None :
                    self.__desc = _retrieve.open_range(diag, '', shot, sub_shot, 
                                                self.timeout, range_type, range_str)
                else:
                    self.__desc = _retrieve.open_direct(
                                  diag, self.server, self.path, shot, sub_shot, 
                                                self.port, self.timeout)
                self.__diag = diag;
                self.__shot = shot;
                self.__sub_shot = sub_shot;
                self.__range_type = range_type;
                if Retriever.RANGE_NOSET == range_type :
                    self.__range_str = '';
                else :
                    self.__range_str = range_str;
                    
            n_channel, s_year, s_month, s_day, s_hour , s_min , s_sec, \
              s_management, s_comment, s_server = \
                                        _retrieve.shot_info(self.__desc)
            if isinstance(channels, list ) or isinstance(channels, tuple ) :
                is_list = True
                l_channel = channels
            elif isinstance(channels, int ) :
                if channels == 0 :
                    is_list = True
                    l_channel = list(range(1,n_channel+1))
                else :
                    l_channel = [channels]
            elif isinstance(channels, str ) :
                l_channel = [channels]
            else :
                raise TypeError("channel")
 
            for x_channel in l_channel :
                if isinstance(x_channel, int ) :
                    if n_channel < x_channel or 1 > x_channel :
                        raise ValueError("Illegal channel number(%d)" % x_channel)
                                
            if first_read :
                _retrieve.make_ch_pool(self.__desc, l_channel)

            if is_list :
                ret_obj = []
                
            for x_channel in l_channel :                
                ch_no, byte_length, comp_length, param_count, data_type, \
                   image_type, value_len, is_nframe, c_management, c_comment \
                   = _retrieve.ch_info(self.__desc, x_channel)
                   
                params = _retrieve.ch_params(self.__desc, ch_no)
                
                if 0 == is_nframe :
                    data_length, image_type = _retrieve.to_data_len(
                                            byte_length, image_type, value_len)
                    if 0 == self.raw_mode :
                        try:
                            syn_num = _retrieve.ch_v_synthesized_number(self.__desc, ch_no)
                            if 0 < syn_num :
                                data_length = data_length // syn_num
                                block = _retrieve.ch_volts_dbl(self.__desc, ch_no, data_length)
                                image_type = 'FLT64'
                            else :
                                block = _retrieve.ch_data(self.__desc, ch_no, byte_length)

                        except _retrieve.error as xxx_todo_changeme:
                            (efunc,emes,ecode) = xxx_todo_changeme.args
                            if -122 == ecode : 
                                block = _retrieve.ch_data(self.__desc, ch_no, byte_length)
                                warnings.warn("Data type is not voltage.")
                            else :
                                   raise RetrieveError(efunc,emes,ecode)
                    else:
                        try:
                            block = _retrieve.ch_data(self.__desc, ch_no, byte_length)

                        except _retrieve.error as xxx_todo_changeme:
                            (efunc,emes,ecode) = xxx_todo_changeme.args
                            raise RetrieveError(efunc,emes,ecode)

                    try:
                        sampling_cycle, trigger_delay, start_timing, first_adjust, num_times \
                          = _retrieve.time_info( self.__desc, ch_no)
                    except:
                        sampling_cycle = None
                        start_timing = None
                        num_times = None
                        first_adjust= None
                        
                    ary = ArcData( start_timing+first_adjust, sampling_cycle, None, params, num_times)
#                ary.set_samples(image_type, block, byte_length)
                    ary.set_samples(image_type, block)
                     
                else:
                    length, image_type, frame_x, frame_y = _retrieve.frame_info(
                                                    self.__desc, ch_no, 1)
                    bytes = _retrieve.bytes_per_data(image_type, value_len)
                    byte_length = frame_x * frame_y * bytes
                    ary = ArcData( None, None, None, params)
                    ary.init_frames(image_type, frame_x, frame_y)
                    for fno in range(1, is_nframe+1) :
                        length, image_type, frame_x, frame_y = _retrieve.frame_info(
                                                    self.__desc, ch_no, fno)
                        block = _retrieve.frame_data(self.__desc, ch_no, fno, length)
#                    ary.add_frame(block, length)
                        ary.add_frame(block)
                        
                if is_list :
                    ret_obj.append( ary)
                                   
        except _retrieve.error as xxx_todo_changeme1:
            (efunc,emes,ecode) = xxx_todo_changeme1.args
            self._end()
            raise RetrieveError(efunc,emes,ecode)
            return
        
        if is_list  :
            return ret_obj
        else :
            return ary

[ 関数名 ] get < 引数 > diag(string) : 取得したいデータの計測名 shot(int) : 取得したいデータのショット番号 sub_shot(int) : 取得したいデータのサブショット番号 channels(int,str,[],()) : 取得したいデータのチャネル番号,信号名 range_type(int) : 取得範囲の種別 range_str(string): 取得範囲の文字列 first_read(bool) : True, read channel data at first.

< 返値 > ArcDataオブジェクトまたは配列 < 説明 > 計測データを取得する。 可能であれば、電圧値に変換する。 < 例外 > TypeError : チャネル番号の型があわない。 ValueError : チャネル番号が不正である。 RetrieveError : retrieveライブラリでエラーが発生した。

def get_frames(self, diag, shot, sub_shot, channel, frames, first_read=True)
Expand source code
    def get_frames(self, diag, shot, sub_shot, channel, frames, first_read=True) :
        """
    [ 関数名 ] get_frames
    < 引数 >
      diag(string)      : 取得したいデータの計測名
      shot(int)         : 取得したいデータのショット番号
      sub_shot(int)     : 取得したいデータのサブショット番号
      channel(int,str)  : 取得したいデータのチャネル番号 
      frames(int,[],()) : 取得したいデータのフレーム番号 
      first_read(bool)  : True, read channel data at first.
                                  
    < 返値 >
      ArcDataオブジェクト
    < 説明 >
      フレームを指定して、データを取得できる。 ただし、フレーム構造の計測データ(画像)のみである。
    < 例外 >
      TypeError     : チャネル番号が型があわない。
      ValueError    : チャネル番号が不正である。
      RetrieveError : retrieveライブラリでエラーが発生した。

        """
#
#      前回のget(),get_frames()時と同じdiag,shot,sub_shotでないならば、close、openする。
#      このメソッドの中ではcloseしないが、エラーが発生したらcloseする。
#      closeはデストラクタで行う。
#
        try:
            if( 1 > self.__desc or shot != self.__shot or 
                sub_shot != self.__sub_shot or diag != self.__diag ) :
                self._end()
                if self.server is None or self.path is None :
                    self.__desc = _retrieve.open(diag, '', shot, sub_shot, 
                                                self.timeout)
                else:
                    self.__desc = _retrieve.open_direct(
                                  diag, self.server, self.path, shot, sub_shot, 
                                                self.port, self.timeout)
                self.__diag = diag;
                self.__shot = shot;
                self.__sub_shot = sub_shot;
                    
                    
            n_channel, s_year, s_month, s_day, s_hour , s_min , s_sec, \
              s_management, s_comment, s_server = \
                                        _retrieve.shot_info(self.__desc)
                                        
            if isinstance(channel, int ) :
                if n_channel < channel or 1 > channel :
                    raise ValueError("Illegal channel number(%d)" % channel)
            elif not isinstance(channel, str ) :
                raise ValueError("channel")
            
            ch_no, byte_length, comp_length, param_count, data_type, \
                   image_type, value_len, is_nframe, c_management, c_comment \
                   = _retrieve.ch_info(self.__desc, channel)
            if 1 > is_nframe :
                raise TypeError("channel")  
                
            if isinstance(frames, list ) or isinstance(frames, tuple ) :
                l_frame = frames
            elif isinstance(frames, int ) :
                if frames == 0 :
                    l_frame = list(range(1,is_nframe+1))
                else :
                    l_frame = [frames]
            else :
                raise TypeError("frame")
 
            for fno in l_frame :
                if isinstance(fno, int ) :
                    if is_nframe < fno or 1 > fno :
                        raise ValueError("Illegal frame number(%d)" % fno)
                    
                else :
                    raise TypeError("frame")
                
            params = _retrieve.ch_params(self.__desc, ch_no)
            
            if first_read :
                _retrieve.make_ch_pool(self.__desc, ch_no)
         
            length, image_type, frame_x, frame_y = _retrieve.frame_info(
                                            self.__desc, ch_no, 1)
            bytes = _retrieve.bytes_per_data(image_type, value_len)
            byte_length = frame_x * frame_y * bytes
            ary = ArcData( None, None, None, params)
            ary.init_frames(image_type, frame_x, frame_y)
            for fno in l_frame :
                length, image_type, frame_x, frame_y = _retrieve.frame_info(
                                            self.__desc, ch_no, fno)
                block = _retrieve.frame_data(self.__desc, ch_no, fno, length)
                ary.add_frame(block)
                                   
        except _retrieve.error as xxx_todo_changeme2:
            (efunc,emes,ecode) = xxx_todo_changeme2.args
            self._end()
            raise RetrieveError(efunc,emes,ecode)
            return
        
        return ary

[ 関数名 ] get_frames < 引数 > diag(string) : 取得したいデータの計測名 shot(int) : 取得したいデータのショット番号 sub_shot(int) : 取得したいデータのサブショット番号 channel(int,str) : 取得したいデータのチャネル番号 frames(int,[],()) : 取得したいデータのフレーム番号 first_read(bool) : True, read channel data at first.

< 返値 > ArcDataオブジェクト < 説明 > フレームを指定して、データを取得できる。 ただし、フレーム構造の計測データ(画像)のみである。 < 例外 > TypeError : チャネル番号が型があわない。 ValueError : チャネル番号が不正である。 RetrieveError : retrieveライブラリでエラーが発生した。