파이썬 클로저

파이썬 클로저가 뭔지 모르고 있었는데 나도 모르게 제대로 쓰고 있었다는 사실을 깨달았다.

가령 여러개의 변수를 받는 f(x,y)가 있다고 하자. y=10으로 고정시키고 x를 바꿔가며 map을 하고 싶은데

map(f, [1,2,3])

이러면 f가 입력이 두개니까 안된다. 이 때.

def fx(x):

return f(x.1)

이렇게 해 놓고

map(fx, [1,2,3])

이렇게 쓰면 된다. 참 쉽죠?

람다 피클

파이썬에서 lambda함수는 pickle이 안된다. pickle이 뭔지는 나도 모른다.(!)

아무튼 lambda를 포함한 클래스를 multiprocessing을 하려고 시도했더니 pickle이 안된다면서 오류를 내뿜길래 다음과 같이 조치하였다.

원래: lambda y: SomeExpressionOfY(y)

참고로 이건 f=lambda y: SomeExpressionOfY(y) 처럼 이름을 붙여줘도 오류가 난다. 다음과 같이 명시적으로 정의해야 한다.

조치후:

def f(y):

return lambda y: SomeExpressionOfY(y)

왜 이렇게 하였는가?

사실 저 lambda 자리에 들어가야 할 것이 eval(“lambda y: …”)인 구문이기 때문이다. 물론 eval을 쓸 경우 해킹에 취약해진다는 문제가 발생하지만, 지금 구현중인 코드에서는 eval을 쓰지 않으면 매스매티카 급의 수식 파서를 만들어야 하는 문제가 생겨서 써야만 했다. 어차피 나 혼자 쓰거나, 배포하더라도 그걸 해킹해서 뭐하게 수준의 프로그램이라 별 문제는 없을 것으로 보인다.

파이썬 커리큘럼

파이썬을 배울 때 뭘 어떻게 찾아봐야 하는가?

  1. 파이썬의 (간략한) 역사
    1. 다른 언어와 비교할 때 파이썬의 특징
  2. 파이썬 설치하는 방법.
    1. 파이썬2? 파이썬3?
    2. 공식 리포지토리
    3. 인텔 파이썬
    4. pip
    5. numpy, scipy 등 추가 패키지 찾기, 설치하기
    6. (옵션) 리눅스, 맥에서는?
  3. 커맨드라인 파이썬 실행방법
  4. 파이썬 개발용 IDE 선택하기 및 설정하기
    1. geany
    2. IDLE
    3. 그 외
  5. 기초 문법
    1. Hello, world!
    2. 파이썬에서 들여쓰기에 관하여
    3. 주석 달기
    4. 한글 사용
    5. 변수, 함수, 클래스에 이름을 지어주는 방법
    6. 변수
      1. 변수의 선언
      2. 변수의 사용법
      3. 변수에 값 집어넣기와 값 복사하기
      4. 변수의 종류(type)
        1. 타입 지정, 타입 변환
      5. 리스트, 딕셔너리, 튜플
        1. 리스트의 사용법
          1. 시작은 0부터
          2. 가운데만 골라내기
          3. -1번째 요소
          4. 리스트에 사용할 수 있는 연산자 +, *
          5. 리스트의 메소드
          6. range
        2. 딕셔너리의 사용법
          1. 딕셔너리의 메소드
        3. 튜플의 사용법
          1. a, b = c, d
          2. 튜플의 메소드
        4. in
      6. 문자열 사용법
        1. escape 문자열
        2. 제어문자
        3. 문자열의 메소드
      7. 숫자
        1. 실수와 정수의 차이 – 점(.)을 찍는가 찍지 않는가
        2. 복소수 사용법
        3. 사칙연산 +, -, *, –
        4. 지수연산 **
        5. 나머지연산 %
        6. 크기 비교
        7. +=, -=, *=, /=
        8. 타입이 다른 숫자들 사이의 연산
        9. 연산자 우선순위
    7. 조건문
      1. True, False
      2. if, else, elif
      3. 연산자 “==”
      4. not, and, or
    8. 반복문
      1. for
      2. while
      3. break
      4. continue
    9. 예외처리
      1. try
      2. except
      3. error객체
      4. finally
      5. pass
    10. 함수
      1. 함수의 선언
      2. 함수의 사용법
        1. 변수의 전달 arg, kwds
      3. return을 쓰자
    11. 파일 다루는 방법
      1. 파일 만들기, 열기, 닫기
      2. 읽기, 쓰기, 추가하기
      3. 텍스트 파일, 바이너리 파일
      4. 파일이름과 경로명 다루기
    12. eval
    13. lambda
    14. map
    15. reduce
    16. filter
    17. 클래스
      1. 클래스와 객체와 인스턴스
      2. 클래스의 선언
      3. 클래스의 사용법
        1. 초기화
        2. 멤버변수(프로퍼티)
        3. 멤버함수(메소드)
        4. 클래스의 상속
          1. 다중상속
          2. self, parent
        5. 다형성
        6. 멤버 은폐하기(encapsulation)
    18. 라이브러리 불러오기 “import”
      1. 일부만 불러오기 “from”
      2. 이름 바꾸기 “as”
    19. 연산자 오버로드
  6. GUI 프로그래밍 – wx
    1. GUI 디자인 툴
    2. 창 만들기
    3. 텍스트 칸
    4. 버튼
    5. 메뉴바
    6. 아이콘
    7. 이벤트 사용
    8. 마우스 클릭
  7. 정규표현식
  8. 멀티스레딩, 멀티프로세싱
    1. 스레드와 프로세스
    2. 해보기
    3. 메시지 큐
    4. 변수 전달
    5. 전역 잠금
    6. 동기화
    7. 멀티프로세싱에서 lambda
  9. numpy, scipy 사용법
  10. C언어 가져오기
    1. ctypes
    2. SWIG
  11. 하드웨어 제어하기
  12. 디버깅
  13. 파이썬 코드 최적화 기법
  14. 남에게 배포하기 “py2exe”

