Export JCAMP to ASCII

физико-химические методы исследования, методики и другие вопросы аналитической химии
analytical chemistry, analysis and techniques for professionals
Ответить
Al_chimic
Сообщения: 77
Зарегистрирован: Чт май 17, 2007 4:29 pm

Export JCAMP to ASCII

Сообщение Al_chimic » Сб мар 08, 2008 8:13 pm

Не знаю в какой раздел вопрос запостить. Наверное, ближе всего к этому.
Ищу программу, которая бы экспортировала UV\VIS JCAMP-файлы (*.dx) в ASCII. Желательно, чтобы она делала это в режиме командной строки.
Буду признателен за любую информацию.

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8535
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

Сообщение ИСН » Сб мар 08, 2008 8:30 pm

Дайте спецификацию файлов.

Al_chimic
Сообщения: 77
Зарегистрирован: Чт май 17, 2007 4:29 pm

Сообщение Al_chimic » Сб мар 08, 2008 8:53 pm

ИСН писал(а):Дайте спецификацию файлов.
Не понял, какая спецификация вам нужна. Добавил пример JCAMP файла в exchange

bf109xxl
Сообщения: 150
Зарегистрирован: Вт авг 16, 2005 10:27 pm

Сообщение bf109xxl » Вс мар 09, 2008 12:40 am

Есть "примочка" для импорта этих файлов в Origin'е. Экспорт в ASCII из Origin'а трудностей не представляет.

Al_chimic
Сообщения: 77
Зарегистрирован: Чт май 17, 2007 4:29 pm

Сообщение Al_chimic » Вс мар 09, 2008 1:39 am

bf109xxl писал(а):Есть "примочка" для импорта этих файлов в Origin'е. Экспорт в ASCII из Origin'а трудностей не представляет.
Да, я знаю про нее. Нашел даже программку, которая использует jcamp.dll (на основе которой работает указанная "примочка")как раз в режиме командной строки и экспортирует dx в ASCII. Пробовал также вызывать процедуру экспорта непосредственно из этой DLL. С моими файлами не работает ни один из способов.

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8535
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

Сообщение ИСН » Вс мар 09, 2008 4:57 am

Нашёл спецификацию (-> exchange). Потрясён маразматичностью формата; его придумали какие-то безрукие дебилы и вредители, хуже нас.
Что же до трансформации, то с ней примерно как-то так:

Код: Выделить всё

foreach $file(@ARGV){
	open(WF,$file);
	$file=~s/\.dx/\.txt/;
	open(OUTF,">$file");
	while (<WF>){
		chomp;
		next if $_ eq "";
		next if m/^\(.*\)$/;
		if (m/^##/){
			($name,$value)=split /=/;
			$name=~s/#//g;
			$$name=$value;
			print OUTF "\n$_\n" if m/title/i;
			$y=$i=0;
		}else{
			s/([^\d])/ $1/g;
			s/([a-r])/-uc$1/eg;
			tr/\@ABCDEFGHI\%JKLMNOPQR/01234567890123456789/;
			split / /;
			$x0=shift @_;
			$y0=shift @_;
			if ($i==0){
				$i=$MINX+0;
				unshift @_, $y0;
			}
			print OUTF ($i++)."\t".($y+=$_)*$YFACTOR."\n" foreach @_;
		}
	}
	close(WF);
	close(OUTF);
}
(Код, мягко говоря, далёк от идеала - так, набросок. На этом файле вроде прокатывает.)

Al_chimic
Сообщения: 77
Зарегистрирован: Чт май 17, 2007 4:29 pm

Сообщение Al_chimic » Вс мар 09, 2008 11:10 am

Спасибо!

А на чем это написано? Java?
Последний раз редактировалось Al_chimic Вс мар 09, 2008 11:35 am, всего редактировалось 1 раз.

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8535
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

Сообщение ИСН » Вс мар 09, 2008 11:35 am

Спасибо скажете, когда (и если) заработает. Это Перл; запускалка для него (perl.exe и одна dll) либо где-то на activestate.com вроде была, либо возьмите ту, которую amge с месяц назад присылал (она в exchange, болтается где-то в середине всей простыни).

Al_chimic
Сообщения: 77
Зарегистрирован: Чт май 17, 2007 4:29 pm

