Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New feature: CSC ALCT pre-trigger object in CSC L1 trigger emulator #28210

Merged
merged 2 commits into from Nov 6, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
108 changes: 108 additions & 0 deletions DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigi.h
@@ -0,0 +1,108 @@
#ifndef CSCDigi_CSCALCTPreTriggerDigi_h
#define CSCDigi_CSCALCTPreTriggerDigi_h

/**\class CSCALCTPreTriggerDigi
*
* Pre-trigger Digi for ALCT trigger primitives.
*
*/

#include <cstdint>
#include <iosfwd>

class CSCALCTPreTriggerDigi {
public:
/// Constructors
CSCALCTPreTriggerDigi(const int valid,
const int quality,
const int accel,
const int patternb,
const int keywire,
const int bx,
const int trknmb = 0);
/// default
CSCALCTPreTriggerDigi();

/// clear this ALCT
void clear();

/// check ALCT validity (1 - valid ALCT)
bool isValid() const { return valid_; }

/// set valid
void setValid(const int valid) { valid_ = valid; }

/// return quality of a pattern
int getQuality() const { return quality_; }

/// set quality
void setQuality(const int quality) { quality_ = quality; }

/// return Accelerator bit
/// 1-Accelerator pattern, 0-CollisionA or CollisionB pattern
int getAccelerator() const { return accel_; }

/// set accelerator bit
void setAccelerator(const int accelerator) { accel_ = accelerator; }

/// return Collision Pattern B bit
/// 1-CollisionB pattern (accel_ = 0),
/// 0-CollisionA pattern (accel_ = 0)
int getCollisionB() const { return patternb_; }

/// set Collision Pattern B bit
void setCollisionB(const int collision) { patternb_ = collision; }

/// return key wire group
int getKeyWG() const { return keywire_; }

/// set key wire group
void setKeyWG(const int keyWG) { keywire_ = keyWG; }

/// return BX - five low bits of BXN counter tagged by the ALCT
int getBX() const { return bx_; }

/// set BX
void setBX(const int BX) { bx_ = BX; }

/// return track number (1,2)
int getTrknmb() const { return trknmb_; }

/// Set track number (1,2) after sorting ALCTs.
void setTrknmb(const uint16_t number) { trknmb_ = number; }

/// return 12-bit full BX.
int getFullBX() const { return fullbx_; }

/// Set 12-bit full BX.
void setFullBX(const uint16_t fullbx) { fullbx_ = fullbx; }

/// True if the first ALCT has a larger quality, or if it has the same
/// quality but a larger wire group.
bool operator>(const CSCALCTPreTriggerDigi&) const;

/// True if all members (except the number) of both ALCTs are equal.
bool operator==(const CSCALCTPreTriggerDigi&) const;

/// True if the preceding one is false.
bool operator!=(const CSCALCTPreTriggerDigi&) const;

/// Print content of digi.
void print() const;

/// set wiregroup number
void setWireGroup(unsigned int wiregroup) { keywire_ = wiregroup; }

private:
uint16_t valid_;
uint16_t quality_;
uint16_t accel_;
uint16_t patternb_; // not used since 2007
uint16_t keywire_;
uint16_t bx_;
uint16_t trknmb_;
uint16_t fullbx_;
};

std::ostream& operator<<(std::ostream& o, const CSCALCTPreTriggerDigi& digi);
#endif
16 changes: 16 additions & 0 deletions DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigiCollection.h
@@ -0,0 +1,16 @@
#ifndef CSCALCTPreTriggerDigi_CSCALCTPreTriggerDigiCollection_h
#define CSCALCTPreTriggerDigi_CSCALCTPreTriggerDigiCollection_h

/** \class CSCALCTPreTriggerDigiCollection
*
* For ALCT trigger primitives
*
*/

#include "DataFormats/MuonDetId/interface/CSCDetId.h"
#include "DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigi.h"
#include "DataFormats/MuonData/interface/MuonDigiCollection.h"

