Plotter::Plotter( DataLog* log, float left, float right, float bottom, float top, float tickx, float ticky, Plotter* linked_plotter_x, Plotter* linked_plotter_y ) : default_log(log), colour_wheel(0.6f), rview_default(left,right,bottom,top), rview(rview_default), target(rview), selection(0,0,0,0), track(false), track_x("$i"), track_y(""), trigger_edge(0), trigger("$0"), linked_plotter_x(linked_plotter_x), linked_plotter_y(linked_plotter_y) { if(!log) { throw std::runtime_error("DataLog not specified"); } // Prevent links to ourselves - this could cause infinite recursion. if(linked_plotter_x == this) this->linked_plotter_x = 0; if(linked_plotter_y == this) this->linked_plotter_y = 0; // Handle our own mouse / keyboard events this->handler = this; hover[0] = 0; hover[1] = 0; // Default colour scheme colour_bg = Colour(0.0f, 0.0f, 0.0f); colour_tk = Colour(0.2f, 0.2f, 0.2f); colour_ax = Colour(0.5f, 0.5f, 0.5f); SetTicks(tickx, ticky); // Create shader for drawing simple primitives prog_lines.AddShader( GlSlVertexShader, "attribute vec2 a_position;\n" "uniform vec4 u_color;\n" "uniform vec2 u_scale;\n" "uniform vec2 u_offset;\n" "varying vec4 v_color;\n" "void main() {\n" " gl_Position = vec4(u_scale * (a_position + u_offset),0,1);\n" " v_color = u_color;\n" "}\n" ); prog_lines.AddShader( GlSlFragmentShader, #ifdef HAVE_GLES_2 "precision mediump float;\n" #endif // HAVE_GLES_2 "varying vec4 v_color;\n" "void main() {\n" " gl_FragColor = v_color;\n" "}\n" ); prog_lines.BindPangolinDefaultAttribLocationsAndLink(); prog_text.AddShader( GlSlVertexShader, "attribute vec2 a_position;\n" "attribute vec2 a_texcoord;\n" "uniform vec4 u_color;\n" "uniform vec2 u_scale;\n" "uniform vec2 u_offset;\n" "varying vec4 v_color;\n" "varying vec2 v_texcoord;\n" "void main() {\n" " gl_Position = vec4(u_scale * (a_position + u_offset),0,1);\n" " v_color = u_color;\n" " v_texcoord = a_texcoord;\n" "}\n" ); prog_text.AddShader( GlSlFragmentShader, #ifdef HAVE_GLES_2 "precision mediump float;\n" #endif // HAVE_GLES_2 "varying vec4 v_color;\n" "varying vec2 v_texcoord;\n" "uniform sampler2D u_texture;\n" "void main() {\n" " gl_FragColor = v_color;\n" " gl_FragColor.a *= texture2D(u_texture, v_texcoord).a;\n" "}\n" ); prog_text.BindPangolinDefaultAttribLocationsAndLink(); const size_t RESERVED_SIZE = 100; // Setup default PlotSeries plotseries.reserve(RESERVED_SIZE); for(unsigned int i=0; i< 10; ++i) { std::ostringstream oss; oss << "$" << i; plotseries.push_back( PlotSeries() ); plotseries.back().CreatePlot( "$i", oss.str(), colour_wheel.GetUniqueColour(), i < log->Labels().size() ? log->Labels()[i] : oss.str() ); } // Setup test PlotMarkers plotmarkers.reserve(RESERVED_SIZE); // plotmarkers.push_back( Marker( Marker::Vertical, 10, Marker::GreaterThan, Colour(1,0,0,0.2)) ); // plotmarkers.push_back( Marker( Marker::Horizontal, 1, Marker::LessThan, Colour(0,1,0,0.2)) ); // Setup test implicit plots. plotimplicits.reserve(RESERVED_SIZE); // plotimplicits.push_back( PlotImplicit() ); // plotimplicits.back().CreateInequality("x+y <= 150.0", colour_wheel.GetUniqueColour().WithAlpha(0.2) ); // plotimplicits.push_back( PlotImplicit() ); // plotimplicits.back().CreateInequality("x+2.0*y <= 170.0", colour_wheel.GetUniqueColour().WithAlpha(0.2) ); // plotimplicits.push_back( PlotImplicit() ); // plotimplicits.back().CreateInequality("3.0*y <= 180.0", colour_wheel.GetUniqueColour().WithAlpha(0.2) ); // Setup texture spectogram style plots // ... }
int main(int i_iArg_Count,const char * i_lpszArg_Values[]) { bool bData_valid; char lpszTargetFile[256] = {""}; char lpszOutput_File_Prefix[256] = {""}; char lpszOutput_Filename[256]; char lpszTitle[256]; unsigned int uiIon; bool bData_Valid = false; double dNan = nan(""); char lpszSourceDir[256]; xParse_Command_Line_String(i_iArg_Count,i_lpszArg_Values,"--sourcedir",lpszSourceDir,256,NULL); PARAMETER_SET cPS_Vel; double dPS_Ref_Velocity = dNan; double dPS_Ref_Time = dNan; PARAMETER_SET cPS_Temp; PARAMETER_SET cPS_Log_Tau; PARAMETER_SET cPS_Ion_Temp; PARAMETER_SET cHVF_Log_Tau; PARAMETER_SET cHVF_Ion_Temp; bool bWith_Shell; bool bNo_Title; bool bUse_Sourcedir_Title; bool bLinear_Scale; bool bUse_Ref_Model_Title_In_Filename; char lpszReference_Model_Title[64] = {0}; unsigned int uiSource_File_ID; double * lpdDays = NULL; unsigned int uiDays_Count = 0; unsigned int uiNum_Reference_Spectra = 0; ES::Spectrum * lpcReference_Spectra = NULL; double *lpdReference_Day = NULL; xParse_Command_Line_String(i_iArg_Count,i_lpszArg_Values,"--ref-model-title",lpszReference_Model_Title,64,NULL); bUse_Ref_Model_Title_In_Filename = xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--use-ref-model-title-in-filename"); if (xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--days")) { // printf("Processing days CL\n"); unsigned int uiDays_Data = -1; const char * lpszCursor; for (unsigned int uiI = 1; uiI < i_iArg_Count && uiDays_Data == -1; uiI++) { if (strncmp(i_lpszArg_Values[uiI],"--days=",7) == 0) uiDays_Data = uiI; else if (strcmp(i_lpszArg_Values[uiI],"--days") == 0 && i_lpszArg_Values[uiI + 1][0] == '=') uiDays_Data = uiI + 1; } lpszCursor = i_lpszArg_Values[uiDays_Data]; if (strncmp(i_lpszArg_Values[uiDays_Data],"--days",6) == 0) lpszCursor += 6; if (lpszCursor[0] == 0) { uiDays_Data++; lpszCursor = i_lpszArg_Values[uiDays_Data]; } if (lpszCursor[0] == '=') lpszCursor++; if (lpszCursor[0] == 0) { uiDays_Data++; lpszCursor = i_lpszArg_Values[uiDays_Data]; } unsigned int uiStart_Ref = uiDays_Data; const char * lpszStart_Cursor = lpszCursor; // first count how many items are in the list while (xIsANumber(lpszCursor) && uiDays_Data < i_iArg_Count) { // printf("%s\n",lpszCursor); if (xIsANumber(lpszCursor)) uiDays_Count++; while (xIsANumber(lpszCursor)) { lpszCursor++; } if (lpszCursor[0] == 0) { uiDays_Data++; if (uiDays_Data < i_iArg_Count) { lpszCursor = i_lpszArg_Values[uiDays_Data]; } } if (lpszCursor[0] == ',') lpszCursor++; if (lpszCursor[0] == 0) { uiDays_Data++; if (uiDays_Data < i_iArg_Count) { lpszCursor = i_lpszArg_Values[uiDays_Data]; } } } lpdDays = new double[uiDays_Count]; uiDays_Data = uiStart_Ref; lpszCursor = lpszStart_Cursor; // printf("%s\n",lpszStart_Cursor); uiDays_Count=0; // first count how many items are in the list while (lpszCursor[0] != 0 && xIsANumber(lpszCursor) && uiDays_Data < i_iArg_Count) { // printf("%i: %s\n",uiDays_Count,lpszCursor); if (xIsANumber(lpszCursor)) { lpdDays[uiDays_Count] = atof(lpszCursor); uiDays_Count++; } while (xIsANumber(lpszCursor) && lpszCursor[0] != 0) { lpszCursor++; } if (lpszCursor[0] == ',') lpszCursor++; } // printf("Days count %i\n", uiDays_Count); } else { uiDays_Count = 11; lpdDays = new double[uiDays_Count]; for (unsigned int uiI = 0; uiI < uiDays_Count; uiI++) lpdDays[uiI] = 5.0 + 2.0 * uiI; } if (xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--PS-vel-ref-value")) { dPS_Ref_Velocity = xParse_Command_Line_Dbl(i_iArg_Count,i_lpszArg_Values,"--PS-vel-ref-value",dNan); dPS_Ref_Time = xParse_Command_Line_Dbl(i_iArg_Count,i_lpszArg_Values,"--PS-vel-ref-time",dNan); uiSource_File_ID = xParse_Command_Line_UInt(i_iArg_Count,i_lpszArg_Values,"--PS-vel-ref-file",-1); } Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--PS-vel",-0.3,cPS_Vel); Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--PS-temp",-1.0,cPS_Temp); Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--PS-ion-log-tau",-0.1,cPS_Log_Tau); Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--PS-ion-temp",-0.1,cPS_Ion_Temp); bWith_Shell = xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--HVF-ion-log-tau"); if (bWith_Shell) { Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--HVF-ion-log-tau",-0.1,cHVF_Log_Tau); Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--HVF-ion-temp",-0.1,cHVF_Ion_Temp); } uiIon = xParse_Command_Line_Int(i_iArg_Count,i_lpszArg_Values,"--ion",-1); sprintf(lpszOutput_File_Prefix,"%s/series",lpszSourceDir); bNo_Title = xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--no-plot-title"); bUse_Sourcedir_Title = xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--use-sourcedir-title"); bLinear_Scale = xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--linear-scale"); if (xParse_Command_Line_Exists(i_iArg_Count, i_lpszArg_Values, "--serieslist")) { char lpszSeriesListFilename[128]; char lpszSeriesListDirectory[128]; char lpszTemp[256]; xParse_Command_Line_String(i_iArg_Count,i_lpszArg_Values,"--serieslist",lpszSeriesListFilename,128,""); xParse_Command_Line_String(i_iArg_Count,i_lpszArg_Values,"--serieslist-directory",lpszSeriesListDirectory,128,""); FILE * fileIn = fopen(lpszSeriesListFilename,"rt"); if (fileIn) { char * lpszBuffer = new char [1024]; while (fgets(lpszBuffer,sizeof(char) * 1024, fileIn)) { char * lpszCursor = strchr(lpszBuffer,','); if (lpszBuffer[0] != 0 && lpszCursor) { lpszCursor--; while (lpszCursor[0] == ' ' || lpszCursor[0] == '\t') lpszCursor--; lpszCursor++; lpszCursor[0] = 0; lpszCursor++; while (lpszCursor[0] != 0 && !((lpszCursor[0] >= '0' && lpszCursor[0] <= '9') || lpszCursor[0] == '-' || lpszCursor[0] == '+')) lpszCursor++; SERIESLISTNODE * lpCurr = new SERIESLISTNODE; lpCurr->m_dDay = atof(lpszCursor); lpszCursor = lpszBuffer; while (lpszCursor[0] == ' ' || lpszCursor[0] == '\t') lpszCursor++; if (lpszSeriesListDirectory[0] != 0) sprintf(lpszTemp,"%s/%s",lpszSeriesListDirectory,lpszCursor); else strcpy(lpszTemp,lpszCursor); lpCurr->m_lpszFilename = new char[strlen(lpszTemp) + 1]; strcpy(lpCurr->m_lpszFilename,lpszTemp); uiNum_Reference_Spectra++; if (!lpcSeriesListTail) { lpcSeriesListTail = lpcSeriesListHead = lpCurr; } else { lpcSeriesListTail->m_lpcNext = lpCurr; lpCurr->m_lpcPrev = lpcSeriesListTail; lpcSeriesListTail = lpCurr; } } } } } // printf("Series list processed\n"); if (uiNum_Reference_Spectra > 0) { lpcReference_Spectra = new ES::Spectrum[uiNum_Reference_Spectra]; lpdReference_Day = new double[uiNum_Reference_Spectra]; unsigned int uiCurr_Idx = 0; SERIESLISTNODE * lpCurr = lpcSeriesListHead; while (lpCurr) { lpcReference_Spectra[uiCurr_Idx] = ES::Spectrum::create_from_ascii_file( lpCurr->m_lpszFilename ); lpdReference_Day[uiCurr_Idx] = lpCurr->m_dDay + 20.0; if (lpcReference_Spectra[uiCurr_Idx].size() == 0) printf("File %s seems to be empty!\n",lpCurr->m_lpszFilename); uiCurr_Idx++; lpCurr = lpCurr->m_lpcNext; } } // printf("Series list loaded\n"); // make sure all necessary data is available to generate the spectrum bData_Valid = !isnan(cPS_Vel.dRef25) || (!isnan(dPS_Ref_Velocity) && !isnan(dPS_Ref_Time) && uiSource_File_ID != -1); bData_Valid &= !isnan(cPS_Temp.dRef25) && !isnan(cPS_Log_Tau.dRef25) && !isnan(cPS_Ion_Temp.dRef25); if (bWith_Shell) bData_valid &= !isnan(cHVF_Log_Tau.dRef25) && !isnan(cHVF_Ion_Temp.dRef25); bData_Valid &= (uiIon != -1); const char * lpszElement_ID; switch (uiIon / 100) { case 6: lpszElement_ID = "C"; break; case 8: lpszElement_ID = "O"; break; case 10: case 12: lpszElement_ID = "Mg"; break; case 14: // Si case 16: // S case 18: // Ar case 20: // Ca case 22: // Ti case 23: // V case 24: // Cr case 25: // Mn lpszElement_ID = "Si"; break; case 26: case 27: case 28: lpszElement_ID = "Fe"; break; } if (bData_Valid) { ES::Spectrum cTarget; cTarget = ES::Spectrum::create_from_range_and_step(2500.0, 10000.0, 5.0); char lpszOpacity_File_Ejecta[64], lpszOpacity_File_Shell[64], lpszParameters_File[64]; XDATASET cOpacity_Map_Shell; XDATASET cOpacity_Map_Ejecta; sprintf(lpszOpacity_File_Ejecta,"%s/opacity_map_ejecta.%s.xdataset",lpszSourceDir,lpszElement_ID); sprintf(lpszOpacity_File_Shell,"%s/opacity_map_shell.xdataset",lpszSourceDir,lpszElement_ID); sprintf(lpszParameters_File,"%s.%s.user.parameters.csv",lpszOutput_File_Prefix,lpszSourceDir); if (bWith_Shell) cOpacity_Map_Ejecta.ReadDataFileBin(lpszOpacity_File_Ejecta); cOpacity_Map_Shell.ReadDataFileBin(lpszOpacity_File_Shell); ES::Spectrum * cSpectra = new ES::Spectrum[uiDays_Count]; FILE * fileOutParameters = fopen(lpszParameters_File,"wt"); fprintf(fileOutParameters,"Day, Ion, PS Velocity, PS Temp, PS LGR Scale, PS LGR Temp, HVF LGR Scale, HVF LGR Temp\n"); for (unsigned int uiI = 0; uiI < uiDays_Count; uiI++) { cSpectra[uiI] = cTarget; double dPS_Vel; // printf("%i %f\n",uiI,dDay[uiI]); if (!isnan(dPS_Ref_Velocity) && !isnan(dPS_Ref_Time)) dPS_Vel = Determine_Photosphere(lpszSourceDir, uiSource_File_ID, dPS_Ref_Velocity,dPS_Ref_Time, lpdDays[uiI]); else dPS_Vel = cPS_Vel.Get_Value(lpdDays[uiI]); printf("Day %.2f PS = %.2f\n",lpdDays[uiI],dPS_Vel); double dPS_Temp = cPS_Temp.Get_Value(lpdDays[uiI]); double dPS_Ion_Scale = cPS_Log_Tau.Get_Value(lpdDays[uiI]); double dPS_Ion_Temp = cPS_Ion_Temp.Get_Value(lpdDays[uiI]); double dHVF_Ion_Scale = cHVF_Log_Tau.Get_Value(lpdDays[uiI]); double dHVF_Ion_Temp = cHVF_Ion_Temp.Get_Value(lpdDays[uiI]); CompareFits(cTarget, cOpacity_Map_Ejecta,cOpacity_Map_Shell, uiIon, lpdDays[uiI], dPS_Vel, dPS_Temp, dPS_Ion_Temp, dPS_Ion_Scale, dHVF_Ion_Temp, dHVF_Ion_Scale, cSpectra[uiI]); fprintf(fileOutParameters,"%.0f,%i,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\n",lpdDays[uiI], uiIon, dPS_Vel, dPS_Temp, dPS_Ion_Scale, dPS_Ion_Temp, dHVF_Ion_Scale, dHVF_Ion_Temp); } fclose(fileOutParameters); if (bNo_Title) lpszTitle[0] = 0; else if (bUse_Sourcedir_Title && bUse_Ref_Model_Title_In_Filename) sprintf(lpszTitle,"%s : %s", lpszSourceDir, lpszReference_Model_Title); else if (bUse_Sourcedir_Title) strcpy(lpszTitle,lpszSourceDir); else if (bWith_Shell) sprintf(lpszTitle,"%s: Vps %.1f Tps %.2f tps %.2f Tpsi %.2f thv %.2f Thv %.2f",lpszSourceDir,cPS_Vel.dRef25,cPS_Temp.dRef25,cPS_Log_Tau.dRef25,cPS_Ion_Temp.dRef25,cHVF_Log_Tau.dRef25,cHVF_Ion_Temp.dRef25); else sprintf(lpszTitle,"%s: Vps %.1f Tps %.2f tps %.2f Tpsi %.2f",lpszSourceDir,cPS_Vel.dRef25,cPS_Temp.dRef25,cPS_Log_Tau.dRef25,cPS_Ion_Temp.dRef25); // printf("Plotting\n"); if (bUse_Ref_Model_Title_In_Filename) sprintf(lpszOutput_Filename,"%s.%s.user.%i.%s.full.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon,lpszReference_Model_Title); else sprintf(lpszOutput_Filename,"%s.%s.user.%i.full.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon); PlotSeries(cSpectra, lpdDays, NULL, uiDays_Count, lpszOutput_Filename, cTarget.wl(0), cTarget.wl(cTarget.size() - 1), bLinear_Scale, lpszTitle, -1.0, false, false, -1.0,lpcReference_Spectra,lpdReference_Day, uiNum_Reference_Spectra); if (bUse_Ref_Model_Title_In_Filename) sprintf(lpszOutput_Filename,"%s.%s.user.%i.%s.CaNIR.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon,lpszReference_Model_Title); else sprintf(lpszOutput_Filename,"%s.%s.user.%i.CaNIR.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon); PlotSeries(cSpectra, lpdDays, NULL, uiDays_Count, lpszOutput_Filename, 7000.0, 9000.0, bLinear_Scale, lpszTitle, -1.0, true, true, 8579.0,lpcReference_Spectra,lpdReference_Day, uiNum_Reference_Spectra, 7400.0, 8300.0); if (bUse_Ref_Model_Title_In_Filename) sprintf(lpszOutput_Filename,"%s.%s.user.%i.%s.CaHK.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon,lpszReference_Model_Title); else sprintf(lpszOutput_Filename,"%s.%s.user.%i.CaHK.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon); PlotSeries(cSpectra, lpdDays, NULL, uiDays_Count, lpszOutput_Filename, 3000.0, 5000.0, bLinear_Scale, lpszTitle, -1.0, true, true, 3945.0,lpcReference_Spectra,lpdReference_Day, uiNum_Reference_Spectra, 3500.0, 4300.0); if (bUse_Ref_Model_Title_In_Filename) sprintf(lpszOutput_Filename,"%s.%s.user.%i.%s.Si6355.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon,lpszReference_Model_Title); else sprintf(lpszOutput_Filename,"%s.%s.user.%i.Si6355.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon); PlotSeries(cSpectra, lpdDays, NULL, uiDays_Count, lpszOutput_Filename, 5000.0, 7000.0, bLinear_Scale, lpszTitle, -1.0, true, true, 6355.0,lpcReference_Spectra,lpdReference_Day, uiNum_Reference_Spectra, 5500.0, 6500.0); for (unsigned int uiI = 0; uiI < uiDays_Count; uiI++) { sprintf(lpszOutput_Filename,"%s.%s.user.%i.day%.2f.csv",lpszOutput_File_Prefix,lpszSourceDir,uiIon,lpdDays[uiI]); FILE * fileOut = fopen(lpszOutput_Filename,"wt"); for (unsigned int uiJ = 0; uiJ < cSpectra[uiI].size(); uiJ++) fprintf(fileOut, "%f %f %f\n",cSpectra[uiI].wl(uiJ), cSpectra[uiI].flux(uiJ), cSpectra[uiI].flux_error(uiJ)); fclose(fileOut); } printf("Done\n"); } return 0; }
void Plotter::Special(View&, InputSpecial inType, float x, float y, float p1, float p2, float /*p3*/, float /*p4*/, int button_state) { if(inType == InputSpecialScroll) { const float d[2] = {p1,-p2}; const float is[2] = {rview.x.Size(),rview.y.Size() }; const float df[2] = {is[0]*d[0]/(float)v.w, is[1]*d[1]/(float)v.h}; ScrollView(-df[0], -df[1]); } else if(inType == InputSpecialZoom) { float scalex = 1.0; float scaley = 1.0; #ifdef _OSX_ if (button_state & KeyModifierCmd) { #else if (button_state & KeyModifierCtrl) { #endif scalex = 1-p1; }else{ scaley = 1-p1; } const float c[2] = { track || trigger_edge ? last_track_val[0] : hover[0], hover[1] }; ScaleView(scalex, scaley, c[0], c[1]); } // Update hover status (after potential resizing) ScreenToPlot( (int)x, (int)y, hover[0], hover[1]); } void Plotter::AddSeries(const std::string& x_expr, const std::string& y_expr, DrawingMode drawing_mode, Colour colour, const std::string& title, DataLog *log) { if( !std::isfinite(colour.r) ) { colour = colour_wheel.GetUniqueColour(); } plotseries.push_back( PlotSeries() ); plotseries.back().CreatePlot(x_expr, y_expr, colour, (title == "$y") ? y_expr : title); plotseries.back().log = log; plotseries.back().drawing_mode = (GLenum)drawing_mode; } void Plotter::ClearSeries() { plotseries.clear(); } Marker& Plotter::AddMarker(Marker::Direction d, float value, Marker::Equality leg, Colour c ) { return AddMarker(Marker(d,value,leg,c)); } Marker& Plotter::AddMarker( const Marker& marker ) { plotmarkers.push_back( marker ); return plotmarkers.back(); }