Repository files navigation

Python for Pulse Retrieval

This project aims to provide numerical algorithms for ultrashort laser pulse measurement methods such as frequency-resolved optical gating (FROG), dispersion scan (d-scan), or time-domain ptychography (TDP) and more. Specifically, it provides a reference implementation of the algorithms presented in our paper "Common pulse retrieval algorithm: a fast and universal method to retrieve ultrashort pulses".

Example output

dispersion scan

We decided to remove the implementation of dispersion scan from the publicly available code. If you want to use pypret for d-scan please contact us.

Notes

This code is a complete re-implentation of the (rather messy) code used in our research. It was created with the expressive purpose to be well-documented and educational. The notation in the code tries to match the notation in the paper and references it. I would strongly recommend reading the publication before diving into the code.

As a down-side the code is not optimized and on many occasions I deliberately decided to go with the less efficient but more expressive and straightforward solution. This pains me somewhat and I do not recommend to use the code as an example for high-performance, numerical Python. It creates unecessarily many temporal copies and re-calculates many values that could be stored.

Documentation

The full documentation can be found at pypret.readthedocs.io. The scripts folder contains examples of how the package is used.

Usage example

The code is contained in the plain Python package pypret (PYthon for Pulse Retrieval). Point your PYTHONPATH to it and you can use it. The package contains many classes that are in general useful for ultrashort pulse simulations. The most iconic usage, however, is to simulate pulse measurement schemes and perform pulse retrieval:

importnumpyasnpimportpypret# create simulation gridft=pypret.FourierTransform(256, dt=5.0e-15)
# instantiate a pulse object, central wavelength 800 nmpulse=pypret.Pulse(ft, 800e-9)
# create a random pulse with time-bandwidth product of 2.pypret.random_pulse(pulse, 2.0)
# plot the pulsepypret.PulsePlot(pulse)
# simulate a frog measurementdelay=np.linspace(-500e-15, 500e-15, 128) # delay in spnps=pypret.PNPS(pulse, "frog", "shg")
# calculate the measurement tracepnps.calculate(pulse.spectrum, delay)
original_spectrum=pulse.spectrum# and plot itpypret.MeshDataPlot(pnps.trace)
# and do the retrievalret=pypret.Retriever(pnps, "copra", verbose=True, maxiter=300)
# start with a Gaussian spectrum with random phase as initial guesspypret.random_gaussian(pulse, 50e-15, phase_max=0.0)
# now retrieve from the synthetic trace simulated aboveret.retrieve(pnps.trace, pulse.spectrum)
# and print the retrieval resultsret.result(original_spectrum)

The text output should look similar to this:

Retrieval report
trace error R = 1.26951777571186456e-11
min. trace error R0 = 0.00000000000000000e+00
R - R0 = 1.26951777571186456e-11
pulse error ε = 1.52280811825410699e-07

This shows that the retrieval converged to the input trace within almost the numerical accuracy of the underlying calculations. This is, of course, only possible if no noise was added to the input data. Occasionally, the algorithm will not converge - in which case you would have to run it again.

More elaborate examples of how to use this package can be found in the scripts directory.

Author

This project was developed by Nils C. Geib at the Institute of Applied Physics of the University of Jena, Germany.

For any questions or comments, you can contact me via email: nils.geib@uni-jena.de

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Python for ultrashort laser pulse retrieval

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Python for Pulse Retrieval

This project aims to provide numerical algorithms for ultrashort laser pulse measurement methods such as frequency-resolved optical gating (FROG), dispersion scan (d-scan), or time-domain ptychography (TDP) and more. Specifically, it provides a reference implementation of the algorithms presented in our paper "Common pulse retrieval algorithm: a fast and universal method to retrieve ultrashort pulses".

Example output

dispersion scan

We decided to remove the implementation of dispersion scan from the publicly available code. If you want to use pypret for d-scan please contact us.

Notes

This code is a complete re-implentation of the (rather messy) code used in our research. It was created with the expressive purpose to be well-documented and educational. The notation in the code tries to match the notation in the paper and references it. I would strongly recommend reading the publication before diving into the code.

As a down-side the code is not optimized and on many occasions I deliberately decided to go with the less efficient but more expressive and straightforward solution. This pains me somewhat and I do not recommend to use the code as an example for high-performance, numerical Python. It creates unecessarily many temporal copies and re-calculates many values that could be stored.

Documentation

