45 static constexpr float inv_sqrt_12 = 0.2886751;
55 int wg_left = wgroups[0];
57 int wg_right = wgroups[wgroups.size() - 1];
65 int centerWire_left = (
int)(Mwire1 - Nwires1 / 2. + 0.5);
66 int centerWire_right = (
int)(Mwire2 + Nwires2 / 2.);
68 float centerWire = (centerWire_left + centerWire_right) / 2.;
74 if (wHit.
deadWG() > 0 || wgroups.size() > 2) {
76 for (
unsigned int iWG = 0; iWG < wgroups.size(); iWG++) {
79 }
else if (2 == wgroups.size()) {
87 }
else if (1 == wgroups.size()) {
96 int nStrip = strips.size();
97 int idCenterStrip = nStrip / 2;
98 int centerStrip = strips[idCenterStrip];
101 const std::vector<float>&
adc = sHit.
s_adc();
102 const std::vector<float>& adcRaw = sHit.
s_adcRaw();
104 std::vector<float> adc2;
105 std::vector<float> adc2Raw;
107 LogTrace(
"CSCMake2DRecHit") <<
"[CSCMake2DRecHit] dump of adc values to be added to rechit follows...";
109 for (
int iStrip = 0; iStrip < nStrip; ++iStrip) {
114 for (
int t = 0;
t < 4; ++
t) {
115 adc2.push_back(adc[
t + iStrip * 4]);
116 adc2Raw.push_back(adcRaw[
t + iStrip * 4]);
119 adcMap.
put(strips[iStrip], adc2.begin(), adc2.end());
123 LogTrace(
"CSCMake2DRecHit") <<
"[CSCMake2DRecHit] strip = " << strips[iStrip] <<
" adcs= " << adc2Raw[0] <<
" " 124 << adc2Raw[1] <<
" " << adc2Raw[2] <<
" " << adc2Raw[3];
130 for (
int t = 0;
t < 4; ++
t) {
131 int k =
t + 4 * (idCenterStrip);
132 adcArray[
t] = adc[
k];
136 LogTrace(
"CSCRecHit") <<
"[CSCMake2DRecHit] " <<
id <<
" strip=" << centerStrip <<
", t_zero=" << tpeak - 133.f
137 <<
", tpeak=" << tpeak;
139 float positionWithinTheStrip = -99.;
140 float sigmaWithinTheStrip = -99.;
144 float stripWidth = -99.f;
146 if (centerStrip == 1 || centerStrip ==
specs_->
nStrips() || nStrip < 2) {
148 positionWithinTheStrip = 0.f;
150 sigmaWithinTheStrip = stripWidth * inv_sqrt_12;
158 float xWithinChamber = lp11.
x();
169 positionWithinTheStrip,
182 float phaseCorrection = (sHit.
stripsl1a()[0] >> (15 - 0) & 0
x1) * 25.;
186 float tofCorrection = gp0.
mag() / 29.9792458;
187 float signalPropagationSpeed[11] = {0.0, -78, -76, -188, -262, -97, -99, -90, -99, -99, -113};
189 float yCorrection = position / signalPropagationSpeed[
id_.
iChamberType()];
194 tpeak = tpeak + chipCorrection + phaseCorrection + chamberCorrection - tofCorrection + yCorrection;
204 float gasGainCorrection = -999.f;
217 float energyDeposit = -999.f;
218 if (gasGainCorrection < -998.
f) {
220 energyDeposit = -998.f;
222 }
else if (gasGainCorrection < 0.
f) {
224 energyDeposit = -997.f;
228 if (adcMap.
size() == 12) {
229 energyDeposit = adcMap[0] * gasGainCorrection + adcMap[1] * gasGainCorrection + adcMap[2] * gasGainCorrection +
230 adcMap[4] * gasGainCorrection + adcMap[5] * gasGainCorrection + adcMap[6] * gasGainCorrection +
231 adcMap[8] * gasGainCorrection + adcMap[9] * gasGainCorrection + adcMap[10] * gasGainCorrection;
233 }
else if (adcMap.
size() == 4) {
235 energyDeposit = -996.f;
255 positionWithinTheStrip,
256 sigmaWithinTheStrip / stripWidth,
266 LogTrace(
"CSCRecHit") <<
"[CSCMake2DRecHit] rechit created in layer " <<
id <<
"... \n" << rechit;
272 bool isInFiducial =
true;
279 if (!layergeom_->
inside(rhPosition)) {
280 isInFiducial =
false;
298 float timeGuess = tpeak / 25.f + anode_bx_offset;
299 float diffMin = 9999.f;
301 for (
int j = 0;
j < (
int)timeBinsOn.size();
j++) {
302 auto diff = timeGuess - timeBinsOn[
j];
307 wireBx = timeBinsOn[
j];
310 int side = diffMin > 0 ? 1 : -1;
311 bool unchanged =
true;
313 if ((bestMatch + side) > -1 &&
314 (bestMatch + side) < (
int)timeBinsOn.size()) {
315 if (timeBinsOn[bestMatch] ==
316 (timeBinsOn[bestMatch + side] - side)) {
318 wireBx = wireBx + 0.5f * side;
323 if ((bestMatch - side) > -1 && (bestMatch - side) < (
int)timeBinsOn.size() &&
325 if (timeBinsOn[bestMatch] == (timeBinsOn[bestMatch - side] + side)) {
326 wireBx = wireBx - 0.5f * side;
329 return wireBx - anode_bx_offset;
float gasGainCorrection(const CSCDetId &id, int strip, int wireGroup) const
returns gas-gain correction
T getParameter(std::string const &) const
ChannelContainer wgroups() const
The wire groups used for forming the cluster.
const ChannelContainer & stripsl1a() const
L1A.
Point3DBase< Scalar, LocalTag > LocalPoint
bool useGasGainCorrections
std::vector< int > timeBinsOn() const
Vector of time bins ON for central wire digi, lower of center pair if even number.
const StripHitADCContainer & s_adcRaw() const
the raw ADC counts for each of the strip within cluster
size_t size() const
return number of contained object
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Sin< T >::type sin(const T &t)
const StripHitADCContainer & s_adc() const
L1A.
int numberOfWiresPerGroup(int wireGroup) const
LocalPoint localPosition() const override
const CSCChamberSpecs * specs_
float findWireBx(const std::vector< int > &timeBinsOn, float tpeak, const CSCDetId &id)
ChannelContainer wgroupsBXandWire() const
The BX + wire group number.
void setConditions(const CSCRecoConditions *reco)
Pass pointer to conditions data onwards.
LocalError localError(int strip, float sigmaStrip, float sigmaWire) const
short int deadStrip() const
is a neighbouring string a dead strip?
void setConditions(const CSCRecoConditions *reco)
Cache pointer to conditions data.
CSCXonStrip_MatchGatti * xMatchGatti_
float yOfWire(float wire, float x=0.) const
const CSCChamberSpecs * specs() const
float middleWireOfGroup(int wireGroup) const
float yResolution(int wireGroup=1) const
Abs< T >::type abs(const T &t)
constexpr int adc(sample_type sample)
get the ADC sample (12 bits)
unsigned short iChamberType() const
bool inside(const Local3DPoint &, const LocalError &, float scale=1.f) const override
bool isHitInFiducial(const CSCLayer *layer, const CSCRecHit2D &rh)
Test if rechit is in fiducial volume.
void put(ID id, CI begin, CI end)
insert an object range with specified identifier
float chipCorrection(const CSCDetId &detId, int channel) const
All other functions are accessed by geometrical strip label (i.e. strip number according to local coo...
static const double tmax[3]
int tmax() const
Strip hit maximum time bin.
const CSCRecoConditions * recoConditions_
const ChannelContainer & stripsTotal() const
The strips used in cluster to produce strip hit (total content)
float anodeBXoffset(const CSCDetId &detId) const
const CSCLayerGeometry * layergeom_
def bestMatch(object, matchCollection)
void findXOnStrip(const CSCDetId &id, const CSCLayer *layer, const CSCStripHit &stripHit, int centralStrip, float &xWithinChamber, float &stripWidth, const float &tpeak, float &xWithinStrip, float &sigma, int &quality_flag)
Returns fitted local x position and its estimated error.
CSCRecHit2D hitFromStripAndWire(const CSCDetId &id, const CSCLayer *layer, const CSCWireHit &wHit, const CSCStripHit &sHit)
Make 2D hits when have both wire and strip hit available in same layer.
const ChannelContainer & strips() const
L1A.
LocalPoint stripWireIntersection(int strip, float wire) const
static int position[264][3]
bool useTimingCorrections
strips
#turn off noise in all subdetectors simHcalUnsuppressedDigis.doNoise = False mix.digitizers.hcal.doNoise = False simEcalUnsuppressedDigis.doNoise = False mix.digitizers.ecal.doNoise = False simEcalUnsuppressedDigis.doESNoise = False simSiPixelDigis.AddNoise = False mix.digitizers.pixel.AddNoise = False simSiStripDigis.Noise = False mix.digitizers.strip.AddNoise = False
const std::unique_ptr< CSCFindPeakTime > peakTimeFinder_
float chamberTimingCorrection(const CSCDetId &id) const
CSCMake2DRecHit(const edm::ParameterSet &)
float stripAngle(int strip) const
const CSCChamber * chamber() const
const CSCLayerGeometry * geometry() const
short int deadWG() const
a dead WG in the cluster?
std::vector< int > ChannelContainer