#include <Calibration/HcalAlCaRecoProducers/interface/AlCaGammaJetProducer.h>
Public Member Functions | |
AlCaGammaJetProducer (const edm::ParameterSet &) | |
virtual void | beginJob (const edm::EventSetup &) |
virtual void | produce (edm::Event &, const edm::EventSetup &) |
~AlCaGammaJetProducer () | |
Private Attributes | |
bool | allowMissingInputs_ |
std::string | correctedIslandBarrelSuperClusterCollection_ |
std::string | correctedIslandBarrelSuperClusterProducer_ |
std::string | correctedIslandEndcapSuperClusterCollection_ |
std::string | correctedIslandEndcapSuperClusterProducer_ |
std::vector< edm::InputTag > | ecalLabels_ |
const CaloGeometry * | geo |
edm::InputTag | hbheLabel_ |
edm::InputTag | hfLabel_ |
edm::InputTag | hoLabel_ |
std::string | m_inputTrackLabel |
std::vector< edm::InputTag > | mInputCalo |
Definition at line 35 of file AlCaGammaJetProducer.h.
AlCaGammaJetProducer::AlCaGammaJetProducer | ( | const edm::ParameterSet & | iConfig | ) | [explicit] |
Definition at line 19 of file AlCaGammaJetProducer.cc.
References allowMissingInputs_, correctedIslandBarrelSuperClusterCollection_, correctedIslandBarrelSuperClusterProducer_, correctedIslandEndcapSuperClusterCollection_, correctedIslandEndcapSuperClusterProducer_, ecalLabels_, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), hbheLabel_, hfLabel_, hoLabel_, m_inputTrackLabel, and mInputCalo.
00020 { 00021 // Take input 00022 00023 hbheLabel_= iConfig.getParameter<edm::InputTag>("hbheInput"); 00024 hoLabel_=iConfig.getParameter<edm::InputTag>("hoInput"); 00025 hfLabel_=iConfig.getParameter<edm::InputTag>("hfInput"); 00026 mInputCalo = iConfig.getParameter<std::vector<edm::InputTag> >("srcCalo"); 00027 ecalLabels_=iConfig.getParameter<std::vector<edm::InputTag> >("ecalInputs"); 00028 m_inputTrackLabel = iConfig.getUntrackedParameter<std::string>("inputTrackLabel","generalTracks"); 00029 correctedIslandBarrelSuperClusterCollection_ = iConfig.getParameter<std::string>("correctedIslandBarrelSuperClusterCollection"); 00030 correctedIslandBarrelSuperClusterProducer_ = iConfig.getParameter<std::string>("correctedIslandBarrelSuperClusterProducer"); 00031 correctedIslandEndcapSuperClusterCollection_ = iConfig.getParameter<std::string>("correctedIslandEndcapSuperClusterCollection"); 00032 correctedIslandEndcapSuperClusterProducer_ = iConfig.getParameter<std::string>("correctedIslandEndcapSuperClusterProducer"); 00033 allowMissingInputs_=iConfig.getUntrackedParameter<bool>("AllowMissingInputs",true); 00034 00035 00036 //register your products 00037 produces<reco::TrackCollection>("GammaJetTracksCollection"); 00038 produces<EcalRecHitCollection>("GammaJetEcalRecHitCollection"); 00039 produces<HBHERecHitCollection>("GammaJetHBHERecHitCollection"); 00040 produces<HORecHitCollection>("GammaJetHORecHitCollection"); 00041 produces<HFRecHitCollection>("GammaJetHFRecHitCollection"); 00042 produces<CaloJetCollection>("GammaJetJetBackToBackCollection"); 00043 produces<reco::SuperClusterCollection>("GammaJetGammaBackToBackCollection"); 00044 00045 00046 00047 }
AlCaGammaJetProducer::~AlCaGammaJetProducer | ( | ) |
void AlCaGammaJetProducer::beginJob | ( | const edm::EventSetup & | iSetup | ) | [virtual] |
void AlCaGammaJetProducer::produce | ( | edm::Event & | iEvent, | |
const edm::EventSetup & | iSetup | |||
) | [virtual] |
Implements edm::EDProducer.
Definition at line 61 of file AlCaGammaJetProducer.cc.
References allowMissingInputs_, edm::SortedCollection< T, SORT >::begin(), correctedIslandBarrelSuperClusterCollection_, correctedIslandBarrelSuperClusterProducer_, correctedIslandBarrelSuperClusters_cfi::correctedIslandBarrelSuperClusters, correctedIslandEndcapSuperClusterCollection_, correctedIslandEndcapSuperClusterProducer_, correctedIslandEndcapSuperClusters_cfi::correctedIslandEndcapSuperClusters, GenMuonPlsPt100GeV_cfg::cout, ecalLabels_, edm::SortedCollection< T, SORT >::end(), lat::endl(), PV3DBase< T, PVType, FrameType >::eta(), geo, edm::EventSetup::get(), edm::Event::getByLabel(), CaloGeometry::getPosition(), hbheLabel_, hfLabel_, hoLabel_, i, edm::Handle< T >::isValid(), metsig::jet, pfTauBenchmarkGeneric_cfi::jets, m_inputTrackLabel, mInputCalo, PV3DBase< T, PVType, FrameType >::phi(), edm::ESHandle< T >::product(), edm::Handle< T >::product(), edm::Event::put(), HLT_VtxMuL3::result, funct::sqrt(), std, and track.
00062 { 00063 using namespace edm; 00064 using namespace std; 00065 00066 edm::ESHandle<CaloGeometry> pG; 00067 iSetup.get<CaloGeometryRecord>().get(pG); 00068 geo = pG.product(); 00069 00070 // Produced collections 00071 00072 std::auto_ptr<reco::SuperClusterCollection> result (new reco::SuperClusterCollection); //Corrected jets 00073 std::auto_ptr<CaloJetCollection> resultjet (new CaloJetCollection); //Corrected jets 00074 std::auto_ptr<EcalRecHitCollection> miniEcalRecHitCollection(new EcalRecHitCollection); 00075 std::auto_ptr<HBHERecHitCollection> miniHBHERecHitCollection(new HBHERecHitCollection); 00076 std::auto_ptr<HORecHitCollection> miniHORecHitCollection(new HORecHitCollection); 00077 std::auto_ptr<HFRecHitCollection> miniHFRecHitCollection(new HFRecHitCollection); 00078 std::auto_ptr<reco::TrackCollection> outputTColl(new reco::TrackCollection); 00079 00080 00081 // Get Corrected supercluster collection 00082 int nclusb = 0; 00083 int ncluse = 0; 00084 reco::SuperClusterCollection::const_iterator maxclusbarrel; 00085 reco::SuperClusterCollection::const_iterator maxclusendcap; 00086 00087 double vetmax = -100.; 00088 Handle<reco::SuperClusterCollection> pCorrectedIslandBarrelSuperClusters; 00089 iEvent.getByLabel(correctedIslandBarrelSuperClusterProducer_, 00090 correctedIslandBarrelSuperClusterCollection_, 00091 pCorrectedIslandBarrelSuperClusters); 00092 if (!pCorrectedIslandBarrelSuperClusters.isValid()) { 00093 // can't find it! 00094 if (!allowMissingInputs_) { 00095 *pCorrectedIslandBarrelSuperClusters; // will throw the proper exception 00096 } 00097 } else { 00098 const reco::SuperClusterCollection* correctedIslandBarrelSuperClusters = pCorrectedIslandBarrelSuperClusters.product(); 00099 00100 // loop over the super clusters and find the highest 00101 maxclusbarrel = correctedIslandBarrelSuperClusters->begin(); 00102 for(reco::SuperClusterCollection::const_iterator aClus = correctedIslandBarrelSuperClusters->begin(); 00103 aClus != correctedIslandBarrelSuperClusters->end(); aClus++) { 00104 double vet = aClus->energy()/cosh(aClus->eta()); 00105 cout<<" Barrel supercluster " << vet <<" energy "<<aClus->energy()<<" eta "<<aClus->eta()<<endl; 00106 if(vet>20.) { 00107 if(vet > vetmax) 00108 { 00109 vetmax = vet; 00110 maxclusbarrel = aClus; 00111 nclusb = 1; 00112 } 00113 } 00114 } 00115 00116 } 00117 00118 Handle<reco::SuperClusterCollection> pCorrectedIslandEndcapSuperClusters; 00119 iEvent.getByLabel(correctedIslandEndcapSuperClusterProducer_, 00120 correctedIslandEndcapSuperClusterCollection_, 00121 pCorrectedIslandEndcapSuperClusters); 00122 if (!pCorrectedIslandEndcapSuperClusters.isValid()) { 00123 // can't find it! 00124 if (!allowMissingInputs_) { 00125 *pCorrectedIslandEndcapSuperClusters; // will throw the proper exception 00126 } 00127 } else { 00128 const reco::SuperClusterCollection* correctedIslandEndcapSuperClusters = pCorrectedIslandEndcapSuperClusters.product(); 00129 00130 // loop over the super clusters and find the highest 00131 maxclusendcap = correctedIslandEndcapSuperClusters->end(); 00132 double vetmaxe = vetmax; 00133 for(reco::SuperClusterCollection::const_iterator aClus = correctedIslandEndcapSuperClusters->begin(); 00134 aClus != correctedIslandEndcapSuperClusters->end(); aClus++) { 00135 double vet = aClus->energy()/cosh(aClus->eta()); 00136 // cout<<" Endcap supercluster " << vet <<" energy "<<aClus->energy()<<" eta "<<aClus->eta()<<endl; 00137 if(vet>20.) { 00138 if(vet > vetmaxe) 00139 { 00140 vetmaxe = vet; 00141 maxclusendcap = aClus; 00142 ncluse = 1; 00143 } 00144 } 00145 } 00146 } 00147 00148 cout<<" Number of gammas "<<nclusb<<" "<<ncluse<<endl; 00149 00150 if( nclusb == 0 && ncluse == 0 ) { 00151 00152 iEvent.put( outputTColl, "GammaJetTracksCollection"); 00153 iEvent.put( miniEcalRecHitCollection, "GammaJetEcalRecHitCollection"); 00154 iEvent.put( miniHBHERecHitCollection, "GammaJetHBHERecHitCollection"); 00155 iEvent.put( miniHORecHitCollection, "GammaJetHORecHitCollection"); 00156 iEvent.put( miniHFRecHitCollection, "GammaJetHFRecHitCollection"); 00157 iEvent.put( result, "GammaJetGammaBackToBackCollection"); 00158 iEvent.put( resultjet, "GammaJetJetBackToBackCollection"); 00159 00160 return; 00161 } 00162 00163 double phigamma = -100.; 00164 double etagamma = -100.; 00165 if(ncluse == 1) 00166 { 00167 result->push_back(*maxclusendcap); 00168 phigamma = (*maxclusendcap).phi(); 00169 etagamma = (*maxclusendcap).eta(); 00170 00171 } else 00172 { 00173 result->push_back(*maxclusbarrel); 00174 phigamma = (*maxclusbarrel).phi(); 00175 etagamma = (*maxclusbarrel).eta(); 00176 } 00177 00178 // cout<<" Size of egamma clusters "<<result->size()<<endl; 00179 00180 // 00181 // Jet Collection 00182 // Find jet in the angle ~ +- 170 degrees 00183 // 00184 00185 double phijet = -100.; 00186 double etajet = -100.; 00187 double phijet0 = -100.; 00188 double etajet0 = -100.; 00189 00190 std::vector<edm::InputTag>::const_iterator ic; 00191 for (ic=mInputCalo.begin(); ic!=mInputCalo.end(); ic++) { 00192 00193 edm::Handle<reco::CaloJetCollection> jets; 00194 iEvent.getByLabel(*ic, jets); 00195 if (!jets.isValid()) { 00196 // can't find it! 00197 if (!allowMissingInputs_) { 00198 *jets; // will throw the proper exception 00199 } 00200 } else { 00201 reco::CaloJetCollection::const_iterator jet = jets->begin (); 00202 00203 // cout<<" Size of jets "<<jets->size()<<endl; 00204 00205 if( jets->size() == 0 ) continue; 00206 00207 int iejet = 0; 00208 int numjet = 0; 00209 00210 for (; jet != jets->end (); jet++) 00211 { 00212 phijet0 = (*jet).phi(); 00213 etajet0 = (*jet).eta(); 00214 00215 // Only 3 jets are kept 00216 numjet++; 00217 if(numjet > 3) break; 00218 00219 cout<<" phi,eta "<< phigamma<<" "<< etagamma<<" "<<phijet0<<" "<<etajet0<<endl; 00220 00221 // Find jet back to gamma 00222 00223 double dphi = fabs(phigamma-phijet0); 00224 if(dphi > 4.*atan(1.)) dphi = 8.*atan(1.) - dphi; 00225 double deta = fabs(etagamma-etajet0); 00226 double dr = sqrt(dphi*dphi+deta*deta); 00227 if(dr < 0.5 ) continue; 00228 resultjet->push_back ((*jet)); 00229 00230 dphi = dphi*180./(4.*atan(1.)); 00231 if( fabs(dphi-180) < 30. ) 00232 { 00233 // cout<<" Jet is found "<<endl; 00234 iejet = 1; 00235 phijet = (*jet).phi(); 00236 etajet = (*jet).eta(); 00237 } // dphi 00238 } //jet collection 00239 if(iejet == 0) resultjet->clear(); 00240 } 00241 } // Jet collection 00242 00243 if( resultjet->size() == 0 ) { 00244 00245 iEvent.put( outputTColl, "GammaJetTracksCollection"); 00246 iEvent.put( miniEcalRecHitCollection, "GammaJetEcalRecHitCollection"); 00247 iEvent.put( miniHBHERecHitCollection, "GammaJetHBHERecHitCollection"); 00248 iEvent.put( miniHORecHitCollection, "GammaJetHORecHitCollection"); 00249 iEvent.put( miniHFRecHitCollection, "GammaJetHFRecHitCollection"); 00250 iEvent.put( result, "GammaJetGammaBackToBackCollection"); 00251 iEvent.put( resultjet, "GammaJetJetBackToBackCollection"); 00252 00253 return; 00254 } 00255 // cout<<" Accepted event "<<resultjet->size()<<" PHI gamma "<<phigamma<<std::endl; 00256 // 00257 // Add Ecal, Hcal RecHits around Egamma caluster 00258 // 00259 00260 // Load EcalRecHits 00261 00262 00263 std::vector<edm::InputTag>::const_iterator i; 00264 for (i=ecalLabels_.begin(); i!=ecalLabels_.end(); i++) { 00265 edm::Handle<EcalRecHitCollection> ec; 00266 iEvent.getByLabel(*i,ec); 00267 if (!ec.isValid()) { 00268 // can't find it! 00269 if (!allowMissingInputs_) { 00270 cout<<" No ECAL input "<<endl; 00271 *ec; // will throw the proper exception 00272 } 00273 } else { 00274 for(EcalRecHitCollection::const_iterator recHit = (*ec).begin(); 00275 recHit != (*ec).end(); ++recHit) 00276 { 00277 // EcalBarrel = 1, EcalEndcap = 2 00278 GlobalPoint pos = geo->getPosition(recHit->detid()); 00279 double phihit = pos.phi(); 00280 double etahit = pos.eta(); 00281 00282 double dphi = fabs(phigamma - phihit); 00283 if(dphi > 4.*atan(1.)) dphi = 8.*atan(1.) - dphi; 00284 double deta = fabs(etagamma - etahit); 00285 double dr = sqrt(dphi*dphi + deta*deta); 00286 if(dr<1.) miniEcalRecHitCollection->push_back(*recHit); 00287 00288 dphi = fabs(phijet - phihit); 00289 if(dphi > 4.*atan(1.)) dphi = 8.*atan(1.) - dphi; 00290 deta = fabs(etajet - etahit); 00291 dr = sqrt(dphi*dphi + deta*deta); 00292 if(dr<1.4) miniEcalRecHitCollection->push_back(*recHit); 00293 00294 } 00295 } 00296 } 00297 00298 // cout<<" Ecal is done "<<endl; 00299 00300 edm::Handle<HBHERecHitCollection> hbhe; 00301 iEvent.getByLabel(hbheLabel_,hbhe); 00302 if (!hbhe.isValid()) { 00303 // can't find it! 00304 if (!allowMissingInputs_) { 00305 *hbhe; // will throw the proper exception 00306 } 00307 } else { 00308 const HBHERecHitCollection Hithbhe = *(hbhe.product()); 00309 for(HBHERecHitCollection::const_iterator hbheItr=Hithbhe.begin(); hbheItr!=Hithbhe.end(); hbheItr++) 00310 { 00311 GlobalPoint pos = geo->getPosition(hbheItr->detid()); 00312 double phihit = pos.phi(); 00313 double etahit = pos.eta(); 00314 00315 double dphi = fabs(phigamma - phihit); 00316 if(dphi > 4.*atan(1.)) dphi = 8.*atan(1.) - dphi; 00317 double deta = fabs(etagamma - etahit); 00318 double dr = sqrt(dphi*dphi + deta*deta); 00319 00320 00321 if(dr<1.) miniHBHERecHitCollection->push_back(*hbheItr); 00322 dphi = fabs(phijet - phihit); 00323 if(dphi > 4.*atan(1.)) dphi = 8.*atan(1.) - dphi; 00324 deta = fabs(etajet - etahit); 00325 dr = sqrt(dphi*dphi + deta*deta); 00326 if(dr<1.4) miniHBHERecHitCollection->push_back(*hbheItr); 00327 } 00328 } 00329 00330 // cout<<" HBHE is done "<<endl; 00331 00332 edm::Handle<HORecHitCollection> ho; 00333 iEvent.getByLabel(hoLabel_,ho); 00334 if (!ho.isValid()) { 00335 // can't find it! 00336 if (!allowMissingInputs_) { 00337 *ho; // will throw the proper exception 00338 } 00339 } else { 00340 const HORecHitCollection Hitho = *(ho.product()); 00341 for(HORecHitCollection::const_iterator hoItr=Hitho.begin(); hoItr!=Hitho.end(); hoItr++) 00342 { 00343 GlobalPoint pos = geo->getPosition(hoItr->detid()); 00344 double phihit = pos.phi(); 00345 double etahit = pos.eta(); 00346 00347 double dphi = fabs(phigamma - phihit); 00348 if(dphi > 4.*atan(1.)) dphi = 8.*atan(1.) - dphi; 00349 double deta = fabs(etagamma - etahit); 00350 double dr = sqrt(dphi*dphi + deta*deta); 00351 00352 if(dr<1.) miniHORecHitCollection->push_back(*hoItr); 00353 dphi = fabs(phijet - phihit); 00354 if(dphi > 4.*atan(1.)) dphi = 8.*atan(1.) - dphi; 00355 deta = fabs(etajet - etahit); 00356 dr = sqrt(dphi*dphi + deta*deta); 00357 if(dr<1.4) miniHORecHitCollection->push_back(*hoItr); 00358 00359 } 00360 } 00361 00362 // cout<<" HO is done "<<endl; 00363 00364 edm::Handle<HFRecHitCollection> hf; 00365 iEvent.getByLabel(hfLabel_,hf); 00366 if (!hf.isValid()) { 00367 // can't find it! 00368 if (!allowMissingInputs_) { 00369 *hf; // will throw the proper exception 00370 } 00371 } else { 00372 const HFRecHitCollection Hithf = *(hf.product()); 00373 // cout<<" Size of HF collection "<<Hithf.size()<<endl; 00374 for(HFRecHitCollection::const_iterator hfItr=Hithf.begin(); hfItr!=Hithf.end(); hfItr++) 00375 { 00376 GlobalPoint pos = geo->getPosition(hfItr->detid()); 00377 00378 double phihit = pos.phi(); 00379 double etahit = pos.eta(); 00380 00381 double dphi = fabs(phigamma - phihit); 00382 if(dphi > 4.*atan(1.)) dphi = 8.*atan(1.) - dphi; 00383 double deta = fabs(etagamma - etahit); 00384 double dr = sqrt(dphi*dphi + deta*deta); 00385 00386 if(dr<1.) miniHFRecHitCollection->push_back(*hfItr); 00387 dphi = fabs(phijet - phihit); 00388 if(dphi > 4.*atan(1.)) dphi = 8.*atan(1.) - dphi; 00389 deta = fabs(etajet - etahit); 00390 dr = sqrt(dphi*dphi + deta*deta); 00391 00392 if( dr < 1.4 ) miniHFRecHitCollection->push_back(*hfItr); 00393 } 00394 } 00395 00396 // cout<<" Size of mini HF collection "<<miniHFRecHitCollection->size()<<endl; 00397 00398 00399 // Track Collection 00400 edm::Handle<reco::TrackCollection> trackCollection; 00401 iEvent.getByLabel(m_inputTrackLabel,trackCollection); 00402 if (!trackCollection.isValid()) { 00403 // can't find it! 00404 if (!allowMissingInputs_) { 00405 *trackCollection; // will throw the proper exception 00406 } 00407 } else { 00408 const reco::TrackCollection tC = *(trackCollection.product()); 00409 00410 //Create empty output collections 00411 00412 00413 for (reco::TrackCollection::const_iterator track=tC.begin(); track!=tC.end(); track++) 00414 { 00415 00416 double deta = track->momentum().eta() - etagamma; 00417 00418 double dphi = fabs(track->momentum().phi() - phigamma); 00419 00420 if (dphi > atan(1.)*4.) dphi = 8.*atan(1.) - dphi; 00421 double ddir1 = sqrt(deta*deta+dphi*dphi); 00422 00423 00424 00425 deta = track->momentum().eta() - etajet; 00426 dphi = fabs(track->momentum().phi() - phijet); 00427 if (dphi > atan(1.)*4.) dphi = 8.*atan(1.) - dphi; 00428 double ddir2 = sqrt(deta*deta+dphi*dphi); 00429 00430 if( ddir1 < 1.4 || ddir2 < 1.4) 00431 { 00432 outputTColl->push_back(*track); 00433 } 00434 } 00435 } 00436 00437 //Put selected information in the event 00438 00439 iEvent.put( outputTColl, "GammaJetTracksCollection"); 00440 iEvent.put( miniEcalRecHitCollection, "GammaJetEcalRecHitCollection"); 00441 iEvent.put( miniHBHERecHitCollection, "GammaJetHBHERecHitCollection"); 00442 iEvent.put( miniHORecHitCollection, "GammaJetHORecHitCollection"); 00443 iEvent.put( miniHFRecHitCollection, "GammaJetHFRecHitCollection"); 00444 iEvent.put( result, "GammaJetGammaBackToBackCollection"); 00445 iEvent.put( resultjet, "GammaJetJetBackToBackCollection"); 00446 }
Definition at line 54 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().
std::string AlCaGammaJetProducer::correctedIslandBarrelSuperClusterCollection_ [private] |
Definition at line 49 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().
std::string AlCaGammaJetProducer::correctedIslandBarrelSuperClusterProducer_ [private] |
Definition at line 50 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().
std::string AlCaGammaJetProducer::correctedIslandEndcapSuperClusterCollection_ [private] |
Definition at line 51 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().
std::string AlCaGammaJetProducer::correctedIslandEndcapSuperClusterProducer_ [private] |
Definition at line 52 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().
std::vector<edm::InputTag> AlCaGammaJetProducer::ecalLabels_ [private] |
Definition at line 47 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().
const CaloGeometry* AlCaGammaJetProducer::geo [private] |
Definition at line 44 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().
edm::InputTag AlCaGammaJetProducer::hfLabel_ [private] |
Definition at line 46 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().
edm::InputTag AlCaGammaJetProducer::hoLabel_ [private] |
Definition at line 45 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().
std::string AlCaGammaJetProducer::m_inputTrackLabel [private] |
Definition at line 55 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().
std::vector<edm::InputTag> AlCaGammaJetProducer::mInputCalo [private] |
Definition at line 48 of file AlCaGammaJetProducer.h.
Referenced by AlCaGammaJetProducer(), and produce().