63 float mat[3] = {0},
b[2] = {0};
65 for (
int il = conf.firstLayer; il <= conf.lastLayer; il++) {
68 float err2i = 1. / ncl[il];
69 float m2n = nch * err2i;
70 mat[0] += err2i * conf.accCorr[il] * conf.accCorr[il];
72 mat[1] += conf.accCorr[il] * m2n;
73 b[0] += conf.accCorr[il];
79 float det = mat[0] * mat[2] - mat[1] * mat[1];
83 float detI = 1. / det;
84 mult = detI * (
b[0] * mat[2] -
b[1] * mat[1]);
86 cov[0] = mat[2] * detI;
87 cov[2] = mat[0] * detI;
88 cov[1] = -mat[1] * detI;
90 for (
int il = conf.firstLayer; il <= conf.lastLayer; il++) {
94 chi2 += diff * diff / ncl[il];
109 float accSum = 0., accWSum = 0., noiseSum = 0.;
111 for (
int il = conf.firstLayer; il <= conf.lastLayer; il++) {
113 float err = 1. / ncl[il];
114 accSum += conf.accCorr[il];
115 accWSum += conf.accCorr[il] * conf.accCorr[il] * err;
127int FastMultEst::selectROFs(
const gsl::span<const o2::itsmft::ROFRecord> rofs,
const gsl::span<const o2::itsmft::CompClusterExt> clus,
128 const gsl::span<const o2::itsmft::PhysTrigger> trig, std::vector<uint8_t>& sel)
130 int nrof = rofs.size(), nsel = 0;
133 sel.resize(nrof,
true);
135 if (multEstConf.isMultCutRequested()) {
136 for (uint32_t irof = 0; irof < nrof; irof++) {
137 nsel += sel[irof] = multEstConf.isPassingMultCut(
process(rofs[irof].getROFData(clus)));
142 using IdNT = std::pair<int, int>;
143 if (multEstConf.cutRandomFraction > 0.) {
144 int ntrig = trig.size(), currTrig = 0;
145 if (multEstConf.preferTriggered) {
147 std::vector<IdNT> nTrigROF;
148 nTrigROF.reserve(nrof);
149 for (uint32_t irof = 0; irof < nrof; irof++) {
151 if (nsel && gRandom->Rndm() < multEstConf.cutRandomFraction) {
154 auto irROF = rofs[irof].getBCData();
155 while (currTrig < ntrig && trig[currTrig].
ir < irROF) {
158 auto& trof = nTrigROF.emplace_back(irof, 0);
159 irROF += alpParams.roFrameLengthInBC;
160 while (currTrig < ntrig && trig[currTrig].
ir < irROF) {
167 sort(nTrigROF.begin(), nTrigROF.end(), [](
const IdNT&
a,
const IdNT&
b) { return a.second > b.second; });
168 auto last = nTrigROF.begin() + nsel;
169 sort(nTrigROF.begin(), last, [](
const IdNT&
a,
const IdNT&
b) { return a.first < b.first; });
171 for (
int i = nsel;
i <
int(nTrigROF.size());
i++) {
172 sel[nTrigROF[
i].first] =
false;
175 for (
int irof = 0; irof < nrof; irof++) {
177 float sr = gRandom->Rndm();
178 if (gRandom->Rndm() < multEstConf.cutRandomFraction) {
186 LOGP(
debug,
"NSel = {} of {} rofs Seeds: before {} after {}", nsel, nrof,
lastRandomSeed, gRandom->GetSeed());