Main Page   Namespace List   Compound List   File List   Compound Members   File Members  

copy-ocsOptDataWriter.cc

Go to the documentation of this file.
00001 //###################################################################
00002 //
00003 //           Optical Communication Systems Simulator
00004 //
00005 //       Copyright (2001):
00006 //       Optical Fiber Communications Laboratory (OFCL)
00007 //       Computer Science & Electrical Engineering Department (CSEE)
00008 //       University of Maryland Baltimore County (UMBC)
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    } // ## end if(WriteDOPFlag)
00144 
00145 WritePowerMapFlag = ReadInt("WritePowerMap"," ",0,1,
00146                                LOWER_AND_UPPER,OPTIONAL_NO_WARNING,0,&InFile);
00147 
00148  if(WritePowerMapFlag)
00149    {
00150      //24.828e9 = 0.2 nm
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      //PowerMeter = new OptSpectrumAnalyzer(InFileName,Job2,0,Signal);
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 // ComputeEnergyInBitSlot < 0 means don't do it. Otherwise it gives 
00191 // Index of Bit Slot to compute energy in
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     } // end if
00204 
00205 
00206 } // end OptDataWriter
00207 
00208 // ####################################################
00209 
00210 void OptDataWriter::WriteInitialData(void)
00211 {
00212 
00213   if(WriteInitialOptDataFlag)
00214     {
00215        Signal->WriteFileTimePower(Job + "tInOpt.dat");
00216        //Signal->WriteFileFreqPowerdBm(Job + "fInOpt.dat");
00217        Signal->WriteFileFreqPower(Job + "fInOpt.dat",OmitDCFlag);
00218        //Either use WriteFileFreqPower for linear scale output or 
00219        //WriteFileFreqPowerdBm for log scale output
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 } // ## end WriteInitialData
00263 
00264 // ####################################################
00265 
00266 void OptDataWriter::WriteWithinMap(int expt_num, int map_number, 
00267                               double PropagatedLength)
00268 {
00269 
00270   // The first expt_num must be 0 and first map_number must be 0
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            // Signal->WriteAveragePowerdBm(Job + "Power.dat",
00288            //                        PropagatedLength,0);
00289           // The last argument in this function call is not used any more
00290 
00291          }
00292 
00293      if(map_number==0 && WritePowerChannelFlag)
00294          {
00295           Signal->WritePowerdBmChannel(Job + "PowerInChannel.dat",
00296                                        PropagatedLength,1,
00297                                        ChannelArrayIndexForPower-1);
00298 
00299        // The 2nd to last argument in this function call is not used any more
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     } // end if expt_index
00331 
00332 } // ## end OptDataWriter::WriteWithinMap
00333 
00334 // ########################################################
00335 
00336 void OptDataWriter::WriteEndMap(int expt_num, int map_number, 
00337                            double PropagatedLength)
00338 {
00339   // The first expt_num must be 0 and first map_number must be 0
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           //Signal->WriteAveragePowerdBm(Job + "Power.dat",
00357           //                        PropagatedLength,0);
00358           // The last argument in this function call is not used any more
00359           
00360         }
00361       
00362       if(map_number==0 && WritePowerChannelFlag)
00363         {
00364           Signal->WritePowerdBmChannel(Job + "PowerInChannel.dat",
00365                                        PropagatedLength,1,
00366                                        ChannelArrayIndexForPower-1);
00367           
00368         // The 2nd to last argument in this function call is not used any more
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     } // end if expt_index
00399 
00400 
00401 } // ## end WriteEndMap
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         //Signal->WriteFileFreqPowerdBm(Job + "fOutOpt.dat");
00420         Signal->WriteFileFreqPower(Job + "fOutOpt.dat",OmitDCFlag);
00421        //Either use WriteFileFreqPower for linear scale output or 
00422        //WriteFileFreqPowerdBm for log scale output
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 if(ComputeTimeFreqShifts || ComputeTimingJitter || 
00435    ComputeMeanZerosStdDevOnes || ComputeEnergyInBitSlot>=0
00436 )
00437      PEA->ApplyPulseAnalyzer(PropagatedLength);
00438      */
00439 
00440     } // end if 
00441 
00442 
00443  if(WriteLocalFreqFlag)
00444    Signal->WriteLocalFrequency(Job + "LocalFreqOut.dat");
00445 
00446 } // ## end OptDataWriter::WriteEndTransmission
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; // Only write out for 1st MC expt
00461      WriteDOPFlag = 0;
00462 
00463     } 
00464 
00465    Signal->ResetAccumulatedFirstOrderDispersionToZero();
00466 
00467 } // ## end OptDataWriter::TurnOffWriteFlags
00468 
00469 // ############################################################
00470 
00471 
00472 
00473 
00474 

Generated at Mon Jun 9 20:08:09 2003 for OCS by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000