Code Monkey home page Code Monkey logo

profile_collection's People

Contributors

ambarb avatar awalter-bnl avatar cmazzoli avatar danielballan avatar gwbischof avatar johnsinsheimer avatar lcdesilva avatar licode avatar maffettone avatar mrakitin avatar stuwilkins avatar tacaswell avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

profile_collection's Issues

Adjust custom EPICS PV logic for kill motors to perform logic in ophyd using default PVs

The solution provided in #83 depended on a Kill-STS PV that was custom built by John.

So for this kill motor, I made a new PV which is really a subset of another PV. The logic in EPICS is

record(calc, "$(SYS)$(DEV)Kill-Sts") {
  field(INPA, "$(SYS)$(DEV)Sts:1-Sts CPP")
  field(CALC, "(A>>11&1)=0")
}

which means its taking the PV that exists everywhere for turbo pmac, $(SYS)$(DEV)Sts:1-Sts , generically, and its doing the operation on its value:
value>>11&1 and asking if that is equal to 0? If yes, then Kill-Sts is set to 1, if it not equal 0, Kill-Sts is set to 0.

We can embed this logic into the ophyd read back instead, so that it generically maps to all motors without need for custom EPICS database entries.

Will take some modification of class PMACKiller(EpicsSignal):

[fccd class] bug in fccd.exposure

There was a typo in a script that

  • prevented any further RE exectution because a .set() was in progress
  • the fccd would change from 0.02s exposure to 0.3s exposure after a period of time (30s or more)
  • several quits of bluesky did not resolve
  • ioc restart resolved

So there is a recovery process, but this function should be more robust because it is 1) confusing for typical user if they make this mistake and 2) i was on a very bright bragg so it was lucky that I was here to block the beam instead of home sleeping.

@cmazzoli @wen-hu

def plan_end_200K():
    yield from  mv(inout, 'Out')
    #Rod scans
    print('\n\n****** bragg now *****\n\n')
    yield from mv(fccd.exposure,(0.02,0.3,18*2))  ###
    #yield from bps.sleep(60*5)
    yield from mv(fccd.exposure,(3,0,18*2))  ###

There should have been a plan after the first fccd.exposure instead of setting another exposure time.

Here is the traceback:

In [6]: RE(plan_end_200K())
                                                                                                                                                                                                   

****** bragg now *****


---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
~/Beamline/ScienceComm/2018_11_MuR/20181120_dinner.py in <module>()
----> 1 RE(plan_end_200K())

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/run_engine.py in __call__(self, *args, **metadata_kw)
    668                     # it (unless it is a canceled error)
    669                     if exc is not None:
--> 670                         raise exc
    671 
    672             if self._interrupted:

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/run_engine.py in _run(self)
   1118             self.log.error("Run aborted")
   1119             self.log.error("%r", err)
-> 1120             raise err
   1121         finally:
   1122             # Some done_callbacks may still be alive in other threads.

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/run_engine.py in _run(self)
    996                         try:
    997                             msg = self._plan_stack[-1].throw(
--> 998                                 self._exception)
    999                         except Exception as e:
   1000                             # The current plan did not handle it,

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in __call__(self, plan)
   1236         plan = monitor_during_wrapper(plan, self.monitors)
   1237         plan = baseline_wrapper(plan, self.baseline)
-> 1238         return (yield from plan)

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in baseline_wrapper(plan, devices, name)
   1092         return (yield from plan)
   1093     else:
-> 1094         return (yield from plan_mutator(plan, insert_baseline))
   1095 
   1096 

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     73             # if we have a stashed exception, pass it along
     74             try:
---> 75                 msg = plan_stack[-1].throw(exception)
     76             except Exception as e:
     77                 # if we catch an exception,

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in monitor_during_wrapper(plan, signals)
    722     plan1 = plan_mutator(plan, insert_after_open)
    723     plan2 = plan_mutator(plan1, insert_before_close)
--> 724     return (yield from plan2)
    725 
    726 

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     73             # if we have a stashed exception, pass it along
     74             try:
---> 75                 msg = plan_stack[-1].throw(exception)
     76             except Exception as e:
     77                 # if we catch an exception,

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     73             # if we have a stashed exception, pass it along
     74             try:
---> 75                 msg = plan_stack[-1].throw(exception)
     76             except Exception as e:
     77                 # if we catch an exception,

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in fly_during_wrapper(plan, flyers)
    780     plan1 = plan_mutator(plan, insert_after_open)
    781     plan2 = plan_mutator(plan1, insert_before_close)
--> 782     return (yield from plan2)
    783 
    784 

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     73             # if we have a stashed exception, pass it along
     74             try:
---> 75                 msg = plan_stack[-1].throw(exception)
     76             except Exception as e:
     77                 # if we catch an exception,

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     73             # if we have a stashed exception, pass it along
     74             try:
---> 75                 msg = plan_stack[-1].throw(exception)
     76             except Exception as e:
     77                 # if we catch an exception,

~/Beamline/ScienceComm/2018_11_MuR/20181120_dinner.py in plan_end_200K()
     42     yield from mv(fccd.exposure,(0.02,0.3,18*2))  ###
     43     #yield from bps.sleep(60*5)
---> 44     yield from mv(fccd.exposure,(3,0,18*2))  ###
     45     yield from scan_L_aboveBragg()
     46     print('\n\n****** done above, now below *****\n\n')

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/plan_stubs.py in mv(*args)
    240     step, = utils.merge_cycler(cyl)
    241     for obj, val in step.items():
--> 242         ret = yield Msg('set', obj, val, group=group)
    243         status_objects.append(ret)
    244     yield Msg('wait', None, group=group)

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    161         try:
    162             # yield out the 'current message' and collect the return
--> 163             inner_ret = yield msg
    164         except GeneratorExit:
    165             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    161         try:
    162             # yield out the 'current message' and collect the return
--> 163             inner_ret = yield msg
    164         except GeneratorExit:
    165             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    161         try:
    162             # yield out the 'current message' and collect the return
--> 163             inner_ret = yield msg
    164         except GeneratorExit:
    165             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    161         try:
    162             # yield out the 'current message' and collect the return
--> 163             inner_ret = yield msg
    164         except GeneratorExit:
    165             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    161         try:
    162             # yield out the 'current message' and collect the return
--> 163             inner_ret = yield msg
    164         except GeneratorExit:
    165             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/run_engine.py in _run(self)
   1068                         # exceptions (coming in via throw) can be
   1069                         # raised
-> 1070                         response = yield from coro(msg)
   1071                     # special case `CancelledError` and let the outer
   1072                     # exception block deal with it.

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/asyncio/coroutines.py in coro(*args, **kw)
    208         @functools.wraps(func)
    209         def coro(*args, **kw):
--> 210             res = func(*args, **kw)
    211             if (base_futures.isfuture(res) or inspect.isgenerator(res) or
    212                 isinstance(res, CoroWrapper)):

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/run_engine.py in _set(self, msg)
   1822         group = kwargs.pop('group', None)
   1823         self._movable_objs_touched.add(msg.obj)
-> 1824         ret = msg.obj.set(*msg.args, **kwargs)
   1825         p_event = asyncio.Event(loop=self.loop)
   1826         pardon_failures = self._pardon_failures

/epics/xf/23id/ipython/profile_collection/startup/csx1/devices/areadetector.py in set(self, exp)
    191             # Set delay generator
    192             self.parent.dg1.A.set(aa)
