ratt-ru / meqtrees

A library for implementing radio astronomical Measurement Equations
http://meqtrees.net
10 stars 2 forks source link

Time-varying pointing errors #881

Closed PhilippaHartley closed 5 years ago

PhilippaHartley commented 5 years ago

I would like to be able to add dynamic pointing errors per antenna. I'm currently attempting this using ListOfValues but I realised that only the set of pointing errors for the first integration are applied (and then repeated for subsequent integrations).

I’m looking through the source code to find out how to get the time-dependence in but it looks from the node structure that this is currently only done using functions (the sine and poly ones) which don’t explicitly need to pass a whole list, just a function – which I guess is applied to timestamps elsewhere. Is there an easy way to change this? Thanks

twillis449 commented 5 years ago

I wrote some code to simulate (and solve for) various pointing errors back around 2010. I'll try to find it. @o-smirnov we seem to have ended up with multiple subdirectories for meqtrees related issues,

PhilippaHartley commented 5 years ago

@twillis449 That would be great, thank you!

twillis449 commented 5 years ago

I found my code. Amazingly most of it still seems to run! I will put things into some kind of comprehensible package for you. May take a day or two.

PhilippaHartley commented 5 years ago

That would be brilliant, thank you very much!

twillis449 commented 5 years ago

The attached tar file contains various pointing scripts, 2 pdf files, and a README. I'm completely rusty on this stuff, but maybe you will find the scripts vaguely useful.

Tony

pointing.tar.gz

PhilippaHartley commented 5 years ago

Thank you very much - greatly appreciated!

PhilippaHartley commented 5 years ago

A quick update on this: I made a workaround by using the noise node GaussNoise(). The result is a set of pointing errors that are random in time and across antenne:

class RandDynamic (RandomError):
  def __init__ (self,name,nominal_value=0,typical_error=0,**kw):
    ErrorGenerator.__init__(self,name,nominal_value,typical_error,**kw);
    self.opts.append(TDLOption("sigma","Random Gaussian pointing errors with sigma %s"%name,0
                          ,more=float,namespace=self));
    self.ngen = 0

  def make_node (self,node,**kw):
    ns = node.Subscope();
    # pick a random starting phase
    print ('self.ngen', self.ngen);
    node << (Meq.Time()*0)+Meq.GaussNoise(stddev = self.sigma/206265., seed = self.ngen);
    self.ngen+=1
return node;

Thanks again for your help!