diff --git a/DQM/SiPixelPhase1TrackClusters/BuildFile.xml b/DQM/SiPixelPhase1TrackClusters/BuildFile.xml index 4ef74910856b0..ccb1a9fdc3330 100644 --- a/DQM/SiPixelPhase1TrackClusters/BuildFile.xml +++ b/DQM/SiPixelPhase1TrackClusters/BuildFile.xml @@ -1,5 +1,4 @@ - - + diff --git a/DQM/SiPixelPhase1TrackClusters/interface/SiPixelPhase1TrackClusters.h b/DQM/SiPixelPhase1TrackClusters/interface/SiPixelPhase1TrackClusters.h deleted file mode 100644 index 238fa08affc74..0000000000000 --- a/DQM/SiPixelPhase1TrackClusters/interface/SiPixelPhase1TrackClusters.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef SiPixelPhase1TrackClusters_h -#define SiPixelPhase1TrackClusters_h -// -*- C++ -*- -// -// Package: SiPixelPhase1TrackClusters -// Class : SiPixelPhase1TrackClusters -// - -// Original Author: Marcel Schneider - -#include "DQM/SiPixelPhase1Common/interface/SiPixelPhase1Base.h" -#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" -#include "DataFormats/TrackReco/interface/TrackFwd.h" -#include "DataFormats/VertexReco/interface/VertexFwd.h" - -class SiPixelPhase1TrackClusters : public SiPixelPhase1Base { - enum { - ONTRACK_CHARGE, - ONTRACK_SIZE, - ONTRACK_NCLUSTERS, - ONTRACK_POSITION_B, - ONTRACK_POSITION_F, - - OFFTRACK_CHARGE, - OFFTRACK_SIZE, - OFFTRACK_NCLUSTERS, - OFFTRACK_POSITION_B, - OFFTRACK_POSITION_F, - - NTRACKS, - NTRACKS_VOLUME, - ONTRACK_SIZE_VS_ETA - - }; - - public: - explicit SiPixelPhase1TrackClusters(const edm::ParameterSet& conf); - void analyze(const edm::Event&, const edm::EventSetup&); - - private: - edm::EDGetTokenT > clustersToken_; - edm::EDGetTokenT tracksToken_; - edm::EDGetTokenT offlinePrimaryVerticesToken_; - - bool applyVertexCut_; -}; - -#endif diff --git a/DQM/SiPixelPhase1TrackClusters/python/SiPixelPhase1TrackClusters_cfi.py b/DQM/SiPixelPhase1TrackClusters/python/SiPixelPhase1TrackClusters_cfi.py index 4372c874416f5..b8bec7f3d0a45 100644 --- a/DQM/SiPixelPhase1TrackClusters/python/SiPixelPhase1TrackClusters_cfi.py +++ b/DQM/SiPixelPhase1TrackClusters/python/SiPixelPhase1TrackClusters_cfi.py @@ -5,7 +5,7 @@ SiPixelPhase1TrackClustersOnTrackCharge = DefaultHistoTrack.clone( name = "charge", title = "Corrected Cluster Charge (OnTrack)", - range_min = 0, range_max = 300e3, range_nbins = 150, + range_min = 0, range_max = 200e3, range_nbins = 100, xlabel = "Charge (electrons)", specs = VPSet( @@ -70,6 +70,34 @@ ) ) +SiPixelPhase1TrackClustersOnTrackShape = DefaultHistoTrack.clone( + name = "shapeFilter", + title = "Shape filter (OnTrack)", + range_min = 0, range_max = 2, range_nbins = 2, + xlabel = "shapeFilter", + + specs = VPSet( + Specification().groupBy("PXBarrel/PXLayer").saveAll(), + Specification().groupBy("PXForward/PXDisk").saveAll(), + StandardSpecification2DProfile, + + Specification().groupBy("PXBarrel/PXLayer/Lumisection") + .reduce("MEAN") + .groupBy("PXBarrel/PXLayer", "EXTEND_X") + .save(), + + Specification().groupBy("PXForward/PXDisk/Lumisection") + .reduce("MEAN") + .groupBy("PXForward/PXDisk", "EXTEND_X") + .save(), + + Specification(PerLayer1D).groupBy("PXBarrel/Shell/PXLayer").save(), + Specification(PerLayer1D).groupBy("PXForward/HalfCylinder/PXRing/PXDisk").save() + + ) +) + + SiPixelPhase1TrackClustersOnTrackNClusters = DefaultHistoTrack.clone( name = "clusters_ontrack", title = "Clusters_onTrack", @@ -148,6 +176,7 @@ ) ) + SiPixelPhase1TrackClustersOnTrackPositionB = DefaultHistoTrack.clone( name = "clusterposition_zphi_ontrack", title = "Cluster_onTrack Positions", @@ -173,26 +202,6 @@ ) ) -SiPixelPhase1TrackClustersOffTrackCharge = \ - SiPixelPhase1TrackClustersOnTrackCharge.clone(topFolderName = "PixelPhase1/OffTrack", - enabled = False, - title = "Cluster Charge") -SiPixelPhase1TrackClustersOffTrackSize = \ - SiPixelPhase1TrackClustersOnTrackSize.clone(topFolderName = "PixelPhase1/OffTrack", - enabled = False) - -SiPixelPhase1TrackClustersOffTrackNClusters = \ - SiPixelPhase1TrackClustersOnTrackNClusters.clone(topFolderName = "PixelPhase1/OffTrack", - enabled = False) - -SiPixelPhase1TrackClustersOffTrackPositionB = \ - SiPixelPhase1TrackClustersOnTrackPositionB.clone(topFolderName = "PixelPhase1/OffTrack", - enabled = False) - -SiPixelPhase1TrackClustersOffTrackPositionF = \ - SiPixelPhase1TrackClustersOnTrackPositionF.clone(topFolderName = "PixelPhase1/OffTrack", - enabled = False) - SiPixelPhase1TrackClustersNTracks = DefaultHistoTrack.clone( name = "ntracks", title = "Number of Tracks", @@ -213,41 +222,126 @@ specs = VPSet( Specification().groupBy("").save() ) - ) -SiPixelPhase1ClustersSizeVsEtaOnTrack = DefaultHistoTrack.clone( - name = "sizeyvseta_on_track", - title = "Cluster Size along Beamline vs. Cluster position #eta (OnTrack)", - xlabel = "Cluster #eta", +SiPixelPhase1ClustersSizeVsEtaOnTrackOuter = DefaultHistoTrack.clone( + name = "sizeyvseta_on_track_outer", + title = "Cluster Size along Beamline vs. Track #eta (OnTrack) outer ladders", + xlabel = "Track #eta", ylabel = "length [pixels]", - range_min = -3.2, range_max = 3.2, range_nbins = 40, - range_y_min = 0, range_y_max = 40, range_y_nbins = 40, + range_min = -3.2, range_max = 3.2, range_nbins = 64, + range_y_min = 0, range_y_max = 30, range_y_nbins = 30, dimensions = 2, specs = VPSet( - Specification().groupBy("PXBarrel/PXLayer").save(), - Specification().groupBy("PXBarrel").save() + Specification().groupBy("PXBarrel/PXLayer").save() ) ) +SiPixelPhase1ClustersSizeVsEtaOnTrackInner = SiPixelPhase1ClustersSizeVsEtaOnTrackOuter.clone( + name = "sizeyvseta_on_track_inner", + title = "Cluster Size along Beamline vs. Track #eta (OnTrack) inner ladders", +) + + +SiPixelPhase1TrackClustersOnTrackSizeYOuter = SiPixelPhase1ClustersSizeVsEtaOnTrackOuter.clone( + name = "sizey_on_track_outer", + title = "Cluster Size along Beamline vs. prediction (OnTrack) outer ladders", + xlabel = "prediction", + ylabel = "length [pixels]", + range_min = 0, range_max = 30, range_nbins = 60 +) +SiPixelPhase1TrackClustersOnTrackSizeYInner = SiPixelPhase1TrackClustersOnTrackSizeYOuter.clone( + name = "sizey_on_track_inner", + title = "Cluster Size along Beamline vs. prediction (OnTrack) inner ladders", +) + + +SiPixelPhase1TrackClustersOnTrackSizeXOuter = SiPixelPhase1TrackClustersOnTrackSizeYOuter.clone( + name = "sizex_on_track_outer", + title = "Cluster Size along radial vs. prediction (OnTrack) outer ladders", + range_min = 0, range_max = 6, range_nbins = 12, + range_y_min = 0, range_y_max = 6, range_y_nbins = 6 + +) +SiPixelPhase1TrackClustersOnTrackSizeXInner = SiPixelPhase1TrackClustersOnTrackSizeXOuter.clone( + name = "sizex_on_track_inner", + title = "Cluster Size along radial vs. prediction (OnTrack) inner ladders", +) + + +SiPixelPhase1TrackClustersOnTrackSizeXYOuter = SiPixelPhase1TrackClustersOnTrackSizeYOuter.clone( + name = "sizexy_on_track_outer", + title = "prediction - Cluster Size x vs y (OnTrack) outer ladders", + xlabel = "y diff", + ylabel = "x diff", + range_min = -6, range_max = 6, range_nbins = 24, + range_y_min = -6, range_y_max = 6, range_y_nbins = 24 +) +SiPixelPhase1TrackClustersOnTrackSizeXYInner = SiPixelPhase1TrackClustersOnTrackSizeXYOuter.clone( + name = "sizexy_on_track_inner", + title = "prediction - Cluster Size x vs y (OnTrack) outer ladders" +) + + + + +SiPixelPhase1TrackClustersOnTrackChargeOuter = DefaultHistoTrack.clone( + name = "chargeOuter", + title = "Corrected Cluster Charge (OnTrack) outer ladders", + range_min = 0, range_max = 150e3, range_nbins = 150, + xlabel = "Charge (electrons)", + + specs = VPSet( + Specification().groupBy("PXBarrel/PXLayer").save() + ) +) +SiPixelPhase1TrackClustersOnTrackChargeInner = SiPixelPhase1TrackClustersOnTrackChargeOuter.clone( + name = "chargeInner", + title = "Corrected Cluster Charge (OnTrack) inner ladders" +) + +SiPixelPhase1TrackClustersOnTrackShapeOuter = DefaultHistoTrack.clone( + name = "shapeFilterOuter", + title = "Shape filter (OnTrack) Outer Ladders", + range_min = 0, range_max = 2, range_nbins = 2, + xlabel = "shapeFilter", + specs = VPSet( + Specification().groupBy("PXBarrel/PXLayer").save() + ) +) +SiPixelPhase1TrackClustersOnTrackShapeInner = SiPixelPhase1TrackClustersOnTrackShapeOuter.clone( + name = "shapeFilterInner", + title = "Shape filter (OnTrack) Inner Ladders", +) SiPixelPhase1TrackClustersConf = cms.VPSet( SiPixelPhase1TrackClustersOnTrackCharge, SiPixelPhase1TrackClustersOnTrackSize, + SiPixelPhase1TrackClustersOnTrackShape, SiPixelPhase1TrackClustersOnTrackNClusters, SiPixelPhase1TrackClustersOnTrackPositionB, SiPixelPhase1TrackClustersOnTrackPositionF, - SiPixelPhase1TrackClustersOffTrackCharge, - SiPixelPhase1TrackClustersOffTrackSize, - SiPixelPhase1TrackClustersOffTrackNClusters, - SiPixelPhase1TrackClustersOffTrackPositionB, - SiPixelPhase1TrackClustersOffTrackPositionF, - SiPixelPhase1TrackClustersNTracks, SiPixelPhase1TrackClustersNTracksInVolume, - SiPixelPhase1ClustersSizeVsEtaOnTrack + + SiPixelPhase1ClustersSizeVsEtaOnTrackOuter, + SiPixelPhase1ClustersSizeVsEtaOnTrackInner, + SiPixelPhase1TrackClustersOnTrackChargeOuter, + SiPixelPhase1TrackClustersOnTrackChargeInner, + + SiPixelPhase1TrackClustersOnTrackShapeOuter, + SiPixelPhase1TrackClustersOnTrackShapeInner, + + SiPixelPhase1TrackClustersOnTrackSizeXOuter, + SiPixelPhase1TrackClustersOnTrackSizeXInner, + SiPixelPhase1TrackClustersOnTrackSizeYOuter, + SiPixelPhase1TrackClustersOnTrackSizeYInner, + + SiPixelPhase1TrackClustersOnTrackSizeXYOuter, + SiPixelPhase1TrackClustersOnTrackSizeXYInner + ) diff --git a/DQM/SiPixelPhase1TrackClusters/src/SiPixelPhase1TrackClusters.cc b/DQM/SiPixelPhase1TrackClusters/src/SiPixelPhase1TrackClusters.cc index 5c620263e2e67..1bf6a6dc5b57a 100644 --- a/DQM/SiPixelPhase1TrackClusters/src/SiPixelPhase1TrackClusters.cc +++ b/DQM/SiPixelPhase1TrackClusters/src/SiPixelPhase1TrackClusters.cc @@ -1,14 +1,13 @@ // -*- C++ -*- -// +// // Package: SiPixelPhase1TrackClusters -// Class: SiPixelPhase1TrackClusters +// Class : SiPixelPhase1TrackClusters // // Original Author: Marcel Schneider -#include "DQM/SiPixelPhase1TrackClusters/interface/SiPixelPhase1TrackClusters.h" -#include "FWCore/Framework/interface/MakerMacros.h" - +#include "DQM/SiPixelPhase1Common/interface/SiPixelPhase1Base.h" +#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" #include "FWCore/Framework/interface/ESHandle.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" @@ -18,37 +17,102 @@ #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h" #include "DataFormats/GeometryVector/interface/LocalPoint.h" #include "DataFormats/GeometryVector/interface/GlobalPoint.h" +#include "DataFormats/TrackReco/interface/TrackFwd.h" +#include "DataFormats/VertexReco/interface/VertexFwd.h" #include "DataFormats/TrackReco/interface/Track.h" #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHit.h" -#include "TrackingTools/TrackFitters/interface/TrajectoryStateCombiner.h" #include "DataFormats/VertexReco/interface/Vertex.h" +#include "RecoTracker/Record/interface/CkfComponentsRecord.h" +#include "RecoPixelVertexing/PixelLowPtUtilities/interface/ClusterShapeHitFilter.h" +#include "DataFormats/SiPixelCluster/interface/SiPixelClusterShapeCache.h" -SiPixelPhase1TrackClusters::SiPixelPhase1TrackClusters(const edm::ParameterSet& iConfig) : - SiPixelPhase1Base(iConfig) -{ - clustersToken_ = consumes>(iConfig.getParameter("clusters")); +namespace { - tracksToken_ = consumes(iConfig.getParameter("tracks")); +class SiPixelPhase1TrackClusters final : public SiPixelPhase1Base { +enum { // copy paste from cfy: the only safe way to doit.... + SiPixelPhase1TrackClustersOnTrackCharge, + SiPixelPhase1TrackClustersOnTrackSize, + SiPixelPhase1TrackClustersOnTrackShape, + SiPixelPhase1TrackClustersOnTrackNClusters, + SiPixelPhase1TrackClustersOnTrackPositionB, + SiPixelPhase1TrackClustersOnTrackPositionF, - offlinePrimaryVerticesToken_ = consumes(std::string("offlinePrimaryVertices")); + SiPixelPhase1TrackClustersNTracks, + SiPixelPhase1TrackClustersNTracksInVolume, - applyVertexCut_=iConfig.getUntrackedParameter("VertexCut",true); -} + SiPixelPhase1ClustersSizeVsEtaOnTrackOuter, + SiPixelPhase1ClustersSizeVsEtaOnTrackInner, + SiPixelPhase1TrackClustersOnTrackChargeOuter, + SiPixelPhase1TrackClustersOnTrackChargeInner, + + SiPixelPhase1TrackClustersOnTrackShapeOuter, + SiPixelPhase1TrackClustersOnTrackShapeInner, + + SiPixelPhase1TrackClustersOnTrackSizeXOuter, + SiPixelPhase1TrackClustersOnTrackSizeXInner, + SiPixelPhase1TrackClustersOnTrackSizeYOuter, + SiPixelPhase1TrackClustersOnTrackSizeYInner, + + SiPixelPhase1TrackClustersOnTrackSizeXYOuter, + SiPixelPhase1TrackClustersOnTrackSizeXYInner, + + + SiPixelPhase1TrackClustersEnumSize +}; + +public: + explicit SiPixelPhase1TrackClusters(const edm::ParameterSet& conf); + void analyze(const edm::Event&, const edm::EventSetup&) override; + +private: + const bool applyVertexCut_; + + const edm::EDGetTokenT tracksToken_; + const edm::EDGetTokenT offlinePrimaryVerticesToken_; + const edm::EDGetTokenT pixelClusterShapeCacheToken_; +}; + + + +SiPixelPhase1TrackClusters::SiPixelPhase1TrackClusters(const edm::ParameterSet& iConfig) : + SiPixelPhase1Base(iConfig), + applyVertexCut_(iConfig.getUntrackedParameter("VertexCut",true)), + tracksToken_(consumes(iConfig.getParameter("tracks"))), + offlinePrimaryVerticesToken_(applyVertexCut_ ? + consumes(std::string("offlinePrimaryVertices")) : + edm::EDGetTokenT()), + pixelClusterShapeCacheToken_(consumes( edm::InputTag("siPixelClusterShapeCache"))) +{} void SiPixelPhase1TrackClusters::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) { - if (! (histo.size() > ONTRACK_SIZE_VS_ETA)) return; + if (histo.size() != SiPixelPhase1TrackClustersEnumSize) { + edm::LogError("SiPixelPhase1TrackClusters") << "incompatible configuration " << histo.size() + << "!=" << SiPixelPhase1TrackClustersEnumSize << std::endl; + return; + } // get geometry edm::ESHandle tracker; iSetup.get().get(tracker); assert(tracker.isValid()); - + + edm::ESHandle tTopoHandle; + iSetup.get().get(tTopoHandle); + auto const & tkTpl = *tTopoHandle; + + edm::ESHandle shapeFilterH; + iSetup.get().get("ClusterShapeHitFilter", shapeFilterH); + auto const & shapeFilter = *shapeFilterH; + + edm::Handle vertices; - iEvent.getByToken(offlinePrimaryVerticesToken_, vertices); + if(applyVertexCut_) { + iEvent.getByToken(offlinePrimaryVerticesToken_, vertices); + if (!vertices.isValid() || vertices->empty()) return; + } - if (applyVertexCut_ && (!vertices.isValid() || vertices->size() == 0)) return; //get the map edm::Handle tracks; @@ -58,123 +122,120 @@ void SiPixelPhase1TrackClusters::analyze(const edm::Event& iEvent, const edm::Ev edm::LogWarning("SiPixelPhase1TrackClusters") << "track collection is not valid"; return; } - - // get clusters - edm::Handle< edmNew::DetSetVector > clusterColl; - iEvent.getByToken( clustersToken_, clusterColl ); - if ( !clusterColl.isValid() ) { - edm::LogWarning("SiPixelPhase1TrackClusters") << "pixel cluster collection is not valid"; - return; - } - - // we need to store some per-cluster data. Instead of a map, we use a vector, - // exploiting the fact that all custers live in the DetSetVector and we can - // use the same indices to refer to them. - // corr_charge is not strictly needed but cleaner to have it. - std::vector ontrack (clusterColl->data().size(), false); - std::vector corr_charge(clusterColl->data().size(), -1.0f); - std::vector etatk(clusterColl->data().size(), -1.0f); + edm::Handle pixelClusterShapeCacheH; + iEvent.getByToken(pixelClusterShapeCacheToken_, pixelClusterShapeCacheH); + auto const & pixelClusterShapeCache = *pixelClusterShapeCacheH; + for (auto const & track : *tracks) { - if (applyVertexCut_ && (track.pt() < 0.75 || std::abs( track.dxy(vertices->at(0).position()) ) > 5*track.dxyError())) continue; + if (applyVertexCut_ && (track.pt() < 0.75 || std::abs( track.dxy((*vertices)[0].position()) ) > 5*track.dxyError())) continue; bool isBpixtrack = false, isFpixtrack = false, crossesPixVol=false; // find out whether track crosses pixel fiducial volume (for cosmic tracks) - double d0 = track.d0(), dz = track.dz(); + auto d0 = track.d0(), dz = track.dz(); if(std::abs(d0)<15 && std::abs(dz)<50) crossesPixVol = true; + auto etatk = track.eta(); + + auto const & trajParams = track.extra()->trajParams(); assert(trajParams.size()==track.recHitsSize()); auto hb = track.recHitsBegin(); for(unsigned int h=0;hisValid()) continue; - DetId id = hit->geographicalId(); + auto id = hit->geographicalId(); // check that we are in the pixel - uint32_t subdetid = (id.subdetId()); + auto subdetid = (id.subdetId()); if (subdetid == PixelSubdetector::PixelBarrel) isBpixtrack = true; if (subdetid == PixelSubdetector::PixelEndcap) isFpixtrack = true; if (subdetid != PixelSubdetector::PixelBarrel && subdetid != PixelSubdetector::PixelEndcap) continue; auto pixhit = dynamic_cast(hit->hit()); if (!pixhit) continue; - + + // auto geomdetunit = dynamic_cast (pixhit->detUnit()); + // auto const & topol = geomdetunit->specificTopology(); + // get the cluster - auto clust = pixhit->cluster(); - if (clust.isNull()) continue; - ontrack[clust.key()] = true; // mark cluster as ontrack + auto clustp = pixhit->cluster(); + if (clustp.isNull()) continue; + auto const & cluster = *clustp; + auto const & ltp = trajParams[h]; + + auto localDir = ltp.momentum()/ltp.momentum().mag(); // correct charge for track impact angle - auto const & ltp = trajParams[h]; - LocalVector localDir = ltp.momentum()/ltp.momentum().mag(); - - float clust_alpha = atan2(localDir.z(), localDir.x()); - float clust_beta = atan2(localDir.z(), localDir.y()); - double corrCharge = clust->charge() * sqrt( 1.0 / ( 1.0/pow( tan(clust_alpha), 2 ) + - 1.0/pow( tan(clust_beta ), 2 ) + - 1.0 )); - corr_charge[clust.key()] = (float) corrCharge; - etatk[clust.key()]=(float) track.eta(); + auto charge = cluster.charge()*ltp.absdz(); + + auto clustgp = pixhit->globalPosition(); // from rechit + + + int part; + ClusterData::ArrayType meas; + std::pair pred; + if(shapeFilter.getSizes(*pixhit,localDir,pixelClusterShapeCache, part,meas, pred)) { + auto shape = shapeFilter.isCompatible(*pixhit,localDir,pixelClusterShapeCache); + if(tkTpl.pxbLadder(id)%2==1) { + histo[SiPixelPhase1TrackClustersOnTrackSizeXOuter].fill(pred.first, cluster.sizeX(), id, &iEvent); + histo[SiPixelPhase1TrackClustersOnTrackSizeYOuter].fill(pred.second,cluster.sizeY(), id, &iEvent); + histo[SiPixelPhase1TrackClustersOnTrackSizeXYOuter].fill(pred.second-cluster.sizeY(),pred.first-cluster.sizeX(), id, &iEvent); + + histo[SiPixelPhase1TrackClustersOnTrackShapeOuter].fill(shape?1:0,id, &iEvent); + } else { + histo[SiPixelPhase1TrackClustersOnTrackSizeXInner].fill(pred.first, cluster.sizeX(), id, &iEvent); + histo[SiPixelPhase1TrackClustersOnTrackSizeYInner].fill(pred.second,cluster.sizeY(), id, &iEvent); + histo[SiPixelPhase1TrackClustersOnTrackSizeXYInner].fill(pred.second-cluster.sizeY(),pred.first-cluster.sizeX(), id, &iEvent); + + histo[SiPixelPhase1TrackClustersOnTrackShapeInner].fill(shape?1:0,id, &iEvent); + } + histo[SiPixelPhase1TrackClustersOnTrackShape].fill(shape?1:0,id, &iEvent); + } + + histo[SiPixelPhase1TrackClustersOnTrackNClusters].fill(id, &iEvent); + histo[SiPixelPhase1TrackClustersOnTrackCharge].fill(charge, id, &iEvent); + histo[SiPixelPhase1TrackClustersOnTrackSize].fill(cluster.size(), id, &iEvent); + + histo[SiPixelPhase1TrackClustersOnTrackPositionB].fill(clustgp.z(), clustgp.phi(), id, &iEvent); + histo[SiPixelPhase1TrackClustersOnTrackPositionF].fill(clustgp.x(), clustgp.y(), id, &iEvent); + + if(tkTpl.pxbLadder(id)%2==1) { + histo[SiPixelPhase1ClustersSizeVsEtaOnTrackOuter].fill(etatk, cluster.sizeY(), id, &iEvent); + histo[SiPixelPhase1TrackClustersOnTrackChargeOuter].fill(charge, id, &iEvent); + } else { + histo[SiPixelPhase1ClustersSizeVsEtaOnTrackInner].fill(etatk, cluster.sizeY(), id, &iEvent); + histo[SiPixelPhase1TrackClustersOnTrackChargeInner].fill(charge, id, &iEvent); + } + + } // statistics on tracks - histo[NTRACKS].fill(1, DetId(0), &iEvent); + histo[SiPixelPhase1TrackClustersNTracks].fill(1, DetId(0), &iEvent); if (isBpixtrack || isFpixtrack) - histo[NTRACKS].fill(2, DetId(0), &iEvent); + histo[SiPixelPhase1TrackClustersNTracks].fill(2, DetId(0), &iEvent); if (isBpixtrack) - histo[NTRACKS].fill(3, DetId(0), &iEvent); + histo[SiPixelPhase1TrackClustersNTracks].fill(3, DetId(0), &iEvent); if (isFpixtrack) - histo[NTRACKS].fill(4, DetId(0), &iEvent); + histo[SiPixelPhase1TrackClustersNTracks].fill(4, DetId(0), &iEvent); if (crossesPixVol) { if (isBpixtrack || isFpixtrack) - histo[NTRACKS_VOLUME].fill(1, DetId(0), &iEvent); + histo[SiPixelPhase1TrackClustersNTracksInVolume].fill(1, DetId(0), &iEvent); else - histo[NTRACKS_VOLUME].fill(0, DetId(0), &iEvent); - } - } - - edmNew::DetSetVector::const_iterator it; - for (it = clusterColl->begin(); it != clusterColl->end(); ++it) { - auto id = DetId(it->detId()); - - const PixelGeomDetUnit* geomdetunit = dynamic_cast ( tracker->idToDet(id) ); - const PixelTopology& topol = geomdetunit->specificTopology(); - - for(auto subit = it->begin(); subit != it->end(); ++subit) { - // we could do subit-...->data().front() as well, but this seems cleaner. - auto key = edmNew::makeRefTo(clusterColl, subit).key(); - bool is_ontrack = ontrack[key]; - float corrected_charge = corr_charge[key]; - SiPixelCluster const& cluster = *subit; - - LocalPoint clustlp = topol.localPosition(MeasurementPoint(cluster.x(), cluster.y())); - GlobalPoint clustgp = geomdetunit->surface().toGlobal(clustlp); - - if (is_ontrack) { - histo[ONTRACK_NCLUSTERS ].fill(id, &iEvent); - histo[ONTRACK_CHARGE ].fill(double(corrected_charge), id, &iEvent); - histo[ONTRACK_SIZE ].fill(double(cluster.size() ), id, &iEvent); - histo[ONTRACK_POSITION_B].fill(clustgp.z(), clustgp.phi(), id, &iEvent); - histo[ONTRACK_POSITION_F].fill(clustgp.x(), clustgp.y(), id, &iEvent); - histo[ONTRACK_SIZE_VS_ETA].fill(etatk[key], cluster.sizeY(), id, &iEvent); - } else { - histo[OFFTRACK_NCLUSTERS ].fill(id, &iEvent); - histo[OFFTRACK_CHARGE ].fill(double(cluster.charge()), id, &iEvent); - histo[OFFTRACK_SIZE ].fill(double(cluster.size() ), id, &iEvent); - histo[OFFTRACK_POSITION_B].fill(clustgp.z(), clustgp.phi(), id, &iEvent); - histo[OFFTRACK_POSITION_F].fill(clustgp.x(), clustgp.y(), id, &iEvent); - } + histo[SiPixelPhase1TrackClustersNTracksInVolume].fill(0, DetId(0), &iEvent); } } - histo[ONTRACK_NCLUSTERS].executePerEventHarvesting(&iEvent); - histo[OFFTRACK_NCLUSTERS].executePerEventHarvesting(&iEvent); + histo[SiPixelPhase1TrackClustersOnTrackNClusters].executePerEventHarvesting(&iEvent); } +}// namespace + +#include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(SiPixelPhase1TrackClusters);