typedef MuonDigiCollection<CSCDetId, CSCALCTPreTriggerDigi> CSCALCTPreTriggerDigiCollection;

#endif
101 changes: 101 additions & 0 deletions DataFormats/CSCDigi/src/CSCALCTPreTriggerDigi.cc
@@ -0,0 +1,101 @@
#include "DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigi.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include <iomanip>
#include <iostream>

using namespace std;

/// Constructors
CSCALCTPreTriggerDigi::CSCALCTPreTriggerDigi(const int valid,
const int quality,
const int accel,
const int patternb,
const int keywire,
const int bx,
const int trknmb) {
valid_ = valid;
quality_ = quality;
accel_ = accel;
patternb_ = patternb;
keywire_ = keywire;
bx_ = bx;
trknmb_ = trknmb;
}

/// Default
CSCALCTPreTriggerDigi::CSCALCTPreTriggerDigi() {
clear(); // set contents to zero
}

/// Clears this ALCT.
void CSCALCTPreTriggerDigi::clear() {
valid_ = 0;
quality_ = 0;
accel_ = 0;
patternb_ = 0;
keywire_ = 0;
bx_ = 0;
trknmb_ = 0;
fullbx_ = 0;
}

bool CSCALCTPreTriggerDigi::operator>(const CSCALCTPreTriggerDigi& rhs) const {
bool returnValue = false;

// Early ALCTs are always preferred to the ones found at later bx's.
if (getBX() < rhs.getBX()) {
returnValue = true;
}
if (getBX() != rhs.getBX()) {
return returnValue;
}

// The > operator then checks the quality of ALCTs.
// If two qualities are equal, the ALCT furthest from the beam axis
// (lowest eta, highest wire group number) is selected.
int quality1 = getQuality();
int quality2 = rhs.getQuality();
if (quality1 > quality2) {
returnValue = true;
} else if (quality1 == quality2 && getKeyWG() > rhs.getKeyWG()) {
returnValue = true;
}
return returnValue;
}

bool CSCALCTPreTriggerDigi::operator==(const CSCALCTPreTriggerDigi& rhs) const {
// Exact equality.
bool returnValue = false;
if (isValid() == rhs.isValid() && getQuality() == rhs.getQuality() && getAccelerator() == rhs.getAccelerator() &&
getCollisionB() == rhs.getCollisionB() && getKeyWG() == rhs.getKeyWG() && getBX() == rhs.getBX()) {
returnValue = true;
}
return returnValue;
}

bool CSCALCTPreTriggerDigi::operator!=(const CSCALCTPreTriggerDigi& rhs) const {
// True if == is false.
bool returnValue = true;
if ((*this) == rhs)
returnValue = false;
return returnValue;
}

/// Debug
void CSCALCTPreTriggerDigi::print() const {
if (isValid()) {
edm::LogVerbatim("CSCDigi") << "CSC ALCT #" << setw(1) << getTrknmb() << ": Valid = " << setw(1) << isValid()
<< " Quality = " << setw(2) << getQuality() << " Accel. = " << setw(1)
<< getAccelerator() << " PatternB = " << setw(1) << getCollisionB()
<< " Key wire group = " << setw(3) << getKeyWG() << " BX = " << setw(2) << getBX()
<< " Full BX= " << std::setw(1) << getFullBX();
} else {
edm::LogVerbatim("CSCDigi") << "Not a valid Anode LCT.";
}
}

std::ostream& operator<<(std::ostream& o, const CSCALCTPreTriggerDigi& digi) {
return o << "CSC ALCT #" << digi.getTrknmb() << ": Valid = " << digi.isValid() << " Quality = " << digi.getQuality()
<< " Accel. = " << digi.getAccelerator() << " PatternB = " << digi.getCollisionB()
<< " Key wire group = " << digi.getKeyWG() << " BX = " << digi.getBX();
}
2 changes: 2 additions & 0 deletions DataFormats/CSCDigi/src/classes.h
Expand Up @@ -29,6 +29,8 @@
#include "DataFormats/CSCDigi/interface/CSCCLCTPreTriggerCollection.h"
#include "DataFormats/CSCDigi/interface/CSCCLCTPreTriggerDigi.h"
#include "DataFormats/CSCDigi/interface/CSCCLCTPreTriggerDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigi.h"
#include "DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigiCollection.h"

