color_obj()   B
last analyzed

Complexity

Conditions 5

Size

Total Lines 57
Code Lines 24

Duplication

Lines 57
Ratio 100 %

Importance

Changes 0
Metric Value
cc 5
eloc 24
nop 1
dl 57
loc 57
rs 8.8373
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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_atoms(cycles = 5, filename="_rmsd_.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
    ref = molecules.pop(0)
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
    atoms = "O4'+C1'+C4'+C3'"
330
    atoms = "P+O5'+C5'" #OP1'
331
    ref = r"/" + ref + "////" + atoms 
332
    for molecule in molecules:
333
        molecule = r"/" + molecule + "////" + atoms
334
        values = cmd.align(molecule, ref, cycles=cycles)
335
        l = ([ref[:20].ljust(20), molecule[:20].ljust(20), str(round(values[0], 2)).ljust(4),
336
            str(round(values[1], 2)).ljust(4),
337
            str(round(values[2], 2)).ljust(4),
338
            str(round(values[3], 2)).ljust(4),
339
            str(round(values[4], 2)).ljust(4),
340
            str(round(values[5])).ljust(4),
341
            str(round(values[6], 2)).ljust(4)])
342
        print(' '.join(l))
343
        txt += ','.join([x.strip() for x in l]) + '\n'
344
        report.append([ref, molecule, values[3], values[6]])
345
    with open(filename, 'w') as f:
346
        f.write(txt)
347
348
cmd.extend('aaa', align_all_atoms)
349
350
def load(f):
351
    from glob import glob
352
    lst = glob(f)
353
    lst.sort()
354
    for fil in lst:
355
        cmd.load(fil)
356
cmd.extend('load', load)
357
358
359
def rmsdx(cycles = 5, matrix_fn = 'matrix.txt'):
360
    """
361
    Args:
362
363
    cycles (int): refinement cycles of PyMOL align, default: 5
364
    matrix_fn (string): a file to save the matrix
365
                        matrix is pretty much saved in space-separated values 
366
                        so you can load it to pandas with
367
368
                        df = pd.read_csv('matrix.txt', sep=' ', index_col=False)
369
                        df = df.set_index(df.columns)
370
                        print(df)
371
                                      Bact_7DCO_S  Bact_5gm6_S
372
                        Bact_7DCO_S         0.000        0.562
373
374
    Returns:
375
376
    string: matrix 
377
            and matrix_fn file ;-)
378
379
    """
380
    models = cmd.get_names_of_type("object:molecule")
381
    print(' # of models:', len(models))
382
    
383
    f = open(matrix_fn, 'w')
384
    #t = '# ' # for numpy
385
    t = ''  # for pandas
386
    for r1 in models:
387
        # print r1,
388
        t += str(r1) + ' '  # here ' ' could be changed to , or \t
389
    t = t.strip() + '\n'
390
391
    c = 1
392
    for r1 in models:
393
        for r2 in models:
394
            if r1 == r2:
395
                rmsd = 0
396
            else:
397
                print(r1, r2)
398
                values = cmd.align(r1, r2, cycles=cycles)
399
                # RaR [1]       RbR [3]
400
                # RaR  #AA  CoR               RbR  #AbR RS   AR'
401
                # (0.668652355670929, 241, 5, 1.1646124124526978, 293, 199.0, 38)
402
                rmsd = round(values[0], 3)
403
            t += str(rmsd) + ' '
404
        #print('...', c, r1)
405
        c += 1
406
        t += '\n'
407
408
    f.write(t)
409
    f.close()
410
411
    print(t.strip())  # matrix
412
    return t
413
414
cmd.extend('rmsdx', rmsdx)
415
416
def save_all(dir=''):
417
    """save_all molecule objects as pdb files. Use `cd` to get to the right folder
418
       or use dir argument"""
419
    if dir:
420
        dir += '/'
421
    molecules = cmd.get_names_of_type("object:molecule")
422
    for molecule in molecules:
423
        print('Saving %s ...' % molecule)
424
        cmd.save(dir + molecule + '.pdb', molecule)
425
426
cmd.extend('save_all', save_all)
427
428
def ls(name='', width=80):
429
    molecules = cmd.get_names_of_type("object:molecule")
430
    for i in range(10):
431
            print()
432
    t = ''
433
    if name:
434
        t = name + ': '
435
    for molecule in molecules:
436
        t += '%s' % molecule + ' | '
437
    print(t[:-2].center(int(width))) # remove ending |
438
    print()
439
cmd.extend('ls', ls)
440
    
441
442
def save_each_object(folder='', prefix=''):
443
    """
444
445
    Usage::
446
447
        save_each_object /Users/magnus/work/spliceosome/PyMOL4Spliceosome/chains/yB_5zwo, yB_5zwo_
448
449
        p = 'yP_6exn' # yP_5ylz' #yI_5y88' # yE_6n7r'
450
        pth = '/Users/magnus/work/spliceosome/PyMOL4Spliceosome/chains/'
451
        save_each_object(pth + p, p + '_')
452
453
    See the application here <https://github.com/mmagnus/PyMOL4Spliceosome/releases/tag/v0.32>
454
455
    .. todo:: add some way to select which objects to use
456
    """
457
    obj_list = cmd.get_names('objects')
458
    for o in obj_list:
459
        if folder:
460
            folder += '/'
461
        fn = folder + prefix.strip() + o.strip() + '.pdb'
462
        cmd.save(fn, o)
463
464
cmd.extend('save_each_object', save_each_object)
465
466
def rcomp():
467
    """RNA like in papers ;-)
468
469
    Similar to rc() but this time it colors each (and every) structure in different colour.
470
    Great on viewing-comparing superimposed structures.
471
472
    """
473
    cmd.hide("sticks", "all")
474
    cmd.hide("lines", "all")
475
    cmd.show("cartoon", "all")
476
    cmd.set("cartoon_ring_mode", 3)
477
    cmd.set("cartoon_ring_finder", 2)
478
    cmd.set("cartoon_ladder_mode", 2)
479
    cmd.set("cartoon_ring_transparency", 0.30)
480
481
    obj_list = cmd.get_names('objects')
482
483
    colours = ['red', 'green', 'blue', 'yellow', 'violet', 'cyan',    \
484
           'salmon', 'lime', 'pink', 'slate', 'magenta', 'orange', 'marine', \
485
           'olive', 'purple', 'teal', 'forest', 'firebrick', 'chocolate',    \
486
           'wheat', 'white', 'grey' ]
487
    ncolours = len(colours)
488
489
           # Loop over objects
490
    i = 0
491
    for obj in obj_list:
492
        print("  ", obj, colours[i])
493
        cmd.color(colours[i], obj)
494
        i = i+1
495
        if(i == ncolours):
496
           i = 0
497
498
499
def colmol():  # donors accepters
500
    t = """
501
h_add,
502
bg gray,
503
color white,
504
color black, elem C
505
color blue , elem N
506
color red, elem O
507
color violet, elem P
508
    """
509
    cmd.do(t)
510
cmd.extend('colmol', colmol)
511
512
def da():  # donors accepters
513
    t = """
514
    h_add;
515
     set sphere_scale, 0.3, (all)
516
     set sphere_transparency, 0
517
     color blue, donors;
518
     color green, acceptors;
519
     show sphere, donors;
520
     show sphere, acceptors;
521
     color gray,  name H*; # color atoms from white to gray
522
    """
523
    cmd.do(t)
524
525
cmd.extend('da', da)
526
527
def da():  # donors accepters
528
    t = """
529
    h_add;
530
    #color blue, donors;
531
    #color green, acceptors;
532
    set sphere_scale, 0.3, (donors)
533
    set sphere_transparency, 0
534
    show sphere, donors;
535
    set sphere_scale, 0.2, (acceptors)
536
    set sphere_transparency, 0
537
    set dot_width, 0.3, (donors)
538
    show dots, acceptors;
539
    color gray,  name H*; # color atoms from white to gray
540
    """
541
    cmd.do(t)
542
#cmd.extend('da', da)
543
544
def pdb(sele = ''):
545
    """Get PDB content of selection.
546
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/pdb.png"""
547
    f = tempfile.NamedTemporaryFile(delete=False) # True)
548
    f = f.name + '.pdb'
549
    #tmpfn = '/tmp/pymol_get_pdb.pdb'
550
    if sele:
551
        cmd.save(f, '(' + sele + ')')
552
    else:
553
        cmd.save(f, '(sele)')
554
    for l in open(f):
555
        if l.strip() not in ['TER', 'END']:
556
            print(l.strip())
557
    #s = RNAStructure(tmpfn)
558
    #for l in s.lines:
559
    #    print(l)
560
561
562
def x3dna():
563
    f = tempfile.NamedTemporaryFile(delete=False) # True)
564
    #cmd.save(f.name + '.pdb', '(backbone_)')
565
    cmd.save(f.name + '.pdb', '(sele)')
566
    out, err = exe("rna_x3dna.py --show-log " + f.name + ".pdb ")
567
    print('\n'.join(out.split('\n')[1:]))  # to remove first line of py3dna /tmp/xxx
568
    if err:
569
        print(err)
570
    f.close()
571
572
573
def clarna2():
574
    """Get contacts classification of the selected fragment based on ClaRNA (for each object).
575
576
    .. image:: ../../rna_tools/tools/PyMOL4RNA/doc/clarna.png
577
    """
578
    objs = cmd.get_names("objects")
579
    for name in objs[:]:
580
        print(name + ' ' + '-' * (70 - len(name)))
581
        f = tempfile.NamedTemporaryFile(delete=False) # True)
582
        #cmd.save(f.name + '.pdb', '(backbone_)')
583
        cmd.save(f.name + '.pdb', '(sele) and "' + name + '"')
584
        CLARNA_RUN = BIN + 'rna_clarna_run.py'
585
        #cmdline = #SOURCE + " && " +
586
        cmdline = CLARNA_RUN + " -ipdb " + f.name + '.pdb -bp+stack'
587
        print(cmdline)
588
        out, err = exe(cmdline)
589
        print('\n'.join(out.split('\n')[1:]))  # to remove first line of py3dna /tmp/xxx
590
        if err:
591
            print(err)
592
        f.close()
593
594
595
def clarna(selection, folder:str='', sele_as_name=False):# fn:str=''):
596
    """Get contacts classification of the selected fragment based on ClaRNA (for each object).
597
598
    Args:
599
600
      folder (str): The path to save temporary files, by default they are save to system tmp
601
602
      # replace resi? or keep resi there?
603
604
    Example::
605
606
        PyMOL>clarna sele
607
        rna_clarna_run.py -ipdb /var/folders/yc/ssr9692s5fzf7k165grnhpk80000gp/T/tmp1h_bwvtx.pdb -bp+stack
608
        chains:  X 15 16
609
        X   15   X   16          bp A A                      ><   0.9427
610
611
    .. image:: ../../rna_tools/tools/PyMOL4RNA/doc/clarna.png
612
    """
613
    # save the file
614
    f = tempfile.NamedTemporaryFile(delete=False) # True)
615
    if not folder:
616
        output = f.name + '_clarna.pdb'
617
    else:
618
        output= folder + os.sep + os.path.basename(f.name) + '_clarna.pdb'
619
    cmd.save(output, selection)
620
    # run cmd    
621
    CLARNA_RUN = 'rna_clarna_run.py'
622
    cmdline = CLARNA_RUN + " -ipdb " + output + ' -bp+stack'
623
    out, err = exe(cmdline)
624
    # get the output
625
    print('\n'.join(out.split('\n')[1:]))  # to remove first line of py3dna /tmp/xxx
626
    if err:
627
        print(err)
628
    # load a (sele) pdb file 
629
    cmd.load(output)
630
    f.close()
631
    
632
cmd.extend('clarna', clarna)  # export the function for pymol
633
634
def seq(selection):
635
    """Get sequence of the selected fragment using ``rna_pdb_tools.py --get_seq ``.
636
637
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/ss.png
638
    """
639
    if selection.strip() == "*":
640
        AllObj = cmd.get_names("all")
641
        # print AllObj
642
        for name in AllObj[:]:
643
            if not name.startswith('_align'):
644
                f = tempfile.NamedTemporaryFile(delete=False) # True)
645
                f.name = f.name + '.pdb'
646
                cmd.save(f.name, name)
647
                cmdline = 'rna_pdb_tools.py --color-seq --get-seq ' + f.name
648
                out, err = exe(cmdline)
649
                if out:
650
                    print('> ' + name)
651
                    print('\n'.join(out.split('\n')[2:]))  # to remove first line of py3dna /tmp/xxx
652
                    # hide this line: is >tmpGCszi7 nts=4 [tmpGCszi7] -- secondary structure derived by DSSR
653
                if err:
654
                    # print(err)
655
                    pass
656
                f.close()
657
    else:
658
        f = tempfile.NamedTemporaryFile(delete=False)
659
        selection = strip_selection_name(selection)
660
        input = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
661
        cmd.save(input, selection)
662
        cmdline = 'rna_pdb_tools.py  --color-seq --get-seq ' + input
663
        # print(cmdline)
664
        out, err = exe(cmdline)
665
        print(out)
666
        if err:
667
            print(err)
668
        f.close()
669
670
def seqsel():
671
    """Get sequence of the selected fragment using ``rna_pdb_tools.py --get_seq ``.
672
    """
673
    f = tempfile.NamedTemporaryFile(delete=False)
674
    selection = '(sele)'
675
    input = os.path.dirname(f.name) + os.sep +  '_sele.pdb'
676
    cmd.save(input, selection)
677
678
    cmdline = 'rna_pdb_tools.py --get-seq ' + input
679
    print(cmdline)
680
    out, err = exe(cmdline)
681
    print(out)
682
    if err:
683
        print(err)
684
    f.close()
685
686
687
def ss(selection):
688
    """Get Secondary Structure of (sele) based on py3dna.py.
689
690
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/ss.png
691
    """
692
    f = tempfile.NamedTemporaryFile(delete=False)
693
    output = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
694
    cmd.save(output, '(sele)')
695
696
    cmdline = 'rna_x3dna.py ' + output
697
    out, err = exe(cmdline)
698
    print('\n'.join(out.split('\n')[2:]))  # to remove first line of py3dna /tmp/xxx
699
    if err:
700
        print(err)
701
    f.close()
702
703
704
705
def rtrun(cmd, selection, suffix):
706
    f = tempfile.NamedTemporaryFile(delete=False) # True)
707
    output = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
708
    output2 = os.path.dirname(f.name) + os.sep + selection + '_mut.pdb'
709
    exe(cmdline)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable cmdline does not seem to be defined.
Loading history...
710
    print(cmdline)
711
    cmd.save(output, selection)
712
713
    # 'A:1A+2A+3A+4A' 
714
715
def mutate(mutation, selection):
716
    """
717
    """
718
    f = tempfile.NamedTemporaryFile(delete=False) # True)
719
    output = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
720
    output2 = os.path.dirname(f.name) + os.sep + selection + '_mut.pdb'
721
    cmdline = "rna_pdb_tools.py --mutate " + mutation + ' ' + output + ' > ' + output2
722
    print(cmdline)
723
    exe(cmdline)
724
    cmd.load(output2)
725
726
cmd.extend('mutate', mutate)
727
728
729
def ss_all():
730
    """The same as ss() but for all objects."""
731
    subset = "*"
732
    AllObj = cmd.get_names("all")
733
    # print AllObj
734
    for name in AllObj[:]:
735
        if not name.startswith('_align'):
736
            print('> ' + name)
737
            f = tempfile.NamedTemporaryFile(delete=False) # True)
738
            cmd.save(f.name, name)
739
            out, err = exe(RNA_TOOLS_PATH + '/bin/rna_x3dna.py ' + f.name)
740
            print('\n'.join(out.split('\n')[2:]))  # to remove first line of py3dna /tmp/xxx
741
            # hide this line: is >tmpGCszi7 nts=4 [tmpGCszi7] -- secondary structure derived by DSSR
742
            if err:
743
                print(err)
744
            f.close()
745
    print('-- secondary structure derived by DSSR')
746
747
748
def p():
749
    """A shortcut for putting a seq at the bottom. Pretty cool for screenshots with names of objects.
750
751
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/p.png
752
    """
753
    cmd.set("seq_view_format", 4)
754
    cmd.set("seq_view", 1)
755
    cmd.set("seq_view_location", 1)
756
    cmd.set("seq_view_overlay", 1)
757
758
759
def rna_cartoon():
760
    """http://www-cryst.bioc.cam.ac.uk/members/zbyszek/figures_pymol
761
762
    .. image:: ../pngs/rna_cartoon.png
763
    """
764
    cmd.set("cartoon_ring_mode", 3)
765
    cmd.set("cartoon_ring_finder", 1)
766
    cmd.set("cartoon_ladder_mode", 1)
767
    cmd.set("cartoon_nucleic_acid_mode", 4)
768
    cmd.set("cartoon_ring_transparency", 0.5)
769
770
771
def color_aa_types():
772
    """Color aminoacides types like in Cider (http://pappulab.wustl.edu/CIDER/)"""
773
    txt = """
774
color gray70, resn Ala+Ile+Leu+Met+Phe+Trp+Val #hydrophobic
775
color yellow, resn Tyr+Trp #aromatic
776
color blue, resn Arg+Lys+His # positive
777
color forest, resn GLN+SER+GLY+thr
778
color pink, resn PRO # pro
779
color red, resn GLU+asp # """
780
    print("""color (according to) amino-acids types)
781
hydrohobic (gray)  Ala+Ile+Leu+Met+Phe+Trp+Val
782
aromatic (yellow) Tyr+Trp
783
positive (blue)  Arg+Lys+His
784
polar (forest) Gln+Ser+Glu+Thr
785
negative (red) Glu+Asp
786
prolina ;) (pink) Pro""")
787
    color_by_text(txt)
788
789
790 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...
791
792
        """
793
        stolen from :)
794
AUTHOR
795
        Gareth Stockwell
796
797
USAGE
798
        color_obj(rainbow=0)
799
800
        This function colours each object currently in the PyMOL heirarchy
801
        with a different colour.  Colours used are either the 22 named
802
        colours used by PyMOL (in which case the 23rd object, if it exists,
803
        gets the same colour as the first), or are the colours of the rainbow
804
805
        """
806
807
        # Process arguments
808
        rainbow = int(rainbow)
809
810
        # Get names of all PyMOL objects
811
        obj_list = cmd.get_names('objects')
812
813
        if rainbow:
814
815
           print("\nColouring objects as rainbow\n")
816
817
           nobj = len(obj_list)
818
819
           # Create colours starting at blue(240) to red(0), using intervals
820
           # of 240/(nobj-1)
821
           for j in range(nobj):
822
              hsv = (240-j*240/(nobj-1), 1, 1)
823
              # Convert to RGB
824
              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...
825
              # Define the new colour
826
              cmd.set_color("col" + str(j), rgb)
827
              print(obj_list[j], rgb)
828
              # Colour the object
829
              cmd.color("col" + str(j), obj_list[j])
830
831
        else:
832
           # List of available colours
833
           colours = ['red', 'green', 'blue', 'yellow', 'violet', 'cyan',    \
834
           'salmon', 'lime', 'pink', 'slate', 'magenta', 'orange', 'marine', \
835
           'olive', 'purple', 'teal', 'forest', 'firebrick', 'chocolate',    \
836
           'wheat', 'white', 'grey' ]
837
           ncolours = len(colours)
838
839
           # Loop over objects
840
           i = 0
841
           for obj in obj_list:
842
              print("  ", obj, colours[i])
843
              cmd.color(colours[i], obj)
844
              i = i+1
845
              if(i == ncolours):
846
                 i = 0
847
848
849
def names():
850
    # Get names of all PyMOL objects
851
    obj_list = cmd.get_names('objects')
852
    for o in obj_list:
853
        print(o)
854
855
856 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...
857
        """
858
        similar to color_obj() but this time colors every obect as rainbow
859
        """
860
        rainbow = int(rainbow)
861
862
        # Get names of all PyMOL objects
863
        obj_list = cmd.get_names('objects')
864
865
        if rainbow:
866
867
           print("\nColouring objects as rainbow\n")
868
869
           nobj = len(obj_list)
870
871
           # Create colours starting at blue(240) to red(0), using intervals
872
           # of 240/(nobj-1)
873
           for j in range(nobj):
874
              hsv = (240-j*240/(nobj-1), 1, 1)
875
              # Convert to RGB
876
              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...
877
              # Define the new colour
878
              cmd.set_color("col" + str(j), rgb)
879
              print(obj_list[j], rgb)
880
              # Colour the object
881
              cmd.color("col" + str(j), obj_list[j])
882
        else:
883
           colours = ['rainbow']
884
           ncolours = len(colours)
885
886
           # Loop over objects
887
           i = 0
888
           for obj in obj_list:
889
              print("  ", obj, colours[i])
890
              cmd.spectrum('count', colours[i], obj)
891
#              cmd.color(colours[i], obj)
892
              i = i+1
893
              if(i == ncolours):
894
                 i = 0
895
896
897
def strip_selection_name(selection_name):
898
    """Quick function: (sele) -> sele"""
899
    return selection_name.replace('(', '').replace(')', '')
900
901
902 View Code Duplication
def edges(selection):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
903
    """Save selection into a file in a temp folder and run rna_draw_edges.py on it and load it into this session"""
904
    my_view = cmd.get_view()
905
    f = tempfile.TemporaryDirectory()
906
    tmpf = f.name + os.sep + strip_selection_name(selection) + '.pdb'
907
    outf = f.name + '/output.py'
908
    cmd.save(tmpf, selection)
909
    cmdline = '/Users/magnus/miniconda3/bin/rna_draw_edges.py --name %s %s > %s' % (strip_selection_name(selection), tmpf, outf)
910
    print(cmdline)
911
    out, err = exe(cmdline)
912
    if err:
913
        print(err)
914
    cmd.load(outf)
915
    cmd.set_view(my_view)
916
917
cmd.extend('edges', edges)
918
919 View Code Duplication
def fr(selection):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
920
    """Save selection into a file in a temp folder and run rna_draw_edges.py on it and load it into this session"""
921
    my_view = cmd.get_view()
922
    f = tempfile.TemporaryDirectory()
923
    tmpf = f.name + os.sep + strip_selection_name(selection) + '.pdb'
924
    outf = f.name + '/output.py'
925
    cmd.save(tmpf, selection)
926
    path = "/Users/magnus/work/src/rna-tools/rna_tools/tools/PyMOL4RNA/"
927
    cmdline = path + 'rna_draw_frames.py --name %s %s > %s' % (strip_selection_name(selection), tmpf, outf)
928
    print(cmdline)
929
    out, err = exe(cmdline)
930
    if err:
931
        print(err)
932
    cmd.load(outf)
933
    cmd.set_view(my_view)
934
935
cmd.extend('fr', fr)
936
937
938
def ino():
939
    """Sphare and yellow inorganic, such us Mg.
940
941
    .. image:: ../../rna_tools/utils/PyMOL4RNA/doc/ion.png"""
942
    cmd.show("spheres", "inorganic")
943
    cmd.set('sphere_scale', '0.25', '(all)')
944
    #cmd.set('sphere_scale', '1', '(all)')
945
    cmd.color("yellow", "inorganic")
946
947
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']]
948
949
950 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...
951
    '''
952
953
[PyMOL] RES: radius of gyration
954
From: Tsjerk Wassenaar <tsjerkw@gm...> - 2011-03-31 14:07:03
955
https://sourceforge.net/p/pymol/mailman/message/27288491/
956
DESCRIPTION
957
958
    Calculate radius of gyration
959
960
USAGE
961
962
    rgyrate [ selection ]
963
 :::warning:::
964
 if nothing is selected  function is calculating radius of gyration for all pdbs in current Pymol session
965
    '''
966
    try:
967
        from itertools import izip
968
    except ImportError:
969
        izip = zip
970
    quiet = int(quiet)
971
    model = cmd.get_model(selection).atom
972
    x = [i.coord for i in model]
973
    mass = [i.get_mass() for i in model]
974
    xm = [(m*i,m*j,m*k) for (i,j,k),m in izip(x,mass)]
975
    tmass = sum(mass)
976
    rr = sum(mi*i+mj*j+mk*k for (i,j,k),(mi,mj,mk) in izip(x,xm))
977
    mm = sum((sum(i)/tmass)**2 for i in izip(*xm))
978
    rg = math.sqrt(rr/tmass - mm)
979
    if not quiet:
980
        print("Radius of gyration: %.2f" % (rg))
981
    return rg
982
983
984 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...
985
    '''
986
DESCRIPTION
987
988
    Radius of gyration
989
990
USAGE
991
992
    rgyrate [ selection ]
993
    '''
994
    try:
995
        from itertools import izip
996
    except ImportError:
997
        izip = zip
998
    quiet = int(quiet)
999
    model = cmd.get_model(selection).atom
1000
    x = [i.coord for i in model]
1001
    mass = [i.get_mass() for i in model]
1002
    xm = [(m*i,m*j,m*k) for (i,j,k),m in izip(x,mass)]
1003
    tmass = sum(mass)
1004
    rr = sum(mi*i+mj*j+mk*k for (i,j,k),(mi,mj,mk) in izip(x,xm))
1005
    mm = sum((sum(i)/tmass)**2 for i in izip(*xm))
1006
    rg = math.sqrt(rr/tmass - mm)
1007
    if not quiet:
1008
        print("Radius of gyration: %.2f" % (rg))
1009
    return rg
1010
1011
cmd.extend("rgyrate", rgyrate)
1012
1013
1014
def exe(cmd):
1015
    o = subprocess.Popen(
1016
        cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
1017
    out = o.stdout.read().strip().decode()
1018
    err = o.stderr.read().strip().decode()
1019
    return out, err
1020
1021
1022
def qrnass():
1023
    cmd.save('/tmp/sele.pdb', '(sele)')
1024
    #os.system('/home/magnus/opt/qrnas/QRNA02/QRNA -i ' + f + ' -c /home/magnus/opt/qrnas/QRNA02/configfile.txt -o out.pdb')
1025
    cmdline = '~/opt/qrnas/QRNA -i /tmp/sele.pdb -c ~/opt/qrnas/configfile.txt -o out.pdb'
1026
    print(cmdline)
1027
    os.system(cmdline)
1028
    #print(exe(cmdline))
1029
    cmd.delete('mini')
1030
    cmd.load('out.pdb', 'mini')
1031
1032
cmd.extend('qrnass', qrnass)
1033
1034
def qrnas():
1035
    subset = "*"
1036
    AllObj=cmd.get_names("all")
1037
    #print AllObj
1038
    for x in AllObj[:]:
1039
      print(x, 'qrnas...')
1040
      #print(AllObj[0],x)
1041
      f = tempfile.NamedTemporaryFile(delete=True)
1042
      #print f.name
1043
      #f.write(XX)
1044
      cmd.save(f.name, x)
1045
      #p = Process(target=mini)
1046
      #p.start()
1047
      mini()
1048
      #cmd.load('out.pdb', 'ref')
1049
      #p.join()
1050
      #print x
1051
      #print '\n'.join(out.split('\n')[1:]) # to remove first line of py3dna /tmp/xxx
1052
      f.close()
1053
      break
1054
    align_all()
1055
    rr()
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable rr does not seem to be defined.
Loading history...
1056
    cmd.set('grid_mode', 1)
1057
1058
1059
def inspect(name, dont_green=False):
1060
    f = tempfile.NamedTemporaryFile(delete=False)
1061
    cmd.save(f.name + '.pdb', name)
1062
    out, err = exe('rna_pdb_tools.py --inspect ' + f.name + '.pdb')
1063
    if not dont_green:
1064
        cmd.color('green', name)
1065
    for l in out.split('\n'):
1066
         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...
1067
         if hit: # [('X', '1')]
1068
             cmd.color('red', name + ' and chain ' + hit[0][0] + ' and resi ' + hit[0][1])
1069
    print(out)
1070
1071
cmd.extend('inspect', inspect)
1072
    
1073
def ll():
1074
    cmd.do('hide all')
1075
    cmd.do('show lines')
1076
cmd.extend('ll', ll)
1077
print('ll - show lines only')
1078
1079 View Code Duplication
def rpr(selection):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1080
    """rpr"""
1081
    f = tempfile.NamedTemporaryFile(delete=False)
1082
    input = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
1083
    cmd.save(input, selection)
1084
1085
    output = os.path.dirname(f.name) + os.sep +  selection + '_rpr.pdb'
1086
1087
    out, err = exe('rna_pdb_tools.py --rpr ' + input + ' > ' + output)
1088
    cmd.load(output)
1089
    print(out)
1090
cmd.extend('rpr', rpr)
1091
1092 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...
1093
    """rpr"""
1094
    f = tempfile.NamedTemporaryFile(delete=False)
1095
    input = os.path.dirname(f.name) + os.sep +  selection + '.pdb'
1096
    cmd.save(input, selection)
1097
    output = os.path.dirname(f.name) + os.sep +  selection2 + '.pdb'
1098
    cmd.save(input, selection)
1099
    cmdline = 'diffpdb.py ' + input + ' ' + output + ' &'
1100
    print(cmdline)
1101
    #os.system(cmdline)
1102
    exe(cmdline)
1103
1104
cmd.extend('diff', diff)
1105
1106
def mini(f):  # min with qrna
1107
    #os.system('/home/magnus/opt/qrnas/QRNA02/QRNA -i ' + f + ' -c /home/magnus/opt/qrnas/QRNA02/configfile.txt -o out.pdb')
1108
    cmd = '~/opt/qrnas/QRNA -i /tmp/' + f + ' -c ~/opt/qrnas/configfile.txt -o out.pdb'
1109
    print(cmd)
1110
    os.system(cmd)
1111
1112
    #cmd.delete('mini')
1113
    cmd.load('out.pdb', 'mini')
1114
    print('end')
1115
1116
1117
def reload():
1118
    """Reload ~/.pymolrc and all included there packages (e.g. with run <foo.py>)"""
1119
    cmd.do('@ ~/.pymolrc')
1120
1121
1122
def rlabel():
1123
    cmd = "n. C1'", '"%s %s" % (resn, resi)'
1124
    print('label ' + cmd)
1125
    cmd.label(cmd)
1126
1127
1128
1129
def sav(name): #sav
1130
    # cmd.bg_color( "white" )
1131
    tf = tempfile.NamedTemporaryFile(delete=False)
1132
    fn = tf.name + '.png'
1133
    tf = tempfile.NamedTemporaryFile(delete=False)
1134
    cfn = tf.name + '.png'
1135
1136
    psefn = '~/Desktop/' + name + '.pse'
1137
    cmd.save(psefn)
1138
1139
    cmd.save(fn)
1140
1141
    cmdline= "/opt/homebrew/bin/convert " + fn + " -gravity center -crop 3:3 +repage " + cfn
1142
    print(cmdline)
1143
    os.system(cmdline)
1144
    cmdline = '/opt/homebrew/bin/fileicon set ' + psefn + ' ' + cfn
1145
    print(cmdline)
1146
    os.system(cmdline)
1147
1148
    #cmd.png(coverfn, 576,576)
1149
    #cmd.ray(576,576)
1150
cmd.extend('sav', sav)
1151
1152
def hide_rna():
1153
    cmd.hide('(polymer.nucleic)')
1154
cmd.extend('rna-hide', hide_rna)
1155
1156
def show_rna():
1157
    cmd.show('(polymer.nucleic)')
1158
cmd.extend('rna-show', show_rna)
1159
1160
def clr():
1161
    cmd.do('delete *')
1162
cmd.extend('clr', clr)
1163
print('clr - delete all')
1164
1165
def bw():
1166
  """clr - make white bg and structure black"""
1167
  cmd.bg_color( "white" )
1168
  color_by_text('color black, all')
1169
cmd.extend('bw', bw)
1170
print('bw - white bg, black all')
1171
1172
def select_rna():
1173
    cmd.select('polymer.nucleic')
1174
cmd.extend('select-rna', select_rna)
1175
1176
def hide_protein():
1177
    cmd.hide('(polymer.protein)')
1178
#cmd.extend('protein-hide', hide_protein)
1179
#cmd.extend('rp-hide', hide_protein)
1180
def select_protein():
1181
    cmd.select('polymer.protein')
1182
cmd.extend('protein-select', select_protein)
1183
1184
def tmp():
1185
    cmd.save('/home/' + user + '/Desktop/' + tmp + '.png')
1186
    cmd.save('/home/' + user + '/Desktop/' + tmp + '.pse')
1187
1188
def tp(): #tp temp pse
1189
    """tp here"""
1190
    import datetime
1191
1192
    # cmd.bg_color( "white" )
1193
    tf = tempfile.NamedTemporaryFile(delete=False)
1194
    fn = tf.name + '.png'
1195
    tf = tempfile.NamedTemporaryFile(delete=False)
1196
    cfn = tf.name + '.png'
1197
1198
    date = datetime.datetime.today().strftime('%Y-%m-%d.%H%M%S')
1199
    psefn = '~/Desktop/' + date + '.pse'
1200
    cmd.save(psefn)
1201
1202
    cmd.save(fn)
1203
1204
    cmdline= "/opt/homebrew/bin/convert " + fn + " -gravity center -crop 3:3 +repage " + cfn
1205
    print(cmdline)
1206
    os.system(cmdline)
1207
    cmdline = '/opt/homebrew/bin/fileicon set ' + psefn + ' ' + cfn
1208
    print(cmdline)
1209
    os.system(cmdline)
1210
1211
cmd.extend('tp', tp)
1212
1213
def sav_tmp():
1214
    from shutil import copyfile
1215
    import datetime
1216
    try:
1217
        TMP_FOLDER + ' '
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable TMP_FOLDER does not seem to be defined.
Loading history...
1218
    except:
1219
        print("Error: Set up TMP_FOLDER in your ~/.pymolrc, e.g. TMP_FOLDER = '/home/magnus/Desktop/PyMOL/'")
1220
        return
1221
1222
    try:
1223
        os.mkdir(TMP_FOLDER)
1224
    except:
1225
        pass
1226
1227
    date = datetime.datetime.today().strftime('%Y-%m-%d.%H%M%S')
1228
    try:
1229
        fn = TMP_FOLDER +  os.sep + id + '_' + date + '.pse'
1230
    except TypeError:
1231
        fn = TMP_FOLDER +  os.sep + '_' + date + '.pse'
1232
    cmd.save(fn)
1233
    print('Save...' + fn)
1234
    cmd.save(fn.replace('.pse', '.png'))
1235
    copyfile(fn, TMP_FOLDER + '/last.pse')
1236
1237
def load_tmp():
1238
    print('Load...')
1239
    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...
1240
1241
1242
def trim():
1243
    cmd.do("remove solvent")
1244
    cmd.do("remove resn NA")
1245
    
1246
cmd.extend('trim', trim)
1247
    
1248
def get_resi():
1249
    """
1250
    PyMOL>get_resi()
1251
    358+376+288+290+359+383+386+382+289+287+384+357+385+360+377+361
1252
    """
1253
    stored.residues = set()
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable stored does not seem to be defined.
Loading history...
1254
    cmd.iterate('(sele)', "stored.residues.add(resi)") # ('289') # residue only
1255
    print('+'.join(stored.residues))#[:-1])
1256
1257
    #cmd.iterate('(sele)', "stored.residues.add((chain, resi))") # ('A', '289')
1258
    #print(r, end='+') # ('A', '289')
1259
    #selection = object + ' and index ' + str(index)
1260
    #cmd.iterate('(sele)', 'l.append([resn, resi])')
1261
    #rint(l)
1262
1263
def findN(r):
1264
    c = 'select br. all within ' + str(r) + ' of (sele)'
1265
    cmd.do(c)
1266
1267
def white():
1268
    cmd.set('dash_color', 'black')
1269
    cmd.set('dash_width', 2)
1270
    cmd.bg_color( "white" )
1271
cmd.extend('w', white)
1272
1273
def desc(t='', width=80):
1274
    print()
1275
    print()
1276
    print()
1277
    print(t.center(int(width)))
1278
    print()
1279
    print()
1280
    print()
1281
1282
def s(): # quick save selected to tmp.pdb
1283
    cmd.do('save tmp.pdb, (sele)')
1284
cmd.extend('s', s)
1285
print('s - quick save selected to tmp.pdb')
1286
1287
def draw():
1288
    #cmd.select("name C1'")
1289
    t = """
1290
1291
1292
    set sphere_scale, 0.4, name C1'
1293
    show sphere, name C1'
1294
    color black, name C1'
1295
1296
    remove name OP2+OP1+O5'+P+C5'+O2'+O3'+C4'+C3'+C2'+O4'
1297
1298
    h_add
1299
1300
    select (bound_to name C1') and name H*
1301
    remove (sele)
1302
1303
    set spec_reflect, 0
1304
    # https://pymolwiki.org/index.php/Spec_reflect
1305
1306
    #set sphere_transparency, 0
1307
    #color blue, donors;
1308
    #color green, acceptors;
1309
    #show sphere, donors;
1310
    #show sphere, acceptors;
1311
1312
    color gray,  name H*; # color atoms from white to gray
1313
1314
1315
set dash_color, black
1316
set dash_width, 1; set dash_gap,  0.2
1317
bg white;
1318
#color black;
1319
"""
1320
    cmd_text(t)
1321
1322
cmd.extend('draw', draw)
1323
cmd.extend('dr', draw)
1324
1325
def se(): # save
1326
    cmd.do('save tmp.pdb, (enabled)')
1327
cmd.extend('se', se)
1328
print('se - quick save enabled to tmp.pdb')
1329
      
1330
1331
def axes_big():
1332
    """
1333
    https://pymolwiki.org/index.php/Axes
1334
    """
1335
    cmd.delete('axes')
1336
1337
    # create the axes object, draw axes with cylinders coloured red, green,
1338
    #blue for X, Y and Z
1339
1340
    obj = [
1341
       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...
1342
       CYLINDER, 0., 0., 0., 0., 10., 0., 0.2, 1.0, 1.0, 1.0, 0., 1.0, 0.,
1343
       CYLINDER, 0., 0., 0., 0., 0., 10., 0.2, 1.0, 1.0, 1.0, 0., 0.0, 1.0,
1344
       ]
1345
1346
    # add labels to axes object (requires pymol version 0.8 or greater, I
1347
    # believe
1348
1349
    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...
1350
    cyl_text(obj,plain,[10.,0.,0.],'X',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
1351
    cyl_text(obj,plain,[0.,10.,0.],'Y',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
1352
    cyl_text(obj,plain,[0.,0.,10.],'Z',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
1353
1354
    # then we load it into PyMOL
1355
    cmd.load_cgo(obj,'axes')
1356
1357
def axes(gradient=False):
1358
    """
1359
    https://pymolwiki.org/index.php/Axes
1360
    """
1361
    cmd.delete('axes')
1362
1363
    # create the axes object, draw axes with cylinders coloured red, green,
1364
    #blue for X, Y and Z
1365
1366
    l = 1
1367
    width = 0.01 #  0.2
1368
    if gradient: # with gradient
1369
        obj = [
1370
           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...
1371
           CYLINDER, 0., 0., 0., 0., l, 0., width, 1.0, 1.0, 1.0, 0., 1.0, 0.,
1372
           CYLINDER, 0., 0., 0., 0., 0., l, width, 1.0, 1.0, 1.0, 0., 0.0, 1.0,
1373
           ]
1374
    else:
1375
        obj = [
1376
           CYLINDER, 0., 0., 0., l, 0., 0., width, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
1377
           CYLINDER, 0., 0., 0., 0., l, 0., width, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
1378
           CYLINDER, 0., 0., 0., 0., 0., l, width, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,
1379
           ]
1380
        
1381
    # add labels to axes object (requires pymol version 0.8 or greater, I
1382
    # believe
1383
    l
1384
    #cyl_text(obj,plain,[-5.,-5.,-1],'Origin',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
1385
    width = 0.005 # 0.20
1386
    size = 0.05
1387
    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...
1388
    cyl_text(obj,plain,[0.,l,0.],'Y',width,axes=[[size,0,0],[0,size,0],[0,0,size]])
1389
    cyl_text(obj,plain,[0.,0.,l],'Z',width,axes=[[size,0,0],[0,size,0],[0,0,size]])
1390
1391
    # then we load it into PyMOL
1392
    cmd.load_cgo(obj,'axes')
1393
1394
1395
cmd.extend('axes', axes)
1396
1397
1398
def axes2(length=0.75):
1399
    """Draw XYZ, no lables here, see axes()
1400
    https://pymolwiki.org/index.php/Axes
1401
1402
    Args:
1403
        lenght: length of axes
1404
    """
1405
    cmd.delete('axes')
1406
    print('Draw axis red, green blue for X, Y and Z')
1407
    w = 0.06 # cylinder width 
1408
    l = float(length) # cylinder length
1409
    h = 0.25 # cone hight
1410
    d = w * 1.618 # cone base diameter
1411
1412
    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...
1413
           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,
1414
           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,
1415
           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...
1416
           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, 
1417
           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]
1418
1419
    cmd.load_cgo(obj, 'axes')
1420
cmd.extend('axes2', axes2)
1421
1422
def v(x, y, z, name='v'):
1423
    cmd.delete(name)
1424
    w = 0.01 # cylinder width
1425
    length=0.75
1426
    l = float(length) # cylinder length
1427
    h = 0.25 # cone hight
1428
    d = w * 1.618 # cone base diameter
1429
    r1,g1,b1 = 1,1,1
1430
    r2,g2,b2 = r1,g1,b1
1431
    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...
1432
    width = 0.005 # 0.20
1433
    size = 0.2
1434
    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...
1435
    cmd.load_cgo(obj, name)
1436
1437
cmd.extend('v', v)
1438
1439
def ha():
1440
    """
1441
        cmd.do('h_add')
1442
    """
1443
    cmd.do('h_add')
1444
cmd.extend('ha', ha)
1445
    
1446
def hb(): # hydrogen bonds
1447
    cmd.do('contacts *,*')
1448
cmd.extend('hb', hb)
1449
1450
1451
def pn(): # pn
1452
    cmd_text('save ~/Desktop/tmp.png')
1453
cmd.extend('pn', pn) # pn
1454
def quickref():
1455
    print('   PyMOL4RNA (rna-tools)  ')
1456
    print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
1457
    print('Quickref `qr`: ')
1458
    print('  alter (sele), chain="B" ')
1459
    print('  alter (sele), resv -= 4')
1460
    print('  alter (chain B), resv -= 44 ')
1461
    print("  select br. all within 15 of (sele)")
1462
    print("  select br. all within 15 of resi 574")
1463
    print("  select br. all within 15 of resi 377 # O. ihheyensis")
1464
    print('  select br. all within 15 of U6_snRNA and resi 80')
1465
    print('  set dash_color, red; set dash_width, 4')
1466
    print('  p - prepare seq for printing')
1467
    print('  rp - rna present, object names only click to get compact legend')
1468
    print('  rp17')
1469
    print('  rna_cartoon')
1470
    print('  rs')
1471
    print('  rcomp')
1472
    print('  color_obj')
1473
    print('  color_rbw')
1474
    print('  aa')
1475
    print('  findN')
1476
    print('  savt - save_transformed <object>, <file>')
1477
    print(' select br. all within 20 of (sele) #within with aa')
1478
    #print('  spl - color snRNAs of the spliceosome:'
1479
    #    green: U2,  blue: U5, red:U6, orange:U2""")
1480
    print('\_ RNA_TOOLS_PATH env variable used: ' + RNA_TOOLS_PATH)
1481
1482
from rna_tools.tools.PyMOL4RNA.libs.show_contacts import show_contacts
1483
from rna_tools.tools.PyMOL4RNA.libs.get_raw_distances import get_raw_distances
1484
1485
1486
try:
1487
    from pymol import cmd
1488
    # axes.py
1489
    from pymol.cgo import *
1490
    from pymol.vfont import plain
1491
except ImportError:
1492
    print("PyMOL Python lib is missing")
1493
    # sys.exit(0)
1494
1495
try:
1496
    import imp
1497
    from rna_tools.rna_tools_lib import RNAStructure
1498
    from rna_tools.tools.PyMOL4RNA import code_for_spl
1499
    imp.reload(code_for_spl)
1500
    print('code_for_spl loaded...')
1501
    from rna_tools.tools.PyMOL4RNA import code_for_color_spl
1502
    imp.reload(code_for_color_spl)
1503
    print('code_for_color_spl loaded...')
1504
    import rna_tools
1505
    RNA_TOOLS_PATH = rna_tools.rna_tools_lib.get_rna_tools_path()
1506
    sys.path.insert(0, RNA_TOOLS_PATH) # '/Users/magnus/work/src/rna-tools/rna_tools/tools/PyMOL4RNA')#
1507
    #(os.path.abspath(os.path.dirname(__file__))))
1508
    from rna_tools.tools.PyMOL4RNA import PyMOL4Spliceosome
1509
    imp.reload(PyMOL4Spliceosome)
1510
except ImportError:
1511
    print("rna_tools lib is missing")
1512
    RNA_TOOLS_PATH = ''
1513
    
1514
try:
1515
    RNA_TOOLS_PATH
1516
    EXECUTABLE
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable EXECUTABLE does not seem to be defined.
Loading history...
1517
except NameError:
1518
    EXECUTABLE="/bin/zsh"
1519
    SOURCE=""
1520
1521
try:
1522
    cmd.set('cartoon_gap_cutoff', 0)
1523
except:
1524
    pass
1525
1526
1527
print(__doc__)
1528
try:
1529
    from pymol import cmd
1530
except ImportError:
1531
    print("PyMOL Python lib is missing")
1532
else:
1533
    #quickref()
1534
    #cmd.set_key('CTRL-S', cmd.save, ['/home/magnus/Desktop/tmp.pse'])
1535
    cmd.set_key('CTRL-S', sav_tmp)
1536
    cmd.set_key('CTRL-Z', load_tmp)  # ostatni wrzucam tutaj
1537
    #cmd.load, ['/home/magnus/Desktop/tmp.pse'])
1538
    # main code #
1539
1540
    cmd.extend('quickref', quickref)
1541
    cmd.extend('qr', quickref)
1542
1543
    cmd.extend('rp', rp)
1544
    cmd.extend('p', p)
1545
    cmd.extend('pdb', pdb)
1546
    cmd.extend('seq', seq)
1547
    cmd.extend('seqsel', seqsel)
1548
    cmd.extend('rseq', seq)
1549
    cmd.extend('rna_cartoon', rna_cartoon)
1550
    cmd.extend('rs', rs)
1551
    cmd.extend('ino', ino)
1552
    cmd.extend('rcomp', rcomp)
1553
    cmd.extend('color_obj', color_obj)
1554
    cmd.extend('color_rbw', color_rbw)
1555
    cmd.extend('aa', align_all)
1556
    cmd.extend('ss', ss)
1557
    cmd.extend('ss_all', ss_all)
1558
    cmd.extend('clarna', clarna)
1559
    cmd.extend('x3dna', x3dna)
1560
    cmd.extend("rgyration", rgyration)
1561
    cmd.extend('rlabel', 'rlabel')
1562
1563
    cmd.extend('reload', reload)
1564
    cmd.extend('rl', reload)
1565
1566
    cmd.extend('color_aa_types', color_aa_types)
1567
1568
    cmd.extend('names', names)
1569
1570
    cmd.extend('findX', findN)
1571
1572
    # set dash lines #hbonds #hydrogen
1573
    cmd.set('dash_color', 'white')
1574
    cmd.set('dash_width', 2)
1575
    cmd.set('cartoon_tube_radius', 0.5)
1576
    
1577
    cmd.extend('save_transformed', save_transformed)
1578
    cmd.extend('savt', save_transformed)
1579
    cmd.extend('show_all_at_once', show_all_at_once)
1580
1581
    cmd.set('ignore_case', 'off')
1582
    #cmd.set('cartoon_ring_mode', '3')
1583
    #cmd.set('cartoon_ring_finder', '2')
1584
    #cmd.extend('spl_select', spl_select)
1585
    #    print('ignore_case made off')
1586
    print('\_ PYMOL4RNA loading .... [ok]')
1587
1588
    cmd.extend('desc', desc)
1589
    #cmd.do('set overlay, 1')
1590
1591
    #### change do desktop
1592
    user = getpass.getuser()
1593
    cw = os.path.abspath(os.getcwd())
1594
    print(cw)
1595
    if cw == '/Users/magnus':
1596
        print('change to Desktop')
1597
        os.chdir('/Users/magnus/Desktop/')
1598
    cw = os.path.abspath(os.getcwd())
1599
    print(cw)
1600