Passed
Push — master ( a2a58c...34f3b6 )
by Marcin
06:20 queued 14s
created

build.rna_tools.tools.PyMOL4RNA.PyMOL4RNA.colmol()   A

Complexity

Conditions 1

Size

Total Lines 11
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

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