Belle II Software development
CDCDedxScanModule.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#include <reconstruction/modules/CDCDedxPID/CDCDedxScanModule.h>
10#include <reconstruction/modules/CDCDedxPID/LineHelper.h>
11
12#include <reconstruction/dataobjects/CDCDedxTrack.h>
13#include <reconstruction/dataobjects/DedxConstants.h>
14
15#include <cdc/geometry/CDCGeometryPar.h>
16#include <vxd/geometry/GeoCache.h>
17
18#include <genfit/MaterialEffects.h>
19
20#include <boost/shared_ptr.hpp>
21#include <boost/make_shared.hpp>
22
23#include <cmath>
24#include <stdlib.h>
25#include <time.h>
26
27using namespace Belle2;
28using namespace CDC;
29using namespace Dedx;
30
31REG_MODULE(CDCDedxScan);
32
34{
35
36 setDescription("Extract dE/dx and corresponding log-likelihood from fitted tracks and hits in the CDC, SVD and PXD.");
37}
38
40
42{
43
44 // register outputs
45 m_dedxArray.registerInDataStore();
46
47 // create instances here to not confuse profiling
50
51 if (!genfit::MaterialEffects::getInstance()->isInitialized()) {
52 B2FATAL("Need to have SetupGenfitExtrapolationModule in path before this one");
53 }
54}
55
57{
58
59 // get the geometry of the cdc
61
62 // **************************************************
63 //
64 // GENERATE PARAMETERS OVER THE FULL RANGE
65 //
66 // **************************************************
67
68 srand(time(NULL));
69
70 boost::shared_ptr<CDCDedxTrack> dedxTrack = boost::make_shared<CDCDedxTrack>();
71
72 for (int i = 0; i < 56; ++i) {
73 int nWires = cdcgeo.nWiresInLayer(i);
74
75 // position of a sense wire in this layer at endpoints
76 const ROOT::Math::XYZVector& wirePosF = cdcgeo.wireForwardPosition(i, 0);
77
78 // radii of field wires for this layer
79 double inner = cdcgeo.innerRadiusWireLayer()[i];
80 double outer = cdcgeo.outerRadiusWireLayer()[i];
81
82 double cellHeight = outer - inner;
83 double topHeight = outer - wirePosF.Rho();
84 double bottomHeight = wirePosF.Rho() - inner;
85 double topHalfWidth = M_PI * outer / nWires;
86 double bottomHalfWidth = M_PI * inner / nWires;
87 double cellHalfWidth = M_PI * wirePosF.Rho() / nWires;
88
89 // first construct the boundary lines, then create the cell
90 const DedxPoint tl = DedxPoint(-topHalfWidth, topHeight);
91 const DedxPoint tr = DedxPoint(topHalfWidth, topHeight);
92 const DedxPoint br = DedxPoint(bottomHalfWidth, -bottomHeight);
93 const DedxPoint bl = DedxPoint(-bottomHalfWidth, -bottomHeight);
94 DedxDriftCell c = DedxDriftCell(tl, tr, br, bl);
95
96 for (int j = 0; j < 100; ++j) {
97 for (int k = 0; k < 100; ++k) {
98 double doca = j * cellHalfWidth / 50.0 - cellHalfWidth;
99 double entAng = k * M_PI / 100.0 - M_PI_2;
100
101 // re-scaled (RS) doca and entAng variable: map to square cell
102 double cellR = 2 * cellHalfWidth / cellHeight;
103 double tana = 100.0;
104 if (std::abs(2 * atan(1) - std::abs(entAng)) < 0.01)tana = 100 * (entAng / std::abs(entAng)); //avoid infinity at pi/2
105 else tana = std::tan(entAng);
106 double docaRS = doca * std::sqrt((1 + cellR * cellR * tana * tana) / (1 + tana * tana));
107 double entAngRS = std::atan(tana / cellR);
108
109 // now calculate the path length for this hit
110 double celldx = c.dx(doca, entAng);
111 if (!c.isValid()) continue;
112
113 dedxTrack->addHit(0, 0, i, doca, docaRS, entAng, entAngRS, 0, 0, 0.0, celldx, 0.0, cellHeight, cellHalfWidth, 0, 0.0, 0.0, 1.0, 1.0,
114 1.0, 0, 0.0, 0.0, 0.0);
115 }
116 }
117 m_dedxArray.appendNew(*dedxTrack);
118 }
119}
120
122{
123
124 B2INFO("CDCDedxScanModule exiting");
125}
virtual void initialize() override
Initialize the module.
virtual void event() override
This method is called for each event.
CDCDedxScanModule()
Default constructor.
StoreArray< CDCDedxTrack > m_dedxArray
array of output dE/dx tracks
virtual void terminate() override
End of the event processing.
virtual ~CDCDedxScanModule()
Destructor.
The Class for CDC Geometry Parameters.
const B2Vector3D wireForwardPosition(uint layerId, int cellId, EWirePosition set=c_Base) const
Returns the forward position of the input sense wire.
unsigned nWiresInLayer(int layerId) const
Returns wire numbers in a layer.
const double * innerRadiusWireLayer() const
Returns an array of inner radius of wire layers.
static CDCGeometryPar & Instance(const CDCGeometry *=nullptr)
Static method to get a reference to the CDCGeometryPar instance.
const double * outerRadiusWireLayer() const
Returns an array of outer radius of wire layers.
A class to hold the geometry of a cell.
Definition: LineHelper.h:186
A collection of classes that are useful for making a simple path length correction to the dE/dx measu...
Definition: LineHelper.h:29
Base class for Modules.
Definition: Module.h:72
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition: GeoCache.cc:214
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
double atan(double a)
atan for double
Definition: beamHelpers.h:34
Abstract base class for different kinds of events.