Raporlama ve Dışa Aktarım
Bu bölüm, Mikrofab ölçüm ve analiz yazılımının ürettiği rapor ve dışa aktarım (export) çıktılarının tamamını kapsar: bir ölçümün nasıl izlenebilir, makine-okunur ve kurcalama-belirtili (tamper-evident) bir kayda dönüştüğünü, bu kayıttan hangi sunum biçimlerinin (HTML/PDF) türetildiğini, hangi tablo biçimlerinin (CSV/TXT/XLSX/JSON) yazıldığını ve dosyaların nasıl adlandırıldığını ayrıntılarıyla anlatır.

Bir ölçüm yaptınız ve ekranda güzel bir grafik gördünüz — peki bu sonuç yarın, bir ay sonra ya da başka bir bilgisayarda da güvenilir bir kanıt olarak durabilir mi? Raporlama tam olarak bunu sağlar: ölçümü, kim/ne/ne zaman/hangi cihazla bilgisini içeren, değiştirilirse belli olan kalıcı bir resmî tutanağa dönüştürür. Dışa aktarım ise bu tutanağı başkalarının açıp kullanabileceği biçimlere (CSV, Excel, PDF, JSON) çevirir.
- Neden yapılır: sonucun izlenebilir, paylaşılabilir ve arşivlenebilir olması için — "ekranda gördüm" yeterli değildir, kanıt gerekir.
- Ne öğretir / ne ölçer: bir ölçümün hangi dosyalara döküldüğünü, her dosyanın ne taşıdığını ve hangisinin "resmî kayıt" sayıldığını.
- Nerede kullanılır: laboratuvar defteri, kalite kontrol, müşteriye teslim, makaleye/rapora ek ve uzun süreli arşiv.
1. Genel Bakış: Üç Rapor Yolu
Yazılım, üç ayrı yerden rapor/çıktı üretir. Hepsi aynı disiplini (künye + sha256 bütünlük + "eksik != sıfır" + belirlenimci çıktı) paylaşır ama farklı amaçlara hizmet eder.
| Rapor yolu | Nerede üretilir | Tetikleyici | Kanonik çıktı | Sunum |
|---|---|---|---|---|
| Ölçüm raporu | Ölçüm bittiğinde otomatik | Her kayıt (DataWriter.save) | *_report.json + *_report.csv | (İsteğe bağlı) "Rapor oluştur" → HTML + PDF |
| Analiz raporu | Analiz çalışma alanı | "Dışa Aktar" menüsü | report_json | report_pdf (HTML → Qt PDF) |
| Birleştirme raporu | Veri ve Raporlar workspace | "Raporu oluştur" düğmesi | *_rapor.json | HTML + PDF (+ CSV) |
Mimari olarak akış şudur:
+- write_json (kanonik, makine-okunur, checksum kaynağı)
rapor sözlüğü ---------+- write_csv (tablo) -- VERİ biçimi
(build_report / compose)
+- build_report_html (kaçışlı/escaped) -- SUNUM (veriden türetilir)
PDF: Qt QTextDocument
Rapor motoru bu deponun içinde, app/reporting/ altında yaşar; paylaşılan harici bir reporting paketi yoktur. Çekirdek dosyalar:
app/reporting/report_model.py— kanonik ölçüm raporu modeli + JSON/CSV yazıcılar.app/reporting/report_builder.py— saf HTML üretici (build_report_html).app/reporting/analysis_report.py— analiz raporu (künye + payload, aynı mühür disiplini).app/reporting/report_compose.py— birden çok kaynağı birleştiren Rapor Oluşturucu motoru.app/reporting/report_index.py— üretilmiş raporları tarayıp listeleyen indeks (DB'siz).app/storage/data_writer.py— ölçüm sırasında/sonunda ham + rapor dosyalarını yazan katman.app/gui/analyze/exporters.py— Analiz çalışma alanı dışa aktarım yazıcıları.
2. Ölçüm Raporu (Otomatik, Her Kayıtta)
Bu, hiç düğmeye basmadan elde ettiğiniz "varsayılan" çıktıdır: her ölçüm bittiğinde yazılım otomatik olarak o koşuya ait bir klasör açar ve hem ham veriyi hem de resmî kaydı diske yazar. Bir deney sırasında defterinize anında not düşmeniz gibi — siz ekstra bir şey yapmadan her koşu izlenebilir bir kayda dönüşür.
- Neden yapılır: hiçbir ölçüm kaybolmasın; her koşu kendiliğinden, tarih-saatli ve benzersiz bir klasöre düşsün diye.
- Ne öğretir / ne ölçer: bir koşunun diske tam olarak hangi dosyalar olarak (CSV, TXT, XLSX, kanonik JSON...) yazıldığını.
- Nerede kullanılır: her gün, her ölçümde — bu sizin temel veri arşivinizdir; diğer rapor yolları bunun üstüne kurulur.
Bir ölçüm tamamlandığında DataWriter.save(...) çağrılır ve tek koşu için tüm dosyalar o koşuya ait alt klasöre yazılır. Bu, yazılımın "varsayılan" rapor üreticisidir: kullanıcı ekstra bir düğmeye basmadan, her ölçüm izlenebilir bir kayıt olarak diske düşer.

2.1 Koşu klasörü ve dosya adlandırma
Her ölçüm koşusu, çıktı klasörü altında kendi alt klasörüne yazılır. Klasör adı run_folder_name(...) ile üretilir:
<çıktı_klasörü>/YYYY-MM-DD-<Gün>-<Tür>-<HHMMSS>/
örnek: measurements/2026-06-12-Wed-PV-103045/
| Parça | Açıklama | Örnek |
|---|---|---|
YYYY-MM-DD | Koşu tarihi | 2026-06-12 |
<Gün> | 3 harfli gün kısaltması, arayüz diline göre (OS yereli değil) | Wed / Çar |
<Tür> | Ölçüm ailesi kısaltması (cihaz-ailesinden) | TFT / Thin / PV / Gen |
<HHMMSS> | Koşu saati (her koşuyu benzersiz yapar) | 103045 |
HHMMSS her koşuyu benzersiz yaptığı için iki makinede aynı klasör eş zamanlı yazılmaz; bu, OneDrive'ın PC-adlı çatışma kopyası (..._IK4ULCE-7 gibi) üretmesini engeller. Klasör adına PC adı eklenmez.Klasör içindeki dosyaların temel adı (base_name) şudur:
<önek>_<TFT>_<MOD>_<YYYYMMDD_HHMMSS>_<sonek>
Önek (filename_prefix) ve sonek (filename_suffix) boş ise atlanır; yasak dosya karakterleri (<>:"/\|?* ve kontrol karakterleri) sanitize_token ile temizlenir.
2.2 Yazılan dosyalar
DataWriter.save varsayılan olarak şu biçimleri yazar (export_formats ile ayarlanır; öntanımlı ("csv", "txt", "xlsx") + her zaman rapor + metadata):
| Dosya | Biçim | Ayraç / kodlama | İçerik |
|---|---|---|---|
<base>.csv | Ham veri tablosu | virgül, UTF-8 | CSV_COLUMNS (13 sütun, ham noktalar) |
<base>.txt | Ham veri tablosu | sekme (tab), UTF-8 | Aynı sütunlar, sekme ayraçlı |
<base>.xlsx | Excel çalışma kitabı | openpyxl | "measurement" sayfası + "Özet" sayfası |
<base>_metadata.json | Serbest metadata | UTF-8, girintili | Cihaz kimliği, parametreler, özet, sayım |
<base>_report.json | Kanonik rapor | UTF-8, sıralanmış anahtar | Künye + kolonlar + satırlar + sha256 mühür |
<base>_report.csv | Kanonik tablo | virgül, UTF-8 + BOM | Aile kolonları, nokta-ondalık |
<base>.h5 | (İsteğe bağlı) HDF5 | h5py | İkili bilimsel format; mühür korunur |
<base>_partial.csv | Crash-safe ara dosya | virgül, UTF-8 | Koşu sırasında; başarıyla bitince silinir |
Ham veri CSV/TXT/XLSX şu 13 sütunu (CSV_COLUMNS) taşır:
timestamp, measurement_mode, tft_id, sweep_direction, step_index,
vds_set, vgs_set, vds_measured, vgs_measured, ids, igs, compliance_hit, elapsed_s
*_partial.csv'ye eklenir ve diske flush edilir. Uygulama çökerse veya güç kesilirse o ana kadarki veri korunur. Ölçüm başarıyla bitip nihai dosyalar yazılınca partial dosya silinir; aksi hâlde diskte kalır ve daha sonra read_points_csv ile geri yüklenebilir.2.3 Kanonik rapor (*_report.json) — Künye / İzlenebilirlik
Kanonik rapor (*_report.json), bir ölçümün "tek doğru kopyası" sayılan makine-okunur dosyasıdır; ekranda gördüğünüz tüm sayılar buradan türetilir. Künye ise bu dosyanın başındaki kimlik kartıdır: bir ilaç kutusunun üstündeki üretim bilgisi gibi hangi cihaz, hangi sürüm, hangi numune, ne zaman sorularını yanıtlar.
- Neden yapılır: sonuç ile onun kökeni (cihaz/sürüm/zaman/numune) ayrılmaz biçimde birlikte saklansın diye.
- Ne öğretir / ne ölçer: bir ölçümün nereden geldiğini; bilinmeyen alanların uydurulmayıp
nullbırakıldığını (dürüstlük kuralı). - Nerede kullanılır: akredite/izlenebilir laboratuvar kayıtları, denetim ve "bu sayı nereden çıktı?" sorusunun yanıtı.
Kanonik rapor, report_model.build_report(...) ile üretilir ve üç-seviyeli izlenebilirlik künyesini (künye = traceability header) taşır. Aşağıdaki tablo, raporun üst düzeyindeki alanları ve kaynağını gösterir.
| Alan | Açıklama | Kaynak / kural |
|---|---|---|
schema_version | Şema sürümü | Sabit "1.0" |
report_id | Benzersiz rapor kimliği | uuid4().hex |
report_revision | Revizyon no | Revizyonda artar; raporlar sessizce düzenlenmez |
level | Rapor seviyesi | "base" / "customer" / "accredited" (öntanımlı customer) |
status | Koşu durumu | "complete" / "partial" — yarıda kesilen koşu gizlenmez |
created_at | Üretim UTC (ms) | ISO-8601, ...Z; çağırandan gelir (belirlenimcilik) |
created_at_local | Operatör yerel saati | context.started_at (yalnız gösterim) |
app_id / app_version | Yazılım kimliği/sürümü | Sabit "tft-measurement" + __version__ |
recipe | {name, version} | context.mode + yazılım sürümü |
station | {id, serial} | VISA kaynağı + cihaz IDN (seri no PII değildir) |
calibration | {status, cert_no, valid_until} | Şu an stub (status:"unknown"); akredite için PLANLANAN |
sample | {id, lot, wafer} | tft_id; lot/wafer şu an null |
operator | Operatör | Uygulamada alan yok → uydurulmaz, null |
environment | Açık-hava ortam künyesi | Open-Meteo anlık değeri; outdoor_* etiketli |
simulated | Mock/gerçek bayrağı | Cihaz IDN'inde "MOCK"/"SIM" → true; bilinmiyorsa null |
null olarak yazılır (ör. operator). simulated bayrağı, IDN yoksa null kalır — rapor hiçbir zaman gerçek bir ölçüm olduğunu iddia etmez. Bu, akredite laboratuvar izlenebilirliğinin temelidir.environment bloğu açık-hava (Open-Meteo) göstergesidir; cihazı asıl etkileyen laboratuvar iç-ortam koşulu DEĞİLDİR. Bu nedenle anahtarlar açıkça outdoor_temp_c, outdoor_humidity_pct, outdoor_cloud_cover_pct, outdoor_condition ve kaynak open-meteo ile etiketlenir. Veri yoksa tüm alanlar null.2.4 Kolon aileleri — ölçüme göre doğru şema
Her ölçüm türü farklı büyüklükler üretir: bir transistör için kapı/akaç gerilimleri anlamlıyken, bir güneş hücresi için güç (W) anlamlıdır. Kolon aileleri, raporun tablosunu otomatik olarak o ölçüme uygun sütunlarla doldurur — her işe doğru aletin geldiği bir takım çantası gibi, böylece güneş hücresi raporunda gereksiz "Vgs hep 0" sütunları görmezsiniz.
- Neden yapılır: her ölçüm ailesi yalnızca kendi anlamlı sütunlarını taşısın, yanıltıcı/boş kolonlar oluşmasın diye.
- Ne öğretir / ne ölçer: hangi ölçüm modunun hangi sütunları (ve türetilmiş büyüklükleri, ör. PV gücü P, direnç R) ürettiğini.
- Nerede kullanılır: farklı cihaz/ölçüm türlerini aynı yazılımla raporlarken doğru ve okunur tablolar elde etmede.
Önemli bir tasarım kararı: rapor tablosunun kolonları ölçüm ailesine göre seçilir. Eski sürümlerde tek sabit şema TFT-şekilliydi (Vds/Vgs/Ids/Igs); bir güneş hücresi raporu bu yüzden "transistör raporu" gibi görünür, Vgs/Igs hep 0 çıkardı. Artık her aile kendi kolonlarını seçer; tüm yazıcılar (JSON/CSV/HDF5) report["columns"]'u kullandığından otomatik olarak doğru şema biner.
| Ölçüm modu | Aile | Kolonlar (birim) |
|---|---|---|
| TRANSFER, IV, PULSED_IV, BIAS_STRESS… | tft | vds_set(V), vgs_set(V), vds_measured(V), vgs_measured(V), ids(A), igs(A) |
| DIODE, SCHOTTKY, T_IV, KELVIN, PROBE_IV | two_terminal | v_set(V), v_measured(V), i(A) |
| PV_JV, PV_DARK_JV, PV_HYST, PV_MPPT… | pv | v_set(V), v_measured(V), i(A), p(W) |
| FOUR_POINT, VDP | four_probe | i(A), v_measured(V) |
| ENDURANCE | endurance | cycle, state, v_read(V), v_measured(V), i_read(A), resistance_ohm(Ω) |
Tüm ailelerde ortak baş/kuyruk kolonları: point (tam sayı), step_index, sweep_direction, elapsed_s (s), status. Birim ve tip kolon tanımında durur, satırda tekrarlanmaz (tek kaynak); etiket yereli label_key üzerinden i18n'den gelir.
Türetilmiş kolon formülleri:
P = |V_measured · I| (birim: W). Girdi vds_measured (V) ve ids (A); biri eksikse çıktı null (eksik != sıfır).R = |V_measured / I| (birim: Ω). Akım 0 veya eksikse çıktı null.2.5 Satırlar ve durum (status) — "Eksik != sıfır"
Ölçüm sırasında bazı noktalar ölçülemeyebilir veya cihaz bir sınıra takılabilir. Yazılım bu durumları gizlemez: her satıra bir status (ok / na / fail) etiketi koyar ve ölçülemeyen bir değeri asla 0 ile doldurmaz, boş (null) bırakır. Bir anketteki "boş bırakıldı" ile "0 puan" arasındaki fark gibi — ikisini karıştırmak sonucu yanlış yorumlatır.
- Neden yapılır: ölçülemeyen veri ile gerçekten sıfır olan veri birbirine karışmasın, analiz sahte sıfırlarla bozulmasın diye.
- Ne öğretir / ne ölçer: her noktanın geçerli mi (ok), ölçülemedi mi (na), yoksa sınıra mı takıldığını (fail).
- Nerede kullanılır: veri kalitesini değerlendirirken ve eksik noktaların sonucu nasıl etkilediğini anlarken.
_point_to_row(...) her MeasurementPoint'i bir satıra çevirir. Sayısal olmayan / NaN / Inf değerler null'a (asla 0'a değil) eşlenir. Her satırın status alanı:
| Durum | Anlamı | Koşul |
|---|---|---|
ok | Geçerli ölçüm | Aksi tüm durumlar |
na | Ölçülemedi | Aile "na-nitelikleri"nin tamamı None (ör. TFT'de hem ids hem igs) |
fail | Sınır/uyumluluk çarpması | compliance_hit = true (compliance limitine takıldı) |
"rows": [
{ "point": 1, "vds_set": 0.0, "ids": 1.2e-6, "igs": 1e-9, "status": "ok" },
{ "point": 2, "vds_set": 0.1, "ids": null, "igs": null, "status": "na" }, // eksik != 0
{ "point": 3, "vds_set": 0.2, "ids": 2.0e-3, "igs": 1e-9, "status": "fail" } // compliance
]
len(points) < parameters.step_count ise rapor durumu otomatik status="partial" olur; yarıda kesilen bir koşu asla "tamamlandı" gibi gösterilmez. Bu, metroloji dürüstlüğünün gereğidir.2.6 Bütünlük (integrity / checksum)
Her kanonik rapor, içeriğinden hesaplanan sha256 adında bir "parmak izi" taşır. Dosyada tek bir rakam bile sonradan değişse bu parmak izi tutmaz; böylece raporun kurcalanıp kurcalanmadığı anlaşılır. Bir zarfın üstündeki, kırılınca belli olan mühür gibi çalışır.
- Neden yapılır: bir raporun üretildiğinden beri değiştirilmediğini kanıtlayabilmek (kurcalama-belirtili kayıt) için.
- Ne öğretir / ne ölçer: aynı verinin daima aynı özeti vereceğini; özet tutmuyorsa dosyanın değiştiğini.
- Nerede kullanılır: arşiv güvenliği, iki dosyanın aynı ölçümden geldiğini doğrulama ve denetim.
Her kanonik rapor bir sha256 özeti taşır; böylece dosya sonradan değiştirilirse anlaşılır (kurcalama-belirtili).
girdi : rapor sözlüğü (integrity.value = "" yapılmış hâli)
formül : sha256( kanonik_json(rapor) ) // sort_keys=True, ensure_ascii=False, kompakt
çıktı : integrity = { "algo": "sha256", "value": "<64-hex>" }
write_json, dosyayı yazmadan önce seal_integrity(...) çağırır; bu yüzden diskteki JSON mühürlü değeri taşır. Checksum, kendine referans olmadan hesaplanır (önce value boş bırakılır). Aynı rapor → bayt-aynı çıktı → aynı checksum.
3. Ölçüm Raporu — HTML ve PDF Sunumu ("Rapor Oluştur")
Kanonik JSON/CSV makineler içindir; insanlar içinse okunaklı, grafiği ve tabloları gömülü tek parça bir HTML (ve PDF) rapor üretilir. Bu, kanonik kaydın aynı verinin güzelce ciltlenmiş, paylaşıma hazır hâli gibidir — sayılar birebir aynıdır, yalnızca sunum insana yöneliktir.
- Neden yapılır: sonucu bir meslektaşa, danışmana veya müşteriye gönderip yazdırılabilir tek bir belge vermek için.
- Ne öğretir / ne ölçer: başlık, grafik, ölçüm koşulları ve çıkarılan parametrelerin bir arada nasıl sunulduğunu.
- Nerede kullanılır: paylaşım, sunum, baskı ve dosyaya ek — taşınabilir tek dosya gerektiğinde.
Kanonik JSON/CSV makine içindir; insana yönelik tek parça HTML rapor (ve mümkünse PDF) ölçüm sonucu ekranında "Rapor oluştur" düğmesiyle üretilir (_generate_report). Bu sunum, kanonik nesnenin görünür hâlidir.

3.1 Rapor yapısı (bölümler)
Üretilen HTML/PDF şu sırayla bölümlerden oluşur (build_report_html):
- Başlık bloğu — Rapor başlığı (ör. "TFT Ölçüm Raporu"), alt başlık (
<TFT> — <Mod>) ve üretim zamanı (generated_at). - Grafik — Mevcut ölçüm grafiği PNG olarak gömülür (işaretçiler dahil). HTML'de base64
data:URI; PDF'teQTextDocument.addResourceileplot.pngkaynağı olarak. - Ölçüm Koşulları tablosu — Mod, TFT kimliği, cihaz IDN, VISA kaynağı, kanallar (drain/gate), röle durumu, nokta sayısı, yazılım sürümü; ardından sweep parametreleri ve (varsa) açık-hava ortam satırları.
- Çıkarılan Parametreler tablosu — Mod-bilen cilalı etiketler (Voc/Isc/FF/PCE, Vth, Ion/Ioff…). Özel üretici yoksa ham özet (
summary) dökümüne düşülür. Bu tablo, Sonuç sayfasıyla tek kaynak (summary_format) kullanır; raporda gördüğünüz sayılar ekrandaki sayılarla birebir aynıdır. - Kullanıcı Notu —
user_commentvarsa serbest metin kutusu. - Alt bilgi — Yazılım sürümü damgası.
3.2 Çıktı dosyaları ve adlandırma
"Rapor oluştur" iki dosya yazar (çıktı klasörüne doğrudan, koşu alt klasörüne değil):
<TFT>_<MOD>_<YYYYMMDD_HHMMSS>_report.html
<TFT>_<MOD>_<YYYYMMDD_HHMMSS>_report.pdf
- HTML: Grafik base64 gömülü olduğundan tek dosya taşınabilir, tarayıcıda açılır.
- PDF: Qt
QTextDocument→QPrinterile üretilir; ek bağımlılık yoktur. Grafikplot.pngkaynağı olarak gömülür.
<1e-3) veya çok büyük (>=1e5) değerler bilimsel gösterimle (1.2345e-06), diğerleri {:.4g} ile yazılır. Tüm dinamik değerler html.escape ile kaçışlı yazılır (güvenlik).4. Analiz Raporu (Analiz Çalışma Alanı — "Dışa Aktar" Menüsü)
Ölçüm raporu "ham koşuyu" belgelerken, analiz raporu bir dosyadan çıkarılan yorumlanmış sonucu (ör. Voc/Isc/FF/PCE, eşik gerilimi) belgeler. Analiz çalışma alanında bir analizi çözdükten sonra "Dışa Aktar" menüsünden istediğiniz biçimde dışarı verirsiniz. Ham ölçüm "çekilen fotoğraf" ise, analiz raporu "fotoğrafın altına yazılan açıklamadır."
- Neden yapılır: hesaplanan metrikleri, belirsizlikleri ve hangi yöntemle/standarda göre çıkarıldığını kayıt altına almak için.
- Ne öğretir / ne ölçer: metrik değerlerini + belirsizliklerini, kullanılan yöntemi, güvenilirlik hükmünü ve veri kökenini (provenance).
- Nerede kullanılır: sonuçları raporlarken, güvenilirlik damgasıyla paylaşırken (güvenilmez sonuç için onay istenir).
Analiz çalışma alanında bir analiz çözüldükten sonra, üst çubuktaki "Dışa Aktar" (analyze2.header.export) düğmesi bir menü açar. Menü içeriği, aktif analiz modülünün tanımlayıcısının (descriptor) desteklediği biçimlerle uygulanan biçimlerin kesişimidir.

4.1 Dışa aktarım menüsü seçenekleri
| Menü öğesi (TR) | Jeton | Yazıcı | Çıktı |
|---|---|---|---|
| CSV (veri sütunları) | csv | write_dataset_csv | Kanonik veri tablosu (nokta-ondalık, virgül) |
| CSV (Excel uyumlu: ; ayraç, virgül ondalık) | csv_excel | write_dataset_csv_excel | Yerel-Excel kolaylık kopyası |
| PNG (grafik) | png | plot_canvas.export_png | Aktif grafiğin PNG görüntüsü |
| Excel (.xlsx) | xlsx | write_metrics_xlsx | "Metrics" + "Provenance" sayfaları |
| JSON rapor | report_json | analysis_report.write_json | Kanonik analiz raporu (künye + payload + sha256) |
| PDF rapor | report_pdf | write_report_pdf | HTML → Qt PDF (grafik gömülü) |
report_json veya report_pdf seçildiğinde, eğer analiz ✕ Güvenilir değil (ör. STC dışı koşul, düşük uyum) olarak işaretliyse, yazıcı çalışmadan önce bir onay istenir (_confirm_report_unreliable). Böylece güvenilmez bir sonuç yanlışlıkla resmî rapor olarak dışarı verilmez.4.2 Analiz raporu (report_json / report_pdf) yapısı
Analiz raporu build_analysis_report(...) ile üretilir; ölçüm raporuyla aynı künye disiplinini taşır ve report_model'in mühür/checksum/write_json işlevlerini yeniden kullanır (yani JSON bayt-kararlı ve bütünlük mühürlüdür). Üst düzey alanlar:
| Alan | Değer |
|---|---|
schema_version | "1.0" |
report_id | uuid4().hex |
report_type | "analysis" |
created_at | UTC ISO-8601 (ms) |
app_id / app_version | "tft-measurement" + sürüm |
simulated | null (analiz dosya-tabanlıdır; cihaz iddiası yok) |
analysis | Payload (aşağıda) |
integrity | {algo: "sha256", value: ...} |
analysis payload'ı (Qt'siz, dile-bağımsız; etiketler i18n anahtarı olarak tutulur):
descriptor— Analiz modülü kimliği, sürümü, kategori, başlık/özet anahtarları, motor.metrics[]— Her metrik için ham GUM alanları + biçimlenmiş gösterim:{key, label_key, unit, value, u_std, k, n, r2, display, primary}. Değer yoksavalue=null,display="—".method—{description_key, equations[], conventions[], fit_method}. Denklemler düz-metin (plain) + not olarak taşınır; konvansiyonlar i18n anahtarıdır.standards[]— Atıf yapılan standartlar:{id, designation, title, edition, scope}(registry'den çözülür).reliability— Kalite hükmü: ✓ Güvenilir (reliable) / ✕ Güvenilir değil (unreliable) / ⚠ STC dışı (non_stc).provenance— Köken/iz zarfı:{data_file, file_hash, column_mapping, parameters, software_version, timestamp_utc}.narrative,notes[],conditions[]— Anlatı, notlar ve descriptor'ın gerektirdiği koşul jetonları.
4.3 Belirsizlik gösterimi (Quantity / GUM)
Hiçbir ölçüm tam kesin değildir; her sonucun bir "± ne kadar" payı vardır. Bu modül, metrikleri uluslararası GUM kılavuzuna uygun biçimde değer ± belirsizlik olarak gösterir. Bir terazinin "100 g ± 2 g" yazması gibi — sayının tek başına değil, güven aralığıyla birlikte anlamı vardır.
- Neden yapılır: bir sonuca ne kadar güvenilebileceğini sayısal olarak ifade etmek için (bilimsel dürüstlük).
- Ne öğretir / ne ölçer: standart belirsizlik (u), kapsam çarpanı (k), genişletilmiş belirsizlik (U = k·u) ve örneklem sayısı n.
- Nerede kullanılır: akredite raporlar, karşılaştırmalı ölçümler ve "bu fark anlamlı mı?" kararlarında.
Analiz metrikleri, GUM (Ölçüm Belirsizliğinin İfadesi Kılavuzu) çizgisinde bir Quantity nesnesi üzerinden biçimlenir (format_quantity). Gösterim kuralları:
değer ± belirsizlik (kapsam notu)| Koşul | Çıktı |
|---|---|
u_std > 0 ve n >= 2 | ± terim gösterilir |
k ayarlı (genişletilmiş) | U = k · u_std, son ek k={k}, n={n} |
k yok (standart) | son ek std. unc., n={n} |
u_std yok / n<2 | yalnız değer gösterilir |
- Genişletilmiş belirsizlik:
U = k · u_std(k = kapsam çarpanı / coverage factor). - Veri dosyalarında (JSON/Excel) ham alanlar (
value,u_std,k,n) ayrı ayrı tutulur; biçimlenmişdisplayyalnız kolaylık içindir.
4.4 Excel dışa aktarımı (write_metrics_xlsx)
Analiz Excel çıktısı iki sayfa içerir:
- "Metrics" — Sütunlar:
metric, value, unit, u_std, n, display, reliability. Her descriptor metriği için bir satır;Quantityyoksa değer boş,display="—". - "Provenance" — Köken zarfı anahtar/değer:
data_file,file_hash,software_version,timestamp_utc, ayrıca JSON olarakcolumn_mappingveparameters.
write_metrics_xlsx, openpyxl paketini tembel (lazy) import eder. Paket yoksa veya dosya yazılamazsa yazıcı sessizce False döner — istisna fırlatmaz. Hiçbir Analiz dışa aktarım yazıcısı çökmez; hata daima False olarak döner.5. Birleştirme Raporu (Veri ve Raporlar Çalışma Alanı)
Tek bir ölçüm yerine, birden çok ölçümü/analizi ve üretim adımlarını tek bir profesyonel rapora toplamak istediğinizde bu yolu kullanırsınız. Dağınık sayfaları tek bir ciltli dosyaya toplamak gibi — şablon seçer, bölümleri işaretler, canlı önizlemeyle istediğiniz raporu oluşturursunuz.
- Neden yapılır: bir numuneye ait tüm kanıtı (ölçümler + adımlar + grafikler) tek, paylaşılabilir bir belgede toplamak için.
- Ne öğretir / ne ölçer: birden çok kaynağın nasıl seçilip bölümlere göre tek rapora dizildiğini.
- Nerede kullanılır: numune dosyası, müşteri teslimi, proje raporu — çok kaynaklı özet gerektiğinde.
Tekil ölçüm/analiz raporlarının ötesinde, Veri ve Raporlar çalışma alanı (workspace) birden çok kaynağı tek bir profesyonel rapora birleştiren bir Rapor Oluşturucu sunar. Motor report_compose.py'dir: saf, Qt'siz; yukarıdaki yazıcıların üzerine yeni bir yazıcı eklemez.

5.1 Çalışma alanı sekmeleri
| Sekme | Anahtar | İşlev |
|---|---|---|
| Genel Bakış | overview | KPI kartları (ölçüm/analiz/numune/rapor sayısı) + hızlı eylemler + son etkinlik |
| Veri Kitaplığı | library | Gömülü veritabanı tablosu + seçili kaydın detay/inceleme paneli |
| Rapor Oluşturucu | builder | Şablon + bölüm seçici + canlı önizleme + "Oluştur" |
| Raporlar | reports | Üretilmiş raporların kitaplığı (künye + bayatlık + "Aç") |
| Karşılaştır / Bindir | compare | Birden çok eğriyi üst üste bindirme |
| Veritabanı / İstatistik | stats | Bir numunenin ölçümlerinde Ort±σ / min / max / n |

5.2 Rapor Oluşturucu — üç sütunlu akış
Rapor Oluşturucu üç sütundan oluşur (sürükle-bırak alan kuyusu yoktur; kolon aileleri belirlenimcidir):
Sütun 1 — Kurulum:
| Ayar | Seçenekler |
|---|---|
| Kaynak | Seçili veri (kitaplık/karşılaştırdan eklenen kayıtlar) veya Lab Defteri (numune köprüsü) |
| Şablon | TFT Karakterizasyon / Numune Dosyası / Karşılaştırma / PV Hücre Özeti / Boş |
| Biçim | PDF + HTML / PDF / HTML / Full (PDF + HTML + CSV + JSON) |
| Seviye | Müşteri (sha256 künye) / Taban |
Sütun 2 — İçerik: Seçili kaynağa göre ya seçili ölçüm onay-kutu listesi ya da Lab Defteri numune seçici (üretim adımları + bağlı ölçümler). Altında bölüm onay-kutuları.
Sütun 3 — Canlı önizleme: Seçimler değiştikçe report_compose.compose(...) ile üretilen HTML anında önizlenir (önizleme asla çökmez; hata olursa kırmızı mesaj gösterir).

5.3 Rapor bölümleri
| Bölüm | Anahtar | Öntanımlı | Kilitli | İçerik |
|---|---|---|---|---|
| Künye / izlenebilirlik | kunye | Açık | Evet | schema_version, app_version, sample.id, created_at, source_sha256, integrity (daima ilk, kapatılamaz) |
| Çıkarılan parametre tablosu | params | Açık | Hayır | Ölçüm metrik tablosu (Ion/Ioff, Vth, µFE, SS, gm_max, V_on, Rect., Ron, µ_sat, Nokta) |
| Üretim adımları (Lab Defteri) | steps | Açık | Hayır | Numune künyesi + üretim adımları + parametreler |
| Ölçüm koşulları | conditions | Açık | Hayır | Mod, VDS, NPLC, Ortalama, Tarama, Cihaz, VISA (ilk ölçümden) |
| Grafik (eğriler) | plot | Kapalı | Hayır | GUI'den geçen figürler (data-URI) |
| Yöntem notları + R² | method | Kapalı | Hayır | Çıkarım yöntemi, SS uyum R², Y-fonksiyonu R² |
| Ham veri eki (CSV/JSON) | raw | Kapalı | Hayır | İlişkili ham CSV dosyalarının yol notu |
5.4 Lab Defteri köprüsü (şema değişikliği olmadan bağlama)
Rapor Oluşturucu, ölçümleri Lab Defteri numuneleriyle yeni bir tablo eklemeden bağlar. Bağlantı alanları: samples.sample_id == measurements.tft_id ve sample_steps.linked_measurement_id. Üç-sıçramalı köprü:
get_sample(sample_db_id)→sample_id.- Geniş havuz:
measurement_db.query(tft_id=sample_id). - "Çağrılan" küme: adımların
linked_measurement_iddeğerleri (birleşim, id'ye göre tekil).
5.5 Çıktı dosyaları ve kanonik JSON
"Oluştur" → report_compose.write(...) seçili biçimlerde yazar. Dosya kök adı: <numune_id veya şablon>_rapor (yasak karakterler temizli).
| Biçim | Dosya | Yazıcı |
|---|---|---|
| HTML | <ad>_rapor.html | Birleştirici (composer) |
| JSON | <ad>_rapor.json | report_model.write_json (künye + sha256 mühürlü, sıralanmış anahtar) |
| CSV | <ad>_rapor.csv | Metrik tablosu (UTF-8 BOM, nokta-ondalık; künye yoldaş-JSON'da) |
<ad>_rapor.pdf | exporters.write_report_pdf (Qt; tembel import) |
Kanonik JSON ek olarak şu izlenebilirlik alanlarını taşır: report_type="composed", source (type, sample_id, measurement_ids, step_ids), source_sha256 ve measurements_sha256 (bayatlık alt-özeti), sections[], özetlenmiş sample ve measurements. Belirlenimci: sabit created_at + report_id → bayt-aynı çıktı.
5.6 Raporlar kitaplığı ve "bayatlık" (stale)
Üretilmiş bir rapor, o andaki verinin mühürlü bir anlık görüntüsüdür ve kendiliğinden güncellenmez. Eğer raporu ürettikten sonra kaynak ölçümler değişir veya silinirse, yazılım o satıra "bayat" rozeti koyarak sizi uyarır. Buzdolabındaki bir yiyeceğin son kullanma tarihi gibi — hâlâ orada, ama tazeliğini kontrol etmelisiniz.
- Neden yapılır: eski bir rapordaki sayıların artık güncel veriyle uyuşmayabileceğini fark edebilmeniz için.
- Ne öğretir / ne ölçer: bir raporun kaynak verisiyle hâlâ tutarlı mı, yoksa "bayat" mı olduğunu (sha256 karşılaştırması).
- Nerede kullanılır: rapor arşivini gözden geçirirken; bayat görürseniz güncel sayılar için raporu yeniden üretmede.
"Raporlar" sekmesi, çıktı klasörünü veritabanısız tarar: report_index.list_reports(...) her *_rapor.json'i (yalnız report_type=="composed") okuyup künye + üretilmiş kardeş biçimleri (pdf/html/csv) listeler. Bir satıra çift-tıklamak veya "Aç", raporu varsayılan uygulamada açar (öncelik sırası: PDF > HTML > JSON).
_is_stale(...) depolanan measurements_sha256'yı mevcut DB durumundan yeniden hesaplananla karşılaştırır ve uyuşmazsa satıra "bayat" rozeti koyar. Raporlar mühürlü anlık görüntülerdir — asla sessizce otomatik güncellenmez. Bayat bir rapor görüyorsanız, güncel sayılar için raporu yeniden üretmelisiniz.
5.7 İstatistik sekmesi (topluluştırma)
Tek bir ölçüm yerine, aynı numunenin tüm ölçümlerini bir araya getirip ortalama, standart sapma, en küçük/en büyük ve sayı (n) gibi özetleri hesaplar. Bir sınıfın tek tek notları yerine sınıf ortalamasına ve dağılımına bakmak gibi — tekrarlanabilirliği ve saçılımı görürsünüz.
- Neden yapılır: ölçümün ne kadar tekrarlanabilir/tutarlı olduğunu ve tipik değer aralığını anlamak için.
- Ne öğretir / ne ölçer: Ort ± σ, min, max ve geçerli örnek sayısı n (eksik/NaN değerler hariç tutulur).
- Nerede kullanılır: üretim/kalite kontrolünde süreç kararlılığı (SPC) ve numuneler-arası karşılaştırmada.
"Veritabanı / İstatistik" sekmesi, seçili bir numunenin (tft_id) tüm ölçümlerinde çıkarılan parametreleri topluluştırır (benchtop SPC/dağılım karşılığı):
Ort (mean) = Σxᵢ / n
σ (örnek std, n-1) = sqrt( Σ(xᵢ − Ort)² / (n − 1) ) // n>1; n=1 ise σ=0
min, max, n
None/NaN değerler hariç tutulur; n=0 ise tüm istatistikler — (eksik != 0). "Seçimden rapor" düğmesi, o numuneyle Rapor Oluşturucu'yu açar.

6. Dışa Aktarım Biçimleri (Referans)
Aynı veri birçok biçimde dışarı verilebilir; doğru biçim, dosyayla ne yapacağınıza bağlıdır. Kabaca: makineyle işleyecekseniz kanonik CSV/JSON, Türkçe Excel'de çift tıkla açacaksanız Excel-uyumlu CSV veya XLSX, paylaşacak/yazdıracaksanız PDF/HTML, grafiği bir yere koyacaksanız PNG. Aynı belgeyi e-posta, faks ya da kâğıt olarak göndermek gibi — içerik aynı, taşıyıcı farklı.
- Neden yapılır: her kullanım (arşiv, analiz, paylaşım, sunum) için en uygun ve en az hata yapan biçimi seçebilmek için.
- Ne öğretir / ne ölçer: hangi biçimin makine-okunur "kanonik" kayıt, hangisinin yalnızca "kolaylık kopyası" olduğunu.
- Nerede kullanılır: veriyi başka bir araca aktarırken, arşivlerken veya bir meslektaşa gönderirken.
Bu bölüm, tüm biçimleri tek yerde toplar.
6.1 Kanonik CSV (makine biçimi)
Yerelden bağımsız, tek ve belgeli biçim (report_model.write_csv / exporters.write_dataset_csv):
- Kodlama UTF-8 + BOM (
utf-8-sig— Excel'in doğru açması için), nokta ondalık, virgül ayraç, satır sonu\n. - Başlıklar kararlı
key+ birim (ör.ids_A,vds_set_V), asla yerelleştirilmez. - Eksik nokta → boş hücre (
"");0asla yazılmaz.na/fail/okayrımıstatussütununda durur. - CSV yalnız tabloyu taşır; künye + checksum yoldaş JSON dosyasında durur.
point,step_index,sweep_direction,vds_set_V,vgs_set_V,vds_measured_V,vgs_measured_V,ids_A,igs_A,elapsed_s_s,status
1,0,Forward,0.0,0.0,0.0,0.0,1.2e-6,1e-09,0.01,ok
2,0,Forward,0.1,0.0,,,,,0.02,na
6.2 Excel-uyumlu CSV (kolaylık kopyası)
write_dataset_csv_excel — Türkçe/Avrupa yerelli Excel için:
| Parametre | Birim | Açıklama | Varsayılan |
|---|---|---|---|
decimal | — | Ondalık işareti | , (virgül) |
delimiter | — | Sütun ayracı | ; (noktalı virgül) |
| kodlama | — | BOM ile UTF-8 | utf-8-sig |
1.5'i tarih/binlik sanıp bozar; bu varyant o yerelde doğru açılır. Ayraç ;'dir çünkü ondalık , ile çarışmaması gerekir. Arşivlenecek/işlenecek dosya için daima kanonik CSV'yi (Bölüm 6.1) kullanın.6.3 TXT (sekme ayraçlı)
<base>.txt — ham ölçüm tablosunun sekme (tab) ayraçlı sürümü; aynı 13 sütun, UTF-8. Gnuplot/Origin gibi araçlara hızlı yapıştırma için pratiktir.
6.4 XLSX (Excel çalışma kitabı)
İki yol vardır:
- Ham ölçüm (
DataWriter._write_xlsx): "measurement" sayfası (13 sütun) + mod-bilen "Özet" sayfası (etiket/değer).openpyxlyoksa, bağımlılıksız minimal bir XLSX (doğrudan zip + XML) yazılır (_write_minimal_xlsx) — yani Excel çıktısı her ortamda üretilir. - Analiz metriği (
write_metrics_xlsx): "Metrics" + "Provenance" sayfaları (Bölüm 4.4).
6.5 JSON metadata vs kanonik JSON
İki farklı JSON karıştırılmamalıdır:
| Dosya | Üretici | Amaç | Mühür |
|---|---|---|---|
<base>_metadata.json | DataWriter.save | Serbest, insan-okunur metadata (cihaz, parametre, özet, sayım) | Hayır |
<base>_report.json | report_model.write_json | Kanonik rapor (künye + kolon + satır) | Evet (sha256) |
<ad>_rapor.json | report_compose.write | Kanonik birleştirme raporu | Evet (sha256) |
metadata.json şu alanları içerir: device_identity (IDN/VISA/switch_port), relay_enabled, selected_tft, sweep_parameters, date_time, started_at, user_comment, software_version, smu_mapping (drain/gate), point_count, planned_point_count, stopped_early, compliance_hit ve (varsa) <mod>_summary.
6.6 PNG (grafik görüntüsü)
Grafikler PNG olarak dışarı verilir:
- Ölçüm raporu: Grafik 150 DPI'de PNG'ye render edilir ve HTML'e base64, PDF'e
plot.pngkaynağı olarak gömülür. - Analiz: "Dışa Aktar → PNG" ile aktif grafik doğrudan PNG dosyasına yazılır (
plot_canvas.export_png).
Üretilen rapor dosyaları, kaynağı belli olacak biçimde adlandırılır: ölçüm raporları <TFT>_<MOD>_<tarih>_<saat>_report.json / _report.csv, birleştirme raporları ise *_rapor.json kalıbını izler. Böylece her çıktı, hangi ölçüm veya oturumdan türediğini adından okutur.
6.7 Dosya adlandırma sözleşmesi — özet
| Çıktı | Şablon |
|---|---|
| Koşu klasörü | YYYY-MM-DD-<Gün>-<Tür>-<HHMMSS>/ |
| Ham + rapor dosyaları | <önek>_<TFT>_<MOD>_<YYYYMMDD_HHMMSS>_<sonek>.<uzantı> |
| Kanonik rapor | <base>_report.json / <base>_report.csv |
| Ölçüm HTML/PDF raporu | <TFT>_<MOD>_<YYYYMMDD_HHMMSS>_report.{html,pdf} |
| Birleştirme raporu | <numune veya şablon>_rapor.{html,json,csv,pdf} |
| Crash-safe ara dosya | <base>_partial.csv |
7. Belirlenimcilik, Yerel Tuzağı ve Seviyeler
7.1 Belirlenimcilik (her yazıcının uyduğu kural)
- Aynı girdi → bayt-aynı çıktı.
_canonical_json,sort_keys=True,ensure_ascii=Falseve kompakt ayraçlar kullanır; payload'da gizli duvar-saati yoktur —created_atçağırandan gelir. Bit-aynı çıktı isteyen bir çağıran sabitcreated_at+ sabitreport_idgeçirir. - Yerelden bağımsız veri. JSON/CSV sayıları sayı tipindedir, nokta-ondalık kullanır. Yalnız HTML/PDF insan gösterimi yerelleştirilir.
- Kaçışlı HTML.
build_report_htmlher dinamik değerihtml.escape'ten geçirir.
_csv_value, repr/{:.0f} ile nokta-ondalığı zorlar; _utc_iso_ms ISO-8601 UTC yazar. Yerel görünüm yalnız uygulama arayüzü içindir.7.2 Seviye → zorunlu alan eşlemesi
| Alan | base | customer | accredited |
|---|---|---|---|
| Künye (id, app/recipe sürümü, station, sample, created_at, status, simulated) | Evet | Evet | Evet |
columns.unit + type | Evet | Evet | Evet |
integrity (sha256 checksum) | — | Evet | Evet |
report_revision + kararlı arşiv dili | — | Evet | Evet |
columns.spec {min,max} | PLANLANAN | ||
columns.uncertainty {..., k} | — | — | PLANLANAN |
calibration.cert_no / valid_until | — | — | PLANLANAN |
signoff (hazırlayan/onaylayan/imza) | — | — | Alan var, boş; doldurma PLANLANAN |
Yerli PDF/A + gömülü font / write_xlsx | — | — | PLANLANAN; PDF bugün Qt ile |
7.3 Şu an PLANLANAN olanlar
Aşağıdakiler sözleşmede tanımlı ancak henüz uygulanmamıştır; rapor bunları iddia etmez:
- Yerli
.xlsxrapor yazıcısı ve arşivlik PDF/A profili (şu an PDF, HTML'den Qt yoluyla üretilir). - Ölçüm metrikleri için GUM Tip-B belirsizlik kolonu (ölçüm DB'si çıplak skaler taşır; belirsizlik analiz-kit
Quantityyolunda yaşar). - Seviye-2 belirsizlik bütçesi, kalibrasyon sertifikası ve imza zinciri (ör. PDF için PAdES);
calibrationvesignoffşu an stub. - Büyük/toplu raporlar için arka-plan iş parçacığı üretimi.
8. Standart Atıfları
Bu bölümdeki davranışlar repo-içi sözleşme ve standartlara dayanır:
docs/standards/06-reporting.md— Raporlama standardı (belirlenimcilik, checksum, üç-seviyeli künye, yerel tuzağı, "eksik != sıfır", otomatik-iletim yasağı).docs/guides/reporting-guide.md— Somut sözleşme: kanonik JSON iskeleti, kolon tanımları, CSV konvansiyonu, yazıcı sözleşmesi, birleştirme raporu (report_compose).docs/standards/03-measurement-and-analysis.md— Sonuç + R² + belirsizlik.docs/standards/05-data-and-database.md— Saklanan veri /NULLdisiplini.docs/standards/12-i18n-l10n.md— Yerel/dil ayrımı.- Analiz standartları (atıf): Analiz raporları, modül tanımlayıcısındaki
standards[]üzerinden ilgili ölçüm standardını (designation/title/edition/scope) taşır.
9. Hızlı Başvuru ve Sık Sorulanlar
Bir ölçümün resmî kaydı hangi dosyadır?
<base>_report.json (kanonik, sha256 mühürlü). İnsana yönelik sunum bundan türetilir.
Excel dosyam virgüllü sayıları bozuk gösteriyor, ne yapmalıyım?
"CSV (Excel uyumlu)" varyantını kullanın (Bölüm 6.2) veya XLSX'i tercih edin. Arşiv için daima kanonik CSV (nokta-ondalık) saklayın.
Raporda bir değer neden boş/— görünüyor?
O nokta ölçülemedi (status="na") veya metrik hesaplanamadı. Yazılım asla eksik değeri 0 ile doldurmaz (eksik != sıfır).
"bayat" rozeti ne anlama gelir?
Rapor üretildikten sonra kaynak ölçümler değişmiş/silinmiştir. Güncel sayılar için raporu yeniden üretin; mevcut rapor mühürlü bir anlık görüntü olarak kalır.
İki dosyanın aynı ölçümden geldiğini nasıl doğrularım?
integrity.value (sha256) ile. Aynı rapor sözlüğü daima aynı özeti verir; dosya değiştiyse özet tutmaz.
PDF neden bazen üretilmiyor?
PDF, Qt (QTextDocument → QPrinter) ile üretilir; Qt yoksa veya yazma hatası olursa yazıcı sessizce atlar ve en azından HTML/JSON korunur (sağlam üretim ilkesi).