--
MilanStojanovic - 2019-02-20
Guidelines for using pixel tracks from 2018 PbPb data
1. Collections
Pixel tracks: "hiConformalPixelTracks"
Full tracks: "generalTracks"
2. Track selections
Pixel Track Cuts |
value |
pt |
< ptCut |
fabs(dz/dzError) |
< 20 |
fabs(d0/d0Error) |
< 7 |
Full Track Cuts |
value |
pt |
>= ptCut |
highPurity |
true |
nHits |
>= 11 |
fabs(ptError)/pt |
< 0.1 |
fabs(dz/dzError) |
< 3.0 |
fabs(d0/d0Error) |
< 3.0 |
Chi2n/nLayers |
< 0.18 |
!( algo()==6 && trkMVA < 0.98 ) |
3. Efficiency tables
Table for pixel tracks:
Table for full tracks:
Table for merged tracks: tracks of all charges:
EffCorrectionsPixelPbPb2018_v0.root positive charge tracks:
EffCorrectionsPixelPbPb2018_plusCharge_v0.root negative charge tracks:
EffCorrectionsPixelPbPb2018_minusCharge_v0.root
New tables with larger statistics:
EffCorrectionsPixelPbPb2018_v1.root
Efficiency corrected distributions:
pt_corrected.pdf eta_corrected.pdf
Tables for different pixel selection:
4. Procedure for using pixel tracks in an analysis
For pT differential analyses
If the analysis has fine pT binning, such that only one collection could be used inside one bin, the procedure is straight forward:
Running both collection for each event, with proper track selection and efficiency tables.
Example:
in config file
genTrackSrc = cms.InputTag("hiGeneralTracks"),
pixTrackSrc = cms.InputTag("hiConformalPixelTracks"),
in analyzer
genTrackSrc_(consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("genTrackSrc"))),
pixTrackSrc_(consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("pixTrackSrc"))),
...
// obtain reconstructed tracks
Handle<reco::TrackCollection> genTcol;
iEvent.getByToken(genTrackSrc_, genTcol);
Handle<reco::TrackCollection> pixTcol;
iEvent.getByToken(pixTrackSrc_, pixTcol);
...
/// analysis over full tracks
for(TrackCollection::const_iterator tr = genTcol->begin(); tr != genTcol->end(); tr++) {
if ( tr->charge() == 0 ) continue;
if ( tr->pt() < ptCut ) continue;
if( ! passesGenTrackCuts(*tr, vsorted) ) continue;
histoPt -> Fill(tr->pt() ); //here you do analysis
...
}
/// analysis over pixel tracks
for(TrackCollection::const_iterator tr = pixTcol->begin(); tr != pixTcol->end(); tr++) {
if ( tr->charge() == 0 ) continue;
if ( tr->pt() >= ptCut ) continue;
if( ! passesPixTrackCuts(*tr, vsorted) ) continue;
histoPt -> Fill(tr->pt() ); //here you do analysis
...
}
For spectrum-weighted analyses
If the analysis has a wide pT bin that include pTcutValue the same tracks could be reconstructed in both pixel tracks (with pt < ptCut) and full tracks (pt > ptCut) collections. Therefore one needs to apply procedure for removing this double tracks.
Run analysis on:
- on full track collection with proper track selection and efficiency table (same as above), then
- on pixel track collection with proper track selection and efficiency table for merging tracks, and additional procedure should be applied:
if (ptCut - 0.2 < pt pixel < ptCut) run a loop over full track collection and if there is a full track that satisfy condition:
fabs(eta pixel - eta full ) < 0.02 && fabs(phi pixel - phi full ) < 0.02
then leave out pixel track from the analysis.
Example:
in config file
genTrackSrc = cms.InputTag("hiGeneralTracks"),
pixTrackSrc = cms.InputTag("hiConformalPixelTracks"),
in analyzer
genTrackSrc_(consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("genTrackSrc"))),
pixTrackSrc_(consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("pixTrackSrc"))),
...
// obtain reconstructed tracks
Handle<reco::TrackCollection> genTcol;
iEvent.getByToken(genTrackSrc_, genTcol);
Handle<reco::TrackCollection> pixTcol;
iEvent.getByToken(pixTrackSrc_, pixTcol);
...
/// analysis over full tracks
for(TrackCollection::const_iterator tr = genTcol->begin(); tr != genTcol->end(); tr++) {
if ( tr->charge() == 0 ) continue;
if ( tr->pt() < ptCut ) continue;
if( ! passesGenTrackCuts(*tr, vsorted) ) continue;
histoPt -> Fill(tr->pt()); //here you do analysis
...
}
/// analysis over pixel tracks
for(TrackCollection::const_iterator tr = pixTcol->begin(); tr != pixTcol->end(); tr++) {
if ( tr->charge() == 0 ) continue;
if ( tr->pt() >= ptCut ) continue;
if( ! passesPixTrackCuts(*tr, vsorted) ) continue;
//// eliminating double reconstructed tracks
int nrec=0;
if ( tr->pt() > (ptCut - 0.2) && tr->pt() < ptCut ) {
for(TrackCollection::const_iterator genTr = genTcol->begin(); genTr != genTcol->end(); genTr++){
if ( genTr->charge() == 0 ) continue;
if ( genTr->pt() < ptCut ) continue;
if( ! passesGenTrackCuts(*genTr, vsorted) ) continue;
if ((tr->eta()- genTr->eta()) < 0.02 && (tr->phi()- genTr->phi()) < 0.02 ) {
nrec++;
}
}
}
if (nrec>0) continue;
histoPt -> Fill(tr->pt() ); //here you do analysis
...
}
Merged Track Collection Producer (for all type analyses)
The easier way is to run the merged track collection producer and then just analyze one (merged) collection. This approach can be used for both pt differential and spectrum-weighted analyses.
Setup
cmsrel CMSSW_10_3_2
cd CMSSW_10_3_2/src
cmsenv
git clone https://github.com/milanchestojanovic/MergingProducer.git
scram b
In your config file:
process.load('MergingProducer.generalAndHiPixelTracks.MergingPixAndGenProducer_cfi')
...
trackSrc = cms.InputTag("generalAndHiPixelTracks")
...
process.p = cms.Path( ... * process.generalAndHiPixelTracks * ...)
Recommended track selection is already applied in producer. However, efficiency corrections need to be applied in analyzer.
Use efficiency table for merged track collection.
Note that that centrality object creation is mandatory when using this producer. Instruction for using centrality objects can be found here:
link.
Modification for 2022 PbPb data
For 2022
TestRun PbPb data please use this preliminary efficiency table:
EffCorrectionsTracksPbPb2022_Merged.root
Setup
cmsrel CMSSW_12_5_2_patch1
cd CMSSW_12_5_2_patch1/src
cmsenv
git clone https://github.com/milanchestojanovic/MergingProducer.git
scram b
In your config file:
process.load('MergingProducer.generalAndHiPixelTracks.MergingPixAndGenProducer2022Run_cfi')
...
trackSrc = cms.InputTag("generalAndHiPixelTracks")
...
process.p = cms.Path( ... * process.generalAndHiPixelTracks * ...)
Merged Track Collection Producer for MINIAOD
The only differences wrt AOD format are different release (11_2_0_pre9) and different git branch (miniAOD). So the instructions are:
cmsrel CMSSW_11_2_0_pre9
cd CMSSW_10_2_0_pre9/src
cmsenv
git clone --branch miniAOD https://github.com/milanchestojanovic/MergingProducer.git
scram b
In your config file:
process.load('MergingProducer.generalAndHiPixelTracks.MergingPixAndGenProducer_cfi')
...
trackSrc = cms.InputTag("generalAndHiPixelTracks")
...
process.p = cms.Path( ... * process.generalAndHiPixelTracks * ...)