Программа ВВП

Здесь ВВП это не Валовый Внутренный Продукт и даже не Владимир-свет Владимирович сами-знаете-кто.

У меня свой ВВП — Вьювер Вызванных Потенциалов, Вьювер ВП.

vvp

Наконец-то начали мы получать информацию о нашей Землице-матушке. И стало надобно нам как-то эту информацию смотреть.

А данные попёрли со скоростью получаемых данных с LHC (Большого Гудронного Коллайдера, что на границе Франции-Швейцарии окопался на глубине 100 метров). Ну, хорошо-хорошо! Приврал. Маленько. Ну, с кем не бывает. Но данных всё-равно реально очень много.

Вот, только очень тонкий «срез» этих данных. Здесь из нескольких десятков тысяч точек представлено всего пять:

0 -25025 847 696 25 31 502 502 501 501 502 741 751 751 750 750 750 750 750 750 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 749 748 748 748 748 748 748 748 748 748 748 748 748 748 748 748 748 748 749 749 748 749 749 749 749 749 749 749 749 749 748 748 748 748 748 748 749 748 749 749 749 748 749 749 748 749 748 749 749 749 749 749 749 749 749 749 749 748 749 748 749 748 526 512 511 510 509 509 509 509 509 508 508 508 507 507 507 507 507 507 507 507 507 507 507 507 506 506 506 506 506 506 506 506 506 506 506 506 506 506 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 504 505 505 505 505 505 504 504 504 504 504 504 504 504 504 504 505 504 504 504 504 504 504 504 504 504 504 504 504 504 504 277 265 264 264 265 264 265 265 265 265 265 265 265 265 265 265 266 266 266 266 266 266 266 266 266 266 266 266 266 266 267 267 267 266 267 267 267 266 266 266 266 266 266 266 267 266 266 266 267 267 267 267 267 266 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 268 268 267 268 268 268 268 268 268 267 267 268 268 268 268 268 268 268 479 495 496 497 497 498 498 498 498 499 499 499 499 499 499 499 499 499 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 501 500 500 500 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 847 713 7316 8288 2573 12249 8901 7459 6805 7286 7083 0
0 -25054 848 692 15 31 500 500 500 500 500 714 725 726 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 728 728 728 728 728 728 728 728 727 728 728 727 728 727 727 727 727 727 727 726 727 727 727 726 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 727 728 727 727 530 515 513 512 511 511 511 510 510 509 510 509 509 508 508 508 508 508 507 507 507 506 507 507 507 507 507 507 506 506 506 506 506 506 505 506 506 506 506 506 506 506 506 506 506 506 506 506 505 506 505 505 505 505 504 504 504 504 504 504 504 504 503 503 503 504 504 504 504 504 504 504 504 503 504 504 504 504 504 503 503 503 503 503 503 503 502 503 503 503 503 503 503 503 503 503 503 503 503 503 249 236 236 237 237 237 238 238 238 238 238 238 238 238 239 239 239 239 238 239 239 238 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 239 240 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 240 239 240 239 239 240 240 240 240 239 240 240 239 239 239 239 239 239 239 239 239 239 239 239 240 239 239 239 240 240 240 480 496 497 498 498 498 498 498 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 500 500 500 500 499 499 499 499 499 500 499 500 500 500 500 500 501 501 501 501 501 501 500 501 501 501 500 500 500 500 500 500 500 500 500 499 499 500 499 499 499 499 500 499 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 499 500 500 500 500 500 500 500 500 500 500 500 500 500 500 848 708 7317 8275 2573 12276 8899 7459 6815 7288 7083 0
0 -25081 849 693 27 32 501 501 501 501 501 748 758 759 759 759 758 758 758 758 758 758 757 757 757 757 757 757 757 757 757 757 757 757 757 757 757 757 757 757 757 757 757 757 756 756 756 757 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 755 755 756 756 756 755 755 755 755 755 756 755 755 755 755 755 755 755 755 755 755 755 755 531 515 513 512 511 511 510 510 509 509 509 509 509 508 508 508 508 508 507 507 507 507 507 507 507 507 507 506 506 507 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 505 505 505 505 505 505 505 505 505 505 505 505 504 505 505 504 505 504 505 505 504 504 504 505 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 504 253 241 241 240 241 241 242 242 242 242 242 242 242 242 243 243 243 243 243 243 243 243 243 243 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 245 244 245 245 245 245 244 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 246 245 245 245 245 245 245 245 246 245 245 245 245 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 481 496 498 498 499 499 499 500 499 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 501 500 501 500 501 500 500 501 500 500 501 501 501 500 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 849 707 7317 8262 2572 12216 8892 7461 6781 7286 7084 0
0 -25109 850 689 20 31 502 502 502 502 502 752 763 763 763 762 762 763 762 762 762 762 762 762 762 762 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 760 760 761 760 761 761 761 761 761 761 761 760 761 761 761 761 761 761 761 761 761 761 761 761 761 761 761 760 760 761 760 761 761 761 761 761 761 761 761 761 761 761 761 761 760 761 761 760 761 761 760 760 761 761 760 761 761 761 529 515 513 512 512 511 511 510 510 510 510 509 509 509 509 509 508 508 508 509 508 508 508 508 507 508 507 507 507 507 507 507 507 507 507 506 506 506 506 507 507 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 506 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 260 247 246 247 247 247 247 247 247 247 248 248 248 248 248 249 248 249 249 249 249 249 249 249 249 249 249 249 249 249 250 249 249 250 249 250 250 249 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 251 250 250 250 250 250 250 250 251 251 251 251 251 250 250 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 480 497 498 498 499 499 500 499 500 500 500 500 500 500 500 500 501 501 501 501 501 501 501 501 501 501 501 502 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 502 502 502 501 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 850 712 7317 8256 2573 12208 8865 7458 6725 7275 7084 0
0 -25138 851 694 7 31 502 502 502 502 502 741 752 753 753 753 753 753 753 752 753 753 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 752 751 752 752 752 751 751 751 752 752 751 751 751 751 751 751 751 751 752 751 751 751 751 752 751 751 751 751 751 751 751 751 752 751 751 751 751 751 751 751 751 751 751 751 751 751 751 751 751 751 751 751 751 751 531 516 514 513 512 512 511 511 510 510 510 509 509 509 509 509 509 509 508 508 508 508 508 508 508 507 508 507 507 507 507 507 507 507 507 507 507 507 507 507 507 507 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 506 505 505 506 506 505 506 506 505 505 505 506 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 505 504 505 505 505 505 255 243 243 243 243 243 243 243 243 244 244 244 244 244 244 245 245 245 245 245 245 245 245 245 245 245 246 246 246 245 245 245 246 245 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 247 247 247 246 247 246 247 247 247 247 247 247 247 247 247 247 246 247 247 247 246 247 247 247 247 247 247 247 247 247 247 247 247 247 483 498 499 500 500 500 500 501 500 500 501 500 501 501 501 501 501 501 501 501 501 501 501 501 501 501 501 502 501 501 502 501 502 502 501 502 502 502 502 502 502 501 502 501 501 502 501 502 502 502 502 502 502 502 502 502 501 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 502 501 502 502 502 502 502 502 502 502 502 502 502 502 502 502 851 709 7317 8255 2573 12216 8872 7457 6746 7278 7085 0

