51 : mGRPGeomRequest(gr), mDataRequest(dr), mTrackSourcesMask(trackSourcesMask) {}
61 std::shared_ptr<o2::base::GRPGeomRequest> mGRPGeomRequest;
62 std::shared_ptr<DataRequest> mDataRequest;
65 std::vector<TrackTPC> mMIPTracks;
67 unsigned int mProcessEveryNthTF{1};
68 int mMaxTracksPerTF{-1};
69 uint32_t mTFCounter{0};
70 int mProcessNFirstTFs{0};
73 bool mSendDummy{
false};
80 const double minP = ic.
options().
get<
double>(
"min-momentum");
81 const double maxP = ic.
options().
get<
double>(
"max-momentum");
82 const double mindEdx = ic.
options().
get<
double>(
"min-dedx");
83 const double maxdEdx = ic.
options().
get<
double>(
"max-dedx");
84 const int minClusters = std::max(10, ic.
options().
get<
int>(
"min-clusters"));
85 const auto cutLoopers = !ic.
options().
get<
bool>(
"dont-cut-loopers");
86 mSendDummy = ic.
options().
get<
bool>(
"send-dummy-data");
87 mMaxTracksPerTF = ic.
options().
get<
int>(
"maxTracksPerTF");
88 if (mMaxTracksPerTF > 0) {
89 mMIPTracks.reserve(mMaxTracksPerTF);
92 mProcessEveryNthTF = ic.
options().
get<
int>(
"processEveryNthTF");
93 if (mProcessEveryNthTF <= 0) {
94 mProcessEveryNthTF = 1;
96 mProcessNFirstTFs = ic.
options().
get<
int>(
"process-first-n-TFs");
98 if (mProcessEveryNthTF > 1) {
99 std::mt19937 rng(std::time(
nullptr));
100 std::uniform_int_distribution<std::mt19937::result_type> dist(1, mProcessEveryNthTF);
101 mTFCounter = dist(rng);
102 LOGP(info,
"Skipping first {} TFs", mProcessEveryNthTF - mTFCounter);
113 mDCAZCut = ic.
options().
get<
float>(
"dca-z-cut");
124 if ((mTFCounter++ % mProcessEveryNthTF) && (currentTF >= mProcessNFirstTFs)) {
125 LOGP(info,
"Skipping TF {}", currentTF);
136 const auto nTracks = tracksTPC.size();
142 const auto useGlobalTracks = mTrackSourcesMask[
GID::ITSTPC];
145 if (useGlobalTracks) {
150 const auto nv = (vtxRefs.size() > 0) ? vtxRefs.size() - 1 : 0;
152 for (
int iv = 0; iv < nv; iv++) {
153 const auto& vtref = vtxRefs[iv];
158 for (
auto src : selSrc) {
159 int idMin = vtxRefs[iv].getFirstEntryOfSource(
src), idMax = idMin + vtxRefs[iv].getEntriesOfSource(
src);
162 for (
int i = idMin;
i < idMax;
i++) {
163 auto vid = trackIndex[
i];
166 if (gidTPC.isSourceSet()) {
167 const auto idxTPC = gidTPC.getIndex();
168 if (mCuts.
goodTrack(tracksTPC[idxTPC]) && acceptDCA(tracksTPC[idxTPC],
vertex,
true)) {
177 for (
size_t i = 0;
i < nTracks; ++
i) {
184 size_t nTracksSel =
indices.size();
186 if ((mMaxTracksPerTF != -1) && (nTracksSel > mMaxTracksPerTF)) {
197 std::minstd_rand rng(std::time(
nullptr));
201 nTracksSel = (mMaxTracksPerTF >
indices.size()) ?
indices.size() : mMaxTracksPerTF;
204 for (
int i = 0;
i < nTracksSel; ++
i) {
205 mMIPTracks.emplace_back(tracksTPC[
indices[
i]]);
208 LOGP(info,
"Filtered {} / {} MIP tracks out of {} total tpc tracks, using {}", mMIPTracks.size(),
indices.size(), tracksTPC.size(), useGlobalTracks ?
"global tracks" :
"TPC only tracks");
229 LOG(info) <<
"Finalizig MIP Tracks filter";
239 std::array<float, 2> dca;
240 const auto ok = propagator->propagateToDCABxByBz(refPoint, propTrack, 2., o2::base::Propagator::MatCorrType::USEMatCorrLUT, &dca);
241 const auto dcar = std::abs(dca[0]);
243 return ok && (dcar < mDCACut) && (!useDCAz || (std::abs(dca[1]) < mDCAZCut));
248 std::vector<OutputSpec> outputs;
251 const auto useMC =
false;
252 auto dataRequest = std::make_shared<DataRequest>();
253 dataRequest->requestTracks(srcTracks, useMC);
254 dataRequest->requestPrimaryVertices(useMC);
256 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
265 dataRequest->inputs.emplace_back(
"meanvtx",
"GLO",
"MEANVERTEX", 0, Lifetime::Condition,
o2::framework::ccdbParamSpec(
"GLO/Calib/MeanVertex", {}, 1));
268 "tpc-miptrack-filter",
271 adaptFromTask<MIPTrackFilterDevice>(ggRequest, dataRequest, srcTracks),
273 {
"min-momentum", VariantType::Double, 0.35, {
"minimum momentum cut"}},
274 {
"max-momentum", VariantType::Double, 0.55, {
"maximum momentum cut"}},
275 {
"min-dedx", VariantType::Double, 10., {
"minimum dEdx cut"}},
276 {
"max-dedx", VariantType::Double, 200., {
"maximum dEdx cut"}},
277 {
"min-clusters", VariantType::Int, 60, {
"minimum number of clusters in a track"}},
278 {
"processEveryNthTF", VariantType::Int, 1, {
"Using only a fraction of the data: 1: Use every TF, 10: Process only every tenth TF."}},
279 {
"maxTracksPerTF", VariantType::Int, -1, {
"Maximum number of processed tracks per TF (-1 for processing all tracks)"}},
280 {
"process-first-n-TFs", VariantType::Int, 1, {
"Number of first TFs which are not sampled"}},
281 {
"send-dummy-data", VariantType::Bool,
false, {
"Send empty data in case TF is skipped"}},
282 {
"dont-cut-loopers", VariantType::Bool,
false, {
"Do not cut loopers by comparing zout-zin"}},
283 {
"dca-cut", VariantType::Float, 3.f, {
"DCA cut in xy (cm), < 0 to disable cut in xy and z"}},
284 {
"dca-z-cut", VariantType::Float, 5.f, {
"DCA cut in z (cm)"}},
Helper for geometry and GRP related CCDB requests.
Workflow to filter MIP tracks and streams them to other devices.
Referenc on track indices contributing to the vertex, with possibility chose tracks from specific sou...
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
T get(const char *key) const
ConfigParamRegistry const & options()
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.
void endOfStream(EndOfStreamContext &eos) final
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj) final
void run(ProcessingContext &pc) final
void init(framework::InitContext &ic) final
MIPTrackFilterDevice(std::shared_ptr< o2::base::GRPGeomRequest > gr, std::shared_ptr< DataRequest > dr, GID::mask_t trackSourcesMask)
void setCutLooper(bool cut)
try to remove looper cutting on (abs(z_out) - abs(z_in)) < -10), not very precise
void setdEdxMax(float dEdxMax)
void setNClusMin(float NClusMin)
void setdEdxMin(float dEdxMin)
bool goodTrack(o2::tpc::TrackTPC const &track)
GLsizei GLenum const void * indices
constexpr o2::header::DataOrigin gDataOriginTPC
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
uint32_t getCurrentTF(o2::framework::ProcessingContext &pc)
Global TPC definitions and constants.
o2::framework::DataProcessorSpec getMIPTrackFilterSpec(GID::mask_t srcTracks=GID::getSourcesMask("TPC"))
create a processor spec
auto getPrimaryVertexMatchedTracks() const
auto getPrimaryVertexMatchedTrackRefs() const
GTrackID getTPCContributorGID(GTrackID source) const
const o2::track::TrackParCov & getTrackParam(GTrackID gidx) const
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
const o2::dataformats::PrimaryVertex & getPrimaryVertex(int i) const
auto getTPCTracks() const
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"