CMS 3D CMS Logo

Public Types | Public Member Functions | Private Member Functions | Private Attributes

CtfSpecialSeedGenerator Class Reference

#include <CtfSpecialSeedGenerator.h>

Inheritance diagram for CtfSpecialSeedGenerator:
edm::EDProducer edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

List of all members.

Public Types

typedef TrajectoryStateOnSurface TSOS

Public Member Functions

virtual void beginRun (edm::Run const &, edm::EventSetup const &) override
 CtfSpecialSeedGenerator (const edm::ParameterSet &conf)
virtual void endRun (edm::Run const &, edm::EventSetup const &) override
virtual void produce (edm::Event &e, const edm::EventSetup &c) override
virtual ~CtfSpecialSeedGenerator ()

Private Member Functions

bool buildSeeds (const edm::EventSetup &iSetup, const edm::Event &e, const OrderedSeedingHits &osh, const NavigationDirection &navdir, const PropagationDirection &dir, TrajectorySeedCollection &output)
bool postCheck (const TrajectorySeed &seed)
bool preliminaryCheck (const SeedingHitSet &shs, const edm::EventSetup &es)
bool run (const edm::EventSetup &c, const edm::Event &e, TrajectorySeedCollection &output)

Private Attributes

edm::ParameterSet conf_
BoundPlane::BoundPlanePointer lowerScintillator
bool requireBOFF
edm::ESHandle
< TransientTrackingRecHitBuilder
theBuilder
std::vector
< OrderedHitsGenerator * > 
theGenerators
edm::ESHandle< MagneticFieldtheMagfield
int32_t theMaxSeeds
std::vector< NavigationDirectiontheNavDirs
std::vector< PropagationDirectionthePropDirs
TrackingRegionProducertheRegionProducer
SeedFromGenericPairOrTriplettheSeedBuilder
edm::ESHandle< TrackerGeometrytheTracker
BoundPlane::BoundPlanePointer upperScintillator
bool useScintillatorsConstraint

Detailed Description

Definition at line 39 of file CtfSpecialSeedGenerator.h.


Member Typedef Documentation

Definition at line 42 of file CtfSpecialSeedGenerator.h.


Constructor & Destructor Documentation

CtfSpecialSeedGenerator::CtfSpecialSeedGenerator ( const edm::ParameterSet conf)

Definition at line 19 of file CtfSpecialSeedGenerator.cc.

References conf_, edm::ParameterSet::getParameter(), theRegionProducer, theSeedBuilder, and useScintillatorsConstraint.

                                                                           : 
  conf_(conf),
  requireBOFF(conf.getParameter<bool>("requireBOFF")),
  theMaxSeeds(conf.getParameter<int32_t>("maxSeeds"))
{
        useScintillatorsConstraint = conf_.getParameter<bool>("UseScintillatorsConstraint");
        edm::LogVerbatim("CtfSpecialSeedGenerator") << "Constructing CtfSpecialSeedGenerator";
        produces<TrajectorySeedCollection>();
        theSeedBuilder =0; 
        theRegionProducer =0;
}
CtfSpecialSeedGenerator::~CtfSpecialSeedGenerator ( ) [virtual]

Definition at line 31 of file CtfSpecialSeedGenerator.cc.

                                                 {
}

Member Function Documentation

void CtfSpecialSeedGenerator::beginRun ( edm::Run const &  ,
edm::EventSetup const &  iSetup 
) [override, virtual]

Reimplemented from edm::EDProducer.

Definition at line 44 of file CtfSpecialSeedGenerator.cc.