ctypes 요약

살다보면 파이썬에서 C언어로 만들어진 DLL파일을 써야 할 일이 있을 수도 있다. 적어도 난 그랬다. 그래서 그걸 하기 위해 많은 해법들을 찾아보았지만, SWIG라든가, 그런것들은 나에게 도움이 되지 않았다. 그래서 ctypes를 공부했다.

일단 사용하기 위해서는 import ctypes로 불러와야 한다. 그러면 ctypes가 메모리에 적재된다.

다음 순서는 내가 사용할 DLL파일을 알려주는 것이다.

myDLL = ctypes.WinDLL(‘myDLLfile’)

위와 같이 쓰면 된다. 이 때, 이걸 사용하고 있는 파이썬 프로그램 파일(.py)의 경로에는 myDLLfile.dll 파일이 존재해야 한다. 이렇게 하면 이제 파이썬은 내가 무슨 라이브러리를 가져다 쓰고싶은건지 알게 되었다.

그 다음, DLL파일이랑 같이 주어진 헤더 파일(.h)을 살펴보고서, DLL파일에 있는 여러 함수 중 뭘 가져다 쓸 것인지 정해야 한다.

사실 헤더파일의 내용을 파이썬의 내용으로 번역하는 것과 별다른게 없는데, C언어 헤더파일에 정의된 내용은 함수의 이름, 함수가 받을 변수의 수와 형, 함수가 되돌려줄 변수의 형이 있다.

mypythonfunc= myDLL[‘MY_C_FUNC’]

위와 같은 한 줄을 적어 줘서, DLL파일의 라이브러리 중 어떤 함수를 쓰고 싶은지 적어주고, 그 함수를 내가 어떤 이름으로 쓸건지 알려주면 된다. 하지만 이것만으로는 저 함수의 모든 것을 알려준 것이 아니다.
mypythonfunc.argtypes = (ctypes.c_int,ctypes.c_double)

위와 같이 argtypes를 지정해 주는데, 이것은 이 함수가 변수로써 어떤 형식을 받을 건지 알려주는 변수이다. 근데 내가잘못 사용한건지는 모르겠지만, 변수의 수가 1개일 때는 에러가 나서 지정해주지 않았다. 지정해주지 않더라도 헤더 파일에 정의된 형으로 잘 넘어가기만 한다면 에러는 나지 않는다.

