14bool TFragmentMap::Add(
const std::shared_ptr<TFragment>& frag,
const std::vector<Int_t>& charge,
15 const std::vector<Short_t>& integrationLength)
18 std::cout <<
"Adding fragment " << frag <<
" (address " << frag->GetAddress() <<
" , # pileups "
19 << frag->GetNumberOfPileups() <<
") with " << charge.size() <<
" charges and "
20 << integrationLength.size() <<
" k-values:" << std::endl;
21 for(
size_t i = 0; i < charge.size() && i < integrationLength.size(); ++i) {
22 std::cout <<
"\t" << charge[i] <<
",\t" << integrationLength[i] << std::endl;
26 if(charge.size() == 1 &&
fMap.count(frag->GetAddress()) == 0) {
27 frag->SetCharge(charge[0]);
28 frag->SetKValue(integrationLength[0]);
30 std::cout <<
"address " << frag->GetAddress() <<
": added single fragment " << frag << std::endl;
32 if(
fDebug && integrationLength[0] != 700) {
33 std::cout <<
"single fragment (address " <<
hex(frag->GetAddress(), 4) <<
") with integration length "
34 << integrationLength[0] <<
", # pileups " << frag->GetNumberOfPileups() << std::endl;
35 if(frag->GetNumberOfPileups() > 1) {
36 std::cout <<
"have fragments:" << std::endl;
37 for(
auto& iter :
fMap) {
38 std::cout <<
"\t" <<
hex(std::get<0>(iter.second)->GetAddress(), 4) <<
": "
39 << std::get<0>(iter.second)->GetNumberOfPileups() << std::endl;
43 frag->SetEntryNumber();
45 outputQueue->Push(frag);
51 size_t nofCharges = charge.size();
56 auto range =
fMap.equal_range(frag->GetAddress());
57 for(
auto it = range.first; it != range.second; ++it) {
59 nofCharges += std::get<1>((*it).second).size();
62 if(nofCharges != 2 * nofFrags - 1) {
65 std::cout <<
"address " << frag->GetAddress() <<
": inserting fragment " << frag <<
" with " << charge.size() <<
" charges" << std::endl;
67 if(range.first != range.second) {
70 std::pair<UInt_t, std::tuple<std::shared_ptr<TFragment>, std::vector<Int_t>, std::vector<Short_t>>>(
71 frag->GetAddress(), std::make_tuple(frag, charge, integrationLength)));
74 std::pair<UInt_t, std::tuple<std::shared_ptr<TFragment>, std::vector<Int_t>, std::vector<Short_t>>>(
75 frag->GetAddress(), std::make_tuple(frag, charge, integrationLength)));
78 std::cout <<
"done" << std::endl;
83 std::cout <<
"address " << frag->GetAddress() <<
": last fragment found, calculating charges for " << nofFrags
84 <<
" fragments" << std::endl;
88 std::vector<std::shared_ptr<TFragment>> frags;
89 std::vector<Long_t> kValues;
90 std::vector<Float_t> charges;
95 if(charge.size() != 1) {
98 std::cout <<
"2 w/o single charge" << std::endl;
103 frags.push_back(std::get<0>((*(range.first)).second));
104 frags.push_back(frag);
107 std::cout <<
"inserting ... " << std::endl;
109 kValues.insert(kValues.begin(), std::get<2>((*(range.first)).second).begin(), std::get<2>((*(range.first)).second).end());
111 std::cout <<
"done" << std::endl;
113 kValues.push_back(integrationLength[0]);
117 for(
size_t i = 0; i < std::get<1>((*(range.first)).second).size(); ++i) {
119 charges.push_back((
static_cast<float>(std::get<1>((*(range.first)).second)[i]) +
static_cast<float>(gRandom->Uniform())) /
static_cast<float>(kValues[i]));
121 std::cout <<
"2, " << i <<
": " <<
hex(std::get<1>((*(range.first)).second)[i]) <<
"/" <<
hex(kValues[i])
122 <<
" = " << (std::get<1>((*(range.first)).second)[i] + gRandom->Uniform())
123 <<
"/" << kValues[i] <<
" = " << charges.back() << std::endl;
130 std::cout <<
"2 too much dropped" << std::endl;
135 std::cout <<
"2, dropping " << i << std::endl;
137 dropped =
static_cast<int>(i);
140 if(dropped >= 0 && integrationLength[0] <= 0) {
143 std::cout <<
"2 too much dropped (end)" << std::endl;
147 if(integrationLength[0] <= 0) {
155 std::cout <<
"dropped = " << dropped <<
", charges.size() = " << charges.size() << std::endl;
159 frags[0]->SetCharge(charges[0] *
static_cast<float>(integrationLength[0] - charge[0]));
160 frags[1]->SetCharge(charge[0]);
161 frags[0]->SetKValue(integrationLength[0]);
162 frags[1]->SetKValue(integrationLength[1]);
163 frags[0]->SetNumberOfPileups(-200);
164 frags[1]->SetNumberOfPileups(-201);
167 frags[0]->SetCharge(charges[0] *
static_cast<float>(integrationLength[0]));
168 frags[1]->SetCharge(charge[0]);
169 frags[0]->SetKValue(integrationLength[0]);
170 frags[1]->SetKValue(integrationLength[1]);
171 frags[0]->SetNumberOfPileups(-200);
172 frags[1]->SetNumberOfPileups(-201);
175 frags[0]->SetCharge(charges[0] *
static_cast<float>(integrationLength[0]));
176 frags[1]->SetCharge((charges[1] - charges[0]) *
static_cast<float>(integrationLength[0]));
177 frags[0]->SetKValue(integrationLength[0]);
178 frags[1]->SetKValue(integrationLength[1]);
179 frags[0]->SetNumberOfPileups(-200);
180 frags[1]->SetNumberOfPileups(-201);
183 charges.push_back(
static_cast<float>(charge[0] + gRandom->Uniform()) /
static_cast<float>(integrationLength[0]));
185 std::cout <<
"2, -: " <<
hex(charge[0]) <<
"/" <<
hex(integrationLength[0]) <<
" = "
186 << (charge[0] + gRandom->Uniform()) <<
"/" << integrationLength[0] <<
" = " << charges.back()
189 Solve(frags, charges, kValues);
195 if(charge.size() != 1) {
198 std::cout <<
"3 w/o single charge" << std::endl;
203 frags.push_back(std::get<0>((*(range.first)).second));
204 frags.push_back(std::get<0>((*std::next(range.first)).second));
205 frags.push_back(frag);
208 std::cout <<
"inserting first ... " << std::endl;
210 kValues.insert(kValues.begin(), std::get<2>((*(range.first)).second).begin(), std::get<2>((*(range.first)).second).end());
212 std::cout <<
"done" << std::endl;
214 situation = kValues.size();
216 std::cout <<
"inserting second ... " << std::endl;
218 kValues.insert(kValues.end(), std::get<2>((*std::next(range.first)).second).begin(),
219 std::get<2>((*std::next(range.first)).second).end());
221 std::cout <<
"done" << std::endl;
223 kValues.push_back(integrationLength[0]);
226 std::vector<int> dropped;
227 for(
size_t i = 0; i < std::get<1>((*(range.first)).second).size(); ++i) {
229 charges.push_back((
static_cast<float>(std::get<1>((*(range.first)).second)[i]) +
static_cast<float>(gRandom->Uniform())) /
static_cast<float>(kValues[i]));
231 std::cout <<
"3, " << i <<
": " <<
hex(std::get<1>((*(range.first)).second)[i]) <<
"/"
232 <<
hex(kValues[i]) <<
" = " << (std::get<1>((*(range.first)).second)[i] + gRandom->Uniform())
233 <<
"/" << kValues[i] <<
" = " << charges.back() << std::endl;
236 dropped.push_back(i);
238 std::cout <<
"3, dropping " << i << std::endl;
242 for(
size_t i = 0; i < std::get<1>((*std::next(range.first)).second).size(); ++i) {
243 if(kValues[i + situation] > 0) {
244 charges.push_back((
static_cast<float>(std::get<1>((*std::next(range.first)).second)[i]) +
static_cast<float>(gRandom->Uniform())) /
static_cast<float>(kValues[i + situation]));
246 std::cout <<
"3, " << i + situation <<
": "
247 <<
hex(std::get<1>((*std::next(range.first)).second)[i]) <<
"/" <<
hex(kValues[i + situation])
248 <<
" = " << (std::get<1>((*std::next(range.first)).second)[i] + gRandom->Uniform()) <<
"/"
249 << kValues[i + situation] <<
" = " << charges.back() << std::endl;
252 dropped.push_back(i + situation);
254 std::cout <<
"dropping " << i + situation << std::endl;
258 if(integrationLength[0] <= 0) {
259 dropped.push_back(4);
261 switch(dropped.size()) {
263 charges.push_back((
static_cast<float>(charge[0]) +
static_cast<float>(gRandom->Uniform())) /
static_cast<float>(integrationLength[0]));
265 std::cout <<
"3, -: " <<
hex(charge[0]) <<
"/" <<
hex(integrationLength[0]) <<
" = "
266 << (charge[0] + gRandom->Uniform()) <<
"/" << integrationLength[0] <<
" = " << charges.back()
269 Solve(frags, charges, kValues, situation);
275 std::cout <<
"3, single drop" << std::endl;
282 std::cout <<
"3, double drop" << std::endl;
300 std::cout <<
"3, dropped too many" << std::endl;
312 std::cout <<
"unknown number of fragments " << nofFrags << std::endl;
319 for(
auto it = range.first; it != range.second; ++it) {
320 frag->SetEntryNumber();
322 outputQueue->Push(std::get<0>((*it).second));
325 std::cout <<
"Added " << ++index <<
". fragment " << std::get<0>((*it).second) << std::endl;
328 frag->SetEntryNumber();
330 outputQueue->Push(frag);
333 std::cout <<
"address " << frag->GetAddress() <<
": added last fragment " << frag << std::endl;
336 fMap.erase(range.first, range.second);
342 std::vector<Long_t> kValues,
int situation)
350 std::vector<float> kSquared(kValues.size());
351 for(
size_t i = 0; i < kValues.size(); ++i) {
352 kSquared[i] =
static_cast<float>(kValues[i] * kValues[i]);
355 switch(frag.size()) {
357 frag[0]->SetCharge((charges[0] * (kSquared[0] * kSquared[1] + kSquared[0] * kSquared[2]) + (charges[1] - charges[2]) * kSquared[1] * kSquared[2]) /
358 (kSquared[0] * kSquared[1] + kSquared[0] * kSquared[2] + kSquared[1] * kSquared[2]) *
static_cast<float>(kValues[0]));
359 frag[1]->SetCharge((charges[2] * (kSquared[0] * kSquared[2] + kSquared[1] * kSquared[2]) + (charges[1] - charges[0]) * kSquared[0] * kSquared[1]) /
360 (kSquared[0] * kSquared[1] + kSquared[0] * kSquared[2] + kSquared[1] * kSquared[2]) *
static_cast<float>(kValues[1]));
361 frag[0]->SetKValue(kValues[0]);
362 frag[1]->SetKValue(kValues[1]);
363 frag[0]->SetNumberOfPileups(-20);
364 frag[1]->SetNumberOfPileups(-21);
366 std::cout <<
"2: charges " << charges[0] <<
", " << charges[1] <<
", " << charges[2] <<
" and squared int. lengths " << kSquared[0]
367 <<
", " << kSquared[1] <<
", " << kSquared[2] <<
" => " << frag[0]->GetCharge() <<
", " << frag[1]->GetCharge()
370 << (charges[0] * (kSquared[0] * kSquared[1] + kSquared[0] * kSquared[2]) + (charges[1] - charges[2]) * kSquared[1] * kSquared[2]) /
371 (kSquared[0] * kSquared[1] + kSquared[0] * kSquared[2] + kSquared[1] * kSquared[2])
373 << (charges[2] * (kSquared[0] * kSquared[2] + kSquared[1] * kSquared[2]) + (charges[1] - charges[0]) * kSquared[0] * kSquared[1]) /
374 (kSquared[0] * kSquared[1] + kSquared[0] * kSquared[2] + kSquared[1] * kSquared[2])
375 <<
" = " << (charges[0] * (kSquared[0] * kSquared[1] + kSquared[0] * kSquared[2]) + (charges[1] - charges[2]) * kSquared[1] * kSquared[2]) <<
"/"
376 << (kSquared[0] * kSquared[1] + kSquared[0] * kSquared[2] + kSquared[1] * kSquared[2]) <<
" = ("
377 << charges[0] * (kSquared[0] * kSquared[1] + kSquared[0] * kSquared[2]) <<
"+" << (charges[1] - charges[2]) * kSquared[1] * kSquared[2] <<
")/("
378 << kSquared[0] * kSquared[1] <<
"+" << kSquared[0] * kSquared[2] <<
"+" << kSquared[1] * kSquared[2] <<
"))" << std::endl
379 <<
"pileups = " << frag[0]->GetNumberOfPileups() <<
", " << frag[1]->GetNumberOfPileups()
386 (charges[0] * (kSquared[0] * kSquared[1] * kSquared[2] + kSquared[0] * kSquared[1] * kSquared[3] + kSquared[0] * kSquared[1] * kSquared[4] + kSquared[0] * kSquared[2] * kSquared[4] +
387 kSquared[0] * kSquared[3] * kSquared[4]) +
388 (charges[1] + charges[4]) * kSquared[1] * kSquared[3] * kSquared[4] + charges[2] * (kSquared[1] * kSquared[2] * kSquared[3] + kSquared[2] * kSquared[3] * kSquared[4]) -
389 charges[3] * (kSquared[1] * kSquared[2] * kSquared[3] + kSquared[1] * kSquared[3] * kSquared[4] + kSquared[2] * kSquared[3] * kSquared[4])) /
390 (kSquared[0] * kSquared[1] * kSquared[2] + kSquared[0] * kSquared[1] * kSquared[3] + kSquared[0] * kSquared[1] * kSquared[4] + kSquared[0] * kSquared[2] * kSquared[4] +
391 kSquared[0] * kSquared[3] * kSquared[4] + kSquared[1] * kSquared[2] * kSquared[3] + kSquared[1] * kSquared[3] * kSquared[4] + kSquared[2] * kSquared[3] * kSquared[4]) *
392 static_cast<float>(kValues[0]));
394 (charges[0] * (kSquared[0] * kSquared[1] * kSquared[2] + kSquared[0] * kSquared[1] * kSquared[3] + kSquared[0] * kSquared[1] * kSquared[4] + kSquared[0] * kSquared[2] * kSquared[4]) -
395 charges[1] * (kSquared[0] * kSquared[1] * kSquared[2] + kSquared[0] * kSquared[1] * kSquared[3] + kSquared[0] * kSquared[1] * kSquared[4] + kSquared[1] * kSquared[2] * kSquared[3]) +
396 charges[2] * (kSquared[1] * kSquared[2] * kSquared[3] - kSquared[0] * kSquared[2] * kSquared[4]) -
397 charges[3] * (kSquared[0] * kSquared[3] * kSquared[4] + kSquared[1] * kSquared[2] * kSquared[3] + kSquared[1] * kSquared[3] * kSquared[4] + kSquared[2] * kSquared[3] * kSquared[4]) +
398 charges[4] * (kSquared[0] * kSquared[2] * kSquared[4] + kSquared[0] * kSquared[3] * kSquared[4] + kSquared[1] * kSquared[3] * kSquared[4] + kSquared[2] * kSquared[3] * kSquared[4])) /
399 (kSquared[0] * kSquared[1] * kSquared[2] + kSquared[0] * kSquared[1] * kSquared[3] + kSquared[0] * kSquared[1] * kSquared[4] + kSquared[0] * kSquared[2] * kSquared[4] +
400 kSquared[0] * kSquared[3] * kSquared[4] + kSquared[1] * kSquared[2] * kSquared[3] + kSquared[1] * kSquared[3] * kSquared[4] + kSquared[2] * kSquared[3] * kSquared[4]) *
401 static_cast<float>(kValues[1]));
402 frag[2]->SetCharge(((charges[0] + charges[3]) * kSquared[0] * kSquared[1] * kSquared[3] +
403 charges[1] * (kSquared[0] * kSquared[1] * kSquared[2] + kSquared[0] * kSquared[1] * kSquared[3] + kSquared[1] * kSquared[2] * kSquared[3]) +
404 charges[2] * (kSquared[0] * kSquared[1] * kSquared[2] + kSquared[1] * kSquared[2] * kSquared[3]) +
405 charges[4] * (kSquared[0] * kSquared[1] * kSquared[4] + kSquared[0] * kSquared[2] * kSquared[4] + kSquared[0] * kSquared[3] * kSquared[4] +
406 kSquared[1] * kSquared[3] * kSquared[4] + kSquared[2] * kSquared[3] * kSquared[4])) /
407 (kSquared[0] * kSquared[1] * kSquared[2] + kSquared[0] * kSquared[1] * kSquared[3] + kSquared[0] * kSquared[1] * kSquared[4] +
408 kSquared[0] * kSquared[2] * kSquared[4] + kSquared[0] * kSquared[3] * kSquared[4] + kSquared[1] * kSquared[2] * kSquared[3] +
409 kSquared[1] * kSquared[3] * kSquared[4] + kSquared[2] * kSquared[3] * kSquared[4]) *
410 static_cast<float>(kValues[2]));
413 (charges[0] * (kSquared[0] * kSquared[1] * kSquared[3] + kSquared[0] * kSquared[1] * kSquared[4] + kSquared[0] * kSquared[2] * kSquared[3] + kSquared[0] * kSquared[2] * kSquared[4] +
414 kSquared[0] * kSquared[3] * kSquared[4]) +
415 charges[1] * (kSquared[1] * kSquared[2] * kSquared[3] + kSquared[1] * kSquared[2] * kSquared[4] + kSquared[1] * kSquared[3] * kSquared[4]) -
416 charges[2] * (kSquared[1] * kSquared[2] * kSquared[3] + kSquared[1] * kSquared[2] * kSquared[4]) - (charges[3] - charges[4]) * kSquared[1] * kSquared[3] * kSquared[4]) /
417 (kSquared[0] * kSquared[1] * kSquared[3] + kSquared[0] * kSquared[1] * kSquared[4] + kSquared[0] * kSquared[2] * kSquared[3] + kSquared[0] * kSquared[2] * kSquared[4] +
418 kSquared[0] * kSquared[3] * kSquared[4] + kSquared[1] * kSquared[2] * kSquared[3] + kSquared[1] * kSquared[2] * kSquared[4] + kSquared[1] * kSquared[3] * kSquared[4]) *
419 static_cast<float>(kValues[0]));
421 -(charges[0] * kSquared[0] * kSquared[1] * kSquared[3] + charges[0] * kSquared[0] * kSquared[1] * kSquared[4] - charges[1] * kSquared[0] * kSquared[1] * kSquared[3] -
422 charges[1] * kSquared[0] * kSquared[1] * kSquared[4] - charges[2] * kSquared[0] * kSquared[2] * kSquared[3] - charges[2] * kSquared[0] * kSquared[2] * kSquared[4] -
423 charges[2] * kSquared[1] * kSquared[2] * kSquared[3] - charges[2] * kSquared[1] * kSquared[2] * kSquared[4] - charges[3] * kSquared[0] * kSquared[3] * kSquared[4] -
424 charges[3] * kSquared[1] * kSquared[3] * kSquared[4] + charges[4] * kSquared[0] * kSquared[3] * kSquared[4] + charges[4] * kSquared[1] * kSquared[3] * kSquared[4]) /
425 (kSquared[0] * kSquared[1] * kSquared[3] + kSquared[0] * kSquared[1] * kSquared[4] + kSquared[0] * kSquared[2] * kSquared[3] + kSquared[0] * kSquared[2] * kSquared[4] +
426 kSquared[0] * kSquared[3] * kSquared[4] + kSquared[1] * kSquared[2] * kSquared[3] + kSquared[1] * kSquared[2] * kSquared[4] + kSquared[1] * kSquared[3] * kSquared[4]) *
427 static_cast<float>(kValues[1]));
429 (charges[0] * kSquared[0] * kSquared[1] * kSquared[3] - charges[1] * kSquared[0] * kSquared[1] * kSquared[3] - charges[2] * kSquared[0] * kSquared[2] * kSquared[3] -
430 charges[2] * kSquared[1] * kSquared[2] * kSquared[3] + charges[3] * kSquared[0] * kSquared[1] * kSquared[3] + charges[3] * kSquared[0] * kSquared[2] * kSquared[3] +
431 charges[3] * kSquared[1] * kSquared[2] * kSquared[3] + charges[4] * kSquared[0] * kSquared[1] * kSquared[4] + charges[4] * kSquared[0] * kSquared[2] * kSquared[4] +
432 charges[4] * kSquared[0] * kSquared[3] * kSquared[4] + charges[4] * kSquared[1] * kSquared[2] * kSquared[4] + charges[4] * kSquared[1] * kSquared[3] * kSquared[4]) /
433 (kSquared[0] * kSquared[1] * kSquared[3] + kSquared[0] * kSquared[1] * kSquared[4] + kSquared[0] * kSquared[2] * kSquared[3] + kSquared[0] * kSquared[2] * kSquared[4] +
434 kSquared[0] * kSquared[3] * kSquared[4] + kSquared[1] * kSquared[2] * kSquared[3] + kSquared[1] * kSquared[2] * kSquared[4] + kSquared[1] * kSquared[3] * kSquared[4]) *
435 static_cast<float>(kValues[2]));
437 frag[0]->SetKValue(kValues[0]);
438 frag[1]->SetKValue(kValues[1]);
439 frag[2]->SetKValue(kValues[2]);
440 frag[0]->SetNumberOfPileups(-30);
441 frag[1]->SetNumberOfPileups(-31);
442 frag[2]->SetNumberOfPileups(-32);
444 std::cout <<
"3, situation " << situation <<
": charges " << charges[0] <<
", " << charges[1] <<
", " << charges[2] <<
", "
445 << charges[3] <<
", " << charges[4] <<
" and squared int. lengths " << kSquared[0] <<
", " << kSquared[1] <<
", " << kSquared[2]
446 <<
", " << kSquared[3] <<
", " << kSquared[4] <<
" => " << frag[0]->GetCharge() <<
", " << frag[1]->GetCharge()
447 <<
", " << frag[2]->GetCharge() << std::endl;