ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/CmsHi/JetAnalysis/src/MyVirtualJetProducer.cc
Revision: 1.3
Committed: Fri Jun 25 11:57:35 2010 UTC (14 years, 10 months ago) by yilmaz
Content type: text/plain
Branch: MAIN
Changes since 1.2: +11 -4 lines
Log Message:
compatible with new PU code

File Contents

# User Rev Content
1 yilmaz 1.1 ////////////////////////////////////////////////////////////////////////////////
2     //
3     // MyVirtualJetProducer
4     // ------------------
5     //
6     // 04/21/2009 Philipp Schieferdecker <philipp.schieferdecker@cern.ch>
7     ////////////////////////////////////////////////////////////////////////////////
8    
9     #include "MyVirtualJetProducer.h"
10     #include "RecoJets/JetProducers/interface/JetSpecific.h"
11    
12     #include "FWCore/Framework/interface/Event.h"
13     #include "FWCore/Framework/interface/EventSetup.h"
14     #include "FWCore/Framework/interface/ESHandle.h"
15     #include "FWCore/Utilities/interface/CodedException.h"
16     #include "FWCore/MessageLogger/interface/MessageLogger.h"
17     #include "FWCore/Framework/interface/MakerMacros.h"
18    
19     #include "DataFormats/Common/interface/View.h"
20     #include "DataFormats/Common/interface/Handle.h"
21     #include "DataFormats/VertexReco/interface/Vertex.h"
22     #include "DataFormats/VertexReco/interface/VertexFwd.h"
23     #include "DataFormats/JetReco/interface/CaloJetCollection.h"
24     #include "DataFormats/JetReco/interface/GenJetCollection.h"
25     #include "DataFormats/JetReco/interface/PFJetCollection.h"
26     #include "DataFormats/JetReco/interface/BasicJetCollection.h"
27     #include "DataFormats/JetReco/interface/TrackJetCollection.h"
28     #include "DataFormats/Candidate/interface/CandidateFwd.h"
29     #include "DataFormats/Candidate/interface/LeafCandidate.h"
30 yilmaz 1.2 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
31     #include "Geometry/Records/interface/CaloGeometryRecord.h"
32    
33     #include "DataFormats/Math/interface/Vector3D.h"
34 yilmaz 1.1
35     #include "fastjet/SISConePlugin.hh"
36     #include "fastjet/CMSIterativeConePlugin.hh"
37     #include "fastjet/ATLASConePlugin.hh"
38     #include "fastjet/CDFMidPointPlugin.hh"
39    
40     #include <iostream>
41     #include <memory>
42     #include <algorithm>
43     #include <limits>
44     #include <cmath>
45    
46     using namespace std;
47    
48    
49     namespace reco {
50     namespace helper {
51     struct GreaterByPtPseudoJet {
52     bool operator()( const fastjet::PseudoJet & t1, const fastjet::PseudoJet & t2 ) const {
53     return t1.perp() > t2.perp();
54     }
55     };
56    
57     }
58     }
59    
60     //______________________________________________________________________________
61     const char *MyVirtualJetProducer::JetType::names[] = {
62     "BasicJet","GenJet","CaloJet","PFJet","TrackJet"
63     };
64    
65    
66     //______________________________________________________________________________
67     MyVirtualJetProducer::JetType::Type
68     MyVirtualJetProducer::JetType::byName(const string &name)
69     {
70     const char **pos = std::find(names, names + LastJetType, name);
71     if (pos == names + LastJetType) {
72     std::string errorMessage="Requested jetType not supported: "+name+"\n";
73     throw cms::Exception("Configuration",errorMessage);
74     }
75     return (Type)(pos-names);
76     }
77    
78    
79     void MyVirtualJetProducer::makeProduces( std::string alias, std::string tag )
80     {
81     if (makeCaloJet(jetTypeE)) {
82     produces<reco::CaloJetCollection>(tag).setBranchAlias(alias);
83     }
84     else if (makePFJet(jetTypeE)) {
85     produces<reco::PFJetCollection>(tag).setBranchAlias(alias);
86     }
87     else if (makeGenJet(jetTypeE)) {
88     produces<reco::GenJetCollection>(tag).setBranchAlias(alias);
89     }
90     else if (makeTrackJet(jetTypeE)) {
91     produces<reco::TrackJetCollection>(tag).setBranchAlias(alias);
92     }
93     else if (makeBasicJet(jetTypeE)) {
94     produces<reco::BasicJetCollection>(tag).setBranchAlias(alias);
95     }
96     }
97    
98     ////////////////////////////////////////////////////////////////////////////////
99     // construction / destruction
100     ////////////////////////////////////////////////////////////////////////////////
101    
102     //______________________________________________________________________________
103     MyVirtualJetProducer::MyVirtualJetProducer(const edm::ParameterSet& iConfig)
104     : moduleLabel_ (iConfig.getParameter<string> ("@module_label"))
105     , src_ (iConfig.getParameter<edm::InputTag>("src"))
106     , srcPVs_ (iConfig.getParameter<edm::InputTag>("srcPVs"))
107     , jetType_ (iConfig.getParameter<string> ("jetType"))
108     , jetAlgorithm_ (iConfig.getParameter<string> ("jetAlgorithm"))
109     , rParam_ (iConfig.getParameter<double> ("rParam"))
110     , inputEtMin_ (iConfig.getParameter<double> ("inputEtMin"))
111     , inputEMin_ (iConfig.getParameter<double> ("inputEMin"))
112     , jetPtMin_ (iConfig.getParameter<double> ("jetPtMin"))
113     , doPVCorrection_(iConfig.getParameter<bool> ("doPVCorrection"))
114     , restrictInputs_(false)
115     , maxInputs_(99999999)
116     , doAreaFastjet_ (iConfig.getParameter<bool> ("doAreaFastjet"))
117     , doRhoFastjet_ (iConfig.getParameter<bool> ("doRhoFastjet"))
118     , doPUOffsetCorr_(iConfig.getParameter<bool> ("doPUOffsetCorr"))
119     , maxBadEcalCells_ (iConfig.getParameter<unsigned>("maxBadEcalCells"))
120     , maxRecoveredEcalCells_ (iConfig.getParameter<unsigned>("maxRecoveredEcalCells"))
121     , maxProblematicEcalCells_(iConfig.getParameter<unsigned>("maxProblematicEcalCells"))
122     , maxBadHcalCells_ (iConfig.getParameter<unsigned>("maxBadHcalCells"))
123     , maxRecoveredHcalCells_ (iConfig.getParameter<unsigned>("maxRecoveredHcalCells"))
124     , maxProblematicHcalCells_(iConfig.getParameter<unsigned>("maxProblematicHcalCells"))
125     , jetCollInstanceName_ ("")
126     {
127    
128 yilmaz 1.2 // ntuple = new TNtuple("nt","debug","ieta:eta:iphi:phi");
129    
130 yilmaz 1.1 //
131     // additional parameters to think about:
132     // - overlap threshold (set to 0.75 for the time being)
133     // - p parameter for generalized kT (set to -2 for the time being)
134     // - fastjet PU subtraction parameters (not yet considered)
135     //
136     if (jetAlgorithm_=="SISCone") {
137     fjPlugin_ = PluginPtr( new fastjet::SISConePlugin(rParam_,0.75,0,0.0,false,
138     fastjet::SISConePlugin::SM_pttilde) );
139     fjJetDefinition_= JetDefPtr( new fastjet::JetDefinition(&*fjPlugin_) );
140     }
141     else if (jetAlgorithm_=="IterativeCone") {
142     fjPlugin_ = PluginPtr(new fastjet::CMSIterativeConePlugin(rParam_,1.0));
143     fjJetDefinition_= JetDefPtr(new fastjet::JetDefinition(&*fjPlugin_));
144     }
145     else if (jetAlgorithm_=="CDFMidPoint") {
146     fjPlugin_ = PluginPtr(new fastjet::CDFMidPointPlugin(rParam_,0.75));
147     fjJetDefinition_= JetDefPtr(new fastjet::JetDefinition(&*fjPlugin_));
148     }
149     else if (jetAlgorithm_=="ATLASCone") {
150     fjPlugin_ = PluginPtr(new fastjet::ATLASConePlugin(rParam_));
151     fjJetDefinition_= JetDefPtr(new fastjet::JetDefinition(&*fjPlugin_));
152     }
153     else if (jetAlgorithm_=="Kt")
154     fjJetDefinition_= JetDefPtr(new fastjet::JetDefinition(fastjet::kt_algorithm,rParam_));
155     else if (jetAlgorithm_=="CambridgeAachen")
156     fjJetDefinition_= JetDefPtr(new fastjet::JetDefinition(fastjet::cambridge_algorithm,
157     rParam_) );
158     else if (jetAlgorithm_=="AntiKt")
159     fjJetDefinition_= JetDefPtr( new fastjet::JetDefinition(fastjet::antikt_algorithm,rParam_) );
160     else if (jetAlgorithm_=="GeneralizedKt")
161     fjJetDefinition_= JetDefPtr( new fastjet::JetDefinition(fastjet::genkt_algorithm,
162     rParam_,-2) );
163     else
164     throw cms::Exception("Invalid jetAlgorithm")
165     <<"Jet algorithm for MyVirtualJetProducer is invalid, Abort!\n";
166    
167     jetTypeE=JetType::byName(jetType_);
168    
169     if ( iConfig.exists("jetCollInstanceName") ) {
170     jetCollInstanceName_ = iConfig.getParameter<string>("jetCollInstanceName");
171     }
172    
173     if ( doPUOffsetCorr_ ) {
174 yilmaz 1.3 if ( jetTypeE != JetType::CaloJet ) {
175     throw cms::Exception("InvalidInput") << "Can only offset correct jets of type CaloJet";
176     }
177     // subtractor_ = boost::shared_ptr<PileUpSubtractor>(new PileUpSubtractor(iConfig));
178     puSubtractorName_ = iConfig.getParameter<string> ("subtractorName");
179     if(puSubtractorName_.empty()){
180     edm::LogWarning("VirtualJetProducer") << "Pile Up correction on; however, pile up type is not specified. Using default... \n";
181     subtractor_ = boost::shared_ptr<PileUpSubtractor>(new PileUpSubtractor(iConfig));
182     }else{
183     subtractor_ = boost::shared_ptr<PileUpSubtractor>(PileUpSubtractorFactory::get()->create( puSubtractorName_, iConfig));
184     }
185 yilmaz 1.1 }
186    
187     // do fasjet area / rho calcluation? => accept corresponding parameters
188     if ( doAreaFastjet_ || doRhoFastjet_ ) {
189     // default Ghost_EtaMax should be 5
190     double ghostEtaMax = iConfig.getParameter<double>("Ghost_EtaMax");
191     // default Active_Area_Repeats 1
192     int activeAreaRepeats = iConfig.getParameter<int> ("Active_Area_Repeats");
193     // default GhostArea 0.01
194     double ghostArea = iConfig.getParameter<double> ("GhostArea");
195     fjActiveArea_ = ActiveAreaSpecPtr(new fastjet::ActiveAreaSpec(ghostEtaMax,
196     activeAreaRepeats,
197     ghostArea));
198     fjRangeDef_ = RangeDefPtr( new fastjet::RangeDefinition(ghostEtaMax) );
199     }
200    
201     // restrict inputs to first "maxInputs" towers?
202     if ( iConfig.exists("restrictInputs") ) {
203     restrictInputs_ = iConfig.getParameter<bool>("restrictInputs");
204     maxInputs_ = iConfig.getParameter<unsigned int>("maxInputs");
205     }
206    
207    
208     string alias=iConfig.getUntrackedParameter<string>("alias",moduleLabel_);
209    
210     // make the "produces" statements
211     makeProduces( alias, jetCollInstanceName_ );
212    
213     if(doRhoFastjet_){
214     produces<double>("rho");
215     produces<double>("sigma");
216     }
217     }
218    
219    
220     //______________________________________________________________________________
221     MyVirtualJetProducer::~MyVirtualJetProducer()
222     {
223     }
224    
225    
226     ////////////////////////////////////////////////////////////////////////////////
227     // implementation of member functions
228     ////////////////////////////////////////////////////////////////////////////////
229    
230     //______________________________________________________________________________
231     void MyVirtualJetProducer::produce(edm::Event& iEvent,const edm::EventSetup& iSetup)
232     {
233 yilmaz 1.2
234     if(!geo){
235     edm::ESHandle<CaloGeometry> pGeo;
236     iSetup.get<CaloGeometryRecord>().get(pGeo);
237     geo = pGeo.product();
238     }
239    
240 yilmaz 1.1 LogDebug("MyVirtualJetProducer") << "Entered produce\n";
241     //determine signal vertex
242     vertex_=reco::Jet::Point(0,0,0);
243     if (makeCaloJet(jetTypeE)&&doPVCorrection_) {
244     LogDebug("MyVirtualJetProducer") << "Adding PV info\n";
245     edm::Handle<reco::VertexCollection> pvCollection;
246     iEvent.getByLabel(srcPVs_,pvCollection);
247     if (pvCollection->size()>0) vertex_=pvCollection->begin()->position();
248     }
249    
250     // For Pileup subtraction using offset correction:
251     // set up geometry map
252     if ( doPUOffsetCorr_ ) {
253     subtractor_->setupGeometryMap(iEvent, iSetup);
254     }
255    
256     // clear data
257     LogDebug("MyVirtualJetProducer") << "Clear data\n";
258     fjInputs_.clear();
259     fjJets_.clear();
260     inputs_.clear();
261    
262     // get inputs and convert them to the fastjet format (fastjet::PeudoJet)
263     edm::Handle<reco::CandidateView> inputsHandle;
264     iEvent.getByLabel(src_,inputsHandle);
265     for (size_t i = 0; i < inputsHandle->size(); ++i) {
266     inputs_.push_back(inputsHandle->ptrAt(i));
267     }
268     LogDebug("MyVirtualJetProducer") << "Got inputs\n";
269    
270     // Convert candidates to fastjet::PseudoJets.
271     // Also correct to Primary Vertex. Will modify fjInputs_
272     // and use inputs_
273     fjInputs_.reserve(inputs_.size());
274     inputTowers();
275     LogDebug("MyVirtualJetProducer") << "Inputted towers\n";
276    
277     // For Pileup subtraction using offset correction:
278     // Subtract pedestal.
279     if ( doPUOffsetCorr_ ) {
280     subtractor_->calculatePedestal(fjInputs_);
281     subtractor_->subtractPedestal(fjInputs_);
282     LogDebug("MyVirtualJetProducer") << "Subtracted pedestal\n";
283     }
284    
285     // Run algorithm. Will modify fjJets_ and allocate fjClusterSeq_.
286     // This will use fjInputs_
287     runAlgorithm( iEvent, iSetup );
288     if ( doPUOffsetCorr_ ) {
289     subtractor_->setAlgorithm(fjClusterSeq_);
290     }
291    
292     LogDebug("MyVirtualJetProducer") << "Ran algorithm\n";
293    
294     // For Pileup subtraction using offset correction:
295     // Now we find jets and need to recalculate their energy,
296     // mark towers participated in jet,
297     // remove occupied towers from the list and recalculate mean and sigma
298     // put the initial towers collection to the jet,
299     // and subtract from initial towers in jet recalculated mean and sigma of towers
300     if ( doPUOffsetCorr_ ) {
301     vector<fastjet::PseudoJet> orphanInput;
302     subtractor_->calculateOrphanInput(orphanInput);
303     subtractor_->calculatePedestal(orphanInput);
304     subtractor_->offsetCorrectJets();
305     }
306    
307     // Write the output jets.
308     // This will (by default) call the member function template
309     // "writeJets", but can be overridden.
310     // this will use inputs_
311     output( iEvent, iSetup );
312     LogDebug("MyVirtualJetProducer") << "Wrote jets\n";
313    
314     return;
315     }
316    
317     //______________________________________________________________________________
318    
319     void MyVirtualJetProducer::inputTowers( )
320     {
321     std::vector<edm::Ptr<reco::Candidate> >::const_iterator inBegin = inputs_.begin(),
322     inEnd = inputs_.end(), i = inBegin;
323     for (; i != inEnd; ++i ) {
324     reco::CandidatePtr input = *i;
325     if (isnan(input->pt())) continue;
326     if (input->et() <inputEtMin_) continue;
327     if (input->energy()<inputEMin_) continue;
328     if (isAnomalousTower(input)) continue;
329 yilmaz 1.2
330     //Check consistency of kinematics
331    
332     const CaloTower* ctc = dynamic_cast<const CaloTower*>(input.get());
333     if(ctc){
334     int ieta = ctc->id().ieta();
335     int iphi = ctc->id().iphi();
336    
337     ntuple->Fill(ieta, input->eta(), iphi, input->phi(),input->et(),ctc->emEt(),ctc->hadEt());
338    
339     if(abs(ieta) < 5){
340    
341     if(0){
342     math::RhoEtaPhiVector v(1.4,input->eta(),input->phi());
343     GlobalPoint point(v.x(),v.y(),v.z());
344     // const DetId d = geo->getClosestCell(point);
345     // HcalDetId hd(d);
346     HcalDetId hd(0);
347     if(hd.ieta() != ieta || hd.iphi() != iphi){
348     cout<<"Inconsistent kinematics!!! ET = "<<input->pt()<<endl;
349     cout<<"ieta candidate : "<<ieta<<" ieta detid : "<<hd.ieta()<<endl;
350     cout<<"iphi candidate : "<<iphi<<" iphi detid : "<<hd.iphi()<<endl;
351     }
352    
353     }
354    
355     if(0){
356     HcalDetId det(HcalBarrel,ieta,iphi,1);
357    
358     if(geo->present(det)){
359     double eta = geo->getPosition(det).eta();
360     double phi = geo->getPosition(det).phi();
361    
362     if(input->eta() != eta || input->phi() != phi){
363     cout<<"Inconsistent kinematics!!! ET = "<<input->pt()<<endl;
364     cout<<"eta candidate : "<<input->eta()<<" eta detid : "<<eta<<endl;
365     cout<<"phi candidate : "<<input->phi()<<" phi detid : "<<phi<<endl;
366     }
367     }else{
368     cout<<"DetId not present in the Calo Geometry : ieta = "<<ieta<<" iphi = "<<iphi<<endl;
369     }
370     }
371     }
372    
373     }
374    
375 yilmaz 1.1 if (makeCaloJet(jetTypeE)&&doPVCorrection_) {
376     const CaloTower* tower=dynamic_cast<const CaloTower*>(input.get());
377     math::PtEtaPhiMLorentzVector ct(tower->p4(vertex_));
378     fjInputs_.push_back(fastjet::PseudoJet(ct.px(),ct.py(),ct.pz(),ct.energy()));
379     }
380     else {
381     fjInputs_.push_back(fastjet::PseudoJet(input->px(),input->py(),input->pz(),
382     input->energy()));
383     }
384     fjInputs_.back().set_user_index(i - inBegin);
385     }
386    
387     if ( restrictInputs_ && fjInputs_.size() > maxInputs_ ) {
388     reco::helper::GreaterByPtPseudoJet pTComparator;
389     std::sort(fjInputs_.begin(), fjInputs_.end(), pTComparator);
390     fjInputs_.resize(maxInputs_);
391     edm::LogWarning("JetRecoTooManyEntries") << "Too many inputs in the event, limiting to first " << maxInputs_ << ". Output is suspect.";
392     }
393     }
394    
395     //______________________________________________________________________________
396     bool MyVirtualJetProducer::isAnomalousTower(reco::CandidatePtr input)
397     {
398     if (!makeCaloJet(jetTypeE)) return false;
399     const CaloTower* tower=dynamic_cast<const CaloTower*>(input.get());
400     if (0==tower) return false;
401     if (tower->numBadEcalCells() >maxBadEcalCells_ ||
402     tower->numRecoveredEcalCells() >maxRecoveredEcalCells_ ||
403     tower->numProblematicEcalCells()>maxProblematicEcalCells_||
404     tower->numBadHcalCells() >maxBadHcalCells_ ||
405     tower->numRecoveredHcalCells() >maxRecoveredHcalCells_ ||
406     tower->numProblematicHcalCells()>maxProblematicHcalCells_) return true;
407     return false;
408     }
409    
410    
411     //------------------------------------------------------------------------------
412     // This is pure virtual.
413     //______________________________________________________________________________
414     // void MyVirtualJetProducer::runAlgorithm( edm::Event & iEvent, edm::EventSetup const& iSetup,
415     // std::vector<edm::Ptr<reco::Candidate> > const & inputs_);
416    
417     //______________________________________________________________________________
418     void MyVirtualJetProducer::copyConstituents(const vector<fastjet::PseudoJet>& fjConstituents,
419     reco::Jet* jet)
420     {
421     for (unsigned int i=0;i<fjConstituents.size();++i)
422     jet->addDaughter(inputs_[fjConstituents[i].user_index()]);
423     }
424    
425    
426     //______________________________________________________________________________
427     vector<reco::CandidatePtr>
428     MyVirtualJetProducer::getConstituents(const vector<fastjet::PseudoJet>&fjConstituents)
429     {
430     vector<reco::CandidatePtr> result;
431     for (unsigned int i=0;i<fjConstituents.size();i++) {
432     int index = fjConstituents[i].user_index();
433     reco::CandidatePtr candidate = inputs_[index];
434     result.push_back(candidate);
435     }
436     return result;
437     }
438    
439     void MyVirtualJetProducer::output(edm::Event & iEvent, edm::EventSetup const& iSetup)
440     {
441     // Write jets and constitutents. Will use fjJets_, inputs_
442     // and fjClusterSeq_
443     switch( jetTypeE ) {
444     case JetType::CaloJet :
445     writeJets<reco::CaloJet>( iEvent, iSetup);
446     break;
447     case JetType::PFJet :
448     writeJets<reco::PFJet>( iEvent, iSetup);
449     break;
450     case JetType::GenJet :
451     writeJets<reco::GenJet>( iEvent, iSetup);
452     break;
453     case JetType::TrackJet :
454     writeJets<reco::TrackJet>( iEvent, iSetup);
455     break;
456     case JetType::BasicJet :
457     writeJets<reco::BasicJet>( iEvent, iSetup);
458     break;
459     default:
460     throw cms::Exception("InvalidInput") << "invalid jet type in MyVirtualJetProducer\n";
461     break;
462     };
463    
464     }
465    
466     template< typename T >
467     void MyVirtualJetProducer::writeJets( edm::Event & iEvent, edm::EventSetup const& iSetup )
468     {
469     // produce output jet collection
470    
471     using namespace reco;
472    
473     std::auto_ptr<std::vector<T> > jets(new std::vector<T>() );
474     jets->reserve(fjJets_.size());
475    
476     for (unsigned int ijet=0;ijet<fjJets_.size();++ijet) {
477     // allocate this jet
478     T jet;
479     // get the fastjet jet
480     const fastjet::PseudoJet& fjJet = fjJets_[ijet];
481     // get the constituents from fastjet
482     std::vector<fastjet::PseudoJet> fjConstituents =
483     sorted_by_pt(fjClusterSeq_->constituents(fjJet));
484     // convert them to CandidatePtr vector
485     std::vector<CandidatePtr> constituents =
486     getConstituents(fjConstituents);
487    
488     // calcuate the jet area
489     double jetArea=0.0;
490     if ( doAreaFastjet_ ) {
491     fastjet::ClusterSequenceArea const * clusterSequenceWithArea =
492     dynamic_cast<fastjet::ClusterSequenceArea const *>(&*fjClusterSeq_);
493     jetArea = clusterSequenceWithArea->area(fjJet);
494     }
495    
496     // write the specifics to the jet (simultaneously sets 4-vector, vertex).
497     // These are overridden functions that will call the appropriate
498     // specific allocator.
499     writeSpecific(jet,
500     Particle::LorentzVector(fjJet.px(),
501     fjJet.py(),
502     fjJet.pz(),
503     fjJet.E()),
504     vertex_,
505     constituents, iSetup);
506    
507     jet.setJetArea (jetArea);
508    
509     if(doPUOffsetCorr_){
510     jet.setPileup(subtractor_->getPileUpEnergy(ijet));
511     }else{
512     jet.setPileup (0.0);
513     }
514    
515     // add to the list
516     jets->push_back(jet);
517     }
518    
519     // put the jets in the collection
520     iEvent.put(jets);
521    
522     // calculate rho (median pT per unit area, for PU&UE subtraction down the line
523     std::auto_ptr<double> rho(new double(0.0));
524     std::auto_ptr<double> sigma(new double(0.0));
525    
526     if (doRhoFastjet_) {
527     fastjet::ClusterSequenceArea const * clusterSequenceWithArea =
528     dynamic_cast<fastjet::ClusterSequenceArea const *> ( &*fjClusterSeq_ );
529     double mean_area = 0;
530     clusterSequenceWithArea->get_median_rho_and_sigma(*fjRangeDef_,false,*rho,*sigma,mean_area);
531     iEvent.put(rho,"rho");
532     iEvent.put(sigma,"sigma");
533     }
534     }
535