--> 193             self.parent.dg1.B.set(bb)
    194             self.parent.dg1.C.set(cc)
    195             self.parent.dg1.D.set(dd)

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/ophyd/signal.py in set(self, value, timeout, settle_time)
    928         '''
    929         if not self._put_complete:
--> 930             return super().set(value, timeout=timeout, settle_time=settle_time)
    931 
    932         # using put completion:

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/ophyd/signal.py in set(self, value, timeout, settle_time)
    179 
    180         if self._set_thread is not None:
--> 181             raise RuntimeError('Another set() call is still in progress')
    182 
    183         st = Status(self)

RuntimeError: Another set() call is still in progress

[EfixQ] and potentiall tardis.calc.energy

Efixed Q just uses the beamline energy, we don't have a way of keep tracking of the offset. It is too hard to correct.

Options:

  • make sure tardis.calc.energy / 1e4 is in the baseline
  • think about putting plan arguments for energy shift in start document
  • consider configuring tardis.calc.energy as a "normal" read attribute

@cmazzoli, I would like to get your perspective

Deployment 2020-2.0 checklist

Previsit

  • Make sure that the current latest collection environments are pushed to all the bl machines
  • Make sure that the current latest analysis environments are pushed to all the bl machines
  • Skim the IPython startup files in profile_collection
    • Check if it's safe to start bsui remotely (does it touch any hardware?) - use git grep .put or git grep caput
  • Check for outstanding PRs and issues on beamline repos
  • Check if beamline specific packages pushed to the BL machines
  • (Optional) Enable CI

Housekeeping

  • Add BL staff to the BL GitHub organization as owners
  • Work with BL staff to commit any un-committed changes to their profiles
  • Tag the profile as-found as 2019C3.x
  • Discuss with BL staff which conda envs they want to keep/delete and perform the cleanup
  • Check/update the beamline's inventory with the BL staff (in https://github.com/NSLS-II/playbooks/blob/master/production)

Test deployment

[fccd] start document changes to fccd interesection

@cmazzoli and @wen-hu - I see that added fccd_intersection to the start document. That is good info to capture. Can we rename the dictionary to be {'fccd' : {'intersection': [400,400]} }? This would be really helpful for the already implementation of marking the dark images as darks and gain so that we can change get_fastccd_images() to find the most recent dark image: {'fccd': {'image': 'dark' , 'gain':'auto'} } . We can just update() this to the new {fccd: {intersection: [400,400]} }

The only thing I do not know is if this should be in the configuration (descriptors) because if the exposure time matters, then it will be faster to get all of that information out of the database if it is in the same place.....atleast that it what I naively believe. What do you say? Do you want me to confirm if there is a performance gain?

mv(fccd.exposure()) doesn't finish "really" before next function is started

@stuwilkins @tacaswell @danielballan @mrakitin @awalter-bnl
I am not sure if the bug is with mv(fccd.exposure()) or with ct_dark_all. Both are defined in the profile.

Basically, I had to add a sleep so that the number of images where changed in time before the next function read what the number of images was before changing and then resetting.

def O_Kedge_25K():
    num_lights = 900#14400
    num_darks =20#100

    yield from mv(fccd.exposure,(0.1, 1, num_lights))
    yield from bps.sleep(2)        ###################  ADDED THIS LINE TO FIX BEHAVIOR  #####
    yield from ct_dark_all(num_darks)
    print('First lights with .1s exposure')
    yield from count([fccd],md={'purpose':'XPCS O K same exp time'})

Bad behavior

I wanted 900 images with count() and only got 20

In [287]: RE(O_Kedge_25K())                                                                                                                                         

Starting procedure to acquire darks 9.3Hz or 0.108s.

	Current number of images = 900.

	Setting to 20 images.

                                                                                                                                                                    

Gain bit set to 0 for a gain value of auto

Transient Scan ID: 120117     Time: 2019-06-27 23:39:47
Persistent Unique Scan ID: 'b1677387-5372-4d82-b483-6f4746401dfe'
New stream: 'baseline'
New stream: 'primary'                                                                                                                                               
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|   seq_num |       time | fccd_stats1_total | fccd_stats2_total | fccd_stats3_total | fccd_stats4_total | fccd_stats5_total |
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|         1 | 23:40:11.0 |             -1133 |           -122723 |              -567 |           -308869 |          -1519351 |
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
generator count ['b1677387'] (scan num: 120117)


Gain bit set to 1 for a gain value of x2

Transient Scan ID: 120118     Time: 2019-06-27 23:40:11
Persistent Unique Scan ID: 'b45229f8-4742-4d7e-8504-6e4ec30c037b'
New stream: 'baseline'
New stream: 'primary'                                                                                                                                               
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|   seq_num |       time | fccd_stats1_total | fccd_stats2_total | fccd_stats3_total | fccd_stats4_total | fccd_stats5_total |
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|         1 | 23:40:35.9 |         -82821021 |       -3041218805 |         -12523402 |      -11983369898 |      -30074223585 |
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
generator count ['b45229f8'] (scan num: 120118)


Gain bit set to 2 for a gain value of x1

Gain bit set to 2 for a gain value of x1

Transient Scan ID: 120119     Time: 2019-06-27 23:40:36
Persistent Unique Scan ID: '11a19b25-44fb-4cf6-8305-49a0e6565509'
New stream: 'baseline'
New stream: 'primary'                                                                                                                                               
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|   seq_num |       time | fccd_stats1_total | fccd_stats2_total | fccd_stats3_total | fccd_stats4_total | fccd_stats5_total |
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|         1 | 23:41:00.7 |         -40897647 |       -1506658266 |          -6220041 |       -5937055523 |      -14935057947 |
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
generator count ['11a19b25'] (scan num: 120119)

Returning to intial conditions (pre-count).
        Total images per trigger are NOW:        20                                                                                                                 
	FCCD FCRIC gain value is NOW:		 auto


First lights with .1s exposure
Transient Scan ID: 120120     Time: 2019-06-27 23:41:03
Persistent Unique Scan ID: '3b22c776-e9ba-4c1f-9907-96b30b12969d'
New stream: 'baseline'
New stream: 'primary'                                                                                                                                               
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|   seq_num |       time | fccd_stats1_total | fccd_stats2_total | fccd_stats3_total | fccd_stats4_total | fccd_stats5_total |
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|         1 | 23:41:27.7 |              1681 |             90179 |              -444 |           2495839 |           2590413 |
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
generator count ['3b22c776'] (scan num: 120120)
Out[287]: 
('b1677387-5372-4d82-b483-6f4746401dfe',
 'b45229f8-4742-4d7e-8504-6e4ec30c037b',
 '11a19b25-44fb-4cf6-8305-49a0e6565509',
 '3b22c776-e9ba-4c1f-9907-96b30b12969d')

Excerpt from appropriate behavior after darks are collected

Gain bit set to 2 for a gain value of x1

Transient Scan ID: 120123     Time: 2019-06-27 23:44:45
Persistent Unique Scan ID: 'a031f6be-510b-4955-ba85-db486e293045'
New stream: 'baseline'
New stream: 'primary'                                                                                                                                               
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|   seq_num |       time | fccd_stats1_total | fccd_stats2_total | fccd_stats3_total | fccd_stats4_total | fccd_stats5_total |
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|         1 | 23:45:10.0 |         -40896549 |       -1506623794 |          -6219825 |       -5936917403 |      -14934642767 |
+-----------+------------+-------------------+-------------------+-------------------+-------------------+-------------------+
generator count ['a031f6be'] (scan num: 120123)

Returning to intial conditions (pre-count).
        Total images per trigger are NOW:        900                                                                                                                
	FCCD FCRIC gain value is NOW:		 auto


First lights with .1s exposure
Transient Scan ID: 120124     Time: 2019-06-27 23:45:12
Persistent Unique Scan ID: '3b377bf7-9473-4ceb-8515-3e0a7e5a7874'
New stream: 'baseline'

bluesky dark frames needs a variable number of dark frames

Currently, the number of images requested for a "light" run does not change when collected to replaced expired darks.

Beamline needs to produce some data to determine the number of required dark images so that the result is statistically accurate. This is because the exposure time of the camera varies (0.01s - 5 s). For now, maybe 50 images are a good starting point, and anyone taking exposures longer than 1 or 2 seconds should switch to manual dark collection.

@danielballan @mrakitin @jklynch

[baseline] move nanoposition configuration values to descriptors

@cmazzoli @wen-hu can we move the configuration values to the configuration attributes the baseline list is really long and it will make it easier to read. just talking about dly - icof unless there is a real need to treat these things like readback and setpoint. there is a get_config function that will make uncovering these values easier.

 'nanop_tx',
 'nanop_tx_user_setpoint',
 'nanop_tx_dly',
 'nanop_tx_rtry',
 'nanop_tx_rdbd',
 'nanop_tx_rmod',
 'nanop_tx_cnen',
 'nanop_tx_pcof',
 'nanop_tx_icof',
 'nanop_ty',
 'nanop_ty_user_setpoint',
 'nanop_ty_dly',
 'nanop_ty_rtry',
 'nanop_ty_rdbd',
 'nanop_ty_rmod',
 'nanop_ty_cnen',
 'nanop_ty_pcof',
 'nanop_ty_icof',
 'nanop_tz',
 'nanop_tz_user_setpoint',
 'nanop_tz_dly',
 'nanop_tz_rtry',
 'nanop_tz_rdbd',
 'nanop_tz_rmod',
 'nanop_tz_cnen',
 'nanop_tz_pcof',
 'nanop_tz_icof',
 'nanop_bx',
 'nanop_bx_user_setpoint',
 'nanop_bx_dly',
 'nanop_bx_rtry',
 'nanop_bx_rdbd',
 'nanop_bx_rmod',
 'nanop_bx_cnen',
 'nanop_bx_pcof',
 'nanop_bx_icof',
 'nanop_by',
 'nanop_by_user_setpoint',
 'nanop_by_dly',
 'nanop_by_rtry',
 'nanop_by_rdbd',
 'nanop_by_rmod',
 'nanop_by_cnen',
 'nanop_by_pcof',
 'nanop_by_icof',
 'nanop_bz',
 'nanop_bz_user_setpoint',
 'nanop_bz_dly',
 'nanop_bz_rtry',
 'nanop_bz_rdbd',
 'nanop_bz_rmod',
 'nanop_bz_cnen',
 'nanop_bz_pcof',

potential issue with AreaDetector configuration attributes and how they are defined

@mrakitin @MikeHart85 I remember when you deployed bluesky at the start of 2020-3, there were some questions from you about these nested values

https://github.com/NSLS-II-CSX/xf23id1_profiles/blob/b4084d6220c5c2d4152b740d9c3b0897f0aabe80/profile_collection/startup/csx1/startup/detectors.py#L112

Where you suggesting to only include the top level, and let whatever code sort it out at the end? I don't quite remember what you didn't like or thought was wrong. Perhaps you guys don't remember either. Next time, I will make a better note.

fix patches for databroker 1.2.3

  • 1. inout in baseline reports values that are labeled as floats, not strings. The type() should be changed to string

  • 2. fccd_image shape is taken from top level AD setup. WRitten files should get image shape from the plugin responsibble for writing the image.

For item 2, the HDF plugin writes the file, and the PVs associated with array shape are :

XF:23ID1-ES{FCCD}HDF1:ArraySize0_RBV
XF:23ID1-ES{FCCD}HDF1:ArraySize1_RBV

The raw images is rotated in CSXtools so the user sees something different. The unrotated images has the first number being horizontal, and the second number being veritcal.

After processing by CSXtools, image shape flips axes

This is extra confusing because the raw image is not the image handled through the ROI and STATS plugins so don't change sutff associated with ROI and STATS as this represents the postCSXtools process orientation that use users sees activley in imageJ at the beamline.

[hkl] add lattice to Tardis configuration attributes

the lattice parameters are part of the tardis object but are not saved with the tardis object's configuration attributes.

It seems we are also saving the calculation energy, but these are crazy units. Pete J has PR to hklpy that adds the wavelength to the configuration attributes which makes more since for calculation in a notebook.

TODO

  • Add lattice parameters to tardis configuration data
  • Add wavelength to tardis configuration data

Currently, db[-1]descriptors[0]["configuration"]["tardis"]["data"]:

['tardis_energy',
 'tardis_UB',
 'tardis_theta_user_offset',
 'tardis_theta_user_offset_dir',
 'tardis_theta_velocity',
 'tardis_theta_acceleration',
 'tardis_theta_motor_egu',
 'tardis_delta_user_offset',
 'tardis_delta_user_offset_dir',
 'tardis_delta_velocity',
 'tardis_delta_acceleration',
 'tardis_delta_motor_egu',
 'tardis_gamma_user_offset',
 'tardis_gamma_user_offset_dir',
 'tardis_gamma_velocity',
 'tardis_gamma_acceleration',
 'tardis_gamma_motor_egu']

[fccd] periodic issue that requires restart of bsui

The following worked for a long time and then the plan got "hung up" . Had to restart bsui in order to regain control. This is an intermittent issue.

In [231]: RE(bpp.pchain(ct_dark_all(20), ct([fccd],num=1,md={'purpose':'test und offset -24 & fast shutter & 2x1 bflslt'})))                                                                         

Starting procedure to acquire darks 1.18e+02Hz or 0.009s.

	Current number of images = 5.

	Setting to 20 images.

  A 'deferred pause' has been requested. The RunEngine will pause at the next checkpoint. To pause immediately, hit Ctrl+C again in the next 10 seconds.                                             
Deferred pause acknowledged. Continuing to checkpoint.
^CPausing...
---------------------------------------------------------------------------
RunEngineInterrupted                      Traceback (most recent call last)
~/Beamline/Commissioning/2019_08/defs.py in <module>
----> 1 RE(bpp.pchain(ct_dark_all(20), ct([fccd],num=1,md={'purpose':'test und offset -24 & fast shutter & 2x1 bflslt'})))

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in __call__(self, *args, **metadata_kw)
    754 
    755             if self._interrupted:
--> 756                 raise RunEngineInterrupted(self.pause_msg) from None
    757 
    758         return tuple(self._run_start_uids)

RunEngineInterrupted: 
Your RunEngine is entering a paused state. These are your options for changing
the state of the RunEngine:

RE.resume()    Resume the plan.
RE.abort()     Perform cleanup, then kill plan. Mark exit_stats='aborted'.
RE.stop()      Perform cleanup, then kill plan. Mark exit_status='success'.
RE.halt()      Emergency Stop: Do not perform cleanup --- just stop.


In [232]: RE.abort()                                                                                                                                                                                 
Aborting: running cleanup and marking exit_status as 'abort'...

Returning to intial conditions (pre-count).
        Total images per trigger are NOW:        5                                                                                                                                                   
	FCCD FCRIC gain value is NOW:		 auto


[E 18:29:52.774 run_engine:1257] Run aborted
    Traceback (most recent call last):
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py", line 1150, in _run
        msg = self._plan_stack[-1].send(resp)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1294, in __call__
        return (yield from plan)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1149, in baseline_wrapper
        return (yield from plan_mutator(plan, insert_baseline))
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 790, in monitor_during_wrapper
        return (yield from plan2)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 848, in fly_during_wrapper
        return (yield from plan2)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 267, in pchain
        rets.append((yield from p))
      File "/epics/xf/23id/ipython/profile_collection/startup/csx1/plans/dark_ff.py", line 171, in ct_dark_all
        yield from bps.mv(fccd.fccd1.capture_bgnd, 1)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/plan_stubs.py", line 247, in mv
        yield Msg('wait', None, group=group)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      [Previous line repeated 2 more times]
    bluesky.utils.RequestAbort
Out[232]: []

In [233]: RE.abort()                                                                                                                                                                                 
---------------------------------------------------------------------------
TransitionError                           Traceback (most recent call last)
~/Beamline/Commissioning/2019_08/defs.py in <module>
----> 1 RE.abort()

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in abort(self, reason)
   1007         """
   1008         if self.state.is_idle:
-> 1009             raise TransitionError("RunEngine is already idle.")
   1010         print("Aborting: running cleanup and marking "
   1011               "exit_status as 'abort'...")

TransitionError: RunEngine is already idle.

In [234]: RE(bpp.pchain(ct_dark_all(20), ct([fccd],num=1,md={'purpose':'test und offset -24 & fast shutter & 2x1 bflslt'})))                                                                         

Starting procedure to acquire darks 1.18e+02Hz or 0.009s.

	Current number of images = 5.

	Setting to 20 images.

                                                                                                                                                                                                     
Returning to intial conditions (pre-count).
        Total images per trigger are NOW:        5                                                                                                                                                   
	FCCD FCRIC gain value is NOW:		 auto


[E 18:30:05.022 run_engine:1261] Run aborted
    Traceback (most recent call last):
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py", line 1150, in _run
        msg = self._plan_stack[-1].send(resp)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1294, in __call__
        return (yield from plan)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1149, in baseline_wrapper
        return (yield from plan_mutator(plan, insert_baseline))
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 790, in monitor_during_wrapper
        return (yield from plan2)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 848, in fly_during_wrapper
        return (yield from plan2)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 267, in pchain
        rets.append((yield from p))
      File "/epics/xf/23id/ipython/profile_collection/startup/csx1/plans/dark_ff.py", line 171, in ct_dark_all
        yield from bps.mv(fccd.fccd1.capture_bgnd, 1)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/plan_stubs.py", line 245, in mv
        ret = yield Msg('set', obj, val, group=group)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      [Previous line repeated 2 more times]
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py", line 1208, in _run
        new_response = yield from coro(msg)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/asyncio/coroutines.py", line 120, in coro
        res = func(*args, **kw)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py", line 1955, in _set
        ret = msg.obj.set(*msg.args, **kwargs)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/ophyd/signal.py", line 941, in set
        return super().set(value, timeout=timeout, settle_time=settle_time)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/ophyd/signal.py", line 185, in set
        raise RuntimeError('Another set() call is still in progress')
    RuntimeError: Another set() call is still in progress
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
~/Beamline/Commissioning/2019_08/defs.py in <module>
----> 1 RE(bpp.pchain(ct_dark_all(20), ct([fccd],num=1,md={'purpose':'test und offset -24 & fast shutter & 2x1 bflslt'})))

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in __call__(self, *args, **metadata_kw)
    751                     # it (unless it is a canceled error)
    752                     if exc is not None:
--> 753                         raise exc
    754 
    755             if self._interrupted:

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1260             self._reason = str(err)
   1261             self.log.exception("Run aborted")
-> 1262             raise err
   1263         finally:
   1264             # Some done_callbacks may still be alive in other threads.

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1148                     else:
   1149                         try:
-> 1150                             msg = self._plan_stack[-1].send(resp)
   1151                         # We have exhausted the top generator
   1152                         except StopIteration:

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in __call__(self, plan)
   1292         plan = monitor_during_wrapper(plan, self.monitors)
   1293         plan = baseline_wrapper(plan, self.baseline)
-> 1294         return (yield from plan)

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in baseline_wrapper(plan, devices, name)
   1147         return (yield from plan)
   1148     else:
-> 1149         return (yield from plan_mutator(plan, insert_baseline))
   1150 
   1151 

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in monitor_during_wrapper(plan, signals)
    788     plan1 = plan_mutator(plan, insert_after_open)
    789     plan2 = plan_mutator(plan1, insert_before_close)
--> 790     return (yield from plan2)
    791 
    792 

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in fly_during_wrapper(plan, flyers)
    846     plan1 = plan_mutator(plan, insert_after_open)
    847     plan2 = plan_mutator(plan1, insert_before_close)
--> 848     return (yield from plan2)
    849 
    850 

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in pchain(*args)
    265     rets = deque()
    266     for p in args:
--> 267         rets.append((yield from p))
    268     return tuple(rets)
    269 

/epics/xf/23id/ipython/profile_collection/startup/csx1/plans/dark_ff.py in ct_dark_all(numim, detectors)
    169         # SET TO 1 TO ARM FOR NEXT EVENT so that the FastCCD1 is
    170         # already bkg subt
--> 171         yield from bps.mv(fccd.fccd1.capture_bgnd, 1)
    172 
    173         # take darks

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/plan_stubs.py in mv(*args)
    243     step, = utils.merge_cycler(cyl)
    244     for obj, val in step.items():
--> 245         ret = yield Msg('set', obj, val, group=group)
    246         status_objects.append(ret)
    247     yield Msg('wait', None, group=group)

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1206                         # exceptions (coming in via throw) can be
   1207                         # raised
-> 1208                         new_response = yield from coro(msg)
   1209 
   1210                     # special case `CancelledError` and let the outer

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/asyncio/coroutines.py in coro(*args, **kw)
    118         @functools.wraps(func)
    119         def coro(*args, **kw):
--> 120             res = func(*args, **kw)
    121             if (base_futures.isfuture(res) or inspect.isgenerator(res) or
    122                     isinstance(res, CoroWrapper)):

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in _set(self, msg)
   1953         group = kwargs.pop('group', None)
   1954         self._movable_objs_touched.add(msg.obj)
-> 1955         ret = msg.obj.set(*msg.args, **kwargs)
   1956         p_event = asyncio.Event(loop=self.loop)
   1957         pardon_failures = self._pardon_failures

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/ophyd/signal.py in set(self, value, timeout, settle_time)
    939         '''
    940         if not self._put_complete:
