diff --git a/.gitattributes b/.gitattributes index 34d86d8d058e1f3b8c7eeba11ef983f2a1274cde..6b28ff8e794f4209b00415d9c18102888d3bad5e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4926,6 +4926,7 @@ SAS/OTDB/test/t_getTreeGroup.run -text SAS/OTDB/test/t_getTreeGroup.sh -text SAS/OTDB/test/unittest_db.dump.gz -text svneol=unset#application/x-gzip SAS/OTDB_Services/CMakeLists.txt -text +SAS/OTDB_Services/OTDBBusListener.py -text SAS/OTDB_Services/OTDB_Services.ini -text SAS/OTDB_Services/TreeService.ini -text SAS/OTDB_Services/TreeService.py -text @@ -4946,6 +4947,7 @@ SAS/ResourceAssignment/ResourceAssignmentEditor/bin/resourceassignementeditorweb SAS/ResourceAssignment/ResourceAssignmentEditor/config/CMakeLists.txt -text SAS/ResourceAssignment/ResourceAssignmentEditor/config/__init__.py -text SAS/ResourceAssignment/ResourceAssignmentEditor/config/default.py -text +SAS/ResourceAssignment/ResourceAssignmentEditor/etc/resourceassignmenteditorwebservice.ini -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/CMakeLists.txt -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/__init__.py -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/fakedata.py -text @@ -5087,6 +5089,11 @@ SAS/ResourceAssignment/ResourceAssignmentEditor/test/CMakeLists.txt -text SAS/ResourceAssignment/ResourceAssignmentEditor/test/test_webservice.py -text SAS/ResourceAssignment/ResourceAssignmentEditor/test/test_webservice.run -text SAS/ResourceAssignment/ResourceAssignmentEditor/test/test_webservice.sh -text +SAS/ResourceAssignment/Services/src/rataskspecifiedservice -text +SAS/ResourceAssignment/Services/src/rataskspecifiedservice.ini -text +SAS/ResourceAssignment/Services/test/tRATaskSpecified.in_correlator -text +SAS/ResourceAssignment/Services/test/tRATaskSpecified.in_preprocessing -text +SAS/ResourceAssignment/Services/test/tRATaskSpecified.sh eol=lf SAS/Scheduler/src/.default_settings.set -text SAS/Scheduler/src/LOFAR_libScheduler.pro -text SAS/Scheduler/src/conflictdialog.ui -text @@ -5346,6 +5353,7 @@ SubSystems/Online_Cobalt/validation/system/users/login-shell.test -text SubSystems/Online_Cobalt/validation/system/users/sudo.test eol=lf SubSystems/Online_Cobalt/validation/validate eol=lf SubSystems/RAServices/CMakeLists.txt -text +SubSystems/RAServices/RAServices.ini -text SubSystems/SAS_Tools/CMakeLists.txt -text /jenkins_make -text /lofar_config.h.cmake -text diff --git a/CMake/LofarPackageList.cmake b/CMake/LofarPackageList.cmake index d73cd29ea2ec2a467357e18851a3792aef525bd3..a46926638910bc79afd5a1ce9573f7cb064699c9 100644 --- a/CMake/LofarPackageList.cmake +++ b/CMake/LofarPackageList.cmake @@ -1,7 +1,7 @@ # - Create for each LOFAR package a variable containing the absolute path to # its source directory. # -# Generated by gen_LofarPackageList_cmake.sh at Wed Jan 20 09:55:03 UTC 2016 +# Generated by gen_LofarPackageList_cmake.sh at wo feb 3 15:36:28 CET 2016 # # ---- DO NOT EDIT ---- # @@ -142,10 +142,12 @@ if(NOT DEFINED LOFAR_PACKAGE_LIST_INCLUDED) set(SAS_Feedback_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/Feedback_Service) set(CleanupTool_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/CleanupTool) set(OTDB_Services_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/OTDB_Services) + set(XML_generator_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/XML_generator) + set(MoMQueryService_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/MoM/MoMQueryService) set(jOTDB3_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/OTB/jOTDB3) set(OTB-Java_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/OTB/OTB) - set(XML_generator_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/XML_generator) set(ResourceAssignmentEditor_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/ResourceAssignmentEditor) + set(ResourceAssignmentServices_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/Services) set(CCU_MAC_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SubSystems/CCU_MAC) set(LCU_MAC_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SubSystems/LCU_MAC) set(MCU_MAC_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SubSystems/MCU_MAC) diff --git a/LCS/Messaging/python/messaging/RPC.py b/LCS/Messaging/python/messaging/RPC.py index b35f524f84d034a82df6500e4e211c5eb303b415..5edf3daa6261e4e7a46adc91052da7ff8d0ce500 100644 --- a/LCS/Messaging/python/messaging/RPC.py +++ b/LCS/Messaging/python/messaging/RPC.py @@ -69,7 +69,7 @@ class RPC(): As a side-effect the sender and session are destroyed. """ - def __init__(self, service, **kwargs ): + def __init__(self, service, broker=None, **kwargs ): """ Initialize an Remote procedure call using: service= <str> Service Name @@ -84,26 +84,41 @@ class RPC(): self.ForwardExceptions = kwargs.pop("ForwardExceptions", False) self.Verbose = kwargs.pop("Verbose", False) self.BusName = kwargs.pop("busname", None) - self.ServiceName = service + self.ServiceName = service + self.broker = broker if self.BusName is None: - self.Request = ToBus(self.ServiceName) + self.Request = ToBus(self.ServiceName, broker=self.broker) else: - self.Request = ToBus("%s/%s" % (self.BusName, self.ServiceName)) + self.Request = ToBus("%s/%s" % (self.BusName, self.ServiceName), broker=self.broker) if len(kwargs): raise AttributeError("Unexpected argument passed to RPC class: %s" %( kwargs )) + def open(self): + """ + Start accepting requests. + """ + + self.Request.open() + + def close(self): + """ + Stop accepting requests. + """ + + self.Request.close() + def __enter__(self): """ Internal use only. (handles scope 'with') """ - self.Request.open() + self.open() return self def __exit__(self, exc_type, exc_val, exc_tb): """ Internal use only. (handles scope 'with') """ - self.Request.close() + self.close() def __call__(self, *args, **kwargs): """ @@ -122,9 +137,9 @@ class RPC(): options = {'create':'always','delete':'receiver'} ReplyAddress = "reply.%s" % (str(uuid.uuid4())) if self.BusName is None: - Reply = FromBus("%s ; %s" %(ReplyAddress,str(options))) + Reply = FromBus("%s ; %s" %(ReplyAddress,str(options)), broker=self.broker) else: - Reply = FromBus("%s/%s" % (self.BusName, ReplyAddress)) + Reply = FromBus("%s/%s" % (self.BusName, ReplyAddress), broker=self.broker) with Reply: MyMsg = RequestMessage(content=Content, reply_to=ReplyAddress, has_args=HasArgs, has_kwargs=HasKwArgs) MyMsg.ttl = timeout diff --git a/LCS/Messaging/python/messaging/Service.py b/LCS/Messaging/python/messaging/Service.py index 3a7434a2a1c7a88bc75dd0ec9e7885fc6abf82b3..6d452c821eb588289c6906891aaea5033d232f59 100644 --- a/LCS/Messaging/python/messaging/Service.py +++ b/LCS/Messaging/python/messaging/Service.py @@ -20,8 +20,8 @@ # with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. # -from .messagebus import ToBus,FromBus -from .messages import ReplyMessage,RequestMessage +from .messagebus import ToBus, FromBus, AbstractBusListener +from .messages import ReplyMessage, RequestMessage import threading import time import uuid @@ -78,8 +78,7 @@ class MessageHandlerInterface(object): pass -# create service: -class Service(object): +class Service(AbstractBusListener): """ Service class for registering python functions with a Service name on a message bus. create new service with Service(busname, servicename, servicehandler) @@ -97,7 +96,7 @@ class Service(object): is a class in stead of a function. """ - def __init__(self, servicename, servicehandler, **kwargs): + def __init__(self, servicename, servicehandler, broker=None, **kwargs): """ Initialize Service object with servicename (str) and servicehandler function. additional parameters: @@ -109,120 +108,65 @@ class Service(object): """ self.service_name = servicename self.service_handler = servicehandler - self.connected = False - self.running = [False] - self.link_uuid = str(uuid.uuid4()) self.busname = kwargs.pop("busname", None) - self.exclusive = kwargs.pop("exclusive", True) - self._numthreads = kwargs.pop("numthreads", 1) - self.verbose = kwargs.pop("verbose", False) - self.options = {"capacity": self._numthreads*20} - options = kwargs.pop("options", None) self.parsefullmessage = kwargs.pop("parsefullmessage", False) self.handler_args = kwargs.pop("handler_args", {}) - self.listening = False - if len(kwargs): - raise AttributeError("Unexpected argument passed to Service class: %s", kwargs) - - # Set appropriate flags for exclusive binding - if self.exclusive == True: - self.options["link"] = '{name:"' + self.link_uuid + \ - '", x-bindings:[{key:' + self.service_name + \ - ', arguments: {"qpid.exclusive-binding":True}}]}' - - # only add options if it is given as a dictionary - if isinstance(options,dict): - for key,val in options.iteritems(): - self.options[key] = val - - def _debug(self, txt): - """ - Internal use only. - """ - if self.verbose == True: - logger.debug("[Service: %s]", txt) + + address = self.busname+"/"+self.service_name if self.busname else self.service_name + kwargs["exclusive"] = True #set binding to exclusive for services + + # Force the use of a topic in the bus options by setting + # options["node"]["type"] = "topic" + options = kwargs.get("options", {}) + options.setdefault("node", {}) + options["node"]["type"] = "topic" + kwargs["options"] = options + + super(Service, self).__init__(address, broker, **kwargs) def start_listening(self, numthreads=None): """ Start the background threads and process incoming messages. """ - if self.listening == True: + if self.isListening(): return # Usually a service will be listening on a 'bus' implemented by a topic exchange if self.busname != None: - self.listener = FromBus(self.busname+"/"+self.service_name, options=self.options) self.reply_bus = ToBus(self.busname) - self.listener.open() self.reply_bus.open() - # Handle case when queues are used else: - # assume that we are listening on a queue and therefore we cannot use a generic ToBus() for replies. - self.listener = FromBus(self.service_name, options=self.options) - self.listener.open() self.reply_bus=None - self.connected = True - - if numthreads != None: - self._numthreads = numthreads - - # use a list to ensure that threads always 'see' changes in the running state. - self.running = [ True ] - self._tr = [] - self.reccounter = [] - self.okcounter =[] - for i in range(self._numthreads): - # set up service_handler - if str(type(self.service_handler)) == "<type 'instancemethod'>" or \ - str(type(self.service_handler)) == "<type 'function'>": - thread_service_handler = MessageHandlerInterface() - thread_service_handler.handle_message = self.service_handler - else: - thread_service_handler = self.service_handler(**self.handler_args) - if not isinstance(thread_service_handler, MessageHandlerInterface): - raise TypeError("Servicehandler argument must by a function or a derived class from MessageHandlerInterface.") - - self._tr.append(threading.Thread(target=self._loop, - kwargs={"index":i, "service_handler":thread_service_handler})) - self.reccounter.append(0) - self.okcounter.append(0) - self._tr[i].start() - self.listening = True + # create listener FromBus in super class + super(Service, self).start_listening(numthreads=numthreads) def stop_listening(self): """ Stop the background threads that listen to incoming messages. """ - # stop all running threads - if self.running[0] == True: - self.running[0] = False - for i in range(self._numthreads): - self._tr[i].join() - logger.info("Thread %2d: STOPPED Listening for messages on Bus %s and service name %s." % (i, self.busname, self.service_name)) - logger.info(" %d messages received and %d processed OK." % (self.reccounter[i], self.okcounter[i])) - self.listening = False - # close the listeners - if self.connected == True: - if isinstance(self.listener, FromBus): - self.listener.close() - if isinstance(self.reply_bus, ToBus): - self.reply_bus.close() - self.connected = False + if isinstance(self.reply_bus, ToBus): + self.reply_bus.close() + # close the listeners + super(Service, self).stop_listening() + + def _create_thread_args(self, index): + # set up service_handler + if str(type(self.service_handler)) == "<type 'instancemethod'>" or \ + str(type(self.service_handler)) == "<type 'function'>": + thread_service_handler = MessageHandlerInterface() + thread_service_handler.handle_message = self.service_handler + else: + thread_service_handler = self.service_handler(**self.handler_args) - def __enter__(self): - """ - Internal use only. Handles scope with keyword 'with' - """ - self.start_listening() - return self + if not isinstance(thread_service_handler, MessageHandlerInterface): + raise TypeError("Servicehandler argument must by a function or a derived class from MessageHandlerInterface.") - def __exit__(self, exc_type, exc_val, exc_tb): - """ - Internal use only. Handles scope with keyword 'with' - """ - self.stop_listening() + # add service_handler to default args for thread + args = super(Service, self)._create_thread_args(index) + args['service_handler'] = thread_service_handler + return args def _send_reply(self, replymessage, status, reply_to, errtxt="",backtrace=""): """ @@ -277,133 +221,95 @@ class Service(object): except MessageBusError as e: logger.error("Failed to send reply messgage to reply address %s" %(reply_to)) + def _getServiceHandlerForCurrentThread(self): + currentThread = threading.currentThread() + args = self._threads[currentThread] + return args['service_handler'] - def _loop(self, **kwargs): - """ - Internal use only. Message listener loop that receives messages and starts the attached function with the message content as argument. - """ - thread_idx = kwargs.pop("index") - service_handler = kwargs.pop("service_handler") - logger.info( "Thread %d START Listening for messages on Bus %s and service name %s." %(thread_idx, self.busname, self.service_name)) - try: - service_handler.prepare_loop() - except Exception as e: - logger.error("prepare_loop() failed with %s", e) + def _onListenLoopBegin(self): + "Called before main processing loop is entered." + self._getServiceHandlerForCurrentThread().prepare_loop() - while self.running[0]: - try: - service_handler.prepare_receive() - except Exception as e: - logger.error("prepare_receive() failed with %s", e) - continue + def _onBeforeReceiveMessage(self): + "Called in main processing loop just before a blocking wait for messages is done." + self._getServiceHandlerForCurrentThread().prepare_receive() - try: - # get the next message - lofar_msg = self.listener.receive(1) - # retry if timed-out - if lofar_msg is None: - continue - - # report if messages are not Service Messages - if not isinstance(lofar_msg, RequestMessage): - logger.error( "Received wrong messagetype %s, RequestMessage expected." %(str(type(lofar_msg)))) - self.listener.ack(lofar_msg) - continue - - # Keep track of number of received messages - self.reccounter[thread_idx] += 1 - - # Execute the service handler function and send reply back to client - try: - self._debug("Running handler") - - # determine which handler method has to be called - if hasattr(service_handler, 'service2MethodMap') and lofar_msg.subject in service_handler.service2MethodMap: - # pass the handling of this message on to the specific method for this service - serviceHandlerMethod = service_handler.service2MethodMap[lofar_msg.subject] - else: - serviceHandlerMethod = service_handler.handle_message - - if self.parsefullmessage is True: - replymessage = serviceHandlerMethod(lofar_msg) - else: - # check for positional arguments and named arguments - # depending on presence of args and kwargs, - # the signature of the handler method should vary as well - if lofar_msg.has_args and lofar_msg.has_kwargs: - # both positional and named arguments - # rpcargs and rpckwargs are packed in the content - rpcargs = lofar_msg.content - - # rpckwargs is the last argument in the content - # rpcargs is the rest in front - rpckwargs = rpcargs[-1] - del rpcargs[-1] - rpcargs = tuple(rpcargs) - replymessage = serviceHandlerMethod(*rpcargs, **rpckwargs) - elif lofar_msg.has_args: - # only positional arguments - # msg.content should be a list - rpcargs = tuple(lofar_msg.content) - replymessage = serviceHandlerMethod(*rpcargs) - elif lofar_msg.has_kwargs: - # only named arguments - # msg.content should be a dict - rpckwargs = lofar_msg.content - replymessage = serviceHandlerMethod(**rpckwargs) - elif lofar_msg.content: - rpccontent = lofar_msg.content - replymessage = serviceHandlerMethod(rpccontent) - else: - replymessage = serviceHandlerMethod() - - self._debug("finished handler") - self._send_reply(replymessage,"OK",lofar_msg.reply_to) - self.okcounter[thread_idx] += 1 - self.listener.ack(lofar_msg) - try: - service_handler.finalize_handling(True) - except Exception as e: - logger.error("finalize_handling() failed with %s", e) - continue - - except Exception as e: - # Any thrown exceptions either Service exception or unhandled exception - # during the execution of the service handler is caught here. - self._debug("handling exception") - exc_info = sys.exc_info() - status="ERROR" - rawbacktrace = traceback.format_exception(*exc_info) - errtxt = rawbacktrace[-1] - self._debug(rawbacktrace) - # cleanup the backtrace print by removing the first two lines and the last - del rawbacktrace[1] - del rawbacktrace[0] - del rawbacktrace[-1] - backtrace = ''.join(rawbacktrace).encode('latin-1').decode('unicode_escape') - self._debug(backtrace) - if self.verbose is True: - logger.info("[Service:] Status: %s", str(status)) - logger.info("[Service:] ERRTXT: %s", str(errtxt)) - logger.info("[Service:] BackTrace: %s", str( backtrace )) - self._send_reply(None, status, lofar_msg.reply_to, errtxt=errtxt, backtrace=backtrace) - try: - service_handler.finalize_handling(False) - except Exception as e: - logger.error("finalize_handling() failed with %s", e) - continue - - except Exception as e: - # Unknown problem in the library. Report this and continue. - excinfo = sys.exc_info() - logger.error("[Service:] ERROR during processing of incoming message.") - traceback.print_exception(*excinfo) - logger.info("Thread %d: Resuming listening on bus %s for service %s" % - (thread_idx, self.busname, self.service_name)) + def _handleMessage(self, lofar_msg): + service_handler = self._getServiceHandlerForCurrentThread() try: - service_handler.finalize_loop() + self._debug("Running handler") + + # determine which handler method has to be called + if hasattr(service_handler, 'service2MethodMap') and lofar_msg.subject in service_handler.service2MethodMap: + # pass the handling of this message on to the specific method for this service + serviceHandlerMethod = service_handler.service2MethodMap[lofar_msg.subject] + else: + serviceHandlerMethod = service_handler.handle_message + + if self.parsefullmessage is True: + replymessage = serviceHandlerMethod(lofar_msg) + else: + # check for positional arguments and named arguments + # depending on presence of args and kwargs, + # the signature of the handler method should vary as well + if lofar_msg.has_args and lofar_msg.has_kwargs: + # both positional and named arguments + # rpcargs and rpckwargs are packed in the content + rpcargs = lofar_msg.content + + # rpckwargs is the last argument in the content + # rpcargs is the rest in front + rpckwargs = rpcargs[-1] + del rpcargs[-1] + rpcargs = tuple(rpcargs) + replymessage = serviceHandlerMethod(*rpcargs, **rpckwargs) + elif lofar_msg.has_args: + # only positional arguments + # msg.content should be a list + rpcargs = tuple(lofar_msg.content) + replymessage = serviceHandlerMethod(*rpcargs) + elif lofar_msg.has_kwargs: + # only named arguments + # msg.content should be a dict + rpckwargs = lofar_msg.content + replymessage = serviceHandlerMethod(**rpckwargs) + elif lofar_msg.content: + rpccontent = lofar_msg.content + replymessage = serviceHandlerMethod(rpccontent) + else: + replymessage = serviceHandlerMethod() + + self._send_reply(replymessage,"OK",lofar_msg.reply_to) + except Exception as e: - logger.error("finalize_loop() failed with %s", e) + # Any thrown exceptions either Service exception or unhandled exception + # during the execution of the service handler is caught here. + self._debug("handling exception") + exc_info = sys.exc_info() + status="ERROR" + rawbacktrace = traceback.format_exception(*exc_info) + errtxt = rawbacktrace[-1] + self._debug(rawbacktrace) + # cleanup the backtrace print by removing the first two lines and the last + del rawbacktrace[1] + del rawbacktrace[0] + del rawbacktrace[-1] + backtrace = ''.join(rawbacktrace).encode('latin-1').decode('unicode_escape') + self._debug(backtrace) + if self.verbose is True: + logger.info("[Service:] Status: %s", str(status)) + logger.info("[Service:] ERRTXT: %s", str(errtxt)) + logger.info("[Service:] BackTrace: %s", str( backtrace )) + self._send_reply(None, status, lofar_msg.reply_to, errtxt=errtxt, backtrace=backtrace) + + def _onAfterReceiveMessage(self, successful): + "Called in the main loop after the result was send back to the requester." + "@successful@ reflects the state of the handling: true/false" + self._getServiceHandlerForCurrentThread().finalize_handling(successful) + + def _onListenLoopEnd(self): + "Called after main processing loop is finished." + self._getServiceHandlerForCurrentThread().finalize_loop() __all__ = ["Service", "MessageHandlerInterface"] diff --git a/LCS/Messaging/python/messaging/messagebus.py b/LCS/Messaging/python/messaging/messagebus.py index a367294f7a43cc41e6fd15c3be99ca90f7a2e123..a57d7dbd16b10981b80cb10b267375fac436a16b 100644 --- a/LCS/Messaging/python/messaging/messagebus.py +++ b/LCS/Messaging/python/messaging/messagebus.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python + # messagebus.py: Provide an easy way exchange messages on the message bus. # # Copyright (C) 2015 @@ -31,6 +33,8 @@ from lofar.common.util import raise_exception import qpid.messaging import logging import sys +import uuid +import threading logger = logging.getLogger(__name__) @@ -41,6 +45,19 @@ DEFAULT_BROKER_OPTIONS = {'reconnect': True} DEFAULT_RECEIVER_CAPACITY = 1 DEFAULT_TIMEOUT = 5 +# Construct address options string (address options object not supported well in Python) +def address_options_to_str(opt): + if isinstance(opt, dict): + return "{%s}" % (", ".join('%s: %s' % (k,address_options_to_str(v)) for (k,v) in opt.iteritems())) + elif isinstance(opt, list): + return "[%s]" % (", ".join(address_options_to_str(v) for v in opt)) + elif isinstance(opt, int): + return '%s' % (opt,) + elif isinstance(opt, bool): + return '%s' % (opt,) + else: + return '"%s"' % (opt,) + class FromBus(object): """ @@ -75,6 +92,9 @@ class FromBus(object): self.session = None self.opened=0 + def isConnected(self): + return self.opened > 0 + def open(self): """ The following actions will be performed when entering a context: @@ -148,14 +168,20 @@ class FromBus(object): """ self._check_session() options = options if options else self.options - options.setdefault("capacity", DEFAULT_RECEIVER_CAPACITY) - what = "receiver for source: %s (broker: %s, session: %s)" % \ - (address, self.broker, self.session.name) + + # Extract capacity (not supported in address string in Python, see COMMON_OPTS in qpid/messaging/driver.py) + capacity = options.pop("capacity", DEFAULT_RECEIVER_CAPACITY) + + optstr = address_options_to_str(options) + + what = "receiver for source: %s (broker: %s, session: %s, options: %s)" % \ + (address, self.broker, self.session.name, optstr) + try: - self.session.receiver(address, **options) + self.session.receiver("%s; %s" % (address, optstr), capacity=capacity) except qpid.messaging.MessagingError: raise_exception(MessageBusError, - "[FromBus] Failed to create %s" % what) + "[FromBus] Failed to create %s" % (what,)) logger.info("[FromBus] Created %s", what) def receive(self, timeout=DEFAULT_TIMEOUT): @@ -175,9 +201,9 @@ class FromBus(object): return None except qpid.messaging.MessagingError: raise_exception(MessageBusError, - "[FromBus] Failed to fetch message from queue: " + "[FromBus] Failed to fetch message from: " "%s" % self.address) - logger.info("[FromBus] Message received on queue: %s subject: %s" % (self.address, msg.subject)) + logger.info("[FromBus] Message received on: %s subject: %s" % (self.address, msg.subject)) logger.debug("[FromBus] %s" % msg) try: amsg = MESSAGE_FACTORY.create(msg) @@ -375,13 +401,17 @@ class ToBus(object): :raise MessageBusError: if sender could not be created """ self._check_session() - what = "sender for target: %s (broker: %s, session: %s)" % ( - address, self.broker, self.session.name) + + optstr = address_options_to_str(options) + + what = "sender for source: %s (broker: %s, session: %s, options: %s)" % \ + (address, self.broker, self.session.name, optstr) + try: - self.session.sender(address, **options) + self.session.sender("%s; %s" % (address, optstr)) except qpid.messaging.MessagingError: raise_exception(MessageBusError, - "[ToBus] Failed to create %s" % what) + "[ToBus] Failed to create %s" % (what,)) logger.info("[ToBus] Created %s", what) def send(self, message, timeout=DEFAULT_TIMEOUT): @@ -404,4 +434,206 @@ class ToBus(object): logger.info("[ToBus] Message sent to queue: %s subject: %s" % (sender.target, message.subject)) -__all__ = ["FromBus", "ToBus"] +class AbstractBusListener(object): + """ + AbstractBusListener class for handling messages which are received on a message bus. + Typical usage is to derive from this class and implement the handle_message method with concrete logic. + """ + + def __init__(self, address, broker=None, **kwargs): + """ + Initialize AbstractBusListener object with servicename (str) and servicehandler function. + :param address: valid Qpid address + additional parameters in kwargs: + options= <dict> Dictionary of options passed to QPID + exclusive= <bool> Create an exclusive binding so no other services can consume duplicate messages (default: False) + numthreads= <int> Number of parallel threads processing messages (default: 1) + verbose= <bool> Output extra logging over stdout (default: False) + """ + self.address = address + self.broker = broker + self.running = [False] + self._listening = False + self.exclusive = kwargs.pop("exclusive", False) + self._numthreads = kwargs.pop("numthreads", 1) + self.verbose = kwargs.pop("verbose", False) + self.frombus_options = {"capacity": self._numthreads*20} + options = kwargs.pop("options", None) + + # Set appropriate flags for exclusive binding + if self.exclusive == True: + binding_key = address.split('/')[-1] + self.frombus_options["link"] = { "name": str(uuid.uuid4()), + "x-bindings": [ { "key": binding_key, + "arguments": { "\"qpid.exclusive-binding\"": True } + } + ] + } + + # only add options if it is given as a dictionary + if isinstance(options,dict): + for key,val in options.iteritems(): + self.frombus_options[key] = val + + def _debug(self, txt): + """ + Internal use only. + """ + if self.verbose == True: + logger.debug("[%s: %s]", self.__class__.__name__, txt) + + def isListening(self): + return self._listening + + def start_listening(self, numthreads=None): + """ + Start the background threads and process incoming messages. + """ + if self._listening == True: + return + + self._bus_listener = FromBus(self.address, broker=self.broker, options=self.frombus_options) + self._bus_listener.open() + + if numthreads != None: + self._numthreads = numthreads + + # use a list to ensure that threads always 'see' changes in the running state. + self.running = [ True ] + self._threads = {} + for i in range(self._numthreads): + thread = threading.Thread(target=self._loop) + self._threads[thread] = self._create_thread_args(i) + thread.start() + self._listening = True + + def _create_thread_args(self, index): + return {'index':index, + 'num_received_messages':0, + 'num_processed_messages':0} + + def stop_listening(self): + """ + Stop the background threads that listen to incoming messages. + """ + # stop all running threads + if self.running[0] == True: + self.running[0] = False + for thread, args in self._threads.items(): + thread.join() + logger.info("Thread %2d: STOPPED Listening for messages on %s" % (args['index'], self.address)) + logger.info(" %d messages received and %d processed OK." % (args['num_received_messages'], args['num_processed_messages'])) + self._listening = False + + # close the listeners + if self._bus_listener.isConnected(): + self._bus_listener.close() + + + def __enter__(self): + """ + Internal use only. Handles scope with keyword 'with' + """ + self.start_listening() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """ + Internal use only. Handles scope with keyword 'with' + """ + self.stop_listening() + + def _onListenLoopBegin(self): + "Called before main processing loop is entered." + pass + + def _onBeforeReceiveMessage(self): + "Called in main processing loop just before a blocking wait for messages is done." + pass + + def _handleMessage(self, msg): + "Implement this method in your subclass to handle a received message" + raise NotImplementedError("Please implement the _handleMessage method in your subclass to handle a received message") + + def _onAfterReceiveMessage(self, successful): + "Called in the main loop after the result was send back to the requester." + "@successful@ reflects the state of the handling: true/false" + pass + + def _onListenLoopEnd(self): + "Called after main processing loop is finished." + pass + + def _loop(self): + """ + Internal use only. Message listener loop that receives messages and starts the attached function with the message content as argument. + """ + currentThread = threading.currentThread() + args = self._threads[currentThread] + thread_idx = args['index'] + logger.info( "Thread %d START Listening for messages on %s" %(thread_idx, self.address)) + try: + self._onListenLoopBegin() + except Exception as e: + logger.error("onListenLoopBegin() failed with %s", e) + + while self.running[0]: + try: + self._onBeforeReceiveMessage() + except Exception as e: + logger.error("onBeforeReceiveMessage() failed with %s", e) + continue + + try: + # get the next message + lofar_msg = self._bus_listener.receive(1) + # retry if timed-out + if lofar_msg is None: + continue + + # Keep track of number of received messages + args['num_received_messages'] += 1 + + # Execute the service handler function and send reply back to client + try: + self._debug("Running handler") + + self._handleMessage(lofar_msg) + + self._debug("Finished handler") + + self._bus_listener.ack(lofar_msg) + + args['num_processed_messages'] += 1 + + try: + self._onAfterReceiveMessage(True) + except Exception as e: + logger.error("onAfterReceiveMessage() failed with %s", e) + continue + + except Exception as e: + import traceback + logger.warning("Handling of message failed with %s: %s\nMessage: %s", e, traceback.format_exc(),lofar_msg.content) + + # Any thrown exceptions either Service exception or unhandled exception + # during the execution of the service handler is caught here. + self._debug(str(e)) + try: + self._onAfterReceiveMessage(False) + except Exception as e: + logger.error("onAfterReceiveMessage() failed with %s", e) + continue + + except Exception as e: + # Unknown problem in the library. Report this and continue. + logger.error("[%s:] ERROR during processing of incoming message.\n%s" %(self.__class__.__name__, str(e))) + logger.info("Thread %d: Resuming listening on %s " % (thread_idx, self.address)) + + try: + self._onListenLoopEnd() + except Exception as e: + logger.error("finalize_loop() failed with %s", e) + + +__all__ = ["FromBus", "ToBus", "AbstractBusListener"] diff --git a/SAS/CMakeLists.txt b/SAS/CMakeLists.txt index f2493e5907248fbd7bae55b3be0e381bc8be43ca..9a6b79312d5a831f4efdc3f1ec024ba7c2c6ba06 100644 --- a/SAS/CMakeLists.txt +++ b/SAS/CMakeLists.txt @@ -9,4 +9,5 @@ lofar_add_package(CleanupTool) lofar_add_package(OTDB_Services) lofar_add_package(XML_generator) +add_subdirectory(MoM) add_subdirectory(ResourceAssignment) diff --git a/SAS/MoM/CMakeLists.txt b/SAS/MoM/CMakeLists.txt index fe7eed0755a032b13c9df21e015f81196840570a..bec1a7192d9efb80180504fcd590767df12c9cb1 100644 --- a/SAS/MoM/CMakeLists.txt +++ b/SAS/MoM/CMakeLists.txt @@ -1,3 +1,3 @@ # $Id: CMakeLists.txt 32745 2015-11-01 20:17:08Z schoenmakers $ -add_directory(MoMQueryService) +lofar_add_package(MoMQueryService) diff --git a/SAS/OTDB_Services/CMakeLists.txt b/SAS/OTDB_Services/CMakeLists.txt index f6c6b22d26992ab5ebd37de7aba1a431905536ce..e30e2e3f48e49dfe1a95329c0ab9438d5e827d82 100644 --- a/SAS/OTDB_Services/CMakeLists.txt +++ b/SAS/OTDB_Services/CMakeLists.txt @@ -2,6 +2,7 @@ lofar_package(OTDB_Services 1.0 DEPENDS PyMessaging) +lofar_find_package(Python 2.6 REQUIRED) include(PythonInstall) lofar_add_bin_scripts( @@ -16,6 +17,13 @@ install(FILES OTDB_Services.ini DESTINATION etc/supervisord.d) +set(_py_files + factory.py + util.py + datetimeutils.py) + +python_install(OTDBBusListener.py + DESTINATION lofar/sas/otdb) add_subdirectory(test) diff --git a/SAS/OTDB_Services/OTDBBusListener.py b/SAS/OTDB_Services/OTDBBusListener.py new file mode 100644 index 0000000000000000000000000000000000000000..8d121f66357944adf9f60b714842ecdab05bdfe0 --- /dev/null +++ b/SAS/OTDB_Services/OTDBBusListener.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python + +# OTDBBusListener.py: OTDBBusListener listens on the lofar otdb message bus and calls (empty) on<SomeMessage> methods when such a message is received. +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: messagebus.py 1580 2015-09-30 14:18:57Z loose $ + +""" +OTDBBusListener listens on the lofar otdb message bus and calls (empty) on<SomeMessage> methods when such a message is received. +Typical usage is to derive your own subclass from OTDBBusListener and implement the specific on<SomeMessage> methods that you are interested in. +""" + +from lofar.messaging.messagebus import AbstractBusListener + +import qpid.messaging +import logging +from datetime import datetime + +logger = logging.getLogger(__name__) + + +class OTDBBusListener(AbstractBusListener): + def __init__(self, busname='lofar.otdb.notification', subject='otdb.treestatus', broker=None, **kwargs): + """ + OTDBBusListener listens on the lofar otdb message bus and calls (empty) on<SomeMessage> methods when such a message is received. + Typical usage is to derive your own subclass from OTDBBusListener and implement the specific on<SomeMessage> methods that you are interested in. + :param address: valid Qpid address (default: lofar.otdb.status) + :param broker: valid Qpid broker host (default: None, which means localhost) + additional parameters in kwargs: + options= <dict> Dictionary of options passed to QPID + exclusive= <bool> Create an exclusive binding so no other services can consume duplicate messages (default: False) + numthreads= <int> Number of parallel threads processing messages (default: 1) + verbose= <bool> Output extra logging over stdout (default: False) + """ + address = "%s/%s" % (busname, subject) + super(OTDBBusListener, self).__init__(address, broker, **kwargs) + + def _handleMessage(self, msg): + logger.debug("OTDBBusListener.handleMessage: %s" %str(msg)) + + treeId = msg.content['treeID'] + modificationTime = msg.content['time_of_change'].datetime() + + if msg.content['state'] == 'described': + self.onObservationDescribed(treeId, modificationTime) + elif msg.content['state'] == 'prepared': + self.onObservationPrepared(treeId, modificationTime) + elif msg.content['state'] == 'approved': + self.onObservationApproved(treeId, modificationTime) + elif msg.content['state'] == 'on_hold': + self.onObservationOnHold(treeId, modificationTime) + elif msg.content['state'] == 'conflict': + self.onObservationConflict(treeId, modificationTime) + elif msg.content['state'] == 'prescheduled': + self.onObservationPrescheduled(treeId, modificationTime) + elif msg.content['state'] == 'scheduled': + self.onObservationScheduled(treeId, modificationTime) + elif msg.content['state'] == 'queued': + self.onObservationQueued(treeId, modificationTime) + elif msg.content['state'] == 'active': + self.onObservationStarted(treeId, modificationTime) + elif msg.content['state'] == 'completing': + self.onObservationCompleting(treeId, modificationTime) + elif msg.content['state'] == 'finished': + self.onObservationFinished(treeId, modificationTime) + elif msg.content['state'] == 'aborted': + self.onObservationAborted(treeId, modificationTime) + + def onObservationDescribed(self, treeId, modificationTime): + pass + + def onObservationPrepared(self, treeId, modificationTime): + pass + + def onObservationApproved(self, treeId, modificationTime): + pass + + def onObservationOnHold(self, treeId, modificationTime): + pass + + def onObservationConflict(self, treeId, modificationTime): + pass + + def onObservationPrescheduled(self, treeId, modificationTime): + pass + + def onObservationScheduled(self, treeId, modificationTime): + pass + + def onObservationQueued(self, treeId, modificationTime): + pass + + def onObservationStarted(self, treeId, modificationTime): + pass + + def onObservationCompleting(self, treeId, modificationTime): + pass + + def onObservationFinished(self, treeId, modificationTime): + pass + + def onObservationAborted(self, treeId, modificationTime): + pass + +__all__ = ["OTDBBusListener"] diff --git a/SAS/OTDB_Services/TreeService.py b/SAS/OTDB_Services/TreeService.py index 33cd9ba53ef7b30220171638df8b519d13124094..588e5a672abeffd51ba62fdde177933136ad246f 100755 --- a/SAS/OTDB_Services/TreeService.py +++ b/SAS/OTDB_Services/TreeService.py @@ -239,7 +239,7 @@ class PostgressTaskSpecificationRequest(PostgressMessageHandlerInterface): def __init__(self, **kwargs): super(PostgressTaskSpecificationRequest, self).__init__(**kwargs) - def handle_message(self, msg): + def handle_message(self, **msg): " Connect to the right function" return TaskSpecificationRequest(msg, self.connection) @@ -251,7 +251,7 @@ class PostgressStatusUpdateCommand(PostgressMessageHandlerInterface): def __init__(self, **kwargs): super(PostgressStatusUpdateCommand, self).__init__(**kwargs) - def handle_message(self, msg): + def handle_message(self, **msg): " Connect to the right function" return StatusUpdateCommand(msg, self.connection) @@ -263,7 +263,7 @@ class PostgressKeyUpdateCommand(PostgressMessageHandlerInterface): def __init__(self, **kwargs): super(PostgressKeyUpdateCommand, self).__init__(**kwargs) - def handle_message(self, msg): + def handle_message(self, **msg): " Connect to the right function" return KeyUpdateCommand(msg, self.connection) diff --git a/SAS/OTDB_Services/TreeStatusEvents.py b/SAS/OTDB_Services/TreeStatusEvents.py index 47e4b19dd20c78be07f72fdd0a987c7a2105a353..b1d5065c17c760062368f2fbe0d0fe88a049bcd1 100755 --- a/SAS/OTDB_Services/TreeStatusEvents.py +++ b/SAS/OTDB_Services/TreeStatusEvents.py @@ -24,7 +24,7 @@ Daemon that watches the OTDB database for status changes of trees and publishes those on the messagebus. """ -import sys, time, pg +import sys, time, pg, datetime import logging from lofar.messaging import EventMessage, ToBus @@ -47,8 +47,8 @@ def PollForStatusChanges(start_time, end_time, otdb_connection): """ Function that asked the database for status changes in the given period - Input : start_time (string) - Oldest time of change to include in the selection. - end_time (string) - Most recent time of change to include in the selection + Input : start_time (datetime) - Oldest time of change to include in the selection. + end_time (datetime) - Most recent time of change to include in the selection The times must be specified in the format YYYY-Mon-DD HH24:MI:SS.US. The selection delivers changes the match: startime <= time_of_change < end_time @@ -64,7 +64,7 @@ def PollForStatusChanges(start_time, end_time, otdb_connection): record_list = [] try: record_list = otdb_connection.query("select treeid,state,modtime,creation from getStateChanges('%s','%s')" % - (start_time, end_time)).getresult() + (start_time.strftime("%F %T.%f"), end_time.strftime("%F %T.%f"))).getresult() except QUERY_EXCEPTIONS, exc_info: raise FunctionError("Error while polling for state changes: %s"% exc_info) return record_list @@ -122,23 +122,23 @@ if __name__ == "__main__": # When we are connected we can poll the database if connected: # Get start_time (= creation time of last retrieved record if any) - start_time = '' try: start_time = otdb_connection.query("select treestatusevent from otdb_admin").getresult()[0][0] + start_time = datetime.datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S.%f") except IndexError, QUERY_EXCEPTIONS: - start_time = "2015-01-01 00:00:00.00" + start_time = datetime.datetime.datetime(2015, 1, 1) try: logger.info("start_time=%s, polling database" % (start_time,)) - record_list = PollForStatusChanges(start_time, "now", otdb_connection) + record_list = PollForStatusChanges(start_time, datetime.datetime.utcnow(), otdb_connection) except FunctionError, exc_info: logger.error(exc_info) else: for (treeid, state, modtime, creation) in record_list: - content = { "treeID" : treeid, "state" : allowed_states.get(state, "unknwon_state"), + content = { "treeID" : treeid, "state" : allowed_states.get(state, "unknown_state"), "time_of_change" : modtime } msg = EventMessage(context="otdb.treestatus", content=content) - logger.info("sending message treeid %s state %s modtime %s" % (treeid, allowed_states.get(state, "unknwon_state"), modtime)) + logger.info("sending message treeid %s state %s modtime %s" % (treeid, allowed_states.get(state, "unknown_state"), modtime)) send_bus.send(msg) start_time = creation diff --git a/SAS/OTDB_Services/test/t_TreeService.py b/SAS/OTDB_Services/test/t_TreeService.py index ff208e810339388539f6d57149c83fbd55e330bb..ee2bc1fb2455f3ff86b4fa4b5143c760d2c4a220 100644 --- a/SAS/OTDB_Services/test/t_TreeService.py +++ b/SAS/OTDB_Services/test/t_TreeService.py @@ -37,7 +37,7 @@ logger = logging.getLogger(__name__) def do_rpc(rpc_instance, arg_dict): # try: - (data, status) = (rpc_instance)(arg_dict) + (data, status) = (rpc_instance)(**arg_dict) if status != "OK": raise Exception("Status returned is %s" % status) for key in sorted(data): @@ -56,58 +56,58 @@ if __name__ == "__main__": with RPC("StatusUpdateCmd", ForwardExceptions=True, busname=busname, timeout=5) as status_update_command: # PIC - (data, status) = status_update_command({'OtdbID':1099269, 'NewStatus':'finished', 'UpdateTimestamps':True}) + (data, status) = status_update_command(OtdbID=1099269, NewStatus='finished', UpdateTimestamps=True) print status, data # Template - (data, status) = status_update_command({'OtdbID':1099238, 'NewStatus':'finished', 'UpdateTimestamps':True}) + (data, status) = status_update_command(OtdbID=1099238, NewStatus='finished', UpdateTimestamps=True) print status, data # VIC - (data, status) = status_update_command({'OtdbID':1099266, 'NewStatus':'finished', 'UpdateTimestamps':True}) + (data, status) = status_update_command(OtdbID=1099266, NewStatus='finished', UpdateTimestamps=True) print status, data # Nonexisting tree try: - (data, status) = status_update_command({'OtdbID':10, 'NewStatus':'finished', 'UpdateTimestamps':True}) + (data, status) = status_update_command(OtdbID=10, NewStatus='finished', UpdateTimestamps=True) except RPCException as e: print "Caught expected exception on invalid treeID in status update" # VIC tree: invalid status try: - (data, status) = status_update_command({'OtdbID':1099266, 'NewStatus':'what_happend', 'UpdateTimestamps':True}) + (data, status) = status_update_command(OtdbID=1099266, NewStatus='what_happend', UpdateTimestamps=True) except RPCException as e: print "Caught expected exception on invalid status in status update" with RPC("KeyUpdateCmd", ForwardExceptions=True, busname=busname, timeout=5) as key_update: # VIC tree: valid - (data, status) = key_update({'OtdbID':1099266, - 'Updates':{'LOFAR.ObsSW.Observation.ObservationControl.PythonControl.pythonHost':'NameOfTestHost'}}) + (data, status) = key_update(OtdbID=1099266, + Updates={'LOFAR.ObsSW.Observation.ObservationControl.PythonControl.pythonHost':'NameOfTestHost'}) print status, data # Template tree: not supported yet try: - (data, status) = key_update({'OtdbID':1099238, - 'Updates':{'LOFAR.ObsSW.Observation.ObservationControl.PythonControl.pythonHost':'NameOfTestHost'}}) + (data, status) = key_update(OtdbID=1099238, + Updates={'LOFAR.ObsSW.Observation.ObservationControl.PythonControl.pythonHost':'NameOfTestHost'}) except RPCException as e: print "Caught expected exception on invalid treetype in key update" # PIC tree: not supported yet try: - (data, status) = key_update({'OtdbID':1099269, 'Updates':{'LOFAR.PIC.Core.CS001.status_state':'50'}}) + (data, status) = key_update(OtdbID=1099269, Updates={'LOFAR.PIC.Core.CS001.status_state':'50'}) except RPCException as e: print "Caught expected exception on invalid treetype (PIC) in key update" # Non exsisting tree try: - (data, status) = key_update({'OtdbID':10, - 'Updates':{'LOFAR.ObsSW.Observation.ObservationControl.PythonControl.pythonHost':'NameOfTestHost'}}) + (data, status) = key_update(OtdbID=10, + Updates={'LOFAR.ObsSW.Observation.ObservationControl.PythonControl.pythonHost':'NameOfTestHost'}) except RPCException as e: print "Caught expected exception on invalid treeID in key update" # VIC tree: wrong key try: - (data, status) = key_update({'OtdbID':1099266, - 'Updates':{'LOFAR.ObsSW.Observation.ObservationControl.PythonControl.NoSuchKey':'NameOfTestHost'}}) + (data, status) = key_update(OtdbID=1099266, + Updates={'LOFAR.ObsSW.Observation.ObservationControl.PythonControl.NoSuchKey':'NameOfTestHost'}) except RPCException as e: print "Caught expected exception on invalid key in key update" diff --git a/SAS/ResourceAssignment/CMakeLists.txt b/SAS/ResourceAssignment/CMakeLists.txt index f17d9b9367e6c29c624e558759cc5970b71d98fa..42e6524146015ad14024aae36f70ef0f71869591 100644 --- a/SAS/ResourceAssignment/CMakeLists.txt +++ b/SAS/ResourceAssignment/CMakeLists.txt @@ -1,4 +1,5 @@ # $Id: CMakeLists.txt 32401 2015-09-03 13:41:57Z klijn $ lofar_add_package(ResourceAssignmentEditor) +lofar_add_package(Services) diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentEditor/CMakeLists.txt index 62f065324294a663a75ac8b8e6b547663e30fb4d..172cb3d602a37d0ee5307544e01a8915c8ed9b50 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/CMakeLists.txt +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/CMakeLists.txt @@ -7,5 +7,6 @@ set(USE_PYTHON_COMPILATION Off) add_subdirectory(lib) add_subdirectory(bin) +add_subdirectory(etc) add_subdirectory(test) add_subdirectory(config) diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/etc/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentEditor/etc/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..d2c29f37df9a41ba3cbd631cead7a9ad643b4254 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/etc/CMakeLists.txt @@ -0,0 +1,6 @@ +# $Id$ + +# supervisord config files +install(FILES + resourceassignmenteditorwebservice.ini + DESTINATION etc/supervisord.d) diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/etc/resourceassignmenteditorwebservice.ini b/SAS/ResourceAssignment/ResourceAssignmentEditor/etc/resourceassignmenteditorwebservice.ini new file mode 100644 index 0000000000000000000000000000000000000000..47183122c6ac3bc7b076e9ccc9e89857a007cc30 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/etc/resourceassignmenteditorwebservice.ini @@ -0,0 +1,7 @@ +[program:ResourceAssignmentEditor] +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;resourceassignmenteditorwebservice.py' +user=nginx +stopsignal=INT ; KeyboardInterrupt +stopasgroup=true +stdout_logfile=%(program_name)s.log +stderr_logfile=%(program_name)s.stderr diff --git a/SAS/ResourceAssignment/Services/CMakeLists.txt b/SAS/ResourceAssignment/Services/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..fd8e52e033e4de0cb4010ff14ff02e22c3deb517 --- /dev/null +++ b/SAS/ResourceAssignment/Services/CMakeLists.txt @@ -0,0 +1,8 @@ +# $Id$ + +lofar_package(ResourceAssignmentServices 1.0 DEPENDS PyMessaging PyCommon pyparameterset OTDB_Services) + +include(PythonInstall) + +add_subdirectory(src) +add_subdirectory(test) diff --git a/SAS/ResourceAssignment/Services/src/CMakeLists.txt b/SAS/ResourceAssignment/Services/src/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..69a3891eb85e3b053a050947496e081cf36e16af --- /dev/null +++ b/SAS/ResourceAssignment/Services/src/CMakeLists.txt @@ -0,0 +1,16 @@ +# $Id$ + +lofar_add_bin_scripts( + rataskspecifiedservice +) + +python_install( + RATaskSpecified.py + RABusListener.py + DESTINATION lofar/sas/resourceassignment +) + +# supervisord config files +install(FILES + rataskspecifiedservice.ini + DESTINATION etc/supervisord.d) diff --git a/SAS/ResourceAssignment/Services/src/RABusListener.py b/SAS/ResourceAssignment/Services/src/RABusListener.py new file mode 100644 index 0000000000000000000000000000000000000000..6d5f5a7712577503bedd09cda5845123905031cb --- /dev/null +++ b/SAS/ResourceAssignment/Services/src/RABusListener.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +# RABusListener.py: RABusListener listens on the lofar ra message bus and calls (empty) on<SomeMessage> methods when such a message is received. +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id$ + +""" +RABusListener listens on the lofar otdb message bus and calls (empty) on<SomeMessage> methods when such a message is received. +Typical usage is to derive your own subclass from RABusListener and implement the specific on<SomeMessage> methods that you are interested in. +""" + +from lofar.messaging.messagebus import AbstractBusListener + +import qpid.messaging +import logging +from datetime import datetime + +logger = logging.getLogger(__name__) + + +class RATaskSpecifiedBusListener(AbstractBusListener): + def __init__(self, busname='lofar.ra.notification', subject='OTDB.TaskSpecified', broker=None, **kwargs): + """ + RATaskSpecifiedBusListener listens on the lofar ra message bus and calls (empty) on<SomeMessage> methods when such a message is received. + Typical usage is to derive your own subclass from RATaskSpecifiedBusListener and implement the specific on<SomeMessage> methods that you are interested in. + :param address: valid Qpid address (default: lofar.otdb.status) + :param broker: valid Qpid broker host (default: None, which means localhost) + additional parameters in kwargs: + options= <dict> Dictionary of options passed to QPID + exclusive= <bool> Create an exclusive binding so no other services can consume duplicate messages (default: False) + numthreads= <int> Number of parallel threads processing messages (default: 1) + verbose= <bool> Output extra logging over stdout (default: False) + """ + address = "%s/%s" % (busname, subject) + super(RATaskSpecifiedBusListener, self).__init__(address, broker, **kwargs) + + def _handleMessage(self, msg): + logger.debug("RABusListener.handleMessage: %s" %str(msg)) + + sasId = msg.content['sasID'] + modificationTime = msg.content['time_of_change'].datetime() + resource_indicators = msg.content['resource_indicators'] + + self.onTaskSpecified(sasId, modificationTime, resource_indicators) + + def onTaskSpecified(self, sasId, modificationTime, resourceIndicators): + pass + +__all__ = ["RATaskSpecifiedBusListener"] diff --git a/SAS/ResourceAssignment/Services/src/RATaskSpecified.py b/SAS/ResourceAssignment/Services/src/RATaskSpecified.py new file mode 100755 index 0000000000000000000000000000000000000000..e05047d467f60f5276525967282e9b7e47d730cb --- /dev/null +++ b/SAS/ResourceAssignment/Services/src/RATaskSpecified.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python +#coding: iso-8859-15 +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id$ +""" +Daemon that listens to OTDB status changes to PRESCHEDULED and SCHEDULED, requests +the parset of such jobs (+ their predecessors), and posts them on the bus. +""" + +from lofar.messaging import FromBus, ToBus, RPC, EventMessage +from lofar.parameterset import PyParameterValue +from lofar.sas.otdb.OTDBBusListener import OTDBBusListener +from lofar.common.util import waitForInterrupt + +import logging +logger = logging.getLogger(__name__) + +""" Prefix that is common to all parset keys, depending on the exact source. """ +PARSET_PREFIX="ObsSW." + +def predecessors( parset ): + """ Extract the list of predecessor obs IDs from the given parset. """ + + key = PARSET_PREFIX + "Observation.Scheduler.predecessors" + strlist = PyParameterValue(str(parset[key]), True).getStringVector() + + # Key contains "Lxxxxx" values, we want to have "xxxxx" only + result = [int(filter(str.isdigit,x)) for x in strlist] + + return result + +def resourceIndicatorsFromParset( parset ): + """ Extract the parset keys that are required for resource assignment. """ + + subset = {} + + def get(key, default=None): + """ Return the value of parset key `key', or `default' if the key + is not defined. """ + return parset.get(PARSET_PREFIX + key, default) + + def add(key, conversion=lambda x: x): + """ Add the given key to our subset selection, using an optional + conversion. """ + value = get(key) + if value is not None: + subset[key] = conversion(value) + + """ Some conversion functions for common parameter-value types.""" + def strvector(value): + return PyParameterValue(value, True).getStringVector() + + def intvector(value): + return PyParameterValue(value, True).getIntVector() + + def bool(value): + return PyParameterValue(value, True).getBool() + + # ===================================== + # Parset meta info + # ===================================== + subset["Version.number"] = parset.get("Version.number") + + # ===================================== + # Observation settings + # ===================================== + add("Observation.sampleClock") + add("Observation.nrBitsPerSample") + add("Observation.antennaSet") + add("Observation.VirtualInstrument.stationList", strvector) + add("Observation.startTime") + add("Observation.stopTime") + add("Observation.nrBeams") + nrSAPs = int(get("Observation.nrBeams", 0)) + for sap in xrange(0, nrSAPs): + add("Observation.Beam[%d].subbandList" % (sap,), intvector) + + # ===================================== + # Correlator settings + # ===================================== + add("Observation.DataProducts.Output_Correlated.enabled", bool) + add("Cobalt.Correlator.integrationTime") + add("Cobalt.Correlator.nrChannelsPerSubband") + # TODO: We need a service that computes these 3 values + add("Cobalt.Correlator.nrBlocksPerIntegration") + add("Cobalt.Correlator.nrIntegrationsPerBlock") + add("Cobalt.blockSize") + + # ===================================== + # Beamformer settings + # ===================================== + add("Observation.DataProducts.Output_IncoherentStokes.enabled", bool) + add("Observation.DataProducts.Output_CoherentStokes.enabled", bool) + add("Cobalt.BeamFormer.flysEye", bool) + #add("Cobalt.BeamFormer.CoherentStokes.nrChannelsPerSubband") # only needed to determine Cobalt.blockSize + add("Cobalt.BeamFormer.CoherentStokes.subbandsPerFile") + add("Cobalt.BeamFormer.CoherentStokes.timeIntegrationFactor") + add("Cobalt.BeamFormer.CoherentStokes.which") + #add("Cobalt.BeamFormer.IncoherentStokes.nrChannelsPerSubband") # only needed to determine Cobalt.blockSize + add("Cobalt.BeamFormer.IncoherentStokes.subbandsPerFile") + add("Cobalt.BeamFormer.IncoherentStokes.timeIntegrationFactor") + add("Cobalt.BeamFormer.IncoherentStokes.which") + for sap in xrange(0, nrSAPs): + add("Observation.Beam[%d].nrTabRings" % (sap,)) + + nrTABs = int(get("Observation.Beam[%d].nrTiedArrayBeams" % (sap,), 0)) + for tab in xrange(0, nrTABs): + add("Observation.Beam[%d].TiedArrayBeam[%d].coherent" % (sap,tab), bool) + + # ===================================== + # Pipeline settings + # ===================================== + # Calibrator / Averaging pipelines + add("Observation.DataProducts.Output_Correlated.enabled", bool) + add("Observation.DataProducts.Output_InstrumentModel.enabled", bool) + add("Observation.DataProducts.Input_Correlated.enabled", bool) + add("Observation.DataProducts.Input_Correlated.skip", intvector) + add("Observation.ObservationControl.PythonControl.DPPP.demixer.demixfreqstep") + add("Observation.ObservationControl.PythonControl.DPPP.demixer.demixtimestep") + + # Imaging pipeline + add("Observation.DataProducts.Output_SkyImage.enabled", bool) + add("Observation.ObservationControl.PythonControl.Imaging.slices_per_image") + add("Observation.ObservationControl.PythonControl.Imaging.subbands_per_image") + + # Long-baseline pipeline + add("Observation.ObservationControl.PythonControl.LongBaseline.subbandgroups_per_ms") + add("Observation.ObservationControl.PythonControl.LongBaseline.subbands_per_subbandgroup") + + # Pulsar pipeline + add("Observation.DataProducts.Output_Pulsar.enabled", bool) + add("Observation.DataProducts.Input_CoherentStokes.enabled", bool) + add("Observation.DataProducts.Input_CoherentStokes.skip", intvector) + add("Observation.DataProducts.Input_IncoherentStokes.enabled", bool) + add("Observation.DataProducts.Input_IncoherentStokes.skip", intvector) + + return subset + +class RATaskSpecified(OTDBBusListener): + def __init__(self, servicename, otdb_busname=None, my_busname=None, **kwargs): + super(RATaskSpecified, self).__init__(busname=otdb_busname, subject="TaskStatus", **kwargs) + + self.parset_rpc = RPC(service="TaskSpecification", busname=otdb_busname) + self.send_bus = ToBus("%s/%s" % (my_busname, servicename)) + + def start_listening(self, **kwargs): + self.parset_rpc.open() + self.send_bus.open() + + super(RATaskSpecified, self).start_listening(**kwargs) + + def stop_listening(self, **kwargs): + super(RATaskSpecified, self).stop_listening(**kwargs) + + self.send_bus.close() + self.parset_rpc.close() + + def onObservationPrescheduled(self, treeId, modificationTime): + logger.info("Processing obs ID %s", treeId) + + # Request the parset + main_obsID = treeId + main_parset,_ = self.parset_rpc( OtdbID=main_obsID ) + + # Construct a dict of all the parsets we retrieved + parsets = {} + parsets[main_obsID] = main_parset + + logger.info("Processing predecessors") + + # Collect the initial set of predecessors + request_obsIDs = set(predecessors(main_parset)) + + logger.info("Processing %s", request_obsIDs) + + # Iterate recursively over all known predecessor obsIDs, and request their parsets + while request_obsIDs: + obsID = request_obsIDs.pop() + + if obsID in parsets: + # Predecessor lists can overlap -- we already have this one + continue + + logger.info("Fetching predecessor %s", obsID) + + # Request predecessor parset + parsets[obsID],_ = self.parset_rpc( OtdbID=obsID ) + + # Add the list of predecessors + request_obsIDs = request_obsIDs.union(predecessors(parsets[obsID])) + + # Convert parsets to resource indicators + logger.info("Extracting resource indicators") + resourceIndicators = dict([(str(obsID), resourceIndicatorsFromParset(parset)) for (obsID,parset) in parsets.iteritems()]) + + # Construct and send result message + logger.info("Sending result") + result = { + "sasID": main_obsID, + "state": "prescheduled", + "time_of_change": modificationTime, + "resource_indicators": resourceIndicators, + } + + # Put result on bus + msg = EventMessage(content=result) + self.send_bus.send(msg) + + logger.info("Result sent") + diff --git a/SAS/ResourceAssignment/Services/src/rataskspecifiedservice b/SAS/ResourceAssignment/Services/src/rataskspecifiedservice new file mode 100644 index 0000000000000000000000000000000000000000..bac878107d95e35d39803351ecd97b1debaad5eb --- /dev/null +++ b/SAS/ResourceAssignment/Services/src/rataskspecifiedservice @@ -0,0 +1,48 @@ +#!/usr/bin/env python +#coding: iso-8859-15 +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: JobsToSchedule.py 33364 2016-01-21 21:21:12Z mol $ +""" +Daemon that listens to OTDB status changes to PRESCHEDULED, requests +the parset of such jobs (+ their predecessors), and posts them on the bus. +""" + +from lofar.sas.resourceassignment.RATaskSpecified import RATaskSpecified + +if __name__ == "__main__": + import sys + from optparse import OptionParser + + # Check the invocation arguments + parser = OptionParser("%prog -O otdb_bus -B my_bus [options]") + parser.add_option("-O", "--otdb_bus", dest="otdb_busname", type="string", default="", + help="Bus or queue OTDB operates on") + parser.add_option("-B", "--my_bus", dest="my_busname", type="string", default="", + help="Bus or queue we publish resource requests on") + (options, args) = parser.parse_args() + + if not options.statusbus or not options.parsetbus or not options.busname: + parser.print_help() + sys.exit(1) + + with RATaskSpecified("OTDB.TaskSpecified", otdb_busname=options.otdb_busname, my_busname=options.my_busname) as jts: + waitForInterrupt() + diff --git a/SAS/ResourceAssignment/Services/src/rataskspecifiedservice.ini b/SAS/ResourceAssignment/Services/src/rataskspecifiedservice.ini new file mode 100644 index 0000000000000000000000000000000000000000..fa18d43856d59896880b29913019cf21734076e6 --- /dev/null +++ b/SAS/ResourceAssignment/Services/src/rataskspecifiedservice.ini @@ -0,0 +1,7 @@ +[program:RATaskSpecified] +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;rataskspecifiedservice' +user=lofarsys +stopsignal=INT ; KeyboardInterrupt +stopasgroup=true +stdout_logfile=%(program_name)s.log +stderr_logfile=%(program_name)s.stderr diff --git a/SAS/ResourceAssignment/Services/test/CMakeLists.txt b/SAS/ResourceAssignment/Services/test/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..2dccf9d7337830a2811eb3f730a88e2f579f49d7 --- /dev/null +++ b/SAS/ResourceAssignment/Services/test/CMakeLists.txt @@ -0,0 +1,5 @@ +# $Id$ + +include(LofarCTest) + +lofar_add_test(tRATaskSpecified) diff --git a/SAS/ResourceAssignment/Services/test/tRATaskSpecified.in_correlator b/SAS/ResourceAssignment/Services/test/tRATaskSpecified.in_correlator new file mode 100644 index 0000000000000000000000000000000000000000..065b4a4adcfe512ed30602d7f4a5080e579e40c0 --- /dev/null +++ b/SAS/ResourceAssignment/Services/test/tRATaskSpecified.in_correlator @@ -0,0 +1,356 @@ +ApplCtrl.application=CorrAppl +ApplCtrl.processes=[CorrProc] +ApplCtrl.resultfile=/opt/lofar/var/run/ACC_CCU001:OnlineControl[0]{427282}_CorrAppl_result.param +Cobalt.BeamFormer.CoherentStokes.nrChannelsPerSubband=1 +Cobalt.BeamFormer.CoherentStokes.subbandsPerFile=512 +Cobalt.BeamFormer.CoherentStokes.timeIntegrationFactor=1 +Cobalt.BeamFormer.CoherentStokes.which=I +Cobalt.BeamFormer.IncoherentStokes.nrChannelsPerSubband=1 +Cobalt.BeamFormer.IncoherentStokes.subbandsPerFile=512 +Cobalt.BeamFormer.IncoherentStokes.timeIntegrationFactor=1 +Cobalt.BeamFormer.IncoherentStokes.which=I +Cobalt.BeamFormer.coherentDedisperseChannels=false +Cobalt.BeamFormer.flysEye=false +Cobalt.Correlator.integrationTime=1.00139 +Cobalt.Correlator.nrBlocksPerIntegration=1 +Cobalt.Correlator.nrChannelsPerSubband=64 +Cobalt.Correlator.nrIntegrationsPerBlock=1 +Cobalt.blockSize=195584 +Cobalt.correctBandPass=true +Cobalt.correctClocks=true +Cobalt.delayCompensation=true +Cobalt.realTime=true +CorrAppl.CorrProc._executable=CN_Processing +CorrAppl.CorrProc._hostname=cbmmaster +CorrAppl.CorrProc._nodes=[] +CorrAppl.CorrProc._startstopType=bgl +CorrAppl.CorrProc.workingdir=/opt/lofar/bin/ +CorrAppl._hostname=cbmmaster +CorrAppl.extraInfo=["PIC","Cobalt"] +CorrAppl.procesOrder=[] +CorrAppl.processes=["CorrProc"] +Observation.AnaBeam[0].angle1=3.71468 +Observation.AnaBeam[0].angle2=0.91111 +Observation.AnaBeam[0].directionType=J2000 +Observation.AnaBeam[0].duration=0 +Observation.AnaBeam[0].rank=1 +Observation.AnaBeam[0].startTime=0 +Observation.AnaBeam[0].target= +Observation.Beam[0].TiedArrayBeam.angle1=0 +Observation.Beam[0].TiedArrayBeam.angle2=0 +Observation.Beam[0].TiedArrayBeam.coherent=true +Observation.Beam[0].TiedArrayBeam.directionType=J2000 +Observation.Beam[0].TiedArrayBeam.dispersionMeasure=0 +Observation.Beam[0].angle1=3.71468 +Observation.Beam[0].angle2=0.91111 +Observation.Beam[0].directionType=J2000 +Observation.Beam[0].duration=0 +Observation.Beam[0].momID=0 +Observation.Beam[0].nrTabRings=0 +Observation.Beam[0].nrTiedArrayBeams=0 +Observation.Beam[0].startTime=0 +Observation.Beam[0].subbandList=[52..255] +Observation.Beam[0].tabRingSize=0 +Observation.Beam[0].target=3C 295 +Observation.Campaign.CO_I="" +Observation.Campaign.PI="Pizzo, Dr. Roberto Francesco" +Observation.Campaign.contact="Pizzo, Dr. Roberto Francesco" +Observation.Campaign.name="2015LOFAROBS_new" +Observation.Campaign.title="2015LOFAROBS_new" +Observation.DataProducts.Input_CoherentStokes.dirmask= +Observation.DataProducts.Input_CoherentStokes.enabled=false +Observation.DataProducts.Input_CoherentStokes.filenames=[] +Observation.DataProducts.Input_CoherentStokes.identifications=[] +Observation.DataProducts.Input_CoherentStokes.locations=[] +Observation.DataProducts.Input_CoherentStokes.mountpoints=[] +Observation.DataProducts.Input_CoherentStokes.namemask= +Observation.DataProducts.Input_CoherentStokes.skip=[] +Observation.DataProducts.Input_Correlated.dirmask= +Observation.DataProducts.Input_Correlated.enabled=false +Observation.DataProducts.Input_Correlated.filenames=[] +Observation.DataProducts.Input_Correlated.identifications=[] +Observation.DataProducts.Input_Correlated.locations=[] +Observation.DataProducts.Input_Correlated.mountpoints=[] +Observation.DataProducts.Input_Correlated.namemask= +Observation.DataProducts.Input_Correlated.skip=[] +Observation.DataProducts.Input_IncoherentStokes.dirmask= +Observation.DataProducts.Input_IncoherentStokes.enabled=false +Observation.DataProducts.Input_IncoherentStokes.filenames=[] +Observation.DataProducts.Input_IncoherentStokes.identifications=[] +Observation.DataProducts.Input_IncoherentStokes.locations=[] +Observation.DataProducts.Input_IncoherentStokes.mountpoints=[] +Observation.DataProducts.Input_IncoherentStokes.namemask= +Observation.DataProducts.Input_IncoherentStokes.skip=[] +Observation.DataProducts.Input_InstrumentModel.dirmask= +Observation.DataProducts.Input_InstrumentModel.enabled=false +Observation.DataProducts.Input_InstrumentModel.filenames=[] +Observation.DataProducts.Input_InstrumentModel.identifications=[] +Observation.DataProducts.Input_InstrumentModel.locations=[] +Observation.DataProducts.Input_InstrumentModel.mountpoints=[] +Observation.DataProducts.Input_InstrumentModel.namemask= +Observation.DataProducts.Input_InstrumentModel.skip=[] +Observation.DataProducts.Input_SkyImage.dirmask= +Observation.DataProducts.Input_SkyImage.enabled=false +Observation.DataProducts.Input_SkyImage.filenames=[] +Observation.DataProducts.Input_SkyImage.identifications=[] +Observation.DataProducts.Input_SkyImage.locations=[] +Observation.DataProducts.Input_SkyImage.mountpoints=[] +Observation.DataProducts.Input_SkyImage.namemask= +Observation.DataProducts.Input_SkyImage.skip=[] +Observation.DataProducts.Output_CoherentStokes.archived=false +Observation.DataProducts.Output_CoherentStokes.deleted=false +Observation.DataProducts.Output_CoherentStokes.dirmask= +Observation.DataProducts.Output_CoherentStokes.enabled=false +Observation.DataProducts.Output_CoherentStokes.filenames=[] +Observation.DataProducts.Output_CoherentStokes.identifications=[] +Observation.DataProducts.Output_CoherentStokes.locations=[] +Observation.DataProducts.Output_CoherentStokes.mountpoints=[] +Observation.DataProducts.Output_CoherentStokes.namemask= +Observation.DataProducts.Output_CoherentStokes.percentageWritten=[] +Observation.DataProducts.Output_CoherentStokes.retentiontime=14 +Observation.DataProducts.Output_CoherentStokes.skip=[] +Observation.DataProducts.Output_Correlated.archived=false +Observation.DataProducts.Output_Correlated.deleted=false +Observation.DataProducts.Output_Correlated.dirmask=L${OBSID} +Observation.DataProducts.Output_Correlated.enabled=true +Observation.DataProducts.Output_Correlated.filenames=[L427282_SAP000_SB000_uv.MS,L427282_SAP000_SB001_uv.MS,L427282_SAP000_SB002_uv.MS,L427282_SAP000_SB003_uv.MS,L427282_SAP000_SB004_uv.MS,L427282_SAP000_SB005_uv.MS,L427282_SAP000_SB006_uv.MS,L427282_SAP000_SB007_uv.MS,L427282_SAP000_SB008_uv.MS,L427282_SAP000_SB009_uv.MS,L427282_SAP000_SB010_uv.MS,L427282_SAP000_SB011_uv.MS,L427282_SAP000_SB012_uv.MS,L427282_SAP000_SB013_uv.MS,L427282_SAP000_SB014_uv.MS,L427282_SAP000_SB015_uv.MS,L427282_SAP000_SB016_uv.MS,L427282_SAP000_SB017_uv.MS,L427282_SAP000_SB018_uv.MS,L427282_SAP000_SB019_uv.MS,L427282_SAP000_SB020_uv.MS,L427282_SAP000_SB021_uv.MS,L427282_SAP000_SB022_uv.MS,L427282_SAP000_SB023_uv.MS,L427282_SAP000_SB024_uv.MS,L427282_SAP000_SB025_uv.MS,L427282_SAP000_SB026_uv.MS,L427282_SAP000_SB027_uv.MS,L427282_SAP000_SB028_uv.MS,L427282_SAP000_SB029_uv.MS,L427282_SAP000_SB030_uv.MS,L427282_SAP000_SB031_uv.MS,L427282_SAP000_SB032_uv.MS,L427282_SAP000_SB033_uv.MS,L427282_SAP000_SB034_uv.MS,L427282_SAP000_SB035_uv.MS,L427282_SAP000_SB036_uv.MS,L427282_SAP000_SB037_uv.MS,L427282_SAP000_SB038_uv.MS,L427282_SAP000_SB039_uv.MS,L427282_SAP000_SB040_uv.MS,L427282_SAP000_SB041_uv.MS,L427282_SAP000_SB042_uv.MS,L427282_SAP000_SB043_uv.MS,L427282_SAP000_SB044_uv.MS,L427282_SAP000_SB045_uv.MS,L427282_SAP000_SB046_uv.MS,L427282_SAP000_SB047_uv.MS,L427282_SAP000_SB048_uv.MS,L427282_SAP000_SB049_uv.MS,L427282_SAP000_SB050_uv.MS,L427282_SAP000_SB051_uv.MS,L427282_SAP000_SB052_uv.MS,L427282_SAP000_SB053_uv.MS,L427282_SAP000_SB054_uv.MS,L427282_SAP000_SB055_uv.MS,L427282_SAP000_SB056_uv.MS,L427282_SAP000_SB057_uv.MS,L427282_SAP000_SB058_uv.MS,L427282_SAP000_SB059_uv.MS,L427282_SAP000_SB060_uv.MS,L427282_SAP000_SB061_uv.MS,L427282_SAP000_SB062_uv.MS,L427282_SAP000_SB063_uv.MS,L427282_SAP000_SB064_uv.MS,L427282_SAP000_SB065_uv.MS,L427282_SAP000_SB066_uv.MS,L427282_SAP000_SB067_uv.MS,L427282_SAP000_SB068_uv.MS,L427282_SAP000_SB069_uv.MS,L427282_SAP000_SB070_uv.MS,L427282_SAP000_SB071_uv.MS,L427282_SAP000_SB072_uv.MS,L427282_SAP000_SB073_uv.MS,L427282_SAP000_SB074_uv.MS,L427282_SAP000_SB075_uv.MS,L427282_SAP000_SB076_uv.MS,L427282_SAP000_SB077_uv.MS,L427282_SAP000_SB078_uv.MS,L427282_SAP000_SB079_uv.MS,L427282_SAP000_SB080_uv.MS,L427282_SAP000_SB081_uv.MS,L427282_SAP000_SB082_uv.MS,L427282_SAP000_SB083_uv.MS,L427282_SAP000_SB084_uv.MS,L427282_SAP000_SB085_uv.MS,L427282_SAP000_SB086_uv.MS,L427282_SAP000_SB087_uv.MS,L427282_SAP000_SB088_uv.MS,L427282_SAP000_SB089_uv.MS,L427282_SAP000_SB090_uv.MS,L427282_SAP000_SB091_uv.MS,L427282_SAP000_SB092_uv.MS,L427282_SAP000_SB093_uv.MS,L427282_SAP000_SB094_uv.MS,L427282_SAP000_SB095_uv.MS,L427282_SAP000_SB096_uv.MS,L427282_SAP000_SB097_uv.MS,L427282_SAP000_SB098_uv.MS,L427282_SAP000_SB099_uv.MS,L427282_SAP000_SB100_uv.MS,L427282_SAP000_SB101_uv.MS,L427282_SAP000_SB102_uv.MS,L427282_SAP000_SB103_uv.MS,L427282_SAP000_SB104_uv.MS,L427282_SAP000_SB105_uv.MS,L427282_SAP000_SB106_uv.MS,L427282_SAP000_SB107_uv.MS,L427282_SAP000_SB108_uv.MS,L427282_SAP000_SB109_uv.MS,L427282_SAP000_SB110_uv.MS,L427282_SAP000_SB111_uv.MS,L427282_SAP000_SB112_uv.MS,L427282_SAP000_SB113_uv.MS,L427282_SAP000_SB114_uv.MS,L427282_SAP000_SB115_uv.MS,L427282_SAP000_SB116_uv.MS,L427282_SAP000_SB117_uv.MS,L427282_SAP000_SB118_uv.MS,L427282_SAP000_SB119_uv.MS,L427282_SAP000_SB120_uv.MS,L427282_SAP000_SB121_uv.MS,L427282_SAP000_SB122_uv.MS,L427282_SAP000_SB123_uv.MS,L427282_SAP000_SB124_uv.MS,L427282_SAP000_SB125_uv.MS,L427282_SAP000_SB126_uv.MS,L427282_SAP000_SB127_uv.MS,L427282_SAP000_SB128_uv.MS,L427282_SAP000_SB129_uv.MS,L427282_SAP000_SB130_uv.MS,L427282_SAP000_SB131_uv.MS,L427282_SAP000_SB132_uv.MS,L427282_SAP000_SB133_uv.MS,L427282_SAP000_SB134_uv.MS,L427282_SAP000_SB135_uv.MS,L427282_SAP000_SB136_uv.MS,L427282_SAP000_SB137_uv.MS,L427282_SAP000_SB138_uv.MS,L427282_SAP000_SB139_uv.MS,L427282_SAP000_SB140_uv.MS,L427282_SAP000_SB141_uv.MS,L427282_SAP000_SB142_uv.MS,L427282_SAP000_SB143_uv.MS,L427282_SAP000_SB144_uv.MS,L427282_SAP000_SB145_uv.MS,L427282_SAP000_SB146_uv.MS,L427282_SAP000_SB147_uv.MS,L427282_SAP000_SB148_uv.MS,L427282_SAP000_SB149_uv.MS,L427282_SAP000_SB150_uv.MS,L427282_SAP000_SB151_uv.MS,L427282_SAP000_SB152_uv.MS,L427282_SAP000_SB153_uv.MS,L427282_SAP000_SB154_uv.MS,L427282_SAP000_SB155_uv.MS,L427282_SAP000_SB156_uv.MS,L427282_SAP000_SB157_uv.MS,L427282_SAP000_SB158_uv.MS,L427282_SAP000_SB159_uv.MS,L427282_SAP000_SB160_uv.MS,L427282_SAP000_SB161_uv.MS,L427282_SAP000_SB162_uv.MS,L427282_SAP000_SB163_uv.MS,L427282_SAP000_SB164_uv.MS,L427282_SAP000_SB165_uv.MS,L427282_SAP000_SB166_uv.MS,L427282_SAP000_SB167_uv.MS,L427282_SAP000_SB168_uv.MS,L427282_SAP000_SB169_uv.MS,L427282_SAP000_SB170_uv.MS,L427282_SAP000_SB171_uv.MS,L427282_SAP000_SB172_uv.MS,L427282_SAP000_SB173_uv.MS,L427282_SAP000_SB174_uv.MS,L427282_SAP000_SB175_uv.MS,L427282_SAP000_SB176_uv.MS,L427282_SAP000_SB177_uv.MS,L427282_SAP000_SB178_uv.MS,L427282_SAP000_SB179_uv.MS,L427282_SAP000_SB180_uv.MS,L427282_SAP000_SB181_uv.MS,L427282_SAP000_SB182_uv.MS,L427282_SAP000_SB183_uv.MS,L427282_SAP000_SB184_uv.MS,L427282_SAP000_SB185_uv.MS,L427282_SAP000_SB186_uv.MS,L427282_SAP000_SB187_uv.MS,L427282_SAP000_SB188_uv.MS,L427282_SAP000_SB189_uv.MS,L427282_SAP000_SB190_uv.MS,L427282_SAP000_SB191_uv.MS,L427282_SAP000_SB192_uv.MS,L427282_SAP000_SB193_uv.MS,L427282_SAP000_SB194_uv.MS,L427282_SAP000_SB195_uv.MS,L427282_SAP000_SB196_uv.MS,L427282_SAP000_SB197_uv.MS,L427282_SAP000_SB198_uv.MS,L427282_SAP000_SB199_uv.MS,L427282_SAP000_SB200_uv.MS,L427282_SAP000_SB201_uv.MS,L427282_SAP000_SB202_uv.MS,L427282_SAP000_SB203_uv.MS] +Observation.DataProducts.Output_Correlated.identifications=[] +Observation.DataProducts.Output_Correlated.locations=[locus001:/data/L427282/,locus004:/data/L427282/,locus005:/data/L427282/,locus006:/data/L427282/,locus007:/data/L427282/,locus008:/data/L427282/,locus009:/data/L427282/,locus010:/data/L427282/,locus011:/data/L427282/,locus012:/data/L427282/,locus014:/data/L427282/,locus016:/data/L427282/,locus017:/data/L427282/,locus018:/data/L427282/,locus020:/data/L427282/,locus021:/data/L427282/,locus023:/data/L427282/,locus025:/data/L427282/,locus026:/data/L427282/,locus027:/data/L427282/,locus028:/data/L427282/,locus029:/data/L427282/,locus031:/data/L427282/,locus032:/data/L427282/,locus034:/data/L427282/,locus035:/data/L427282/,locus036:/data/L427282/,locus037:/data/L427282/,locus038:/data/L427282/,locus039:/data/L427282/,locus040:/data/L427282/,locus041:/data/L427282/,locus042:/data/L427282/,locus043:/data/L427282/,locus044:/data/L427282/,locus045:/data/L427282/,locus046:/data/L427282/,locus047:/data/L427282/,locus048:/data/L427282/,locus049:/data/L427282/,locus050:/data/L427282/,locus051:/data/L427282/,locus052:/data/L427282/,locus053:/data/L427282/,locus054:/data/L427282/,locus055:/data/L427282/,locus056:/data/L427282/,locus057:/data/L427282/,locus058:/data/L427282/,locus060:/data/L427282/,locus061:/data/L427282/,locus062:/data/L427282/,locus063:/data/L427282/,locus064:/data/L427282/,locus065:/data/L427282/,locus066:/data/L427282/,locus067:/data/L427282/,locus068:/data/L427282/,locus069:/data/L427282/,locus070:/data/L427282/,locus071:/data/L427282/,locus072:/data/L427282/,locus073:/data/L427282/,locus074:/data/L427282/,locus075:/data/L427282/,locus076:/data/L427282/,locus077:/data/L427282/,locus078:/data/L427282/,locus079:/data/L427282/,locus080:/data/L427282/,locus081:/data/L427282/,locus082:/data/L427282/,locus084:/data/L427282/,locus085:/data/L427282/,locus086:/data/L427282/,locus087:/data/L427282/,locus088:/data/L427282/,locus089:/data/L427282/,locus090:/data/L427282/,locus091:/data/L427282/,locus001:/data/L427282/,locus004:/data/L427282/,locus005:/data/L427282/,locus006:/data/L427282/,locus007:/data/L427282/,locus008:/data/L427282/,locus009:/data/L427282/,locus010:/data/L427282/,locus011:/data/L427282/,locus012:/data/L427282/,locus014:/data/L427282/,locus016:/data/L427282/,locus017:/data/L427282/,locus018:/data/L427282/,locus020:/data/L427282/,locus021:/data/L427282/,locus023:/data/L427282/,locus025:/data/L427282/,locus026:/data/L427282/,locus027:/data/L427282/,locus028:/data/L427282/,locus029:/data/L427282/,locus031:/data/L427282/,locus032:/data/L427282/,locus034:/data/L427282/,locus035:/data/L427282/,locus036:/data/L427282/,locus037:/data/L427282/,locus038:/data/L427282/,locus039:/data/L427282/,locus040:/data/L427282/,locus041:/data/L427282/,locus042:/data/L427282/,locus043:/data/L427282/,locus044:/data/L427282/,locus045:/data/L427282/,locus046:/data/L427282/,locus047:/data/L427282/,locus048:/data/L427282/,locus049:/data/L427282/,locus050:/data/L427282/,locus051:/data/L427282/,locus052:/data/L427282/,locus053:/data/L427282/,locus054:/data/L427282/,locus055:/data/L427282/,locus056:/data/L427282/,locus057:/data/L427282/,locus058:/data/L427282/,locus060:/data/L427282/,locus061:/data/L427282/,locus062:/data/L427282/,locus063:/data/L427282/,locus064:/data/L427282/,locus065:/data/L427282/,locus066:/data/L427282/,locus067:/data/L427282/,locus068:/data/L427282/,locus069:/data/L427282/,locus070:/data/L427282/,locus071:/data/L427282/,locus072:/data/L427282/,locus073:/data/L427282/,locus074:/data/L427282/,locus075:/data/L427282/,locus076:/data/L427282/,locus077:/data/L427282/,locus078:/data/L427282/,locus079:/data/L427282/,locus080:/data/L427282/,locus081:/data/L427282/,locus082:/data/L427282/,locus084:/data/L427282/,locus085:/data/L427282/,locus086:/data/L427282/,locus087:/data/L427282/,locus088:/data/L427282/,locus089:/data/L427282/,locus090:/data/L427282/,locus091:/data/L427282/,locus001:/data/L427282/,locus004:/data/L427282/,locus005:/data/L427282/,locus006:/data/L427282/,locus007:/data/L427282/,locus008:/data/L427282/,locus009:/data/L427282/,locus010:/data/L427282/,locus011:/data/L427282/,locus012:/data/L427282/,locus014:/data/L427282/,locus016:/data/L427282/,locus017:/data/L427282/,locus018:/data/L427282/,locus020:/data/L427282/,locus021:/data/L427282/,locus023:/data/L427282/,locus025:/data/L427282/,locus026:/data/L427282/,locus027:/data/L427282/,locus028:/data/L427282/,locus029:/data/L427282/,locus031:/data/L427282/,locus032:/data/L427282/,locus034:/data/L427282/,locus035:/data/L427282/,locus036:/data/L427282/,locus037:/data/L427282/,locus038:/data/L427282/,locus039:/data/L427282/,locus040:/data/L427282/,locus041:/data/L427282/,locus042:/data/L427282/,locus043:/data/L427282/,locus044:/data/L427282/,locus045:/data/L427282/,locus046:/data/L427282/,locus047:/data/L427282/,locus048:/data/L427282/,locus049:/data/L427282/,locus050:/data/L427282/,locus051:/data/L427282/,locus052:/data/L427282/,locus053:/data/L427282/] +Observation.DataProducts.Output_Correlated.mountpoints=[locus001:/data,locus004:/data,locus005:/data,locus006:/data,locus007:/data,locus008:/data,locus009:/data,locus010:/data,locus011:/data,locus012:/data,locus014:/data,locus016:/data,locus017:/data,locus018:/data,locus020:/data,locus021:/data,locus023:/data,locus025:/data,locus026:/data,locus027:/data,locus028:/data,locus029:/data,locus031:/data,locus032:/data,locus034:/data,locus035:/data,locus036:/data,locus037:/data,locus038:/data,locus039:/data,locus040:/data,locus041:/data,locus042:/data,locus043:/data,locus044:/data,locus045:/data,locus046:/data,locus047:/data,locus048:/data,locus049:/data,locus050:/data,locus051:/data,locus052:/data,locus053:/data,locus054:/data,locus055:/data,locus056:/data,locus057:/data,locus058:/data,locus060:/data,locus061:/data,locus062:/data,locus063:/data,locus064:/data,locus065:/data,locus066:/data,locus067:/data,locus068:/data,locus069:/data,locus070:/data,locus071:/data,locus072:/data,locus073:/data,locus074:/data,locus075:/data,locus076:/data,locus077:/data,locus078:/data,locus079:/data,locus080:/data,locus081:/data,locus082:/data,locus084:/data,locus085:/data,locus086:/data,locus087:/data,locus088:/data,locus089:/data,locus090:/data,locus091:/data] +Observation.DataProducts.Output_Correlated.namemask=L${OBSID}_SAP${SAP}_SB${SUBBAND}_uv.MS +Observation.DataProducts.Output_Correlated.percentageWritten=[] +Observation.DataProducts.Output_Correlated.retentiontime=14 +Observation.DataProducts.Output_Correlated.skip=[] +Observation.DataProducts.Output_IncoherentStokes.archived=false +Observation.DataProducts.Output_IncoherentStokes.deleted=false +Observation.DataProducts.Output_IncoherentStokes.dirmask= +Observation.DataProducts.Output_IncoherentStokes.enabled=false +Observation.DataProducts.Output_IncoherentStokes.filenames=[] +Observation.DataProducts.Output_IncoherentStokes.identifications=[] +Observation.DataProducts.Output_IncoherentStokes.locations=[] +Observation.DataProducts.Output_IncoherentStokes.mountpoints=[] +Observation.DataProducts.Output_IncoherentStokes.namemask= +Observation.DataProducts.Output_IncoherentStokes.percentageWritten=[] +Observation.DataProducts.Output_IncoherentStokes.retentiontime=14 +Observation.DataProducts.Output_IncoherentStokes.skip=[] +Observation.DataProducts.Output_InstrumentModel.archived=false +Observation.DataProducts.Output_InstrumentModel.deleted=false +Observation.DataProducts.Output_InstrumentModel.dirmask= +Observation.DataProducts.Output_InstrumentModel.enabled=false +Observation.DataProducts.Output_InstrumentModel.filenames=[] +Observation.DataProducts.Output_InstrumentModel.identifications=[] +Observation.DataProducts.Output_InstrumentModel.locations=[] +Observation.DataProducts.Output_InstrumentModel.mountpoints=[] +Observation.DataProducts.Output_InstrumentModel.namemask= +Observation.DataProducts.Output_InstrumentModel.percentageWritten=[] +Observation.DataProducts.Output_InstrumentModel.retentiontime=14 +Observation.DataProducts.Output_InstrumentModel.skip=[] +Observation.DataProducts.Output_Pulsar.archived=false +Observation.DataProducts.Output_Pulsar.deleted=false +Observation.DataProducts.Output_Pulsar.dirmask= +Observation.DataProducts.Output_Pulsar.enabled=false +Observation.DataProducts.Output_Pulsar.filenames=[] +Observation.DataProducts.Output_Pulsar.identifications=[] +Observation.DataProducts.Output_Pulsar.locations=[] +Observation.DataProducts.Output_Pulsar.mountpoints=[] +Observation.DataProducts.Output_Pulsar.namemask= +Observation.DataProducts.Output_Pulsar.percentageWritten=[] +Observation.DataProducts.Output_Pulsar.retentiontime=14 +Observation.DataProducts.Output_Pulsar.skip=[] +Observation.DataProducts.Output_SkyImage.archived=false +Observation.DataProducts.Output_SkyImage.deleted=false +Observation.DataProducts.Output_SkyImage.dirmask= +Observation.DataProducts.Output_SkyImage.enabled=false +Observation.DataProducts.Output_SkyImage.filenames=[] +Observation.DataProducts.Output_SkyImage.identifications=[] +Observation.DataProducts.Output_SkyImage.locations=[] +Observation.DataProducts.Output_SkyImage.mountpoints=[] +Observation.DataProducts.Output_SkyImage.namemask= +Observation.DataProducts.Output_SkyImage.percentageWritten=[] +Observation.DataProducts.Output_SkyImage.retentiontime=14 +Observation.DataProducts.Output_SkyImage.skip=[] +Observation.Dataslots.CS001HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS001HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS002HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS002HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS003HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS003HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS004HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS004HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS005HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS005HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS006HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS006HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS007HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS007HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS011HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS011HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS013HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS013HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS017HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS017HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS021HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS021HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS024HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS024HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS026HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS026HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS028HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS028HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS030HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS030HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS031HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS031HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS032HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS032HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS101HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS101HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS103HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS103HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS201HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS201HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS301HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS301HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS302HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS302HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS401HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS401HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.CS501HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.CS501HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.DataslotInfo.DataslotList=[] +Observation.Dataslots.DataslotInfo.RSPBoardList=[] +Observation.Dataslots.RS106HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS106HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS205HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS205HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS208HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS208HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS210HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS210HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS305HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS305HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS306HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS306HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS307HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS307HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS310HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS310HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS406HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS406HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS407HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS407HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS409HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS409HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS503HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS503HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.Dataslots.RS508HBA.DataslotList=[0..60,0..60,0..60,0..20] +Observation.Dataslots.RS508HBA.RSPBoardList=[61*0,61*1,61*2,21*3] +Observation.ObsID=427282 +Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.nrChannelsPerSubband=1 +Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.subbandsPerFile=512 +Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.timeIntegrationFactor=1 +Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.which=I +Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.IncoherentStokes.nrChannelsPerSubband=1 +Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.IncoherentStokes.subbandsPerFile=512 +Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.IncoherentStokes.timeIntegrationFactor=1 +Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.IncoherentStokes.which=I +Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.coherentDedisperseChannels=false +Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.flysEye=false +Observation.ObservationControl.OnlineControl.Cobalt.Correlator.integrationTime=1.00139 +Observation.ObservationControl.OnlineControl.Cobalt.Correlator.nrBlocksPerIntegration=1 +Observation.ObservationControl.OnlineControl.Cobalt.Correlator.nrChannelsPerSubband=64 +Observation.ObservationControl.OnlineControl.Cobalt.Correlator.nrIntegrationsPerBlock=1 +Observation.ObservationControl.OnlineControl.Cobalt.blockSize=195584 +Observation.ObservationControl.OnlineControl.Cobalt.correctBandPass=true +Observation.ObservationControl.OnlineControl.Cobalt.correctClocks=true +Observation.ObservationControl.OnlineControl.Cobalt.delayCompensation=true +Observation.ObservationControl.OnlineControl.Cobalt.realTime=true +Observation.ObservationControl.OnlineControl.CorrAppl.CorrProc._executable=CN_Processing +Observation.ObservationControl.OnlineControl.CorrAppl.CorrProc._hostname=cbmmaster +Observation.ObservationControl.OnlineControl.CorrAppl.CorrProc._nodes=[] +Observation.ObservationControl.OnlineControl.CorrAppl.CorrProc._startstopType=bgl +Observation.ObservationControl.OnlineControl.CorrAppl.CorrProc.workingdir=/opt/lofar/bin/ +Observation.ObservationControl.OnlineControl.CorrAppl._hostname=cbmmaster +Observation.ObservationControl.OnlineControl.CorrAppl.extraInfo=["PIC","Cobalt"] +Observation.ObservationControl.OnlineControl.CorrAppl.procesOrder=[] +Observation.ObservationControl.OnlineControl.CorrAppl.processes=["CorrProc"] +Observation.ObservationControl.OnlineControl._hostname=CCU001 +Observation.ObservationControl.OnlineControl.applOrder=["CorrAppl"] +Observation.ObservationControl.OnlineControl.applications=["CorrAppl"] +Observation.ObservationControl.OnlineControl.inspectionHost=lhn001.cep2.lofar +Observation.ObservationControl.OnlineControl.inspectionProgram=/opt/cep/pyautoplot/bin/launch-msplots.sh +Observation.ObservationControl.StationControl.TBBControl.CoincidenceTime=0 +Observation.ObservationControl.StationControl.TBBControl.DoDirectionFit=none +Observation.ObservationControl.StationControl.TBBControl.MaxFitVariance=0 +Observation.ObservationControl.StationControl.TBBControl.MinElevation=0 +Observation.ObservationControl.StationControl.TBBControl.NoCoincChann=0 +Observation.ObservationControl.StationControl.TBBControl.ParamExtension= +Observation.ObservationControl.StationControl._hostname=[CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508] +Observation.ObservationControl.StationControl.aartfaacPiggybackAllowed=true +Observation.ObservationControl.StationControl.tbbPiggybackAllowed=true +Observation.ObservationControl._hostname=MCU001 +Observation.ObservationControl.heartbeatInterval=10 +Observation.Scheduler.contactEmail= +Observation.Scheduler.contactName=Pizzo, Dr. Roberto Francesco +Observation.Scheduler.contactPhone= +Observation.Scheduler.firstPossibleDay=5864 +Observation.Scheduler.fixedDay=false +Observation.Scheduler.fixedTime=false +Observation.Scheduler.lastPossibleDay=6049 +Observation.Scheduler.late= +Observation.Scheduler.nightTimeWeightFactor=4 +Observation.Scheduler.predMaxTimeDif=0000:00:00 +Observation.Scheduler.predMinTimeDif=0000:00:00 +Observation.Scheduler.predecessors=[] +Observation.Scheduler.priority=0 +Observation.Scheduler.reason= +Observation.Scheduler.referenceFrame=J2000 +Observation.Scheduler.reservation=0 +Observation.Scheduler.storageSelectionMode=1 +Observation.Scheduler.taskDuration=120 +Observation.Scheduler.taskID=532 +Observation.Scheduler.taskName=(copy of) (copy of) XC HBA_JOINED +Observation.Scheduler.taskType=0 +Observation.Scheduler.windowMaximumTime=23:59:59 +Observation.Scheduler.windowMinimumTime=00:00:00 +Observation.TBB.TBBsetting.RCUs=[] +Observation.TBB.TBBsetting.baselevel=127 +Observation.TBB.TBBsetting.filter=0 +Observation.TBB.TBBsetting.filter0_coeff0=0 +Observation.TBB.TBBsetting.filter0_coeff1=0 +Observation.TBB.TBBsetting.filter0_coeff2=0 +Observation.TBB.TBBsetting.filter0_coeff3=0 +Observation.TBB.TBBsetting.filter1_coeff0=0 +Observation.TBB.TBBsetting.filter1_coeff1=0 +Observation.TBB.TBBsetting.filter1_coeff2=0 +Observation.TBB.TBBsetting.filter1_coeff3=0 +Observation.TBB.TBBsetting.operatingMode=1 +Observation.TBB.TBBsetting.startlevel=7 +Observation.TBB.TBBsetting.stoplevel=7 +Observation.TBB.TBBsetting.subbandList=[] +Observation.TBB.TBBsetting.triggerMode=1 +Observation.TBB.TBBsetting.window=1M +Observation.VirtualInstrument.minimalNrStations=1 +Observation.VirtualInstrument.stationList=[CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508] +Observation.VirtualInstrument.stationSet= +Observation.antennaArray=HBA +Observation.antennaSet=HBA_JOINED +Observation.bandFilter=HBA_210_250 +Observation.claimPeriod=35 +Observation.clockMode=<<Clock200 +Observation.momID=0 +Observation.nrAnaBeams=1 +Observation.nrBeams=1 +Observation.nrBitsPerSample=16 +Observation.nrTBBSettings=0 +Observation.originID=254020 +Observation.otdbID=427282 +Observation.preparePeriod=20 +Observation.processSubtype=Beam Observation +Observation.processType=Observation +Observation.sampleClock=200 +Observation.startTime=2016-01-21 14:30:00 +Observation.stopTime=2016-01-21 14:32:00 +Observation.strategy=default +Observation.topologyID= +_DPname=LOFAR_ObsSW_TempObs0054 diff --git a/SAS/ResourceAssignment/Services/test/tRATaskSpecified.in_preprocessing b/SAS/ResourceAssignment/Services/test/tRATaskSpecified.in_preprocessing new file mode 100644 index 0000000000000000000000000000000000000000..88bf9567fb31a55e9a86fbc60632d3df2e1c8a98 --- /dev/null +++ b/SAS/ResourceAssignment/Services/test/tRATaskSpecified.in_preprocessing @@ -0,0 +1,273 @@ +Clock160.channelWidth=610.3515625 +Clock160.samplesPerSecond=155648 +Clock160.subbandWidth=156.250 +Clock160.systemClock=160 +Clock200.channelWidth=762.939453125 +Clock200.samplesPerSecond=196608 +Clock200.subbandWidth=195.3125 +Clock200.systemClock=200 +ObsSW.Observation.Campaign.CO_I="" +ObsSW.Observation.Campaign.PI="Pizzo, Dr. Roberto Francesco" +ObsSW.Observation.Campaign.contact="Pizzo, Dr. Roberto Francesco" +ObsSW.Observation.Campaign.name="2015LOFAROBS_new" +ObsSW.Observation.Campaign.title="2015LOFAROBS_new" +ObsSW.Observation.DataProducts.Input_CoherentStokes.dirmask= +ObsSW.Observation.DataProducts.Input_CoherentStokes.enabled=false +ObsSW.Observation.DataProducts.Input_CoherentStokes.filenames=[] +ObsSW.Observation.DataProducts.Input_CoherentStokes.identifications=[] +ObsSW.Observation.DataProducts.Input_CoherentStokes.locations=[] +ObsSW.Observation.DataProducts.Input_CoherentStokes.mountpoints=[] +ObsSW.Observation.DataProducts.Input_CoherentStokes.namemask= +ObsSW.Observation.DataProducts.Input_CoherentStokes.skip=[] +ObsSW.Observation.DataProducts.Input_Correlated.dirmask= +ObsSW.Observation.DataProducts.Input_Correlated.enabled=true +ObsSW.Observation.DataProducts.Input_Correlated.filenames=[L426528_SAP000_SB000_uv.MS,L426528_SAP000_SB001_uv.MS,L426528_SAP000_SB002_uv.MS,L426528_SAP000_SB003_uv.MS,L426528_SAP000_SB004_uv.MS,L426528_SAP000_SB005_uv.MS,L426528_SAP000_SB006_uv.MS,L426528_SAP000_SB007_uv.MS,L426528_SAP000_SB008_uv.MS,L426528_SAP000_SB009_uv.MS,L426528_SAP000_SB010_uv.MS,L426528_SAP000_SB011_uv.MS,L426528_SAP000_SB012_uv.MS,L426528_SAP000_SB013_uv.MS,L426528_SAP000_SB014_uv.MS,L426528_SAP000_SB015_uv.MS,L426528_SAP000_SB016_uv.MS,L426528_SAP000_SB017_uv.MS,L426528_SAP000_SB018_uv.MS,L426528_SAP000_SB019_uv.MS,L426528_SAP000_SB020_uv.MS,L426528_SAP000_SB021_uv.MS,L426528_SAP000_SB022_uv.MS,L426528_SAP000_SB023_uv.MS,L426528_SAP000_SB024_uv.MS,L426528_SAP000_SB025_uv.MS,L426528_SAP000_SB026_uv.MS,L426528_SAP000_SB027_uv.MS,L426528_SAP000_SB028_uv.MS,L426528_SAP000_SB029_uv.MS,L426528_SAP000_SB030_uv.MS,L426528_SAP000_SB031_uv.MS,L426528_SAP000_SB032_uv.MS,L426528_SAP000_SB033_uv.MS,L426528_SAP000_SB034_uv.MS,L426528_SAP000_SB035_uv.MS,L426528_SAP000_SB036_uv.MS,L426528_SAP000_SB037_uv.MS,L426528_SAP000_SB038_uv.MS,L426528_SAP000_SB039_uv.MS,L426528_SAP000_SB040_uv.MS,L426528_SAP000_SB041_uv.MS,L426528_SAP000_SB042_uv.MS,L426528_SAP000_SB043_uv.MS,L426528_SAP000_SB044_uv.MS,L426528_SAP000_SB045_uv.MS,L426528_SAP000_SB046_uv.MS,L426528_SAP000_SB047_uv.MS,L426528_SAP000_SB048_uv.MS,L426528_SAP000_SB049_uv.MS,L426528_SAP000_SB050_uv.MS,L426528_SAP000_SB051_uv.MS,L426528_SAP000_SB052_uv.MS,L426528_SAP000_SB053_uv.MS,L426528_SAP000_SB054_uv.MS,L426528_SAP000_SB055_uv.MS,L426528_SAP000_SB056_uv.MS,L426528_SAP000_SB057_uv.MS,L426528_SAP000_SB058_uv.MS,L426528_SAP000_SB059_uv.MS,L426528_SAP000_SB060_uv.MS,L426528_SAP000_SB061_uv.MS,L426528_SAP000_SB062_uv.MS,L426528_SAP000_SB063_uv.MS,L426528_SAP000_SB064_uv.MS,L426528_SAP000_SB065_uv.MS,L426528_SAP000_SB066_uv.MS,L426528_SAP000_SB067_uv.MS,L426528_SAP000_SB068_uv.MS,L426528_SAP000_SB069_uv.MS,L426528_SAP000_SB070_uv.MS,L426528_SAP000_SB071_uv.MS,L426528_SAP000_SB072_uv.MS,L426528_SAP000_SB073_uv.MS,L426528_SAP000_SB074_uv.MS,L426528_SAP000_SB075_uv.MS,L426528_SAP000_SB076_uv.MS,L426528_SAP000_SB077_uv.MS,L426528_SAP000_SB078_uv.MS,L426528_SAP000_SB079_uv.MS,L426528_SAP000_SB080_uv.MS,L426528_SAP000_SB081_uv.MS,L426528_SAP000_SB082_uv.MS,L426528_SAP000_SB083_uv.MS,L426528_SAP000_SB084_uv.MS,L426528_SAP000_SB085_uv.MS,L426528_SAP000_SB086_uv.MS,L426528_SAP000_SB087_uv.MS,L426528_SAP000_SB088_uv.MS,L426528_SAP000_SB089_uv.MS,L426528_SAP000_SB090_uv.MS,L426528_SAP000_SB091_uv.MS,L426528_SAP000_SB092_uv.MS,L426528_SAP000_SB093_uv.MS,L426528_SAP000_SB094_uv.MS,L426528_SAP000_SB095_uv.MS,L426528_SAP000_SB096_uv.MS,L426528_SAP000_SB097_uv.MS,L426528_SAP000_SB098_uv.MS,L426528_SAP000_SB099_uv.MS,L426528_SAP000_SB100_uv.MS,L426528_SAP000_SB101_uv.MS,L426528_SAP000_SB102_uv.MS,L426528_SAP000_SB103_uv.MS,L426528_SAP000_SB104_uv.MS,L426528_SAP000_SB105_uv.MS,L426528_SAP000_SB106_uv.MS,L426528_SAP000_SB107_uv.MS,L426528_SAP000_SB108_uv.MS,L426528_SAP000_SB109_uv.MS,L426528_SAP000_SB110_uv.MS,L426528_SAP000_SB111_uv.MS,L426528_SAP000_SB112_uv.MS,L426528_SAP000_SB113_uv.MS,L426528_SAP000_SB114_uv.MS,L426528_SAP000_SB115_uv.MS,L426528_SAP000_SB116_uv.MS,L426528_SAP000_SB117_uv.MS,L426528_SAP000_SB118_uv.MS,L426528_SAP000_SB119_uv.MS,L426528_SAP000_SB120_uv.MS,L426528_SAP000_SB121_uv.MS,L426528_SAP000_SB122_uv.MS,L426528_SAP000_SB123_uv.MS,L426528_SAP000_SB124_uv.MS,L426528_SAP000_SB125_uv.MS,L426528_SAP000_SB126_uv.MS,L426528_SAP000_SB127_uv.MS,L426528_SAP000_SB128_uv.MS,L426528_SAP000_SB129_uv.MS,L426528_SAP000_SB130_uv.MS,L426528_SAP000_SB131_uv.MS,L426528_SAP000_SB132_uv.MS,L426528_SAP000_SB133_uv.MS,L426528_SAP000_SB134_uv.MS,L426528_SAP000_SB135_uv.MS,L426528_SAP000_SB136_uv.MS,L426528_SAP000_SB137_uv.MS,L426528_SAP000_SB138_uv.MS,L426528_SAP000_SB139_uv.MS,L426528_SAP000_SB140_uv.MS,L426528_SAP000_SB141_uv.MS,L426528_SAP000_SB142_uv.MS,L426528_SAP000_SB143_uv.MS,L426528_SAP000_SB144_uv.MS,L426528_SAP000_SB145_uv.MS,L426528_SAP000_SB146_uv.MS,L426528_SAP000_SB147_uv.MS,L426528_SAP000_SB148_uv.MS,L426528_SAP000_SB149_uv.MS,L426528_SAP000_SB150_uv.MS,L426528_SAP000_SB151_uv.MS,L426528_SAP000_SB152_uv.MS,L426528_SAP000_SB153_uv.MS,L426528_SAP000_SB154_uv.MS,L426528_SAP000_SB155_uv.MS,L426528_SAP000_SB156_uv.MS,L426528_SAP000_SB157_uv.MS,L426528_SAP000_SB158_uv.MS,L426528_SAP000_SB159_uv.MS,L426528_SAP000_SB160_uv.MS,L426528_SAP000_SB161_uv.MS,L426528_SAP000_SB162_uv.MS,L426528_SAP000_SB163_uv.MS,L426528_SAP000_SB164_uv.MS,L426528_SAP000_SB165_uv.MS,L426528_SAP000_SB166_uv.MS,L426528_SAP000_SB167_uv.MS,L426528_SAP000_SB168_uv.MS,L426528_SAP000_SB169_uv.MS,L426528_SAP000_SB170_uv.MS,L426528_SAP000_SB171_uv.MS,L426528_SAP000_SB172_uv.MS,L426528_SAP000_SB173_uv.MS,L426528_SAP000_SB174_uv.MS,L426528_SAP000_SB175_uv.MS,L426528_SAP000_SB176_uv.MS,L426528_SAP000_SB177_uv.MS,L426528_SAP000_SB178_uv.MS,L426528_SAP000_SB179_uv.MS,L426528_SAP000_SB180_uv.MS,L426528_SAP000_SB181_uv.MS,L426528_SAP000_SB182_uv.MS,L426528_SAP000_SB183_uv.MS,L426528_SAP000_SB184_uv.MS,L426528_SAP000_SB185_uv.MS,L426528_SAP000_SB186_uv.MS,L426528_SAP000_SB187_uv.MS,L426528_SAP000_SB188_uv.MS,L426528_SAP000_SB189_uv.MS,L426528_SAP000_SB190_uv.MS,L426528_SAP000_SB191_uv.MS,L426528_SAP000_SB192_uv.MS,L426528_SAP000_SB193_uv.MS,L426528_SAP000_SB194_uv.MS,L426528_SAP000_SB195_uv.MS,L426528_SAP000_SB196_uv.MS,L426528_SAP000_SB197_uv.MS,L426528_SAP000_SB198_uv.MS,L426528_SAP000_SB199_uv.MS,L426528_SAP000_SB200_uv.MS,L426528_SAP000_SB201_uv.MS,L426528_SAP000_SB202_uv.MS,L426528_SAP000_SB203_uv.MS,L426528_SAP000_SB204_uv.MS,L426528_SAP000_SB205_uv.MS,L426528_SAP000_SB206_uv.MS,L426528_SAP000_SB207_uv.MS,L426528_SAP000_SB208_uv.MS,L426528_SAP000_SB209_uv.MS,L426528_SAP000_SB210_uv.MS,L426528_SAP000_SB211_uv.MS,L426528_SAP000_SB212_uv.MS,L426528_SAP000_SB213_uv.MS,L426528_SAP000_SB214_uv.MS,L426528_SAP000_SB215_uv.MS,L426528_SAP000_SB216_uv.MS,L426528_SAP000_SB217_uv.MS,L426528_SAP000_SB218_uv.MS,L426528_SAP000_SB219_uv.MS,L426528_SAP000_SB220_uv.MS,L426528_SAP000_SB221_uv.MS,L426528_SAP000_SB222_uv.MS,L426528_SAP000_SB223_uv.MS,L426528_SAP000_SB224_uv.MS,L426528_SAP000_SB225_uv.MS,L426528_SAP000_SB226_uv.MS,L426528_SAP000_SB227_uv.MS,L426528_SAP000_SB228_uv.MS,L426528_SAP000_SB229_uv.MS,L426528_SAP000_SB230_uv.MS,L426528_SAP000_SB231_uv.MS,L426528_SAP000_SB232_uv.MS,L426528_SAP000_SB233_uv.MS,L426528_SAP000_SB234_uv.MS,L426528_SAP000_SB235_uv.MS,L426528_SAP000_SB236_uv.MS,L426528_SAP000_SB237_uv.MS,L426528_SAP000_SB238_uv.MS,L426528_SAP000_SB239_uv.MS,L426528_SAP000_SB240_uv.MS,L426528_SAP000_SB241_uv.MS,L426528_SAP000_SB242_uv.MS,L426528_SAP000_SB243_uv.MS] +ObsSW.Observation.DataProducts.Input_Correlated.identifications=[mom.G630967.B0.1.T.SAP000.uv.dps] +ObsSW.Observation.DataProducts.Input_Correlated.locations=[locus001:/data/L426528/,locus003:/data/L426528/,locus004:/data/L426528/,locus005:/data/L426528/,locus006:/data/L426528/,locus007:/data/L426528/,locus008:/data/L426528/,locus009:/data/L426528/,locus010:/data/L426528/,locus011:/data/L426528/,locus012:/data/L426528/,locus014:/data/L426528/,locus016:/data/L426528/,locus017:/data/L426528/,locus018:/data/L426528/,locus020:/data/L426528/,locus021:/data/L426528/,locus023:/data/L426528/,locus025:/data/L426528/,locus026:/data/L426528/,locus027:/data/L426528/,locus028:/data/L426528/,locus029:/data/L426528/,locus031:/data/L426528/,locus032:/data/L426528/,locus034:/data/L426528/,locus035:/data/L426528/,locus036:/data/L426528/,locus037:/data/L426528/,locus038:/data/L426528/,locus039:/data/L426528/,locus040:/data/L426528/,locus041:/data/L426528/,locus042:/data/L426528/,locus043:/data/L426528/,locus044:/data/L426528/,locus045:/data/L426528/,locus046:/data/L426528/,locus047:/data/L426528/,locus048:/data/L426528/,locus049:/data/L426528/,locus050:/data/L426528/,locus051:/data/L426528/,locus052:/data/L426528/,locus053:/data/L426528/,locus054:/data/L426528/,locus055:/data/L426528/,locus056:/data/L426528/,locus057:/data/L426528/,locus058:/data/L426528/,locus060:/data/L426528/,locus061:/data/L426528/,locus062:/data/L426528/,locus063:/data/L426528/,locus064:/data/L426528/,locus065:/data/L426528/,locus066:/data/L426528/,locus067:/data/L426528/,locus068:/data/L426528/,locus069:/data/L426528/,locus070:/data/L426528/,locus071:/data/L426528/,locus072:/data/L426528/,locus073:/data/L426528/,locus074:/data/L426528/,locus075:/data/L426528/,locus076:/data/L426528/,locus077:/data/L426528/,locus078:/data/L426528/,locus079:/data/L426528/,locus080:/data/L426528/,locus081:/data/L426528/,locus082:/data/L426528/,locus084:/data/L426528/,locus085:/data/L426528/,locus086:/data/L426528/,locus087:/data/L426528/,locus088:/data/L426528/,locus089:/data/L426528/,locus090:/data/L426528/,locus091:/data/L426528/,locus001:/data/L426528/,locus003:/data/L426528/,locus004:/data/L426528/,locus005:/data/L426528/,locus006:/data/L426528/,locus007:/data/L426528/,locus008:/data/L426528/,locus009:/data/L426528/,locus010:/data/L426528/,locus011:/data/L426528/,locus012:/data/L426528/,locus014:/data/L426528/,locus016:/data/L426528/,locus017:/data/L426528/,locus018:/data/L426528/,locus020:/data/L426528/,locus021:/data/L426528/,locus023:/data/L426528/,locus025:/data/L426528/,locus026:/data/L426528/,locus027:/data/L426528/,locus028:/data/L426528/,locus029:/data/L426528/,locus031:/data/L426528/,locus032:/data/L426528/,locus034:/data/L426528/,locus035:/data/L426528/,locus036:/data/L426528/,locus037:/data/L426528/,locus038:/data/L426528/,locus039:/data/L426528/,locus040:/data/L426528/,locus041:/data/L426528/,locus042:/data/L426528/,locus043:/data/L426528/,locus044:/data/L426528/,locus045:/data/L426528/,locus046:/data/L426528/,locus047:/data/L426528/,locus048:/data/L426528/,locus049:/data/L426528/,locus050:/data/L426528/,locus051:/data/L426528/,locus052:/data/L426528/,locus053:/data/L426528/,locus054:/data/L426528/,locus055:/data/L426528/,locus056:/data/L426528/,locus057:/data/L426528/,locus058:/data/L426528/,locus060:/data/L426528/,locus061:/data/L426528/,locus062:/data/L426528/,locus063:/data/L426528/,locus064:/data/L426528/,locus065:/data/L426528/,locus066:/data/L426528/,locus067:/data/L426528/,locus068:/data/L426528/,locus069:/data/L426528/,locus070:/data/L426528/,locus071:/data/L426528/,locus072:/data/L426528/,locus073:/data/L426528/,locus074:/data/L426528/,locus075:/data/L426528/,locus076:/data/L426528/,locus077:/data/L426528/,locus078:/data/L426528/,locus079:/data/L426528/,locus080:/data/L426528/,locus081:/data/L426528/,locus082:/data/L426528/,locus084:/data/L426528/,locus085:/data/L426528/,locus086:/data/L426528/,locus087:/data/L426528/,locus088:/data/L426528/,locus089:/data/L426528/,locus090:/data/L426528/,locus091:/data/L426528/,locus001:/data/L426528/,locus003:/data/L426528/,locus004:/data/L426528/,locus005:/data/L426528/,locus006:/data/L426528/,locus007:/data/L426528/,locus008:/data/L426528/,locus009:/data/L426528/,locus010:/data/L426528/,locus011:/data/L426528/,locus012:/data/L426528/,locus014:/data/L426528/,locus016:/data/L426528/,locus017:/data/L426528/,locus018:/data/L426528/,locus020:/data/L426528/,locus021:/data/L426528/,locus023:/data/L426528/,locus025:/data/L426528/,locus026:/data/L426528/,locus027:/data/L426528/,locus028:/data/L426528/,locus029:/data/L426528/,locus031:/data/L426528/,locus032:/data/L426528/,locus034:/data/L426528/,locus035:/data/L426528/,locus036:/data/L426528/,locus037:/data/L426528/,locus038:/data/L426528/,locus039:/data/L426528/,locus040:/data/L426528/,locus041:/data/L426528/,locus042:/data/L426528/,locus043:/data/L426528/,locus044:/data/L426528/,locus045:/data/L426528/,locus046:/data/L426528/,locus047:/data/L426528/,locus048:/data/L426528/,locus049:/data/L426528/,locus050:/data/L426528/,locus051:/data/L426528/,locus052:/data/L426528/,locus053:/data/L426528/,locus054:/data/L426528/,locus055:/data/L426528/,locus056:/data/L426528/,locus057:/data/L426528/,locus058:/data/L426528/,locus060:/data/L426528/,locus061:/data/L426528/,locus062:/data/L426528/,locus063:/data/L426528/,locus064:/data/L426528/,locus065:/data/L426528/,locus066:/data/L426528/,locus067:/data/L426528/,locus068:/data/L426528/,locus069:/data/L426528/,locus070:/data/L426528/,locus071:/data/L426528/,locus072:/data/L426528/,locus073:/data/L426528/,locus074:/data/L426528/,locus075:/data/L426528/,locus076:/data/L426528/,locus077:/data/L426528/,locus078:/data/L426528/,locus079:/data/L426528/,locus080:/data/L426528/,locus081:/data/L426528/,locus082:/data/L426528/,locus084:/data/L426528/,locus085:/data/L426528/,locus086:/data/L426528/,locus087:/data/L426528/,locus088:/data/L426528/,locus089:/data/L426528/,locus090:/data/L426528/,locus091:/data/L426528/,locus001:/data/L426528/] +ObsSW.Observation.DataProducts.Input_Correlated.mountpoints=[] +ObsSW.Observation.DataProducts.Input_Correlated.namemask= +ObsSW.Observation.DataProducts.Input_Correlated.skip=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] +ObsSW.Observation.DataProducts.Input_IncoherentStokes.dirmask= +ObsSW.Observation.DataProducts.Input_IncoherentStokes.enabled=false +ObsSW.Observation.DataProducts.Input_IncoherentStokes.filenames=[] +ObsSW.Observation.DataProducts.Input_IncoherentStokes.identifications=[] +ObsSW.Observation.DataProducts.Input_IncoherentStokes.locations=[] +ObsSW.Observation.DataProducts.Input_IncoherentStokes.mountpoints=[] +ObsSW.Observation.DataProducts.Input_IncoherentStokes.namemask= +ObsSW.Observation.DataProducts.Input_IncoherentStokes.skip=[] +ObsSW.Observation.DataProducts.Input_InstrumentModel.dirmask= +ObsSW.Observation.DataProducts.Input_InstrumentModel.enabled=false +ObsSW.Observation.DataProducts.Input_InstrumentModel.filenames=[] +ObsSW.Observation.DataProducts.Input_InstrumentModel.identifications=[] +ObsSW.Observation.DataProducts.Input_InstrumentModel.locations=[] +ObsSW.Observation.DataProducts.Input_InstrumentModel.mountpoints=[] +ObsSW.Observation.DataProducts.Input_InstrumentModel.namemask= +ObsSW.Observation.DataProducts.Input_InstrumentModel.skip=[] +ObsSW.Observation.DataProducts.Input_SkyImage.dirmask= +ObsSW.Observation.DataProducts.Input_SkyImage.enabled=false +ObsSW.Observation.DataProducts.Input_SkyImage.filenames=[] +ObsSW.Observation.DataProducts.Input_SkyImage.identifications=[] +ObsSW.Observation.DataProducts.Input_SkyImage.locations=[] +ObsSW.Observation.DataProducts.Input_SkyImage.mountpoints=[] +ObsSW.Observation.DataProducts.Input_SkyImage.namemask= +ObsSW.Observation.DataProducts.Input_SkyImage.skip=[] +ObsSW.Observation.DataProducts.Output_CoherentStokes.archived=false +ObsSW.Observation.DataProducts.Output_CoherentStokes.deleted=false +ObsSW.Observation.DataProducts.Output_CoherentStokes.dirmask= +ObsSW.Observation.DataProducts.Output_CoherentStokes.enabled=false +ObsSW.Observation.DataProducts.Output_CoherentStokes.filenames=[] +ObsSW.Observation.DataProducts.Output_CoherentStokes.identifications=[] +ObsSW.Observation.DataProducts.Output_CoherentStokes.locations=[] +ObsSW.Observation.DataProducts.Output_CoherentStokes.mountpoints=[] +ObsSW.Observation.DataProducts.Output_CoherentStokes.namemask= +ObsSW.Observation.DataProducts.Output_CoherentStokes.percentageWritten=[] +ObsSW.Observation.DataProducts.Output_CoherentStokes.retentiontime=14 +ObsSW.Observation.DataProducts.Output_CoherentStokes.skip=[] +ObsSW.Observation.DataProducts.Output_Correlated.archived=false +ObsSW.Observation.DataProducts.Output_Correlated.deleted=false +ObsSW.Observation.DataProducts.Output_Correlated.dirmask=L${OBSID} +ObsSW.Observation.DataProducts.Output_Correlated.enabled=true +ObsSW.Observation.DataProducts.Output_Correlated.filenames=[L426942_SB000_uv.dppp.MS,L426942_SB001_uv.dppp.MS,L426942_SB002_uv.dppp.MS,L426942_SB003_uv.dppp.MS,L426942_SB004_uv.dppp.MS,L426942_SB005_uv.dppp.MS,L426942_SB006_uv.dppp.MS,L426942_SB007_uv.dppp.MS,L426942_SB008_uv.dppp.MS,L426942_SB009_uv.dppp.MS,L426942_SB010_uv.dppp.MS,L426942_SB011_uv.dppp.MS,L426942_SB012_uv.dppp.MS,L426942_SB013_uv.dppp.MS,L426942_SB014_uv.dppp.MS,L426942_SB015_uv.dppp.MS,L426942_SB016_uv.dppp.MS,L426942_SB017_uv.dppp.MS,L426942_SB018_uv.dppp.MS,L426942_SB019_uv.dppp.MS,L426942_SB020_uv.dppp.MS,L426942_SB021_uv.dppp.MS,L426942_SB022_uv.dppp.MS,L426942_SB023_uv.dppp.MS,L426942_SB024_uv.dppp.MS,L426942_SB025_uv.dppp.MS,L426942_SB026_uv.dppp.MS,L426942_SB027_uv.dppp.MS,L426942_SB028_uv.dppp.MS,L426942_SB029_uv.dppp.MS,L426942_SB030_uv.dppp.MS,L426942_SB031_uv.dppp.MS,L426942_SB032_uv.dppp.MS,L426942_SB033_uv.dppp.MS,L426942_SB034_uv.dppp.MS,L426942_SB035_uv.dppp.MS,L426942_SB036_uv.dppp.MS,L426942_SB037_uv.dppp.MS,L426942_SB038_uv.dppp.MS,L426942_SB039_uv.dppp.MS,L426942_SB040_uv.dppp.MS,L426942_SB041_uv.dppp.MS,L426942_SB042_uv.dppp.MS,L426942_SB043_uv.dppp.MS,L426942_SB044_uv.dppp.MS,L426942_SB045_uv.dppp.MS,L426942_SB046_uv.dppp.MS,L426942_SB047_uv.dppp.MS,L426942_SB048_uv.dppp.MS,L426942_SB049_uv.dppp.MS,L426942_SB050_uv.dppp.MS,L426942_SB051_uv.dppp.MS,L426942_SB052_uv.dppp.MS,L426942_SB053_uv.dppp.MS,L426942_SB054_uv.dppp.MS,L426942_SB055_uv.dppp.MS,L426942_SB056_uv.dppp.MS,L426942_SB057_uv.dppp.MS,L426942_SB058_uv.dppp.MS,L426942_SB059_uv.dppp.MS,L426942_SB060_uv.dppp.MS,L426942_SB061_uv.dppp.MS,L426942_SB062_uv.dppp.MS,L426942_SB063_uv.dppp.MS,L426942_SB064_uv.dppp.MS,L426942_SB065_uv.dppp.MS,L426942_SB066_uv.dppp.MS,L426942_SB067_uv.dppp.MS,L426942_SB068_uv.dppp.MS,L426942_SB069_uv.dppp.MS,L426942_SB070_uv.dppp.MS,L426942_SB071_uv.dppp.MS,L426942_SB072_uv.dppp.MS,L426942_SB073_uv.dppp.MS,L426942_SB074_uv.dppp.MS,L426942_SB075_uv.dppp.MS,L426942_SB076_uv.dppp.MS,L426942_SB077_uv.dppp.MS,L426942_SB078_uv.dppp.MS,L426942_SB079_uv.dppp.MS,L426942_SB080_uv.dppp.MS,L426942_SB081_uv.dppp.MS,L426942_SB082_uv.dppp.MS,L426942_SB083_uv.dppp.MS,L426942_SB084_uv.dppp.MS,L426942_SB085_uv.dppp.MS,L426942_SB086_uv.dppp.MS,L426942_SB087_uv.dppp.MS,L426942_SB088_uv.dppp.MS,L426942_SB089_uv.dppp.MS,L426942_SB090_uv.dppp.MS,L426942_SB091_uv.dppp.MS,L426942_SB092_uv.dppp.MS,L426942_SB093_uv.dppp.MS,L426942_SB094_uv.dppp.MS,L426942_SB095_uv.dppp.MS,L426942_SB096_uv.dppp.MS,L426942_SB097_uv.dppp.MS,L426942_SB098_uv.dppp.MS,L426942_SB099_uv.dppp.MS,L426942_SB100_uv.dppp.MS,L426942_SB101_uv.dppp.MS,L426942_SB102_uv.dppp.MS,L426942_SB103_uv.dppp.MS,L426942_SB104_uv.dppp.MS,L426942_SB105_uv.dppp.MS,L426942_SB106_uv.dppp.MS,L426942_SB107_uv.dppp.MS,L426942_SB108_uv.dppp.MS,L426942_SB109_uv.dppp.MS,L426942_SB110_uv.dppp.MS,L426942_SB111_uv.dppp.MS,L426942_SB112_uv.dppp.MS,L426942_SB113_uv.dppp.MS,L426942_SB114_uv.dppp.MS,L426942_SB115_uv.dppp.MS,L426942_SB116_uv.dppp.MS,L426942_SB117_uv.dppp.MS,L426942_SB118_uv.dppp.MS,L426942_SB119_uv.dppp.MS,L426942_SB120_uv.dppp.MS,L426942_SB121_uv.dppp.MS,L426942_SB122_uv.dppp.MS,L426942_SB123_uv.dppp.MS,L426942_SB124_uv.dppp.MS,L426942_SB125_uv.dppp.MS,L426942_SB126_uv.dppp.MS,L426942_SB127_uv.dppp.MS,L426942_SB128_uv.dppp.MS,L426942_SB129_uv.dppp.MS,L426942_SB130_uv.dppp.MS,L426942_SB131_uv.dppp.MS,L426942_SB132_uv.dppp.MS,L426942_SB133_uv.dppp.MS,L426942_SB134_uv.dppp.MS,L426942_SB135_uv.dppp.MS,L426942_SB136_uv.dppp.MS,L426942_SB137_uv.dppp.MS,L426942_SB138_uv.dppp.MS,L426942_SB139_uv.dppp.MS,L426942_SB140_uv.dppp.MS,L426942_SB141_uv.dppp.MS,L426942_SB142_uv.dppp.MS,L426942_SB143_uv.dppp.MS,L426942_SB144_uv.dppp.MS,L426942_SB145_uv.dppp.MS,L426942_SB146_uv.dppp.MS,L426942_SB147_uv.dppp.MS,L426942_SB148_uv.dppp.MS,L426942_SB149_uv.dppp.MS,L426942_SB150_uv.dppp.MS,L426942_SB151_uv.dppp.MS,L426942_SB152_uv.dppp.MS,L426942_SB153_uv.dppp.MS,L426942_SB154_uv.dppp.MS,L426942_SB155_uv.dppp.MS,L426942_SB156_uv.dppp.MS,L426942_SB157_uv.dppp.MS,L426942_SB158_uv.dppp.MS,L426942_SB159_uv.dppp.MS,L426942_SB160_uv.dppp.MS,L426942_SB161_uv.dppp.MS,L426942_SB162_uv.dppp.MS,L426942_SB163_uv.dppp.MS,L426942_SB164_uv.dppp.MS,L426942_SB165_uv.dppp.MS,L426942_SB166_uv.dppp.MS,L426942_SB167_uv.dppp.MS,L426942_SB168_uv.dppp.MS,L426942_SB169_uv.dppp.MS,L426942_SB170_uv.dppp.MS,L426942_SB171_uv.dppp.MS,L426942_SB172_uv.dppp.MS,L426942_SB173_uv.dppp.MS,L426942_SB174_uv.dppp.MS,L426942_SB175_uv.dppp.MS,L426942_SB176_uv.dppp.MS,L426942_SB177_uv.dppp.MS,L426942_SB178_uv.dppp.MS,L426942_SB179_uv.dppp.MS,L426942_SB180_uv.dppp.MS,L426942_SB181_uv.dppp.MS,L426942_SB182_uv.dppp.MS,L426942_SB183_uv.dppp.MS,L426942_SB184_uv.dppp.MS,L426942_SB185_uv.dppp.MS,L426942_SB186_uv.dppp.MS,L426942_SB187_uv.dppp.MS,L426942_SB188_uv.dppp.MS,L426942_SB189_uv.dppp.MS,L426942_SB190_uv.dppp.MS,L426942_SB191_uv.dppp.MS,L426942_SB192_uv.dppp.MS,L426942_SB193_uv.dppp.MS,L426942_SB194_uv.dppp.MS,L426942_SB195_uv.dppp.MS,L426942_SB196_uv.dppp.MS,L426942_SB197_uv.dppp.MS,L426942_SB198_uv.dppp.MS,L426942_SB199_uv.dppp.MS,L426942_SB200_uv.dppp.MS,L426942_SB201_uv.dppp.MS,L426942_SB202_uv.dppp.MS,L426942_SB203_uv.dppp.MS,L426942_SB204_uv.dppp.MS,L426942_SB205_uv.dppp.MS,L426942_SB206_uv.dppp.MS,L426942_SB207_uv.dppp.MS,L426942_SB208_uv.dppp.MS,L426942_SB209_uv.dppp.MS,L426942_SB210_uv.dppp.MS,L426942_SB211_uv.dppp.MS,L426942_SB212_uv.dppp.MS,L426942_SB213_uv.dppp.MS,L426942_SB214_uv.dppp.MS,L426942_SB215_uv.dppp.MS,L426942_SB216_uv.dppp.MS,L426942_SB217_uv.dppp.MS,L426942_SB218_uv.dppp.MS,L426942_SB219_uv.dppp.MS,L426942_SB220_uv.dppp.MS,L426942_SB221_uv.dppp.MS,L426942_SB222_uv.dppp.MS,L426942_SB223_uv.dppp.MS,L426942_SB224_uv.dppp.MS,L426942_SB225_uv.dppp.MS,L426942_SB226_uv.dppp.MS,L426942_SB227_uv.dppp.MS,L426942_SB228_uv.dppp.MS,L426942_SB229_uv.dppp.MS,L426942_SB230_uv.dppp.MS,L426942_SB231_uv.dppp.MS,L426942_SB232_uv.dppp.MS,L426942_SB233_uv.dppp.MS,L426942_SB234_uv.dppp.MS,L426942_SB235_uv.dppp.MS,L426942_SB236_uv.dppp.MS,L426942_SB237_uv.dppp.MS,L426942_SB238_uv.dppp.MS,L426942_SB239_uv.dppp.MS,L426942_SB240_uv.dppp.MS,L426942_SB241_uv.dppp.MS,L426942_SB242_uv.dppp.MS,L426942_SB243_uv.dppp.MS] +ObsSW.Observation.DataProducts.Output_Correlated.identifications=[mom.G630967.M631401.fP.dps.uv] +ObsSW.Observation.DataProducts.Output_Correlated.locations=[locus001:/data/L426942/,locus003:/data/L426942/,locus004:/data/L426942/,locus005:/data/L426942/,locus006:/data/L426942/,locus007:/data/L426942/,locus008:/data/L426942/,locus009:/data/L426942/,locus010:/data/L426942/,locus011:/data/L426942/,locus012:/data/L426942/,locus014:/data/L426942/,locus016:/data/L426942/,locus017:/data/L426942/,locus018:/data/L426942/,locus020:/data/L426942/,locus021:/data/L426942/,locus023:/data/L426942/,locus025:/data/L426942/,locus026:/data/L426942/,locus027:/data/L426942/,locus028:/data/L426942/,locus029:/data/L426942/,locus031:/data/L426942/,locus032:/data/L426942/,locus034:/data/L426942/,locus035:/data/L426942/,locus036:/data/L426942/,locus037:/data/L426942/,locus038:/data/L426942/,locus039:/data/L426942/,locus040:/data/L426942/,locus041:/data/L426942/,locus042:/data/L426942/,locus043:/data/L426942/,locus044:/data/L426942/,locus045:/data/L426942/,locus046:/data/L426942/,locus047:/data/L426942/,locus048:/data/L426942/,locus049:/data/L426942/,locus050:/data/L426942/,locus051:/data/L426942/,locus052:/data/L426942/,locus053:/data/L426942/,locus054:/data/L426942/,locus055:/data/L426942/,locus056:/data/L426942/,locus057:/data/L426942/,locus058:/data/L426942/,locus060:/data/L426942/,locus061:/data/L426942/,locus062:/data/L426942/,locus063:/data/L426942/,locus064:/data/L426942/,locus065:/data/L426942/,locus066:/data/L426942/,locus067:/data/L426942/,locus068:/data/L426942/,locus069:/data/L426942/,locus070:/data/L426942/,locus071:/data/L426942/,locus072:/data/L426942/,locus073:/data/L426942/,locus074:/data/L426942/,locus075:/data/L426942/,locus076:/data/L426942/,locus077:/data/L426942/,locus078:/data/L426942/,locus079:/data/L426942/,locus080:/data/L426942/,locus081:/data/L426942/,locus082:/data/L426942/,locus084:/data/L426942/,locus085:/data/L426942/,locus086:/data/L426942/,locus087:/data/L426942/,locus088:/data/L426942/,locus089:/data/L426942/,locus090:/data/L426942/,locus091:/data/L426942/,locus001:/data/L426942/,locus003:/data/L426942/,locus004:/data/L426942/,locus005:/data/L426942/,locus006:/data/L426942/,locus007:/data/L426942/,locus008:/data/L426942/,locus009:/data/L426942/,locus010:/data/L426942/,locus011:/data/L426942/,locus012:/data/L426942/,locus014:/data/L426942/,locus016:/data/L426942/,locus017:/data/L426942/,locus018:/data/L426942/,locus020:/data/L426942/,locus021:/data/L426942/,locus023:/data/L426942/,locus025:/data/L426942/,locus026:/data/L426942/,locus027:/data/L426942/,locus028:/data/L426942/,locus029:/data/L426942/,locus031:/data/L426942/,locus032:/data/L426942/,locus034:/data/L426942/,locus035:/data/L426942/,locus036:/data/L426942/,locus037:/data/L426942/,locus038:/data/L426942/,locus039:/data/L426942/,locus040:/data/L426942/,locus041:/data/L426942/,locus042:/data/L426942/,locus043:/data/L426942/,locus044:/data/L426942/,locus045:/data/L426942/,locus046:/data/L426942/,locus047:/data/L426942/,locus048:/data/L426942/,locus049:/data/L426942/,locus050:/data/L426942/,locus051:/data/L426942/,locus052:/data/L426942/,locus053:/data/L426942/,locus054:/data/L426942/,locus055:/data/L426942/,locus056:/data/L426942/,locus057:/data/L426942/,locus058:/data/L426942/,locus060:/data/L426942/,locus061:/data/L426942/,locus062:/data/L426942/,locus063:/data/L426942/,locus064:/data/L426942/,locus065:/data/L426942/,locus066:/data/L426942/,locus067:/data/L426942/,locus068:/data/L426942/,locus069:/data/L426942/,locus070:/data/L426942/,locus071:/data/L426942/,locus072:/data/L426942/,locus073:/data/L426942/,locus074:/data/L426942/,locus075:/data/L426942/,locus076:/data/L426942/,locus077:/data/L426942/,locus078:/data/L426942/,locus079:/data/L426942/,locus080:/data/L426942/,locus081:/data/L426942/,locus082:/data/L426942/,locus084:/data/L426942/,locus085:/data/L426942/,locus086:/data/L426942/,locus087:/data/L426942/,locus088:/data/L426942/,locus089:/data/L426942/,locus090:/data/L426942/,locus091:/data/L426942/,locus001:/data/L426942/,locus003:/data/L426942/,locus004:/data/L426942/,locus005:/data/L426942/,locus006:/data/L426942/,locus007:/data/L426942/,locus008:/data/L426942/,locus009:/data/L426942/,locus010:/data/L426942/,locus011:/data/L426942/,locus012:/data/L426942/,locus014:/data/L426942/,locus016:/data/L426942/,locus017:/data/L426942/,locus018:/data/L426942/,locus020:/data/L426942/,locus021:/data/L426942/,locus023:/data/L426942/,locus025:/data/L426942/,locus026:/data/L426942/,locus027:/data/L426942/,locus028:/data/L426942/,locus029:/data/L426942/,locus031:/data/L426942/,locus032:/data/L426942/,locus034:/data/L426942/,locus035:/data/L426942/,locus036:/data/L426942/,locus037:/data/L426942/,locus038:/data/L426942/,locus039:/data/L426942/,locus040:/data/L426942/,locus041:/data/L426942/,locus042:/data/L426942/,locus043:/data/L426942/,locus044:/data/L426942/,locus045:/data/L426942/,locus046:/data/L426942/,locus047:/data/L426942/,locus048:/data/L426942/,locus049:/data/L426942/,locus050:/data/L426942/,locus051:/data/L426942/,locus052:/data/L426942/,locus053:/data/L426942/,locus054:/data/L426942/,locus055:/data/L426942/,locus056:/data/L426942/,locus057:/data/L426942/,locus058:/data/L426942/,locus060:/data/L426942/,locus061:/data/L426942/,locus062:/data/L426942/,locus063:/data/L426942/,locus064:/data/L426942/,locus065:/data/L426942/,locus066:/data/L426942/,locus067:/data/L426942/,locus068:/data/L426942/,locus069:/data/L426942/,locus070:/data/L426942/,locus071:/data/L426942/,locus072:/data/L426942/,locus073:/data/L426942/,locus074:/data/L426942/,locus075:/data/L426942/,locus076:/data/L426942/,locus077:/data/L426942/,locus078:/data/L426942/,locus079:/data/L426942/,locus080:/data/L426942/,locus081:/data/L426942/,locus082:/data/L426942/,locus084:/data/L426942/,locus085:/data/L426942/,locus086:/data/L426942/,locus087:/data/L426942/,locus088:/data/L426942/,locus089:/data/L426942/,locus090:/data/L426942/,locus091:/data/L426942/,locus001:/data/L426942/] +ObsSW.Observation.DataProducts.Output_Correlated.mountpoints=[locus001:/data,locus003:/data,locus004:/data,locus005:/data,locus006:/data,locus007:/data,locus008:/data,locus009:/data,locus010:/data,locus011:/data,locus012:/data,locus014:/data,locus016:/data,locus017:/data,locus018:/data,locus020:/data,locus021:/data,locus023:/data,locus025:/data,locus026:/data,locus027:/data,locus028:/data,locus029:/data,locus031:/data,locus032:/data,locus034:/data,locus035:/data,locus036:/data,locus037:/data,locus038:/data,locus039:/data,locus040:/data,locus041:/data,locus042:/data,locus043:/data,locus044:/data,locus045:/data,locus046:/data,locus047:/data,locus048:/data,locus049:/data,locus050:/data,locus051:/data,locus052:/data,locus053:/data,locus054:/data,locus055:/data,locus056:/data,locus057:/data,locus058:/data,locus060:/data,locus061:/data,locus062:/data,locus063:/data,locus064:/data,locus065:/data,locus066:/data,locus067:/data,locus068:/data,locus069:/data,locus070:/data,locus071:/data,locus072:/data,locus073:/data,locus074:/data,locus075:/data,locus076:/data,locus077:/data,locus078:/data,locus079:/data,locus080:/data,locus081:/data,locus082:/data,locus084:/data,locus085:/data,locus086:/data,locus087:/data,locus088:/data,locus089:/data,locus090:/data,locus091:/data] +ObsSW.Observation.DataProducts.Output_Correlated.namemask=L${OBSID}_SAP${SAP}_SB${SUBBAND}_uv.MS +ObsSW.Observation.DataProducts.Output_Correlated.percentageWritten=[] +ObsSW.Observation.DataProducts.Output_Correlated.retentiontime=14 +ObsSW.Observation.DataProducts.Output_Correlated.skip=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] +ObsSW.Observation.DataProducts.Output_IncoherentStokes.archived=false +ObsSW.Observation.DataProducts.Output_IncoherentStokes.deleted=false +ObsSW.Observation.DataProducts.Output_IncoherentStokes.dirmask= +ObsSW.Observation.DataProducts.Output_IncoherentStokes.enabled=false +ObsSW.Observation.DataProducts.Output_IncoherentStokes.filenames=[] +ObsSW.Observation.DataProducts.Output_IncoherentStokes.identifications=[] +ObsSW.Observation.DataProducts.Output_IncoherentStokes.locations=[] +ObsSW.Observation.DataProducts.Output_IncoherentStokes.mountpoints=[] +ObsSW.Observation.DataProducts.Output_IncoherentStokes.namemask= +ObsSW.Observation.DataProducts.Output_IncoherentStokes.percentageWritten=[] +ObsSW.Observation.DataProducts.Output_IncoherentStokes.retentiontime=14 +ObsSW.Observation.DataProducts.Output_IncoherentStokes.skip=[] +ObsSW.Observation.DataProducts.Output_InstrumentModel.archived=false +ObsSW.Observation.DataProducts.Output_InstrumentModel.deleted=false +ObsSW.Observation.DataProducts.Output_InstrumentModel.dirmask= +ObsSW.Observation.DataProducts.Output_InstrumentModel.enabled=false +ObsSW.Observation.DataProducts.Output_InstrumentModel.filenames=[] +ObsSW.Observation.DataProducts.Output_InstrumentModel.identifications=[] +ObsSW.Observation.DataProducts.Output_InstrumentModel.locations=[] +ObsSW.Observation.DataProducts.Output_InstrumentModel.mountpoints=[] +ObsSW.Observation.DataProducts.Output_InstrumentModel.namemask= +ObsSW.Observation.DataProducts.Output_InstrumentModel.percentageWritten=[] +ObsSW.Observation.DataProducts.Output_InstrumentModel.retentiontime=14 +ObsSW.Observation.DataProducts.Output_InstrumentModel.skip=[] +ObsSW.Observation.DataProducts.Output_Pulsar.archived=false +ObsSW.Observation.DataProducts.Output_Pulsar.deleted=false +ObsSW.Observation.DataProducts.Output_Pulsar.dirmask= +ObsSW.Observation.DataProducts.Output_Pulsar.enabled=false +ObsSW.Observation.DataProducts.Output_Pulsar.filenames=[] +ObsSW.Observation.DataProducts.Output_Pulsar.identifications=[] +ObsSW.Observation.DataProducts.Output_Pulsar.locations=[] +ObsSW.Observation.DataProducts.Output_Pulsar.mountpoints=[] +ObsSW.Observation.DataProducts.Output_Pulsar.namemask= +ObsSW.Observation.DataProducts.Output_Pulsar.percentageWritten=[] +ObsSW.Observation.DataProducts.Output_Pulsar.retentiontime=14 +ObsSW.Observation.DataProducts.Output_Pulsar.skip=[] +ObsSW.Observation.DataProducts.Output_SkyImage.archived=false +ObsSW.Observation.DataProducts.Output_SkyImage.deleted=false +ObsSW.Observation.DataProducts.Output_SkyImage.dirmask= +ObsSW.Observation.DataProducts.Output_SkyImage.enabled=false +ObsSW.Observation.DataProducts.Output_SkyImage.filenames=[] +ObsSW.Observation.DataProducts.Output_SkyImage.identifications=[] +ObsSW.Observation.DataProducts.Output_SkyImage.locations=[] +ObsSW.Observation.DataProducts.Output_SkyImage.mountpoints=[] +ObsSW.Observation.DataProducts.Output_SkyImage.namemask= +ObsSW.Observation.DataProducts.Output_SkyImage.percentageWritten=[] +ObsSW.Observation.DataProducts.Output_SkyImage.retentiontime=14 +ObsSW.Observation.DataProducts.Output_SkyImage.skip=[] +ObsSW.Observation.ObservationControl.PythonControl.Calibration.SkyModel= +ObsSW.Observation.ObservationControl.PythonControl.Calibration.exportCalibrationParameters=false +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.autocorr=F +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.count.path=- +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.count.save=FALSE +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.keepstatistics=T +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.memorymax=10 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.memoryperc=0 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.overlapmax=0 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.overlapperc=0 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.pedantic=F +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.pulsar=F +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.strategy=HBAdefault +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.timewindow=0 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.aoflagger.type=aoflagger +ObsSW.Observation.ObservationControl.PythonControl.DPPP.checkparset=-1 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.baseline=CS*,RS*& +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.blrange=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.corrtype=cross +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.demixfreqstep=64 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.demixtimestep=10 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.elevationcutoff=0.0deg +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.freqstep=4 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.ignoretarget=false +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.instrumentmodel=instrument +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.modelsources=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.ntimechunk=0 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.othersources=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.skymodel=sky +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.subtractsources= +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.targetsource= +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.timestep=1 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.demixer.type=demixer +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.autoweight=true +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.band=-1 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.baseline= +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.blrange=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.corrtype= +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.datacolumn=DATA +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.forceautoweight=false +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.missingdata=false +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.nchan=nchan +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.orderms=false +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.sort=false +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.startchan=0 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msin.useflag=true +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msout.overwrite=false +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msout.tilenchan=8 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msout.tilesize=1024 +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msout.vdsdir=A +ObsSW.Observation.ObservationControl.PythonControl.DPPP.msout.writefullresflag=true +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].abstime=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].azimuth=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].baseline= +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].blrange=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].chan=[0..nchan/32-1,31*nchan/32..nchan-1] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].corrtype= +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].count.path=- +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].count.save=false +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].elevation=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].expr= +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].freqrange=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].lst=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].reltime=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].timeofday=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].timeslot=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[0].type=preflagger +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].abstime=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].azimuth=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].baseline= +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].blrange=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].chan=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].corrtype=auto +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].count.path=- +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].count.save=false +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].elevation=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].expr= +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].freqrange=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].lst=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].reltime=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].timeofday=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].timeslot=[] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.preflagger[1].type=preflagger +ObsSW.Observation.ObservationControl.PythonControl.DPPP.showprogress=F +ObsSW.Observation.ObservationControl.PythonControl.DPPP.showtimings=F +ObsSW.Observation.ObservationControl.PythonControl.DPPP.steps=[preflagger[0],preflagger[1],aoflagger,demixer] +ObsSW.Observation.ObservationControl.PythonControl.DPPP.uselogger=T +ObsSW.Observation.ObservationControl.PythonControl.LongBaseline.subbandgroups_per_ms=1 +ObsSW.Observation.ObservationControl.PythonControl.LongBaseline.subbands_per_subbandgroup=1 +ObsSW.Observation.ObservationControl.PythonControl.PreProcessing.SkyModel=Ateam_LBA_CC +ObsSW.Observation.ObservationControl.PythonControl.PreProcessing.demix_always=[] +ObsSW.Observation.ObservationControl.PythonControl.PreProcessing.demix_if_needed=[] +ObsSW.Observation.ObservationControl.PythonControl._hostname=CCU001 +ObsSW.Observation.ObservationControl.PythonControl.canCommunicate=false +ObsSW.Observation.ObservationControl.PythonControl.pythonHost=lhn001.cep2.lofar +ObsSW.Observation.ObservationControl.PythonControl.pythonProgram=preprocessing_pipeline.py +ObsSW.Observation.ObservationControl.PythonControl.softwareVersion= +ObsSW.Observation.ObservationControl._hostname=MCU001 +ObsSW.Observation.ObservationControl.heartbeatInterval=10 +ObsSW.Observation.Scheduler.contactEmail= +ObsSW.Observation.Scheduler.contactName= +ObsSW.Observation.Scheduler.contactPhone= +ObsSW.Observation.Scheduler.firstPossibleDay=0 +ObsSW.Observation.Scheduler.fixedDay=false +ObsSW.Observation.Scheduler.fixedTime=false +ObsSW.Observation.Scheduler.lastPossibleDay=0 +ObsSW.Observation.Scheduler.late=false +ObsSW.Observation.Scheduler.nightTimeWeightFactor=0 +ObsSW.Observation.Scheduler.predMaxTimeDif= +ObsSW.Observation.Scheduler.predMinTimeDif= +ObsSW.Observation.Scheduler.predecessors=[L426528] +ObsSW.Observation.Scheduler.priority=0.0 +ObsSW.Observation.Scheduler.reason= +ObsSW.Observation.Scheduler.referenceFrame=0 +ObsSW.Observation.Scheduler.reservation=0 +ObsSW.Observation.Scheduler.storageSelectionMode=1 +ObsSW.Observation.Scheduler.taskDuration=600 +ObsSW.Observation.Scheduler.taskID=1450 +ObsSW.Observation.Scheduler.taskName=Preprocessing_newHBA +ObsSW.Observation.Scheduler.taskType=0 +ObsSW.Observation.Scheduler.windowMaximumTime= +ObsSW.Observation.Scheduler.windowMinimumTime= +ObsSW.Observation.VirtualInstrument.minimalNrStations=1 +ObsSW.Observation.VirtualInstrument.stationList=[] +ObsSW.Observation.VirtualInstrument.stationSet= +ObsSW.Observation.antennaArray=LBA +ObsSW.Observation.antennaSet=LBA_INNER +ObsSW.Observation.bandFilter=LBA_30_90 +ObsSW.Observation.claimPeriod=10 +ObsSW.Observation.clockMode=<<Clock200 +ObsSW.Observation.momID=631401 +ObsSW.Observation.nrAnaBeams=0 +ObsSW.Observation.nrBeams=0 +ObsSW.Observation.nrBitsPerSample=16 +ObsSW.Observation.nrTBBSettings=0 +ObsSW.Observation.originID=254009 +ObsSW.Observation.otdbID=426942 +ObsSW.Observation.preparePeriod=10 +ObsSW.Observation.processSubtype=Averaging Pipeline +ObsSW.Observation.processType=Pipeline +ObsSW.Observation.sampleClock=200 +ObsSW.Observation.startTime=2016-01-19 11:50:00 +ObsSW.Observation.stopTime=2016-01-19 12:00:00 +ObsSW.Observation.strategy=Preprocessing only +ObsSW.Observation.topologyID=mom.G630967.M631401.fP +Version.number=30577 +_DPname=LOFAR_ObsSW_TempObs0162 +prefix=LOFAR. diff --git a/SAS/ResourceAssignment/Services/test/tRATaskSpecified.py b/SAS/ResourceAssignment/Services/test/tRATaskSpecified.py new file mode 100644 index 0000000000000000000000000000000000000000..94ca0643706ef3fc78022568563b138aac90ee86 --- /dev/null +++ b/SAS/ResourceAssignment/Services/test/tRATaskSpecified.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python + +# Be able to find service python file +import sys, os +sys.path.insert(0, "{srcdir}/../src".format(**os.environ)) + +from RATaskSpecified import * +from RABusListener import RATaskSpecifiedBusListener +from lofar.parameterset import PyParameterSet +from lofar.messaging import EventMessage, Service + +import unittest +from glob import glob +import uuid +import datetime +from threading import Condition, Lock + +import logging +logging.basicConfig(stream=sys.stdout, level=logging.INFO) + +def setUpModule(): + pass + +def tearDownModule(): + pass + + +class TestGetPredecessors(unittest.TestCase): + def test_0_predecessors(self): + parset = { PARSET_PREFIX + "Observation.Scheduler.predecessors": "[]" } + + self.assertEqual(predecessors(parset), []) + + def test_1_predecessor(self): + parset = { PARSET_PREFIX + "Observation.Scheduler.predecessors": "[L426528]" } + + self.assertEqual(predecessors(parset), [426528]) + + def test_2_predecessors(self): + parset = { PARSET_PREFIX + "Observation.Scheduler.predecessors": "[L426528,L1]" } + + self.assertEqual(sorted(predecessors(parset)), [1,426528]) + + +def parset_as_dict(filename): + parset = PyParameterSet(filename, False) + d = {} + for k in parset.keywords(): + d[k] = parset.getString(k) + + return d + + +class TestResourceIndicators(unittest.TestCase): + """ + The spec for the resource indicators is a draft at this point, + and the output is quite extensive (many parset keys), so + verification of the output is pending. + """ + + def test_preprocessing_pipeline(self): + parset = parset_as_dict("tRATaskSpecified.in_preprocessing") + r = resourceIndicatorsFromParset(parset) + + def test_correlator_observation(self): + parset = parset_as_dict("tRATaskSpecified.in_correlator") + r = resourceIndicatorsFromParset(parset) + + +class TestService(unittest.TestCase): + def setUp(self): + # Create a random bus + self.busname = "%s-%s" % (sys.argv[0], str(uuid.uuid4())[:8]) + self.bus = ToBus(self.busname, { "create": "always", "delete": "always", "node": { "type": "topic" } }) + self.bus.open() + + # Define the services we use + self.status_service = "%s/TaskStatus" % (self.busname,) + + # ================================ + # Setup mock parset service + # ================================ + + # Nr of parsets requested, to detect multiple requests for the same parset, or of superfluous parsets + self.requested_parsets = 0 + + def TaskSpecificationService( OtdbID ): + if OtdbID == 1: + predecessors = "[2,3]" + elif OtdbID == 2: + predecessors = "[3]" + elif OtdbID == 3: + predecessors = "[]" + else: + raise Exception("Invalid OtdbID: %s" % OtdbID) + + self.requested_parsets += 1 + + return { + "Version.number": "1", + PARSET_PREFIX + "Observation.ObsID": str(OtdbID), + PARSET_PREFIX + "Observation.Scheduler.predecessors": predecessors, + } + + self.parset_service = Service("TaskSpecification", TaskSpecificationService, busname=self.busname) + self.parset_service.start_listening() + + # ================================ + # Setup listener to catch result + # of our service + # ================================ + + class Listener(RATaskSpecifiedBusListener): + def __init__(self, **kwargs): + super(Listener, self).__init__(**kwargs) + + self.messageReceived = False + self.lock = Lock() + self.cond = Condition(self.lock) + + def onTaskSpecified(self, sasId, modificationTime, resourceIndicators): + self.messageReceived = True + + self.sasID = sasId + self.resourceIndicators = resourceIndicators + + # Release waiting parent + with self.lock: + self.cond.notify() + + def waitForMessage(self): + with self.lock: + self.cond.wait(5.0) + return self.messageReceived + + self.listener = Listener(busname=self.busname) + self.listener.start_listening() + + def tearDown(self): + self.listener.stop_listening() + self.parset_service.stop_listening() + self.bus.close() + + def testNoPredecessors(self): + """ + Request the resources for a simulated obsid 3, with the following predecessor tree: + + 3 requires nothing + """ + with RATaskSpecified("OTDB.TaskSpecified", otdb_busname=self.busname, my_busname=self.busname) as jts: + # Send fake status update + with ToBus(self.status_service) as tb: + msg = EventMessage(content={ + "treeID": 3, + "state": "prescheduled", + "time_of_change": datetime.datetime(2016,1,1), + }) + tb.send(msg) + + # Wait for message to arrive + self.assertTrue(self.listener.waitForMessage()) + + # Verify message + self.assertEqual(self.listener.sasID, 3) + self.assertNotIn("1", self.listener.resourceIndicators); + self.assertNotIn("2", self.listener.resourceIndicators); + self.assertIn("3", self.listener.resourceIndicators); + + # Make sure we only requested one parset + self.assertEqual(self.requested_parsets, 1) + + def testPredecessors(self): + """ + Request the resources for a simulated obsid 1, with the following predecessor tree: + + 1 requires 2, 3 + 2 requires 3 + 3 requires nothing + """ + + with RATaskSpecified("OTDB.TaskSpecified", otdb_busname=self.busname, my_busname=self.busname) as jts: + # Send fake status update + with ToBus(self.status_service) as tb: + msg = EventMessage(content={ + "treeID": 1, + "state": "prescheduled", + "time_of_change": datetime.datetime(2016,1,1), + }) + tb.send(msg) + + # Wait for message to arrive + self.assertTrue(self.listener.waitForMessage()) + + # Verify message + self.assertEqual(self.listener.sasID, 1) + self.assertIn("1", self.listener.resourceIndicators); + self.assertIn("2", self.listener.resourceIndicators); + self.assertIn("3", self.listener.resourceIndicators); + + # Make sure we only requested exactly three parsets + self.assertEqual(self.requested_parsets, 3) + +def main(argv): + unittest.main(verbosity=2) + +if __name__ == "__main__": + # run all tests + import sys + main(sys.argv[1:]) diff --git a/SAS/ResourceAssignment/Services/test/tRATaskSpecified.sh b/SAS/ResourceAssignment/Services/test/tRATaskSpecified.sh new file mode 100755 index 0000000000000000000000000000000000000000..e8f7135ea210eefbd42b0ecd8adb19e532f027c8 --- /dev/null +++ b/SAS/ResourceAssignment/Services/test/tRATaskSpecified.sh @@ -0,0 +1,2 @@ +#!/bin/sh +./runctest.sh tRATaskSpecified diff --git a/SubSystems/RAServices/CMakeLists.txt b/SubSystems/RAServices/CMakeLists.txt index 0b464656737cb4f740e17350db8e95830e7657e4..bb31f489a4798af9bf250b7c3db3a2bf2a9ad353 100644 --- a/SubSystems/RAServices/CMakeLists.txt +++ b/SubSystems/RAServices/CMakeLists.txt @@ -1,4 +1,11 @@ # $Id: CMakeLists.txt 20934 2012-05-15 09:26:48Z schoenmakers $ +#lofar_package(RAServices +# DEPENDS OTDB_Services ResourceAssignmentEditor ResourceAssignmentServices) lofar_package(RAServices - DEPENDS OTDB_Services) + DEPENDS OTDB_Services ResourceAssignmentServices) + +# supervisord config files +install(FILES + RAServices.ini + DESTINATION etc/supervisord.d) diff --git a/SubSystems/RAServices/RAServices.ini b/SubSystems/RAServices/RAServices.ini new file mode 100644 index 0000000000000000000000000000000000000000..af2c78183b2a9a5492841efb2ed22659f5b6633d --- /dev/null +++ b/SubSystems/RAServices/RAServices.ini @@ -0,0 +1,3 @@ +[group:RA_Services] +programs=ResourceAssignmentEditor,JobsToSchedule +priority=200 diff --git a/lofarinit.sh.in b/lofarinit.sh.in index 9f3b8f7c48fd74ddf0eb309b29501a81915e3bbc..fda93db9c73e472ef9a1a85c1aa3dfd737d8af76 100644 --- a/lofarinit.sh.in +++ b/lofarinit.sh.in @@ -62,8 +62,8 @@ fi # Now define the new LOFARROOT (if possible) # Do it only if the bin directory exists. lfr_nroot=`cd $lfr_root > /dev/null; pwd` # make path absolute -if [ "$lfr_nroot" = "" -o ! -d $lfr_nroot/bin ]; then - echo "LOFAR root directory $lfr_nroot/bin does not exist; keeping old LOFARROOT $LOFARROOT" +if [ "$lfr_nroot" = "" -o ! -d $lfr_nroot ]; then + echo "LOFAR root directory $lfr_nroot does not exist; keeping old LOFARROOT $LOFARROOT" else LOFARROOT=$lfr_nroot export LOFARROOT @@ -84,9 +84,9 @@ else export PYTHONPATH fi -# Add to the paths if the bin directory exists. -if [ "$LOFARROOT" = "" -o ! -d $LOFARROOT/bin ]; then - echo "No LOFARROOT defined" +# Add to the paths +if [ "$LOFARROOT" = "" -o ! -d $LOFARROOT ]; then + echo "LOFARROOT is empty or does not point to a directory." else # Add the path to the standard paths. if [ "$PATH" = "" ]; then