<div dir="ltr"><div><div><div><div>Hi all,<br></div><div><br>Posting this in case it is useful to anyone else who uses both programs. This script will allow Coot to open the currently displayed molecules/maps in Chimera, and adjust display settings appropriately for taking a picture of electron density. <br><br>Either put the appended code in your coot.py and use from the scripting interface, or place this longer script (<a href="https://www.dropbox.com/s/0b4bebwxw0p9x0e/oli_custom.py?dl=0">https://www.dropbox.com/s/0b4bebwxw0p9x0e/oli_custom.py?dl=0</a>) in your ~/.coot-preferences directory, which will add a new "Custom" menu including this option under the "Display" submenu (as well as a bunch of other stuff, and some extra custom key bindings).<br><br></div>The orientation of the molecules should be correct after loading in Chimera, but the zoom and clipping may require some adjustment (I am not sure exactly how to match these precisely between the two programs). The script will only load a fragment of the maps (the same region that is displayed in Coot), but this has the advantage that it takes advantage of Coot's ability to deal with crystal symmetry, so it can be used at crystal contacts with no problems. Let me know if you run into any bugs!<br><br></div>Cheers,<br></div>Oli.<br><br></div>Code:<br>#Open displayed models and maps in Chimera, set map levels and view<br>def open_in_chimera():<br>  if find_exe("chimera"): #If chimera exists do stuff, else raise an error<br>    import subprocess<br>    pwd=os.getcwd() #Dir from which coot was launched<br>    cofr=rotation_centre() #3-membered list [x,y,z]<br>    make_directory_maybe("coot-chimera") #Put coot droppings here<br>    coot_chimera_path=pwd+"/coot-chimera/"<br>    check_path=coot_chimera_path+"chimera_launcher.cmd" #Chimera run script that will be written later<br>    check_path2=coot_chimera_path+"matrix.txt" #Orientation matrix for chimera input<br>    view_number=add_view_here("tmp")<br>#     initial_zoom=zoom_factor() #Coot's zoom factor. 100 is the initial state, zooming out gets larger, in gets smaller.<br>#     reset_view()<br>    zoom=zoom_factor()<br>#     go_to_view_number(view_number,1)<br>#     scale_factor=initial_zoom/base_zoom<br>#     chimera_scale=base_zoom/initial_zoom<br>    chimera_scale=100.0/zoom #Approx - breaks down when initial views upon loading mol in Coot or Chimera are different<br>    map_radius=get_map_radius() #We'll use this to export a map_radius sized fragment<br>    if os.path.isfile(check_path): #if chimera script exists, delete it.<br>      os.remove(check_path)<br>    if os.path.isfile(check_path2): #same for matrix.txt<br>      os.remove(check_path2)<br>    map_list=map_molecule_list()<br>    mol_list=model_molecule_list()<br>    matrix_list=view_matrix() #9-membered list of rotation matrix elements.<br>    with open(check_path2,"a") as matrix_file: #Write orientation matrix (specify first pdb as model, then use matrixcopy to apply to all others). Translation vector in last column is 0,0,0 because we will take care of that separately.<br>      matrix_file.write("Model {model_id}.0\n".format(model_id=mol_list[0]))<br>      matrix_file.write("\t {a} {b} {c} 0.0\n".format(a=matrix_list[0],b=matrix_list[1],c=matrix_list[2]))<br>      matrix_file.write("\t {a} {b} {c} 0.0\n".format(a=matrix_list[3],b=matrix_list[4],c=matrix_list[5]))<br>      matrix_file.write("\t {a} {b} {c} 0.0\n".format(a=matrix_list[6],b=matrix_list[7],c=matrix_list[8]))<br>    with open(check_path,"a") as cmd_file: #Start writing stuff to chimera launch script.<br>      for mol_id in model_molecule_list():<br>        if mol_is_displayed(mol_id):<br>          file_name=coot_chimera_path+"mol_{mol_id}.pdb".format(mol_id=mol_id)<br>          write_pdb_file(mol_id,file_name)<br>          path_to_file=file_name<br>          model_id=mol_id<br>          cmd_file.write("open #{model_id} {mol}\n".format(model_id=model_id,mol=path_to_file)) <br>          cmd_file.write("color gold #{model_id}; color byhet #{model_id}; ca_and_sidechains #{model_id}; disp ~protein\n".format(model_id=model_id)) <br>          cmd_file.write("matrixset matrix.txt\n")<br>          cmd_file.write("matrixcopy #{mol_id0} #{mol_id}\n".format(mol_id0=mol_list[0],mol_id=model_id))<br>      map_id0=mol_id<br>      for map_id in map_molecule_list():<br>        if map_is_displayed(map_id):<br>          map_level=get_contour_level_absolute(map_id)<br>          if map_is_difference_map(map_id):<br>            model_id=map_id0+map_id #make sure that the assigned model number of each map is unique and does not overlap with those of pdbs.<br>            if map_id==0:<br>              model_id=model_id+1<br>            file_name=coot_chimera_path+"diff_map_{model_id}.mrc".format(model_id=model_id)<br>            path_to_file=file_name<br>            export_map_fragment(map_id,cofr[0],cofr[1],cofr[2],map_radius,file_name)<br>            cmd_file.write("open #{model_id} {diff_map} \n".format(model_id=model_id,diff_map=path_to_file))<br>            cmd_file.write("volume #{model_id} capfaces false style mesh meshlighting false squaremesh false color \"#08882eefa222\" step 1 ;  sop cap off ;  set depthCue ;  set dcStart 0.2 ;  set dcEnd 1 ;  background solid white ; set showcofr ;  cofr view ;  clip on; volume #{model_id} level -{map_level} color #da1200000000 level {map_level} color #0000bda00000 \n".format(model_id=model_id,map_level=map_level))<br>            cmd_file.write("matrixset matrix.txt\n")<br>            cmd_file.write("matrixcopy #{mol_id0} #{model_id}\n".format(mol_id0=mol_list[0],model_id=model_id))<br>          else:<br>            model_id=map_id0+map_id<br>            if map_id==0:<br>              model_id=model_id+1<br>            file_name=coot_chimera_path+"map_{model_id}.mrc".format(model_id=model_id)<br>            export_map_fragment(map_id,cofr[0],cofr[1],cofr[2],map_radius,file_name)<br>            path_to_file=file_name<br>            cmd_file.write("open #{model_id} {map} \n".format(model_id=model_id,map=path_to_file))<br>            cmd_file.write("volume #{model_id} capfaces false style mesh meshlighting false squaremesh false color \"#08882eefa222\" step 1 ;  sop cap off ;  set depthCue ;  set dcStart 0.2 ;  set dcEnd 1 ;  background solid white ; set showcofr ;  cofr view ;  clip on; volume #{model_id} level {map_level} \n".format(model_id=model_id,map_level=map_level))<br>            cmd_file.write("matrixset matrix.txt\n")<br>            cmd_file.write("matrixcopy #{mol_id0} #{model_id}\n".format(mol_id0=mol_list[0],model_id=model_id))<br>      cmd_file.write("~sel; cofr {x},{y},{z} coordinatesystem #{mol_id0}; ac mc; center sel; cofr sel;  clip hither 5 fromCenter true; clip yon -5 fromCenter true; cofr view; ~set showcofr; del sel; scale {chimera_scale}".format(x=cofr[0],y=cofr[1],z=cofr[2],mol_id0=mol_list[0],chimera_scale=chimera_scale))<br>    chimera_exe=find_exe("chimera")<br>    info_dialog("Opening in Chimera...\nOrientation should be right but you will probably need to \nadjust the scale and clipping to get the same view as in Coot. \n If you can't see anything, try zooming out.")<br>    subprocess.Popen(["chimera",check_path])<br>  else: <br>    info_dialog("Sorry, you need UCSF Chimera installed and accessible from the terminal for this to work!")<br>#This works okay, though adjustment of zoom and clipping still not ideal.<br>#would it be possible to add a subprocess.communicate() to use Coot as a controller for Chimera?<br><br></div>