--> 941             return super().set(value, timeout=timeout, settle_time=settle_time)
    942 
    943         # using put completion:

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/ophyd/signal.py in set(self, value, timeout, settle_time)
    183 
    184         if self._set_thread is not None:
--> 185             raise RuntimeError('Another set() call is still in progress')
    186 
    187         st = Status(self)

RuntimeError: Another set() call is still in progress

In [235]: RE(bpp.pchain(ct_dark_all(20), ct([fccd],num=1,md={'purpose':'test und offset -24 & fast shutter & 2x1 bflslt'})))                                                                         

Starting procedure to acquire darks 1.18e+02Hz or 0.009s.

	Current number of images = 5.

	Setting to 20 images.

                                                                                                                                                                                                     
Returning to intial conditions (pre-count).
        Total images per trigger are NOW:        5                                                                                                                                                   
	FCCD FCRIC gain value is NOW:		 auto


[E 18:30:09.994 run_engine:1261] Run aborted
    Traceback (most recent call last):
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py", line 1150, in _run
        msg = self._plan_stack[-1].send(resp)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1294, in __call__
        return (yield from plan)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1149, in baseline_wrapper
        return (yield from plan_mutator(plan, insert_baseline))
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 790, in monitor_during_wrapper
        return (yield from plan2)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 848, in fly_during_wrapper
        return (yield from plan2)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 267, in pchain
        rets.append((yield from p))
      File "/epics/xf/23id/ipython/profile_collection/startup/csx1/plans/dark_ff.py", line 171, in ct_dark_all
        yield from bps.mv(fccd.fccd1.capture_bgnd, 1)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/plan_stubs.py", line 245, in mv
        ret = yield Msg('set', obj, val, group=group)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      [Previous line repeated 2 more times]
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py", line 1208, in _run
        new_response = yield from coro(msg)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/asyncio/coroutines.py", line 120, in coro
        res = func(*args, **kw)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py", line 1955, in _set
        ret = msg.obj.set(*msg.args, **kwargs)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/ophyd/signal.py", line 941, in set
        return super().set(value, timeout=timeout, settle_time=settle_time)
      File "/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/ophyd/signal.py", line 185, in set
        raise RuntimeError('Another set() call is still in progress')
    RuntimeError: Another set() call is still in progress
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
~/Beamline/Commissioning/2019_08/defs.py in <module>
----> 1 RE(bpp.pchain(ct_dark_all(20), ct([fccd],num=1,md={'purpose':'test und offset -24 & fast shutter & 2x1 bflslt'})))

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in __call__(self, *args, **metadata_kw)
    751                     # it (unless it is a canceled error)
    752                     if exc is not None:
--> 753                         raise exc
    754 
    755             if self._interrupted:

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1260             self._reason = str(err)
   1261             self.log.exception("Run aborted")
-> 1262             raise err
   1263         finally:
   1264             # Some done_callbacks may still be alive in other threads.

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1148                     else:
   1149                         try:
-> 1150                             msg = self._plan_stack[-1].send(resp)
   1151                         # We have exhausted the top generator
   1152                         except StopIteration:

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in __call__(self, plan)
   1292         plan = monitor_during_wrapper(plan, self.monitors)
   1293         plan = baseline_wrapper(plan, self.baseline)
-> 1294         return (yield from plan)

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in baseline_wrapper(plan, devices, name)
   1147         return (yield from plan)
   1148     else:
-> 1149         return (yield from plan_mutator(plan, insert_baseline))
   1150 
   1151 

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in monitor_during_wrapper(plan, signals)
    788     plan1 = plan_mutator(plan, insert_after_open)
    789     plan2 = plan_mutator(plan1, insert_before_close)
--> 790     return (yield from plan2)
    791 
    792 

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in fly_during_wrapper(plan, flyers)
    846     plan1 = plan_mutator(plan, insert_after_open)
    847     plan2 = plan_mutator(plan1, insert_before_close)
--> 848     return (yield from plan2)
    849 
    850 

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in pchain(*args)
    265     rets = deque()
    266     for p in args:
--> 267         rets.append((yield from p))
    268     return tuple(rets)
    269 

/epics/xf/23id/ipython/profile_collection/startup/csx1/plans/dark_ff.py in ct_dark_all(numim, detectors)
    169         # SET TO 1 TO ARM FOR NEXT EVENT so that the FastCCD1 is
    170         # already bkg subt
--> 171         yield from bps.mv(fccd.fccd1.capture_bgnd, 1)
    172 
    173         # take darks

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/plan_stubs.py in mv(*args)
    243     step, = utils.merge_cycler(cyl)
    244     for obj, val in step.items():
--> 245         ret = yield Msg('set', obj, val, group=group)
    246         status_objects.append(ret)
    247     yield Msg('wait', None, group=group)

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1206                         # exceptions (coming in via throw) can be
   1207                         # raised
-> 1208                         new_response = yield from coro(msg)
   1209 
   1210                     # special case `CancelledError` and let the outer

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/asyncio/coroutines.py in coro(*args, **kw)
    118         @functools.wraps(func)
    119         def coro(*args, **kw):
--> 120             res = func(*args, **kw)
    121             if (base_futures.isfuture(res) or inspect.isgenerator(res) or
    122                     isinstance(res, CoroWrapper)):

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in _set(self, msg)
   1953         group = kwargs.pop('group', None)
   1954         self._movable_objs_touched.add(msg.obj)