// dummy structs to ensure backward compatibility
struct GEMCSCLCTDigi {};
Expand Down
14 changes: 11 additions & 3 deletions DataFormats/CSCDigi/src/classes_def.xml
Expand Up @@ -28,6 +28,9 @@
<class name="CSCALCTDigi" ClassVersion="10">
<version ClassVersion="10" checksum="817473300"/>
</class>
<class name="CSCALCTPreTriggerDigi" ClassVersion="10">
<version ClassVersion="10" checksum="2925979693"/>
</class>
<class name="CSCCFEBStatusDigi" ClassVersion="10">
<version ClassVersion="10" checksum="3752412263"/>
</class>
Expand Down Expand Up @@ -59,6 +62,7 @@
<class name="std::vector<CSCCLCTDigi>"/>
<class name="std::vector<CSCCLCTPreTriggerDigi>"/>
<class name="std::vector<CSCALCTDigi>"/>
<class name="std::vector<CSCALCTPreTriggerDigi>"/>
<class name="std::vector<CSCCFEBStatusDigi>"/>
<class name="std::vector<CSCTMBStatusDigi>"/>
<class name="std::vector<CSCDMBStatusDigi>"/>
Expand All @@ -76,6 +80,7 @@
<class name="std::map<CSCDetId,std::vector<CSCCLCTDigi> >"/>
<class name="std::map<CSCDetId,std::vector<CSCCLCTPreTriggerDigi> >"/>
<class name="std::map<CSCDetId,std::vector<CSCALCTDigi> >"/>
<class name="std::map<CSCDetId,std::vector<CSCALCTPreTriggerDigi> >"/>
<class name="std::map<CSCDetId,std::vector<CSCCFEBStatusDigi> >"/>
<class name="std::map<CSCDetId,std::vector<CSCTMBStatusDigi> >"/>
<class name="std::map<CSCDetId,std::vector<CSCDCCFormatStatusDigi> >"/>
Expand All @@ -92,8 +97,9 @@
<class name="std::pair<CSCDetId,std::vector<CSCCorrelatedLCTDigi> >"/>
<class name="std::pair<CSCDetId,std::vector<GEMCSCLCTDigi> >"/>
<class name="std::pair<CSCDetId,std::vector<CSCCLCTDigi> >"/>
<class name="std::pair<CSCDetId,std::vector<CSCCLCTPreTriggerDigi> >"/>
<class name="std::pair<CSCDetId,std::vector<CSCCLCTPreTriggerDigi> >"/>
<class name="std::pair<CSCDetId,std::vector<CSCALCTDigi> >"/>
<class name="std::pair<CSCDetId,std::vector<CSCALCTPreTriggerDigi> >"/>
<class name="std::pair<CSCDetId,std::vector<CSCCFEBStatusDigi> >"/>
<class name="std::pair<CSCDetId,std::vector<CSCTMBStatusDigi> >"/>
<class name="std::pair<CSCDetId,std::vector<CSCDCCFormatStatusDigi> >"/>
Expand All @@ -111,8 +117,9 @@
<class name="MuonDigiCollection<CSCDetId,CSCCorrelatedLCTDigi>"/>
<class name="MuonDigiCollection<CSCDetId,GEMCSCLCTDigi>"/>
<class name="MuonDigiCollection<CSCDetId,CSCCLCTDigi>"/>
<class name="MuonDigiCollection<CSCDetId,CSCCLCTPreTriggerDigi>"/>
<class name="MuonDigiCollection<CSCDetId,CSCCLCTPreTriggerDigi>"/>
<class name="MuonDigiCollection<CSCDetId,CSCALCTDigi>"/>
<class name="MuonDigiCollection<CSCDetId,CSCALCTPreTriggerDigi>"/>
<class name="MuonDigiCollection<CSCDetId,CSCCFEBStatusDigi>"/>
<class name="MuonDigiCollection<CSCDetId,CSCTMBStatusDigi>"/>
<class name="MuonDigiCollection<CSCDetId,CSCDCCFormatStatusDigi>"/>
Expand All @@ -129,8 +136,9 @@
<class name="edm::Wrapper<MuonDigiCollection<CSCDetId,CSCCorrelatedLCTDigi> >" splitLevel="0"/>
<class name="edm::Wrapper<MuonDigiCollection<CSCDetId,GEMCSCLCTDigi> >" splitLevel="0"/>
<class name="edm::Wrapper<MuonDigiCollection<CSCDetId,CSCCLCTDigi> >" splitLevel="0"/>
<class name="edm::Wrapper<MuonDigiCollection<CSCDetId,CSCCLCTPreTriggerDigi> >" splitLevel="0"/>
<class name="edm::Wrapper<MuonDigiCollection<CSCDetId,CSCCLCTPreTriggerDigi> >" splitLevel="0"/>
<class name="edm::Wrapper<MuonDigiCollection<CSCDetId,CSCALCTDigi> >" splitLevel="0"/>
<class name="edm::Wrapper<MuonDigiCollection<CSCDetId,CSCALCTPreTriggerDigi> >" splitLevel="0"/>
<class name="edm::Wrapper<MuonDigiCollection<CSCDetId,CSCCFEBStatusDigi> >" splitLevel="0"/>
<class name="edm::Wrapper<MuonDigiCollection<CSCDetId,CSCTMBStatusDigi> >" splitLevel="0"/>
<class name="edm::Wrapper<MuonDigiCollection<CSCDetId,CSCDCCFormatStatusDigi> >" splitLevel="0"/>
Expand Down
Expand Up @@ -36,6 +36,8 @@