References alongMomentum, newFWLiteAna::build, conf_, SurfaceDeformationFactory::create(), edm::EventSetup::get(), reco::get(), edm::ParameterSet::getParameter(), insideOut, lowerScintillator, oppositeToMomentum, outsideIn, AlCaHLTBitMon_ParallelJobs::p, edm::ESHandle< T >::product(), makeMuonMisalignmentScenario::rot, SeedFromGenericPairOrTriplet::setMomentumTo(), AlCaHLTBitMon_QueryRunRegistry::string, theBuilder, theGenerators, theMagfield, theNavDirs, thePropDirs, theRegionProducer, theSeedBuilder, theTracker, upperScintillator, useScintillatorsConstraint, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

                                                                                {
        std::string builderName = conf_.getParameter<std::string>("TTRHBuilder");
        iSetup.get<TransientRecHitRecord>().get(builderName,theBuilder);

        iSetup.get<IdealMagneticFieldRecord>().get(theMagfield);
        iSetup.get<TrackerDigiGeometryRecord>().get(theTracker);

        edm::LogVerbatim("CtfSpecialSeedGenerator") << "Initializing...";
        if (useScintillatorsConstraint){
                edm::ParameterSet upperScintPar = conf_.getParameter<edm::ParameterSet>("UpperScintillatorParameters");
                edm::ParameterSet lowerScintPar = conf_.getParameter<edm::ParameterSet>("LowerScintillatorParameters");
                RectangularPlaneBounds upperBounds(upperScintPar.getParameter<double>("WidthInX"),
                                             upperScintPar.getParameter<double>("LenghtInZ"),
                                             1);
                GlobalPoint upperPosition(upperScintPar.getParameter<double>("GlobalX"),
                                        upperScintPar.getParameter<double>("GlobalY"),
                                        upperScintPar.getParameter<double>("GlobalZ"));
                edm::LogVerbatim("CtfSpecialSeedGenerator")
                        << "Upper Scintillator position x, y, z " << upperPosition.x()
                        << ", " << upperPosition.y() << ", " << upperPosition.z();
                RectangularPlaneBounds lowerBounds(lowerScintPar.getParameter<double>("WidthInX"),
                                             lowerScintPar.getParameter<double>("LenghtInZ"),
                                             1);
                GlobalPoint lowerPosition(lowerScintPar.getParameter<double>("GlobalX"),
                                     lowerScintPar.getParameter<double>("GlobalY"),
                                     lowerScintPar.getParameter<double>("GlobalZ"));
                edm::LogVerbatim("CtfSpecialSeedGenerator")
                        << "Lower Scintillator position x, y, z " << lowerPosition.x()
                        << ", " << lowerPosition.y() << ", " << lowerPosition.z() ;
                TkRotation<float> rot(1,0,0,0,0,1,0,1,0);
                upperScintillator = BoundPlane::build(upperPosition, rot, &upperBounds);
                lowerScintillator = BoundPlane::build(lowerPosition, rot, &lowerBounds);
        } 
        edm::ParameterSet regfactoryPSet = conf_.getParameter<edm::ParameterSet>("RegionFactoryPSet");
        std::string regfactoryName = regfactoryPSet.getParameter<std::string>("ComponentName");
        theRegionProducer = TrackingRegionProducerFactory::get()->create(regfactoryName,regfactoryPSet);
        
        edm::ESHandle<Propagator>  propagatorAlongHandle;
        iSetup.get<TrackingComponentsRecord>().get("PropagatorWithMaterial",propagatorAlongHandle);
        edm::ESHandle<Propagator>  propagatorOppositeHandle;
        iSetup.get<TrackingComponentsRecord>().get("PropagatorWithMaterialOpposite",propagatorOppositeHandle);

/*      edm::ParameterSet hitsfactoryOutInPSet = conf_.getParameter<edm::ParameterSet>("OrderedHitsFactoryOutInPSet");
        std::string hitsfactoryOutInName = hitsfactoryOutInPSet.getParameter<std::string>("ComponentName");
        hitsGeneratorOutIn = OrderedHitsGeneratorFactory::get()->create( hitsfactoryOutInName, hitsfactoryOutInPSet);
        std::string propagationDirection = hitsfactoryOutInPSet.getUntrackedParameter<std::string>("PropagationDirection", 
                                                                                                    "alongMomentum");
        if (propagationDirection == "alongMomentum") outInPropagationDirection = alongMomentum;
        else outInPropagationDirection = oppositeToMomentum;
        edm::LogVerbatim("CtfSpecialSeedGenerator") << "hitsGeneratorOutIn done";

        edm::ParameterSet hitsfactoryInOutPSet = conf_.getParameter<edm::ParameterSet>("OrderedHitsFactoryInOutPSet");
        std::string hitsfactoryInOutName = hitsfactoryInOutPSet.getParameter<std::string>("ComponentName");
        hitsGeneratorInOut = OrderedHitsGeneratorFactory::get()->create( hitsfactoryInOutName, hitsfactoryInOutPSet);

        propagationDirection = hitsfactoryInOutPSet.getUntrackedParameter<std::string>("PropagationDirection",
                                                                                        "alongMomentum");
        if (propagationDirection == "alongMomentum") inOutPropagationDirection = alongMomentum;
        else inOutPropagationDirection = oppositeToMomentum;
        edm::LogVerbatim("CtfSpecialSeedGenerator") << "hitsGeneratorInOut done";
        if (!hitsGeneratorOutIn || !hitsGeneratorInOut) 
                throw cms::Exception("CtfSpecialSeedGenerator") << "Only corcrete implementation GenericPairOrTripletGenerator of OrderedHitsGenerator is allowed ";
*/
        std::vector<edm::ParameterSet> pSets = conf_.getParameter<std::vector<edm::ParameterSet> >("OrderedHitsFactoryPSets");
        std::vector<edm::ParameterSet>::const_iterator iPSet;
        for (iPSet = pSets.begin(); iPSet != pSets.end(); iPSet++){
                std::string hitsfactoryName = iPSet->getParameter<std::string>("ComponentName");
                theGenerators.push_back(OrderedHitsGeneratorFactory::get()->create( hitsfactoryName, *iPSet));
                std::string propagationDirection = iPSet->getParameter<std::string>("PropagationDirection");
                if (propagationDirection == "alongMomentum") thePropDirs.push_back(alongMomentum);
                else thePropDirs.push_back(oppositeToMomentum);
                std::string navigationDirection = iPSet->getParameter<std::string>("NavigationDirection");              
                if (navigationDirection == "insideOut") theNavDirs.push_back(insideOut);
                else theNavDirs.push_back(outsideIn);
                edm::LogVerbatim("CtfSpecialSeedGenerator") << "hitsGenerator done";
        } 
        bool setMomentum = conf_.getParameter<bool>("SetMomentum");
        std::vector<int> charges;
        if (setMomentum){
                charges = conf_.getParameter<std::vector<int> >("Charges");
        }
        theSeedBuilder = new SeedFromGenericPairOrTriplet(theMagfield.product(), 
                                                          theTracker.product(), 
                                                          theBuilder.product(),
                                                          propagatorAlongHandle.product(),
                                                          propagatorOppositeHandle.product(),
                                                          charges,
                                                          setMomentum,
                                                          conf_.getParameter<double>("ErrorRescaling"));
        double p = 1;
        if (setMomentum) {
                p = conf_.getParameter<double>("SeedMomentum");
                theSeedBuilder->setMomentumTo(p);
        }

}
bool CtfSpecialSeedGenerator::buildSeeds ( const edm::EventSetup iSetup,
const edm::Event e,
const OrderedSeedingHits osh,
const NavigationDirection navdir,
const PropagationDirection dir,
TrajectorySeedCollection output 
) [private]

