File indexing completed on 2024-10-08 05:11:44
0001 #ifndef DEUTILS_H
0002 #define DEUTILS_H
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <iomanip>
0012
0013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0014 #include "L1Trigger/HardwareValidation/interface/DEtrait.h"
0015
0016 template <typename T>
0017 struct DEutils {
0018 typedef typename T::size_type col_sz;
0019 typedef typename T::const_iterator col_cit;
0020 typedef typename T::iterator col_it;
0021 typedef DEtrait<T> de_trait;
0022 typedef typename de_trait::cand_type cand_type;
0023 typedef typename de_trait::coll_type coll_type;
0024
0025 public:
0026 DEutils() {
0027 if (de_type() > 51)
0028 edm::LogError("L1ComparatorDeutilsCollType")
0029 << "DEutils::DEutils() :: "
0030 << "specialization is still missing for collection of type:" << de_type() << std::endl;
0031 }
0032 ~DEutils() {}
0033
0034 inline int de_type() const { return de_trait::de_type(); }
0035 bool de_equal(const cand_type&, const cand_type&);
0036 bool de_equal_loc(const cand_type&, const cand_type&);
0037 bool de_nequal(const cand_type&, const cand_type&);
0038 bool de_nequal_loc(const cand_type&, const cand_type&);
0039 col_it de_find(col_it, col_it, const cand_type&);
0040
0041
0042 std::string print(col_cit) const;
0043 bool is_empty(col_cit) const;
0044 std::string GetName(int i = 0) const;
0045
0046 L1DataEmulDigi DEDigi(col_cit itd, col_cit itm, int ctype);
0047 };
0048
0049
0050
0051 template <typename T>
0052 L1DataEmulDigi DEutils<T>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0053
0054 return L1DataEmulDigi();
0055 }
0056
0057 template <>
0058 inline L1DataEmulDigi DEutils<EcalTrigPrimDigiCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0059 int cid = de_type();
0060 int errt = aflag;
0061
0062 double x1 = (aflag != 4) ? itd->id().iphi() : itm->id().iphi();
0063 double x2 = (aflag != 4) ? itd->id().ieta() : itm->id().ieta();
0064 L1DataEmulDigi digi(dedefs::ETP, cid, x1, x2, 0, errt);
0065 unsigned int dwS = (aflag == 4) ? 0 : itd->sample(itd->sampleOfInterest()).raw();
0066 unsigned int ewS = (aflag == 3) ? 0 : itm->sample(itm->sampleOfInterest()).raw();
0067
0068 unsigned int mask = 0x0eff;
0069 dwS &= mask;
0070 ewS &= mask;
0071 unsigned int dwI = (aflag == 4) ? 0 : itd->id().rawId();
0072 unsigned int ewI = (aflag == 3) ? 0 : itm->id().rawId();
0073
0074
0075 unsigned int dw = (dwI & 0xfe00ffff) | ((dwS & 0x000001ff) << 16);
0076 unsigned int ew = (ewI & 0xfe00ffff) | ((ewS & 0x000001ff) << 16);
0077 digi.setData(dw, ew);
0078 int de = (aflag == 4) ? 0 : itd->compressedEt();
0079 int ee = (aflag == 3) ? 0 : itm->compressedEt();
0080 digi.setRank((float)de, (float)ee);
0081 L1MonitorDigi dedata(dedefs::ETP, cid, itd->id().iphi(), itd->id().ieta(), 0, itd->compressedEt(), itd->id().rawId());
0082 L1MonitorDigi deemul(dedefs::ETP, cid, itm->id().iphi(), itm->id().ieta(), 0, itm->compressedEt(), itm->id().rawId());
0083 digi.setDEpair(dedata, deemul);
0084 return digi;
0085 }
0086
0087 template <>
0088 inline L1DataEmulDigi DEutils<HcalTrigPrimDigiCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0089 int cid = de_type();
0090 int errt = aflag;
0091 double x1 = (aflag != 4) ? itd->id().iphi() : itm->id().iphi();
0092 double x2 = (aflag != 4) ? itd->id().ieta() : itm->id().ieta();
0093 L1DataEmulDigi digi(dedefs::HTP, cid, x1, x2, 0, errt);
0094 unsigned int dw = (aflag == 4) ? 0 : itd->t0().raw();
0095 unsigned int ew = (aflag == 3) ? 0 : itm->t0().raw();
0096
0097
0098 unsigned int mask = 0x01ff;
0099 dw &= mask;
0100 ew &= mask;
0101 digi.setData(dw, ew);
0102 int de = (aflag == 4) ? 0 : itd->SOI_compressedEt();
0103 int ee = (aflag == 3) ? 0 : itm->SOI_compressedEt();
0104 digi.setRank((float)de, (float)ee);
0105 return digi;
0106 }
0107
0108 template <>
0109 inline L1DataEmulDigi DEutils<L1CaloEmCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0110 int cid = de_type();
0111 int errt = aflag;
0112 double x1, x2, x3(0.);
0113
0114 x1 = (aflag != 4) ? itd->regionId().iphi() : itm->regionId().iphi();
0115 x2 = (aflag != 4) ? itd->regionId().ieta() : itm->regionId().ieta();
0116 x3 = (aflag != 4) ? itd->regionId().rctCard() : itm->regionId().rctCard();
0117
0118 L1DataEmulDigi digi(dedefs::RCT, cid, x1, x2, x3, errt);
0119 unsigned int dw = itd->raw();
0120 unsigned int ew = itm->raw();
0121 dw &= 0x3ff;
0122 dw += (((itd->rctCrate()) & 0x1f) << 10);
0123 dw += (((itd->isolated() ? 1 : 0) & 0x1) << 15);
0124 dw += (((itd->index()) & 0x3) << 16);
0125 ew &= 0x3ff;
0126 ew += (((itm->rctCrate()) & 0x1f) << 10);
0127 ew += (((itm->isolated() ? 1 : 0) & 0x1) << 15);
0128 ew += (((itm->index()) & 0x3) << 16);
0129 dw = (aflag == 4) ? 0 : dw;
0130 ew = (aflag == 3) ? 0 : ew;
0131
0132
0133
0134 digi.setData(dw, ew);
0135 int de = (aflag == 4) ? 0 : itd->rank();
0136 int ee = (aflag == 3) ? 0 : itm->rank();
0137 digi.setRank((float)de, (float)ee);
0138 return digi;
0139 }
0140
0141 template <>
0142 inline L1DataEmulDigi DEutils<L1CaloRegionCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0143 int cid = de_type();
0144 int errt = aflag;
0145 double x1, x2, x3(0.);
0146 x1 = (aflag != 4) ? itd->id().iphi() : itm->id().iphi();
0147 x2 = (aflag != 4) ? itd->id().ieta() : itm->id().ieta();
0148 x3 = (aflag != 4) ? itd->id().rctCard() : itm->id().rctCard();
0149 L1DataEmulDigi digi(dedefs::RCT, cid, x1, x2, x3, errt);
0150 unsigned int dw = itd->raw();
0151 unsigned int ew = itm->raw();
0152 unsigned int mask = 0x3fff;
0153
0154 mask = 0x0fff;
0155 dw &= mask;
0156 dw += (((itd->id().ieta()) & 0x1f) << 14);
0157 dw += (((itd->id().iphi()) & 0x1f) << 19);
0158 ew &= mask;
0159 ew += (((itm->id().ieta()) & 0x1f) << 14);
0160 ew += (((itm->id().iphi()) & 0x1f) << 19);
0161 dw = (aflag == 4) ? 0 : dw;
0162 ew = (aflag == 3) ? 0 : ew;
0163
0164 digi.setData(dw, ew);
0165 int de = (aflag == 4) ? 0 : itd->et();
0166 int ee = (aflag == 3) ? 0 : itm->et();
0167 digi.setRank((float)de, (float)ee);
0168 return digi;
0169 }
0170
0171 template <>
0172 inline L1DataEmulDigi DEutils<L1GctEmCandCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0173 int cid = de_type();
0174 int errt = aflag;
0175
0176
0177 double x1 = (aflag != 4) ? itd->regionId().iphi() : itm->regionId().iphi();
0178 double x2 = (aflag != 4) ? itd->regionId().ieta() : itm->regionId().ieta();
0179 L1DataEmulDigi digi(dedefs::GCT, cid, x1, x2, 0., errt);
0180 unsigned int dw = (aflag == 4) ? 0 : itd->raw();
0181 unsigned int ew = (aflag == 3) ? 0 : itm->raw();
0182 dw &= 0x7fff;
0183 ew &= 0x7fff;
0184 digi.setData(dw, ew);
0185 int de = (aflag == 4) ? 0 : itd->rank();
0186 int ee = (aflag == 3) ? 0 : itm->rank();
0187 digi.setRank((float)de, (float)ee);
0188 return digi;
0189 }
0190
0191 template <>
0192 inline L1DataEmulDigi DEutils<L1GctJetCandCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0193 int cid = de_type();
0194 int errt = aflag;
0195
0196
0197 double x1 = (aflag != 4) ? itd->phiIndex() : itm->phiIndex();
0198 unsigned deta(0), eeta(0);
0199 if (!itd->isForward())
0200 deta = (itd->etaSign() == 1 ? 10 - (itd->etaIndex() & 0x7) : (itd->etaIndex() & 0x7) + 11);
0201 else
0202 deta = (itd->etaSign() == 1 ? 3 - (itd->etaIndex() & 0x7) : (itd->etaIndex() & 0x7) + 18);
0203 if (!itm->isForward())
0204 eeta = (itm->etaSign() == 1 ? 10 - (itm->etaIndex() & 0x7) : (itm->etaIndex() & 0x7) + 11);
0205 else
0206 eeta = (itm->etaSign() == 1 ? 3 - (itm->etaIndex() & 0x7) : (itm->etaIndex() & 0x7) + 18);
0207 double x2 = (aflag != 4) ? deta : eeta;
0208 L1DataEmulDigi digi(dedefs::GCT, cid, x1, x2, 0., errt);
0209 unsigned int dw = (aflag == 4) ? 0 : itd->raw();
0210 unsigned int ew = (aflag == 3) ? 0 : itm->raw();
0211 dw &= 0x7fff;
0212 ew &= 0x7fff;
0213 digi.setData(dw, ew);
0214 int de = (aflag == 4) ? 0 : itd->rank();
0215 int ee = (aflag == 3) ? 0 : itm->rank();
0216 digi.setRank((float)de, (float)ee);
0217 return digi;
0218 }
0219
0220 template <>
0221 inline L1DataEmulDigi DEutils<L1GctEtHadCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0222 int cid = de_type();
0223 int errt = aflag;
0224 double x1 = 0;
0225 double x2 = 0;
0226 L1DataEmulDigi digi(dedefs::GCT, cid, x1, x2, 0., errt);
0227 unsigned int dw = (aflag == 4) ? 0 : itd->raw();
0228 unsigned int ew = (aflag == 3) ? 0 : itm->raw();
0229 dw &= 0x1fff;
0230 ew &= 0x1fff;
0231 digi.setData(dw, ew);
0232 int de = (aflag == 4) ? 0 : itd->et();
0233 int ee = (aflag == 3) ? 0 : itm->et();
0234 digi.setRank((float)de, (float)ee);
0235 return digi;
0236 }
0237 template <>
0238 inline L1DataEmulDigi DEutils<L1GctEtMissCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0239 int cid = de_type();
0240 int errt = aflag;
0241 double x1 = (aflag != 4) ? itd->phi() : itm->phi();
0242 double x2 = 0;
0243 L1DataEmulDigi digi(dedefs::GCT, cid, x1, x2, 0., errt);
0244 unsigned int dw = (aflag == 4) ? 0 : itd->raw();
0245 unsigned int ew = (aflag == 3) ? 0 : itm->raw();
0246 dw &= 0x8f1fff;
0247 ew &= 0x8f1fff;
0248 digi.setData(dw, ew);
0249 int de = (aflag == 4) ? 0 : itd->et();
0250 int ee = (aflag == 3) ? 0 : itm->et();
0251 digi.setRank((float)de, (float)ee);
0252 return digi;
0253 }
0254
0255 template <>
0256 inline L1DataEmulDigi DEutils<L1GctEtTotalCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0257 int cid = de_type();
0258 int errt = aflag;
0259 double x1 = 0;
0260 double x2 = 0;
0261 L1DataEmulDigi digi(dedefs::GCT, cid, x1, x2, 0., errt);
0262 unsigned int dw = (aflag == 4) ? 0 : itd->raw();
0263 unsigned int ew = (aflag == 3) ? 0 : itm->raw();
0264 dw &= 0x1fff;
0265 ew &= 0x1fff;
0266 digi.setData(dw, ew);
0267 int de = (aflag == 4) ? 0 : itd->et();
0268 int ee = (aflag == 3) ? 0 : itm->et();
0269 digi.setRank((float)de, (float)ee);
0270 return digi;
0271 }
0272 template <>
0273 inline L1DataEmulDigi DEutils<L1GctHFBitCountsCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0274 int cid = de_type();
0275 int errt = aflag;
0276 double x1 = 0;
0277 double x2 = 0;
0278 L1DataEmulDigi digi(dedefs::GCT, cid, x1, x2, 0., errt);
0279 unsigned int dw = (aflag == 4) ? 0 : itd->raw();
0280 unsigned int ew = (aflag == 3) ? 0 : itm->raw();
0281 digi.setData(dw, ew);
0282 int de = 0;
0283 int ee = 0;
0284 digi.setRank((float)de, (float)ee);
0285 return digi;
0286 }
0287 template <>
0288 inline L1DataEmulDigi DEutils<L1GctHFRingEtSumsCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0289 int cid = de_type();
0290 int errt = aflag;
0291 double x1 = 0;
0292 double x2 = 0;
0293 L1DataEmulDigi digi(dedefs::GCT, cid, x1, x2, 0., errt);
0294 unsigned int dw = (aflag == 4) ? 0 : itd->raw();
0295 unsigned int ew = (aflag == 3) ? 0 : itm->raw();
0296 digi.setData(dw, ew);
0297 int de = 0;
0298 int ee = 0;
0299 digi.setRank((float)de, (float)ee);
0300 return digi;
0301 }
0302 template <>
0303 inline L1DataEmulDigi DEutils<L1GctHtMissCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0304 int cid = de_type();
0305 int errt = aflag;
0306 double x1 = (aflag != 4) ? itd->phi() : itm->phi();
0307 double x2 = 0;
0308 L1DataEmulDigi digi(dedefs::GCT, cid, x1, x2, 0., errt);
0309 unsigned int dw = (aflag == 4) ? 0 : itd->raw();
0310 unsigned int ew = (aflag == 3) ? 0 : itm->raw();
0311 dw &= 0x8f1fff;
0312 ew &= 0x8f1fff;
0313 digi.setData(dw, ew);
0314 int de = (aflag == 4) ? 0 : itd->et();
0315 int ee = (aflag == 3) ? 0 : itm->et();
0316 digi.setRank((float)de, (float)ee);
0317 return digi;
0318 }
0319
0320 template <>
0321 inline L1DataEmulDigi DEutils<L1GctJetCountsCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0322 int cid = de_type();
0323 int errt = aflag;
0324 double x1 = 0;
0325 double x2 = 0;
0326 L1DataEmulDigi digi(dedefs::GCT, cid, x1, x2, 0., errt);
0327 unsigned int dw = (aflag == 4) ? 0 : itd->raw0();
0328 unsigned int ew = (aflag == 3) ? 0 : itm->raw0();
0329 digi.setData(dw, ew);
0330 int de = 0;
0331 int ee = 0;
0332 digi.setRank((float)de, (float)ee);
0333 return digi;
0334 }
0335
0336 template <>
0337 inline L1DataEmulDigi DEutils<L1MuRegionalCandCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0338 int sid;
0339 switch (itd->type_idx()) {
0340 case 0:
0341 sid = dedefs::DTF;
0342 break;
0343 case 1:
0344 sid = dedefs::RPC;
0345 break;
0346 case 2:
0347 sid = dedefs::CTF;
0348 break;
0349 case 3:
0350 sid = dedefs::RPC;
0351 break;
0352 default:
0353 sid = -1;
0354 }
0355 int cid = de_type();
0356 int errt = aflag;
0357
0358
0359 double x1 = (aflag != 4) ? itd->phi_packed() : itm->phi_packed();
0360 double x2 = (aflag != 4) ? itd->eta_packed() : itm->eta_packed();
0361 L1DataEmulDigi digi(sid, cid, x1, x2, 0, errt);
0362 unsigned int dw = (aflag == 4) ? 0 : itd->getDataWord();
0363 unsigned int ew = (aflag == 3) ? 0 : itm->getDataWord();
0364 unsigned int mask = 0xffffffff;
0365
0366
0367 if (sid == dedefs::RPC)
0368 mask &= 0xc1ffffff;
0369 dw &= mask;
0370 ew &= mask;
0371 digi.setData(dw, ew);
0372 int de = (aflag == 4) ? 0 : itd->pt_packed();
0373 int ee = (aflag == 3) ? 0 : itm->pt_packed();
0374 digi.setRank((float)de, (float)ee);
0375
0376
0377 if (false)
0378 std::cout << "L1DataEmulDigi DEutils<L1MuRegionalCandCollection>] dedigi info"
0379
0380
0381 << " phipackd:" << itd->phi_packed() << "," << itm->phi_packed() << " etapackd:" << itd->eta_packed()
0382 << "," << itm->eta_packed() << std::endl;
0383 return digi;
0384 }
0385
0386 template <>
0387 inline L1DataEmulDigi DEutils<L1MuGMTCandCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0388 int cid = de_type();
0389 int errt = aflag;
0390
0391
0392 double x1 = (aflag != 4) ? itd->phiIndex() : itm->phiIndex();
0393 double x2 = (aflag != 4) ? itd->etaIndex() : itm->etaIndex();
0394 L1DataEmulDigi digi(dedefs::GMT, cid, x1, x2, 0, errt);
0395 unsigned int dw = (aflag == 4) ? 0 : itd->getDataWord();
0396 unsigned int ew = (aflag == 3) ? 0 : itm->getDataWord();
0397 unsigned int mask = 0x3ffffff;
0398
0399 mask &= (~(0x0c00000));
0400 dw &= mask;
0401 ew &= mask;
0402 digi.setData(dw, ew);
0403 int de = (aflag == 4) ? 0 : itd->ptIndex();
0404 int ee = (aflag == 3) ? 0 : itm->ptIndex();
0405 digi.setRank((float)de, (float)ee);
0406 if (false)
0407 std::cout << "l1dataemuldigi l1mugmtcandcoll type:"
0408 << cid
0409
0410
0411 << std::hex << " word d:" << dw << "e:" << ew << std::dec << std::endl;
0412 return digi;
0413 }
0414
0415 template <>
0416 inline L1DataEmulDigi DEutils<L1MuDTChambPhDigiCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0417 int cid = de_type();
0418 int errt = aflag;
0419 double x1 = (aflag != 4) ? itd->scNum() : itm->scNum();
0420 double x2 = (aflag != 4) ? itd->whNum() : itm->whNum();
0421 double x3 = (aflag != 4) ? itd->stNum() : itm->stNum();
0422 L1DataEmulDigi digi(dedefs::DTP, cid, x1, x2, x3, errt);
0423
0424
0425 int dr = (aflag == 4) ? 0 : itd->code();
0426 int er = (aflag == 3) ? 0 : itm->code();
0427 digi.setRank((float)dr, (float)er);
0428 return digi;
0429 }
0430
0431 template <>
0432 inline L1DataEmulDigi DEutils<L1MuDTChambThDigiCollection>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0433 int cid = de_type();
0434 int errt = aflag;
0435 double x1 = (aflag != 4) ? itd->scNum() : itm->scNum();
0436 double x2 = (aflag != 4) ? itd->whNum() : itm->whNum();
0437 double x3 = (aflag != 4) ? itd->stNum() : itm->stNum();
0438 L1DataEmulDigi digi(dedefs::DTP, cid, x1, x2, x3, errt);
0439
0440 int dr(0), er(0);
0441 for (int i = 0; i < 7; i++) {
0442 if (itd->code(i) >= dr)
0443 dr = itd->quality(i);
0444 if (itm->code(i) >= er)
0445 er = itm->quality(i);
0446 }
0447
0448 dr = (aflag == 4) ? 0 : dr;
0449 er = (aflag == 3) ? 0 : er;
0450 digi.setRank((float)dr, (float)er);
0451 return digi;
0452 }
0453
0454 template <>
0455 inline L1DataEmulDigi DEutils<CSCCorrelatedLCTDigiCollection_>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0456 int cid = de_type();
0457 int errt = aflag;
0458 double x1 = (aflag != 4) ? itd->getStrip() : itm->getStrip();
0459 double x2 = (aflag != 4) ? itd->getKeyWG() : itm->getKeyWG();
0460 double x3 = (aflag != 4) ? itd->getTrknmb() : itm->getTrknmb();
0461
0462 L1DataEmulDigi digi(-1, cid, x1, x2, x3, errt);
0463 int dq = (aflag == 4) ? 0 : itd->getQuality();
0464 int eq = (aflag == 3) ? 0 : itm->getQuality();
0465 digi.setRank((float)dq, (float)eq);
0466
0467 static const int kValidBitWidth = 1;
0468 static const int kQualityBitWidth = 4;
0469 static const int kPatternBitWidth = 4;
0470 static const int kWireGroupBitWidth = 7;
0471 static const int kHalfstripBitWidth = 8;
0472 static const int kBendBitWidth = 1;
0473 static const int kBxBitWidth = 1;
0474
0475 static const int kMPCLinkBitWidth = 2;
0476 static const int kCSCIdBitWidth = 4;
0477
0478 unsigned shift = 0, dw = 0, ew = 0;
0479 dw = itd->isValid() & ((1 << kValidBitWidth) - 1);
0480 dw += (itd->getQuality() & ((1 << kQualityBitWidth) - 1)) << (shift += kValidBitWidth);
0481 dw += (itd->getPattern() & ((1 << kPatternBitWidth) - 1)) << (shift += kQualityBitWidth);
0482 dw += (itd->getKeyWG() & ((1 << kWireGroupBitWidth) - 1)) << (shift += kPatternBitWidth);
0483 dw += (itd->getStrip() & ((1 << kHalfstripBitWidth) - 1)) << (shift += kWireGroupBitWidth);
0484 dw += (itd->getBend() & ((1 << kBendBitWidth) - 1)) << (shift += kHalfstripBitWidth);
0485 dw += (itd->getBX() & ((1 << kBxBitWidth) - 1)) << (shift += kBendBitWidth);
0486 dw += (itd->getMPCLink() & ((1 << kMPCLinkBitWidth) - 1)) << (shift += kBxBitWidth);
0487 dw += (itd->getCSCID() & ((1 << kCSCIdBitWidth) - 1)) << (shift + kMPCLinkBitWidth);
0488 shift = 0;
0489 ew = itm->isValid() & ((1 << kValidBitWidth) - 1);
0490 ew += (itm->getQuality() & ((1 << kQualityBitWidth) - 1)) << (shift += kValidBitWidth);
0491 ew += (itm->getPattern() & ((1 << kPatternBitWidth) - 1)) << (shift += kQualityBitWidth);
0492 ew += (itm->getKeyWG() & ((1 << kWireGroupBitWidth) - 1)) << (shift += kPatternBitWidth);
0493 ew += (itm->getStrip() & ((1 << kHalfstripBitWidth) - 1)) << (shift += kWireGroupBitWidth);
0494 ew += (itm->getBend() & ((1 << kBendBitWidth) - 1)) << (shift += kHalfstripBitWidth);
0495 ew += (itm->getBX() & ((1 << kBxBitWidth) - 1)) << (shift += kBendBitWidth);
0496 ew += (itm->getMPCLink() & ((1 << kMPCLinkBitWidth) - 1)) << (shift += kBxBitWidth);
0497 ew += (itm->getCSCID() & ((1 << kCSCIdBitWidth) - 1)) << (shift + kMPCLinkBitWidth);
0498 digi.setData(dw, ew);
0499 return digi;
0500 }
0501
0502 template <>
0503 inline L1DataEmulDigi DEutils<CSCALCTDigiCollection_>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0504 int cid = de_type();
0505 int errt = aflag;
0506 double x2 = (aflag != 4) ? itd->getKeyWG() : itm->getKeyWG();
0507 double x3 = (aflag != 4) ? itd->getTrknmb() : itm->getTrknmb();
0508 L1DataEmulDigi digi(dedefs::CTP, cid, 0, x2, x3, errt);
0509 int dq = (aflag == 4) ? 0 : itd->getQuality();
0510 int eq = (aflag == 3) ? 0 : itm->getQuality();
0511 digi.setRank((float)dq, (float)eq);
0512
0513 static const int kValidBitWidth = 1;
0514 static const int kQualityBitWidth = 2;
0515 static const int kAccelBitWidth = 1;
0516 static const int kPatternBBitWidth = 1;
0517 static const int kWireGroupBitWidth = 7;
0518 static const int kBxBitWidth = 5;
0519
0520 unsigned shift = 0, dw = 0, ew = 0;
0521 dw = itd->isValid() & ((1 << kValidBitWidth) - 1);
0522 dw += (itd->getQuality() & ((1 << kQualityBitWidth) - 1)) << (shift += kValidBitWidth);
0523 dw += (itd->getAccelerator() & ((1 << kAccelBitWidth) - 1)) << (shift += kQualityBitWidth);
0524 dw += (itd->getCollisionB() & ((1 << kPatternBBitWidth) - 1)) << (shift += kAccelBitWidth);
0525 dw += (itd->getKeyWG() & ((1 << kWireGroupBitWidth) - 1)) << (shift += kPatternBBitWidth);
0526 dw += (itd->getBX() & ((1 << kBxBitWidth) - 1)) << (shift + kWireGroupBitWidth);
0527 shift = 0;
0528 ew = itm->isValid() & ((1 << kValidBitWidth) - 1);
0529 ew += (itm->getQuality() & ((1 << kQualityBitWidth) - 1)) << (shift += kValidBitWidth);
0530 ew += (itm->getAccelerator() & ((1 << kAccelBitWidth) - 1)) << (shift += kQualityBitWidth);
0531 ew += (itm->getCollisionB() & ((1 << kPatternBBitWidth) - 1)) << (shift += kAccelBitWidth);
0532 ew += (itm->getKeyWG() & ((1 << kWireGroupBitWidth) - 1)) << (shift += kPatternBBitWidth);
0533 ew += (itm->getBX() & ((1 << kBxBitWidth) - 1)) << (shift + kWireGroupBitWidth);
0534 digi.setData(dw, ew);
0535 return digi;
0536 }
0537 template <>
0538 inline L1DataEmulDigi DEutils<CSCCLCTDigiCollection_>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0539 int cid = de_type();
0540 int errt = aflag;
0541 double x1 = (aflag != 4) ? itd->getKeyStrip() : itm->getKeyStrip();
0542 double x3 = (aflag != 4) ? itd->getTrknmb() : itm->getTrknmb();
0543 L1DataEmulDigi digi(dedefs::CTP, cid, x1, 0, x3, errt);
0544 int dq = (aflag == 4) ? 0 : itd->getQuality();
0545 int eq = (aflag == 3) ? 0 : itm->getQuality();
0546 digi.setRank((float)dq, (float)eq);
0547
0548 static const int kValidBitWidth = 1;
0549 static const int kQualityBitWidth = 3;
0550 static const int kPatternBitWidth = 4;
0551 static const int kBendBitWidth = 1;
0552 static const int kHalfstripBitWidth = 5;
0553 static const int kCFEBBitWidth = 3;
0554 static const int kBxBitWidth = 2;
0555
0556 unsigned shift = 0, dw = 0, ew = 0;
0557 dw = itd->isValid() & ((1 << kValidBitWidth) - 1);
0558 dw += (itd->getQuality() & ((1 << kQualityBitWidth) - 1)) << (shift += kValidBitWidth);
0559 dw += (itd->getPattern() & ((1 << kPatternBitWidth) - 1)) << (shift += kQualityBitWidth);
0560 dw += (itd->getBend() & ((1 << kBendBitWidth) - 1)) << (shift += kPatternBitWidth);
0561 dw += (itd->getStrip() & ((1 << kHalfstripBitWidth) - 1)) << (shift += kBendBitWidth);
0562 dw += (itd->getCFEB() & ((1 << kCFEBBitWidth) - 1)) << (shift += kHalfstripBitWidth);
0563 dw += (itd->getBX() & ((1 << kBxBitWidth) - 1)) << (shift + kCFEBBitWidth);
0564 shift = 0;
0565 ew = itm->isValid() & ((1 << kValidBitWidth) - 1);
0566 ew += (itm->getQuality() & ((1 << kQualityBitWidth) - 1)) << (shift += kValidBitWidth);
0567 ew += (itm->getPattern() & ((1 << kPatternBitWidth) - 1)) << (shift += kQualityBitWidth);
0568 ew += (itm->getBend() & ((1 << kBendBitWidth) - 1)) << (shift += kPatternBitWidth);
0569 ew += (itm->getStrip() & ((1 << kHalfstripBitWidth) - 1)) << (shift += kBendBitWidth);
0570 ew += (itm->getCFEB() & ((1 << kCFEBBitWidth) - 1)) << (shift += kHalfstripBitWidth);
0571 ew += (itm->getBX() & ((1 << kBxBitWidth) - 1)) << (shift + kCFEBBitWidth);
0572 digi.setData(dw, ew);
0573 return digi;
0574 }
0575
0576 template <>
0577 inline L1DataEmulDigi DEutils<L1CSCSPStatusDigiCollection_>::DEDigi(col_cit itd, col_cit itm, int aflag) {
0578 int cid = de_type();
0579 int errt = aflag;
0580 double x1;
0581 x1 = (aflag != 4) ? itd->slot() : itm->slot();
0582
0583
0584
0585
0586 L1DataEmulDigi digi(dedefs::CTF, cid, x1, 0, 0, errt);
0587
0588 return digi;
0589 }
0590
0591
0592
0593 template <typename T>
0594 typename DEutils<T>::col_it DEutils<T>::de_find(col_it first, col_it last, const cand_type& value) {
0595 for (; first != last; first++)
0596 if (de_equal(*first, value))
0597 break;
0598 return first;
0599 }
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612 template <typename T>
0613 bool DEutils<T>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0614
0615 return true;
0616 }
0617 template <typename T>
0618 bool DEutils<T>::de_nequal(const cand_type& lhs, const cand_type& rhs) {
0619 return !de_equal(lhs, rhs);
0620 }
0621
0622 template <>
0623 inline bool DEutils<EcalTrigPrimDigiCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0624 bool val = true;
0625 unsigned int mask = 0x0fff;
0626 mask &= 0x0eff;
0627 val &= ((lhs[lhs.sampleOfInterest()].raw() & mask) == (rhs[rhs.sampleOfInterest()].raw() & mask));
0628 val &= (lhs.id().rawId() == rhs.id().rawId());
0629 return val;
0630 }
0631
0632 template <>
0633 inline bool DEutils<HcalTrigPrimDigiCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0634 bool val = true;
0635 unsigned int mask = 0x01ff;
0636 val &= ((lhs.t0().raw() & mask) == (rhs.t0().raw() & mask));
0637 val &= (lhs.id().rawId() == rhs.id().rawId());
0638 return val;
0639 }
0640
0641 template <>
0642 inline bool DEutils<L1CaloEmCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0643 bool val = true;
0644 val &= (lhs.raw() == rhs.raw());
0645 val &= (lhs.rctCrate() == rhs.rctCrate());
0646 val &= (lhs.isolated() == rhs.isolated());
0647 val &= (lhs.index() == rhs.index());
0648
0649 return val;
0650 }
0651
0652 template <>
0653 inline bool DEutils<L1CaloRegionCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0654 bool val = true;
0655 val &= (lhs.et() == rhs.et());
0656 val &= (lhs.rctCrate() == rhs.rctCrate());
0657 val &= (lhs.rctRegionIndex() == rhs.rctRegionIndex());
0658 val &= (lhs.id().isHf() == rhs.id().isHf());
0659 if (!lhs.id().isHf()) {
0660 val &= (lhs.overFlow() == rhs.overFlow());
0661 val &= (lhs.tauVeto() == rhs.tauVeto());
0662
0663
0664
0665 val &= (lhs.rctCard() == rhs.rctCard());
0666 } else {
0667 val &= (lhs.fineGrain() == rhs.fineGrain());
0668 }
0669 return val;
0670 }
0671
0672 template <>
0673 inline bool DEutils<L1GctEmCandCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0674 return lhs == rhs;
0675 }
0676
0677 template <>
0678 inline bool DEutils<L1GctJetCandCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0679 return lhs == rhs;
0680 }
0681
0682 template <>
0683 inline bool DEutils<L1GctEtHadCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0684 return lhs == rhs;
0685 }
0686 template <>
0687 inline bool DEutils<L1GctEtMissCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0688 return lhs == rhs;
0689 }
0690 template <>
0691 inline bool DEutils<L1GctEtTotalCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0692 return lhs == rhs;
0693 }
0694 template <>
0695 inline bool DEutils<L1GctHtMissCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0696 return lhs == rhs;
0697 }
0698 template <>
0699 inline bool DEutils<L1GctHFRingEtSumsCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0700 return lhs == rhs;
0701 }
0702 template <>
0703 inline bool DEutils<L1GctHFBitCountsCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0704 return lhs == rhs;
0705 }
0706 template <>
0707 inline bool DEutils<L1GctJetCountsCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0708 return lhs == rhs;
0709 }
0710
0711 template <>
0712 inline bool DEutils<L1MuDTChambPhDigiCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0713 bool val = true;
0714 val &= (lhs.whNum() == rhs.whNum());
0715 val &= (lhs.scNum() == rhs.scNum());
0716 val &= (lhs.stNum() == rhs.stNum());
0717
0718
0719 val &= (lhs.code() == rhs.code());
0720 val &= (lhs.Ts2Tag() == rhs.Ts2Tag());
0721
0722
0723 return val;
0724 }
0725
0726 template <>
0727 inline bool DEutils<L1MuDTChambThDigiCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0728 bool val = true;
0729 val &= (lhs.whNum() == rhs.whNum());
0730 val &= (lhs.scNum() == rhs.scNum());
0731 val &= (lhs.stNum() == rhs.stNum());
0732
0733
0734
0735
0736
0737
0738 return val;
0739 }
0740
0741 template <>
0742 inline bool DEutils<L1MuRegionalCandCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0743 bool val = true;
0744 val &= (lhs.type_idx() == rhs.type_idx());
0745 val &= (lhs.bx() == rhs.bx());
0746 if (!val)
0747 return val;
0748 unsigned int dw = lhs.getDataWord();
0749 unsigned int ew = rhs.getDataWord();
0750 unsigned int mask = 0xffffffff;
0751
0752
0753
0754 if (rhs.type_idx() == 1 || rhs.type_idx() == 3)
0755 mask &= 0xc1ffffff;
0756 dw &= mask;
0757 ew &= mask;
0758 val &= (dw == ew);
0759
0760
0761 return val;
0762 }
0763
0764 template <>
0765 inline bool DEutils<L1MuGMTCandCollection>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0766
0767
0768 bool val = true;
0769 unsigned int dw = rhs.getDataWord();
0770 unsigned int ew = lhs.getDataWord();
0771 unsigned int mask = 0x3ffffff;
0772
0773 mask &= (~(0x0c00000));
0774 dw &= mask;
0775 ew &= mask;
0776 val &= (dw == ew);
0777 return val;
0778 }
0779
0780 template <>
0781 inline bool DEutils<CSCCorrelatedLCTDigiCollection_>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0782
0783
0784
0785 bool val = true;
0786 val &= (lhs.isValid() == rhs.isValid());
0787 val &= (lhs.getQuality() == rhs.getQuality());
0788 val &= (lhs.getKeyWG() == rhs.getKeyWG());
0789 val &= (lhs.getStrip() == rhs.getStrip());
0790 val &= (lhs.getPattern() == rhs.getPattern());
0791 val &= (lhs.getBend() == rhs.getBend());
0792 val &= (lhs.getBX() == rhs.getBX());
0793 val &= (lhs.getMPCLink() == rhs.getMPCLink());
0794 val &= (lhs.getCSCID() == rhs.getCSCID());
0795 return val;
0796
0797 }
0798 template <>
0799 inline bool DEutils<CSCALCTDigiCollection_>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0800 return lhs == rhs;
0801 }
0802 template <>
0803 inline bool DEutils<CSCCLCTDigiCollection_>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0804 return lhs == rhs;
0805 }
0806 template <>
0807 inline bool DEutils<L1CSCSPStatusDigiCollection_>::de_equal(const cand_type& lhs, const cand_type& rhs) {
0808 bool val = true;
0809 val &= (lhs.slot() == rhs.slot());
0810 val &= (lhs.BXN() == rhs.BXN());
0811 val &= (lhs.FMM() == rhs.FMM());
0812 val &= (lhs.SEs() == rhs.SEs());
0813 val &= (lhs.SMs() == rhs.SMs());
0814 val &= (lhs.BXs() == rhs.BXs());
0815 val &= (lhs.AFs() == rhs.AFs());
0816 val &= (lhs.VPs() == rhs.VPs());
0817 return val;
0818 }
0819
0820
0821
0822 template <typename T>
0823 bool DEutils<T>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0824
0825 return true;
0826 }
0827 template <typename T>
0828 bool DEutils<T>::de_nequal_loc(const cand_type& lhs, const cand_type& rhs) {
0829 return !de_equal_loc(lhs, rhs);
0830 }
0831
0832 template <>
0833 inline bool DEutils<EcalTrigPrimDigiCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0834 bool val = true;
0835 val &= (lhs.id().zside() == rhs.id().zside());
0836 val &= (lhs.id().ietaAbs() == rhs.id().ietaAbs());
0837 val &= (lhs.id().iphi() == rhs.id().iphi());
0838 return val;
0839 }
0840
0841 template <>
0842 inline bool DEutils<HcalTrigPrimDigiCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0843 bool val = true;
0844 val &= (lhs.id().zside() == rhs.id().zside());
0845 val &= (lhs.id().ietaAbs() == rhs.id().ietaAbs());
0846 val &= (lhs.id().iphi() == rhs.id().iphi());
0847 return val;
0848 }
0849
0850 template <>
0851 inline bool DEutils<L1CaloEmCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0852 bool val = true;
0853 val &= (lhs.rctCrate() == rhs.rctCrate());
0854 val &= (lhs.rctCard() == rhs.rctCard());
0855 val &= (lhs.rctRegion() == rhs.rctRegion());
0856 return val;
0857 }
0858
0859 template <>
0860 inline bool DEutils<L1CaloRegionCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0861 bool val = true;
0862 val &= (lhs.rctCrate() == rhs.rctCrate());
0863 val &= (lhs.id().isHf() == rhs.id().isHf());
0864 if (!lhs.id().isHf())
0865 val &= (lhs.rctCard() == rhs.rctCard());
0866 val &= (lhs.rctRegionIndex() == rhs.rctRegionIndex());
0867 return val;
0868 }
0869
0870 template <>
0871 inline bool DEutils<L1GctEmCandCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0872 bool val = true;
0873 val &= (lhs.etaIndex() == rhs.etaIndex());
0874 val &= (lhs.phiIndex() == rhs.phiIndex());
0875 return val;
0876 }
0877 template <>
0878 inline bool DEutils<L1GctJetCandCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0879 bool val = true;
0880 val &= (lhs.etaIndex() == rhs.etaIndex());
0881 val &= (lhs.phiIndex() == rhs.phiIndex());
0882 return val;
0883 }
0884
0885 template <>
0886 inline bool DEutils<L1GctEtHadCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0887 return true;
0888 }
0889 template <>
0890 inline bool DEutils<L1GctEtMissCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0891 bool val = true;
0892 val &= (lhs.phi() == rhs.phi());
0893 return val;
0894 }
0895 template <>
0896 inline bool DEutils<L1GctEtTotalCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0897 return true;
0898 }
0899 template <>
0900 inline bool DEutils<L1GctHtMissCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0901 bool val = true;
0902 val &= (lhs.phi() == rhs.phi());
0903 return val;
0904 }
0905 template <>
0906 inline bool DEutils<L1GctHFRingEtSumsCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0907 return true;
0908 }
0909 template <>
0910 inline bool DEutils<L1GctHFBitCountsCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0911 return true;
0912 }
0913 template <>
0914 inline bool DEutils<L1GctJetCountsCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0915 return true;
0916 }
0917
0918 template <>
0919 inline bool DEutils<L1MuRegionalCandCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0920 bool val = true;
0921 val &= (lhs.phi_packed() == rhs.phi_packed());
0922 val &= (lhs.eta_packed() == rhs.eta_packed());
0923
0924
0925 return val;
0926 }
0927
0928 template <>
0929 inline bool DEutils<L1MuGMTCandCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0930 bool val = true;
0931 val &= (lhs.phiIndex() == rhs.phiIndex());
0932 val &= (lhs.etaIndex() == rhs.etaIndex());
0933 return val;
0934 }
0935
0936 template <>
0937 inline bool DEutils<L1MuDTChambPhDigiCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0938 bool val = true;
0939 val &= (lhs.whNum() == rhs.whNum());
0940 val &= (lhs.scNum() == rhs.scNum());
0941 val &= (lhs.stNum() == rhs.stNum());
0942
0943
0944
0945 return val;
0946 }
0947
0948 template <>
0949 inline bool DEutils<L1MuDTChambThDigiCollection>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0950 bool val = true;
0951 val &= (lhs.whNum() == rhs.whNum());
0952 val &= (lhs.scNum() == rhs.scNum());
0953 val &= (lhs.stNum() == rhs.stNum());
0954
0955 return val;
0956 }
0957
0958 template <>
0959 inline bool DEutils<CSCCorrelatedLCTDigiCollection_>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0960 bool val = true;
0961 val &= (lhs.getCSCID() == rhs.getCSCID());
0962 val &= (lhs.getStrip() == rhs.getStrip());
0963 val &= (lhs.getKeyWG() == rhs.getKeyWG());
0964 return val;
0965 }
0966
0967 template <>
0968 inline bool DEutils<CSCALCTDigiCollection_>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0969 bool val = true;
0970 val &= (lhs.getTrknmb() == rhs.getTrknmb());
0971 val &= (lhs.getKeyWG() == rhs.getKeyWG());
0972 return val;
0973 }
0974 template <>
0975 inline bool DEutils<CSCCLCTDigiCollection_>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0976 bool val = true;
0977 val &= (lhs.getTrknmb() == rhs.getTrknmb());
0978 val &= (lhs.getKeyStrip() == rhs.getKeyStrip());
0979 return val;
0980 }
0981 template <>
0982 inline bool DEutils<L1CSCSPStatusDigiCollection_>::de_equal_loc(const cand_type& lhs, const cand_type& rhs) {
0983 bool val = true;
0984 val &= (lhs.slot() == rhs.slot());
0985 return val;
0986 }
0987
0988
0989
0990 template <typename T>
0991 bool DEutils<T>::is_empty(col_cit it) const {
0992
0993 return false;
0994 }
0995
0996 template <>
0997 inline bool DEutils<EcalTrigPrimDigiCollection>::is_empty(col_cit it) const {
0998 bool val = false;
0999 unsigned int raw = it->sample(it->sampleOfInterest()).raw();
1000 unsigned int mask = 0x0fff;
1001 mask = 0x0eff;
1002 raw &= mask;
1003 val |= (raw == 0);
1004 if (val)
1005 return val;
1006 unsigned int ttf = it->ttFlag();
1007 val |= ((ttf != 0x1) && (ttf != 0x3));
1008 return val;
1009
1010 }
1011
1012 template <>
1013 inline bool DEutils<HcalTrigPrimDigiCollection>::is_empty(col_cit it) const {
1014 unsigned int mask = 0x01ff;
1015 return (it->size() == 0 || ((it->t0().raw() & mask) == 0) || it->SOI_compressedEt() == 0);
1016 }
1017
1018 template <>
1019 inline bool DEutils<L1CaloEmCollection>::is_empty(col_cit it) const {
1020 return ((it->rank()) == 0);
1021
1022 }
1023
1024 template <>
1025 inline bool DEutils<L1CaloRegionCollection>::is_empty(col_cit it) const {
1026 return ((it->et()) == 0);
1027
1028 }
1029
1030 template <>
1031 inline bool DEutils<L1GctEmCandCollection>::is_empty(col_cit it) const {
1032 return (it->empty());
1033 }
1034
1035 template <>
1036 inline bool DEutils<L1GctJetCandCollection>::is_empty(col_cit it) const {
1037 return (it->empty());
1038 }
1039
1040 template <>
1041 inline bool DEutils<L1GctEtHadCollection>::is_empty(col_cit it) const {
1042 return (it->empty());
1043 }
1044 template <>
1045 inline bool DEutils<L1GctEtMissCollection>::is_empty(col_cit it) const {
1046 return (it->empty());
1047 }
1048 template <>
1049 inline bool DEutils<L1GctEtTotalCollection>::is_empty(col_cit it) const {
1050 return (it->empty());
1051 }
1052 template <>
1053 inline bool DEutils<L1GctHtMissCollection>::is_empty(col_cit it) const {
1054 return (it->empty());
1055 }
1056 template <>
1057 inline bool DEutils<L1GctHFRingEtSumsCollection>::is_empty(col_cit it) const {
1058 return (it->empty());
1059 }
1060 template <>
1061 inline bool DEutils<L1GctHFBitCountsCollection>::is_empty(col_cit it) const {
1062 return (it->empty());
1063 }
1064 template <>
1065 inline bool DEutils<L1GctJetCountsCollection>::is_empty(col_cit it) const {
1066 return (it->empty());
1067 }
1068
1069 template <>
1070 inline bool DEutils<L1MuDTChambPhDigiCollection>::is_empty(col_cit it) const {
1071 return (it->bxNum() != 0 || it->code() == 7);
1072
1073
1074 }
1075 template <>
1076 inline bool DEutils<L1MuDTChambThDigiCollection>::is_empty(col_cit it) const {
1077 return (it->whNum() == 0 && it->scNum() == 0 && it->stNum() == 0);
1078
1079 }
1080
1081 template <>
1082 inline bool DEutils<L1MuRegionalCandCollection>::is_empty(col_cit it) const {
1083
1084
1085
1086 if (it->type_idx() == 1 || it->type_idx() == 3)
1087 if (it->bx() != 0)
1088 return true;
1089
1090 return (it->empty());
1091
1092
1093
1094 }
1095
1096 template <>
1097 inline bool DEutils<L1MuGMTCandCollection>::is_empty(col_cit it) const {
1098 return (it->empty());
1099
1100
1101 }
1102
1103 template <>
1104 inline bool DEutils<CSCCorrelatedLCTDigiCollection_>::is_empty(col_cit it) const {
1105 return !(it->isValid());
1106 }
1107 template <>
1108 inline bool DEutils<CSCALCTDigiCollection_>::is_empty(col_cit it) const {
1109 return !(it->isValid());
1110 }
1111 template <>
1112 inline bool DEutils<CSCCLCTDigiCollection_>::is_empty(col_cit it) const {
1113 return !(it->isValid());
1114 }
1115
1116 template <>
1117 inline bool DEutils<L1CSCSPStatusDigiCollection_>::is_empty(col_cit it) const {
1118 unsigned data = it->slot() | it->BXN() | it->FMM() | it->SEs() | it->SMs() | it->BXs() | it->AFs() | it->VPs();
1119 return data == 0;
1120 }
1121
1122
1123
1124 template <typename T>
1125 std::string DEutils<T>::print(col_cit it) const {
1126 std::stringstream ss;
1127 ss << "[DEutils<T>::print()] specialization still missing for collection!";
1128
1129 ss << std::endl;
1130 return ss.str();
1131 }
1132
1133 template <>
1134 inline std::string DEutils<EcalTrigPrimDigiCollection>::print(col_cit it) const {
1135 std::stringstream ss;
1136 ss << "0x" << std::setw(4) << std::setfill('0') << std::hex << it->sample(it->sampleOfInterest()).raw()
1137 << std::setfill(' ') << std::dec << ", et:" << std::setw(3) << it->compressedEt() << ", fg:" << std::setw(1)
1138 << it->fineGrain() << ", ttf:" << std::setw(2) << it->ttFlag()
1139 << ", sdet:" << ((it->id().subDet() == EcalBarrel) ? ("Barrel") : ("Endcap"))
1140 << ", iz:" << ((it->id().zside() > 0) ? ("+") : ("-")) << ", ieta:" << std::setw(2) << it->id().ietaAbs()
1141 << ", iphi:" << std::setw(2)
1142 << it->id().iphi()
1143
1144 << std::endl;
1145 return ss.str();
1146 }
1147
1148 template <>
1149 inline std::string DEutils<HcalTrigPrimDigiCollection>::print(col_cit it) const {
1150 std::stringstream ss;
1151 ss << "0x" << std::setw(4) << std::setfill('0') << std::hex << it->t0().raw() << std::setfill(' ') << std::dec
1152 << ", et:" << std::setw(3) << it->SOI_compressedEt() << ", fg:" << std::setw(1) << it->SOI_fineGrain()
1153 << ", sdet:" << it->id().subdet() << ", iz:" << ((it->id().zside() > 0) ? ("+") : ("-"))
1154 << ", ieta:" << std::setw(2) << it->id().ietaAbs() << ", iphi:" << std::setw(2) << it->id().iphi() << std::endl;
1155
1156 return ss.str();
1157 }
1158
1159 template <>
1160 inline std::string DEutils<L1CaloEmCollection>::print(col_cit it) const {
1161 std::stringstream ss;
1162 ss << "0x" << std::setw(4) << std::setfill('0') << std::hex << it->raw() << ", rank=0x" << std::setw(2) << std::hex
1163 << it->rank() << std::setfill(' ') << std::dec << ", region:" << std::setw(1) << it->rctRegion()
1164 << ", card:" << std::setw(1) << it->rctCard() << ", crate:" << std::setw(2) << it->rctCrate()
1165 << ", ieta:" << std::setw(2) << it->regionId().ieta()
1166 << ", iphi:" << std::setw(2)
1167 << it->regionId().iphi()
1168
1169
1170 << ", iso:" << std::setw(1) << it->isolated() << ", index:" << std::setw(1) << it->index() << ", bx:" << it->bx()
1171 << std::endl;
1172
1173 return ss.str();
1174 }
1175
1176 template <>
1177 inline std::string DEutils<L1CaloRegionCollection>::print(col_cit it) const {
1178 std::stringstream ss;
1179 ss << "L1CaloRegion:"
1180 << " et=" << it->et() << " o/f=" << it->overFlow() << " f/g=" << it->fineGrain() << " tau=" << it->tauVeto()
1181 << " rct(crate=" << it->rctCrate() << " card=" << it->rctCard() << " rgn=" << it->rctRegionIndex()
1182 << " eta=" << it->rctEta() << " phi=" << it->rctPhi() << ")\n\t\t"
1183 << "gct(eta=" << it->gctEta() << " phi=" << it->gctPhi() << ")" << std::hex << " cap_block=" << it->capBlock()
1184 << std::dec << " index=" << it->capIndex() << " bx=" << it->bx() << std::endl;
1185
1186
1187 return ss.str();
1188 }
1189
1190 template <>
1191 inline std::string DEutils<L1GctEmCandCollection>::print(col_cit it) const {
1192 std::stringstream ss;
1193
1194
1195 ss << "0x" << std::setw(4) << std::setfill('0') << std::hex << it->raw() << ", rank=0x" << std::setw(2) << std::hex
1196 << it->rank() << std::setfill(' ') << std::dec << ", etaSign:" << it->etaSign()
1197 << ", eta:" << (it->etaIndex() & 0x7)
1198 << ", phi:" << std::setw(2) << it->phiIndex()
1199 << " (ieta:" << std::setw(2) << it->regionId().ieta()
1200 << ",iphi:" << std::setw(2) << it->regionId().iphi() << ")"
1201 << ", iso:" << it->isolated() << ", cap block:" << std::setw(3) << it->capBlock() << ", index:" << it->capIndex()
1202 << ", bx:" << it->bx() << std::endl;
1203
1204 return ss.str();
1205 }
1206
1207
1208
1209
1210
1211
1212
1213
1214 template <>
1215 inline std::string DEutils<L1GctJetCandCollection>::print(col_cit it) const {
1216 std::stringstream ss;
1217 ss << "0x" << std::setw(4) << std::setfill('0') << std::hex << it->raw() << " " << *it << std::dec << std::endl;
1218 return ss.str();
1219 }
1220 template <>
1221 inline std::string DEutils<L1GctEtHadCollection>::print(col_cit it) const {
1222 std::stringstream ss;
1223 ss << *it;
1224 return ss.str();
1225 }
1226 template <>
1227 inline std::string DEutils<L1GctEtMissCollection>::print(col_cit it) const {
1228 std::stringstream ss;
1229 ss << *it;
1230 return ss.str();
1231 }
1232 template <>
1233 inline std::string DEutils<L1GctEtTotalCollection>::print(col_cit it) const {
1234 std::stringstream ss;
1235 ss << *it;
1236 return ss.str();
1237 }
1238 template <>
1239 inline std::string DEutils<L1GctHtMissCollection>::print(col_cit it) const {
1240 std::stringstream ss;
1241 ss << *it;
1242 return ss.str();
1243 }
1244 template <>
1245 inline std::string DEutils<L1GctHFRingEtSumsCollection>::print(col_cit it) const {
1246 std::stringstream ss;
1247 ss << *it;
1248 return ss.str();
1249 }
1250 template <>
1251 inline std::string DEutils<L1GctHFBitCountsCollection>::print(col_cit it) const {
1252 std::stringstream ss;
1253 ss << *it;
1254 return ss.str();
1255 }
1256 template <>
1257 inline std::string DEutils<L1GctJetCountsCollection>::print(col_cit it) const {
1258 std::stringstream ss;
1259 ss << *it;
1260 return ss.str();
1261 }
1262
1263 template <>
1264 inline std::string DEutils<L1MuDTChambPhDigiCollection>::print(col_cit it) const {
1265 std::stringstream ss;
1266 ss << ""
1267 << " bxNum:" << it->bxNum() << " whNum:" << it->whNum() << " scNum:" << it->scNum() << " stNum:" << it->stNum()
1268 << " phi:" << it->phi() << " phiB:" << it->phiB() << " code:" << it->code() << " Ts2Tag:" << it->Ts2Tag()
1269 << " BxCnt:" << it->BxCnt() << std::endl;
1270
1271 return ss.str();
1272 }
1273
1274 template <>
1275 inline std::string DEutils<L1MuDTChambThDigiCollection>::print(col_cit it) const {
1276 std::stringstream ss;
1277 ss << ""
1278 << " bxNum:" << it->bxNum() << " whNum:" << it->whNum() << " scNum:" << it->scNum() << " stNum:" << it->stNum()
1279 << std::endl;
1280
1281 return ss.str();
1282 }
1283
1284 template <>
1285 inline std::string DEutils<L1MuRegionalCandCollection>::print(col_cit it) const {
1286 std::stringstream ss;
1287
1288 ss << std::setiosflags(std::ios::showpoint | std::ios::fixed | std::ios::right | std::ios::adjustfield);
1289 ss << std::hex << std::setfill('0') << " 0x" << std::setw(8) << it->getDataWord();
1290
1291 ss << std::hex << std::setfill('0') << " pt:0x" << std::setw(2) << it->pt_packed() << " phi:0x" << std::setw(2)
1292 << it->phi_packed() << " eta:0x" << std::setw(2) << it->eta_packed();
1293
1294
1295
1296
1297
1298 ss << std::dec << std::setfill(' ') << " qua:" << std::setw(1) << it->quality() << " cha:" << std::setw(2)
1299 << it->chargeValue() << " chav:" << std::setw(1) << it->chargeValid() << " fh:" << std::setw(1) << it->isFineHalo()
1300 << " bx:" << std::setw(4) << it->bx() << " [id:" << std::setw(1) << it->type_idx()
1301 << "]"
1302 << std::endl;
1303
1304 return ss.str();
1305 }
1306
1307 template <>
1308 inline std::string DEutils<L1MuGMTCandCollection>::print(col_cit it) const {
1309 std::stringstream ss;
1310 ss << std::setiosflags(std::ios::showpoint | std::ios::fixed | std::ios::right | std::ios::adjustfield);
1311
1312 ss << std::hex << std::setfill('0') << " 0x" << std::setw(7) << it->getDataWord();
1313
1314 ss << std::hex << std::setfill('0') << " pt:0x" << std::setw(2) << it->ptIndex() << " eta:0x" << std::setw(2)
1315 << it->etaIndex() << " phi:0x" << std::setw(3) << it->phiIndex();
1316
1317
1318
1319
1320
1321 ss << std::dec << std::setfill(' ') << " cha:" << std::setw(2) << it->charge() << " qua:" << std::setw(3)
1322 << it->quality() << " iso:" << std::setw(1) << it->isol() << " mip:" << std::setw(1) << it->mip()
1323 << " bx:" << it->bx() << std::endl;
1324
1325 return ss.str();
1326 }
1327
1328 template <>
1329 inline std::string DEutils<CSCCorrelatedLCTDigiCollection_>::print(col_cit it) const {
1330 std::stringstream ss;
1331 ss
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343 << *it;
1344 return ss.str();
1345 }
1346
1347 template <>
1348 inline std::string DEutils<CSCALCTDigiCollection_>::print(col_cit it) const {
1349 std::stringstream ss;
1350 ss << *it << std::endl;
1351 return ss.str();
1352 }
1353
1354 template <>
1355 inline std::string DEutils<CSCCLCTDigiCollection_>::print(col_cit it) const {
1356 std::stringstream ss;
1357 ss << *it << std::endl;
1358 return ss.str();
1359 }
1360
1361 template <>
1362 inline std::string DEutils<L1CSCSPStatusDigiCollection_>::print(col_cit it) const {
1363 std::stringstream ss;
1364 ss << " slot:" << it->slot() << " bxn:" << it->BXN() << " fmm:" << it->FMM() << " ses:" << it->SEs()
1365 << " sms:" << it->SMs() << " bxs:" << it->BXs() << " afs:" << it->AFs() << " vps:" << it->VPs() << std::endl;
1366 return ss.str();
1367 }
1368
1369
1370
1371 template <typename T>
1372 std::string DEutils<T>::GetName(int i) const {
1373 const int nlabel = 17;
1374 if (!(i < nlabel))
1375 return "un-defined";
1376 std::string str[nlabel] = {"un-registered"};
1377
1378 switch (de_type()) {
1379 case dedefs::ECALtp:
1380 str[0] = "ECAL tp";
1381 str[1] = "EcalTrigPrimDigiCollection";
1382 str[2] = "EcalTriggerPrimitiveDigi";
1383 break;
1384 case dedefs::HCALtp:
1385 str[0] = "HCAL tp";
1386 str[1] = "HcalTrigPrimDigiCollection";
1387 str[2] = "HcalTriggerPrimitiveDigi";
1388 break;
1389 case dedefs::RCTem:
1390 str[0] = "RCT em";
1391 str[1] = "L1CaloEmCollection";
1392 str[2] = "L1CaloEmCand";
1393 break;
1394 case dedefs::RCTrgn:
1395 str[0] = "RCT region";
1396 str[1] = "L1CaloRegionCollection";
1397 str[2] = "L1CaloRegion";
1398 break;
1399 case dedefs::GCTisolaem:
1400 str[0] = "GCT em isolated";
1401 str[1] = "L1GctEmCandCollection";
1402 str[2] = "L1GctEmCand";
1403 break;
1404 case dedefs::GCTnoisoem:
1405 str[0] = "GCT em non-isolated";
1406 str[1] = "L1GctEmCandCollection";
1407 str[2] = "L1GctEmCand";
1408 break;
1409 case dedefs::GCTcenjets:
1410 str[0] = "GCT central jet";
1411 str[1] = "L1GctJetCandCollection";
1412 str[2] = "L1GctJetCand";
1413 break;
1414 case dedefs::GCTforjets:
1415 str[0] = "GCT forward jet";
1416 str[1] = "L1GctJetCandCollection";
1417 str[2] = "L1GctJetCand";
1418 break;
1419 case dedefs::GCTtaujets:
1420 str[0] = "GCT tau jet";
1421 str[1] = "L1GctJetCandCollection";
1422 str[2] = "L1GctJetCand";
1423 break;
1424 case dedefs::GCTisotaujets:
1425 str[0] = "Stage1Layer2 iso-tau jet";
1426 str[1] = "L1GctJetCandCollection";
1427 str[2] = "L1GctJetCand";
1428 break;
1429 case dedefs::GCTethad:
1430 str[0] = "GCT ht";
1431 str[1] = "L1GctEtHadCollection";
1432 str[2] = "L1GctEtHad";
1433 break;
1434 case dedefs::GCTetmiss:
1435 str[0] = "GCT et miss";
1436 str[1] = "L1GctEtMissCollection";
1437 str[2] = "L1GctEtMiss";
1438 break;
1439 case dedefs::GCTettot:
1440 str[0] = "GCT et total";
1441 str[1] = "L1GctEtTotalCollection";
1442 str[2] = "L1GctEtTotal";
1443 break;
1444 case dedefs::GCThtmiss:
1445 str[0] = "GCT ht miss";
1446 str[1] = "L1GctHtMissCollection";
1447 str[2] = "L1GctHtMiss";
1448 break;
1449 case dedefs::GCThfring:
1450 str[0] = "GCT hf ring";
1451 str[1] = "L1GctHFRingEtSumsCollection";
1452 str[2] = "L1GctHFRingEtSums";
1453 break;
1454 case dedefs::GCThfbit:
1455 str[0] = "GCT hf bit counts";
1456 str[1] = "L1GctHFBitCountsCollection";
1457 str[2] = "L1GctHFBitCounts";
1458 break;
1459
1460 case dedefs::DTtpPh:
1461 str[0] = "DT tp phi";
1462 str[1] = "L1MuDTChambPhDigiCollection";
1463 str[2] = "L1MuDTChambPhDigi";
1464 break;
1465 case dedefs::DTtpTh:
1466 str[0] = "DT tp theta";
1467 str[1] = "L1MuDTChambThDigiCollection";
1468 str[2] = "L1MuDTChambThDigi";
1469 break;
1470 case dedefs::CSCtpa:
1471 str[0] = "CSC tpa";
1472 str[1] = "CSCALCTDigiCollection";
1473 str[2] = "CSCALCTDigi";
1474 break;
1475 case dedefs::CSCtpc:
1476 str[0] = "CSC tpc";
1477 str[1] = "CSCCLCTDigiCollection";
1478 str[2] = "CSCCLCTDigi";
1479 break;
1480 case dedefs::CSCtpl:
1481 str[0] = "CSC tp";
1482 str[1] = "CSCCorrelatedLCTDigiCollection";
1483 str[2] = "CSCCorrelatedLCTDigi";
1484 break;
1485 case dedefs::CSCsta:
1486 str[0] = "CSC tf status";
1487 str[1] = "L1CSCSPStatusDigiCollection_";
1488 str[2] = "L1CSCSPStatusDigi";
1489 break;
1490 case dedefs::MUrtf:
1491 str[0] = "Mu reg tf";
1492 str[1] = "L1MuRegionalCandCollection";
1493 str[2] = "L1MuRegionalCand";
1494 break;
1495 case dedefs::LTCi:
1496 str[0] = "LTC";
1497 str[1] = "LTCDigiCollection";
1498 str[2] = "LTCDigi";
1499 break;
1500 case dedefs::GMTcnd:
1501 str[0] = "GMT cand";
1502 str[1] = "L1MuGMTCandCollection";
1503 str[2] = "L1MuGMTCand";
1504 break;
1505 case dedefs::GMTrdt:
1506 str[0] = "GMT record";
1507 str[1] = "L1MuGMTReadoutRecordCollection";
1508 str[2] = "L1MuGMTReadoutRecord";
1509 break;
1510 case dedefs::GTdword:
1511 str[0] = "";
1512 str[1] = "";
1513 str[2] = "";
1514 break;
1515
1516 }
1517 return str[i];
1518 }
1519
1520
1521
1522 template <typename T>
1523 struct de_rank : public DEutils<T> {
1524 typedef DEtrait<T> de_trait;
1525 typedef typename de_trait::cand_type cand_type;
1526 bool operator()(const cand_type& x, const cand_type& y) const {
1527 return false;
1528 }
1529 };
1530
1531 template <>
1532 inline bool de_rank<EcalTrigPrimDigiCollection>::operator()(const cand_type& x, const cand_type& y) const {
1533 return x.compressedEt() > y.compressedEt();
1534 }
1535 template <>
1536 inline bool de_rank<HcalTrigPrimDigiCollection>::operator()(const cand_type& x, const cand_type& y) const {
1537 return x.SOI_compressedEt() > y.SOI_compressedEt();
1538 }
1539
1540 template <>
1541 inline bool de_rank<L1CaloEmCollection>::operator()(const cand_type& x, const cand_type& y) const {
1542 if (x.rank() != y.rank()) {
1543 return (x.rank() < y.rank());
1544 } else if (x.isolated() != y.isolated()) {
1545 return (x.isolated()) ? true : false;
1546 } else if (x.rctRegion() != y.rctRegion()) {
1547 return (x.rctRegion() < y.rctRegion());
1548 } else if (x.rctCrate() != y.rctCrate()) {
1549 return (x.rctCrate() < y.rctCrate());
1550 } else if (x.rctCard() != y.rctCard()) {
1551 return (x.rctCard() < y.rctCard());
1552 } else {
1553 return x.raw() < y.raw();
1554 }
1555 }
1556
1557 template <>
1558 inline bool de_rank<L1CaloRegionCollection>::operator()(const cand_type& x, const cand_type& y) const {
1559 return x.et() < y.et();
1560 }
1561
1562 template <>
1563 inline bool de_rank<L1GctEmCandCollection>::operator()(const cand_type& x, const cand_type& y) const {
1564 if (x.rank() != y.rank()) {
1565 return x.rank() < y.rank();
1566 } else {
1567 if (x.etaIndex() != y.etaIndex()) {
1568 return y.etaIndex() < x.etaIndex();
1569 } else {
1570 return x.phiIndex() < y.phiIndex();
1571 }
1572 }
1573 }
1574 template <>
1575 inline bool de_rank<L1GctJetCandCollection>::operator()(const cand_type& x, const cand_type& y) const {
1576 if (x.rank() != y.rank()) {
1577 return x.rank() < y.rank();
1578 } else {
1579 if (x.etaIndex() != y.etaIndex()) {
1580 return y.etaIndex() < x.etaIndex();
1581 } else {
1582 return x.phiIndex() < y.phiIndex();
1583 }
1584 }
1585 }
1586
1587
1588
1589
1590
1591
1592
1593
1594 template <>
1595 inline bool de_rank<L1MuDTChambPhDigiCollection>::operator()(const cand_type& x, const cand_type& y) const {
1596 if (x.whNum() != y.whNum()) {
1597 return x.whNum() < y.whNum();
1598 } else {
1599 if (x.scNum() != y.scNum()) {
1600 return y.scNum() < x.scNum();
1601 } else {
1602 return x.stNum() < y.stNum();
1603 }
1604 }
1605 }
1606 template <>
1607 inline bool de_rank<L1MuDTChambThDigiCollection>::operator()(const cand_type& x, const cand_type& y) const {
1608 if (x.whNum() != y.whNum()) {
1609 return x.whNum() < y.whNum();
1610 } else {
1611 if (x.scNum() != y.scNum()) {
1612 return y.scNum() < x.scNum();
1613 } else {
1614 return x.stNum() < y.stNum();
1615 }
1616 }
1617 }
1618
1619 template <>
1620 inline bool de_rank<L1MuRegionalCandCollection>::operator()(const cand_type& x, const cand_type& y) const {
1621 if (x.phi_packed() != y.phi_packed()) {
1622 return x.phi_packed() < y.phi_packed();
1623 } else {
1624 if (x.eta_packed() != y.eta_packed()) {
1625 return y.eta_packed() < x.eta_packed();
1626 } else {
1627 return x.quality_packed() < y.quality_packed();
1628 }
1629 }
1630 }
1631
1632 template <>
1633 inline bool de_rank<L1MuGMTCandCollection>::operator()(const cand_type& x, const cand_type& y) const {
1634 if (x.bx() != y.bx()) {
1635 return x.bx() < y.bx();
1636 } else if (x.ptIndex() != y.ptIndex()) {
1637 return x.ptIndex() < y.ptIndex();
1638 } else {
1639 return x.quality() < y.quality();
1640 }
1641 }
1642
1643 template <>
1644 inline bool de_rank<CSCCorrelatedLCTDigiCollection_>::operator()(const cand_type& x, const cand_type& y) const {
1645 if (x.getTrknmb() != y.getTrknmb()) {
1646 return x.getTrknmb() < y.getTrknmb();
1647 } else {
1648 if (x.getKeyWG() != y.getKeyWG()) {
1649 return y.getKeyWG() < x.getKeyWG();
1650 } else {
1651 return x.getQuality() < y.getQuality();
1652 }
1653 }
1654 }
1655
1656 #endif