File indexing completed on 2024-04-06 12:04:00
0001 #include <DataFormats/CSCRecHit/interface/CSCRecHit2D.h>
0002 #include <iostream>
0003
0004 CSCRecHit2D::CSCRecHit2D()
0005 : theTpeak(-999.),
0006 thePositionWithinStrip(-999.),
0007 theErrorWithinStrip(-999.),
0008 theEnergyDeposit(-994.),
0009 theQuality(0),
0010 theScaledWireTime(0),
0011 theBadStrip(0),
0012 theBadWireGroup(0),
0013 nStrips_(0),
0014 nWireGroups_(0),
0015 nTimeBins_(0),
0016 theLocalPosition(0., 0.),
0017 theLocalError(0., 0., 0.) {
0018 for (unsigned int i = 0; i < MAXSTRIPS; i++)
0019 theStrips_[i] = 0;
0020 for (unsigned int i = 0; i < MAXSTRIPS; i++)
0021 for (unsigned int j = 0; j < MAXTIMEBINS; j++)
0022 theADCs_[i * MAXTIMEBINS + j] = 0;
0023 }
0024
0025 CSCRecHit2D::CSCRecHit2D(const CSCDetId& id,
0026 const LocalPoint& pos,
0027 const LocalError& err,
0028 const ChannelContainer& channels,
0029 const ADCContainer& adcs,
0030 const ChannelContainer& wgroups,
0031 float tpeak,
0032 float posInStrip,
0033 float errInStrip,
0034 int quality,
0035 short int badStrip,
0036 short int badWireGroup,
0037 int scaledWireTime,
0038 float energyDeposit)
0039 : RecHit2DLocalPos(id),
0040 theTpeak(tpeak),
0041 thePositionWithinStrip(posInStrip),
0042 theErrorWithinStrip(errInStrip),
0043 theEnergyDeposit(energyDeposit),
0044 theQuality(quality),
0045 theScaledWireTime(scaledWireTime),
0046 theBadStrip(badStrip),
0047 theBadWireGroup(badWireGroup),
0048 theLocalPosition(pos),
0049 theLocalError(err) {
0050 nStrips_ = channels.size();
0051 nWireGroups_ = wgroups.size();
0052
0053 if (nStrips_ > MAXSTRIPS) {
0054 std::cout << "CSCRecHit2D: not enough strips in DataFormat! " << unsigned(nStrips_) << std::endl;
0055 nStrips_ = MAXSTRIPS;
0056 }
0057
0058 for (unsigned int i = 0; i < MAXSTRIPS; i++)
0059 theStrips_[i] = 0;
0060 for (unsigned int i = 0; i < MAXSTRIPS; i++)
0061 theL1APhaseBits_[i] = 0;
0062 for (unsigned int i = 0; i < MAXSTRIPS; i++)
0063 for (unsigned int j = 0; j < MAXTIMEBINS; j++)
0064 theADCs_[i * MAXTIMEBINS + j] = 0;
0065
0066 for (unsigned int i = 0; i < nStrips_; i++) {
0067 theStrips_[i] = channels[i] & 0x000000FF;
0068 theL1APhaseBits_[i] = channels[i] & 0x0000FF00;
0069 }
0070 if (nWireGroups_ > 0) {
0071
0072 hitWire_ = wgroups[nWireGroups_ / 2] & 0x0000FFFF;
0073 theWGroupsBX_ = (wgroups[nWireGroups_ / 2] >> 16) & 0x0000FFFF;
0074 } else {
0075 hitWire_ = 0;
0076 theWGroupsBX_ = 0;
0077 }
0078 ADCContainer tmp(adcs);
0079 nTimeBins_ = tmp.size() / nStrips_;
0080 unsigned int k = 0;
0081 for (unsigned int i = 0; i < nStrips_; i++)
0082 for (unsigned int j = 0; j < nTimeBins_; j++) {
0083 theADCs_[i * MAXTIMEBINS + j] = tmp[k];
0084 k++;
0085 }
0086 }
0087
0088 CSCRecHit2D::~CSCRecHit2D() {}
0089
0090 bool CSCRecHit2D::sharesInput(const TrackingRecHit* other, TrackingRecHit::SharedInputType what) const {
0091
0092
0093
0094 CSCRecHit2D::SharedInputType cscWhat = static_cast<CSCRecHit2D::SharedInputType>(what);
0095 return sharesInput(other, cscWhat);
0096 }
0097
0098 bool CSCRecHit2D::sharesInput(const TrackingRecHit* other, CSCRecHit2D::SharedInputType what) const {
0099
0100 if (other->geographicalId().subdetId() != MuonSubdetId::CSC)
0101 return false;
0102
0103
0104 const CSCRecHit2D* otherRecHit = static_cast<const CSCRecHit2D*>(other);
0105
0106 return sharesInput(otherRecHit, what);
0107 }
0108
0109 bool CSCRecHit2D::sharesInput(const CSCRecHit2D* otherRecHit, CSCRecHit2D::SharedInputType what) const {
0110
0111 if (geographicalId() != otherRecHit->geographicalId())
0112 return false;
0113
0114
0115 if (nStrips() == 0 && otherRecHit->nStrips() == 0 && nWireGroups() == 0 && otherRecHit->nWireGroups() == 0)
0116 return true;
0117 if ((what == allWires || what == someWires) && nWireGroups() == 0 && otherRecHit->nWireGroups() == 0)
0118 return true;
0119 if ((what == allStrips || what == someStrips) && nStrips() == 0 && otherRecHit->nStrips() == 0)
0120 return true;
0121
0122
0123 if ((what == all || what == allWires) && nWireGroups() != otherRecHit->nWireGroups())
0124 return false;
0125
0126
0127 if ((what == all || what == allStrips) && nStrips() != otherRecHit->nStrips())
0128 return false;
0129
0130 bool foundWire = false;
0131
0132 if (what != allStrips && what != someStrips) {
0133
0134 if (hitWire() != otherRecHit->hitWire())
0135 return false;
0136 }
0137
0138
0139 bool foundStrip = false;
0140 if (what != allWires && what != someWires) {
0141 for (unsigned int i = 0; i < nStrips(); i++) {
0142 bool found = false;
0143 for (unsigned int j = 0; j < nStrips(); j++) {
0144
0145 if (cscDetId().channel(channels(i)) == otherRecHit->cscDetId().channel(otherRecHit->channels(j))) {
0146 if (what == some || what == someStrips)
0147 return true;
0148 else {
0149 found = true;
0150 foundStrip = true;
0151 break;
0152 }
0153 }
0154 }
0155 if ((what == all || what == allStrips) && !found)
0156 return false;
0157 }
0158 if (what == someStrips && !foundStrip)
0159 return false;
0160 }
0161
0162
0163 if (!foundWire && !foundStrip)
0164 return false;
0165
0166
0167
0168
0169
0170
0171 return true;
0172 }
0173
0174 void CSCRecHit2D::print() const {
0175 std::cout << "CSCRecHit in CSC Detector: " << cscDetId() << std::endl;
0176 std::cout << " local x = " << localPosition().x() << " +/- " << sqrt(localPositionError().xx())
0177 << " y = " << localPosition().y() << " +/- " << sqrt(localPositionError().yy()) << std::endl;
0178
0179 std::cout << " tpeak " << theTpeak << " psoInStrip " << thePositionWithinStrip << " errorinstrip "
0180 << theErrorWithinStrip << " "
0181 << " qual " << theQuality << " wiretime " << theScaledWireTime << " tbs " << theBadStrip << " bwg "
0182 << theBadWireGroup << std::endl;
0183
0184 std::cout << " Channels: ";
0185 for (unsigned int i = 0; i < nStrips(); i++) {
0186 std::cout << std::dec << channels(i) << " "
0187 << " ("
0188 << "HEX: " << std::hex << channels(i) << ")"
0189 << " ";
0190 }
0191 std::cout << std::endl;
0192
0193
0194 std::cout << " L1APhase: ";
0195 for (int i = 0; i < (int)nStrips(); i++) {
0196 std::cout << "|";
0197 for (int k = 0; k < 8; k++) {
0198 std::cout << ((channelsl1a(i) >> (15 - k)) & 0x1) << " ";
0199 }
0200 std::cout << "| ";
0201 }
0202 std::cout << std::endl;
0203
0204 std::cout << "nWireGroups " << (int)nWireGroups() << " central wire " << hitWire_ << std::endl;
0205 }
0206
0207 std::ostream& operator<<(std::ostream& os, const CSCRecHit2D& rh) {
0208 os << "CSCRecHit2D: "
0209 << "local x: " << rh.localPosition().x() << " +/- " << sqrt(rh.localPositionError().xx())
0210 << " y: " << rh.localPosition().y() << " +/- " << sqrt(rh.localPositionError().yy())
0211 << " in strip X: " << rh.positionWithinStrip() << " +/- " << rh.errorWithinStrip() << " quality: " << rh.quality()
0212 << " tpeak: " << rh.tpeak() << " wireTime: " << rh.wireTime() << std::endl;
0213 os << "strips: ";
0214 for (size_t iS = 0; iS < rh.nStrips(); ++iS) {
0215 os << rh.channels(iS) << " ";
0216 }
0217 int nwgs = rh.nWireGroups();
0218 if (nwgs == 1) {
0219 os << "central wire: " << rh.hitWire() << " of " << nwgs << " wiregroup" << std::endl;
0220 } else {
0221 os << "central wire: " << rh.hitWire() << " of " << nwgs << " wiregroups" << std::endl;
0222 }
0223 return os;
0224 }