imct_initialize.restype = ctypes.c_int

restype은 함수가 되돌려주는 값의 형, 즉 반환형이다.

이렇게 하고 나면, 이제 mypythonfunc(a, b)를 가져다 쓰기만 하면 된다.

하지만, 문제가 있다. C언어에는 포인터라는 녀석이 있는데, 함수가 포인터를 통해서 자료를 주고받는 경우에는 restype을 아무리 써봐야 어쩔 수 없다. 포인터를 선언해줘야 한다.

이런 경우 argtypes에는 ctypes.c_void_p를 쓰거나, ctypes.POINTER(ctypes.c_int)를쓴다. ctypes.POINTER의 안쪽에 들어가는 변수는 실제 포인터 선언에 사용한 변수의 형을 써주면 된다.

이렇게 하고서, 만약 다음과 같이 써져 있다고 해 보자.

mypythonfunc.argtypes = (ctypes.POINTER(ctypes.c_int),ctypes.c_double)

그럼 mypythonfunc(a, b)처럼 사용할 때 a에는 포인터 변수를 넣어줘야 한다. 하지만 파이썬에는 포인터라는 개념이 없다. 그래서 만들어 줘야 한다.

일단 포인터 형이 ctypes.c_int니까 x=ctypes.c_int(0) 처럼 선언한다. 0은 초기값이다. 그런 다음 mypythonfunc(ctypes.byref(a), b) 처럼 사용하면된다. byref는 ctypes에서 “참조형 변수”로 값을 전달하는 함수이다. 이렇게 한 후 함수를 실행시키면 a의 값이 함수의 실행 결과에 따라 바뀌어 있음을 알 수 있다.

예를 들어 ctypes.c_int(4)를 4와 비교하고 싶다고 해 보자. 이걸 ctypes.c_int(4) == 4 이렇게 비교를 하자고 하면 False가 뜰 것이다. ctypes.c_int(4).value 로 그 내부의 값을 불러와야 한다. 만약 m = ctypes.c_int(4)로 선언되어 있었다면 m.value를 써줘야 파이썬에서 사용하는 값이 빠져나온다.

배열을 통째로 넘길 때는 어떻게 해야 할까?

mypythonfunc.argtypes = (ctypes.c_void_p, ctypes.c_double)

배열은 argtypes에 들어가는 경우 ctypes.c_void_p로 형을 지정해 주면 된다. 그리고 파이썬의 배열을 넣어주면 되는데, 파이썬의 배열이 C의 배열과 같을리가 없다. 그래서 이렇게 해줘야 한다

myarray = ctypes.c_int * 8

이렇게 하면 myarray는 int를 8개 가지는 type이 된다. 여기서 중요한건 myarray는 변수가 아니라 types이라는 것이다. 그 다음 함수에 값을 넣을 때는

mya = myarray(0,1,2,3,4,5,6,7) 처럼 변수를 하나 새로 만들어서

mypythonfunc(mya, b) 처럼 함수를 불러와야 한다. 이 경우에는 byref를 쓰지 않아도 참조형으로 변수가 넘어가기 때문에 mya는 함수의 실행 결과에 따라 바뀌게 된다. 만약 그 결과로 나온 mya를 다시 파이썬에서 사용하는 배열로 고치고 싶다면 list(mya)를 써서 파이썬의 배열로 바꿔줄 수 있다.

https://docs.python.org/3.6/library/ctypes.html

https://docs.python.org/2/library/ctypes.html

위의 참고문헌을 잘 읽어보고 사용하도록하자.

티스토리 – TTXML 백업 프로그램

tistory2ttxml

티스토리 백업이 막힌 현재, TTXML로 티스토리 백업을 하는 프로그램을 만들었다.

이 프로그램은 GPL에 의거하여 자유롭게 사용할 수 있다.

이 프로그램을 사용하여 나타날 수 있는 모든 결과는 사용한 사람의 책임이다.

파이썬 3.6기준으로 만들었는데, 아마 2.7에서도 작동하긴 할 것이다.

질문은 새로운 블로그인 http://melotopia.net/b 로 하기 바란다.

