Changeset 786 for SHX/trunk


Ignore:
Timestamp:
10/17/12 18:15:08 (8 years ago)
Author:
marcus
Message:
  • further work on meta data
File:
1 edited

Legend:

Unmodified
Added
Removed
  • SHX/trunk/SeismicHandler/modules/stations.py

    r783 r786  
    88import sqlalchemy.orm as orm 
    99from sqlalchemy.ext.declarative import declarative_base 
    10 import warnings 
    1110 
    1211from obspy.core import UTCDateTime 
     
    2726    id = sa.Column(sa.Integer, primary_key=True) 
    2827 
     28    # GrÀfenberg A1 
     29    description = sa.Column(sa.Unicode(length=100), default=u"") 
    2930    # GR.GRA1..BHZ 
    3031    channel = sa.Column(sa.String(length=15)) 
     32    # GR 
    3133    network = sa.Column(sa.String(length=2), index=True) 
     34    # GRA1X 
    3235    station = sa.Column(sa.String(length=5), index=True) 
     36    # 01 
    3337    location = sa.Column(sa.String(length=2), index=True) 
     38    # BH 
    3439    stream = sa.Column(sa.String(length=2), index=True) 
     40    # Z 
    3541    component = sa.Column(sa.String(length=1), index=True) 
     42    # GRF 
     43    arraycode = sa.Column(sa.String(length=10), index=True, default=None) 
    3644    # SQL does not always support datetime with microseconds 
    3745    ondate = sa.Column(sa.DateTime, index=True) 
     
    3947    offdate = sa.Column(sa.DateTime, index=True) 
    4048    offdatems = sa.Column(sa.Integer, index=True) 
    41     latitude = sa.Column(sa.Numeric(precision=13)) 
    42     longitude = sa.Column(sa.Numeric(precision=13)) 
     49    latitude = sa.Column(sa.Float(precision=13)) 
     50    longitude = sa.Column(sa.Float(precision=13)) 
    4351    elevation = sa.Column(sa.Float(precision=2)) 
    4452    depth = sa.Column(sa.Float(precision=2), default=0.) 
    45     gain = sa.Column(sa.Float(precision=5)) 
     53    # array coordinate offset 
     54    offsetx = sa.Column(sa.Float(precision=3), default=None) 
     55    offsety = sa.Column(sa.Float(precision=3), default=None) 
     56    gain = sa.Column(sa.Float(precision=5), default=1.) 
    4657    zeros = sa.Column(sa.Text) 
    4758    poles = sa.Column(sa.Text) 
     
    5364 
    5465    def __init__(self, network, station, location, stream, component, \ 
    55                        latitude, longitude, elevation, depth, gain, poles, \ 
    56                        zeros, start, end=None): 
     66                       arraycode, latitude, longitude, elevation, depth, \ 
     67                       offsetx, offsety, gain, poles, zeros, start, end=None, \ 
     68                       description=""): 
    5769 
    5870        self.channel = ".".join([network, station, location, \ 
     
    6678        del keys[keys.index("end")] 
    6779 
     80        # save all other information into object 
    6881        for i in keys: 
    6982            setattr(self, i, locals()[i]) 
     
    93106    def __getattr__(self, name): 
    94107        """ 
    95         Special handling for start and end date, combination of network and 
    96         station (netstation) and location, stream and component (lsc). 
    97         """ 
    98         if name.lower() not in ["start", "end", "netstation", "lsc"]: 
     108        Special handling for start and end date, combination of network,  
     109        station and location (name) and location, stream and component (canal). 
     110        """ 
     111        if name.lower() not in ["start", "end", "name", "canal"]: 
    99112            return self.__getattribute__(name) 
    100113 
    101         if name.lower() == "netstation": 
    102             return ".".join([self.__dict__["network"], self.__dict__["station"]]) 
    103  
    104         if name.lower() == "lsc": 
     114        if name.lower() == "name": 
    105115            return ".".join([ 
     116                self.__dict__["network"], 
     117                self.__dict__["station"], 
    106118                self.__dict__["location"], 
     119            ]) 
     120 
     121        if name.lower() == "canal": 
     122            return "".join([ 
    107123                self.__dict__["stream"], 
    108124                self.__dict__["component"] 
     
    181197     
    182198    stations = {} 
     199    channels = {} 
    183200 
    184201    dbsessions = {} 
     
    209226         
    210227        for i in data: 
    211             if not i.netstation in self.stations: 
    212                 self.stations[i.netstation] = {} 
     228            if not i.name in self.stations: 
     229                self.stations[i.name] = {} 
    213230 
    214231            try: 
    215                 self.stations[i.netstation][i.lsc].append(i) 
     232                self.stations[i.name][i.canal].append(i) 
     233                self.channels[i.channel].append(i) 
    216234            except KeyError: 
    217                 self.stations[i.netstation][i.lsc] = [i] 
     235                self.stations[i.name][i.canal] = [i] 
     236                self.channels[i.channel] = [i] 
    218237 
    219238#        print self.stations 
     
    227246 
    228247        # init db session only if necessary 
    229         if create and not self.dbsessions.get(db, None): 
     248        if create and self.dbsessions.get(db, None) is None: 
    230249            engine = sa.create_engine(db) 
    231250 
     
    237256 
    238257        try: 
    239             # since we don't do accounting calculations the decimal engine 
    240             # warning will be supressed... 
    241             warnings.simplefilter("ignore") 
    242             all = self.dbsessions[db].query(ChannelMeta).order_by("ondate").all() 
    243             warnings.resetwarnings() 
    244             return all 
     258            a = self.dbsessions[db].query(ChannelMeta).order_by("ondate").all() 
     259            return a 
    245260        except KeyError: 
    246261            return [] 
    247262 
    248     def __getitem__(self, code, date=None): 
    249         """ 
    250         Return channel meta data from channel code and time information. 
    251         """ 
    252         import pdb; pdb.set_trace() 
    253         channel, dt = channeldate 
    254         print "xxx", channel 
    255  
    256         # check for overlapping data from rw to readonly db 
    257         # first: identical datasets 
    258 #        double = set(data) & set(data_read) 
    259 #        print double 
    260 #        for i in double: 
    261 #            if data[i] != data_read[i]: 
    262 #                self.logger.critital("Concurrent data found for channel: %s " 
    263 #                                     "WARNING: It's very likely that you use " 
    264 #                                     "outdated channel information!", 
    265 #                                     i 
    266 #                                    ) 
    267 #            if data_read[i].fir and data_read[i].fir != data[i].fir: 
    268 #                self.logger.warning("Concurrent FIR data for channel: %s ", 
    269 #                                     i 
    270 #                                    ) 
    271  
     263    def __getitem__(self, codedate): 
     264        """ 
     265        Return channel meta data from channel code and time information. Input 
     266        parameter "codedate" is supposed to be a string containing the channels 
     267        code or a list/tuple of channel and UTCDateTime information. 
     268        """ 
     269        try: 
     270            code, date = codedate 
     271        except: 
     272            code = codedate 
     273            date = UTCDateTime() 
     274 
     275        meta = self.channels.get(code, None) 
     276        if meta is None: 
     277            raise KeyError("no meta data found at all for '%s'" % code) 
     278 
     279        match = None 
     280        for m in meta: 
     281            if m.start > date: 
     282                continue 
     283 
     284            # None == open end 
     285            if m.end is not None and m.end < date: 
     286                continue 
     287 
     288            match = m 
     289            break 
     290 
     291        if match: 
     292            return match 
     293 
     294        raise KeyError("no meta data of '%s' found for '%s'" % (code, date)) 
    272295 
    273296    def add(self, station): 
     
    277300        # XXX check for update -> dirty session 
    278301 
    279         GRA1 = ChannelMeta( 
    280             network="GR", 
    281             station="GRA1", 
    282             location="", 
    283             stream="BH", 
    284             component="Z", 
    285             latitude=49.691888, 
    286             longitude=11.221720, 
    287             elevation=499.5, 
    288             depth=0, 
    289             gain=0.6e9, 
    290             zeros="(0.0,0.0) (0.0,0.0)", 
    291             poles="(-0.037004,0.037016) (-0.037004,-0.037016)", 
    292             start=UTCDateTime("2006-05-10T16:00:00.000"), 
    293         ) 
    294         # GRA1.fir = [FiR(0, "0 1 2 3 4 5 6"), FiR(1, "1 2 3 4 5")] 
     302        if not isinstance(station, ChannelMeta): 
     303            raise ValueError("Wrong data type") 
    295304 
    296305        session = self.dbsessions[self.dbreadwrite] 
     
    299308        try: 
    300309            session.commit() 
    301         except: 
     310        except Exception as e: 
     311            print e 
    302312            session.rollback() 
    303313 
     
    338348    return final 
    339349 
     350GRA1 = ChannelMeta( 
     351    description=u"GrÀfenberg A1 array station", 
     352    network="GR", 
     353    station="GRA1", 
     354    location="", 
     355    stream="BH", 
     356    component="Z", 
     357    arraycode="GRF", 
     358    latitude=49.691888, 
     359    longitude=11.221720, 
     360    elevation=499.5, 
     361    depth=0, 
     362    offsetx=0.102153, 
     363    offsety=0.109822, 
     364    gain=0.6e9, 
     365    zeros="(0.0,0.0) (0.0,0.0)", 
     366    poles="(-0.037004,0.037016) (-0.037004,-0.037016)", 
     367    start=UTCDateTime("2006-05-10T16:00:00.000"), 
     368) 
     369# GRA1.fir = [FiR(0, "0 1 2 3 4 5 6"), FiR(1, "1 2 3 4 5")] 
    340370 
    341371if __name__ == "__main__": 
Note: See TracChangeset for help on using the changeset viewer.