/** @file H2O_Response.cpp @author Greg Paxton $Date:$ $Revision:$ @copyright (©) Copyright 2010 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 Prepares data for the call to sofieH2O to correct the H2O response. */ #include "H2O_Response.h" #include "H2O_Correction.h" #include "SigEarthLocParam.h" #include "SOFIE_namespace.h" #include "GATS_Utilities.hpp" using namespace std; using namespace GATS_Utilities; H2O_Response::H2O_Response(Event& L0, ConfigFile& cf) { if(cf.ValidEntry("SignalCorrection", "Channel_3_Altitude") ) { startAlt = cf.GetReal("SignalCorrection", "Channel_3_Altitude"); assert (startAlt >= 0. ); } else { startAlt = 100.; } if(cf.ValidEntry("H2OResponse", "Band_5_DecayConstant") ) { band5DecayConstant = cf.GetReal("H2OResponse", "Band_5_DecayConstant"); assert (band5DecayConstant >= 0. ); } else { band5DecayConstant = 24.; } if(cf.ValidEntry("H2OResponse", "Band_6_DecayConstant") ) { band6DecayConstant = cf.GetReal("H2OResponse", "Band_6_DecayConstant"); assert (band6DecayConstant >= 0. ); } else { band6DecayConstant = 36.; } EventVar startTime, endTime; L0.getEventVar("L0_BalanceStartTime", startTime); L0.getEventVar("L0_BalanceEndTime", endTime);; BalanceStartTime = startTime[0]; BalanceStopTime = endTime[0]; } //----------------------------------------------------------------------------------------- // Object method that sets up the H2O correction, retrieves the output values, and stores // them for program output to the database. // // Input: // inSignal........Input signals as multiple signals (All channels) // // Output: // outSignal.......The corrected signals as multiple signals // // Source: Greg Paxton, GATS // Lance Deaver, GATS //----------------------------------------------------------------------------------------- MultiSignal H2O_Response::correctH2O(MultiSignal &inSignal, SigEarthLocParam &earthInfo, EventVarVect &EVV ) { cout << "Inside correctH2O" << endl; valarray timeArray; vector signalArray; Journal auditJournal= inSignal.getAudit(); string comments; string processName = "H2O Correction"; ChannelSignals Channel; try { inSignal.getTime(timeArray); vector TP_Alts = earthInfo.getAltitudes(); valarray Aparameters(3); EventVar outputParams(3); for(int i = 0; i <= SOFIE::NO ; ++i) { Aparameters[0] = 0.; Aparameters[1] = 0.; Aparameters[2] = 0.; if (i == SOFIE::H2O && ((char)inSignal.getModeFlag() == 0)) { Channel = inSignal.getChannel(i); //H2O channel valarray strong = Channel.getSignal(SOFIE::Strong); // get the strong band valarray weak = Channel.getSignal(SOFIE::Weak); int npts = (int)strong.size() ; // number of points int iStart = 0; // index of starting location double weight = 1.0; double startBA = BalanceStartTime; double endBA = BalanceStopTime; char mode = (char)inSignal.getModeFlag(); valarray residualS(strong.size()), residualW(weak.size()); ::sofieH2O (&weak[iStart], &TP_Alts[iStart], &timeArray[iStart], &mode, &residualW[iStart], &npts, &startAlt, &band5DecayConstant, &Aparameters[0], &weight, &startBA, &endBA ); outputParams[0] = Aparameters[0]; outputParams[1] = Aparameters[1]; outputParams[2] = Aparameters[2]; EVV.addEventVar(outputParams); ::sofieH2O (&strong[iStart], &TP_Alts[iStart], &timeArray[iStart], &mode, &residualS[iStart], &npts, &startAlt, &band6DecayConstant, &Aparameters[0], &weight, &startBA, &endBA ); outputParams[0] = Aparameters[0]; outputParams[1] = Aparameters[1]; outputParams[2] = Aparameters[2]; EVV.addEventVar(outputParams); signalArray.push_back( ChannelSignals(Channel.getID(), Channel.getAttenuation(SOFIE::Strong), Channel.getAttenuation(SOFIE::Weak), residualS, residualW, Channel.getSignal(SOFIE::Diff) ) ); } else { signalArray.push_back( inSignal.getChannel(i) ); // Added to inject fill values into the output parameters // for non-H2O bands outputParams[0] = -999.; outputParams[1] = -999.; outputParams[2] = -999.; EVV.addEventVar(outputParams); outputParams[0] = -999.; outputParams[1] = -999.; outputParams[2] = -999.; EVV.addEventVar(outputParams); } } } catch (exception &ex) { cerr << "Exception thrown in H2O_Response :" << endl; cerr << "Channel Gas ID: " << Channel.getID() << endl; cerr << "Exception Message: " << ex.what() << endl; cerr << "Additional comments: " << comments << endl; cerr << "Current Audit Trail: "; inSignal.getAudit().print(cerr); cerr << endl; throw; } EVV.setName("H2O_Params"); auditJournal.append(processName); cout << "finished H2O_Response" << endl; return MultiSignal(inSignal.getEventNumber(), inSignal.get150kmTime(), inSignal.getModeFlag(), timeArray, signalArray, auditJournal) ; }