/****************************************************************************** * L1b_file.cpp * * --------------------------- * * start : September 21th-2008 * * author : Lars Stenseng * * email : stenseng@space.dtu.dk * * last update : October 28th-2008 * ******************************************************************************/ /* TODO: TAI -> UTC should be time dependant */ #define TAI2UTCi 33 #define TAI2UTCf 33.0 #include "L1b_file.h" #include AsirasData::AsirasData() {privStartEpoch.setDate(2000, 1, 1); privMinSeconds=100000.0; privMaxSeconds=-100.0; privMinCBaselineLatitude=91.0; privMaxCBaselineLatitude=-91.0; privMinCBaselineLongitude=361.0; privMaxCBaselineLongitude=-361.0; privMinCBaselineAltitude=20000000.0; privMaxCBaselineAltitude=-7000.0; privMinDerivedSurfaceElevation=20000000.0; privMaxDerivedSurfaceElevation=-7000.0; } AsirasData::~AsirasData() {privAsirasDataStream.setDevice(0); privAsirasFile.close(); } int AsirasData::open(const QString &fileName) {privAsirasFile.setFileName(fileName); if(!privAsirasFile.open(QIODevice::ReadOnly)) {cerr << "Cannot read from: " << fileName.toStdString() << endl << privAsirasFile.errorString().toStdString() << endl; return(-1); } privAsirasDataStream.setDevice(&privAsirasFile); privAsirasDataStream.setByteOrder(QDataStream::BigEndian); QString string, ds_name; QStringList stringList; // Get Main Product Header for(int i=1; i<=42; i++) {string=privAsirasFile.readLine(); if(string.contains("=")) {stringList=string.split("="); mainProductHeader.insert(stringList.at(0), stringList.at(1)); } } // Get Specific Product Header for(int i=1; i<=33; i++) {string=privAsirasFile.readLine(); if(string.contains("=")) {stringList=string.split("="); specificProductHeader.insert(stringList.at(0), stringList.at(1)); } } // Get Data Set Descriptor for(int j=1; j<=mainProductHeader.value("NUM_DSD").toInt(); j++) {string=privAsirasFile.readLine(); stringList=string.split("="); if(stringList.at(0)=="DS_NAME" && stringList.at(1).contains("ASI_L1B")) {dataSetDescriptor.insert(stringList.at(0), stringList.at(1)); for(int i=2; i<=7; i++) {string=privAsirasFile.readLine(); stringList=string.split("="); dataSetDescriptor.insert(stringList.at(0), stringList.at(1)); } string=privAsirasFile.readLine(); } else for(int i=2; i<=8; i++) string=privAsirasFile.readLine(); } privDataRecords=dataSetDescriptor.value("NUM_DSR").toInt(); privCurrentRecord=0; if(specificProductHeader.value("ASI_OP_MODE").contains("LAM")) privOpMode=LAM; if(specificProductHeader.value("ASI_OP_MODE").contains("LAM-A")) privOpMode=LAMA; if(specificProductHeader.value("ASI_OP_MODE").contains("HAM")) privOpMode=HAM; if(dataSetDescriptor.value("DS_NAME").contains("SAR_W")) privOpMode=LAMA_W; // Resize data vectors days.reserve(echoes()); seconds.reserve(echoes()); instrumentConfig.reserve(echoes()); burstCounter.reserve(echoes()); cBaselineLatitude.reserve(echoes()); cBaselineLongitude.reserve(echoes()); cBaselineAltitude.reserve(echoes()); altitudeRate.reserve(echoes()); xVelocityITRF.reserve(echoes()); yVelocityITRF.reserve(echoes()); zVelocityITRF.reserve(echoes()); xRealAntBeamDir.reserve(echoes()); yRealAntBeamDir.reserve(echoes()); zRealAntBeamDir.reserve(echoes()); xInterferometerBaseline.reserve(echoes()); yInterferometerBaseline.reserve(echoes()); zInterferometerBaseline.reserve(echoes()); measurementConfident.reserve(echoes()); windowDelay.reserve(echoes()); oCOGWidth.reserve(echoes()); retrackerRange.reserve(echoes()); derivedSurfaceElevation.reserve(echoes()); aGCChannel1.reserve(echoes()); aGCChannel2.reserve(echoes()); totalFixedGain1.reserve(echoes()); totalFixedGain2.reserve(echoes()); transmitPower.reserve(echoes()); dopplerRangeCorrection.reserve(echoes()); instrumentRangeCorrectionCh1.reserve(echoes()); instrumentRangeCorrectionCh2.reserve(echoes()); internalPhaseCorrection.reserve(echoes()); externalPhaseCorrection.reserve(echoes()); noisePower.reserve(echoes()); roll.reserve(echoes()); pitch.reserve(echoes()); yaw.reserve(echoes()); heading.reserve(echoes()); stdDevRoll.reserve(echoes()); stdDevPitch.reserve(echoes()); stdDevYaw.reserve(echoes()); powerEcho.resize(echoes()); switch(privOpMode) {case HAM: for(int i=0; i> tempDays >> tempSeconds >> tempMicroseconds; privAsirasDataStream >> tempSpare_01 >> tempSpare_02 >> tempSpare_03; privAsirasDataStream >> tempInstrumentConfig >> tempBurstCounter; privAsirasDataStream >> tempCBaselineLatitude >> tempCBaselineLongitude >> tempCBaselineAltitude; privAsirasDataStream >> tempAltitudeRate; privAsirasDataStream >> tempXVelocityITRF >> tempYVelocityITRF >> tempZVelocityITRF; privAsirasDataStream >> tempXRealAntBeamDir >> tempYRealAntBeamDir >> tempZRealAntBeamDir; privAsirasDataStream >> tempXInterferometerBaseline >> tempYInterferometerBaseline >> tempZInterferometerBaseline; privAsirasDataStream >> tempMeasurementConfident; if((tempSeconds+tempMicroseconds*1e-6-TAI2UTCf)>=0) {days.push_back(tempDays); seconds.push_back(tempSeconds+tempMicroseconds*1e-6-TAI2UTCi); if(tempSeconds+tempMicroseconds*1e-6-TAI2UTCfprivMaxSeconds) privMaxSeconds=tempSeconds+tempMicroseconds*1e-6-TAI2UTCf; } else {days.push_back(tempDays-1); seconds.push_back(86400.0-tempSeconds+tempMicroseconds*1e-6-TAI2UTCi); if(tempSeconds+tempMicroseconds*1e-6-TAI2UTCfprivMaxSeconds) privMaxSeconds=tempSeconds+tempMicroseconds*1e-6-TAI2UTCf; } instrumentConfig.push_back(tempInstrumentConfig); burstCounter.push_back(tempBurstCounter); cBaselineLatitude.push_back(tempCBaselineLatitude*1e-7); privMinCBaselineLatitude=qMin(privMinCBaselineLatitude,tempCBaselineLatitude*1e-7); privMaxCBaselineLatitude=qMax(privMaxCBaselineLatitude,tempCBaselineLatitude*1e-7); cBaselineLongitude.push_back(tempCBaselineLongitude*1e-7); privMinCBaselineLongitude=qMin(privMinCBaselineLongitude, tempCBaselineLongitude*1e-7); privMaxCBaselineLongitude=qMax(privMaxCBaselineLongitude, tempCBaselineLongitude*1e-7); cBaselineAltitude.push_back(tempCBaselineAltitude*1e-3); privMinCBaselineAltitude=qMin(privMinCBaselineAltitude, tempCBaselineAltitude*1e-3); privMaxCBaselineAltitude=qMax(privMaxCBaselineAltitude, tempCBaselineAltitude*1e-3); altitudeRate.push_back(tempAltitudeRate*1e-6); xVelocityITRF.push_back(tempXVelocityITRF*1e-3); yVelocityITRF.push_back(tempYVelocityITRF*1e-3); zVelocityITRF.push_back(tempZVelocityITRF*1e-3); xRealAntBeamDir.push_back(tempXRealAntBeamDir*1e-6); yRealAntBeamDir.push_back(tempYRealAntBeamDir*1e-6); zRealAntBeamDir.push_back(tempZRealAntBeamDir*1e-6); xInterferometerBaseline.push_back(tempXInterferometerBaseline*1e-6); yInterferometerBaseline.push_back(tempYInterferometerBaseline*1e-6); zInterferometerBaseline.push_back(tempZInterferometerBaseline*1e-6); measurementConfident.push_back(tempMeasurementConfident); } // MEASUREMENT_GROUP qint64 tempWindowDelay; qint32 tempSpare_04; qint32 tempOCOGWidth, tempRetrackerRange, tempDerivedSurfaceElevation; qint32 tempAGCChannel1, tempAGCChannel2; qint32 tempTotalFixedGain1, tempTotalFixedGain2; qint32 tempTransmitPower; qint32 tempDopplerRangeCorrection; qint32 tempInstrumentRangeCorrectionCh1, tempInstrumentRangeCorrectionCh2; qint32 tempSpare_05, tempSpare_06; qint32 tempInternalPhaseCorrection, tempExternalPhaseCorrection; qint32 tempNoisePower; qint16 tempRoll, tempPitch, tempYaw; qint16 tempSpare_07; qint32 tempHeading; quint16 tempStdDevRoll, tempStdDevPitch, tempStdDevYaw; for(int i=0; i<20; i++) {privAsirasDataStream >> tempWindowDelay; privAsirasDataStream >> tempSpare_04; privAsirasDataStream >> tempOCOGWidth >> tempRetrackerRange >> tempDerivedSurfaceElevation; privAsirasDataStream >> tempAGCChannel1 >> tempAGCChannel2; privAsirasDataStream >> tempTotalFixedGain1 >> tempTotalFixedGain2; privAsirasDataStream >> tempTransmitPower; privAsirasDataStream >> tempDopplerRangeCorrection; privAsirasDataStream >> tempInstrumentRangeCorrectionCh1 >> tempInstrumentRangeCorrectionCh2; privAsirasDataStream >> tempSpare_05 >> tempSpare_06; privAsirasDataStream >> tempInternalPhaseCorrection >> tempExternalPhaseCorrection; privAsirasDataStream >> tempNoisePower; privAsirasDataStream >> tempRoll >> tempPitch >> tempYaw; privAsirasDataStream >> tempSpare_07; privAsirasDataStream >> tempHeading; privAsirasDataStream >> tempStdDevRoll >> tempStdDevPitch >> tempStdDevYaw; windowDelay.push_back(tempWindowDelay*1e-12); oCOGWidth.push_back(tempOCOGWidth*1e-2); retrackerRange.push_back(tempRetrackerRange*1e-3); derivedSurfaceElevation.push_back(tempDerivedSurfaceElevation*1e-3); if(tempDerivedSurfaceElevation*1e-3-7000.0) privMinDerivedSurfaceElevation=tempDerivedSurfaceElevation*1e-3; if(tempDerivedSurfaceElevation*1e-3>privMaxDerivedSurfaceElevation) privMaxDerivedSurfaceElevation=tempDerivedSurfaceElevation*1e-3; aGCChannel1.push_back(tempAGCChannel1*1e-2); aGCChannel2.push_back(tempAGCChannel2*1e-2); totalFixedGain1.push_back(tempTotalFixedGain1*1e-2); totalFixedGain2.push_back(tempTotalFixedGain2*1e-2); transmitPower.push_back(tempTransmitPower*1e-6); dopplerRangeCorrection.push_back(tempDopplerRangeCorrection*1e-3); instrumentRangeCorrectionCh1.push_back(tempInstrumentRangeCorrectionCh1*1e-3); instrumentRangeCorrectionCh2.push_back(tempInstrumentRangeCorrectionCh2*1e-3); internalPhaseCorrection.push_back(tempInternalPhaseCorrection*1e-6); externalPhaseCorrection.push_back(tempExternalPhaseCorrection*1e-6); noisePower.push_back(tempNoisePower*1e-2); roll.push_back(tempRoll*1e-3); pitch.push_back(tempPitch*1e-3); yaw.push_back(tempYaw*1e-3); heading.push_back(tempHeading*1e-3); stdDevRoll.push_back(tempStdDevRoll*1e-4); stdDevPitch.push_back(tempStdDevPitch*1e-4); stdDevYaw.push_back(tempStdDevYaw*1e-4); } // L1B_CORRECTIONS_GROUP quint8 tempSpare_08; for(int i=0; i<64; i++) privAsirasDataStream >> tempSpare_08; // L1B_AVERAGE_PULSE_WIDTH_GROUP quint8 tempSpare_09; switch(privOpMode) {case HAM: for(int i=0; i<556; i++) privAsirasDataStream >> tempSpare_09; break; case LAM: for(int i=0; i<8236; i++) privAsirasDataStream >> tempSpare_09; break; case LAMA: for(int i=0; i<2092; i++) privAsirasDataStream >> tempSpare_09; break; case LAMA_W: for(int i=0; i<556; i++) privAsirasDataStream >> tempSpare_09; break; } // L1B_MULTILOOKED_WAVEFORM_GROUP quint16 tempPowerEcho; qint32 tempLinearScaleFactorA, tempPowerScaleFactorB; quint16 tempNumberOfMultilookedEchoes; quint16 tempFlags; quint16 tempBeamBehaviourParameters; quint16 tempCoherenceEcho; qint32 tempPhaseDifferenceEcho; for(int i=0; i<20; i++) {switch(privOpMode) {case HAM: for(int j=0; j<256; j++) {privAsirasDataStream >> tempPowerEcho; powerEcho[privCurrentRecord*20+i].push_back(tempPowerEcho); } break; case LAM: for(int j=0; j<4096; j++) {privAsirasDataStream >> tempPowerEcho; powerEcho[privCurrentRecord*20+i].push_back(tempPowerEcho); } break; case LAMA: for(int j=0; j<1024; j++) {privAsirasDataStream >> tempPowerEcho; powerEcho[privCurrentRecord*20+i].push_back(tempPowerEcho); } break; case LAMA_W: for(int j=0; j<256; j++) {privAsirasDataStream >> tempPowerEcho; powerEcho[privCurrentRecord*20+i].push_back(tempPowerEcho); } break; } privAsirasDataStream >> tempLinearScaleFactorA >> tempPowerScaleFactorB; privAsirasDataStream >> tempNumberOfMultilookedEchoes; privAsirasDataStream >> tempFlags; linearScaleFactorA.push_back(tempLinearScaleFactorA); powerScaleFactorB.push_back(tempPowerScaleFactorB); numberOfMultilookedEchoes.push_back(tempNumberOfMultilookedEchoes); flags.push_back(tempFlags); for(int j=0; j<50; j++) {privAsirasDataStream >> tempBeamBehaviourParameters; beamBehaviourParameters[privCurrentRecord*20+i].push_back(tempBeamBehaviourParameters); } if(privOpMode==HAM) {for(int j=0; j<256; j++) {privAsirasDataStream >> tempCoherenceEcho; coherenceEcho[privCurrentRecord*20+i].push_back(tempCoherenceEcho*1e-3); } for(int j=0; j<256; j++) {privAsirasDataStream >> tempPhaseDifferenceEcho; phaseDifferenceEcho[privCurrentRecord*20+i].push_back(tempPhaseDifferenceEcho*1e-6); } } } privCurrentRecord++; return(0); } int AsirasData::getL1bRecords() {for(int i=0; i