Сообщение Al_chimic » Вс мар 09, 2008 12:01 pm

ИСН писал(а):Спасибо скажете, когда (и если) заработает. Это Перл; запускалка для него (perl.exe и одна dll) либо где-то на activestate.com вроде была, либо возьмите ту, которую amge с месяц назад присылал (она в exchange, болтается где-то в середине всей простыни).
Работает! Спасибо огромное.
А Perl жесть какая-то. :)

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8535
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

Сообщение ИСН » Вс мар 09, 2008 12:48 pm

Вот теперь - пожалуйста. Обращайтесь, если чо.
(при чуточку других параметрах всё может искривиться, я ведь затачивался на один этот файл.)
А Перл - да... Я-то в нём чужак, бредущий наощупь, "май нэйм из Вася", а продвинутые товарищи на нём выдают такие загибы, что понюхал одну строчку - и готов.

eukar

Сообщение eukar » Вс мар 09, 2008 1:56 pm

ИСН писал(а):Нашёл спецификацию (-> exchange). Потрясён маразматичностью формата; его придумали какие-то безрукие дебилы и вредители, хуже нас.
Насколько я знаю, его придумал гражданин И.Ю.ПАК.

Al_chimic
Сообщения: 77
Зарегистрирован: Чт май 17, 2007 4:29 pm

Сообщение Al_chimic » Вс мар 09, 2008 2:44 pm

ИСН писал(а):Вот теперь - пожалуйста. Обращайтесь, если чо.
(при чуточку других параметрах всё может искривиться, я ведь затачивался на один этот файл.)
А Перл - да... Я-то в нём чужак, бредущий наощупь, "май нэйм из Вася", а продвинутые товарищи на нём выдают такие загибы, что понюхал одну строчку - и готов.
Спасибо, буду обращаться :)
Я и сам тут пытаюсь вникнуть. Почитал про формат jcamp немного. Как я понял, в моих файлах используется формат сжатия SQZ-DIF.
Например, первая строка из первого блока:

Код: Выделить всё

10766c2370k045J027L49N36K483j509K68J286k103O55J69J889K415j269j58q7J155J820
Преобразуется следующим образом:
Изображение

Ваш скрипт не учитывает дубликаты, правильно?

Al_chimic
Сообщения: 77
Зарегистрирован: Чт май 17, 2007 4:29 pm

Сообщение Al_chimic » Вс мар 09, 2008 3:03 pm

eukar писал(а):
ИСН писал(а):Нашёл спецификацию (-> exchange). Потрясён маразматичностью формата; его придумали какие-то безрукие дебилы и вредители, хуже нас.
Насколько я знаю, его придумал гражданин И.Ю.ПАК.

Joint Committee on Atomic and Molecular Physical Data его и придумал. А ИЮПАК одобрил.

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8535
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

Сообщение ИСН » Пн мар 10, 2008 10:12 am

Вот, вот. Вот этот комитет "сугубо надо вешать на вонючих верёвках". Ну да это так, в сторону.
Да, верно, там преобразование DIF. И потом сжатие DUP (в форматах графических файлов аналогичный подход называется RLE, и был вытеснен более прогрессивными форматами ещё в конце 80-х; но там он хоть имел смысл, а здесь изначально не имеет). Да, я тупо наплевал на дубликаты; это приводит к тому, что символ двукратного дублирования остаётся как есть (буквой), а при сворачивании невозбранно кастится в целое число (в 0), и немножко сбивает все дальнейшие ординаты. Трёхкратные и более дубликаты (в этом файле, кажется, единственный случай был) приводят к выпадению точек.
Не, ну если так-то поразмыслить, то ведь можно и учесть. После строки 18 вставьте:

Код: Выделить всё

			s/(-?\d+) T/$1 $1/;
			s/(-?\d+) U/$1 $1 $1/;
и другие последующие буквы, по вкусу.

Al_chimic
Сообщения: 77
Зарегистрирован: Чт май 17, 2007 4:29 pm

Сообщение Al_chimic » Пн мар 10, 2008 2:12 pm