워드프레스로 옮기는 경우 TTXML importer에서 오류가 나는데, 인코딩 때문에 발생하는 문제이다. Notepad++등의 프로그램에서 EUC-KR로 읽어온 다음, UTF-8로 변환하여 저장을 하면 된다. 아니면 이 프로그램을 직접 고쳐서 인코딩 문제를 해결해도 된다.

일단 제 프로그램은 공개된 글만 자동으로 다운로드 받을 수 있습니다. 비공개글이면 일단 비공개 설정을 공개로 풀어주는 과정이 필요합니다.

그리고 글의 주소 체계가 숫자로 써져야 합니다. 예를 들어, snowall.tistory.com/53 처럼 끝부분에 숫자가 있어야 합니다. 글자가 있는 경우에는 안됩니다. 숫자로 표시되도록 고쳐주든가 해야겠죠.

그 다음, 제 프로그램은 다운로드 받은 내용을 TTXML이라는 형식으로 저장을 시켜줍니다. TTXML은 티스토리에서 백업을 지원하던 시절에 백업을 받으면 주는 파일 형식입니다. 또한, TTXML말고 HTML파일로도 같이 저장이 됩니다.

TTXML을 이용하는 이유는 워드프레스에서 TTXML을 읽어서 워드프레스에 자동으로 올려주는 플러그인이 있기 때문이었고요.

아무튼, 위의 내용을 알고 있는 상태에서 제 프로그램을 실행시키면 되는데요, 프로그램을 실행시키기 전에 고쳐야 할 부분이 있습니다.

33번째 줄의 domainname=”\”melotopia.net/b\”” 에 본인이 사용할 워드프레스 블로그의 주소를 적어야 합니다. 워드프레스를 사용하지 않을 거라면 사용할 블로그의 주소를 적어주시면 될 것 같습니다.

36번째 줄의 while idname<4000: 에서 4000이라는 숫자를 고쳐야 하는데, 이 숫자는 본인이 작성한 글의 전체 갯수보다 큰 숫자이기만 하면 됩니다. 저는 글이 3500개 정도 있어서 4000을 썼습니다.

파이썬 코드의 실행방법은 일단 python.org에서 파이썬을 다운로드 받아서 설치한 후 파이썬 코드를 더블클릭하면 됩니다.

이 때, BeautifulSoup이라는파이썬 패키지를 설치해야 할 겁니다. 아마 커맨드라인에서 pip install beautifulsoup4 을 실행시키면 될 겁니다.

글 번호에 해당하는 글이 없거나 비공개인 경우 오류가 발생하는 것을 고쳤습니다. 걍 try문으로 에러나면 건너뛰게 했습니다.

Stochastic Parallel Gradient Descent method

SPGD알고리즘은 함수 최적화를 할 때 사용하는 알고리즘이다. 기존의 Steepest descent method라든가 Conjugate Gradient method같은 경우, 특정 방향에 대해서 최적해를 찾고 그 위치에서 그 다음으로 진행할 방향을 선택해서 더이상 움직이지 않을 때 까지 반복하는 알고리즘이다. 두 방법의 차이는 그 다음 방향을 결정하는데 좀 더 개선된 방법이냐 아니냐의 차이가 있을 뿐이다.

SPGD알고리즘은 통계적으로 접근하는데, 덕분에 빠른 최적화가 가능하다. 수학적, 통계학적인 이야기는 다 빼고 알고리즘만 설명하도록 한다. 자세한 것은 구글에 검색하면 다 나올 것이다.

어떤 함수 V(x)가 주어져 있다. V(x)는 하나의 실수값을 갖고, x는 N차원에서의 벡터이다. g는 0이 아닌 어떤 실수인 상수인데, 이따가 설명하도록 하겠다.

1. x에 대해서 어떤 임의의 벡터 a를 선택한다.

2. P=V(x+a), Q=V(x-a)를 계산한다.

3. P-Q=R을 얻을 수 있을 것이다.

4. x를 x+g*R*a로 교체하고 1번으로 돌아가서 반복한다.

5. 더이상 움직이지 않을 때 까지(==V(x)와 V(x+g*R*a)가 별로 차이가 없을 때 까지) 반복한다.