В общем, смотри-не смотри на цифры — толку мало. Ничего не увидишь! Поэтому единственный способ узрить интересное — это смотреть на представление этой информации в виде кривых на графиках. Можно, конечно, воспользоваться ворованным Excel-Киселём, или даже по случаю приобрести таковой. Но…

— Это же не наши методы! Шурик!? (с) фраза из к/ф «Приключения Шурика»

Поэтому будем писать свою прогу, которая будет делать то, что нам нужно. Вопрос в выборе инструмента или языка программирования.

Я, в общем-то, не держу секретов от своих клиентов-геофизиков и скрывать мне свои засранки в коде не приспичило. Поэтому вопрос с выбором языка программирования вообще не стоял — однозначно Питон!

Честно говоря, прога была написана давненько — месяца два назад, а то и больше. Сейчас пришлось её слегка переписать и выпустить вторую версию, чем, собственно, я и решил поделиться с прогрессивной частью общества.

Изучайте! Вдруг кому-то пригодится. Весь код в одном файле.

#!/usr/bin/env python
#coding:utf-8

'''
Вьювер Ввзванных Потенциалов
версия 2 от 28.01.2015
'''

import wx
import os
import wx.lib.plot as plot

################################################################################
class MyCanvas(plot.PlotCanvas):
#-------------------------------------------------------------------------------
  def __init__(self, parent, id, umn):
    plot.PlotCanvas.__init__(self, parent, id, style=wx.SUNKEN_BORDER)
    self.umn = umn
    
#-------------------------------------------------------------------------------
  def Redraw(self):
    line = plot.PolyLine(self.umn, legend='', colour='red', width=2)
    tmax = len(self.umn)
    gc = plot.PlotGraphics([line], 'Импульсы НП', 'Точка', 'Напряжение')
    tmax = len(self.umn) - 5  # должно быть всегда 400
    self.Draw(gc, xAxis=(-5, tmax), yAxis=(-2.5, 2.5))
  

