91 std::shared_ptr<o2::base::GRPGeomRequest> gr,
93 std::shared_ptr<o2::steer::MCKinematicsReader> kineReader) : mDataRequest{dr}, mGGCCDBRequest(gr), mUseMC(isMC), mKineReader(kineReader){};
109 void getClusterSizes(std::vector<int>&,
const gsl::span<const o2::itsmft::CompClusterExt>, gsl::span<const unsigned char>::iterator&,
const o2::itsmft::TopologyDictionary*);
110 std::array<int, 7> getTrackClusterSizes(
const TrackITS& track);
111 float computeNSigma(
PID pid,
TrackTPC& tpcTrack,
float resolution);
119 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
120 std::shared_ptr<DataRequest> mDataRequest;
121 std::vector<int> mClusterSizes;
122 gsl::span<const o2::itsmft::CompClusterExt> mClusters;
123 gsl::span<const int> mInputITSidxs;
126 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOut;
127 std::string mOutName;
128 std::shared_ptr<o2::steer::MCKinematicsReader> mKineReader;
134 LOGP(info,
"Starting average cluster size study...");
137 mKineReader = std::make_unique<o2::steer::MCKinematicsReader>(
"collisioncontext.root");
140 mOutName =
params.outFileName;
141 mPIDresponse.setBetheBlochParams(
params.mBBpars);
143 LOGP(info,
"PID size study initialized.");
146 mDBGOut = std::make_unique<o2::utils::TreeStreamRedirector>(mOutName.c_str(),
"recreate");
154 updateTimeDependentParams(pc);
158void PIDStudy::getClusterSizes(std::vector<int>& clusSizeVec,
const gsl::span<const o2::itsmft::CompClusterExt> ITSclus, gsl::span<const unsigned char>::iterator& pattIt,
const o2::itsmft::TopologyDictionary* mdict)
160 for (
unsigned int iClus{0}; iClus < ITSclus.size(); ++iClus) {
161 auto& clus = ITSclus[iClus];
162 auto pattID = clus.getPatternID();
173 clusSizeVec[iClus] = npix;
182 mClusterSizes.resize(mClusters.size());
183 auto pattIt = clusPatt.begin();
184 getClusterSizes(mClusterSizes, mClusters, pattIt, mDict);
191 LOGP(
debug,
"Found {} ITSTPC tracks.", ITSTPCtracks.size());
193 gsl::span<const o2::MCCompLabel> mcLabelsITS, mcLabelsTPC;
197 LOGP(
debug,
"Found {} ITS labels.", mcLabelsITS.size());
198 LOGP(
debug,
"Found {} TPC labels.", mcLabelsTPC.size());
201 for (
unsigned int iTrack{0}; iTrack < ITSTPCtracks.size(); ++iTrack) {
203 auto& ITSTPCtrack = ITSTPCtracks[iTrack];
208 auto ITStrack = recoData.
getITSTrack(ITSTPCtrack.getRefITS());
209 auto TPCtrack = recoData.
getTPCTrack(ITSTPCtrack.getRefTPC());
213 auto& mcLabelITS = mcLabelsITS[ITSTPCtrack.getRefITS().getIndex()];
214 auto& mcLabelTPC = mcLabelsTPC[ITSTPCtrack.getRefTPC().getIndex()];
215 if (mcLabelITS.getTrackID() != (
int)mcLabelTPC.getTrackID()) {
218 auto mctrk = mKineReader->getTrack(mcLabelITS);
219 part.pdg = mctrk->GetPdgCode();
222 part.sign = ITSTPCtrack.getSign();
223 part.clSizesITS = getTrackClusterSizes(ITStrack);
224 part.p = ITSTPCtrack.getP();
225 part.pt = ITSTPCtrack.getPt();
226 part.pTPC = TPCtrack.getP();
227 part.pITS = ITStrack.getP();
228 part.eta = ITSTPCtrack.getEta();
229 part.phi = ITSTPCtrack.getPhi();
230 part.tgL = ITSTPCtrack.getTgl();
231 part.chi2ITS = ITStrack.getChi2();
232 part.chi2TPC = TPCtrack.getChi2();
233 part.chi2ITSTPC = ITSTPCtrack.getChi2Match();
235 part.clSizeL0 = part.clSizesITS[0];
236 part.clSizeL1 = part.clSizesITS[1];
237 part.clSizeL2 = part.clSizesITS[2];
238 part.clSizeL3 = part.clSizesITS[3];
239 part.clSizeL4 = part.clSizesITS[4];
240 part.clSizeL5 = part.clSizesITS[5];
241 part.clSizeL6 = part.clSizesITS[6];
244 part.dEdx = TPCtrack.getdEdx().dEdxTotTPC;
245 part.nClusTPC = TPCtrack.getNClusters();
247 part.nSigmaDeu = computeNSigma(
PID::Deuteron, TPCtrack, mBBres);
248 part.nSigmaP = computeNSigma(
PID::Proton, TPCtrack, mBBres);
249 part.nSigmaK = computeNSigma(
PID::Kaon, TPCtrack, mBBres);
250 part.nSigmaPi = computeNSigma(
PID::Pion, TPCtrack, mBBres);
251 part.nSigmaE = computeNSigma(
PID::Electron, TPCtrack, mBBres);
254 (*mDBGOut) <<
"outTree"
255 <<
"pdg=" << part.pdg <<
"fakeMatch=" << part.fakeMatch;
257 (*mDBGOut) <<
"outTree"
258 <<
"sign=" << part.sign <<
"p=" << part.p <<
"pt=" << part.pt <<
"pTPC=" << part.pTPC <<
"pITS=" << part.pITS
259 <<
"eta=" << part.eta <<
"phi=" << part.phi <<
"tgL=" << part.tgL <<
"chi2ITS=" << part.chi2ITS <<
"chi2TPC="
260 << part.chi2TPC <<
"chi2ITSTPC=" << part.chi2ITSTPC <<
"dEdx=" << part.dEdx <<
"nClusTPC=" << part.nClusTPC
261 <<
"nSigmaDeu=" << part.nSigmaDeu <<
"nSigmaP=" << part.nSigmaP <<
"nSigmaK=" << part.nSigmaK <<
"nSigmaPi="
262 << part.nSigmaPi <<
"nSigmaE=" << part.nSigmaE <<
"clSizeL0=" << part.clSizeL0 <<
"clSizeL1=" << part.clSizeL1
263 <<
"clSizeL2=" << part.clSizeL2 <<
"clSizeL3=" << part.clSizeL3 <<
"clSizeL4=" << part.clSizeL4 <<
"clSizeL5="
264 << part.clSizeL5 <<
"clSizeL6=" << part.clSizeL6 <<
"\n";
268std::array<int, 7> PIDStudy::getTrackClusterSizes(
const TrackITS& track)
271 std::array<int, 7> clusSizes = {-1, -1, -1, -1, -1, -1, -1};
273 auto ncl = track.getNumberOfClusters();
274 for (
int icl = 0; icl < ncl; icl++) {
275 auto& clus = mClusters[mInputITSidxs[firstClus + icl]];
276 auto& clSize = mClusterSizes[mInputITSidxs[firstClus + icl]];
277 auto layer = geom->getLayer(clus.getSensorID());
278 clusSizes[
layer] = clSize;
286 static bool initOnceDone =
false;
294void PIDStudy::saveOutput()
297 LOGP(info,
"Stored histograms into {}", mOutName.c_str());
317float PIDStudy::computeNSigma(
PID pid,
TrackTPC& tpcTrack,
float resolution)
320 float bb = mPIDresponse.getExpectedSignal(tpcTrack, pid);
321 if (tpcTrack.getdEdx().dEdxTotTPC > 0) {
322 nSigma = (tpcTrack.getdEdx().dEdxTotTPC -
bb) / (resolution *
bb);
329 std::vector<OutputSpec> outputs;
330 auto dataRequest = std::make_shared<DataRequest>();
331 dataRequest->requestTracks(srcTracksMask, useMC);
332 dataRequest->requestClusters(srcClustersMask, useMC);
334 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
346 AlgorithmSpec{adaptFromTask<PIDStudy>(dataRequest, ggRequest, useMC, kineReader)},
Helper for geometry and GRP related CCDB requests.
Header of the General Run Parameters object.
Global index for barrel track: provides provenance (detectors combination), index in respective array...
Definition of the GeometryTGeo class.
Definition of the MCTrack class.
Definition of the ITS track.
Result of refitting TPC-ITS matched track.
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
static const PIDStudyParamConfig & Instance()
static GeometryTGeo * Instance()
void fillMatrixCache(int mask) override
int getFirstClusterEntry() const
void setClusterDictionary(const o2::itsmft::TopologyDictionary *d)
void finaliseCCDB(ConcreteDataMatcher &, void *) final
void run(ProcessingContext &) final
PIDStudy(std::shared_ptr< DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > gr, bool isMC, std::shared_ptr< o2::steer::MCKinematicsReader > kineReader)
~PIDStudy() final=default
void endOfStream(EndOfStreamContext &) final
This is invoked whenever we have an EndOfStream event.
void init(InitContext &ic) final
void acquirePattern(iterator &pattIt)
int getNPixels() const
Returns the number of fired pixels.
static constexpr unsigned short InvalidPatternID
const ClusterPattern & getPattern(int n) const
Returns the pattern of the topology.
int getNpixels(int n) const
Returns the number of fired pixels of the n_th element.
bool isGroup(int n) const
Returns true if the element corresponds to a group of rare topologies.
static constexpr ID Electron
static constexpr ID Deuteron
static constexpr ID Proton
GLenum const GLfloat * params
GLenum GLuint GLint GLint layer
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
o2::framework::DataProcessorSpec getPIDStudy(mask_t srcTracksMask, mask_t srcClustersMask, bool useMC, std::shared_ptr< o2::steer::MCKinematicsReader > kineReader)
o2::track::TrackParCov Track
o2::dataformats::GlobalTrackID::mask_t mask_t
o2::BaseCluster< float > ITSCluster
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
const o2::tpc::TrackTPC & getTPCTrack(GTrackID id) const
auto getITSTracksClusterRefs() const
auto getTPCITSTracks() const
auto getITSClustersPatterns() const
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
auto getTPCTracksMCLabels() const
const o2::its::TrackITS & getITSTrack(GTrackID gid) const
auto getITSTracksMCLabels() const
auto getITSClusters() const
std::array< int, 7 > clSizesITS