import json,copy
from pathlib import Path
root=Path(__file__).resolve().parent
style={'outline':'#C7C7C7','outlineWidth':1,'enableSmoothPath':True}
def g(field): return {'type':'genomic','field':field}
def n(field,**kwargs): return dict(type='nominal',field=field,**kwargs)
def val(v): return {'value':v}
def filt(field,values,neg=False):
 d={'type':'filter','field':field,'oneOf':values}
 if neg:d['not']=True
 return d
def tip(alt,field,typ='nominal'):return {'alt':alt,'type':typ,'field':field}
def track(id,**kw):return dict(id=id,style=copy.deepcopy(style),**kw)
def visible(target='mark',threshold='|xe-x|',padding=10):return [{'target':target,'measure':'width','operation':'less-than','threshold':threshold,'transitionPadding':padding}]
stains=['gneg','gpos25','gpos50','gpos75','gpos100','gvar','acen']
spec=track('4ba389ed-954e-4070-9fac-84bb1be0d7df',title='CVH Liver Sci Use Case',width=1050,layout='linear',tracks=[],spacing=8,xDomain={'interval':[73380000,73480000],'chromosome':'chr4'},assembly='hg38')
ts=spec['tracks']
ts.append(track('74198601-17e6-4ac4-9fc8-aaa93809ae20',x=g('chromStart'),xe=g('chromEnd'),data={'url':'https://raw.githubusercontent.com/sehilyi/gemini-datasets/master/data/UCSC.HG38.Human.CytoBandIdeogram.csv','type':'csv','sampleLength':10000,'genomicFields':['chromStart','chromEnd'],'chromosomeField':'Chromosome'},size=val(18),text=n('Name'),color=n('Stain',range=['white','lightgray','gray','gray','black','#7B9CC8','#DC4542'],domain=stains),title='Ideogram',height=30,stroke=val('gray'),alignment='overlay',strokeWidth=val(.3),tracks=[
 track('bccc4ff5-77a2-4218-a5ec-f3b3ae2f1922',mark='rect',dataTransform=[filt('Stain',['acen'],True)]),
 track('5c10626e-d546-4079-b1e4-6cfcc57a8ded',mark='triangleRight',dataTransform=[filt('Stain',['acen']),{'type':'filter','field':'Name','include':'q'}]),
 track('e6421629-5193-4d39-851b-a88cfa4710e5',mark='triangleLeft',dataTransform=[filt('Stain',['acen']),{'type':'filter','field':'Name','include':'p'}]),
 track('154c7fdc-fada-4fb1-ba4a-54833eb1043d',mark='text',size=val(12),color=n('Stain',range=['black','black','black','black','white','black'],domain=stains[:-1]),visibility=visible(),dataTransform=[filt('Stain',['acen'],True)])]))
genes=track('8f88e732-3f96-44b0-b3f3-5a061addddea',row=n('strand',domain=['+','-']),data={'url':'https://server.gosling-lang.org/api/v1/tileset_info/?d=gene-annotation','type':'beddb','valueFields':[{'name':'strand','type':'nominal','index':5},{'name':'name','type':'nominal','index':3}],'genomicFields':[{'name':'start','index':1},{'name':'end','index':2}],'exonIntervalFields':[{'name':'start','index':12},{'name':'end','index':13}]},color=n('strand',range=['#7585FF','#FF8A85'],domain=['+','-']),title='Genes',height=100,opacity=val(.8),tooltip=[tip('Gene','name'),tip('Strand','strand')],alignment='overlay',visibility=visible(),tracks=[])
gt=genes['tracks']
gt.append(track('a6116f7f-c405-4d00-92b6-3c8860db3134',x=g('end'),mark='triangleRight',size=val(15),dataTransform=[filt('type',['gene']),filt('strand',['+'])]))
t=track('cfe34630-231d-4984-a00c-9ba5b82b5425',x=g('start'),xe=g('end'),mark='text',text=n('name'),dataTransform=[filt('type',['gene'])]);t['style']['dy']=-15;gt.append(t)
t=track('e63b4b74-9adc-4928-9936-ee582fae3ae8',x=g('start'),mark='triangleLeft',size=val(15),dataTransform=[filt('type',['gene']),filt('strand',['-'])]);t['style']['align']='right';gt.append(t)
gt.append(track('7251a754-8c71-4854-a7c1-370834028b4d',x=g('start'),xe=g('end'),mark='rect',size=val(15),dataTransform=[filt('type',['exon'])]))
for id,sign,pattern in [('107053ef-b3d8-4dbc-bace-6212f773f6ec','+','triangleRight'),('15e835ec-2abe-454e-8bd0-c613e6e66cc4','-','triangleLeft')]:
 t=track(id,x=g('start'),xe=g('end'),mark='rule',strokeWidth=val(3),dataTransform=[filt('type',['gene']),filt('strand',[sign])]);t['style']['linePattern']={'size':5,'type':pattern};gt.append(t)
