qupid 0.2
Quasi-Signal Generation Model for Pixelized Detector
Loading...
Searching...
No Matches
QPMonteCarlo.cpp
1#include "QPMonteCarlo.hpp"
2
3#include "QPRandomBase.hpp"
4#include "QPDigitizerBase.hpp"
5#include "QPSignalGaussian.hpp"
6#include "QPVector.hpp"
7#include "QPMatrix.hpp"
8
9#include <cstdio>
10
12: fDigitizer(digitizer), fRandom(random){;}
13
14void QPMonteCarlo::SetPositionRange(const double& xmin, const double& xmax,
15 const double& ymin, const double& ymax){
16 fXmin = xmin;
17 fXmax = xmax;
18 fYmin = ymin;
19 fYmax = ymax;
20}
21
22void QPMonteCarlo::SetAmplitude(const double& amp){
23 fAmp = amp;
24 fRandomAmp = false;
25}
26
27void QPMonteCarlo::SetAmplitudeRange(const double& min, const double& max){
28 fAmpMin = min;
29 fAmpMax = max;
30 fRandomAmp = true;
31}
32
33void QPMonteCarlo::SetSigma(const double& sigma){
34 fSigma = sigma;
35}
36
37void QPMonteCarlo::SetThreshold(const double& threshold){
38 fThreshold = threshold;
39}
40
42 Record rec;
43
44 // Fixed draw order: x, y, then amplitude only when it is randomized.
45 rec.fX = fRandom.Uniform(fXmin, fXmax);
46 rec.fY = fRandom.Uniform(fYmin, fYmax);
47 rec.fAmp = fRandomAmp ? fRandom.Uniform(fAmpMin, fAmpMax) : fAmp;
48 rec.fSigma = fSigma;
49
50 QPVector mu = QPVector(rec.fX, rec.fY);
51 QPMatrix S = QPMatrix(2,2,4, fSigma, 0., 0., fSigma);
52
53 QPSignalGaussian * sig = new QPSignalGaussian(mu, rec.fAmp, S);
54 fDigitizer->InjectSignal(sig);
55
56 rec.fNpix = (int) fDigitizer->GetFiredPixel(fThreshold).size();
57
58 fDigitizer->ClearSignal();
59 return rec;
60}
61
62std::vector<QPMonteCarlo::Record> QPMonteCarlo::Run(int ntrial){
63 std::vector<Record> records;
64 records.reserve(ntrial > 0 ? ntrial : 0);
65 for(int i=0; i<ntrial; i++){
66 records.push_back(Shoot());
67 }
68 return records;
69}
70
71bool QPMonteCarlo::WriteCSV(const std::vector<Record>& records,
72 const std::string& filename){
73 std::FILE* out = std::fopen(filename.c_str(), "w");
74 if(out == nullptr) return false;
75 std::fprintf(out, "amp,x,y,sig,npix\n");
76 for(const Record& r : records){
77 std::fprintf(out, "%.17g,%.17g,%.17g,%.17g,%d\n",
78 r.fAmp, r.fX, r.fY, r.fSigma, r.fNpix);
79 }
80 std::fclose(out);
81 return true;
82}
Abstract pixel-matrix digitizer: owns the injected signals and the matrix geometry; concrete classes ...
void InjectSignal(QPSignalBase *signal)
Hands a signal to the digitizer, which takes ownership: the default ClearSignal() deletes it.
void ClearSignal(bool removeall=true)
Empties the signal store.
std::deque< QPPixelBase * > GetFiredPixel(double threshold)
Builds every pixel and keeps those whose digital signal exceeds threshold; the rest are deleted inter...
Dense m×n matrix of double with hand-rolled linear algebra.
Definition QPMatrix.hpp:15
void SetThreshold(const double &threshold)
Pixel firing threshold.
Record Shoot()
Generate one event.
void SetAmplitude(const double &amp)
Fixed amplitude for every event; disables the amplitude draw.
void SetSigma(const double &sigma)
Width of the injected Gaussian.
QPMonteCarlo(QPDigitizerBase *digitizer, QPRandomBase &random)
std::vector< Record > Run(int ntrial)
Shoot() ntrial times.
static bool WriteCSV(const std::vector< Record > &records, const std::string &filename)
Write records as CSV: header line amp,x,y,sig,npix, values with %.17g (round-trip double precision).
void SetPositionRange(const double &xmin, const double &xmax, const double &ymin, const double &ymax)
Uniform draw ranges for the signal position, µm.
void SetAmplitudeRange(const double &min, const double &max)
Per-event uniform amplitude draw.
Abstract random number source.
virtual double Uniform(double a, double b)=0
Uniform deviate between a and b.
2D Gaussian signal in covariance-matrix form,
3-component double vector with hand-rolled operations.
Definition QPVector.hpp:13
One generated event, plain data only.
int fNpix
pixels above threshold (cluster size)
double fSigma
value placed on both diagonal entries of the covariance-form matrix S
double fAmp
signal amplitude, electrons
double fY
signal position y, µm
double fX
signal position x, µm