Definition at line 190 of file CtfSpecialSeedGenerator.cc.

References i, postCheck(), preliminaryCheck(), SeedFromGenericPairOrTriplet::seed(), OrderedSeedingHits::size(), theMaxSeeds, and theSeedBuilder.

Referenced by run().

                                                                          { 
  //SeedFromGenericPairOrTriplet seedBuilder(conf_, magfield.product(), tracker.product(), theBuilder.product());
  edm::LogInfo("CtfSpecialSeedGenerator")<<"osh.size() " << osh.size();
  for (unsigned int i = 0; i < osh.size(); i++){
        SeedingHitSet shs = osh[i];
        if (preliminaryCheck(shs,iSetup)){
                std::vector<TrajectorySeed*> seeds = theSeedBuilder->seed(shs, 
                                                                        dir,
                                                                        navdir, 
                                                                        iSetup);
                for (std::vector<TrajectorySeed*>::const_iterator iSeed = seeds.begin(); iSeed != seeds.end(); iSeed++){
                  if (!*iSeed) {edm::LogError("CtfSpecialSeedGenerator")<<"a seed pointer is null. skipping.";continue;}
                        if (postCheck(**iSeed)){
                                output.push_back(**iSeed);
                        }
                        delete *iSeed;
                        edm::LogVerbatim("CtfSpecialSeedGenerator") << "Seed built";
                }
        }
  }      
  if ((theMaxSeeds > 0) && (output.size() > size_t(theMaxSeeds))) {
    edm::LogWarning("TooManySeeds") << "Too many seeds ("<< output.size() <<"), bailing out.\n";
    output.clear(); 
    return false;
  }
  return true;
}
void CtfSpecialSeedGenerator::endRun ( edm::Run const &  ,
edm::EventSetup const &   
) [override, virtual]

