206 std::map<Int_t, std::pair<std::vector<Double_t>,
CbmMatch*>>::iterator iBuff =
fPulseBuffer.find(address);
207 std::map<Int_t, Double_t>::iterator tBuff =
fTimeBuffer.find(address);
215 if (trigger == 0 && !FNcall) {
218 if (trigger == 1 && FNcall) {
227 for (
Int_t isec(0); isec < sec; isec++)
228 channel += ncols *
fDigiPar->GetNofRowsInSector(isec);
229 channel += ncols * row + col;
233 std::vector<Int_t> temp;
234 for (
size_t i = 0; i <
fPulseBuffer[address].first.size(); i++) {
244 if (
fDebug)
fQA->CreateHist(
"Pulse self", 32, -0.5, 31.5, 512, -12., 500.);
245 if (
fDebug)
fQA->CreateHist(
"Pulse FN", 32, -0.5, 31.5, 512, -12., 500.);
256 if (
fTimeBuffer[address] + corr - shift < fTimeSlice->GetStartTime()) {
278 Float_t timeshift = shiftcut / 10.0;
281 std::vector<CbmLink> links =
fPulseBuffer[address].second->GetLinks();
283 for (UInt_t iLinks = 0; iLinks < links.size(); iLinks++) {
284 digiMatch->
AddLink(links[iLinks]);
289 fQA->CreateHist(
"MC", 200, 0., 50.);
291 fQA->CreateHist(
"rec shift", 63, -0.5, 62.5);
292 fQA->Fill(
"rec shift", shift);
293 fQA->CreateHist(
"T res", 70, -35, 35);
294 fQA->Fill(
"T res", shift - timeshift);
295 fQA->CreateHist(
"Time", 100, -50, 50);
299 fQA->CreateProfile(
"MAX ADC", 63, -0.5, 62.5, 512, -12., 500.);
301 fQA->CreateProfile(
"ASYM MAP", 512, -12., 500., 512, -12., 500.);
305 if (trigger == 1 && MultiCall && digi->
GetCharge() > 0.)
306 fQA->Fill(
"Multi Quote", 1);
308 fQA->Fill(
"Multi Quote", 0);
310 if (trigger == 1 && !MultiCall) {
311 fQA->CreateHist(
"E self", 200, 0., 50.0);
313 fQA->CreateHist(
"E res", 400., -1., 1.);
315 fQA->CreateHist(
"E res rel", 400., -1., 1.);
317 fQA->CreateHist(
"Charge Max", 200, 0., 50.0, 512, -12., 500.);
319 fQA->CreateHist(
"Links Res Self", 400., -1., 1., 5, -0.5, 4.5);
323 fQA->CreateProfile(
"1 Link Prof", 32, 0., 32.);
324 for (
size_t i = 0; i <
fPulseBuffer[address].first.size(); i++) {
325 fQA->FillProfile(
"1 Link Prof", i, temp[i]);
330 fQA->CreateHist(
"Links QA time", 400., -1., 1., 500, 0., 2000.);
333 fQA->CreateProfile(
"2 Link Prof", 32, 0., 32., 100, 0., 2000.);
334 for (
size_t i = 0; i <
fPulseBuffer[address].first.size(); i++) {
335 fQA->FillProfile(
"2 Link Prof", i,
fLinkQA[address][1][
"Time"] -
fLinkQA[address][0][
"Time"], temp[i]);
339 if (Links == 2 && links[0].GetEntry() == links[1].GetEntry()) {
340 fQA->CreateHist(
"In Event Res", 400., -1., 1.);
343 if (Links == 2 && links[0].GetEntry() != links[1].GetEntry()) {
344 fQA->CreateHist(
"Inter Event Res", 400., -1., 1.);
349 fQA->CreateHist(
"E FN", 200, 0., 10.0);
351 fQA->CreateHist(
"E FN max", 512, -12., 500.);
353 fQA->CreateHist(
"E FN MC max", 512, -12., 500., 200, 0., 50.);
355 fQA->CreateHist(
"E FN res", 400., -1., 1.);
357 fQA->CreateHist(
"E FN rel", 400., -1., 1.);
359 fQA->CreateHist(
"Links Res FN", 400., -1., 1., 5, -0.5, 4.5);
362 fQA->CreateProfile(
"1 Link Prof FN", 32, 0., 32.);
363 for (
size_t i = 0; i <
fPulseBuffer[address].first.size(); i++) {
364 fQA->FillProfile(
"1 Link Prof FN", i, temp[i]);
369 fQA->CreateHist(
"Links QA time FN", 400., -1., 1., 500, 0., 2000.);
372 fQA->CreateProfile(
"2 Link Prof FN", 32, 0., 32., 100, 0., 2000.);
373 for (
size_t i = 0; i <
fPulseBuffer[address].first.size(); i++) {
374 fQA->FillProfile(
"2 Link Prof FN", i,
fLinkQA[address][1][
"Time"] -
fLinkQA[address][0][
"Time"], temp[i]);
379 fMCQA.erase(address);
389 if (trigger == 0 && FNcall) {
392 if (trigger == 1 && MultiCall) {
398 fQA->CreateHist(
"Links", 10, -0.5, 9.5);
402 std::cout <<
"main call charge: " << digi->
GetCharge() <<
" col : " << col
404 <<
" time: " << digi->
GetTime() << std::endl;
406 std::cout <<
"FN call charge: " << digi->
GetCharge() <<
" col : " << col
408 <<
" time: " << digi->
GetTime() << std::endl;
413 fDigiMap[address] = std::make_pair(digi, digiMatch);
418 if (!FNcall && !MultiCall && trigger == 1) {
431 if (col < (ncols - 1))
441 if (!FNcall && MultiCall && trigger == 1) {
453 if (col < (ncols - 1))
736 std::vector<Double_t> temppulse;
737 std::map<Int_t, std::vector<Double_t>> templow;
738 std::map<Int_t, std::vector<Double_t>> temphigh;
741 for (
Int_t i = 0; i < 32; i++) {
742 if (
fDebug)
fQA->CreateHist(
"Multi self", 32, -0.5, 31.5, 512, -12., 500.);
743 if (
fDebug)
fQA->Fill(
"Multi self", i, pulse[i]);
744 if (i >= shift) pulse[i] = 0.;
754 Double_t FNshift = 0;
755 std::vector<Double_t> FNpulse =
fPulseBuffer[address].first;
761 while (FNtrigger == 1 && FNaddress != 0) {
769 templow[FNaddress] = FNpulse;
772 for (
Int_t i = 0; i < 32; i++) {
773 if (i >= FNshift) FNpulse[i] = 0.;
784 if (col < (ncols - 1))
789 while (FNtrigger == 1 && FNaddress != 0) {
790 if (col < (ncols - 1))
797 temphigh[FNaddress] = FNpulse;
800 for (
Int_t i = 0; i < 32; i++) {
801 if (i >= FNshift) FNpulse[i] = 0.;
805 if (col == ncols - 1)
break;
809 for (
Int_t i = 0; i < 32; i++) {
844 for (
Int_t i = 0; i < 32; i++) {
845 if (
fDebug)
fQA->CreateHist(
"Multi self after", 32, -0.5, 31.5, 512, -12., 500.);
846 if (
fDebug)
fQA->Fill(
"Multi self after", i, pulse[i]);
857 while (FNtrigger == 1 && FNaddress != 0) {
858 if (col < (ncols - 1))
865 for (
Int_t i = 0; i < 32; i++) {
867 pulse[i] = temphigh[FNaddress][shift + i -
fPresamples];
884 FNpulse[i] = temphigh[FNaddress][shift + i -
fPresamples]
908 for (UInt_t links = 0; links <
fMCBuffer[FNaddress][0].size(); links++)
913 std::vector<std::map<TString, Int_t>> vecLink;
914 std::map<TString, Int_t> LinkQA;
919 vecLink.push_back(LinkQA);
927 if (col == ncols - 1)
break;
935 while (FNtrigger == 1 && FNaddress != 0) {
943 for (
Int_t i = 0; i < 32; i++) {
945 pulse[i] = templow[FNaddress][shift + i -
fPresamples];
962 FNpulse[i] = templow[FNaddress][shift + i -
fPresamples]
974 for (UInt_t links = 0; links <
fMCBuffer[FNaddress][0].size(); links++)
979 std::vector<std::map<TString, Int_t>> vecLink;
980 std::map<TString, Int_t> LinkQA;
985 vecLink.push_back(LinkQA);
998 for (UInt_t links = 0; links <
fMCBuffer[address][0].size(); links++)
1003 std::vector<std::map<TString, Int_t>> vecLink;
1004 std::map<TString, Int_t> LinkQA;
1009 vecLink.push_back(LinkQA);
1132 if (
fDebug)
fQA->CreateHist(
"Pulse", 32, -0.5, 31.5, 512, -12., 500.);
1133 if (
fDebug)
fQA->CreateHist(
"Shift", 63, -0.5, 62.5);
1134 if (
fDebug)
fQA->CreateHist(
"Multi Quote", 4, -0.5, 3.5);
1137 std::vector<Int_t> recomask;
1139 recomask.push_back(i);
1148 TString dir = getenv(
"VMCWORKDIR");
1149 TString filename = dir +
"/parameters/trd/FeatureExtractionLookup.root";
1163 const Double_t nClusterPerCm = 1.0;
1166 Double_t local_point_out[3];
1167 Double_t local_point_in[3];
1169 gGeoManager->MasterToLocal(point_in, local_point_in);
1170 gGeoManager->MasterToLocal(point_out, local_point_out);
1173 for (
Int_t i = 0; i < 3; i++)
1175 for (
Int_t i = 0; i < 3; i++)
1182 Double_t ELoss(0.), ELossTR(0.), ELossdEdX(point->GetEnergyLoss());
1190 else if (point_out[2] >= point_in[2]) {
1192 point->Momentum(mom);
1196 ELoss = ELossTR + ELossdEdX;
1198 if (
fDebug)
fQA->CreateHist(
"E MC", 200, 0., 50.0);
1199 if (
fDebug)
fQA->Fill(
"E MC", ELoss * 1e6);
1203 Double_t cluster_pos[3];
1204 Double_t cluster_delta
1207 Double_t trackLength = 0;
1209 for (
Int_t i = 0; i < 3; i++) {
1210 cluster_delta[i] = (local_point_out[i] - local_point_in[i]);
1211 trackLength += cluster_delta[i] * cluster_delta[i];
1213 trackLength = TMath::Sqrt(trackLength);
1215 trackLength / nClusterPerCm + 0.9;
1226 for (
Int_t i = 0; i < 3; i++) {
1227 cluster_delta[i] /= Double_t(nCluster);
1230 Double_t clusterELoss = ELoss / Double_t(nCluster);
1231 Double_t clusterELossTR = ELossTR / Double_t(nCluster);
1245 std::vector<Double_t> vec;
1246 std::pair<Int_t, std::vector<Double_t>> steps = std::make_pair(0, vec);
1248 Double_t dist_gas = TMath::Sqrt(cluster_delta[0] * cluster_delta[0] + cluster_delta[1] * cluster_delta[1]
1249 + cluster_delta[2] * cluster_delta[2]);
1250 steps = (
GetTotalSteps(local_point_in, local_point_out, dist_gas));
1251 epoints = steps.first;
1253 if (
fDebug)
fQA->CreateHist(
"Ionization", 63, -0.5, 62.5);
1254 if (
fDebug)
fQA->Fill(
"Ionization", steps.first);
1255 if (
fDebug)
fQA->CreateHist(
"Dist Ionization", 63, -0.5, 62.5, 20, 0., 2.);
1256 if (
fDebug)
fQA->Fill(
"Dist Ionization", steps.first, dist_gas);
1260 clusterELoss = ELoss / epoints;
1261 clusterELossTR = ELossTR / epoints;
1265 for (
Int_t ipoints = 0; ipoints < epoints; ipoints++) {
1269 for (
Int_t i = 0; i < 3; i++)
1270 cluster_pos[i] = steps.second[i + ipoints * 3];
1272 if (
fDigiPar->GetSizeX() < std::fabs(cluster_pos[0]) ||
fDigiPar->GetSizeY() < std::fabs(cluster_pos[1])) {
1273 printf(
"-> nC %i/%i x: %7.3f y: %7.3f \n", ipoints, nCluster - 1, cluster_pos[0], cluster_pos[1]);
1274 for (
Int_t i = 0; i < 3; i++)
1275 printf(
" (%i) | in: %7.3f + delta: %7.3f * cluster: %i/%i = "
1276 "cluster_pos: %7.3f out: %7.3f g_in:%f g_out:%f\n",
1277 i, local_point_in[i], cluster_delta[i], ipoints, (
Int_t) nCluster, cluster_pos[i], local_point_out[i],
1278 point_in[i], point_out[i]);
1282 Int_t noiserate = gRandom->Uniform(0, 3);
1284 for (
Int_t ndigi = 0; ndigi < noiserate; ndigi++) {
1290 ScanPadPlane(cluster_pos, 0., clusterELoss, clusterELossTR, epoints, ipoints);
1294 Double_t driftcomp = 10000;
1296 Double_t Ionizations[epoints][3];
1298 for (
Int_t ipoints = 0; ipoints < epoints; ipoints++) {
1302 for (
Int_t i = 0; i < 3; i++)
1303 cluster_pos[i] = steps.second[i + ipoints * 3];
1304 for (
Int_t i = 0; i < 3; i++)
1305 Ionizations[ipoints][i] = cluster_pos[i];
1307 if (
fDigiPar->GetSizeX() < std::fabs(cluster_pos[0]) ||
fDigiPar->GetSizeY() < std::fabs(cluster_pos[1])) {
1308 printf(
"-> nC %i/%i x: %7.3f y: %7.3f \n", ipoints, nCluster - 1, cluster_pos[0], cluster_pos[1]);
1309 for (
Int_t i = 0; i < 3; i++)
1310 printf(
" (%i) | in: %7.3f + delta: %7.3f * cluster: %i/%i = "
1311 "cluster_pos: %7.3f out: %7.3f g_in:%f g_out:%f\n",
1312 i, local_point_in[i], cluster_delta[i], ipoints, (
Int_t) nCluster, cluster_pos[i], local_point_out[i],
1313 point_in[i], point_out[i]);
1316 fDigiPar->ProjectPositionToNextAnodeWire(cluster_pos);
1317 Int_t relz = 239 - (cluster_pos[2] - local_point_in[2]) / 0.005;
1318 if (relz > 239 || relz < 0) relz = 239;
1321 TMath::Abs(
double(
int(cluster_pos[0] * 1000000) %
int(
fDigiPar->GetAnodeWireSpacing() * 100)) / 100);
1323 if (TMath::Abs(
AddDrifttime(Drift_x, cluster_pos[2])) < driftcomp
1324 && TMath::Abs(
AddDrifttime(Drift_x, cluster_pos[2])) > 0.) {
1325 driftcomp = TMath::Abs(
AddDrifttime(Drift_x, cluster_pos[2]));
1330 if (start == -1)
return false;
1331 for (
Int_t i = 0; i < 3; i++)
1332 cluster_pos[i] = Ionizations[start][i];
1334 Int_t relz = 239 - (cluster_pos[2] - local_point_in[2]) / 0.005;
1335 if (relz > 239 || relz < 0) relz = 239;
1337 TMath::Abs(
double(
int(cluster_pos[0] * 1000000) %
int(
fDigiPar->GetAnodeWireSpacing() * 100)) / 100);
1338 Double_t reldrift = TMath::Abs(
AddDrifttime(Drift_x, cluster_pos[2]) - driftcomp) * 1000;
1341 if (reldrift < 250.)
ScanPadPlane(cluster_pos, 0., clusterELoss, clusterELossTR, epoints, start);
1344 for (
Int_t ipoints = 0; ipoints < epoints; ipoints++) {
1345 if (ipoints == start)
continue;
1346 for (
Int_t i = 0; i < 3; i++)
1347 cluster_pos[i] = Ionizations[ipoints][i];
1349 relz = 239 - (cluster_pos[2] - local_point_in[2]) / 0.005;
1350 if (relz > 239 || relz < 0) relz = 239;
1351 Drift_x = TMath::Abs(
double(
int(cluster_pos[0] * 1000000) %
int(
fDigiPar->GetAnodeWireSpacing() * 100)) / 100);
1352 reldrift = TMath::Abs(
AddDrifttime(Drift_x, cluster_pos[2]) - driftcomp) * 1000;
1353 if (reldrift < 250.)
ScanPadPlane(cluster_pos, reldrift, clusterELoss, clusterELossTR, epoints, ipoints);
1368 Double_t clusterELossTR,
Int_t epoints,
Int_t ipoint)
1370 Int_t sectorId(-1), columnId(-1), rowId(-1);
1371 fDigiPar->GetPadInfo(local_point, sectorId, columnId, rowId);
1372 if (sectorId < 0 && columnId < 0 && rowId < 0) {
1376 for (
Int_t i = 0; i < sectorId; i++) {
1377 rowId +=
fDigiPar->GetNofRowsInSector(i);
1382 Double_t displacement_x(0), displacement_y(0);
1383 Double_t
h =
fDigiPar->GetAnodeWireToPadPlaneDistance();
1384 Double_t W(
fDigiPar->GetPadSizeX(sectorId)), H(
fDigiPar->GetPadSizeY(sectorId));
1385 fDigiPar->TransformToLocalPad(local_point, displacement_x, displacement_y);
1390 Int_t startRow(rowId - maxRow / 2);
1391 Int_t secRow(-1), targCol(-1), targRow(-1), targSec(-1), address(-1), fnRow(
fDigiPar->GetNofRows()),
1394 for (
Int_t iRow = startRow; iRow <= rowId + maxRow / 2; iRow++) {
1395 Int_t iCol = columnId;
1396 if (((iCol >= 0) && (iCol <= fnCol - 1)) && ((iRow >= 0) && (iRow <= fnRow - 1))) {
1397 targSec =
fDigiPar->GetSector(iRow, secRow);
1406 else if (iCol > fnCol - 1) {
1407 targCol = fnCol - 1;
1412 else if (iRow > fnRow - 1) {
1413 targRow = fnRow - 1;
1416 targSec =
fDigiPar->GetSector(targRow, secRow);
1432 CalcPRF((iCol - columnId) * W - displacement_x, W,
h) *
CalcPRF((iRow - rowId) * H - displacement_y, H,
h);
1434 ch = chargeFraction * clusterELoss;
1435 tr = chargeFraction * clusterELossTR;
1442 if (
fDebug)
fQA->CreateHist(
"E self MC", 200, 0., 50.0);
1443 if (
fDebug)
fQA->CreateHist(
"E FN MC", 200, 0., 10.0);
1450 std::cout <<
" time: " <<
fCurrentTime <<
" col: " << iCol <<
" row: " << iRow - rowId
1451 <<
" secrow: " << secRow <<
" charge: " << ch * 1e6 <<
" 1 " << std::endl;
1455 if (
fDebug)
fQA->Fill(
"E self MC", ch * epoints * 1e6);
1460 std::cout <<
" time: " <<
fCurrentTime <<
" col: " << iCol <<
" row: " << iRow - rowId
1461 <<
" secrow: " << secRow <<
" charge: " << ch * 1e6 <<
" 1 " << std::endl;
1466 if ((((iCol - collow) >= 0) && ((iCol - collow) <= fnCol - 1))
1467 && ((iRow >= 0) && (iRow <= fnRow - 1))) {
1468 targSec =
fDigiPar->GetSector(iRow, secRow);
1476 chargeFraction =
CalcPRF(((iCol - collow) - columnId) * W - displacement_x, W,
h)
1477 *
CalcPRF((iRow - rowId) * H - displacement_y, H,
h);
1478 ch = chargeFraction * clusterELoss;
1479 tr = chargeFraction * clusterELossTR;
1491 std::cout <<
" time: " <<
fCurrentTime <<
" col: " << iCol - collow <<
" row: " << iRow - rowId
1492 <<
" secrow: " << secRow <<
" charge: " << ch * 1e6 <<
" 1 " << std::endl;
1497 std::cout <<
" time: " <<
fCurrentTime <<
" col: " << iCol - collow <<
" row: " << iRow - rowId
1498 <<
" secrow: " << secRow <<
" charge: " << ch * 1e6 <<
" 0 " << std::endl;
1511 if (
fDebug)
fQA->Fill(
"E self MC", ch * epoints * 1e6);
1516 if (
fDebug)
fQA->Fill(
"E FN MC", ch * epoints * 1e6);
1522 std::cout <<
" time: " <<
fCurrentTime <<
" col: " << iCol - collow <<
" row: " << iRow - rowId
1523 <<
" secrow: " << secRow <<
" charge: " << ch * 1e6 <<
" 1 " << std::endl;
1528 std::cout <<
" time: " <<
fCurrentTime <<
" col: " << iCol - collow <<
" row: " << iRow - rowId
1529 <<
" secrow: " << secRow <<
" charge: " << ch * 1e6 <<
" 0 " << std::endl;
1537 if ((((iCol + colhigh) >= 0) && ((iCol + colhigh) <= fnCol - 1))
1538 && ((iRow >= 0) && (iRow <= fnRow - 1))) {
1539 targSec =
fDigiPar->GetSector(iRow, secRow);
1548 chargeFraction =
CalcPRF(((iCol + colhigh) - columnId) * W - displacement_x, W,
h)
1549 *
CalcPRF((iRow - rowId) * H - displacement_y, H,
h);
1550 ch = chargeFraction * clusterELoss;
1551 tr = chargeFraction * clusterELossTR;
1562 std::cout <<
" time: " <<
fCurrentTime <<
" col: " << iCol + colhigh <<
" row: " << iRow - rowId
1563 <<
" secrow: " << secRow <<
" charge: " << ch * 1e6 <<
" 1 " << std::endl;
1568 std::cout <<
" time: " <<
fCurrentTime <<
" col: " << iCol + colhigh <<
" row: " << iRow - rowId
1569 <<
" secrow: " << secRow <<
" charge: " << ch * 1e6 <<
" 0 " << std::endl;
1582 if (
fDebug)
fQA->Fill(
"E self MC", ch * epoints * 1e6);
1587 if (
fDebug)
fQA->Fill(
"E FN MC", ch * epoints * 1e6);
1588 if (ipoint == epoints - 1 && epoints > 1)
1590 if (ipoint != epoints - 1 && epoints > 1)
1597 std::cout <<
" time: " <<
fCurrentTime <<
" col: " << iCol + colhigh <<
" row: " << iRow - rowId
1598 <<
" secrow: " << secRow <<
" charge: " << ch * 1e6 <<
" 1 " << std::endl;
1603 std::cout <<
" time: " <<
fCurrentTime <<
" col: " << iCol + colhigh <<
" row: " << iRow - rowId
1604 <<
" secrow: " << secRow <<
" charge: " << ch * 1e6 <<
" 0 " << std::endl;
1605 if (ipoint == epoints - 1 && epoints > 1)
1607 if (ipoint != epoints - 1 && epoints > 1)
1614 if (print) std::cout << std::endl;
2016 Double_t drifttime[241] = {
2017 0.11829, 0.11689, 0.11549, 0.11409, 0.11268, 0.11128, 0.10988, 0.10847, 0.10707, 0.10567, 0.10427,
2018 0.10287, 0.10146, 0.10006, 0.09866, 0.09726, 0.095859, 0.094459, 0.09306, 0.091661, 0.090262, 0.088865,
2019 0.087467, 0.086072, 0.084677, 0.083283, 0.08189, 0.080499, 0.07911, 0.077722, 0.076337, 0.074954, 0.073574,
2020 0.072197, 0.070824, 0.069455, 0.06809, 0.066731, 0.065379, 0.064035, 0.0627, 0.061376, 0.060063, 0.058764,
2021 0.05748, 0.056214, 0.054967, 0.053743, 0.052544, 0.051374, 0.05024, 0.049149, 0.048106, 0.047119, 0.046195,
2022 0.045345, 0.044583, 0.043925, 0.043403, 0.043043, 0.042872, 0.042932, 0.043291, 0.044029, 0.045101, 0.04658,
2023 0.048452, 0.050507, 0.052293, 0.053458, 0.054021, 0.053378, 0.052139, 0.53458, 0.050477, 0.048788, 0.047383,
2024 0.046341, 0.045631, 0.045178, 0.045022, 0.045112, 0.045395, 0.045833, 0.046402, 0.047084, 0.047865, 0.048726,
2025 0.049651, 0.050629, 0.051654, 0.052718, 0.053816, 0.054944, 0.056098, 0.057274, 0.058469, 0.059682, 0.060909,
2026 0.062149, 0.0634, 0.064661, 0.06593, 0.067207, 0.06849, 0.069778, 0.07107, 0.072367, 0.073666, 0.074968,
2027 0.076272, 0.077577, 0.078883, 0.080189, 0.081495, 0.082801, 0.084104, 0.085407, 0.086707, 0.088004, 0.089297,
2028 0.090585, 0.091867, 0.093142, 0.094408, 0.095664, 0.096907, 0.098134, 0.099336, 0.10051, 0.10164, 0.10273,
2029 0.10375, 0.10468, 0.10548, 0.10611, 0.10649, 0.10655, 0.10608, 0.10566, 0.1072, 0.10799, 0.10875,
2030 0.11103, 0.11491, 0.11819, 0.12051, 0.12211, 0.12339, 0.12449, 0.12556, 0.12663, 0.12771, 0.12881,
2031 0.12995, 0.13111, 0.13229, 0.13348, 0.13468, 0.13589, 0.13711, 0.13834, 0.13957, 0.1408, 0.14204,
2032 0.14328, 0.14452, 0.14576, 0.14701, 0.14825, 0.1495, 0.15075, 0.152, 0.15325, 0.1545, 0.15576,
2033 0.15701, 0.15826, 0.15952, 0.16077, 0.16203, 0.16328, 0.16454, 0.16579, 0.16705, 0.1683, 0.16956,
2034 0.17082, 0.17207, 0.17333, 0.17458, 0.17584, 0.1771, 0.17835, 0.17961, 0.18087, 0.18212, 0.18338,
2035 0.18464, 0.18589, 0.18715, 0.18841, 0.18966, 0.19092, 0.19218, 0.19343, 0.19469, 0.19595, 0.19721,
2036 0.19846, 0.19972, 0.20098, 0.20223, 0.20349, 0.20475, 0.20601, 0.20726, 0.20852, 0.20978, 0.21103,
2037 0.21229, 0.21355, 0.2148, 0.21606, 0.21732, 0.21857, 0.21983, 0.22109, 0.22234, 0.2236, 0.22486,
2038 0.22612, 0.22737, 0.22863, 0.22989, 0.23114, 0.2324, 0.23366, 0.23491, 0.23617, 0.2363};
2043 return drifttime[
Int_t(
x)];
2093 Double_t CalcGamma = 0.;
2094 Double_t roll = gRandom->Integer(100);
2096 std::pair<Double_t, Double_t> bethe[12] = {
2097 std::make_pair(1.5, 1.5), std::make_pair(2, 1.1), std::make_pair(3, 1.025), std::make_pair(4, 1),
2098 std::make_pair(10, 1.1), std::make_pair(20, 1.2), std::make_pair(100, 1.5), std::make_pair(200, 1.6),
2099 std::make_pair(300, 1.65), std::make_pair(400, 1.675), std::make_pair(500, 1.7), std::make_pair(1000, 1.725)};
2101 for (
Int_t n = 0; n < 12; n++) {
2103 CalcGamma = bethe[0].second;
2107 CalcGamma = bethe[11].second;
2112 Double_t dx = bethe[n + 1].first - bethe[n].first;
2113 Double_t dy = bethe[n + 1].second - bethe[n].second;
2114 Double_t slope = dy / dx;
2115 CalcGamma = (
fGamma - bethe[n].first) * slope + bethe[n].second;
2120 Double_t
pos[3] = {In[0], In[1], In[2]};
2121 Double_t lastpos[3] = {In[0], In[1], In[2]};
2122 Int_t pointcount = 0;
2123 std::vector<Double_t> posvec;
2124 Double_t
D = 1 / (20.5 * CalcGamma);
2127 for (
Int_t i = 0; i < 3; i++)
2128 delta[i] = (Out[i] - In[i]);
2130 roll = gRandom->Integer(100);
2131 for (
Int_t i = 1; i < steps; i++) {
2132 s = (dist / steps) * i;
2133 prob = (1 - TMath::Exp(-s /
D)) * 100;
2135 Double_t move = 2 * (s / dist);
2136 for (
Int_t n = 0; n < 3; n++)
2137 pos[n] = lastpos[n] + move * delta[n];
2138 for (
Int_t n = 0; n < 3; n++)
2139 lastpos[n] =
pos[n];
2142 posvec.push_back(
pos[0]);
2143 posvec.push_back(
pos[1]);
2144 posvec.push_back(
pos[2]);
2147 roll = gRandom->Integer(100);
2157 return std::make_pair(pointcount, posvec);