REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
TRestAxionField.cxx
1/*************************************************************************
2 * This file is part of the REST software framework. *
3 * *
4 * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) *
5 * For more information see http://gifna.unizar.es/trex *
6 * *
7 * REST is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * REST is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have a copy of the GNU General Public License along with *
18 * REST in $REST_PATH/LICENSE. *
19 * If not, see http://www.gnu.org/licenses/. *
20 * For the list of contributors see $REST_PATH/CREDITS. *
21 *************************************************************************/
22
209#include "TRestAxionField.h"
210
211#include <TComplex.h>
212#include <TVectorD.h>
213#include <gsl/gsl_integration.h>
214
215#include <numeric>
216
217#include "TH1F.h"
218
219using namespace std;
220
221ClassImp(TRestAxionField);
222
227
232
237 fBufferGas = NULL;
238
242}
243
250double TRestAxionField::BL(Double_t Bmag, Double_t Lcoh) {
251 Double_t lengthInMeters = Lcoh * units("m");
252
253 Double_t tm =
254 REST_Physics::lightSpeed / REST_Physics::naturalElectron * units("GeV") / units("eV"); // eV --> GeV
255 Double_t sol = lengthInMeters * Bmag * tm;
256 sol = sol * 1.0e-10;
257
258 return sol;
259}
260
267double TRestAxionField::BLHalfSquared(Double_t Bmag, Double_t Lcoh) // (BL/2)**2
268{
269 Double_t lengthInMeters = Lcoh * units("m");
270
271 Double_t tm =
272 REST_Physics::lightSpeed / REST_Physics::naturalElectron * units("GeV") / units("eV"); // eV --> GeV
273 Double_t sol = lengthInMeters * Bmag * tm / 2;
274 sol = sol * sol * 1.0e-20;
275
276 return sol;
277}
278
293Double_t TRestAxionField::GammaTransmissionProbability(Double_t ma, Double_t mg, Double_t absLength) {
294 Double_t cohLength = fLcoh * units("m"); // Default REST units are mm;
295
296 Double_t photonMass = mg;
297
298 if (mg == 0 && fBufferGas) photonMass = fBufferGas->GetPhotonMass(fEa);
299
300 RESTDebug << "+--------------------------------------------------------------------------+" << RESTendl;
301 RESTDebug << " TRestAxionField::GammaTransmissionProbability. Parameter summary" << RESTendl;
302 RESTDebug << " Photon mass : " << photonMass << " eV" << RESTendl;
303 RESTDebug << " Axion mass : " << ma << " eV" << RESTendl;
304 RESTDebug << " Axion energy : " << fEa << " keV" << RESTendl;
305 RESTDebug << " Lcoh : " << fLcoh << " mm" << RESTendl;
306 RESTDebug << " Bmag : " << fBmag << " T" << RESTendl;
307 RESTDebug << "+--------------------------------------------------------------------------+" << RESTendl;
308
309 if (ma == 0.0 && photonMass == 0.0) return BLHalfSquared(fBmag, fLcoh);
310
311 Double_t q = (ma * ma - photonMass * photonMass) / 2. / (fEa * units("eV"));
312 Double_t l = cohLength * REST_Physics::PhMeterIneV;
313 Double_t phi = q * l;
314
315 Double_t Gamma = absLength;
316 if (absLength == 0 && fBufferGas) Gamma = fBufferGas->GetPhotonAbsorptionLength(fEa); // cm-1
317 Double_t GammaL = Gamma * cohLength * units("cm") / units("m"); // m --> cm
318
319 if (fDebug) {
320 std::cout << "+------------------------+" << std::endl;
321 std::cout << " Intermediate calculations" << std::endl;
322 std::cout << " q : " << q << " eV" << std::endl;
323 std::cout << " l : " << l << " eV-1" << std::endl;
324 std::cout << " phi : " << phi << std::endl;
325 std::cout << "Gamma : " << Gamma << std::endl;
326 std::cout << "GammaL : " << GammaL << std::endl;
327 std::cout << "+------------------------+" << std::endl;
328 }
329
330 Double_t MFactor = phi * phi + GammaL * GammaL / 4.0;
331 MFactor = 1.0 / MFactor;
332
333 if (fDebug) {
334 std::cout << "Mfactor : " << MFactor << std::endl;
335 std::cout << "(BL/2)^2 : " << BLHalfSquared(fBmag, fLcoh) << std::endl;
336 std::cout << "cos(phi) : " << cos(phi) << std::endl;
337 std::cout << "Exp(-GammaL) : " << exp(-GammaL) << std::endl;
338 }
339
340 double sol = (double)(MFactor * BLHalfSquared(fBmag, fLcoh) *
341 (1 + exp(-GammaL) - 2 * exp(-GammaL / 2) * cos(phi)));
342
343 if (fDebug) std::cout << "Axion-photon transmission probability : " << sol << std::endl;
344
345 return sol;
346}
347
352Double_t TRestAxionField::GammaTransmissionProbability(Double_t Bmag, Double_t Lcoh, Double_t Ea, Double_t ma,
353 Double_t mg, Double_t absLength) {
354 fBmag = Bmag;
355 fLcoh = Lcoh;
356 fEa = Ea;
357
358 return GammaTransmissionProbability(ma, mg, absLength);
359}
360
380Double_t TRestAxionField::GammaTransmissionProbability(std::vector<Double_t> Bmag, Double_t deltaL,
381 Double_t Ea, Double_t ma, Double_t mg,
382 Double_t absLength) {
383 // Default REST units are mm. We express cohLength in m.
384 Double_t Lcoh = (Bmag.size() - 1) * deltaL; // in mm
385 Double_t cohLength = Lcoh * units("m"); // in m
386
387 Double_t photonMass = mg;
388
389 if (mg == 0 && fBufferGas) photonMass = fBufferGas->GetPhotonMass(Ea);
390
391 Double_t fieldAverage = 0;
392 if (Bmag.size() > 0) fieldAverage = std::accumulate(Bmag.begin(), Bmag.end(), 0.0) / Bmag.size();
393
394 if (fDebug) {
395 std::cout << "+--------------------------------------------------------------------------+"
396 << std::endl;
397 std::cout << " TRestAxionField::GammaTransmissionProbability. Parameter summary" << std::endl;
398 std::cout << " Photon mass : " << photonMass << " eV" << std::endl;
399 std::cout << " Axion mass : " << ma << " eV" << std::endl;
400 std::cout << " Axion energy : " << Ea << " keV" << std::endl;
401 std::cout << " Lcoh : " << cohLength << " m" << std::endl;
402 std::cout << " Bmag average : " << fieldAverage << " T" << std::endl;
403 std::cout << "+--------------------------------------------------------------------------+"
404 << std::endl;
405 }
406
407 // In vacuum
408 if (ma == 0.0 && photonMass == 0.0) return BLHalfSquared(fieldAverage, Lcoh);
409
410 Double_t q = (ma * ma - photonMass * photonMass) / 2. / (Ea * units("eV"));
411 Double_t l = cohLength * REST_Physics::PhMeterIneV;
412 Double_t phi = q * l;
413
414 Double_t Gamma = absLength;
415 if (absLength == 0 && fBufferGas) Gamma = fBufferGas->GetPhotonAbsorptionLength(Ea); // cm-1
416 Double_t GammaL = Gamma * cohLength * units("cm") / units("m"); // m --> cm
417
418 if (fDebug) {
419 std::cout << "+------------------------+" << std::endl;
420 std::cout << " Intermediate calculations" << std::endl;
421 std::cout << " q : " << q << " eV" << std::endl;
422 std::cout << " l : " << l << " eV-1" << std::endl;
423 std::cout << " phi : " << phi << std::endl;
424 std::cout << "Gamma : " << Gamma << std::endl;
425 std::cout << "GammaL : " << GammaL << std::endl;
426 std::cout << "+------------------------+" << std::endl;
427 }
428
429 Double_t MFactor = phi * phi + GammaL * GammaL / 4.0;
430 MFactor = 1.0 / MFactor;
431
432 if (fDebug) {
433 std::cout << "Mfactor : " << MFactor << std::endl;
434 std::cout << "(BL/2)^2 : " << BLHalfSquared(fieldAverage, Lcoh) << std::endl;
435 std::cout << "cos(phi) : " << cos(phi) << std::endl;
436 std::cout << "Exp(-GammaL) : " << exp(-GammaL) << std::endl;
437 }
438
440 Double_t deltaIneV = deltaL * units("m") * REST_Physics::PhMeterIneV;
441 TComplex sum(0, 0);
442 for (unsigned int n = 0; n < Bmag.size() - 1; n++) {
443 Double_t Bmiddle = 0.5 * (Bmag[n] + Bmag[n + 1]);
444
445 Double_t lStepIneV = ((double)n + 0.5) * deltaIneV;
446 Double_t lStepInCm = ((double)n + 0.5) * deltaL * units("cm");
447
448 TComplex qCgC(0.5 * Gamma * lStepInCm, -q * lStepIneV);
449 qCgC = TComplex::Exp(qCgC);
450
451 TComplex integrand = Bmiddle * deltaL * qCgC; // The integrand is in T by mm
452
453 sum += integrand;
454 }
455
456 Double_t sol = exp(-GammaL) * sum.Rho2() * BLHalfSquared(1, 1);
457 // Now T and mm have been recalculated in natural units using BLHalfSquared(1,1).
458
459 if (fDebug) std::cout << "Axion-photon transmission probability : " << sol << std::endl;
460
461 return (Double_t)sol;
462}
463
481std::pair<Double_t, Double_t> TRestAxionField::GammaTransmissionFieldMapProbability(Double_t Ea, Double_t ma,
482 Double_t accuracy,
483 Int_t num_intervals,
484 Int_t qawo_levels) {
485 if (!fMagneticField) {
486 RESTError << "TRestAxionField::GammaTransmissionFieldMapProbability requires a magnetic field map!"
487 << RESTendl;
488 RESTError << "Use TRestAxionField::AssignMagneticField method to assign one" << RESTendl;
489 return {0.0, 0.0};
490 }
491
492 double photonMass = 0; // Vacuum
493 if (fBufferGas) photonMass = fBufferGas->GetPhotonMass(Ea);
494
495 if (fDebug) {
496 std::cout << "+--------------------------------------------------------------------------+"
497 << std::endl;
498 std::cout << " TRestAxionField::GammaTransmissionProbability. Parameter summary" << std::endl;
499 std::cout << " Photon mass : " << photonMass << " eV" << std::endl;
500 std::cout << " Axion mass : " << ma << " eV" << std::endl;
501 std::cout << " Axion energy : " << Ea << " keV" << std::endl;
502 std::cout << "+--------------------------------------------------------------------------+"
503 << std::endl;
504 }
505
506 double q = (ma * ma - photonMass * photonMass) / 2. / (Ea * units("eV"));
507 q = q * REST_Physics::PhMeterIneV * units("m") / units("mm"); // mm-1
508
509 double Gamma = 0;
510 if (fBufferGas) Gamma = fBufferGas->GetPhotonAbsorptionLength(Ea) * units("cm") / units("mm"); // mm-1
511
512 if (fDebug) {
513 std::cout << "+------------------------+" << std::endl;
514 std::cout << " Intermediate calculations" << std::endl;
515 std::cout << " q : " << q << " eV" << std::endl;
516 std::cout << "Gamma : " << Gamma << std::endl;
517 std::cout << "+------------------------+" << std::endl;
518 }
519
520 if (q == 0)
521 return ComputeResonanceIntegral(Gamma, accuracy, num_intervals);
522 else
523 return ComputeOffResonanceIntegral(q, Gamma, accuracy, num_intervals, qawo_levels);
524
525 return {0.0, 0.0};
526}
527
544std::pair<Double_t, Double_t> TRestAxionField::ComputeResonanceIntegral(Double_t Gamma, Double_t accuracy,
545 Int_t num_intervals) {
546 double reprob, rerr;
547
548 std::pair<TRestAxionMagneticField*, double> params = {fMagneticField, Gamma};
549
550 gsl_integration_workspace* workspace = gsl_integration_workspace_alloc(num_intervals);
551
552 gsl_function F;
553 F.function = &Integrand;
554 F.params = &params;
555
556 auto start = std::chrono::system_clock::now();
557
558 gsl_integration_qag(&F, 0, fMagneticField->GetTrackLength(), accuracy, accuracy, num_intervals,
559 GSL_INTEG_GAUSS61, workspace, &reprob, &rerr);
560
561 auto end = std::chrono::system_clock::now();
562 auto seconds = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
563
564 double GammaL = Gamma * fMagneticField->GetTrackLength();
565 double C = exp(-GammaL) * BLHalfSquared(1, 1);
566
567 double prob = C * reprob * reprob;
568 double proberr = 2 * C * reprob * rerr;
569
570 if (fDebug) {
571 std::cout << " ---- TRestAxionField::ComputeResonanceIntegral (QAG) ----" << std::endl;
572 std::cout << "Gamma: " << Gamma << " mm-1" << std::endl;
573 std::cout << "accuracy: " << accuracy << std::endl;
574 std::cout << "num_intervals: " << num_intervals << std::endl;
575 std::cout << " -------" << std::endl;
576 std::cout << "Probability: " << prob << std::endl;
577 std::cout << "Probability error: " << proberr << std::endl;
578 std::cout << "Computing time: " << seconds.count() << std::endl;
579 std::cout << " -------" << std::endl;
580 }
581
582 std::pair<Double_t, Double_t> sol = {prob, proberr};
583 return sol;
584}
585
602std::pair<Double_t, Double_t> TRestAxionField::ComputeOffResonanceIntegral(Double_t q, Double_t Gamma,
603 Double_t accuracy,
604 Int_t num_intervals,
605 Int_t qawo_levels) {
606 double reprob, rerr;
607 double improb, imerr;
608
609 std::pair<TRestAxionMagneticField*, double> params = {fMagneticField, Gamma};
610
611 gsl_integration_workspace* workspace = gsl_integration_workspace_alloc(num_intervals);
612
613 gsl_function F;
614 F.function = &Integrand;
615 F.params = &params;
616
617 auto start = std::chrono::system_clock::now();
618
619 gsl_integration_qawo_table* wf =
620 gsl_integration_qawo_table_alloc(q, fMagneticField->GetTrackLength(), GSL_INTEG_COSINE, qawo_levels);
621 gsl_integration_qawo(&F, 0, accuracy, accuracy, num_intervals, workspace, wf, &reprob, &rerr);
622
623 gsl_integration_qawo_table_set(wf, q, fMagneticField->GetTrackLength(), GSL_INTEG_SINE);
624 gsl_integration_qawo(&F, 0, accuracy, accuracy, num_intervals, workspace, wf, &improb, &imerr);
625
626 gsl_integration_qawo_table_free(wf);
627
628 auto end = std::chrono::system_clock::now();
629 auto seconds = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
630
631 double GammaL = Gamma * fMagneticField->GetTrackLength();
632 double C = exp(-GammaL) * BLHalfSquared(1, 1);
633
634 double prob = C * (reprob * reprob + improb * improb);
635 double proberr = 2 * C * TMath::Sqrt(reprob * reprob * rerr * rerr + improb * improb * imerr * imerr);
636
637 if (fDebug) {
638 std::cout << " ---- TRestAxionField::ComputeOffResonanceIntegral (QAWO) ----" << std::endl;
639 std::cout << "Gamma: " << Gamma << " mm-1" << std::endl;
640 std::cout << "q: " << q << "mm-1" << std::endl;
641 std::cout << "accuracy: " << accuracy << std::endl;
642 std::cout << "num_intervals: " << num_intervals << std::endl;
643 std::cout << "qawo_levels: " << qawo_levels << std::endl;
644 std::cout << " -------" << std::endl;
645 std::cout << "Probability: " << prob << std::endl;
646 std::cout << "Probability error: " << proberr << std::endl;
647 std::cout << "Computing time: " << seconds.count() << std::endl;
648 std::cout << " -------" << std::endl;
649 }
650
651 std::pair<Double_t, Double_t> sol = {prob, proberr};
652 return sol;
653}
654
668Double_t TRestAxionField::AxionAbsorptionProbability(Double_t ma, Double_t mg, Double_t absLength) {
669 Double_t cohLength = fLcoh * units("m"); // Default REST units are mm;
670
671 Double_t photonMass = mg;
672 if (mg == 0 && fBufferGas) photonMass = fBufferGas->GetPhotonMass(fEa);
673
674 if (fDebug) {
675 RESTDebug << "+--------------------------------------------------------------------------+"
676 << RESTendl;
677 RESTDebug << " TRestAxionField::AxionAbsorptionProbability. Parameter summary" << RESTendl;
678 RESTDebug << " Photon mass : " << photonMass << " eV" << RESTendl;
679 RESTDebug << " Axion mass : " << ma << " eV" << RESTendl;
680 RESTDebug << " Axion energy : " << fEa << " keV" << RESTendl;
681 RESTDebug << " Lcoh : " << fLcoh << " mm" << RESTendl;
682 RESTDebug << " Bmag : " << fBmag << " T" << RESTendl;
683 RESTDebug << "+--------------------------------------------------------------------------+"
684 << RESTendl;
685 }
686
687 if (ma == 0.0 && photonMass == 0.0) return BLHalfSquared(fBmag, fLcoh);
688
689 Double_t q = (ma * ma - photonMass * photonMass) / 2. / (fEa * units("eV"));
690 Double_t l = cohLength * REST_Physics::PhMeterIneV;
691 Double_t phi = q * l;
692
693 Double_t Gamma = absLength;
694 if (absLength == 0 && fBufferGas) Gamma = fBufferGas->GetPhotonAbsorptionLength(fEa); // cm-1
695 Double_t GammaL = Gamma * cohLength * units("cm") / units("m");
696
697 if (fDebug) {
698 RESTDebug << "+------------------------+" << RESTendl;
699 RESTDebug << " Intermediate calculations" << RESTendl;
700 RESTDebug << " q : " << q << " eV" << RESTendl;
701 RESTDebug << " l : " << l << " eV-1" << RESTendl;
702 RESTDebug << " phi : " << phi << RESTendl;
703 RESTDebug << "Gamma : " << Gamma << RESTendl;
704 RESTDebug << "GammaL : " << GammaL << RESTendl;
705 RESTDebug << "+------------------------+" << RESTendl;
706 }
707
708 Double_t MFactor = phi * phi + GammaL * GammaL / 4.0;
709 MFactor = 1.0 / MFactor;
710
711 if (fDebug) {
712 RESTDebug << "Mfactor : " << MFactor << RESTendl;
713 RESTDebug << "(BL/2)^2 : " << BLHalfSquared(fBmag, fLcoh) << RESTendl;
714 RESTDebug << "cos(phi) : " << cos(phi) << RESTendl;
715 RESTDebug << "Exp(-GammaL) : " << exp(-GammaL) << RESTendl;
716 }
717
718 double sol = (double)(MFactor * BLHalfSquared(fBmag, fLcoh) * GammaL);
719
720 if (fDebug) RESTDebug << "Axion-photon absorption probability : " << sol << RESTendl;
721
722 return sol;
723}
724
729Double_t TRestAxionField::AxionAbsorptionProbability(Double_t Bmag, Double_t Lcoh, Double_t Ea, Double_t ma,
730 Double_t mg, Double_t absLength) {
731 fBmag = Bmag;
732 fLcoh = Lcoh;
733 fEa = Ea;
734
735 return AxionAbsorptionProbability(ma, mg, absLength);
736}
737
751 Double_t maxMass = 10; // 10eV is the maximum mass (exit condition)
752
753 Double_t resonanceMass = 0;
754 if (fBufferGas) resonanceMass = fBufferGas->GetPhotonMass(fEa);
755
757 Double_t scanMass = resonanceMass;
758 Double_t Pmax = GammaTransmissionProbability(resonanceMass);
759 while (Pmax / 2 < GammaTransmissionProbability(scanMass)) {
760 scanMass += step;
761 if (scanMass > maxMass) {
762 RESTError << "TRestAxionField::GammaTransmissionProbability. Something went wrong when "
763 "calculating FWHM"
764 << RESTendl;
765 return maxMass;
766 }
767 }
768
769 Double_t fwhm = scanMass - resonanceMass;
770 if (fwhm <= 0) {
771 RESTError << "TRestAxionField::GammaTransmissionProbability. Problem calculating FWHM!" << RESTendl;
772 fwhm = step;
773 }
774 return 2 * fwhm;
775}
776
800std::vector<std::pair<Double_t, Double_t>> TRestAxionField::GetMassDensityScanning(std::string gasName,
801 double maMax,
802 double rampDown) {
803 std::vector<std::pair<Double_t, Double_t>> massDensityPairs;
804
805 // Storing the gas pointer, if there was one
806 TRestAxionBufferGas* previousGas = nullptr;
807 if (fBufferGas) {
808 previousGas = fBufferGas;
809 fBufferGas = nullptr;
810 }
811
812 // We are in vacuum now
813 double firstMass = GammaTransmissionFWHM() / 2;
814
816 gas.SetGasDensity(gasName, 0);
817 AssignBufferGas(&gas); // We are in gas now
818
819 Double_t ma = firstMass;
820 Double_t density = gas.GetDensityForMass(firstMass, fEa);
821
823 massDensityPairs.push_back(std::make_pair(ma, density));
824
825 while (ma < maMax) {
826 Double_t factor = TMath::Exp(-ma * rampDown) + 1;
827 gas.SetGasDensity(gasName, density);
828
829 ma += GammaTransmissionFWHM() / factor;
830 density = gas.GetDensityForMass(ma);
831
832 massDensityPairs.push_back(std::make_pair(ma, density));
833 }
834
835 // Recovering back the gas that was defined before calling this method
836 fBufferGas = previousGas;
837
838 return massDensityPairs;
839}
A metadata class to define the gas properties used in axion search calculations.
Double_t GetPhotonMass(double en)
It returns the equivalent photon mass (in eV) for the gas mixture at the given input energy expressed...
Double_t GetDensityForMass(double m_gamma, double en=4.2)
It returns the equivalent gas density for a given photon mass expressed in eV and a given axion energ...
void SetGasDensity(TString gasName, Double_t density)
It adds a new gas component to the mixture. If it already exists it will update its density.
Double_t GetPhotonAbsorptionLength(Double_t energy)
It returns the inverse of the absorption lenght, for the gas mixture, in cm-1, for the given energy i...
A basic class to define analytical axion-photon conversion calculations for axion helioscopes.
std::pair< Double_t, Double_t > GammaTransmissionFieldMapProbability(Double_t Ea, Double_t ma, Double_t accuracy=1.e-1, Int_t num_intervals=100, Int_t qawo_levels=20)
Performs the calculation of axion-photon conversion probability using directly equation (28) from J....
Double_t BL(Double_t Bmag, Double_t Lcoh)
Performs the calculation of (BL) factor in natural units.
Double_t AxionAbsorptionProbability(Double_t ma, Double_t mg=0, Double_t absLength=0)
Performs the calculation of axion-photon absorption probability using directly equation (18) from van...
void Initialize()
Initialization of TRestAxionField class.
static double Integrand(double x, void *params)
Integrand used for axion-photon probability integration.
Double_t GammaTransmissionProbability(Double_t ma, Double_t mg=0, Double_t absLength=0)
Performs the calculation of axion-photon conversion probability using directly equation (11) from van...
void AssignBufferGas(TRestAxionBufferGas *buffGas)
It assigns a gas buffer medium to the calculation.
~TRestAxionField()
Default destructor.
Double_t BLHalfSquared(Double_t Bmag, Double_t Lcoh)
Performs the calculation of (BL/2)^2 factor in natural units.
Double_t fEa
The energy of the axion in keV.
std::vector< std::pair< Double_t, Double_t > > GetMassDensityScanning(std::string gasName="He", Double_t maMax=0.15, Double_t rampDown=5.0)
This method determines the proper densities to be used in an axion helioscope experiment in order to ...
std::pair< Double_t, Double_t > ComputeOffResonanceIntegral(Double_t q, Double_t Gamma, Double_t accuracy, Int_t num_intervals, Int_t qawo_levels)
Performs the calculation of axion-photon conversion probability using directly equation (28) from J....
TRestAxionMagneticField * fMagneticField
A pointer to the magnetic field definition.
TRestAxionBufferGas * fBufferGas
A pointer to the buffer gas definition.
Double_t fBmag
The magnetic field in Teslas (used for constant field formulas)
Double_t fLcoh
The coherence lenght (in mm) where the magnetic field is defined (for constant field)
TRestAxionField()
Default constructor.
Double_t GammaTransmissionFWHM(Double_t step=0.00001)
Performs the calculation of the FWHM for the axion-photon conversion probability computed in TRestAxi...
std::pair< Double_t, Double_t > ComputeResonanceIntegral(Double_t Gamma, Double_t accuracy, Int_t num_intervals)
Performs the calculation of axion-photon conversion probability using directly equation (28) from J....
constexpr double lightSpeed
Speed of light in m/s.
Definition: TRestPhysics.h:41
constexpr double PhMeterIneV
A meter in eV.
Definition: TRestPhysics.h:52
constexpr double naturalElectron
Electron charge in natural units.
Definition: TRestPhysics.h:56