diff --git a/ariaec/commands.py b/ariaec/commands.py index 4e80c1971da8a7f3de1035a20785770921690c25..866b10c1c7745e52b7ce14702f7ee2da04d2af91 100644 --- a/ariaec/commands.py +++ b/ariaec/commands.py @@ -195,7 +195,7 @@ class AriaEcCommand: default=False, help="Use secondary structure index") parser.add_argument("--prefix", dest="prefix", default="", - help="File name") + help="Contact map name", nargs="+") return parser def create_settings(self): diff --git a/ariaec/commands.pyc b/ariaec/commands.pyc index e58e41ac9f3a8f238b0b9abc9e6e13b9066d6d5a..6cb3f4ce9085f01222fdf50166463871c2fb80a2 100644 Binary files a/ariaec/commands.pyc and b/ariaec/commands.pyc differ diff --git a/ariaec/conf/aria_ec.ini b/ariaec/conf/aria_ec.ini index 7468bfc5169289f100cbbdce2ee6e64fc19bd32c..9cfbf07d58ee9699b63c5420ab2a9dd3643eaf4d 100644 --- a/ariaec/conf/aria_ec.ini +++ b/ariaec/conf/aria_ec.ini @@ -131,7 +131,6 @@ pickle_output: no [contactmap] ; -------------------------- Contactmap parameters --------------------------- # ; Plot settings -n_factor: 1.5 save_fig: True size_fig: 10 plot_ext: pdf diff --git a/ariaec/maplot.py b/ariaec/maplot.py index ba351a579eba2273f0abe6b813774cff5e3f6950..0dfe9f2a0b886fc7e0d99cad86cde37fed2d6d04 100644 --- a/ariaec/maplot.py +++ b/ariaec/maplot.py @@ -37,13 +37,13 @@ class AriaEcContactMap(object): if not self.settings.contactmap.args.get("onlyreport", False): self.settings.make_infra() # ----------------------------- Input -------------------------------- # - if self.settings.contactmap.args.get("prefix"): - self.outprefix = "_".join((get_filename( - self.settings.contactmap.args.get("seq", None)), - self.settings.contactmap.args.get("prefix", ""))) + if self.settings.contactmap.args.get("prefix") and len( + self.settings.contactmap.args.get("infiles")) == len( + self.settings.contactmap.args.get("prefix")): + self.outprefix = self.settings.contactmap.args.get("prefix", "") else: - self.outprefix = get_filename( - self.settings.contactmap.args.get("seq", None)) + self.outprefix = get_filename(self.settings.contactmap.args.get("seq", + None)) # Load Sequence file self.protein.set_aa_sequence(self.settings.contactmap.args.get("seq", None)) # Load secondary structure prediction file @@ -70,11 +70,13 @@ class AriaEcContactMap(object): logger.info("%s map set as reference" % fo.filetype.capitalize()) self.refmap = fo.mapdict self.reftype = fo.filetype - self.refname = fo.filename + self.refname = fo.filename if type(self.outprefix) != list \ + else self.outprefix[idx] if not self.settings.contactmap.args.get("nofilter"): self.filter(fo.mapdict, fo.filetype, fo.contactlist, self.protein, clashlist=fo.clashlist, - outprefix=self.outprefix, + outprefix=self.outprefix[idx] if type( + self.outprefix) == list else self.outprefix, outdir=self.settings.outdir) # else: # Use only position filter @@ -82,7 +84,9 @@ class AriaEcContactMap(object): # self.protein, clashlist=fo.clashlist, # outprefix=self.outprefix, # outdir=self.settings.outdir, mapfilters="pos") - self.allresmap[(fo.filename, fo.filetype)] = fo.mapdict + self.allresmap[(fo.filename if type(self.outprefix) != list else + self.outprefix[idx], fo.filetype, + fo.filepath)] = fo.mapdict try: refmap = self.refmap["contactmap"] @@ -99,7 +103,8 @@ class AriaEcContactMap(object): if self.settings.contactmap.config.get("save_fig") and not \ self.settings.contactmap.args.get("onlyreport", False): refmap.saveplot(outdir=outdir, - outprefix="_".join((self.outprefix, "pdb")), + outprefix=self.outprefix[0] if type( + self.outprefix) == list else self.outprefix, **plotparams) if self.settings.contactmap.args.get("merge", None): @@ -120,20 +125,20 @@ class AriaEcContactMap(object): self.allresmap[mergekey] = {} self.allresmap[mergekey]["contactmap"] = up_map - for mapname, mapt in self.allresmap.keys(): + for mapname, mapt, mapath in self.allresmap.keys(): - prefix = "_".join((self.outprefix, mapname, self.refname)) + prefix = "_".join((mapname, self.refname)) if mapname == self.refname: + if not self.settings.contactmap.args.get("onlyreport", False): + refmap.write_contacts(mapname, + outdir=outdir, + scoremap=self.refmap.get("scoremap", + None)) continue - if self.settings.contactmap.args.get("onlyreport", False): - refmap.write_contacts("_".join((self.outprefix, mapt)), - outdir=outdir, - scoremap=self.refmap.get("scoremap", - None)) - continue - scoremap = self.allresmap[(mapname, mapt)].get('scoremap', None) + scoremap = self.allresmap[(mapname, mapt, mapath)].get( + 'scoremap', None) # if self.allresmap[mapt].get("contactmap") is not None and \ # self.allresmap[mapt].get("scoremap") is not None: # Get top contact map/list @@ -143,10 +148,9 @@ class AriaEcContactMap(object): # human_idx=True)[:nb_c] # elif self.allresmap[mapt].get("contactmap") is not None: # If no score given, use all contact list - cmpmap = self.allresmap[(mapname, mapt)]["contactmap"] - cmplist = self.allresmap[(mapname, mapt)][ - 'contactmap'].contact_list( - human_idx=True) + cmpmap = self.allresmap[(mapname, mapt, mapath)]["contactmap"] + cmplist = self.allresmap[(mapname, mapt, mapath)][ + 'contactmap'].contact_list(human_idx=True) # else: # logger.warning("%s map doesn't have any score related. Can't " # "define top list related to this map" % mapt) @@ -165,7 +169,7 @@ class AriaEcContactMap(object): # TODO: elementwise error with compare method # Write cmp stats if not self.settings.contactmap.args.get("onlyreport", False): - cmpmap.write_contacts("_".join((self.outprefix, mapt)), + cmpmap.write_contacts(mapname, scoremap=scoremap, outdir=outdir) cmpmap.compare_contactmap(refmap, cmplist, prefix, diff --git a/ariaec/maplot.pyc b/ariaec/maplot.pyc index f774d93fd4dbee644841d77ba4619ebb527daa0e..121f8e6c3cf140d785e1ede07d7763fb4714676b 100644 Binary files a/ariaec/maplot.pyc and b/ariaec/maplot.pyc differ diff --git a/ariaec/protmap.py b/ariaec/protmap.py index 9074655f8fc81b918002dbe490a317978eb95c12..93a6c4ce70d69fe77b94ec90e90840e30cfb000c 100644 --- a/ariaec/protmap.py +++ b/ariaec/protmap.py @@ -200,11 +200,12 @@ class ProteinMap(Map): minticks = tickmin(self, shift=1) # Nb graduations self._maplot = sns.heatmap(self, square=True, cbar=False, - linewidths=1, vmax=1, vmin=-1, + linewidths=0.5, vmax=1, vmin=-1, cmap=sns.diverging_palette(20, 220, n=7, as_cmap=True), xticklabels=minticks[0], - yticklabels=minticks[1]) + yticklabels=minticks[1], + linecolor="grey") return self._maplot def saveplot(self, outdir='', outprefix="protein", size_fig=10, @@ -269,7 +270,7 @@ class ProteinMap(Map): protmap.__class__.__name__, self.__class__.__name__)) return None else: - cmplist = protmap.contact_list() + cmplist = protmap.contact_list(human_idx=True) ymax = len(self.sequence) - 1 if protmap.contact_flags: @@ -286,19 +287,23 @@ class ProteinMap(Map): color = pal[i] mark = Line2D.filled_markers[i] for x, y in zip(xind, yind): - self.maplot.axes.scatter(x, y, s=10, c=color, - linewidths=0, alpha=alpha, + self.maplot.axes.scatter(x, y, s=8, c=color, + linewidths=0.1, alpha=alpha, marker=mark) else: + logger.info("Contact list: %s" % cmplist) xind = [x - .5 for x in zip(*cmplist)[0] + zip(*cmplist)[1]] yind = [ymax - y + 1.5 for y in zip(*cmplist)[1] + zip(*cmplist)[0]] + logger.debug("Xind: %s" % xind) + logger.debug("Yind: %s" % yind) color = "red" # width = [0.3 for _ in xind] # for x, y, h in zip(xind, yind, width): for x, y in zip(xind, yind): - self.maplot.axes.scatter(x, y, s=10, c=color, linewidths=0, + self.maplot.axes.scatter(x, y, s=30, c=color, + linewidths=0, alpha=alpha) if save_fig: self.saveplot(**kwargs) @@ -1239,7 +1244,9 @@ class MapFilter: # Contactmap always filtered # TODO: could set a treshold instead of n_factor - nb_c = int(len(mapdict["contactmap"].sequence) * int( + logger.info("Setting contact number with treshold %s" % + self.settings.get("n_factor")) + nb_c = int(len(mapdict["contactmap"].sequence) * float( self.settings.get("n_factor"))) nb_c = nb_c if nb_c < len(mapdict["contactmap"].contactset()) else len( mapdict["contactmap"].contactset()) @@ -1292,8 +1299,8 @@ class MapFilter: for clash_t in sorted(clash_dict.keys()): if clash_dict[clash_t] and raw_contact in clash_dict[clash_t]: clash = meta_clash[clash_t]["flag"] - meta_clash[clash_t]["msg"] += """\ -{clash_type} flag at pair {pair_nb} : res {res1} and res {res2} {clash_desc} + meta_clash[clash_t]["msg"] += """ +{clash_type} flag at pair {pair_nb} : res {res1} and res {res2} {clash_desc}\ """.format(clash_type=clash, pair_nb=icontact + 1, clash_desc=desc_dict.get(raw_contact, ''), res1=contact[0], res2=contact[1]) @@ -1305,9 +1312,9 @@ class MapFilter: else: op = "added" ctype = clash - meta_clash[clash_t]["warn"] += r"\n/!\ Clash: {clash_desc} {" \ - r"clash} flag for contact " \ - r"{res_pos} ({res1}, {res2})".format( + meta_clash[clash_t]["warn"] += "\n/!\ Clash: {clash_desc} {" \ + "clash} flag for contact " \ + "{res_pos} ({res1}, {res2})".format( clash_desc=op, clash=ctype, res_pos=icontact + 1, res1=contact[0], res2=contact[1]) @@ -1315,6 +1322,7 @@ class MapFilter: titleprint(out, progname=__doc__, desc='Contacts filter') for flt in ("nd", "pos", "cons", "ssclash", "cys"): out.write(''' + {filter_desc} {hd} '''.format(filter_desc=meta_clash[flt]["desc"].capitalize(), diff --git a/ariaec/protmap.pyc b/ariaec/protmap.pyc index 61242a0e543a28f9c03da61b0534eb27a1e2a040..ebcc12d81cb6c0cffbdbad8743f6fb9a35d0eb05 100644 Binary files a/ariaec/protmap.pyc and b/ariaec/protmap.pyc differ