/** @file PointingDriftFunctor.cpp @author Brian Magill @creation date 1/01/2007 $Date:$ $Revision:$ @copyright (©) Copyright 2006 by GATS Inc. 11864 Canon Blvd., Suite 101, Newport News, VA 23606 All Rights Reserved. No part of this software or publication may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise without the prior written permission of GATS Inc. @brief Removes drift due to solar pointing movement */ #include #include #include #include #include "SOFIE_namespace.h" #include "GATS_Utilities.hpp" #include "PointingDriftFunctor.h" #include "ChannelSignals.h" #include "PointingSigParam.h" #include "CalcPointing.h" #include "ApplyPointing.h" #include "PointingDriftScaling.h" #include "Vec2Val.hpp" using namespace std; using namespace GATS_Utilities; MultiSignal PointingDriftFunctor::operator() (MultiSignal const &inSignal) const { valarray timeArray; vector signalArray; double point_150km = inSignal.get150kmTime(); bool mode = inSignal.getModeFlag(); Journal auditJournal; string processName = "Solar Pointing Signal Correction"; ChannelSignals inChannel; ChannelSignals outChannel; string comments; PointingSigParam m_param; CalcPointing detPointing(earthLoc, calibTimes, balTimes, mode); valarray az = Vec2Val (earthLoc.getAzimLockDown()); valarray el = Vec2Val (earthLoc.getElevLockDown()); valarray extent = Vec2Val (earthLoc.getSolarExtent()); double maxValue = 100.0; az = filter(maxValue, az); el = filter(maxValue, el); inSignal.getTime(timeArray); PointingDriftScaling calcScaling(mode, calibTimes.getStartTime(), calibTimes.getEndtTime(), 10, timeArray); ApplyPointing applyCorrection(az, el, extent, calcScaling, mode, cutoffTime); auditJournal = inSignal.getAudit(); auditJournal.append(processName); for(int indx = 0; indx < inSignal.numberOfSignals(); indx++) try { inChannel = inSignal.getChannel(indx); if (comments.size() > 0) auditJournal.append(comments); std::cout << "Applying Pointing Correction for channel " << indx << std::endl; detPointing(timeArray, inChannel, m_param, comments); outChannel = applyCorrection(timeArray, inChannel, m_param); signalArray.push_back(outChannel); pointingResults.push_back(m_param); } catch (exception &ex) { cerr << "Exception thrown in PointingDriftFunctor :" << endl; cerr << "Channel Gas ID: " << inChannel.getID() << endl; cerr << "Exception Message: " << ex.what() << endl; cerr << "Additional comments: " << comments << endl; cerr << "Current Audit Trail: "; inSignal.getAudit().print(cerr); cerr << endl; throw; } MultiSignal outSignal(inSignal.getEventNumber(), point_150km, mode, timeArray, signalArray, auditJournal); return outSignal; }; valarray PointingDriftFunctor::filter(double maxValue, valarray const & in) const { valarray workArray = in; unsigned long indx; for(indx = 0; indx < workArray.size(); indx++) if (fabs(workArray[indx]) > maxValue) workArray[indx] = 0.0; return workArray; }