Reimplemented from edm::EDProducer.

Definition at line 34 of file CtfSpecialSeedGenerator.cc.

References theGenerators, theRegionProducer, and theSeedBuilder.

                                                                       {
    if (theSeedBuilder)    { delete theSeedBuilder;    theSeedBuilder = 0; }
    if (theRegionProducer) { delete theRegionProducer; theRegionProducer = 0; }
    std::vector<OrderedHitsGenerator*>::iterator iGen;  
    for (iGen = theGenerators.begin(); iGen != theGenerators.end(); iGen++){
        delete (*iGen);
    }
    theGenerators.clear();
}
bool CtfSpecialSeedGenerator::postCheck ( const TrajectorySeed seed) [private]

Definition at line 271 of file CtfSpecialSeedGenerator.cc.

References alongMomentum, PTrajectoryStateOnDet::detId(), TrajectoryStateOnSurface::freeState(), lowerScintillator, oppositeToMomentum, StraightLinePlaneCrossing::position(), TrajectorySeed::startingState(), theMagfield, theTracker, trajectoryStateTransform::transientState(), upperScintillator, and useScintillatorsConstraint.

Referenced by buildSeeds().

                                                                 {
        if (!useScintillatorsConstraint) return true; 
        
        PTrajectoryStateOnDet pstate = seed.startingState();
        TrajectoryStateOnSurface theTSOS = trajectoryStateTransform::transientState(pstate,
                                                                      &(theTracker->idToDet(DetId(pstate.detId()))->surface()),
                                                                      &(*theMagfield)); 
        FreeTrajectoryState* state = theTSOS.freeState();       
        StraightLinePlaneCrossing planeCrossingLower( Basic3DVector<float>(state->position()), 
                                                      Basic3DVector<float>(state->momentum()),
                                                      alongMomentum);
        StraightLinePlaneCrossing planeCrossingUpper( Basic3DVector<float>(state->position()),
                                                      Basic3DVector<float>(state->momentum()),
                                                      oppositeToMomentum);
        std::pair<bool,StraightLinePlaneCrossing::PositionType> positionUpper = 
          planeCrossingUpper.position(*upperScintillator);
        std::pair<bool,StraightLinePlaneCrossing::PositionType> positionLower = 
          planeCrossingLower.position(*lowerScintillator);
        if (!(positionUpper.first && positionLower.first)) {
                 edm::LogVerbatim("CtfSpecialSeedGenerator::checkDirection") 
                        << "Scintillator plane not crossed";
                 return false;
        }
        LocalPoint positionUpperLocal = upperScintillator->toLocal((GlobalPoint)(positionUpper.second));
        LocalPoint positionLowerLocal = lowerScintillator->toLocal((GlobalPoint)(positionLower.second));
        if (upperScintillator->bounds().inside(positionUpperLocal) && 
            lowerScintillator->bounds().inside(positionLowerLocal)) {
                 edm::LogVerbatim("CtfSpecialSeedGenerator::checkDirection") 
                                << "position on Upper scintillator " 
                                << positionUpper.second;
                 edm::LogVerbatim("CtfSpecialSeedGenerator::checkDirection") 
                                << "position on Lower scintillator " 
                                << positionLower.second;
                 
                 return true;
        }
        edm::LogVerbatim("CtfSpecialSeedGenerator::checkDirection") 
                << "scintillator not crossed in bounds: position on Upper scintillator " 
                << positionUpper.second << " position on Lower scintillator " << positionLower.second;
        return false;
}
bool CtfSpecialSeedGenerator::preliminaryCheck ( const SeedingHitSet shs,
const edm::EventSetup es 
) [private]