이 알고리즘이 작동하는 이유는 R=P-Q이기 때문이다. g>0인 경우에 만약 P가 더 크다면 R>0이므로 벡터가 x+a방향으로 움직이게 된다. 만약 Q가 더 크다면 R<0이므로 벡터가 x-a방향으로 움직이게 된다. 여기서 g>0이면 V가 커지는 방향으로 최적화가 이루어지고, g<0이면 V가 작아지는 방향으로 최적화가 이루어진다.

a자체는 임의로 고르지만 대체로 난수 함수가 0~1사이에서 하나를 고르게 되어 있으므로 a의 최대 크기는 제한적일 것이다. 만약 V가 엄청 큰 공간에서 최적화 해야 하는 경우라면, 이것은 너무 느릴 수 있을 것이다. 따라서 g가 충분히 큰 숫자가 되어야 한번에 멀리 갈 것이다. 내가 봤던 논문에서는 최대화 하는 경우 g를 한 스텝 지나갈 때 마다 g/V로 교체하고, 최소화 하는 경우 g를 한 스텝 지나갈 때 마다 g*V로 교체하는 것을 보았다.

실제로 계산에 적용해보면 g/V나 g*V를 그냥 두면 스텝 수가 너무 많아지는 경우 g값이 무한대로 발산하거나, 무한소로 수렴한다. 무한대가 되는 경우 컴퓨터 계산 범위를 넘어가므로 오류가 발생하고, 무한소가 되는 경우 0이 되어 버리므로 아예 움직이지 않게 된다. 따라서 이런 경우를 방지하기 위해 알고리즘을 구현하는 과정에서 적절한 수준에서 크기를 재조절 해주어야 한다.

이렇게 했어도 결국 최적화 지점 근처에서 한번에 너무 멀리 가버리면 망하는데, 그래서 a에 R을 곱해주는 것이다. R의 부호는 최적화 방향을 결정하고, R의 크기는 한 스텝의 크기를 조절한다. R은 최적화 지점에 가까워질 수록 그 크기가 작아지므로 최적화 지점 근처에서 천천히 움직이게 해 준다. 또한, 실수로 너무 멀리갔을 경우 다시 무작위로 크게 움직이도록 하므로 최적화 속도를 빠르게 할 수 있다.

이 알고리즘의 수렴성은 통계적으로 보장된다. 즉, 무한히 오래 돌리면 반드시 최적점에 수렴한다. 하지만 이것은 반대로 문제가 되는 부분이기도 한데, R의 크기가 계속해서 작아지므로 수렴 속도가 점점 느려진다. 그래서 최적점 근처에서 “운이 좋아서” 최적점에 매우 가까운 점으로 뛰어들지 않는다면 계속해서 최적점 근처에서 헤메고 다닐 수 있다.

Three layer optical fiber mode calculator




waveguide7.zip

This program calculates optical modes in three-layered optical fiber.

Because of lack of time, user manual is not supported yet. If you want to use this code, PLEASE contact me and ask how to use.

This program requires wxPython, numpy, scipy libraries in Python 2.7.

This program is licenced under GPL v3. (

https://www.gnu.org/licenses/gpl-3.0.html

)

e-mail: snowall@kaist.ac.kr / snowall@gmail.com

version:0.16

Any comment, bug-report or question is welcomed. Do not hasitate contact me.

