вторник, 25 марта 2008 г.

Python как инструмент обработки экспериментальных данных

Обработка экспериментальных данных... Как обрабатывать, в чём обрабатывать? Если ответ на первый вопрос как правило понятен, то со вторым вопросом всё гораздо сложнее. Далее расскажу о некоторых своих изысканиях последней недели, касательно именно того, в чём обрабатывать.

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

Но в данном контексте это всё не суть, а суть в том, что имею 25 .csv файлов со спектрами, которые надо отнормировать, из которых надо извлечь мощность, ширину, внутререзонаторный спектр, подогнать теоретическим спектром и строить всевозможные графики зависимостей этих величин, дабы понять что вообще там происходит.

И так, мне понадобиться: работа с болшьими массивами чисел, численное интегрирование, интерполяция, численное нахождение корней уравнения F(x)=0 где F - нелинейная функция, аппроксимация по методу наименьших квадратов произвольной функцией.

Выбираем средства: 1.Origin - хорош при обработке малого числа графиков, но в данном случае терпит полный крах, т.к. мне проще будет повеситься, чем работать в нём с таким количеством данных, а это ведь только начало. 2.MathCad - курит в сторонке, т.к. с его интерфейсом я без матов работать не могу - порой кучу усилий надо приложить, чтобы только скобаку поставить в нужном месте, к тому же нет версии под lin. 3.MATLAB - отличный инструмент, но его функционал явно избыточен. 4.SciLab - замечательная штука, в которой есть всё то, что мне необходимо, и которую я уже было подорвался использовать для всех нужд, однако столкнулся с проблемой: скриптами можно организовать пакетную обработку данных (нормировку, аппроксимацию и пр.), но когда появляется необходимость максимально быстро сконструировать график зависимости одной величины, определяемой из пакетной обработки, от другой, приходиться поломать голову. По сути, это язык программирования высокого уровня, но это функциональный язык, в то время как объектно-ориентированный подход мог бы дать большую гибкость. 5. Python - ооп язык программирования высокого уровня в котором я и нашел спасение:

Python как инструмент обработки экспериментальных данных

И так, нам потребуются модули numpy, matplotlib, scipy. Эти модули предоставляют замечательный функционал, включающий всё, что мне может понадобиться на данном этапе.

Вся изюминка кроется в реализации обработки эксперимента: создаем класс "spectr" который будет служить обёрткой для экспериментально-измеренного спектра. Добавляем в качестве методов всё, что мы можем с этим спектром сделать: умножение на другой спектр, центральная блина волны, пиковая мощность, ширина на полувысоте, нормировка по мощности, умножение на константу, обрезание шума, сохранение в файл, открытие из файла. Это краткий список того, что мне понадобилось в первую очередь, что важно, список этот легко может быть расширен в дальнейшем. Далее, создаём класс, описывающий нашу теоретическую модель, который включает в себя все формулы, все параметры, методы аппроксимации, методы расчёта теоретических параметров. Теперь создавая несколько экземпляров класса с разными параметрами легко можно сравнить влияние этих самых параметров на предсказания модели, которые в свою очередь легко сравнить с реальными данными.

Основной скрипт обработки читает экспериментальные спектры, создавая из них массив объектов класса "spectr" в цикле извлекает параметры полуширины, мощности как на выходе, так и внутри резонатора, проводит аппроксимацию и поиск подгоночного параметра для каждого участка спектра. Теперь, имея в руках все эти данные одновременно, можно легко с ними оперировать, концентрируясь на физике дела, которая сейчас, не обременённая техническими деталями обработки, становиться весьма интересной.

среда, 12 марта 2008 г.

python-qt-qwt

И так, захотелось мне писать проги с "окошками" за минимальное время и с максимальной быстротой (т.к. возможно вскоре это будет производственной необходимостью). Кроме того, поскольку контора сейчас сидит под виндами, а в дальнейшем стоит планировать хотя бы частичное внедрение пингвина, то уже сейчас стоит закладываться на кросплатформенность, которая присуща всем 3-м инструментам.

Почему питон? - потому, что легкий синтаксис, потому что много модулей, потому что кросплатформенный и в конце концов, потому что имхо модно.

Почему Qt? - потому что обывателя интересуют окошки, потому что мне понравились методы использования сигналов/слотов, потому что всё грамотно объектно-ориентировано.

При чём тут qwt? - qwt, как известно, библиотека для qt, которая предоставляет различные элементы оформления, востребованные в научной среде (plot с автомасштабированием, различные крутилки, ползунки и пр), так что прикрутить это к нашим окошкам было бы очень недурно.

Отдельной строкой стоит отметить, что интерфейс на Qt может быть легко "нарисован" в дизайнере, а получившейся .ui-файл транслирован на питон, т.о. руками остаётся лишь написать обработчики для элементов окна, и должна получиться вполне рабочая прога.

И вот, руководствуясь этими соображениями и подогреваемый желанием лёгкой наживы, я начал своё "хождение по мукам"....

...продолжение следует.