File size: 5,925 Bytes
2546160
3c118cd
 
 
 
9b40395
702e044
 
815a086
bc46226
2546160
bc46226
2546160
 
9b40395
 
2546160
58bde6b
815a086
2546160
9b40395
bc46226
 
815a086
 
 
 
 
bc46226
 
815a086
 
bc46226
 
815a086
58bde6b
9b40395
 
 
 
 
 
815a086
 
2546160
9b40395
bc46226
 
 
 
2546160
58bde6b
bc46226
 
9b40395
9f89845
bc46226
 
 
 
9b40395
 
 
bc46226
 
 
 
 
 
 
9b40395
 
bc46226
 
9b40395
 
 
 
 
 
 
bc46226
 
 
58bde6b
bc46226
815a086
bc46226
815a086
bc46226
815a086
bc46226
815a086
 
bc46226
 
 
815a086
bc46226
815a086
 
bc46226
 
 
815a086
 
 
9b40395
815a086
 
 
 
702e044
 
 
 
bc46226
2546160
 
 
bc46226
2546160
 
aba2e4d
bc46226
2546160
 
9b40395
bc46226
 
 
 
 
2546160
bc46226
2546160
bc46226
9b40395
 
 
 
 
2546160
bc46226
2546160
bc46226
815a086
 
 
 
bc46226
 
 
 
9b40395
 
 
 
 
 
 
 
bc46226
 
815a086
3c118cd
2546160
 
bc46226
 
2546160
 
 
3c118cd
bc46226
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
from flask import Flask, render_template, request, send_file, redirect, url_for
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import io
import os

app = Flask(__name__)

# Cache
data_cache = {
    "df1": None,
    "limits": {},
    "cols": [],
    "golden_loaded": False,
    "comparison_file": None
}


def process_golden_file(golden_file):
    """Load Golden data and extract limits."""
    limits_df1 = pd.read_excel(golden_file, nrows=4)
    df1 = pd.read_excel(golden_file)
    df1 = df1.drop([0, 1, 2, 3])
    df1 = df1.apply(pd.to_numeric, errors="coerce")

    limits_df1 = limits_df1.drop([0])
    ignore_cols = ["SITE_NUM", "PART_ID", "PASSFG", "SOFT_BIN", "T_TIME", "TEST_NUM"]
    cols_to_plot = [col for col in limits_df1.columns if "_" in col and col not in ignore_cols]
    limits_df1 = limits_df1.drop(columns=ignore_cols)

    limits = {
        col: {"LL": limits_df1.iloc[0][col], "UL": limits_df1.iloc[1][col]}
        for col in limits_df1.columns
    }

    data_cache.update({
        "df1": df1,
        "limits": limits,
        "cols": cols_to_plot,
        "golden_loaded": True
    })


def process_test_file(test_file):
    """Load Test data."""
    df2 = pd.read_excel(test_file)
    df2 = df2.drop([0, 1, 2, 3])
    df2 = df2.apply(pd.to_numeric, errors="coerce")
    return df2


def generate_comparison_excel(df2):
    """Generate comparison Excel (mean, std, min, max for both)."""
    df1 = data_cache["df1"]
    ignore_cols = ["SITE_NUM", "PART_ID", "PASSFG", "SOFT_BIN", "T_TIME", "TEST_NUM"]
    # cols_to_plot = [col for col in limits_df1.columns if "_" in col and col not in ignore_cols]
    # common_cols = [ignore_cols = ["SITE_NUM", "PART_ID", "PASSFG", "SOFT_BIN", "T_TIME", "TEST_NUM"]
    common_cols = [col for col in df1.columns if "_" in col and col not in ignore_cols]
    # common_cols = [c for c in df1.columns if c in df2.columns]

    summary = []
    for col in common_cols:
        g_mean, t_mean = df1[col].mean(), df2[col].mean()
        g_std, t_std = df1[col].std(), df2[col].std()
        g_min, t_min = df1[col].min(), df2[col].min()
        g_max, t_max = df1[col].max(), df2[col].max()

        diff = t_mean - g_mean if pd.notna(t_mean) and pd.notna(g_mean) else np.nan
        summary.append([col, g_mean, t_mean, diff, g_std, t_std, g_min, t_min, g_max, t_max])

    comp_df = pd.DataFrame(summary, columns=[
        "Parameter", "Golden_Mean", "Test_Mean", "Mean_Diff",
        "Golden_Std", "Test_Std", "Golden_Min", "Test_Min", "Golden_Max", "Test_Max"
    ])

    path = "comparison_result.xlsx"
    comp_df.to_excel(path, index=False)
    data_cache["comparison_file"] = path


def generate_plot(df2, col):
    """Generate and return a plot comparing Golden vs Test."""
    df1, limits = data_cache["df1"], data_cache["limits"]

    plt.figure(figsize=(6, 4))
    x1 = np.arange(1, len(df1[col]) + 1)
    plt.plot(x1, df1[col], 'o-', label="Golden", color='blue')

    if col in df2.columns:
        x2 = np.arange(1, len(df2[col]) + 1)
        plt.plot(x2, df2[col], 's--', label="Test", color='red')

    if col in limits:
        ll, ul = limits[col]["LL"], limits[col]["UL"]
        plt.axhline(ll, color='green', linestyle='--', label='LL')
        plt.axhline(ul, color='orange', linestyle='--', label='UL')

    plt.title(f"{col}")
    plt.xlabel("Part # (sequence)")
    plt.ylabel("Value")
    plt.legend(fontsize='small')
    plt.grid(True, linestyle='--', alpha=0.7)
    plt.xticks(np.arange(1, len(df1[col]) + 1))
    plt.tight_layout()

    buf = io.BytesIO()
    plt.savefig(buf, format='png', bbox_inches='tight')
    buf.seek(0)
    plt.close()
    return buf


@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        # Upload Golden first
        if not data_cache["golden_loaded"]:
            golden_file = request.files.get("golden_file")
            if not golden_file:
                return render_template("index.html", error="Please upload Golden file.")
            try:
                process_golden_file(golden_file)
                return redirect(url_for("index"))
                # return render_template("index.html", message="Golden data loaded successfully!")
            except Exception as e:
                return render_template("index.html", error=f"Error loading Golden file: {e}")

        # Upload Test data next
        else:
            test_file = request.files.get("test_file")
            if not test_file:
                return render_template("index.html", error="Please upload Test data.")
            try:
                df2 = process_test_file(test_file)
                data_cache["df2_temp"] = df2
                generate_comparison_excel(df2)
                return render_template(
                    "plot.html",
                    cols=data_cache["cols"],
                    file_ready=True
                )
            except Exception as e:
                return render_template("index.html", error=f"Error processing Test file: {e}")

    return render_template("index.html", golden_loaded=data_cache["golden_loaded"])


@app.route("/plot_image/<col>")
def plot_image(col):
    df2 = data_cache.get("df2_temp")
    if df2 is None:
        return "No Test data loaded."
    buf = generate_plot(df2, col)
    return send_file(buf, mimetype="image/png")


@app.route("/download_comparison")
def download_comparison():
    """Download comparison Excel file."""
    path = data_cache.get("comparison_file")
    if path and os.path.exists(path):
        return send_file(path, as_attachment=True)
    return "No comparison file available."


@app.route("/reset_golden")
def reset_golden():
    """Reset golden data."""
    data_cache.update({"df1": None, "limits": {}, "cols": [], "golden_loaded": False})
    return redirect(url_for("index"))


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=7860, debug=True)