From 5f030b205e27b714680242e1eba9b05836097322 Mon Sep 17 00:00:00 2001 From: Lucas Schweickert <28017534+Cyberfly100@users.noreply.github.com> Date: Fri, 18 Oct 2019 21:42:52 +0200 Subject: [PATCH] Add files via upload updated recipes to support scientific notation. updated correlation to support HydraHarp T2 and T3 formats as well as quTAG format implemented improved realtime script into Realtime.eta, Lifetime.eta and the new Osci_mode_quTAG.eta (to be renamed Oscilloscope.eta, when it is ready to be public-facing) --- gui/src/renderer/js/recipes/Correlation.eta | 2 +- gui/src/renderer/js/recipes/Countrate.eta | 2 +- gui/src/renderer/js/recipes/Lifetime.eta | 2 +- gui/src/renderer/js/recipes/Osci_mode_QuTAG.eta | 1 + gui/src/renderer/js/recipes/Realtime.eta | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 gui/src/renderer/js/recipes/Osci_mode_QuTAG.eta diff --git a/gui/src/renderer/js/recipes/Correlation.eta b/gui/src/renderer/js/recipes/Correlation.eta index 02dd9f5..0bee570 100644 --- a/gui/src/renderer/js/recipes/Correlation.eta +++ b/gui/src/renderer/js/recipes/Correlation.eta @@ -1 +1 @@ -{"ri_templatejezi0bbr":null,"vi_templatejg59migx":"{\"nodes\":[{\"x\":101,\"y\":101,\"fixed\":true,\"text\":\"a\",\"px\":101,\"py\":101,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"1\"}],\"usercode\":\"a:\\n emit(4,0)# here, ch1 is duplicated to ch3 with a delay of 0ps\"}","vi_templatejfc9koma":"{\"nodes\":[{\"x\":82,\"y\":88,\"fixed\":true,\"text\":\"a\",\"px\":82,\"py\":88,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"0\"}],\"usercode\":\"a:\\n emit(3,0)# here, ch0 is duplicated to ch2 with a delay of 0ps\"}","vi_templatejg52ksbp":"{\"nodes\":[{\"x\":346,\"y\":111,\"fixed\":true,\"text\":\"start\",\"px\":346,\"py\":111},{\"x\":95,\"y\":102,\"fixed\":true,\"text\":\"stop\",\"px\":95,\"py\":102,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"4\"},{\"source\":1,\"target\":0,\"text\":\"3\"},{\"source\":0,\"target\":0,\"text\":\"3\"},{\"source\":1,\"target\":1,\"text\":\"4\"}],\"usercode\":\"HISTOGRAM(h3,(`bins`,`binsize`))\\nCLOCK(c3,100,1)\\nstart:\\n c3.start()\\nstop:\\n c3.stop()\\n h3.record_all(c3)\"}","vi_templatejfb2qshf":"{\"nodes\":[{\"x\":346,\"y\":111,\"fixed\":true,\"text\":\"start\",\"px\":346,\"py\":111},{\"x\":102,\"y\":102,\"fixed\":true,\"text\":\"stop\",\"px\":102,\"py\":102,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"3\"},{\"source\":1,\"target\":0,\"text\":\"4\"},{\"source\":0,\"target\":0,\"text\":\"4\"},{\"source\":1,\"target\":1,\"text\":\"3\"}],\"usercode\":\"HISTOGRAM(h4,(`bins`,`binsize`))\\nCLOCK(c4,100,1)\\nstart:\\n c4.start()\\nstop:\\n c4.stop()\\n h4.record_all(c4)\"}","dpp_template_code":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n#------ETA PROCESSING-----\r\n\r\ncut=eta.simple_cut(Path(file), 4)\r\nresult= eta.run(cut, group='HHT3')\r\nhist1=result[\"h3\"]\r\nhist2=result[\"h4\"]\r\n\r\nfullhist_ss=np.concatenate((np.flip(hist2, 0), hist1), axis=0)\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n dcc.Graph(\r\n id='example-ss',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(-hist2.size,hist1.size)*int(binsize), \r\n 'y': fullhist_ss,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': 'Start Stop Measurement',\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ps)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","eta_index_table":"[{\"id\":\"var_templatejgmgopco\",\"name\":\"file\",\"group\":\"HHT2,HHT3, quTAG\",\"info\":\"\",\"config\":\"C:/YourFolder/YourFile.timeres\"},{\"id\":\"var_templatejkim8l39\",\"name\":\"binsize\",\"group\":\"HHT2,HHT3, quTAG\",\"info\":\"\",\"config\":\"16\"},{\"id\":\"var_templatejkim8rzm\",\"name\":\"expname\",\"group\":\"HHT2,HHT3, quTAG\",\"info\":\"\",\"config\":\"Correlation\"},{\"id\":\"var_templatejkim8w21\",\"name\":\"bins\",\"group\":\"HHT2,HHT3, quTAG\",\"info\":\"\",\"config\":\"10000\"},{\"id\":\"var_templatejkim95ub\",\"name\":\"plotsize_x\",\"group\":\"HHT2,HHT3, quTAG\",\"info\":\"\",\"config\":\"3200\"},{\"id\":\"var_templatejrvu8s5g\",\"name\":\"analyze_timewindow\",\"group\":\"HHT2,HHT3, quTAG\",\"info\":\"\",\"config\":\"True\"},{\"id\":\"dpp_templatek0e4fe69\",\"name\":\"plotly (HHT2)\",\"group\":\"HHT2\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_template_code\",\"name\":\"plotly (HHT3)\",\"group\":\"HHT3\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatek0e4feyu\",\"name\":\"plotly (quTAG)\",\"group\":\"quTAG\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatek0e4ffk5\",\"name\":\"create txt (HHT2)\",\"group\":\"HHT2\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejgqnmykj\",\"name\":\"create txt (HHT3)\",\"group\":\"HHT3\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatek0e4ffxo\",\"name\":\"create txt (quTAG)\",\"group\":\"quTAG\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejgs3h609\",\"name\":\"txt 2 graph (zoom-in)\",\"group\":\"HHT2,HHT3, quTAG\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejgs1c21d\",\"name\":\"txt 2 g2 analysis and graph\",\"group\":\"HHT2,HHT3, quTAG\",\"info\":\"\",\"config\":\"\"},{\"id\":\"ri_templatejezi0bbr\",\"name\":\"HH400\",\"group\":\"HHT2,HHT3\",\"info\":\"📤 [0, 1, 2]\",\"config\":\"[3,0]\"},{\"id\":\"ri_templatek0e3jjea\",\"name\":\"quTAG\",\"group\":\"quTAG\",\"info\":\"📤 [0, 1, 2, 3, 4, 5]\",\"config\":\"[6,0]\"},{\"id\":\"vi_templatek0e44hsk\",\"name\":\"DL1-3 (HHT2)\",\"group\":\"HHT2\",\"info\":\"📥 [1], 📤 [3] \",\"config\":\"\"},{\"id\":\"vi_templatek0e44v54\",\"name\":\"DL2-4 (HHT2)\",\"group\":\"HHT2\",\"info\":\"📥 [2], 📤 [4] \",\"config\":\"\"},{\"id\":\"vi_templatejg59migx\",\"name\":\"DL1-4 (HHT3)\",\"group\":\"HHT3\",\"info\":\"📥 [1], 📤 [4] \",\"config\":\"\"},{\"id\":\"vi_templatejfc9koma\",\"name\":\"DL0-3 (HHT3)\",\"group\":\"HHT3\",\"info\":\"📥 [0], 📤 [3] \",\"config\":\"\"},{\"id\":\"vi_templatejg52ksbp\",\"name\":\"Correlationbwd (HH400)\",\"group\":\"HHT2,HHT3\",\"info\":\"📥 [4, 3], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatejfb2qshf\",\"name\":\"Correlationfwd  (HH400)\",\"group\":\"HHT2,HHT3\",\"info\":\"📥 [3, 4], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatek0e3lgeo\",\"name\":\"DL1-6  (quTAG)\",\"group\":\"quTAG\",\"info\":\"📥 [1], 📤 [6] \",\"config\":\"\"},{\"id\":\"vi_templatek0e3lz43\",\"name\":\"DL2-7 (quTAG)\",\"group\":\"quTAG\",\"info\":\"📥 [2], 📤 [7] \",\"config\":\"\"},{\"id\":\"vi_templatek0e3qybt\",\"name\":\"Correlationbwd (quTAG)\",\"group\":\"quTAG\",\"info\":\"📥 [7, 6], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatek0e3sowi\",\"name\":\"Correlationfwd (quTAG)\",\"group\":\"quTAG\",\"info\":\"📥 [6, 7], 📤 [] \",\"config\":\"\"}]","var_templatejgmgopco":null,"dpp_templatejgqnmykj":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\nbinsize=int(binsize)\r\npath = Path(file)\r\ndatafolder='analyzed data'\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path]\r\n\r\nfor f in selector:\r\n cutfile = eta.simple_cut(f,4)\r\n result=eta.run(cutfile, group='HHT3')\r\n t1=result[\"h3\"]\r\n t2=result[\"h4\"] \r\n fullhist=np.concatenate((np.flip(t2, 0), t1), axis=0)\r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_correlation' + '.txt'), np.transpose([np.arange(-t2.size,t1.size)*binsize,fullhist]))\r\n eta.send(str(f.name) + ' has been successfully processed')\r\neta.send('FINISHED')\r\n\r\n","dpp_templatejgs1c21d":"#------IMPORTS-----\r\nfrom pathlib import Path\r\n\r\nimport numpy as np\r\nimport pandas as pd\r\n\r\nimport matplotlib.pyplot as plt\r\n\r\ndef get_files(extensions):\r\n global path, datafolder\r\n path=path.joinpath(datafolder)\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\nanalyze_timewindow = bool(analyze_timewindow)\r\n\r\n#------ETA PROCESSING-----\r\ndatafolder='analyzed data'\r\ngraphsfolder='graphs'\r\npath = Path(file)\r\n\r\nif path.is_dir():\r\n selector = get_files(('*.txt',))\r\nelse:\r\n if path.suffix == '.txt':\r\n selector = [path]\r\n else:\r\n selector = [path.parent.joinpath(datafolder, path.stem + '_correlation' + '.txt')]\r\n\r\nfor f in selector:\r\n list_of_title=f.stem.split('_')\r\n\r\n data=pd.read_table(f, header=None, names=['ps', 'cnts'], sep=' ')\r\n data.set_index('ps', inplace=True)\r\n data = data['cnts']\r\n \r\n numberofsidepeaks = 8 # must be even\r\n bin=16\r\n shift = 0\r\n widthofdata = 120000 #how the data is going to be cut. Allow enough ps to accomodate the numberofsidepeaks\r\n leftend = int(-widthofdata/2+shift)\r\n rightend = int(widthofdata/2+shift)\r\n lessthanrep = 12300 #less than the laser repetition rate in ps\r\n \r\n reprate = int(((data.loc[rightend-lessthanrep:rightend].idxmax()-data.loc[leftend:leftend+lessthanrep].idxmax())/int(numberofsidepeaks)))\r\n \r\n g2vsdT = pd.DataFrame()\r\n for window in range(bin, lessthanrep, bin):\r\n peaks = np.array([])\r\n \r\n for x in range(int(data.loc[leftend:leftend+reprate].idxmax()), rightend, reprate):\r\n temp0=data.loc[x-window/2:x+window/2].sum()\r\n peaks=np.append([peaks], [temp0])\r\n \r\n center = peaks[int(numberofsidepeaks/2)]\r\n average = np.mean([peaks[:int(numberofsidepeaks/2)], peaks[1+int(numberofsidepeaks/2):]])\r\n average_err = (np.sqrt(np.sum([peaks[:int(numberofsidepeaks/2)], peaks[1+int(numberofsidepeaks/2):]]))/int(numberofsidepeaks))\r\n g2 = center/average\r\n g2_err = np.sqrt(center/(average**2)+(average_err**2)*(peaks[int(numberofsidepeaks/2)]**2)/average**4)\r\n \r\n if window == 1600:\r\n print('Time window: '+str(window)+' ps'+'\\n'+'average counts per peak: '+str(average) + ' pm ' + str(average_err) + '\\n' + 'g2: '+ str(g2)+ ' pm ' + str(g2_err)+'\\n'+'center peak delay: ' + str(reprate*(numberofsidepeaks/2)+data.loc[leftend:leftend+lessthanrep].idxmax())+' ps' +'\\n'+'pulse delay: '+str(reprate)+' ps')\r\n center_peak_delay = reprate*(numberofsidepeaks/2)+data.loc[leftend:leftend+lessthanrep].idxmax()\r\n good_average = average\r\n good_average_err = average_err\r\n good_g2 = g2\r\n good_g2_err = g2_err\r\n temp1 = pd.DataFrame([[window, g2, g2_err]], columns=['Time Window', 'g(2)', 'delta g(2)'])\r\n g2vsdT = pd.concat([g2vsdT, temp1], ignore_index=True)\r\n \r\n \r\n g2vsdT.set_index('Time Window', inplace=True)\r\n g2vsdT = pd.concat([g2vsdT, g2vsdT['g(2)']+g2vsdT['delta g(2)'], g2vsdT['g(2)']-g2vsdT['delta g(2)']], axis=1)\r\n g2vsdT.rename(columns={0:'err+', 1:'err-'}, inplace=True)\r\n \r\n title='average counts per peak: '+str(int(good_average)) + r' $\\pm$ ' + str(int(good_average_err)) + '\\n' + 'g2: '+ \"{0:.6f}\".format(good_g2) + r' $\\pm$ ' + \"{0:.6f}\".format(good_g2_err)\r\n data = data.loc[leftend:rightend]\r\n p1 = plt.bar(data.index,data, width=bin, color='salmon', log=True)\r\n\r\n plt.ylabel('correlation events')\r\n plt.xlabel('time (ps)')\r\n plt.title(title)\r\n f.parent.parent.joinpath(graphsfolder).mkdir(parents=True, exist_ok=True)\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_analyzed' + '.eps'), format='eps', dpi=1200)\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_analyzed' + '.png'), format='png', dpi=1200)\r\n plt.clf()\r\n \r\n if analyze_timewindow == True:\r\n plt.plot(g2vsdT.index, g2vsdT['g(2)'], 'b')\r\n plt.fill_between(g2vsdT.index, g2vsdT['err+'], g2vsdT['err-'], color='b', alpha=0.2)\r\n plt.ylabel('g2(0)')\r\n plt.xlabel('analysis window (ps)')\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_windows' + '.eps'), format='eps', dpi=1200)\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_windows' + '.png'), format='png', dpi=1200)\r\n plt.clf()","dpp_templatejgs3h609":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\n\r\ndef get_files(extensions):\r\n global path, datafolder\r\n path=path.joinpath(datafolder)\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\ngraphsfolder='graphs'\r\ndatafolder='analyzed data'\r\npath = Path(file)\r\n\r\nif path.is_dir():\r\n selector = get_files(('*.txt',))\r\nelse:\r\n if path.suffix == '.txt':\r\n selector = [path]\r\n else:\r\n selector = [path.parent.joinpath(datafolder, path.stem + '_correlation' + '.txt')]\r\n\r\nplotsize_x=int(plotsize_x)\r\nbinsize=int(binsize)\r\n\r\nfor f in selector:\r\n print(f.stem)\r\n data=np.loadtxt(f)\r\n read_bins=len(np.transpose(data)[0])\r\n p1 = plt.bar(data[int((read_bins-plotsize_x/binsize)/2):int((read_bins+plotsize_x/binsize)/2),0], data[int((read_bins-plotsize_x/binsize)/2):int((read_bins+plotsize_x/binsize)/2),1],width=binsize, color='#0088ff')\r\n plt.ylabel('events')\r\n plt.xlabel('time (ps)')\r\n f.parent.parent.joinpath(graphsfolder).mkdir(parents=True, exist_ok=True)\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_inset' + '.eps'), format='eps', dpi=1200)\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_inset' + '.png'), format='png', dpi=1200)\r\n plt.clf()\r\n eta.send(f.name + ' has been successfully plotted')","var_templatejkim8l39":null,"var_templatejkim8rzm":null,"var_templatejkim8w21":null,"var_templatejkim95ub":null,"var_templatejrvu8s5g":null,"ri_templatek0e3jjea":null,"vi_templatek0e3lgeo":"{\"nodes\":[{\"x\":121,\"y\":114,\"fixed\":true,\"text\":\"a\",\"initial\":true,\"px\":121,\"py\":114}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"1\"}],\"usercode\":\"a:\\n emit(6,0)\"}","vi_templatek0e3lz43":"{\"nodes\":[{\"x\":89,\"y\":107,\"fixed\":true,\"initial\":true,\"text\":\"a\"}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"2\"}],\"usercode\":\"a:\\n emit(7,0)\"}","vi_templatek0e3qybt":"{\"nodes\":[{\"x\":346,\"y\":111,\"fixed\":true,\"text\":\"start\",\"px\":346,\"py\":111},{\"x\":75,\"y\":86,\"fixed\":true,\"text\":\"stop\",\"px\":75,\"py\":86,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"7\"},{\"source\":1,\"target\":0,\"text\":\"6\"},{\"source\":0,\"target\":0,\"text\":\"6\"},{\"source\":1,\"target\":1,\"text\":\"7\"}],\"usercode\":\"HISTOGRAM(h3,(`bins`,`binsize`))\\nCLOCK(c3,100,1)\\nstart:\\n c3.start()\\nstop:\\n c3.stop()\\n h3.record_all(c3)\"}","vi_templatek0e3sowi":"{\"nodes\":[{\"x\":346,\"y\":111,\"fixed\":true,\"text\":\"start\",\"px\":346,\"py\":111},{\"x\":76,\"y\":88,\"fixed\":true,\"text\":\"stop\",\"px\":76,\"py\":88,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"6\"},{\"source\":1,\"target\":0,\"text\":\"7\"},{\"source\":0,\"target\":0,\"text\":\"7\"},{\"source\":1,\"target\":1,\"text\":\"6\"}],\"usercode\":\"HISTOGRAM(h4,(`bins`,`binsize`))\\nCLOCK(c4,100,1)\\nstart:\\n c4.start()\\nstop:\\n c4.stop()\\n h4.record_all(c4)\"}","vi_templatek0e44hsk":"{\"nodes\":[{\"x\":82,\"y\":88,\"fixed\":true,\"text\":\"a\",\"px\":82,\"py\":88,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"1\"}],\"usercode\":\"a:\\n emit(3,0)# here, ch0 is duplicated to ch2 with a delay of 0ps\"}","vi_templatek0e44v54":"{\"nodes\":[{\"x\":101,\"y\":101,\"fixed\":true,\"text\":\"a\",\"px\":101,\"py\":101,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"2\"}],\"usercode\":\"a:\\n emit(4,0)# here, ch1 is duplicated to ch3 with a delay of 0ps\"}","dpp_templatek0e4fe69":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n#------ETA PROCESSING-----\r\n\r\ncut=eta.simple_cut(Path(file), 4)\r\nresult= eta.run(cut, group='HHT2')\r\nhist1=result[\"h3\"]\r\nhist2=result[\"h4\"]\r\n\r\nfullhist_ss=np.concatenate((np.flip(hist2, 0), hist1), axis=0)\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n dcc.Graph(\r\n id='example-ss',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(-hist2.size,hist1.size)*int(binsize), \r\n 'y': fullhist_ss,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': 'Start Stop Measurement',\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ps)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","dpp_templatek0e4feyu":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n#------ETA PROCESSING-----\r\n\r\ncut=eta.simple_cut(Path(file), 4)\r\nresult= eta.run(cut, group='quTAG')\r\nhist1=result[\"h3\"]\r\nhist2=result[\"h4\"]\r\n\r\nfullhist_ss=np.concatenate((np.flip(hist2, 0), hist1), axis=0)\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n dcc.Graph(\r\n id='example-ss',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(-hist2.size,hist1.size)*int(binsize), \r\n 'y': fullhist_ss,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': 'Start Stop Measurement',\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ps)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","dpp_templatek0e4ffk5":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\nbinsize=int(binsize)\r\npath = Path(file)\r\ndatafolder='analyzed data'\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path]\r\n\r\nfor f in selector:\r\n cutfile = eta.simple_cut(f,4)\r\n result=eta.run(cutfile, group='HHT2')\r\n t1=result[\"h3\"]\r\n t2=result[\"h4\"] \r\n fullhist=np.concatenate((np.flip(t2, 0), t1), axis=0)\r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_correlation' + '.txt'), np.transpose([np.arange(-t2.size,t1.size)*binsize,fullhist]))\r\n eta.send(str(f.name) + ' has been successfully processed')\r\neta.send('FINISHED')\r\n\r\n","dpp_templatek0e4ffxo":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\nbinsize=int(binsize)\r\npath = Path(file)\r\ndatafolder='analyzed data'\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path]\r\n\r\nfor f in selector:\r\n cutfile = eta.simple_cut(f,4)\r\n result=eta.run(cutfile, group='quTAG')\r\n t1=result[\"h3\"]\r\n t2=result[\"h4\"] \r\n fullhist=np.concatenate((np.flip(t2, 0), t1), axis=0)\r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_correlation' + '.txt'), np.transpose([np.arange(-t2.size,t1.size)*binsize,fullhist]))\r\n eta.send(str(f.name) + ' has been successfully processed')\r\neta.send('FINISHED')\r\n\r\n"} \ No newline at end of file +{"ri_templatejezi0bbr":null,"vi_templatejg59migx":"{\"nodes\":[{\"x\":101,\"y\":101,\"fixed\":true,\"text\":\"a\",\"px\":101,\"py\":101,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"1\"}],\"usercode\":\"a:\\n emit(4,0)# here, ch1 is duplicated to ch3 with a delay of 0ps\"}","vi_templatejfc9koma":"{\"nodes\":[{\"x\":82,\"y\":88,\"fixed\":true,\"text\":\"a\",\"px\":82,\"py\":88,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"0\"}],\"usercode\":\"a:\\n emit(3,0)# here, ch0 is duplicated to ch2 with a delay of 0ps\"}","vi_templatejg52ksbp":"{\"nodes\":[{\"x\":346,\"y\":111,\"fixed\":true,\"text\":\"start\",\"px\":346,\"py\":111},{\"x\":95,\"y\":102,\"fixed\":true,\"text\":\"stop\",\"px\":95,\"py\":102,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"4\"},{\"source\":1,\"target\":0,\"text\":\"3\"},{\"source\":0,\"target\":0,\"text\":\"3\"},{\"source\":1,\"target\":1,\"text\":\"4\"}],\"usercode\":\"HISTOGRAM(h3,(`bins`,`binsize`))\\nCLOCK(c3,100,1)\\nstart:\\n c3.start()\\nstop:\\n c3.stop()\\n h3.record_all(c3)\"}","vi_templatejfb2qshf":"{\"nodes\":[{\"x\":346,\"y\":111,\"fixed\":true,\"text\":\"start\",\"px\":346,\"py\":111},{\"x\":102,\"y\":102,\"fixed\":true,\"text\":\"stop\",\"px\":102,\"py\":102,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"3\"},{\"source\":1,\"target\":0,\"text\":\"4\"},{\"source\":0,\"target\":0,\"text\":\"4\"},{\"source\":1,\"target\":1,\"text\":\"3\"}],\"usercode\":\"HISTOGRAM(h4,(`bins`,`binsize`))\\nCLOCK(c4,100,1)\\nstart:\\n c4.start()\\nstop:\\n c4.stop()\\n h4.record_all(c4)\"}","dpp_template_code":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n#------ETA PROCESSING-----\r\n\r\ncut=eta.simple_cut(Path(file), 4)\r\nresult= eta.run(cut, group='HHT3')\r\nhist1=result[\"h3\"]\r\nhist2=result[\"h4\"]\r\n\r\nfullhist=np.concatenate((np.flip(hist2, 0), hist1), axis=0)\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n dcc.Graph(\r\n id='example-ss',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(-hist2.size,hist1.size)*int(float(binsize)), \r\n 'y': fullhist,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': 'Start Stop Measurement',\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ps)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","eta_index_table":"[{\"id\":\"var_templatejgmgopco\",\"name\":\"file\",\"group\":\"HHT2,HHT3, quTAG, general\",\"info\":\"\",\"config\":\"C:/YourFolder/YourFile.timeres\"},{\"id\":\"var_templatejkim8l39\",\"name\":\"binsize\",\"group\":\"HHT2,HHT3, quTAG, general\",\"info\":\"\",\"config\":\"16\"},{\"id\":\"var_templatejkim8rzm\",\"name\":\"expname\",\"group\":\"HHT2,HHT3, quTAG\",\"info\":\"\",\"config\":\"Correlation\"},{\"id\":\"var_templatejkim8w21\",\"name\":\"bins\",\"group\":\"HHT2,HHT3, quTAG\",\"info\":\"\",\"config\":\"10000\"},{\"id\":\"var_templatejkim95ub\",\"name\":\"plotsize_x\",\"group\":\"general\",\"info\":\"\",\"config\":\"3200\"},{\"id\":\"var_templatejrvu8s5g\",\"name\":\"analyze_timewindow\",\"group\":\"general\",\"info\":\"\",\"config\":\"True\"},{\"id\":\"dpp_templatek0e4fe69\",\"name\":\"plotly (HHT2)\",\"group\":\"HHT2\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_template_code\",\"name\":\"plotly (HHT3)\",\"group\":\"HHT3\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatek0e4feyu\",\"name\":\"plotly (quTAG)\",\"group\":\"quTAG\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatek0e4ffk5\",\"name\":\"create txt (HHT2)\",\"group\":\"HHT2\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejgqnmykj\",\"name\":\"create txt (HHT3)\",\"group\":\"HHT3\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatek0e4ffxo\",\"name\":\"create txt (quTAG)\",\"group\":\"quTAG\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejgs3h609\",\"name\":\"txt 2 graph (zoom-in)\",\"group\":\"general\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejgs1c21d\",\"name\":\"txt 2 g2 analysis and graph\",\"group\":\"general\",\"info\":\"\",\"config\":\"\"},{\"id\":\"ri_templatejezi0bbr\",\"name\":\"HH400\",\"group\":\"HHT2,HHT3\",\"info\":\"📤 [0, 1, 2]\",\"config\":\"[3,0]\"},{\"id\":\"ri_templatek0e3jjea\",\"name\":\"quTAG\",\"group\":\"quTAG\",\"info\":\"📤 [0, 1, 2, 3, 4, 5]\",\"config\":\"[6,0]\"},{\"id\":\"vi_templatek0e44hsk\",\"name\":\"DL1-3 (HHT2)\",\"group\":\"HHT2\",\"info\":\"📥 [1], 📤 [3] \",\"config\":\"\"},{\"id\":\"vi_templatek0e44v54\",\"name\":\"DL2-4 (HHT2)\",\"group\":\"HHT2\",\"info\":\"📥 [2], 📤 [4] \",\"config\":\"\"},{\"id\":\"vi_templatejfc9koma\",\"name\":\"DL0-3 (HHT3)\",\"group\":\"HHT3\",\"info\":\"📥 [0], 📤 [3] \",\"config\":\"\"},{\"id\":\"vi_templatejg59migx\",\"name\":\"DL1-4 (HHT3)\",\"group\":\"HHT3\",\"info\":\"📥 [1], 📤 [4] \",\"config\":\"\"},{\"id\":\"vi_templatejg52ksbp\",\"name\":\"Correlationbwd (HH400)\",\"group\":\"HHT2,HHT3\",\"info\":\"📥 [4, 3], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatejfb2qshf\",\"name\":\"Correlationfwd  (HH400)\",\"group\":\"HHT2,HHT3\",\"info\":\"📥 [3, 4], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatek0e3lgeo\",\"name\":\"DL1-6  (quTAG)\",\"group\":\"quTAG\",\"info\":\"📥 [1], 📤 [6] \",\"config\":\"\"},{\"id\":\"vi_templatek0e3lz43\",\"name\":\"DL2-7 (quTAG)\",\"group\":\"quTAG\",\"info\":\"📥 [2], 📤 [7] \",\"config\":\"\"},{\"id\":\"vi_templatek0e3qybt\",\"name\":\"Correlationbwd (quTAG)\",\"group\":\"quTAG\",\"info\":\"📥 [7, 6], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatek0e3sowi\",\"name\":\"Correlationfwd (quTAG)\",\"group\":\"quTAG\",\"info\":\"📥 [6, 7], 📤 [] \",\"config\":\"\"}]","var_templatejgmgopco":null,"dpp_templatejgqnmykj":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\nbinsize=int(float(binsize))\r\npath = Path(file)\r\ndatafolder='analyzed data'\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path]\r\n\r\nfor f in selector:\r\n cutfile = eta.simple_cut(f,4)\r\n result=eta.run(cutfile, group='HHT3')\r\n t1=result[\"h3\"]\r\n t2=result[\"h4\"] \r\n fullhist=np.concatenate((np.flip(t2, 0), t1), axis=0)\r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_correlation' + '.txt'), np.transpose([np.arange(-t2.size,t1.size)*binsize,fullhist]))\r\n eta.send(str(f.name) + ' has been successfully processed')\r\neta.send('FINISHED')\r\n\r\n","dpp_templatejgs1c21d":"#------IMPORTS-----\r\nfrom pathlib import Path\r\n\r\nimport numpy as np\r\nimport pandas as pd\r\n\r\nimport matplotlib.pyplot as plt\r\n\r\ndef get_files(extensions):\r\n global path, datafolder\r\n path=path.joinpath(datafolder)\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\nanalyze_timewindow = bool(analyze_timewindow)\r\n\r\n#------ETA PROCESSING-----\r\ndatafolder='analyzed data'\r\ngraphsfolder='graphs'\r\npath = Path(file)\r\n\r\nif path.is_dir():\r\n selector = get_files(('*.txt',))\r\nelse:\r\n if path.suffix == '.txt':\r\n selector = [path]\r\n else:\r\n selector = [path.parent.joinpath(datafolder, path.stem + '_correlation' + '.txt')]\r\n\r\nfor f in selector:\r\n list_of_title=f.stem.split('_')\r\n\r\n data=pd.read_table(f, header=None, names=['ps', 'cnts'], sep=' ')\r\n data.set_index('ps', inplace=True)\r\n data = data['cnts']\r\n \r\n numberofsidepeaks = 8 # must be even\r\n bin=16\r\n shift = 0\r\n widthofdata = 120000 #how the data is going to be cut. Allow enough ps to accomodate the numberofsidepeaks\r\n leftend = int(-widthofdata/2+shift)\r\n rightend = int(widthofdata/2+shift)\r\n lessthanrep = 12300 #less than the laser repetition rate in ps\r\n \r\n reprate = int(((data.loc[rightend-lessthanrep:rightend].idxmax()-data.loc[leftend:leftend+lessthanrep].idxmax())/int(numberofsidepeaks)))\r\n \r\n g2vsdT = pd.DataFrame()\r\n for window in range(bin, lessthanrep, bin):\r\n peaks = np.array([])\r\n \r\n for x in range(int(data.loc[leftend:leftend+reprate].idxmax()), rightend, reprate):\r\n temp0=data.loc[x-window/2:x+window/2].sum()\r\n peaks=np.append([peaks], [temp0])\r\n \r\n center = peaks[int(numberofsidepeaks/2)]\r\n average = np.mean([peaks[:int(numberofsidepeaks/2)], peaks[1+int(numberofsidepeaks/2):]])\r\n average_err = (np.sqrt(np.sum([peaks[:int(numberofsidepeaks/2)], peaks[1+int(numberofsidepeaks/2):]]))/int(numberofsidepeaks))\r\n g2 = center/average\r\n g2_err = np.sqrt(center/(average**2)+(average_err**2)*(peaks[int(numberofsidepeaks/2)]**2)/average**4)\r\n \r\n if window == 1600:\r\n print('Time window: '+str(window)+' ps'+'\\n'+'average counts per peak: '+str(average) + ' pm ' + str(average_err) + '\\n' + 'g2: '+ str(g2)+ ' pm ' + str(g2_err)+'\\n'+'center peak delay: ' + str(reprate*(numberofsidepeaks/2)+data.loc[leftend:leftend+lessthanrep].idxmax())+' ps' +'\\n'+'pulse delay: '+str(reprate)+' ps')\r\n center_peak_delay = reprate*(numberofsidepeaks/2)+data.loc[leftend:leftend+lessthanrep].idxmax()\r\n good_average = average\r\n good_average_err = average_err\r\n good_g2 = g2\r\n good_g2_err = g2_err\r\n temp1 = pd.DataFrame([[window, g2, g2_err]], columns=['Time Window', 'g(2)', 'delta g(2)'])\r\n g2vsdT = pd.concat([g2vsdT, temp1], ignore_index=True)\r\n \r\n \r\n g2vsdT.set_index('Time Window', inplace=True)\r\n g2vsdT = pd.concat([g2vsdT, g2vsdT['g(2)']+g2vsdT['delta g(2)'], g2vsdT['g(2)']-g2vsdT['delta g(2)']], axis=1)\r\n g2vsdT.rename(columns={0:'err+', 1:'err-'}, inplace=True)\r\n \r\n title='average counts per peak: '+str(int(good_average)) + r' $\\pm$ ' + str(int(good_average_err)) + '\\n' + 'g2: '+ \"{0:.6f}\".format(good_g2) + r' $\\pm$ ' + \"{0:.6f}\".format(good_g2_err)\r\n data = data.loc[leftend:rightend]\r\n p1 = plt.bar(data.index,data, width=bin, color='salmon', log=True)\r\n\r\n plt.ylabel('correlation events')\r\n plt.xlabel('time (ps)')\r\n plt.title(title)\r\n f.parent.parent.joinpath(graphsfolder).mkdir(parents=True, exist_ok=True)\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_analyzed' + '.eps'), format='eps', dpi=1200)\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_analyzed' + '.png'), format='png', dpi=1200)\r\n plt.clf()\r\n \r\n if analyze_timewindow == True:\r\n plt.plot(g2vsdT.index, g2vsdT['g(2)'], 'b')\r\n plt.fill_between(g2vsdT.index, g2vsdT['err+'], g2vsdT['err-'], color='b', alpha=0.2)\r\n plt.ylabel('g2(0)')\r\n plt.xlabel('analysis window (ps)')\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_windows' + '.eps'), format='eps', dpi=1200)\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_windows' + '.png'), format='png', dpi=1200)\r\n plt.clf()","dpp_templatejgs3h609":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\n\r\ndef get_files(extensions):\r\n global path, datafolder\r\n path=path.joinpath(datafolder)\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\ngraphsfolder='graphs'\r\ndatafolder='analyzed data'\r\npath = Path(file)\r\n\r\nif path.is_dir():\r\n selector = get_files(('*.txt',))\r\nelse:\r\n if path.suffix == '.txt':\r\n selector = [path]\r\n else:\r\n selector = [path.parent.joinpath(datafolder, path.stem + '_correlation' + '.txt')]\r\n\r\nplotsize_x=int(plotsize_x)\r\nbinsize=int(float(binsize))\r\n\r\nfor f in selector:\r\n print(f.stem)\r\n data=np.loadtxt(f)\r\n read_bins=len(np.transpose(data)[0])\r\n p1 = plt.bar(data[int((read_bins-plotsize_x/binsize)/2):int((read_bins+plotsize_x/binsize)/2),0], data[int((read_bins-plotsize_x/binsize)/2):int((read_bins+plotsize_x/binsize)/2),1],width=binsize, color='#0088ff')\r\n plt.ylabel('events')\r\n plt.xlabel('time (ps)')\r\n f.parent.parent.joinpath(graphsfolder).mkdir(parents=True, exist_ok=True)\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_inset' + '.eps'), format='eps', dpi=1200)\r\n plt.savefig(f.parent.parent.joinpath(graphsfolder, f.stem + '_inset' + '.png'), format='png', dpi=1200)\r\n plt.clf()\r\n eta.send(f.name + ' has been successfully plotted')","var_templatejkim8l39":null,"var_templatejkim8rzm":null,"var_templatejkim8w21":null,"var_templatejkim95ub":null,"var_templatejrvu8s5g":null,"ri_templatek0e3jjea":null,"vi_templatek0e3lgeo":"{\"nodes\":[{\"x\":121,\"y\":114,\"fixed\":true,\"text\":\"a\",\"initial\":true,\"px\":121,\"py\":114}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"1\"}],\"usercode\":\"a:\\n emit(6,0)\"}","vi_templatek0e3lz43":"{\"nodes\":[{\"x\":89,\"y\":107,\"fixed\":true,\"initial\":true,\"text\":\"a\"}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"2\"}],\"usercode\":\"a:\\n emit(7,0)\"}","vi_templatek0e3qybt":"{\"nodes\":[{\"x\":346,\"y\":111,\"fixed\":true,\"text\":\"start\",\"px\":346,\"py\":111},{\"x\":75,\"y\":86,\"fixed\":true,\"text\":\"stop\",\"px\":75,\"py\":86,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"7\"},{\"source\":1,\"target\":0,\"text\":\"6\"},{\"source\":0,\"target\":0,\"text\":\"6\"},{\"source\":1,\"target\":1,\"text\":\"7\"}],\"usercode\":\"HISTOGRAM(h3,(`bins`,`binsize`))\\nCLOCK(c3,100,1)\\nstart:\\n c3.start()\\nstop:\\n c3.stop()\\n h3.record_all(c3)\"}","vi_templatek0e3sowi":"{\"nodes\":[{\"x\":346,\"y\":111,\"fixed\":true,\"text\":\"start\",\"px\":346,\"py\":111},{\"x\":76,\"y\":88,\"fixed\":true,\"text\":\"stop\",\"px\":76,\"py\":88,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"6\"},{\"source\":1,\"target\":0,\"text\":\"7\"},{\"source\":0,\"target\":0,\"text\":\"7\"},{\"source\":1,\"target\":1,\"text\":\"6\"}],\"usercode\":\"HISTOGRAM(h4,(`bins`,`binsize`))\\nCLOCK(c4,100,1)\\nstart:\\n c4.start()\\nstop:\\n c4.stop()\\n h4.record_all(c4)\"}","vi_templatek0e44hsk":"{\"nodes\":[{\"x\":82,\"y\":88,\"fixed\":true,\"text\":\"a\",\"px\":82,\"py\":88,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"1\"}],\"usercode\":\"a:\\n emit(3,0)# here, ch0 is duplicated to ch2 with a delay of 0ps\"}","vi_templatek0e44v54":"{\"nodes\":[{\"x\":101,\"y\":101,\"fixed\":true,\"text\":\"a\",\"px\":101,\"py\":101,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"2\"}],\"usercode\":\"a:\\n emit(4,0)# here, ch1 is duplicated to ch3 with a delay of 0ps\"}","dpp_templatek0e4fe69":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n#------ETA PROCESSING-----\r\n\r\ncut=eta.simple_cut(Path(file), 4)\r\nresult= eta.run(cut, group='HHT3')\r\nhist1=result[\"h3\"]\r\nhist2=result[\"h4\"]\r\n\r\nfullhist=np.concatenate((np.flip(hist2, 0), hist1), axis=0)\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n dcc.Graph(\r\n id='example-ss',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(-hist2.size,hist1.size)*int(float(binsize)), \r\n 'y': fullhist,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': 'Start Stop Measurement',\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ps)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","dpp_templatek0e4feyu":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n#------ETA PROCESSING-----\r\n\r\ncut=eta.simple_cut(Path(file), 4)\r\nresult= eta.run(cut, group='quTAG')\r\nhist1=result[\"h3\"]\r\nhist2=result[\"h4\"]\r\n\r\nfullhist=np.concatenate((np.flip(hist2, 0), hist1), axis=0)\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n dcc.Graph(\r\n id='example-ss',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(-hist2.size,hist1.size)*int(float(binsize)), \r\n 'y': fullhist,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': 'Start Stop Measurement',\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ps)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","dpp_templatek0e4ffk5":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\nbinsize=int(float(binsize))\r\npath = Path(file)\r\ndatafolder='analyzed data'\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path]\r\n\r\nfor f in selector:\r\n cutfile = eta.simple_cut(f,4)\r\n result=eta.run(cutfile, group='HHT2')\r\n t1=result[\"h3\"]\r\n t2=result[\"h4\"] \r\n fullhist=np.concatenate((np.flip(t2, 0), t1), axis=0)\r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_correlation' + '.txt'), np.transpose([np.arange(-t2.size,t1.size)*binsize,fullhist]))\r\n eta.send(str(f.name) + ' has been successfully processed')\r\neta.send('FINISHED')\r\n\r\n","dpp_templatek0e4ffxo":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\nbinsize=int(float(binsize))\r\npath = Path(file)\r\ndatafolder='analyzed data'\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path]\r\n\r\nfor f in selector:\r\n cutfile = eta.simple_cut(f,4)\r\n result=eta.run(cutfile, group='quTAG')\r\n t1=result[\"h3\"]\r\n t2=result[\"h4\"] \r\n fullhist=np.concatenate((np.flip(t2, 0), t1), axis=0)\r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_correlation' + '.txt'), np.transpose([np.arange(-t2.size,t1.size)*binsize,fullhist]))\r\n eta.send(str(f.name) + ' has been successfully processed')\r\neta.send('FINISHED')\r\n\r\n"} \ No newline at end of file diff --git a/gui/src/renderer/js/recipes/Countrate.eta b/gui/src/renderer/js/recipes/Countrate.eta index 712c11c..1c7170d 100644 --- a/gui/src/renderer/js/recipes/Countrate.eta +++ b/gui/src/renderer/js/recipes/Countrate.eta @@ -1 +1 @@ -{"vi_templatejg7rpkiv":"{\"nodes\":[{\"x\":114,\"y\":140,\"fixed\":true,\"text\":\"a\",\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"0,1\"}],\"usercode\":\"HISTOGRAM(h1,(`bins`, `binsize`))\\nHISTOGRAM(h2,(`bins`, `binsize`))\\nCLOCK(c1)\\nCLOCK(c2)\\na--0-->a:\\n c1.stop()\\n h1.record(c1)\\na--1-->a:\\n c2.stop()\\n h2.record(c2)\"}","dpp_template_code":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\nbinsize=int(binsize)\r\npath = Path(file)\r\ndatafolder='analyzed data'\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path]\r\n\r\nfor f in selector:\r\n cutfile = eta.simple_cut(f)\r\n result=eta.run(cutfile, group='compile')\r\n t1=result[\"h1\"]\r\n t2=result[\"h2\"]\r\n #hist1=np.sum(t1.reshape(-1, int(rebinsize)), axis=1) # apply extra binning (2343)\r\n #hist2=np.sum(t2.reshape(-1, int(rebinsize)), axis=1)\r\n \r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_countrate' + '.txt'), np.transpose([np.arange(t1.size)/3600,t1,t2]))\r\n eta.send(str(f.name) + ' has been successfully processed')\r\neta.send('FINISHED')","eta_index_table":"[{\"id\":\"var_templatejkimp1dz\",\"name\":\"file\",\"group\":\"compile\",\"info\":\"\",\"config\":\"C:/YourFolder/YourFile.timetag\"},{\"id\":\"var_templatejkimp6ts\",\"name\":\"binsize\",\"group\":\"compile\",\"info\":\"\",\"config\":\"1000000000000\"},{\"id\":\"var_templatejkimp49t\",\"name\":\"bins\",\"group\":\"compile\",\"info\":\"\",\"config\":\"14400\"},{\"id\":\"var_templatejkimq3l9\",\"name\":\"rebinsize\",\"group\":\"compile\",\"info\":\"\",\"config\":\"1\"},{\"id\":\"dpp_templatejgmfaujq\",\"name\":\"plotly\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejgmfdvub\",\"name\":\"bokeh\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_template_code\",\"name\":\"txt_saver\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejgxmbufn\",\"name\":\"graph_saver\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"ri_templatejkimu3sj\",\"name\":\"Time Tagger\",\"group\":\"compile\",\"info\":\"📤 [0, 1]\",\"config\":\"[2,0]\"},{\"id\":\"vi_templatejg7rpkiv\",\"name\":\"countrate\",\"group\":\"compile\",\"info\":\"📥 [0, 1], 📤 [] \",\"config\":\"\"}]","dpp_templatejgmfaujq":"#------IMPORTS-----\r\nimport numpy as np\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n\r\n#------ETA PROCESSING-----\r\ncut=eta.simple_cut(file)\r\nresult= eta.run(cut, group='compile')\r\nbinsize=int(binsize)\r\nhist1=np.sum(result[\"h1\"].reshape(-1, int(rebinsize)), axis=1) # apply extra binning\r\nhist2=np.sum(result[\"h2\"].reshape(-1, int(rebinsize)), axis=1)\r\n\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n html.H1(children=file),\r\n dcc.Graph(\r\n id='countrate',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(hist1.size)/3600, \r\n 'y': hist1,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n {\r\n 'x': np.arange(hist2.size)/3600, \r\n 'y': hist2,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#ca0020'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': file,\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ps)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","dpp_templatejgmfdvub":"#------IMPORTS-----\r\nimport numpy as np\r\nresult = eta.run(file)\r\nt1= result[\"h1\"]\r\nt2=result[\"h2\"]\r\nbinsize=int(binsize) # accept bin size variable from left panel\r\nhist1=np.sum(t1.reshape(-1, int(rebinsize)), axis=1) # apply extra binning (2343)\r\nhist2=np.sum(t2.reshape(-1, int(rebinsize)), axis=1)\r\ndef modify_doc(doc):\r\n global hist1, hist2\r\n from bokeh.layouts import column\r\n from bokeh.models import ColumnDataSource, Slider\r\n from bokeh.plotting import figure\r\n from bokeh.server.server import Server\r\n from bokeh.themes import Theme\r\n import numpy as np\r\n\r\n p1 = figure(title=\"Powermeter mode\",\r\n background_fill_color=\"white\")\r\n p1.line(np.arange(hist1.size), hist1, line_color=\"black\", line_width=2, alpha=0.7, legend=\"CDF\")\r\n \r\n def callback(attr, old, new):\r\n print(\"callback called\")\r\n\r\n slider = Slider(start=0, end=30, value=0, step=1, title=\"Smoothing by N Days\")\r\n slider.on_change('value', callback)\r\n\r\n doc.add_root(column(slider, p1))\r\n\r\neta.display(modify_doc)\r\n","dpp_templatejgxmbufn":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\nbinsize=int(binsize)\r\npath = Path(file)\r\ngraphsfolder='graphs'\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path]\r\n\r\nfor f in selector:\r\n cutfile = eta.simple_cut(f)\r\n result=eta.run(cutfile, group='compile')\r\n t1=result[\"h1\"]\r\n t2=result[\"h2\"]\r\n #hist1=np.sum(t1.reshape(-1, int(rebinsize)), axis=1) # apply extra binning (2343)\r\n #hist2=np.sum(t2.reshape(-1, int(rebinsize)), axis=1)\r\n \r\n x = np.arange(t1.size)/3600 #display in h\r\n \r\n p1 = plt.bar(x,t1, width=1/3600, color='crimson')\r\n p2 = plt.bar(x,t2, width=1/3600, bottom= t1, color='navy')\r\n \r\n plt.ylabel('photon events')\r\n plt.xlabel('time (h)')\r\n \r\n \r\n list_of_title=str(f.stem).split('_')[:-1]\r\n title=' '.join(list_of_title)\r\n plt.title(title)\r\n \r\n f.parent.joinpath(graphsfolder).mkdir(parents=True, exist_ok=True)\r\n plt.savefig(f.parent.joinpath(graphsfolder, f.stem + '_countrate' + '.eps'), format='eps', dpi=1200)\r\n plt.savefig(f.parent.joinpath(graphsfolder, f.stem + '_countrate' + '.png'), format='png', dpi=1200)\r\n \r\n plt.clf()\r\n \r\n eta.send(str(f.name) + ' has been successfully processed')\r\neta.send('FINISHED')","var_templatejkimp1dz":null,"var_templatejkimp49t":null,"var_templatejkimp6ts":null,"var_templatejkimq3l9":null,"ri_templatejkimu3sj":null} \ No newline at end of file +{"vi_templatejg7rpkiv":"{\"nodes\":[{\"x\":114,\"y\":140,\"fixed\":true,\"text\":\"a\",\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"0,1\"}],\"usercode\":\"HISTOGRAM(h1,(`bins`, `binsize`))\\nHISTOGRAM(h2,(`bins`, `binsize`))\\nCLOCK(c1)\\nCLOCK(c2)\\na--0-->a:\\n c1.stop()\\n h1.record(c1)\\na--1-->a:\\n c2.stop()\\n h2.record(c2)\"}","dpp_template_code":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\nbinsize=int(float(binsize))\r\npath = Path(file)\r\ndatafolder='analyzed data'\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path]\r\n\r\nfor f in selector:\r\n cutfile = eta.simple_cut(f)\r\n result=eta.run(cutfile, group='compile')\r\n t1=result[\"h1\"]\r\n t2=result[\"h2\"]\r\n #hist1=np.sum(t1.reshape(-1, int(float(rebinsize))), axis=1) # apply extra binning (2343)\r\n #hist2=np.sum(t2.reshape(-1, int(float(rebinsize))), axis=1)\r\n \r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_countrate' + '.txt'), np.transpose([np.arange(t1.size)/3600,t1,t2]))\r\n eta.send(str(f.name) + ' has been successfully processed')\r\neta.send('FINISHED')","eta_index_table":"[{\"id\":\"var_templatejkimp1dz\",\"name\":\"file\",\"group\":\"compile\",\"info\":\"\",\"config\":\"C:/YourFolder/YourFile.timetag\"},{\"id\":\"var_templatejkimp6ts\",\"name\":\"binsize\",\"group\":\"compile\",\"info\":\"\",\"config\":\"1e12\"},{\"id\":\"var_templatejkimp49t\",\"name\":\"bins\",\"group\":\"compile\",\"info\":\"\",\"config\":\"14400\"},{\"id\":\"var_templatejkimq3l9\",\"name\":\"rebinsize\",\"group\":\"compile\",\"info\":\"\",\"config\":\"1\"},{\"id\":\"dpp_templatejgmfaujq\",\"name\":\"plotly\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejgmfdvub\",\"name\":\"bokeh\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_template_code\",\"name\":\"txt_saver\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejgxmbufn\",\"name\":\"graph_saver\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"ri_templatejkimu3sj\",\"name\":\"Time Tagger\",\"group\":\"compile\",\"info\":\"📤 [0, 1]\",\"config\":\"[2,0]\"},{\"id\":\"vi_templatejg7rpkiv\",\"name\":\"countrate\",\"group\":\"compile\",\"info\":\"📥 [0, 1], 📤 [] \",\"config\":\"\"}]","dpp_templatejgmfaujq":"#------IMPORTS-----\r\nimport numpy as np\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n\r\n#------ETA PROCESSING-----\r\ncut=eta.simple_cut(file)\r\nresult= eta.run(cut, group='compile')\r\nbinsize=int(float(binsize))\r\nhist1=np.sum(result[\"h1\"].reshape(-1, int(float(rebinsize))), axis=1) # apply extra binning\r\nhist2=np.sum(result[\"h2\"].reshape(-1, int(float(rebinsize))), axis=1)\r\n\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n html.H1(children=file),\r\n dcc.Graph(\r\n id='countrate',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(hist1.size)/3600, \r\n 'y': hist1,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n {\r\n 'x': np.arange(hist2.size)/3600, \r\n 'y': hist2,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#ca0020'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': file,\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ps)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","dpp_templatejgmfdvub":"#------IMPORTS-----\r\nimport numpy as np\r\nresult = eta.run(file)\r\nt1= result[\"h1\"]\r\nt2=result[\"h2\"]\r\nbinsize=int(float(binsize)) # accept bin size variable from left panel\r\nhist1=np.sum(t1.reshape(-1, int(float(rebinsize))), axis=1) # apply extra binning (2343)\r\nhist2=np.sum(t2.reshape(-1, int(float(rebinsize))), axis=1)\r\ndef modify_doc(doc):\r\n global hist1, hist2\r\n from bokeh.layouts import column\r\n from bokeh.models import ColumnDataSource, Slider\r\n from bokeh.plotting import figure\r\n from bokeh.server.server import Server\r\n from bokeh.themes import Theme\r\n import numpy as np\r\n\r\n p1 = figure(title=\"Powermeter mode\",\r\n background_fill_color=\"white\")\r\n p1.line(np.arange(hist1.size), hist1, line_color=\"black\", line_width=2, alpha=0.7, legend=\"CDF\")\r\n \r\n def callback(attr, old, new):\r\n print(\"callback called\")\r\n\r\n slider = Slider(start=0, end=30, value=0, step=1, title=\"Smoothing by N Days\")\r\n slider.on_change('value', callback)\r\n\r\n doc.add_root(column(slider, p1))\r\n\r\neta.display(modify_doc)\r\n","dpp_templatejgxmbufn":"#------IMPORTS-----\r\nfrom pathlib import Path\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n\r\n#------ETA PROCESSING-----\r\nbinsize=int(float(binsize))\r\npath = Path(file)\r\ngraphsfolder='graphs'\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path]\r\n\r\nfor f in selector:\r\n cutfile = eta.simple_cut(f)\r\n result=eta.run(cutfile, group='compile')\r\n t1=result[\"h1\"]\r\n t2=result[\"h2\"]\r\n #hist1=np.sum(t1.reshape(-1, int(float(rebinsize))), axis=1) # apply extra binning (2343)\r\n #hist2=np.sum(t2.reshape(-1, int(float(rebinsize))), axis=1)\r\n \r\n x = np.arange(t1.size)/3600 #display in h\r\n \r\n p1 = plt.bar(x,t1, width=1/3600, color='crimson')\r\n p2 = plt.bar(x,t2, width=1/3600, bottom= t1, color='navy')\r\n \r\n plt.ylabel('photon events')\r\n plt.xlabel('time (h)')\r\n \r\n \r\n list_of_title=str(f.stem).split('_')[:-1]\r\n title=' '.join(list_of_title)\r\n plt.title(title)\r\n \r\n f.parent.joinpath(graphsfolder).mkdir(parents=True, exist_ok=True)\r\n plt.savefig(f.parent.joinpath(graphsfolder, f.stem + '_countrate' + '.eps'), format='eps', dpi=1200)\r\n plt.savefig(f.parent.joinpath(graphsfolder, f.stem + '_countrate' + '.png'), format='png', dpi=1200)\r\n \r\n plt.clf()\r\n \r\n eta.send(str(f.name) + ' has been successfully processed')\r\neta.send('FINISHED')","var_templatejkimp1dz":null,"var_templatejkimp49t":null,"var_templatejkimp6ts":null,"var_templatejkimq3l9":null,"ri_templatejkimu3sj":null} \ No newline at end of file diff --git a/gui/src/renderer/js/recipes/Lifetime.eta b/gui/src/renderer/js/recipes/Lifetime.eta index c62e75c..7a7a655 100644 --- a/gui/src/renderer/js/recipes/Lifetime.eta +++ b/gui/src/renderer/js/recipes/Lifetime.eta @@ -1 +1 @@ -{"vi_templatejevjreof":"{\"nodes\":[{\"x\":232,\"y\":105,\"fixed\":true,\"initial\":true,\"text\":\"state\",\"marked\":true,\"px\":232,\"py\":105}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"2\"}],\"usercode\":\"CLOCK(c1)\\nHISTOGRAM(t1,(`bins`,`binsize`))\\n\\nstate--2-->state:\\n c1.stop()\\n c1.start(LAST_SYNC)\\n t1.record(c1)\\n\"}","dpp_template_code":"#------IMPORTS-----\r\nimport numpy as np\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n\r\n#------ETA PROCESSING-----\r\ncutfile = eta.simple_cut(file,4)\r\nresult = eta.run(cutfile, group='compile')\r\nh1=result[\"t1\"]\r\n#h1=np.loadtxt(\"h1.tensor\") #use this line instead of the previous 3 lines (ETA PROCESSING) if you want to load a reviously saved file for plotting\r\n#np.savetxt(\"h1.tensor\",h1) #use this line instead of plotting if you want to save the analysis result to a file\r\n\r\n\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n html.H1(children=expname),\r\n dcc.Graph(\r\n id='example-ss',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(h1.size)*int(binsize), \r\n 'y': h1,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': 'Start Stop Measurement',\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ps)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","eta_index_table":"[{\"id\":\"var_templatejkim3bkj\",\"name\":\"file\",\"group\":\"compile\",\"info\":\"\",\"config\":\"C:/YourFolder/YourFile.timetag\"},{\"id\":\"var_templatejkim48wp\",\"name\":\"binsize\",\"group\":\"compile\",\"info\":\"\",\"config\":\"16\"},{\"id\":\"var_templatejkim2z6x\",\"name\":\"bins\",\"group\":\"compile\",\"info\":\"\",\"config\":\"780\"},{\"id\":\"var_templatejkim6uch\",\"name\":\"expname\",\"group\":\"compile\",\"info\":\"\",\"config\":\"simple lifetime\"},{\"id\":\"var_templatejks89alb\",\"name\":\"ch_sel\",\"group\":\"compile\",\"info\":\"\",\"config\":\"t1\"},{\"id\":\"dpp_template_code\",\"name\":\"plotly\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejlxgwwaf\",\"name\":\"pyplot\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejhj7imob\",\"name\":\"txt+graph\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"ri_templatejkim223k\",\"name\":\"Time Tagger\",\"group\":\"compile\",\"info\":\"📤 [0, 1]\",\"config\":\"[2,0]\"},{\"id\":\"vi_templatejks7yt8a\",\"name\":\"delay0-2\",\"group\":\"compile\",\"info\":\"📥 [0], 📤 [2] \",\"config\":\"\"},{\"id\":\"vi_templatejhrlupxy\",\"name\":\"delay1-3\",\"group\":\"compile\",\"info\":\"📥 [1], 📤 [3] \",\"config\":\"\"},{\"id\":\"vi_templatejevjreof\",\"name\":\"lifetime (start=SYNC, stop=ch2)[t1]\",\"group\":\"compile\",\"info\":\"📥 [2], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatejks7tmye\",\"name\":\"lifetime (start=SYNC, stop=ch3)[t2]\",\"group\":\"compile\",\"info\":\"📥 [3], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatejhrlp8yt\",\"name\":\"lifetime (start=ch2, stop=ch3)[t3]\",\"group\":\"compile\",\"info\":\"📥 [2, 3], 📤 [] \",\"config\":\"\"}]","dpp_templatejhj7imob":"#------IMPORTS-----\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nfrom pylab import figure, cm\r\nfrom matplotlib.colors import LogNorm\r\nfrom pathlib import Path\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n \r\nbinsize = int(binsize)\r\nbins = int(bins)\r\n\r\n#------ETA PROCESSING-----\r\n\r\ndatafolder='analyzed data'\r\ngraphsfolder='graphs'\r\npath = Path(file)\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path.resolve()]\r\n\r\nfor f in selector:\r\n eta.send('Working on ' + str(f.name))\r\n cutfile = eta.simple_cut(f,4)\r\n result = eta.run(cutfile, group='compile')\r\n h1=result[ch_sel]\r\n \r\n #------PLOTTING-----\r\n \r\n xvalues = np.arange(0,bins*binsize,binsize)\r\n yvalues = h1\r\n \r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_lifetime' + '.txt'), np.transpose([xvalues,yvalues]))\r\n \r\n p1 = plt.bar(xvalues, yvalues, width=binsize, color='#0088ff')\r\n \r\n plt.ylabel('events')\r\n plt.xlabel('time (ps)')\r\n #plt.show()\r\n f.parent.joinpath(graphsfolder).mkdir(parents=True, exist_ok=True)\r\n plt.savefig(f.parent.joinpath(graphsfolder, f.stem + '_lifetime' + '.png'), format = 'png', dpi=1200)\r\n plt.savefig(f.parent.joinpath(graphsfolder, f.stem + '_lifetime' + '.eps'), format = 'eps', dpi=1200)\r\n plt.clf()\r\n eta.send(str(f.name) + ' has been successfully processed')\r\n\r\neta.send('FINISHED')","vi_templatejhrlp8yt":"{\"nodes\":[{\"x\":145,\"y\":157,\"fixed\":true,\"initial\":true,\"text\":\"stopped\",\"marked\":true},{\"x\":366,\"y\":174,\"fixed\":true,\"text\":\"started\",\"marked\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"2\"},{\"source\":1,\"target\":0,\"text\":\"3\"},{\"source\":1,\"target\":1,\"text\":\"2\"}],\"usercode\":\"CLOCK(c3)\\nHISTOGRAM(t3,(`bins`,`binsize`))\\n\\nstarted:\\n c3.start()\\nstopped:\\n c3.stop()\\n t3.record(c3)\"}","vi_templatejhrlupxy":"{\"nodes\":[{\"x\":141,\"y\":129,\"fixed\":true,\"initial\":true,\"text\":\"a\"}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"1\"}],\"usercode\":\"a:\\n emit(3,0)# here, ch1 is duplicated to ch3 with a delay of 0ps\"}","ri_templatejkim223k":null,"var_templatejkim2z6x":null,"var_templatejkim3bkj":null,"var_templatejkim48wp":null,"var_templatejkim6uch":null,"vi_templatejks7tmye":"{\"nodes\":[{\"x\":224,\"y\":115,\"fixed\":true,\"initial\":true,\"text\":\"state\",\"marked\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"3\"}],\"usercode\":\"CLOCK(c2)\\nHISTOGRAM(t2,(`bins`,`binsize`))\\n\\nstate--3-->state:\\n c2.stop()\\n c2.start(LAST_SYNC)\\n t2.record(c2)\\n\"}","vi_templatejks7yt8a":"{\"nodes\":[{\"x\":141,\"y\":129,\"fixed\":true,\"initial\":true,\"text\":\"a\"}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"0\"}],\"usercode\":\"a:\\n emit(2,0)# here, ch0 is duplicated to ch2 with a delay of 0ps\"}","var_templatejks89alb":null,"dpp_templatejlxgwwaf":"#------IMPORTS-----\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nfrom matplotlib.widgets import Button\r\n\r\n#------ETA PROCESSING-----\r\ncutfile = eta.simple_cut(file,4)\r\nresult = eta.run(cutfile, group='compile')\r\nh1=result[ch_sel]\r\n#h1=np.loadtxt(\"C:\\PathToFile\\result.txt\") #use this line instead of the previous 3 lines (ETA PROCESSING) if you want to load a reviously saved file for plotting\r\n#np.savetxt(\"C:\\PathToFile\\result.txt\",h1) #use this line instead of plotting if you want to save the analysis result to a file\r\n\r\n#------PLOTTING-----\r\nbinsize=int(binsize)\r\n\r\n\r\nplt.close(fig='all')\r\nfig, ax = plt.subplots()\r\nplt.subplots_adjust(bottom=0.2)\r\nax.set_xlabel('Time delay (ps)')\r\nax.set_ylabel('Histogram events')\r\nax.set_title(expname)\r\n\r\nl = ax.bar(np.arange(len(h1))*binsize, h1, binsize, yerr=np.sqrt(h1))\r\nlog=False\r\n\r\nclass Index(object):\r\n def linlog(self, event):\r\n global ax, plt, log\r\n if log==True:\r\n ax.set_yscale(\"linear\")\r\n log=False\r\n else:\r\n ax.set_yscale(\"log\", nonposy='clip')\r\n log=True\r\n plt.draw()\r\n\r\ncallback = Index()\r\naxlinlog = plt.axes([0.81, 0.05, 0.1, 0.075])\r\nblinlog = Button(axlinlog, 'Lin/Log')\r\nblinlog.on_clicked(callback.linlog)\r\n\r\nplt.show()"} \ No newline at end of file +{"vi_templatejevjreof":"{\"nodes\":[{\"x\":232,\"y\":105,\"fixed\":true,\"initial\":true,\"text\":\"state\",\"marked\":true,\"px\":232,\"py\":105}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"2\"}],\"usercode\":\"CLOCK(c1)\\nHISTOGRAM(t1,(`bins`,`binsize`))\\n\\nstate--2-->state:\\n c1.stop()\\n c1.start(LAST_SYNC)\\n t1.record(c1)\\n\"}","dpp_template_code":"#------IMPORTS-----\r\nimport numpy as np\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n\r\n#------ETA PROCESSING-----\r\ncutfile = eta.simple_cut(file,4)\r\nresult = eta.run(cutfile, group='compile')\r\nh1=result[\"t1\"]\r\n#h1=np.loadtxt(\"h1.tensor\") #use this line instead of the previous 3 lines (ETA PROCESSING) if you want to load a reviously saved file for plotting\r\n#np.savetxt(\"h1.tensor\",h1) #use this line instead of plotting if you want to save the analysis result to a file\r\n\r\n\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n html.H1(children=expname),\r\n dcc.Graph(\r\n id='example-ss',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(h1.size)*int(float(binsize)), \r\n 'y': h1,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': 'Start Stop Measurement',\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ps)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","eta_index_table":"[{\"id\":\"var_templatejkim3bkj\",\"name\":\"file\",\"group\":\"compile\",\"info\":\"\",\"config\":\"K:/Shared/Joint Projects/1st Lukas visit/data/QD1 Goldjunge/g2/181112_QD1_g2_T3_X_RF_1pi_withWL_slit38_TS_003.timeres\"},{\"id\":\"var_templatejkim48wp\",\"name\":\"binsize\",\"group\":\"compile\",\"info\":\"\",\"config\":\"16\"},{\"id\":\"var_templatejkim2z6x\",\"name\":\"bins\",\"group\":\"compile\",\"info\":\"\",\"config\":\"780\"},{\"id\":\"var_templatejkim6uch\",\"name\":\"expname\",\"group\":\"compile\",\"info\":\"\",\"config\":\"simple lifetime\"},{\"id\":\"var_templatejks89alb\",\"name\":\"ch_sel\",\"group\":\"compile\",\"info\":\"\",\"config\":\"t1\"},{\"id\":\"var_templatek1wj6afv\",\"name\":\"records_per_cut\",\"group\":\"compile\",\"info\":\"\",\"config\":\"2e5\"},{\"id\":\"dpp_template_code\",\"name\":\"plotly\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejlxgwwaf\",\"name\":\"pyplot\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejhj7imob\",\"name\":\"txt+graph\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatek1wj2rzj\",\"name\":\"realtime\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"ri_templatejkim223k\",\"name\":\"Time Tagger\",\"group\":\"compile\",\"info\":\"📤 [0, 1]\",\"config\":\"[2,0]\"},{\"id\":\"vi_templatejks7yt8a\",\"name\":\"delay0-2\",\"group\":\"compile\",\"info\":\"📥 [0], 📤 [2] \",\"config\":\"\"},{\"id\":\"vi_templatejhrlupxy\",\"name\":\"delay1-3\",\"group\":\"compile\",\"info\":\"📥 [1], 📤 [3] \",\"config\":\"\"},{\"id\":\"vi_templatejevjreof\",\"name\":\"lifetime (start=SYNC, stop=ch2)[t1]\",\"group\":\"compile\",\"info\":\"📥 [2], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatejks7tmye\",\"name\":\"lifetime (start=SYNC, stop=ch3)[t2]\",\"group\":\"compile\",\"info\":\"📥 [3], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatejhrlp8yt\",\"name\":\"lifetime (start=ch2, stop=ch3)[t3]\",\"group\":\"compile\",\"info\":\"📥 [2, 3], 📤 [] \",\"config\":\"\"}]","dpp_templatejhj7imob":"#------IMPORTS-----\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nfrom pylab import figure, cm\r\nfrom matplotlib.colors import LogNorm\r\nfrom pathlib import Path\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n \r\nbinsize = int(float(binsize))\r\nbins = int(float(bins))\r\n\r\n#------ETA PROCESSING-----\r\n\r\ndatafolder='analyzed data'\r\ngraphsfolder='graphs'\r\npath = Path(file)\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path.resolve()]\r\n\r\nfor f in selector:\r\n eta.send('Working on ' + str(f.name))\r\n cutfile = eta.simple_cut(f,4)\r\n result = eta.run(cutfile, group='compile')\r\n h1=result[ch_sel]\r\n \r\n #------PLOTTING-----\r\n \r\n xvalues = np.arange(0,bins*binsize,binsize)\r\n yvalues = h1\r\n \r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_lifetime' + '.txt'), np.transpose([xvalues,yvalues]))\r\n \r\n p1 = plt.bar(xvalues, yvalues, width=binsize, color='#0088ff')\r\n \r\n plt.ylabel('events')\r\n plt.xlabel('time (ps)')\r\n #plt.show()\r\n f.parent.joinpath(graphsfolder).mkdir(parents=True, exist_ok=True)\r\n plt.savefig(f.parent.joinpath(graphsfolder, f.stem + '_lifetime' + '.png'), format = 'png', dpi=1200)\r\n plt.savefig(f.parent.joinpath(graphsfolder, f.stem + '_lifetime' + '.eps'), format = 'eps', dpi=1200)\r\n plt.clf()\r\n eta.send(str(f.name) + ' has been successfully processed')\r\n\r\neta.send('FINISHED')","vi_templatejhrlp8yt":"{\"nodes\":[{\"x\":145,\"y\":157,\"fixed\":true,\"initial\":true,\"text\":\"stopped\",\"marked\":true},{\"x\":366,\"y\":174,\"fixed\":true,\"text\":\"started\",\"marked\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"2\"},{\"source\":1,\"target\":0,\"text\":\"3\"},{\"source\":1,\"target\":1,\"text\":\"2\"}],\"usercode\":\"CLOCK(c3)\\nHISTOGRAM(t3,(`bins`,`binsize`))\\n\\nstarted:\\n c3.start()\\nstopped:\\n c3.stop()\\n t3.record(c3)\"}","vi_templatejhrlupxy":"{\"nodes\":[{\"x\":141,\"y\":129,\"fixed\":true,\"initial\":true,\"text\":\"a\"}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"1\"}],\"usercode\":\"a:\\n emit(3,0)# here, ch1 is duplicated to ch3 with a delay of 0ps\"}","ri_templatejkim223k":null,"var_templatejkim2z6x":null,"var_templatejkim3bkj":null,"var_templatejkim48wp":null,"var_templatejkim6uch":null,"vi_templatejks7tmye":"{\"nodes\":[{\"x\":224,\"y\":115,\"fixed\":true,\"initial\":true,\"text\":\"state\",\"marked\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"3\"}],\"usercode\":\"CLOCK(c2)\\nHISTOGRAM(t2,(`bins`,`binsize`))\\n\\nstate--3-->state:\\n c2.stop()\\n c2.start(LAST_SYNC)\\n t2.record(c2)\\n\"}","vi_templatejks7yt8a":"{\"nodes\":[{\"x\":141,\"y\":129,\"fixed\":true,\"initial\":true,\"text\":\"a\"}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"0\"}],\"usercode\":\"a:\\n emit(2,0)# here, ch0 is duplicated to ch2 with a delay of 0ps\"}","var_templatejks89alb":null,"dpp_templatejlxgwwaf":"#------IMPORTS-----\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nfrom matplotlib.widgets import Button\r\n\r\n#------ETA PROCESSING-----\r\ncutfile = eta.simple_cut(file,4)\r\nresult = eta.run(cutfile, group='compile')\r\nh1=result[ch_sel]\r\n#h1=np.loadtxt(\"C:\\PathToFile\\result.txt\") #use this line instead of the previous 3 lines (ETA PROCESSING) if you want to load a reviously saved file for plotting\r\n#np.savetxt(\"C:\\PathToFile\\result.txt\",h1) #use this line instead of plotting if you want to save the analysis result to a file\r\n\r\n#------PLOTTING-----\r\nbinsize=int(float(binsize))\r\n\r\n\r\nplt.close(fig='all')\r\nfig, ax = plt.subplots()\r\nplt.subplots_adjust(bottom=0.2)\r\nax.set_xlabel('Time delay (ps)')\r\nax.set_ylabel('Histogram events')\r\nax.set_title(expname)\r\n\r\nl = ax.bar(np.arange(len(h1))*binsize, h1, binsize, yerr=np.sqrt(h1))\r\nlog=False\r\n\r\nclass Index(object):\r\n def linlog(self, event):\r\n global ax, plt, log\r\n if log==True:\r\n ax.set_yscale(\"linear\")\r\n log=False\r\n else:\r\n ax.set_yscale(\"log\", nonposy='clip')\r\n log=True\r\n plt.draw()\r\n\r\ncallback = Index()\r\naxlinlog = plt.axes([0.81, 0.05, 0.1, 0.075])\r\nblinlog = Button(axlinlog, 'Lin/Log')\r\nblinlog.on_clicked(callback.linlog)\r\n\r\nplt.show()","dpp_templatek1wj2rzj":"#------IMPORTS-----\r\nfrom os import path\r\nimport pathlib\r\nfrom enum import Enum\r\n\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nimport matplotlib.animation as animation\r\nimport matplotlib.widgets\r\nfrom matplotlib.widgets import Button\r\n\r\neta.send(\"ETA is running in realtime...\", \"running\")\r\n\r\nrecords_per_cut = int(float(records_per_cut)) if records_per_cut != \"\" else None\r\n\r\nSIMULATE_GROWTH = True\r\nDATAFOLDER = 'analyzed data'\r\nLABEL = 'histogram'\r\n\r\nbinsize = int(float(binsize))\r\nbins = int(float(bins))\r\nbin_factor = int(float(binsize))\r\nfile = pathlib.Path(file)\r\n\r\nctx1=None\r\nfig, ax = plt.subplots()\r\nax.set_ylabel('Histogram events')\r\nax.set_xlabel('Time delay (ps)')\r\nax.set_title(expname)\r\n\r\n\r\nclass DataPlot(object):\r\n def __init__(self, fig, ax, file, ch_sel, bin_factor, \r\n records_per_cut=None, interval=100, \r\n numpy=None, widgets=None):\r\n \"\"\" Calculates the next cut and writes it to the plot\r\n ax: Axis to draw on\r\n file: str or Path of file currently investigated\r\n ch_sel: Channel of the histogram to investigate (e.g. t1)\r\n bin_factor: The multiplication factor for each bin.\r\n interval: The interval of the simulation\r\n timeout: How long to wait for enough data until frame is skipped (milliseconds)\r\n \"\"\"\r\n global SIMULATE_GROWTH\r\n \r\n self.file = file\r\n self.ch_sel = ch_sel\r\n self.bin_factor = bin_factor\r\n self.records_per_cut = records_per_cut\r\n \r\n self.fig = fig\r\n self.ax = ax\r\n self.fig.subplots_adjust(bottom=0.22)\r\n \r\n self.line, = self.ax.plot([], [], 'r-')\r\n self.interval = interval\r\n self.numpy = numpy\r\n self.widgets = widgets\r\n \r\n self.set_accumulation_mode()\r\n\r\n # Setup Widgets\r\n axsavedat = self.fig.add_axes([0.59, 0.05, 0.1, 0.075])\r\n axmode = self.fig.add_axes([0.7, 0.05, 0.1, 0.075])\r\n axlinlog = self.fig.add_axes([0.81, 0.05, 0.1, 0.075])\r\n self.bsavedat = widgets.Button(axsavedat, 'Save')\r\n self.blinlog = widgets.Button(axlinlog, 'Lin/Log')\r\n self.bmode = widgets.Button(axmode, 'Mode')\r\n self.bsavedat.on_clicked(self.save_dat)\r\n self.blinlog.on_clicked(self.toggle_scale)\r\n self.bmode.on_clicked(self.toggle_mode)\r\n \r\n # First cut to detect file properties and rate estimation\r\n self.cut = eta.incremental_cut(self.file, cut=None,\r\n rec_per_cut=1,\r\n verbose=False)\r\n \r\n if self.records_per_cut is None:\r\n self.estimate_growth()\r\n\r\n self.waiting = False\r\n self.context = None\r\n \r\n if SIMULATE_GROWTH is False:\r\n file_size = self.file.stat().st_size\r\n file_size = file_size - self.cut[0][0]\r\n existing_records = file_size//self.cut[0][5]\r\n else:\r\n existing_records = self.records_per_cut\r\n\r\n self.cut = eta.incremental_cut(self.file, cut=None, \r\n rec_per_cut=existing_records, verbose=False) # Start always from begining of file\r\n \r\n if not eta.wait_for_data(self.cut, timeout=0.01):\r\n eta.send('Something went wrong, there should be no waiting here.')\r\n \r\n result, self.context = eta.run(self.cut, group='compile',\r\n ctxs=None, sum_results=True, \r\n iterate_ctxs=True, verbose=False)\r\n\r\n self.ydata = result[self.ch_sel]\r\n self.max_value = self.numpy.amax(self.ydata) \r\n self.y_max = self.max_value*1.5\r\n\r\n self.xdata = self.numpy.arange(0, self.ydata.size)*self.bin_factor\r\n\r\n def estimate_growth(self):\r\n \"\"\" Estimates the grow rate per second, will sleep for 1000ms.\r\n The event loop continues running.\r\n \"\"\"\r\n eta.send('Estimating File growth.')\r\n file_size_old = self.file.stat().st_size\r\n plt.pause(1)\r\n file_size_new = self.file.stat().st_size\r\n eta.send('Done.')\r\n \r\n self.growth_rate = (file_size_new - file_size_old)/self.cut[0][5] #Bytes per record\r\n self.records_per_cut = int(self.growth_rate * self.interval)\r\n \r\n def init(self):\r\n \"\"\" Initializes the figure\r\n \"\"\"\r\n self.ax.set_xlim(0, self.ydata.size*self.bin_factor)\r\n self.line.set_xdata(self.xdata)\r\n \r\n self.y_max=self.numpy.amax(self.ydata)*1.5\r\n self.ax.set_ylim(0.01, self.y_max)\r\n self.line.set_ydata(self.ydata)\r\n \r\n return self.line,\r\n \r\n\r\n def __call__(self, i):\r\n # This way the plot can continuously run and we just keep\r\n # watching new realizations of the process\r\n if i == 0:\r\n return self.init()\r\n \r\n if self.waiting == False:\r\n self.cut = eta.incremental_cut(self.file, cut=self.cut, \r\n rec_per_cut=self.records_per_cut, verbose=False)\r\n\r\n if not eta.wait_for_data(self.cut, timeout=0.01):\r\n self.waiting = True\r\n # No new data available, we do not modify the plot\r\n return self.line,\r\n else:\r\n self.waiting = False\r\n context = self.context if self.mode == 'accumulation' else None\r\n \r\n result, self.context = eta.run(self.cut, group='compile',\r\n ctxs=context, sum_results=True, \r\n iterate_ctxs=True, verbose=False)\r\n self.ydata = result[self.ch_sel]\r\n \r\n max_value = self.numpy.amax(self.ydata)\r\n if max_value >= self.y_max*0.9 or max_value < self.max_value*0.9:\r\n self.y_max = max_value*1.5\r\n self.max_value = max_value\r\n self.ax.set_ylim(0.01, self.y_max)\r\n self.fig.canvas.draw_idle()\r\n\r\n self.line.set_ydata(self.ydata)\r\n return self.line,\r\n \r\n def toggle_scale(self, event):\r\n if self.ax.get_yscale() == 'log':\r\n self.set_linear()\r\n elif self.ax.get_yscale() == 'linear':\r\n self.set_log()\r\n self.fig.canvas.draw_idle() \r\n\r\n def set_log(self):\r\n print(self.numpy.min(self.ydata))\r\n \r\n self.ax.set_yscale('log', nonposy='clip')\r\n\r\n def set_linear(self):\r\n self.ax.set_yscale('linear')\r\n \r\n def set_accumulation_mode(self):\r\n self.mode = 'accumulation'\r\n \r\n def set_alignment_mode(self):\r\n self.mode = 'align'\r\n\r\n def toggle_mode(self, event):\r\n if self.mode == 'align':\r\n self.set_accumulation_mode()\r\n elif self.mode == 'accumulation':\r\n self.set_alignment_mode()\r\n \r\n def save_dat(self, event):\r\n global DATAFOLDER, LABEL\r\n self.file.parent.joinpath(DATAFOLDER).mkdir(parents=True, exist_ok=True) # Create analyzed folder\r\n \r\n file_index = 0\r\n while self.file.parent.joinpath(DATAFOLDER, f\"{self.file.stem}_{LABEL}_{file_index:0=3d}.txt\").exists(): #create unique index for file\r\n file_index += 1\r\n \r\n self.numpy.savetxt(self.file.parent.joinpath(DATAFOLDER, f\"{self.file.stem}_{LABEL}_{file_index:0=3d}.txt\"), \r\n self.numpy.transpose([self.xdata, self.ydata]))\r\n\r\ndp = DataPlot(fig, ax, file, ch_sel, bin_factor, records_per_cut, interval=100, \r\n numpy=np, widgets=matplotlib.widgets)\r\n\r\nani = animation.FuncAnimation(fig, dp, init_func=dp.init, interval=100, repeat=False,\r\n cache_frame_data=False, blit=True)\r\n\r\nplt.show()\r\n\r\neta.send(\"ETA realtime is stopped.\", \"stopped\")\r\n","var_templatek1wj6afv":null} \ No newline at end of file diff --git a/gui/src/renderer/js/recipes/Osci_mode_QuTAG.eta b/gui/src/renderer/js/recipes/Osci_mode_QuTAG.eta new file mode 100644 index 0000000..01c6f9a --- /dev/null +++ b/gui/src/renderer/js/recipes/Osci_mode_QuTAG.eta @@ -0,0 +1 @@ +{"vi_templatejevjreof":"{\"nodes\":[{\"x\":232,\"y\":105,\"fixed\":true,\"initial\":true,\"text\":\"stopped\",\"marked\":true,\"px\":232,\"py\":105},{\"x\":450,\"y\":175,\"weight\":1,\"fixed\":true,\"text\":\"started\",\"px\":450,\"py\":175}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"6\"},{\"source\":1,\"target\":1,\"text\":\"6,7\"}],\"usercode\":\"CLOCK(c1)\\nHISTOGRAM(t1,(`bins`,`binsize`))\\n\\nstopped--6-->started:\\n c1.start()\\n\\nstarted--6-->started:\\n c1.start()\\n \\nstarted--7-->started:\\n c1.stop()\\n t1.record(c1)\\n\"}","dpp_template_code":"#------IMPORTS-----\r\nimport numpy as np\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n\r\n#------ETA PROCESSING-----\r\ncutfile = eta.simple_cut(file, 1)\r\nresult = eta.run(cutfile, group='compile')\r\nh1=result['t1']\r\n#h1=np.loadtxt(\"h1.tensor\") #use this line instead of the previous 3 lines (ETA PROCESSING) if you want to load a reviously saved file for plotting\r\n#np.savetxt(\"h1.tensor\",h1) #use this line instead of plotting if you want to save the analysis result to a file\r\n\r\nbin_resolution = float(FP_BinResolution_Hz)*1e-9 if FP_BinResolution_Hz is not '' else float(binsize)*1e-9 # GHz\r\n\r\n#------PLOTTING-----\r\napp = dash.Dash()\r\napp.layout = html.Div(children=[\r\n html.H1(children=expname),\r\n dcc.Graph(\r\n id='example-ss',\r\n figure={\r\n 'data': [\r\n {\r\n 'x': np.arange(h1.size)*bin_resolution, \r\n 'y': h1,\r\n 'type': 'bar',\r\n 'name': 'bwd',\r\n 'marker': {\r\n 'color': '#0571b0'\r\n }\r\n \r\n },\r\n ],\r\n 'layout': {\r\n 'autosize':True,\r\n 'title': 'Start Stop Measurement',\r\n 'barmode': 'stack',\r\n 'xaxis' : {'title' : 'Time Delay (ms)'},\r\n 'yaxis' : {'title' : 'Coincidence Events'}\r\n }\r\n },\r\n style={ \"height\" : \"100vh\"}\r\n )\r\n], style={ \"height\" : \"100vh\"})\r\neta.display(app)","eta_index_table":"[{\"id\":\"var_templatejkim3bkj\",\"name\":\"file\",\"group\":\"compile\",\"info\":\"\",\"config\":\"C:/YourFolder/YourFile.timeres\"},{\"id\":\"var_templatejkim48wp\",\"name\":\"binsize\",\"group\":\"compile\",\"info\":\"\",\"config\":\"1e6\"},{\"id\":\"var_templatejkim2z6x\",\"name\":\"bins\",\"group\":\"compile\",\"info\":\"\",\"config\":\"1e5\"},{\"id\":\"var_templatejkim6uch\",\"name\":\"expname\",\"group\":\"compile\",\"info\":\"\",\"config\":\"Oscilloscope\"},{\"id\":\"var_templatek0cvrdzp\",\"name\":\"records_per_cut\",\"group\":\"compile\",\"info\":\"\",\"config\":\"1e5\"},{\"id\":\"dpp_template_code\",\"name\":\"plotly\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatek0exj347\",\"name\":\"save_txt\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejhj7imob\",\"name\":\"txt+graph\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatek0fgaeon\",\"name\":\"realtime\",\"group\":\"compile\",\"info\":\"\",\"config\":\"\"},{\"id\":\"ri_templatejkim223k\",\"name\":\"Time Tagger\",\"group\":\"compile\",\"info\":\"📤 [0, 1, 2, 3, 4, 5]\",\"config\":\"[6,0]\"},{\"id\":\"vi_templatejxyr8gq3\",\"name\":\"delay5-6\",\"group\":\"compile\",\"info\":\"📥 [5], 📤 [6] \",\"config\":\"\"},{\"id\":\"vi_templatejks7yt8a\",\"name\":\"delay1-7\",\"group\":\"compile\",\"info\":\"📥 [3], 📤 [7] \",\"config\":\"\"},{\"id\":\"vi_templatejhrlupxy\",\"name\":\"delay2-8\",\"group\":\"compile\",\"info\":\"📥 [4], 📤 [8] \",\"config\":\"\"},{\"id\":\"vi_templatejevjreof\",\"name\":\"detect (start=ch7, stop=ch6)\",\"group\":\"compile\",\"info\":\"📥 [6, 7], 📤 [] \",\"config\":\"\"}]","dpp_templatejhj7imob":"#------IMPORTS-----\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nfrom pylab import figure, cm\r\nfrom matplotlib.colors import LogNorm\r\nfrom pathlib import Path\r\n\r\ndef get_files(extensions):\r\n global path\r\n all_files = []\r\n for ext in extensions:\r\n all_files.extend(path.glob(ext))\r\n return all_files\r\n \r\nbinsize = int(binsize)\r\nbins = int(bins)\r\n\r\n#------ETA PROCESSING-----\r\n\r\ndatafolder='analyzed data'\r\ngraphsfolder='graphs'\r\npath = Path(file)\r\n\r\nselector = (f for f in get_files(('*.ptu','*.timeres'))) if path.is_dir() else [path.resolve()]\r\n\r\nfor f in selector:\r\n eta.send('Working on ' + str(f.name))\r\n cutfile = eta.simple_cut(f,4)\r\n result = eta.run(cutfile, group='compile')\r\n h1=result['t1']\r\n \r\n #------PLOTTING-----\r\n \r\n xvalues = np.arange(0,bins*binsize,binsize)\r\n yvalues = h1\r\n \r\n f.parent.joinpath(datafolder).mkdir(parents=True, exist_ok=True)\r\n np.savetxt(f.parent.joinpath(datafolder, f.stem + '_lifetime' + '.txt'), np.transpose([xvalues,yvalues]))\r\n \r\n p1 = plt.bar(xvalues, yvalues, width=binsize, color='#0088ff')\r\n \r\n plt.ylabel('events')\r\n plt.xlabel('time (ps)')\r\n #plt.show()\r\n f.parent.joinpath(graphsfolder).mkdir(parents=True, exist_ok=True)\r\n plt.savefig(f.parent.joinpath(graphsfolder, f.stem + '_lifetime' + '.png'), format = 'png', dpi=1200)\r\n plt.savefig(f.parent.joinpath(graphsfolder, f.stem + '_lifetime' + '.eps'), format = 'eps', dpi=1200)\r\n plt.clf()\r\n eta.send(str(f.name) + ' has been successfully processed')\r\n\r\neta.send('FINISHED')","vi_templatejhrlupxy":"{\"nodes\":[{\"x\":141,\"y\":129,\"fixed\":true,\"initial\":true,\"text\":\"a\"}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"4\"}],\"usercode\":\"a:\\n emit(8,0)# here, ch1 is duplicated to ch3 with a delay of 0ps\"}","ri_templatejkim223k":null,"var_templatejkim2z6x":null,"var_templatejkim3bkj":null,"var_templatejkim48wp":null,"var_templatejkim6uch":null,"vi_templatejks7yt8a":"{\"nodes\":[{\"x\":141,\"y\":129,\"fixed\":true,\"initial\":true,\"text\":\"a\"}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"3\"}],\"usercode\":\"a:\\n emit(7, 0)# here, ch0 is duplicated to ch2 with a delay of 0ps\"}","vi_templatejxyr8gq3":"{\"nodes\":[{\"x\":148,\"y\":121,\"fixed\":true,\"initial\":true,\"text\":\"a\"}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"5\"}],\"usercode\":\"a:\\n emit(6,0)# here, ch0 is duplicated to ch2 with a delay of 0ps\"}","var_templatek0cvrdzp":null,"dpp_templatek0exj347":"#------IMPORTS-----\r\nimport numpy as np\r\nfrom pathlib import Path\r\nimport dash\r\nimport dash_core_components as dcc\r\nimport dash_html_components as html\r\nimport plotly.graph_objs as go\r\n\r\nf = Path(file)\r\ndatafolder = 'results'\r\n\r\n#------ETA PROCESSING-----\r\ncutfile = eta.simple_cut(f, 4)\r\nresult = eta.run(cutfile, group='compile')\r\nh1=result['t1']\r\n#h1=np.loadtxt(\"h1.tensor\") #use this line instead of the previous 3 lines (ETA PROCESSING) if you want to load a reviously saved file for plotting\r\n#np.savetxt(\"h1.tensor\",h1) #use this line instead of plotting if you want to save the analysis result to a file\r\n\r\nbin_resolution = float(FP_BinResolution_Hz)*1e-9 if FP_BinResolution_Hz is not '' else float(binsize)*1e-9 # GHz\r\nprint(f.stem)\r\nnp.savetxt(f.parent.joinpath(datafolder, f.stem + '_histogram' + '.txt'), \r\n np.transpose([np.arange(h1.size)*bin_resolution, h1]))\r\n","dpp_templatek0fgaeon":"#------IMPORTS-----\r\nfrom os import path\r\nimport pathlib\r\nfrom enum import Enum\r\n\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nimport matplotlib.animation as animation\r\nimport matplotlib.widgets\r\nfrom matplotlib.widgets import Button\r\n\r\neta.send(\"ETA is running in realtime...\", \"running\")\r\n\r\nrecords_per_cut = int(float(records_per_cut)) if records_per_cut != \"\" else None\r\n\r\nSIMULATE_GROWTH = True\r\nDATAFOLDER = 'analyzed data'\r\nLABEL = 'histogram'\r\n\r\nbinsize = int(float(binsize))\r\nbins = int(float(bins))\r\nbin_factor = int(float(binsize))\r\nfile = pathlib.Path(file)\r\n\r\nctx1=None\r\nfig, ax = plt.subplots()\r\nax.set_ylabel('Histogram events')\r\nax.set_xlabel('Time delay (ps)')\r\nax.set_title(expname)\r\n\r\n\r\nclass DataPlot(object):\r\n def __init__(self, fig, ax, file, bin_factor, \r\n records_per_cut=None, interval=100, \r\n numpy=None, widgets=None):\r\n \"\"\" Calculates the next cut and writes it to the plot\r\n ax: Axis to draw on\r\n file: str or Path of file currently investigated\r\n bin_factor: The multiplication factor for each bin.\r\n interval: The interval of the simulation\r\n timeout: How long to wait for enough data until frame is skipped (milliseconds)\r\n \"\"\"\r\n global SIMULATE_GROWTH\r\n \r\n self.file = file\r\n self.bin_factor = bin_factor\r\n self.records_per_cut = records_per_cut\r\n \r\n self.fig = fig\r\n self.ax = ax\r\n self.fig.subplots_adjust(bottom=0.22)\r\n \r\n self.line, = self.ax.plot([], [], 'r-')\r\n self.interval = interval\r\n self.numpy = numpy\r\n self.widgets = widgets\r\n \r\n self.set_accumulation_mode()\r\n\r\n # Setup Widgets\r\n axsavedat = self.fig.add_axes([0.59, 0.05, 0.1, 0.075])\r\n axmode = self.fig.add_axes([0.7, 0.05, 0.1, 0.075])\r\n axlinlog = self.fig.add_axes([0.81, 0.05, 0.1, 0.075])\r\n self.bsavedat = widgets.Button(axsavedat, 'Save')\r\n self.blinlog = widgets.Button(axlinlog, 'Lin/Log')\r\n self.bmode = widgets.Button(axmode, 'Mode')\r\n self.bsavedat.on_clicked(self.save_dat)\r\n self.blinlog.on_clicked(self.toggle_scale)\r\n self.bmode.on_clicked(self.toggle_mode)\r\n \r\n # First cut to detect file properties and rate estimation\r\n self.cut = eta.incremental_cut(self.file, cut=None,\r\n rec_per_cut=1,\r\n verbose=False)\r\n \r\n if self.records_per_cut is None:\r\n self.estimate_growth()\r\n\r\n self.waiting = False\r\n self.context = None\r\n \r\n if SIMULATE_GROWTH is False:\r\n file_size = self.file.stat().st_size\r\n file_size = file_size - self.cut[0][0]\r\n existing_records = file_size//self.cut[0][5]\r\n else:\r\n existing_records = self.records_per_cut\r\n\r\n self.cut = eta.incremental_cut(self.file, cut=None, \r\n rec_per_cut=existing_records, verbose=False) # Start always from begining of file\r\n \r\n if not eta.wait_for_data(self.cut, timeout=0.01):\r\n eta.send('Something went wrong, there should be no waiting here.')\r\n \r\n result, self.context = eta.run(self.cut, group='compile',\r\n ctxs=None, sum_results=True, \r\n iterate_ctxs=True, verbose=False)\r\n\r\n self.ydata = result['t1']\r\n self.max_value = self.numpy.amax(self.ydata) \r\n self.y_max = self.max_value*1.5\r\n\r\n self.xdata = self.numpy.arange(0, self.ydata.size)*self.bin_factor\r\n\r\n def estimate_growth(self):\r\n \"\"\" Estimates the grow rate per second, will sleep for 1000ms.\r\n The event loop continues running.\r\n \"\"\"\r\n eta.send('Estimating File growth.')\r\n file_size_old = self.file.stat().st_size\r\n plt.pause(1)\r\n file_size_new = self.file.stat().st_size\r\n eta.send('Done.')\r\n \r\n self.growth_rate = (file_size_new - file_size_old)/self.cut[0][5] #Bytes per record\r\n self.records_per_cut = int(self.growth_rate * self.interval)\r\n \r\n def init(self):\r\n \"\"\" Initializes the figure\r\n \"\"\"\r\n self.ax.set_xlim(0, self.ydata.size*self.bin_factor)\r\n self.line.set_xdata(self.xdata)\r\n \r\n self.y_max=self.numpy.amax(self.ydata)*1.5\r\n self.ax.set_ylim(0.01, self.y_max)\r\n self.line.set_ydata(self.ydata)\r\n \r\n return self.line,\r\n \r\n\r\n def __call__(self, i):\r\n # This way the plot can continuously run and we just keep\r\n # watching new realizations of the process\r\n if i == 0:\r\n return self.init()\r\n \r\n if self.waiting == False:\r\n self.cut = eta.incremental_cut(self.file, cut=self.cut, \r\n rec_per_cut=self.records_per_cut, verbose=False)\r\n\r\n if not eta.wait_for_data(self.cut, timeout=0.01):\r\n self.waiting = True\r\n # No new data available, we do not modify the plot\r\n return self.line,\r\n else:\r\n self.waiting = False\r\n context = self.context if self.mode == 'accumulation' else None\r\n \r\n result, self.context = eta.run(self.cut, group='compile',\r\n ctxs=context, sum_results=True, \r\n iterate_ctxs=True, verbose=False)\r\n self.ydata = result['t1']\r\n \r\n max_value = self.numpy.amax(self.ydata)\r\n if max_value >= self.y_max*0.9 or max_value < self.max_value*0.9:\r\n self.y_max = max_value*1.5\r\n self.max_value = max_value\r\n self.ax.set_ylim(0.01, self.y_max)\r\n self.fig.canvas.draw_idle()\r\n\r\n self.line.set_ydata(self.ydata)\r\n return self.line,\r\n \r\n def toggle_scale(self, event):\r\n if self.ax.get_yscale() == 'log':\r\n self.set_linear()\r\n elif self.ax.get_yscale() == 'linear':\r\n self.set_log()\r\n self.fig.canvas.draw_idle() \r\n\r\n def set_log(self):\r\n print(self.numpy.min(self.ydata))\r\n \r\n self.ax.set_yscale('log', nonposy='clip')\r\n\r\n def set_linear(self):\r\n self.ax.set_yscale('linear')\r\n \r\n def set_accumulation_mode(self):\r\n self.mode = 'accumulation'\r\n \r\n def set_alignment_mode(self):\r\n self.mode = 'align'\r\n\r\n def toggle_mode(self, event):\r\n if self.mode == 'align':\r\n self.set_accumulation_mode()\r\n elif self.mode == 'accumulation':\r\n self.set_alignment_mode()\r\n \r\n def save_dat(self, event):\r\n global DATAFOLDER, LABEL\r\n self.file.parent.joinpath(DATAFOLDER).mkdir(parents=True, exist_ok=True) # Create analyzed folder\r\n \r\n file_index = 0\r\n while self.file.parent.joinpath(DATAFOLDER, f\"{self.file.stem}_{LABEL}_{file_index:0=3d}.txt\").exists(): #create unique index for file\r\n file_index += 1\r\n \r\n self.numpy.savetxt(self.file.parent.joinpath(DATAFOLDER, f\"{self.file.stem}_{LABEL}_{file_index:0=3d}.txt\"), \r\n self.numpy.transpose([self.xdata, self.ydata]))\r\n\r\ndp = DataPlot(fig, ax, file, bin_factor, records_per_cut, interval=100, \r\n numpy=np, widgets=matplotlib.widgets)\r\n\r\nani = animation.FuncAnimation(fig, dp, init_func=dp.init, interval=100, repeat=False,\r\n cache_frame_data=False, blit=True)\r\n\r\nplt.show()\r\n\r\neta.send(\"ETA realtime is stopped.\", \"stopped\")\r\n"} \ No newline at end of file diff --git a/gui/src/renderer/js/recipes/Realtime.eta b/gui/src/renderer/js/recipes/Realtime.eta index a719845..d1a72f3 100644 --- a/gui/src/renderer/js/recipes/Realtime.eta +++ b/gui/src/renderer/js/recipes/Realtime.eta @@ -1 +1 @@ -{"vi_templatejg59migx":"{\"nodes\":[{\"x\":152,\"y\":120,\"fixed\":true,\"text\":\"a\",\"px\":152,\"py\":120,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"1\"}],\"usercode\":\"a:\\n emit(3,0)#90000000\"}","vi_templatejfc9koma":"{\"nodes\":[{\"x\":82,\"y\":81,\"fixed\":true,\"text\":\"a\",\"px\":82,\"py\":81,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"0\"}],\"usercode\":\"a:\\n emit(2,0)\"}","vi_templatejg52ksbp":"{\"nodes\":[{\"x\":374,\"y\":109,\"fixed\":true,\"text\":\"start\",\"px\":374,\"py\":109},{\"x\":101,\"y\":103,\"fixed\":true,\"text\":\"stop\",\"px\":101,\"py\":103,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"3\"},{\"source\":1,\"target\":0,\"text\":\"2\"},{\"source\":0,\"target\":0,\"text\":\"2\"},{\"source\":1,\"target\":1,\"text\":\"3\"}],\"usercode\":\"HISTOGRAM(h3,(`bins`,`binsize`))\\nINTEGER(i1,0)\\nCLOCK(c3,100,1)\\nstart:\\n {i1+=AbsTime_ps}\\n c3.start()\\n\\nstop:\\n c3.stop()\\n h3.record(c3)\\n\"}","vi_templatejfb2qshf":"{\"nodes\":[{\"x\":346,\"y\":111,\"fixed\":true,\"text\":\"start\",\"px\":346,\"py\":111},{\"x\":75,\"y\":66,\"fixed\":true,\"text\":\"stop\",\"px\":75,\"py\":66,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"2\"},{\"source\":1,\"target\":0,\"text\":\"3\"},{\"source\":0,\"target\":0,\"text\":\"3\"},{\"source\":1,\"target\":1,\"text\":\"2\"}],\"usercode\":\"HISTOGRAM(h4,(`bins`,`binsize`))\\nCLOCK(c4,100,1)\\nstart:\\n c4.start()\\nstop:\\n c4.stop()\\n h4.record(c4)\"}","dpp_template_code":"#------IMPORTS-----\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nfrom os import path\r\nfrom matplotlib.widgets import Button\r\n\r\n\r\n#-----PLOTTING----\r\nplt.ion()\r\nfig, ax = plt.subplots()\r\nplt.subplots_adjust(bottom=0.2)\r\nline1, = ax.plot([], [], 'r-') # Returns a tuple of line objects, thus the comma\r\nax.set_ylabel('Histogram events')\r\nax.set_xlabel('Time delay (ps)')\r\nax.set_title(expname)\r\n\r\n#-----BUTTONS----\r\ndata_last=None\r\ndata_now=None\r\ndef clear_graph(event): #clears the graph\r\n global data_last\r\n global data_now\r\n global np\r\n data_last=np.copy(data_now)\r\n print(\"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\")\r\n \r\nbase=None\r\ndef mode(event): #switches between alignment mode and accumulation mode\r\n global base, ctx1, y_max\r\n y_max = 1\r\n if base == None:\r\n base = ctx1\r\n else:\r\n base = None\r\n\r\nlog = False\r\ny_min = 0\r\ny_max = 1\r\ndef linlog(event): #switches between log and linear scale for the y axis\r\n global ax, plt, log, y_min\r\n if log==True:\r\n ax.set_yscale(\"linear\")\r\n log=False\r\n y_min=0\r\n else:\r\n ax.set_yscale(\"log\", nonposy='clip')\r\n log=True\r\n y_min=0.5\r\n\r\n\r\naxmode = plt.axes([0.7, 0.05, 0.1, 0.075])\r\naxlinlog = plt.axes([0.81, 0.05, 0.1, 0.075])\r\nblinlog = Button(axlinlog, 'Lin/Log')\r\nbmode = Button(axmode, 'Mode')\r\nblinlog.on_clicked(linlog)\r\nbmode.on_clicked(mode)\r\n\r\n#------ETA PROCESSING-----\r\nrecords_per_cut = int(records_per_cut)\r\nbinsize=int(binsize)\r\ncut=None\r\nctx1=None\r\neta.send(\"ETA is running in realtime...\", \"running\")\r\nfirst_run = True\r\nwhile True:\r\n try:\r\n cut=eta.incremental_cut(file,cut=cut, rec_per_cut=records_per_cut,verbose=False)\r\n except Exception as e:\r\n eta.send(str(e),\"err\")\r\n break\r\n \r\n if not(eta.wait_till_presnese(cut,timeout=1.0)):\r\n break\r\n result,ctx1 = eta.run(cut, group='main',\r\n ctxs= base,sum_results=True,iterate_ctxs=True,verbose=False)\r\n \r\n t1=result[\"h3\"]\r\n t2=result[\"h4\"] \r\n \r\n if first_run:\r\n ax.set_xlim(-t2.size*binsize,t1.size*binsize)\r\n first_run = False\r\n data_now=np.copy(np.concatenate((np.flip(t2, 0), t1), axis=0))\r\n if data_last is not None:\r\n data_draw=data_now-data_last\r\n else:\r\n data_draw=data_now\r\n try:\r\n if np.amax(data_draw)>=y_max*0.95:\r\n y_max=np.amax(data_draw)*3\r\n ax.set_ylim(y_min,y_max)\r\n line1.set_xdata(np.arange(-t2.size,t1.size)*binsize)\r\n line1.set_ydata(data_draw)\r\n fig.canvas.draw()\r\n fig.canvas.flush_events()\r\n except Exception as e:\r\n #eta.send(str(e),\"err\")\r\n break\r\neta.send(\"ETA realtime is stopped.\", \"stopped\")\r\nplt.close()","eta_index_table":"[{\"id\":\"var_templatejgmgopco\",\"name\":\"file\",\"group\":\"main\",\"info\":\"\",\"config\":\"C:/YourFolder/YourFile.ptu\"},{\"id\":\"var_templatejkil9dn6\",\"name\":\"binsize\",\"group\":\"main\",\"info\":\"\",\"config\":\"16\"},{\"id\":\"var_templatejkil7pz1\",\"name\":\"records_per_cut\",\"group\":\"main\",\"info\":\"\",\"config\":\"200000\"},{\"id\":\"var_templatejkil6yh0\",\"name\":\"expname\",\"group\":\"main\",\"info\":\"\",\"config\":\"Realtime\"},{\"id\":\"var_templatejkil8r7x\",\"name\":\"bins\",\"group\":\"main\",\"info\":\"\",\"config\":\"10000\"},{\"id\":\"dpp_template_code\",\"name\":\"realtime\",\"group\":\"main\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejouvphfp\",\"name\":\"qutag_start_recording\",\"group\":\"main\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejouvvpsn\",\"name\":\"swebianinstrument_start_recording\",\"group\":\"main\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejouvx190\",\"name\":\"hydraharp_start_recording\",\"group\":\"main\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejvtn1isu\",\"name\":\"hydraharp400_HeaderGenerator_download\",\"group\":\"main\",\"info\":\"\",\"config\":\"\"},{\"id\":\"ri_templatejezi0bbr\",\"name\":\"TimeTagger\",\"group\":\"main\",\"info\":\"📤 [0, 1]\",\"config\":\"[2,0]\"},{\"id\":\"vi_templatejfc9koma\",\"name\":\"DL0-2\",\"group\":\"main\",\"info\":\"📥 [0], 📤 [2] \",\"config\":\"\"},{\"id\":\"vi_templatejg59migx\",\"name\":\"DL1-3\",\"group\":\"main\",\"info\":\"📥 [1], 📤 [3] \",\"config\":\"\"},{\"id\":\"vi_templatejg52ksbp\",\"name\":\"Correlationbwd\",\"group\":\"main\",\"info\":\"📥 [3, 2], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatejfb2qshf\",\"name\":\"Correlationfwd\",\"group\":\"main\",\"info\":\"📥 [2, 3], 📤 [] \",\"config\":\"\"}]","var_templatejkil6yh0":null,"var_templatejkil7pz1":null,"var_templatejkil8r7x":null,"var_templatejkil9dn6":null,"dpp_templatejouvphfp":"#This Script Panel will start the time tagging on a quTAG device\r\n#TODO:20181124 This script is not yet tested \r\nfrom ctypes import *\r\nimport time,sys,os\r\nif not os.path.isfile(\"tdcbase.dll\"):\r\n eta.send(\"Installing ETA DLC... \", \"running\")\r\n import webinstall\r\n webinstall.web_install(\"https://github.com/timetag/timetag.github.io/releases/download/qutaglib/quTAGlibV1.4.1.zip\",\"./\",\"quTAGlibV141.zip\")\r\n eta.send(\"ETA DLC installed. \", \"stopped\")\r\ntry:\r\n qutag = cdll.LoadLibrary(\"tdcbase.dll\")\r\nexcept Exception:\r\n eta.send(\"You need to copy tdcbase.dll along with other dlls to the same folder of ETA-Backend.exe\",\"err\")\r\n #You can find those DLLs from the 64bit library at\r\n #https://www.qutools.com/\r\n #You might also need a newer version of quTAG driver that allows configuration of the filters\r\nqutag.TDC_getVersion.restype=c_double\r\nprint(qutag.TDC_getVersion())\r\nrc = qutag.TDC_init( -1 )\r\nprint( \"TDC_init\", rc )\r\nrc = qutag.TDC_enableChannels( 0xff ) # Use all channels \r\nprint( \"TDC_enableChannels\", rc )\r\n\r\n#use two channes(2) in a Coinc filter configuration(2), and set all of the channels as enabled(3)\r\nrc = qutag.TDC_configureFilter(2,2,3) #TODO: this line is not yet tested\r\nprint( \"TDC_configureFilter\", rc )\r\n\r\nfilename= str(file).encode(\"utf-8\")\r\neta.send(\"Timetags will be written to {}\".format(filename))\r\neta.send(\"ETA starting reading the timetags from device...\", \"running\")\r\nrc = qutag.TDC_writeTimestamps(create_string_buffer(filename),1)#start acquisition\r\nprint( \"TDC_writeTimestamps\", rc )\r\ntime.sleep(10)\r\nrc = qutag.TDC_writeTimestamps(POINTER(c_int)(),1)#stop acquisition\r\nprint( \"TDC_writeTimestamps\", rc )\r\neta.send(\"ETA realtime is stopped.\", \"stopped\")","dpp_templatejouvvpsn":"import sys\r\ntry:\r\n import TimeTagger\r\nexcept:\r\n print(\"Time Tagger lib is not in the search path.\")\r\n pyversion = sys.version_info\r\n from winreg import ConnectRegistry, OpenKey, HKEY_LOCAL_MACHINE, QueryValueEx\r\n registry_path = \"SOFTWARE\\\\Python\\\\PythonCore\\\\\" + \\\r\n str(pyversion.major) + \".\" + str(pyversion.minor) + \"\\\\PythonPath\\\\Time Tagger\"\r\n reg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)\r\n key = OpenKey(reg, registry_path)\r\n module_path = QueryValueEx(key, '')[0]\r\n print(\"adding \" + module_path)\r\n sys.path.append(module_path)\r\nimport TimeTagger\r\n\r\nfrom time import sleep\r\n\r\ntagger = TimeTagger.createTimeTagger()\r\ntagger.reset();\r\n#disabling the test signals\r\ntagger.setTestSignal(0, False)\r\ntagger.setTestSignal(1, False)\r\ntagger.setTestSignal(5, False)\r\n#setTriggerLevel to chn0 ,chn1, chn5\r\ntagger.setTriggerLevel(0, 0.1)\r\ntagger.setTriggerLevel(1, 0.1)\r\ntagger.setTriggerLevel(5, 0.1)\r\ntagger.sync()\r\ncountrate = TimeTagger.Countrate( tagger, channels=[0,1,5] )\r\nsleep(1)\r\neta.send('countrate:')\r\neta.send(countrate.getData())\r\n\r\neta.send('starting time-tagging',\"running\")\r\ndump = TimeTagger.Dump(tagger,'swebian.bin',100000,[0,1,5])\r\nsleep(10)\r\neta.send('stopping time-tagging', \"stopped\")","dpp_templatejouvx190":"#TODO(20181124) This script is not yet tested on a real device.\n\n# Demo for access to HydraHarp 400 Hardware via HHLIB.DLL v 3.0.\n# The program performs a measurement based on hard coded settings.\n# The resulting data is stored in a binary output file.\n#\n# Keno Goertz, PicoQuant GmbH, February 2018\n\"\"\"\nDisclaimer\nPicoQuant GmbH disclaims all warranties with regard to this software and associated\ndocumentation including all implied warranties of merchantability and fitness. \nIn no case shall PicoQuant GmbH be liable for any direct, indirect or consequential\ndamages or any material or immaterial damages whatsoever resulting from loss of data,\ntime or profits arising from use or performance of this software.\n\"\"\"\nimport time\nimport ctypes as ct\nfrom ctypes import byref\nimport sys\nimport struct\n\n# From hhdefin.h\nLIB_VERSION = \"3.0\"\nMAXDEVNUM = 8\nMODE_T2 = 2\nMODE_T3 = 3\nMAXLENCODE = 6\nHHMAXINPCHAN = 8\nTTREADMAX = 131072\nFLAG_OVERFLOW = 0x0001\nFLAG_FIFOFULL = 0x0002\n\n# Measurement parameters, these are hardcoded since this is just a demo\nmode = MODE_T2 # set T2 or T3 here, observe suitable Syncdivider and Range!\nbinning = 0 # you can change this, meaningful only in T3 mode\noffset = 0 # you can change this, meaningful only in T3 mode\ntacq = 1000 # Measurement time in millisec, you can change this\nsyncDivider = 1 # you can change this, observe mode! READ MANUAL!\nsyncCFDZeroCross = 10 # you can change this (in mV)\nsyncCFDLevel = 50 # you can change this (in mV)\nsyncChannelOffset = -5000 # you can change this (in ps, like a cable delay)\ninputCFDZeroCross = 10 # you can change this (in mV)\ninputCFDLevel = 50 # you can change this (in mV)\ninputChannelOffset = 0 # you can change this (in ps, like a cable delay)\n\n# Variables to store information read from DLLs\nbuffer = (ct.c_uint * TTREADMAX)()\ndev = []\nlibVersion = ct.create_string_buffer(b\"\", 8)\nhwSerial = ct.create_string_buffer(b\"\", 8)\nhwPartno = ct.create_string_buffer(b\"\", 8)\nhwVersion = ct.create_string_buffer(b\"\", 8)\nhwModel = ct.create_string_buffer(b\"\", 16)\nerrorString = ct.create_string_buffer(b\"\", 40)\nnumChannels = ct.c_int()\nresolution = ct.c_double()\nsyncRate = ct.c_int()\ncountRate = ct.c_int()\nflags = ct.c_int()\nnRecords = ct.c_int()\nctcstatus = ct.c_int()\nwarnings = ct.c_int()\nwarningstext = ct.create_string_buffer(b\"\", 16384)\n\ntry:\n hhlib = ct.CDLL(\"hhlib64.dll\")\nexcept Exception, e:\n eta.send(\"hhlib64.dll not found. Please copy it to the folder of ETA-Backend.exe\",\"err\")\n \ndef closeDevices():\n for i in range(0, MAXDEVNUM):\n hhlib.HH_CloseDevice(ct.c_int(i))\n exit(0)\n\ndef stoptttr():\n retcode = hhlib.HH_StopMeas(ct.c_int(dev[0]))\n if retcode < 0:\n print(\"HH_StopMeas error %1d. Aborted.\" % retcode)\n closeDevices()\n\ndef tryfunc(retcode, funcName, measRunning=False):\n if retcode < 0:\n hhlib.HH_GetErrorString(errorString, ct.c_int(retcode))\n print(\"HH_%s error %d (%s). Aborted.\" % (funcName, retcode,\\\n errorString.value.decode(\"utf-8\")))\n if measRunning:\n stoptttr()\n else:\n closeDevices()\n\nhhlib.HH_GetLibraryVersion(libVersion)\nprint(\"Library version is %s\" % libVersion.value.decode(\"utf-8\"))\nif libVersion.value.decode(\"utf-8\") != LIB_VERSION:\n print(\"Warning: The application was built for version %s\" % LIB_VERSION)\n\noutputfile = open(\"tttrmode.out\", \"wb+\")\n\nprint(\"\\nMode : %d\" % mode)\nprint(\"Binning : %d\" % binning)\nprint(\"Offset : %d\" % offset)\nprint(\"AcquisitionTime : %d\" % tacq)\nprint(\"SyncDivider : %d\" % syncDivider)\nprint(\"SyncCFDZeroCross : %d\" % syncCFDZeroCross)\nprint(\"SyncCFDLevel : %d\" % syncCFDLevel)\nprint(\"InputCFDZeroCross : %d\" % inputCFDZeroCross)\nprint(\"InputCFDLevel : %d\" % inputCFDLevel)\n\nprint(\"\\nSearching for HydraHarp devices...\")\nprint(\"Devidx Status\")\n\nfor i in range(0, MAXDEVNUM):\n retcode = hhlib.HH_OpenDevice(ct.c_int(i), hwSerial)\n if retcode == 0:\n print(\" %1d S/N %s\" % (i, hwSerial.value.decode(\"utf-8\")))\n dev.append(i)\n else:\n if retcode == -1: # HH_ERROR_DEVICE_OPEN_FAIL\n print(\" %1d no device\" % i)\n else:\n hhlib.HH_GetErrorString(errorString, ct.c_int(retcode))\n print(\" %1d %s\" % (i, errorString.value.decode(\"utf8\")))\n\n# In this demo we will use the first HydraHarp device we find, i.e. dev[0].\n# You can also use multiple devices in parallel.\n# You can also check for specific serial numbers, so that you always know \n# which physical device you are talking to.\n\nif len(dev) < 1:\n print(\"No device available.\")\n closeDevices()\nprint(\"Using device #%1d\" % dev[0])\nprint(\"\\nInitializing the device...\")\n\n# with internal clock\ntryfunc(hhlib.HH_Initialize(ct.c_int(dev[0]), ct.c_int(mode), ct.c_int(0)),\\\n \"Initialize\")\n\n# Only for information\ntryfunc(hhlib.HH_GetHardwareInfo(dev[0], hwModel, hwPartno, hwVersion),\\\n \"GetHardwareInfo\")\nprint(\"Found Model %s Part no %s Version %s\" % (hwModel.value.decode(\"utf-8\"),\\\n hwPartno.value.decode(\"utf-8\"), hwVersion.value.decode(\"utf-8\")))\n\ntryfunc(hhlib.HH_GetNumOfInputChannels(ct.c_int(dev[0]), byref(numChannels)),\\\n \"GetNumOfInputChannels\")\nprint(\"Device has %i input channels.\" % numChannels.value)\n\nprint(\"\\nCalibrating...\")\ntryfunc(hhlib.HH_Calibrate(ct.c_int(dev[0])), \"Calibrate\")\ntryfunc(hhlib.HH_SetSyncDiv(ct.c_int(dev[0]), ct.c_int(syncDivider)), \"SetSyncDiv\")\n\ntryfunc(\n hhlib.HH_SetSyncCFD(ct.c_int(dev[0]), ct.c_int(syncCFDLevel),\n ct.c_int(syncCFDZeroCross)),\\\n \"SetSyncCFD\"\n)\n\ntryfunc(hhlib.HH_SetSyncChannelOffset(ct.c_int(dev[0]), ct.c_int(syncChannelOffset)),\\\n \"SetSyncChannelOffset\")\n\n# we use the same input settings for all channels, you can change this\nfor i in range(0, numChannels.value):\n tryfunc(\n hhlib.HH_SetInputCFD(ct.c_int(dev[0]), ct.c_int(i), ct.c_int(inputCFDLevel),\\\n ct.c_int(inputCFDZeroCross)),\\\n \"SetInputCFD\"\n )\n\n tryfunc(\n hhlib.HH_SetInputChannelOffset(ct.c_int(dev[0]), ct.c_int(i),\\\n ct.c_int(inputChannelOffset)),\\\n \"SetInputChannelOffset\"\n )\n\n# Meaningful only in T3 mode\nif mode == MODE_T3:\n tryfunc(hhlib.HH_SetBinning(ct.c_int(dev[0]), ct.c_int(binning)), \"SetBinning\")\n tryfunc(hhlib.HH_SetOffset(ct.c_int(dev[0]), ct.c_int(offset)), \"SetOffset\")\n tryfunc(hhlib.HH_GetResolution(ct.c_int(dev[0]), byref(resolution)), \"GetResolution\")\n print(\"Resolution is %1.1lfps\" % resolution.value)\n\n# Note: after Init or SetSyncDiv you must allow >100 ms for valid count rate readings\ntime.sleep(0.2)\n\ntryfunc(hhlib.HH_GetSyncRate(ct.c_int(dev[0]), byref(syncRate)), \"GetSyncRate\")\nprint(\"\\nSyncrate=%1d/s\" % syncRate.value)\n\nfor i in range(0, numChannels.value):\n tryfunc(hhlib.HH_GetCountRate(ct.c_int(dev[0]), ct.c_int(i), byref(countRate)),\\\n \"GetCountRate\")\n print(\"Countrate[%1d]=%1d/s\" % (i, countRate.value))\n\nprogress = 0\nsys.stdout.write(\"\\nProgress:%9u\" % progress)\nsys.stdout.flush()\n\ntryfunc(hhlib.HH_StartMeas(ct.c_int(dev[0]), ct.c_int(tacq)), \"StartMeas\")\n\nwhile True:\n tryfunc(hhlib.HH_GetFlags(ct.c_int(dev[0]), byref(flags)), \"GetFlags\")\n \n if flags.value & FLAG_FIFOFULL > 0:\n print(\"\\nFiFo Overrun!\")\n stoptttr()\n \n tryfunc(\n hhlib.HH_ReadFiFo(ct.c_int(dev[0]), byref(buffer), TTREADMAX,\\\n byref(nRecords)),\\\n \"ReadFiFo\", measRunning=True\n )\n\n if nRecords.value > 0:\n # We could just iterate through our buffer with a for loop, however,\n # this is slow and might cause a FIFO overrun. So instead, we shrinken\n # the buffer to its appropriate length with array slicing, which gives\n # us a python list. This list then needs to be converted back into\n # a ctype array which can be written at once to the output file\n outputfile.write((ct.c_uint*nRecords.value)(*buffer[0:nRecords.value]))\n progress += nRecords.value\n sys.stdout.write(\"\\rProgress:%9u\" % progress)\n sys.stdout.flush()\n else:\n tryfunc(hhlib.HH_CTCStatus(ct.c_int(dev[0]), byref(ctcstatus)),\\\n \"CTCStatus\")\n if ctcstatus.value > 0: \n print(\"\\nDone\")\n stoptttr()\n # within this loop you can also read the count rates if needed.\n\ncloseDevices()\noutputfile.close()\n","dpp_templatejvtn1isu":"#This Script Panel will start the time tagging on a quTAG device\r\n#TODO:20181124 This script is not yet tested \r\nfrom ctypes import *\r\nimport time,sys,os\r\neta.send(\"Installing ETA DLC... \", \"running\")\r\nimport webinstall\r\nwebinstall.web_install(\"https://github.com/timetag/timetag.github.io/releases/download/HH400_HG/HH400HeaderGenerator.zip\",\"./\",\"HH400HeaderGenerator.zip\")\r\neta.send(\"ETA DLC installed.\", \"stopped\")\r\neta.send(\"Please find the LabVIEW code at \"+os.getcwd()+\"\\\\HH400HeaderGenerator\")\r\nos.startfile(os.getcwd()+\"\\\\HH400HeaderGenerator\")"} \ No newline at end of file +{"vi_templatejg59migx":"{\"nodes\":[{\"x\":152,\"y\":120,\"fixed\":true,\"text\":\"a\",\"px\":152,\"py\":120,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"1\"}],\"usercode\":\"a:\\n emit(3,0)#90000000\"}","vi_templatejfc9koma":"{\"nodes\":[{\"x\":82,\"y\":81,\"fixed\":true,\"text\":\"a\",\"px\":82,\"py\":81,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":0,\"text\":\"0\"}],\"usercode\":\"a:\\n emit(2,0)\"}","vi_templatejg52ksbp":"{\"nodes\":[{\"x\":374,\"y\":109,\"fixed\":true,\"text\":\"start\",\"px\":374,\"py\":109},{\"x\":101,\"y\":103,\"fixed\":true,\"text\":\"stop\",\"px\":101,\"py\":103,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"3\"},{\"source\":1,\"target\":0,\"text\":\"2\"},{\"source\":0,\"target\":0,\"text\":\"2\"},{\"source\":1,\"target\":1,\"text\":\"3\"}],\"usercode\":\"HISTOGRAM(h3,(`bins`,`binsize`))\\nINTEGER(i1,0)\\nCLOCK(c3,100,1)\\nstart:\\n {i1+=AbsTime_ps}\\n c3.start()\\n\\nstop:\\n c3.stop()\\n h3.record(c3)\\n\"}","vi_templatejfb2qshf":"{\"nodes\":[{\"x\":346,\"y\":111,\"fixed\":true,\"text\":\"start\",\"px\":346,\"py\":111},{\"x\":75,\"y\":66,\"fixed\":true,\"text\":\"stop\",\"px\":75,\"py\":66,\"initial\":true}],\"edges\":[{\"source\":0,\"target\":1,\"text\":\"2\"},{\"source\":1,\"target\":0,\"text\":\"3\"},{\"source\":0,\"target\":0,\"text\":\"3\"},{\"source\":1,\"target\":1,\"text\":\"2\"}],\"usercode\":\"HISTOGRAM(h4,(`bins`,`binsize`))\\nCLOCK(c4,100,1)\\nstart:\\n c4.start()\\nstop:\\n c4.stop()\\n h4.record(c4)\"}","dpp_template_code":"#------IMPORTS-----\r\nfrom os import path\r\nimport pathlib\r\nfrom enum import Enum\r\n\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nimport matplotlib.animation as animation\r\nimport matplotlib.widgets\r\nfrom matplotlib.widgets import Button\r\n\r\neta.send(\"ETA is running in realtime...\", \"running\")\r\n\r\nrecords_per_cut = int(float(records_per_cut)) if records_per_cut != \"\" else None\r\n\r\nSIMULATE_GROWTH = False\r\nDATAFOLDER = 'analyzed data'\r\nLABEL = 'histogram'\r\n\r\nbinsize = int(float(binsize))\r\nbins = int(float(bins))\r\nbin_factor = int(float(binsize))\r\nfile = pathlib.Path(file)\r\n\r\nctx1=None\r\nfig, ax = plt.subplots()\r\nax.set_ylabel('Histogram events')\r\nax.set_xlabel('Time delay (ps)')\r\nax.set_title(expname)\r\n\r\n\r\nclass DataPlot(object):\r\n def __init__(self, fig, ax, file, bin_factor, \r\n records_per_cut=None, interval=100, \r\n numpy=None, widgets=None):\r\n \"\"\" Calculates the next cut and writes it to the plot\r\n ax: Axis to draw on\r\n file: str or Path of file currently investigated\r\n bin_factor: The multiplication factor for each bin.\r\n interval: The interval of the simulation\r\n timeout: How long to wait for enough data until frame is skipped (milliseconds)\r\n \"\"\"\r\n global SIMULATE_GROWTH\r\n \r\n self.file = file\r\n self.bin_factor = bin_factor\r\n self.records_per_cut = records_per_cut\r\n \r\n self.fig = fig\r\n self.ax = ax\r\n self.fig.subplots_adjust(bottom=0.22)\r\n \r\n self.line, = self.ax.plot([], [], 'r-')\r\n self.interval = interval\r\n self.numpy = numpy\r\n self.widgets = widgets\r\n \r\n self.set_accumulation_mode()\r\n\r\n # Setup Widgets\r\n axsavedat = self.fig.add_axes([0.59, 0.05, 0.1, 0.075])\r\n axmode = self.fig.add_axes([0.7, 0.05, 0.1, 0.075])\r\n axlinlog = self.fig.add_axes([0.81, 0.05, 0.1, 0.075])\r\n self.bsavedat = widgets.Button(axsavedat, 'Save')\r\n self.blinlog = widgets.Button(axlinlog, 'Lin/Log')\r\n self.bmode = widgets.Button(axmode, 'Mode')\r\n self.bsavedat.on_clicked(self.save_dat)\r\n self.blinlog.on_clicked(self.toggle_scale)\r\n self.bmode.on_clicked(self.toggle_mode)\r\n \r\n # First cut to detect file properties and rate estimation\r\n self.cut = eta.incremental_cut(self.file, cut=None,\r\n rec_per_cut=1,\r\n verbose=False)\r\n \r\n if self.records_per_cut is None:\r\n self.estimate_growth()\r\n\r\n self.waiting = False\r\n self.context = None\r\n \r\n if SIMULATE_GROWTH is False:\r\n file_size = self.file.stat().st_size\r\n file_size = file_size - self.cut[0][0]\r\n existing_records = file_size//self.cut[0][5]\r\n else:\r\n existing_records = self.records_per_cut\r\n\r\n self.cut = eta.incremental_cut(self.file, cut=None, \r\n rec_per_cut=existing_records, verbose=False) # Start always from begining of file\r\n \r\n if not eta.wait_for_data(self.cut, timeout=0.01):\r\n eta.send('Something went wrong, there should be no waiting here.')\r\n \r\n result, self.context = eta.run(self.cut, group='main',\r\n ctxs=None, sum_results=True, \r\n iterate_ctxs=True, verbose=False)\r\n self.hist1 = result['h3']\r\n self.hist2 = result['h4']\r\n self.ydata = self.numpy.concatenate((self.numpy.flip(self.hist2, 0), self.hist1), axis=0)\r\n self.max_value = self.numpy.amax(self.ydata) \r\n self.y_max = self.max_value*1.5\r\n\r\n self.xdata = self.numpy.arange(-result['h4'].size,result['h3'].size)*self.bin_factor\r\n\r\n def estimate_growth(self):\r\n \"\"\" Estimates the grow rate per second, will sleep for 1000ms.\r\n The event loop continues running.\r\n \"\"\"\r\n eta.send('Estimating File growth.')\r\n file_size_old = self.file.stat().st_size\r\n plt.pause(1)\r\n file_size_new = self.file.stat().st_size\r\n eta.send('Done.')\r\n \r\n self.growth_rate = (file_size_new - file_size_old)/self.cut[0][5] #Bytes per record\r\n self.records_per_cut = int(self.growth_rate * self.interval)\r\n \r\n def init(self):\r\n \"\"\" Initializes the figure\r\n \"\"\"\r\n self.ax.set_xlim(-self.hist2.size*self.bin_factor, self.hist1.size*self.bin_factor)\r\n self.line.set_xdata(self.xdata)\r\n \r\n self.y_max=self.numpy.amax(self.ydata)*1.5\r\n self.ax.set_ylim(0.01, self.y_max)\r\n self.line.set_ydata(self.ydata)\r\n \r\n return self.line,\r\n \r\n\r\n def __call__(self, i):\r\n # This way the plot can continuously run and we just keep\r\n # watching new realizations of the process\r\n if i == 0:\r\n return self.init()\r\n \r\n if self.waiting == False:\r\n self.cut = eta.incremental_cut(self.file, cut=self.cut, \r\n rec_per_cut=self.records_per_cut, verbose=False)\r\n\r\n if not eta.wait_for_data(self.cut, timeout=0.01):\r\n self.waiting = True\r\n # No new data available, we do not modify the plot\r\n return self.line,\r\n else:\r\n self.waiting = False\r\n context = self.context if self.mode == 'accumulation' else None\r\n \r\n result, self.context = eta.run(self.cut, group='main',\r\n ctxs=context, sum_results=True, \r\n iterate_ctxs=True, verbose=False)\r\n \r\n self.hist1 = result['h3']\r\n self.hist2 = result['h4']\r\n self.ydata = self.numpy.concatenate((self.numpy.flip(self.hist2, 0), self.hist1), axis=0)\r\n \r\n max_value = self.numpy.amax(self.ydata)\r\n if max_value >= self.y_max*0.9 or max_value < self.max_value*0.9:\r\n self.y_max = max_value*1.5\r\n self.max_value = max_value\r\n self.ax.set_ylim(0.01, self.y_max)\r\n self.fig.canvas.draw_idle()\r\n\r\n self.line.set_ydata(self.ydata)\r\n return self.line,\r\n \r\n def toggle_scale(self, event):\r\n if self.ax.get_yscale() == 'log':\r\n self.set_linear()\r\n elif self.ax.get_yscale() == 'linear':\r\n self.set_log()\r\n self.fig.canvas.draw_idle() \r\n\r\n def set_log(self):\r\n print(self.numpy.min(self.ydata))\r\n \r\n self.ax.set_yscale('log', nonposy='clip')\r\n\r\n def set_linear(self):\r\n self.ax.set_yscale('linear')\r\n \r\n def set_accumulation_mode(self):\r\n self.mode = 'accumulation'\r\n \r\n def set_alignment_mode(self):\r\n self.mode = 'align'\r\n\r\n def toggle_mode(self, event):\r\n if self.mode == 'align':\r\n self.set_accumulation_mode()\r\n elif self.mode == 'accumulation':\r\n self.set_alignment_mode()\r\n \r\n def save_dat(self, event):\r\n global DATAFOLDER, LABEL\r\n self.file.parent.joinpath(DATAFOLDER).mkdir(parents=True, exist_ok=True) # Create analyzed folder\r\n \r\n file_index = 0\r\n while self.file.parent.joinpath(DATAFOLDER, f\"{self.file.stem}_{LABEL}_{file_index:0=3d}.txt\").exists(): #create unique index for file\r\n file_index += 1\r\n \r\n self.numpy.savetxt(self.file.parent.joinpath(DATAFOLDER, f\"{self.file.stem}_{LABEL}_{file_index:0=3d}.txt\"), \r\n self.numpy.transpose([self.xdata, self.ydata]))\r\n\r\ndp = DataPlot(fig, ax, file, bin_factor, records_per_cut, interval=100, \r\n numpy=np, widgets=matplotlib.widgets)\r\n\r\nani = animation.FuncAnimation(fig, dp, init_func=dp.init, interval=100, repeat=False,\r\n cache_frame_data=False, blit=True)\r\n\r\nplt.show()\r\n\r\neta.send(\"ETA realtime is stopped.\", \"stopped\")\r\n","eta_index_table":"[{\"id\":\"var_templatejgmgopco\",\"name\":\"file\",\"group\":\"main\",\"info\":\"\",\"config\":\"C:/YourFolder/YourFile.timeres\"},{\"id\":\"var_templatejkil9dn6\",\"name\":\"binsize\",\"group\":\"main\",\"info\":\"\",\"config\":\"16\"},{\"id\":\"var_templatejkil7pz1\",\"name\":\"records_per_cut\",\"group\":\"main\",\"info\":\"\",\"config\":\"2e5\"},{\"id\":\"var_templatejkil6yh0\",\"name\":\"expname\",\"group\":\"main\",\"info\":\"\",\"config\":\"Realtime\"},{\"id\":\"var_templatejkil8r7x\",\"name\":\"bins\",\"group\":\"main\",\"info\":\"\",\"config\":\"1e4\"},{\"id\":\"dpp_template_code\",\"name\":\"realtime\",\"group\":\"main\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejouvphfp\",\"name\":\"qutag_start_recording\",\"group\":\"main\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejouvvpsn\",\"name\":\"swabianinstrument_start_recording\",\"group\":\"main\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejouvx190\",\"name\":\"hydraharp_start_recording\",\"group\":\"main\",\"info\":\"\",\"config\":\"\"},{\"id\":\"dpp_templatejvtn1isu\",\"name\":\"hydraharp400_HeaderGenerator_download\",\"group\":\"main\",\"info\":\"\",\"config\":\"\"},{\"id\":\"ri_templatejezi0bbr\",\"name\":\"TimeTagger\",\"group\":\"main\",\"info\":\"📤 [0, 1]\",\"config\":\"[2,0]\"},{\"id\":\"vi_templatejfc9koma\",\"name\":\"DL0-2\",\"group\":\"main\",\"info\":\"📥 [0], 📤 [2] \",\"config\":\"\"},{\"id\":\"vi_templatejg59migx\",\"name\":\"DL1-3\",\"group\":\"main\",\"info\":\"📥 [1], 📤 [3] \",\"config\":\"\"},{\"id\":\"vi_templatejg52ksbp\",\"name\":\"Correlationbwd\",\"group\":\"main\",\"info\":\"📥 [3, 2], 📤 [] \",\"config\":\"\"},{\"id\":\"vi_templatejfb2qshf\",\"name\":\"Correlationfwd\",\"group\":\"main\",\"info\":\"📥 [2, 3], 📤 [] \",\"config\":\"\"}]","var_templatejkil6yh0":null,"var_templatejkil7pz1":null,"var_templatejkil8r7x":null,"var_templatejkil9dn6":null,"dpp_templatejouvphfp":"#This Script Panel will start the time tagging on a quTAG device\r\n#TODO:20181124 This script is not yet tested \r\nfrom ctypes import *\r\nimport time,sys,os\r\nif not os.path.isfile(\"tdcbase.dll\"):\r\n eta.send(\"Installing ETA DLC... \", \"running\")\r\n import webinstall\r\n webinstall.web_install(\"https://github.com/timetag/timetag.github.io/releases/download/qutaglib/quTAGlibV1.4.1.zip\",\"./\",\"quTAGlibV141.zip\")\r\n eta.send(\"ETA DLC installed. \", \"stopped\")\r\ntry:\r\n qutag = cdll.LoadLibrary(\"tdcbase.dll\")\r\nexcept Exception:\r\n eta.send(\"You need to copy tdcbase.dll along with other dlls to the same folder of ETA-Backend.exe\",\"err\")\r\n #You can find those DLLs from the 64bit library at\r\n #https://www.qutools.com/\r\n #You might also need a newer version of quTAG driver that allows configuration of the filters\r\nqutag.TDC_getVersion.restype=c_double\r\nprint(qutag.TDC_getVersion())\r\nrc = qutag.TDC_init( -1 )\r\nprint( \"TDC_init\", rc )\r\nrc = qutag.TDC_enableChannels( 0xff ) # Use all channels \r\nprint( \"TDC_enableChannels\", rc )\r\n\r\n\r\nrc = qutag.TDC_configureFilter(5,3,0b00110) # (channel to filter, enumerator for filtertype (3=sync),0bchannelmask)\r\nprint( \"TDC_configureFilter\", rc )\r\n\r\nfilename= str(file).encode(\"utf-8\")\r\neta.send(\"Timetags will be written to {}\".format(filename))\r\neta.send(\"ETA starting reading the timetags from device...\", \"running\")\r\nrc = qutag.TDC_writeTimestamps(create_string_buffer(filename),1)#start acquisition\r\nprint( \"TDC_writeTimestamps\", rc )\r\ntime.sleep(10)\r\nrc = qutag.TDC_writeTimestamps(POINTER(c_int)(),1)#stop acquisition\r\nprint( \"TDC_writeTimestamps\", rc )\r\neta.send(\"ETA realtime is stopped.\", \"stopped\")","dpp_templatejouvvpsn":"import sys\r\ntry:\r\n import TimeTagger\r\nexcept:\r\n print(\"Time Tagger lib is not in the search path.\")\r\n pyversion = sys.version_info\r\n from winreg import ConnectRegistry, OpenKey, HKEY_LOCAL_MACHINE, QueryValueEx\r\n registry_path = \"SOFTWARE\\\\Python\\\\PythonCore\\\\\" + \\\r\n str(pyversion.major) + \".\" + str(pyversion.minor) + \"\\\\PythonPath\\\\Time Tagger\"\r\n reg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)\r\n key = OpenKey(reg, registry_path)\r\n module_path = QueryValueEx(key, '')[0]\r\n print(\"adding \" + module_path)\r\n sys.path.append(module_path)\r\nimport TimeTagger\r\n\r\nfrom time import sleep\r\n\r\ntagger = TimeTagger.createTimeTagger()\r\ntagger.reset();\r\n#disabling the test signals\r\ntagger.setTestSignal(0, False)\r\ntagger.setTestSignal(1, False)\r\ntagger.setTestSignal(5, False)\r\n#setTriggerLevel to chn0 ,chn1, chn5\r\ntagger.setTriggerLevel(0, 0.1)\r\ntagger.setTriggerLevel(1, 0.1)\r\ntagger.setTriggerLevel(5, 0.1)\r\ntagger.sync()\r\ncountrate = TimeTagger.Countrate( tagger, channels=[0,1,5] )\r\nsleep(1)\r\neta.send('countrate:')\r\neta.send(countrate.getData())\r\n\r\neta.send('starting time-tagging',\"running\")\r\ndump = TimeTagger.Dump(tagger,'swebian.bin',100000,[0,1,5])\r\nsleep(10)\r\neta.send('stopping time-tagging', \"stopped\")","dpp_templatejouvx190":"#TODO(20181124) This script is not yet tested on a real device.\n\n# Demo for access to HydraHarp 400 Hardware via HHLIB.DLL v 3.0.\n# The program performs a measurement based on hard coded settings.\n# The resulting data is stored in a binary output file.\n#\n# Keno Goertz, PicoQuant GmbH, February 2018\n\"\"\"\nDisclaimer\nPicoQuant GmbH disclaims all warranties with regard to this software and associated\ndocumentation including all implied warranties of merchantability and fitness. \nIn no case shall PicoQuant GmbH be liable for any direct, indirect or consequential\ndamages or any material or immaterial damages whatsoever resulting from loss of data,\ntime or profits arising from use or performance of this software.\n\"\"\"\nimport time\nimport ctypes as ct\nfrom ctypes import byref\nimport sys\nimport struct\n\n# From hhdefin.h\nLIB_VERSION = \"3.0\"\nMAXDEVNUM = 8\nMODE_T2 = 2\nMODE_T3 = 3\nMAXLENCODE = 6\nHHMAXINPCHAN = 8\nTTREADMAX = 131072\nFLAG_OVERFLOW = 0x0001\nFLAG_FIFOFULL = 0x0002\n\n# Measurement parameters, these are hardcoded since this is just a demo\nmode = MODE_T2 # set T2 or T3 here, observe suitable Syncdivider and Range!\nbinning = 0 # you can change this, meaningful only in T3 mode\noffset = 0 # you can change this, meaningful only in T3 mode\ntacq = 1000 # Measurement time in millisec, you can change this\nsyncDivider = 1 # you can change this, observe mode! READ MANUAL!\nsyncCFDZeroCross = 10 # you can change this (in mV)\nsyncCFDLevel = 50 # you can change this (in mV)\nsyncChannelOffset = -5000 # you can change this (in ps, like a cable delay)\ninputCFDZeroCross = 10 # you can change this (in mV)\ninputCFDLevel = 50 # you can change this (in mV)\ninputChannelOffset = 0 # you can change this (in ps, like a cable delay)\n\n# Variables to store information read from DLLs\nbuffer = (ct.c_uint * TTREADMAX)()\ndev = []\nlibVersion = ct.create_string_buffer(b\"\", 8)\nhwSerial = ct.create_string_buffer(b\"\", 8)\nhwPartno = ct.create_string_buffer(b\"\", 8)\nhwVersion = ct.create_string_buffer(b\"\", 8)\nhwModel = ct.create_string_buffer(b\"\", 16)\nerrorString = ct.create_string_buffer(b\"\", 40)\nnumChannels = ct.c_int()\nresolution = ct.c_double()\nsyncRate = ct.c_int()\ncountRate = ct.c_int()\nflags = ct.c_int()\nnRecords = ct.c_int()\nctcstatus = ct.c_int()\nwarnings = ct.c_int()\nwarningstext = ct.create_string_buffer(b\"\", 16384)\n\ntry:\n hhlib = ct.CDLL(\"hhlib64.dll\")\nexcept Exception, e:\n eta.send(\"hhlib64.dll not found. Please copy it to the folder of ETA-Backend.exe\",\"err\")\n \ndef closeDevices():\n for i in range(0, MAXDEVNUM):\n hhlib.HH_CloseDevice(ct.c_int(i))\n exit(0)\n\ndef stoptttr():\n retcode = hhlib.HH_StopMeas(ct.c_int(dev[0]))\n if retcode < 0:\n print(\"HH_StopMeas error %1d. Aborted.\" % retcode)\n closeDevices()\n\ndef tryfunc(retcode, funcName, measRunning=False):\n if retcode < 0:\n hhlib.HH_GetErrorString(errorString, ct.c_int(retcode))\n print(\"HH_%s error %d (%s). Aborted.\" % (funcName, retcode,\\\n errorString.value.decode(\"utf-8\")))\n if measRunning:\n stoptttr()\n else:\n closeDevices()\n\nhhlib.HH_GetLibraryVersion(libVersion)\nprint(\"Library version is %s\" % libVersion.value.decode(\"utf-8\"))\nif libVersion.value.decode(\"utf-8\") != LIB_VERSION:\n print(\"Warning: The application was built for version %s\" % LIB_VERSION)\n\noutputfile = open(\"tttrmode.out\", \"wb+\")\n\nprint(\"\\nMode : %d\" % mode)\nprint(\"Binning : %d\" % binning)\nprint(\"Offset : %d\" % offset)\nprint(\"AcquisitionTime : %d\" % tacq)\nprint(\"SyncDivider : %d\" % syncDivider)\nprint(\"SyncCFDZeroCross : %d\" % syncCFDZeroCross)\nprint(\"SyncCFDLevel : %d\" % syncCFDLevel)\nprint(\"InputCFDZeroCross : %d\" % inputCFDZeroCross)\nprint(\"InputCFDLevel : %d\" % inputCFDLevel)\n\nprint(\"\\nSearching for HydraHarp devices...\")\nprint(\"Devidx Status\")\n\nfor i in range(0, MAXDEVNUM):\n retcode = hhlib.HH_OpenDevice(ct.c_int(i), hwSerial)\n if retcode == 0:\n print(\" %1d S/N %s\" % (i, hwSerial.value.decode(\"utf-8\")))\n dev.append(i)\n else:\n if retcode == -1: # HH_ERROR_DEVICE_OPEN_FAIL\n print(\" %1d no device\" % i)\n else:\n hhlib.HH_GetErrorString(errorString, ct.c_int(retcode))\n print(\" %1d %s\" % (i, errorString.value.decode(\"utf8\")))\n\n# In this demo we will use the first HydraHarp device we find, i.e. dev[0].\n# You can also use multiple devices in parallel.\n# You can also check for specific serial numbers, so that you always know \n# which physical device you are talking to.\n\nif len(dev) < 1:\n print(\"No device available.\")\n closeDevices()\nprint(\"Using device #%1d\" % dev[0])\nprint(\"\\nInitializing the device...\")\n\n# with internal clock\ntryfunc(hhlib.HH_Initialize(ct.c_int(dev[0]), ct.c_int(mode), ct.c_int(0)),\\\n \"Initialize\")\n\n# Only for information\ntryfunc(hhlib.HH_GetHardwareInfo(dev[0], hwModel, hwPartno, hwVersion),\\\n \"GetHardwareInfo\")\nprint(\"Found Model %s Part no %s Version %s\" % (hwModel.value.decode(\"utf-8\"),\\\n hwPartno.value.decode(\"utf-8\"), hwVersion.value.decode(\"utf-8\")))\n\ntryfunc(hhlib.HH_GetNumOfInputChannels(ct.c_int(dev[0]), byref(numChannels)),\\\n \"GetNumOfInputChannels\")\nprint(\"Device has %i input channels.\" % numChannels.value)\n\nprint(\"\\nCalibrating...\")\ntryfunc(hhlib.HH_Calibrate(ct.c_int(dev[0])), \"Calibrate\")\ntryfunc(hhlib.HH_SetSyncDiv(ct.c_int(dev[0]), ct.c_int(syncDivider)), \"SetSyncDiv\")\n\ntryfunc(\n hhlib.HH_SetSyncCFD(ct.c_int(dev[0]), ct.c_int(syncCFDLevel),\n ct.c_int(syncCFDZeroCross)),\\\n \"SetSyncCFD\"\n)\n\ntryfunc(hhlib.HH_SetSyncChannelOffset(ct.c_int(dev[0]), ct.c_int(syncChannelOffset)),\\\n \"SetSyncChannelOffset\")\n\n# we use the same input settings for all channels, you can change this\nfor i in range(0, numChannels.value):\n tryfunc(\n hhlib.HH_SetInputCFD(ct.c_int(dev[0]), ct.c_int(i), ct.c_int(inputCFDLevel),\\\n ct.c_int(inputCFDZeroCross)),\\\n \"SetInputCFD\"\n )\n\n tryfunc(\n hhlib.HH_SetInputChannelOffset(ct.c_int(dev[0]), ct.c_int(i),\\\n ct.c_int(inputChannelOffset)),\\\n \"SetInputChannelOffset\"\n )\n\n# Meaningful only in T3 mode\nif mode == MODE_T3:\n tryfunc(hhlib.HH_SetBinning(ct.c_int(dev[0]), ct.c_int(binning)), \"SetBinning\")\n tryfunc(hhlib.HH_SetOffset(ct.c_int(dev[0]), ct.c_int(offset)), \"SetOffset\")\n tryfunc(hhlib.HH_GetResolution(ct.c_int(dev[0]), byref(resolution)), \"GetResolution\")\n print(\"Resolution is %1.1lfps\" % resolution.value)\n\n# Note: after Init or SetSyncDiv you must allow >100 ms for valid count rate readings\ntime.sleep(0.2)\n\ntryfunc(hhlib.HH_GetSyncRate(ct.c_int(dev[0]), byref(syncRate)), \"GetSyncRate\")\nprint(\"\\nSyncrate=%1d/s\" % syncRate.value)\n\nfor i in range(0, numChannels.value):\n tryfunc(hhlib.HH_GetCountRate(ct.c_int(dev[0]), ct.c_int(i), byref(countRate)),\\\n \"GetCountRate\")\n print(\"Countrate[%1d]=%1d/s\" % (i, countRate.value))\n\nprogress = 0\nsys.stdout.write(\"\\nProgress:%9u\" % progress)\nsys.stdout.flush()\n\ntryfunc(hhlib.HH_StartMeas(ct.c_int(dev[0]), ct.c_int(tacq)), \"StartMeas\")\n\nwhile True:\n tryfunc(hhlib.HH_GetFlags(ct.c_int(dev[0]), byref(flags)), \"GetFlags\")\n \n if flags.value & FLAG_FIFOFULL > 0:\n print(\"\\nFiFo Overrun!\")\n stoptttr()\n \n tryfunc(\n hhlib.HH_ReadFiFo(ct.c_int(dev[0]), byref(buffer), TTREADMAX,\\\n byref(nRecords)),\\\n \"ReadFiFo\", measRunning=True\n )\n\n if nRecords.value > 0:\n # We could just iterate through our buffer with a for loop, however,\n # this is slow and might cause a FIFO overrun. So instead, we shrinken\n # the buffer to its appropriate length with array slicing, which gives\n # us a python list. This list then needs to be converted back into\n # a ctype array which can be written at once to the output file\n outputfile.write((ct.c_uint*nRecords.value)(*buffer[0:nRecords.value]))\n progress += nRecords.value\n sys.stdout.write(\"\\rProgress:%9u\" % progress)\n sys.stdout.flush()\n else:\n tryfunc(hhlib.HH_CTCStatus(ct.c_int(dev[0]), byref(ctcstatus)),\\\n \"CTCStatus\")\n if ctcstatus.value > 0: \n print(\"\\nDone\")\n stoptttr()\n # within this loop you can also read the count rates if needed.\n\ncloseDevices()\noutputfile.close()\n","dpp_templatejvtn1isu":"#This Script Panel will start the time tagging on a quTAG device\r\n#TODO:20181124 This script is not yet tested \r\nfrom ctypes import *\r\nimport time,sys,os\r\neta.send(\"Installing ETA DLC... \", \"running\")\r\nimport webinstall\r\nwebinstall.web_install(\"https://github.com/timetag/timetag.github.io/releases/download/HH400_HG/HH400HeaderGenerator.zip\",\"./\",\"HH400HeaderGenerator.zip\")\r\neta.send(\"ETA DLC installed.\", \"stopped\")\r\neta.send(\"Please find the LabVIEW code at \"+os.getcwd()+\"\\\\HH400HeaderGenerator\")\r\nos.startfile(os.getcwd()+\"\\\\HH400HeaderGenerator\")"} \ No newline at end of file