![]() |
![]() |
00001 #include "EventFilter/EcalRawToDigi/plugins/EcalRawToRecHitProducer.h" 00002 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalCleaningAlgo.h" 00003 00004 EcalRawToRecHitProducer::EcalRawToRecHitProducer(const edm::ParameterSet& iConfig) 00005 { 00006 lsourceTag_=iConfig.getParameter<edm::InputTag>("lazyGetterTag"); 00007 sourceTag_=iConfig.getParameter<edm::InputTag>("sourceTag"); 00008 00009 splitOutput_=iConfig.getParameter<bool>("splitOutput"); 00010 if (splitOutput_){ 00011 EBrechitCollection_=iConfig.getParameter<std::string>("EBrechitCollection"); 00012 EErechitCollection_=iConfig.getParameter<std::string>("EErechitCollection"); 00013 produces<EBRecHitCollection>(EBrechitCollection_); 00014 produces<EERecHitCollection>(EErechitCollection_); 00015 LogDebug("EcalRawToRecHit|Producer")<<"ready to create rechits from lazy getter: "<<lsourceTag_ 00016 <<"\n using region ref from: "<<sourceTag_ 00017 <<"\n splitting in two collections" 00018 <<"\n EB instance: "<<EBrechitCollection_ 00019 <<"\n EE instance: "<<EErechitCollection_; 00020 } 00021 else{ 00022 rechitCollection_=iConfig.getParameter<std::string>("rechitCollection"); 00023 produces<EcalRecHitCollection>(rechitCollection_); 00024 LogDebug("EcalRawToRecHit|Producer")<<"ready to create rechits from lazy getter: "<<lsourceTag_ 00025 <<"\n using region ref from: "<<sourceTag_ 00026 <<"\n not splitting the output collection."; 00027 } 00028 00029 cleaningAlgo_=0; 00030 if (iConfig.exists("cleaningConfig")){ 00031 const edm::ParameterSet & cleaning=iConfig.getParameter<edm::ParameterSet>("cleaningConfig"); 00032 if (!cleaning.empty()) 00033 cleaningAlgo_ = new EcalCleaningAlgo(cleaning); 00034 } 00035 } 00036 00037 00038 EcalRawToRecHitProducer::~EcalRawToRecHitProducer() 00039 { 00040 if (cleaningAlgo_) delete cleaningAlgo_; 00041 } 00042 00043 00044 // 00045 // member functions 00046 // 00047 00048 // ------------ method called to produce the data ------------ 00049 void 00050 EcalRawToRecHitProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) 00051 { 00052 using namespace edm; 00053 00054 MyWatcher watcher("Producer"); 00055 LogDebug("EcalRawToRecHit|Producer")<<watcher.lap(); 00056 00057 //retrieve a lazygetter 00058 edm::Handle<EcalRecHitLazyGetter> lgetter; 00059 iEvent.getByLabel(lsourceTag_, lgetter); 00060 LogDebug("EcalRawToRecHit|Producer")<<"lazy getter retreived from: "<<lsourceTag_<<(lgetter.failedToGet()?" not valid ":"valid") 00061 <<watcher.lap(); 00062 00063 //retrieve a refgetter 00064 edm::Handle<EcalRecHitRefGetter> rgetter; 00065 iEvent.getByLabel(sourceTag_ ,rgetter); 00066 LogDebug("EcalRawToRecHit|Producer")<<"ref getter retreived from: "<<sourceTag_<<(rgetter.failedToGet()?" not valid ":"valid") 00067 <<watcher.lap(); 00068 00069 00070 if (splitOutput_){ 00071 //prepare the output collection 00072 std::auto_ptr<EBRecHitCollection> EBrechits( new EBRecHitCollection ); 00073 std::auto_ptr<EERecHitCollection> EErechits( new EERecHitCollection ); 00074 //loop the refgetter 00075 unsigned int iR=0; 00076 EcalRecHitRefGetter::const_iterator iRegion=rgetter->begin(); 00077 EcalRecHitRefGetter::const_iterator iRegionEnd=rgetter->end(); 00078 for (;iRegion!=iRegionEnd;++iRegion){ 00079 LogDebug("EcalRawToRecHit|Producer")<<"looping over refgetter region: "<<iR<<watcher.lap(); 00080 std::vector<EcalRecHit>::const_iterator iRecHit=lgetter->begin_record()+iRegion->start(); 00081 std::vector<EcalRecHit>::const_iterator iRecHitEnd =lgetter->begin_record()+iRegion->finish(); 00082 for (;iRecHit!=iRecHitEnd;iRecHit++){ 00083 DetId detid =iRecHit->id(); 00084 //split barrel and endcap 00085 int EcalNum=detid.subdetId(); //1 stands for Barrel, 2 for endcaps 00086 LogDebug("EcalRawToRecHit|Producer")<<"subdetId is: "<<EcalNum; 00087 if (EcalNum==1) EBrechits->push_back(*iRecHit); 00088 else if (EcalNum==2) EErechits->push_back(*iRecHit); 00089 else { 00090 edm::LogError("IncorrectRecHit")<<" a subdetid is not recognized. recHit on :"<< iRecHit->id().rawId() 00091 <<" is lost."; 00092 }//subdetid 00093 }//loop over things in region 00094 LogDebug("EcalRawToRecHit|Producer")<<"looping over refgetter region: "<<iR++<<" done" 00095 <<watcher.lap(); 00096 }//loop over regions 00097 00098 LogDebug("EcalRawToRecHit|Producer")<<EBrechits->size()<<" EB recHits to be put with instance: "<<EBrechitCollection_ 00099 <<"\n"<<EErechits->size()<<" EE recHits to be put with instance: "<<EErechitCollection_ 00100 << watcher.lap(); 00101 00102 // cleaning of anomalous signals, aka spikes 00103 // only doable once we have a "global" collection of hits 00104 if (cleaningAlgo_){ 00105 EBrechits->sort(); 00106 EErechits->sort(); 00107 cleaningAlgo_->setFlags(*EBrechits); 00108 cleaningAlgo_->setFlags(*EErechits); 00109 } 00110 00111 iEvent.put(EBrechits, EBrechitCollection_); 00112 iEvent.put(EErechits, EErechitCollection_); 00113 LogDebug("EcalRawToRecHit|Producer")<<"collections uploaded." 00114 << watcher.lap(); 00115 } 00116 else{ 00117 //prepare the output collection 00118 std::auto_ptr< EcalRecHitCollection > rechits( new EcalRecHitCollection); 00119 //loop the refgetter 00120 unsigned int iR=0; 00121 EcalRecHitRefGetter::const_iterator iRegion=rgetter->begin(); 00122 EcalRecHitRefGetter::const_iterator iRegionEnd=rgetter->end(); 00123 for (;iRegion!=iRegionEnd;++iRegion){ 00124 LogDebug("EcalRawToRecHit|Producer")<<"looping over refgetter region: "<<iR<<watcher.lap(); 00125 std::vector<EcalRecHit>::const_iterator iRecHit=lgetter->begin_record()+iRegion->start(); 00126 std::vector<EcalRecHit>::const_iterator iRecHitEnd=lgetter->begin_record()+iRegion->finish(); 00127 for (;iRecHit!=iRecHitEnd;iRecHit++){ 00128 LogDebug("EcalRawToRecHit|Producer")<<"dereferencing rechit ref."; 00129 DetId detid =iRecHit->id(); 00130 int EcalNum=detid.subdetId(); //1 stands for Barrel, 2 for endcaps 00131 LogDebug("EcalRawToRecHit|Producer")<<"subdetId is: "<<EcalNum; 00132 rechits->push_back(*iRecHit); 00133 }//loop over things in region 00134 LogDebug("EcalRawToRecHit|Producer")<<"looping over refgetter region: "<<iR++<<" done"<<watcher.lap(); 00135 }//loop over regions 00136 00137 if (cleaningAlgo_){ 00138 rechits->sort(); 00139 cleaningAlgo_->setFlags(*rechits); 00140 } 00141 LogDebug("EcalRawToRecHit|Producer")<<rechits->size()<<" rechits to be put."<< watcher.lap(); 00142 iEvent.put(rechits,rechitCollection_); 00143 LogDebug("EcalRawToRecHit|Producer")<<"collections uploaded." 00144 << watcher.lap(); 00145 } 00146 00147 } 00148