The full documentation can be found at pypret.readthedocs.io. The scripts folder contains examples of how the package is used.

Usage example

The code is contained in the plain Python package pypret (PYthon for Pulse Retrieval). Point your PYTHONPATH to it and you can use it. The package contains many classes that are in general useful for ultrashort pulse simulations. The most iconic usage, however, is to simulate pulse measurement schemes and perform pulse retrieval:

importnumpyasnpimportpypret# create simulation gridft=pypret.FourierTransform(256, dt=5.0e-15)
# instantiate a pulse object, central wavelength 800 nmpulse=pypret.Pulse(ft, 800e-9)
# create a random pulse with time-bandwidth product of 2.pypret.random_pulse(pulse, 2.0)
# plot the pulsepypret.PulsePlot(pulse)
# simulate a frog measurementdelay=np.linspace(-500e-15, 500e-15, 128) # delay in spnps=pypret.PNPS(pulse, "frog", "shg")
# calculate the measurement tracepnps.calculate(pulse.spectrum, delay)
original_spectrum=pulse.spectrum# and plot itpypret.MeshDataPlot(pnps.trace)
# and do the retrievalret=pypret.Retriever(pnps, "copra", verbose=True, maxiter=300)
# start with a Gaussian spectrum with random phase as initial guesspypret.random_gaussian(pulse, 50e-15, phase_max=0.0)
# now retrieve from the synthetic trace simulated aboveret.retrieve(pnps.trace, pulse.spectrum)
# and print the retrieval resultsret.result(original_spectrum)

The text output should look similar to this:

Retrieval report
trace error R = 1.26951777571186456e-11
min. trace error R0 = 0.00000000000000000e+00
R - R0 = 1.26951777571186456e-11
pulse error ε = 1.52280811825410699e-07

This shows that the retrieval converged to the input trace within almost the numerical accuracy of the underlying calculations. This is, of course, only possible if no noise was added to the input data. Occasionally, the algorithm will not converge - in which case you would have to run it again.

More elaborate examples of how to use this package can be found in the scripts directory.

Author

This project was developed by Nils C. Geib at the Institute of Applied Physics of the University of Jena, Germany.

For any questions or comments, you can contact me via email: nils.geib@uni-jena.de

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Python for ultrashort laser pulse retrieval

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python for Pulse Retrieval

This project aims to provide numerical algorithms for ultrashort laser pulse measurement methods such as frequency-resolved optical gating (FROG), dispersion scan (d-scan), or time-domain ptychography (TDP) and more. Specifically, it provides a reference implementation of the algorithms presented in our paper "Common pulse retrieval algorithm: a fast and universal method to retrieve ultrashort pulses".

Example output

dispersion scan

We decided to remove the implementation of dispersion scan from the publicly available code. If you want to use pypret for d-scan please contact us.

Notes

This code is a complete re-implentation of the (rather messy) code used in our research. It was created with the expressive purpose to be well-documented and educational. The notation in the code tries to match the notation in the paper and references it. I would strongly recommend reading the publication before diving into the code.

As a down-side the code is not optimized and on many occasions I deliberately decided to go with the less efficient but more expressive and straightforward solution. This pains me somewhat and I do not recommend to use the code as an example for high-performance, numerical Python. It creates unecessarily many temporal copies and re-calculates many values that could be stored.

Documentation

The full documentation can be found at pypret.readthedocs.io. The scripts folder contains examples of how the package is used.

Usage example

The code is contained in the plain Python package pypret (PYthon for Pulse Retrieval). Point your PYTHONPATH to it and you can use it. The package contains many classes that are in general useful for ultrashort pulse simulations. The most iconic usage, however, is to simulate pulse measurement schemes and perform pulse retrieval:

importnumpyasnpimportpypret# create simulation gridft=pypret.FourierTransform(256, dt=5.0e-15)
# instantiate a pulse object, central wavelength 800 nmpulse=pypret.Pulse(ft, 800e-9)
# create a random pulse with time-bandwidth product of 2.pypret.random_pulse(pulse, 2.0)
# plot the pulsepypret.PulsePlot(pulse)
# simulate a frog measurementdelay=np.linspace(-500e-15, 500e-15, 128) # delay in spnps=pypret.PNPS(pulse, "frog", "shg")
# calculate the measurement tracepnps.calculate(pulse.spectrum, delay)
original_spectrum=pulse.spectrum# and plot itpypret.MeshDataPlot(pnps.trace)
# and do the retrievalret=pypret.Retriever(pnps, "copra", verbose=True, maxiter=300)
# start with a Gaussian spectrum with random phase as initial guesspypret.random_gaussian(pulse, 50e-15, phase_max=0.0)
# now retrieve from the synthetic trace simulated aboveret.retrieve(pnps.trace, pulse.spectrum)
# and print the retrieval resultsret.result(original_spectrum)

