CARMA C++
SubarrayControlImpl.h
Go to the documentation of this file.
1 #ifndef CARMA_CONTROL_SUBARRAY_CONTROL_IMPL_H
2 #define CARMA_CONTROL_SUBARRAY_CONTROL_IMPL_H
3 
17 #include <map>
18 #include <memory>
19 #include <set>
20 #include <string>
21 #include <vector>
22 
23 #include <pthread.h>
24 
25 #include "carma/corba/corba.h"
26 #include "carma/alarm/AlarmControl.h"
27 #include "carma/antenna/common/IVCurve.h"
28 #include "carma/antenna/common/DriveControl.h"
29 #include "carma/antenna/common/OpticalTelControl.h"
30 #include "carma/antenna/common/PolarizationControl.h"
31 #include "carma/antenna/common/RxControl.h"
32 #include "carma/antenna/common/SwitchState.h"
34 #include "carma/control/AzWrapMode.h"
35 #include "carma/control/CorrelatorInfo.h"
37 #include "carma/control/IntentInfo.h"
38 #include "carma/control/LOchain.h"
39 #include "carma/control/MjdTriplet.h"
40 #include "carma/control/NearestInfo.h"
41 #include "carma/control/NearestInfo_skel.h"
42 #include "carma/control/PadOffsets.h"
44 #include "carma/control/SubarrayControl.h"
45 #include "carma/control/SwitchyardHandles.h"
46 
47 #include "carma/util/corrUtils.h"
48 #include "carma/correlator/obsRecord2/CorDataBase.h"
49 
50 #include "carma/downconverter/common/DownconverterControl.h"
51 
52 #include "carma/fault/FaultControl.h"
53 
55 #include "carma/loberotator/LoberotatorControl.h"
56 #include "carma/observertools/ItemValue.h"
57 #include "carma/observertools/ProjectDatabaseManager.h"
58 #include "carma/monitor/ControlBandCommon.h"
59 #include "carma/monitor/CorrDesignation.h"
61 #include "carma/monitor/SignalPathSubsystem.h"
62 
64 
70 
71 #include "carma/util/AstroBand.h"
72 #include "carma/util/Logger.h"
74 #include "carma/util/PthreadMutex.h"
75 #include "carma/util/PthreadRWLock.h"
76 #include "carma/util/QuadraticInterpolatorNormal.h"
77 #include "carma/util/ScopedExclusiveLock.h"
78 #include "carma/util/ScopedSharedLock.h"
79 
80 #include <boost/thread.hpp>
81 #include <boost/shared_ptr.hpp>
82 
83 
84 namespace carma {
85 
86  // Forward declarations for other classes
87  namespace monitor {
88  class CarmaMonitorSystem;
89  class RawMonitorSystem;
90  } // namespace carma::monitor
91 
92  namespace util {
93  class WorkResultSet;
94  class CorrelatorSet;
95  } // naemspace carma::util
96 
97  // End forward declarations
98 
99 namespace control {
100 // Forward declarations
101 class AntennaHandle;
102 class CalibratorHandle;
103 class ClockHandle;
104 class CorrelatorHandle;
105 class CorrDataRemapperHandle;
106 class CryoHandle;
107 class DownconverterHandle;
108 class DriveHandle;
109 class FaultHandle;
110 class FocusHandle;
111 class HalfSecUpdater;
112 class AlarmHandle;
113 class LineLengthHandle;
114 class LOrefHandle;
115 class LoberotatorHandle;
116 class OpticalTelHandle;
117 class ProjectDatabaseManagerHandle;
118 class PipelineHandle;
119 class SignalPathMapperHandle;
120 class RxSelectorHandle;
121 class VlbiHandle;
122 class WorkerPool;
123 // End forward declarations
124 // Closing bracket for namespace carma::control is far below
125 
126 
127 class SubarrayControlImpl :
129 {
130 public:
131  SubarrayControlImpl(int subarrayNo,
132  bool verbose,
133  std::string scriptStateDir);
134 
135  ~SubarrayControlImpl();
136 
141  void startSAT();
142 
144  void startHSU();
145 
146  // Command logging, alternate method
147  static const log4cpp::Priority::PriorityLevel CMD_LOG_PRIORITY =
148  log4cpp::Priority::INFO;
149  // Prepends COMMAND: and returns item ready for stream insertion
150  static log4cpp::CategoryStream cmdlog();
151  // Use stream insertion to log at INFO level
152  static log4cpp::CategoryStream loginfo();
153  // Logs a sent corba command with timestamp
154  static void logSentCommand(std::string command, std::string destination);
155 
156  struct ObsblockGroup {
157  std::string project;
158  std::string obsblock;
159  std::string subObsblock;
160  int trial;
161  ControlCorrelatorDesignation corrType;
162  };
163 
164  // -----------------------------------------------------------------
165  // External interface
166  // -----------------------------------------------------------------
167  virtual char* query(const char* monitorComponent);
168 
169  char* queryString(const char* monitorPointName);
170 
171  double queryDouble(const char* monitorPointName);
172 
173  CORBA::Long queryInt(const char* monitorPointName);
174 
175  SeqFloat* queryComplex(const char* monitorPointName);
176 
177  bool queryBool(const char* monitorPointName);
178 
179  SeqMonitorPointValue* queryMonitorPoint(const SeqString& monitorPoint);
180 
181  void setMonitorPointReal(const char* monitorPointName, double value);
182 
183  void setMonitorPointInvalid(const char* monitorPointName);
184 
185  FluxMeasurement* queryFlux(const char* source, float freq,
186  float deltaFreq, float deltaTime);
187 
188  float queryMag(const char* starName);
189 
191 
192  void projectOscriptAdd( const char * project, const char * obsblock,
193  const char * subobsblock,
194  const char * scriptFile,
195  const char * catalogFile );
196 
197  bool projectEdit( const char * project,
198  const char * obsblock,
199  const char * subobsblock,
200  CORBA::Short trial,
201  const observertools::ItemValueSequence & ivSeq,
202  const observertools::EditStatus action);
203 
204  CORBA::Short projectRun(const char* projectID, const char* obsblock,
205  const char* subObsblock, const bool isCommissioning,
206  const bool isDualCorr, const char* arrayConfig1,
207  const char* arrayConfig2,
208  const char* scriptFile, const char* catalogFile);
209 
210  CORBA::Long getSubarrayNo();
211 
212  char* getSubarrayName();
213 
214  void track( const char * source,
215  const SeqShort & carmaAntNoSeq,
216  bool affectPhaseCenter,
217  carma::control::AzWrapMode azWrapMode,
218  double time,
219  bool overTheTop );
220 
221  void snowTrack( const SeqShort & carmaAntNoSeq );
222 
223  void windTrack( const SeqShort & carmaAntNoSeq );
224 
225  void mountOffset(double az, double el, CORBA::Short carmaAntNo);
226 
227  void stow(const carma::antenna::common::DriveControl::Position position,
228  const SeqShort & carmaAntNoSeq);
229 
230  void stop(const SeqShort & carmaAntNoSeq);
231 
232  void pad(short padNo, CORBA::Short carmaAntNo);
233 
234  void padOffset(float east, float north, float up, CORBA::Short carmaAntNo);
235 
236  void antennaOffset(float east, float north, float up,
237  CORBA::Short carmaAntNo);
238 
239  PadOffsets convertBaseline(double X, double Y, double Z,
240  CORBA::Short carmaAntNo);
241 
242  void axisNonintersection(float offset, CORBA::Short carmaAntNo);
243 
244  void noiseSource(bool state, bool isReference=false);
245 
246  void noisePreset();
247 
248  void noiseAtten(CORBA::UShort atten);
249 
250  void quadmodAtten(CORBA::UShort atten);
251 
252  void delay(float offset, const CORBA::Short carmaAntNo);
253 
254  void adjustableDelay(float offset,
255  const SeqShort & carmaAntNoSeq);
256 
257  void delayDifference(float diff, const CORBA::Short carmaAntNo,
260  BlockDCPolarizationType pol = BLOCK_DC_POL1);
261 
262  double doppler(const char* source);
263 
264  carma::antenna::common::RxControl::Type getCurrentRxType();
265 
266  void antennaIFpower(const CORBA::Double power,
267  const SeqShort& carmaAntNoSeq);
268 
269  void antennaIFatten(const CORBA::Double atten,
270  const short ifNum,
271  const SeqShort& carmaAntNoSeq,
272  const bool invalidateTsys );
273 
274  void antennaIFpresetPower(const SeqShort& carmaAntNoSeq);
275 
276  void storeAntennaIFattenAmbient(const SeqShort& carmaAntNoSeq);
277 
278  void psysPreset(const SeqShort& carmaAntNoSeq, const short astroBandNo);
279 
280  void psysLevel(double level);
281 
282  /*
283  void psysLevelSingle(double level, short inputNo, short bandNo);
284  */
285 
286  void ifoutPreset();
287 
288  void ifoutLevel(double level);
289 
290  void rfPower(bool state);
291 
292  void offset(double azArcmin, double elArcmin,
293  const SeqShort & carmaAntNoSeq);
294 
295  void offsetAz(double azArcmin, const SeqShort & carmaAntNoSeq);
296 
297  void offsetEl( double elArcmin, const SeqShort & carmaAntNoSeq );
298 
299  void move(double azDegrees, double elDegrees,
300  const SeqShort & carmaAntNoSeq);
301 
302  void moveAz(double azDegrees, const SeqShort & carmaAntNoSeq);
303 
304  void moveEl(double elDegrees, const SeqShort & carmaAntNoSeq);
305 
306  void recordPoint(CORBA::Short carmaAntNo);
307 
308  void trackThreshold(float threshold, const SeqShort & carmaAntNoSeq);
309 
310  void setAntPosFilename( const char * filename );
311 
312  void setInitializationFlag(bool state);
313 
314  bool getInitializationFlag();
315 
316  void antennaInitialized(CORBA::Boolean state, const SeqShort & carmaAntNoSeq);
317 
318  void setSafeRange(CORBA::Float azLow, CORBA::Float azHigh,
319  CORBA::Float elLow, CORBA::Float elHigh,
320  const SeqShort & carmaAntNoSeq);
321 
322 
323  AntennaAssignmentSeq * getAntennaAssignments( );
324 
325  AddAntennaResult *
326  addAntenna( const SeqShort & carmaAntNoSeq,
327  bool skipAntsOwnedByOthers );
328 
329  RemoveAntennaResult *
330  removeAntenna( const SeqShort & carmaAntNoSeq,
331  bool skipAntsNotOwnedByMe );
332 
333  // Correlator birdie support
334  void addBirdie(
335  ControlCorrelatorDesignation type,
336  unsigned short band,
337  unsigned short input1,
338  unsigned short input2);
339  void removeBirdie(
340  ControlCorrelatorDesignation type,
341  unsigned short band,
342  unsigned short input1,
343  unsigned short input2);
344  void clearBirdies(ControlCorrelatorDesignation type);
345 
346  // Subarray correlator management
347 
348  void addCorrelator(ControlCorrelatorDesignation type);
349  void removeCorrelator(ControlCorrelatorDesignation type);
350  bool subarrayOwnsCorrelator(CORBA::Long subarrayNo, ControlCorrelatorDesignation type);
351  bool subarrayOwnsSingleCorrelator(CORBA::Long subarrayNo);
352  bool subarrayOwnsNoCorrelator(CORBA::Long subarrayNo);
353  char* astrobandCorrelator(CORBA::Long astrobandNo);
354  char* ownedCorrelator(CORBA::Long subarrayNo);
355 
356  SeqShort* getAstroBandsForConfiguration(const char* confName);
357 
358  void tilt(const SeqShort & carmaAntNoSeq);
359 
360  void assignLO(CORBA::Long loRefNo);
361 
362  void freq(double frest, SidebandType sb, double fif,
363  const char* doppler, const char* transition);
364 
365  void qfreq(double frest, SidebandType sb, double fif,
366  const char* doppler, const char* transition);
367 
368  void freqCore( double frest, SidebandType sb, double fif,
369  const std::string& doppler,
370  const std::string& transition,
371  const bool endWithAbsorberInBeam,
372  const bool optimizeReceiver,
373  const bool setPowerLevels);
374 
375 // --------------------------------------------------------
376 
377  void refreq(const SeqShort& carmaAntNoSeq, const bool retune);
378 
379  void refAtten(unsigned short atten, CORBA::Short carmaAntNo);
380 
381  SeqDouble* harmonics(double freq);
382 
383  void setConfigName(const char* number);
384 
385  void setObsblock(const char* project, const char* obsblock,
386  const char* subObsblock, CORBA::Long trial);
387 
388  void setAllObsblocks(const char* project1, const char* obsblock1,
389  const char* subObsblock1, CORBA::Long trial1,
390  const char* project2, const char* obsblock2,
391  const char* subObsblock2, CORBA::Long trial2);
392 
393  void project(const char* project);
394 
395  void obsblock(const char* obsblock);
396 
397  void subObsblock(const char* subObsblock);
398 
399  void trial(CORBA::Long number);
400 
401  void setIntent( const char* sourcename,
402  const char* purpose,
403  bool selfcal,
404  bool fastSwitch
405  );
406 
407  void resetProjectAndObsblock( void );
408 
409  void setConstraints(
410  ImagingType imgVsSnr,
411  const CORBA::Short minAnts,
412  const float calMaxTime,
413  const float calMaxRms,
414  const float maxTsys,
415  const float maxRmsPathLength,
416  const float maxTau,
417  const float maxDecor,
418  const float requiredRms
419  );
420 
421  void setDefaultConstraints( void );
422 
423  bool isCommissioning( const char * project );
424 
425  void camera(carma::antenna::common::SwitchState switchState,
426  const SeqShort & carmaAntNoSeq);
427 
428  void elevLimit(float limit);
429 
430  char* info(const char* sourceName);
431 
432  RaDecSeq* getRaDec(const char* sourceName);
433 
434  AzElSeq* azel(const char* sourceName, double minutes);
435 
436  bool isUp(const char* sourceName);
437 
438  float whenUp(const char* sourceName);
439 
440  float whenDown(const char* sourceName);
441 
442  float whenTransit(const char* sourceName);
443 
444  char* whazUp();
445 
446  char* whazUpOptical();
447 
448  void integrate(double intTime, CORBA::Long numInts,
449  double gap, CORBA::Boolean science);
450 
451  void cancel();
452 
453  void fringeTracking(bool on);
454 
455  void phaseSwitching(bool on, short chanNo);
456 
457  void lrPhaseOffsetMode(bool on);
458 
459  void lrPhase(float phaseOffset, CORBA::Short carmaAntNo);
460 
461  void lrRate(float phaseRate, CORBA::Short carmaAntNo);
462 
464  const SeqShort& carmaAntNoSeq);
465 
466  void tiltZeros(float aftForward, float leftRight, CORBA::Short carmaAntNo);
467 
468  void aperturePointingConstants(Aperture ap,
469  float az, float el, float sag, CORBA::Short carmaAntNo);
470 
471  void setOvroMountPointingConstants( double m1,
472  double m2,
473  double m3,
474  double m4,
475  double m5,
476  CORBA::Short carmaAntNo );
477 
478  void setBimaMountPointingConstants( const SeqDouble & dazCoefs,
479  const SeqDouble & delCoefs,
480  CORBA::Short carmaAntNo );
481 
482  //------------------------------------------------------------
483  // Begin SZA Mount Pointing Constants
484  //------------------------------------------------------------
485 
486  void setSzaMountPointingConstants(CORBA::ULong azEncoderCountsPerTurn, CORBA::ULong elEncoderCountsPerTurn,
487  CORBA::ULong azMinEncoderCount, CORBA::ULong azMaxEncoderCount,
488  CORBA::ULong elMinEncoderCount, CORBA::ULong elMaxEncoderCount,
489  CORBA::Double azEncoderZeroDegrees, CORBA::Double elEncoderZeroDegrees,
490  CORBA::Double haTiltDegrees, CORBA::Double latTiltDegrees, CORBA::Double elTiltDegrees,
491  CORBA::Double opticalXCollimationDegrees, CORBA::Double opticalYCollimationDegrees,
492  CORBA::Double opticalFlexureSinDegrees, CORBA::Double opticalFlexureCosDegrees,
493  CORBA::Double radioXCollimationDegrees, CORBA::Double radioYCollimationDegrees,
494  CORBA::Double radioFlexureSinDegrees, CORBA::Double radioFlexureCosDegrees,
495  CORBA::Short carmaAntNo );
496 
497  void setSzaEncoderLimits(CORBA::ULong azMinCount, CORBA::ULong azMaxCount,
498  CORBA::ULong elMinCount, CORBA::ULong elMaxCount,
499  CORBA::Short carmaAntNo);
500 
501  void setSzaEncoderZeros(CORBA::Double azEncZeroDeg, CORBA::Double elEncZeroDeg,
502  CORBA::Short carmaAntNo);
503 
504  void setSzaTilts(CORBA::Double haTilt, CORBA::Double latTilt, CORBA::Double elTilt,
505  CORBA::Short carmaAntNo);
506 
507  //------------------------------------------------------------
508  // End SZA Mount Pointing Constants
509  //------------------------------------------------------------
510 
511  void azPointingConstant(double m1, CORBA::Short carmaAntNo);
512 
513  void phaseOffset(float phase, short bandNo,
514  short antenna1No, short antenna2No);
515 
516  void applyTsys(bool on);
517 
518  void applyFlux(bool on);
519 
520  void applyFocus(bool on);
521 
522  void setDecimationMode(enum DecimationMode decimationMode,
523  CORBA::UShort bandNo);
524 
525  void doIVcurve(carma::antenna::common::RxControl::Type rx,
526  carma::antenna::common::RxControl::Pol_Type pol,
527  CORBA::Float startVjInMv,
528  CORBA::Float stopVjInMv,
529  CORBA::Float stepVjInMv,
530  CORBA::UShort deltaInMs,
531  CORBA::Boolean doTotalPower,
532  const SeqShort & carmaAntNoSeq);
533 
535  getIVcurve(CORBA::Short carmaAntNo);
536 
537 
538  ComponentReady * wait(WaitItem item, const SeqShort& carmaComponentNoSeq,
539  float tmo, WaitCondition condition,
540  CORBA::Short count = 0);
541 
542  void focusZ(float position, CORBA::Short carmaAntNo);
543 
544  void focusX(float position, CORBA::Short carmaAntNo);
545 
546  void focusY(float position, CORBA::Short carmaAntNo);
547 
548  void equatOffset( double dra,
549  double ddec,
550  const SeqShort& carmaAntNoSeq,
551  bool affectPhaseCenter,
552  bool whileIntegrating);
553 
554  void phaseCenterOffset(double ra, double dec);
555 
556  void passiveLO(double freq);
557 
558  void polarization(
560  const SeqShort & carmaAntNoSeq);
561 
562  AntennaReady* tsys();
563 
564  void optimizeThresholds( const SeqShort & bandNoSeq );
565 
566  void flattenPhases( const SeqShort & bandNoSeq );
567 
568 
569  void calibrateSpectra( const SeqShort & bandNoSeq,
570  const bool noiseEnabled,
571  const float intTime,
572  const bool cache,
573  const bool enable );
574 
575 
576  bool checkConfig(const bool quiet);
577 
578  SeqShort* getCorrelatorBandNoSeq( const SeqShort & astrobandNoSeq,
579  const bool includeOfflineBands );
580 
581  ObsblockGroup getObsblock(const ControlCorrelatorDesignation ctype);
582 
583  //------------------------------------------------------------
584  // Begin configAstroBand()
585  //------------------------------------------------------------
586 
587  //------------------------------------------------------------
588  // A class which implements the configAstroBand() command, defined
589  // below
590  //------------------------------------------------------------
591 
592  class ConfigAstroBand {
593  public:
594 
595  ConfigAstroBand(SubarrayControlImpl* parent,
596  unsigned astroBandNo,
597  const std::string & astroBandConf,
599  double fcenter,
600  SidebandType sb,
601  double frest,
602  double imagefrest,
603  const bool online,
604  const std::string & transition,
605  const std::string & imageTransition,
607 
610 
612  std::set<CorrelatorHandle *> getCorrelatorGroup();
613 
615  std::set<CorrelatorHandle *>
616  getCorrelatorGroup(SubarrayControlImpl* parent, carma::util::AstroBand& astroBand);
617 
619  std::set<CorrelatorHandle *>
620  getCorrelatorGroup(SubarrayControlImpl* parent,
621  unsigned short corrBandNo,
622  ControlCorrelatorDesignation corrType=carma::util::CORR_NONE);
623 
625  std::set<VlbiHandle *> getVlbiGroup();
626 
628  std::set<VlbiHandle *>
629  getVlbiGroup(SubarrayControlImpl* parent, unsigned short corrBandNo);
630 
631  void setupCorrelatorBandwidth();
632 
633  void updateCorrelator(bool updateFpgaMode = true);
634 
635  void updateBlockDownconverter();
636 
637  void updateLo2Frequency();
638 
639  void checkConfigurationSuccess();
640 
641  void finishSetupAfterInputsValidated();
642 
643  void checkInputArguments();
644 
645  util::CorrelatorFpgaModeType getFpgaMode() const;
646 
647  // Correlator configuration variables
648 
649  carma::util::AstroBand astroBand_;
650  std::string astroBandConf_;
652  unsigned nbit_;
653  bool online_;
654  std::ostringstream corrmodeStream_;
655  carma::monitor::ControlBandPoints::CorrBitsMonitorPointEnum::CORRBITS cbits_;
656  util::hardwareType bType_;
657 
658  // Frequency variables
659 
660  double fcenter_;
661  double frest_;
662  double imagefrest_;
663  double iffreq_;
664  double dopfac_;
665  int s1_; // Sideband for computations (+1 or -1)
666 
668  carma::monitor::ControlBandPoints::Lo2SidebandMonitorPointEnum::LO2SIDEBAND lo2sb_;
669 
670  // Bandwidth variables
671 
673  double bwmhz_;
674  std::string bwstring_;
675 
676  std::string transition_;
677  std::string imageTransition_;
678 
679 private:
680 
681  void assertAstroBandConfiguration();
682  std::string bwString();
684  void checkSubarrayMembership();
685  void logCommand();
686  void setIFSwitchPositions();
687  void setDCLOSwitchPositions();
688  void setLOSwitchPositions();
689  void setLLSwitchPositions();
690  void parseBandwidth();
691  void parseBits();
692  void setupCorrMps();
693 
694  void setupCorrMps(unsigned bandNo, const ControlCorrelatorDesignation cType);
695  void selectFilter();
696 
697  void updateCorrDataRemapper();
698  void updateBlockDownconverter(const ControlCorrelatorDesignation type, const short corrBandNo);
699  void updateLo2Frequency(const ControlCorrelatorDesignation type, const short corrBandNo);
700  SubarrayControlImpl* parent_;
701 
702  }; // end ConfigAstroBand class
703 
704  // typedefs for the map used to access individual
705  // ConfigAstroBand instances.
706  typedef boost::shared_ptr<ConfigAstroBand> configab_ptr;
707  typedef std::pair<unsigned,configab_ptr> ConfigAstroBandPair;
708  typedef std::map<unsigned, configab_ptr> ConfigAstroBandMap;
709 
713  ::pthread_mutex_t gCabMapGuard_ ;
714 
715 
716  void assertCorrelatorConfiguration();
717 
718  void enableCorrelation(const SeqShort & astroBandNoSeq,
719  const CORBA::Boolean correlationsEnabled);
720 
721  void astroBandOnline(::CORBA::Short astroBandNo, CORBA::Boolean online);
722 
723 
724 
725 
726  //------------------------------------------------------------
727  // Implementation of the python clearAstroBand() and
728  // configAstroBand() commands.
729  //
730  // Details of the implementation can be found in methods of the
731  // helper ConfigAstroBand class
732  //------------------------------------------------------------
733  //
734  void clearAstroBand(::CORBA::Short astroBandNo);
735 
736  void configAstroBand(
737  ::CORBA::Short astroBandNo,
738  const char* astroBandConf,
740  ::CORBA::Double fcenter,
742  ::CORBA::Double frest,
743  ::CORBA::Double imagefrest,
744  ::CORBA::Boolean online,
745  const char* transition,
746  const char* imageTransition,
748 
749 
750  //------------------------------------------------------------
751  // End configAstroBand()
752  //------------------------------------------------------------
753  //
754  //------------------------------------------------------------
755  // Signatures of the C++ methods for python commands related
756  // to SignalPath. These are implemented in SubarrayControlSignalPath.cc
757  // and SignalPathMapperHandle.cc
758  // Related IDL file is SignalPath.idl
759  //------------------------------------------------------------
760  void initializeCableMap(const char * fileName);
761 
762  void loadConfiguration(const char * fileName,
763  const char * confName,
764  const char * astroBandConfName);
765 
766  char * queryConfiguration();
767 
768  void checkConfigurationSuccess(CORBA::Short astroBandNo);
769 
770  void checkConfigurationValidity(CORBA::Short astroBandNo,
771  const char * confName);
772 
773  //------------------------------------------------------------
774  // End SignalPath commands
775  //------------------------------------------------------------
776 
777  double lst();
778 
779  double mjd(double seconds);
780 
781  char* lstString();
782 
783  char* times();
784 
785  void useAdjustableDelay( bool useIt, const SeqShort & carmaAntNoSeq );
786 
787  void useIonosphericDelay( bool useIt, const SeqShort & carmaAntNoSeq );
788 
789  void useGeometricDelay( bool useIt, const SeqShort & carmaAntNoSeq );
790 
791  void useHeightDelay( bool useIt, const SeqShort & carmaAntNoSeq );
792 
793  void useTroposphericDelay( bool useIt, const SeqShort & carmaAntNoSeq );
794 
795  void useThermalDelay( bool useIt, const SeqShort & carmaAntNoSeq );
796 
797  void ucat(const char* catalog);
798 
799  void apEff(const float efficiency, const CORBA::Short carmaAntNo);
800 
801  void jyperk(const float gain, const CORBA::Short carmaAntNo);
802 
803  void sbratio( const float ratio,
804  const SeqShort & carmaAntNoSeq );
805 
806  void radioAperture(bool useRadio, const SeqShort& carmaAntNoSeq);
807 
808  AntennaReady* bogus(float numSeconds);
809 
810  void testAntHandles( CORBA::Double aSeconds,
811  CORBA::Double bSeconds,
812  CORBA::Long whichTest,
813  CORBA::Double lateAfterSeconds,
814  const SeqShort & carmaAntNoSeq );
815 
816  void setTraceLevel( CORBA::Short traceLevel );
817 
818  double lineFreq(const char* line);
819 
820  double transitionFreq(const char* molecule, const char* transition);
821 
822  void alarm(bool state, const char* alarmName);
823 
824  void alarmEnable(bool state);
825 
826  void alarm1mm(bool state);
827 
828  void comment(const char* obsComment);
829 
830  void log(const char* entry);
831 
832  void logError(const char* entry);
833 
834  bool getScriptBool(CORBA::Short index);
835 
836  void setScriptBool(CORBA::Short index, const bool value);
837 
838 
839  CORBA::Double getScriptDouble(CORBA::Short index);
840 
841  void setScriptDouble(CORBA::Short index, const CORBA::Double value);
842 
843  CORBA::Long getScriptInt(CORBA::Short index);
844 
845  void setScriptInt(CORBA::Short index, CORBA::Long value);
846 
847  char* getScriptString(CORBA::Short index);
848 
849  void setScriptString(CORBA::Short index, const char* value);
850 
851  void appendScriptString(CORBA::Short index, const char* value);
852 
853  void addScriptHistory(const char* value);
854  char* getScriptHistory();
855  bool getScriptHistoryFull();
856 
857  void clearScriptAll();
858 
859  void setScriptName(const char* name);
860 
861  char * getScriptName();
862 
863  void setScriptState(const ScriptStateType state);
864 
865  ScriptStateType getScriptState();
866 
867  void setFaultSystemDriveErrorPreference( enum carma::fault::EffectPreference inPref );
868 
869  void disableFaultSystemAlarms( const SeqString & inMonitorPointNames );
870 
871  void restoreFaultSystemAlarms( const SeqString & inMonitorPointNames );
872 
873  void setFaultSystemAlarmEnableState( bool inStateIsOn );
874 
875  void resetTimeSinceLastIntegration();
876 
877  void pointStatus( const PointStatusType status,
878  const SeqShort & carmaAntNoSeq );
879 
880  void setFrameDimensions( CORBA::Short x,
881  CORBA::Short y,
882  CORBA::Short x0,
883  CORBA::Short y0,
884  const SeqShort & carmaAntNoSeq );
885 
886  void setFrameBrightness( CORBA::Float brightness,
887  const SeqShort & carmaAntNoSeq );
888 
889  void setFrameContrast( CORBA::Float contrast,
890  const SeqShort & carmaAntNoSeq );
891 
892  void setFramegrabberResolution( carma::control::Resolution fgResolution,
893  const SeqShort & carmaAntNoSeq );
894 
895  void setRotationAndFieldsOfView( CORBA::Float rotationInDegrees,
896  CORBA::Float azFOVInArcminutes,
897  CORBA::Float elFOVInArcminutes,
898  CORBA::Short carmaAntNo );
899 
900  void takeBackgroundImage( CORBA::UShort numFrames,
901  const SeqShort & carmaAntNoSeq );
902 
903  void findCentroid( CORBA::UShort numFramesPerImage,
904  CORBA::UShort minValidCentroids,
905  CORBA::UShort maxCentroidAttempts,
906  CORBA::UShort numEdgePixels,
907  CORBA::UShort apertureRadiusPixels,
908  CORBA::Float pixelThresholdSigma,
909  CORBA::Boolean subBackground,
910  CORBA::Boolean normalizeMedian,
911  const SeqShort & carmaAntNoSeq );
912 
913  CentroidResults * getCentroidResults( CORBA::Short carmaAntNo );
914 
916  getImage( CORBA::UShort numFrames,
917  CORBA::Boolean subBackground,
918  CORBA::Boolean normalizeMedian,
919  CORBA::Boolean normalizeImage,
920  CORBA::Short carmaAntNo );
921 
922 
928  void reconnect( bool force );
929 
930  // Documented in the IDL
931  void vj(carma::antenna::common::RxControl::Pol_Type pol,
932  CORBA::Float vj, CORBA::Short carmaAntNo);
933 
934  // Documented in the IDL
935  void ij(carma::antenna::common::RxControl::Pol_Type pol,
936  CORBA::Float ij, CORBA::Short carmaAntNo);
937 
938  void saveControlSubsystemState( const char * filename );
939 
940  void restoreControlSubsystemFromFile( const char * filename );
941 
942  void restorationInProgress( bool restoring );
943 
944  void signalControlSubsystemRestored( );
945 
951  NearestInfoSeq * getNearest( const char * source,
952  CORBA::Float elMin,
953  CORBA::Float elMax,
954  const SeqString & sourceList,
955  NearestActionType action,
956  CORBA::Short numReturn,
957  CORBA::Boolean ignoreNorthSouth,
958  const char * coordSys,
959  CORBA::Boolean optical,
960  CORBA::Float fluxLimit,
961  CORBA::Float frequency );
962 
963  void startTrack( );
964 
965  void setInvalidationForMosaics( CORBA::Boolean invalidate );
966 
967  // Repetitive task interface
968  void setRepTaskName( CORBA::Long taskIndex, const char* taskName);
969  void setRepTaskInterval( CORBA::Long taskIndex, CORBA::Double interval);
970  void setRepTaskRemind( CORBA::Long taskIndex, CORBA::Double remind);
971  void setRepTaskAuto( CORBA::Long taskIndex, CORBA::Double taskauto);
972  void setRepTaskCompleted(CORBA::Long taskIndex, CORBA::Double mjd);
973 
974  // Testing
975  char* testMessageSize(CORBA::ULong size);
976 
977 // ---------------- End IDL Interface ----------------------
978 
979 //==========================================================================
980 
981  // Helper functions to test subarray ownership
982 
983  bool antIsOffline(unsigned antNo);
984  bool antIsInSubarray(unsigned antNo);
985  bool antIsInAnotherSubarray(unsigned antNo);
986 
991  carma::monitor::ControlBandPoints::FpgaModeMonitorPointEnum::FPGAMODE
992  msFpgaMode(util::CorrelatorFpgaModeType type);
993 
998  const std::string
999  getStringForAstroBandMode(util::CorrelatorFpgaModeType type);
1000 
1005  MonitorCorrelatorDesignation msCorrType();
1006 
1010  MonitorCorrelatorDesignation msCorrType(const ControlCorrelatorDesignation ctype);
1011 
1016  ControlCorrelatorDesignation csCorrType();
1017 
1023  bool isBandCompletelyInsideBlock(double bandCenter,
1025  double actualBW);
1032  double getMonitorValue(const ::std::string& componentName) ;
1033 
1042  static ::std::string getSubarrayName( int subarrayNo );
1043 
1044  static ::std::string getAlphanumericSubarrayName( int subarrayNo );
1045 
1046  ::std::string getName() const;
1047 
1048  ::std::string getAlphanumericName() const;
1049 
1063  static bool isActionCompleteHelper(
1064  const monitor::MonitorPointInt& seqNoMP,
1065  const int consecutiveErrorLimit,
1066  int& consecutiveErrorCount,
1067  const int nextSequenceNo,
1068  const int carmaAntNo,
1069  const std::string& name,
1070  const bool debug = true) ;
1071 
1076  void updateHalfSecMonitorPoints();
1077 
1082  void updateRepTasks(carma::monitor::ControlSubsystem& in,
1083  carma::monitor::ControlSubsystem& out) const;
1084 
1085 
1087  ::std::string sourceName( ) const;
1088 
1094  ::pthread_mutex_t gCorrNextSeqNoGuard_;
1095  CORBA::Long gCorrNextSeqNo_;
1096 
1097  static ::std::string
1098  getStringForCarmaAntNoSeq( const SeqShort & carmaAntNoSeq );
1099 
1100  static ::std::string
1101  getStringForCarmaAntNo( CORBA::Short carmaAntNo );
1102 
1109  static unsigned getMaxNumBands(ControlCorrelatorDesignation cType);
1110 
1117  bool getBlockDownconverterEnabled(const ControlCorrelatorDesignation cType, const unsigned corrBandNo ) const;
1118 
1125  void setBlockDownconverterEnabled(const ControlCorrelatorDesignation cType, const unsigned corrBandNo, const bool enabled);
1126 
1131  void updateBlockDownconverters();
1132 
1137  bool isShadowedNow(const short carmaAntNo, ShadowingType type, double diameterFraction);
1138  bool isShadowedHaDec(const short carmaAntNo, double hourAngleHours, double decDegrees, ShadowingType type, double diameterFraction);
1139  bool isShadowedSource(const short carmaAntNo, std::string sourceName, double lstHours, ShadowingType type, double diameterFraction);
1140  carma::services::Source findSource(const std::string & sourceName);
1141 
1142  bool isInitialized() const { return initializationFlag_; }
1143 
1144 private:
1145  // prevent copying and assignment
1146  SubarrayControlImpl( const SubarrayControlImpl & rhs );
1147  SubarrayControlImpl & operator=( const SubarrayControlImpl & rhs );
1148 
1149  class Prewriter;
1150 
1151  class TrackerThread;
1152  class TrackerThreadSync;
1153 
1154  class AntManager;
1155 
1156  typedef ::std::vector< CorrelatorHandle * > CorrelatorHandleVector;
1157  typedef ::std::vector< VlbiHandle * > VlbiHandleVector;
1158 
1159  typedef ::std::vector< short > CarmaComponentNoVec;
1160  typedef CarmaComponentNoVec CarmaAntNoVec;
1161  typedef CarmaComponentNoVec CarmaBandNoVec;
1162 
1163  typedef ::std::set< short > CarmaComponentNoSet;
1164  typedef CarmaComponentNoSet CarmaAntNoSet;
1165  typedef CarmaComponentNoSet CarmaBandNoSet;
1166 
1167  typedef SeqShort CarmaComponentNoSeq;
1168  typedef CarmaComponentNoSeq CarmaAntNoSeq;
1169  typedef CarmaComponentNoSeq CarmaBandNoSeq;
1170 
1171  typedef ::std::set< AntennaControls * > AntControlsGroup;
1172  typedef ::std::set< monitor::ControlSubsystemBase::Antenna* > AntMonPtGroup;
1173  typedef ::std::set< AntennaHandle * > AntennaGroup;
1174  typedef ::std::set< CalibratorHandle * > CalibratorGroup;
1175  typedef ::std::set< CryoHandle * > CryoGroup;
1176  typedef ::std::set< DownconverterHandle * > DownconverterGroup;
1177  typedef ::std::set< DriveHandle * > DriveGroup;
1178  typedef ::std::set< FocusHandle * > FocusGroup;
1179  typedef ::std::set< OpticalTelHandle * > OpticalTelGroup;
1180  typedef ::std::set< RxSelectorHandle * > RxSelectorGroup;
1181  typedef ::std::set< CorrelatorHandle * > CorrelatorGroup;
1182  typedef ::std::set< LoberotatorHandle * > LoberotatorGroup;
1183  typedef ::std::set< FaultHandle * > FaultSysGroup;
1184  typedef ::std::set< PipelineHandle * > PipelineGroup;
1185  typedef ::std::set< ProjectDatabaseManagerHandle * > ProjectDatabaseGroup;
1186  typedef ::std::set< VlbiHandle * > VlbiGroup;
1187  typedef ::std::map< unsigned short, bool > CompletionStatusType;
1188  typedef signalpath::SignalPathMapperControl::WalshColumnAssignment WalshColType;
1189 
1190  typedef ::std::vector<WalshColType> WalshColVec;
1191 
1192  struct AntTypeCounts {
1193  size_t ovro;
1194  size_t bima;
1195  size_t sza;
1196 
1197  AntTypeCounts( );
1198  };
1199 
1200  interferometry::DelayEngine* getDelayEngine( ) const;
1201 
1202  // helper method to decode signalpath-generated Walsh column vectors
1203  short getWalshCol(WalshColVec assignments, short carmaAntNo );
1204 
1205  void broadcastDelayData(
1206  const interferometry::DelayFrameVec & delayFrameVec );
1207 
1209  void updateLoberotator(
1210  const interferometry::DelayFrameVec & delayFrameVec );
1211 
1216  loberotator::LoberotatorControl::DelayFreqPacket
1217  convertDelayFrameVecToDelayFreqPacket(
1218  const interferometry::DelayFrameVec& delayFrameVec);
1219 
1231  void updateCorrelator(
1232  const interferometry::DelayFrameVec& delayFrameVec);
1237  void updateWalshColumns();
1238  void updateWalshColumns(ControlCorrelatorDesignation corr);
1239  void updateWalshColumns(const CorrelatorGroup & group, unsigned astroBandNo);
1240 
1241  void phaseCenterOffsetInternal(double ra, double dec);
1242 
1257  void updateLo1DopplerFrequency(const double mjd);
1258  void updateLo2DopplerFrequency();
1259  void resetDopplerInterpolator( const MjdTriplet & mjdTriplet );
1260 
1264  void setDelay();
1265 
1269  double computeDopplerFrequencyWithInterpReset(
1270  const ::std::string & dopplerSource,
1271  double restFreq );
1272 
1273  double computeDopplerFrequency( double mjd, double restFreq );
1274 
1280  monitor::MonitorComponent*
1281  findMonitorComponent(const ::std::string& componentName) const;
1282 
1293  void setArrayReference (const services::Location & arrayRef);
1294 
1295  void setupCorrelatorVec();
1296  void setupVlbiVec();
1305  void checkBandNo( short bandNo, bool allowZero );
1306 
1315  bool checkConfig(const bool quiet, const ControlCorrelatorDesignation cType);
1316 
1317  bool checkConfigWB(const bool quiet);
1318  bool checkConfigC3G(const bool quiet, const ControlCorrelatorDesignation cTYpe);
1319 
1320  static unsigned long getDefaultLateAfterMillis( );
1321 
1322  static void waitForAllNormal( util::WorkResultSet & wrs,
1323  unsigned long lateAfterMillis,
1324  bool logStatus );
1325 
1326  static void waitForAllNormal( util::WorkResultSet & wrs,
1327  unsigned long lateAfterMillis );
1328 
1329  static void waitForAllNormal( util::WorkResultSet & wrs,
1330  bool logStatus );
1331 
1332  static void waitForAllNormal( util::WorkResultSet & wrs );
1333 
1334  std::string makeObsBlockId(ObsblockGroup& obGroup);
1335 
1343  bool subarrayIsIntegrating();
1344 
1345  bool anyScienceSubarrayIsIntegrating();
1346 
1347  AntControlsGroup getAntControlsGroup( );
1348 
1349  AntControlsGroup
1350  getAntControlsGroupForCarmaAntNo( const ::std::string & commandName,
1351  CORBA::Short carmaAntNo );
1352 
1353  // Note: skipAntsNotOwnedByMe means "don't throw an error if
1354  // an unowned antenna is encountered." It does *not* mean
1355  // "include unowned antennas in the result set.
1356 
1357  AntControlsGroup
1358  getAntControlsGroupForCarmaAntNoSeq(
1359  const ::std::string & commandName,
1360  const CarmaAntNoSeq & carmaAntNoSeq,
1361  bool allowZero,
1362  bool ignoreDupes,
1363  bool skipAntsNotOwnedByMe );
1364 
1365  AntControlsGroup
1366  getAntControlsGroupForCarmaAntNoVec(
1367  const ::std::string & commandName,
1368  const CarmaAntNoVec & carmaAntNoVec,
1369  bool allowZero,
1370  bool ignoreDupes,
1371  bool skipAntsNotOwnedByMe );
1372 
1373  monitor::ControlSubsystemBase::Antenna&
1374  getAntMonPtForCarmaAntNo( const unsigned short carmaAntNo );
1375 
1376  monitor::ControlSubsystemBase::Ovro&
1377  getOvroMonPtForCarmaAntNo( const unsigned short carmaAntNo );
1378 
1379  monitor::ControlSubsystemBase::Bima&
1380  getBimaMonPtForCarmaAntNo( const unsigned short carmaAntNo );
1381 
1382  monitor::ControlSubsystemBase::Sza&
1383  getSzaMonPtForCarmaAntNo( const unsigned short carmaAntNo );
1384 
1385  monitor::ControlSubsystemBase::Antenna&
1386  getAntMonPtForAntControls( const AntennaControls & antControls );
1387 
1388  // A component is either a band or ant number.
1389  bool containsComponent( const CarmaAntNoVec & v,
1390  unsigned short componentNo );
1391 
1403  AntMonPtGroup getAntMonPtGroupForAntControlsGroup(
1404  const ::std::string & commandName,
1405  const AntControlsGroup & aGroup );
1406 
1418  AntMonPtGroup getAntMonPtGroupForCarmaAntNoSeq(
1419  const ::std::string & commandName,
1420  const CarmaAntNoSeq & carmaAntNoSeq,
1421  bool allowZero = true,
1422  bool ignoreDupes = true,
1423  bool skipAntsNotOwnedByMe = true );
1424 
1425  CalibratorGroup
1426  getCalibratorGroupForCarmaAntNoSeq( const ::std::string & commandName,
1427  const CarmaAntNoSeq & carmaAntNoSeq,
1428  bool allowZero,
1429  bool ignoreDupes );
1430 
1431  CalibratorGroup
1432  getCalibratorGroupForCarmaAntNo(const ::std::string & commandName,
1433  CORBA::Short carmaAntNo);
1434 
1435  CryoGroup
1436  getCryoGroupForCarmaAntNoSeq( const ::std::string & commandName,
1437  const CarmaAntNoSeq & carmaAntNoSeq,
1438  bool allowZero,
1439  bool ignoreDupes );
1440 
1441  DownconverterGroup
1442  getDownconverterGroup( const ::std::string & commandName );
1443 
1444  DownconverterHandle *
1445  getDownconverterHandleForCorrType( ControlCorrelatorDesignation type );
1446 
1447  DriveGroup
1448  getDriveGroupForAntControlsGroup( const ::std::string & commandName,
1449  const AntControlsGroup & antControls );
1450 
1451  DriveGroup
1452  getDriveGroup( const ::std::string & commandName );
1453 
1454  DriveGroup
1455  getDriveGroupForCarmaAntNo( const ::std::string & commandName,
1456  CORBA::Short carmaAntNo );
1457 
1458  DriveGroup
1459  getDriveGroupForCarmaAntNoSeq( const ::std::string & commandName,
1460  const CarmaAntNoSeq & carmaAntNoSeq,
1461  bool allowZero,
1462  bool ignoreDupes,
1463  bool skipAntsNotOwnedByMe );
1464 
1465  AntennaGroup
1466  getAntennaGroupForAntControlsGroup( const ::std::string & commandName,
1467  const AntControlsGroup & antControls );
1468 
1469  AntennaGroup
1470  getAntennaGroupForCarmaAntNoSeq( const ::std::string & commandName,
1471  const CarmaAntNoSeq & carmaAntNoSeq,
1472  bool allowZero,
1473  bool ignoreDupes,
1474  bool skipAntsNotOwnedByMe
1475  );
1476 
1477  AntennaGroup
1478  getAntennaGroupForCarmaAntNo( const ::std::string & commandName,
1479  CORBA::Short carmaAntNo );
1480 
1481  FocusGroup
1482  getFocusGroupForAntControlsGroup( const ::std::string & commandName,
1483  const AntControlsGroup & antControls );
1484 
1485  FocusGroup
1486  getFocusGroupForCarmaAntNoSeq( const ::std::string & commandName,
1487  const CarmaAntNoSeq & carmaAntNoSeq,
1488  bool allowZero,
1489  bool ignoreDupes );
1490 
1491  FocusGroup
1492  getFocusGroupForCarmaAntNo( const ::std::string & commandName,
1493  CORBA::Short carmaAntNo );
1494 
1495  OpticalTelGroup
1496  getOpticalTelGroupForAntControlsGroup( const ::std::string & commandName,
1497  const AntControlsGroup & antControls );
1498 
1499  OpticalTelGroup
1500  getOpticalTelGroup( const ::std::string & commandName );
1501 
1502  OpticalTelGroup
1503  getOpticalTelGroupForCarmaAntNoSeq(const ::std::string & commandName,
1504  const CarmaAntNoSeq& carmaAntNoSeq,
1505  bool allowZero,
1506  bool ignoreDupes,
1507  bool skipUnownedAnts=false);
1508 
1509  OpticalTelGroup
1510  getOpticalTelGroupForCarmaAntNo( const ::std::string & commandName,
1511  CORBA::Short carmaAntNo );
1512 
1513  RxSelectorGroup
1514  getRxSelectorGroupForAntControlsGroup(const std::string& commandName,
1515  const AntControlsGroup& antControls );
1516 
1517  RxSelectorGroup
1518  getRxSelectorGroup( const ::std::string & commandName );
1519 
1520  RxSelectorGroup
1521  getRxSelectorGroup(const std::string& commandName,
1522  const CarmaAntNoSeq& carmaAntNoSeq);
1523 
1524  RxSelectorGroup
1525  getRxSelectorGroupForCarmaAntNo( const std::string & commandName,
1526  CORBA::Short carmaAntNo );
1527 
1528 
1529  CorrelatorGroup getCorrelatorGroup(const ::std::string & commandName,
1530  ControlCorrelatorDesignation passedCorrType = carma::util::CORR_NONE);
1531 
1532 
1533  CorrelatorGroup
1534  getCorrelatorGroup(const ::std::string & commandName,
1535  short bandNo,
1536  ControlCorrelatorDesignation corrType,
1537  bool allowZero);
1538 
1539  CorrelatorGroup getCorrelatorGroup(const ::std::string & commandName,
1540  const CarmaBandNoSeq& bandNoSeq,
1541  ControlCorrelatorDesignation corrType,
1542  bool allowZero);
1543 
1544  CorrelatorGroup getCorrelatorGroup(const ::std::string & commandName,
1545  const CarmaBandNoVec & carmaBandNoVec,
1546  ControlCorrelatorDesignation corrType,
1547  bool allowZero);
1548 
1549  CorrelatorGroup
1550  getCorrelatorGroup(const ::std::string & commandName,
1551  const std::vector<carma::signalpath::SignalPathMapperControl::CorrelatorBand>& bandNoVec);
1552 
1553 
1554  CorrelatorGroup addCorrelatorHandle(CorrelatorGroup& result,
1555  const short bandNo,
1556  ControlCorrelatorDesignation passedCorrType);
1557 
1558  void checkCorrelatorGroupReturn(bool outputIsEmpty, bool inputIsEmpty);
1559 
1560  VlbiGroup getVlbiGroup( const ::std::string & commandName );
1561 
1562  VlbiGroup
1563  getVlbiGroupForBandNoParam( const ::std::string & commandName,
1564  short bandNo,
1565  bool allowZero );
1566  VlbiGroup
1567  getVlbiGroupForBandNoSeq( const ::std::string & commandName,
1568  const CarmaBandNoSeq& bandNoSeq,
1569  bool allowZero
1570  );
1571  VlbiGroup
1572  getVlbiGroupForBandNoVec( const ::std::string & commandName,
1573  const CarmaBandNoVec & carmaBandNoVec,
1574  bool allowZero
1575  //always ignore duplicates
1576  );
1577 
1578  LoberotatorGroup getLoberotatorGroup( );
1579 
1580  FaultSysGroup getFaultSysGroup( );
1581 
1582  PipelineGroup getPipelineGroup( );
1583 
1584  ProjectDatabaseGroup getProjectDatabaseGroup( );
1585 
1586  std::string getProject(const ControlCorrelatorDesignation ctype);
1587 
1588  ControlCorrelatorDesignation getCorrelatorDesignation();
1589 
1590  carma::monitor::MonitorPointString& getModeDescMp(const ControlCorrelatorDesignation ctype);
1591  carma::monitor::Obsblock& getObsblockMp(const ControlCorrelatorDesignation ctype);
1592  carma::monitor::MonitorPointString& getObsblockIdMp(const ControlCorrelatorDesignation ctype);
1593  carma::monitor::MonitorPointString& getObsblockIdMpForRead(const ControlCorrelatorDesignation ctype);
1594  carma::monitor::MonitorPointString& getProjectMp(const ControlCorrelatorDesignation ctype);
1595  void updateCorrelatorMonitorPoints(const ControlCorrelatorDesignation ctype);
1596 
1597  carma::monitor::MonitorPointString& getProjectMpForRead(const ControlCorrelatorDesignation ctype);
1598 
1599  void checkStringValidity(std::string& str, std::string prefix, bool checkWhitespace=true);
1600 
1601  bool setObsblockIdItem(ObsblockGroup& obSave,
1602  bool overwriteProject, bool overWriteObsblock, bool overWriteSubobsblock, bool overwriteTrial);
1603 
1604  bool setObsblockIdProject(ObsblockGroup& ob);
1605  bool setObsblockIdObsblock(ObsblockGroup& ob);
1606  bool setObsblockIdSubobsblock(ObsblockGroup& ob);
1607  bool setObsblockIdTrial(ObsblockGroup& ob);
1608 
1609  static AntTypeCounts
1610  getAntTypeCounts( const CarmaAntNoVec & carmaAntNoVec );
1611 
1612  static AntTypeCounts
1613  getAntTypeCounts( const CarmaAntNoSeq & carmaAntNoSeq );
1614 
1615  static AntTypeCounts
1616  getAntTypeCounts( const AntControlsGroup & antControls );
1617 
1618  static AntTypeCounts
1619  getAntTypeCounts( const DriveGroup & driveGroup );
1620  static AntTypeCounts
1621  getAntTypeCounts(const RxSelectorGroup& rxGroup);
1622 
1624  static unsigned long
1625  getDriveCommandLateAfterMillis( const DriveGroup & driveGroup );
1626 
1628  static unsigned long
1629  getDriveCommandLateAfterMillis( const DriveGroup & driveGroup,
1630  size_t maxVaxOpsPerOvroAnt );
1632  static unsigned long
1633  getRxCommandLateAfterMillis(const RxSelectorGroup& rxGroup);
1634 
1635  void padOffset( float east,
1636  float north,
1637  float up,
1638  AntennaControls & antControls,
1639  const bool broadcastDelays = true );
1640 
1641  // common method to update antenna location subarray container
1642  // and delay engine after change to antenna or pad offsets.
1643  void updateLocation( AntennaControls & antControls,
1644  const bool broadcastDelays = true );
1645 
1646  void focus( float position,
1647  const FocusGroup & focusGroup );
1648 
1649  void trackDriveGroup( const ::std::string & source,
1650  const DriveGroup & driveGroup,
1651  bool changeArrayInfo,
1653  driveWrapMode,
1654  double time,
1655  bool overTheTop,
1656  bool failIfIntegrating
1657  );
1658 
1659 
1660  // Helper methods
1661  bool waitIntegration( const monitor::MonitorSystem& mon,
1662  int passCount, int invalidDataLimit );
1663  bool waitTracking(const monitor::MonitorSystem& mon,
1664  const int passCount, const int invalidDataLimit,
1665  CompletionStatusType& completionStatus, WaitCondition condition,
1666  short count);
1667  bool waitCalibrator(const monitor::MonitorSystem& mon,
1668  const int passCount, const int invalidDataLimit,
1669  CompletionStatusType& completionStatus, WaitCondition condition);
1670  bool waitOptics(const monitor::MonitorSystem& mon,
1671  const int passCount, const int invalidDataLimit,
1672  CompletionStatusType& completionStatus, WaitCondition condition);
1673  bool waitCentroid(const monitor::MonitorSystem& mon,
1674  const int passCount, const int invalidDataLimit,
1675  CompletionStatusType& completionStatus, WaitCondition condition,
1676  short count);
1677  bool waitTuned(const monitor::MonitorSystem& mon,
1678  const int passCount, const int invalidDataLimit,
1679  CompletionStatusType& completionStatus, WaitCondition condition);
1680  bool waitCorrelator( const monitor::MonitorSystem & mon,
1681  const int passCount, const int invalidDataLimit,
1682  CompletionStatusType & completionStatus, WaitCondition condition );
1683  void waitDebugger(const CompletionStatusType& completionStatus,
1684  const std::string& name,
1685  const int passCount, const int numDone, const int numNotDone);
1686 
1688  CarmaAntNoVec getCarmaAntNoVecForAllAntennas( ) const;
1689  // Reachable in the drive control sense
1690  CarmaAntNoVec getCarmaAntNoVecForAllReachableAntennas( ) const;
1692  CarmaAntNoVec getCarmaAntNoVec(const CarmaAntNoSeq& seq) const;
1693 
1694  CarmaBandNoVec getCarmaBandNoVecForAllBands( );
1695  CarmaBandNoVec getCarmaBandNoVecForAllOnlineAndReachableBands( );
1696  CarmaBandNoVec getCarmaBandNoVec( const CarmaBandNoSeq & seq ) const;
1697  CarmaBandNoSet getCarmaBandNoSetForCarmaBandNoVec(
1698  const ::std::string & commandName,
1699  const CarmaBandNoVec & vec );
1700 
1701  void incrementTuneSeqNo(const RxSelectorGroup& rxSelectorGroup);
1702 
1711  void extendDopplerInterpolator( double mjd );
1712 
1718  MjdTriplet getAlignedAntUpdateTimes( double now = util::Time::MJD() );
1719 
1726  MjdTriplet getAlignedInterfUpdateTimes( double now = util::Time::MJD() );
1727 
1735  double computeTruncatedInterfUpdateTime(
1736  double now = util::Time::MJD()) const;
1737 
1743  double computeTruncatedAntUpdateTime(
1744  double now = util::Time::MJD()) const;
1745 
1746  static double computeTruncatedMjd( double mjd, double interval );
1747 
1753  void updateShortTermMonitorPoints( double mjd = util::Time::MJD() );
1754 
1759  void updateDopplerMonitorPoints( double mjd = util::Time::MJD() );
1760 
1765  void updateUVWMonitorPoints( double mjd = util::Time::MJD() );
1766 
1776  void renewDelays(const DriveGroup & driveGroup ,
1777  double now = util::Time::MJD() );
1778 
1783  void updateFrequencyMPs( );
1784 
1792  void updateFrequencyMPs( const ControlCorrelatorDesignation cType );
1793 
1799  void updateFrequency(double loSkyFreqGHz);
1800 
1807  double apEff(unsigned short carmaAntNo, double loFreqGHz) const;
1812  double diameter(unsigned short carmaAntNo) const;
1818  double computeJyPerK(unsigned short carmaAntNo, double loFreqGHz) const;
1819 
1827  void updateJyperk(double loSkyFreqGHz);
1828 
1835  void updateSbrs(double loSkyFreqGHz);
1836 
1842  void selectAperture(bool opticalAperture,
1843  const CarmaAntNoSeq& carmaAntNoSeq);
1844 
1845  /* call before firing off a DriveGroup setEquatOffset workerpool */
1846  void checkModeForEquatOffset( const DriveGroup & driveGroup );
1847 
1852  void retrack( const DriveGroup & driveGroup );
1853 
1858  void startAutoWriters();
1859 
1863  void internalInitialization();
1864 
1868  void instantiateHandles();
1869 
1873  void initializeObsblock( void );
1874 
1878  void invalidateIntent( void );
1879 
1880  void invalidateSpecificIntent( carma::monitor::Obsblock& ob);
1881 
1885  void invalidateConstraints( void );
1886 
1894  bool obsblockContains ( const std::string & source );
1895 
1899  bool isDefaultProjectOrObsblock( void );
1900 
1906  bool isThrowawayObsblock( void );
1907 
1912  bool currentSourceHasIntent( void );
1913 
1921  unsigned short getObsblockIndexOf ( const std::string & source );
1922 
1928  unsigned short getNextAvailableObsblockIndex ( void );
1929 
1930  bool isValidPurpose ( const std::string & purpose );
1931 
1938  void setObsblockCurrentObsObject( void ) ;
1939 
1947  void setEqOffsetMonitorPoints( const double dra, const double ddec,
1948  const SeqShort & carmaAntNoSeq);
1954  void setPhsOffsetMonitorPoints( const double dra, const double ddec);
1955 
1956 
1962  bool hasDefaultIntent ( const ::std::string & project );
1968  const IntentInfo & getDefaultIntent ( const ::std::string & project );
1969 
1974  void setSourceName( const ::std::string & sourceName );
1975 
1983  void lastCommand( const ::std::string & command );
1984 
1988  void resetTsys( const SeqShort & carmaAntNoSeq );
1989 
1992  class CachedCarmaMonSys {
1993  public:
1994  class ScopedUse;
1995 
1996  explicit CachedCarmaMonSys( );
1997 
1998  virtual ~CachedCarmaMonSys( );
1999 
2000  private:
2001  // No copying
2002  CachedCarmaMonSys( const CachedCarmaMonSys & rhs );
2003  CachedCarmaMonSys & operator=( const CachedCarmaMonSys & rhs );
2004 
2005  util::PthreadMutex guard_;
2006  ::std::string lastCachedInUseBy_;
2007  ::std::auto_ptr< monitor::CarmaMonitorSystem > cachedInstance_;
2008  };
2009 
2010 
2017  ::std::string makeCorrModeDescString( carma::util::CorrelatorSet c );
2018  ::std::vector< ::std::string > slcmodeVec_;
2019  ::std::vector< ::std::string > wbcmodeVec_;
2020  ::std::vector< ::std::string > c3gMax8modeVec_;
2021  ::std::vector< ::std::string > c3gMax23modeVec_;
2022 
2026  ConfigAstroBandMap cabmap_;
2027 
2028 
2029  bool cancelFlag_;
2030 
2031  ::std::auto_ptr< Prewriter > prewriter_;
2032 
2033  const int subarrayNo_;
2034 
2035  monitor::ControlSubsystem controlSubsystem_;
2036  monitor::ControlSubsystemBase::Subarray & subarrayContainer_;
2037  monitor::CarmaMonitorSystem carmaMonitor_;
2038  monitor::RawCarmaMonitorSystem rawCarmaMonitor_;
2039  monitor::SignalPathSubsystem signalPath_;
2040 
2041  CachedCarmaMonSys cachedWaitCarmaMonSys_;
2042 
2043  int nextCalibratorSeqNo_;
2044  int nextDriveSeqNo_;
2045  int nextTuneSeqNo_;
2046  int nextCentroidSeqNo_;
2047  int nextOpticsSeqNo_;
2048  int nextIntegSeqNo_;
2049 
2050  unsigned short numAstroBands_; // Number of astro bands
2051 
2052 
2053  double loRestFreq_; // GHz
2054  double loFreq_; // GHz
2055  int lo1Sideband_;
2056  double ifFreq_;
2057  double ifRestFreq_;
2058  double restFreq_;
2059  double skyFreq_;
2060  bool lo2DopplerTrackingEnabled_;
2061  LOchain LOchain_;
2062 
2063  ::std::auto_ptr< interferometry::DelayEngine > delayEngine_;
2064  monitor::DelayEngineSubsystem delaySubsystem_;
2065 
2066  // Various DO Handles
2067  ::std::auto_ptr< DCLOSwitchyardHandle > dcLoSwitchyard_;
2068  ::std::auto_ptr< DownconverterHandle > slDownconverter_;
2069  ::std::auto_ptr< DownconverterHandle > wbDownconverter_;
2070  ::std::auto_ptr< AlarmHandle > alarm_;
2071  ::std::auto_ptr< CorrDataRemapperHandle > corrDataRemapper_;
2072 
2073  ::std::auto_ptr< IFSwitchyardHandle > ifSwitchyard_;
2074  ::std::auto_ptr< LineLengthHandle > lineLength_;
2075  ::std::auto_ptr< LLSwitchyardHandle > llSwitchyard_;
2076  ::std::auto_ptr< LoberotatorHandle > loberotator_;
2077  ::std::auto_ptr< LOrefHandle > loRef_;
2078  ::std::auto_ptr< LOSwitchyardHandle > loSwitchyard_;
2079  ::std::auto_ptr< ClockHandle > masterClock_;
2080  ::std::auto_ptr< FaultHandle > faultSys_;
2081  ::std::auto_ptr< PipelineHandle > slPipeline_;
2082  ::std::auto_ptr< PipelineHandle > wbPipeline_;
2083  ::std::auto_ptr< PipelineHandle > c3gMax8Pipeline_;
2084  ::std::auto_ptr< PipelineHandle > c3gMax23Pipeline_;
2085  ::std::auto_ptr< ProjectDatabaseManagerHandle > projectDatabaseManager_;
2086  ::std::auto_ptr< SignalPathMapperHandle > signalPathMapper_;
2087 
2088  ::std::auto_ptr< AntManager > antManager_;
2089  ::std::auto_ptr< CorrelatorHandleVector > slCorrelatorVec_;
2090  ::std::auto_ptr< CorrelatorHandleVector > wbCorrelatorVec_;
2091  ::std::auto_ptr< CorrelatorHandle> c3gMax8Correlator_;
2092  ::std::auto_ptr< CorrelatorHandle> c3gMax23Correlator_;
2093  ::std::auto_ptr< VlbiHandleVector > vlbiVec_;
2094 
2095  ::std::auto_ptr< TrackerThread > trackerThread_;
2096  ::boost::thread trackerThreadThread_;
2097  ::boost::recursive_mutex trackerThreadSyncMutex_;
2098 
2099  ::std::auto_ptr< HalfSecUpdater> halfSecUpdater_;
2100  ::boost::thread halfSecUpdaterThread_;
2101 
2102  const ::std::auto_ptr< WorkerPool > workerPool_;
2103 
2104  // representation of this observatory (default is "carma")
2105  ::std::auto_ptr< services::Observatory> obs_;
2106 
2107  // Catalog of all standard sources.
2108  services::SourceCatalog sourceCatalog_;
2109 
2110  // elevation limit used for calculating source rise & set times
2111  double elevLimit_;
2112 
2113 
2119  ::std::auto_ptr< services::Ephemeris > arrayRefEphem_;
2120 
2126  ::std::auto_ptr< services::Ephemeris > dopplerEphem_;
2127 
2128 
2129  bool initializationFlag_;
2130  const bool verbose_;
2131 
2136  util::QuadraticInterpolatorNormal dopplerInterp_;
2137 
2141  bool isDopplerTracking_;
2142 
2146  mutable util::PthreadRWLock sourceNameGuard_;
2147 
2152  ::std::string sourceName_;
2153 
2157  bool noiseSource_;
2158 
2163  ::std::string dopplerSource_;
2164 
2173  ::std::string userCatalog_;
2174 
2181  ::std::map< ::std::string, IntentInfo > projectDefaultIntentMap_;
2182 
2183  int pdmRequestId_;
2184  int pdmEditId_;
2185  int runId_;
2186 
2187  const IntentInfo invalidIntent_;
2188  void setIntent( const ::std::string & sourceName,
2189  const IntentInfo & intent);
2190  void setDefaultIntent( const IntentInfo & intent);
2191  bool setDefaultObsObject( void );
2192  void initializeDefaultProjectMap();
2193 
2194  // Script Strings and History
2195  bool scriptHistoryIsFull_;
2196  std::string scriptStateDir_;
2197  const int nScriptStrings_;
2198 
2199  // pad, antenna and other delays; read in from conf/delay/*.tab
2200  // where *=[padDelay, antDelay, opticsDelay, extraLOcable]
2201  //
2202  // vector index is carmaAntennaNumber-1, value is delay in nanosec
2203  ::std::vector<double> antDelay_;
2204  ::std::vector<double> opticsDelayMM_;
2205  ::std::vector<double> opticsDelayCM_;
2206  ::std::vector<double> extraLOcableDelayMM_;
2207  ::std::vector<double> extraLOcableDelayCM_;
2208  // map key is pad number, value is delay in nanosec
2209  ::std::map< int, double > padDelay_;
2210 
2211  // subarray-wide delay line centering term, which applies to all
2212  // antennas, in nanosec
2213  // This will be set with a python globaldelay command which
2214  // calls through to delayEngine->setAdjustableDelay.
2215  // We store a member variable so that antennas that come in
2216  // with addAntenna after subarray is initialized can
2217  // set their global delay value appropriate to the new
2218  // subarray.
2219  double globalDelay_;
2220 
2221  // Load the pad and antenna delay values from the configuration tables
2222  void loadDelayTables( void );
2223 
2224 
2225  bool restorationInProgress_;
2226 
2227  // Save the current system state (e.g. after a monitor point value change)
2228  void markStateChange( );
2229 
2230  bool controlSubsystemRestored_;
2231 
2232  // Whether the last call to config band for
2233  // a given band number required block downconversion.
2234  // array index = bandNo - 1. One for WB corr, one for SL corr
2235  ::std::vector<bool> slBdcEnabled_;
2236  ::std::vector<bool> wbBdcEnabled_;
2237 
2238  // MJD time of last start of track
2239  double lastStartTrackMJD_;
2240  services::AstroTime astroTime_;
2246  bool isAntennaInitialized( const short carmaAntNo );
2247 
2252  AntennaControls::PersistentInfo retrieveAntPersistentInfo(
2253  const short carmaAntNo,
2254  const monitor::MonitorSystem & monSys,
2255  services::Observatory & obs);
2256 
2266  void copyAntDelayData( monitor::DelayEngineSubsystem::DelayData & lhs,
2267  const monitor::DelayEngineSubsystem::DelayData & rhs,
2268  double theta);
2269 
2279  ::std::vector<double> rotateUVtoJ2000( double U, double V, double theta);
2280 
2281  std::string scriptStringFilename(int i);
2282 
2287  bool prewriterIsInvalidating_;
2288 
2289  carma::pipeline::ShadowingCalculator shadowingCalculator_;
2290 
2291  // This method refactors some duplicated checking in SubarrayControlConfig.cc
2292  bool checkAntControls( AntControlsGroup & antControlsGroup,
2293  const unsigned carmaAntNo,
2294  const ::std::string & methodName );
2295 
2296 }; // end SubarrayControlImpl class.
2297 
2298 
2299 } // namespace carma::control
2300 } // namespace carma
2301 
2302 
2303 #endif // End of conditional include guard
sequence< double > RaDecSeq
Sequence of ra &amp; dec in degrees.
SidebandType
Downconverter sideband choice.
carma::util::SeqShort SeqShort
Sequence of CORBA::Short.
3 mm - Polarization 1 only
Definition: RxControl.idl:39
AzWrapMode
Possible Azimuth Wrap modes.
Definition: AzWrapMode.idl:11
sequence< AntennaAssignment > AntennaAssignmentSeq
Sequence of antenna assignments for a subarray.
Tagged: Fri Oct 7 13:14:58 PDT 2011.
PointStatusType
ON or OFF source indicator (Singledish observations)
ScriptStateType
Current state of the script.
CorrelatorFpgaModeType
FPGA configuration modes.
The monitor system base class.
FilterType
Valid output bandwidth filter types.
The monitor system for the Control subsystem.
std::vector< Length * > convertBaseline(Pad pad, Length X, Length Y, Length Z)
Take an X, Y, Z topographic position and convert it to ENU offsets, given a Pad location.
String value monitor point (up to 80 characters in length).
Source is derived from CatalogEntry and is used to hold information for a particular entry from a sou...
Definition: Source.h:23
WaitCondition
Valid conditions to satisfy a wait.
State
Enumerate valid polarization states.
CorrelatorBitType
Correlator number of bits.
enum carma::util::hardwareTypeEnum hardwareType
The type of board hardware in a given band.
Definition: corrUtils.h:20
Class to receive phase switching tables which then triggers more processing.
Rich description of a frame grabbed image.
Tagged: Wed Jan 5 09:42:06 PST 2011.
Aperture
Enumerate apertures to use for selecting pointing models.
EditStatus
Various enumeration constants.
carma::util::SeqFloat SeqFloat
Sequence of CORBA::Float.
BlockDCPolarizationType
Block Downconverter polarization input selector choice.
Type
Enumerate valid Receiver types.
Definition: RxControl.idl:36
Position
A calibrator position enumerator.
Data returned by an IV curve method Be careful not to assume that the totPower contains the same numb...
Definition: IVCurve.idl:30
Astronomical Time routines.
carma::util::SeqDouble SeqDouble
Sequence of CORBA::Double.
sequence< Project > ProjectSequence
Sequence of projects.
carma::util::SeqString SeqString
Sequence of CORBA::String.
Resolution
Resolutions supported by our framegrabber.
ImagingType
Imaging type describing how the track is being observed.
NearestActionType
Use or exclude the input source list when searching for nearest neighbors.
sequence< ItemValue > ItemValueSequence
Sequence of an Item name and value pairs.
Definition: ItemValue.idl:26
SwitchState
Generic switch state enumerator.
Definition: SwitchState.idl:18
CorrelatorBandWidthType
Supported spectral correlator bandwidths.
The Delay Engine.
sequence< float > AzElSeq
Sequence of azimuth and elevation in degrees.
ShadowingType
Query internal or swept-volume shadowing.
Declaration of carma::services::Ephemeris.
CorrelatorSet encapsulates a set of correlators to facilitate management of addition and removal of c...
Definition: CorrelatorSet.h:33
Tagged: Thu Feb 24 15:07:14 PST 2011.
static double MJD()
Get current MJD.
Position
Enumerate valid fixed positions for Stow.
Phaseswitching corba server DO implementation.
WaitItem
Valid items on which to wait.
Handles all parameters and calculations for the LO chain.
Carma control interface to the SignalPathMapper DO.