10 #include <ecl/modules/eclLeakageCollector/eclLeakageCollectorModule.h>
13 #include <framework/gearbox/Const.h>
14 #include <framework/dataobjects/EventMetaData.h>
23 #include <mdst/dataobjects/MCParticle.h>
26 #include <ecl/dbobjects/ECLCrystalCalib.h>
27 #include <ecl/dataobjects/ECLShower.h>
28 #include <ecl/geometry/ECLLeakagePosition.h>
48 m_eclShowerArray("ECLShowers"),
49 m_mcParticleArray("MCParticles"),
53 setDescription(
"Store quantities from single photon MC used to calculated ECL energy leakage corrections");
54 setPropertyFlags(c_ParallelProcessingCertified);
55 addParam(
"position_bins", m_position_bins,
"number of crystal subdivisions in theta and phi", 29);
56 addParam(
"number_energies", m_number_energies,
"number of generated energies", 8);
57 addParam(
"energies_forward", m_energies_forward,
"generated photon energies, forward", std::vector<double> {0.030, 0.050, 0.100, 0.200, 0.483, 1.166, 2.816, 6.800});
58 addParam(
"energies_barrel", m_energies_barrel,
"generated photon energies, barrel", std::vector<double> {0.030, 0.050, 0.100, 0.200, 0.458, 1.049, 2.402, 5.500});
59 addParam(
"energies_backward", m_energies_backward,
"generated photon energies, backward", std::vector<double> {0.030, 0.050, 0.100, 0.200, 0.428, 0.917, 1.962, 4.200});
68 B2INFO(
"eclLeakageCollector: Experiment = " << m_evtMetaData->getExperiment() <<
" run = " << m_evtMetaData->getRun());
71 const int n_e_forward = m_energies_forward.size();
72 const int n_e_barrel = m_energies_barrel.size();
73 const int n_e_backward = m_energies_backward.size();
74 if (n_e_forward != m_number_energies or n_e_barrel != m_number_energies or n_e_backward != m_number_energies) {
75 B2FATAL(
"eclLeakageCollector: length of energy vectors inconsistent with parameter number_energies: " << n_e_forward <<
" " <<
76 n_e_barrel <<
" " << n_e_backward <<
" " << m_number_energies);
80 i_energies.resize(nLeakReg, std::vector<int>(m_number_energies, 0));
81 for (
int ie = 0; ie < m_number_energies; ie++) {
82 i_energies[0][ie] = (int)(1000.*m_energies_forward[ie] + 0.001);
83 i_energies[1][ie] = (int)(1000.*m_energies_barrel[ie] + 0.001);
84 i_energies[2][ie] = (int)(1000.*m_energies_backward[ie] + 0.001);
88 if (m_number_energies < 2) {
89 B2FATAL(
"eclLeakageCollector: require at least two energy points. m_number_energies = " << m_number_energies);
91 for (
int ie = 0; ie < m_number_energies - 1; ie++) {
92 for (
int ireg = 0; ireg < nLeakReg; ireg++) {
93 if (i_energies[ireg][ie] == i_energies[ireg][ie + 1]) {
94 B2FATAL(
"eclLeakageCollector: identical energies, ireg = " << ireg <<
", " << i_energies[ireg][ie] <<
" MeV");
101 B2INFO(
"eclLeakageCollector parameters: ");
102 B2INFO(
"position_bins " << m_position_bins);
103 B2INFO(
"number_energies " << m_number_energies);
104 std::cout <<
"energies_forward ";
105 for (
int ie = 0; ie < m_number_energies; ie++) {std::cout << m_energies_forward[ie] <<
" ";}
106 std::cout << std::endl;
107 std::cout <<
"energies_barrel ";
108 for (
int ie = 0; ie < m_number_energies; ie++) {std::cout << m_energies_barrel[ie] <<
" ";}
109 std::cout << std::endl;
110 std::cout <<
"energies_backward ";
111 for (
int ie = 0; ie < m_number_energies; ie++) {std::cout << m_energies_backward[ie] <<
" ";}
112 std::cout << std::endl;
116 const int nBinX = 3 + nLeakReg * m_number_energies;
117 auto inputParameters =
new TH1F(
"inputParameters",
"eclLeakageCollector job parameters", nBinX, 0, nBinX);
118 registerObject<TH1F>(
"inputParameters", inputParameters);
121 auto tree =
new TTree(
"single_photon_leakage",
"");
122 tree->Branch(
"cellID", &t_cellID,
"cellID/I");
123 tree->Branch(
"thetaID", &t_thetaID,
"thetaID/I");
124 tree->Branch(
"region", &t_region,
"region/I");
125 tree->Branch(
"thetaBin", &t_thetaBin,
"thetaBin/I");
126 tree->Branch(
"phiBin", &t_phiBin,
"phiBin/I");
127 tree->Branch(
"phiMech", &t_phiMech,
"phiMech/I");
128 tree->Branch(
"energyBin", &t_energyBin,
"energyBin/I");
129 tree->Branch(
"nCrys", &t_nCrys,
"nCrys/I");
130 tree->Branch(
"energyFrac", &t_energyFrac,
"energyFrac/F");
131 tree->Branch(
"origEnergyFrac", &t_origEnergyFrac,
"origEnergyFrac/F");
132 tree->Branch(
"locationError", &t_locationError,
"locationError/F");
133 registerObject<TTree>(
"tree", tree);
138 std::cout <<
"creating leakagePosition object " << std::endl;
143 m_eclShowerArray.isRequired();
144 m_mcParticleArray.isRequired();
154 getObjectPtr<TH1F>(
"inputParameters")->Fill(0.01, m_position_bins);
155 getObjectPtr<TH1F>(
"inputParameters")->Fill(1.01, m_number_energies);
156 double firstBin = 2.01;
157 for (
int ie = 0; ie < m_number_energies; ie++) {
158 getObjectPtr<TH1F>(
"inputParameters")->Fill(firstBin + ie, m_energies_forward[ie]);
160 firstBin += m_number_energies;
161 for (
int ie = 0; ie < m_number_energies; ie++) {
162 getObjectPtr<TH1F>(
"inputParameters")->Fill(firstBin + ie, m_energies_barrel[ie]);
164 firstBin += m_number_energies;
165 for (
int ie = 0; ie < m_number_energies; ie++) {
166 getObjectPtr<TH1F>(
"inputParameters")->Fill(firstBin + ie, m_energies_backward[ie]);
170 int lastBin = getObjectPtr<TH1F>(
"inputParameters")->GetNbinsX();
171 getObjectPtr<TH1F>(
"inputParameters")->SetBinContent(lastBin, 1.);
177 double mcLabE = m_mcParticleArray[0]->getEnergy();
178 TVector3 mcp3 = m_mcParticleArray[0]->getMomentum();
179 TVector3 vertex = m_mcParticleArray[0]->getProductionVertex();
183 const int nShower = m_eclShowerArray.getEntries();
184 double minAngle = 999.;
186 for (
int is = 0; is < nShower; is++) {
192 TVector3 position(0., 0., 1.);
193 position.SetTheta(m_eclShowerArray[is]->getTheta());
194 position.SetPhi(m_eclShowerArray[is]->getPhi());
195 position.SetMag(m_eclShowerArray[is]->getR());
198 TVector3 direction = position - vertex;
200 double angle = direction.Angle(mcp3);
201 if (angle < minAngle) {
207 if (minShower == -1) {
return;}
211 const int maxECellId = m_eclShowerArray[minShower]->getCentralCellId();
212 const float thetaLocation = m_eclShowerArray[minShower]->getTheta();
213 const float phiLocation = m_eclShowerArray[minShower]->getPhi();
214 std::vector<int> positionVector = leakagePosition->getLeakagePosition(maxECellId, thetaLocation, phiLocation, m_position_bins);
217 t_cellID = positionVector[0];
218 t_thetaID = positionVector[1];
219 t_region = positionVector[2];
220 t_thetaBin = positionVector[3];
221 t_phiBin = positionVector[4];
222 t_phiMech = positionVector[5];
228 const int iGenEnergyMeV = (int)(1000.*mcLabE + 0.001);
230 for (
int ie = 0; ie < m_number_energies; ie++) {
231 if (iGenEnergyMeV == i_energies[t_region][ie]) {
238 int nForEnergy = (int)(m_eclShowerArray[minShower]->getNumberOfCrystalsForEnergy() + 0.001);
239 t_nCrys = std::min(nCrysMax, nForEnergy);
242 t_energyFrac = m_eclShowerArray[minShower]->getEnergyRaw() / mcLabE;
245 t_origEnergyFrac = m_eclShowerArray[minShower]->getEnergy() / mcLabE;
249 const double radius = m_eclShowerArray[minShower]->getR();
250 TVector3 measuredLocation(0., 0., 1.);
251 measuredLocation.SetTheta(thetaLocation);
252 measuredLocation.SetPhi(phiLocation);
253 measuredLocation.SetMag(radius);
254 TVector3 measuredDirection = measuredLocation - vertex;
255 t_locationError = radius * measuredDirection.Angle(mcp3);
259 getObjectPtr<TTree>(
"tree")->Fill();
Calibration collector module base class.
@ c_nPhotons
CR is split into n photons (N1)
Class to get position information for a cluster for leakage corrections.
Store information needed to calculate ECL energy leakage corrections.
virtual void collect() override
Accumulate TTree.
virtual void prepare() override
Define histograms and read payloads from DB.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.