agen judi bola , sportbook, casino, togel, number game, singapore, tangkas, basket, slot, poker, dominoqq,
agen bola. Semua permainan bisa dimainkan hanya dengan 1 ID. minimal deposit 50.000 ,- bonus cashback hingga 10% , diskon togel hingga 66% bisa bermain di android dan IOS kapanpun dan dimana pun. poker , bandarq , aduq, domino qq ,
dominobet. Semua permainan bisa dimainkan hanya dengan 1 ID. minimal deposit 10.000 ,- bonus turnover 0.5% dan bonus referral 20%. Bonus - bonus yang dihadirkan bisa terbilang cukup tinggi dan memuaskan, anda hanya perlu memasang pada situs yang memberikan bursa pasaran terbaik yaitu
http://45.77.173.118/ Bola168. Situs penyedia segala jenis permainan poker online kini semakin banyak ditemukan di Internet, salah satunya TahunQQ merupakan situs Agen Judi Domino66 Dan
BandarQ Terpercaya yang mampu memberikan banyak provit bagi bettornya. Permainan Yang Di Sediakan Dewi365 Juga sangat banyak Dan menarik dan Peluang untuk memenangkan Taruhan Judi online ini juga sangat mudah . Mainkan Segera Taruhan Sportbook anda bersama
Agen Judi Bola Bersama Dewi365 Kemenangan Anda Berapa pun akan Terbayarkan. Tersedia 9 macam permainan seru yang bisa kamu mainkan hanya di dalam 1 ID saja. Permainan seru yang tersedia seperti Poker, Domino QQ Dan juga
BandarQ Online. Semuanya tersedia lengkap hanya di ABGQQ. Situs ABGQQ sangat mudah dimenangkan, kamu juga akan mendapatkan mega bonus dan setiap pemain berhak mendapatkan cashback mingguan. ABGQQ juga telah diakui sebagai
Bandar Domino Online yang menjamin sistem FAIR PLAY disetiap permainan yang bisa dimainkan dengan deposit minimal hanya Rp.25.000. DEWI365 adalah
Bandar Judi Bola Terpercaya & resmi dan terpercaya di indonesia. Situs judi bola ini menyediakan fasilitas bagi anda untuk dapat bermain memainkan permainan judi bola. Didalam situs ini memiliki berbagai permainan taruhan bola terlengkap seperti Sbobet, yang membuat DEWI365 menjadi situs judi bola terbaik dan terpercaya di Indonesia. Tentunya sebagai situs yang bertugas sebagai
Bandar Poker Online pastinya akan berusaha untuk menjaga semua informasi dan keamanan yang terdapat di POKERQQ13. Kotakqq adalah situs
Judi Poker Online Terpercayayang menyediakan 9 jenis permainan sakong online, dominoqq, domino99, bandarq, bandar ceme, aduq, poker online, bandar poker, balak66, perang baccarat, dan capsa susun. Dengan minimal deposit withdraw 15.000 Anda sudah bisa memainkan semua permaina pkv games di situs kami. Jackpot besar,Win rate tinggi, Fair play, PKV Games
Comments
Basically, yes. There are many ways to determine the onset of a saccade, and the choice for a particular one is fairly arbitrary. If you have implemented your own algorithm, for example by looking at individual samples and seeing when the eyes cross a particular border (as a for example, I don't know what you did, of course), this is bound to give different results from what you what get in the data-viewer, which is based on the Eyelink's built-in detection algorithm, Not necessarily bad, though, just different. However, if you get a lot of 0ms saccade latencies, the algorithm is probably not optimal.
The Eyelink sends a stream of data to the experimenter PC, and this function simply waits until a fixation end event is received. So this function (when used correctly) should give latencies that are approximately like those in the data-viewer. Just approximately, though, because you're still dealing with slight processing and network delays.
Cheers!
Check out SigmundAI.eu for our OpenSesame AI assistant!
Hi Sebastiaan,
I've spoken to Jeroen, and actually this last part doesn't seem to be completely true (and may even be considered a bug):
I happened to have a similar issue to Jeroen at the moment (bottom line is: we had issues with the wait_for_[saccade|fixation]_[start|end] functions; they didn't always seem to wait properly)
What I spotted is that these functions all call wait_for_event(), which in turn does basically this:
The problem lies in that getNextData() doesn't start getting data from the moment in time it is called: it starts from the first datapoint in the buffer. And this buffer isn't automatically cleared during a trial.
So calling wait_for_saccade_end() actually doesn't necessarily block and wait for a saccade; it reads the buffer up to the first ENDSACC event. If this event already occured BEFORE the call to wait_for_saccade_end(), the function actually doesn't wait at all!
The (quick and dirty?) solution I've found is to call
before we do our wait_for_X callsThis clears the link buffer (but maybe also does other things?). A quick test indicates that this indeed ignores events that occured before the wait_for_X call.
Do you know whether this is a complete solution? If so, should the wait_for_event() function actually have this call to reset() in their implementation? Because now they don't do what they describe...
Curious to hear your thoughts!
Wouter
Thanks for pointing that out. I actually didn't know that.
I would be inclined to think so, but best to be sure. Perhaps you guys could post this on the SR Research forum, and see what they say. If they confirm this, we should indeed add a buffer reset to the wait_for_event() function, perhaps in the form of a keyword:
As an aside, do you know whether the same applies to the libeyelink.sample() function. Probably not, right?
Check out SigmundAI.eu for our OpenSesame AI assistant!
Hey Sebastiaan,
Yeah I was hoping you know what resetData() excactly does: its description states:
But it only works when you give it no arguments (and indeed this then seems to clear the buffer);
...But the buffer DOES get cleared before the start of a new trial... maybe the implementation of 'drift_correct' accidentally does that?
libeyelink.sample() is not affected; this uses pylink.getEYELINK().getNewestSample()
A quick search through the SR-boards gives me these relatively interesting threads:
https://www.sr-support.com/showthread.php?2853-DCORR-FAILED-makes-pylink-crash&highlight=resetDATA
https://www.sr-support.com/showthread.php?159-getNextData-return-value-63-(python)&highlight=resetDATA
BTW: the API ref manual also notes the function:
... I couldn't get it to work at first, but maybe that is caused by this function also counting from the the first sample point, not the latest. It might pcovide an interesting alternative to the while d!=eventGDN loop
I'm making a post on the SR-research page later today!
Wouter
The buffer probably starts empty with each startRecording() call, which is called by the eyelink_start_recording plug-in.
Great! If they confirm your suspicion about the buffer (I think they will), libeyelink needs to be patched. But the changes would be trivial.
Would it be possible for you guys to test this and (ideally) submit a patch through GitHub? I will then push out a new version of the plug-ins.
Check out SigmundAI.eu for our OpenSesame AI assistant!
Here's the thread. As I feared, SR-research seems to really be against using resetData()...
https://www.sr-support.com/showthread.php?3198-link-buffer-clearing-it-during-a-trial&p=11812&posted=1#post11812
It seems that their solution for gaze-contingent or event-contingent designs really is to 'call getNextData() as often as possible', i.e. always work in a script which runs within a while-loop and calls getNextData() or getFloatData() every iteration. This doesn't seem to be a solution for the libeyelink.wait_for_event() function, because the buffer might already be filling up before it is called..
I've further tried to clarify the issue; and proposed another possible solution.. I'm really hoping we won't have to redefine the way these functions can be used!
Ok, it seems there's a solution see the SR-research thread:
The following seems best:
in start_recording():
in wait_for_event():
in the while loop, ignore events that occurred before the call to wait_for_event()
I could still add clear_buffer=True to all argument lists in all functions, but I'm not sure if this is still appropriate: we're not really clearing a buffer. Also, what I understood, NOT clearing the buffer and looking for events is actually bad practice, since after a certain delay we don't know what's in the buffer anymore (e.g. I don't know the buffer size and I don't know when this buffer would overflow and start to become unreliable). What do you think?
I'll write a patched version of libeyelink.py tonight, and will test it with Daniel tomorrow. He's testing his functions to send a backdrop to the eyelink PC tomorrow as well, and if all is well, we can submit all these changes at once.
I'll also attempt to update the documentation for these functions where/if necessary
Yes, I agree with pretty much all of it. Perhaps instead of a clear_buffer keyword, there could be an ignore_old keyword (True by default). Otherwise there is no way for the user to retrieve old events through libeyelink.
Regarding the potential buffer overflow: Perhaps there should be an explicit resetBuffer() call in start_recording(). As you pointed out, it appears that the buffer is cleared at recording start anyway. But maybe not always (?), so adding a resetBuffer() to be sure won't hurt.
Cheers!
Check out SigmundAI.eu for our OpenSesame AI assistant!
The fix worked! Daniel and I are putting this together and I hope we can push the changes later today.
you mean the pylink resetData() function I spoke of earlier? I'm not sure.. I can't seem to find what this function does exactly -- and the SR-people's responses are somewhat off-putting . Furthermore, start_recording() already makes calls to
...so it would seem buffer clearing is already resolved. As for an ignore_old keyword; I'll put it in, (i.e. if set to false, don't bother to check the timing of the event) but I'm not sure how reliable this will be; if you look at this thread, the SR-folks state:
This suggests that already after 200ms, buffer data will become unreliable... I'm thinking that if you want to provide users the option to inspect datapoints 'from the past', functions like startPlayBack() should be the way to go.
Agree?
One final issue; the wait_for_event() functions currently also return a timestamp, defined by d.getTime() ; This is, however, the timestamp of the event on the Eyelink Host. Now that libeyelink knows the time difference between the two, we could change these functions to return:
which would you prefer? I'd say the first: its easy to implement and interpret, and it makes the return value compatible with other timing functions used in OS.
Good.
Well, in that case maybe leave it. I guess this option will hardly be used anyway, and people can always refer directly to the pylink API if they need some functionality that is not supported by libeyelink.
I don't understand the reference to startPlayBack() to be honest: Is that an existing pylink function, or do you suggest adding a new function by that name to libeyelink?
Yes, I agree.
Check out SigmundAI.eu for our OpenSesame AI assistant!
Alright, it seems we're completely on the same page then, and I'll implement these changes and send them to Daniel:
Oh sorry, I spotted that function in the Pylink API ref man (that's also where I got my function descriptions from). There are a couple of functions listed there, intended for 'playback' mode, and what I get from it, its a way to 'rewind' the datafile and fetch the samples again.
I meant it in a "if we ever want to give users the option of looking at past sample points and events, it seems we would in the future have to write wrappers around these playback functions; using those seems to be the 'clean' way, contrasted to using buffer data".
Here's the ref manual.. a bit dated but it's worked for me so far.
Thanks (for the manual and the work on the Eyelink plug-in)! Daniel submitted the changes, and I just pushed out an update: https://github.com/smathot/opensesame_eyelink_plugins/tags
Check out SigmundAI.eu for our OpenSesame AI assistant!
Ok this is getting interesting (and annoying):
I tested my fix with wait_for_saccade_end(), which was the function I personally needed, which worked perfectly. The behavior of the other wait_for_ functions was fine: they waited and didn't break on past events.
However, today I conducted some more tests with the other wait_for functions; a simple experiment where all 4 wait_for_functions were called in sequence (looped 5x) and this was the output.
The output was disturbing; all timing data seemed fine, but gaze data was -32768.0 for all events other then ESACC.
Some research on this number had me land on an eye_data C header file, with the code fragment:
Looking for MISSING_DATA in the pylink API again, brough up the following segment:
But also (in a section on parsing event data):
These functions are not in set in libeyelink.py , so I'm guessing the eyelink configuration file is set to actually not send this data across, except for ESACC data!
This is very possible, as it would correspond to the flags FIXAVG and NOSTART:
(pylink API:)
...my .asc don't seem to have a 'link_event_data' entry (result from simple grep) so I'm guessing there's a data.ini file bothering us.
Proposed quick test/fix: I'll quickly patch libeyelink that it sends an appropriate command upon initialization.
if this works,
Proposed final fix: I don't know what the downside of sending 'everything' is, but one of the following might be a solution:
What do you think?
Wouter
Oh wait, I just gave libeyelink.py a proper look, and spotted (~line 138):
Thanks for trying to sort this mess out! And, indeed, from what you say it appears that the main problem is that link_event_data has not been properly set.
No, I have not tested this in any systematic way. Basically, I have grabbed these lines (and a lot of other stuff as well) from an example that came with PyLink.
From the PyLink docs, it appears that many of these commands can be set in two ways. Either by calling setEventFilter() (or similar functions), or by sending a link_event_filer = (...) command through sendCommand(). I think the function API is cleaner though, and less error-prone, so feel free to convert these string commands to the corresponding function calls.
I couldn't say for sure, although I do believe I kept the general structure of the PyLink example, which I assume was correct. What makes you think there is a problem here?
That's a good question. The fact that the default is to not send everything suggests that there is a downside, but you would have to ask the Eyelink guys.
That would be ideal, yes. The default should then be that everything is sent, to protect the user from missing data.
The bottom line ...
... is that there should be a setLinkEventData() / link_event_data = (...) call to make sure that sufficient data is sent across the link. Ideally, we would make this and the link event filter configurable through the GUI. Perhaps this last part is only necessary if the Eyelink guys tell us if there is any reason to not send everything through the link.
Check out SigmundAI.eu for our OpenSesame AI assistant!
Ok, progress! I sent a 'link_event_data' command to the tracker, and immediately the return values made more sense.
So you can ignore my questions regarding whether the commands would have been sent too early, or whether it should be strings or possible event_data constants: it seems sending a simple command string on initialization of the tracker is indeed the way to solve this.
BUT! off course things didn't completely work right away. All events seem to behave except for the saccade_start event. I detailed the behaviour in another thread on the SR-support forum, as it just screams 'bug!'
In the same thread I also asked this question; I'm curious what they say.
I truly feel this should be the LAST issue with waiting for events! -knock on wood-
Wouter
Alright, here it is:
it seems the pylink library does something weird with the SSACC event link data, and my SR-guy seems reluctant to admit it. I just ran a test after my latest post in that thread, printing every field in SSACC float_data and comparing it to the accompanying EDF output: (1 trial w/ 2 saccades)...(bold text is markdown's translation of double underscore):
This is inconsistent with what 'my SR-research guy' says. The start gaze data definitely seems to be incorporated in the event, just set wrong.
What do you want to do? I suggest:
I'm more than willing to write this fix for libeyelink.py btw.
Wouter
Hi Wouter,
First off, let me say that this is great work.
From the thread I reckon he means that there is a bug (which is obvious I'd say). But the nature of the bug is that there is any position data in the SSACC event at all. Apparently the intended behaviour is for the SSACC event to come without position data. This makes sense given that the EDF file also works that way (i.e. the SSACC line contains only a timestamp, and no position data). My guess is that, as you also suggest in the post, the fact that the SFIX (which also doesn't have position info in the EDF file) does give reliable data position is an accident, and not something that we should rely on for libeyelink (for 'your guy' ;-) to confirm, of course).
Agreed.
Yes, please
Check out SigmundAI.eu for our OpenSesame AI assistant!
Thanks, and no problem! It's definitely one of those issues that I got determined to get to the root of and get it fixed!
Anyway, new progress! It turns out actually we should be able to get gaze data from SSACC, and that this IS garbled up in the pylink event data:
thread
This will be fixed in the upcoming pylink release, but I don't know when that will come out. They are now working on a 'temporary fix'.
As for Opensesame; I don't know yet what their 'temporary fix' could be, but as of yet I envision 3 possible workarounds for wait_for_saccade_start()
Either way, these methods should be updated once the new pylink release is out, and checks should ensure that users will not combine the wrong implementation with the wrong pylink version, right?
Should I implement a check somewhere (like Daniel's "Forward compatibility" lines in the set_backdrop function)? Do you like the idea to define the function conditionally? Some way of overloading, e.g. in __init__():
...maybe I am getting ahead of things and should I wait for their 'temporary fix', but I have doubts that it'll be something general that is applicable to Opensesame.
Wouter
Edit: Just got a message from them:
Hey Sebastiaan,
I've suggested some changes to libeyelink.py which are now being committed by Daniel. I went for the conditional function definition I outlined above, simply because it seemed easiest.
In short, the changes are:
->in __init__():
'link_event_data = ...' command sent (i.e. send 'everything', maybe I'll get to that checkbox we discussed above one day; or you might feel up to it)
tracker_display_delay renamed to exp_eyelink_delay, cf. "the delay that exp has on eyelink". (seemed more transparant: its definition is trackerTime - exp.time)
pylink version check, catching SSACC event bug
if pylink version is before 1.0.0.28, wait_for_saccade_start is redefined
->a function get_exp_eyelink_delay() was added. This might prove useful if people want to retrieve this difference (I myself have already used it)
->In all wait_for_-event- functions:
updated DOCs
increased transparency
->and finally:
__wait_for_saccade_start_pre_10028() was added. To be used as internal function, added to correct for pylink SSACC bug. I've left the docstring for this function: is that sufficient to make it not appear in the documentation?
...Unfortunately, the eyelink guys have a messed up their version system: Daniel has a pylink 1,0,0,43 version, and in this version the SSACC data is still scrambled. I'll confront them with this, and see whether they know a better way to check whether SSACC data will be parsed good or scrambled.
If you agree on all of this, I'd say case closed! But of course I'm very open to suggestions or other changes before you put the new version up for download
Wouter
Ok, great! I merged the pull request.
Good detective work. I was wondering, though: Why the magic version 1.0.0.28? Do the Eyelink guys say that all later versions do no longer suffer from this bug, and that all earlier versions do? (Maybe I missed that part of the discussion.)
I have some thoughts:
In general, I think this is a good approach, but it should be full proof. Since you mention that it's not, we might be better off just adding a warning to the docstring. I'm worried that we might confuse things even more by sometimes catching this bug. And: are we sure that all versions before 1.0.0.43 also suffer from this bug? It might be a regression that was introduced at some point, in which case this fix actually causes a bug for some users.
Yes, or more specifically: You did add a docstring (which is good, of course), but no <DOC> tags. And indeed, these tags are used to determine which functions should mentioned in the documentation. This is not something that's built-in to Python the way that docstrings are, it's just how my documentation script parses the source code.
Yes, that's indeed a very useful function. The naming is a bit odd, though: To me it suggests that it returns the roundtrip time to the tracker or something along those lines. I.e. that it tells you how much delay there is between the tracker registering an event and your experiment knowing about it, if that makes sense. I'm not sure what an intuitive name would be. Perhaps something like get_eyelink_clock_async?
But these are all basically small things. The main thing is that all data is now sent through the link, and that by itself is worth an update. So let me know what you think of the above. Then we may or may not change some minor things and tag the 0.21 release.
Cheers!
Check out SigmundAI.eu for our OpenSesame AI assistant!
Hi Sebastiaan,
The simple reason was that the current version has pylink.version.vernum = (1,0,0,27) and the fixed versions I got yield (1,0,0,28) or higher. I concluded version numbers must go up, and a simple check for vernum == 1,0,0,28 or higher should do ... I concluded Daniel's version would have to be a mere exception, and I had not yet considered the possibility of a regression
I'll wait for SR's reply on this issue to see whether a different check should / could be implemented. If there is no way to catch all possibilities, we'll have to settle for a warning in the docstring, that some pylink versions suffer from this bug.
Yeah I see your issue. The reason for delay was that I thought the name could indicate in which direction the asynchrony was, but I guess the documentation would be the place to clarify this. I'd be fine with async, or tdiff ... or something with offset? I'm horrible with transparent namings
Wouter
Hey Sebastiaan,
First off, happy new year!
I saw today that you committed the suggested changes, aside from the potential version issue. Well, It seems the SR guys are back to work, and I just got a reply from Nabil, the SR-guy who helped Daniel (and got him hooked on 1,0,0,43) in my SR-thread.
https://www.sr-support.com/showthread.php?3208-Event-data-from-the-link-buffer&p=12006#post12006
It seems, that to prevent any version issues, we are now allowed to simply bundle opensesame with a version of pylink that works ... In that case we can simply ignore my dynamic 'hack'
Wouter
Same to you!
Yep, I tested it a (little) bit as well, and I think it's ready to be tagged as a new release. I also added some minor tidbits myself, such as the possibility for eyelink_log to automatically detect and log variables.
That would be great, but see my comment on the SR Research forum thread. The question is whether their permission to distribute PyLink along with OpenSesame is sufficient, because they appear to explicitly forbid further redistribution (and that wouldn't be compatible with the conditions under which OpenSeame is distributed). So I guess we'll first see what their take is on this.
Cheers!
Check out SigmundAI.eu for our OpenSesame AI assistant!
Hey Sebastiaan,
Yeah, it almost seems too good to be true. Let's hear what they say.
In the meantime, I've run into yet ANOTHER issue when analyzing my gaze-contingent experiment that got me involved in this. I think this needs to be addressed before a new release is tagged.
Between sending a msg to tthe tracker and having it appear in the edf, there's a delay (~20ms). Therefore, to get accurate saccade latencies, I use the following code:
Then, when analyzing the edf, I use the tstamp in the message, not the tstamp of the message.
However, when looking at the latencies of an experiment >1h, I see an almost linear increase of latencies over trial index, up to ~1500ms.
My explanation would be that, unfortunately, the clocks not only differ in offset, but also in speed: 1ms in OS is not exactly 1ms on the tracker. In this case, eyelink_clock_async becomes more and more unreliable during the experiment. (...and therefore also wait_for_X would become unreliable)
I see 2 possible solutions:
eyelink_clock_async is updated every trial, upon start_recording. Although this does not work for 'long trials', such as when watching a video.
get_eyelink_clock_async() is used, which would not simply be a getter, but computes trackertime - ostime everytime it is called. This -maybe- has the risk of becoming a somewhat costly operation when it is called frequently (i.e. in wait_for_X)
I'd say we give option 2 a try; or do you see other possibilities?
Option 2 is probably the better, one, yes. Particularly because there is no rule that says you cannot make a single trial very long — long enough for some divergence to build up. The cost of syncing with every call is probably not that much. Still, we could also consider a third option, which is to keep track of the last time that the clocks have been synced, and resync if this more than, say, 5 seconds ago (not sure if this is worth the trouble, though).
It's very strange that the clocks differ so significantly in their ticking speed. I doubt that this is an issue with OpenSesame or PyLink per se, as they both (I assume) rely on the system clock. Perhaps one of the computers is a bit off. At any rate, whatever the reason for this problem, it's clearly a possibility that needs to be taken into account.
Check out SigmundAI.eu for our OpenSesame AI assistant!
Quick intermediate result: I just implemented it, and I don't notice any lag when get_clock_async() calls getTrackerTime() instead of returning a variable. (I also called get_clock_async() from within wait_for_event(), instead of using said variable. )
The short answer seems to be that it wouldn't be worth the trouble. I also can't yet envision where this should be done..? In a separate background thread?
I honestly wouldn't know; if I use the timestamp of the message everything is fine, and I don't see another option than that the two clocks are not synchronized. Perhaps the Eyelink itself doesn't (fully) use the system clock but simply counts its samples (assuming 1000Hz sampling) or something. In that case, a 1.5s mismatch over the course of an hour isn't too bad.
Either way; I'll change the function and remove the variable again, and make sure the changes get to you.