The text output should look similar to this:

Retrieval report
trace error R = 1.26951777571186456e-11
min. trace error R0 = 0.00000000000000000e+00
R - R0 = 1.26951777571186456e-11
pulse error ε = 1.52280811825410699e-07

This shows that the retrieval converged to the input trace within almost the numerical accuracy of the underlying calculations. This is, of course, only possible if no noise was added to the input data. Occasionally, the algorithm will not converge - in which case you would have to run it again.

More elaborate examples of how to use this package can be found in the scripts directory.

Author

This project was developed by Nils C. Geib at the Institute of Applied Physics of the University of Jena, Germany.

For any questions or comments, you can contact me via email: nils.geib@uni-jena.de

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Python for ultrashort laser pulse retrieval

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python for Pulse Retrieval

This project aims to provide numerical algorithms for ultrashort laser pulse measurement methods such as frequency-resolved optical gating (FROG), dispersion scan (d-scan), or time-domain ptychography (TDP) and more. Specifically, it provides a reference implementation of the algorithms presented in our paper "Common pulse retrieval algorithm: a fast and universal method to retrieve ultrashort pulses".

Example output

dispersion scan

We decided to remove the implementation of dispersion scan from the publicly available code. If you want to use pypret for d-scan please contact us.

Notes

This code is a complete re-implentation of the (rather messy) code used in our research. It was created with the expressive purpose to be well-documented and educational. The notation in the code tries to match the notation in the paper and references it. I would strongly recommend reading the publication before diving into the code.

As a down-side the code is not optimized and on many occasions I deliberately decided to go with the less efficient but more expressive and straightforward solution. This pains me somewhat and I do not recommend to use the code as an example for high-performance, numerical Python. It creates unecessarily many temporal copies and re-calculates many values that could be stored.

Documentation

The full documentation can be found at pypret.readthedocs.io. The scripts folder contains examples of how the package is used.

Usage example

The code is contained in the plain Python package pypret (PYthon for Pulse Retrieval). Point your PYTHONPATH to it and you can use it. The package contains many classes that are in general useful for ultrashort pulse simulations. The most iconic usage, however, is to simulate pulse measurement schemes and perform pulse retrieval:

importnumpyasnpimportpypret# create simulation gridft=pypret.FourierTransform(256, dt=5.0e-15)
# instantiate a pulse object, central wavelength 800 nmpulse=pypret.Pulse(ft, 800e-9)
# create a random pulse with time-bandwidth product of 2.pypret.random_pulse(pulse, 2.0)
# plot the pulsepypret.PulsePlot(pulse)
# simulate a frog measurementdelay=np.linspace(-500e-15, 500e-15, 128) # delay in spnps=pypret.PNPS(pulse, "frog", "shg")
# calculate the measurement tracepnps.calculate(pulse.spectrum, delay)
original_spectrum=pulse.spectrum# and plot itpypret.MeshDataPlot(pnps.trace)
# and do the retrievalret=pypret.Retriever(pnps, "copra", verbose=True, maxiter=300)
# start with a Gaussian spectrum with random phase as initial guesspypret.random_gaussian(pulse, 50e-15, phase_max=0.0)
# now retrieve from the synthetic trace simulated aboveret.retrieve(pnps.trace, pulse.spectrum)
# and print the retrieval resultsret.result(original_spectrum)

The text output should look similar to this:

Retrieval report
trace error R = 1.26951777571186456e-11
min. trace error R0 = 0.00000000000000000e+00
R - R0 = 1.26951777571186456e-11
pulse error ε = 1.52280811825410699e-07

This shows that the retrieval converged to the input trace within almost the numerical accuracy of the underlying calculations. This is, of course, only possible if no noise was added to the input data. Occasionally, the algorithm will not converge - in which case you would have to run it again.

More elaborate examples of how to use this package can be found in the scripts directory.

Author

This project was developed by Nils C. Geib at the Institute of Applied Physics of the University of Jena, Germany.

For any questions or comments, you can contact me via email: nils.geib@uni-jena.de

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Python for ultrashort laser pulse retrieval

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Python for Pulse Retrieval