references:

  • Guided optics (Jacques Bures)
  • Fundamentals of optical waveguides (Katsunari Okamoto)
  • Optical fiber toolbox (https://www.mathworks.com/matlabcentral/fileexchange/27819-optical-fibre-toolbox)

changelog

v0.16

Multiprocess support

BUG: for cladding diameter <125 um AND wavelength <600 nm, result is wrong. Use this under wavelength >600 nm OR cladding diameter <100 um condition.

v0.1

The first release. This works 900~1600 nm wavelength.

파이썬의 요상한 문법 문제

파이썬에는 딕셔너리라는게 있는데, 참 편리한 놈이다. 여기서 원소를 불러오려면 pop과 get메소드 중에 하나를 쓰면 되는데…

a={‘abc’:1}

for i in range(10):

print a.pop(‘abc’)

위와 같은 코드는 에러가 난다.

a={‘abc’:1}

for i in range(10):

print a.get(‘abc’)

그러나 위와 같은 코드는 에러가 나지 않는다. 대체 뭐지…

위의 문제는 get과 pop의 작동 방식 차이에서 오는 것이다. get은 해당 키워드의 값을 되돌려주고 원래 자료에는 아무 일도 하지 않는다. 하지만 pop은 해당 키워드의 값을 꺼내서 되돌려주고 원래 자료에서는 없애 버린다. get은 얻어오는거고 pop은 뽑아오는 것. 이게 왜 이렇게 되었냐면, 원래 pop은 배열을 스택처럼 쓰기 위해서 그런거라 카더라.


다음과 같은 일도 있다.







class mytest():













m=[]













def __init__(self, **kwds):


































self.m=[]































self.m+=[kwds.pop(‘xyz’)]



mya=[]



for i in range(10):

















mya+=[mytest(xyz=i).m]



print mya






위의 코드와







class mytest():













m=[]













def __init__(self, **kwds):














































self.m+=[kwds.pop(‘xyz’)]



mya=[]



for i in range(10):

















mya+=[mytest(xyz=i).m]



print mya







위의 코드는 결과값이 다르다. 차이는 init 안에서 self.m이 있느냐 없느냐의 차이인데. 왜 차이가 나는지 모르겠다. 객체지향 따위는 갖다 버린 파이썬 같으니라고…

리빙 포인트

자기가 쓰고 있는 프로그래밍 언어에서 로그 함수의 밑이 어떤 것인지 모를 때에는 원하는 밑수에 로그값을 취해서 사용하려는 로그 함수를 나눠주면 좋다.

광섬유 가공 후 데이터를 자동으로 분석하는 프로그램

#!/usr/bin/env python

# -*- coding: CP949 -*-

#

# generated by wxGlade 0.7.2 on Tue Apr 05 01:49:01 2016

#

# This is a converting program from thorlabs powermeter datafile taken from thorlab official data acquisition program to radius vs power after fiber taper process.

# IF you want to use this program for your own purpose except learning python and programming, you have to ask me licence policy and copyright.

# snowall@kaist.ac.kr / snowall@gmail.com / Keehwan Nam, Physics department, KAIST. 2016.

#

import wx

# begin wxGlade: dependencies

import gettext

# end wxGlade

# begin wxGlade: extracode

# end wxGlade

import numpy as np

import os

import re

import sys

import struct

f= open(‘sample.png’, ‘rb’)

w, h = struct.unpack(‘>LL’, f.read()[16:24])

displaysizeX = int(w)

displaysizeY = int(h)

f.close()

reload(sys)

sys.setdefaultencoding(‘cp949’)

#~ displaysizeX=1280

#~ displaysizeY=1024

x,y=0,0

a=0

b=0

c=0

sec=0

minute=0

hours=0

msec=0

class MyDialog(wx.Dialog):

x00=0

y00=0

def __init__(self, parent, id, title):

wx.Dialog.__init__(self, parent, id, title, size=(displaysizeX,displaysizeY))

self.canvas = wx.StaticBitmap(self, -1, wx.Bitmap(“sample.png”, wx.BITMAP_TYPE_ANY))

self.canvas.Bind(wx.EVT_LEFT_DOWN, self.positionnow)

def positionnow(self, event):

self.x00=wx.MouseEvent.GetX(event)

self.y00=wx.MouseEvent.GetY(event)

print((wx.MouseEvent.GetX(event),wx.MouseEvent.GetY(event)))

def drawTick(self, pl):

self.mydc = wx.MemoryDC()

self.canvas2 = wx.Bitmap(“sample.png”, wx.BITMAP_TYPE_ANY)

self.mydc.SelectObject(self.canvas2)

self.mypen=wx.Pen(wx.Colour(255,0,0),5)

self.mypen.SetWidth(1)

self.mydc.SetPen(self.mypen)

self.mydc.DrawLines(pl)

self.mydc.SelectObject(wx.NullBitmap)

self.canvas.SetBitmap(self.canvas2)

self.mydc = None

self.canvas = wx.StaticBitmap(self, -1, self.canvas2)

return

def graphroutine(self, myf):

self.convertedData=[]

self.pointlist=[]

src=open(myf, “r”)

src.readline()

d=src.readline()

a=d.split(” “)

self.mini=np.inf

self.maxi=0.

while True:

d=src.readline()

if d==””:

break

a=d.split(” “)

msec=float(((a[1]).split(“.”))[1])*0.001

sec=float(a[2].split(“:”)[2].split(“\t”)[0])

minute=float((a[2]).split(“:”)[1])*60.

hours=float((a[2]).split(“:”)[0])*3600.

self.time=msec+sec+minute+hours

self.convertedData+=[[self.time,float(a[2].split(“:”)[2].split(“\t”)[1])]]

if self.convertedData[-1][1] self.mini=self.convertedData[-1][1]

if self.convertedData[-1][1]>self.maxi:

self.maxi=self.convertedData[-1][1]

self.time0=self.convertedData[0][0]

self.time1=self.convertedData[-1][0]

self.timescale=displaysizeX/(self.time1-self.time0)

self.vertscale=displaysizeY/(self.maxi-self.mini)

for cd in self.convertedData:

self.pointlist+=[[np.ceil((cd[0]-self.time0)*self.timescale),displaysizeY-np.ceil((cd[1]-self.mini)*self.vertscale)]]

self.drawTick(self.pointlist)

src.flush()

src.close()

return

def findV(self,no):

logfile=open(“log.csv”,”r”)

try:

while True:

d=logfile.readline()

if d==””:

break

a=d.split(“,”)

if a[0]==str(no):

logfile.close()

return a

except:

logfile.close()

return “0”

def inverse_ratio(self,logdata):

return np.sqrt(((2.*float(logdata[15]))-float(logdata[14]))/((2.*float(logdata[15]))+float(logdata[14])))

def converting(self,f):

self.time0=(self.x00/self.timescale)+self.time0

tar=open(f[:-4]+”_processed.txt”, “w”)

errorlist=open(“errorlist.txt”,”a”)

plot=open(f[:-4]+”.gpl”, “w”)

shotnumber=re.search(“\d+”,f.split(“\\”)[-1]).group()

expcondition=self.findV(shotnumber)

shotlog=self.inverse_ratio(expcondition)

try:

for cd in self.convertedData:

tar.writelines(str(cd[0])+”\t”+str(cd[1])+”\t”+str(float(expcondition[9])*np.power(shotlog,(cd[0]-self.time0)/(float(expcondition[11])/float(expcondition[15]))))+”\t”+str(cd[1])+”\n”)

plot.writelines(“set logscale x\nplot \””+(f.split(“\\”)[-1])[:-4]+”_processed.txt\” using 3:4 w l “)

except:

errorlist.writelines(f+”\n”)

print “error”

finally:

tar.flush()

tar.close()

plot.flush()

plot.close()

class MainPlotFrame(wx.Frame):

def __init__(self, *args, **kwds):

# begin wxGlade: MainPlotFrame.__init__

kwds[“style”] = wx.DEFAULT_FRAME_STYLE

wx.Frame.__init__(self, *args, **kwds)

self.dig = wx.FileDialog(None, message=”Choose data files”, style = wx.FD_MULTIPLE)

self.dia = MyDialog(self, -1, ‘Close after click!’)

self.__set_properties()

self.__do_layout()

if self.dig.ShowModal() == wx.ID_OK:

for fn in self.dig.GetPaths():

self.dia.graphroutine(fn)

self.dia.ShowModal()

self.dia.converting(fn)

self.Close()

# end wxGlade

def __set_properties(self):

# begin wxGlade: MainPlotFrame.__set_properties

self.SetTitle((“frame_1”))

self.SetSize((displaysizeX, displaysizeY))

# end wxGlade

def __do_layout(self):

# begin wxGlade: MainPlotFrame.__do_layout

sizer_1 = wx.BoxSizer(wx.VERTICAL)

self.SetSizer(sizer_1)

self.Layout()

# end wxGlade

# end of class MainPlotFrame

if __name__ == “__main__”:

app = wx.App(0)

#~ wx.InitAllImageHandlers()

frame_main = MainPlotFrame(None, -1, “”)

frame_main.Show()

app.MainLoop()

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