CMS 3D CMS Logo

MuIsoDepositProducer.cc
Go to the documentation of this file.
2 
3 // Framework
9 
11 
18 
19 
22 
25 
27 #include <string>
28 
29 using namespace edm;
30 using namespace std;
31 using namespace reco;
32 using namespace muonisolation;
33 
34 
37  theConfig(par),
38  theDepositNames(std::vector<std::string>(1,std::string())),
39  theExtractor(0)
40 {
41  LogDebug("RecoMuon|MuonIsolation")<<" MuIsoDepositProducer CTOR";
42 
43  edm::ParameterSet ioPSet = par.getParameter<edm::ParameterSet>("IOPSet");
44 
45  theInputType = ioPSet.getParameter<std::string>("InputType");
46  theExtractForCandidate = ioPSet.getParameter<bool>("ExtractForCandidate");
47  theMuonTrackRefType = ioPSet.getParameter<std::string>("MuonTrackRefType");
48 
49  bool readFromRecoTrack = theInputType == "TrackCollection";
50  bool readFromRecoMuon = theInputType == "MuonCollection";
51  bool readFromCandidateView = theInputType == "CandidateView";
52  if(readFromRecoTrack){
53  theMuonCollectionTag = consumes<View<Track>>(ioPSet.getParameter<edm::InputTag>("inputMuonCollection"));
54  } else if(readFromRecoMuon) {
55  theMuonCollectionTag = consumes<View<RecoCandidate>>(ioPSet.getParameter<edm::InputTag>("inputMuonCollection"));
56  } else if (readFromCandidateView) {
57  theMuonCollectionTag = consumes<View<Candidate>>(ioPSet.getParameter<edm::InputTag>("inputMuonCollection"));
58  } else {
59  throw cms::Exception("Configuration")<<"Inconsistent configuration or failure to read Candidate-muon view";
60  }
61 
62  theMultipleDepositsFlag = ioPSet.getParameter<bool>("MultipleDepositsFlag");
63 
64 
65 
67  theDepositNames = par.getParameter<edm::ParameterSet>("ExtractorPSet")
68  .getParameter<std::vector<std::string> >("DepositInstanceLabels");
69  }
70 
71  for (unsigned int i = 0; i < theDepositNames.size(); ++i){
73  if (theDepositNames[i] != "") alias += "_" + theDepositNames[i];
74  produces<reco::IsoDepositMap>(theDepositNames[i]).setBranchAlias(alias);
75  }
76 
77  if (!theExtractor) {
78  edm::ParameterSet extractorPSet = theConfig.getParameter<edm::ParameterSet>("ExtractorPSet");
79  std::string extractorName = extractorPSet.getParameter<std::string>("ComponentName");
80  theExtractor = IsoDepositExtractorFactory::get()->create( extractorName, extractorPSet, consumesCollector());
81  LogDebug(metname)<<" Load extractor..."<<extractorName;
82  }
83 
84 
85 }
86 
89  LogDebug("RecoMuon/MuIsoDepositProducer")<<" MuIsoDepositProducer DTOR";
90  delete theExtractor;
91 }
92 
95  std::string metname = "RecoMuon|MuonIsolationProducers|MuIsoDepositProducer";
96 
97  LogDebug(metname)<<" Muon Deposit producing..."
98  <<" BEGINING OF EVENT " <<"================================";
99 
100  unsigned int nDeps = theMultipleDepositsFlag ? theDepositNames.size() : 1;
101 
102 
103 
104  // Take the muon container
105  LogTrace(metname)<<" Taking the muons: "<<theMuonCollectionTag;
109  Handle<View<Candidate> > cands;
110 
111  unsigned int nMuons = 0;
112 
113  bool readFromRecoTrack = theInputType == "TrackCollection";
114  bool readFromRecoMuon = theInputType == "MuonCollection";
115  bool readFromCandidateView = theInputType == "CandidateView";
116 
117  if (readFromRecoMuon){
118  event.getByToken(theMuonCollectionTag,muons);
119  nMuons = muons->size();
120  LogDebug(metname) <<"Got Muons of size "<<nMuons;
121 
122  }
123  if (readFromRecoTrack){
124  event.getByToken(theMuonCollectionTag,tracks);
125  nMuons = tracks->size();
126  LogDebug(metname) <<"Got MuonTracks of size "<<nMuons;
127  }
128  if (readFromCandidateView || theExtractForCandidate){
129  event.getByToken(theMuonCollectionTag,cands);
130  unsigned int nCands = cands->size();
131  if (readFromRecoMuon && theExtractForCandidate){
133  if (nMuons != nCands) edm::LogError(metname)<<"Inconsistent configuration or failure to read Candidate-muon view";
134  }
135  nMuons = nCands;
136  LogDebug(metname)<< "Got candidate view with size "<<nMuons;
137  }
138 
139  static const unsigned int MAX_DEPS=10;
140  std::unique_ptr<reco::IsoDepositMap> depMaps[MAX_DEPS];
141 
142  if (nDeps >10 ) LogError(metname)<<"Unable to handle more than 10 input deposits";
143  for (unsigned int i =0;i<nDeps; ++i){
144  depMaps[i] = std::make_unique<reco::IsoDepositMap>();
145  }
146 
150  if (nMuons > 0){
151 
152  std::vector<std::vector<IsoDeposit> > deps2D(nDeps, std::vector<IsoDeposit>(nMuons));
153 
154  for (unsigned int i=0; i< nMuons; ++i) {
155  TrackBaseRef muRef;
156  if (readFromRecoMuon){
157  if (theMuonTrackRefType == "track"){
158  muRef = TrackBaseRef((*muons)[i].track());
159  } else if (theMuonTrackRefType == "standAloneMuon"){
160  muRef = TrackBaseRef((*muons)[i].standAloneMuon());
161  } else if (theMuonTrackRefType == "combinedMuon"){
162  muRef = TrackBaseRef((*muons)[i].combinedMuon());
163  } else if (theMuonTrackRefType == "bestGlbTrkSta"){
164  if (!(*muons)[i].combinedMuon().isNull()){
165  muRef = TrackBaseRef((*muons)[i].combinedMuon());
166  } else if (!(*muons)[i].track().isNull()){
167  muRef = TrackBaseRef((*muons)[i].track());
168  } else {
169  muRef = TrackBaseRef((*muons)[i].standAloneMuon());
170  }
171  } else if (theMuonTrackRefType == "bestTrkSta"){
172  if (!(*muons)[i].track().isNull()){
173  muRef = TrackBaseRef((*muons)[i].track());
174  } else {
175  muRef = TrackBaseRef((*muons)[i].standAloneMuon());
176  }
177  }else {
178  edm::LogWarning(metname)<<"Wrong track type is supplied: breaking";
179  break;
180  }
181  } else if (readFromRecoTrack){
182  muRef = TrackBaseRef(tracks, i);
183  }
184 
186  if (readFromCandidateView || theExtractForCandidate) deps2D[0][i] = theExtractor->deposit(event, eventSetup, (*cands)[i]);
187  else deps2D[0][i] = theExtractor->deposit(event, eventSetup, muRef);
188 
189  } else {
190  std::vector<IsoDeposit> deps(nDeps);
191  if (readFromCandidateView || theExtractForCandidate) deps = theExtractor->deposits(event, eventSetup, (*cands)[i]);
192  else deps = theExtractor->deposits(event, eventSetup, muRef);
193  for (unsigned int iDep =0; iDep<nDeps; ++iDep) {
194  deps2D[iDep][i] = deps[iDep];
195  }
196  }
197  }
198 
200  for (unsigned int iDep=0; iDep < nDeps; ++iDep){
202  for (unsigned int iMu = 0; iMu< nMuons; ++iMu){
203  LogTrace(metname)<<"Contents of "<<theDepositNames[iDep]
204  <<" for a muon at index "<<iMu;
205  LogTrace(metname)<<deps2D[iDep][iMu].print();
206  }
207 
209  reco::IsoDepositMap::Filler filler(*depMaps[iDep]);
210 
212  if (readFromRecoMuon){
213  filler.insert(muons, deps2D[iDep].begin(), deps2D[iDep].end());
214  } else if (readFromRecoTrack){
215  filler.insert(tracks, deps2D[iDep].begin(), deps2D[iDep].end());
216  } else if (readFromCandidateView){
217  filler.insert(cands, deps2D[iDep].begin(), deps2D[iDep].end());
218  } else {
219  edm::LogError(metname)<<"Inconsistent configuration: unknown type requested";
220  }
221 
223  filler.fill();
224  }
225  }
226 
227 
228  for (unsigned int iMap = 0; iMap < nDeps; ++iMap){
229  LogTrace(metname)<<"About to put a deposit named "<<theDepositNames[iMap]
230  <<" of size "<<depMaps[iMap]->size()
231  <<" into edm::Event";
232  event.put(std::move(depMaps[iMap]), theDepositNames[iMap]);
233  }
234 
235  LogTrace(metname) <<" END OF EVENT " <<"================================";
236 }
237 
#define LogDebug(id)
T getParameter(std::string const &) const
std::vector< std::string > theDepositNames
MuIsoDepositProducer(const edm::ParameterSet &)
constructor
const std::string metname
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
void insert(const H &h, I begin, I end)
Definition: ValueMap.h:52
virtual ~MuIsoDepositProducer()
destructor
virtual reco::IsoDeposit deposit(const edm::Event &ev, const edm::EventSetup &evSetup, const reco::Track &track) const =0
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
Definition: TrackFwd.h:32
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
edm::EDGetToken theMuonCollectionTag
#define end
Definition: vmac.h:37
#define LogTrace(id)
virtual std::vector< reco::IsoDeposit > deposits(const edm::Event &ev, const edm::EventSetup &evSetup, const reco::Track &track) const
virtual void produce(edm::Event &, const edm::EventSetup &)
data making method
fixed size matrix
#define begin
Definition: vmac.h:30
HLT enums.
reco::isodeposit::IsoDepositExtractor * theExtractor
edm::ParameterSet theConfig
module configuration
def move(src, dest)
Definition: eostools.py:510
T get(const Candidate &c)
Definition: component.h:55
Definition: event.py:1