92 std::shared_ptr<o2::base::GRPGeomRequest> gr,
94 std::shared_ptr<o2::steer::MCKinematicsReader> kineReader) : mDataRequest{dr}, mGGCCDBRequest(gr), mUseMC(isMC), mKineReader(kineReader){};
110 void getClusterSizes(std::vector<int>&,
int offs,
const gsl::span<const o2::itsmft::CompClusterExt>, gsl::span<const unsigned char>::iterator&,
const o2::itsmft::TopologyDictionary*);
111 std::array<int, 7> getTrackClusterSizes(
const TrackITS& track);
112 float computeNSigma(
PID pid,
TrackTPC& tpcTrack,
float resolution);
120 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
121 std::shared_ptr<DataRequest> mDataRequest;
124 gsl::span<const int> mInputITSidxs;
127 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOut;
128 std::string mOutName;
129 std::shared_ptr<o2::steer::MCKinematicsReader> mKineReader;
135 LOGP(info,
"Starting average cluster size study...");
138 mKineReader = std::make_unique<o2::steer::MCKinematicsReader>(
"collisioncontext.root");
141 mOutName =
params.outFileName;
142 mPIDresponse.setBetheBlochParams(
params.mBBpars);
144 LOGP(info,
"PID size study initialized.");
147 mDBGOut = std::make_unique<o2::utils::TreeStreamRedirector>(mOutName.c_str(),
"recreate");
155 updateTimeDependentParams(pc);
159void PIDStudy::getClusterSizes(std::vector<int>& clusSizeVec,
int offs,
const gsl::span<const o2::itsmft::CompClusterExt> ITSclus, gsl::span<const unsigned char>::iterator& pattIt,
const o2::itsmft::TopologyDictionary* mdict)
161 for (
unsigned int iClus{0}; iClus < ITSclus.size(); ++iClus) {
162 auto& clus = ITSclus[iClus];
163 auto pattID = clus.getPatternID();
174 clusSizeVec[offs + iClus] = npix;
182 mClusterSizes.
init(nLr);
183 for (
int lr = 0; lr < nLr; lr++) {
189 sizes.resize(offs + mClusters[lr].
size());
190 getClusterSizes(
sizes, offs, mClusters[lr], pattIt, mDict);
199 LOGP(
debug,
"Found {} ITSTPC tracks.", ITSTPCtracks.size());
201 gsl::span<const o2::MCCompLabel> mcLabelsITS, mcLabelsTPC;
205 LOGP(
debug,
"Found {} ITS labels.", mcLabelsITS.size());
206 LOGP(
debug,
"Found {} TPC labels.", mcLabelsTPC.size());
209 for (
unsigned int iTrack{0}; iTrack < ITSTPCtracks.size(); ++iTrack) {
211 auto& ITSTPCtrack = ITSTPCtracks[iTrack];
216 auto ITStrack = recoData.
getITSTrack(ITSTPCtrack.getRefITS());
217 auto TPCtrack = recoData.
getTPCTrack(ITSTPCtrack.getRefTPC());
221 auto& mcLabelITS = mcLabelsITS[ITSTPCtrack.getRefITS().getIndex()];
222 auto& mcLabelTPC = mcLabelsTPC[ITSTPCtrack.getRefTPC().getIndex()];
223 if (mcLabelITS.getTrackID() != (
int)mcLabelTPC.getTrackID()) {
226 auto mctrk = mKineReader->getTrack(mcLabelITS);
227 part.pdg = mctrk->GetPdgCode();
230 part.sign = ITSTPCtrack.getSign();
231 part.clSizesITS = getTrackClusterSizes(ITStrack);
232 part.p = ITSTPCtrack.getP();
233 part.pt = ITSTPCtrack.getPt();
234 part.pTPC = TPCtrack.getP();
235 part.pITS = ITStrack.getP();
236 part.eta = ITSTPCtrack.getEta();
237 part.phi = ITSTPCtrack.getPhi();
238 part.tgL = ITSTPCtrack.getTgl();
239 part.chi2ITS = ITStrack.getChi2();
240 part.chi2TPC = TPCtrack.getChi2();
241 part.chi2ITSTPC = ITSTPCtrack.getChi2Match();
243 part.clSizeL0 = part.clSizesITS[0];
244 part.clSizeL1 = part.clSizesITS[1];
245 part.clSizeL2 = part.clSizesITS[2];
246 part.clSizeL3 = part.clSizesITS[3];
247 part.clSizeL4 = part.clSizesITS[4];
248 part.clSizeL5 = part.clSizesITS[5];
249 part.clSizeL6 = part.clSizesITS[6];
252 part.dEdx = TPCtrack.getdEdx().dEdxTotTPC;
253 part.nClusTPC = TPCtrack.getNClusters();
255 part.nSigmaDeu = computeNSigma(PID::Deuteron, TPCtrack, mBBres);
256 part.nSigmaP = computeNSigma(PID::Proton, TPCtrack, mBBres);
257 part.nSigmaK = computeNSigma(PID::Kaon, TPCtrack, mBBres);
258 part.nSigmaPi = computeNSigma(PID::Pion, TPCtrack, mBBres);
259 part.nSigmaE = computeNSigma(PID::Electron, TPCtrack, mBBres);
262 (*mDBGOut) <<
"outTree"
263 <<
"pdg=" << part.pdg <<
"fakeMatch=" << part.fakeMatch;
265 (*mDBGOut) <<
"outTree"
266 <<
"sign=" << part.sign <<
"p=" << part.p <<
"pt=" << part.pt <<
"pTPC=" << part.pTPC <<
"pITS=" << part.pITS
267 <<
"eta=" << part.eta <<
"phi=" << part.phi <<
"tgL=" << part.tgL <<
"chi2ITS=" << part.chi2ITS <<
"chi2TPC="
268 << part.chi2TPC <<
"chi2ITSTPC=" << part.chi2ITSTPC <<
"dEdx=" << part.dEdx <<
"nClusTPC=" << part.nClusTPC
269 <<
"nSigmaDeu=" << part.nSigmaDeu <<
"nSigmaP=" << part.nSigmaP <<
"nSigmaK=" << part.nSigmaK <<
"nSigmaPi="
270 << part.nSigmaPi <<
"nSigmaE=" << part.nSigmaE <<
"clSizeL0=" << part.clSizeL0 <<
"clSizeL1=" << part.clSizeL1
271 <<
"clSizeL2=" << part.clSizeL2 <<
"clSizeL3=" << part.clSizeL3 <<
"clSizeL4=" << part.clSizeL4 <<
"clSizeL5="
272 << part.clSizeL5 <<
"clSizeL6=" << part.clSizeL6 <<
"\n";
276std::array<int, 7> PIDStudy::getTrackClusterSizes(
const TrackITS& track)
279 std::array<int, 7> clusSizes = {-1, -1, -1, -1, -1, -1, -1};
280 auto firstClus =
track.getFirstClusterEntry();
281 auto ncl =
track.getNumberOfClusters();
282 for (
int icl = 0; icl <
ncl; icl++) {
283 int clID = mInputITSidxs[firstClus + icl];
285 auto& clSize = mClusterSizes[clID];
286 auto layer = geom->getLayer(clus.getSensorID());
287 clusSizes[
layer] = clSize;
295 static bool initOnceDone =
false;
299 geom->
fillMatrixCache(o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2L, o2::math_utils::TransformType::T2GRot, o2::math_utils::TransformType::T2G));
303void PIDStudy::saveOutput()
306 LOGP(info,
"Stored histograms into {}", mOutName.c_str());
326float PIDStudy::computeNSigma(
PID pid,
TrackTPC& tpcTrack,
float resolution)
329 float bb = mPIDresponse.getExpectedSignal(tpcTrack, pid);
330 if (tpcTrack.getdEdx().dEdxTotTPC > 0) {
331 nSigma = (tpcTrack.getdEdx().dEdxTotTPC -
bb) / (resolution *
bb);
338 std::vector<OutputSpec> outputs;
339 auto dataRequest = std::make_shared<DataRequest>();
340 dataRequest->setITSPerLayer(itsStag);
341 dataRequest->requestTracks(srcTracksMask, useMC);
342 dataRequest->requestClusters(srcClustersMask, useMC);
344 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
356 AlgorithmSpec{adaptFromTask<PIDStudy>(dataRequest, ggRequest, useMC, kineReader)},
Container of the ITS/MFT clusters addressed by the composed (layer,index) ID.
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
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)
void endOfStream(EndOfStreamContext &) final
This is invoked whenever we have an EndOfStream event.
void init(InitContext &ic) final
~PIDStudy() override=default
void acquirePattern(iterator &pattIt)
int getNPixels() const
Returns the number of fired pixels.
void beginLayer(int lr)
to be called once all the layers were filled
void init(int nLr)
< prepare for filling nLr layer slots, discarding the previous content
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.
GLuint GLsizei const GLuint const GLintptr const GLsizeiptr * sizes
GLenum const GLfloat * params
GLenum GLuint GLint GLint layer
uint8_t int statusCode int
Defining ITS Vertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
constexpr int MaxITSLayers
o2::track::TrackParCov Track
o2::dataformats::GlobalTrackID::mask_t mask_t
o2::framework::DataProcessorSpec getPIDStudy(mask_t srcTracksMask, mask_t srcClustersMask, bool useMC, std::shared_ptr< o2::steer::MCKinematicsReader > kineReader, bool itsStag)
o2::BaseCluster< float > ITSCluster
const bool const int TrackITSInternal< NLayers > & track
constexpr int clusID2Layer(int id)
constexpr int clusID2Index(int id)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
auto getITSPerLayer() const
const o2::tpc::TrackTPC & getTPCTrack(GTrackID id) const
auto getITSTracksClusterRefs() const
auto getTPCITSTracks() const
auto getITSClustersPatterns(int layer=0) const
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
auto getTPCTracksMCLabels() const
const o2::its::TrackITS & getITSTrack(GTrackID gid) const
auto getITSClusters(int layer=0) const
auto getITSTracksMCLabels() const
std::array< int, 7 > clSizesITS