This project aims to provide numerical algorithms for ultrashort laser pulse measurement methods such as frequency-resolved optical gating (FROG), dispersion scan (d-scan), or time-domain ptychography (TDP) and more. Specifically, it provides a reference implementation of the algorithms presented in our paper "Common pulse retrieval algorithm: a fast and universal method to retrieve ultrashort pulses".

Example output

dispersion scan

We decided to remove the implementation of dispersion scan from the publicly available code. If you want to use pypret for d-scan please contact us.

Notes

This code is a complete re-implentation of the (rather messy) code used in our research. It was created with the expressive purpose to be well-documented and educational. The notation in the code tries to match the notation in the paper and references it. I would strongly recommend reading the publication before diving into the code.

As a down-side the code is not optimized and on many occasions I deliberately decided to go with the less efficient but more expressive and straightforward solution. This pains me somewhat and I do not recommend to use the code as an example for high-performance, numerical Python. It creates unecessarily many temporal copies and re-calculates many values that could be stored.

Documentation

The full documentation can be found at pypret.readthedocs.io. The scripts folder contains examples of how the package is used.

Usage example

The code is contained in the plain Python package pypret (PYthon for Pulse Retrieval). Point your PYTHONPATH to it and you can use it. The package contains many classes that are in general useful for ultrashort pulse simulations. The most iconic usage, however, is to simulate pulse measurement schemes and perform pulse retrieval:

importnumpyasnpimportpypret# create simulation gridft=pypret.FourierTransform(256, dt=5.0e-15)
# instantiate a pulse object, central wavelength 800 nmpulse=pypret.Pulse(ft, 800e-9)
# create a random pulse with time-bandwidth product of 2.pypret.random_pulse(pulse, 2.0)
# plot the pulsepypret.PulsePlot(pulse)
# simulate a frog measurementdelay=np.linspace(-500e-15, 500e-15, 128) # delay in spnps=pypret.PNPS(pulse, "frog", "shg")
# calculate the measurement tracepnps.calculate(pulse.spectrum, delay)
original_spectrum=pulse.spectrum# and plot itpypret.MeshDataPlot(pnps.trace)
# and do the retrievalret=pypret.Retriever(pnps, "copra", verbose=True, maxiter=300)
# start with a Gaussian spectrum with random phase as initial guesspypret.random_gaussian(pulse, 50e-15, phase_max=0.0)
# now retrieve from the synthetic trace simulated aboveret.retrieve(pnps.trace, pulse.spectrum)
# and print the retrieval resultsret.result(original_spectrum)

The text output should look similar to this:

Retrieval report
trace error R = 1.26951777571186456e-11
min. trace error R0 = 0.00000000000000000e+00
R - R0 = 1.26951777571186456e-11
pulse error ε = 1.52280811825410699e-07

This shows that the retrieval converged to the input trace within almost the numerical accuracy of the underlying calculations. This is, of course, only possible if no noise was added to the input data. Occasionally, the algorithm will not converge - in which case you would have to run it again.

More elaborate examples of how to use this package can be found in the scripts directory.

Author

This project was developed by Nils C. Geib at the Institute of Applied Physics of the University of Jena, Germany.

For any questions or comments, you can contact me via email: nils.geib@uni-jena.de

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Python for ultrashort laser pulse retrieval

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python for Pulse Retrieval

This project aims to provide numerical algorithms for ultrashort laser pulse measurement methods such as frequency-resolved optical gating (FROG), dispersion scan (d-scan), or time-domain ptychography (TDP) and more. Specifically, it provides a reference implementation of the algorithms presented in our paper "Common pulse retrieval algorithm: a fast and universal method to retrieve ultrashort pulses".

Example output

dispersion scan

We decided to remove the implementation of dispersion scan from the publicly available code. If you want to use pypret for d-scan please contact us.

Notes

This code is a complete re-implentation of the (rather messy) code used in our research. It was created with the expressive purpose to be well-documented and educational. The notation in the code tries to match the notation in the paper and references it. I would strongly recommend reading the publication before diving into the code.

As a down-side the code is not optimized and on many occasions I deliberately decided to go with the less efficient but more expressive and straightforward solution. This pains me somewhat and I do not recommend to use the code as an example for high-performance, numerical Python. It creates unecessarily many temporal copies and re-calculates many values that could be stored.

Documentation

The full documentation can be found at pypret.readthedocs.io. The scripts folder contains examples of how the package is used.

