diff --git a/Calibration/EcalAlCaRecoProducers/BuildFile.xml b/Calibration/EcalAlCaRecoProducers/BuildFile.xml
index 1b3f61b0137f4..eecb65879fbd9 100644
--- a/Calibration/EcalAlCaRecoProducers/BuildFile.xml
+++ b/Calibration/EcalAlCaRecoProducers/BuildFile.xml
@@ -7,14 +7,3 @@
-# for FED list selector
-
-
-
-
-
-
-
-
-
-
diff --git a/Calibration/EcalAlCaRecoProducers/plugins/BuildFile.xml b/Calibration/EcalAlCaRecoProducers/plugins/BuildFile.xml
index a95c22972d3c1..7908c4f1484a8 100644
--- a/Calibration/EcalAlCaRecoProducers/plugins/BuildFile.xml
+++ b/Calibration/EcalAlCaRecoProducers/plugins/BuildFile.xml
@@ -8,4 +8,13 @@
+# for FED list selector
+
+
+
+
+
+
+
+
diff --git a/Calibration/EcalAlCaRecoProducers/plugins/SelectedElectronFEDListProducer.cc b/Calibration/EcalAlCaRecoProducers/plugins/SelectedElectronFEDListProducer.cc
new file mode 100644
index 0000000000000..8808a05eb4f12
--- /dev/null
+++ b/Calibration/EcalAlCaRecoProducers/plugins/SelectedElectronFEDListProducer.cc
@@ -0,0 +1,674 @@
+#include "Calibration/EcalAlCaRecoProducers/plugins/SelectedElectronFEDListProducer.h"
+
+#include
+#include "HLTrigger/HLTcore/interface/defaultModuleLabel.h"
+
+#include "FWCore/Framework/interface/ESTransientHandle.h"
+
+// common
+//#include "DataFormats/Common/interface/Handle.h"
+
+#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
+#include "FWCore/Utilities/interface/InputTag.h"
+// raw data
+#include "DataFormats/FEDRawData/interface/FEDRawData.h"
+//#include "DataFormats/FEDRawData/interface/FEDNumbering.h"
+
+// Geometry
+#include "Geometry/CaloGeometry/interface/CaloGeometry.h"
+#include "Geometry/EcalMapping/interface/EcalElectronicsMapping.h"
+// strip geometry
+#include "CalibFormats/SiStripObjects/interface/SiStripRegionCabling.h"
+#include "CalibTracker/Records/interface/SiStripRegionCablingRcd.h"
+
+// egamma objects
+#include "DataFormats/EgammaReco/interface/SuperCluster.h"
+#include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
+#include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h"
+#include "DataFormats/RecoCandidate/interface/RecoEcalCandidateFwd.h"
+#include "DataFormats/EgammaCandidates/interface/Electron.h"
+#include "DataFormats/EgammaCandidates/interface/ElectronFwd.h"
+
+// Hcal objects
+#include "CondFormats/HcalObjects/interface/HcalElectronicsMap.h"
+
+// Strip and pixel
+#include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
+#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h"
+
+// detector id
+#include "DataFormats/HcalDetId/interface/HcalDetId.h"
+#include "DataFormats/HcalDetId/interface/HcalElectronicsId.h"
+// Hcal rec hit
+#include "DataFormats/CaloRecHit/interface/CaloRecHit.h"
+#include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
+// Geometry
+#include "Geometry/CaloEventSetup/interface/CaloTopologyRecord.h"
+#include "Geometry/EcalMapping/interface/EcalMappingRcd.h"
+#include "Geometry/EcalAlgo/interface/EcalPreshowerGeometry.h"
+#include "Geometry/Records/interface/CaloGeometryRecord.h"
+#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
+#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
+// strip geometry
+#include "CalibFormats/SiStripObjects/interface/SiStripDetCabling.h"
+#include "CalibTracker/Records/interface/SiStripDetCablingRcd.h"
+// Message logger
+#include "FWCore/MessageLogger/interface/MessageLogger.h"
+// Strip and pixel
+#include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
+#include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h"
+#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h"
+
+// Hcal objects
+#include "CalibFormats/HcalObjects/interface/HcalDbService.h"
+#include "CalibFormats/HcalObjects/interface/HcalDbRecord.h"
+
+
+using namespace std;
+
+/// Producer constructor
+template< typename TEle, typename TCand>
+SelectedElectronFEDListProducer::SelectedElectronFEDListProducer(const edm::ParameterSet & iConfig){
+
+ // input electron collection Tag
+ if(iConfig.existsAs >("electronTags")){
+ electronTags_ = iConfig.getParameter>("electronTags");
+ if(electronTags_.empty())
+ throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] empty electron collection is given --> at least one \n";
+ }
+ else throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] no electron collection are given --> need at least one \n";
+
+ // Consumes for the electron collection
+ LogDebug("SelectedElectronFEDListProducer")<<" Electron Collections"<::const_iterator itEleTag = electronTags_.begin(); itEleTag != electronTags_.end(); ++itEleTag){
+ electronToken_.push_back(consumes(*itEleTag));
+ LogDebug("SelectedElectronFEDListProducer")<<" Ele collection: "<<*(itEleTag)< >("recoEcalCandidateTags")){
+ recoEcalCandidateTags_ = iConfig.getParameter>("recoEcalCandidateTags");
+ if(recoEcalCandidateTags_.empty())
+ throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] empty ecal candidate collections collection is given --> at least one \n";
+ }
+ else throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] no electron reco ecal candidate collection are given --> need at least one \n";
+
+ // Consumes for the recoEcal candidate collection
+ for( std::vector::const_iterator itEcalCandTag = recoEcalCandidateTags_.begin(); itEcalCandTag != recoEcalCandidateTags_.end(); ++itEcalCandTag){
+ recoEcalCandidateToken_.push_back(consumes(*itEcalCandTag));
+ LogDebug("SelectedElectronFEDListProducer")<<" Reco ecal candidate collection: "<<*(itEcalCandTag)<>("isGsfElectronCollection")){
+ isGsfElectronCollection_ = iConfig.getParameter>("isGsfElectronCollection");
+ if(isGsfElectronCollection_.empty())
+ throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] empty electron flag collection --> at least one \n";
+ }
+ else throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] no electron flag are given --> need at least one \n";
+
+ if(isGsfElectronCollection_.size() != electronTags_.size() or isGsfElectronCollection_.size() != recoEcalCandidateTags_.size())
+ throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] electron flag , electron collection and reco ecal cand collection must have the same size ! \n";
+
+ // take the beam spot Tag
+ if(iConfig.existsAs("beamSpot"))
+ beamSpotTag_ = iConfig.getParameter("beamSpot");
+ else beamSpotTag_ = edm::InputTag("hltOnlineBeamSpot");
+
+ if(!(beamSpotTag_ == edm::InputTag(""))) beamSpotToken_ = consumes(beamSpotTag_);
+
+ LogDebug("SelectedElectronFEDListProducer")<<" Beam Spot Tag "<("HBHERecHitTag"))
+ HBHERecHitTag_ = iConfig.getParameter("HBHERecHitTag");
+ else HBHERecHitTag_ = edm::InputTag("hltHbhereco");
+
+ if(!(HBHERecHitTag_ == edm::InputTag(""))) hbheRecHitToken_ = consumes(HBHERecHitTag_);
+
+ // raw data collector label
+ if(iConfig.existsAs("rawDataTag"))
+ rawDataTag_ = iConfig.getParameter("rawDataTag");
+ else rawDataTag_ = edm::InputTag("rawDataCollector") ;
+
+ if(!(rawDataTag_ == edm::InputTag(""))) rawDataToken_ = consumes(rawDataTag_);
+
+ LogDebug("SelectedElectronFEDListProducer")<<" RawDataInput "<>("addThisSelectedFEDs")){
+ addThisSelectedFEDs_ = iConfig.getParameter>("addThisSelectedFEDs");
+ if(addThisSelectedFEDs_.empty())
+ addThisSelectedFEDs_.push_back(-1);
+ }
+ else addThisSelectedFEDs_.push_back(-1);
+
+ std::vector::const_iterator AddFed = addThisSelectedFEDs_.begin();
+ for( ; AddFed !=addThisSelectedFEDs_.end() ; ++AddFed)
+ LogDebug("SelectedElectronFEDListProducer")<<" Additional FED: "<<*(AddFed)<("ESLookupTable"))
+ ESLookupTable_ = iConfig.getParameter("ESLookupTable");
+ else ESLookupTable_ = edm::FileInPath("EventFilter/ESDigiToRaw/data/ES_lookup_table.dat");
+
+ // output model label
+ if(iConfig.existsAs("outputLabelModule"))
+ outputLabelModule_ = iConfig.getParameter("outputLabelModule");
+ else outputLabelModule_ = "streamElectronRawData" ;
+
+ LogDebug("SelectedElectronFEDListProducer")<<" Output Label "<("dRStripRegion"))
+ dRStripRegion_ = iConfig.getParameter("dRStripRegion");
+ else dRStripRegion_ = 0.5 ;
+
+ LogDebug("SelectedElectronFEDListProducer")<<" dRStripRegion "<("dRHcalRegion"))
+ dRHcalRegion_ = iConfig.getParameter("dRHcalRegion");
+ else dRHcalRegion_ = 0.5 ;
+
+ // dPhi, dEta and maxZ for pixel dump
+ if(iConfig.existsAs("dPhiPixelRegion"))
+ dPhiPixelRegion_ = iConfig.getParameter("dPhiPixelRegion");
+ else dPhiPixelRegion_ = 0.5 ;
+
+ if(iConfig.existsAs("dEtaPixelRegion"))
+ dEtaPixelRegion_ = iConfig.getParameter("dEtaPixelRegion");
+ else dEtaPixelRegion_ = 0.5 ;
+
+ if(iConfig.existsAs("maxZPixelRegion"))
+ maxZPixelRegion_ = iConfig.getParameter("maxZPixelRegion");
+ else maxZPixelRegion_ = 24. ;
+
+ LogDebug("SelectedElectronFEDListProducer")<<" dPhiPixelRegion "<("dumpSelectedEcalFed"))
+ dumpSelectedEcalFed_ = iConfig.getParameter< bool >("dumpSelectedEcalFed");
+ else dumpSelectedEcalFed_ = true ;
+
+ if(iConfig.existsAs("dumpSelectedSiStripFed"))
+ dumpSelectedSiStripFed_ = iConfig.getParameter("dumpSelectedSiStripFed");
+ else dumpSelectedSiStripFed_ = true ;
+
+ if(iConfig.existsAs("dumpSelectedSiPixelFed"))
+ dumpSelectedSiPixelFed_ = iConfig.getParameter("dumpSelectedSiPixelFed");
+ else dumpSelectedSiPixelFed_ = true ;
+
+ if(iConfig.existsAs("dumpSelectedHCALFed"))
+ dumpSelectedHCALFed_ = iConfig.getParameter("dumpSelectedHCALFed");
+ else dumpSelectedHCALFed_ = true ;
+
+ LogDebug("SelectedElectronFEDListProducer")<<" DumpEcalFedList set to "<("dumpAllEcalFed"))
+ dumpAllEcalFed_ = iConfig.getParameter("dumpAllEcalFed");
+ else dumpAllEcalFed_ = false ;
+
+ if(iConfig.existsAs("dumpAllTrackerFed"))
+ dumpAllTrackerFed_ = iConfig.getParameter("dumpAllTrackerFed");
+ else dumpAllTrackerFed_ = false ;
+
+ if(iConfig.existsAs("dumpAllHCALFed"))
+ dumpAllHCALFed_ = iConfig.getParameter("dumpAllHCALFed");
+ else dumpAllHCALFed_ = false ;
+
+ LogDebug("SelectedElectronFEDListProducer")<<" DumpAllEcalFed "< look up table
+ for (int i=0; i<2; ++i) for (int j=0; j<2; ++j) for (int k=0 ;k<40; ++k) for (int m=0; m<40; m++) ES_fedId_[i][j][k][m] = -1;
+
+ // read in look-up table
+ int nLines, iz, ip, ix, iy, fed, kchip, pace, bundle, fiber, optorx;
+ std::ifstream ES_file;
+ ES_file.open(ESLookupTable_.fullPath().c_str());
+ LogDebug("SelectedElectronFEDListProducer")<<" Look Up table for ES "<> nLines;
+ for (int i=0; i> iz >> ip >> ix >> iy >> fed >> kchip >> pace >> bundle >> fiber >> optorx ;
+ ES_fedId_[(3-iz)/2-1][ip-1][ix-1][iy-1] = fed;
+ }
+ }
+ else LogDebug("SelectedElectronFEDListProducer")<<" Look up table file can not be found in "<(outputLabelModule_); // produce exit collection
+
+}
+
+template< typename TEle, typename TCand>
+SelectedElectronFEDListProducer::~SelectedElectronFEDListProducer(){
+
+ if(!electronTags_.empty()) electronTags_.clear() ;
+ if(!recoEcalCandidateTags_.empty()) recoEcalCandidateTags_.clear() ;
+ if(!recoEcalCandidateToken_.empty()) recoEcalCandidateToken_.clear();
+ if(!electronToken_.empty()) electronToken_.clear();
+ if(!fedList_.empty()) fedList_.clear() ;
+ if(!RawDataCollection_) delete RawDataCollection_ ;
+}
+
+template< typename TEle, typename TCand>
+void SelectedElectronFEDListProducer::beginJob(){
+ eventCounter_ = 0 ;
+ LogDebug("SelectedElectronFEDListProducer")<<" Begin of the Job : event counter set to"<
+void SelectedElectronFEDListProducer::produce(edm::Event & iEvent, const edm::EventSetup & iSetup){
+
+ if(!fedList_.empty()) fedList_.clear();
+ if(!RawDataCollection_) delete RawDataCollection_ ;
+
+ // Build FED strip map --> just one time
+ // Retrieve FED ids from cabling map and iterate through
+ SiStripRegionCabling::Cabling cabling_ ;
+
+ if(eventCounter_ ==0 ){
+
+ // get the hcal electronics map
+ edm::ESHandle pSetup;
+ iSetup.get().get(pSetup);
+ hcalReadoutMap_ = pSetup->getHcalMapping();
+
+
+ // get the ecal electronics map
+ edm::ESHandle ecalmapping;
+ iSetup.get().get(ecalmapping);
+ TheMapping_ = ecalmapping.product();
+
+ // get the calo geometry
+ edm::ESHandle caloGeometry;
+ iSetup.get().get(caloGeometry);
+ geometry_ = caloGeometry.product();
+
+ //ES geometry
+ geometryES_ = caloGeometry->getSubdetectorGeometry(DetId::Ecal,EcalPreshower);
+
+ // pixel tracker cabling map
+ edm::ESTransientHandle pixelCablingMap;
+ iSetup.get().get(pixelCablingMap);
+
+ PixelCabling_.reset();
+ PixelCabling_ = pixelCablingMap->cablingTree();
+
+ edm::ESHandle trackerGeometry;
+ iSetup.get().get( trackerGeometry );
+
+ if(!pixelModuleVector_.empty()) pixelModuleVector_.clear();
+
+ // build the tracker pixel module map
+ std::vector::const_iterator itTracker = trackerGeometry->dets().begin();
+ for( ; itTracker !=trackerGeometry->dets().end() ; ++itTracker){
+ int subdet = (*itTracker)->geographicalId().subdetId();
+ if(! (subdet == PixelSubdetector::PixelBarrel || subdet == PixelSubdetector::PixelEndcap) ) continue;
+ PixelModule module ;
+ module.x = (*itTracker)->position().x();
+ module.y = (*itTracker)->position().y();
+ module.z = (*itTracker)->position().z();
+ module.Phi = normalizedPhi((*itTracker)->position().phi()) ;
+ module.Eta = (*itTracker)->position().eta() ;
+ module.DetId = (*itTracker)->geographicalId().rawId();
+ const std::vector path2det = PixelCabling_->pathToDetUnit(module.DetId);
+ module.Fed = path2det[0].fed;
+ assert(module.Fed<40);
+ pixelModuleVector_.push_back(module);
+ }
+ std::sort(pixelModuleVector_.begin(),pixelModuleVector_.end());
+
+ edm::ESHandle SiStripCabling ;
+ iSetup.get().get(SiStripCabling);
+ StripRegionCabling_ = SiStripCabling.product();
+
+ cabling_ = StripRegionCabling_->getRegionCabling();
+ regionDimension_ = StripRegionCabling_->regionDimensions();
+ }
+
+ // event by event analysis
+
+ // Get event raw data
+ edm::Handle rawdata;
+ if(!(rawDataTag_ == edm::InputTag(""))) iEvent.getByToken(rawDataToken_,rawdata);
+
+ // take the beam spot position
+ edm::Handle beamSpot;
+ if(!(beamSpotTag_ == edm::InputTag(""))) iEvent.getByToken(beamSpotToken_, beamSpot);
+ if(!beamSpot.failedToGet()) beamSpotPosition_ = beamSpot->position();
+ else beamSpotPosition_.SetXYZ(0,0,0);
+
+ // take the calo tower collection
+ edm::Handle hbheRecHitHandle;
+ if(!(HBHERecHitTag_ == edm::InputTag(""))) iEvent.getByToken(hbheRecHitToken_,hbheRecHitHandle);
+ const HBHERecHitCollection* hcalRecHitCollection = NULL;
+ if(!hbheRecHitHandle.failedToGet()) hcalRecHitCollection = hbheRecHitHandle.product();
+
+ double radTodeg = 180. / Geom::pi();
+
+ if(dumpAllEcalFed_){
+ for(uint32_t iEcalFed = FEDNumbering::MINECALFEDID ; iEcalFed <= FEDNumbering::MAXECALFEDID ; iEcalFed++)
+ fedList_.push_back(iEcalFed);
+ for(uint32_t iESFed = FEDNumbering::MINPreShowerFEDID ; iESFed <= FEDNumbering::MAXPreShowerFEDID ; iESFed++)
+ fedList_.push_back(iESFed);
+ }
+
+ if(dumpAllTrackerFed_){
+ for(uint32_t iPixelFed = FEDNumbering::MINSiPixelFEDID; iPixelFed <= FEDNumbering::MAXSiPixelFEDID ; iPixelFed++)
+ fedList_.push_back(iPixelFed);
+ for(uint32_t iStripFed = FEDNumbering::MINSiStripFEDID; iStripFed <= FEDNumbering::MAXSiStripFEDID ; iStripFed++)
+ fedList_.push_back(iStripFed);
+ }
+
+ if(dumpAllHCALFed_){
+ for(uint32_t iHcalFed = FEDNumbering::MINHCALFEDID ; iHcalFed <= FEDNumbering::MAXHCALFEDID; iHcalFed++)
+ fedList_.push_back(iHcalFed);
+ }
+
+
+ // loop on the input electron collection vector
+ TEle electron ;
+ edm::Ref recoEcalCand ;
+ edm::Handle electrons;
+ edm::Handle triggerRecoEcalCandidateCollection;
+ std::vector> recoEcalCandColl;
+
+ // iterator to electron and ecal candidate collections
+ typename std::vector >::const_iterator itElectronColl = electronToken_.begin();
+ std::vector::const_iterator itElectronCollFlag = isGsfElectronCollection_.begin();
+ std::vector >::const_iterator itRecoEcalCandColl = recoEcalCandidateToken_.begin();
+
+ // if you want to dump just FED related to the triggering electron/s
+ if( !dumpAllTrackerFed_ || !dumpAllEcalFed_ ){
+
+ // loop on the same time on ecal candidate and elctron collection and boolean for Gsf ones
+ for( ; itRecoEcalCandColl != recoEcalCandidateToken_.end() and itElectronColl != electronToken_.end() and itElectronCollFlag != isGsfElectronCollection_.end();
+ ++itElectronColl , ++itElectronCollFlag, ++itRecoEcalCandColl){
+
+ // get ecal candidate collection
+ try { iEvent.getByToken(*itRecoEcalCandColl,triggerRecoEcalCandidateCollection);
+ if(triggerRecoEcalCandidateCollection.failedToGet()) continue ;
+ }
+ catch (cms::Exception &exception){ continue; }
+
+ // get gsf electron collection
+ try { iEvent.getByToken(*itElectronColl,electrons);
+ if(electrons.failedToGet()) continue ;
+ }
+ catch (cms::Exception &exception){ continue; }
+
+ triggerRecoEcalCandidateCollection->getObjects(trigger::TriggerCluster, recoEcalCandColl);
+ if(recoEcalCandColl.empty()) triggerRecoEcalCandidateCollection->getObjects(trigger::TriggerPhoton, recoEcalCandColl);
+ if(recoEcalCandColl.empty()) triggerRecoEcalCandidateCollection->getObjects(trigger::TriggerElectron, recoEcalCandColl);
+
+ typename std::vector>::const_iterator itRecoEcalCand = recoEcalCandColl.begin(); // loop on recoEcalCandidate objects
+
+ // loop on the recoEcalCandidates
+ for( ; itRecoEcalCand != recoEcalCandColl.end() ; ++itRecoEcalCand){
+ recoEcalCand = (*itRecoEcalCand);
+ reco::SuperClusterRef scRefRecoEcalCand = recoEcalCand->superCluster(); // take the supercluster in order to match with electron objects
+
+ typename TEleColl::const_iterator itEle = electrons->begin();
+ for( ; itEle!=electrons->end() ; ++itEle){ // loop on all the electrons inside a collection
+ // get electron supercluster and the associated hit -> detID
+ electron = (*itEle);
+ reco::SuperClusterRef scRef = electron.superCluster();
+ if ( scRefRecoEcalCand != scRef ) continue ; // mathching
+
+ const std::vector >& hits = scRef->hitsAndFractions();
+ // start in dump the ecal FED associated to the electron
+ std::vector >::const_iterator itSChits = hits.begin();
+ if(!dumpAllEcalFed_){
+ for( ; itSChits!=hits.end() ; ++itSChits){
+ if((*itSChits).first.subdetId()== EcalBarrel){ // barrel part
+ EBDetId idEBRaw ((*itSChits).first);
+ GlobalPoint point = geometry_->getPosition(idEBRaw);
+ int hitFED = FEDNumbering::MINECALFEDID + TheMapping_->GetFED(double(point.eta()),double(point.phi())*radTodeg);
+ if( hitFED < FEDNumbering::MINECALFEDID || hitFED > FEDNumbering::MAXECALFEDID ) continue;
+
+ LogDebug("SelectedElectronFEDListProducer")<<" electron hit detID Barrel "<<(*itSChits).first.rawId()<<" eta "<getPosition(idEERaw);
+ int hitFED = FEDNumbering::MINECALFEDID + TheMapping_->GetFED(double(point.eta()),double(point.phi())*radTodeg);
+ if( hitFED < FEDNumbering::MINECALFEDID || hitFED > FEDNumbering::MAXECALFEDID ) continue;
+
+ LogDebug("SelectedElectronFEDListProducer")<<" electron hit detID Endcap "<<(*itSChits).first.rawId()<<" eta "<(geometryES_))->getClosestCellInPlane(point,1);
+ ESDetId stripX = (tmpX == DetId(0)) ? ESDetId(0) : ESDetId(tmpX);
+ int hitFED = ES_fedId_[(3-stripX.zside())/2-1][stripX.plane()-1][stripX.six()-1][stripX.siy()-1];
+ LogDebug("SelectedElectronFEDListProducer")<<" ES hit plane X (deiID) "< FEDNumbering::MAXPreShowerFEDID) continue;
+ if(hitFED < 0) continue;
+ if(!fedList_.empty()){
+ if(std::find(fedList_.begin(),fedList_.end(),hitFED)==fedList_.end()) fedList_.push_back(hitFED);
+ }
+ else fedList_.push_back(hitFED);
+
+ DetId tmpY = (dynamic_cast(geometryES_))->getClosestCellInPlane(point,2);
+ ESDetId stripY = (tmpY == DetId(0)) ? ESDetId(0) : ESDetId(tmpY);
+ hitFED = ES_fedId_[(3-stripY.zside())/2-1][stripY.plane()-1][stripY.six()-1][stripY.siy()-1];
+ if(hitFED < FEDNumbering::MINPreShowerFEDID || hitFED > FEDNumbering::MAXPreShowerFEDID) continue;
+ LogDebug("SelectedElectronFEDListProducer")<<" ES hit plane Y (deiID) "<begin();
+ for( ; itHcalRecHit != hcalRecHitCollection->end() ; ++itHcalRecHit) {
+ HcalDetId recHitId(itHcalRecHit->id());
+ const CaloCellGeometry* cellGeometry = geometry_->getSubdetectorGeometry(recHitId)->getGeometry(recHitId);
+ float dR = reco::deltaR(scRef->eta(),scRef->phi(),cellGeometry->getPosition().eta(),cellGeometry->getPosition().phi());
+ if(dR <= dRHcalRegion_) {
+ const HcalElectronicsId electronicId = hcalReadoutMap_->lookup(recHitId);
+ int hitFED = electronicId.dccid() + FEDNumbering::MINHCALFEDID;
+ LogDebug("SelectedElectronFEDListProducer")<< " matched hcal recHit : HcalDetId "< FEDNumbering::MAXHCALFEDID)
+ continue; //first eighteen feds are for HBHE
+ if(hitFED < 0)
+ continue;
+ if(!fedList_.empty()) {
+ if(std::find(fedList_.begin(), fedList_.end(), hitFED) == fedList_.end())
+ fedList_.push_back(hitFED);
+ }
+ else
+ fedList_.push_back(hitFED);
+ }
+ }
+ } // End Hcal
+ }// End Ecal
+
+ // get the electron track
+ if( !dumpAllTrackerFed_ ){
+ //loop on the region
+ if(dumpSelectedSiStripFed_){
+ double eta ;
+ double phi ;
+ if(*itElectronCollFlag){
+ eta = electron.gsfTrack()->eta();
+ phi = electron.gsfTrack()->phi();
+ }
+ else{
+ eta = electron.track()->eta();
+ phi = electron.track()->phi();
+ }
+ for(uint32_t iCabling = 0; iCabling < cabling_.size(); iCabling++){
+ SiStripRegionCabling::Position pos = StripRegionCabling_->position(iCabling);
+ double dphi=fabs(pos.second-phi);
+ if (dphi>acos(-1)) dphi=2*acos(-1)-dphi;
+ double R = sqrt(pow(pos.first-eta,2)+dphi*dphi);
+ if (R-sqrt(pow(regionDimension_.first/2,2)+pow(regionDimension_.second/2,2))>dRStripRegion_) continue;
+ //get vector of subdets within region
+ const SiStripRegionCabling::RegionCabling regSubdets = cabling_[iCabling];
+ //cycle on subdets
+ for (uint32_t idet=0; idetsecond).size(); op++){
+ int hitFED = (itFedMap->second)[op].fedId();
+ if(hitFED < FEDNumbering::MINSiStripFEDID || hitFED > FEDNumbering::MAXSiStripFEDID) continue;
+ LogDebug("SelectedElectronFEDListProducer")<<" SiStrip (FedID) "<momentum();
+ else momentum = electron.track()->momentum();
+ PixelRegion region (momentum,dPhiPixelRegion_,dEtaPixelRegion_,maxZPixelRegion_);
+
+ PixelModule lowerBound (normalizedPhi(region.vector.phi())-region.dPhi, region.vector.eta()-region.dEta);
+ PixelModule upperBound (normalizedPhi(region.vector.phi())+region.dPhi, region.vector.eta()+region.dEta);
+
+ std::vector::const_iterator itUp, itDn ;
+ if(lowerBound.Phi >= -M_PI && upperBound.Phi <= M_PI ){
+ itDn = std::lower_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),lowerBound);
+ itUp = std::upper_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),upperBound);
+ pixelFedDump(itDn,itUp,region);
+ }
+ else{
+ if(lowerBound.Phi < -M_PI) lowerBound.Phi = lowerBound.Phi+2*M_PI;
+ PixelModule phi_p(M_PI,region.vector.eta()-region.dEta);
+ itDn = std::lower_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),lowerBound);
+ itUp = std::upper_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),phi_p);
+ pixelFedDump(itDn,itUp,region);
+
+ if(upperBound.Phi < -M_PI) upperBound.Phi = upperBound.Phi-2*M_PI;
+ PixelModule phi_m(-M_PI,region.vector.eta()-region.dEta);
+ itDn = std::lower_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),phi_m);
+ itUp = std::upper_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),upperBound);
+ pixelFedDump(itDn,itUp,region);
+ }
+ }
+ }// end tracker analysis
+ }// end loop on the electron candidate
+ } // end loop on the electron collection collection
+ } // end loop on the recoEcal candidate
+ } // end loop on the recoEcal candidate collection
+
+ // add a set of chosen FED
+ for( unsigned int iFed = 0 ; iFed < addThisSelectedFEDs_.size() ; iFed++){
+ if(addThisSelectedFEDs_.at(iFed) == -1 ) continue ;
+ fedList_.push_back(addThisSelectedFEDs_.at(iFed));
+ }
+
+ // make the final raw data collection
+ RawDataCollection_ = new FEDRawDataCollection();
+ std::sort(fedList_.begin(),fedList_.end());
+ std::vector::const_iterator itfedList = fedList_.begin();
+ for( ; itfedList!=fedList_.end() ; ++itfedList){
+ LogDebug("SelectedElectronFEDListProducer")<<" fed point "<<*itfedList<<" ";
+ const FEDRawData& data = rawdata->FEDData(*itfedList);
+ if(data.size()>0){
+ FEDRawData& fedData = RawDataCollection_->FEDData(*itfedList);
+ fedData.resize(data.size());
+ memcpy(fedData.data(),data.data(),data.size());
+ }
+ }
+
+ std::auto_ptr streamFEDRawProduct(RawDataCollection_);
+ iEvent.put(streamFEDRawProduct,outputLabelModule_);
+ eventCounter_ ++ ;
+}
+
+
+template< typename TEle, typename TCand>
+void SelectedElectronFEDListProducer::endJob(){
+ LogDebug("SelectedElectronFEDListProducer")<<" End of the Job : Counted Events "<
+void SelectedElectronFEDListProducer::pixelFedDump( std::vector::const_iterator & itDn,
+ std::vector::const_iterator & itUp,
+ const PixelRegion & region){
+
+ for( ; itDn != itUp ; ++itDn){
+ float zmodule = itDn->z-((itDn->x-beamSpotPosition_.x())*region.cosphi+(itDn->y-beamSpotPosition_.y())*region.sinphi)*region.atantheta;
+ if ( std::abs(zmodule) > region.maxZ ) continue;
+ int hitFED = itDn->Fed;
+ if(hitFED < FEDNumbering::MINSiPixelFEDID || hitFED > FEDNumbering::MAXSiPixelFEDID) continue;
+ LogDebug("SelectedElectronFEDListProducer")<<" electron pixel hit "<DetId<<" hitFED "<
+void SelectedElectronFEDListProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
+ edm::ParameterSetDescription desc;
+ desc.add>("electronTags",{edm::InputTag("hltEgammaGsfElectrons")});
+ desc.add>("recoEcalCandidateTags",{edm::InputTag("hltL1EG25Ele27WP85GsfTrackIsoFilter")});
+ desc.add("ESLookupTable",edm::FileInPath("EventFilter/ESDigiToRaw/data/ES_lookup_table.dat"));
+ desc.add("HBHERecHitTag",edm::InputTag("hltHbhereco"));
+ desc.add("beamSpotTag",edm::InputTag("hltOnlineBeamSpot"));
+ desc.add("rawDataTag",edm::InputTag("rawDataCollector"));
+ desc.add>("addThisSelectedFEDs",{812,813});
+ desc.add>("isGsfElectronCollection",{true});
+ desc.add("outputLabelModule","StreamElectronRawFed");
+ desc.add("dumpSelectedSiPixelFed",true);
+ desc.add("dumpSelectedSiStripFed",true);
+ desc.add("dumpSelectedEcalFed",true);
+ desc.add("dumpSelectedHCALFed",true);
+ desc.add("dPhiPixelRegion",0.3);
+ desc.add("dEtaPixelRegion",0.3);
+ desc.add("dRStripRegion",0.3);
+ desc.add("dRHcalRegion",0.3);
+ desc.add("maxZPixelRegion",24);
+ desc.add("dumpAllTrackerFed",false);
+ desc.add("dumpAllEcalFed",false);
+ desc.add("dumpAllHcalFed",false);
+
+ descriptions.add(defaultModuleLabel>(),desc);
+}
+
+
+#include "FWCore/PluginManager/interface/ModuleDef.h"
+#include "FWCore/Framework/interface/MakerMacros.h"
+typedef SelectedElectronFEDListProducer SelectedElectronFEDListProducerGsf ;
+DEFINE_FWK_MODULE(SelectedElectronFEDListProducerGsf);
+
diff --git a/Calibration/EcalAlCaRecoProducers/interface/SelectedElectronFEDListProducer.h b/Calibration/EcalAlCaRecoProducers/plugins/SelectedElectronFEDListProducer.h
similarity index 50%
rename from Calibration/EcalAlCaRecoProducers/interface/SelectedElectronFEDListProducer.h
rename to Calibration/EcalAlCaRecoProducers/plugins/SelectedElectronFEDListProducer.h
index 66f422ddc573f..8ae4a223f1e27 100644
--- a/Calibration/EcalAlCaRecoProducers/interface/SelectedElectronFEDListProducer.h
+++ b/Calibration/EcalAlCaRecoProducers/plugins/SelectedElectronFEDListProducer.h
@@ -1,98 +1,37 @@
#ifndef SelectedElectronFEDListProducer_h
#define SelectedFEDListProducer_h
-#include
-#include
-#include
-#include
-#include
-#include "TLorentzVector.h"
-#include "TVector3.h"
-#include
-#include
-#include
-
-// common
-#include "DataFormats/Common/interface/Handle.h"
+#include "DataFormats/BeamSpot/interface/BeamSpot.h"
// egamma objects
-#include "DataFormats/EgammaReco/interface/SuperCluster.h"
-#include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
-#include "DataFormats/EgammaReco/interface/PreshowerCluster.h"
-#include "DataFormats/EgammaReco/interface/PreshowerClusterFwd.h"
-#include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h"
-#include "DataFormats/RecoCandidate/interface/RecoEcalCandidateFwd.h"
-#include "DataFormats/EgammaCandidates/interface/Electron.h"
-#include "DataFormats/EgammaCandidates/interface/ElectronFwd.h"
-#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
-#include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
#include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
-// raw data
-#include "DataFormats/FEDRawData/interface/FEDRawData.h"
-#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
-#include "DataFormats/FEDRawData/interface/FEDNumbering.h"
-// detector id
-#include "DataFormats/HcalDetId/interface/HcalDetId.h"
-#include "DataFormats/HcalDetId/interface/HcalElectronicsId.h"
-#include "DataFormats/SiStripDetId/interface/SiStripDetId.h"
+
+
// Math
#include "DataFormats/Math/interface/normalizedPhi.h"
-// Hcal rec hit
-#include "DataFormats/ParticleFlowReco/interface/PFRecHit.h"
-#include "DataFormats/ParticleFlowReco/interface/PFRecHitFwd.h"
-#include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
-#include "DataFormats/CaloRecHit/interface/CaloRecHit.h"
-#include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
-// Geometry
-#include "Geometry/CaloGeometry/interface/CaloGeometry.h"
-#include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
-#include "Geometry/CaloEventSetup/interface/CaloTopologyRecord.h"
-#include "Geometry/EcalMapping/interface/EcalElectronicsMapping.h"
-#include "Geometry/EcalMapping/interface/EcalMappingRcd.h"
-#include "Geometry/EcalAlgo/interface/EcalPreshowerGeometry.h"
-#include "Geometry/Records/interface/IdealGeometryRecord.h"
-#include "Geometry/Records/interface/CaloGeometryRecord.h"
-#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
-#include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h"
-#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
-// strip geometry
-#include "CalibFormats/SiStripObjects/interface/SiStripRegionCabling.h"
-#include "CalibFormats/SiStripObjects/interface/SiStripDetCabling.h"
-#include "CalibTracker/Records/interface/SiStripDetCablingRcd.h"
-#include "CalibTracker/Records/interface/SiStripRegionCablingRcd.h"
-// FW core
-#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
-#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
-#include "FWCore/Utilities/interface/InputTag.h"
-#include "FWCore/Framework/interface/Event.h"
+
#include "FWCore/Framework/interface/EDProducer.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/ESHandle.h"
-#include "FWCore/Framework/interface/ESTransientHandle.h"
// Message logger
-#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ServiceRegistry/interface/Service.h"
-// Strip and pixel
-#include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
-#include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
-#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h"
-#include "CondFormats/SiPixelObjects/interface/SiPixelFedCabling.h"
-#include "CondFormats/SiPixelObjects/interface/CablingPathToDetUnit.h"
-#include "CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h"
-#include "CondFormats/SiPixelObjects/interface/GlobalPixel.h"
-#include "CondFormats/SiPixelObjects/interface/LocalPixel.h"
-#include "CondFormats/SiPixelObjects/interface/ElectronicIndex.h"
-#include "CondFormats/SiPixelObjects/interface/DetectorIndex.h"
-#include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h"
-#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h"
-
-// Hcal objects
-#include "CondFormats/HcalObjects/interface/HcalChannelQuality.h"
-#include "CondFormats/DataRecord/interface/HcalChannelQualityRcd.h"
-#include "CondFormats/HcalObjects/interface/HcalElectronicsMap.h"
-#include "CalibFormats/HcalObjects/interface/HcalDbService.h"
-#include "CalibFormats/HcalObjects/interface/HcalDbRecord.h"
-
-using namespace std;
+
+class InputTag;
+
+class FEDRawDataCollection;
+
+class SiPixelFedCablingMap;
+class SiPixelFedCablingTree;
+class SiStripFedCabling;
+class SiStripRegionCabling;
+
+class CaloGeometry;
+class CaloSubdetectorGeometry;
+class EcalElectronicsMapping;
+class HcalElectronicsMap;
+
+// Hcal rec hit: this is a Fwd file defining typedefs
+#include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
+
// Pixel region class
class PixelRegion {
@@ -224,7 +163,6 @@ class SelectedElectronFEDListProducer : public edm::EDProducer {
// get strip geometry and electronic map
const SiStripRegionCabling* StripRegionCabling_;
- SiStripRegionCabling::Cabling cabling_ ;
std::pair regionDimension_ ;
// get hcal geometry and electronic map
diff --git a/Calibration/EcalAlCaRecoProducers/src/SelectedElectronFEDListProducer.cc b/Calibration/EcalAlCaRecoProducers/src/SelectedElectronFEDListProducer.cc
deleted file mode 100644
index a168a05fd3199..0000000000000
--- a/Calibration/EcalAlCaRecoProducers/src/SelectedElectronFEDListProducer.cc
+++ /dev/null
@@ -1,605 +0,0 @@
-#include "Calibration/EcalAlCaRecoProducers/interface/SelectedElectronFEDListProducer.h"
-#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
-#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
-#include "HLTrigger/HLTcore/interface/defaultModuleLabel.h"
-
-/// Producer constructor
-template< typename TEle, typename TCand>
-SelectedElectronFEDListProducer::SelectedElectronFEDListProducer(const edm::ParameterSet & iConfig){
-
- // input electron collection Tag
- if(iConfig.existsAs >("electronTags")){
- electronTags_ = iConfig.getParameter>("electronTags");
- if(electronTags_.empty())
- throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] empty electron collection is given --> at least one \n";
- }
- else throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] no electron collection are given --> need at least one \n";
-
- // Consumes for the electron collection
- LogDebug("SelectedElectronFEDListProducer")<<" Electron Collections"<::const_iterator itEleTag = electronTags_.begin(); itEleTag != electronTags_.end(); ++itEleTag){
- electronToken_.push_back(consumes(*itEleTag));
- LogDebug("SelectedElectronFEDListProducer")<<" Ele collection: "<<*(itEleTag)< >("recoEcalCandidateTags")){
- recoEcalCandidateTags_ = iConfig.getParameter>("recoEcalCandidateTags");
- if(recoEcalCandidateTags_.empty())
- throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] empty ecal candidate collections collection is given --> at least one \n";
- }
- else throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] no electron reco ecal candidate collection are given --> need at least one \n";
-
- // Consumes for the recoEcal candidate collection
- for( std::vector::const_iterator itEcalCandTag = recoEcalCandidateTags_.begin(); itEcalCandTag != recoEcalCandidateTags_.end(); ++itEcalCandTag){
- recoEcalCandidateToken_.push_back(consumes(*itEcalCandTag));
- LogDebug("SelectedElectronFEDListProducer")<<" Reco ecal candidate collection: "<<*(itEcalCandTag)<>("isGsfElectronCollection")){
- isGsfElectronCollection_ = iConfig.getParameter>("isGsfElectronCollection");
- if(isGsfElectronCollection_.empty())
- throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] empty electron flag collection --> at least one \n";
- }
- else throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] no electron flag are given --> need at least one \n";
-
- if(isGsfElectronCollection_.size() < electronTags_.size())
- throw cms::Exception("Configuration")<<"[SelectedElectronFEDListProducer] electron flag < electron collection --> need at equal number to understand which are Gsf and which not \n";
-
- // take the beam spot Tag
- if(iConfig.existsAs("beamSpot"))
- beamSpotTag_ = iConfig.getParameter("beamSpot");
- else beamSpotTag_ = edm::InputTag("hltOnlineBeamSpot");
-
- if(!(beamSpotTag_ == edm::InputTag(""))) beamSpotToken_ = consumes(beamSpotTag_);
-
- LogDebug("SelectedElectronFEDListProducer")<<" Beam Spot Tag "<("HBHERecHitTag"))
- HBHERecHitTag_ = iConfig.getParameter("HBHERecHitTag");
- else HBHERecHitTag_ = edm::InputTag("hltHbhereco");
-
- if(!(HBHERecHitTag_ == edm::InputTag(""))) hbheRecHitToken_ = consumes(HBHERecHitTag_);
-
- // raw data collector label
- if(iConfig.existsAs("rawDataTag"))
- rawDataTag_ = iConfig.getParameter("rawDataTag");
- else rawDataTag_ = edm::InputTag("rawDataCollector") ;
-
- if(!(rawDataTag_ == edm::InputTag(""))) rawDataToken_ = consumes(rawDataTag_);
-
- LogDebug("SelectedElectronFEDListProducer")<<" RawDataInput "<>("addThisSelectedFEDs")){
- addThisSelectedFEDs_ = iConfig.getParameter>("addThisSelectedFEDs");
- if(addThisSelectedFEDs_.empty())
- addThisSelectedFEDs_.push_back(-1);
- }
- else addThisSelectedFEDs_.push_back(-1);
-
- std::vector::const_iterator AddFed = addThisSelectedFEDs_.begin();
- for( ; AddFed !=addThisSelectedFEDs_.end() ; ++AddFed)
- LogDebug("SelectedElectronFEDListProducer")<<" Additional FED: "<<*(AddFed)<("ESLookupTable"))
- ESLookupTable_ = iConfig.getParameter("ESLookupTable");
- else ESLookupTable_ = edm::FileInPath("EventFilter/ESDigiToRaw/data/ES_lookup_table.dat");
-
- // output model label
- if(iConfig.existsAs("outputLabelModule"))
- outputLabelModule_ = iConfig.getParameter("outputLabelModule");
- else outputLabelModule_ = "streamElectronRawData" ;
-
- LogDebug("SelectedElectronFEDListProducer")<<" Output Label "<("dRStripRegion"))
- dRStripRegion_ = iConfig.getParameter("dRStripRegion");
- else dRStripRegion_ = 0.5 ;
-
- LogDebug("SelectedElectronFEDListProducer")<<" dRStripRegion "<("dRHcalRegion"))
- dRHcalRegion_ = iConfig.getParameter("dRHcalRegion");
- else dRHcalRegion_ = 0.5 ;
-
- // dPhi, dEta and maxZ for pixel dump
- if(iConfig.existsAs("dPhiPixelRegion"))
- dPhiPixelRegion_ = iConfig.getParameter("dPhiPixelRegion");
- else dPhiPixelRegion_ = 0.5 ;
-
- if(iConfig.existsAs("dEtaPixelRegion"))
- dEtaPixelRegion_ = iConfig.getParameter("dEtaPixelRegion");
- else dEtaPixelRegion_ = 0.5 ;
-
- if(iConfig.existsAs("maxZPixelRegion"))
- maxZPixelRegion_ = iConfig.getParameter("maxZPixelRegion");
- else maxZPixelRegion_ = 24. ;
-
- LogDebug("SelectedElectronFEDListProducer")<<" dPhiPixelRegion "<("dumpSelectedEcalFed"))
- dumpSelectedEcalFed_ = iConfig.getParameter< bool >("dumpSelectedEcalFed");
- else dumpSelectedEcalFed_ = true ;
-
- if(iConfig.existsAs("dumpSelectedSiStripFed"))
- dumpSelectedSiStripFed_ = iConfig.getParameter("dumpSelectedSiStripFed");
- else dumpSelectedSiStripFed_ = true ;
-
- if(iConfig.existsAs("dumpSelectedSiPixelFed"))
- dumpSelectedSiPixelFed_ = iConfig.getParameter("dumpSelectedSiPixelFed");
- else dumpSelectedSiPixelFed_ = true ;
-
- if(iConfig.existsAs("dumpSelectedHCALFed"))
- dumpSelectedHCALFed_ = iConfig.getParameter("dumpSelectedHCALFed");
- else dumpSelectedHCALFed_ = true ;
-
- LogDebug("SelectedElectronFEDListProducer")<<" DumpEcalFedList set to "<("dumpAllEcalFed"))
- dumpAllEcalFed_ = iConfig.getParameter("dumpAllEcalFed");
- else dumpAllEcalFed_ = false ;
-
- if(iConfig.existsAs("dumpAllTrackerFed"))
- dumpAllTrackerFed_ = iConfig.getParameter("dumpAllTrackerFed");
- else dumpAllTrackerFed_ = false ;
-
- if(iConfig.existsAs("dumpAllHCALFed"))
- dumpAllHCALFed_ = iConfig.getParameter("dumpAllHCALFed");
- else dumpAllHCALFed_ = false ;
-
- LogDebug("SelectedElectronFEDListProducer")<<" DumpAllEcalFed "< look up table
- for (int i=0; i<2; ++i) for (int j=0; j<2; ++j) for (int k=0 ;k<40; ++k) for (int m=0; m<40; m++) ES_fedId_[i][j][k][m] = -1;
-
- // read in look-up table
- int nLines, iz, ip, ix, iy, fed, kchip, pace, bundle, fiber, optorx;
- std::ifstream ES_file;
- ES_file.open(ESLookupTable_.fullPath().c_str());
- LogDebug("SelectedElectronFEDListProducer")<<" Look Up table for ES "<> nLines;
- for (int i=0; i> iz >> ip >> ix >> iy >> fed >> kchip >> pace >> bundle >> fiber >> optorx ;
- ES_fedId_[(3-iz)/2-1][ip-1][ix-1][iy-1] = fed;
- }
- }
- else LogDebug("SelectedElectronFEDListProducer")<<" Look up table file can not be found in "<(outputLabelModule_); // produce exit collection
-
-}
-
-template< typename TEle, typename TCand>
-SelectedElectronFEDListProducer::~SelectedElectronFEDListProducer(){
-
- if(!electronTags_.empty()) electronTags_.clear() ;
- if(!recoEcalCandidateTags_.empty()) recoEcalCandidateTags_.clear() ;
- if(!recoEcalCandidateToken_.empty()) recoEcalCandidateToken_.clear();
- if(!electronToken_.empty()) electronToken_.clear();
- if(!fedList_.empty()) fedList_.clear() ;
- if(!RawDataCollection_) delete RawDataCollection_ ;
-}
-
-template< typename TEle, typename TCand>
-void SelectedElectronFEDListProducer::beginJob(){
- eventCounter_ = 0 ;
- LogDebug("SelectedElectronFEDListProducer")<<" Begin of the Job : event counter set to"<
-void SelectedElectronFEDListProducer::produce(edm::Event & iEvent, const edm::EventSetup & iSetup){
-
- if(!fedList_.empty()) fedList_.clear();
- if(!RawDataCollection_) delete RawDataCollection_ ;
-
- // Build FED strip map --> just one time
- // Retrieve FED ids from cabling map and iterate through
-
- if(eventCounter_ ==0 ){
-
- // get the hcal electronics map
- edm::ESHandle pSetup;
- iSetup.get().get(pSetup);
- hcalReadoutMap_ = pSetup->getHcalMapping();
-
-
- // get the ecal electronics map
- edm::ESHandle ecalmapping;
- iSetup.get().get(ecalmapping);
- TheMapping_ = ecalmapping.product();
-
- // get the calo geometry
- edm::ESHandle caloGeometry;
- iSetup.get().get(caloGeometry);
- geometry_ = caloGeometry.product();
-
- //ES geometry
- geometryES_ = caloGeometry->getSubdetectorGeometry(DetId::Ecal,EcalPreshower);
-
- // pixel tracker cabling map
- edm::ESTransientHandle pixelCablingMap;
- iSetup.get().get(pixelCablingMap);
-
- PixelCabling_.reset();
- PixelCabling_ = pixelCablingMap->cablingTree();
-
- edm::ESHandle trackerGeometry;
- iSetup.get().get( trackerGeometry );
-
- if(!pixelModuleVector_.empty()) pixelModuleVector_.clear();
-
- // build the tracker pixel module map
- std::vector::const_iterator itTracker = trackerGeometry->dets().begin();
- for( ; itTracker !=trackerGeometry->dets().end() ; ++itTracker){
- int subdet = (*itTracker)->geographicalId().subdetId();
- if(! (subdet == PixelSubdetector::PixelBarrel || subdet == PixelSubdetector::PixelEndcap) ) continue;
- PixelModule module ;
- module.x = (*itTracker)->position().x();
- module.y = (*itTracker)->position().y();
- module.z = (*itTracker)->position().z();
- module.Phi = normalizedPhi((*itTracker)->position().phi()) ;
- module.Eta = (*itTracker)->position().eta() ;
- module.DetId = (*itTracker)->geographicalId().rawId();
- const std::vector path2det = PixelCabling_->pathToDetUnit(module.DetId);
- module.Fed = path2det[0].fed;
- assert(module.Fed<40);
- pixelModuleVector_.push_back(module);
- }
- std::sort(pixelModuleVector_.begin(),pixelModuleVector_.end());
-
- edm::ESHandle SiStripCabling ;
- iSetup.get().get(SiStripCabling);
- StripRegionCabling_ = SiStripCabling.product();
-
- cabling_ = StripRegionCabling_->getRegionCabling();
- regionDimension_ = StripRegionCabling_->regionDimensions();
- }
-
- // event by event analysis
-
- // Get event raw data
- edm::Handle rawdata;
- if(!(rawDataTag_ == edm::InputTag(""))) iEvent.getByToken(rawDataToken_,rawdata);
-
- // take the beam spot position
- edm::Handle beamSpot;
- if(!(beamSpotTag_ == edm::InputTag(""))) iEvent.getByToken(beamSpotToken_, beamSpot);
- if(!beamSpot.failedToGet()) beamSpotPosition_ = beamSpot->position();
- else beamSpotPosition_.SetXYZ(0,0,0);
-
- // take the calo tower collection
- edm::Handle hbheRecHitHandle;
- if(!(HBHERecHitTag_ == edm::InputTag(""))) iEvent.getByToken(hbheRecHitToken_,hbheRecHitHandle);
- const HBHERecHitCollection* hcalRecHitCollection = NULL;
- if(!hbheRecHitHandle.failedToGet()) hcalRecHitCollection = hbheRecHitHandle.product();
-
- double radTodeg = 180. / Geom::pi();
-
- if(dumpAllEcalFed_){
- for(uint32_t iEcalFed = FEDNumbering::MINECALFEDID ; iEcalFed <= FEDNumbering::MAXECALFEDID ; iEcalFed++)
- fedList_.push_back(iEcalFed);
- for(uint32_t iESFed = FEDNumbering::MINPreShowerFEDID ; iESFed <= FEDNumbering::MAXPreShowerFEDID ; iESFed++)
- fedList_.push_back(iESFed);
- }
-
- if(dumpAllTrackerFed_){
- for(uint32_t iPixelFed = FEDNumbering::MINSiPixelFEDID; iPixelFed <= FEDNumbering::MAXSiPixelFEDID ; iPixelFed++)
- fedList_.push_back(iPixelFed);
- for(uint32_t iStripFed = FEDNumbering::MINSiStripFEDID; iStripFed <= FEDNumbering::MAXSiStripFEDID ; iStripFed++)
- fedList_.push_back(iStripFed);
- }
-
- if(dumpAllHCALFed_){
- for(uint32_t iHcalFed = FEDNumbering::MINHCALFEDID ; iHcalFed <= FEDNumbering::MAXHCALFEDID; iHcalFed++)
- fedList_.push_back(iHcalFed);
- }
-
-
- // loop on the input electron collection vector
- TEle electron ;
- edm::Ref recoEcalCand ;
- edm::Handle electrons;
- edm::Handle triggerRecoEcalCandidateCollection;
- std::vector> recoEcalCandColl;
-
- // iterator to electron and ecal candidate collections
- typename std::vector >::const_iterator itElectronColl = electronToken_.begin();
- std::vector::const_iterator itElectronCollFlag = isGsfElectronCollection_.begin();
- std::vector >::const_iterator itRecoEcalCandColl = recoEcalCandidateToken_.begin();
-
- // if you want to dump just FED related to the triggering electron/s
- if( !dumpAllTrackerFed_ || !dumpAllEcalFed_ ){
- for( ; itRecoEcalCandColl != recoEcalCandidateToken_.end(); ++itRecoEcalCandColl){
-
- try { iEvent.getByToken(*itRecoEcalCandColl,triggerRecoEcalCandidateCollection);
- if(triggerRecoEcalCandidateCollection.failedToGet()) continue ;
- }
- catch (cms::Exception &exception){ continue; }
-
- triggerRecoEcalCandidateCollection->getObjects(trigger::TriggerCluster, recoEcalCandColl);
- if(recoEcalCandColl.empty()) triggerRecoEcalCandidateCollection->getObjects(trigger::TriggerPhoton, recoEcalCandColl);
- if(recoEcalCandColl.empty()) triggerRecoEcalCandidateCollection->getObjects(trigger::TriggerElectron, recoEcalCandColl);
-
- typename std::vector>::const_iterator itRecoEcalCand = recoEcalCandColl.begin(); // loop on recoEcalCandidate objects
-
- for( ; itRecoEcalCand != recoEcalCandColl.end() ; ++itRecoEcalCand){
- recoEcalCand = (*itRecoEcalCand);
- reco::SuperClusterRef scRefRecoEcalCand = recoEcalCand->superCluster(); // take the supercluster in order to match with electron objects
-
- for( ; itElectronColl != electronToken_.end() && itElectronCollFlag != isGsfElectronCollection_.end(); ++itElectronColl , ++itElectronCollFlag){ // loop on electron collections
- try { iEvent.getByToken(*itElectronColl,electrons);
- if(electrons.failedToGet()) continue ;
- }
- catch (cms::Exception &exception){ continue; }
-
- typename TEleColl::const_iterator itEle = electrons->begin();
- for( ; itEle!=electrons->end() ; ++itEle){ // loop on all the electrons inside a collection
- // get electron supercluster and the associated hit -> detID
- electron = (*itEle);
- reco::SuperClusterRef scRef = electron.superCluster();
- if ( scRefRecoEcalCand != scRef ) continue ; // mathching
-
- const std::vector >& hits = scRef->hitsAndFractions();
- // start in dump the ecal FED associated to the electron
- std::vector >::const_iterator itSChits = hits.begin();
- if(!dumpAllEcalFed_){
- for( ; itSChits!=hits.end() ; ++itSChits){
- if((*itSChits).first.subdetId()== EcalBarrel){ // barrel part
- EBDetId idEBRaw ((*itSChits).first);
- GlobalPoint point = geometry_->getPosition(idEBRaw);
- int hitFED = FEDNumbering::MINECALFEDID + TheMapping_->GetFED(double(point.eta()),double(point.phi())*radTodeg);
- if( hitFED < FEDNumbering::MINECALFEDID || hitFED > FEDNumbering::MAXECALFEDID ) continue;
-
- LogDebug("SelectedElectronFEDListProducer")<<" electron hit detID Barrel "<<(*itSChits).first.rawId()<<" eta "<getPosition(idEERaw);
- int hitFED = FEDNumbering::MINECALFEDID + TheMapping_->GetFED(double(point.eta()),double(point.phi())*radTodeg);
- if( hitFED < FEDNumbering::MINECALFEDID || hitFED > FEDNumbering::MAXECALFEDID ) continue;
-
- LogDebug("SelectedElectronFEDListProducer")<<" electron hit detID Endcap "<<(*itSChits).first.rawId()<<" eta "<(geometryES_))->getClosestCellInPlane(point,1);
- ESDetId stripX = (tmpX == DetId(0)) ? ESDetId(0) : ESDetId(tmpX);
- int hitFED = ES_fedId_[(3-stripX.zside())/2-1][stripX.plane()-1][stripX.six()-1][stripX.siy()-1];
- LogDebug("SelectedElectronFEDListProducer")<<" ES hit plane X (deiID) "< FEDNumbering::MAXPreShowerFEDID) continue;
- if(hitFED < 0) continue;
- if(!fedList_.empty()){
- if(std::find(fedList_.begin(),fedList_.end(),hitFED)==fedList_.end()) fedList_.push_back(hitFED);
- }
- else fedList_.push_back(hitFED);
-
- DetId tmpY = (dynamic_cast(geometryES_))->getClosestCellInPlane(point,2);
- ESDetId stripY = (tmpY == DetId(0)) ? ESDetId(0) : ESDetId(tmpY);
- hitFED = ES_fedId_[(3-stripY.zside())/2-1][stripY.plane()-1][stripY.six()-1][stripY.siy()-1];
- if(hitFED < FEDNumbering::MINPreShowerFEDID || hitFED > FEDNumbering::MAXPreShowerFEDID) continue;
- LogDebug("SelectedElectronFEDListProducer")<<" ES hit plane Y (deiID) "<begin();
- for( ; itHcalRecHit != hcalRecHitCollection->end() ; ++itHcalRecHit) {
- HcalDetId recHitId(itHcalRecHit->id());
- const CaloCellGeometry* cellGeometry = geometry_->getSubdetectorGeometry(recHitId)->getGeometry(recHitId);
- float dR = reco::deltaR(scRef->eta(),scRef->phi(),cellGeometry->getPosition().eta(),cellGeometry->getPosition().phi());
- if(dR <= dRHcalRegion_) {
- const HcalElectronicsId electronicId = hcalReadoutMap_->lookup(recHitId);
- int hitFED = electronicId.dccid() + FEDNumbering::MINHCALFEDID;
- LogDebug("SelectedElectronFEDListProducer")<< " matched hcal recHit : HcalDetId "< FEDNumbering::MAXHCALFEDID)
- continue; //first eighteen feds are for HBHE
- if(hitFED < 0)
- continue;
- if(!fedList_.empty()) {
- if(std::find(fedList_.begin(), fedList_.end(), hitFED) == fedList_.end())
- fedList_.push_back(hitFED);
- }
- else
- fedList_.push_back(hitFED);
- }
- }
- } // End Hcal
- }// End Ecal
-
- // get the electron track
- if( !dumpAllTrackerFed_ ){
- //loop on the region
- if(dumpSelectedSiStripFed_){
- double eta ;
- double phi ;
- if(*itElectronCollFlag){
- eta = electron.gsfTrack()->eta();
- phi = electron.gsfTrack()->phi();
- }
- else{
- eta = electron.track()->eta();
- phi = electron.track()->phi();
- }
- for(uint32_t iCabling = 0; iCabling < cabling_.size(); iCabling++){
- SiStripRegionCabling::Position pos = StripRegionCabling_->position(iCabling);
- double dphi=fabs(pos.second-phi);
- if (dphi>acos(-1)) dphi=2*acos(-1)-dphi;
- double R = sqrt(pow(pos.first-eta,2)+dphi*dphi);
- if (R-sqrt(pow(regionDimension_.first/2,2)+pow(regionDimension_.second/2,2))>dRStripRegion_) continue;
- //get vector of subdets within region
- const SiStripRegionCabling::RegionCabling regSubdets = cabling_[iCabling];
- //cycle on subdets
- for (uint32_t idet=0; idetsecond).size(); op++){
- int hitFED = (itFedMap->second)[op].fedId();
- if(hitFED < FEDNumbering::MINSiStripFEDID || hitFED > FEDNumbering::MAXSiStripFEDID) continue;
- LogDebug("SelectedElectronFEDListProducer")<<" SiStrip (FedID) "<momentum();
- else momentum = electron.track()->momentum();
- PixelRegion region (momentum,dPhiPixelRegion_,dEtaPixelRegion_,maxZPixelRegion_);
-
- PixelModule lowerBound (normalizedPhi(region.vector.phi())-region.dPhi, region.vector.eta()-region.dEta);
- PixelModule upperBound (normalizedPhi(region.vector.phi())+region.dPhi, region.vector.eta()+region.dEta);
-
- std::vector::const_iterator itUp, itDn ;
- if(lowerBound.Phi >= -M_PI && upperBound.Phi <= M_PI ){
- itDn = std::lower_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),lowerBound);
- itUp = std::upper_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),upperBound);
- pixelFedDump(itDn,itUp,region);
- }
- else{
- if(lowerBound.Phi < -M_PI) lowerBound.Phi = lowerBound.Phi+2*M_PI;
- PixelModule phi_p(M_PI,region.vector.eta()-region.dEta);
- itDn = std::lower_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),lowerBound);
- itUp = std::upper_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),phi_p);
- pixelFedDump(itDn,itUp,region);
-
- if(upperBound.Phi < -M_PI) upperBound.Phi = upperBound.Phi-2*M_PI;
- PixelModule phi_m(-M_PI,region.vector.eta()-region.dEta);
- itDn = std::lower_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),phi_m);
- itUp = std::upper_bound(pixelModuleVector_.begin(),pixelModuleVector_.end(),upperBound);
- pixelFedDump(itDn,itUp,region);
- }
- }
- }// end tracker analysis
- }// end loop on the electron candidate
- } // end loop on the electron collection collection
- } // end loop on the recoEcal candidate
- } // end loop on the recoEcal candidate collection
- }
- // add a set of chosen FED
- for( unsigned int iFed = 0 ; iFed < addThisSelectedFEDs_.size() ; iFed++){
- if(addThisSelectedFEDs_.at(iFed) == -1 ) continue ;
- fedList_.push_back(addThisSelectedFEDs_.at(iFed));
- }
-
- // make the final raw data collection
- RawDataCollection_ = new FEDRawDataCollection();
- std::sort(fedList_.begin(),fedList_.end());
- std::vector::const_iterator itfedList = fedList_.begin();
- for( ; itfedList!=fedList_.end() ; ++itfedList){
- LogDebug("SelectedElectronFEDListProducer")<<" fed point "<<*itfedList<<" ";
- const FEDRawData& data = rawdata->FEDData(*itfedList);
- if(data.size()>0){
- FEDRawData& fedData = RawDataCollection_->FEDData(*itfedList);
- fedData.resize(data.size());
- memcpy(fedData.data(),data.data(),data.size());
- }
- }
-
- std::auto_ptr streamFEDRawProduct(RawDataCollection_);
- iEvent.put(streamFEDRawProduct,outputLabelModule_);
- eventCounter_ ++ ;
-}
-
-
-template< typename TEle, typename TCand>
-void SelectedElectronFEDListProducer::endJob(){
- LogDebug("SelectedElectronFEDListProducer")<<" End of the Job : Counted Events "<
-void SelectedElectronFEDListProducer::pixelFedDump( std::vector::const_iterator & itDn,
- std::vector::const_iterator & itUp,
- const PixelRegion & region){
-
- for( ; itDn != itUp ; ++itDn){
- float zmodule = itDn->z-((itDn->x-beamSpotPosition_.x())*region.cosphi+(itDn->y-beamSpotPosition_.y())*region.sinphi)*region.atantheta;
- if ( std::abs(zmodule) > region.maxZ ) continue;
- int hitFED = itDn->Fed;
- if(hitFED < FEDNumbering::MINSiPixelFEDID || hitFED > FEDNumbering::MAXSiPixelFEDID) continue;
- LogDebug("SelectedElectronFEDListProducer")<<" electron pixel hit "<DetId<<" hitFED "<
-void SelectedElectronFEDListProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
- edm::ParameterSetDescription desc;
- desc.add>("electronTags",{edm::InputTag("hltEgammaGsfElectrons")});
- desc.add>("recoEcalCandidateTags",{edm::InputTag("hltL1EG25Ele27WP85GsfTrackIsoFilter")});
- desc.add("ESLookupTable",edm::FileInPath("EventFilter/ESDigiToRaw/data/ES_lookup_table.dat"));
- desc.add("HBHERecHitTag",edm::InputTag("hltHbhereco"));
- desc.add("beamSpotTag",edm::InputTag("hltOnlineBeamSpot"));
- desc.add("rawDataTag",edm::InputTag("rawDataCollector"));
- desc.add>("addThisSelectedFEDs",{812,813});
- desc.add>("isGsfElectronCollection",{true});
- desc.add("outputLabelModule","StreamElectronRawFed");
- desc.add("dumpSelectedSiPixelFed",true);
- desc.add("dumpSelectedSiStripFed",true);
- desc.add("dumpSelectedEcalFed",true);
- desc.add("dumpSelectedHCALFed",true);
- desc.add