Definition at line 223 of file CtfSpecialSeedGenerator.cc.

References conf_, edm::EventSetup::get(), edm::ParameterSet::getParameter(), SeedingHitSet::size(), theBuilder, and PV3DBase< T, PVType, FrameType >::y().

Referenced by buildSeeds().

                                                                                                {

        edm::ESHandle<TrackerTopology> tTopo;
        es.get<IdealGeometryRecord>().get(tTopo);

        std::vector<std::pair<unsigned int, unsigned int> > vSubdetLayer;
        //std::vector<std::string> vSeedLayerNames;
        bool checkHitsAtPositiveY       = conf_.getParameter<bool>("SeedsFromPositiveY");
        //***top-bottom
        bool checkHitsAtNegativeY       = conf_.getParameter<bool>("SeedsFromNegativeY");
        //***
        bool checkHitsOnDifferentLayers = conf_.getParameter<bool>("CheckHitsAreOnDifferentLayers");
      unsigned int nHits = shs.size();
      for (unsigned int iHit=0; iHit < nHits; ++iHit) {
                //hits for the seeds must be at positive y
            const TrackingRecHit * trh = shs[iHit]->hit();
                TransientTrackingRecHit::RecHitPointer recHit = theBuilder->build(trh);
                GlobalPoint hitPos = recHit->globalPosition();
                //GlobalPoint point = 
                //  theTracker->idToDet(iHits->geographicalId() )->surface().toGlobal(iHits->localPosition());
                if (checkHitsAtPositiveY){ if (hitPos.y() < 0) return false;}
                //***top-bottom
                if (checkHitsAtNegativeY){ if (hitPos.y() > 0) return false;}
                //***
                //std::string name = iHits->seedinglayer().name(); 
                //hits for the seeds must be in different layers
                unsigned int subid=(*trh).geographicalId().subdetId();
                unsigned int layer = tTopo->layer( (*trh).geographicalId());
                std::vector<std::pair<unsigned int, unsigned int> >::const_iterator iter;
                //std::vector<std::string>::const_iterator iNames;
                if (checkHitsOnDifferentLayers){
                        
                        for (iter = vSubdetLayer.begin(); iter != vSubdetLayer.end(); iter++){
                                if (iter->first == subid && iter->second == layer) return false;
                        }
                        /*
                        for (iNames = vSeedLayerNames.begin(); iNames != vSeedLayerNames.end(); iNames++){
                                if (*iNames == name) return false;
                        }
                        */
                }
                //vSeedLayerNames.push_back(iHits->seedinglayer().name());
                vSubdetLayer.push_back(std::make_pair(subid, layer));   
        }
        return true;
}
void CtfSpecialSeedGenerator::produce ( edm::Event e,
const edm::EventSetup c 
) [override, virtual]

Implements edm::EDProducer.