Usage example

The code is contained in the plain Python package pypret (PYthon for Pulse Retrieval). Point your PYTHONPATH to it and you can use it. The package contains many classes that are in general useful for ultrashort pulse simulations. The most iconic usage, however, is to simulate pulse measurement schemes and perform pulse retrieval:

importnumpyasnpimportpypret# create simulation gridft=pypret.FourierTransform(256, dt=5.0e-15)
# instantiate a pulse object, central wavelength 800 nmpulse=pypret.Pulse(ft, 800e-9)
# create a random pulse with time-bandwidth product of 2.pypret.random_pulse(pulse, 2.0)
# plot the pulsepypret.PulsePlot(pulse)
# simulate a frog measurementdelay=np.linspace(-500e-15, 500e-15, 128) # delay in spnps=pypret.PNPS(pulse, "frog", "shg")
# calculate the measurement tracepnps.calculate(pulse.spectrum, delay)
original_spectrum=pulse.spectrum# and plot itpypret.MeshDataPlot(pnps.trace)
# and do the retrievalret=pypret.Retriever(pnps, "copra", verbose=True, maxiter=300)
# start with a Gaussian spectrum with random phase as initial guesspypret.random_gaussian(pulse, 50e-15, phase_max=0.0)
# now retrieve from the synthetic trace simulated aboveret.retrieve(pnps.trace, pulse.spectrum)
# and print the retrieval resultsret.result(original_spectrum)

The text output should look similar to this:

Retrieval report
trace error R = 1.26951777571186456e-11
min. trace error R0 = 0.00000000000000000e+00
R - R0 = 1.26951777571186456e-11
pulse error ε = 1.52280811825410699e-07

This shows that the retrieval converged to the input trace within almost the numerical accuracy of the underlying calculations. This is, of course, only possible if no noise was added to the input data. Occasionally, the algorithm will not converge - in which case you would have to run it again.

More elaborate examples of how to use this package can be found in the scripts directory.

Author

This project was developed by Nils C. Geib at the Institute of Applied Physics of the University of Jena, Germany.

For any questions or comments, you can contact me via email: nils.geib@uni-jena.de

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Python for ultrashort laser pulse retrieval

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python for Pulse Retrieval

This project aims to provide numerical algorithms for ultrashort laser pulse measurement methods such as frequency-resolved optical gating (FROG), dispersion scan (d-scan), or time-domain ptychography (TDP) and more. Specifically, it provides a reference implementation of the algorithms presented in our paper "Common pulse retrieval algorithm: a fast and universal method to retrieve ultrashort pulses".

Example output

dispersion scan

We decided to remove the implementation of dispersion scan from the publicly available code. If you want to use pypret for d-scan please contact us.

Notes

This code is a complete re-implentation of the (rather messy) code used in our research. It was created with the expressive purpose to be well-documented and educational. The notation in the code tries to match the notation in the paper and references it. I would strongly recommend reading the publication before diving into the code.

As a down-side the code is not optimized and on many occasions I deliberately decided to go with the less efficient but more expressive and straightforward solution. This pains me somewhat and I do not recommend to use the code as an example for high-performance, numerical Python. It creates unecessarily many temporal copies and re-calculates many values that could be stored.

Documentation

The full documentation can be found at pypret.readthedocs.io. The scripts folder contains examples of how the package is used.

Usage example

The code is contained in the plain Python package pypret (PYthon for Pulse Retrieval). Point your PYTHONPATH to it and you can use it. The package contains many classes that are in general useful for ultrashort pulse simulations. The most iconic usage, however, is to simulate pulse measurement schemes and perform pulse retrieval:

importnumpyasnpimportpypret# create simulation gridft=pypret.FourierTransform(256, dt=5.0e-15)
# instantiate a pulse object, central wavelength 800 nmpulse=pypret.Pulse(ft, 800e-9)
# create a random pulse with time-bandwidth product of 2.pypret.random_pulse(pulse, 2.0)
# plot the pulsepypret.PulsePlot(pulse)
# simulate a frog measurementdelay=np.linspace(-500e-15, 500e-15, 128) # delay in spnps=pypret.PNPS(pulse, "frog", "shg")
# calculate the measurement tracepnps.calculate(pulse.spectrum, delay)
original_spectrum=pulse.spectrum# and plot itpypret.MeshDataPlot(pnps.trace)
# and do the retrievalret=pypret.Retriever(pnps, "copra", verbose=True, maxiter=300)
# start with a Gaussian spectrum with random phase as initial guesspypret.random_gaussian(pulse, 50e-15, phase_max=0.0)
# now retrieve from the synthetic trace simulated aboveret.retrieve(pnps.trace, pulse.spectrum)
# and print the retrieval resultsret.result(original_spectrum)

