Добрый всем день.
Хочу поделиться одним наблюдением и, может быть, разобраться, что же это такое - баг или фича. Сразу оговорюсь, что проблема была мной исследована, её признаки определены. Но решение этой проблемы найдено не было. А посему, за неимением времени на исследования и опыты, было решено обойти эту проблему дополнительными парой срок кода MEL. И ещё: вероятно, уважаемому Решателю было бы интересно прочитать этот пост Итак,
Из определённого текстового файла на вход скрипта поступают данные об имени, номерах и координатах атомов. В скрипте посредством следующих строк они образуют уникальный идентификатор объекта и последовательно заносятся в массив $allaa (в моём случае это joints):
global string $allaa[];
global string $bonez[];
global string $joints;
string $buffer[]; // токенизированная строка из файла.
string $buf2=(string) $buffer[2]; // Потребовалась для преобразования имеющихся цифр в этом поле в текст.
$allaa[size($allaa)]=($buffer[3]+$buffer[5]+$buf2);
Элементы массива $allaa имеют, как правило, следующий вид: SER111HB, SER112HB, SER11HG, ILE12N, ILE12CA, ILE12C, ARG3H, ARG3HA, ARG31HB, ARG32HB, ARG31HG, ARG32HG, ARG31HD, ARG32HD, ARG3HE, ARG31HH1, ARG32HH1 и так далее, всего порядка 550-и (небольшой кусок белка).
Затем все эти joints, составляющие содержимое массива $allaa выделяются и помещаются в сет bonez:
select -cl;
select $allaa;
$joints=`sets -n bonez`;
sets -add $joints $allaa;
После этого идёт чтение содержимого сета в массив $bonez и передача содержимого этого нового массива в dynexpression для дальнейшей обработки.
$bonez=`sets -q bonez`;
И вот тут возникла одна очень неприятная проблема. Как выяснилось, с некоторого момента (с 148-го элемента сета) происходило перемешивание посдедующих элементов. Приведу распечатки работы скрипта. Первая колонка - переменная $allaa, которая использовалась для формирования сета bonez и последовательность элементов этого сета в outliner, последняя колонка - считанная из этого сета переменная $bonez:
allaa= LYS10N => 143 ... LYS10N
allaa= LYS10CA => 144 ... LYS10CA
allaa= LYS10C => 145 ... LYS10C
allaa= LYS10O => 146 ... LYS10O
allaa= LYS10CB => 147 ... LYS10CB
allaa= LYS10CG => 148 ... HIS13CA На этом месте машина перескакивает на 13-й Histidine, вместо того, чтобы продолжать Lysine
allaa= LYS10CD => 149 ... HIS13C
allaa= LYS10CE => 150 ... HIS13O
allaa= LYS10NZ => 151 ... HIS13CB
allaa= LYS10H => 152 ... HIS13CG
allaa= LYS10HA => 153 ... HIS13ND1
allaa= LYS101HB => 154 ... HIS13CD2
allaa= LYS102HB => 155 ... HIS13CE1
allaa= LYS101HG => 156 ... HIS13NE2
allaa= LYS102HG => 157 ... HIS13H
allaa= LYS101HD => 158 ... HIS13HA
allaa= LYS102HD => 159 ... HIS131HB
allaa= LYS101HE => 160 ... HIS132HB
allaa= LYS102HE => 161 ... HIS13HD1
allaa= LYS101HZ => 162 ... HIS13HD2
allaa= LYS102HZ => 163 ... HIS13HE1
allaa= LYS103HZ => 164 ... HIS13HE2
allaa= SER11N => 165 ... ILE14N Вслед за 13 His идёт 14 Ile
allaa= SER11CA => 166 ... ILE14CA
allaa= SER11C => 167 ... ILE14C
allaa= SER11O => 168 ... ILE12H
allaa= SER11CB => 169 ... LYS10CG Но тут он прерывается - скачок назад по сету и чтение 10-го Lysine.
allaa= SER11OG => 170 ... LYS10CD
allaa= SER11H => 171 ... LYS10CE
allaa= SER11HA => 172 ... LYS10NZ
allaa= SER111HB => 173 ... LYS10H
allaa= SER112HB => 174 ... LYS10HA
allaa= SER11HG => 175 ... LYS101HB
allaa= ILE12N => 176 ... LYS102HB
allaa= ILE12CA => 177 ... LYS101HG
allaa= ILE12C => 178 ... LYS102HG
allaa= ILE12O => 179 ... LYS101HD
allaa= ILE12CB => 180 ... LYS102HD
allaa= ILE12CG1 => 181 ... LYS101HE
allaa= ILE12CG2 => 182 ... LYS102HE
allaa= ILE12CD1 => 183 ... LYS101HZ
allaa= ILE12H => 184 ... LYS102HZ
allaa= ILE12HA => 185 ... LYS103HZ
allaa= ILE12HB => 186 ... SER11N За 10-м Лизином идёт 11 Serine
allaa= ILE121HG1 => 187 ... SER11CA
И такая катавасия продолжается до конца сета!
Было замечено, что при чтении из файла, в котором было не более 32-х атомов с названиями типа RES1C25 или RES1_intro_1C15 перемешивания не происходило.
Была предпринята попытка изменить процедуру добавления в сет - не скопом, а последовательно выделяя каждый joint массива $allaa и добавляя его в сет bonez:
for ($numof==0; $numof<size($allaa); $numof++)
{
select -r $allaa[$numof];
sets -add bonez $allaa[$numof] ;
}
Но по непонятной пока причине сет оказывался пуст. На выяснение причин времени не было.
Промаявшись 2 дня, я всё-таки нашёл решение проблемы, которое, собственно, лежало на поверхности:
$bonez=$allaa; // !!!!
Но всё-таки осталась некоторая неудовлетворённость (научная жилка ) - почему такое происходило? Хуже всего, что мне не удалось установить закономерностей этого перемешивания ни по алфавиту, ни по порядковому померу. Единственное, что приходит в голову, что чтение из сета происходит по "численным" значениям имён его элементов. Но как это проверить я не знаю - увы, биолог
Вот, собственно, и всё. Проблема решена. Вопросы остались. Кто что думает по этому поводу?
Спасибо, что дочитали до конца.
С уважением.
Юра.
PS. Вся эта штука - скелет. Скелет очень ветвистый. Но ветвиться он начинает задолго до десятого Лизина.
Хочу поделиться одним наблюдением и, может быть, разобраться, что же это такое - баг или фича. Сразу оговорюсь, что проблема была мной исследована, её признаки определены. Но решение этой проблемы найдено не было. А посему, за неимением времени на исследования и опыты, было решено обойти эту проблему дополнительными парой срок кода MEL. И ещё: вероятно, уважаемому Решателю было бы интересно прочитать этот пост Итак,
Из определённого текстового файла на вход скрипта поступают данные об имени, номерах и координатах атомов. В скрипте посредством следующих строк они образуют уникальный идентификатор объекта и последовательно заносятся в массив $allaa (в моём случае это joints):
global string $allaa[];
global string $bonez[];
global string $joints;
string $buffer[]; // токенизированная строка из файла.
string $buf2=(string) $buffer[2]; // Потребовалась для преобразования имеющихся цифр в этом поле в текст.
$allaa[size($allaa)]=($buffer[3]+$buffer[5]+$buf2);
Элементы массива $allaa имеют, как правило, следующий вид: SER111HB, SER112HB, SER11HG, ILE12N, ILE12CA, ILE12C, ARG3H, ARG3HA, ARG31HB, ARG32HB, ARG31HG, ARG32HG, ARG31HD, ARG32HD, ARG3HE, ARG31HH1, ARG32HH1 и так далее, всего порядка 550-и (небольшой кусок белка).
Затем все эти joints, составляющие содержимое массива $allaa выделяются и помещаются в сет bonez:
select -cl;
select $allaa;
$joints=`sets -n bonez`;
sets -add $joints $allaa;
После этого идёт чтение содержимого сета в массив $bonez и передача содержимого этого нового массива в dynexpression для дальнейшей обработки.
$bonez=`sets -q bonez`;
И вот тут возникла одна очень неприятная проблема. Как выяснилось, с некоторого момента (с 148-го элемента сета) происходило перемешивание посдедующих элементов. Приведу распечатки работы скрипта. Первая колонка - переменная $allaa, которая использовалась для формирования сета bonez и последовательность элементов этого сета в outliner, последняя колонка - считанная из этого сета переменная $bonez:
allaa= LYS10N => 143 ... LYS10N
allaa= LYS10CA => 144 ... LYS10CA
allaa= LYS10C => 145 ... LYS10C
allaa= LYS10O => 146 ... LYS10O
allaa= LYS10CB => 147 ... LYS10CB
allaa= LYS10CG => 148 ... HIS13CA На этом месте машина перескакивает на 13-й Histidine, вместо того, чтобы продолжать Lysine
allaa= LYS10CD => 149 ... HIS13C
allaa= LYS10CE => 150 ... HIS13O
allaa= LYS10NZ => 151 ... HIS13CB
allaa= LYS10H => 152 ... HIS13CG
allaa= LYS10HA => 153 ... HIS13ND1
allaa= LYS101HB => 154 ... HIS13CD2
allaa= LYS102HB => 155 ... HIS13CE1
allaa= LYS101HG => 156 ... HIS13NE2
allaa= LYS102HG => 157 ... HIS13H
allaa= LYS101HD => 158 ... HIS13HA
allaa= LYS102HD => 159 ... HIS131HB
allaa= LYS101HE => 160 ... HIS132HB
allaa= LYS102HE => 161 ... HIS13HD1
allaa= LYS101HZ => 162 ... HIS13HD2
allaa= LYS102HZ => 163 ... HIS13HE1
allaa= LYS103HZ => 164 ... HIS13HE2
allaa= SER11N => 165 ... ILE14N Вслед за 13 His идёт 14 Ile
allaa= SER11CA => 166 ... ILE14CA
allaa= SER11C => 167 ... ILE14C
allaa= SER11O => 168 ... ILE12H
allaa= SER11CB => 169 ... LYS10CG Но тут он прерывается - скачок назад по сету и чтение 10-го Lysine.
allaa= SER11OG => 170 ... LYS10CD
allaa= SER11H => 171 ... LYS10CE
allaa= SER11HA => 172 ... LYS10NZ
allaa= SER111HB => 173 ... LYS10H
allaa= SER112HB => 174 ... LYS10HA
allaa= SER11HG => 175 ... LYS101HB
allaa= ILE12N => 176 ... LYS102HB
allaa= ILE12CA => 177 ... LYS101HG
allaa= ILE12C => 178 ... LYS102HG
allaa= ILE12O => 179 ... LYS101HD
allaa= ILE12CB => 180 ... LYS102HD
allaa= ILE12CG1 => 181 ... LYS101HE
allaa= ILE12CG2 => 182 ... LYS102HE
allaa= ILE12CD1 => 183 ... LYS101HZ
allaa= ILE12H => 184 ... LYS102HZ
allaa= ILE12HA => 185 ... LYS103HZ
allaa= ILE12HB => 186 ... SER11N За 10-м Лизином идёт 11 Serine
allaa= ILE121HG1 => 187 ... SER11CA
И такая катавасия продолжается до конца сета!
Было замечено, что при чтении из файла, в котором было не более 32-х атомов с названиями типа RES1C25 или RES1_intro_1C15 перемешивания не происходило.
Была предпринята попытка изменить процедуру добавления в сет - не скопом, а последовательно выделяя каждый joint массива $allaa и добавляя его в сет bonez:
for ($numof==0; $numof<size($allaa); $numof++)
{
select -r $allaa[$numof];
sets -add bonez $allaa[$numof] ;
}
Но по непонятной пока причине сет оказывался пуст. На выяснение причин времени не было.
Промаявшись 2 дня, я всё-таки нашёл решение проблемы, которое, собственно, лежало на поверхности:
$bonez=$allaa; // !!!!
Но всё-таки осталась некоторая неудовлетворённость (научная жилка ) - почему такое происходило? Хуже всего, что мне не удалось установить закономерностей этого перемешивания ни по алфавиту, ни по порядковому померу. Единственное, что приходит в голову, что чтение из сета происходит по "численным" значениям имён его элементов. Но как это проверить я не знаю - увы, биолог
Вот, собственно, и всё. Проблема решена. Вопросы остались. Кто что думает по этому поводу?
Спасибо, что дочитали до конца.
С уважением.
Юра.
PS. Вся эта штука - скелет. Скелет очень ветвистый. Но ветвиться он начинает задолго до десятого Лизина.