################################################################################
class MyFrame(wx.Frame):
#-------------------------------------------------------------------------------
  def __init__(self, parent, title):
    wx.Frame.__init__(self, parent, title=title, size=(1000, 500))
    self.np = []
    
    self.canvas = MyCanvas(self, wx.ID_ANY, [])
    self.canvas.SetEnableGrid(True)    
    
    self.slider = wx.Slider(self, wx.ID_ANY)
    self.Bind(wx.EVT_SLIDER, self.OnSlider, self.slider)
        
    self.btnFirst = wx.Button(self, wx.ID_ANY, "Начало")
    self.btnFirst.Disable()    
    self.btnPrev = wx.Button(self, wx.ID_ANY, "Назад")
    self.btnPrev.Disable()
    self.txtPosition = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_CENTER|wx.TE_READONLY)
    self.btnNext = wx.Button(self, wx.ID_ANY, "Вперед")
    self.btnNext.Disable()
    self.btnLast = wx.Button(self, wx.ID_ANY, "Конец")
    self.btnLast.Disable()    
    btnLoad = wx.Button(self, wx.ID_OPEN, "Загрузить")
    
    self.Bind(wx.EVT_BUTTON, self.OnFirst, self.btnFirst)
    self.Bind(wx.EVT_BUTTON, self.OnPrev, self.btnPrev)
    self.Bind(wx.EVT_BUTTON, self.OnNext, self.btnNext)
    self.Bind(wx.EVT_BUTTON, self.OnLast, self.btnLast)
    self.Bind(wx.EVT_BUTTON, self.OnLoad, btnLoad)
    
    #self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

    self.stxtUMN0 = wx.StaticText(self, label="Смещение нуля")
    self.txtUMN0 = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_CENTER)
    self.txtUMN0.SetValue("500")
    self.stxtKUMN = wx.StaticText(self, label="Усиление")
    self.txtKUMN = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_CENTER)
    self.txtKUMN.SetValue("0.00582")

    sizer0 = wx.BoxSizer(wx.VERTICAL)
    sizer1 = wx.BoxSizer(wx.HORIZONTAL)
    sizer2 = wx.BoxSizer(wx.HORIZONTAL)
    sizer3 = wx.BoxSizer(wx.HORIZONTAL)

    sizer1.Add(self.slider, 1, flag=wx.ALL|wx.EXPAND|wx.FIXED_MINSIZE , border=8)

    sizer2.Add(self.btnFirst)
    sizer2.Add(self.btnPrev)
    sizer2.Add(self.txtPosition)
    sizer2.Add(self.btnNext)
    sizer2.Add(self.btnLast)
    sizer2.AddSpacer(40)
    sizer2.Add(btnLoad)

    sizer3.Add(self.stxtUMN0, flag=wx.ALL, border=4)
    sizer3.Add(self.txtUMN0)
    sizer3.Add(self.stxtKUMN, flag=wx.ALL, border=4)
    sizer3.Add(self.txtKUMN)

    sizer0.Add(self.canvas, 1, flag=wx.ALL|wx.EXPAND|wx.FIXED_MINSIZE, border=8)
    sizer0.Add(sizer1, flag=wx.ALL|wx.EXPAND|wx.FIXED_MINSIZE, border=8)
    sizer0.Add(sizer2, flag=wx.ALL, border=8)
    sizer0.Add(sizer3, flag=wx.ALL, border=8)

    self.SetSizer(sizer0)
    self.Layout()

#-------------------------------------------------------------------------------
  def OnSlider(self, event):
    self.indexNp = self.slider.GetValue()
    self.UpdateButtons()
    self.ShowNp()

#-------------------------------------------------------------------------------
  def OnFirst(self, event):
    self.indexNp = 0
    self.slider.SetValue(0)
    self.UpdateButtons()
    self.ShowNp()

#-------------------------------------------------------------------------------
  def OnPrev(self, event):
    self.indexNp -= 1
    self.slider.SetValue(self.indexNp)
    self.UpdateButtons()
    self.ShowNp()
 
#-------------------------------------------------------------------------------
  def OnNext(self, event):
    self.indexNp += 1
    self.slider.SetValue(self.indexNp)
    self.UpdateButtons()
    self.ShowNp()

#-------------------------------------------------------------------------------
  def OnLast(self, event):
    self.indexNp = len(self.np) - 1
    self.slider.SetValue(self.indexNp)
    self.UpdateButtons()
    self.ShowNp()