ts.append(genes)
classes=['dELS','pELS','PLS','CA','CA-H3K4me3','TF','CA-CTCF','CA-TF'];colors=['#f2b447','#f08033','#d94242','#a9a9a9','#8b63b7','#68a7c7','#397b9b','#5c9d79']
u='https://pub-c19f49d19c504429973da5246c32aab7.r2.dev/GRCh38-cCREs.bed9.gz'
t=track('e4ff9d6e-0333-47e7-9467-3c56cffe4039',x=g('chromStart'),xe=g('chromEnd'),data={'url':u,'type':'bed','indexUrl':u+'.tbi','customFields':['dhsId','ccreId','ccreClass','displayStart','displayEnd','itemRgb'],'sampleLength':20000},mark='rect',size=val(20),color=n('ccreClass',range=colors,domain=classes,legend=True),title='ENCODE cCREs',height=42,stroke=n('ccreClass',range=colors,domain=classes),tooltip=[tip('cCRE','ccreId'),tip('Class','ccreClass')],strokeWidth=val(1));t['style']['inlineLegend']=True;ts.append(t)
sigs=['Pathogenic','Pathogenic/Likely pathogenic','Likely pathogenic','Conflicting classifications of pathogenicity','Uncertain significance','Likely benign','Benign/Likely benign','Benign','other']
u='https://users.abdenlab.org/voy/clinvar_hg38_all.vcf.gz'
t=track('b1303abe-0440-46a0-909d-16c9fcc10207',data={'url':u,'type':'vcf','indexUrl':u+'.tbi','sampleLength':5000},color=n('CLNSIG',range=['#D62728','#FF7F0E','#E7BA00','#9467BD','#8C8C8C','#17BECF','#2CA02C','#1F77B4','#8C564B'],domain=sigs,legend=True),title='ClinVar clinical significance',height=210,alignment='overlay',dataTransform=[filt('CLNSIG',sigs)],tracks=[
 track('2b164898-3c24-4284-a266-cfa133c2832a',x=g('POS'),y=n('CLNSIG',range=[195,15],domain=sigs,baseline='other'),mark='bar',size=val(1),color=val('lightgray'),stroke=val('lightgray'),opacity=val(.3),strokeWidth=val(1)),
 track('fdc0d922-4aea-48a6-b399-ba9c88bac0f6',x=g('POS'),y=n('CLNSIG',range=[195,15],domain=sigs,axis='right'),mark='point',size=val(7),opacity=val(.8),tooltip=[tip(a,f) for a,f in [('Gene','GENE'),('Clinical significance','CLNSIG'),('Variant','VARIANTNAME'),('Molecular consequence','CONSQNAME'),('Phenotype','PHENOTYPES'),('Review status','REVIEWSTATUS')]])]);t['style']['inlineLegend']=True;ts.append(t)
# Replacements retain the supplied parent IDs. Positive-only display; BED retains both signs.
for accession,label,id in [('ENCFF564PMV','HepG2','d7a0e1c4-5f3b-4b6e-9c51-0a6f2c1d9e11'),('ENCFF183YWR','Liver right lobe','d7a0e1c4-5f3b-4b6e-9c51-0a6f2c1d9e13')]:
 t=json.load(open(root.parent/'HepG2_importance.gosling.json'))['tracks'][0]
 t['id']=id;t.pop('width',None);t['height']=300;t['style']=copy.deepcopy(style)
 t['title']=f'{label} ATAC ChromBPNet profile importance (+) — {accession}'
 u=f'https://users.abdenlab.org/voy/dynseq/{accession}.hg38.dynseq.bgz'
 t['data']={'type':'bed','url':u,'indexUrl':u+'.tbi','sampleLength':1000000}
 # Gosling's BED parser normalizes '+'/'-' to numeric 1/-1.
 t['dataTransform'][0]['oneOf']=[1]
 # Autoscale to loaded positive contributions; no clipping or altered raw scores.
 t['y']={'field':'score','type':'quantitative','axis':'right','zeroBaseline':True}
 ts.append(t)
for id,date,uuid,acc,title,color,height in [
 ('52b6a0aa-532d-4974-8b2f-3bcaaa60a809','2020/12/08','f32057b8-e426-487e-966d-9b065fa5826c','ENCFF920KHC','HNF4A-Liver-Donor','#3578b0',85),
 ('0dc075ef-0243-4b28-bbc5-ef7ad03b59e3','2020/12/09','6880bd1c-2c49-407c-99d7-a5ce622127cc','ENCFF132KFG','FOXA2-Liver-Donor','#d78336',85),
 ('9997e0e6-9d42-47c3-a6cb-02b7276f1c40','2020/12/08','d92f0c4a-7a96-451f-8579-18d99201faaa','ENCFF859ZKV','RXRA-Liver-Donor','#7455a5',85),
 ('3127b869-0ed3-42ed-ae4e-fed179964122','2020/12/08','5ef188c5-d6f2-41b9-870d-34769ad36e01','ENCFF320GQX','SP1-Liver-Donor','#42966c',85),
 ('68e1ff88-a737-4348-8884-e1fc9725dde1','2020/12/08','1830ee19-0ddd-4d1d-93fe-e655f3508c86','ENCFF764XDE','HepG2-Tbx3','#c65364',85)]:
 ts.append(track(id,x=g('position'),y={'axis':'right','type':'quantitative','field':'value'},data={'url':f'https://encode-public.s3.amazonaws.com/{date}/{uuid}/{acc}.bigWig','type':'bigwig','value':'value','column':'position'},mark='bar',color=val(color),title=f'{title}-{acc}',height=height))
(root/'CVH_Liver_dynseq.gosling.json').write_text(json.dumps(spec,indent=2)+'\n')
(root/'replacement_tracks.json').write_text(json.dumps(ts[4:6],indent=2)+'\n')
