Mam taki plik tekstowy (wklejam tylko część):
DOPC 8x8 DPPC 2012apr_mp2_Testing
35325
1DOPC H6 10 5.888 5.839 1.884
1DOPC H7 11 5.950 5.878 1.726
1DOPC H8 12 5.928 6.005 1.845
1DOPC C4 13 5.756 6.033 1.643
1DOPC H9 14 5.659 6.053 1.598
1DOPC H10 15 5.821 5.993 1.565
1DOPC H11 16 5.799 6.129 1.674
1DOPC C5 17 5.548 6.092 1.837
1DOPC H12 18 5.497 6.120 1.929
1DOPC H13 19 5.586 6.185 1.794
1DOPC P1 20 5.332 5.949 1.795
1DOPC O1 21 5.386 5.819 1.842
129SOL OW17665 0.230 0.628 0.113
129SOL HW117666 0.137 0.626 0.150
129SOL HW217667 0.231 0.589 0.021
130SOL OW17668 0.225 0.275 0.996
130SOL HW117669 0.260 0.258 1.088
130SOL HW217670 0.137 0.230 0.984
131SOL OW17671 0.019 0.368 0.647
131SOL HW117672 -0.063 0.411 0.686
131SOL HW217673 -0.009 0.295 0.584
132SOL OW17674 0.569 1.275 1.165
132SOL HW117675 0.476 1.268 1.128
132SOL HW217676 0.580 1.364 1.209
133SOL OW17677 1.555 1.511 0.703
133SOL HW117678 1.498 1.495 0.784
133SOL HW217679 1.496 1.521 0.623
134SOL OW17680 1.135 0.703 0.717
134SOL HW117681 1.192 0.781 0.692
134SOL HW217682 1.075 0.729 0.793
135SOL OW17683 1.755 0.607 0.231
135SOL HW117684 1.743 0.594 0.132
135SOL HW217685 1.725 0.526 0.280
Muszę usunąć wszystkie cząsteczki wody z tego pliku tekstowego(SOL), którego koordynaty w osi Z (koordynaty osi Z to ostatnia liczba w każdej linijce) znajdują się załóżmy pomiędzy 0.7, a 1.1), czyli np. jeśli jakiś atom znajduje się np. " 134SOL OW17680 1.135 0.703 ** 0.717**" to usuwam :
134SOL OW17680 1.135 0.703 0.717
134SOL HW117681 1.192 0.781 0.692
134SOL HW217682 1.075 0.729 0.793
całą cząsteczkę, czyli 3 atomy (bo wystarczy, że choćby jeden atom się znajdzie pomiędzy 0.7 a 1.1
Na razie wiem jak usunąć daną linijkę, jeśli występuje jakieś tam słowo:
bad_words = ['HW', 'OW', "4.460"]
with open('system_solvate.gro', "r") as oldfile, open('clear.gro', 'w') as newfile:
for line in oldfile:
if not any(bad_word in line for bad_word in bad_words):
newfile.write(line)
Ale jak zrobić tak, żeby usunąć wszystkie linijki z liczbą w koordynacie z np. od 0.7 do 1.1 i jednocześnie inne atomy przynależące do tej cząsteczki? Nie mam zupełnie pomysłu. Wiem, że dodatkowo trzeba uwzględnić to, żeby skrypt sprawdzał te liczby na miejscu od 40 do 45 w każdej linijce (bo tam są te koordynaty z, bo są też liczby z koordynatami x i y). Błagam podpowiedzcie chociaż trochę.
Gość napisał skrypt w perlu robiący to, ale kompletnie nie znam tego języka http://www.mdtutorials.com/gmx/membrane_protein/03_solvate.html
www.mdtutorials.com/gmx/membrane_protein/Files/water_deletor.pl