-> 1955         ret = msg.obj.set(*msg.args, **kwargs)
   1956         p_event = asyncio.Event(loop=self.loop)
   1957         pardon_failures = self._pardon_failures

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/ophyd/signal.py in set(self, value, timeout, settle_time)
    939         '''
    940         if not self._put_complete:
--> 941             return super().set(value, timeout=timeout, settle_time=settle_time)
    942 
    943         # using put completion:

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/ophyd/signal.py in set(self, value, timeout, settle_time)
    183 
    184         if self._set_thread is not None:
--> 185             raise RuntimeError('Another set() call is still in progress')
    186 
    187         st = Status(self)

RuntimeError: Another set() call is still in progress

In [236]: RE.abort()                                                                                                                                                                                 
---------------------------------------------------------------------------
TransitionError                           Traceback (most recent call last)
~/Beamline/Commissioning/2019_08/defs.py in <module>
----> 1 RE.abort()

/opt/conda_envs/collection-2019-3.0-csx/lib/python3.7/site-packages/bluesky/run_engine.py in abort(self, reason)
   1007         """
   1008         if self.state.is_idle:
-> 1009             raise TransitionError("RunEngine is already idle.")
   1010         print("Aborting: running cleanup and marking "
   1011               "exit_status as 'abort'...")

TransitionError: RunEngine is already idle.

In [237]:      

Deployment 2021-1.0 checklist

Current collection workstations

xf23id1-ws2  # main "workhorse" collection machine
xf23id1-ws1  # same as ws2, used tangentially for other activities but hot-swap backup for ws2
xf23id1-ws4  # same as ws2, used tangentially for other activities but hot-swap backup for ws2

Previsit

  • Enable Azure-Pipelines CI
  • Make sure that the current latest environments are pushed to all the bl machines
  • Skim the IPython startup files in profile_collection
    • Check if it's safe to start bsui remotely (does it touch any hardware?) - use git grep .put or git grep caput
  • Check for outstanding PRs and issues on beamline repos
  • Branch https://github.com/NSLS-II/playbooks for the purpose of updating the CSX current_env_tag in the production file

Housekeeping

  • Update /opt/conda/.condarc:
    channel_priority: flexible
    channels:
      - nsls2forge
      - defaults
    create_default_packages:
      - anaconda-client
      - pip
    envs_dirs:
      - ~/conda_envs
      - /opt/conda_envs
    ssl_verify: false
    show_channel_urls: True
  • Update conda
    $ su - <your-controls-account>
    $ sudo su -
    # conda activate base  # should be activated by default, but just in case.
    # conda install conda -c defaults
  • Add BL staff to the BL GitHub organization as owners
  • Work with BL staff to commit any un-committed changes to their profiles
  • Tag the profile_collection repository as-found as 2020C2.1 and push to GitHub
    $ git tag 2020C2.1 -m "Before 2021C1.0 deployment"
  • Discuss with BL staff which conda envs they want to keep/delete and perform the cleanup
  • Check/update the beamline's workstation inventory with the BL staff (in https://github.com/NSLS-II/playbooks/blob/master/production)
  • In ~/.bashrc, if necessary, update the logging environment variables to use directory /var/log/bluesky/... and add umask 0002.
    umask u=rwx,g=rwx,o=rx  # 0002
    export BLUESKY_LOG_FILE=/var/log/bluesky/bluesky.log
    export BLUESKY_IPYTHON_LOG_FILE=/var/log/bluesky/bluesky_ipython.log
    and (if needed) create that directory with the following permissions and ownership:
    # sudo mkdir /var/log/bluesky
    # sudo chown -Rv xf23id1:csx /var/log/bluesky
    # sudo chmod -Rv g+rws /var/log/bluesky
    Remember to source ~/.bashrc.
  • Remove explicit setting of ophyd logging level from the first startup script
  • Double-check that if there is an open PR removing handlers, it is merged (and tested).
  • Update vendored copy of PersistentDict to bug-fixed version (see the updated gist snippet: https://gist.github.com/jklynch/a4366b8900ec0c03883403455ae711b2).
  • (#48) Make sure all repos have the BSD-3-Clause licenses (see NSLS-II-SRX/profile_collection#16 as an example)

Test deployment

Finish

Add more fastCCD metadata

We are missing framestore mode. See reference to EPICS code for ADFastCCD.

XF:23ID1-ES{FCCD}cam1:FrameStr
XF:23ID1-ES{FCCD}cam1:FrameStr_RBV

https://github.com/areaDetector/ADFastCCD/blob/7a01726d0f3889d3c27481018d0c9d7f6f2abcb8/FastCCDApp/Db/FastCCD.template#L245-L257

Do we want to add overscan rows? overscan columns are already present. HOwever, overscan columns looks to use the PV for setting, not the RBV PV. @stuwilkins should this be RBV? All of the code written here was done concurrently with the ADFastCDD development and I think this is one that was missed. Or maybe I do not understand something.

XF:23ID1-ES{FCCD}cam1:OverscanCols
XF:23ID1-ES{FCCD}cam1:OverscanCols_RBV

Do we want to add Row instructions from the FastCCD1 plugin that displays live images so we can use this information to automatically shape the image into something the user will want to see when using FrameStore or not using FrameStore?

XF:23ID1-ES{FCCD}FastCCD1:Rows_RBV
XF:23ID1-ES{FCCD}FastCCD1:RowOffset_RBV

Deployment 2020-2.0 checklist

Previsit

  • Make sure that the current latest environments are pushed to all the bl machines
  • Skim the IPython startup files in profile_collection
    • Check if it's safe to start bsui remotely (does it touch any hardware?) - use git grep .put or git grep caput
  • Check for outstanding PRs and issues on beamline repos
  • Check if beamline specific packages pushed to the BL machines
  • (Optional) Enable CI

Housekeeping

  • Add BL staff to the BL GitHub organization as owners
  • Work with BL staff to commit any un-committed changes to their profiles
  • Tag the profile as-found as 2019C3.x
  • Discuss with BL staff which conda envs they want to keep/delete and perform the cleanup
  • Check/update the beamline's inventory with the BL staff (in https://github.com/NSLS-II/playbooks/blob/master/production)

Test deployment

fccd.exposure() needs to be more fault to user entry of acquire period

See below were someone forced an acquired period that is shorter than the necessary, calculated acquire time (due to mechanics of fast shutter)

will this break the camera if it is repeatedly treated in this way?

Input> db[107816].config_data('fccd')['primary'][0]

Output> {'primary': [{'fccd_cam_acquire_time': 0.05750000000000001,
   'fccd_cam_acquire_period': 0.5,
   'fccd_cam_image_mode': 1,
   'fccd_cam_num_images': 240,
   'fccd_cam_sdk_version': 'v1.0.0-RC1-33-gbc490e5',
   'fccd_cam_firmware_version': '0x302D',
   'fccd_cam_overscan_cols': 0,
   'fccd_cam_fcric_gain': 0,
   'fccd_cam_fcric_clamp': 0,
   'fccd_dg2_A': 0.0,
   'fccd_dg2_B': 0.0005,
   'fccd_dg2_C': 0.01,
   'fccd_dg2_D': 0.1,
   'fccd_dg2_E': 0.0,
   'fccd_dg2_F': 1e-06,
   'fccd_dg2_G': 0.004,
   'fccd_dg2_H': 0.005,
   'fccd_dg1_A': 0.0,
   'fccd_dg1_B': 0.0535,
   'fccd_dg1_C': 0.0105,
   'fccd_dg1_D': 0.042,
   'fccd_dg1_E': 0.0,
   'fccd_dg1_F': 0.001,
   'fccd_dg1_G': 0.0035,
   'fccd_dg1_H': 0.0535}]}

LivePlot in zp_setup for 1d-data produced a grid plot

@wen-hu asked about it during the experiment on 10/24/2019. I think the LivePlot is not having any effect when it's specified via subs = [..., LivePlot(...)] and then passed to scan_nd. Only a grid plot from the BestEffortCallback is displayed. The code is located in the local commissioning folder with the plans for the users' scans.

implement standard AD PV in metadata?? What does DAMA recommend

Frame type is not used. Instead we have, for the dark images, created custom md keys for the start document. Maybe this is not needed if we use FrameType and the existing md key 'fccd_cam_fcric_gain', which is in the descriptors document.

[xf23id1@xf23id-ws3 ~]$ caget -d24 XF:23ID1-ES{FCCD}cam1:FrameType
Options t,d,a are mutually exclusive. ('caget -h' for help.)
XF:23ID1-ES{FCCD}cam1:FrameType
    Native data type: DBF_ENUM
    Request type:     DBR_GR_ENUM
    Element count:    1
    Value:            Normal
    Status:           NO_ALARM
    Severity:         NO_ALARM
    Enums:            ( 4)
                      [ 0] Normal
                      [ 1] Background
                      [ 2] FlatField
                      [ 3] DblCorrelation

@johnsinsheimer do you have any idea what DblCorrelation is?

fix baseline to have more relevant data

REMOVE
['m1a_z_actuate',
'm1a_z_stop_signal',
'm1a_z_done',
'm1a_y_actuate',
'm1a_y_stop_signal',
'm1a_y_done',
'm1a_x_actuate',
'm1a_x_stop_signal',
'm1a_x_done',
'm1a_pit_actuate',
'm1a_pit_stop_signal',
'm1a_pit_done',
'm1a_yaw_actuate',
'm1a_yaw_stop_signal',
'm1a_yaw_done',
'm1a_rol_actuate',
'm1a_rol_stop_signal',
'm1a_rol_done',
'pgm_energy_stop_signal',
'pgm_fly_start_sig',
'pgm_fly_stop_sig',
#'pgm_fly_velocity', #check with @tacaswell, but should be in configuration
#'pgm_fly_scan_status', #check with @tacaswell, but should be in configuration
'epu2_gap_stop_signal',
'epu1_gap_stop_signal',
'epu2_phase_stop_signal',
'epu1_phase_stop_signal',
]

Then discuss with @cmazzoli and investigate:

  • nanop's
  • stemp_temp
  • epu1_flt #some to descriptors
  • epu1_rlt #some to descriptors
  • epu1_table --> probably should be descriptors or maybe not? but this is something to ask @danielballan about with V3 db
  • same for EPU2

Update LICENSE files in all CSX repositories

Many repos under this org either lack LICENSE files, or have LICENSE files in a non-standard format that isn't recognized by Github as a normal BSD 3-clause license.

This issue is to summarily update all repos with the standard Brookhaven LICENSE file.

Xspress3: summed spectral data collection

During today's troubleshooting at CSX (see 756d53b), we noticed that the summed spectral data is not saved to the db, just the last frame is stored, which we access with list(hdr.data('xsp3_settings_ch1'))[0]. We need to figure out the way to store it as well.

Attn: @tacaswell

Restructure profile collection

During deployment, @mrakitin and I noticed that the profile_collection is set up in a very non-standard way, with a confusing symlink structure.

This issue is move the profile_collection to the standard location, so that it is in line with other beamlines.

add pid to baseline

need to have the set point, the output and enable status.
should this be in the baseline or the descriptors configuration for the beaseline?

seems like enable status and output are results of a "motor", pid set point is used as motor

therefore it seems like enable and output are configuration attributes, and therefore in the descriptors.

one cause of frozen scans - using ct_dark_all() plan with fast acquition times - intermittent issue

Versions of DAMA software:
- Bluesky : v1.6.3
- Ophyd : v1.5.1
- Databroker : v1.0.6

This problem is old and not consistently occurring. removed all .value in January and that did not help. seems to happen when exposure time is short and "network" robustness.

successful run has the setpoint never change (camonitor) but the readback value does change

[xf23id1@xf23id-ws3 ~/Beamline/Commissioning/2020_07]$ camonitor XF:23ID1-ES{FCCD}FastCCD1:CaptureBgnd_RBV
XF:23ID1-ES{FCCD}FastCCD1:CaptureBgnd_RBV 2020-07-31 18:41:04.261963 Off  ### was the immedate after Enter
XF:23ID1-ES{FCCD}FastCCD1:CaptureBgnd_RBV 2020-07-31 19:06:06.197300 On  ### happened with plan start
XF:23ID1-ES{FCCD}FastCCD1:CaptureBgnd_RBV 2020-07-31 19:06:06.272830 Off  

waiting for it to fail again to capture camonitor


In [301]: RE(mv(fccd.exposure, (0.02, .1, 20)))                                                                                                                
Out[301]: ()

In [302]: RE(bpp.pchain(ct_dark_all(20),rel_scan([fccd],nanop.by,-.1,0.1,201, md={'purpose':'ZP zoom 1/8 cut'})))                                              

Starting procedure to acquire darks 36.4Hz or 0.028s.

	Current number of images = 20.

	Setting to 20 images.

  A 'deferred pause' has been requested. The RunEngine will pause at the next checkpoint. To pause immediately, hit Ctrl+C again in the next 10 seconds.       
Deferred pause acknowledged. Continuing to checkpoint.
^Ctrying a second time
Pausing...
---------------------------------------------------------------------------
RunEngineInterrupted                      Traceback (most recent call last)
~/Beamline/Commissioning/2020_07/MonoStab.py in <module>
----> 1 RE(bpp.pchain(ct_dark_all(20),rel_scan([fccd],nanop.by,-.1,0.1,201, md={'purpose':'ZP zoom 1/8 cut'})))

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py in __call__(self, *args, **metadata_kw)
    796 
    797         if self._interrupted:
--> 798             raise RunEngineInterrupted(self.pause_msg) from None
    799 
    800         return tuple(self._run_start_uids)

RunEngineInterrupted: 
Your RunEngine is entering a paused state. These are your options for changing
the state of the RunEngine:

RE.resume()    Resume the plan.
RE.abort()     Perform cleanup, then kill plan. Mark exit_stats='aborted'.
RE.stop()      Perform cleanup, then kill plan. Mark exit_status='success'.
RE.halt()      Emergency Stop: Do not perform cleanup --- just stop.


In [303]: RE.abort()                                                                                                                                           
Aborting: running cleanup and marking exit_status as 'abort'...

Returning to intial conditions (pre-count).
        Total images per trigger are NOW:        20                                                                                                            
	FCCD FCRIC gain value is NOW:		 auto


Run aborted
Traceback (most recent call last):
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py", line 1353, in _run
    msg = self._plan_stack[-1].send(resp)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1307, in __call__
    return (yield from plan)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1162, in baseline_wrapper
    return (yield from plan_mutator(plan, insert_baseline))
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 170, in plan_mutator
    raise ex
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 123, in plan_mutator
    msg = plan_stack[-1].send(ret)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 803, in monitor_during_wrapper
    return (yield from plan2)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 170, in plan_mutator
    raise ex
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 123, in plan_mutator
    msg = plan_stack[-1].send(ret)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 170, in plan_mutator
    raise ex
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 123, in plan_mutator
    msg = plan_stack[-1].send(ret)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 861, in fly_during_wrapper
    return (yield from plan2)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 170, in plan_mutator
    raise ex
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 123, in plan_mutator
    msg = plan_stack[-1].send(ret)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 170, in plan_mutator
    raise ex
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 123, in plan_mutator
    msg = plan_stack[-1].send(ret)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 268, in pchain
    rets.append((yield from p))
  File "/epics/xf/23id/ipython/profile_collection/startup/csx1/plans/dark_ff.py", line 190, in ct_dark_all
    yield from bps.mv(fccd.fccd1.capture_bgnd, 1)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/plan_stubs.py", line 258, in mv
    yield Msg('wait', None, group=group)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 195, in plan_mutator
    inner_ret = yield msg
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 195, in plan_mutator
    inner_ret = yield msg
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 195, in plan_mutator
    inner_ret = yield msg
  [Previous line repeated 2 more times]
bluesky.utils.RequestAbort
Out[303]: ()

In [304]: RE(bpp.pchain(ct_dark_all(20),rel_scan([fccd],nanop.by,-.1,0.1,201, md={'purpose':'ZP zoom 1/8 cut'})))                                              

Starting procedure to acquire darks 36.4Hz or 0.028s.

	Current number of images = 20.

	Setting to 20 images.

                                                                                                                                                               
Returning to intial conditions (pre-count).
        Total images per trigger are NOW:        20                                                                                                            
	FCCD FCRIC gain value is NOW:		 auto


Run aborted
Traceback (most recent call last):
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py", line 1353, in _run
    msg = self._plan_stack[-1].send(resp)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1307, in __call__
    return (yield from plan)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1162, in baseline_wrapper
    return (yield from plan_mutator(plan, insert_baseline))
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 170, in plan_mutator
    raise ex
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 123, in plan_mutator
    msg = plan_stack[-1].send(ret)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 803, in monitor_during_wrapper
    return (yield from plan2)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 170, in plan_mutator
    raise ex
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 123, in plan_mutator
    msg = plan_stack[-1].send(ret)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 170, in plan_mutator
    raise ex
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 123, in plan_mutator
    msg = plan_stack[-1].send(ret)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 861, in fly_during_wrapper
    return (yield from plan2)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 170, in plan_mutator
    raise ex
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 123, in plan_mutator
    msg = plan_stack[-1].send(ret)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 170, in plan_mutator
    raise ex
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 123, in plan_mutator
    msg = plan_stack[-1].send(ret)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 268, in pchain
    rets.append((yield from p))
  File "/epics/xf/23id/ipython/profile_collection/startup/csx1/plans/dark_ff.py", line 190, in ct_dark_all
    yield from bps.mv(fccd.fccd1.capture_bgnd, 1)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/plan_stubs.py", line 256, in mv
    ret = yield Msg('set', obj, val, group=group, **kwargs)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 195, in plan_mutator
    inner_ret = yield msg
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 195, in plan_mutator
    inner_ret = yield msg
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py", line 195, in plan_mutator
    inner_ret = yield msg
  [Previous line repeated 2 more times]
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py", line 1413, in _run
    new_response = await coro(msg)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py", line 1909, in _set
    ret = msg.obj.set(*msg.args, **kwargs)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/ophyd/signal.py", line 1670, in set
    return super().set(value, timeout=timeout, settle_time=settle_time)
  File "/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/ophyd/signal.py", line 301, in set
    raise RuntimeError('Another set() call is still in progress '
RuntimeError: Another set() call is still in progress for fccd_fccd1_capture_bgnd
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
~/Beamline/Commissioning/2020_07/MonoStab.py in <module>
----> 1 RE(bpp.pchain(ct_dark_all(20),rel_scan([fccd],nanop.by,-.1,0.1,201, md={'purpose':'ZP zoom 1/8 cut'})))

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py in __call__(self, *args, **metadata_kw)
    793             self._task_fut.add_done_callback(set_blocking_event)
    794 
--> 795         self._resume_task(init_func=_build_task)
    796 
    797         if self._interrupted:

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py in _resume_task(self, init_func)
    917                     if (exc is not None
    918                             and not isinstance(exc, _RunEnginePanic)):
--> 919                         raise exc
    920 
    921     def install_suspender(self, suspender):

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1486             exit_reason = str(err)
   1487             self.log.exception("Run aborted")
-> 1488             raise err
   1489         finally:
   1490             if not exit_reason:

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1351                     else:
   1352                         try:
-> 1353                             msg = self._plan_stack[-1].send(resp)
   1354                         # We have exhausted the top generator
   1355                         except StopIteration:

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in __call__(self, plan)
   1305         plan = monitor_during_wrapper(plan, self.monitors)
   1306         plan = baseline_wrapper(plan, self.baseline)
-> 1307         return (yield from plan)
   1308 
   1309 

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in baseline_wrapper(plan, devices, name)
   1160         return (yield from plan)
   1161     else:
-> 1162         return (yield from plan_mutator(plan, insert_baseline))
   1163 
   1164 

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    168                     continue
    169                 else:
--> 170                     raise ex
    171         # if inserting / mutating, put new generator on the stack
    172         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    121             ret = result_stack.pop()
    122             try:
--> 123                 msg = plan_stack[-1].send(ret)
    124             except StopIteration as e:
    125                 # discard the exhausted generator

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in monitor_during_wrapper(plan, signals)
    801     plan1 = plan_mutator(plan, insert_after_open)
    802     plan2 = plan_mutator(plan1, insert_before_close)
--> 803     return (yield from plan2)
    804 
    805 

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    168                     continue
    169                 else:
--> 170                     raise ex
    171         # if inserting / mutating, put new generator on the stack
    172         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    121             ret = result_stack.pop()
    122             try:
--> 123                 msg = plan_stack[-1].send(ret)
    124             except StopIteration as e:
    125                 # discard the exhausted generator

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    168                     continue
    169                 else:
--> 170                     raise ex
    171         # if inserting / mutating, put new generator on the stack
    172         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    121             ret = result_stack.pop()
    122             try:
--> 123                 msg = plan_stack[-1].send(ret)
    124             except StopIteration as e:
    125                 # discard the exhausted generator

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in fly_during_wrapper(plan, flyers)
    859     plan1 = plan_mutator(plan, insert_after_open)
    860     plan2 = plan_mutator(plan1, insert_before_close)
--> 861     return (yield from plan2)
    862 
    863 

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    168                     continue
    169                 else:
--> 170                     raise ex
    171         # if inserting / mutating, put new generator on the stack
    172         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    121             ret = result_stack.pop()
    122             try:
--> 123                 msg = plan_stack[-1].send(ret)
    124             except StopIteration as e:
    125                 # discard the exhausted generator

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    168                     continue
    169                 else:
--> 170                     raise ex
    171         # if inserting / mutating, put new generator on the stack
    172         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    121             ret = result_stack.pop()
    122             try:
--> 123                 msg = plan_stack[-1].send(ret)
    124             except StopIteration as e:
    125                 # discard the exhausted generator

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in pchain(*args)
    266     rets = deque()
    267     for p in args:
--> 268         rets.append((yield from p))
    269     return tuple(rets)
    270 

/epics/xf/23id/ipython/profile_collection/startup/csx1/plans/dark_ff.py in ct_dark_all(numim, detectors)
    188         # SET TO 1 TO ARM FOR NEXT EVENT so that the FastCCD1 is
    189         # already bkg subt
--> 190         yield from bps.mv(fccd.fccd1.capture_bgnd, 1)
    191 
    192         # take darks

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/plan_stubs.py in mv(group, *args, **kwargs)
    254     (step,) = utils.merge_cycler(cyl)
    255     for obj, val in step.items():
--> 256         ret = yield Msg('set', obj, val, group=group, **kwargs)
    257         status_objects.append(ret)
    258     yield Msg('wait', None, group=group)

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    193         try:
    194             # yield out the 'current message' and collect the return
--> 195             inner_ret = yield msg
    196         except GeneratorExit:
    197             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    193         try:
    194             # yield out the 'current message' and collect the return
--> 195             inner_ret = yield msg
    196         except GeneratorExit:
    197             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    193         try:
    194             # yield out the 'current message' and collect the return
--> 195             inner_ret = yield msg
    196         except GeneratorExit:
    197             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    193         try:
    194             # yield out the 'current message' and collect the return
--> 195             inner_ret = yield msg
    196         except GeneratorExit:
    197             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    193         try:
    194             # yield out the 'current message' and collect the return
--> 195             inner_ret = yield msg
    196         except GeneratorExit:
    197             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1411                         # exceptions (coming in via throw) can be
   1412                         # raised
-> 1413                         new_response = await coro(msg)
   1414 
   1415                     # special case `CancelledError` and let the outer

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/bluesky/run_engine.py in _set(self, msg)
   1907         group = kwargs.pop('group', None)
   1908         self._movable_objs_touched.add(msg.obj)
-> 1909         ret = msg.obj.set(*msg.args, **kwargs)
   1910         p_event = asyncio.Event(loop=self.loop)
   1911         pardon_failures = self._pardon_failures

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/ophyd/signal.py in set(self, value, timeout, settle_time)
   1668         '''
   1669         if not self._put_complete:
-> 1670             return super().set(value, timeout=timeout, settle_time=settle_time)
   1671 
   1672         # using put completion:

/opt/conda_envs/collection-2020-2.0rc4/lib/python3.7/site-packages/ophyd/signal.py in set(self, value, timeout, settle_time)
    299 
    300         if self._set_thread is not None:
--> 301             raise RuntimeError('Another set() call is still in progress '
    302                                f'for {self.name}')
    303 

RuntimeError: Another set() call is still in progress for fccd_fccd1_capture_bgnd
n [305]:                                                                                                                                                      

In [305]: fccd.fccd1.capture_bgnd              
                                                                                                                
Out[305]: EpicsSignalWithRBV(read_pv='XF:23ID1-ES{FCCD}FastCCD1:CaptureBgnd_RBV', name='fccd_fccd1_capture_bgnd', parent='fccd_fccd1', value=0, timestamp=1596235264.261963, auto_monitor=False, string=False, write_pv='XF:23ID1-ES{FCCD}FastCCD1:CaptureBgnd', limits=False, put_complete=False)
                                                                                                                                                  

add energy offset to baseline

it is already there for tardis, and tardis actually has corrected energy on top of that. this could be messy because it depends on enforcement. if this is chosen, we need to make a function for people to use when the change the tardis.calc energy. @cmazzoli probably worth a discussion