#include "DataFormats/CSCDigi/interface/CSCWireDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCALCTDigi.h"
#include "DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigi.h"
#include "CondFormats/CSCObjects/interface/CSCDBL1TPParameters.h"
#include "L1Trigger/CSCTriggerPrimitives/interface/CSCBaseboard.h"

#include <vector>
Expand Down Expand Up @@ -75,6 +77,9 @@ class CSCAnodeLCTProcessor : public CSCBaseboard {
/** Returns vector of all found ALCTs, if any. */
std::vector<CSCALCTDigi> getALCTs() const;

/** read out pre-ALCTs */
std::vector<CSCALCTPreTriggerDigi> preTriggerDigis() const { return thePreTriggerDigis; }

/** Return best/second best ALCTs */
CSCALCTDigi getBestALCT(int bx) const;
CSCALCTDigi getSecondALCT(int bx) const;
Expand Down Expand Up @@ -105,6 +110,8 @@ class CSCAnodeLCTProcessor : public CSCBaseboard {

std::vector<CSCALCTDigi> lct_list;

std::vector<CSCALCTPreTriggerDigi> thePreTriggerDigis;

/** Configuration parameters. */
unsigned int fifo_tbins, fifo_pretrig, drift_delay;
unsigned int nplanes_hit_pretrig, nplanes_hit_accel_pretrig;
Expand Down
Expand Up @@ -23,6 +23,7 @@
#include "DataFormats/CSCDigi/interface/CSCWireDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCALCTDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCCLCTDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCCLCTPreTriggerDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCCorrelatedLCTDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCCLCTPreTriggerCollection.h"
Expand Down Expand Up @@ -70,6 +71,7 @@ class CSCTriggerPrimitivesBuilder {
const GEMPadDigiClusterCollection* gemPadClusters,
CSCALCTDigiCollection& oc_alct,
CSCCLCTDigiCollection& oc_clct,
CSCALCTPreTriggerDigiCollection& oc_alctpretrigger,
CSCCLCTPreTriggerDigiCollection& oc_clctpretrigger,
CSCCLCTPreTriggerCollection& oc_pretrig,
CSCCorrelatedLCTDigiCollection& oc_lct,
Expand Down
Expand Up @@ -26,6 +26,7 @@
#include "DataFormats/CSCDigi/interface/CSCALCTDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCCLCTDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCCorrelatedLCTDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigiCollection.h"
#include "DataFormats/CSCDigi/interface/CSCCLCTPreTriggerDigiCollection.h"
#include "DataFormats/GEMDigi/interface/GEMCoPadDigiCollection.h"

Expand All @@ -47,6 +48,8 @@ CSCTriggerPrimitivesProducer::CSCTriggerPrimitivesProducer(const edm::ParameterS
: edm::InputTag("");
checkBadChambers_ = conf.getParameter<bool>("checkBadChambers");

savePreTriggers_ = conf.getParameter<bool>("savePreTriggers");

// check whether you need to run the integrated local triggers
const edm::ParameterSet commonParam(conf.getParameter<edm::ParameterSet>("commonParam"));
runME11ILT_ = commonParam.existsAs<bool>("runME11ILT") ? commonParam.getParameter<bool>("runME11ILT") : false;
Expand All @@ -62,6 +65,7 @@ CSCTriggerPrimitivesProducer::CSCTriggerPrimitivesProducer(const edm::ParameterS
produces<CSCCLCTDigiCollection>();
produces<CSCCLCTPreTriggerDigiCollection>();
produces<CSCCLCTPreTriggerCollection>();
produces<CSCALCTPreTriggerDigiCollection>();
produces<CSCCorrelatedLCTDigiCollection>();
produces<CSCCorrelatedLCTDigiCollection>("MPCSORTED");
if (runME11ILT_ or runME21ILT_)
Expand Down Expand Up @@ -134,6 +138,7 @@ void CSCTriggerPrimitivesProducer::produce(edm::StreamID iID, edm::Event& ev, co
std::unique_ptr<CSCALCTDigiCollection> oc_alct(new CSCALCTDigiCollection);
std::unique_ptr<CSCCLCTDigiCollection> oc_clct(new CSCCLCTDigiCollection);
std::unique_ptr<CSCCLCTPreTriggerDigiCollection> oc_clctpretrigger(new CSCCLCTPreTriggerDigiCollection);
std::unique_ptr<CSCALCTPreTriggerDigiCollection> oc_alctpretrigger(new CSCALCTPreTriggerDigiCollection);
std::unique_ptr<CSCCLCTPreTriggerCollection> oc_pretrig(new CSCCLCTPreTriggerCollection);
std::unique_ptr<CSCCorrelatedLCTDigiCollection> oc_lct(new CSCCorrelatedLCTDigiCollection);
std::unique_ptr<CSCCorrelatedLCTDigiCollection> oc_sorted_lct(new CSCCorrelatedLCTDigiCollection);
Expand Down Expand Up @@ -161,6 +166,7 @@ void CSCTriggerPrimitivesProducer::produce(edm::StreamID iID, edm::Event& ev, co
gemPadClusters,
*oc_alct,
*oc_clct,
*oc_alctpretrigger,
*oc_clctpretrigger,
*oc_pretrig,
*oc_lct,
Expand All @@ -173,7 +179,10 @@ void CSCTriggerPrimitivesProducer::produce(edm::StreamID iID, edm::Event& ev, co
// Put collections in event.
ev.put(std::move(oc_alct));
ev.put(std::move(oc_clct));
ev.put(std::move(oc_clctpretrigger));
if (savePreTriggers_) {
ev.put(std::move(oc_alctpretrigger));
ev.put(std::move(oc_clctpretrigger));
}
ev.put(std::move(oc_pretrig));
ev.put(std::move(oc_lct));
ev.put(std::move(oc_sorted_lct), "MPCSORTED");
Expand Down