Belle II Software  release-08-01-10
eclee5x5CollectorModule.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 /* Own header. */
10 #include <ecl/modules/eclee5x5Collector/eclee5x5CollectorModule.h>
11 
12 /* ECL headers. */
13 #include <ecl/dataobjects/ECLCalDigit.h>
14 #include <ecl/dataobjects/ECLDigit.h>
15 #include <ecl/dataobjects/ECLElementNumbers.h>
16 #include <ecl/dbobjects/ECLCrystalCalib.h>
17 
18 /* Basf2 headers. */
19 #include <analysis/ClusterUtility/ClusterUtils.h>
20 #include <framework/dataobjects/EventMetaData.h>
21 #include <framework/datastore/RelationVector.h>
22 #include <framework/geometry/VectorUtil.h>
23 #include <mdst/dataobjects/ECLCluster.h>
24 #include <mdst/dataobjects/TRGSummary.h>
25 
26 /* ROOT headers. */
27 #include <Math/Vector3D.h>
28 #include <Math/Vector4D.h>
29 #include <TH2F.h>
30 
31 using namespace std;
32 using namespace Belle2;
33 
34 
35 //-----------------------------------------------------------------
36 // Register the Module
37 //-----------------------------------------------------------------
38 REG_MODULE(eclee5x5Collector);
39 
40 //-----------------------------------------------------------------
41 // Implementation
42 //-----------------------------------------------------------------
43 
44 //-----------------------------------------------------------------------------------------------------
45 
46 eclee5x5CollectorModule::eclee5x5CollectorModule() : CalibrationCollectorModule(),
47  m_ECLExpee5x5E("ECLExpee5x5E"), m_ElectronicsCalib("ECLCrystalElectronics"), m_ee5x5Calib("ECLCrystalEnergyee5x5"),
48  m_selectdPhiData("ECLeedPhiData"), m_selectdPhiMC("ECLeedPhiMC")
49 {
50  // Set module properties
51  setDescription("Calibration Collector Module for ECL single crystal energy calibration using Bhabha events");
53  addParam("thetaLabMinDeg", m_thetaLabMinDeg, "miniumum ecl cluster theta in lab (degrees)", 17.);
54  addParam("thetaLabMaxDeg", m_thetaLabMaxDeg, "maximum ecl cluster theta in lab (degrees)", 150.);
55  addParam("minE0", m_minE0, "minimum energy of cluster 0: E*0/sqrts", 0.45);
56  addParam("minE1", m_minE1, "minimum energy of cluster 1: E*1/sqrts", 0.40);
57  addParam("maxdThetaSum", m_maxdThetaSum, "maximum diff between 180 deg and sum of cluster theta* (deg)", 2.);
58  addParam("dPhiScale", m_dPhiScale, "scale dPhi* cut by this factor", 1.);
59  addParam("maxTime", m_maxTime, "maximum cluster time diff abs(t1-t0)/dt99", 10.);
60  addParam("useCalDigits", m_useCalDigits, "use MC events to obtain expected energies", false);
61  addParam("requireL1", m_requireL1, "only use events that have a level 1 trigger", false);
62 }
63 
64 
65 
69 {
70 
73  B2INFO("eclee5x5Collector: Experiment = " << m_evtMetaData->getExperiment() << " run = " << m_evtMetaData->getRun() << " sqrts = "
74  << m_sqrts);
75 
76 
79  auto EnVsCrysID = new TH2F("EnVsCrysID", "Normalized 5x5 energy for each crystal;crystal ID;E25/Expected",
81  1.2);
82  registerObject<TH2F>("EnVsCrysID", EnVsCrysID);
83 
84  auto RvsCrysID = new TH1F("RvsCrysID", "E_exp x E_crysID / sigma^2;crysID;sum of E_exp x E_crysID/sigma^2",
86  registerObject("RvsCrysID", RvsCrysID);
87 
88  auto NRvsCrysID = new TH1F("NRvsCrysID", "Entries in RvsCrysID vs crysID;crysID;Entries in RvsCrysID",
90  registerObject("NRvsCrysID", NRvsCrysID);
91 
92  auto Qmatrix = new TH2F("Qmatrix", "E_i x E_j/sigma^2;crysID i;crysID j", ECLElementNumbers::c_NCrystals, 0,
94  registerObject("Qmatrix", Qmatrix);
95 
96 
97  auto ElecCalibvsCrys = new TH1F("ElecCalibvsCrys", "Sum electronics calib const vs crystal ID;crystal ID;calibration constant",
99  registerObject<TH1F>("ElecCalibvsCrys", ElecCalibvsCrys);
100  auto ExpEvsCrys = new TH1F("ExpEvsCrys", "Sum expected energy calib const vs crystalID;crystal ID;calibration constant",
103  registerObject<TH1F>("ExpEvsCrys", ExpEvsCrys);
104  auto InitialCalibvsCrys = new TH1F("InitialCalibvsCrys", "Sum initial calib const vs crystal ID;crystal ID;calibration constant",
106  registerObject<TH1F>("InitialCalibvsCrys", InitialCalibvsCrys);
107 
108  auto CalibEntriesvsCrys = new TH1F("CalibEntriesvsCrys", "Entries in calib vs crys histograms;crystal ID;Entries per crystal",
111  registerObject<TH1F>("CalibEntriesvsCrys", CalibEntriesvsCrys);
112 
113  auto EntriesvsCrys = new TH1F("EntriesvsCrys", "Selected Bhabha clusters vs crystal ID;crystal ID;Entries",
115  registerObject<TH1F>("EntriesvsCrys", EntriesvsCrys);
116 
117  auto dPhivsThetaID = new TH2F("dPhivsThetaID",
118  "Phi* vs thetaID forward, pass thetaSum,E0,E1;thetaID of forward cluster;dPhi COM (deg)", 69, 0, 69, 150, 165, 180);
119  registerObject<TH2F>("dPhivsThetaID", dPhivsThetaID);
120 
121  //------------------------------------------------------------------------
123  B2INFO("Input parameters to eclee5x5Collector:");
124  B2INFO("thetaLabMinDeg: " << m_thetaLabMinDeg);
125  B2INFO("thetaLabMaxDeg: " << m_thetaLabMaxDeg);
126  m_thetaLabMin = m_thetaLabMinDeg / TMath::RadToDeg();
127  m_thetaLabMax = m_thetaLabMaxDeg / TMath::RadToDeg();
128  B2INFO("minE0: " << m_minE0);
129  B2INFO("minE1: " << m_minE1);
130  B2INFO("maxdThetaSum: " << m_maxdThetaSum);
131  B2INFO("dPhiScale: " << m_dPhiScale);
132  B2INFO("maxTime: " << m_maxTime);
133  B2INFO("useCalDigits: " << m_useCalDigits);
134  B2INFO("requireL1: " << m_requireL1);
135 
139 
142 
145  if (m_ECLExpee5x5E.hasChanged()) {
146  Expee5x5E = m_ECLExpee5x5E->getCalibVector();
147  Expee5x5Sigma = m_ECLExpee5x5E->getCalibUncVector();
148  }
149  if (m_ElectronicsCalib.hasChanged()) {ElectronicsCalib = m_ElectronicsCalib->getCalibVector();}
150  if (m_ee5x5Calib.hasChanged()) {ee5x5Calib = m_ee5x5Calib->getCalibVector();}
151  if (m_selectdPhiMC.hasChanged() and m_useCalDigits) {
152  meandPhi = m_selectdPhiMC->getCalibVector();
153  widthdPhi = m_selectdPhiMC->getCalibUncVector();
154  } else if (m_selectdPhiData.hasChanged()) {
155  meandPhi = m_selectdPhiData->getCalibVector();
156  widthdPhi = m_selectdPhiData->getCalibUncVector();
157  }
158 
160  for (int ic = 1; ic < 9000; ic += 1000) {
161  B2INFO("DB constants for cellID=" << ic << ": ee5x5Calib = " << ee5x5Calib[ic - 1] << " Expee5x5E = " << Expee5x5E[ic - 1] <<
162  " ElectronicsCalib = " <<
163  ElectronicsCalib[ic - 1]);
164  }
165 
167  for (int crysID = 0; crysID < ECLElementNumbers::c_NCrystals; crysID++) {
168  if (ElectronicsCalib[crysID] <= 0) {B2FATAL("eclee5x5Collector: ElectronicsCalib = " << ElectronicsCalib[crysID] << " for crysID = " << crysID);}
169  if (Expee5x5E[crysID] == 0) {B2FATAL("eclee5x5Collector: Expee5x5E = 0 for crysID = " << crysID);}
170  if (ee5x5Calib[crysID] == 0) {B2FATAL("eclee5x5Collector: ee5x5Calib = 0 for crysID = " << crysID);}
171  }
172 
175  m_eclClusterArray.isRequired();
176  m_eclCalDigitArray.isRequired();
177  if (!m_useCalDigits) {m_eclDigitArray.isRequired();}
178  m_evtMetaData.isRequired();
179 
181  //..Derive ThetaID of each crystal, and cut on dPhi* as a function of thetaID
182  int crysID = 0;
183  for (int it = 0; it < 69; it++) {
184 
185  //..dPhi* cuts are actually a function of thetaID, not crysID
186  m_dPhiMin.push_back(meandPhi[crysID] - m_dPhiScale * widthdPhi[crysID]);
187  m_dPhiMax.push_back(meandPhi[crysID] + m_dPhiScale * widthdPhi[crysID]);
188  for (int ic = 0; ic < m_eclNeighbours5x5->getCrystalsPerRing(it); ic++) {
189  m_thetaID.at(crysID) = it;
190  crysID++;
191  }
192  }
193 
194 }
195 
196 
200 {
201 
203  if (storeCalib) {
204  for (int crysID = 0; crysID < ECLElementNumbers::c_NCrystals; crysID++) {
205  getObjectPtr<TH1F>("ExpEvsCrys")->Fill(crysID + 0.001, Expee5x5E[crysID]);
206  getObjectPtr<TH1F>("ElecCalibvsCrys")->Fill(crysID + 0.001, ElectronicsCalib[crysID]);
207  getObjectPtr<TH1F>("InitialCalibvsCrys")->Fill(crysID + 0.001, ee5x5Calib[crysID]);
208  getObjectPtr<TH1F>("CalibEntriesvsCrys")->Fill(crysID + 0.001);
209  }
210  storeCalib = false;
211  }
212 
215  bool newConst = false;
216  if (m_ECLExpee5x5E.hasChanged()) {
217  newConst = true;
218  B2INFO("ECLExpee5x5E has changed, exp = " << m_evtMetaData->getExperiment() << " run = " << m_evtMetaData->getRun());
219  Expee5x5E = m_ECLExpee5x5E->getCalibVector();
220  Expee5x5Sigma = m_ECLExpee5x5E->getCalibUncVector();
221  }
222  if (m_ElectronicsCalib.hasChanged()) {
223  newConst = true;
224  B2INFO("ECLCrystalElectronics has changed, exp = " << m_evtMetaData->getExperiment() << " run = " << m_evtMetaData->getRun());
225  ElectronicsCalib = m_ElectronicsCalib->getCalibVector();
226  }
227  if (m_ee5x5Calib.hasChanged()) {
228  newConst = true;
229  B2INFO("ECLCrystalEnergyee5x5 has changed, exp = " << m_evtMetaData->getExperiment() << " run = " << m_evtMetaData->getRun());
230  ee5x5Calib = m_ee5x5Calib->getCalibVector();
231  }
232 
233  if (newConst) {
234  for (int ic = 1; ic < 9000; ic += 1000) {
235  B2INFO("DB constants for cellID=" << ic << ": ee5x5Calib = " << ee5x5Calib[ic - 1] << " Expee5x5E = " << Expee5x5E[ic - 1] <<
236  " ElectronicsCalib = " <<
237  ElectronicsCalib[ic - 1]);
238  }
239 
241  for (int crysID = 0; crysID < ECLElementNumbers::c_NCrystals; crysID++) {
242  if (ElectronicsCalib[crysID] <= 0) {B2FATAL("eclee5x5Collector: ElectronicsCalib = " << ElectronicsCalib[crysID] << " for crysID = " << crysID);}
243  if (Expee5x5E[crysID] == 0) {B2FATAL("eclee5x5Collector: Expee5x5E = 0 for crysID = " << crysID);}
244  if (ee5x5Calib[crysID] == 0) {B2FATAL("eclee5x5Collector: ee5x5Calib = 0 for crysID = " << crysID);}
245  }
246  }
247 
250  if (m_requireL1) {
251  unsigned int L1TriggerResults = m_TRGResults->getTRGSummary(0);
252  if (L1TriggerResults == 0) {return;}
253  }
254 
255  //------------------------------------------------------------------------
257  int icMax[2] = { -1, -1};
258  double maxClustE[2] = { -1., -1.};
259  int nclust = m_eclClusterArray.getEntries();
260  for (int ic = 0; ic < nclust; ic++) {
263  if (eClust > maxClustE[0]) {
264  maxClustE[1] = maxClustE[0];
265  icMax[1] = icMax[0];
266  maxClustE[0] = eClust;
267  icMax[0] = ic;
268  } else if (eClust > maxClustE[1]) {
269  maxClustE[1] = eClust;
270  icMax[1] = ic;
271  }
272  }
273  }
274 
275  //------------------------------------------------------------------------
278  if (icMax[1] == -1) {return;}
279  double theta0 = m_eclClusterArray[icMax[0]]->getTheta();
280  double theta1 = m_eclClusterArray[icMax[1]]->getTheta();
281  if (theta0 < m_thetaLabMin || theta0 > m_thetaLabMax || theta1 < m_thetaLabMin || theta1 > m_thetaLabMax) {return;}
282 
284  double t0 = m_eclClusterArray[icMax[0]]->getTime();
285  double dt990 = m_eclClusterArray[icMax[0]]->getDeltaTime99();
286  double t1 = m_eclClusterArray[icMax[1]]->getTime();
287  double dt991 = m_eclClusterArray[icMax[1]]->getDeltaTime99();
288  double dt99min = dt990;
289  if (dt991 < dt990) {dt99min = dt991;}
290  if (dt99min <= 0) {dt99min = 0.0001;}
291  if (abs(t1 - t0) > dt99min * m_maxTime) {return;}
292 
293  //------------------------------------------------------------------------
295  ClusterUtils cUtil;
296  const ROOT::Math::XYZVector clustervertex = cUtil.GetIPPosition();
297 
298  double phi0 = m_eclClusterArray[icMax[0]]->getPhi();
299  ROOT::Math::XYZVector p30;
300  VectorUtil::setMagThetaPhi(p30, maxClustE[0], theta0, phi0);
301  const ROOT::Math::PxPyPzEVector p40 = cUtil.Get4MomentumFromCluster(m_eclClusterArray[icMax[0]], clustervertex,
303 
304  double phi1 = m_eclClusterArray[icMax[1]]->getPhi();
305  ROOT::Math::XYZVector p31;
306  VectorUtil::setMagThetaPhi(p31, maxClustE[1], theta1, phi1);
307  const ROOT::Math::PxPyPzEVector p41 = cUtil.Get4MomentumFromCluster(m_eclClusterArray[icMax[1]], clustervertex,
309 
311  ROOT::Math::PxPyPzEVector p40COM = m_boostrotate.rotateLabToCms() * p40;
312  ROOT::Math::PxPyPzEVector p41COM = m_boostrotate.rotateLabToCms() * p41;
313  double theta01COM = (p41COM.Theta() + p40COM.Theta()) * TMath::RadToDeg();
314  if (abs(theta01COM - 180.) > m_maxdThetaSum) {return;}
315 
317  if (p40COM.E() < m_minE0 * m_sqrts and p41COM.E() < m_minE0 * m_sqrts) {return;}
318  if (p40COM.E() < m_minE1 * m_sqrts or p41COM.E() < m_minE1 * m_sqrts) {return;}
319 
320 
321  //------------------------------------------------------------------------
323  int crysIDMax[2] = { -1, -1};
324  double crysEMax[2] = { -1., -1.};
325  for (int imax = 0; imax < 2; imax++) {
326  auto eclClusterRelations = m_eclClusterArray[icMax[imax]]->getRelationsTo<ECLCalDigit>("ECLCalDigits");
327  for (unsigned int ir = 0; ir < eclClusterRelations.size(); ir++) {
328  const auto calDigit = eclClusterRelations.object(ir);
329  int tempCrysID = calDigit->getCellId() - 1;
330  float tempE = calDigit->getEnergy();
331  if (tempE > crysEMax[imax]) {
332  crysEMax[imax] = tempE;
333  crysIDMax[imax] = tempCrysID;
334  }
335  }
336  }
337 
339  double dphiCOM = abs(p41COM.Phi() - p40COM.Phi()) * TMath::RadToDeg();
340  if (dphiCOM > 180.) {dphiCOM = 360. - dphiCOM;}
341 
342  int thetaIDmin = m_thetaID[crysIDMax[0]];
343  if (m_thetaID[crysIDMax[1]] < m_thetaID[crysIDMax[0]]) {thetaIDmin = m_thetaID[crysIDMax[1]];}
344  getObjectPtr<TH2F>("dPhivsThetaID")->Fill(thetaIDmin + 0.001, dphiCOM);
345  if (dphiCOM<m_dPhiMin.at(thetaIDmin) or dphiCOM>m_dPhiMax.at(thetaIDmin)) {return;}
346 
347 
348  //------------------------------------------------------------------------
350  memset(&EperCrys[0], 0, EperCrys.size()*sizeof EperCrys[0]);
351 
352  if (m_useCalDigits) {
353  for (auto& eclCalDigit : m_eclCalDigitArray) {
354  int tempCrysID = eclCalDigit.getCellId() - 1;
355  EperCrys[tempCrysID] = eclCalDigit.getEnergy();
356  }
357  } else {
358  for (auto& eclDigit : m_eclDigitArray) {
359  int tempCrysID = eclDigit.getCellId() - 1;
361  EperCrys[tempCrysID] = eclDigit.getAmp() * abs(ee5x5Calib[tempCrysID]) * ElectronicsCalib[tempCrysID];
362  }
363  }
364 
365  //------------------------------------------------------------------------
366  //** Quantities needed for the 5x5 calibration */
367  for (int ic = 0; ic < 2; ic++) {
368  int crysMax = crysIDMax[ic];
369  float expE = abs(Expee5x5E[crysMax]);
370  float sigmaExp = Expee5x5Sigma[crysMax];
371  std::vector<short int> neighbours = m_eclNeighbours5x5->getNeighbours(crysMax + 1);
372 
373  //** Energy in 5x5, and expected energy corrected for crystals that will not be calibrated */
374  double reducedExpE = expE;
375  double E25 = 0.;
376  for (auto& cellID : neighbours) {
377  E25 += EperCrys[cellID - 1];
378  if (ee5x5Calib[cellID - 1] < 0.) {
379  reducedExpE -= EperCrys[cellID - 1];
380  }
381  }
382 
383  //** now the vector and matrix used in the calibration */
384  double rexpE = reducedExpE / sigmaExp;
385  for (auto& celli : neighbours) {
386  if (ee5x5Calib[celli - 1] > 0.) {
387  float rEi = EperCrys[celli - 1] / sigmaExp;
388  getObjectPtr<TH1F>("RvsCrysID")->Fill(celli - 0.999, rexpE * rEi);
389  getObjectPtr<TH1F>("NRvsCrysID")->Fill(celli - 0.999);
390  for (auto& cellj : neighbours) {
391  if (ee5x5Calib[cellj - 1] > 0.) {
392  float rEj = EperCrys[cellj - 1] / sigmaExp;
393  getObjectPtr<TH2F>("Qmatrix")->Fill(celli - 0.999, cellj - 0.999, rEi * rEj);
394  }
395  }
396  }
397  }
398 
399  //** Record normalized energy and corresponding calib values. Expee5x5E is negative if the algorithm was unable to calculate a value. In this case, the nominal input value has been stored with a minus sign */
400  getObjectPtr<TH2F>("EnVsCrysID")->Fill(crysMax + 0.001, E25 / expE);
401  getObjectPtr<TH1F>("EntriesvsCrys")->Fill(crysMax + 0.001);
402  getObjectPtr<TH1F>("ExpEvsCrys")->Fill(crysMax + 0.001, Expee5x5E[crysMax]);
403  getObjectPtr<TH1F>("ElecCalibvsCrys")->Fill(crysMax + 0.001, ElectronicsCalib[crysMax]);
404  getObjectPtr<TH1F>("InitialCalibvsCrys")->Fill(crysMax + 0.001, ee5x5Calib[crysMax]);
405  getObjectPtr<TH1F>("CalibEntriesvsCrys")->Fill(crysMax + 0.001);
406  }
407 }
Calibration collector module base class.
void registerObject(std::string name, T *obj)
Register object with a name, takes ownership, do not access the pointer beyond prepare()
Class to provide momentum-related information from ECLClusters.
Definition: ClusterUtils.h:35
const ROOT::Math::PxPyPzEVector Get4MomentumFromCluster(const ECLCluster *cluster, ECLCluster::EHypothesisBit hypo)
Returns four momentum vector.
Definition: ClusterUtils.cc:25
const ROOT::Math::XYZVector GetIPPosition()
Returns default IP position from beam parameters.
Class to store calibrated ECLDigits: ECLCalDigits.
Definition: ECLCalDigit.h:23
int getCellId() const
Get Cell ID.
Definition: ECLCalDigit.h:114
@ c_nPhotons
CR is split into n photons (N1)
Class to get the neighbours for a given cell id.
Definition: ECLNeighbours.h:25
const std::vector< short int > & getNeighbours(short int cid) const
Return the neighbours for a given cell ID.
short int getCrystalsPerRing(const short int thetaid) const
return number of crystals in a given theta ring
Definition: ECLNeighbours.h:39
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
double getCMSEnergy() const
Returns CMS energy of e+e- (aka.
const ROOT::Math::LorentzRotation rotateLabToCms() const
Returns Lorentz transformation from Lab to CMS.
DBObjPtr< ECLCrystalCalib > m_selectdPhiData
dPhi cut
StoreArray< ECLDigit > m_eclDigitArray
Required input array of ECLDigits.
std::vector< float > widthdPhi
width of requirement on dPhi from DB object
std::vector< float > Expee5x5E
vector of energies obtained from DB object
bool m_requireL1
require events to satisfy a level 1 trigger (false)
DBObjPtr< ECLCrystalCalib > m_ECLExpee5x5E
Expected energies from database.
double m_maxTime
maximum cluster time diff abs(t1-t0)/dt99 (10)
double m_maxdThetaSum
abs(theta0* + theta1* - 180 deg) must be less than less (2 deg)
StoreArray< ECLCluster > m_eclClusterArray
Required arrays.
StoreObjPtr< TRGSummary > m_TRGResults
dataStore TRGSummary
bool storeCalib
force the input calibration constants to be saved first event
double m_minE0
minimum energy of cluster 0: E*0/sqrts (0.45)
std::vector< float > EperCrys
Energy for each crystal from ECLDigit or ECLCalDigit (GeV)
std::vector< int > m_thetaID
thetaID of each crystal
ECL::ECLNeighbours * m_eclNeighbours5x5
Neighbour map of 25 crystals.
bool m_useCalDigits
use eclCalDigit to determine MC deposited energy (false)
std::vector< float > Expee5x5Sigma
vector of sigmaE obtained from DB object
std::vector< float > m_dPhiMin
minimum dPhi* as a function of thetaID
std::vector< float > m_dPhiMax
maximum dPhi* as a function of thetaID
void collect() override
Select events and crystals and accumulate histograms.
StoreObjPtr< EventMetaData > m_evtMetaData
dataStore EventMetaData
std::vector< float > ElectronicsCalib
vector obtained from DB object
StoreArray< ECLCalDigit > m_eclCalDigitArray
Required input array of ECLCalDigits.
double m_thetaLabMax
m_thetaLabMaxDeg converted to radians
std::vector< float > meandPhi
mean requirement on dPhi from DB object
double m_sqrts
sqrt s from m_boostrotate
void prepare() override
Define histograms and read payloads from DB.
std::vector< float > ee5x5Calib
vector obtained from DB object
double m_thetaLabMin
Some other useful quantities.
DBObjPtr< ECLCrystalCalib > m_selectdPhiMC
DB object for MC.
double m_thetaLabMaxDeg
maximum ecl cluster theta in lab (150 degrees)
DBObjPtr< ECLCrystalCalib > m_ee5x5Calib
Existing single crystal calibration from DB; will be updated by CAF.
double m_thetaLabMinDeg
Parameters to control the job.
PCmsLabTransform m_boostrotate
boost from COM to lab and visa versa
double m_dPhiScale
scale dPhi* cut by this factor (1)
double m_minE1
minimum energy of cluster 1: E*1/sqrts (0.40)
DBObjPtr< ECLCrystalCalib > m_ElectronicsCalib
Electronics calibration from database.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
const int c_NCrystals
Number of crystals.
Abstract base class for different kinds of events.