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_errno.h>
214 #include <gsl/gsl_integration.h>
215 
216 #include <numeric>
217 
218 #include "TH1F.h"
219 
220 using namespace std;
221 
222 ClassImp(TRestAxionField);
223 
228 
233 
238  fBufferGas = NULL;
239 
243 }
244 
251 double TRestAxionField::BL(Double_t Bmag, Double_t Lcoh) {
252  Double_t lengthInMeters = Lcoh * units("m");
253 
254  Double_t tm =
255  REST_Physics::lightSpeed / REST_Physics::naturalElectron * units("GeV") / units("eV"); // eV --> GeV
256  Double_t sol = lengthInMeters * Bmag * tm;
257  sol = sol * 1.0e-10;
258 
259  return sol;
260 }
261 
268 double TRestAxionField::BLHalfSquared(Double_t Bmag, Double_t Lcoh) // (BL/2)**2
269 {
270  Double_t lengthInMeters = Lcoh * units("m");
271 
272  Double_t tm =
273  REST_Physics::lightSpeed / REST_Physics::naturalElectron * units("GeV") / units("eV"); // eV --> GeV
274  Double_t sol = lengthInMeters * Bmag * tm / 2;
275  sol = sol * sol * 1.0e-20;
276 
277  return sol;
278 }
279 
294 Double_t TRestAxionField::GammaTransmissionProbability(Double_t ma, Double_t mg, Double_t absLength) {
295  Double_t cohLength = fLcoh * units("m"); // Default REST units are mm;
296 
297  Double_t photonMass = mg;
298 
299  if (mg == 0 && fBufferGas) photonMass = fBufferGas->GetPhotonMass(fEa);
300 
301  RESTDebug << "+--------------------------------------------------------------------------+" << RESTendl;
302  RESTDebug << " TRestAxionField::GammaTransmissionProbability. Parameter summary" << RESTendl;
303  RESTDebug << " Photon mass : " << photonMass << " eV" << RESTendl;
304  RESTDebug << " Axion mass : " << ma << " eV" << RESTendl;
305  RESTDebug << " Axion energy : " << fEa << " keV" << RESTendl;
306  RESTDebug << " Lcoh : " << fLcoh << " mm" << RESTendl;
307  RESTDebug << " Bmag : " << fBmag << " T" << RESTendl;
308  RESTDebug << "+--------------------------------------------------------------------------+" << RESTendl;
309 
310  if (ma == 0.0 && photonMass == 0.0) return BLHalfSquared(fBmag, fLcoh);
311 
312  Double_t q = (ma * ma - photonMass * photonMass) / 2. / (fEa * units("eV"));
313  Double_t l = cohLength * REST_Physics::PhMeterIneV;
314  Double_t phi = q * l;
315 
316  Double_t Gamma = absLength;
317  if (absLength == 0 && fBufferGas) Gamma = fBufferGas->GetPhotonAbsorptionLength(fEa); // cm-1
318  Double_t GammaL = Gamma * cohLength * units("cm") / units("m"); // m --> cm
319 
320  if (fDebug) {
321  std::cout << "+------------------------+" << std::endl;
322  std::cout << " Intermediate calculations" << std::endl;
323  std::cout << " q : " << q << " eV" << std::endl;
324  std::cout << " l : " << l << " eV-1" << std::endl;
325  std::cout << " phi : " << phi << std::endl;
326  std::cout << "Gamma : " << Gamma << std::endl;
327  std::cout << "GammaL : " << GammaL << std::endl;
328  std::cout << "+------------------------+" << std::endl;
329  }
330 
331  Double_t MFactor = phi * phi + GammaL * GammaL / 4.0;
332  MFactor = 1.0 / MFactor;
333 
334  if (fDebug) {
335  std::cout << "Mfactor : " << MFactor << std::endl;
336  std::cout << "(BL/2)^2 : " << BLHalfSquared(fBmag, fLcoh) << std::endl;
337  std::cout << "cos(phi) : " << cos(phi) << std::endl;
338  std::cout << "Exp(-GammaL) : " << exp(-GammaL) << std::endl;
339  }
340 
341  double sol = (double)(MFactor * BLHalfSquared(fBmag, fLcoh) *
342  (1 + exp(-GammaL) - 2 * exp(-GammaL / 2) * cos(phi)));
343 
344  if (fDebug) std::cout << "Axion-photon transmission probability : " << sol << std::endl;
345 
346  return sol;
347 }
348 
353 Double_t TRestAxionField::GammaTransmissionProbability(Double_t Bmag, Double_t Lcoh, Double_t Ea, Double_t ma,
354  Double_t mg, Double_t absLength) {
355  fBmag = Bmag;
356  fLcoh = Lcoh;
357  fEa = Ea;
358 
359  return GammaTransmissionProbability(ma, mg, absLength);
360 }
361 
381 Double_t TRestAxionField::GammaTransmissionProbability(std::vector<Double_t> Bmag, Double_t deltaL,
382  Double_t Ea, Double_t ma, Double_t mg,
383  Double_t absLength) {
384  // Default REST units are mm. We express cohLength in m.
385  Double_t Lcoh = (Bmag.size() - 1) * deltaL; // in mm
386  Double_t cohLength = Lcoh * units("m"); // in m
387 
388  Double_t photonMass = mg;
389 
390  if (mg == 0 && fBufferGas) photonMass = fBufferGas->GetPhotonMass(Ea);
391 
392  Double_t fieldAverage = 0;
393  if (Bmag.size() > 0) fieldAverage = std::accumulate(Bmag.begin(), Bmag.end(), 0.0) / Bmag.size();
394 
395  if (fDebug) {
396  std::cout << "+--------------------------------------------------------------------------+"
397  << std::endl;
398  std::cout << " TRestAxionField::GammaTransmissionProbability. Parameter summary" << std::endl;
399  std::cout << " Photon mass : " << photonMass << " eV" << std::endl;
400  std::cout << " Axion mass : " << ma << " eV" << std::endl;
401  std::cout << " Axion energy : " << Ea << " keV" << std::endl;
402  std::cout << " Lcoh : " << cohLength << " m" << std::endl;
403  std::cout << " Bmag average : " << fieldAverage << " T" << std::endl;
404  std::cout << "+--------------------------------------------------------------------------+"
405  << std::endl;
406  }
407 
408  // In vacuum
409  if (ma == 0.0 && photonMass == 0.0) return BLHalfSquared(fieldAverage, Lcoh);
410 
411  Double_t q = (ma * ma - photonMass * photonMass) / 2. / (Ea * units("eV"));
412  Double_t l = cohLength * REST_Physics::PhMeterIneV;
413  Double_t phi = q * l;
414 
415  Double_t Gamma = absLength;
416  if (absLength == 0 && fBufferGas) Gamma = fBufferGas->GetPhotonAbsorptionLength(Ea); // cm-1
417  Double_t GammaL = Gamma * cohLength * units("cm") / units("m"); // m --> cm
418 
419  if (fDebug) {
420  std::cout << "+------------------------+" << std::endl;
421  std::cout << " Intermediate calculations" << std::endl;
422  std::cout << " q : " << q << " eV" << std::endl;
423  std::cout << " l : " << l << " eV-1" << std::endl;
424  std::cout << " phi : " << phi << std::endl;
425  std::cout << "Gamma : " << Gamma << std::endl;
426  std::cout << "GammaL : " << GammaL << std::endl;
427  std::cout << "+------------------------+" << std::endl;
428  }
429 
430  Double_t MFactor = phi * phi + GammaL * GammaL / 4.0;
431  MFactor = 1.0 / MFactor;
432 
433  if (fDebug) {
434  std::cout << "Mfactor : " << MFactor << std::endl;
435  std::cout << "(BL/2)^2 : " << BLHalfSquared(fieldAverage, Lcoh) << std::endl;
436  std::cout << "cos(phi) : " << cos(phi) << std::endl;
437  std::cout << "Exp(-GammaL) : " << exp(-GammaL) << std::endl;
438  }
439 
441  Double_t deltaIneV = deltaL * units("m") * REST_Physics::PhMeterIneV;
442  TComplex sum(0, 0);
443  for (unsigned int n = 0; n < Bmag.size() - 1; n++) {
444  Double_t Bmiddle = 0.5 * (Bmag[n] + Bmag[n + 1]);
445 
446  Double_t lStepIneV = ((double)n + 0.5) * deltaIneV;
447  Double_t lStepInCm = ((double)n + 0.5) * deltaL * units("cm");
448 
449  TComplex qCgC(0.5 * Gamma * lStepInCm, -q * lStepIneV);
450  qCgC = TComplex::Exp(qCgC);
451 
452  TComplex integrand = Bmiddle * deltaL * qCgC; // The integrand is in T by mm
453 
454  sum += integrand;
455  }
456 
457  Double_t sol = exp(-GammaL) * sum.Rho2() * BLHalfSquared(1, 1);
458  // Now T and mm have been recalculated in natural units using BLHalfSquared(1,1).
459 
460  if (fDebug) std::cout << "Axion-photon transmission probability : " << sol << std::endl;
461 
462  return (Double_t)sol;
463 }
464 
482 std::pair<Double_t, Double_t> TRestAxionField::GammaTransmissionFieldMapProbability(Double_t Ea, Double_t ma,
483  Double_t accuracy,
484  Int_t num_intervals,
485  Int_t qawo_levels) {
486  gsl_set_error_handler_off();
487 
488  if (!fMagneticField) {
489  RESTError << "TRestAxionField::GammaTransmissionFieldMapProbability requires a magnetic field map!"
490  << RESTendl;
491  RESTError << "Use TRestAxionField::AssignMagneticField method to assign one" << RESTendl;
492  return {0.0, 0.0};
493  }
494 
495  if (fMagneticField->GetTrackLength() <= 0) return {0.0, 0.0};
496 
497  double photonMass = 0; // Vacuum
498  if (fBufferGas) photonMass = fBufferGas->GetPhotonMass(Ea);
499 
500  if (fDebug) {
501  std::cout << "+--------------------------------------------------------------------------+"
502  << std::endl;
503  std::cout << " TRestAxionField::GammaTransmissionProbability. Parameter summary" << std::endl;
504  std::cout << " Photon mass : " << photonMass << " eV" << std::endl;
505  std::cout << " Axion mass : " << ma << " eV" << std::endl;
506  std::cout << " Axion energy : " << Ea << " keV" << std::endl;
507  std::cout << "+--------------------------------------------------------------------------+"
508  << std::endl;
509  }
510 
511  double q = (ma * ma - photonMass * photonMass) / 2. / (Ea * units("eV"));
512  q = q * REST_Physics::PhMeterIneV * units("m") / units("mm"); // mm-1
513 
514  double Gamma = 0;
515  if (fBufferGas) Gamma = fBufferGas->GetPhotonAbsorptionLength(Ea) * units("cm") / units("mm"); // mm-1
516 
517  if (fDebug) {
518  std::cout << "+------------------------+" << std::endl;
519  std::cout << " Intermediate calculations" << std::endl;
520  std::cout << " q : " << q << " eV" << std::endl;
521  std::cout << "Gamma : " << Gamma << std::endl;
522  std::cout << "+------------------------+" << std::endl;
523  }
524 
525  if (q == 0)
526  return ComputeResonanceIntegral(Gamma, accuracy, num_intervals);
527  else
528  return ComputeOffResonanceIntegral(q, Gamma, accuracy, num_intervals, qawo_levels);
529 
530  return {0.0, 0.0};
531 }
532 
549 std::pair<Double_t, Double_t> TRestAxionField::ComputeResonanceIntegral(Double_t Gamma, Double_t accuracy,
550  Int_t num_intervals) {
551  double reprob, rerr;
552 
553  std::pair<TRestAxionMagneticField*, double> params = {fMagneticField, Gamma};
554 
555  gsl_integration_workspace* workspace = gsl_integration_workspace_alloc(num_intervals);
556 
557  gsl_function F;
558  F.function = &Integrand;
559  F.params = &params;
560 
561  auto start = std::chrono::system_clock::now();
562 
563  int status = gsl_integration_qag(&F, 0, fMagneticField->GetTrackLength(), accuracy, accuracy,
564  num_intervals, GSL_INTEG_GAUSS61, workspace, &reprob, &rerr);
565 
566  if (status > 0) return {0, status};
567 
568  auto end = std::chrono::system_clock::now();
569  auto seconds = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
570 
571  double GammaL = Gamma * fMagneticField->GetTrackLength();
572  double C = exp(-GammaL) * BLHalfSquared(1, 1);
573 
574  double prob = C * reprob * reprob;
575  double proberr = 2 * C * reprob * rerr;
576 
577  if (fDebug) {
578  std::cout << " ---- TRestAxionField::ComputeResonanceIntegral (QAG) ----" << std::endl;
579  std::cout << "Gamma: " << Gamma << " mm-1" << std::endl;
580  std::cout << "accuracy: " << accuracy << std::endl;
581  std::cout << "num_intervals: " << num_intervals << std::endl;
582  std::cout << " -------" << std::endl;
583  std::cout << "Probability: " << prob << std::endl;
584  std::cout << "Probability error: " << proberr << std::endl;
585  std::cout << "Computing time: " << seconds.count() << std::endl;
586  std::cout << " -------" << std::endl;
587  }
588 
589  std::pair<Double_t, Double_t> sol = {prob, proberr};
590  return sol;
591 }
592 
609 std::pair<Double_t, Double_t> TRestAxionField::ComputeOffResonanceIntegral(Double_t q, Double_t Gamma,
610  Double_t accuracy,
611  Int_t num_intervals,
612  Int_t qawo_levels) {
613  double reprob, rerr;
614  double improb, imerr;
615 
616  std::pair<TRestAxionMagneticField*, double> params = {fMagneticField, Gamma};
617 
618  gsl_integration_workspace* workspace = gsl_integration_workspace_alloc(num_intervals);
619 
620  gsl_function F;
621  F.function = &Integrand;
622  F.params = &params;
623 
624  auto start = std::chrono::system_clock::now();
625 
626  gsl_integration_qawo_table* wf =
627  gsl_integration_qawo_table_alloc(q, fMagneticField->GetTrackLength(), GSL_INTEG_COSINE, qawo_levels);
628  int status =
629  gsl_integration_qawo(&F, 0, accuracy, accuracy, num_intervals, workspace, wf, &reprob, &rerr);
630  if (status > 0) {
631  gsl_integration_qawo_table_free(wf);
632  return {0, status};
633  }
634 
635  gsl_integration_qawo_table_set(wf, q, fMagneticField->GetTrackLength(), GSL_INTEG_SINE);
636  status = gsl_integration_qawo(&F, 0, accuracy, accuracy, num_intervals, workspace, wf, &improb, &imerr);
637  if (status > 0) {
638  gsl_integration_qawo_table_free(wf);
639  return {0, status};
640  }
641 
642  auto end = std::chrono::system_clock::now();
643  auto seconds = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
644 
645  double GammaL = Gamma * fMagneticField->GetTrackLength();
646  double C = exp(-GammaL) * BLHalfSquared(1, 1);
647 
648  double prob = C * (reprob * reprob + improb * improb);
649  double proberr = 2 * C * TMath::Sqrt(reprob * reprob * rerr * rerr + improb * improb * imerr * imerr);
650 
651  if (fDebug) {
652  std::cout << " ---- TRestAxionField::ComputeOffResonanceIntegral (QAWO) ----" << std::endl;
653  std::cout << "Gamma: " << Gamma << " mm-1" << std::endl;
654  std::cout << "q: " << q << "mm-1" << std::endl;
655  std::cout << "accuracy: " << accuracy << std::endl;
656  std::cout << "num_intervals: " << num_intervals << std::endl;
657  std::cout << "qawo_levels: " << qawo_levels << std::endl;
658  std::cout << " -------" << std::endl;
659  std::cout << "Probability: " << prob << std::endl;
660  std::cout << "Probability error: " << proberr << std::endl;
661  std::cout << "Computing time: " << seconds.count() << std::endl;
662  std::cout << " -------" << std::endl;
663  }
664 
665  std::pair<Double_t, Double_t> sol = {prob, proberr};
666  return sol;
667 }
668 
682 Double_t TRestAxionField::AxionAbsorptionProbability(Double_t ma, Double_t mg, Double_t absLength) {
683  Double_t cohLength = fLcoh * units("m"); // Default REST units are mm;
684 
685  Double_t photonMass = mg;
686  if (mg == 0 && fBufferGas) photonMass = fBufferGas->GetPhotonMass(fEa);
687 
688  if (fDebug) {
689  RESTDebug << "+--------------------------------------------------------------------------+"
690  << RESTendl;
691  RESTDebug << " TRestAxionField::AxionAbsorptionProbability. Parameter summary" << RESTendl;
692  RESTDebug << " Photon mass : " << photonMass << " eV" << RESTendl;
693  RESTDebug << " Axion mass : " << ma << " eV" << RESTendl;
694  RESTDebug << " Axion energy : " << fEa << " keV" << RESTendl;
695  RESTDebug << " Lcoh : " << fLcoh << " mm" << RESTendl;
696  RESTDebug << " Bmag : " << fBmag << " T" << RESTendl;
697  RESTDebug << "+--------------------------------------------------------------------------+"
698  << RESTendl;
699  }
700 
701  if (ma == 0.0 && photonMass == 0.0) return BLHalfSquared(fBmag, fLcoh);
702 
703  Double_t q = (ma * ma - photonMass * photonMass) / 2. / (fEa * units("eV"));
704  Double_t l = cohLength * REST_Physics::PhMeterIneV;
705  Double_t phi = q * l;
706 
707  Double_t Gamma = absLength;
708  if (absLength == 0 && fBufferGas) Gamma = fBufferGas->GetPhotonAbsorptionLength(fEa); // cm-1
709  Double_t GammaL = Gamma * cohLength * units("cm") / units("m");
710 
711  if (fDebug) {
712  RESTDebug << "+------------------------+" << RESTendl;
713  RESTDebug << " Intermediate calculations" << RESTendl;
714  RESTDebug << " q : " << q << " eV" << RESTendl;
715  RESTDebug << " l : " << l << " eV-1" << RESTendl;
716  RESTDebug << " phi : " << phi << RESTendl;
717  RESTDebug << "Gamma : " << Gamma << RESTendl;
718  RESTDebug << "GammaL : " << GammaL << RESTendl;
719  RESTDebug << "+------------------------+" << RESTendl;
720  }
721 
722  Double_t MFactor = phi * phi + GammaL * GammaL / 4.0;
723  MFactor = 1.0 / MFactor;
724 
725  if (fDebug) {
726  RESTDebug << "Mfactor : " << MFactor << RESTendl;
727  RESTDebug << "(BL/2)^2 : " << BLHalfSquared(fBmag, fLcoh) << RESTendl;
728  RESTDebug << "cos(phi) : " << cos(phi) << RESTendl;
729  RESTDebug << "Exp(-GammaL) : " << exp(-GammaL) << RESTendl;
730  }
731 
732  double sol = (double)(MFactor * BLHalfSquared(fBmag, fLcoh) * GammaL);
733 
734  if (fDebug) RESTDebug << "Axion-photon absorption probability : " << sol << RESTendl;
735 
736  return sol;
737 }
738 
743 Double_t TRestAxionField::AxionAbsorptionProbability(Double_t Bmag, Double_t Lcoh, Double_t Ea, Double_t ma,
744  Double_t mg, Double_t absLength) {
745  fBmag = Bmag;
746  fLcoh = Lcoh;
747  fEa = Ea;
748 
749  return AxionAbsorptionProbability(ma, mg, absLength);
750 }
751 
764 Double_t TRestAxionField::GammaTransmissionFWHM(Double_t step) {
765  Double_t maxMass = 10; // 10eV is the maximum mass (exit condition)
766 
767  Double_t resonanceMass = 0;
768  if (fBufferGas) resonanceMass = fBufferGas->GetPhotonMass(fEa);
769 
771  Double_t scanMass = resonanceMass;
772  Double_t Pmax = GammaTransmissionProbability(resonanceMass);
773  while (Pmax / 2 < GammaTransmissionProbability(scanMass)) {
774  scanMass += step;
775  if (scanMass > maxMass) {
776  RESTError << "TRestAxionField::GammaTransmissionProbability. Something went wrong when "
777  "calculating FWHM"
778  << RESTendl;
779  return maxMass;
780  }
781  }
782 
783  Double_t fwhm = scanMass - resonanceMass;
784  if (fwhm <= 0) {
785  RESTError << "TRestAxionField::GammaTransmissionProbability. Problem calculating FWHM!" << RESTendl;
786  fwhm = step;
787  }
788  return 2 * fwhm;
789 }
790 
814 std::vector<std::pair<Double_t, Double_t>> TRestAxionField::GetMassDensityScanning(std::string gasName,
815  double maMax,
816  double rampDown) {
817  std::vector<std::pair<Double_t, Double_t>> massDensityPairs;
818 
819  // Storing the gas pointer, if there was one
820  TRestAxionBufferGas* previousGas = nullptr;
821  if (fBufferGas) {
822  previousGas = fBufferGas;
823  fBufferGas = nullptr;
824  }
825 
826  // We are in vacuum now
827  double firstMass = GammaTransmissionFWHM() / 2;
828 
830  gas.SetGasDensity(gasName, 0);
831  AssignBufferGas(&gas); // We are in gas now
832 
833  Double_t ma = firstMass;
834  Double_t density = gas.GetDensityForMass(firstMass, fEa);
835 
837  massDensityPairs.push_back(std::make_pair(ma, density));
838 
839  while (ma < maMax) {
840  Double_t factor = TMath::Exp(-ma * rampDown) + 1;
841  gas.SetGasDensity(gasName, density);
842 
843  ma += GammaTransmissionFWHM() / factor;
844  density = gas.GetDensityForMass(ma);
845 
846  massDensityPairs.push_back(std::make_pair(ma, density));
847  }
848 
849  // Recovering back the gas that was defined before calling this method
850  fBufferGas = previousGas;
851 
852  return massDensityPairs;
853 }
A metadata class to define the gas properties used in axion search calculations.
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.
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.
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...
~TRestAxionField()
Default destructor.
Double_t BLHalfSquared(Double_t Bmag, Double_t Lcoh)
Performs the calculation of (BL/2)^2 factor in natural units.
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....
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