Package qubx :: Module express
[hide private]
[frames] | no frames]

Source Code for Module qubx.express

  1  """Top level of the application QUB Express. 
  2   
  3  Copyright 2008-2015 Research Foundation State University of New York  
  4  This file is part of QUB Express.                                           
  5   
  6  QUB Express is free software; you can redistribute it and/or modify           
  7  it under the terms of the GNU General Public License as published by  
  8  the Free Software Foundation, either version 3 of the License, or     
  9  (at your option) any later version.                                   
 10   
 11  QUB Express is distributed in the hope that it will be useful,                
 12  but WITHOUT ANY WARRANTY; without even the implied warranty of        
 13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         
 14  GNU General Public License for more details.                          
 15   
 16  You should have received a copy of the GNU General Public License,    
 17  named LICENSE.txt, in the QUB Express program directory.  If not, see         
 18  <http://www.gnu.org/licenses/>.                                       
 19   
 20   
 21  """ 
 22   
 23  #!/usr/bin/env python 
 24   
 25  # before top-level imports: 
 26  import uuid # glibc bug, needs first in some linuxes 
 27  import gobject 
 28  import multiprocessing 
 29  import os 
 30  import sys 
 31   
 32  QUBX_HOME_PATH = os.path.expanduser('~/.qub-express') 
 33  APPNAME = 'QUB Express' 
 34   
35 -class StdNull(object):
36 - def write(*args, **kw):
37 pass
38 actual_stdout, actual_stderr = sys.stdout, sys.stderr 39 sys.stdout, sys.stderr = StdNull(), StdNull() 40 41 multiprocessing.freeze_support() 42 gobject.threads_init() 43 44 import qubx.splash_main 45 qubx.splash_main.show_splash('Loading %s...' % APPNAME) 46 47 import qubx.tree 48 qubx.tree.CHOOSE_FLAVOR('numpy') 49 50 # top-level utilities and global imports: 51 from qubx.cube import * 52 53 VERSION = "1.12.10" 54 QUBX_VERSION = qubx.global_namespace.QUBX_VERSION = VERSION 55
56 -class ExpressApp(App):
57 - def setup_about(self):
58 try: 59 readme = open(os.path.join(qubx.global_namespace.app_path, 'README.txt'), 'r').read() 60 except: 61 readme = """ QUB Express 62 63 """ 64 try: 65 changelog = open(os.path.join(qubx.global_namespace.app_path, 'QUB_Express_change_log.txt'), 'r').read() 66 except: 67 traceback.print_exc() 68 changelog = '\n(no change log found)\n' 69 try: 70 license = open(os.path.join(qubx.global_namespace.app_path, 'LICENSE.txt'), 'r').read() 71 except: 72 license = "" 73 self.cube.Tools.About.set_text(readme + changelog + license)
74 75 76 if __name__ == '__main__': 77 run_me_first() 78 79 parser = argparse.ArgumentParser() 80 parser.add_argument("-t", "--trace", dest="trace", 81 action="store_true", 82 default=False, 83 help="prints line-by-line trace for debug") 84 parser.add_argument("-s", "--startup-script", dest="startup_script", 85 action="store", default="", 86 help="on startup, executes a python file") 87 (args, extras) = parser.parse_known_args() 88 qubx.global_namespace.args = args 89 qubx.global_namespace.extras = extras 90 qubx.global_namespace.unknown_args = extras 91 92 qubx.global_namespace.DEBUG = DEBUG = False 93 if args.trace: 94 qubx.global_namespace.DEBUG = True 95 tracelog = open('trace', 'w')
96 - def traceit(frame, event, arg):
97 if event == "line": 98 lineno = frame.f_lineno 99 try: 100 filename = frame.f_globals["__file__"] 101 if filename == "<stdin>": 102 filename = "<stdin> " 103 if (filename.endswith(".pyc") or 104 filename.endswith(".pyo")): 105 filename = filename[:-1] 106 name = frame.f_globals["__name__"] 107 line = linecache.getline(filename, lineno) 108 except: 109 name = '<?>' 110 line = '' 111 tracelog.write("%s:%s: %s\n" % (name, lineno, line.rstrip())) 112 tracelog.flush() 113 return traceit
114 sys.settrace(traceit) 115 116 try: 117 app = ExpressApp(APPNAME, VERSION, '.qub-express', has_modeling=True, DEBUG=DEBUG) 118 app.main(startup_script=args.startup_script or os.path.join(qubx.pyenv.env.folder, 'startup_script.py')) 119 except KeyboardInterrupt: 120 pass # quit like they want 121 except Exception, e: 122 dlg = gtk.MessageDialog(None, buttons=gtk.BUTTONS_OK, flags=gtk.DIALOG_MODAL, 123 message_format = traceback.format_exc()) 124 dlg.run() 125 dlg.destroy() 126 127 run_me_last() 128 129 130 131 132 # Fitness 3 docs and videos 133 134 # some qubx docs: 135 # qubx for qub classic users: 136 # Notebook; its menus; direct-writing panel (use throughout to annotate session) 137 # menu triangles 138 # Tables, and clicks leading thereto 139 # Layout, and where things have moved to 140 # model undo 141 # different model mousing (r-drag, l-hold, constraints, wheel/mods on rates) 142 # grabbing amps 143 # model via tables; constraints as generalized 144 # how to use Ligand and Voltage columns 145 # Stimuli, Constants, Modeling: Stimulus 146 # v-sensitive current 147 # Simulation file and panel; wheel on constant; vary/steps 148 # navigate files and segments; zoom; wheel/mod or click on signal controls 149 # data exclusion 150 # Curve fitting 151 # measurement 152 # live amphist, durhist 153 # Charts, select, user-tables 154 # Extract 155 # Modeling: Idealize, Rates, MacRates 156 # Tools:Idealization 157 # Colors, font size, ... 158 # plugins and scripts 159 # show off auto-notebook at end 160 161 # lists, chopping 162 # baseline 163 164 165 ## Release 166 # update the welcome message 167 # update the wiki 168 # update the videos 169 # update the docstrings 170 # write out more math 171 172 173 174 ## the only known use case would be a bad idea? 175 # rates: events e.g. onIteration; properties e.g. LL, iterations 176 # notebook figures on-face-show 177 # conductance or fractional activation instead of current? 178 # extract: join segments (stacked | zero/cls0 between) 179 # ->dwt: optionally fill time gaps with cls 0? 180 181 182 ### Thinking/Working... 183 # jumptrack into table(s) usable by select 184 # sel list undo? 185 # Gleak? (not Cond[0] since it's not per-ion-channel) 186 # user-oriented tables in QubX.Tables: del field? 187 # scriptable qubx.optimizeGTK method and options: reflect changes onscreen 188 # Record button for each AltKey? 189 # CurveFit segments together: capture separate ssr? 190 # helpful messages in idlize, rates, etc.: "check the stimulus" 191 # messages when constraints don't work? 192 # Messages window? 193 # measurement keys? 194 # macosx command lines require full paths (--no-chdir)? 195 # durhist dies if onscreen during startup? 196 # bs exception crap in strategy window 197 # track down doubled scriptable show_file 198 # fix: list bead geometry breaks down at high mag 199 # data_fit: curve-fitting keyboard? 200 # strategy OnLine() etc. 201 # write "Data Source" in green? 202 # "make install" chown root:root 203 # shorthand names for common objects? 204 # how does the relation go between current, noise, Popen? 205 # chop with busy/progress: raise exception to forestall post-processing? 206 # dataview list group menu as enlargeable grid? layer-popup if nec? 207 # data tool cursors? need custom because stock are no good (maybe just different-colored pointer?) 208 # data hires: fix quirk: resize -> change divs -> reset signal 0 from time.sel (or time.sel from signal 0?) 209 210 # scriptable clicks acting on "onscreen, measured in divs from center? left? e.g. baseline nodes by sel 211 # def add_baseline_node(..., timebase=TIMEBASE_LEFT, ...) delegating to add_baseline_nodes_tb? using all keywords in scripts anyway? 212 # distance between e.g. events of class 0? 213 214 # mmap size limits? 215 216 # data undo: zoom, baseline, nodes, ...? 217 218 ## for test script: 219 # extract custom signals func, multi-file 220 221 222 223 224 225 226 # IO exceptions in save etc 227 # stoppable list-fit? 228 # Trials and notebook_table_extensions? 229 # time.Gseg and notebook_table_extensions? 230 # NbChart -> Excel with point-colors 231 # guard against zillion-point curve fitting 232 # bother-me-not checkbox 233 234 # "Start" as perma-column in Lists? 235 236 # script (notebook?) of Data measurement notes 237 # Trials of Star/Chain 238 239 240 # model search: 241 # faster with suppressed iterations? 242 # reliable stopping 243 # message on run/no models 244 245 # [ Presets... |v] [ Discard... ] (tooltip) [ Run Search ] 246 # [ x ] keep only the top [ 20 ] trials 247 # Discard trials with: 248 # [ ] any k0 < [ 1.0e-5 ] 249 # [ x ] any k0 > [ 1.0e5 ] 250 # [ ] any k1 < [ 1.0e-5 ] 251 # [ ] any k1 > [ 2.0 ] 252 # [ ] Amp (open) <, > 253 # Cond (open) <, > 254 # Channel count <, > 255 # LL <, > 256 # [ x ] [ LL > 0.0 ] (tooltip: write an expression using the column names from Trials, e.g. "LL > 0.0") 257 # show_message(exc) only on first error, then ignore/print the rest 258 259 # Survey 260 261 262 # macrates update Classes:Std 263 # macrates/opencl segfault on free data (irregular segments?) 264 # fractional channel count in mac/opencl 265 266 # what fraction of sim/mil/theoretical was missed events? 267 # iter v LL plot while optimizing 268 # state occupancy graph(s)? 269 270 # CurveFit segments together: reset ODEs to t0 271 272 # notebook of picture, arbitrary other size (e.g. overridden by target?) 273 274 # power spectrum log/rebinning a la qub classic? 275 # spectrum: dc-corrected? 276 277 278 # docs 279 280 # which data formats missing? any model formats? 281 # is Chop too hidden? 282 283 # Plugin/Scripting 284 # api guide and regularization 285 # samples and skeletons 286 287 # scriptable baseline nodes: add, relative to screen 288 289 ### scripts not recorded (yet?): 290 # charts palette color 291 # change-event after editing idl or fit 292 # various robots' sync: FitControls, HistFace, Simulation, ...? 293 # model:grab (just final numbers?) 294 # any files requiring user interaction to open or close... 295 296 297 298 # demo script? (main menu -> run demo) 299 300 # also repkg fitness3, build QUB-Fitness.app 301 # fitness replace data-open menuitems to prompt sampled on large files 302 303 304 305 # Scripting 306 # cluster control 307 308 # NbChart -> QtiPlot: honor line color, thickness 309 310 # data markers? 311 # stimulus shapers: Tension 312 # stimulus shaper wizard preview? 313 # bgk sub 314 # custom graphics 315 # energy landscape 316 # idl,data -> wav? 317 # Rates 318 # single: override stop more usefully e.g. mac's stop flag? 319 # doc qubx.fast.model and clients 320 # File List results into Data table? 321 # Notebook 322 # Targets: 323 # linux, mac qtiplot 324 # UNO? 325 # xmeans web app? 326 # min/max image dim? 327 328 # dose-response and other wizardry 329 330 ## Hype 331 # data with picture track e.g. simdata with state images 332 # pytables or something 333 # ghmm:xml or something 334 # unit tests and other standards 335 # nonhomogeneous data: different everything each segment 336 # 1-D LL surface slice live display? 337 338 339 ### maybe never: 340 # obscure extractions: 341 # congruent selections/lists 342 # multiple text layouts 343 # staircase 344 # acquisition? maybe as visual control of daemon process? 345 346 347 ## Survey: 348 # what in About.Data? 349 # what in Default measurement? 350 # priority features? 351 352 353 ## QUB in general: 354 # HMM simulation 355 # HMM event detection 356 # MLL opt for single/ensemble, with constraints 357 # burst statistics and clustering 358 # baseline correction 359 # measurement and histograms 360 361 362 ## Why switch: 363 # zero-click simulation 364 # msl 365 # auto stimulus 366 # model undo 367 # custom measurement 368 # custom auto lab notebook 369 # fewer clicks, fewer legacy options 370 # available for Linux, MacOS X 371 # more multi-core algorithms (Simulation, Rates (MIL), Mac Rates) 372 # record scripts 373 # write plugins 374 375 ## Why classic: 376 # energy landscape 377 # bkg sub 378 # some extract options 379 # some figures 380 # data acquisition 381 # staircase 382 383 384 385 386 387 # QUBIO: Auto-chop at protocol bounds? 388 389 390 391 # invalidate optimizer model on edit constraint field: apparently constraints_kin.OnEdit doesn't fire OnSet because of enforcing bogus constraints... 392 # macrates v-sensitivity, added one-by-one with pressure, doesn't work like opening fully formed model 393 # automate gain-table scaling? 394 # MILRates: use qubopt for MIL (or secretly to start, when num grad dx == 0) 395 # MSL: singular matrix in gauss-j, positive eigenvalues (loop model) 396 # automate measurement and fitting of V vs. single-channel-I (I = G * (V - Vrev)) to find G and Vrev 397 # MILRates: optional switch to DurHist? 398 399 # any way to rename a list? 400 # tableGTK: We should have a TIP marker over each heading as default with the option of turningit off for experienced users. 401 402 # scriptable measure: return meas. index in table 403 404 # read file names from cmdline args and open them 405 406 # check plugin versions, show updates? 407 408 # to fix: undo is making all constraints "generalized" 409 410 # ctrl-click list bead to delete quickly 411 412 # add baseline node every k points? 413 414 415 # trials: no undo buttons 416 # button: copy to new model/replace one that's open? 417 # move the trial viewer to its own pane? 418 419 420 # patchmaster union of present signals (not just signals of first segment) 421 # scaling of patchmaster files 422 423 # penalize mac likelihood by variance of per-point likelihood 424 # or mil: variance of scale array 425 # alt: use it to measure stationarity 426 # plus wald-wolfowitz runs probability of point likelihood 427 428 # ??: stimulus names from Signals or Scope table? 429 # it gets messed up when you change Scope names then use them for model variables 430 431 432 # QubX.Simulation.reset() 433 # sim: multi model 434 # sim: small N-channel idealization? 435 436 # lose Classes:Vrev? 437 438 # auto graph (model) layout? 439 440 441 442 # MPLRates 443 444 # for alab: 445 # quality histogram output 446 # extract/merge 447 # save as text options (segments in columns? x column? delimiter?) 448 449 450 # who uses which eigenvector routine? 451 # qubopt -> scipy if registered as custom, else gsl 452 # qubfast -> old recipe in matrixutil; also called eigen_vals_vecs with boost::ublas types 453 # ratesm -> scipy if provided as custom, else eigen_vals_vecs 454 455 # All Exponentials (DurHist): 456 # how many dwells are needed to resolve all components of a certain distribution (e.g. from model rates)? 457 # (eq. 3, discussion on p.6(2388)) of LandowneMagleby 458 # - simulate lots (1e7 events) 459 # - N(req) = N(sim) * target_llr / llr 460 # as layer on .controls (right of back arrow) until change curve: 461 # "need %i events to resolve these %i components" 462 463 # some confusion on .showing? the sidebar is more populous than it should be in "Windowed" preset 464 465 466 # hassle the user when stimulus is auto-assigned 467 468 469 # just dose-response 470 # take it in steps 471 # 1. pick or build a model with stimulus dependence 472 # 2. pick a standard protocol, or use the ladder wizard, or build freeform 473 # 3. see traces and a table of dose, peak, normalized peak, t_peak, integral 474 # 4. see plots of dose vs. ... 475 # 5. fit them 476 # maybe as a separate panel which orchestrates the others e.g. 477 # 1. You need to build a model in the model window (click to show) 478 # Here's how to add states, connections, stimulus, 479 # and anything else that might be good to know 480 # [ Next ] 481 # 2. You need a stimulus protocol for [name signals here] 482 # (take the liberty of setting up the signals if missing; removing superfluous) 483 # Pick one of these to start with: [ladder etc] 484 # Or use the [ ladder wizard ] 485 # Or build a custom one in the [ Simulation ] window 486 # (You can also edit the standard and wizard outputs here) 487 # [ Prev ] [ Next ] 488 # 3. Results: 489 # See the traces in the [ Data ] window 490 # - [ one at a time ] (faster) 491 # - [ all at once ] 492 # [ See a table of statistics ] (peak current and time, integral) 493 # [ Plot ] * vs. ([x] log10) dose 494 # To fit any plot to a curve, click its fitting icon ([]) 495 496 497 498 499 # mysterious wrong mac curve until reload 500 501 # fix grab v-sens 502 # which v-sens idl amps are final? 503 504 # mac: link opt of channel count and variance (ask fred?) 505 506 # automated mac with 3..2..1 delta resample 507 508 # mismatch between mac txtLL and scrolling text ll? 509 510 #iteration trials: 511 # hold offscreen/offthread until post optimization 512 # ignore when building session 513 514 # pulsate bg of editing table cell 515 516 #dose-response peak/integral as drug discriminator 517 518 # script model saveas 519 520 521 #ext: avg and sum are wrong with custom signal list 522 523 524 # sometimes balance loops prevents rate setting correctly 525 # quick click ieqfv on off with mac live, hangs 526 527 # safer save qsf 528