#-------------------------------------------------------------------------------
  def GetUMN0(self):
    Umn = 0.0
    n = 0

    for line in self.np:
      l = line.split()[6:11]
      if l[2] != "0":
        n += 1
        for txtUmn in l:
          Umn += float(txtUmn)
     
    if n != 0:
      Umn0 = int(round(Umn / (5 * n)))
    else:
      Umn0 = 0
    
    return Umn0
   

#-------------------------------------------------------------------------------
  '''
  def OnKeyDown(self, event):
    keycode = event.GetKeyCode()
    print "key = ". ord(keycode)
    if keycode == wx.WXK_HOME:
      self.indexNp = 0
      self.UpdateButtons()
      self.ShowNp()
    elif keycode == wx.WXK_END:
      self.indexNp = len(self.np) - 1
      self.UpdateButtons()
      self.ShowNp()
  '''

#-------------------------------------------------------------------------------
  def UpdateButtons(self):
    self.txtPosition.SetValue(str(self.indexNp))
    if len(self.np) <= 1:
      self.btnFirst.Disable()
      self.btnPrev.Disable()
      self.btnNext.Disable()
      self.btnLast.Disable()
    else:
      if self.indexNp == 0:
        self.btnFirst.Disable()
        self.btnPrev.Disable()
      else:
        self.btnFirst.Enable()
        self.btnPrev.Enable()
      
      if self.indexNp == (len(self.np) - 1):
        self.btnNext.Disable()
        self.btnLast.Disable()
      else:
        self.btnNext.Enable()
        self.btnLast.Enable()
    
#-------------------------------------------------------------------------------
  def OnLoad(self,event):
    dirname = ''
    dlgOpen = wx.FileDialog(self, "Файл с каротажными данными", dirname, "", "*", wx.OPEN)
    if dlgOpen.ShowModal() == wx.ID_OK:
      filename = dlgOpen.GetFilename()
      dirname = dlgOpen.GetDirectory()
      f = open(os.path.join(dirname, filename), "r")

      self.np = []
      self.btnPrev.Disable()
      self.btnNext.Disable()
      
      title = filename + u" - Вьювер Вызванных Потенциалов"
      wnd.SetTitle(title)

      while True:
       line = f.readline().strip()
       if line == "":
         break
       else:
         spl = line.split()
         self.np.append(line)
      f.close

      if len(self.np) > 1:
        self.btnNext.Enable()

      Umn0 = self.GetUMN0()
      self.txtUMN0.SetValue(str(Umn0))

      self.indexNp = 0
      self.slider.SetMax(len(self.np) - 1)
      self.slider.SetTickFreq(1, 100)
      self.UpdateButtons()
      self.ShowNp()
      

#-------------------------------------------------------------------------------
  def ShowNp(self):
    '''
    Заново нарисовать график
    '''
    Umn0 = int(self.txtUMN0.GetValue())
    Kmn = float(self.txtKUMN.GetValue())
    umn = []
    txtVals = self.np[self.indexNp].split()[6:411]
    for i in range(len(txtVals)):
      umn.append((i - 4, (int(txtVals[i]) - Umn0) * Kmn))
    self.canvas.umn = umn
    self.canvas.Redraw()
    
    
################################################################################
if __name__ == "__main__":
  app = wx.PySimpleApp(0)
  wnd = MyFrame(None, "Вьювер Вызванных Потенциалов")
  wnd.Show()
  app.MainLoop()

На всякий случай я предупрежу — я мог в проге накосячить и не заметить, так что, если чо, задавайте вопросы. Самое главное — увидьте, что ничего сложного в визуализации данных нет. Всё можно сделать своими ручкам.

Если нужен файл с каротажными данными, которые мы позавчера получили на скважине в Институте Геофизики АН СССР, то я его положил сюда (место уточняется).

По крайней мере, прога работает, и этой прогой можно «крутить» данные туда-сюда и не особо напрягаться в их изучении.

Реклама

2 responses to “Программа ВВП

  1. интересует М2Д

    • Ну тогда задавайте вопросы, что Вас конкретно интересует.

      Первые коммерческие поставки микросхемы уже состоялись. Люди собрали свои изделия. Микросхема у людей работает. Вопросы по ней возникают чисто технического характера, типа «как настроить частоты генераторов» или «по какой схеме собрать приёмник и передатчик».

      Опыта работы с микросхемой наработано ещё очень мало. Её только-только начали использовать. Поэтому FAQ ещё не набран. Поэтому консультирую пока в он-лайн режиме.

      Пока так.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s