CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/EventFilter/EcalRawToDigi/plugins/EcalRawToRecHitProducer.cc

Go to the documentation of this file.
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