51 maxChi2_(iConfig.getParameter<double>(
"maxChi2")),
79 int id1=-1,
int id2=-1,
int id3=-1,
int id4=-1,
int id5=-1,
int id6=-1) ;
89 std::auto_ptr<edmNew::DetSetVector<T> >
111 using namespace reco;
115 int id1,
int id2,
int id3,
int id4,
int id5,
int id6)
117 if (iConfig.
exists(name)) {
120 fill(pblocks_, pblocks_+NumberOfParamBlocks, pblock);
122 pblocks_[id1] = pblock;
123 if (id2 != -1) pblocks_[id2] = pblock;
124 if (id3 != -1) pblocks_[id3] = pblock;
125 if (id4 != -1) pblocks_[id4] = pblock;
126 if (id5 != -1) pblocks_[id5] = pblock;
127 if (id6 != -1) pblocks_[id6] = pblock;
133 doTracks_(iConfig.exists(
"trajectories")),
134 doStrip_(iConfig.existsAs<bool>(
"doStrip") ? iConfig.getParameter<bool>(
"doStrip") :
true),
135 doPixel_(iConfig.existsAs<bool>(
"doPixel") ? iConfig.getParameter<bool>(
"doPixel") :
true),
136 mergeOld_(iConfig.exists(
"oldClusterRemovalInfo")),
137 clusterWasteSolution_(
true),
138 doStripChargeCheck_(iConfig.existsAs<bool>(
"doStripChargeCheck") ? iConfig.getParameter<bool>(
"doStripChargeCheck") :
false),
139 doPixelChargeCheck_(iConfig.existsAs<bool>(
"doPixelChargeCheck") ? iConfig.getParameter<bool>(
"doPixelChargeCheck") :
false),
140 stripRecHits_(doStripChargeCheck_ ? iConfig.getParameter<std::
string>(
"stripRecHits") : std::
string(
"siStripMatchedRecHits")),
141 pixelRecHits_(doPixelChargeCheck_ ? iConfig.getParameter<std::
string>(
"pixelRecHits") : std::
string(
"siPixelRecHits"))
143 if (iConfig.
exists(
"overrideTrkQuals"))
145 if (iConfig.
exists(
"clusterLessSolution"))
148 throw cms::Exception(
"Configuration Error") <<
"TrackClusterRemover: Charge check asked without cluster collection ";
150 throw cms::Exception(
"Configuration Error") <<
"TrackClusterRemover: Pixel cluster charge check not yet implemented";
164 readPSet(iConfig,
"Strip" ,2,3,4,5);
165 readPSet(iConfig,
"StripInner" ,2,3);
166 readPSet(iConfig,
"StripOuter" ,4,5);
173 bool usingCharge =
false;
175 if (!
pblocks_[
i].isSet_)
throw cms::Exception(
"Configuration Error") <<
"TrackClusterRemover: Missing configuration for detector with subDetID = " << (
i+1);
176 if (
pblocks_[
i].usesCharge_ && !usingCharge) {
177 throw cms::Exception(
"Configuration Error") <<
"TrackClusterRemover: Configuration for subDetID = " << (
i+1) <<
" uses cluster charge, which is not enabled.";
182 produces<edm::ContainerMask<edmNew::DetSetVector<SiPixelCluster> > >();
183 produces<edm::ContainerMask<edmNew::DetSetVector<SiStripCluster> > >();
187 if (iConfig.
exists(
"TrackQuality")){
191 iConfig.
getParameter<
int>(
"minNumberOfLayersWithMeasBeforeFiltering") : 0;
219 for (
size_t i = 0,
n = refs.size();
i <
n; ++
i) {
220 refs[
i] = oldRefs[refs[
i]];
226 auto_ptr<edmNew::DetSetVector<T> >
232 auto_ptr<DSV>
output(
new DSV());
233 output->reserve(oldClusters.
size(), oldClusters.
dataSize());
235 unsigned int countOld=0;
236 unsigned int countNew=0;
239 const T * firstOffset = & oldClusters.
data().front();
240 for (
typename DSV::const_iterator itdet = oldClusters.
begin(), enddet = oldClusters.
end(); itdet != enddet; ++itdet) {
243 if (oldDS.empty())
continue;
245 uint32_t
id = oldDS.detId();
246 DSF outds(*output,
id);
248 for (
typename DS::const_iterator it = oldDS.begin(), ed = oldDS.end(); it != ed; ++it) {
249 uint32_t
index = ((&*it) - firstOffset);
252 outds.push_back(*it);
254 refs.push_back(index);
259 if (outds.empty()) outds.abort();
262 if (oldRefs != 0)
mergeOld(refs, *oldRefs);
268 SiStripRecHit2D::ClusterRef cluster = ocluster.
cluster_strip();
270 "TrackClusterRemover: strip cluster ref from Product ID = " << cluster.id() <<
271 " does not match with source cluster collection (ID = " <<
stripSourceProdID <<
")\n.";
277 for( std::vector<uint8_t>::const_iterator iAmp = cluster->amplitudes().begin(); iAmp != cluster->amplitudes().end(); ++iAmp){
280 if (
pblocks_[subdet-1].cutOnStripCharge_ && clusCharge >
pblocks_[subdet-1].minGoodStripCharge_)
return;
282 strips[cluster.key()] =
false;
297 if (chi2 >
pblocks_[subdet-1].maxChi2_)
return;
304 SiPixelRecHit::ClusterRef cluster = pixelHit->cluster();
307 "TrackClusterRemover: pixel cluster ref from Product ID = " << cluster.id() <<
308 " does not match with source cluster collection (ID = " <<
pixelSourceProdID <<
")\n.";
317 pixels[cluster.key()] =
false;
326 const type_info &hitType =
typeid(*hit);
327 if (hitType ==
typeid(SiStripRecHit2D)) {
328 const SiStripRecHit2D *stripHit =
static_cast<const SiStripRecHit2D *
>(hit);
330 process(stripHit->omniClusterRef(),subdet,
true);}
331 else if (hitType ==
typeid(SiStripRecHit1D)) {
332 const SiStripRecHit1D *hit1D =
static_cast<const SiStripRecHit1D *
>(hit);
333 process(hit1D->omniClusterRef(),subdet,
true);
334 }
else if (hitType ==
typeid(SiStripMatchedRecHit2D)) {
335 const SiStripMatchedRecHit2D *matchHit =
static_cast<const SiStripMatchedRecHit2D *
>(hit);
337 process(matchHit->monoClusterRef(),subdet,
true);
338 process(matchHit->stereoClusterRef(),subdet,
true);
343 }
else throw cms::Exception(
"NOT IMPLEMENTED") <<
"Don't know how to handle " << hitType.name() <<
" on detid " << detid.
rawId() <<
"\n";
361 ProductID pixelOldProdID, stripOldProdID;
377 auto_ptr<ClusterRemovalInfo> cri;
388 if ( (oldRemovalInfo->stripNewRefProd().
id() == stripClusters.
id()) &&
389 (oldRemovalInfo->pixelNewRefProd().
id() == pixelClusters.
id()) ) {
391 cri->getOldClustersFrom(*oldRemovalInfo);
393 pixelOldProdID = oldRemovalInfo->pixelRefProd().
id();
394 stripOldProdID = oldRemovalInfo->stripRefProd().
id();
400 throw cms::Exception(
"Inconsistent Data") <<
"TrackClusterRemover: " <<
401 "Input collection product IDs are [pixel: " << pixelClusters.
id() <<
", strip: " << stripClusters.
id() <<
"] \n" <<
402 "\t but the *old* ClusterRemovalInfo " << labels.
productInstance <<
" refers as 'new product ids' to " <<
403 "[pixel: " << oldRemovalInfo->pixelNewRefProd().
id() <<
", strip: " << oldRemovalInfo->stripNewRefProd().
id() <<
"]\n" <<
404 "NOTA BENE: when running TrackClusterRemover with an old ClusterRemovalInfo the hits in the trajectory MUST be already re-keyed.\n";
422 LogDebug(
"TrackClusterRemover")<<
"to merge in, "<<oldStrMask->size()<<
" strp and "<<oldPxlMask->size()<<
" pxl";
435 std::vector<Handle<edm::ValueMap<int> > > quals;
443 for ( ; asst!=trajectories_totrack->end();++asst){
444 const Track & track = *(asst->val);
447 if ( quals.size()!=0) {
448 int qual=(*(quals[0]))[asst->val];
449 if ( qual < 0 ) {goodTk=
false;}
456 if ( !goodTk)
continue;
460 const vector<TrajectoryMeasurement> &tms = tj.
measurements();
461 vector<TrajectoryMeasurement>::const_iterator itm, endtm;
462 for (itm = tms.begin(), endtm = tms.end(); itm != endtm; ++itm) {
465 process( hit, itm->estimate() );
475 recHit = rphiRecHits->begin(); recHit!= rphiRecHits->end(); recHit++){
478 process(recHit->omniClusterRef(),subdet,
false);
484 recHit = stereoRecHits->begin(); recHit!= stereoRecHits->end(); recHit++){
487 process(recHit->omniClusterRef(),subdet,
false);
497 auto_ptr<edmNew::DetSetVector<SiPixelCluster> > newPixelClusters =
cleanup(*pixelClusters,
pixels,
498 cri->pixelIndices(),
mergeOld_ ? &oldRemovalInfo->pixelIndices() : 0);
501 cri->setNewPixelClusters(newPixels);
504 auto_ptr<edmNew::DetSetVector<SiStripCluster> > newStripClusters =
cleanup(*stripClusters,
strips,
505 cri->stripIndices(),
mergeOld_ ? &oldRemovalInfo->stripIndices() : 0);
508 cri->setNewStripClusters(newStrips);
525 std::auto_ptr<StripMaskContainer> removedStripClusterMask(
529 iEvent.
put( removedStripClusterMask );
531 std::auto_ptr<PixelMaskContainer> removedPixelClusterMask(
534 iEvent.
put( removedPixelClusterMask );
edm::EDGetTokenT< PixelMaskContainer > oldPxlMaskToken_
T getParameter(std::string const &) const
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
size_type dataSize() const
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
static const unsigned int NumberOfParamBlocks
edm::EDGetTokenT< SiStripRecHit2DCollection > stereoRecHitToken_
ParamBlock pblocks_[NumberOfParamBlocks]
std::vector< data_type > DataContainer
friend struct const_iterator
ParamBlock(const edm::ParameterSet &iConfig)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
TrackQuality
track quality
#define DEFINE_FWK_MODULE(type)
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
edm::ContainerMask< edmNew::DetSetVector< SiStripCluster > > StripMaskContainer
bool exists(std::string const ¶meterName) const
checks if a parameter exists
void process(const TrackingRecHit *hit, float chi2)
const char * productInstance
reco::TrackBase::TrackQuality trackQuality_
void readPSet(const edm::ParameterSet &iConfig, const std::string &name, int id1=-1, int id2=-1, int id3=-1, int id4=-1, int id5=-1, int id6=-1)
TrackClusterRemover(const edm::ParameterSet &iConfig)
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
float minGoodStripCharge_
uint32_t rawId() const
get the raw id
DataContainer const & measurements() const
edm::ProductID stripSourceProdID
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
edm::EDGetTokenT< StripMaskContainer > oldStrMaskToken_
int minNumberOfLayersWithMeasBeforeFiltering_
int trackerLayersWithMeasurement() const
ClusterStripRef cluster_strip() const
data_type const * data(size_t cell) const
std::vector< uint8_t > pixels
float minGoodPixelCharge_
edm::EDGetTokenT< SiStripRecHit2DCollection > rphiRecHitToken_
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
std::vector< uint32_t > Indices
bool clusterWasteSolution_
std::string pixelRecHits_
edm::EDGetTokenT< edmNew::DetSetVector< SiStripCluster > > stripClusters_
static TrackQuality qualityByName(const std::string &name)
edm::EDGetTokenT< reco::ClusterRemovalInfo > oldRemovalInfo_
void mergeOld(reco::ClusterRemovalInfo::Indices &refs, const reco::ClusterRemovalInfo::Indices &oldRefs)
std::vector< uint8_t > strips
std::vector< bool > collectedStrips_
bool quality(const TrackQuality) const
Track quality.
edm::EDGetTokenT< edmNew::DetSetVector< SiPixelCluster > > pixelClusters_
void labelsForToken(EDGetToken iToken, Labels &oLabels) const
const_iterator end(bool update=true) const
std::vector< edm::EDGetTokenT< edm::ValueMap< int > > > overrideTrkQuals_
edm::EDGetTokenT< TrajTrackAssociationCollection > trajectories_
std::string stripRecHits_
edm::ProductID pixelSourceProdID
DetId geographicalId() const
volatile std::atomic< bool > shutdown_flag false
const_iterator begin(bool update=true) const
edm::ContainerMask< edmNew::DetSetVector< SiPixelCluster > > PixelMaskContainer
const SiStripRecHit2D & originalHit() const
std::vector< bool > collectedPixels_
std::auto_ptr< edmNew::DetSetVector< T > > cleanup(const edmNew::DetSetVector< T > &oldClusters, const std::vector< uint8_t > &isGood, reco::ClusterRemovalInfo::Indices &refs, const reco::ClusterRemovalInfo::Indices *oldRefs)