CMS 3D CMS Logo

ConversionSeedFilterCharge.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: ConversionSeedFilterCharge
4 // Class: ConversionSeedFilterCharge
5 //
13 //
14 // Original Author: Giuseppe Cerati
15 // Created: Thu Mar 11 10:48:48 CET 2010
16 //
17 //
18 
19 #include <memory>
36 
38 public:
40  ~ConversionSeedFilterCharge() override;
41 
42 private:
43  void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
47 
48  const uint32_t maxInputSeeds;
49 };
50 
52  inputCollPos(consumes<TrajectorySeedCollection>(cfg.getParameter<edm::InputTag>("seedCollectionPos"))),
53  inputCollNeg(consumes<TrajectorySeedCollection>(cfg.getParameter<edm::InputTag>("seedCollectionNeg"))),
54  deltaPhiCut(cfg.getParameter<double>("deltaPhiCut")),
55  deltaCotThetaCut(cfg.getParameter<double>("deltaCotThetaCut")),
56  deltaRCut(cfg.getParameter<double>("deltaRCut")),
57  deltaZCut(cfg.getParameter<double>("deltaZCut")),
58  maxInputSeeds(cfg.getParameter<uint32_t>("maxInputSeeds"))
59 {
60  produces<TrajectorySeedCollection>();
61 }
62 
63 
65 
66 
68  using namespace edm;
69  using namespace std;
71  iEvent.getByToken(inputCollPos,pInPos);
73  iEvent.getByToken(inputCollNeg,pInNeg);
74 
76  iSetup.get<TrackerDigiGeometryRecord>().get(theG);
78  iSetup.get<IdealMagneticFieldRecord>().get(theMF);
79 
80  auto result = std::make_unique<TrajectorySeedCollection>();
81  result->reserve(pInPos->size());
82 
83  if (pInPos->size()<maxInputSeeds && pInNeg->size()<maxInputSeeds) {
84 
85  edm::LogInfo("ConversionSeedFilterCharge") << "New Event \t Pos " << pInPos->size() << " \t Neg " << pInNeg->size() << std::endl;
86 
87  std::vector<int> inResult;
88  for (TrajectorySeedCollection::const_iterator iS1=pInPos->begin(); iS1!=pInPos->end(); ++iS1){
89  PTrajectoryStateOnDet state1 = iS1->startingState();
90  DetId detId1(state1.detId());
91  TrajectoryStateOnSurface tsos1 = trajectoryStateTransform::transientState( state1, &(theG->idToDet(detId1)->surface()), theMF.product());
92  double phi1 = tsos1.globalMomentum().phi();
93  double cotTheta1 = 1/tan(tsos1.globalMomentum().theta());
94  double r1 = tsos1.globalPosition().perp();
95  double z1 = tsos1.globalPosition().z();
96  //cout << "detId1=" << detId1 << " phi1=" << phi1 << " cotTheta1=" << cotTheta1 << " r1=" << r1 << " z1=" << z1 << endl;
97 
98  bool pushed = false;
99  for (TrajectorySeedCollection::const_iterator iS2=pInNeg->begin(); iS2!=pInNeg->end(); ++iS2){
100  PTrajectoryStateOnDet state2 = iS2->startingState();
101  DetId detId2(state2.detId());
102  TrajectoryStateOnSurface tsos2 = trajectoryStateTransform::transientState( state2, &(theG->idToDet(detId2)->surface()), theMF.product());
103 
104  double deltaPhi = fabs(reco::deltaPhi(phi1,tsos2.globalMomentum().phi()));
105  double deltaCotTheta = fabs(cotTheta1-1/tan(tsos2.globalMomentum().theta()));
106  double deltaR = fabs(r1-tsos2.globalPosition().perp());
107  double deltaZ = fabs(z1-tsos2.globalPosition().z());
108 
109  // double phi2 = tsos2.globalMomentum().phi();
110  // double cotTheta2 = 2/tan(tsos2.globalMomentum().theta());
111  // double r2 = tsos2.globalPosition().perp();
112  // double z2 = tsos2.globalPosition().z();
113  //cout << "j=" << j << " detId2=" << detId2 << " phi2=" << phi2 << " cotTheta2=" << cotTheta2 << " r2=" << r2 << " z2=" << z2 << endl;
114 
115  if (deltaPhi<deltaPhiCut && deltaCotTheta<deltaCotThetaCut && deltaR<deltaRCut && deltaZ<deltaZCut) {
116  edm::LogInfo("ConversionSeedFilterCharge") << "[SearchAmongSeeds] match in pos " << iS1-pInPos->begin() << " " << iS2-pInNeg->begin() << std::endl;
117  //cout << "match" << endl;
118  if (!pushed) {
119  result->push_back(*iS1);
120  pushed = true;
121  }
122  if (std::find(inResult.begin(),inResult.end(),iS2-pInNeg->begin())==inResult.end()){
123  result->push_back(*iS2);
124  inResult.push_back(iS2-pInNeg->begin());
125  }
126  }
127  }
128  }
129 
130  }
131 
132  edm::LogInfo("ConversionSeedFilterCharge") << "\nNew Event : result size " << result->size() << std::endl;
133 
134  //cout << "sizes: pInPos=" << pInPos->size() << " pInNeg=" << pInNeg->size() << " result=" << result->size() << endl;
135  iEvent.put(std::move(result));
136 
137 }
138 
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:22
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
ConversionSeedFilterCharge(const edm::ParameterSet &)
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:42
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::EDGetTokenT< TrajectorySeedCollection > inputCollNeg
std::vector< TrajectorySeed > TrajectorySeedCollection
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
unsigned int detId() const
Definition: DetId.h:18
TrajectoryStateOnSurface transientState(const PTrajectoryStateOnDet &ts, const Surface *surface, const MagneticField *field)
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
HLT enums.
GlobalVector globalMomentum() const
T get() const
Definition: EventSetup.h:71
const TrackerGeomDet * idToDet(DetId) const override
edm::EDGetTokenT< TrajectorySeedCollection > inputCollPos
T const * product() const
Definition: ESHandle.h:86
def move(src, dest)
Definition: eostools.py:511