ИСН писал(а):Вот, вот. Вот этот комитет "сугубо надо вешать на вонючих верёвках". Ну да это так, в сторону.
Да, верно, там преобразование DIF. И потом сжатие DUP (в форматах графических файлов аналогичный подход называется RLE, и был вытеснен более прогрессивными форматами ещё в конце 80-х; но там он хоть имел смысл, а здесь изначально не имеет). Да, я тупо наплевал на дубликаты; это приводит к тому, что символ двукратного дублирования остаётся как есть (буквой), а при сворачивании невозбранно кастится в целое число (в 0), и немножко сбивает все дальнейшие ординаты. Трёхкратные и более дубликаты (в этом файле, кажется, единственный случай был) приводят к выпадению точек.
Не, ну если так-то поразмыслить, то ведь можно и учесть. После строки 18 вставьте:

Код: Выделить всё

			s/(-?\d+) T/$1 $1/;
			s/(-?\d+) U/$1 $1 $1/;
и другие последующие буквы, по вкусу.
Это надо вставить после строки

Код: Выделить всё

tr/\@ABCDEFGHI\%JKLMNOPQR/01234567890123456789/; 
?

Не совсем понял насчет случая однократного дублирования. Вот такая строчка не пойдет?

Код: Выделить всё

s/(-?\d+) S/$1/;
А какой "сбой ординат" происходит в Вашей первой версии кода? Не происходит ли смещения всего спектра влево по оси абсцисс в случае присутствия дубликатов?

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8535
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

Сообщение ИСН » Пн мар 10, 2008 3:43 pm

Да, это после строки tr/-что-то там.
Касательно дублирования.
Однократное дублирование - это, as to me, оксюморон.
Двукратное кодируется так:

Код: Выделить всё

+1 +1 -2 +3
будет

Код: Выделить всё

+1 T -2 +3
А трёхкратное:

Код: Выделить всё

+1 +1 +1 -2 +3
будет

Код: Выделить всё

+1 U -2 +3
(Здесь мне видится некое противоречие со стандартом, но я за главный авторитет считал имеющийся живой файл - теория, you know, суха, а древо жизни, собака такая, цветёт и пахнет по-всякому.)
В моём первом варианте буквы оставались как есть. Потом, при сворачивании ряда разностей в ряд значений, они интерпретировались как 0. Поэтому двукратное дублирование приводило к некоторой ошибке в значении (0 вместо +1 в данном примере), которая распространялась вперёд до конца. А трёх- и более кратное приводило к выпадению точек, то есть да, к сдвигу всего спектра влево.
Теперь же я предлагаю исправление: код, который заменяет последовательности (число T) на (число число), (число U) - на (число число число), и т.д.

Al_chimic
Сообщения: 77
Зарегистрирован: Чт май 17, 2007 4:29 pm

Сообщение Al_chimic » Пн мар 10, 2008 4:27 pm

ИСН писал(а):Касательно дублирования.
Однократное дублирование - это, as to me, оксюморон.

Теперь же я предлагаю исправление: код, который заменяет последовательности (число T) на (число число), (число U) - на (число число число), и т.д.
Тут может быть вопрос в определении :)
Интерпретировать "однократное дублирование" можно так: число, которое повторяется один раз. Т.е. имеем: (число S) это (число число), (число T) это (число число число) и т.д. Вобщем, логику учета дубликатов, я понял, сам попробую со скриптом пограться.

Еще, раз огромное Вам спасибо!

marat
Сообщения: 728
Зарегистрирован: Вт июл 06, 2004 5:24 pm

Сообщение marat » Пн мар 10, 2008 4:37 pm

http://homepages.paradise.net.nz/dkw/NMRConvert12.zip
Макрос для Экселя. Но ИК-спектры не хочет преобразовывать :(

Al_chimic
Сообщения: 77
Зарегистрирован: Чт май 17, 2007 4:29 pm

Сообщение Al_chimic » Пн мар 10, 2008 4:56 pm

marat писал(а):http://homepages.paradise.net.nz/dkw/NMRConvert12.zip
Макрос для Экселя. Но ИК-спектры не хочет преобразовывать :(

Код: Выделить всё

NMRConvert12
Поэтому и не хочет... Скрипт чекает тип спектра по хидерам dx-файла.
Как работает скрипт посмотреть нельзя, за исходник авторы программы хотят убитых енотов:
The Excel source code for NMR Converter is available at a cost of $100 (U.S.).

Ответить

Вернуться в «аналитическая химия / analytical chemistry»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 29 гостей