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_mcParticleArray("MCParticles"),
52 setDescription(
"Store quantities from single photon MC used to calculated ECL energy leakage corrections");
53 setPropertyFlags(c_ParallelProcessingCertified);
54 addParam(
"position_bins", m_position_bins,
"number of crystal subdivisions in theta and phi", 29);
55 addParam(
"number_energies", m_number_energies,
"number of generated energies", 8);
56 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});
57 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});
58 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});
59 addParam(
"showerArrayName", m_showerArrayName,
"name of ECLShower data object", std::string(
"ECLShowers"));
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;
113 B2INFO(
"showerArrayName " << m_showerArrayName);
117 const int nBinX = 3 + nLeakReg * m_number_energies;
118 auto inputParameters =
new TH1F(
"inputParameters",
"eclLeakageCollector job parameters", nBinX, 0, nBinX);
119 registerObject<TH1F>(
"inputParameters", inputParameters);
122 auto tree =
new TTree(
"single_photon_leakage",
"");
123 tree->Branch(
"cellID", &t_cellID,
"cellID/I");
124 tree->Branch(
"thetaID", &t_thetaID,
"thetaID/I");
125 tree->Branch(
"region", &t_region,
"region/I");
126 tree->Branch(
"thetaBin", &t_thetaBin,
"thetaBin/I");
127 tree->Branch(
"phiBin", &t_phiBin,
"phiBin/I");
128 tree->Branch(
"phiMech", &t_phiMech,
"phiMech/I");
129 tree->Branch(
"energyBin", &t_energyBin,
"energyBin/I");
130 tree->Branch(
"nCrys", &t_nCrys,
"nCrys/I");
131 tree->Branch(
"energyFrac", &t_energyFrac,
"energyFrac/F");
132 tree->Branch(
"origEnergyFrac", &t_origEnergyFrac,
"origEnergyFrac/F");
133 tree->Branch(
"locationError", &t_locationError,
"locationError/F");
134 registerObject<TTree>(
"tree", tree);
139 std::cout <<
"creating leakagePosition object " << std::endl;
144 m_eclShowerArray.isRequired(m_showerArrayName);
145 m_mcParticleArray.isRequired();
155 getObjectPtr<TH1F>(
"inputParameters")->Fill(0.01, m_position_bins);
156 getObjectPtr<TH1F>(
"inputParameters")->Fill(1.01, m_number_energies);
157 double firstBin = 2.01;
158 for (
int ie = 0; ie < m_number_energies; ie++) {
159 getObjectPtr<TH1F>(
"inputParameters")->Fill(firstBin + ie, m_energies_forward[ie]);
161 firstBin += m_number_energies;
162 for (
int ie = 0; ie < m_number_energies; ie++) {
163 getObjectPtr<TH1F>(
"inputParameters")->Fill(firstBin + ie, m_energies_barrel[ie]);
165 firstBin += m_number_energies;
166 for (
int ie = 0; ie < m_number_energies; ie++) {
167 getObjectPtr<TH1F>(
"inputParameters")->Fill(firstBin + ie, m_energies_backward[ie]);
171 int lastBin = getObjectPtr<TH1F>(
"inputParameters")->GetNbinsX();
172 getObjectPtr<TH1F>(
"inputParameters")->SetBinContent(lastBin, 1.);
178 double mcLabE = m_mcParticleArray[0]->getEnergy();
179 TVector3 mcp3 = m_mcParticleArray[0]->getMomentum();
180 TVector3 vertex = m_mcParticleArray[0]->getProductionVertex();
184 const int nShower = m_eclShowerArray.getEntries();
185 double minAngle = 999.;
187 for (
int is = 0; is < nShower; is++) {
193 TVector3 position(0., 0., 1.);
194 position.SetTheta(m_eclShowerArray[is]->getTheta());
195 position.SetPhi(m_eclShowerArray[is]->getPhi());
196 position.SetMag(m_eclShowerArray[is]->getR());
199 TVector3 direction = position - vertex;
201 double angle = direction.Angle(mcp3);
202 if (angle < minAngle) {
208 if (minShower == -1) {
return;}
212 const int maxECellId = m_eclShowerArray[minShower]->getCentralCellId();
213 const float thetaLocation = m_eclShowerArray[minShower]->getTheta();
214 const float phiLocation = m_eclShowerArray[minShower]->getPhi();
215 std::vector<int> positionVector = leakagePosition->getLeakagePosition(maxECellId, thetaLocation, phiLocation, m_position_bins);
218 t_cellID = positionVector[0];
219 t_thetaID = positionVector[1];
220 t_region = positionVector[2];
221 t_thetaBin = positionVector[3];
222 t_phiBin = positionVector[4];
223 t_phiMech = positionVector[5];
229 const int iGenEnergyMeV = (int)(1000.*mcLabE + 0.001);
231 for (
int ie = 0; ie < m_number_energies; ie++) {
232 if (iGenEnergyMeV == i_energies[t_region][ie]) {
239 int nForEnergy = (int)(m_eclShowerArray[minShower]->getNumberOfCrystalsForEnergy() + 0.001);
240 t_nCrys = std::min(nCrysMax, nForEnergy);
243 t_energyFrac = m_eclShowerArray[minShower]->getEnergyRaw() / mcLabE;
246 t_origEnergyFrac = m_eclShowerArray[minShower]->getEnergy() / mcLabE;
250 const double radius = m_eclShowerArray[minShower]->getR();
251 TVector3 measuredLocation(0., 0., 1.);
252 measuredLocation.SetTheta(thetaLocation);
253 measuredLocation.SetPhi(phiLocation);
254 measuredLocation.SetMag(radius);
255 TVector3 measuredDirection = measuredLocation - vertex;
256 t_locationError = radius * measuredDirection.Angle(mcp3);
260 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.