build.rna_tools.tools.PyMOL4RNA.PyMOL4RNA   F
last analyzed

Complexity

Total Complexity 163

Size/Duplication

Total Lines 1664
Duplicated Lines 12.32 %

Importance

Changes 0
Metric Value
eloc 928
dl 205
loc 1664
rs 1.672
c 0
b 0
f 0
wmc 163

85 Functions

Rating   Name   Duplication   Size   Complexity  
A cmd_text() 0 4 2
A align_all() 0 55 3
A grid_on() 0 2 1
A rx() 0 13 1
B get_intrs_all_vs_all() 0 34 8
A spla() 0 3 1
A rs() 0 27 3
A spln() 0 3 1
A color_protein() 0 7 1
A rp() 0 8 1
A color_by_text() 0 7 2
A delete_all() 0 2 1
A grid_off() 0 2 1
A show_all_at_once() 0 2 1
A save_transformed() 0 20 1
A exe() 0 8 1
A edges() 14 14 2
A sav() 0 18 1
A x3dna() 0 9 2
A inspect() 0 11 4
A hide_protein() 0 2 1
A names() 0 5 2
A rlabel() 0 4 1
A ls() 0 11 4
B seq() 0 35 7
A pn() 0 2 1
B rmsdx() 0 54 5
A white() 0 4 1
A clarna2() 0 20 3
A qrnas() 0 23 2
A hide_rna() 0 2 1
A axes() 0 36 2
A ha() 0 5 1
A ll() 0 3 1
A seqsel() 0 15 2
A get_resi() 0 8 1
A p() 0 9 1
A select_rna() 0 2 1
A strip_selection_name() 0 3 1
B color_obj() 57 57 5
A axes2() 0 22 1
A qrnass() 0 9 1
A fr() 15 15 2
A clarna() 0 36 3
A clr() 0 2 1
A rgyrate() 26 26 3
A s() 0 2 1
A tmp() 0 3 1
A v() 0 14 1
A mini() 0 9 1
A hb() 0 2 1
A rtrun() 0 7 1
A align_all_atoms() 0 58 3
A da() 0 12 1
A rcomp() 0 31 3
A rgyration() 32 32 3
A bw() 0 4 1
A axes_big() 0 25 1
A quickref() 0 27 1
A draw() 0 34 1
A save_each_object() 0 21 3
A ss_all() 0 17 4
A colmol() 0 11 1
A show_rna() 0 2 1
A diff() 11 11 1
A pdb() 0 13 4
A findN() 0 3 1
A se() 0 2 1
A trim() 0 3 1
A select_protein() 0 2 1
A load() 0 6 2
A tp() 0 22 1
A rpr() 11 11 1
A desc() 0 8 1
A ino() 0 8 1
A load_tmp() 0 3 1
A save_all() 0 9 3
A reload() 0 3 1
A mutate() 0 10 1
B align_all_vs_all() 0 60 5
B color_rbw() 39 39 5
A ss() 0 15 2
A sav_tmp() 0 23 4
A rna_cartoon() 0 10 1
A color_aa_types() 0 17 1

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complexity

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like build.rna_tools.tools.PyMOL4RNA.PyMOL4RNA often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
#!/usr/bin/env python
2
#from icecream import ic
3
#import sys
4
#ic.configureOutput(outputFunction=lambda *a: print(*a, file=sys.stderr), includeContext=True)
5
#ic.configureOutput(prefix='')
6
7
try:
8
    from icecream import ic
9
    ic.configureOutput(outputFunction=lambda *a: print(*a, file=sys.stderr))
10
    ic.configureOutput(prefix='> ')
11
except ImportError:
12
    ic = print
13
14
BIN = "/Users/magnus/miniconda3/bin/"
15
print(BIN)
16
17
"""
18
DOCS! Quick reference:
19
20
- clarna: show contacts classification of the selected fragment based on ClaRNA
21
- ss: show secondary structure of the selection based on py3dna.py (3DNA (Lu, Olson 2003))
22
- ss_all: the same as ss() but for all objects
23
- pdbsrc: show PDB content (source) of selection.
24
- seq: show sequence of the selection
25
- ino: represent ions as sphare and yellow inorganic, such us Mg
26
- p: shortcut for putting a seq at the bottom. Pretty cool for screenshots with names of objects
27
- spli: color snRNA of the spliceosome and bases according to identity U(blue), A(orange), G(red), C(forest)
28
- rp: @todo
29
- rs: @todo
30
- rib: @todo
31
- select br. all within 12 of resi 574
32
33
If you want more, read for interesting functions <https://daslab.stanford.edu/site_data/docs_pymol_rhiju.pdf>
34
35
Tips; cmd.do
36
37
"""
38
# imports
39
import tempfile
40
import math
41
import subprocess
42
import os
43
import sys
44
45
import getpass
46
user = getpass.getuser()
47
48
import os
49
import sys
50
51
52
def exe(cmd, verbose=False):
53
    """Helper function to run cmd. Using in this Python module."""
54
    if verbose: print('cmd:' + cmd)
55
    o = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
56
                         executable=EXECUTABLE)
57
    out = o.stdout.read().strip().decode()
58
    err = o.stderr.read().strip().decode()
59
    return out, err
60
61
def spla():
62
    cmd.do("color forest, chain A")
63
    cmd.do("color firebrick, chain B")
64
cmd.extend('spla', spla)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable cmd does not seem to be defined.
Loading history...
65
print('spla - color A and B')
66
67
def spln():
68
    cmd.do("color forest, chain 2")
69
    cmd.do("color firebrick, chain 6")
70
cmd.extend('spln', spln)
71
print('spln - color 2 and 6')
72
      
73
def color_protein():
74
    cmd.do("color blue, resn ARG+LYS+HIS and (sele)")
75
    cmd.do("color red, resn ASP+GLU and (sele)")
76
    cmd.do("color green, resn GLY+ALA+VAL+LEU+ILE+MET+PHE and (sele)")
77
    cmd.do("color yellow, resn TYR+TRP and (sele)")
78
    cmd.do("color forest, resn SER+THR+CYS+ASN+GLN and (sele)")
79
    cmd.do("color pink, resn PRO and (sele)")
80
81
cmd.extend('cp', color_protein)
82
83
def save_transformed(object, file):
84
    """Saves the molecule with coordinates from the current orientation.
85
86
     Args:
87
        object (string): PyMOL name
88
        file (string): a file name to output file
89
90
    Example::
91
92
         PyMOL>save_transformed 6bk8_RNA_only_Oriented, 6bk8_RNA_only_Oriented.pdb
93
94
    Source: <https://pymolwiki.org/index.php/Modeling_and_Editing_Structures>
95
    """
96
    m = cmd.get_view(0)
97
    ttt = [m[0], m[1], m[2], 0.0,
98
           m[3], m[4], m[5], 0.0,
99
           m[6], m[7], m[8], 0.0,
100
           0.0,   0.0,  0.0, 1.0]
101
    cmd.transform_object(object,ttt,transpose=1)
102
    cmd.save(file,object)
103
104
105
def color_by_text(txt):
106
    """Helper function used for color-coding based on residue indexes ranges."""
107
    for t in txt.strip().split('\n'):
108
        print(t)
109
        color, resi = t.replace('color ', '').split(',')
110
        print((color, resi))
111
        cmd.color(color.strip(), resi.strip())
112
113
def cmd_text(txt):
114
    """Helper function used for color-coding based on residue indexes ranges."""
115
    for t in txt.strip().split('\n'):
116
        cmd.do(t)
117
118
def delete_all():
119
    cmd.delete('*')
120
cmd.extend('dall', delete_all)
121
print('dall - delete_all')
122
123
def rp():
124
    """Represent your RNA."""
125
    cmd.hide("sticks", "all")
126
    cmd.hide("lines", "all")
127
    cmd.show("cartoon", "all")
128
    cmd.set("cartoon_ring_mode", 3)
129
    cmd.set("cartoon_ring_finder", 2)
130
    cmd.set("cartoon_ladder_mode", 1)
131
132
def show_all_at_once():
133
    cmd.set('states', 'on')
134
135
136
def grid_on():
137
    cmd.set('grid_mode', 1)
138
139
def grid_off():
140
    cmd.set('grid_mode', 0)
141
142
cmd.extend('gridon', grid_on)
143
cmd.extend('gridoff', grid_off)
144
cmd.extend('gn', grid_on)
145
cmd.extend('gf', grid_off)
146
147
148
def rs():
149
    """    The function creates super-cool cartoon-like RNA and colors each structure as a rainbow.
150
    Good to view aligned structures in a grid.
151
152
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/rs.png
153
    """
154
    cmd.hide("sticks", "all")
155
    cmd.hide("lines", "all")
156
    cmd.show("cartoon", "all")
157
    cmd.set("cartoon_ring_mode", 3)
158
    cmd.set("cartoon_ring_finder", 2)
159
    cmd.set("cartoon_ladder_mode", 2)
160
    cmd.set("cartoon_ring_transparency", 0.30)
161
    cmd.spectrum()
162
163
    obj_list = cmd.get_names('objects')
164
165
    colours = ['rainbow']
166
    ncolours = len(colours)
167
    # Loop over objects
168
    i = 0
169
    for obj in obj_list:
170
        print("  ", obj, colours[i])
171
        cmd.spectrum('count', colours[i], obj)
172
        i = i+1
173
        if(i == ncolours):
174
           i = 0
175
176
177
def rx():
178
    """    The function creates super-cool cartoon-like RNA and colors each structure as a rainbow.
179
    Good to view aligned structures in a grid.
180
181
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/rs.png
182
    """
183
    cmd.hide("sticks", "all")
184
    cmd.hide("lines", "all")
185
    cmd.show("cartoon", "all")
186
    cmd.set("cartoon_ring_mode", 0)
187
    cmd.set("cartoon_ring_finder", 0)
188
    cmd.set("cartoon_ladder_mode", 0)
189
    cmd.set("cartoon_ring_transparency", 0.30)
190
191
cmd.extend('rx', rx)
192
193
194
def get_intrs_all_vs_all(verbose=True, redundant=True):
195
    """
196
    get_intrs_all_vs_all()
197
    get_raw_distances contacts_all # U6_C-CWC2_C_all
198
199
        # if true all vs all (a-b and b-a) then set redundant to True
200
        # this is sometimes useful if you want to have interactions of b in form of
201
        # b-a
202
        # b-c
203
        # if redundant False then you will have only
204
        # a-b
205
        # b-c
206
207
    """
208
    # cmd.delete('contacts')
209
    objs = cmd.get_names_of_type("object:molecule")
210
    if verbose:
211
        print(objs)
212
    # objs = ['U6_C', 'CWC25_C']
213
    objs2 = objs.copy()
214
    for o in objs:
215
        if not redundant:
216
            objs2.pop(0)
217
        if verbose:
218
            print(' ', objs2)
219
        for o2 in objs2:
220
            if o != o2:  # don't compare object to itself
221
                print(o,'<>',o2)
222
                results = o + '-' + o2
223
                if show_contacts(o, o2, results): #, 'contacts) #) # results to U6_C-CWC15_C
224
                    # if not None
225
                    p = '/Users/magnus/Desktop/spl-csv/'  # TODO
226
                    # _all or 
227
                    get_raw_distances(results + '_all', filename=p + results + '.csv')
228
            
229
cmd.extend('get_intrs_all_vs_all', get_intrs_all_vs_all)
230
231
def align_all(cycles = 5, filename="_rmsd_.csv"):
232
    """
233
    Args:
234
235
        cycles (int): maximum number of outlier rejection cycles {default: 5}
236
237
    Returns:
238
239
        Prints a table of ref vs models with 7 items:
240
241
        RaR  RMSD after refinement
242
        #AA  Number of aligned atoms after refinement
243
        CoR  Number of refinement cycles
244
        RbR  RMSD before refinement
245
        #AbR Number of aligned atoms before refinement
246
        RS   Raw alignment score
247
        AR   Number of residues aligned 
248
249
        and saves the table to filename as csv
250
251
    old version:
252
253
          1_solution_0_rpr 1_santalucia_1_rpr 5.60600471496582 958 4 5.763411521911621 974 416.0 46 -- RMSD 5.76  of  46 residues
254
255
"""
256
    molecules = cmd.get_names_of_type("object:molecule")
257
    ref = molecules.pop(0)
258
    print("""
259
    RaR  RMSD after refinement
260
    #AA  Number of aligned atoms after refinement
261
    CoR  Number of refinement cycles
262
    RbR  RMSD before refinement
263
    #AbR Number of aligned atoms before refinement
264
    RS   Raw alignment score
265
    AR   Number of residues aligned 
266
    """)
267
    report = []
268
    header = 'Ref                  Model                RaR  #AA  CoR  RbR  #AbR RS   AR'
269
    print(header)
270
    txt = 'Ref,Model,RMSD after refinement,Number of aligned atoms after refinement, Number of refinement cycles, RMSD before refinement, Number of aligned atoms before refinement, Raw alignment score, Number of residues aligned\n'
271
    for molecule in molecules:
272
        values = cmd.align(molecule, ref, cycles=cycles)
273
        l = ([ref[:20].ljust(20), molecule[:20].ljust(20), str(round(values[0], 2)).ljust(4),
274
            str(round(values[1], 2)).ljust(4),
275
            str(round(values[2], 2)).ljust(4),
276
            str(round(values[3], 2)).ljust(4),
277
            str(round(values[4], 2)).ljust(4),
278
            str(round(values[5])).ljust(4),
279
            str(round(values[6], 2)).ljust(4)])
280
        print(' '.join(l))
281
        txt += ','.join([x.strip() for x in l]) + '\n'
282
        report.append([ref, molecule, values[3], values[6]])
283
284
    with open(filename, 'w') as f:
285
        f.write(txt)
286
287
cmd.extend('align_all', align_all)
288
289
def align_all_vs_all(cycles = 5, filename="_rmsd_all_vs_all_.csv"):
290
    """
291
    Args:
292
293
        cycles (int): maximum number of outlier rejection cycles {default: 5}
294
295
    Returns:
296
297
        Prints a table of ref vs models with 7 items:
298
299
        RaR  RMSD after refinement
300
        #AA  Number of aligned atoms after refinement
301
        CoR  Number of refinement cycles
302
        RbR  RMSD before refinement
303
        #AbR Number of aligned atoms before refinement
304
        RS   Raw alignment score
305
        AR   Number of residues aligned 
306
307
        and saves the table to filename as csv
308
309
    old version:
310
311
          1_solution_0_rpr 1_santalucia_1_rpr 5.60600471496582 958 4 5.763411521911621 974 416.0 46 -- RMSD 5.76  of  46 residues
312
313
"""
314
    molecules = cmd.get_names_of_type("object:molecule")
315
316
    print("""
317
    RaR  RMSD after refinement
318
    #AA  Number of aligned atoms after refinement
319
    CoR  Number of refinement cycles
320
    RbR  RMSD before refinement
321
    #AbR Number of aligned atoms before refinement
322
    RS   Raw alignment score
323
    AR   Number of residues aligned 
324
    """)
325
    report = []
326
    header = 'Ref                  Model                RaR  #AA  CoR  RbR  #AbR RS   AR'
327
    print(header)
328
    txt = 'Ref,Model,RMSD after refinement,Number of aligned atoms after refinement, Number of refinement cycles, RMSD before refinement, Number of aligned atoms before refinement, Raw alignment score, Number of residues aligned\n'
329
    for ref in molecules:
330
      #print(ref)
331
      for molecule in molecules:
332
        if ref == molecule:
333
            continue
334
        #print(molecule)  
335
        values = cmd.align(molecule, ref, cycles=cycles)
336
        l = ([ref[:20].ljust(20), molecule[:20].ljust(20), str(round(values[0], 2)).ljust(4),
337
            str(round(values[1], 2)).ljust(4),
338
            str(round(values[2], 2)).ljust(4),
339
            str(round(values[3], 2)).ljust(4),
340
            str(round(values[4], 2)).ljust(4),
341
            str(round(values[5])).ljust(4),
342
            str(round(values[6], 2)).ljust(4)])
343
        print(' '.join(l))
344
        txt += ','.join([x.strip() for x in l]) + '\n'
345
        report.append([ref, molecule, values[3], values[6]])
346
347
    with open(filename, 'w') as f:
348
        f.write(txt)
349
350
cmd.extend('align_all_vs_all', align_all_vs_all)
351
cmd.extend('aaa', aaa)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable aaa does not seem to be defined.
Loading history...
352
353
def align_all_atoms(cycles = 5, filename="_rmsd_.csv"):
354
    """
355
    Args:
356
357
        cycles (int): maximum number of outlier rejection cycles {default: 5}
358
359
    Returns:
360
361
        Prints a table of ref vs models with 7 items:
362
363
        RaR  RMSD after refinement
364
        #AA  Number of aligned atoms after refinement
365
        CoR  Number of refinement cycles
366
        RbR  RMSD before refinement
367
        #AbR Number of aligned atoms before refinement
368
        RS   Raw alignment score
369
        AR   Number of residues aligned 
370
371
        and saves the table to filename as csv
372
373
    old version:
374
375
          1_solution_0_rpr 1_santalucia_1_rpr 5.60600471496582 958 4 5.763411521911621 974 416.0 46 -- RMSD 5.76  of  46 residues
376
377
"""
378
    molecules = cmd.get_names_of_type("object:molecule")
379
    ref = molecules.pop(0)
380
    print("""
381
    RaR  RMSD after refinement
382
    #AA  Number of aligned atoms after refinement
383
    CoR  Number of refinement cycles
384
    RbR  RMSD before refinement
385
    #AbR Number of aligned atoms before refinement
386
    RS   Raw alignment score
387
    AR   Number of residues aligned 
388
    """)
389
    report = []
390
    header = 'Ref                  Model                RaR  #AA  CoR  RbR  #AbR RS   AR'
391
    print(header)
392
    txt = 'Ref,Model,RMSD after refinement,Number of aligned atoms after refinement, Number of refinement cycles, RMSD before refinement, Number of aligned atoms before refinement, Raw alignment score, Number of residues aligned\n'
393
    atoms = "O4'+C1'+C4'+C3'"
394
    atoms = "P+O5'+C5'" #OP1'
395
    ref = r"/" + ref + "////" + atoms 
396
    for molecule in molecules:
397
        molecule = r"/" + molecule + "////" + atoms
398
        values = cmd.align(molecule, ref, cycles=cycles)
399
        l = ([ref[:20].ljust(20), molecule[:20].ljust(20), str(round(values[0], 2)).ljust(4),
400
            str(round(values[1], 2)).ljust(4),
401
            str(round(values[2], 2)).ljust(4),
402
            str(round(values[3], 2)).ljust(4),
403
            str(round(values[4], 2)).ljust(4),
404
            str(round(values[5])).ljust(4),
405
            str(round(values[6], 2)).ljust(4)])
406
        print(' '.join(l))
407
        txt += ','.join([x.strip() for x in l]) + '\n'
408
        report.append([ref, molecule, values[3], values[6]])
409
    with open(filename, 'w') as f:
410
        f.write(txt)
411
412
#cmd.extend('aaa', align_all_atoms)
413
414
def load(f):
415
    from glob import glob
416
    lst = glob(f)
417
    lst.sort()
418
    for fil in lst:
419
        cmd.load(fil)
420
cmd.extend('load', load)
421
422
423
def rmsdx(cycles = 5, matrix_fn = 'matrix.txt'):
424
    """
425
    Args:
426
427
    cycles (int): refinement cycles of PyMOL align, default: 5
428
    matrix_fn (string): a file to save the matrix
429
                        matrix is pretty much saved in space-separated values 
430
                        so you can load it to pandas with
431
432
                        df = pd.read_csv('matrix.txt', sep=' ', index_col=False)
433
                        df = df.set_index(df.columns)
434
                        print(df)
435
                                      Bact_7DCO_S  Bact_5gm6_S
436
                        Bact_7DCO_S         0.000        0.562
437
438
    Returns:
439
440
    string: matrix 
441
            and matrix_fn file ;-)
442
443
    """
444
    models = cmd.get_names_of_type("object:molecule")
445
    print(' # of models:', len(models))
446
    
447
    f = open(matrix_fn, 'w')
448
    #t = '# ' # for numpy
449
    t = ''  # for pandas
450
    for r1 in models:
451
        # print r1,
452
        t += str(r1) + ' '  # here ' ' could be changed to , or \t
453
    t = t.strip() + '\n'
454
455
    c = 1
456
    for r1 in models:
457
        for r2 in models:
458
            if r1 == r2:
459
                rmsd = 0
460
            else:
461
                print(r1, r2)
462
                values = cmd.align(r1, r2, cycles=cycles)
463
                # RaR [1]       RbR [3]
464
                # RaR  #AA  CoR               RbR  #AbR RS   AR'
465
                # (0.668652355670929, 241, 5, 1.1646124124526978, 293, 199.0, 38)
466
                rmsd = round(values[0], 3)
467
            t += str(rmsd) + ' '
468
        #print('...', c, r1)
469
        c += 1
470
        t += '\n'
471
472
    f.write(t)
473
    f.close()
474
475
    print(t.strip())  # matrix
476
    return t
477
478
cmd.extend('rmsdx', rmsdx)
479
480
def save_all(dir=''):
481
    """save_all molecule objects as pdb files. Use `cd` to get to the right folder
482
       or use dir argument"""
483
    if dir:
484
        dir += '/'
485
    molecules = cmd.get_names_of_type("object:molecule")
486
    for molecule in molecules:
487
        print('Saving %s ...' % molecule)
488
        cmd.save(dir + molecule + '.pdb', molecule)
489
490
cmd.extend('save_all', save_all)
491
492
def ls(name='', width=80):
493
    molecules = cmd.get_names_of_type("object:molecule")
494
    for i in range(10):
495
            print()
496
    t = ''
497
    if name:
498
        t = name + ': '
499
    for molecule in molecules:
500
        t += '%s' % molecule + ' | '
501
    print(t[:-2].center(int(width))) # remove ending |
502
    print()
503
cmd.extend('ls', ls)
504
    
505
506
def save_each_object(folder='', prefix=''):
507
    """
508
509
    Usage::
510
511
        save_each_object /Users/magnus/work/spliceosome/PyMOL4Spliceosome/chains/yB_5zwo, yB_5zwo_
512
513
        p = 'yP_6exn' # yP_5ylz' #yI_5y88' # yE_6n7r'
514
        pth = '/Users/magnus/work/spliceosome/PyMOL4Spliceosome/chains/'
515
        save_each_object(pth + p, p + '_')
516
517
    See the application here <https://github.com/mmagnus/PyMOL4Spliceosome/releases/tag/v0.32>
518
519
    .. todo:: add some way to select which objects to use
520
    """
521
    obj_list = cmd.get_names('objects')
522
    for o in obj_list:
523
        if folder:
524
            folder += '/'
525
        fn = folder + prefix.strip() + o.strip() + '.pdb'
526
        cmd.save(fn, o)
527
528
cmd.extend('save_each_object', save_each_object)
529
530
def rcomp():
531
    """RNA like in papers ;-)
532
533
    Similar to rc() but this time it colors each (and every) structure in different colour.
534
    Great on viewing-comparing superimposed structures.
535
536
    """
537
    cmd.hide("sticks", "all")
538
    cmd.hide("lines", "all")
539
    cmd.show("cartoon", "all")
540
    cmd.set("cartoon_ring_mode", 3)
541
    cmd.set("cartoon_ring_finder", 2)
542
    cmd.set("cartoon_ladder_mode", 2)
543
    cmd.set("cartoon_ring_transparency", 0.30)
544
545
    obj_list = cmd.get_names('objects')
546
547
    colours = ['red', 'green', 'blue', 'yellow', 'violet', 'cyan',    \
548
           'salmon', 'lime', 'pink', 'slate', 'magenta', 'orange', 'marine', \
549
           'olive', 'purple', 'teal', 'forest', 'firebrick', 'chocolate',    \
550
           'wheat', 'white', 'grey' ]
551
    ncolours = len(colours)
552
553
           # Loop over objects
554
    i = 0
555
    for obj in obj_list:
556
        print("  ", obj, colours[i])
557
        cmd.color(colours[i], obj)
558
        i = i+1
559
        if(i == ncolours):
560
           i = 0
561
562
563
def colmol():  # donors accepters
564
    t = """
565
h_add,
566
bg gray,
567
color white,
568
color black, elem C
569
color blue , elem N
570
color red, elem O
571
color violet, elem P
572
    """
573
    cmd.do(t)
574
cmd.extend('colmol', colmol)
575
576
def da():  # donors accepters
577
    t = """
578
    h_add;
579
     set sphere_scale, 0.3, (all)
580
     set sphere_transparency, 0
581
     color blue, donors;
582
     color green, acceptors;
583
     show sphere, donors;
584
     show sphere, acceptors;
585
     color gray,  name H*; # color atoms from white to gray
586
    """
587
    cmd.do(t)
588
589
cmd.extend('da', da)
590
591
def da():  # donors accepters
592
    t = """
593
    h_add;
594
    #color blue, donors;
595
    #color green, acceptors;
596
    set sphere_scale, 0.3, (donors)
597
    set sphere_transparency, 0
598
    show sphere, donors;
599
    set sphere_scale, 0.2, (acceptors)
600
    set sphere_transparency, 0
601
    set dot_width, 0.3, (donors)
602
    show dots, acceptors;
603
    color gray,  name H*; # color atoms from white to gray
604
    """
605
    cmd.do(t)
606
#cmd.extend('da', da)
607
608
def pdb(sele = ''):
609
    """Get PDB content of selection.
610
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/pdb.png"""
611
    f = tempfile.NamedTemporaryFile(delete=False) # True)
612
    f = f.name + '.pdb'
613
    #tmpfn = '/tmp/pymol_get_pdb.pdb'
614
    if sele:
615
        cmd.save(f, '(' + sele + ')')
616
    else:
617
        cmd.save(f, '(sele)')
618
    for l in open(f):
619
        if l.strip() not in ['TER', 'END']:
620
            print(l.strip())
621
    #s = RNAStructure(tmpfn)
622
    #for l in s.lines:
623
    #    print(l)
624
625
626
def x3dna():
627
    f = tempfile.NamedTemporaryFile(delete=False) # True)
628
    #cmd.save(f.name + '.pdb', '(backbone_)')
629
    cmd.save(f.name + '.pdb', '(sele)')
630
    out, err = exe("rna_x3dna.py --show-log " + f.name + ".pdb ")
631
    print('\n'.join(out.split('\n')[1:]))  # to remove first line of py3dna /tmp/xxx
632
    if err:
633
        print(err)
634
    f.close()
635
636
637
def clarna2():
638
    """Get contacts classification of the selected fragment based on ClaRNA (for each object).
639
640
    .. image:: ../../rna_tools/tools/PyMOL4RNA/doc/clarna.png
641
    """
642
    objs = cmd.get_names("objects")
643
    for name in objs[:]:
644
        print(name + ' ' + '-' * (70 - len(name)))
645
        f = tempfile.NamedTemporaryFile(delete=False) # True)
646
        #cmd.save(f.name + '.pdb', '(backbone_)')
647
        cmd.save(f.name + '.pdb', '(sele) and "' + name + '"')
648
        CLARNA_RUN = BIN + 'rna_clarna_run.py'
649
        #cmdline = #SOURCE + " && " +
650
        cmdline = CLARNA_RUN + " -ipdb " + f.name + '.pdb -bp+stack'
651
        print(cmdline)
652
        out, err = exe(cmdline)
653
        print('\n'.join(out.split('\n')[1:]))  # to remove first line of py3dna /tmp/xxx
654
        if err:
655
            print(err)
656
        f.close()
657
658
659
def clarna(selection, folder:str='', sele_as_name=False):# fn:str=''):
660
    """Get contacts classification of the selected fragment based on ClaRNA (for each object).
661
662
    Args:
663
664
      folder (str): The path to save temporary files, by default they are save to system tmp
665
666
      # replace resi? or keep resi there?
667
668
    Example::
669
670
        PyMOL>clarna sele
671
        rna_clarna_run.py -ipdb /var/folders/yc/ssr9692s5fzf7k165grnhpk80000gp/T/tmp1h_bwvtx.pdb -bp+stack
672
        chains:  X 15 16
673
        X   15   X   16          bp A A                      ><   0.9427
674
675
    .. image:: ../../rna_tools/tools/PyMOL4RNA/doc/clarna.png
676
    """
677
    # save the file
678
    f = tempfile.NamedTemporaryFile(delete=False) # True)
679
    if not folder:
680
        output = f.name + '_clarna.pdb'
681
    else:
682
        output= folder + os.sep + os.path.basename(f.name) + '_clarna.pdb'
683
    cmd.save(output, selection)
684
    # run cmd    
685
    CLARNA_RUN = 'rna_clarna_run.py'
686
    cmdline = CLARNA_RUN + " -ipdb " + output + ' -bp+stack'
687
    out, err = exe(cmdline)
688
    # get the output
689
    print('\n'.join(out.split('\n')[1:]))  # to remove first line of py3dna /tmp/xxx
690
    if err:
691
        print(err)
692
    # load a (sele) pdb file 
693
    cmd.load(output)
694
    f.close()
695
    
696
cmd.extend('clarna', clarna)  # export the function for pymol
697
698
def seq(selection):
699
    """Get sequence of the selected fragment using ``rna_pdb_tools.py --get_seq ``.
700
701
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/ss.png
702
    """
703
    if selection.strip() == "*":
704
        AllObj = cmd.get_names("all")
705
        # print AllObj
706
        for name in AllObj[:]:
707
            if not name.startswith('_align'):
708
                f = tempfile.NamedTemporaryFile(delete=False) # True)
709
                f.name = f.name + '.pdb'
710
                cmd.save(f.name, name)
711
                cmdline = 'rna_pdb_tools.py --color-seq --get-seq ' + f.name
712
                out, err = exe(cmdline)
713
                if out:
714
                    print('> ' + name)
715
                    print('\n'.join(out.split('\n')[2:]))  # to remove first line of py3dna /tmp/xxx
716
                    # hide this line: is >tmpGCszi7 nts=4 [tmpGCszi7] -- secondary structure derived by DSSR
717
                if err:
718
                    # print(err)
719
                    pass
720
                f.close()
721
    else:
722
        f = tempfile.NamedTemporaryFile(delete=False)
723
        selection = strip_selection_name(selection)
724
        input = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
725
        cmd.save(input, selection)
726
        cmdline = 'rna_pdb_tools.py  --color-seq --get-seq ' + input
727
        # print(cmdline)
728
        out, err = exe(cmdline)
729
        print(out)
730
        if err:
731
            print(err)
732
        f.close()
733
734
def seqsel():
735
    """Get sequence of the selected fragment using ``rna_pdb_tools.py --get_seq ``.
736
    """
737
    f = tempfile.NamedTemporaryFile(delete=False)
738
    selection = '(sele)'
739
    input = os.path.dirname(f.name) + os.sep +  '_sele.pdb'
740
    cmd.save(input, selection)
741
742
    cmdline = 'rna_pdb_tools.py --get-seq ' + input
743
    print(cmdline)
744
    out, err = exe(cmdline)
745
    print(out)
746
    if err:
747
        print(err)
748
    f.close()
749
750
751
def ss(selection):
752
    """Get Secondary Structure of (sele) based on py3dna.py.
753
754
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/ss.png
755
    """
756
    f = tempfile.NamedTemporaryFile(delete=False)
757
    output = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
758
    cmd.save(output, '(sele)')
759
760
    cmdline = 'rna_x3dna.py ' + output
761
    out, err = exe(cmdline)
762
    print('\n'.join(out.split('\n')[2:]))  # to remove first line of py3dna /tmp/xxx
763
    if err:
764
        print(err)
765
    f.close()
766
767
768
769
def rtrun(cmd, selection, suffix):
770
    f = tempfile.NamedTemporaryFile(delete=False) # True)
771
    output = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
772
    output2 = os.path.dirname(f.name) + os.sep + selection + '_mut.pdb'
773
    exe(cmdline)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable cmdline does not seem to be defined.
Loading history...
774
    print(cmdline)
775
    cmd.save(output, selection)
776
777
    # 'A:1A+2A+3A+4A' 
778
779
def mutate(mutation, selection):
780
    """
781
    """
782
    f = tempfile.NamedTemporaryFile(delete=False) # True)
783
    output = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
784
    output2 = os.path.dirname(f.name) + os.sep + selection + '_mut.pdb'
785
    cmdline = "rna_pdb_tools.py --mutate " + mutation + ' ' + output + ' > ' + output2
786
    print(cmdline)
787
    exe(cmdline)
788
    cmd.load(output2)
789
790
cmd.extend('mutate', mutate)
791
792
793
def ss_all():
794
    """The same as ss() but for all objects."""
795
    subset = "*"
796
    AllObj = cmd.get_names("all")
797
    # print AllObj
798
    for name in AllObj[:]:
799
        if not name.startswith('_align'):
800
            print('> ' + name)
801
            f = tempfile.NamedTemporaryFile(delete=False) # True)
802
            cmd.save(f.name, name)
803
            out, err = exe(RNA_TOOLS_PATH + '/bin/rna_x3dna.py ' + f.name)
804
            print('\n'.join(out.split('\n')[2:]))  # to remove first line of py3dna /tmp/xxx
805
            # hide this line: is >tmpGCszi7 nts=4 [tmpGCszi7] -- secondary structure derived by DSSR
806
            if err:
807
                print(err)
808
            f.close()
809
    print('-- secondary structure derived by DSSR')
810
811
812
def p():
813
    """A shortcut for putting a seq at the bottom. Pretty cool for screenshots with names of objects.
814
815
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/p.png
816
    """
817
    cmd.set("seq_view_format", 4)
818
    cmd.set("seq_view", 1)
819
    cmd.set("seq_view_location", 1)
820
    cmd.set("seq_view_overlay", 1)
821
822
823
def rna_cartoon():
824
    """http://www-cryst.bioc.cam.ac.uk/members/zbyszek/figures_pymol
825
826
    .. image:: ../pngs/rna_cartoon.png
827
    """
828
    cmd.set("cartoon_ring_mode", 3)
829
    cmd.set("cartoon_ring_finder", 1)
830
    cmd.set("cartoon_ladder_mode", 1)
831
    cmd.set("cartoon_nucleic_acid_mode", 4)
832
    cmd.set("cartoon_ring_transparency", 0.5)
833
834
835
def color_aa_types():
836
    """Color aminoacides types like in Cider (http://pappulab.wustl.edu/CIDER/)"""
837
    txt = """
838
color gray70, resn Ala+Ile+Leu+Met+Phe+Trp+Val #hydrophobic
839
color yellow, resn Tyr+Trp #aromatic
840
color blue, resn Arg+Lys+His # positive
841
color forest, resn GLN+SER+GLY+thr
842
color pink, resn PRO # pro
843
color red, resn GLU+asp # """
844
    print("""color (according to) amino-acids types)
845
hydrohobic (gray)  Ala+Ile+Leu+Met+Phe+Trp+Val
846
aromatic (yellow) Tyr+Trp
847
positive (blue)  Arg+Lys+His
848
polar (forest) Gln+Ser+Glu+Thr
849
negative (red) Glu+Asp
850
prolina ;) (pink) Pro""")
851
    color_by_text(txt)
852
853
854 View Code Duplication
def color_obj(rainbow=0):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
855
856
        """
857
        stolen from :)
858
AUTHOR
859
        Gareth Stockwell
860
861
USAGE
862
        color_obj(rainbow=0)
863
864
        This function colours each object currently in the PyMOL heirarchy
865
        with a different colour.  Colours used are either the 22 named
866
        colours used by PyMOL (in which case the 23rd object, if it exists,
867
        gets the same colour as the first), or are the colours of the rainbow
868
869
        """
870
871
        # Process arguments
872
        rainbow = int(rainbow)
873
874
        # Get names of all PyMOL objects
875
        obj_list = cmd.get_names('objects')
876
877
        if rainbow:
878
879
           print("\nColouring objects as rainbow\n")
880
881
           nobj = len(obj_list)
882
883
           # Create colours starting at blue(240) to red(0), using intervals
884
           # of 240/(nobj-1)
885
           for j in range(nobj):
886
              hsv = (240-j*240/(nobj-1), 1, 1)
887
              # Convert to RGB
888
              rgb = hsv_to_rgb(hsv)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable hsv_to_rgb does not seem to be defined.
Loading history...
889
              # Define the new colour
890
              cmd.set_color("col" + str(j), rgb)
891
              print(obj_list[j], rgb)
892
              # Colour the object
893
              cmd.color("col" + str(j), obj_list[j])
894
895
        else:
896
           # List of available colours
897
           colours = ['red', 'green', 'blue', 'yellow', 'violet', 'cyan',    \
898
           'salmon', 'lime', 'pink', 'slate', 'magenta', 'orange', 'marine', \
899
           'olive', 'purple', 'teal', 'forest', 'firebrick', 'chocolate',    \
900
           'wheat', 'white', 'grey' ]
901
           ncolours = len(colours)
902
903
           # Loop over objects
904
           i = 0
905
           for obj in obj_list:
906
              print("  ", obj, colours[i])
907
              cmd.color(colours[i], obj)
908
              i = i+1
909
              if(i == ncolours):
910
                 i = 0
911
912
913
def names():
914
    # Get names of all PyMOL objects
915
    obj_list = cmd.get_names('objects')
916
    for o in obj_list:
917
        print(o)
918
919
920 View Code Duplication
def color_rbw(rainbow=0):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
921
        """
922
        similar to color_obj() but this time colors every obect as rainbow
923
        """
924
        rainbow = int(rainbow)
925
926
        # Get names of all PyMOL objects
927
        obj_list = cmd.get_names('objects')
928
929
        if rainbow:
930
931
           print("\nColouring objects as rainbow\n")
932
933
           nobj = len(obj_list)
934
935
           # Create colours starting at blue(240) to red(0), using intervals
936
           # of 240/(nobj-1)
937
           for j in range(nobj):
938
              hsv = (240-j*240/(nobj-1), 1, 1)
939
              # Convert to RGB
940
              rgb = hsv_to_rgb(hsv)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable hsv_to_rgb does not seem to be defined.
Loading history...
941
              # Define the new colour
942
              cmd.set_color("col" + str(j), rgb)
943
              print(obj_list[j], rgb)
944
              # Colour the object
945
              cmd.color("col" + str(j), obj_list[j])
946
        else:
947
           colours = ['rainbow']
948
           ncolours = len(colours)
949
950
           # Loop over objects
951
           i = 0
952
           for obj in obj_list:
953
              print("  ", obj, colours[i])
954
              cmd.spectrum('count', colours[i], obj)
955
#              cmd.color(colours[i], obj)
956
              i = i+1
957
              if(i == ncolours):
958
                 i = 0
959
960
961
def strip_selection_name(selection_name):
962
    """Quick function: (sele) -> sele"""
963
    return selection_name.replace('(', '').replace(')', '')
964
965
966 View Code Duplication
def edges(selection):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
967
    """Save selection into a file in a temp folder and run rna_draw_edges.py on it and load it into this session"""
968
    my_view = cmd.get_view()
969
    f = tempfile.TemporaryDirectory()
970
    tmpf = f.name + os.sep + strip_selection_name(selection) + '.pdb'
971
    outf = f.name + '/output.py'
972
    cmd.save(tmpf, selection)
973
    cmdline = '/Users/magnus/miniconda3/bin/rna_draw_edges.py --name %s %s > %s' % (strip_selection_name(selection), tmpf, outf)
974
    print(cmdline)
975
    out, err = exe(cmdline)
976
    if err:
977
        print(err)
978
    cmd.load(outf)
979
    cmd.set_view(my_view)
980
981
cmd.extend('edges', edges)
982
983 View Code Duplication
def fr(selection):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
984
    """Save selection into a file in a temp folder and run rna_draw_edges.py on it and load it into this session"""
985
    my_view = cmd.get_view()
986
    f = tempfile.TemporaryDirectory()
987
    tmpf = f.name + os.sep + strip_selection_name(selection) + '.pdb'
988
    outf = f.name + '/output.py'
989
    cmd.save(tmpf, selection)
990
    path = "/Users/magnus/work/src/rna-tools/rna_tools/tools/PyMOL4RNA/"
991
    cmdline = path + 'rna_draw_frames.py --name %s %s > %s' % (strip_selection_name(selection), tmpf, outf)
992
    print(cmdline)
993
    out, err = exe(cmdline)
994
    if err:
995
        print(err)
996
    cmd.load(outf)
997
    cmd.set_view(my_view)
998
999
cmd.extend('fr', fr)
1000
1001
1002
def ino():
1003
    """Sphare and yellow inorganic, such us Mg.
1004
1005
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/ion.png"""
1006
    cmd.show("spheres", "inorganic")
1007
    cmd.set('sphere_scale', '0.25', '(all)')
1008
    #cmd.set('sphere_scale', '1', '(all)')
1009
    cmd.color("yellow", "inorganic")
1010
1011
mapping = [[u'PRP8', 'A', u'skyblue'], [u'BRR2', 'B', u'grey60'], [u'BUD31', 'C', u'dirtyviolet'], [u'CEF1', 'D', u'raspberry'], [u'CLF1', 'E', u'raspberry'], [u'CWC15', 'F', u'dirtyviolet'], [u'CWC16/YJU2', 'G', u'lightteal'], [u'CWC2', 'H', u'ruby'], [u'CWC21', 'I', u'violetpurple'], [u'CWC22', 'J', u'bluewhite'], [u'CWC25', 'K', u'deepteal'], [u'Intron', 'L', u'black'], [u'ISY1', 'M', u'dirtyviolet'], [u'LEA1', 'N', u'palegreen'], [u'Msl1', 'O', u'palegreen'], [u'PRP45', 'P', u'lightpink'], [u'PRP16', 'Q', u'smudge'], [u'CDC40\xa0(PRP17, SLU4, XRS2)', 'R', u'dirtyviolet'], [u'PRP19 (PSO4)', 'S', u'grey70'], [u'PRP46', 'T', u'lightblue'], [u'SLT11/ECM2', 'U', u'chocolate'], [u'SNT309', 'V', u'grey70'], [u'SNU114', 'W', u'slate'], [u'SYF2', 'X', u'brightorange'], [u'SYF1', 'Y', u'brightorange'], [u'U2', 'Z', u'forest'], [u'U5', 'a', u'density'], [u'U5_SmRNP', 'b', u'deepblue'], [u'U6', 'c', u'firebrick'], [u'Intron', 'r', u'grey50'], [u'Exon', 'z', u'yellow'], [u'exon-3', 'y', u'yellow'], [u'exon-5', 'z', u'yellow'], [u'PRP4 ', 'd', u'grey50'], [u'PRP31', 'e', u'grey50'], [u'PRP6', 'f', u'grey50'], [u'PRP3', 'g', u'grey50'], [u'DIB1', 'h', u'grey50'], [u'SNU13', 'i', u'grey50'], [u'LSM8', 'j', u'grey50'], [u'LSM2', 'k', u'grey50'], [u'LSM3', 'l', u'grey50'], [u'LSM6', 'm', u'grey50'], [u'LSM5', 'n', u'grey50'], [u'LSM7', 'o', u'grey50'], [u'LSM4', 'p', u'grey50'], [u'SNU66', 'q', u'grey50'], [u'RNA (intron or U6 snRNA)', 'r', u'grey50'], [u'5EXON', 's', u'grey50'], [u'BUD13', 't', u'grey60'], [u'CLF2', 'u', u'rasberry'], [u'Cus1', 'v', u'palegreen'], [u'CWC24', 'w', u'grey60'], [u'CWC27', 'x', u'grey60'], [u'HSH155', '1', u'smudge'], [u'HSH49', '2', u'sand'], [u'PML1', '3', u'grey60'], [u'PRP11', '4', u'palegreen'], [u'PRP2', '5', u'palegreen'], [u'RDS3', '6', u'palegreen'], [u'RSE1', '7', u'smudge'], [u'SNU17', '8', u'grey60'], [u'Ysf3', '9', u'palegreen'], [u'cwc23', 'd', u'grey50'], [u'SPP382\xa0(CCF8, NTR1)', 'e', u'grey50'], [u'NTR2', 'f', u'grey50'], [u'PRP43', 'g', u'grey50'], [u'SMB1', 'h', u'grey50'], [u'SME1', 'i', u'grey50'], [u'SMX3', 'j', u'grey50'], [u'SMX2\xa0(SNP2)', 'k', u'grey50'], [u'SMD3', 'l', u'grey50'], [u'SMD1', 'm', u'grey50'], [u'SMD2', 'n', u'grey50'], [u'PRP22', 'o', u'grey50'], [u'PRP18', 'p', u'grey50'], [u'SLU7', 'q', u'grey50'], [u'SMF', 'd', u'grey50'], [u'SMG', 'e', u'grey50'], [u'PRP9', 'f', u'grey50'], [u'PRP21', 'g', u'grey50'], [u'SNU23', 'r', u'grey50'], [u'PRP38', 's', u'grey50'], [u'SPP381', 'w', u'grey50']]
1012
1013
1014 View Code Duplication
def rgyration(selection='(all)', quiet=1):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1015
    '''
1016
1017
[PyMOL] RES: radius of gyration
1018
From: Tsjerk Wassenaar <tsjerkw@gm...> - 2011-03-31 14:07:03
1019
https://sourceforge.net/p/pymol/mailman/message/27288491/
1020
DESCRIPTION
1021
1022
    Calculate radius of gyration
1023
1024
USAGE
1025
1026
    rgyrate [ selection ]
1027
 :::warning:::
1028
 if nothing is selected  function is calculating radius of gyration for all pdbs in current Pymol session
1029
    '''
1030
    try:
1031
        from itertools import izip
1032
    except ImportError:
1033
        izip = zip
1034
    quiet = int(quiet)
1035
    model = cmd.get_model(selection).atom
1036
    x = [i.coord for i in model]
1037
    mass = [i.get_mass() for i in model]
1038
    xm = [(m*i,m*j,m*k) for (i,j,k),m in izip(x,mass)]
1039
    tmass = sum(mass)
1040
    rr = sum(mi*i+mj*j+mk*k for (i,j,k),(mi,mj,mk) in izip(x,xm))
1041
    mm = sum((sum(i)/tmass)**2 for i in izip(*xm))
1042
    rg = math.sqrt(rr/tmass - mm)
1043
    if not quiet:
1044
        print("Radius of gyration: %.2f" % (rg))
1045
    return rg
1046
1047
1048 View Code Duplication
def rgyrate(selection='(all)', quiet=1):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1049
    '''
1050
DESCRIPTION
1051
1052
    Radius of gyration
1053
1054
USAGE
1055
1056
    rgyrate [ selection ]
1057
    '''
1058
    try:
1059
        from itertools import izip
1060
    except ImportError:
1061
        izip = zip
1062
    quiet = int(quiet)
1063
    model = cmd.get_model(selection).atom
1064
    x = [i.coord for i in model]
1065
    mass = [i.get_mass() for i in model]
1066
    xm = [(m*i,m*j,m*k) for (i,j,k),m in izip(x,mass)]
1067
    tmass = sum(mass)
1068
    rr = sum(mi*i+mj*j+mk*k for (i,j,k),(mi,mj,mk) in izip(x,xm))
1069
    mm = sum((sum(i)/tmass)**2 for i in izip(*xm))
1070
    rg = math.sqrt(rr/tmass - mm)
1071
    if not quiet:
1072
        print("Radius of gyration: %.2f" % (rg))
1073
    return rg
1074
1075
cmd.extend("rgyrate", rgyrate)
1076
1077
1078
def exe(cmd):
1079
    o = subprocess.Popen(
1080
        cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
1081
    out = o.stdout.read().strip().decode()
1082
    err = o.stderr.read().strip().decode()
1083
    return out, err
1084
1085
1086
def qrnass():
1087
    cmd.save('/tmp/sele.pdb', '(sele)')
1088
    #os.system('/home/magnus/opt/qrnas/QRNA02/QRNA -i ' + f + ' -c /home/magnus/opt/qrnas/QRNA02/configfile.txt -o out.pdb')
1089
    cmdline = '~/opt/qrnas/QRNA -i /tmp/sele.pdb -c ~/opt/qrnas/configfile.txt -o out.pdb'
1090
    print(cmdline)
1091
    os.system(cmdline)
1092
    #print(exe(cmdline))
1093
    cmd.delete('mini')
1094
    cmd.load('out.pdb', 'mini')
1095
1096
cmd.extend('qrnass', qrnass)
1097
1098
def qrnas():
1099
    subset = "*"
1100
    AllObj=cmd.get_names("all")
1101
    #print AllObj
1102
    for x in AllObj[:]:
1103
      print(x, 'qrnas...')
1104
      #print(AllObj[0],x)
1105
      f = tempfile.NamedTemporaryFile(delete=True)
1106
      #print f.name
1107
      #f.write(XX)
1108
      cmd.save(f.name, x)
1109
      #p = Process(target=mini)
1110
      #p.start()
1111
      mini()
1112
      #cmd.load('out.pdb', 'ref')
1113
      #p.join()
1114
      #print x
1115
      #print '\n'.join(out.split('\n')[1:]) # to remove first line of py3dna /tmp/xxx
1116
      f.close()
1117
      break
1118
    align_all()
1119
    rr()
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable rr does not seem to be defined.
Loading history...
1120
    cmd.set('grid_mode', 1)
1121
1122
1123
def inspect(name, dont_green=False):
1124
    f = tempfile.NamedTemporaryFile(delete=False)
1125
    cmd.save(f.name + '.pdb', name)
1126
    out, err = exe('rna_pdb_tools.py --inspect ' + f.name + '.pdb')
1127
    if not dont_green:
1128
        cmd.color('green', name)
1129
    for l in out.split('\n'):
1130
         hit = re.findall('chain: (?P<chain>\w+).*\# (?P<residue>\d+)', l)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable re does not seem to be defined.
Loading history...
1131
         if hit: # [('X', '1')]
1132
             cmd.color('red', name + ' and chain ' + hit[0][0] + ' and resi ' + hit[0][1])
1133
    print(out)
1134
1135
cmd.extend('inspect', inspect)
1136
    
1137
def ll():
1138
    cmd.do('hide all')
1139
    cmd.do('show lines')
1140
cmd.extend('ll', ll)
1141
print('ll - show lines only')
1142
1143 View Code Duplication
def rpr(selection):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1144
    """rpr"""
1145
    f = tempfile.NamedTemporaryFile(delete=False)
1146
    input = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
1147
    cmd.save(input, selection)
1148
1149
    output = os.path.dirname(f.name) + os.sep +  selection + '_rpr.pdb'
1150
1151
    out, err = exe('rna_pdb_tools.py --rpr ' + input + ' > ' + output)
1152
    cmd.load(output)
1153
    print(out)
1154
cmd.extend('rpr', rpr)
1155
1156 View Code Duplication
def diff(selection, selection2):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1157
    """rpr"""
1158
    f = tempfile.NamedTemporaryFile(delete=False)
1159
    input = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
1160
    cmd.save(input, selection)
1161
    output = os.path.dirname(f.name) + os.sep +  selection2 + '.pdb'
1162
    cmd.save(input, selection)
1163
    cmdline = 'diffpdb.py ' + input + ' ' + output + ' &'
1164
    print(cmdline)
1165
    #os.system(cmdline)
1166
    exe(cmdline)
1167
1168
cmd.extend('diff', diff)
1169
1170
def mini(f):  # min with qrna
1171
    #os.system('/home/magnus/opt/qrnas/QRNA02/QRNA -i ' + f + ' -c /home/magnus/opt/qrnas/QRNA02/configfile.txt -o out.pdb')
1172
    cmd = '~/opt/qrnas/QRNA -i /tmp/' + f + ' -c ~/opt/qrnas/configfile.txt -o out.pdb'
1173
    print(cmd)
1174
    os.system(cmd)
1175
1176
    #cmd.delete('mini')
1177
    cmd.load('out.pdb', 'mini')
1178
    print('end')
1179
1180
1181
def reload():
1182
    """Reload ~/.pymolrc and all included there packages (e.g. with run <foo.py>)"""
1183
    cmd.do('@ ~/.pymolrc')
1184
1185
1186
def rlabel():
1187
    cmd = "n. C1'", '"%s %s" % (resn, resi)'
1188
    print('label ' + cmd)
1189
    cmd.label(cmd)
1190
1191
1192
1193
def sav(name): #sav
1194
    # cmd.bg_color( "white" )
1195
    tf = tempfile.NamedTemporaryFile(delete=False)
1196
    fn = tf.name + '.png'
1197
    tf = tempfile.NamedTemporaryFile(delete=False)
1198
    cfn = tf.name + '.png'
1199
1200
    psefn = '~/Desktop/' + name + '.pse'
1201
    cmd.save(psefn)
1202
1203
    cmd.save(fn)
1204
1205
    cmdline= "/opt/homebrew/bin/convert " + fn + " -gravity center -crop 3:3 +repage " + cfn
1206
    print(cmdline)
1207
    os.system(cmdline)
1208
    cmdline = '/opt/homebrew/bin/fileicon set ' + psefn + ' ' + cfn
1209
    print(cmdline)
1210
    os.system(cmdline)
1211
1212
    #cmd.png(coverfn, 576,576)
1213
    #cmd.ray(576,576)
1214
cmd.extend('sav', sav)
1215
1216
def hide_rna():
1217
    cmd.hide('(polymer.nucleic)')
1218
cmd.extend('rna-hide', hide_rna)
1219
1220
def show_rna():
1221
    cmd.show('(polymer.nucleic)')
1222
cmd.extend('rna-show', show_rna)
1223
1224
def clr():
1225
    cmd.do('delete *')
1226
cmd.extend('clr', clr)
1227
print('clr - delete all')
1228
1229
def bw():
1230
  """clr - make white bg and structure black"""
1231
  cmd.bg_color( "white" )
1232
  color_by_text('color black, all')
1233
cmd.extend('bw', bw)
1234
print('bw - white bg, black all')
1235
1236
def select_rna():
1237
    cmd.select('polymer.nucleic')
1238
cmd.extend('select-rna', select_rna)
1239
1240
def hide_protein():
1241
    cmd.hide('(polymer.protein)')
1242
#cmd.extend('protein-hide', hide_protein)
1243
#cmd.extend('rp-hide', hide_protein)
1244
def select_protein():
1245
    cmd.select('polymer.protein')
1246
cmd.extend('protein-select', select_protein)
1247
1248
def tmp():
1249
    cmd.save('/home/' + user + '/Desktop/' + tmp + '.png')
1250
    cmd.save('/home/' + user + '/Desktop/' + tmp + '.pse')
1251
1252
def tp(): #tp temp pse
1253
    """tp here"""
1254
    import datetime
1255
1256
    # cmd.bg_color( "white" )
1257
    tf = tempfile.NamedTemporaryFile(delete=False)
1258
    fn = tf.name + '.png'
1259
    tf = tempfile.NamedTemporaryFile(delete=False)
1260
    cfn = tf.name + '.png'
1261
1262
    date = datetime.datetime.today().strftime('%Y-%m-%d.%H%M%S')
1263
    psefn = '~/Desktop/' + date + '.pse'
1264
    cmd.save(psefn)
1265
1266
    cmd.save(fn)
1267
1268
    cmdline= "/opt/homebrew/bin/convert " + fn + " -gravity center -crop 3:3 +repage " + cfn
1269
    print(cmdline)
1270
    os.system(cmdline)
1271
    cmdline = '/opt/homebrew/bin/fileicon set ' + psefn + ' ' + cfn
1272
    print(cmdline)
1273
    os.system(cmdline)
1274
1275
cmd.extend('tp', tp)
1276
1277
def sav_tmp():
1278
    from shutil import copyfile
1279
    import datetime
1280
    try:
1281
        TMP_FOLDER + ' '
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable TMP_FOLDER does not seem to be defined.
Loading history...
1282
    except:
1283
        print("Error: Set up TMP_FOLDER in your ~/.pymolrc, e.g. TMP_FOLDER = '/home/magnus/Desktop/PyMOL/'")
1284
        return
1285
1286
    try:
1287
        os.mkdir(TMP_FOLDER)
1288
    except:
1289
        pass
1290
1291
    date = datetime.datetime.today().strftime('%Y-%m-%d.%H%M%S')
1292
    try:
1293
        fn = TMP_FOLDER +  os.sep + id + '_' + date + '.pse'
1294
    except TypeError:
1295
        fn = TMP_FOLDER +  os.sep + '_' + date + '.pse'
1296
    cmd.save(fn)
1297
    print('Save...' + fn)
1298
    cmd.save(fn.replace('.pse', '.png'))
1299
    copyfile(fn, TMP_FOLDER + '/last.pse')
1300
1301
def load_tmp():
1302
    print('Load...')
1303
    cmd.load(TMP_FOLDER + '/last.pse')
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable TMP_FOLDER does not seem to be defined.
Loading history...
1304
1305
1306
def trim():
1307
    cmd.do("remove solvent")
1308
    cmd.do("remove resn NA")
1309
    
1310
cmd.extend('trim', trim)
1311
    
1312
def get_resi():
1313
    """
1314
    PyMOL>get_resi()
1315
    358+376+288+290+359+383+386+382+289+287+384+357+385+360+377+361
1316
    """
1317
    stored.residues = set()
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable stored does not seem to be defined.
Loading history...
1318
    cmd.iterate('(sele)', "stored.residues.add(resi)") # ('289') # residue only
1319
    print('+'.join(stored.residues))#[:-1])
1320
1321
    #cmd.iterate('(sele)', "stored.residues.add((chain, resi))") # ('A', '289')
1322
    #print(r, end='+') # ('A', '289')
1323
    #selection = object + ' and index ' + str(index)
1324
    #cmd.iterate('(sele)', 'l.append([resn, resi])')
1325
    #rint(l)
1326
1327
def findN(r):
1328
    c = 'select br. all within ' + str(r) + ' of (sele)'
1329
    cmd.do(c)
1330
1331
def white():
1332
    cmd.set('dash_color', 'black')
1333
    cmd.set('dash_width', 2)
1334
    cmd.bg_color( "white" )
1335
cmd.extend('w', white)
1336
1337
def desc(t='', width=80):
1338
    print()
1339
    print()
1340
    print()
1341
    print(t.center(int(width)))
1342
    print()
1343
    print()
1344
    print()
1345
1346
def s(): # quick save selected to tmp.pdb
1347
    cmd.do('save tmp.pdb, (sele)')
1348
cmd.extend('s', s)
1349
print('s - quick save selected to tmp.pdb')
1350
1351
def draw():
1352
    #cmd.select("name C1'")
1353
    t = """
1354
1355
1356
    set sphere_scale, 0.4, name C1'
1357
    show sphere, name C1'
1358
    color black, name C1'
1359
1360
    remove name OP2+OP1+O5'+P+C5'+O2'+O3'+C4'+C3'+C2'+O4'
1361
1362
    h_add
1363
1364
    select (bound_to name C1') and name H*
1365
    remove (sele)
1366
1367
    set spec_reflect, 0
1368
    # https://pymolwiki.org/index.php/Spec_reflect
1369
1370
    #set sphere_transparency, 0
1371
    #color blue, donors;
1372
    #color green, acceptors;
1373
    #show sphere, donors;
1374
    #show sphere, acceptors;
1375
1376
    color gray,  name H*; # color atoms from white to gray
1377
1378
1379
set dash_color, black
1380
set dash_width, 1; set dash_gap,  0.2
1381
bg white;
1382
#color black;
1383
"""
1384
    cmd_text(t)
1385
1386
cmd.extend('draw', draw)
1387
cmd.extend('dr', draw)
1388
1389
def se(): # save
1390
    cmd.do('save tmp.pdb, (enabled)')
1391
cmd.extend('se', se)
1392
print('se - quick save enabled to tmp.pdb')
1393
      
1394
1395
def axes_big():
1396
    """
1397
    https://pymolwiki.org/index.php/Axes
1398
    """
1399
    cmd.delete('axes')
1400
1401
    # create the axes object, draw axes with cylinders coloured red, green,
1402
    #blue for X, Y and Z
1403
1404
    obj = [
1405
       CYLINDER, 0., 0., 0., 10., 0., 0., 0.2, 1.0, 1.0, 1.0, 1.0, 0.0, 0.,
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable CYLINDER does not seem to be defined.
Loading history...
1406
       CYLINDER, 0., 0., 0., 0., 10., 0., 0.2, 1.0, 1.0, 1.0, 0., 1.0, 0.,
1407
       CYLINDER, 0., 0., 0., 0., 0., 10., 0.2, 1.0, 1.0, 1.0, 0., 0.0, 1.0,
1408
       ]
1409
1410
    # add labels to axes object (requires pymol version 0.8 or greater, I
1411
    # believe
1412
1413
    cyl_text(obj,plain,[-5.,-5.,-1],'Origin',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable cyl_text does not seem to be defined.
Loading history...
1414
    cyl_text(obj,plain,[10.,0.,0.],'X',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
1415
    cyl_text(obj,plain,[0.,10.,0.],'Y',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
1416
    cyl_text(obj,plain,[0.,0.,10.],'Z',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
1417
1418
    # then we load it into PyMOL
1419
    cmd.load_cgo(obj,'axes')
1420
1421
def axes(gradient=False):
1422
    """
1423
    https://pymolwiki.org/index.php/Axes
1424
    """
1425
    cmd.delete('axes')
1426
1427
    # create the axes object, draw axes with cylinders coloured red, green,
1428
    #blue for X, Y and Z
1429
1430
    l = 1
1431
    width = 0.01 #  0.2
1432
    if gradient: # with gradient
1433
        obj = [
1434
           CYLINDER, 0., 0., 0., l, 0., 0., width, 1.0, 1.0, 1.0, 1.0, 0.0, 0.,
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable CYLINDER does not seem to be defined.
Loading history...
1435
           CYLINDER, 0., 0., 0., 0., l, 0., width, 1.0, 1.0, 1.0, 0., 1.0, 0.,
1436
           CYLINDER, 0., 0., 0., 0., 0., l, width, 1.0, 1.0, 1.0, 0., 0.0, 1.0,
1437
           ]
1438
    else:
1439
        obj = [
1440
           CYLINDER, 0., 0., 0., l, 0., 0., width, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
1441
           CYLINDER, 0., 0., 0., 0., l, 0., width, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
1442
           CYLINDER, 0., 0., 0., 0., 0., l, width, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,
1443
           ]
1444
        
1445
    # add labels to axes object (requires pymol version 0.8 or greater, I
1446
    # believe
1447
    l
1448
    #cyl_text(obj,plain,[-5.,-5.,-1],'Origin',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
1449
    width = 0.005 # 0.20
1450
    size = 0.05
1451
    cyl_text(obj,plain,[l,0.,0.],'X',width,axes=[[size,0,0],[0,size,0],[0,0,size]])
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable cyl_text does not seem to be defined.
Loading history...
1452
    cyl_text(obj,plain,[0.,l,0.],'Y',width,axes=[[size,0,0],[0,size,0],[0,0,size]])
1453
    cyl_text(obj,plain,[0.,0.,l],'Z',width,axes=[[size,0,0],[0,size,0],[0,0,size]])
1454
1455
    # then we load it into PyMOL
1456
    cmd.load_cgo(obj,'axes')
1457
1458
1459
cmd.extend('axes', axes)
1460
1461
1462
def axes2(length=0.75):
1463
    """Draw XYZ, no lables here, see axes()
1464
    https://pymolwiki.org/index.php/Axes
1465
1466
    Args:
1467
        lenght: length of axes
1468
    """
1469
    cmd.delete('axes')
1470
    print('Draw axis red, green blue for X, Y and Z')
1471
    w = 0.06 # cylinder width 
1472
    l = float(length) # cylinder length
1473
    h = 0.25 # cone hight
1474
    d = w * 1.618 # cone base diameter
1475
1476
    obj = [CYLINDER, 0.0, 0.0, 0.0,   l, 0.0, 0.0, w, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable CYLINDER does not seem to be defined.
Loading history...
1477
           CYLINDER, 0.0, 0.0, 0.0, 0.0,   l, 0.0, w, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
1478
           CYLINDER, 0.0, 0.0, 0.0, 0.0, 0.0,   l, w, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,
1479
           CONE,   l, 0.0, 0.0, h+l, 0.0, 0.0, d, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable CONE does not seem to be defined.
Loading history...
1480
           CONE, 0.0,   l, 0.0, 0.0, h+l, 0.0, d, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 
1481
           CONE, 0.0, 0.0,   l, 0.0, 0.0, h+l, d, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0]
1482
1483
    cmd.load_cgo(obj, 'axes')
1484
cmd.extend('axes2', axes2)
1485
1486
def v(x, y, z, name='v'):
1487
    cmd.delete(name)
1488
    w = 0.01 # cylinder width
1489
    length=0.75
1490
    l = float(length) # cylinder length
1491
    h = 0.25 # cone hight
1492
    d = w * 1.618 # cone base diameter
1493
    r1,g1,b1 = 1,1,1
1494
    r2,g2,b2 = r1,g1,b1
1495
    obj = [CYLINDER, 0.0, 0.0, 0.0,   x, y, z, w, r1, g1, b1, r2, g2, b2]
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable CYLINDER does not seem to be defined.
Loading history...
1496
    width = 0.005 # 0.20
1497
    size = 0.2
1498
    cyl_text(obj,plain,[x,y,z],name,width,axes=[[size,0,0],[0,size,0],[0,0,size]])
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable cyl_text does not seem to be defined.
Loading history...
1499
    cmd.load_cgo(obj, name)
1500
1501
cmd.extend('v', v)
1502
1503
def ha():
1504
    """
1505
        cmd.do('h_add')
1506
    """
1507
    cmd.do('h_add')
1508
cmd.extend('ha', ha)
1509
    
1510
def hb(): # hydrogen bonds
1511
    cmd.do('contacts *,*')
1512
cmd.extend('hb', hb)
1513
1514
1515
def pn(): # pn
1516
    cmd_text('save ~/Desktop/tmp.png')
1517
cmd.extend('pn', pn) # pn
1518
def quickref():
1519
    print('   PyMOL4RNA (rna-tools)  ')
1520
    print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
1521
    print('Quickref `qr`: ')
1522
    print('  alter (sele), chain="B" ')
1523
    print('  alter (sele), resv -= 4')
1524
    print('  alter (chain B), resv -= 44 ')
1525
    print("  select br. all within 15 of (sele)")
1526
    print("  select br. all within 15 of resi 574")
1527
    print("  select br. all within 15 of resi 377 # O. ihheyensis")
1528
    print('  select br. all within 15 of U6_snRNA and resi 80')
1529
    print('  set dash_color, red; set dash_width, 4')
1530
    print('  p - prepare seq for printing')
1531
    print('  rp - rna present, object names only click to get compact legend')
1532
    print('  rp17')
1533
    print('  rna_cartoon')
1534
    print('  rs')
1535
    print('  rcomp')
1536
    print('  color_obj')
1537
    print('  color_rbw')
1538
    print('  aa')
1539
    print('  findN')
1540
    print('  savt - save_transformed <object>, <file>')
1541
    print(' select br. all within 20 of (sele) #within with aa')
1542
    #print('  spl - color snRNAs of the spliceosome:'
1543
    #    green: U2,  blue: U5, red:U6, orange:U2""")
1544
    print('\_ RNA_TOOLS_PATH env variable used: ' + RNA_TOOLS_PATH)
1545
1546
from rna_tools.tools.PyMOL4RNA.libs.show_contacts import show_contacts
1547
from rna_tools.tools.PyMOL4RNA.libs.get_raw_distances import get_raw_distances
1548
1549
1550
try:
1551
    from pymol import cmd
1552
    # axes.py
1553
    from pymol.cgo import *
1554
    from pymol.vfont import plain
1555
except ImportError:
1556
    print("PyMOL Python lib is missing")
1557
    # sys.exit(0)
1558
1559
try:
1560
    import imp
1561
    from rna_tools.rna_tools_lib import RNAStructure
1562
    from rna_tools.tools.PyMOL4RNA import code_for_spl
1563
    imp.reload(code_for_spl)
1564
    print('code_for_spl loaded...')
1565
    from rna_tools.tools.PyMOL4RNA import code_for_color_spl
1566
    imp.reload(code_for_color_spl)
1567
    print('code_for_color_spl loaded...')
1568
    import rna_tools
1569
    RNA_TOOLS_PATH = rna_tools.rna_tools_lib.get_rna_tools_path()
1570
    sys.path.insert(0, RNA_TOOLS_PATH) # '/Users/magnus/work/src/rna-tools/rna_tools/tools/PyMOL4RNA')#
1571
    #(os.path.abspath(os.path.dirname(__file__))))
1572
    from rna_tools.tools.PyMOL4RNA import PyMOL4Spliceosome
1573
    imp.reload(PyMOL4Spliceosome)
1574
except ImportError:
1575
    print("rna_tools lib is missing")
1576
    RNA_TOOLS_PATH = ''
1577
    
1578
try:
1579
    RNA_TOOLS_PATH
1580
    EXECUTABLE
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable EXECUTABLE does not seem to be defined.
Loading history...
1581
except NameError:
1582
    EXECUTABLE="/bin/zsh"
1583
    SOURCE=""
1584
1585
try:
1586
    cmd.set('cartoon_gap_cutoff', 0)
1587
except:
1588
    pass
1589
1590
1591
print(__doc__)
1592
try:
1593
    from pymol import cmd
1594
except ImportError:
1595
    print("PyMOL Python lib is missing")
1596
else:
1597
    #quickref()
1598
    #cmd.set_key('CTRL-S', cmd.save, ['/home/magnus/Desktop/tmp.pse'])
1599
    cmd.set_key('CTRL-S', sav_tmp)
1600
    cmd.set_key('CTRL-Z', load_tmp)  # ostatni wrzucam tutaj
1601
    #cmd.load, ['/home/magnus/Desktop/tmp.pse'])
1602
    # main code #
1603
1604
    cmd.extend('quickref', quickref)
1605
    cmd.extend('qr', quickref)
1606
1607
    cmd.extend('rp', rp)
1608
    cmd.extend('p', p)
1609
    cmd.extend('pdb', pdb)
1610
    cmd.extend('seq', seq)
1611
    cmd.extend('seqsel', seqsel)
1612
    cmd.extend('rseq', seq)
1613
    cmd.extend('rna_cartoon', rna_cartoon)
1614
    cmd.extend('rs', rs)
1615
    cmd.extend('ino', ino)
1616
    cmd.extend('rcomp', rcomp)
1617
    cmd.extend('color_obj', color_obj)
1618
    cmd.extend('color_rbw', color_rbw)
1619
    cmd.extend('aa', align_all)
1620
    cmd.extend('ss', ss)
1621
    cmd.extend('ss_all', ss_all)
1622
    cmd.extend('clarna', clarna)
1623
    cmd.extend('x3dna', x3dna)
1624
    cmd.extend("rgyration", rgyration)
1625
    cmd.extend('rlabel', 'rlabel')
1626
1627
    cmd.extend('reload', reload)
1628
    cmd.extend('rl', reload)
1629
1630
    cmd.extend('color_aa_types', color_aa_types)
1631
1632
    cmd.extend('names', names)
1633
1634
    cmd.extend('findX', findN)
1635
1636
    # set dash lines #hbonds #hydrogen
1637
    cmd.set('dash_color', 'white')
1638
    cmd.set('dash_width', 2)
1639
    cmd.set('cartoon_tube_radius', 0.5)
1640
    
1641
    cmd.extend('save_transformed', save_transformed)
1642
    cmd.extend('savt', save_transformed)
1643
    cmd.extend('show_all_at_once', show_all_at_once)
1644
1645
    cmd.set('ignore_case', 'off')
1646
    #cmd.set('cartoon_ring_mode', '3')
1647
    #cmd.set('cartoon_ring_finder', '2')
1648
    #cmd.extend('spl_select', spl_select)
1649
    #    print('ignore_case made off')
1650
    print('\_ PYMOL4RNA loading .... [ok]')
1651
1652
    cmd.extend('desc', desc)
1653
    #cmd.do('set overlay, 1')
1654
1655
    #### change do desktop
1656
    user = getpass.getuser()
1657
    cw = os.path.abspath(os.getcwd())
1658
    print(cw)
1659
    if cw == '/Users/magnus':
1660
        print('change to Desktop')
1661
        os.chdir('/Users/magnus/Desktop/')
1662
    cw = os.path.abspath(os.getcwd())
1663
    print(cw)
1664