CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_5_3_13_patch3/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;
00080 //<<watcher.lap();
00081       std::vector<EcalRecHit>::const_iterator iRecHit=lgetter->begin_record()+iRegion->start();
00082       std::vector<EcalRecHit>::const_iterator iRecHitEnd =lgetter->begin_record()+iRegion->finish();
00083       for (;iRecHit!=iRecHitEnd;iRecHit++){
00084         DetId detid =iRecHit->id();
00085         //split barrel and endcap
00086         int EcalNum=detid.subdetId(); //1 stands for Barrel, 2 for endcaps
00087         LogDebug("EcalRawToRecHit|Producer")<<"subdetId is: "<<EcalNum;
00088         if (EcalNum==1) EBrechits->push_back(*iRecHit);
00089         else if (EcalNum==2) EErechits->push_back(*iRecHit);
00090         else {
00091           edm::LogError("IncorrectRecHit")<<" a subdetid is not recognized. recHit on :"<< iRecHit->id().rawId() 
00092                                                    <<" is lost.";
00093         }//subdetid
00094       }//loop over things in region
00095       LogDebug("EcalRawToRecHit|Producer")<<"looping over refgetter region: "<<iR++<<" done";
00096 //                                        <<watcher.lap();
00097     }//loop over regions
00098 
00099     LogDebug("EcalRawToRecHit|Producer")<<EBrechits->size()<<" EB recHits to be put with instance: "<<EBrechitCollection_
00100                                         <<"\n"<<EErechits->size()<<" EE recHits to be put with instance: "<<EErechitCollection_ ;
00101 //                                      << watcher.lap();
00102     
00103     // cleaning of anomalous signals, aka spikes
00104     // only doable once we have a "global" collection of hits
00105     if (cleaningAlgo_){
00106       EBrechits->sort();
00107       EErechits->sort();
00108       cleaningAlgo_->setFlags(*EBrechits);
00109       cleaningAlgo_->setFlags(*EErechits);
00110     }
00111 
00112     iEvent.put(EBrechits, EBrechitCollection_);
00113     iEvent.put(EErechits, EErechitCollection_);
00114     LogDebug("EcalRawToRecHit|Producer")<<"collections uploaded.";
00115 //                                      << watcher.lap();
00116   }
00117   else{
00118     //prepare the output collection
00119     std::auto_ptr< EcalRecHitCollection > rechits( new EcalRecHitCollection);
00120     //loop the refgetter
00121     unsigned int iR=0;
00122     EcalRecHitRefGetter::const_iterator iRegion=rgetter->begin();
00123     EcalRecHitRefGetter::const_iterator iRegionEnd=rgetter->end();
00124     for (;iRegion!=iRegionEnd;++iRegion){
00125       LogDebug("EcalRawToRecHit|Producer")<<"looping over refgetter region: "<<iR ;
00126 //<<watcher.lap();
00127       std::vector<EcalRecHit>::const_iterator iRecHit=lgetter->begin_record()+iRegion->start();
00128       std::vector<EcalRecHit>::const_iterator iRecHitEnd=lgetter->begin_record()+iRegion->finish();
00129       for (;iRecHit!=iRecHitEnd;iRecHit++){
00130         LogDebug("EcalRawToRecHit|Producer")<<"dereferencing rechit ref.";
00131         DetId detid =iRecHit->id();
00132         int EcalNum=detid.subdetId(); //1 stands for Barrel, 2 for endcaps
00133         LogDebug("EcalRawToRecHit|Producer")<<"subdetId is: "<<EcalNum;
00134         rechits->push_back(*iRecHit);
00135       }//loop over things in region
00136       LogDebug("EcalRawToRecHit|Producer")<<"looping over refgetter region: "<<iR++<<" done" ;
00137 //<<watcher.lap();
00138     }//loop over regions
00139 
00140     if (cleaningAlgo_){
00141       rechits->sort();
00142       cleaningAlgo_->setFlags(*rechits);
00143     }
00144     LogDebug("EcalRawToRecHit|Producer")<<rechits->size()<<" rechits to be put." ;
00145 //<< watcher.lap();
00146     iEvent.put(rechits,rechitCollection_);
00147     LogDebug("EcalRawToRecHit|Producer")<<"collections uploaded." ;
00148 //                                      << watcher.lap();
00149   }
00150 
00151 }
00152