@johnsinsheimer does the new IOC that you are working on for IOS flyscanning have a PV to be used as a constant offset for exact energy calbration (so the readback + offset). Typically, changing the gratings can create 1 -3 eV shift that does not change the resolution.

Need to disable feedback before blocking beam for counting darks

Screen Shot 2019-06-29 at 2 02 36 PM

I thought we had done this with already since the PID device contains enable. Was it an oversight on my part 2 years ago when I first made these functions are did some one remove it for a good reason? I made these functions when the profiles was in nsls-ii 's repo so I do not know how to trace back the history to that point in time. Is it worth a discussion to understand if this is enable / disable PID should be in the count dark functions or should we use the permits associated with the PID control loop? @cmazzoli @wen-hu @stuwilkins

For now, I just had the users add 10s or so of sleep so that the beam is back on the pinhole before the start data collection.

https://github.com/NSLS-II-CSX/xf23id1_profiles/blob/4cd43f2857aa401cd778de1e8309ebf9435ce0af/profile_collection/startup/csx1/plans/dark_ff.py#L62-L71

https://github.com/NSLS-II-CSX/xf23id1_profiles/blob/4cd43f2857aa401cd778de1e8309ebf9435ce0af/profile_collection/startup/csx1/plans/dark_ff.py#L163-L176

https://github.com/NSLS-II-CSX/xf23id1_profiles/blob/4cd43f2857aa401cd778de1e8309ebf9435ce0af/profile_collection/startup/csx1/devices/optics.py#L51-L59

Add FastShutter (XY positioner) to startup

https://github.com/NSLS-II-CSX/xf23id1_profiles/blob/6ca543a61127d2ee08ee8bcdb677f6f768735904/profile_collection/startup/csx1/devices/optics.py#L122-L124

It seems redundant to make a new class PositionerXY() since SlitsXY() already does the same thing. Is it worth making this the same device for slit 3 (pinholes mounted on a plate with specific x,y coordinates) and the fast shutter (X Y positions to define placement in the beam)? Or better to keep things redanant but separate.

add gratings more setting to header.descriptors

Need more descriptive information in metadata to understand settings for beam line energy configuration. different grating settings focus in different places. Add the grating 1 - 10? for the calibration table.

While making changes to configuration attributes:
#30

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.