Skip to content

Commit

Permalink
Merge pull request #12307 from VinInn/StatelessClusterizer
Browse files Browse the repository at this point in the history
Stateless clusterizer for SiStrip
  • Loading branch information
cmsbuild committed Nov 12, 2015
2 parents ee5bb78 + d9629b4 commit 877f2dd
Show file tree
Hide file tree
Showing 12 changed files with 236 additions and 632 deletions.

This file was deleted.

Expand Up @@ -6,7 +6,7 @@
#include "DataFormats/Common/interface/DetSetVectorNew.h"
#include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
#include <vector>

#include <memory>

class SiStripApvShotCleaner{

Expand All @@ -23,16 +23,11 @@ class SiStripApvShotCleaner{
bool loop(const edmNew::DetSet<SiStripDigi>& in){return false;} //FIXME
bool loop(const edm::DetSet<SiStripDigi>& in);

void refresh();

void reset(edm::DetSet<SiStripDigi>::const_iterator& a, edm::DetSet<SiStripDigi>::const_iterator& b);
// void reset(edmNew::DetSet<SiStripDigi>::const_iterator& a, edmNew::DetSet<SiStripDigi>::const_iterator& b){;} //FIXME

private:

struct orderingByCharge {
bool operator ()(SiStripDigi const& a, SiStripDigi const& b) {return a.adc() > b.adc();}
};

void subtractCM();

Expand All @@ -44,7 +39,7 @@ class SiStripApvShotCleaner{
edm::DetSet<SiStripDigi>::const_iterator pFirstDigiOfApv[7];

std::vector<SiStripDigi> vdigis,apvDigis; //caches of digis, in case an apvshot is found
edm::DetSet<SiStripDigi> * pDetSet;
std::unique_ptr<edm::DetSet<SiStripDigi>> pDetSet;
unsigned short maxNumOfApvs ;
unsigned short stripsPerApv ;
unsigned short stripsForMedian;
Expand Down
Expand Up @@ -19,65 +19,89 @@ class FedChannelConnection;
class StripClusterizerAlgorithm {

public:

static constexpr unsigned short invalidI = std::numeric_limits<unsigned short>::max();

// state of detID
struct Det {
bool valid() const { return ind!=invalidI; }
float noise(const uint16_t& strip) const { return SiStripNoises::getNoise( strip, noiseRange ); }
float gain(const uint16_t& strip) const { return SiStripGain::getStripGain( strip, gainRange ); }
bool bad(const uint16_t& strip) const { return quality->IsStripBad( qualityRange, strip ); }
bool allBadBetween(uint16_t L, const uint16_t& R) const { while( ++L < R && bad(L) ); return L == R; }
SiStripQuality const * quality;
SiStripApvGain::Range gainRange;
SiStripNoises::Range noiseRange;
SiStripQuality::Range qualityRange;
uint32_t detId=0;
unsigned short ind=invalidI;
};

//state of the candidate cluster
struct State {
State(Det const & idet) : m_det(idet) { ADCs.reserve(128);}
Det const & det() const { return m_det;}
std::vector<uint8_t> ADCs;
uint16_t lastStrip=0;
float noiseSquared=0;
bool candidateLacksSeed=true;
private:
Det const & m_det;
};


virtual ~StripClusterizerAlgorithm() {}
virtual void initialize(const edm::EventSetup&);


//Offline DetSet interface
typedef edmNew::DetSetVector<SiStripCluster> output_t;
void clusterize(const edm::DetSetVector<SiStripDigi> &, output_t &);
void clusterize(const edmNew::DetSetVector<SiStripDigi> &, output_t &);
virtual void clusterizeDetUnit(const edm::DetSet<SiStripDigi> &, output_t::FastFiller &) = 0;
virtual void clusterizeDetUnit(const edmNew::DetSet<SiStripDigi> &, output_t::FastFiller &) = 0;
void clusterize(const edm::DetSetVector<SiStripDigi> &, output_t &) const;
void clusterize(const edmNew::DetSetVector<SiStripDigi> &, output_t &) const;
virtual void clusterizeDetUnit(const edm::DetSet<SiStripDigi> &, output_t::FastFiller &) const = 0;
virtual void clusterizeDetUnit(const edmNew::DetSet<SiStripDigi> &, output_t::FastFiller &) const = 0;

//HLT stripByStrip interface
virtual bool stripByStripBegin(uint32_t id) = 0;
virtual Det stripByStripBegin(uint32_t id)const = 0;

virtual void addFed(sistrip::FEDZSChannelUnpacker & unpacker, uint16_t ipair, std::vector<SiStripCluster>& out) {}
virtual void stripByStripAdd(uint16_t strip, uint8_t adc, std::vector<SiStripCluster>& out) {}
virtual void stripByStripEnd(std::vector<SiStripCluster>& out) {}
virtual void addFed(Det const & det, sistrip::FEDZSChannelUnpacker & unpacker, uint16_t ipair, std::vector<SiStripCluster>& out) const {}
virtual void stripByStripAdd(State & state, uint16_t strip, uint8_t adc, std::vector<SiStripCluster>& out) const{}
virtual void stripByStripEnd(State & state, std::vector<SiStripCluster>& out) const {}

virtual void addFed(State & state, sistrip::FEDZSChannelUnpacker & unpacker, uint16_t ipair, output_t::FastFiller & out) const {}
virtual void stripByStripAdd(State & state, uint16_t strip, uint8_t adc, output_t::FastFiller & out) const {}
virtual void stripByStripEnd(State & state, output_t::FastFiller & out) const {}

virtual void addFed(sistrip::FEDZSChannelUnpacker & unpacker, uint16_t ipair, output_t::FastFiller & out) {}
virtual void stripByStripAdd(uint16_t strip, uint8_t adc, output_t::FastFiller & out) {}
virtual void stripByStripEnd(output_t::FastFiller & out) {}

virtual void cleanState(){}

struct InvalidChargeException : public cms::Exception { public: InvalidChargeException(const SiStripDigi&); };


SiStripDetCabling const * cabling() const { return theCabling;}
std::vector<uint32_t> const & allDetIds() const { return detIds;}
std::vector<const FedChannelConnection *> const & currentConnection() const { return connections[ind]; }

std::vector<const FedChannelConnection *> const & currentConnection(const Det& det) const { return connections[det.ind]; }

protected:

StripClusterizerAlgorithm() : qualityLabel(""), noise_cache_id(0), gain_cache_id(0), quality_cache_id(0) {}

uint32_t currentId() {return detId;}
bool setDetId(const uint32_t);
float noise(const uint16_t& strip) const { return SiStripNoises::getNoise( strip, noiseRange ); }
float gain(const uint16_t& strip) const { return SiStripGain::getStripGain( strip, gainRange ); }
bool bad(const uint16_t& strip) const { return qualityHandle->IsStripBad( qualityRange, strip ); }
// uint32_t currentId() const {return detId;}
Det setDetId(const uint32_t) const;
bool isModuleBad(const uint32_t& id) const { return qualityHandle->IsModuleBad( id ); }
bool isModuleUsable(const uint32_t& id) const { return qualityHandle->IsModuleUsable( id ); }
bool allBadBetween(uint16_t L, const uint16_t& R) const { while( ++L < R && bad(L) ); return L == R; }

std::string qualityLabel;
bool _setDetId;

private:

template<class T> void clusterize_(const T& input, output_t& output) {
template<class T> void clusterize_(const T& input, output_t& output) const {
for(typename T::const_iterator it = input.begin(); it!=input.end(); it++) {
output_t::FastFiller ff(output, it->detId());
clusterizeDetUnit(*it, ff);
if(ff.empty()) ff.abort();
}
}

static constexpr unsigned short invalidI = std::numeric_limits<unsigned short>::max();
struct Index {
unsigned short
gi=invalidI,
Expand All @@ -87,15 +111,12 @@ class StripClusterizerAlgorithm {
std::vector<uint32_t> detIds; // from cabling (connected and not bad)
std::vector<std::vector<const FedChannelConnection *> > connections;
std::vector<Index> indices;
SiStripApvGain::Range gainRange;
SiStripNoises::Range noiseRange;
SiStripQuality::Range qualityRange;
edm::ESHandle<SiStripGain> gainHandle;
edm::ESHandle<SiStripNoises> noiseHandle;
edm::ESHandle<SiStripQuality> qualityHandle;
SiStripDetCabling const * theCabling = nullptr;
uint32_t noise_cache_id, gain_cache_id, quality_cache_id, detId=0;
unsigned short ind=invalidI;
uint32_t noise_cache_id, gain_cache_id, quality_cache_id;

};
#endif
Expand Up @@ -9,70 +9,66 @@ class ThreeThresholdAlgorithm final : public StripClusterizerAlgorithm {

public:

void clusterizeDetUnit(const edm::DetSet<SiStripDigi> &, output_t::FastFiller &);
void clusterizeDetUnit(const edmNew::DetSet<SiStripDigi> &, output_t::FastFiller &);
using State = StripClusterizerAlgorithm::State;
using Det = StripClusterizerAlgorithm::Det;

bool stripByStripBegin(uint32_t id);
void clusterizeDetUnit(const edm::DetSet<SiStripDigi> &, output_t::FastFiller &) const;
void clusterizeDetUnit(const edmNew::DetSet<SiStripDigi> &, output_t::FastFiller &) const;

Det stripByStripBegin(uint32_t id) const;

// LazyGetter interface
void stripByStripAdd(uint16_t strip, uint8_t adc, std::vector<SiStripCluster>& out);
void stripByStripEnd(std::vector<SiStripCluster>& out);
void addFed(sistrip::FEDZSChannelUnpacker & unpacker, uint16_t ipair, std::vector<SiStripCluster>& out) {
void stripByStripAdd(State & state, uint16_t strip, uint8_t adc, std::vector<SiStripCluster>& out) const;
void stripByStripEnd(State & state, std::vector<SiStripCluster>& out) const;

void addFed(State & state, sistrip::FEDZSChannelUnpacker & unpacker, uint16_t ipair, std::vector<SiStripCluster>& out) const {
while (unpacker.hasData()) {
stripByStripAdd(unpacker.sampleNumber()+ipair*256,unpacker.adc(),out);
stripByStripAdd(state,unpacker.sampleNumber()+ipair*256,unpacker.adc(),out);
unpacker++;
}
}

// detset interface
void addFed(sistrip::FEDZSChannelUnpacker & unpacker, uint16_t ipair, output_t::FastFiller & out) override {
void addFed(State & state, sistrip::FEDZSChannelUnpacker & unpacker, uint16_t ipair, output_t::FastFiller & out) const override {
while (unpacker.hasData()) {
stripByStripAdd(unpacker.sampleNumber()+ipair*256,unpacker.adc(),out);
stripByStripAdd(state, unpacker.sampleNumber()+ipair*256,unpacker.adc(),out);
unpacker++;
}
}

void stripByStripAdd(uint16_t strip, uint8_t adc, output_t::FastFiller & out) override {
if(candidateEnded(strip)) endCandidate(out);
addToCandidate(strip,adc);
void stripByStripAdd(State & state, uint16_t strip, uint8_t adc, output_t::FastFiller & out) const override {
if(candidateEnded(state, strip)) endCandidate(state, out);
addToCandidate(state, strip,adc);
}

void stripByStripEnd(output_t::FastFiller & out) override { endCandidate(out);}

void cleanState() override {clearCandidate();}
void stripByStripEnd(State & state, output_t::FastFiller & out) const override { endCandidate(state,out);}


private:

template<class T> void clusterizeDetUnit_(const T&, output_t::FastFiller&);
template<class T> void clusterizeDetUnit_(const T&, output_t::FastFiller&) const;
ThreeThresholdAlgorithm(float, float, float, unsigned, unsigned, unsigned, std::string qualityLabel,
bool setDetId, bool removeApvShots, float minGoodCharge);

//state of the candidate cluster
std::vector<uint8_t> ADCs;
uint16_t lastStrip;
float noiseSquared;
bool candidateLacksSeed;

//constant methods with state information
uint16_t firstStrip() const {return lastStrip - ADCs.size() + 1;}
bool candidateEnded(const uint16_t&) const;
bool candidateAccepted() const;
//constant methods with state information
uint16_t firstStrip(State const & state) const {return state.lastStrip - state.ADCs.size() + 1;}
bool candidateEnded(State const & state, const uint16_t&) const;
bool candidateAccepted(State const & state) const;

//state modification methods
template<class T> void endCandidate(T&);
void clearCandidate() { candidateLacksSeed = true; noiseSquared = 0; ADCs.clear();}
void addToCandidate(const SiStripDigi& digi) { addToCandidate(digi.strip(),digi.adc());}
void addToCandidate(uint16_t strip, uint8_t adc);
void appendBadNeighbors();
void applyGains();
template<class T> void endCandidate(State & state, T&) const;
void clearCandidate(State & state) const { state.candidateLacksSeed = true; state.noiseSquared = 0; state.ADCs.clear();}
void addToCandidate(State & state, const SiStripDigi& digi) const { addToCandidate(state, digi.strip(),digi.adc());}
void addToCandidate(State & state, uint16_t strip, uint8_t adc) const;
void appendBadNeighbors(State & state) const;
void applyGains(State & state) const;

float ChannelThreshold, SeedThreshold, ClusterThresholdSquared;
uint8_t MaxSequentialHoles, MaxSequentialBad, MaxAdjacentBad;
bool RemoveApvShots;
float minGoodCharge;

SiStripApvShotCleaner ApvCleaner;
};

#endif

0 comments on commit 877f2dd

Please sign in to comment.