Definition at line 141 of file CtfSpecialSeedGenerator.cc.

References CastorDataFrameFilter_impl::check(), conf_, convertSQLiteXML::ok, convertSQLitetoXML_cfg::output, edm::Event::put(), requireBOFF, run(), theMagfield, and ClusterChecker::tooManyClusters().

{
  // get Inputs
  std::auto_ptr<TrajectorySeedCollection> output(new TrajectorySeedCollection);
  
  //check on the number of clusters
  ClusterChecker check(conf_);
  if ( !requireBOFF || (theMagfield->inTesla(GlobalPoint(0,0,0)).mag() == 0.00) ) {
      size_t clustsOrZero = check.tooManyClusters(e);
      if (!clustsOrZero){
          bool ok = run(iSetup, e, *output);
          if (!ok) { ; } // nothing to do
      } else edm::LogError("TooManyClusters") << "Found too many clusters (" << clustsOrZero << "), bailing out.\n";
  }
  
  
  edm::LogVerbatim("CtfSpecialSeedGenerator") << " number of seeds = "<< output->size();
  e.put(output);
}
bool CtfSpecialSeedGenerator::run ( const edm::EventSetup c,
const edm::Event e,
TrajectorySeedCollection output 
) [private]

Definition at line 161 of file CtfSpecialSeedGenerator.cc.

References buildSeeds(), i, SeedFromGenericPairOrTriplet::momentumFromPSet(), convertSQLiteXML::ok, convertSQLitetoXML_cfg::output, TrackingRegionProducer::regions(), edm::Event::run(), SeedFromGenericPairOrTriplet::setMomentumTo(), theGenerators, theNavDirs, thePropDirs, theRegionProducer, and theSeedBuilder.

Referenced by produce().

                                                                                {
        std::vector<TrackingRegion*> regions = theRegionProducer->regions(e, iSetup);
        std::vector<TrackingRegion*>::const_iterator iReg;
        bool ok = true;
        for (iReg = regions.begin(); iReg != regions.end(); iReg++){
                if(!theSeedBuilder->momentumFromPSet()) theSeedBuilder->setMomentumTo((*iReg)->ptMin());
                std::vector<OrderedHitsGenerator*>::const_iterator iGen;
                int i = 0;
                for (iGen = theGenerators.begin(); iGen != theGenerators.end(); iGen++){ 
                  ok = buildSeeds(iSetup, 
                             e, 
                             (*iGen)->run(**iReg, e, iSetup),
                             theNavDirs[i], 
                             thePropDirs[i], 
                             output);
                  i++;
                  if (!ok) break;
                }
                if (!ok) break;
        }
        //clear memory
        for (std::vector<TrackingRegion*>::iterator iReg = regions.begin(); iReg != regions.end(); iReg++){
                delete *iReg;
        }
        return ok;
}

Member Data Documentation

BoundPlane::BoundPlanePointer CtfSpecialSeedGenerator::lowerScintillator [private]

Definition at line 92 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), and postCheck().

Definition at line 93 of file CtfSpecialSeedGenerator.h.

Referenced by produce().

Definition at line 76 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), and preliminaryCheck().

Definition at line 84 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), endRun(), and run().

Definition at line 74 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), postCheck(), and produce().

Definition at line 94 of file CtfSpecialSeedGenerator.h.

Referenced by buildSeeds().

Definition at line 86 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), and run().

Definition at line 85 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), and run().

Definition at line 87 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), CtfSpecialSeedGenerator(), endRun(), and run().

Definition at line 89 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), buildSeeds(), CtfSpecialSeedGenerator(), endRun(), and run().

Definition at line 75 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), and postCheck().

BoundPlane::BoundPlanePointer CtfSpecialSeedGenerator::upperScintillator [private]

Definition at line 91 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), and postCheck().

Definition at line 90 of file CtfSpecialSeedGenerator.h.

Referenced by beginRun(), CtfSpecialSeedGenerator(), and postCheck().