The text output should look similar to this:

Retrieval report
trace error R = 1.26951777571186456e-11
min. trace error R0 = 0.00000000000000000e+00
R - R0 = 1.26951777571186456e-11
pulse error ε = 1.52280811825410699e-07

This shows that the retrieval converged to the input trace within almost the numerical accuracy of the underlying calculations. This is, of course, only possible if no noise was added to the input data. Occasionally, the algorithm will not converge - in which case you would have to run it again.

More elaborate examples of how to use this package can be found in the scripts directory.

Author

This project was developed by Nils C. Geib at the Institute of Applied Physics of the University of Jena, Germany.

For any questions or comments, you can contact me via email: nils.geib@uni-jena.de

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Python for ultrashort laser pulse retrieval

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Python for Pulse Retrieval

This project aims to provide numerical algorithms for ultrashort laser pulse measurement methods such as frequency-resolved optical gating (FROG), dispersion scan (d-scan), or time-domain ptychography (TDP) and more. Specifically, it provides a reference implementation of the algorithms presented in our paper "Common pulse retrieval algorithm: a fast and universal method to retrieve ultrashort pulses".

Example output

dispersion scan

We decided to remove the implementation of dispersion scan from the publicly available code. If you want to use pypret for d-scan please contact us.

Notes

This code is a complete re-implentation of the (rather messy) code used in our research. It was created with the expressive purpose to be well-documented and educational. The notation in the code tries to match the notation in the paper and references it. I would strongly recommend reading the publication before diving into the code.

As a down-side the code is not optimized and on many occasions I deliberately decided to go with the less efficient but more expressive and straightforward solution. This pains me somewhat and I do not recommend to use the code as an example for high-performance, numerical Python. It creates unecessarily many temporal copies and re-calculates many values that could be stored.

Documentation

The full documentation can be found at pypret.readthedocs.io. The scripts folder contains examples of how the package is used.

Usage example

The code is contained in the plain Python package pypret (PYthon for Pulse Retrieval). Point your PYTHONPATH to it and you can use it. The package contains many classes that are in general useful for ultrashort pulse simulations. The most iconic usage, however, is to simulate pulse measurement schemes and perform pulse retrieval:

importnumpyasnpimportpypret# create simulation gridft=pypret.FourierTransform(256, dt=5.0e-15)
# instantiate a pulse object, central wavelength 800 nmpulse=pypret.Pulse(ft, 800e-9)
# create a random pulse with time-bandwidth product of 2.pypret.random_pulse(pulse, 2.0)
# plot the pulsepypret.PulsePlot(pulse)
# simulate a frog measurementdelay=np.linspace(-500e-15, 500e-15, 128) # delay in spnps=pypret.PNPS(pulse, "frog", "shg")
# calculate the measurement tracepnps.calculate(pulse.spectrum, delay)
original_spectrum=pulse.spectrum# and plot itpypret.MeshDataPlot(pnps.trace)
# and do the retrievalret=pypret.Retriever(pnps, "copra", verbose=True, maxiter=300)
# start with a Gaussian spectrum with random phase as initial guesspypret.random_gaussian(pulse, 50e-15, phase_max=0.0)
# now retrieve from the synthetic trace simulated aboveret.retrieve(pnps.trace, pulse.spectrum)
# and print the retrieval resultsret.result(original_spectrum)

The text output should look similar to this:

Retrieval report
trace error R = 1.26951777571186456e-11
min. trace error R0 = 0.00000000000000000e+00
R - R0 = 1.26951777571186456e-11
pulse error ε = 1.52280811825410699e-07

This shows that the retrieval converged to the input trace within almost the numerical accuracy of the underlying calculations. This is, of course, only possible if no noise was added to the input data. Occasionally, the algorithm will not converge - in which case you would have to run it again.

More elaborate examples of how to use this package can be found in the scripts directory.

Author

This project was developed by Nils C. Geib at the Institute of Applied Physics of the University of Jena, Germany.

For any questions or comments, you can contact me via email: nils.geib@uni-jena.de

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Python for ultrashort laser pulse retrieval

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages