diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..c8cfe39 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.10 diff --git a/data/2022-04-20 Argon_696_15.CSV b/data/2022-04-20 Argon_696_15.CSV new file mode 100644 index 0000000..403652a --- /dev/null +++ b/data/2022-04-20 Argon_696_15.CSV @@ -0,0 +1,334 @@ +70CSV +// AQ6370 OPTICAL SPECTRUM ANALYZER // +25 +"CTRWL", 696.400000 +"SPAN", 0.600000 +"START WL", 696.100000 +"STOP WL", 696.700000 +"WLFREQ", 0 +"REFL", -60.000 +"LSCL",-2.0 +"BASEL",0.00000000000 +"RESLN",0.100 +"AVG", 1 +"SMPLAUTO", 1 +"SMPL", 301 +"SMPLINTVL",0.0020 +"HIGH3" +"RAVG", 20 +"LSUNT",1 +"NMSKH","OFF" +"RESCOR",0 +"RESPARM",10177 +"FREQPARM",10177 + +# Complementary values +"GAS FLOW",500 +"VOLTAGE",7900 +"FREQUENCY",38800 + + + + +"[TRACE DATA]" + 696.1000,7.338E-009 + 696.1020,7.591E-009 + 696.1040,9.639E-009 + 696.1060,8.682E-009 + 696.1080,5.240E-009 + 696.1100,2.041E-008 + 696.1120,4.934E-009 + 696.1140,7.068E-009 + 696.1160,2.225E-008 + 696.1180,1.875E-008 + 696.1200,1.231E-008 + 696.1220,2.037E-008 + 696.1240,2.496E-008 + 696.1260,1.785E-008 + 696.1280,1.672E-008 + 696.1300,2.225E-008 + 696.1320,4.458E-009 + 696.1340,2.409E-008 + 696.1360,1.587E-008 + 696.1380,8.883E-009 + 696.1400,9.415E-009 + 696.1420,4.547E-009 + 696.1440,1.358E-008 + 696.1460,2.302E-008 + 696.1480,1.370E-008 + 696.1500,5.619E-009 + 696.1520,2.849E-008 + 696.1540,1.897E-008 + 696.1560,2.569E-008 + 696.1580,7.989E-009 + 696.1600,1.109E-008 + 696.1620,2.978E-008 + 696.1640,3.374E-008 + 696.1660,4.647E-009 + 696.1680,1.471E-008 + 696.1700,2.971E-008 + 696.1720,1.358E-008 + 696.1740,2.331E-008 + 696.1760,6.827E-010 + 696.1780,8.818E-009 + 696.1800,2.340E-008 + 696.1820,1.988E-008 + 696.1840,3.221E-008 + 696.1860,1.569E-008 + 696.1880,2.894E-008 + 696.1900,1.944E-008 + 696.1920,2.562E-008 + 696.1940,1.391E-008 + 696.1960,2.334E-008 + 696.1980,2.119E-008 + 696.2000,1.438E-008 + 696.2020,1.362E-008 + 696.2040,2.040E-008 + 696.2060,2.266E-008 + 696.2080,3.277E-008 + 696.2100,1.639E-008 + 696.2120,2.603E-008 + 696.2140,2.250E-008 + 696.2160,1.801E-008 + 696.2180,2.338E-008 + 696.2200,1.527E-008 + 696.2220,2.057E-008 + 696.2240,2.250E-008 + 696.2260,3.479E-008 + 696.2280,2.111E-008 + 696.2300,2.669E-008 + 696.2320,2.601E-008 + 696.2340,3.034E-008 + 696.2360,2.754E-008 + 696.2380,3.175E-008 + 696.2400,1.585E-008 + 696.2420,3.666E-008 + 696.2440,2.487E-008 + 696.2460,1.633E-008 + 696.2480,2.161E-008 + 696.2500,2.462E-008 + 696.2520,1.165E-008 + 696.2540,2.986E-008 + 696.2560,2.710E-008 + 696.2580,1.281E-008 + 696.2600,3.003E-008 + 696.2620,2.028E-008 + 696.2640,4.174E-008 + 696.2660,2.350E-008 + 696.2680,4.735E-008 + 696.2700,4.693E-008 + 696.2720,3.607E-008 + 696.2740,4.648E-008 + 696.2760,5.627E-008 + 696.2780,3.976E-008 + 696.2800,4.811E-008 + 696.2820,5.326E-008 + 696.2840,5.671E-008 + 696.2860,6.082E-008 + 696.2880,6.519E-008 + 696.2900,6.144E-008 + 696.2920,6.282E-008 + 696.2940,7.846E-008 + 696.2960,9.078E-008 + 696.2980,7.970E-008 + 696.3000,7.075E-008 + 696.3020,8.600E-008 + 696.3040,9.402E-008 + 696.3060,9.820E-008 + 696.3080,1.017E-007 + 696.3100,1.074E-007 + 696.3120,1.174E-007 + 696.3140,1.083E-007 + 696.3160,1.169E-007 + 696.3180,1.267E-007 + 696.3200,1.252E-007 + 696.3220,1.545E-007 + 696.3240,1.492E-007 + 696.3260,1.611E-007 + 696.3280,1.730E-007 + 696.3300,1.523E-007 + 696.3320,1.797E-007 + 696.3340,2.001E-007 + 696.3360,1.936E-007 + 696.3380,1.940E-007 + 696.3400,2.151E-007 + 696.3420,1.997E-007 + 696.3440,2.122E-007 + 696.3460,2.186E-007 + 696.3480,2.179E-007 + 696.3500,2.212E-007 + 696.3520,2.357E-007 + 696.3540,2.452E-007 + 696.3560,2.565E-007 + 696.3580,2.388E-007 + 696.3600,2.591E-007 + 696.3620,2.553E-007 + 696.3640,2.612E-007 + 696.3660,2.628E-007 + 696.3680,2.748E-007 + 696.3700,2.864E-007 + 696.3720,2.698E-007 + 696.3740,2.803E-007 + 696.3760,2.809E-007 + 696.3780,2.827E-007 + 696.3800,3.039E-007 + 696.3820,2.903E-007 + 696.3840,3.197E-007 + 696.3860,3.081E-007 + 696.3880,3.171E-007 + 696.3900,3.201E-007 + 696.3920,3.154E-007 + 696.3940,3.119E-007 + 696.3960,3.128E-007 + 696.3980,3.215E-007 + 696.4000,3.178E-007 + 696.4020,3.341E-007 + 696.4040,3.088E-007 + 696.4060,3.054E-007 + 696.4080,3.143E-007 + 696.4100,3.173E-007 + 696.4120,3.203E-007 + 696.4140,3.235E-007 + 696.4160,3.110E-007 + 696.4180,3.091E-007 + 696.4200,3.180E-007 + 696.4220,3.152E-007 + 696.4240,3.091E-007 + 696.4260,3.110E-007 + 696.4280,3.067E-007 + 696.4300,2.975E-007 + 696.4320,2.991E-007 + 696.4340,2.985E-007 + 696.4360,2.946E-007 + 696.4380,2.847E-007 + 696.4400,2.906E-007 + 696.4420,2.777E-007 + 696.4440,2.713E-007 + 696.4460,2.834E-007 + 696.4480,2.714E-007 + 696.4500,2.474E-007 + 696.4520,2.759E-007 + 696.4540,2.481E-007 + 696.4560,2.476E-007 + 696.4580,2.455E-007 + 696.4600,2.646E-007 + 696.4620,2.473E-007 + 696.4640,2.289E-007 + 696.4660,2.390E-007 + 696.4680,2.323E-007 + 696.4700,2.220E-007 + 696.4720,2.133E-007 + 696.4740,2.128E-007 + 696.4760,1.975E-007 + 696.4780,1.954E-007 + 696.4800,1.911E-007 + 696.4820,1.957E-007 + 696.4840,1.738E-007 + 696.4860,1.734E-007 + 696.4880,1.748E-007 + 696.4900,1.684E-007 + 696.4920,1.565E-007 + 696.4940,1.355E-007 + 696.4960,1.414E-007 + 696.4980,1.400E-007 + 696.5000,1.272E-007 + 696.5020,1.316E-007 + 696.5040,1.267E-007 + 696.5060,1.181E-007 + 696.5080,1.138E-007 + 696.5100,1.010E-007 + 696.5120,1.101E-007 + 696.5140,1.065E-007 + 696.5160,8.187E-008 + 696.5180,8.912E-008 + 696.5200,9.110E-008 + 696.5220,8.377E-008 + 696.5240,8.179E-008 + 696.5260,8.251E-008 + 696.5280,7.279E-008 + 696.5300,6.516E-008 + 696.5320,7.550E-008 + 696.5340,5.438E-008 + 696.5360,6.593E-008 + 696.5380,5.066E-008 + 696.5400,4.232E-008 + 696.5420,4.845E-008 + 696.5440,6.049E-008 + 696.5460,4.499E-008 + 696.5480,3.859E-008 + 696.5500,3.534E-008 + 696.5520,5.310E-008 + 696.5540,4.068E-008 + 696.5560,2.990E-008 + 696.5580,2.782E-008 + 696.5600,2.569E-008 + 696.5620,2.951E-008 + 696.5640,3.309E-008 + 696.5660,2.027E-008 + 696.5680,3.353E-008 + 696.5700,4.190E-008 + 696.5720,2.809E-008 + 696.5740,2.238E-008 + 696.5760,2.847E-008 + 696.5780,3.224E-008 + 696.5800,2.280E-008 + 696.5820,2.183E-008 + 696.5840,2.698E-008 + 696.5860,2.896E-008 + 696.5880,1.712E-008 + 696.5900,1.085E-008 + 696.5920,2.582E-008 + 696.5940,7.439E-009 + 696.5960,2.304E-008 + 696.5980,2.363E-008 + 696.6000,9.333E-010 + 696.6020,2.625E-008 + 696.6040,2.148E-008 + 696.6060,2.759E-008 + 696.6080,2.690E-008 + 696.6100,1.554E-008 + 696.6120,1.041E-008 + 696.6140,1.773E-008 + 696.6160,1.559E-008 + 696.6180,1.580E-008 + 696.6200,2.129E-008 + 696.6220,2.126E-008 + 696.6240,4.100E-009 + 696.6260,2.839E-008 + 696.6280,2.455E-008 + 696.6300,9.609E-009 + 696.6320,1.258E-008 + 696.6340,1.437E-008 + 696.6360,2.004E-008 + 696.6380,2.800E-008 + 696.6400,2.104E-008 + 696.6420,1.205E-008 + 696.6440,2.049E-009 + 696.6460,2.654E-008 + 696.6480,1.741E-008 + 696.6500,2.169E-008 + 696.6520,1.174E-008 + 696.6540,2.097E-008 + 696.6560,1.105E-008 + 696.6580,1.130E-008 + 696.6600,2.942E-008 + 696.6620,2.298E-008 + 696.6640,1.540E-008 + 696.6660,2.112E-008 + 696.6680,1.575E-008 + 696.6700,1.168E-008 + 696.6720,1.591E-008 + 696.6740,3.348E-008 + 696.6760,1.864E-008 + 696.6780,7.248E-009 + 696.6800,7.188E-009 + 696.6820,1.960E-008 + 696.6840,1.900E-008 + 696.6860,1.921E-008 + 696.6880,1.618E-008 + 696.6900,1.524E-008 + 696.6920,2.712E-008 + 696.6940,2.281E-008 + 696.6960,8.831E-009 + 696.6980,1.317E-008 + 696.7000,2.163E-008 diff --git a/data/Argon_696_11.CSV b/data/Argon_696_11.CSV new file mode 100644 index 0000000..1175747 --- /dev/null +++ b/data/Argon_696_11.CSV @@ -0,0 +1,280 @@ +70CSV +// AQ6370 OPTICAL SPECTRUM ANALYZER // +25 +"CTRWL", 696.408000 +"SPAN", 0.500000 +"START WL", 696.158000 +"STOP WL", 696.658000 +"WLFREQ", 0 +"REFL", -60.000 +"LSCL",-2.0 +"BASEL",0.00000000000 +"RESLN",0.100 +"AVG", 100 +"SMPLAUTO", 1 +"SMPL", 251 +"SMPLINTVL",0.0020 +"HIGH3" +"MEAS" +"LSUNT",1 +"NMSKH","OFF" +"RESCOR",0 +"RESPARM",10177 +"FREQPARM",10177 + + + + + +"[TRACE DATA]" + 696.1580,-2.652E-009 + 696.1600,-6.013E-009 + 696.1620,-5.654E-009 + 696.1640,3.338E-010 + 696.1660,-3.481E-009 + 696.1680,2.329E-010 + 696.1700,8.646E-009 + 696.1720,7.403E-010 + 696.1740,-2.472E-009 + 696.1760,3.735E-009 + 696.1780,2.148E-010 + 696.1800,7.293E-009 + 696.1820,4.382E-009 + 696.1840,8.916E-009 + 696.1860,7.805E-009 + 696.1880,2.781E-009 + 696.1900,1.076E-008 + 696.1920,1.078E-008 + 696.1940,9.574E-009 + 696.1960,1.395E-008 + 696.1980,1.045E-008 + 696.2000,1.709E-008 + 696.2020,1.241E-008 + 696.2040,1.680E-008 + 696.2060,1.188E-008 + 696.2080,1.439E-008 + 696.2100,2.016E-008 + 696.2120,1.776E-008 + 696.2140,1.023E-008 + 696.2160,1.638E-008 + 696.2180,1.483E-008 + 696.2200,1.728E-008 + 696.2220,1.859E-008 + 696.2240,2.320E-008 + 696.2260,2.260E-008 + 696.2280,2.236E-008 + 696.2300,2.352E-008 + 696.2320,2.208E-008 + 696.2340,1.902E-008 + 696.2360,2.709E-008 + 696.2380,3.076E-008 + 696.2400,2.748E-008 + 696.2420,2.941E-008 + 696.2440,2.492E-008 + 696.2460,2.228E-008 + 696.2480,2.250E-008 + 696.2500,2.710E-008 + 696.2520,2.630E-008 + 696.2540,2.814E-008 + 696.2560,3.116E-008 + 696.2580,3.136E-008 + 696.2600,4.005E-008 + 696.2620,3.765E-008 + 696.2640,3.827E-008 + 696.2660,4.425E-008 + 696.2680,3.514E-008 + 696.2700,3.930E-008 + 696.2720,4.831E-008 + 696.2740,4.621E-008 + 696.2760,4.491E-008 + 696.2780,5.241E-008 + 696.2800,5.580E-008 + 696.2820,6.405E-008 + 696.2840,5.765E-008 + 696.2860,7.375E-008 + 696.2880,7.076E-008 + 696.2900,7.493E-008 + 696.2920,7.695E-008 + 696.2940,8.514E-008 + 696.2960,9.450E-008 + 696.2980,9.688E-008 + 696.3000,1.041E-007 + 696.3020,1.205E-007 + 696.3040,1.314E-007 + 696.3060,1.361E-007 + 696.3080,1.474E-007 + 696.3100,1.510E-007 + 696.3120,1.637E-007 + 696.3140,1.761E-007 + 696.3160,1.900E-007 + 696.3180,1.845E-007 + 696.3200,2.030E-007 + 696.3220,2.135E-007 + 696.3240,2.279E-007 + 696.3260,2.377E-007 + 696.3280,2.529E-007 + 696.3300,2.553E-007 + 696.3320,2.747E-007 + 696.3340,2.874E-007 + 696.3360,3.022E-007 + 696.3380,3.057E-007 + 696.3400,3.282E-007 + 696.3420,3.401E-007 + 696.3440,3.542E-007 + 696.3460,3.653E-007 + 696.3480,3.671E-007 + 696.3500,3.787E-007 + 696.3520,3.895E-007 + 696.3540,3.950E-007 + 696.3560,3.989E-007 + 696.3580,4.192E-007 + 696.3600,4.274E-007 + 696.3620,4.357E-007 + 696.3640,4.311E-007 + 696.3660,4.459E-007 + 696.3680,4.511E-007 + 696.3700,4.649E-007 + 696.3720,4.609E-007 + 696.3740,4.814E-007 + 696.3760,4.845E-007 + 696.3780,5.020E-007 + 696.3800,5.070E-007 + 696.3820,5.202E-007 + 696.3840,5.118E-007 + 696.3860,5.157E-007 + 696.3880,5.163E-007 + 696.3900,5.196E-007 + 696.3920,5.331E-007 + 696.3940,5.338E-007 + 696.3960,5.411E-007 + 696.3980,5.297E-007 + 696.4000,5.368E-007 + 696.4020,5.288E-007 + 696.4040,5.483E-007 + 696.4060,5.385E-007 + 696.4080,5.434E-007 + 696.4100,5.547E-007 + 696.4120,5.491E-007 + 696.4140,5.356E-007 + 696.4160,5.326E-007 + 696.4180,5.302E-007 + 696.4200,5.254E-007 + 696.4220,5.300E-007 + 696.4240,5.070E-007 + 696.4260,5.212E-007 + 696.4280,5.070E-007 + 696.4300,4.950E-007 + 696.4320,4.964E-007 + 696.4340,4.929E-007 + 696.4360,4.894E-007 + 696.4380,4.865E-007 + 696.4400,4.747E-007 + 696.4420,4.587E-007 + 696.4440,4.485E-007 + 696.4460,4.387E-007 + 696.4480,4.303E-007 + 696.4500,4.192E-007 + 696.4520,4.067E-007 + 696.4540,3.935E-007 + 696.4560,3.871E-007 + 696.4580,3.841E-007 + 696.4600,3.628E-007 + 696.4620,3.491E-007 + 696.4640,3.499E-007 + 696.4660,3.370E-007 + 696.4680,3.269E-007 + 696.4700,3.225E-007 + 696.4720,3.133E-007 + 696.4740,2.938E-007 + 696.4760,2.849E-007 + 696.4780,2.648E-007 + 696.4800,2.647E-007 + 696.4820,2.513E-007 + 696.4840,2.252E-007 + 696.4860,2.128E-007 + 696.4880,1.962E-007 + 696.4900,1.973E-007 + 696.4920,1.830E-007 + 696.4940,1.751E-007 + 696.4960,1.649E-007 + 696.4980,1.576E-007 + 696.5000,1.422E-007 + 696.5020,1.376E-007 + 696.5040,1.290E-007 + 696.5060,1.220E-007 + 696.5080,1.110E-007 + 696.5100,1.013E-007 + 696.5120,1.063E-007 + 696.5140,9.347E-008 + 696.5160,7.902E-008 + 696.5180,8.026E-008 + 696.5200,7.148E-008 + 696.5220,6.915E-008 + 696.5240,6.696E-008 + 696.5260,6.043E-008 + 696.5280,5.573E-008 + 696.5300,5.292E-008 + 696.5320,4.888E-008 + 696.5340,4.077E-008 + 696.5360,3.848E-008 + 696.5380,3.864E-008 + 696.5400,3.314E-008 + 696.5420,3.398E-008 + 696.5440,3.643E-008 + 696.5460,3.276E-008 + 696.5480,3.325E-008 + 696.5500,2.282E-008 + 696.5520,2.532E-008 + 696.5540,2.031E-008 + 696.5560,1.488E-008 + 696.5580,2.121E-008 + 696.5600,1.881E-008 + 696.5620,1.912E-008 + 696.5640,2.126E-008 + 696.5660,1.864E-008 + 696.5680,2.285E-008 + 696.5700,1.166E-008 + 696.5720,1.783E-008 + 696.5740,1.971E-008 + 696.5760,7.183E-009 + 696.5780,1.252E-008 + 696.5800,1.423E-008 + 696.5820,2.143E-008 + 696.5840,1.401E-008 + 696.5860,1.529E-008 + 696.5880,1.162E-008 + 696.5900,1.382E-008 + 696.5920,9.576E-009 + 696.5940,5.124E-009 + 696.5960,2.831E-009 + 696.5980,8.726E-009 + 696.6000,6.335E-009 + 696.6020,6.944E-009 + 696.6040,9.192E-009 + 696.6060,3.007E-009 + 696.6080,3.406E-009 + 696.6100,5.318E-009 + 696.6120,1.298E-008 + 696.6140,1.569E-009 + 696.6160,5.036E-009 + 696.6180,4.995E-009 + 696.6200,-6.243E-010 + 696.6220,7.831E-009 + 696.6240,-9.772E-011 + 696.6260,1.631E-009 + 696.6280,1.110E-008 + 696.6300,7.807E-010 + 696.6320,2.456E-009 + 696.6340,-1.710E-009 + 696.6360,5.976E-009 + 696.6380,6.977E-009 + 696.6400,-2.287E-009 + 696.6420,2.853E-009 + 696.6440,2.240E-009 + 696.6460,5.319E-009 + 696.6480,4.714E-009 + 696.6500,2.596E-009 + 696.6520,5.668E-009 + 696.6540,6.630E-009 + 696.6560,3.599E-009 + 696.6580,3.105E-009 diff --git a/data/Argon_696_11_subtracted.csv b/data/Argon_696_11_subtracted.csv new file mode 100644 index 0000000..1143f3d --- /dev/null +++ b/data/Argon_696_11_subtracted.csv @@ -0,0 +1,251 @@ +6.961580000000001117e-07,-9.002999999999999620e-09 +6.961600000000000610e-07,-8.484999999999999547e-09 +6.961620000000001162e-07,-1.175500000000000004e-08 +6.961640000000000655e-07,-4.718200000000000519e-09 +6.961660000000001207e-07,-4.860000000000000174e-09 +6.961680000000000701e-07,-6.557100000000000032e-09 +6.961700000000000194e-07,-7.210000000000003020e-10 +6.961720000000000746e-07,-5.776999999999999800e-10 +6.961740000000000239e-07,-3.299200000000000353e-09 +6.961760000000000791e-07,-5.819999999999998514e-10 +6.961780000000000285e-07,-9.380199999999999516e-09 +6.961799999999999778e-07,-6.816999999999999931e-09 +6.961820000000000330e-07,-3.327999999999999261e-09 +6.961839999999999823e-07,2.739999999999996742e-10 +6.961860000000000375e-07,-1.717000000000001412e-09 +6.961879999999999869e-07,-5.915000000000000357e-09 +6.961900000000001480e-07,-1.119999999999999441e-09 +6.961920000000000973e-07,1.259999999999999371e-09 +6.961940000000000466e-07,-2.616000000000000065e-09 +6.961960000000001018e-07,8.099999999999986504e-10 +6.961980000000000511e-07,-1.350000000000000508e-09 +6.962000000000001064e-07,1.412799999999999919e-08 +6.962020000000000557e-07,8.115999999999999684e-09 +6.962040000000000050e-07,6.841000000000001502e-09 +6.962060000000000602e-07,1.869999999999999540e-09 +6.962080000000000095e-07,9.599999999999999936e-10 +6.962100000000000647e-07,2.400000000000008256e-10 +6.962120000000000141e-07,1.186800000000000079e-08 +6.962140000000000693e-07,4.375999999999999778e-09 +6.962160000000000186e-07,4.719999999999998590e-09 +6.962179999999999679e-07,3.560000000000000114e-09 +6.962200000000000231e-07,2.530000000000000156e-09 +6.962219999999999725e-07,1.344999999999999967e-08 +6.962240000000001336e-07,1.149999999999999875e-08 +6.962260000000000829e-07,1.272600000000000093e-08 +6.962280000000000322e-07,8.299999999999999876e-09 +6.962300000000000874e-07,1.522499999999999902e-08 +6.962320000000000368e-07,1.353999999999999915e-08 +6.962340000000000920e-07,1.639299999999999995e-08 +6.962360000000000413e-07,2.009199999999999886e-08 +6.962380000000000965e-07,2.703599999999999804e-08 +6.962400000000000458e-07,1.665999999999999830e-08 +6.962419999999999952e-07,2.216200000000000019e-08 +6.962440000000000504e-07,1.200000000000000157e-08 +6.962459999999999997e-07,1.535999999999999990e-08 +6.962480000000000549e-07,9.699999999999999177e-09 +6.962500000000000042e-07,1.021000000000000010e-08 +6.962519999999999536e-07,1.422000000000000094e-08 +6.962540000000001146e-07,1.543999999999999797e-08 +6.962560000000000640e-07,1.503000000000000290e-08 +6.962580000000001192e-07,2.860299999999999811e-08 +6.962600000000000685e-07,2.249999999999999633e-08 +6.962620000000000178e-07,2.225000000000000402e-08 +6.962640000000000730e-07,3.013399999999999706e-08 +6.962660000000000224e-07,3.225999999999999903e-08 +6.962680000000000776e-07,2.839500000000000379e-08 +6.962700000000000269e-07,3.103200000000000285e-08 +6.962720000000000821e-07,4.235400000000000325e-08 +6.962740000000000314e-07,3.280000000000000254e-08 +6.962759999999999808e-07,2.690000000000000265e-08 +6.962780000000000360e-07,4.555600000000000109e-08 +6.962799999999999853e-07,4.255999999999999861e-08 +6.962820000000000405e-07,5.213999999999999572e-08 +6.962839999999999898e-07,5.222999999999999852e-08 +6.962859999999999392e-07,5.873999999999999527e-08 +6.962880000000001003e-07,5.591000000000000235e-08 +6.962900000000000496e-07,5.841999999999999637e-08 +6.962920000000001048e-07,6.325999999999999868e-08 +6.962940000000000541e-07,7.484999999999999857e-08 +6.962960000000001093e-07,8.138000000000000477e-08 +6.962980000000000587e-07,8.734800000000000897e-08 +6.963000000000000080e-07,8.626000000000000611e-08 +6.963020000000000632e-07,1.089000000000000024e-07 +6.963040000000000125e-07,1.196499999999999895e-07 +6.963060000000000677e-07,1.219400000000000186e-07 +6.963080000000000171e-07,1.391380000000000115e-07 +6.963099999999999664e-07,1.377799999999999804e-07 +6.963120000000000216e-07,1.496800000000000009e-07 +6.963139999999999709e-07,1.708520000000000002e-07 +6.963160000000000261e-07,1.758899999999999954e-07 +6.963179999999999755e-07,1.689799999999999951e-07 +6.963200000000001365e-07,1.903300000000000109e-07 +6.963220000000000859e-07,2.026899999999999972e-07 +6.963240000000000352e-07,2.107299999999999818e-07 +6.963260000000000904e-07,2.254799999999999782e-07 +6.963280000000000397e-07,2.394600000000000015e-07 +6.963300000000000949e-07,2.429200000000000073e-07 +6.963320000000000443e-07,2.644500000000000155e-07 +6.963339999999999936e-07,2.735399999999999996e-07 +6.963360000000000488e-07,2.940389999999999769e-07 +6.963379999999999981e-07,2.921899999999999714e-07 +6.963400000000000533e-07,3.111599999999999884e-07 +6.963420000000000027e-07,3.368520000000000043e-07 +6.963440000000000579e-07,3.435300000000000063e-07 +6.963460000000000072e-07,3.524600000000000207e-07 +6.963479999999999565e-07,3.561099999999999773e-07 +6.963500000000001176e-07,3.675100000000000397e-07 +6.963520000000000669e-07,3.748799999999999793e-07 +6.963540000000001222e-07,3.798599999999999617e-07 +6.963560000000000715e-07,3.930840000000000277e-07 +6.963580000000000208e-07,4.102299999999999881e-07 +6.963600000000000760e-07,4.138599999999999750e-07 +6.963620000000000253e-07,4.272470000000000405e-07 +6.963640000000000806e-07,4.187000000000000104e-07 +6.963660000000000299e-07,4.314999999999999662e-07 +6.963680000000000851e-07,4.368499999999999975e-07 +6.963700000000000344e-07,4.551379999999999824e-07 +6.963719999999999837e-07,4.517279999999999803e-07 +6.963740000000000390e-07,4.718099999999999347e-07 +6.963759999999999883e-07,4.762989999999999692e-07 +6.963780000000000435e-07,4.923590000000000746e-07 +6.963799999999999928e-07,4.952399999999999797e-07 +6.963819999999999421e-07,5.100700000000000139e-07 +6.963840000000001032e-07,5.049310000000000366e-07 +6.963860000000000526e-07,5.144010000000000280e-07 +6.963880000000001078e-07,5.077620000000000438e-07 +6.963900000000000571e-07,5.105439999999999691e-07 +6.963920000000001123e-07,5.220500000000000458e-07 +6.963940000000000616e-07,5.238219999999999375e-07 +6.963960000000000110e-07,5.367079999999999908e-07 +6.963980000000000662e-07,5.218500000000000308e-07 +6.964000000000000155e-07,5.215799999999999893e-07 +6.964020000000000707e-07,5.123500000000000582e-07 +6.964040000000000200e-07,5.428350000000000297e-07 +6.964059999999999694e-07,5.294429999999999850e-07 +6.964080000000000246e-07,5.296899999999999210e-07 +6.964099999999999739e-07,5.448509999999999864e-07 +6.964120000000000291e-07,5.340399999999999301e-07 +6.964139999999999784e-07,5.317639999999999963e-07 +6.964160000000001395e-07,5.197799999999999599e-07 +6.964180000000000888e-07,5.173100000000000708e-07 +6.964200000000000382e-07,5.095199999999999726e-07 +6.964220000000000934e-07,5.246329999999999836e-07 +6.964240000000000427e-07,4.987069999999999671e-07 +6.964260000000000979e-07,5.117310000000000180e-07 +6.964280000000000472e-07,4.999419999999999645e-07 +6.964299999999999966e-07,4.869049999999999782e-07 +6.964320000000000518e-07,4.881280000000000680e-07 +6.964340000000000011e-07,4.796699999999999535e-07 +6.964360000000000563e-07,4.754800000000000199e-07 +6.964380000000000056e-07,4.753400000000000199e-07 +6.964400000000000609e-07,4.604199999999999896e-07 +6.964420000000000102e-07,4.562780000000000045e-07 +6.964439999999999595e-07,4.391720000000000365e-07 +6.964460000000001206e-07,4.280099999999999793e-07 +6.964480000000000699e-07,4.152799999999999970e-07 +6.964500000000001251e-07,4.038199999999999724e-07 +6.964520000000000745e-07,3.956900000000000181e-07 +6.964540000000000238e-07,3.821700000000000400e-07 +6.964560000000000790e-07,3.741200000000000175e-07 +6.964580000000000283e-07,3.757880000000000031e-07 +6.964600000000000835e-07,3.552649999999999986e-07 +6.964620000000000329e-07,3.362900000000000023e-07 +6.964640000000000881e-07,3.471019999999999803e-07 +6.964660000000000374e-07,3.313810000000000211e-07 +6.964679999999999867e-07,3.147200000000000018e-07 +6.964700000000000419e-07,3.125689999999999715e-07 +6.964719999999999913e-07,3.059959999999999562e-07 +6.964740000000000465e-07,2.862020000000000107e-07 +6.964759999999999958e-07,2.798800000000000418e-07 +6.964779999999999451e-07,2.581749999999999676e-07 +6.964800000000001062e-07,2.557810000000000058e-07 +6.964820000000000555e-07,2.458039999999999953e-07 +6.964840000000001107e-07,2.114100000000000117e-07 +6.964860000000000601e-07,2.053279999999999974e-07 +6.964880000000001153e-07,1.858700000000000093e-07 +6.964900000000000646e-07,1.863100000000000053e-07 +6.964920000000000139e-07,1.748910000000000008e-07 +6.964940000000000691e-07,1.670389999999999911e-07 +6.964960000000000185e-07,1.576309999999999905e-07 +6.964980000000000737e-07,1.445700000000000035e-07 +6.965000000000000230e-07,1.369839999999999778e-07 +6.965019999999999723e-07,1.243199999999999909e-07 +6.965040000000000275e-07,1.169400000000000003e-07 +6.965059999999999769e-07,1.146750000000000127e-07 +6.965080000000000321e-07,9.652000000000000666e-08 +6.965099999999999814e-07,8.906000000000000472e-08 +6.965120000000000366e-07,9.556000000000000336e-08 +6.965140000000000918e-07,8.716499999999999999e-08 +6.965160000000000412e-07,7.364799999999999879e-08 +6.965180000000000964e-07,7.451800000000000592e-08 +6.965200000000000457e-07,6.672499999999999695e-08 +6.965220000000001009e-07,5.898999999999999420e-08 +6.965240000000000502e-07,5.938100000000000081e-08 +6.965259999999999996e-07,5.685600000000000301e-08 +6.965280000000000548e-07,5.357399999999999387e-08 +6.965300000000000041e-07,4.590299999999999751e-08 +6.965320000000000593e-07,4.297700000000000162e-08 +6.965340000000000086e-07,3.502099999999999973e-08 +6.965359999999999580e-07,2.381999999999999757e-08 +6.965380000000000132e-07,3.434999999999999987e-08 +6.965399999999999625e-07,2.276999999999999809e-08 +6.965420000000001236e-07,3.071599999999999526e-08 +6.965440000000000729e-07,2.993600000000000416e-08 +6.965460000000001281e-07,3.010399999999999613e-08 +6.965480000000000774e-07,2.889400000000000383e-08 +6.965500000000000268e-07,1.585299999999999975e-08 +6.965520000000000820e-07,1.514000000000000190e-08 +6.965540000000000313e-07,1.301500000000000107e-08 +6.965560000000000865e-07,5.718000000000000314e-09 +6.965580000000000358e-07,5.799999999999998996e-09 +6.965599999999999852e-07,1.544600000000000146e-08 +6.965620000000000404e-07,1.329899999999999885e-08 +6.965639999999999897e-07,8.360000000000000082e-09 +6.965660000000000449e-07,6.290000000000000406e-09 +6.965679999999999942e-07,1.330499999999999903e-08 +6.965700000000000494e-07,1.081410000000000053e-08 +6.965719999999999988e-07,1.167100000000000240e-08 +6.965739999999999481e-07,9.732999999999998546e-09 +6.965760000000001092e-07,1.543999999999999631e-09 +6.965780000000000585e-07,4.510999999999999829e-09 +6.965800000000001137e-07,4.210000000000000972e-09 +6.965820000000000631e-07,1.646400000000000105e-08 +6.965840000000000124e-07,7.263999999999999731e-09 +6.965860000000000676e-07,6.959999999999999127e-09 +6.965880000000000169e-07,1.530000000000001127e-09 +6.965900000000000721e-07,1.040000000000000048e-08 +6.965920000000000215e-07,-1.504000000000001424e-09 +6.965940000000000767e-07,-3.633999999999999652e-09 +6.965960000000000260e-07,-4.168000000000000496e-09 +6.965979999999999753e-07,-2.964000000000000932e-09 +6.966000000000000305e-07,6.061500000000000213e-09 +6.966019999999999799e-07,3.890000000000002077e-10 +6.966040000000000351e-07,5.855000000000000151e-09 +6.966060000000000903e-07,7.999999999999972374e-12 +6.966080000000000396e-07,-6.050000000000002889e-10 +6.966100000000000948e-07,3.609999999999998908e-10 +6.966120000000000441e-07,1.141199999999999988e-08 +6.966140000000000993e-07,-1.205999999999999971e-09 +6.966160000000000487e-07,1.579000000000000441e-09 +6.966180000000001039e-07,1.692000000000000361e-09 +6.966200000000000532e-07,-2.373300000000000066e-09 +6.966220000000000025e-07,6.863400000000000928e-09 +6.966240000000000577e-07,2.966280000000000225e-09 +6.966260000000000071e-07,-7.183000000000000528e-09 +6.966280000000000623e-07,5.885999999999999733e-09 +6.966300000000000116e-07,-5.854300000000000349e-09 +6.966319999999999609e-07,-1.825999999999999691e-09 +6.966340000000000161e-07,-9.542000000000000757e-10 +6.966359999999999655e-07,2.244000000000000109e-09 +6.966380000000001266e-07,-5.400000000000002032e-11 +6.966400000000000759e-07,-3.291000000000000319e-09 +6.966420000000001311e-07,-4.588000000000000287e-09 +6.966440000000000804e-07,-2.419999999999997847e-10 +6.966460000000000297e-07,-3.329000000000000395e-09 +6.966480000000000850e-07,1.268000000000000171e-09 +6.966500000000000343e-07,3.543199999999999924e-09 +6.966520000000000895e-07,4.907499999999999442e-09 +6.966540000000000388e-07,1.111399999999999946e-08 +6.966559999999999881e-07,6.621000000000000194e-09 +6.966580000000000434e-07,2.632699999999999811e-09 diff --git a/data/Argon_750nm.CSV b/data/Argon_750nm.CSV old mode 100755 new mode 100644 diff --git a/data/Balcon2008.csv b/data/Balcon2008.csv new file mode 100644 index 0000000..cb712d9 --- /dev/null +++ b/data/Balcon2008.csv @@ -0,0 +1,326 @@ +485.40000 0.00498 +485.40517 0.00498 +485.41004 0.00214 +485.41522 0.00356 +485.42009 0.00118 +485.42526 0.00308 +485.43013 0.00379 +485.43530 0.00095 +485.44018 0.00356 +485.44535 0.00047 +485.45021 0.00427 +485.45539 0.00237 +485.46026 0.01067 +485.46543 0.00569 +485.47030 0.00403 +485.47548 0.00521 +485.48035 0.00427 +485.48552 0.00189 +485.49039 0.00498 +485.49556 0.00237 +485.50044 0.00237 +485.50561 0.00237 +485.51047 0.00545 +485.51565 0.00474 +485.52053 0.00616 +485.52569 0.01114 +485.53056 0.00474 +485.53574 0.00118 +485.54061 0.00521 +485.54578 0.00024 +485.55065 0.00024 +485.55582 0.00332 +485.56070 0.00403 +485.56587 0.01209 +485.57074 0.00616 +485.57591 0.00498 +485.58079 0.00189 +485.58595 0.00071 +485.59082 0.00521 +485.59600 0.00758 +485.60087 0.00616 +485.60604 0.00332 +485.61091 0.00332 +485.61609 0.00427 +485.62096 0.00308 +485.62613 0.00118 +485.63100 0.00592 +485.63617 0.00308 +485.64105 0.00521 +485.64622 0.00189 +485.65108 0.00047 +485.65626 0.00142 +485.66113 0.00189 +485.66630 0.00450 +485.67117 0.00450 +485.67635 0.00285 +485.68122 0.00166 +485.68639 0.00308 +485.69126 0.00332 +485.69643 0.00142 +485.70131 0.00024 +485.70648 0.00024 +485.71135 0.00474 +485.71652 0.01161 +485.72140 0.00260 +485.72656 0.00948 +485.73143 0.00332 +485.73661 0.00900 +485.74148 0.00592 +485.74665 0.00616 +485.75152 0.00285 +485.75669 0.00592 +485.76157 0.00332 +485.76674 0.00166 +485.77161 0.00900 +485.77678 0.00971 +485.78166 0.01185 +485.78682 0.00900 +485.79169 0.00663 +485.79687 0.00948 +485.80174 0.01161 +485.80691 0.00640 +485.81178 0.01778 +485.81696 0.01564 +485.82183 0.01730 +485.82700 0.01303 +485.83187 0.02488 +485.83704 0.04147 +485.84192 0.05166 +485.84709 0.04526 +485.85195 0.03388 +485.85713 0.07038 +485.86201 0.05616 +485.86717 0.06303 +485.87204 0.05498 +485.87722 0.06564 +485.88209 0.07227 +485.88726 0.07701 +485.89213 0.08602 +485.89730 0.09384 +485.90218 0.08720 +485.90735 0.09455 +485.91222 0.09526 +485.91739 0.06967 +485.92227 0.07133 +485.92743 0.07512 +485.93230 0.07725 +485.93748 0.09171 +485.94235 0.09692 +485.94752 0.08531 +485.95239 0.09621 +485.95756 0.10924 +485.96244 0.10497 +485.96761 0.08862 +485.97248 0.10355 +485.97765 0.10332 +485.98253 0.11990 +485.98770 0.10497 +485.99256 0.11517 +485.99774 0.12749 +486.00261 0.14526 +486.00778 0.16493 +486.01265 0.15734 +486.01783 0.17749 +486.02270 0.19005 +486.02787 0.22275 +486.03274 0.21256 +486.03791 0.21185 +486.04279 0.22630 +486.04796 0.22796 +486.05282 0.22369 +486.05800 0.23009 +486.06288 0.25450 +486.06804 0.27512 +486.07291 0.28341 +486.07809 0.32417 +486.08296 0.35261 +486.08813 0.34881 +486.09300 0.42488 +486.09817 0.45474 +486.10305 0.49597 +486.10822 0.52725 +486.11309 0.58625 +486.11826 0.60213 +486.12314 0.60308 +486.12830 0.61019 +486.13317 0.65545 +486.13835 0.73175 +486.14322 0.79383 +486.14839 0.81967 +486.15326 0.83981 +486.15843 0.87441 +486.16331 0.90473 +486.16848 0.93530 +486.17335 0.94573 +486.17852 0.98246 +486.18340 0.97274 +486.18857 0.94360 +486.19343 0.93957 +486.19861 0.99928 +486.20348 1.00166 +486.20865 0.95403 +486.21352 0.96753 +486.21870 0.97014 +486.22357 0.93080 +486.22874 0.93554 +486.23361 0.91635 +486.23878 0.94526 +486.24366 0.90379 +486.24883 0.83270 +486.25369 0.79454 +486.25887 0.74810 +486.26375 0.72251 +486.26891 0.67938 +486.27378 0.62701 +486.27896 0.64383 +486.28383 0.59028 +486.28900 0.52061 +486.29387 0.45616 +486.29904 0.45711 +486.30392 0.39407 +486.30909 0.35379 +486.31396 0.34502 +486.31913 0.31113 +486.32401 0.28554 +486.32917 0.26304 +486.33404 0.24644 +486.33922 0.25971 +486.34409 0.23696 +486.34926 0.26422 +486.35413 0.21208 +486.35931 0.22583 +486.36418 0.21279 +486.36935 0.20687 +486.37422 0.20119 +486.37939 0.21683 +486.38427 0.21848 +486.38944 0.21943 +486.39430 0.20284 +486.39948 0.19218 +486.40435 0.17227 +486.40952 0.17749 +486.41439 0.17441 +486.41957 0.15971 +486.42444 0.12583 +486.42961 0.11682 +486.43448 0.11208 +486.43965 0.09715 +486.44453 0.08554 +486.44970 0.08554 +486.45457 0.07607 +486.45974 0.10853 +486.46462 0.05569 +486.46978 0.09573 +486.47465 0.07986 +486.47983 0.09005 +486.48470 0.08507 +486.48987 0.08887 +486.49474 0.06683 +486.49991 0.07323 +486.50479 0.09076 +486.50996 0.07962 +486.51483 0.06019 +486.52000 0.05948 +486.52488 0.06137 +486.53004 0.05237 +486.53491 0.04621 +486.54009 0.05332 +486.54496 0.03697 +486.55013 0.04597 +486.55500 0.04526 +486.56018 0.03484 +486.56505 0.02891 +486.57022 0.02441 +486.57509 0.01991 +486.58026 0.01185 +486.58514 0.02535 +486.59031 0.00782 +486.59517 0.02014 +486.60035 0.00877 +486.60523 0.01327 +486.61039 0.00806 +486.61526 0.01351 +486.62044 0.01374 +486.62531 0.00214 +486.63048 0.00403 +486.63535 0.01303 +486.64052 0.00403 +486.64540 0.00285 +486.65057 0.00000 +486.65544 0.00403 +486.66061 0.00403 +486.66549 0.00095 +486.67065 0.00237 +486.67552 0.00427 +486.68070 0.00640 +486.68557 0.00285 +486.69074 0.00545 +486.69561 0.00427 +486.70078 0.00166 +486.70566 0.00592 +486.71083 0.00047 +486.71570 0.00260 +486.72087 0.00711 +486.72575 0.00166 +486.73092 0.01114 +486.73578 0.00260 +486.74096 0.00829 +486.74583 0.00427 +486.75100 0.00616 +486.75587 0.00592 +486.76105 0.00616 +486.76592 0.00308 +486.77109 0.00379 +486.77596 0.00332 +486.78113 0.00332 +486.78601 0.00356 +486.79118 0.00237 +486.79604 0.00142 +486.80122 0.00332 +486.80610 0.00474 +486.81126 0.00308 +486.81613 0.00616 +486.82131 0.00142 +486.82618 0.00616 +486.83135 0.00640 +486.83622 0.00356 +486.84139 0.00948 +486.84627 0.00545 +486.85144 0.00308 +486.85631 0.00569 +486.86148 0.00829 +486.86636 0.00095 +486.87152 0.00640 +486.87639 0.00356 +486.88157 0.00214 +486.88644 0.00450 +486.89161 0.00047 +486.89648 0.00521 +486.90165 0.00047 +486.90653 0.00782 +486.91170 0.00071 +486.91657 0.00403 +486.92174 0.01398 +486.92662 0.00095 +486.93179 0.00474 +486.93665 0.00545 +486.94183 0.00450 +486.94670 0.00924 +486.95187 0.00450 +486.95674 0.00403 +486.96192 0.00782 +486.96679 0.00616 +486.97196 0.00521 +486.97683 0.00640 +486.98200 0.00521 +486.98688 0.00592 +486.99205 0.00071 +486.99691 0.00569 +487.00209 0.00521 +487.00697 0.01469 +487.01213 0.00285 +487.01700 0.00569 +487.02218 0.00189 +487.02705 0.00095 +487.03192 0.00379 diff --git a/data/Balcon2008.svg b/data/Balcon2008.svg new file mode 100644 index 0000000..2fb3ad0 --- /dev/null +++ b/data/Balcon2008.svg @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/Dong2005.csv b/data/Dong2005.csv new file mode 100644 index 0000000..5ee6d4c --- /dev/null +++ b/data/Dong2005.csv @@ -0,0 +1,40 @@ +696.04381 -0.00225 +696.06985 -0.00171 +696.09435 -0.00123 +696.11929 -0.00174 +696.14330 0.00124 +696.16934 -0.00203 +696.19456 0.00118 +696.21864 -0.00106 +696.24349 0.01082 +696.26966 0.01746 +696.29466 0.05565 +696.32044 0.09549 +696.34446 0.15323 +696.37012 0.21849 +696.39437 0.32768 +696.41937 0.42239 +696.44434 0.53908 +696.46883 0.62126 +696.49316 0.73833 +696.51814 0.78971 +696.54375 0.82117 +696.56909 0.75724 +696.59373 0.66981 +696.61780 0.56221 +696.64289 0.45523 +696.66866 0.31559 +696.69373 0.22316 +696.71749 0.14534 +696.74393 0.08920 +696.76871 0.04367 +696.79312 0.03693 +696.81843 0.02175 +696.84298 0.02580 +696.86809 0.00841 +696.89345 0.01944 +696.91828 0.00520 +696.94331 0.01124 +696.96830 -0.00045 +696.99416 0.00808 +697.01875 -0.00009 diff --git a/data/data.png b/data/Dong2005.png similarity index 100% rename from data/data.png rename to data/Dong2005.png diff --git a/data/Dong2005.svg b/data/Dong2005.svg new file mode 100644 index 0000000..dcc2b06 --- /dev/null +++ b/data/Dong2005.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/PureArgonMix_696_12v_1.CSV b/data/PureArgonMix_696_12v_1.CSV new file mode 100644 index 0000000..568bd47 --- /dev/null +++ b/data/PureArgonMix_696_12v_1.CSV @@ -0,0 +1,430 @@ +70CSV +// AQ6370 OPTICAL SPECTRUM ANALYZER // +25 +"CTRWL", 696.400000 +"SPAN", 0.800000 +"START WL", 696.000000 +"STOP WL", 696.800000 +"WLFREQ", 0 +"REFL", -66.990 +"LSCL",-2.0 +"BASEL",0.00000000000 +"RESLN",0.100 +"AVG", 1 +"SMPLAUTO", 1 +"SMPL", 401 +"SMPLINTVL",0.0020 +"HIGH3" +"RAVG", 20 +"LSUNT",1 +"NMSKH","OFF" +"RESCOR",0 +"RESPARM",10177 +"FREQPARM",10177 + + + + + +"[TRACE DATA]" + 696.0000,4.249E-008 + 696.0020,4.205E-008 + 696.0040,7.176E-008 + 696.0060,5.372E-008 + 696.0080,-2.693E-008 + 696.0100,2.163E-008 + 696.0120,-1.628E-009 + 696.0140,5.692E-008 + 696.0160,5.643E-008 + 696.0180,3.346E-008 + 696.0200,2.735E-008 + 696.0220,-6.197E-009 + 696.0240,5.382E-008 + 696.0260,8.566E-008 + 696.0280,-4.472E-008 + 696.0300,-8.057E-009 + 696.0320,6.685E-008 + 696.0340,2.873E-008 + 696.0360,1.553E-008 + 696.0380,3.476E-008 + 696.0400,4.466E-008 + 696.0420,3.341E-008 + 696.0440,2.025E-009 + 696.0460,-4.633E-008 + 696.0480,2.762E-008 + 696.0500,7.107E-009 + 696.0520,1.023E-008 + 696.0540,5.168E-008 + 696.0560,7.146E-010 + 696.0580,7.894E-009 + 696.0600,2.068E-009 + 696.0620,1.288E-008 + 696.0640,1.629E-008 + 696.0660,-3.342E-008 + 696.0680,2.956E-008 + 696.0700,3.387E-008 + 696.0720,4.733E-008 + 696.0740,-5.026E-008 + 696.0760,1.830E-008 + 696.0780,1.262E-008 + 696.0800,1.235E-008 + 696.0820,1.945E-008 + 696.0840,1.323E-008 + 696.0860,1.805E-008 + 696.0880,2.436E-008 + 696.0900,2.200E-008 + 696.0920,2.812E-008 + 696.0940,2.478E-008 + 696.0960,8.516E-009 + 696.0980,1.246E-008 + 696.1000,6.559E-009 + 696.1020,2.245E-008 + 696.1040,1.988E-008 + 696.1060,1.963E-008 + 696.1080,1.372E-008 + 696.1100,7.153E-009 + 696.1120,2.892E-008 + 696.1140,1.043E-008 + 696.1160,3.273E-008 + 696.1180,2.124E-008 + 696.1200,1.628E-008 + 696.1220,2.159E-008 + 696.1240,2.808E-008 + 696.1260,1.900E-008 + 696.1280,8.474E-009 + 696.1300,1.769E-008 + 696.1320,2.346E-008 + 696.1340,6.457E-009 + 696.1360,7.899E-009 + 696.1380,2.174E-008 + 696.1400,1.305E-008 + 696.1420,3.251E-008 + 696.1440,1.036E-008 + 696.1460,2.650E-008 + 696.1480,1.609E-008 + 696.1500,1.265E-008 + 696.1520,1.264E-008 + 696.1540,1.488E-008 + 696.1560,1.795E-008 + 696.1580,5.327E-009 + 696.1600,2.983E-008 + 696.1620,1.238E-008 + 696.1640,1.790E-008 + 696.1660,-4.108E-009 + 696.1680,1.395E-008 + 696.1700,2.177E-008 + 696.1720,3.178E-008 + 696.1740,1.984E-008 + 696.1760,2.438E-008 + 696.1780,1.479E-008 + 696.1800,1.756E-008 + 696.1820,1.972E-008 + 696.1840,1.535E-008 + 696.1860,1.302E-009 + 696.1880,2.121E-008 + 696.1900,1.935E-008 + 696.1920,8.729E-009 + 696.1940,1.324E-008 + 696.1960,2.326E-008 + 696.1980,1.499E-008 + 696.2000,2.739E-008 + 696.2020,1.988E-008 + 696.2040,1.295E-008 + 696.2060,2.970E-008 + 696.2080,9.848E-009 + 696.2100,8.328E-009 + 696.2120,3.321E-008 + 696.2140,1.024E-008 + 696.2160,1.714E-008 + 696.2180,1.377E-009 + 696.2200,1.796E-008 + 696.2220,1.615E-008 + 696.2240,1.684E-008 + 696.2260,9.584E-009 + 696.2280,2.560E-008 + 696.2300,2.236E-008 + 696.2320,9.972E-009 + 696.2340,1.161E-008 + 696.2360,1.205E-008 + 696.2380,8.755E-009 + 696.2400,1.989E-008 + 696.2420,1.437E-008 + 696.2440,2.235E-008 + 696.2460,-5.355E-010 + 696.2480,1.583E-008 + 696.2500,7.850E-009 + 696.2520,2.724E-008 + 696.2540,1.724E-008 + 696.2560,1.556E-008 + 696.2580,7.003E-009 + 696.2600,3.208E-008 + 696.2620,1.199E-008 + 696.2640,1.514E-008 + 696.2660,1.899E-008 + 696.2680,2.346E-008 + 696.2700,1.015E-008 + 696.2720,2.317E-008 + 696.2740,2.603E-008 + 696.2760,4.479E-008 + 696.2780,2.125E-008 + 696.2800,1.480E-008 + 696.2820,1.927E-008 + 696.2840,2.876E-008 + 696.2860,1.808E-008 + 696.2880,3.035E-008 + 696.2900,3.362E-008 + 696.2920,2.027E-008 + 696.2940,1.173E-008 + 696.2960,1.483E-008 + 696.2980,2.433E-008 + 696.3000,2.582E-008 + 696.3020,1.589E-008 + 696.3040,1.518E-008 + 696.3060,3.039E-008 + 696.3080,2.150E-008 + 696.3100,1.886E-008 + 696.3120,2.677E-008 + 696.3140,6.738E-009 + 696.3160,3.003E-008 + 696.3180,1.940E-008 + 696.3200,2.978E-008 + 696.3220,4.505E-008 + 696.3240,1.884E-008 + 696.3260,2.766E-008 + 696.3280,3.305E-008 + 696.3300,4.083E-008 + 696.3320,3.923E-008 + 696.3340,5.902E-008 + 696.3360,3.221E-008 + 696.3380,3.809E-008 + 696.3400,4.573E-008 + 696.3420,5.441E-008 + 696.3440,5.111E-008 + 696.3460,3.893E-008 + 696.3480,4.787E-008 + 696.3500,5.196E-008 + 696.3520,5.863E-008 + 696.3540,6.471E-008 + 696.3560,5.732E-008 + 696.3580,5.635E-008 + 696.3600,5.743E-008 + 696.3620,7.430E-008 + 696.3640,7.266E-008 + 696.3660,5.455E-008 + 696.3680,6.577E-008 + 696.3700,6.819E-008 + 696.3720,7.750E-008 + 696.3740,8.329E-008 + 696.3760,6.680E-008 + 696.3780,6.697E-008 + 696.3800,8.997E-008 + 696.3820,7.986E-008 + 696.3840,7.744E-008 + 696.3860,8.465E-008 + 696.3880,8.155E-008 + 696.3900,8.882E-008 + 696.3920,9.971E-008 + 696.3940,9.204E-008 + 696.3960,9.632E-008 + 696.3980,9.824E-008 + 696.4000,8.538E-008 + 696.4020,8.209E-008 + 696.4040,1.019E-007 + 696.4060,8.518E-008 + 696.4080,1.128E-007 + 696.4100,9.314E-008 + 696.4120,1.018E-007 + 696.4140,1.042E-007 + 696.4160,1.090E-007 + 696.4180,8.962E-008 + 696.4200,1.154E-007 + 696.4220,1.090E-007 + 696.4240,1.129E-007 + 696.4260,1.111E-007 + 696.4280,1.156E-007 + 696.4300,1.034E-007 + 696.4320,1.184E-007 + 696.4340,1.143E-007 + 696.4360,1.021E-007 + 696.4380,1.001E-007 + 696.4400,1.093E-007 + 696.4420,1.096E-007 + 696.4440,1.094E-007 + 696.4460,1.044E-007 + 696.4480,1.247E-007 + 696.4500,1.094E-007 + 696.4520,1.105E-007 + 696.4540,1.120E-007 + 696.4560,1.076E-007 + 696.4580,1.167E-007 + 696.4600,9.959E-008 + 696.4620,9.672E-008 + 696.4640,1.049E-007 + 696.4660,1.037E-007 + 696.4680,8.314E-008 + 696.4700,9.654E-008 + 696.4720,9.038E-008 + 696.4740,9.516E-008 + 696.4760,1.124E-007 + 696.4780,9.128E-008 + 696.4800,9.862E-008 + 696.4820,8.927E-008 + 696.4840,7.415E-008 + 696.4860,8.364E-008 + 696.4880,9.555E-008 + 696.4900,9.106E-008 + 696.4920,9.195E-008 + 696.4940,5.989E-008 + 696.4960,7.083E-008 + 696.4980,7.905E-008 + 696.5000,7.130E-008 + 696.5020,6.422E-008 + 696.5040,6.787E-008 + 696.5060,7.520E-008 + 696.5080,6.274E-008 + 696.5100,5.099E-008 + 696.5120,6.238E-008 + 696.5140,5.296E-008 + 696.5160,4.944E-008 + 696.5180,5.319E-008 + 696.5200,4.690E-008 + 696.5220,6.096E-008 + 696.5240,4.520E-008 + 696.5260,7.005E-008 + 696.5280,6.278E-008 + 696.5300,3.913E-008 + 696.5320,4.941E-008 + 696.5340,4.851E-008 + 696.5360,3.214E-008 + 696.5380,3.922E-008 + 696.5400,5.762E-008 + 696.5420,2.454E-008 + 696.5440,4.306E-008 + 696.5460,3.971E-008 + 696.5480,3.372E-008 + 696.5500,3.131E-008 + 696.5520,2.588E-008 + 696.5540,1.783E-008 + 696.5560,3.261E-008 + 696.5580,3.939E-008 + 696.5600,2.644E-008 + 696.5620,2.638E-008 + 696.5640,8.500E-009 + 696.5660,2.834E-008 + 696.5680,1.919E-008 + 696.5700,1.995E-008 + 696.5720,6.568E-009 + 696.5740,2.209E-008 + 696.5760,2.433E-008 + 696.5780,2.169E-008 + 696.5800,1.979E-008 + 696.5820,1.618E-008 + 696.5840,1.616E-008 + 696.5860,5.835E-009 + 696.5880,3.124E-008 + 696.5900,1.401E-008 + 696.5920,1.932E-008 + 696.5940,1.284E-008 + 696.5960,3.616E-008 + 696.5980,7.565E-009 + 696.6000,1.777E-008 + 696.6020,3.018E-008 + 696.6040,2.756E-008 + 696.6060,2.632E-008 + 696.6080,2.508E-008 + 696.6100,1.610E-008 + 696.6120,2.048E-008 + 696.6140,2.276E-008 + 696.6160,3.312E-008 + 696.6180,1.827E-008 + 696.6200,1.413E-008 + 696.6220,1.066E-008 + 696.6240,2.336E-008 + 696.6260,2.827E-008 + 696.6280,2.613E-008 + 696.6300,2.697E-008 + 696.6320,2.651E-008 + 696.6340,2.774E-008 + 696.6360,2.892E-008 + 696.6380,1.307E-008 + 696.6400,6.363E-009 + 696.6420,1.860E-008 + 696.6440,8.710E-009 + 696.6460,1.427E-008 + 696.6480,2.932E-008 + 696.6500,2.683E-008 + 696.6520,1.777E-008 + 696.6540,2.264E-008 + 696.6560,-1.402E-009 + 696.6580,5.626E-009 + 696.6600,2.977E-008 + 696.6620,3.118E-008 + 696.6640,1.082E-008 + 696.6660,1.869E-008 + 696.6680,1.849E-008 + 696.6700,2.608E-008 + 696.6720,2.053E-008 + 696.6740,2.180E-008 + 696.6760,1.776E-008 + 696.6780,2.488E-008 + 696.6800,1.753E-008 + 696.6820,1.883E-008 + 696.6840,2.158E-008 + 696.6860,2.333E-008 + 696.6880,4.083E-009 + 696.6900,1.714E-009 + 696.6920,2.130E-008 + 696.6940,2.228E-008 + 696.6960,2.503E-008 + 696.6980,2.694E-008 + 696.7000,2.636E-008 + 696.7020,5.236E-009 + 696.7040,2.383E-008 + 696.7060,2.497E-008 + 696.7080,1.581E-008 + 696.7100,2.930E-008 + 696.7120,1.767E-008 + 696.7140,1.976E-008 + 696.7160,1.555E-008 + 696.7180,1.269E-008 + 696.7200,4.294E-008 + 696.7220,2.694E-008 + 696.7240,2.286E-008 + 696.7260,1.887E-008 + 696.7280,2.019E-008 + 696.7300,1.563E-008 + 696.7320,2.339E-008 + 696.7340,2.159E-008 + 696.7360,1.241E-008 + 696.7380,1.705E-008 + 696.7400,2.943E-008 + 696.7420,3.443E-008 + 696.7440,1.792E-008 + 696.7460,1.642E-008 + 696.7480,1.766E-008 + 696.7500,1.664E-008 + 696.7520,1.081E-008 + 696.7540,2.831E-008 + 696.7560,1.767E-008 + 696.7580,2.383E-008 + 696.7600,1.637E-008 + 696.7620,2.354E-008 + 696.7640,1.244E-008 + 696.7660,1.427E-008 + 696.7680,2.304E-008 + 696.7700,2.030E-008 + 696.7720,1.823E-008 + 696.7740,2.385E-008 + 696.7760,1.225E-008 + 696.7780,2.137E-008 + 696.7800,2.524E-008 + 696.7820,2.150E-008 + 696.7840,1.369E-008 + 696.7860,1.434E-008 + 696.7880,9.798E-009 + 696.7900,2.189E-008 + 696.7920,2.465E-008 + 696.7940,3.869E-008 + 696.7960,2.886E-008 + 696.7980,2.891E-008 + 696.8000,2.910E-008 diff --git a/deploy.nu b/deploy.nu new file mode 100644 index 0000000..bd87f19 --- /dev/null +++ b/deploy.nu @@ -0,0 +1,18 @@ +#!/usr/bin/env nu + +let version = (open pyproject.toml).project.version +let zipfile = $"linemeasurement-($version).zip" + +let filelist = ( + git ls-files | + lines | + where {not ($in | str ends-with ".afphoto")} | + where {$in != "deploy.nu"} +) + +^zip $zipfile ...$filelist + +scp -O $zipfile $"fibnas:/volume1/web/($zipfile)" +scp -O $zipfile $"fibnas:/volume1/web/linemeasurement-latest.zip" + +rm $zipfile diff --git a/extract_points_balcon.py b/extract_points_balcon.py new file mode 100644 index 0000000..8074076 --- /dev/null +++ b/extract_points_balcon.py @@ -0,0 +1,138 @@ +from typing import Union +from xml.dom import minidom +import numpy as np +import matplotlib.pyplot as plt + +MX = [485.4, 485.4, 486.8] +MY = [1, 0, 0] + + +def str_pair_to_float(s: str) -> np.ndarray: + return np.array([float(el) for el in s.split(",")]) + + +def parse_buffer(s: str) -> Union[float, complex]: + x, *y = s.split(",") + if y: + return float(x) + 1j * float(y[0]) + else: + return float(x) + + +def transform_matrix_and_offset( + x: tuple[float, float, float], + y: tuple[float, float, float], + rx: tuple[float, float, float], + ry: tuple[float, float, float], +) -> tuple[np.ndarray, np.ndarray]: + a = -( + rx[0] * y[1] - rx[0] * y[2] - rx[1] * y[0] + rx[1] * y[2] + rx[2] * y[0] - rx[2] * y[1] + ) / (x[1] * y[0] - x[2] * y[0] - x[0] * y[1] + x[2] * y[1] + x[0] * y[2] - x[1] * y[2]) + b = -( + rx[0] * x[1] - rx[0] * x[2] - rx[1] * x[0] + rx[1] * x[2] + rx[2] * x[0] - rx[2] * x[1] + ) / (-x[1] * y[0] + x[2] * y[0] + x[0] * y[1] - x[2] * y[1] - x[0] * y[2] + x[1] * y[2]) + c = -( + ry[0] * y[1] - ry[0] * y[2] - ry[1] * y[0] + ry[1] * y[2] + ry[2] * y[0] - ry[2] * y[1] + ) / (x[1] * y[0] - x[2] * y[0] - x[0] * y[1] + x[2] * y[1] + x[0] * y[2] - x[1] * y[2]) + d = -( + -ry[0] * x[1] + ry[0] * x[2] + ry[1] * x[0] - ry[1] * x[2] - ry[2] * x[0] + ry[2] * x[1] + ) / (x[1] * y[0] - x[2] * y[0] - x[0] * y[1] + x[2] * y[1] + x[0] * y[2] - x[1] * y[2]) + e = -( + rx[0] * x[2] * y[1] + - rx[0] * x[1] * y[2] + - rx[1] * x[2] * y[0] + + rx[1] * x[0] * y[2] + + rx[2] * x[1] * y[0] + - rx[2] * x[0] * y[1] + ) / (-x[1] * y[0] + x[2] * y[0] + x[0] * y[1] - x[2] * y[1] - x[0] * y[2] + x[1] * y[2]) + f = -( + -ry[0] * x[2] * y[1] + + ry[0] * x[1] * y[2] + + ry[1] * x[2] * y[0] + - ry[1] * x[0] * y[2] + - ry[2] * x[1] * y[0] + + ry[2] * x[0] * y[1] + ) / (x[1] * y[0] - x[2] * y[0] - x[0] * y[1] + x[2] * y[1] + x[0] * y[2] - x[1] * y[2]) + return np.array([[a, b], [c, d]]), np.array([e, f]) + + +def parse_path(s: str) -> list[tuple[np.ndarray, np.ndarray]]: + INSTRUCTIONS = "mMlLhHvV" + lines: list[list[complex]] = [] + current_line: list[complex] = [] + pos = 0 + 0j + + def add_line_point(new_pos): + nonlocal pos + if not current_line: + current_line.append(pos) + pos = new_pos + current_line.append(pos) + + s = iter(s + "M") + instr = next(s) + buffer = "" + for char in s: + if char not in INSTRUCTIONS: + buffer += char + continue + arg = parse_buffer(buffer) + buffer = "" + if instr == "m": + if current_line: + lines.append(current_line) + current_line = [] + pos += arg + elif instr == "M": + if current_line: + lines.append(current_line) + current_line = [] + pos = arg + elif instr == "l": + add_line_point(pos + arg) + elif instr == "L": + add_line_point(arg) + elif instr == "v": + add_line_point(pos + 1j * arg) + elif instr == "V": + add_line_point(0 + 1j * arg) + elif instr == "h": + add_line_point(pos + arg) + elif instr == "H": + add_line_point(arg) + instr = char + if current_line: + lines.append(current_line) + + lines = np.array(lines) + return [(line.real, line.imag) for line in lines] + + +def main(): + with minidom.parse("./data/Balcon2008.svg") as doc: + rects = [ + ( + float(rect.getAttribute("x")) + float(rect.getAttribute("width")) / 2, + float(rect.getAttribute("y")) + float(rect.getAttribute("height")) / 2, + ) + for rect in doc.getElementsByTagName("rect") + ] + path_strings = [path.getAttribute("d") for path in doc.getElementsByTagName("path")] + + px, py = parse_path(path_strings[0])[0] + + M, off = transform_matrix_and_offset(px, py, MX, MY) + + x, y = (np.array(rects).dot(M.T) + off).T + s = x.argsort() + x = x[s] + y = y[s] + + np.savetxt("data/Balcon2008.csv", np.c_[x, y], fmt="%.5f") + + plt.plot(x, y) + plt.show() + + +if __name__ == "__main__": + main() diff --git a/extract_points_dong.py b/extract_points_dong.py new file mode 100644 index 0000000..036c458 --- /dev/null +++ b/extract_points_dong.py @@ -0,0 +1,135 @@ +from typing import Union +from xml.dom import minidom +import numpy as np +import matplotlib.pyplot as plt + +MX = [696, 696, 697.2] +MY = [1.2, 0, 0] + + +def str_pair_to_float(s: str) -> np.ndarray: + return np.array([float(el) for el in s.split(",")]) + + +def parse_buffer(s: str) -> Union[float, complex]: + x, *y = s.split(",") + if y: + return float(x) + 1j * float(y[0]) + else: + return float(x) + + +def transform_matrix_and_offset( + x: tuple[float, float, float], + y: tuple[float, float, float], + rx: tuple[float, float, float], + ry: tuple[float, float, float], +) -> tuple[np.ndarray, np.ndarray]: + a = -( + rx[0] * y[1] - rx[0] * y[2] - rx[1] * y[0] + rx[1] * y[2] + rx[2] * y[0] - rx[2] * y[1] + ) / (x[1] * y[0] - x[2] * y[0] - x[0] * y[1] + x[2] * y[1] + x[0] * y[2] - x[1] * y[2]) + b = -( + rx[0] * x[1] - rx[0] * x[2] - rx[1] * x[0] + rx[1] * x[2] + rx[2] * x[0] - rx[2] * x[1] + ) / (-x[1] * y[0] + x[2] * y[0] + x[0] * y[1] - x[2] * y[1] - x[0] * y[2] + x[1] * y[2]) + c = -( + ry[0] * y[1] - ry[0] * y[2] - ry[1] * y[0] + ry[1] * y[2] + ry[2] * y[0] - ry[2] * y[1] + ) / (x[1] * y[0] - x[2] * y[0] - x[0] * y[1] + x[2] * y[1] + x[0] * y[2] - x[1] * y[2]) + d = -( + -ry[0] * x[1] + ry[0] * x[2] + ry[1] * x[0] - ry[1] * x[2] - ry[2] * x[0] + ry[2] * x[1] + ) / (x[1] * y[0] - x[2] * y[0] - x[0] * y[1] + x[2] * y[1] + x[0] * y[2] - x[1] * y[2]) + e = -( + rx[0] * x[2] * y[1] + - rx[0] * x[1] * y[2] + - rx[1] * x[2] * y[0] + + rx[1] * x[0] * y[2] + + rx[2] * x[1] * y[0] + - rx[2] * x[0] * y[1] + ) / (-x[1] * y[0] + x[2] * y[0] + x[0] * y[1] - x[2] * y[1] - x[0] * y[2] + x[1] * y[2]) + f = -( + -ry[0] * x[2] * y[1] + + ry[0] * x[1] * y[2] + + ry[1] * x[2] * y[0] + - ry[1] * x[0] * y[2] + - ry[2] * x[1] * y[0] + + ry[2] * x[0] * y[1] + ) / (x[1] * y[0] - x[2] * y[0] - x[0] * y[1] + x[2] * y[1] + x[0] * y[2] - x[1] * y[2]) + return np.array([[a, b], [c, d]]), np.array([e, f]) + + +def parse_path(s: str) -> list[tuple[np.ndarray, np.ndarray]]: + INSTRUCTIONS = "mMlLhHvV" + lines: list[list[complex]] = [] + current_line: list[complex] = [] + pos = 0 + 0j + + def add_line_point(new_pos): + nonlocal pos + if not current_line: + current_line.append(pos) + pos = new_pos + current_line.append(pos) + + s = iter(s + "M") + instr = next(s) + buffer = "" + for char in s: + if char not in INSTRUCTIONS: + buffer += char + continue + arg = parse_buffer(buffer) + buffer = "" + if instr == "m": + if current_line: + lines.append(current_line) + current_line = [] + pos += arg + elif instr == "M": + if current_line: + lines.append(current_line) + current_line = [] + pos = arg + elif instr == "l": + add_line_point(pos + arg) + elif instr == "L": + add_line_point(arg) + elif instr == "v": + add_line_point(pos + 1j * arg) + elif instr == "V": + add_line_point(0 + 1j * arg) + elif instr == "h": + add_line_point(pos + arg) + elif instr == "H": + add_line_point(arg) + instr = char + if current_line: + lines.append(current_line) + + lines = np.array(lines) + return [(line.real, line.imag) for line in lines] + + +def main(): + with minidom.parse("./data/Dong2005.svg") as doc: + circles = [ + (float(circ.getAttribute("cx")), float(circ.getAttribute("cy"))) + for circ in doc.getElementsByTagName("circle") + ] + path_strings = [path.getAttribute("d") for path in doc.getElementsByTagName("path")] + + px, py = parse_path(path_strings[0])[0] + + M, off = transform_matrix_and_offset(px, py, MX, MY) + + x, y = (np.array(circles).dot(M.T) + off).T + s = x.argsort() + x = x[s] + y = y[s] + + np.savetxt("data/Dong2005.csv", np.c_[x, y], fmt="%.5f") + + plt.plot(x, y) + plt.show() + + +if __name__ == "__main__": + main() diff --git a/playground.py b/playground.py new file mode 100644 index 0000000..f1979cb --- /dev/null +++ b/playground.py @@ -0,0 +1,50 @@ +from collections import namedtuple +import itertools +from scipy.optimize import root + +Args = namedtuple("Args", ["alpha", "w", "Te"]) + +ARG1 = Args(0.04, 0.00409, 5_000) +ARG2 = Args(0.032, 0.00537, 10_000) +ARG3 = Args(0.023, 0.00873, 40_000) + + +def L_stark(Ne: float, alpha: float, w: float, Te: float) -> float: + """computes stark broadening + + Parameters + ---------- + Ne : float + free electron density in 1e15 / cm^3 + alpha : float + static ion-broadening parameter + w : float + electron impact parameter in nm/1e16/cm^3 + Te : float + electron temperature in K + + Returns + ------- + float + Stark broadening in nm + """ + Ne = 1e15 * Ne + return ( + 2e-16 + * (1 + 1.75e-4 * (Ne ** 0.25) * alpha * (1 - 0.068 * (Te ** -0.5) * (Ne ** (1 / 6)))) + * w + * Ne + ) + + +def main(): + for ls, args in itertools.product([0.001, 0.003, 0.009], [ARG1, ARG2, ARG3]): + + def to_root(Ne): + return L_stark(Ne, *args) - ls + + print(ls, args.Te, root(to_root, 1.0).x) + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..dc6947e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,18 @@ +[build-system] +requires = ["setuptools >= 65.0.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "linemeasurement" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.10" +dependencies = ["click", "numpy", "plotapp", "scipy"] + +[project.scripts] +linemeasurement = "linemeasurement.__main__:main" + + +[tool.uv.sources] +plotapp = { url = "http://130.92.113.172/plotapp-0.1.1.zip" } diff --git a/src/linemeasurement/__main__.py b/src/linemeasurement/__main__.py new file mode 100644 index 0000000..4486b18 --- /dev/null +++ b/src/linemeasurement/__main__.py @@ -0,0 +1,296 @@ +import click +import numpy as np +from linemeasurement.osa import load as osaload +from linemeasurement.profiles import ( + VoigtFitResult, + add_noise, + convolve, + elevated_gaussian, + fft_gaussian, + fft_lorentzian, + fft_voigt, + gaussian, + linear_direct_voigt_fit, + linear_fft_voigt_fit, + log_direct_voigt_fit, + lorentzian, + single_func_fit, + voigt, +) +from plotapp import PlotApp +from scipy.interpolate import interp1d +from scipy.signal import wiener + +LN2 = np.log(2) + + +def setup_axes(n: int, lims=(-10, 10)) -> tuple[np.ndarray, float, np.ndarray, float]: + """Creates a time-like and a frequency-like array and returns their respective spacing""" + x, dx = np.linspace(*lims, n, retstep=True) + f = np.fft.fftfreq(n, dx) + return x, dx, f, f[1] - f[0] + + +def freq_axis(x: np.ndarray) -> tuple[np.ndarray, np.ndarray, float]: + """ + given an array with equally spaced values, returns a corresponding frequency array, + an array of indices to automatically sort ffts and the x spacing + """ + dx = np.diff(x).mean() + f = np.fft.fftfreq(len(x), dx) + ind = np.argsort(f) + return f[ind], ind, dx + + +@click.group() +def main(): + pass + + +@main.command(help="fit a lorentzian with a gaussian") +def demo1(): + x = np.linspace(-10, 10, 501) + with PlotApp( + FWHM=np.geomspace(0.1, 10), + relative_noise=np.linspace(0, 2), + absolute_noise=[0, *np.geomspace(0.001, 1)], + ) as app: + app.set_antialiasing(True) + app.params["FWHM"].value = 3.7 + + @app.update + def draw(FWHM, relative_noise, absolute_noise): + lo = lorentzian(x, 1, FWHM, 0) + lo = add_noise(lo, absolute_noise, relative_noise * 0.04) + fit = single_func_fit(x, lo, gaussian) + app[0].set_line_data("Lorentzian", x, lo, width=2) + app[0].set_line_data( + "gaus fit", x, fit.curve, width=2, label=f"Gaussian fit : FWHM = {fit.width}" + ) + + +@main.command(name="default", help="illustrate the influence of noises and fit a voigt profile") +def demo2(): + with PlotApp( + n=np.arange(256, 2046), + lorentz_fwhm=np.geomspace(0.1, 1), + gauss_fwhm=np.linspace(1, 10), + relative_noise=np.linspace(0, 2), + absolute_noise=[0, *np.geomspace(1e-6, 1, 201)], + ) as app: + app.set_antialiasing(True) + v_ax = app["Voigt"] + l_ax = app["Lorentz"] + g_ax = app["Gauss"] + l_ax.link_x(v_ax) + g_ax.link_x(v_ax) + + app.params["gauss_fwhm"].value = 5 + app.params["n"].value = 1024 + app.params_layout.setSpacing(0) + + @app.update + def draw(n, lorentz_fwhm, gauss_fwhm, absolute_noise, relative_noise): + x, dx, f, df = setup_axes(n, (-20, 20)) + gaus = gaussian(x, 1, gauss_fwhm, 0) + lore = lorentzian(x, 1, lorentz_fwhm, 0) + g_ax.set_line_data("Gaussian", x, gaus / gaus.max(), width=2) + l_ax.set_line_data("Lorentz", x, lore / lore.max(), width=2) + + conv = convolve(gaus, lore) + conv /= conv.max() + conv_noise = add_noise(conv, absolute_noise, relative_noise * 0.1) + gaus_noise = add_noise(gaus, absolute_noise, relative_noise * 0.1) + v_ax.set_line_data("Voigt", x, conv, width=2) + v_ax.set_line_data("Noisy Voigt", x, conv_noise, width=2) + g_ax.set_line_data("Noisy Gaussian", x, gaus_noise, width=2) + + lin_fit = linear_direct_voigt_fit(x, conv_noise) + log_fit = log_direct_voigt_fit(x, conv_noise) + transfo = np.fft.fft(np.fft.fftshift(conv_noise)).real + fft_fit = linear_fft_voigt_fit(f, transfo, x, dx) + for fit in lin_fit, log_fit, fft_fit: + display_fit(x, fit) + + def display_fit(x: np.ndarray, fit: VoigtFitResult): + v_ax.set_line_data(fit.name, x, fit.curve) + g_ax.set_line_data( + fit.name + "gauss", + x, + gaussian(x, fit.amp, fit.gaussian_width, 0), + label=f"{fit.name} - Gaussian {fit.gaussian_width:.2f}", + width=1.5, + ) + l_ax.set_line_data( + fit.name + "loren", + x, + lorentzian(x, fit.amp, fit.lorentzian_width, 0), + label=f"{fit.name} - Lorentzian {fit.lorentzian_width:.2f}", + width=1.5, + ) + + +@main.command(help="Explore fft fitting") +def demo3(): + x, dx, f, df = setup_axes(1001, (-20, 20)) + with PlotApp( + lorentz_fwhm=np.geomspace(0.1, 1), + gauss_fwhm=np.linspace(1, 10), + relative_noise=np.linspace(0, 2), + absolute_noise=[0, *np.geomspace(1e-6, 1, 201)], + ) as app: + app.set_antialiasing(True) + + ax = app[0] + ind = np.argsort(f) + + @app.update + def draw(lorentz_fwhm, gauss_fwhm, absolute_noise, relative_noise): + gaus_clean = gaussian(x, 1, gauss_fwhm, 0) + lore_clean = lorentzian(x, 1, lorentz_fwhm, 0) + voig_clean = convolve(gaus_clean, lore_clean) + + gaus = add_noise(gaus_clean, absolute_noise, relative_noise * 0.1) + lore = add_noise(lore_clean, absolute_noise, relative_noise * 0.1) + voig = add_noise(voig_clean, absolute_noise, relative_noise * 0.1) + + gaus_f = np.fft.fft(np.fft.fftshift(gaus)).real + lore_f = np.fft.fft(np.fft.fftshift(lore)).real + voig_f = np.fft.fft(np.fft.fftshift(voig)).real + + ax.set_line_data("Transformed Gaussian", f[ind], gaus_f[ind]) + ax.set_line_data("Transformed Lorentz", f[ind], lore_f[ind]) + ax.set_line_data("Transformed Voigt", f[ind], voig_f[ind]) + + gaus_ff = fft_gaussian(f, dx, 1, gauss_fwhm) + lore_ff = fft_lorentzian(f, dx, 1, lorentz_fwhm) + voig_ff = fft_voigt(f, dx, gauss_fwhm, lorentz_fwhm) * voig_clean.sum() + + ax.set_line_data("Expected Gaussian", f[ind], gaus_ff[ind], width=1) + ax.set_line_data("Expected Lorentz", f[ind], lore_ff[ind], width=1) + ax.set_line_data("Expected Voigt", f[ind], voig_ff[ind], width=1) + + +@click.option("--all", "show_all", default=False, is_flag=True) +@click.option("--file", "-f", type=click.Path(True, dir_okay=False), required=True, prompt=True) +@main.command(name="fit") +def fit_measurement(file, show_all): + raw_wl, raw_intens = osaload(file, normalize=True) + _o = raw_wl.argsort() + raw_intens = raw_intens[_o] + raw_wl = raw_wl[_o] + del _o + if raw_wl[0] < 1: + raw_wl *= 1e9 + + with PlotApp( + center_wl=np.linspace(raw_wl.min(), raw_wl.max(), 8192), + span=np.geomspace(0.001, raw_wl[-1] - raw_wl[0], 1024), + filter=range(0, 30, 3), + ) as app: + app.set_antialiasing(True) + + ax1 = app["Measurement"] + ax2 = app["Fourier domain"] + baseline = 0.0 + + app.params["center_wl"].value = raw_wl[raw_intens.argmax()] + app.params["span"].value = app.params["span"].values()[-1] + + @app.update + def draw(center_wl, span, filter): + nonlocal baseline + + # Crop spectrum around peak + left_index = np.argmin(np.abs(raw_wl - (center_wl - span / 2))) + right_index = np.argmin(np.abs(raw_wl - (center_wl + span / 2))) + intens = raw_intens[left_index : right_index + 1] + wl = raw_wl[left_index : right_index + 1] + + print(len(wl), len(intens)) + + # Fit rough gaussian to find peak + gauss_fit = single_func_fit(wl, intens, elevated_gaussian, extra_params=1) + wl0 = gauss_fit.x0 + baseline = intens[:10].mean() + # intens -= baseline + # gauss_fit.curve -= baseline + intens[intens < 0] = 0 + + # center spectrum around 0 + ax1.set_line_data("Measured spectrum", raw_wl - wl0, raw_intens, width=2, color="red") + # ax1.set_line_data( + # "Initial Guassian fit", raw_wl - wl0, gauss_fit.curve, width=2, color="blue" + # ) + + new_wl = np.linspace(-span / 2, span / 2, 1024) + intens = interp1d(wl - wl0, intens, bounds_error=False, fill_value=0)(new_wl) + wl = new_wl + # wl -= wl0 + + intens_fit = intens - baseline + if filter: + intens_fit = wiener(intens_fit, filter) + f, ind, dwl = freq_axis(wl) + + ax1.set_line_data("Spectrum to fit", wl, intens_fit + baseline) + + trans = np.abs(np.fft.fft(intens_fit))[ind] + ax2.set_line_data("Transformed", f, trans) + ax2.lines["Transformed"].setZValue(10) + + display_fit(wl, dwl, f, linear_direct_voigt_fit(wl, intens_fit)) + # display_fit(wl, dwl, f, linear_fft_voigt_fit(f, trans, wl, dwl)) + # display_fit(wl, dwl, f, log_direct_voigt_fit(wl, intens_fit)) + + def display_fit(x: np.ndarray, dx: float, f: np.ndarray, fit: VoigtFitResult): + ax2.set_line_data( + fit.name, + f, + fft_voigt(f, dx, fit.amp, fit.gaussian_width, fit.lorentzian_width), + ) + ax1.set_line_data(fit.name, x, fit.curve + baseline) + if show_all: + ax1.set_line_data( + fit.name + "gauss", + x, + gaussian(x, 1, fit.gaussian_width, 0) + baseline, + label=f"{fit.name} - Gaussian {fit.gaussian_width:.4g}", + width=1.5, + ) + ax1.set_line_data( + fit.name + "lorentz", + x, + lorentzian(x, 1, fit.lorentzian_width, 0) + baseline, + label=f"{fit.name} - Lorentzian {fit.lorentzian_width:.4g}", + width=1.5, + ) + + +@main.command(name="test", help="test scaling of voigt profile") +def test_amp(): + x, dx, f, df = setup_axes(1001, (-20, 20)) + with PlotApp( + lorentz_fwhm=np.geomspace(0.1, 1), gauss_fwhm=np.linspace(1, 10), amp=np.linspace(1, 7) + ) as app: + app.set_antialiasing(True) + + ax1 = app["Main"] + ax2 = app["Fourrier"] + ind = np.argsort(f) + + @app.update + def draw(lorentz_fwhm, gauss_fwhm, amp): + vo = voigt(x, amp, gauss_fwhm, lorentz_fwhm) + trans = np.fft.fft(np.fft.fftshift(vo)) + expected = fft_voigt(f, dx, amp, gauss_fwhm, lorentz_fwhm) + back_transformed = np.fft.fftshift(np.fft.ifft(expected).real) + + ax1.set_line_data("original", x, vo) + ax1.set_line_data("back tranformed", x, back_transformed) + ax2.set_line_data("expected", f[ind], expected[ind]) + ax2.set_line_data("original transformed", f[ind], trans[ind].real) + + +if __name__ == "__main__": + main() diff --git a/deconvolution.py b/src/linemeasurement/deconvolution.py similarity index 77% rename from deconvolution.py rename to src/linemeasurement/deconvolution.py index def8257..7ff5fc7 100644 --- a/deconvolution.py +++ b/src/linemeasurement/deconvolution.py @@ -2,11 +2,13 @@ from dataclasses import dataclass, field from typing import Callable import click -import labmodule as lab import numpy as np -from customfunc.app import PlotApp -from scipy.optimize import curve_fit +from plotapp import PlotApp from scipy.interpolate import interp1d +from scipy.optimize import curve_fit +from scipy.signal import wiener + +from .osa import load as osaload LN2 = np.log(2) @@ -43,6 +45,56 @@ class VoigtFitResult: ) +def load_osa_spectrum( + data: Union[os.PathLike, str], lvl_col: int = 1, normalize: bool = True, ret_props=False +) -> tuple[np.ndarray, np.ndarray]: + """Read files from Yokogawa optical spectrum analyzers + + Parameters + ---------- + data : os.PathLike | str + path to the file or raw data + lvl_col : int, optional + index of the intensity column, by default 1 + normalize : bool, optional + whether to shift the maximum to 0, by default True + + Returns + ------- + wavelength : np.ndarray + wavelength in m + intensity : np.ndarray + recorded intensity in dB + """ + props = {} + if isinstance(data, str) and not os.path.exists(data): + s = data.splitlines() + else: + with open(data) as f: + s = f.readlines() + s = iter(s) + for line in s: + if "[TRACE DATA]" in line: + break + if ret_props and line.startswith('"'): + k, v = parse_osa_prop_line(line) + props[k] = v + to_load = "\n".join([el.strip() for el in s]) + wl, intens = np.loadtxt( + StringIO(to_load), delimiter=",", usecols=(0, lvl_col), unpack=True, comments='"' + ) + if normalize: + if (intens < 0).sum() < len(intens) / 10: + intens -= intens.min() + intens /= intens.max() + else: + intens -= intens.max() + if ret_props: + return 1e-9 * wl, intens, props + else: + return 1e-9 * wl, intens + + def setup_axes(n: int, lims=(-10, 10)) -> tuple[np.ndarray, float, np.ndarray, float]: """Creates a time-like and a frequency-like array and returns their respective spacing""" x, dx = np.linspace(*lims, n, retstep=True) @@ -61,6 +113,15 @@ def freq_axis(x: np.ndarray) -> tuple[np.ndarray, np.ndarray, float]: return f[ind], ind, dx +def rough_fwhm(x: np.ndarray, y: np.ndarray) -> float: + m2 = y.max() / 2 + ind = np.where(y >= m2)[0] + return ( + x[np.minimum(ind + 1, len(x) - 1)][x[ind].argmax()] + - x[np.maximum(0, ind - 1)][x[ind].argmin()] + ) + + def lorentzian(x: np.ndarray, amp: float, width: float, x0: float) -> np.ndarray: """Lorentzian function of max `amp`, FWHM `width` and position `x0`""" gamma = (width * 0.5) ** 2 @@ -89,13 +150,13 @@ def fft_lorentzian(f: np.ndarray, dx: float, amp: float, width: float) -> np.nda def gaussian(x: np.ndarray, amp: float, width: float, x0: float) -> np.ndarray: """Gaussian function of max `amp`, FWHM `width` and position `x0`""" - sig2 = width ** 2 / (8 * LN2) + sig2 = width**2 / (8 * LN2) return amp * np.exp(-((x - x0) ** 2) / (2 * sig2)) def elevated_gaussian(x: np.ndarray, amp: float, width: float, x0: float, y0: float) -> np.ndarray: """Gaussian function of max `amp`, FWHM `width`, position `x0` and baseline `y0`""" - sig2 = width ** 2 / (8 * LN2) + sig2 = width**2 / (8 * LN2) return amp * np.exp(-((x - x0) ** 2) / (2 * sig2)) + y0 @@ -177,15 +238,25 @@ def single_func_fit( fct = _fct am = y.argmax() + xm = x.mean() + fwhm = rough_fwhm(x, y) params, cov = curve_fit( - fct, x, y, sigma=1 / y if use_weights else None, p0=[y[am], 1, x[am]] + [0] * extra_params + fct, + x - xm, + y, + sigma=1 / y if use_weights else None, + p0=[y[am], fwhm, x[am] - xm] + [0] * extra_params, ) + params[2] += xm curve = fct(x, *params) return FitResult(curve, cov, params[0], params[1], params[2], tuple(params)) def linear_direct_voigt_fit(x: np.ndarray, y: np.ndarray, use_weights=False) -> VoigtFitResult: - params, cov = curve_fit(voigt, x, y, sigma=1 / y if use_weights else None) + fwhm = rough_fwhm(x, y) + params, cov = curve_fit( + voigt, x, y, sigma=1 / y if use_weights else None, p0=[y.max(), fwhm / 2, fwhm / 2] + ) curve = voigt(x, *params) return VoigtFitResult("Linear direct fit", curve, cov, *params) @@ -200,8 +271,13 @@ def log_direct_voigt_fit(x: np.ndarray, y: np.ndarray) -> VoigtFitResult: def linear_fft_voigt_fit(f: np.ndarray, A: np.ndarray, x: np.ndarray, dx: float) -> VoigtFitResult: + fwhm = 4 * LN2 / (np.pi * rough_fwhm(f, A)) params, cov = curve_fit( - lambda _f, _a, _g, _l: fft_voigt(_f, dx, _a, _g, _l), f, A, bounds=[1e-12, np.inf] + lambda _f, _amp, _gau, _lor: fft_voigt(_f, dx, _amp, _gau, _lor), + f, + A, + bounds=[1e-12, np.inf], + p0=[A.max(), fwhm, fwhm / 10], ) curve = voigt(x, *params) return VoigtFitResult("Linear FFT fit", curve, cov, *params) @@ -249,7 +325,11 @@ def demo2(): absolute_noise=[0, *np.geomspace(1e-6, 1, 201)], ) as app: app.set_antialiasing(True) - ax = app["Main Plot"] + v_ax = app["Voigt"] + l_ax = app["Lorentz"] + g_ax = app["Gauss"] + l_ax.link_x(v_ax) + g_ax.link_x(v_ax) app.params["gauss_fwhm"].value = 5 app.params["n"].value = 1024 @@ -260,37 +340,37 @@ def demo2(): x, dx, f, df = setup_axes(n, (-20, 20)) gaus = gaussian(x, 1, gauss_fwhm, 0) lore = lorentzian(x, 1, lorentz_fwhm, 0) - ax.set_line_data("Gaussian", x, gaus / gaus.max(), width=2) - ax.set_line_data("Lorentz", x, lore / lore.max(), width=2) + g_ax.set_line_data("Gaussian", x, gaus / gaus.max(), width=2) + l_ax.set_line_data("Lorentz", x, lore / lore.max(), width=2) conv = convolve(gaus, lore) conv /= conv.max() conv_noise = add_noise(conv, absolute_noise, relative_noise * 0.1) gaus_noise = add_noise(gaus, absolute_noise, relative_noise * 0.1) - ax.set_line_data("Voigt", x, conv, width=2) - ax.set_line_data("Noisy Voigt", x, conv_noise, width=2) - ax.set_line_data("Noisy Gaussian", x, gaus_noise, width=2) + v_ax.set_line_data("Voigt", x, conv, width=2) + v_ax.set_line_data("Noisy Voigt", x, conv_noise, width=2) + g_ax.set_line_data("Noisy Gaussian", x, gaus_noise, width=2) lin_fit = linear_direct_voigt_fit(x, conv_noise) log_fit = log_direct_voigt_fit(x, conv_noise) transfo = np.fft.fft(np.fft.fftshift(conv_noise)).real - fft_fit = linear_fft_voigt_fit(f, transfo / transfo.max(), x, dx) + fft_fit = linear_fft_voigt_fit(f, transfo, x, dx) for fit in lin_fit, log_fit, fft_fit: display_fit(x, fit) def display_fit(x: np.ndarray, fit: VoigtFitResult): - ax.set_line_data(fit.name, x, fit.curve) - ax.set_line_data( + v_ax.set_line_data(fit.name, x, fit.curve) + g_ax.set_line_data( fit.name + "gauss", x, - gaussian(x, 1, fit.gaussian_width, 0), + gaussian(x, fit.amp, fit.gaussian_width, 0), label=f"{fit.name} - Gaussian {fit.gaussian_width:.2f}", width=1.5, ) - ax.set_line_data( + l_ax.set_line_data( fit.name + "loren", x, - lorentzian(x, 1, fit.lorentzian_width, 0), + lorentzian(x, fit.amp, fit.lorentzian_width, 0), label=f"{fit.name} - Lorentzian {fit.lorentzian_width:.2f}", width=1.5, ) @@ -337,25 +417,26 @@ def demo3(): ax.set_line_data("Expected Voigt", f[ind], voig_ff[ind], width=1) -@click.argument("file", type=click.Path(True, dir_okay=False)) @click.option("--all", "show_all", default=False, is_flag=True) +@click.option("--file", "-f", type=click.Path(True, dir_okay=False), required=True, prompt=True) @main.command(name="fit") def fit_measurement(file, show_all): - raw_wl, intens = lab.osa.load_osa_spectrum(file) - raw_wl *= 1e9 + raw_wl, intens = osaload(file, normalize=True) + if raw_wl[0] < 1: + raw_wl *= 1e9 gauss_fit = single_func_fit(raw_wl, intens, elevated_gaussian, extra_params=1) wl0 = gauss_fit.x0 - baseline = gauss_fit.params[-1] - intens -= baseline - gauss_fit.curve -= baseline + baseline = intens[:10].mean() + # intens -= baseline + # gauss_fit.curve -= baseline intens[intens < 0] = 0 lim = np.max(np.abs(raw_wl - wl0)) - new_wl = np.linspace(-lim, lim, 2048) + new_wl = np.linspace(-lim, lim, 1024) intens = interp1d(raw_wl - wl0, intens, bounds_error=False, fill_value=0)(new_wl) wl = new_wl - with PlotApp(n=np.arange(len(wl) // 2)) as app: + with PlotApp(num_skipped=np.arange(len(wl) // 2), filter=range(0, 30, 3)) as app: app.set_antialiasing(True) ax1 = app["Measurement"] @@ -367,14 +448,17 @@ def fit_measurement(file, show_all): # ax1.plot_widget.plotItem.setLogMode(y=True) @app.update - def draw(n): - s = slice(n, -n) if n else slice(None) + def draw(num_skipped, filter): + n, r = divmod(num_skipped, 2) + s = slice(n + r, -n) if n else slice(None) wl_fit = wl[s] - intens_fit = intens[s] - intens[s].min() + intens_fit = intens[s] - baseline + if filter: + intens_fit = wiener(intens_fit, filter) f, ind, dwl = freq_axis(wl_fit) - ax1.set_line_data("Fitted spectrum", wl_fit, intens_fit) + ax1.set_line_data("Fitted spectrum", wl_fit, intens_fit + baseline) trans = np.abs(np.fft.fft(intens_fit))[ind] ax2.set_line_data("Transformed", f, trans) @@ -392,20 +476,20 @@ def fit_measurement(file, show_all): f, fft_voigt(f, dx, fit.amp, fit.gaussian_width, fit.lorentzian_width), ) - ax1.set_line_data(fit.name, x, fit.curve) + ax1.set_line_data(fit.name, x, fit.curve + baseline) if show_all: ax1.set_line_data( fit.name + "gauss", x, - gaussian(x, 1, fit.gaussian_width, 0), - label=f"{fit.name} - Gaussian {fit.gaussian_width:.3f}", + gaussian(x, 1, fit.gaussian_width, 0) + baseline, + label=f"{fit.name} - Gaussian {fit.gaussian_width:.4g}", width=1.5, ) ax1.set_line_data( fit.name + "lorentz", x, - lorentzian(x, 1, fit.lorentzian_width, 0), - label=f"{fit.name} - Lorentzian {fit.lorentzian_width:.3f}", + lorentzian(x, 1, fit.lorentzian_width, 0) + baseline, + label=f"{fit.name} - Lorentzian {fit.lorentzian_width:.4g}", width=1.5, ) diff --git a/src/linemeasurement/osa.py b/src/linemeasurement/osa.py new file mode 100644 index 0000000..e5448d9 --- /dev/null +++ b/src/linemeasurement/osa.py @@ -0,0 +1,112 @@ +import os +from functools import lru_cache +from io import StringIO +from pathlib import Path +from typing import Any, Union + +import numpy as np + + +def parse_osa_prop_line(s: str) -> tuple[str, Any]: + vals = s.split('"') + if vals[0]: + raise ValueError() + key = vals[1].lower().replace(" ", "_") + if len(vals) <= 2: + return key, True + val_str = vals[2].replace(",", "").strip() + if val_str == '"OFF"': + return key, False + for fct in int, float: + try: + val = fct(val_str) + return key, val + except ValueError: + continue + + return key, val_str + + +@lru_cache +def load_osa_spectrum( + data: Union[os.PathLike, str], lvl_col: int = 1, normalize: bool = True, ret_props=False +) -> tuple[np.ndarray, np.ndarray]: + """Read files from Yokogawa optical spectrum analyzers + + Parameters + ---------- + data : os.PathLike | str + path to the file or raw data + lvl_col : int, optional + index of the intensity column, by default 1 + normalize : bool, optional + whether to shift the maximum to 0, by default True + + Returns + ------- + wavelength : np.ndarray + wavelength in m + intensity : np.ndarray + recorded intensity in dB + """ + props = {} + if isinstance(data, str) and not os.path.exists(data): + s = data.splitlines() + else: + with open(data) as f: + s = f.readlines() + s = iter(s) + for line in s: + if "[TRACE DATA]" in line: + break + if ret_props and line.startswith('"'): + k, v = parse_osa_prop_line(line) + props[k] = v + to_load = "\n".join([el.strip() for el in s]) + wl, intens = np.loadtxt( + StringIO(to_load), delimiter=",", usecols=(0, lvl_col), unpack=True, comments='"' + ) + if normalize: + if (intens < 0).sum() < len(intens) / 10: + intens -= intens.min() + intens /= intens.max() + else: + intens -= intens.max() + if ret_props: + return 1e-9 * wl, intens, props + else: + return 1e-9 * wl, intens + + +def load_avantes( + data: Union[os.PathLike, str], usecols=(0, 1), skiprows=8 +) -> tuple[np.ndarray, np.ndarray]: + if isinstance(data, str): + s = data + else: + s = Path(data).read_text() + s = s.replace(",", ".") + return np.loadtxt(StringIO(s), delimiter=";", usecols=usecols, skiprows=skiprows, unpack=True) + + +def load(path: os.PathLike, normalize=False) -> tuple[np.ndarray, np.ndarray]: + s = Path(path).read_text() + wl = None + if "[TRACE DATA]" in s: + wl, i = load_osa_spectrum(s, normalize=False) + elif "Integration time [ms]" in s: + wl, i = load_avantes(s) + else: + for lim in [None, ",", ";"]: + try: + wl, i = np.loadtxt(StringIO(s), delimiter=lim, unpack=True) + break + except ValueError: + continue + if wl is None: + raise ValueError(f"Could not load a spectrum from {path}") + + if normalize: + i -= i.min() + i /= i.max() + return wl, i diff --git a/src/linemeasurement/profiles.py b/src/linemeasurement/profiles.py new file mode 100644 index 0000000..ff8e1a6 --- /dev/null +++ b/src/linemeasurement/profiles.py @@ -0,0 +1,214 @@ +from dataclasses import dataclass, field +from typing import Callable + +import numpy as np +from scipy.optimize import curve_fit + +LN2 = np.log(2) + + +@dataclass +class FitResult: + curve: np.ndarray = field(repr=False) + covariance: np.ndarray + amp: float + width: float + x0: float = 0 + params: tuple[float, ...] = field(default_factory=tuple) + + +@dataclass +class VoigtFitResult: + name: str + curve: np.ndarray = field(repr=False) + covariance: np.ndarray + amp: float + gaussian_width: float + lorentzian_width: float + + @property + def descr(self) -> str: + return ( + f"{self.name} - Gaussian width : {self.gaussian_width:.2f}, " + f"Lorentzian width : {self.lorentzian_width:.2f}" + ) + + +def rough_fwhm(x: np.ndarray, y: np.ndarray) -> float: + m2 = y.max() / 2 + ind = np.where(y >= m2)[0] + return ( + x[np.minimum(ind + 1, len(x) - 1)][x[ind].argmax()] + - x[np.maximum(0, ind - 1)][x[ind].argmin()] + ) + + +def lorentzian(x: np.ndarray, amp: float, width: float, x0: float) -> np.ndarray: + """Lorentzian function of max `amp`, FWHM `width` and position `x0`""" + gamma = (width * 0.5) ** 2 + return amp * gamma / ((x - x0) ** 2 + gamma) + + +def unit_lorentzian(x: np.ndarray, width: float, x0: float) -> np.ndarray: + """Normalized Lorentzian function of FWHM `width` and position `x0`""" + return lorentzian(x, 1 / (np.pi * width * 0.5), width, x0) + + +def peak_func(x: np.ndarray, amp: float, width: float, x0: float) -> np.ndarray: + """2-sided decaying exp of max `amp`, FWHM `width` and position `x0`""" + a = 2 * LN2 / width + return amp * np.exp(-np.abs(x - x0) * a) + + +def fft_lorentzian(f: np.ndarray, dx: float, amp: float, width: float) -> np.ndarray: + """ + Same as `peak_func` but parametrized as the fourier transform + of a Lorentzian function of max `amp` and FWHM `width` + """ + gamma_sqrt = width / 2 + return amp * np.pi * gamma_sqrt * np.exp(-2 * np.pi * gamma_sqrt * np.abs(f)) / dx + + +def gaussian(x: np.ndarray, amp: float, width: float, x0: float) -> np.ndarray: + """Gaussian function of max `amp`, FWHM `width` and position `x0`""" + sig2 = width**2 / (8 * LN2) + return amp * np.exp(-((x - x0) ** 2) / (2 * sig2)) + + +def elevated_gaussian(x: np.ndarray, amp: float, width: float, x0: float, y0: float) -> np.ndarray: + """Gaussian function of max `amp`, FWHM `width`, position `x0` and baseline `y0`""" + sig2 = width**2 / (8 * LN2) + return amp * np.exp(-((x - x0) ** 2) / (2 * sig2)) + y0 + + +def unit_gaussian(x: np.ndarray, width: float, x0: float) -> np.ndarray: + """Normalized Gaussian function of FWHM `width` and position `x0`""" + return gaussian(x, np.sqrt(4 * LN2 / np.pi) / width, width, x0) + + +def fft_gaussian(f: np.ndarray, dx: float, amp: float, width: float) -> np.ndarray: + """ + Same as `gaussian` but parametrized as the fourier transform + of another Gaussian function of max `amp` and FWHM `width` + """ # exp_param = + freq_amp = amp * width / 2 * np.sqrt(np.pi / LN2) / dx + freq_width = 4 * LN2 / (width * np.pi) + return gaussian(f, freq_amp, freq_width, 0) + + +def voigt(x: np.ndarray, amp: float, gaussian_width: float, lorentzian_width: float) -> np.ndarray: + """Voigt profile of max 1 with specified Gaussian and Lorentzian FWHM""" + conv = convolve(unit_gaussian(x, gaussian_width, 0), unit_lorentzian(x, lorentzian_width, 0)) + if conv.max() > 0: + return conv * amp / conv.max() + return conv + + +def log_voigt( + x: np.ndarray, amp: float, gaussian_width: float, lorentzian_width: float +) -> np.ndarray: + """log of `voigt`""" + return np.log(voigt(x, amp, gaussian_width, lorentzian_width)) + + +def fft_voigt( + f: np.ndarray, dx: float, amp: float, gaussian_width: float, lorentzian_width: float +) -> np.ndarray: + """ + returns the product of a `peak_func` and a `gaussian` + parameterized as the Fourier transform of a Voigt profile + given by `gaussian_width` and `lorentzian_width` + """ + profile = fft_gaussian(f, dx, 1, gaussian_width) * fft_lorentzian(f, dx, 1, lorentzian_width) + fac = amp / np.abs(np.fft.ifft(np.fft.fftshift(profile))).max() + return profile * fac + + +def single_func_fit( + x: np.ndarray, + y: np.ndarray, + fct: Callable[[np.ndarray, float, float, float], np.ndarray], + force_center=False, + use_weights=False, + extra_params: int = 0, +) -> FitResult: + """fits a single bell-like function (Gaussian or Lorentian, not Voigt) + + Parameters + ---------- + x : np.ndarray + x input + y : np.ndarray + corresponding y data + fct : Callable[[np.ndarray, float, float, float], np.ndarray] + function to fit + force_center : bool, optional + assume the bell is centered at x=0, by default False + use_weights : bool, optional + give more importance to higher y values, by default False + + Returns + ------- + FitResult + resuts of the fit + """ + if force_center: + + def _fct(_x: np.ndarray, amp: float, width: float): + return fct(_x, amp, width, 0) + + fct = _fct + am = y.argmax() + xm = x.mean() + fwhm = rough_fwhm(x, y) + params, cov = curve_fit( + fct, + x - xm, + y, + sigma=1 / y if use_weights else None, + p0=[y[am], fwhm, x[am] - xm] + [0] * extra_params, + ) + params[2] += xm + curve = fct(x, *params) + return FitResult(curve, cov, params[0], params[1], params[2], tuple(params)) + + +def linear_direct_voigt_fit(x: np.ndarray, y: np.ndarray, use_weights=False) -> VoigtFitResult: + fwhm = rough_fwhm(x, y) + params, cov = curve_fit( + voigt, x, y, sigma=1 / y if use_weights else None, p0=[y.max(), fwhm / 2, fwhm / 2] + ) + curve = voigt(x, *params) + return VoigtFitResult("Linear direct fit", curve, cov, *params) + + +def log_direct_voigt_fit(x: np.ndarray, y: np.ndarray) -> VoigtFitResult: + ind = y > 0 + y_fit = np.log(y[ind]) + x_fit = x[ind] + params, cov = curve_fit(log_voigt, x_fit, y_fit, bounds=[1e-12, np.inf]) + curve = voigt(x, *params) + return VoigtFitResult("Log direct fit", curve, cov, *params) + + +def linear_fft_voigt_fit(f: np.ndarray, A: np.ndarray, x: np.ndarray, dx: float) -> VoigtFitResult: + fwhm = 4 * LN2 / (np.pi * rough_fwhm(f, A)) + params, cov = curve_fit( + lambda _f, _amp, _gau, _lor: fft_voigt(_f, dx, _amp, _gau, _lor), + f, + A, + bounds=[1e-12, np.inf], + p0=[A.max(), fwhm, fwhm / 10], + ) + curve = voigt(x, *params) + return VoigtFitResult("Linear FFT fit", curve, cov, *params) + + +def convolve(gau: np.ndarray, lor: np.ndarray) -> np.ndarray: + return np.convolve(gau, lor, mode="same") + + +def add_noise(arr: np.ndarray, abs_fac: float, rel_fac: float): + return ( + arr + abs_fac * np.random.rand(len(arr)) + rel_fac * arr * (np.random.rand(len(arr)) - 0.5) + ) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..8a95415 --- /dev/null +++ b/uv.lock @@ -0,0 +1,231 @@ +version = 1 +requires-python = ">=3.10" + +[[package]] +name = "click" +version = "8.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "linemeasurement" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "click" }, + { name = "numpy" }, + { name = "plotapp" }, + { name = "scipy" }, +] + +[package.metadata] +requires-dist = [ + { name = "click" }, + { name = "numpy" }, + { name = "plotapp", url = "http://130.92.113.172/plotapp-0.1.1.zip" }, + { name = "scipy" }, +] + +[[package]] +name = "numpy" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/5f/9003bb3e632f2b58f5e3a3378902dcc73c5518070736c6740fe52454e8e1/numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", size = 18874860 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/37/e3de47233b3ba458b1021a6f95029198b2f68a83eb886a862640b6ec3e9a/numpy-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", size = 21150738 }, + { url = "https://files.pythonhosted.org/packages/69/30/f41c9b6dab4e1ec56b40d1daa81ce9f9f8d26da6d02af18768a883676bd5/numpy-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", size = 13758247 }, + { url = "https://files.pythonhosted.org/packages/e1/30/d2f71d3419ada3b3735e2ce9cea7dfe22c268ac9fbb24e0b5ac5fc222633/numpy-2.1.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", size = 5353756 }, + { url = "https://files.pythonhosted.org/packages/84/64/879bd6877488441cfaa578c96bdc4b43710d7e3ae4f8260fbd04821da395/numpy-2.1.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", size = 6886809 }, + { url = "https://files.pythonhosted.org/packages/cd/c4/869f8db87f5c9df86b93ca42036f58911ff162dd091a41e617977ab50d1f/numpy-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", size = 13977367 }, + { url = "https://files.pythonhosted.org/packages/7d/4b/a509d346fffede6120cc17610cc500819417ee9c3da7f08d9aaf15cab2a3/numpy-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", size = 16326516 }, + { url = "https://files.pythonhosted.org/packages/4a/0c/fdba41b2ddeb7a052f84d85fb17d5e168af0e8034b3a2d6e369b7cc2966f/numpy-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", size = 16702642 }, + { url = "https://files.pythonhosted.org/packages/bf/8d/a8da065a46515efdbcf81a92535b816ea17194ce5b767df1f13815c32179/numpy-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", size = 14475522 }, + { url = "https://files.pythonhosted.org/packages/b9/d2/5b7cf5851af48c35a73b85750b41f9b622760ee11659665a688e6b3f7cb7/numpy-2.1.1-cp310-cp310-win32.whl", hash = "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", size = 6535211 }, + { url = "https://files.pythonhosted.org/packages/e5/6a/b1f7d73fec1942ded4b474a78c3fdd11c4fad5232143f41dd7e6ae166080/numpy-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", size = 12865289 }, + { url = "https://files.pythonhosted.org/packages/f7/86/2c01070424a42b286ea0271203682c3d3e81e10ce695545b35768307b383/numpy-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", size = 21154850 }, + { url = "https://files.pythonhosted.org/packages/ef/4e/d3426d9e620a18bbb979f28e4dc7f9a2c35eb7cf726ffcb33545ebdd3e6a/numpy-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", size = 13789477 }, + { url = "https://files.pythonhosted.org/packages/c6/6e/fb6b1b2da9f4c757f55b202f10b6af0fe4fee87ace6e830228a12ab8ae5d/numpy-2.1.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", size = 5351769 }, + { url = "https://files.pythonhosted.org/packages/58/9a/07c8a9dc7254f3265ae014e33768d1cfd8eb73ee6cf215f4ec3b497e4255/numpy-2.1.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", size = 6890872 }, + { url = "https://files.pythonhosted.org/packages/08/4e/3b50fa3b1e045793056ed5a1fc6f89dd897ff9cb00900ca6377fe552d442/numpy-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", size = 13984256 }, + { url = "https://files.pythonhosted.org/packages/d9/37/108d692f7e2544b9ae972c7bfa06c26717871c273ccec86470bc3132b04d/numpy-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", size = 16337778 }, + { url = "https://files.pythonhosted.org/packages/95/2d/df81a1be3be6d3a92fd12dfd6c26a0dc026b276136ec1056562342a484a2/numpy-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", size = 16710448 }, + { url = "https://files.pythonhosted.org/packages/8f/34/4b2e604c5c44bd64b6c85e89d88871b41e60233b3ddf97419b37ae5b0c72/numpy-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", size = 14489002 }, + { url = "https://files.pythonhosted.org/packages/9f/0d/67c04b6bfefd0abbe7f60f7e4f11e3aca15d688faec1d1df089966105a9a/numpy-2.1.1-cp311-cp311-win32.whl", hash = "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", size = 6533215 }, + { url = "https://files.pythonhosted.org/packages/94/7a/4c00332a3ca79702bbc86228afd0e84e6f91b47222ec8cdf00677dd16481/numpy-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", size = 12870550 }, + { url = "https://files.pythonhosted.org/packages/36/11/c573ef66c004f991989c2c6218229d9003164525549409aec5ec9afc0285/numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", size = 20884403 }, + { url = "https://files.pythonhosted.org/packages/6b/6c/a9fbef5fd2f9685212af2a9e47485cde9357c3e303e079ccf85127516f2d/numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", size = 13493375 }, + { url = "https://files.pythonhosted.org/packages/34/f2/1316a6b08ad4c161d793abe81ff7181e9ae2e357a5b06352a383b9f8e800/numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", size = 5088823 }, + { url = "https://files.pythonhosted.org/packages/be/15/fabf78a6d4a10c250e87daf1cd901af05e71501380532ac508879cc46a7e/numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", size = 6619825 }, + { url = "https://files.pythonhosted.org/packages/9f/8a/76ddef3e621541ddd6984bc24d256a4e3422d036790cbbe449e6cad439ee/numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b", size = 13696705 }, + { url = "https://files.pythonhosted.org/packages/cb/22/2b840d297183916a95847c11f82ae11e248fa98113490b2357f774651e1d/numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", size = 16041649 }, + { url = "https://files.pythonhosted.org/packages/c7/e8/6f4825d8f576cfd5e4d6515b9eec22bd618868bdafc8a8c08b446dcb65f0/numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", size = 16409358 }, + { url = "https://files.pythonhosted.org/packages/bf/f8/5edf1105b0dc24fd66fc3e9e7f3bca3d920cde571caaa4375ec1566073c3/numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", size = 14172488 }, + { url = "https://files.pythonhosted.org/packages/f4/c2/dddca3e69a024d2f249a5b68698328163cbdafb7e65fbf6d36373bbabf12/numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", size = 6237195 }, + { url = "https://files.pythonhosted.org/packages/b7/98/5640a09daa3abf0caeaefa6e7bf0d10c0aa28a77c84e507d6a716e0e23df/numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", size = 12568082 }, + { url = "https://files.pythonhosted.org/packages/6b/9e/8bc6f133bc6d359ccc9ec051853aded45504d217685191f31f46d36b7065/numpy-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", size = 20834810 }, + { url = "https://files.pythonhosted.org/packages/32/1b/429519a2fa28681814c511574017d35f3aab7136d554cc65f4c1526dfbf5/numpy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", size = 13507739 }, + { url = "https://files.pythonhosted.org/packages/25/18/c732d7dd9896d11e4afcd487ac65e62f9fa0495563b7614eb850765361fa/numpy-2.1.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", size = 5074465 }, + { url = "https://files.pythonhosted.org/packages/3e/37/838b7ae9262c370ab25312bab365492016f11810ffc03ebebbd54670b669/numpy-2.1.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", size = 6606418 }, + { url = "https://files.pythonhosted.org/packages/8b/b9/7ff3bfb71e316a5b43a124c4b7a5881ab12f3c32636014bef1f757f19dbd/numpy-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", size = 13692464 }, + { url = "https://files.pythonhosted.org/packages/42/78/75bcf16e6737cd196ff7ecf0e1fd3f953293a34dff4fd93fb488e8308536/numpy-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", size = 16037763 }, + { url = "https://files.pythonhosted.org/packages/23/99/36bf5ffe034d06df307bc783e25cf164775863166dcd878879559fe0379f/numpy-2.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", size = 16410374 }, + { url = "https://files.pythonhosted.org/packages/7f/16/04c5dab564887d4cd31a9ed30e51467fa70d52a4425f5a9bd1eed5b3d34c/numpy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", size = 14169873 }, + { url = "https://files.pythonhosted.org/packages/09/e0/d1b5adbf1731886c4186c59a9fa208585df9452a43a2b60e79af7c649717/numpy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", size = 6234118 }, + { url = "https://files.pythonhosted.org/packages/d0/9c/2391ee6e9ebe77232ddcab29d92662b545e99d78c3eb3b4e26d59b9ca1ca/numpy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", size = 12561742 }, + { url = "https://files.pythonhosted.org/packages/38/0e/c4f754f9e73f9bb520e8bf418c646f2c4f70c5d5f2bc561e90f884593193/numpy-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", size = 20858403 }, + { url = "https://files.pythonhosted.org/packages/32/fc/d69092b9171efa0cb8079577e71ce0cac0e08f917d33f6e99c916ed51d44/numpy-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", size = 13519851 }, + { url = "https://files.pythonhosted.org/packages/14/2a/d7cf2cd9f15b23f623075546ea64a2c367cab703338ca22aaaecf7e704df/numpy-2.1.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", size = 5115444 }, + { url = "https://files.pythonhosted.org/packages/8e/00/e87b2cb4afcecca3b678deefb8fa53005d7054f3b5c39596e5554e5d98f8/numpy-2.1.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", size = 6628903 }, + { url = "https://files.pythonhosted.org/packages/ab/9d/337ae8721b3beec48c3413d71f2d44b2defbf3c6f7a85184fc18b7b61f4a/numpy-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", size = 13665945 }, + { url = "https://files.pythonhosted.org/packages/c0/90/ee8668e84c5d5cc080ef3beb622c016adf19ca3aa51afe9dbdcc6a9baf59/numpy-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", size = 16023473 }, + { url = "https://files.pythonhosted.org/packages/38/a0/57c24b2131879183051dc698fbb53fd43b77c3fa85b6e6311014f2bc2973/numpy-2.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", size = 16400624 }, + { url = "https://files.pythonhosted.org/packages/bb/4c/14a41eb5c9548c6cee6af0936eabfd985c69230ffa2f2598321431a9aa0a/numpy-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", size = 14155072 }, + { url = "https://files.pythonhosted.org/packages/94/9a/d6a5d138b53ccdc002fdf07f0d1a960326c510e66cbfff7180c88d37c482/numpy-2.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", size = 20982055 }, + { url = "https://files.pythonhosted.org/packages/40/b5/78d8b5481aeef6d2aad3724c6aa5398045d2657038dfe54c055cae1fcf75/numpy-2.1.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", size = 6750222 }, + { url = "https://files.pythonhosted.org/packages/eb/9a/59a548ad57df8c432bfac4556504a9fae5c082ffea53d108fcf7ce2956e4/numpy-2.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", size = 16141236 }, + { url = "https://files.pythonhosted.org/packages/02/31/3cbba87e998748b2e33ca5bc6fcc5662c867037f980918e302aebdf139a2/numpy-2.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", size = 12789681 }, +] + +[[package]] +name = "plotapp" +version = "0.1.1" +source = { url = "http://130.92.113.172/plotapp-0.1.1.zip" } +dependencies = [ + { name = "numpy" }, + { name = "pyqtgraph" }, + { name = "pyside6" }, +] +sdist = { url = "http://130.92.113.172/plotapp-0.1.1.zip", hash = "sha256:e2ea15671d57ddfe077f369ef1f5809abbef1334fe549f3416c1e35134233276" } + +[package.metadata] +requires-dist = [ + { name = "numpy", specifier = ">=1.23.0" }, + { name = "pyqtgraph", specifier = ">=0.13.1" }, + { name = "pyside6", specifier = ">=6.4.0" }, +] + +[[package]] +name = "pyqtgraph" +version = "0.13.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/d9/b62d5cddb3caa6e5145664bee5ed90223dee23ca887ed3ee479f2609e40a/pyqtgraph-0.13.7.tar.gz", hash = "sha256:64f84f1935c6996d0e09b1ee66fe478a7771e3ca6f3aaa05f00f6e068321d9e3", size = 2343380 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/34/5702b3b7cafe99be1d94b42f100e8cc5e6957b761fcb1cf5f72d492851da/pyqtgraph-0.13.7-py3-none-any.whl", hash = "sha256:7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a", size = 1925473 }, +] + +[[package]] +name = "pyside6" +version = "6.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyside6-addons" }, + { name = "pyside6-essentials" }, + { name = "shiboken6" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/57/69b9104f6a30a7f2c0ed78c425304ab964e9b10907b5e1d9d744dd1f714e/PySide6-6.7.2-cp39-abi3-macosx_11_0_universal2.whl", hash = "sha256:602debef9ec159b0db48f83b38a0e43e2dad3961f7d99f708d98620f04e9112b", size = 530200 }, + { url = "https://files.pythonhosted.org/packages/34/a6/278c7ed2f76ccfa471c49eb66538243dc0d892fe481b9b6a8bbad8846ba0/PySide6-6.7.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:15e7696a09072ee977f6e6179ab1e48184953df8417bcaa83cfadf0b79747242", size = 530812 }, + { url = "https://files.pythonhosted.org/packages/71/d7/794d490899f0118b2a40221508e4fd7ea67ffd6e790a627a39e7582841cb/PySide6-6.7.2-cp39-abi3-manylinux_2_31_aarch64.whl", hash = "sha256:6e0acb471535de303f56e3077aa86f53496b4de659b99ecce80520bcee508a63", size = 530721 }, + { url = "https://files.pythonhosted.org/packages/c2/ee/15cb7e277b3c88806d9baaa334b7923b2f1bdc461b38461bc70d368a8481/PySide6-6.7.2-cp39-abi3-win_amd64.whl", hash = "sha256:f73ae0de77d67f51ca3ce8207b12d3a5fa0107d3d5b6e4aeb3b53ee842b0927a", size = 537990 }, +] + +[[package]] +name = "pyside6-addons" +version = "6.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyside6-essentials" }, + { name = "shiboken6" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/8f/8ba019ec6e413c48e2852efea35215d2a340dd0285701712f017dc7ca698/PySide6_Addons-6.7.2-cp39-abi3-macosx_11_0_universal2.whl", hash = "sha256:90b995efce61058d995c603ea480a9a3054fe8206739dcbc273fc3b53d40650f", size = 258221435 }, + { url = "https://files.pythonhosted.org/packages/7f/f2/2128d3876f0c45fcb73000b272be64e1f3b1189f77d79820d7a706051e55/PySide6_Addons-6.7.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:94b9bf6a2a4a7ac671e1776633e50d51326c86f4184f1c6e556f4dd5498fd52a", size = 137499800 }, + { url = "https://files.pythonhosted.org/packages/e8/3c/6250b74da83a8a8a26c27d8a3041a31880b20ede88d004ef9dbe49d108bc/PySide6_Addons-6.7.2-cp39-abi3-manylinux_2_31_aarch64.whl", hash = "sha256:22979b1aa09d9cf1d7a86c8a9aa0cb4791d6bd1cc94f96c5b6780c5ef8a9e34e", size = 122681790 }, + { url = "https://files.pythonhosted.org/packages/8a/47/35794fc8c8cab42d924ac0287dfe489201c3743066a1eea34cdde2926cc1/PySide6_Addons-6.7.2-cp39-abi3-win_amd64.whl", hash = "sha256:ebf549eb25998665d8e4ec24014fbbd37bebc5ecdcb050b34db1e1c03e1bf81d", size = 123043845 }, +] + +[[package]] +name = "pyside6-essentials" +version = "6.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "shiboken6" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/41/c97a442a9e334e0c8025465ee63d7b303c5ab42a1e323c2b9cebca58a936/PySide6_Essentials-6.7.2-cp39-abi3-macosx_11_0_universal2.whl", hash = "sha256:4d13666e796ec140ecfb432c4f3d7baef6dfafc11929985a83b22c0025532fb7", size = 153954994 }, + { url = "https://files.pythonhosted.org/packages/75/be/527e41a7744142d931e46685dd9c2bdfff39432962abf8a5263be319c2cb/PySide6_Essentials-6.7.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a1a4c09f1e916b9cfe53151fe4a503a6acb1f6621ba28204d1bfe636f80d6780", size = 87668883 }, + { url = "https://files.pythonhosted.org/packages/42/e0/40994873471ab7fabbff098560a9fe0c08a2182c2eb501e31b1148e7bd44/PySide6_Essentials-6.7.2-cp39-abi3-manylinux_2_31_aarch64.whl", hash = "sha256:9135513e1c4c6e2fbb1e4f9afcb3d42e54708b0d9ed870cb3213ea4874cafa1e", size = 87969972 }, + { url = "https://files.pythonhosted.org/packages/69/55/cff72ecb1d36422e7f41f8d64d49c7c7e1f8dc6648e2b30ba72950883444/PySide6_Essentials-6.7.2-cp39-abi3-win_amd64.whl", hash = "sha256:0111d5fa8cf826de3ca9d82fed54726cce116d57f454f88a6467578652032d69", size = 78946678 }, +] + +[[package]] +name = "scipy" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/11/4d44a1f274e002784e4dbdb81e0ea96d2de2d1045b2132d5af62cc31fd28/scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417", size = 58620554 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/68/3bc0cfaf64ff507d82b1e5d5b64521df4c8bf7e22bc0b897827cbee9872c/scipy-1.14.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389", size = 39069598 }, + { url = "https://files.pythonhosted.org/packages/43/a5/8d02f9c372790326ad405d94f04d4339482ec082455b9e6e288f7100513b/scipy-1.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3", size = 29879676 }, + { url = "https://files.pythonhosted.org/packages/07/42/0e0bea9666fcbf2cb6ea0205db42c81b1f34d7b729ba251010edf9c80ebd/scipy-1.14.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0", size = 23088696 }, + { url = "https://files.pythonhosted.org/packages/15/47/298ab6fef5ebf31b426560e978b8b8548421d4ed0bf99263e1eb44532306/scipy-1.14.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3", size = 25470699 }, + { url = "https://files.pythonhosted.org/packages/d8/df/cdb6be5274bc694c4c22862ac3438cb04f360ed9df0aecee02ce0b798380/scipy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d", size = 35606631 }, + { url = "https://files.pythonhosted.org/packages/47/78/b0c2c23880dd1e99e938ad49ccfb011ae353758a2dc5ed7ee59baff684c3/scipy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69", size = 41178528 }, + { url = "https://files.pythonhosted.org/packages/5d/aa/994b45c34b897637b853ec04334afa55a85650a0d11dacfa67232260fb0a/scipy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad", size = 42784535 }, + { url = "https://files.pythonhosted.org/packages/e7/1c/8daa6df17a945cb1a2a1e3bae3c49643f7b3b94017ff01a4787064f03f84/scipy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5", size = 44772117 }, + { url = "https://files.pythonhosted.org/packages/b2/ab/070ccfabe870d9f105b04aee1e2860520460ef7ca0213172abfe871463b9/scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675", size = 39076999 }, + { url = "https://files.pythonhosted.org/packages/a7/c5/02ac82f9bb8f70818099df7e86c3ad28dae64e1347b421d8e3adf26acab6/scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2", size = 29894570 }, + { url = "https://files.pythonhosted.org/packages/ed/05/7f03e680cc5249c4f96c9e4e845acde08eb1aee5bc216eff8a089baa4ddb/scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617", size = 23103567 }, + { url = "https://files.pythonhosted.org/packages/5e/fc/9f1413bef53171f379d786aabc104d4abeea48ee84c553a3e3d8c9f96a9c/scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8", size = 25499102 }, + { url = "https://files.pythonhosted.org/packages/c2/4b/b44bee3c2ddc316b0159b3d87a3d467ef8d7edfd525e6f7364a62cd87d90/scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37", size = 35586346 }, + { url = "https://files.pythonhosted.org/packages/93/6b/701776d4bd6bdd9b629c387b5140f006185bd8ddea16788a44434376b98f/scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2", size = 41165244 }, + { url = "https://files.pythonhosted.org/packages/06/57/e6aa6f55729a8f245d8a6984f2855696c5992113a5dc789065020f8be753/scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2", size = 42817917 }, + { url = "https://files.pythonhosted.org/packages/ea/c2/5ecadc5fcccefaece775feadcd795060adf5c3b29a883bff0e678cfe89af/scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94", size = 44781033 }, + { url = "https://files.pythonhosted.org/packages/c0/04/2bdacc8ac6387b15db6faa40295f8bd25eccf33f1f13e68a72dc3c60a99e/scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d", size = 39128781 }, + { url = "https://files.pythonhosted.org/packages/c8/53/35b4d41f5fd42f5781dbd0dd6c05d35ba8aa75c84ecddc7d44756cd8da2e/scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07", size = 29939542 }, + { url = "https://files.pythonhosted.org/packages/66/67/6ef192e0e4d77b20cc33a01e743b00bc9e68fb83b88e06e636d2619a8767/scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5", size = 23148375 }, + { url = "https://files.pythonhosted.org/packages/f6/32/3a6dedd51d68eb7b8e7dc7947d5d841bcb699f1bf4463639554986f4d782/scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc", size = 25578573 }, + { url = "https://files.pythonhosted.org/packages/f0/5a/efa92a58dc3a2898705f1dc9dbaf390ca7d4fba26d6ab8cfffb0c72f656f/scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310", size = 35319299 }, + { url = "https://files.pythonhosted.org/packages/8e/ee/8a26858ca517e9c64f84b4c7734b89bda8e63bec85c3d2f432d225bb1886/scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066", size = 40849331 }, + { url = "https://files.pythonhosted.org/packages/a5/cd/06f72bc9187840f1c99e1a8750aad4216fc7dfdd7df46e6280add14b4822/scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1", size = 42544049 }, + { url = "https://files.pythonhosted.org/packages/aa/7d/43ab67228ef98c6b5dd42ab386eae2d7877036970a0d7e3dd3eb47a0d530/scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f", size = 44521212 }, + { url = "https://files.pythonhosted.org/packages/50/ef/ac98346db016ff18a6ad7626a35808f37074d25796fd0234c2bb0ed1e054/scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79", size = 39091068 }, + { url = "https://files.pythonhosted.org/packages/b9/cc/70948fe9f393b911b4251e96b55bbdeaa8cca41f37c26fd1df0232933b9e/scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e", size = 29875417 }, + { url = "https://files.pythonhosted.org/packages/3b/2e/35f549b7d231c1c9f9639f9ef49b815d816bf54dd050da5da1c11517a218/scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73", size = 23084508 }, + { url = "https://files.pythonhosted.org/packages/3f/d6/b028e3f3e59fae61fb8c0f450db732c43dd1d836223a589a8be9f6377203/scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e", size = 25503364 }, + { url = "https://files.pythonhosted.org/packages/a7/2f/6c142b352ac15967744d62b165537a965e95d557085db4beab2a11f7943b/scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d", size = 35292639 }, + { url = "https://files.pythonhosted.org/packages/56/46/2449e6e51e0d7c3575f289f6acb7f828938eaab8874dbccfeb0cd2b71a27/scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e", size = 40798288 }, + { url = "https://files.pythonhosted.org/packages/32/cd/9d86f7ed7f4497c9fd3e39f8918dd93d9f647ba80d7e34e4946c0c2d1a7c/scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06", size = 42524647 }, + { url = "https://files.pythonhosted.org/packages/f5/1b/6ee032251bf4cdb0cc50059374e86a9f076308c1512b61c4e003e241efb7/scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84", size = 44469524 }, +] + +[[package]] +name = "shiboken6" +version = "6.7.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/d4/01c4b37fe224c0d3200a060bfbc1bb912a2a36995178f2dabb19f4a12ff7/shiboken6-6.7.2-cp39-abi3-macosx_11_0_universal2.whl", hash = "sha256:50c33ac6317b673a1eb97a9abaafccb162c4ba0c9ca658a8e449c49a8aadc379", size = 387480 }, + { url = "https://files.pythonhosted.org/packages/57/ba/3e38bb62b285d73e46a86f44e7765cea5c42a79b0bba867dfabbdd12b54d/shiboken6-6.7.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:70e80737b27cd5d83504b373013b55e70462bd4a27217d919ff9a83958731990", size = 188970 }, + { url = "https://files.pythonhosted.org/packages/7c/bb/06a19d1b00d46b3840595e43d7fa648b21683e4e98c4a69d0ea06aaf5e7f/shiboken6-6.7.2-cp39-abi3-manylinux_2_31_aarch64.whl", hash = "sha256:98bedf9a15f1d8ba1af3e4d1e7527f7946ce36da541e08074fd9dc9ab5ff1adf", size = 177052 }, + { url = "https://files.pythonhosted.org/packages/11/9f/50ed659cbce4664374707bf416e2fac2ff94de3253ab093d5dee7f53e02f/shiboken6-6.7.2-cp39-abi3-win_amd64.whl", hash = "sha256:9024e6afb2af1568ebfc8a5d07e4ff6c8829f40923eeb28901f535463e2b6b65", size = 1090289 }, +] diff --git a/wolfram.txt b/wolfram.txt new file mode 100644 index 0000000..b4ec4e0 --- /dev/null +++ b/wolfram.txt @@ -0,0 +1 @@ +{A = a * x_1 + b * y_1 + e; B = c * x_1 + d * y_1 + f; C = a * x_2 + b * y_2 + e; D = c * x_2 + d * y_2 + f; E = a * x_3 + b * y_3 + e; F = c * x_3 + d * y_3 + f} solve for a, b, c, d, e, f \ No newline at end of file