19 #include <boost/foreach.hpp> 30 bool atLeastOneInCommon=
false;
34 atLeastOneInCommon=
true;
39 return atLeastOneInCommon;
42 bool lt_(std::pair<double,short>
a, std::pair<double,short>
b) {
43 return a.first < b.first; }
59 wantTkVtxCompatibility_ = ps.
getParameter<
bool>(
"wantTkVtxCompatibility");
60 sigmaTkVtxComp_ = ps.
getParameter<uint32_t>(
"sigmaTkVtxComp");
61 wantCompatibleInnerHits_ = ps.
getParameter<
bool>(
"wantCompatibleInnerHits");
62 TkMinNumOfDOF_ = ps.
getParameter<uint32_t>(
"TkMinNumOfDOF");
64 wantHighpurity_ = ps.
getParameter<
bool>(
"wantHighpurity");
65 _vertexChi2ProbCut = ps.
getParameter<
double>(
"vertexChi2ProbCut");
67 _minDistanceOfApproachMinCut = ps.
getParameter<
double>(
"minDistanceOfApproachMinCut");
68 _minDistanceOfApproachMaxCut = ps.
getParameter<
double>(
"minDistanceOfApproachMaxCut");
72 pi0OnlineSwitch_ = ps.
getParameter<
bool>(
"pi0OnlineSwitch");
73 pi0SmallWindow_ = ps.
getParameter<std::vector<double> >(
"pi0SmallWindow");
74 pi0LargeWindow_ = ps.
getParameter<std::vector<double> >(
"pi0LargeWindow");
77 convAlgo_ = StringToEnumValue<reco::Conversion::ConversionAlgorithm>(
algo);
79 std::vector<std::string> qual = ps.
getParameter<std::vector<std::string> >(
"convQuality");
80 if( qual[0] !=
"" ) convQuality_ =StringToEnumValue<reco::Conversion::ConversionQuality>(qual);
84 produces<pat::CompositeCandidateCollection>(
"conversions");
86 total_conversions = 0;
106 event.getByToken(thePVsToken_, priVtxs);
109 event.getByToken(convCollectionToken_,pConv);
112 event.getByToken(pfCandidateCollectionToken_,pfcandidates);
118 for(reco::ConversionCollection::const_iterator
conv = pConv->begin();
conv != pConv->end(); ++
conv){
121 if (! ( *convSelection_)(*conv)){
125 if (convAlgo_ != 0 &&
conv->algo()!= convAlgo_){
129 if(convQuality_.size() > 0){
131 for (std::vector<int>::const_iterator
flag = convQuality_.begin();
flag!=convQuality_.end(); ++
flag){
133 if (!
conv->quality(q)) {
143 outCollection->push_back(*
conv);
146 removeDuplicates(*outCollection);
148 for (reco::ConversionCollection::const_iterator
conv = outCollection->begin();
conv != outCollection->end(); ++
conv){
158 bool flagTkVtxCompatibility =
true;
159 if (! checkTkVtxCompatibility(*
conv,*priVtxs.
product())) {
160 flagTkVtxCompatibility =
false;
161 if (wantTkVtxCompatibility_) {
166 bool flagCompatibleInnerHits =
false;
167 if (
conv->tracks().size()==2) {
170 if ( foundCompatibleInnerHits(hitPatA,hitPatB) && foundCompatibleInnerHits(hitPatB,hitPatA) ) flagCompatibleInnerHits =
true;
172 if (wantCompatibleInnerHits_ && ! flagCompatibleInnerHits) {
176 bool flagHighpurity =
true;
178 flagHighpurity =
false;
179 if (wantHighpurity_) {
184 bool pizero_rejected =
false;
185 bool large_pizero_window = CheckPi0(*
conv, pfphotons, pizero_rejected);
186 if (pi0OnlineSwitch_ && pizero_rejected) {
192 if (flag1 && flag2 && flag3 && flag4){
193 flags = PackFlags(*
conv,flagTkVtxCompatibility,flagCompatibleInnerHits,flagHighpurity,pizero_rejected,large_pizero_window);
196 patoutCollection->push_back(*pat_conv);
200 store_conversion += patoutCollection->size();
201 event.put(
std::move(patoutCollection),
"conversions");
203 delete convSelection_;
207 bool flagCompatibleInnerHits,
bool flagHighpurity,
208 bool pizero_rejected,
bool large_pizero_window ) {
210 if ( flagTkVtxCompatibility ) flags += 1;
211 if ( flagCompatibleInnerHits ) flags += 2;
212 if ( flagHighpurity ) flags += 4;
213 if ( pizero_rejected ) flags += 8;
214 if ( large_pizero_window ) flags += 16;
216 flags += (conv.
algo()*32);
218 std::vector<std::string> s_quals;
219 s_quals.push_back(
"generalTracksOnly");
220 s_quals.push_back(
"arbitratedEcalSeeded");
221 s_quals.push_back(
"arbitratedMerged");
222 s_quals.push_back(
"arbitratedMergedEcalGeneral");
223 s_quals.push_back(
"highPurity");
224 s_quals.push_back(
"highEfficiency");
225 s_quals.push_back(
"ecalMatched1Track");
226 s_quals.push_back(
"ecalMatched2Track");
227 std::vector<int> i_quals = StringToEnumValue<reco::Conversion::ConversionQuality>(s_quals);
228 for (std::vector<int>::const_iterator qq = i_quals.begin(); qq!=i_quals.end(); ++qq) {
230 if (conv.
quality(q)) q_mask = *qq;
232 flags += (q_mask*32*8);
245 while(iter1 < (( (
int) c.size() ) - 1) ){
248 c.erase( c.begin() + iter2 );
259 std::vector< std::pair< double, short> >
idx[2];
271 if(fabs(dz_)/dzError_ > sigmaTkVtxComp_)
continue;
273 idx[ik].push_back(std::pair<double,short>(fabs(dz_),count));
275 if(idx[ik].
size()==0) {
return false;}
277 std::stable_sort(idx[ik].
begin(),idx[ik].
end(),
lt_);
285 uint32_t oldSubStr=0;
286 for (
int i=0;
i<hitPatA.
numberOfHits(reco::HitPattern::HitCategory::TRACK_HITS) && count<2;
i++) {
287 uint32_t hitA = hitPatA.
getHitPattern(reco::HitPattern::HitCategory::TRACK_HITS,
i);
310 int closest_pv_index = 0;
347 for (reco::PFCandidateCollection::const_iterator
cand = pfcandidates.begin();
cand != pfcandidates.end(); ++
cand){
354 bool &pizero_rejected ) {
358 bool check_small =
false;
359 bool check_large =
false;
361 float small1 = pi0SmallWindow_[0];
362 float small2 = pi0SmallWindow_[1];
363 float large1 = pi0LargeWindow_[0];
364 float large2 = pi0LargeWindow_[1];
365 for (reco::PFCandidateCollection::const_iterator
photon = photons.begin();
photon!=photons.end(); ++
photon) {
367 if (inv > large1 && inv < large2) {
369 if (inv > small1 && inv < small2) {
375 pizero_rejected = check_small;
385 std::cout <<
"############################" << std::endl;
386 std::cout <<
"Conversion Candidate producer report" << std::endl;
387 std::cout <<
"############################" << std::endl;
388 std::cout <<
"Total examined conversions: " << total_conversions << std::endl;
389 std::cout <<
"Selection fail candidates: " << selection_fail << std::endl;
390 std::cout <<
"Algo fail candidates: " << algo_fail << std::endl;
391 std::cout <<
"Quality fail candidates: " << flag_fail << std::endl;
392 std::cout <<
"Pi0 fail: " << pizero_fail << std::endl;
393 std::cout <<
"Total duplicates found: " << duplicates << std::endl;
394 std::cout <<
"Vertex compatibility fail: " << TkVtxC << std::endl;
395 std::cout <<
"Compatible inner hits fail: " << CInnerHits << std::endl;
396 std::cout <<
"Highpurity Subset fail: " << highpurity_count << std::endl;
397 std::cout <<
"############################" << std::endl;
398 std::cout <<
"Final number of conversions: " << final_conversion << std::endl;
399 std::cout <<
"Stored number of conversions: " << store_conversion << std::endl;
400 std::cout <<
"############################" << std::endl;
const reco::Vertex & conversionVertex() const
returns the reco conversion vertex
Analysis-level particle class.
T getParameter(std::string const &) const
static uint32_t getLayer(uint16_t pattern)
bool foundCompatibleInnerHits(const reco::HitPattern &hitPatA, const reco::HitPattern &hitPatB)
ConversionAlgorithm algo() const
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
static HepMC::IO_HEPEVT conv
double dxyError() const
error on dxy
bool quality(ConversionQuality q) const
#define DEFINE_FWK_MODULE(type)
reco::Candidate::LorentzVector convertVector(const math::XYZTLorentzVectorF &)
uint16_t getTrackerMonoStereo(HitCategory category, uint16_t substr, uint16_t layer) const
double zOfPrimaryVertexFromTracks(const math::XYZPoint &myBeamSpot=math::XYZPoint()) const
double distOfMinimumApproach() const
bool HighpuritySubset(const reco::Conversion &, const reco::VertexCollection &)
std::vector< Variable::Flags > flags
std::vector< Vertex > VertexCollection
collection of Vertex objects
bool ConversionLessByChi2(const reco::Conversion &c1, const reco::Conversion &c2)
double covariance(int i, int j) const
(i, j)-th element of error matrix, i, j = 0, ... 2
const Point & position() const
position
std::vector< Conversion > ConversionCollection
collectin of Conversion objects
static bool validHitFilter(uint16_t pattern)
U second(std::pair< T, U > const &p)
virtual void produce(edm::Event &event, const edm::EventSetup &esetup)
bool operator==(const reco::Conversion &c1, const reco::Conversion &c2)
bool ConversionEqualByTrack(const reco::Conversion &c1, const reco::Conversion &c2)
bool checkTkVtxCompatibility(const reco::Conversion &, const reco::VertexCollection &)
double ndof() const
number of degrees of freedom of the fit
int PackFlags(const reco::Conversion &, bool, bool, bool, bool, bool)
double chi2() const
chi-squares
float ChiSquaredProbability(double chiSquared, double nrDOF)
virtual void setVertex(const Point &vertex)
set vertex
void addUserInt(const std::string &label, int32_t data, const bool overwrite=false)
Set user-defined int.
static uint32_t getSubStructure(uint16_t pattern)
const reco::PFCandidateCollection selectPFPhotons(const reco::PFCandidateCollection &)
OniaPhotonConversionProducer(const edm::ParameterSet &ps)
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
double dzError() const
error on dz
math::XYZTLorentzVectorF refittedPair4Momentum() const
Conversion track pair 4-momentum from the tracks refitted with vertex constraint. ...
bool lt_(std::pair< double, short > a, std::pair< double, short > b)
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
static bool trackerHitFilter(uint16_t pattern)
std::vector< CompositeCandidate > CompositeCandidateCollection
T const * product() const
virtual void setP4(const LorentzVector &p4) final
set 4-momentum
math::XYZTLorentzVector LorentzVector
Lorentz vector.
bool CheckPi0(const reco::Conversion &, const reco::PFCandidateCollection &, bool &)
pat::CompositeCandidate * makePhotonCandidate(const reco::Conversion &)
int charge() const
track electric charge
void removeDuplicates(reco::ConversionCollection &)
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< float > > XYZTLorentzVectorF
Lorentz vector with cylindrical internal representation using pseudorapidity.
uint16_t getHitPattern(HitCategory category, int position) const
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
void addUserData(const std::string &label, const T &data, bool transientOnly=false, bool overwrite=false)
std::vector< edm::RefToBase< reco::Track > > const & tracks() const
vector of track to base references
int numberOfHits(HitCategory category) const