00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 # include "ocsOptDataWriter.hh"
00013
00014 extern ofstream LogFile;
00015
00016
00017
00018 OptDataWriter::OptDataWriter(string InFileName, string InDir2,string Job2,
00019 OptSignal * Signal2)
00020 {
00021
00022 Job = Job2;
00023 Signal = Signal2;
00024
00025 ifstream InFile(InFileName.c_str(),ios::in);
00026
00027 if (!InFile)
00028 {
00029 cerr << "Error: Input file "<< InFileName
00030 << " could not be opened."<< endl;
00031 exit(1);
00032 }
00033
00034 LogFileSeparator();
00035
00036 LogFile << "OptDataWriter Constructor" << endl << endl;
00037
00038
00039 WriteComplexFieldsFlag = ReadInt("WriteComplexFields"," ",0,1,
00040 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00041
00042 WritePowerChannelFlag = ReadInt("WritePowerChannel"," ",0,1,
00043 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00044
00045
00046 ChannelArrayIndexForPower = ReadInt("ChannelArrayIndexForPower",
00047 " ",1,-1, LOWER_ONLY,OPTIONAL_NO_WARNING,1,&InFile);
00048
00049
00050 WriteDistanceTimePowerFlag = ReadInt("WriteDistanceTimePower"," ",0,1,
00051 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00052
00053
00054 WriteDistanceTimePowerWithinMapFlag =
00055 ReadInt("WriteDistanceTimePowerWithinMap",
00056 " ",0,1,
00057 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00058
00059
00060
00061 WriteDistanceTimePowerPhaseFlag = ReadInt("WriteDistanceTimePowerPhase",
00062 " ",0,1,
00063 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00064
00065
00066 WriteDistanceTimePowerPhaseWithinMapFlag =
00067 ReadInt("WriteDistanceTimePowerPhaseWithinMap"," ",0,1,
00068 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00069
00070
00071 if(WriteDistanceTimePowerPhaseWithinMapFlag)
00072 {
00073 WriteDistanceTimePowerWithinMapFlag = 0;
00074 }
00075
00076
00077 if(WriteDistanceTimePowerPhaseFlag)
00078 WriteDistanceTimePowerFlag = 0;
00079
00080
00081
00082
00083 TimeIndexIncrement = ReadInt("TimeIndexIncrementForDistanceTime"," ",1,-1,
00084 LOWER_ONLY,OPTIONAL_NO_WARNING,1,&InFile);
00085
00086 LogFile << "TimeIndexIncrement for DTP = " << TimeIndexIncrement << endl;
00087
00088
00089 WriteInitialOptDataFlag = ReadInt("WriteInitialOptData"," ",0,1,
00090 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00091
00092
00093 WriteFinalOptDataFlag = ReadInt("WriteFinalOptData"," ",0,1,
00094 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00095
00096 OmitDCFlag = !(ReadInt("KeepDCFlag"," ",0,1,
00097 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,1,&InFile));
00098
00099
00100 WritePulseWidthFlag = ReadInt("WritePulseWidth"," ",0,1,
00101 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00102
00103
00104 WriteAverageChirpFlag = ReadInt("WriteAverageChirp"," ",0,1,
00105 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00106
00107 WriteLocalFreqFlag = ReadInt("WriteLocalFreq"," ",0,1,
00108 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00109
00110
00111 WriteAccDispFlag = ReadInt("WriteAccDisp"," ",0,1,
00112 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00113
00114 OutputStepSizesFlag = ReadInt("OutputStepSizesFlag"," ",0,1,
00115 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00116
00117 WritePulseWidthInFiberFlag = ReadInt("WritePulseWidthInFiberFlag"," ",0,1,
00118 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,
00119 0,&InFile);
00120
00121 WriteDOPFlag = bool(ReadInt("WriteDOPFlag"," ",0,1,
00122 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,
00123 0,&InFile));
00124
00125
00126 Signal->OpenDegreeOfPolarizationFile(Job + "DOP.dat",WriteDOPFlag);
00127
00128 if(WriteDOPFlag)
00129 {
00130
00131 double AbsMinFreqDOP = ReadDouble("AbsMinFreqDOP","Hz",0,-1,
00132 LOWER_ONLY,OPTIONAL_NO_WARNING,&InFile);
00133
00134 double AbsMaxFreqDOP = ReadDouble("AbsMaxFreqDOP","Hz",0,-1,
00135 LOWER_ONLY,OPTIONAL_NO_WARNING,&InFile);
00136
00137 RelMinFreqDOP = AbsMinFreqDOP - Signal->GetCenterFreq();
00138 RelMaxFreqDOP = AbsMaxFreqDOP - Signal->GetCenterFreq();
00139
00140 LogFile << "[RelMinFreqDOP,RelMaxFreqDOP] [GHz] = ["
00141 << 1e-9*RelMinFreqDOP << "," << 1e-9*RelMaxFreqDOP << "]" << endl;
00142
00143 }
00144
00145 WritePowerMapFlag = ReadInt("WritePowerMap"," ",0,1,
00146 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00147
00148 if(WritePowerMapFlag)
00149 {
00150
00151
00152 double PowerMeterResolutionBandWidthHz =
00153 ReadDouble("ResolutionBandWidthHz"," ",0,-1,
00154 LOWER_ONLY,OPTIONAL_WARNING,24.828e9,&InFile);
00155
00156 LogFile << "PowerMeterResolutionBandWidthHz = "
00157 << PowerMeterResolutionBandWidthHz << endl;
00158
00159
00160 double SuperGaussExponent = ReadDouble("SuperGaussExponent"," ",0,-1,
00161 LOWER_ONLY,OPTIONAL_WARNING,2,&InFile);
00162
00163 PowerMeter = new OptSpectrumAnalyzer(Signal,
00164 PowerMeterResolutionBandWidthHz,1,SuperGaussExponent);
00165
00166
00167 PowerMeter->SetJob(Job);
00168
00169
00170
00171 }
00172
00173 Signal->SetWriteAccumulatedFirstOrderDispersionFlag(WriteAccDispFlag);
00174
00175 Signal->OpenAccumulatedFirstOrderDispersionFile(Job + "AccDisp.dat");
00176 Signal->OpenAveragePulseWidthFile(Job +"PulseWidth.dat",WritePulseWidthFlag);
00177
00178 ComputeTimeFreqShifts = ReadInt("ComputeTimeFreqShifts"," ",0,1,
00179 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00180
00181 ComputeTimingJitter = ReadInt("ComputeTimingJitter"," ",0,1,
00182 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00183
00184 ComputeMeanZerosStdDevOnes = ReadInt("ComputeMeanZerosStdDevOnes"," ",0,1,
00185 LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00186
00187 ComputeEnergyInBitSlot = ReadInt("ComputeEnergyInBitSlot"," ",-1,-2,
00188 LOWER_ONLY,OPTIONAL_NO_WARNING,-1,&InFile);
00189
00190
00191
00192
00193
00194 if(ComputeTimeFreqShifts || ComputeTimingJitter ||
00195 ComputeMeanZerosStdDevOnes|| ComputeEnergyInBitSlot >=0)
00196 {
00197
00198 PEA = new PulseEvolutionAnalyzer(Signal,InDir2,Job,
00199 ComputeTimeFreqShifts,
00200 ComputeTimingJitter,
00201 ComputeMeanZerosStdDevOnes,
00202 ComputeEnergyInBitSlot);
00203 }
00204
00205
00206 }
00207
00208
00209
00210 void OptDataWriter::WriteInitialData(void)
00211 {
00212
00213 if(WriteInitialOptDataFlag)
00214 {
00215 Signal->WriteFileTimePower(Job + "tInOpt.dat");
00216
00217 Signal->WriteFileFreqPower(Job + "fInOpt.dat",OmitDCFlag);
00218
00219
00220 }
00221
00222 if(WritePowerMapFlag)
00223 PowerMeter->RunPowerMeter(0.0);
00224
00225 if(WriteDistanceTimePowerPhaseFlag)
00226 {
00227 Signal->WriteDistTimePowerPhase(Job + "DTPP.dat",
00228 TimeIndexIncrement,0.0,0);
00229
00230 NumSlicesZ = 1;
00231 }
00232
00233
00234 if(WriteDistanceTimePowerFlag)
00235 {
00236 Signal->WriteDistTimePower(Job + "DTP.dat",
00237 TimeIndexIncrement,0.0,0);
00238
00239 NumSlicesZ = 1;
00240 }
00241
00242
00243 if(WritePowerChannelFlag)
00244 Signal->WritePowerdBmChannel(Job + "PowerInChannel.dat",
00245 0.0,0,ChannelArrayIndexForPower-1);
00246
00247
00248 if(WriteDOPFlag)
00249 Signal->WriteDegreeOfPolarization(0.0,RelMinFreqDOP,RelMaxFreqDOP);
00250
00251 if(WriteAccDispFlag)
00252 Signal->WriteAccumulatedFirstOrderDispersion(0.0);
00253
00254 if(ComputeTimeFreqShifts || ComputeTimingJitter ||
00255 ComputeMeanZerosStdDevOnes || ComputeEnergyInBitSlot>=0)
00256 PEA->ApplyPulseAnalyzer(0.0);
00257
00258 if(WriteLocalFreqFlag)
00259 Signal->WriteLocalFrequency(Job + "LocalFreqIn.dat");
00260
00261
00262 }
00263
00264
00265
00266 void OptDataWriter::WriteWithinMap(int expt_num, int map_number,
00267 double PropagatedLength)
00268 {
00269
00270
00271
00272 if(expt_num == 0)
00273 {
00274 if(WriteAccDispFlag)
00275 Signal->WriteAccumulatedFirstOrderDispersion(PropagatedLength);
00276
00277 if(WritePulseWidthFlag)
00278 Signal->WriteAveragePulseWidth(PropagatedLength,
00279 int(WritePulseWidthFlag));
00280
00281
00282 if(WritePowerMapFlag)
00283 PowerMeter->RunPowerMeter(PropagatedLength);
00284
00285 if(map_number==0 && WritePowerFlag)
00286 {
00287
00288
00289
00290
00291 }
00292
00293 if(map_number==0 && WritePowerChannelFlag)
00294 {
00295 Signal->WritePowerdBmChannel(Job + "PowerInChannel.dat",
00296 PropagatedLength,1,
00297 ChannelArrayIndexForPower-1);
00298
00299
00300 }
00301
00302 if(WriteDistanceTimePowerWithinMapFlag && WriteDistanceTimePowerFlag)
00303 {
00304 Signal->WriteDistTimePower(Job + "DTP.dat",
00305 TimeIndexIncrement,
00306 PropagatedLength,1);
00307 NumSlicesZ++;
00308
00309 }
00310
00311 if(WriteDistanceTimePowerPhaseWithinMapFlag &&
00312 WriteDistanceTimePowerPhaseFlag)
00313 {
00314 Signal->WriteDistTimePowerPhase(Job + "DTPP.dat",
00315 TimeIndexIncrement,
00316 PropagatedLength,1);
00317 NumSlicesZ++;
00318
00319 }
00320
00321
00322 if(WriteDOPFlag)
00323 Signal->WriteDegreeOfPolarization(PropagatedLength,
00324 RelMinFreqDOP,RelMaxFreqDOP);
00325
00326 if(ComputeTimeFreqShifts || ComputeTimingJitter||
00327 ComputeMeanZerosStdDevOnes || ComputeEnergyInBitSlot>=0)
00328 PEA->ApplyPulseAnalyzer(PropagatedLength);
00329
00330 }
00331
00332 }
00333
00334
00335
00336 void OptDataWriter::WriteEndMap(int expt_num, int map_number,
00337 double PropagatedLength)
00338 {
00339
00340
00341 if(expt_num == 0)
00342 {
00343 if(WriteAccDispFlag)
00344 Signal->WriteAccumulatedFirstOrderDispersion(PropagatedLength);
00345
00346 if(WritePulseWidthFlag)
00347 Signal->WriteAveragePulseWidth(PropagatedLength,
00348 int(WritePulseWidthFlag));
00349
00350
00351 if(WritePowerMapFlag)
00352 PowerMeter->RunPowerMeter(PropagatedLength);
00353
00354 if(map_number==0 && WritePowerFlag)
00355 {
00356
00357
00358
00359
00360 }
00361
00362 if(map_number==0 && WritePowerChannelFlag)
00363 {
00364 Signal->WritePowerdBmChannel(Job + "PowerInChannel.dat",
00365 PropagatedLength,1,
00366 ChannelArrayIndexForPower-1);
00367
00368
00369 }
00370
00371 if(WriteDistanceTimePowerFlag)
00372 {
00373 Signal->WriteDistTimePower(Job + "DTP.dat",
00374 TimeIndexIncrement,
00375 PropagatedLength,1);
00376 NumSlicesZ++;
00377
00378 }
00379
00380 if(WriteDistanceTimePowerPhaseFlag)
00381 {
00382 Signal->WriteDistTimePowerPhase(Job + "DTPP.dat",
00383 TimeIndexIncrement,
00384 PropagatedLength,1);
00385 NumSlicesZ++;
00386
00387 }
00388
00389 if(WriteDOPFlag)
00390 Signal->WriteDegreeOfPolarization(PropagatedLength,
00391 RelMinFreqDOP,RelMaxFreqDOP);
00392
00393
00394 if(ComputeTimeFreqShifts || ComputeTimingJitter ||
00395 ComputeMeanZerosStdDevOnes || ComputeEnergyInBitSlot>=0)
00396 PEA->ApplyPulseAnalyzer(PropagatedLength);
00397
00398 }
00399
00400
00401 }
00402
00403
00404
00405 void OptDataWriter::WriteEndTransmission(int expt_num,int map_num,
00406 double PropagatedLength)
00407 {
00408
00409
00410 WriteEndMap(expt_num,map_num,PropagatedLength);
00411 TurnOffWriteFlags(expt_num);
00412
00413 if(expt_num == 0)
00414 {
00415
00416 if(WriteFinalOptDataFlag)
00417 {
00418 Signal->WriteFileTimePower(Job + "tOutOpt.dat");
00419
00420 Signal->WriteFileFreqPower(Job + "fOutOpt.dat",OmitDCFlag);
00421
00422
00423
00424 if(WriteDOPFlag)
00425 Signal->WriteDegreeOfPolarization(PropagatedLength,
00426 RelMinFreqDOP,RelMaxFreqDOP);
00427
00428 if(WriteComplexFieldsFlag)
00429 Signal->WriteComplexFields(Job + "tComplexFields.dat",0);
00430
00431 }
00432
00433
00434
00435
00436
00437
00438
00439
00440 }
00441
00442
00443 if(WriteLocalFreqFlag)
00444 Signal->WriteLocalFrequency(Job + "LocalFreqOut.dat");
00445
00446 }
00447
00448
00449
00450 void OptDataWriter::TurnOffWriteFlags(int expt_num)
00451 {
00452
00453 if(expt_num == 0)
00454 {
00455 Signal->CloseAccumulatedFirstOrderDispersionFile();
00456 Signal->SetWriteAccumulatedFirstOrderDispersionFlag(0);
00457 Signal->CloseAveragePulseWidthFile(WritePulseWidthFlag);
00458 Signal->CloseAveragePulseWidthFile(WriteDOPFlag);
00459
00460 WritePulseWidthFlag = 0;
00461 WriteDOPFlag = 0;
00462
00463 }
00464
00465 Signal->ResetAccumulatedFirstOrderDispersionToZero();
00466
00467 }
00468
00469
00470
00471
00472
00473
00474