69TVector3
TCSM::GetPosition(
int detector,
char pos,
int horizontalstrip,
int verticalstrip,
double X,
double Y,
double Z)
75 double SideZ = -4.8834;
77 double dEZ = 42.948977;
78 double EX = 58.062412;
80 double detTheta = 31. * (TMath::Pi() / 180.);
85 if(detector == 3 && pos ==
'D') {
87 verticalstrip = 15 - verticalstrip;
89 z = SideZ + (50. / 32.) * (2 * verticalstrip + 1);
90 }
else if(detector == 4 && pos ==
'D') {
93 z = SideZ + (50. / 32.) * (2 * verticalstrip + 1);
94 }
else if(detector == 1 && pos ==
'D') {
96 verticalstrip = 15 - verticalstrip;
97 x = dEX - (50. / 32.) * cos(detTheta) * (2 * verticalstrip + 1);
98 z = dEZ + (50. / 32.) * sin(detTheta) * (2 * verticalstrip + 1);
99 }
else if(detector == 2 && pos ==
'D') {
101 x = -dEX + (50. / 32.) * cos(detTheta) * (2 * verticalstrip + 1);
102 z = dEZ + (50. / 32.) * sin(detTheta) * (2 * verticalstrip + 1);
103 }
else if(detector == 1 && pos ==
'E') {
105 x = EX - (50. / 32.) * cos(detTheta) * (2 * verticalstrip + 1);
106 z = EZ + (50. / 32.) * sin(detTheta) * (2 * verticalstrip + 1);
107 }
else if(detector == 2 && pos ==
'E') {
109 verticalstrip = 15 - verticalstrip;
110 x = -EX + (50. / 32.) * cos(detTheta) * (2 * verticalstrip + 1);
111 z = EZ + (50. / 32.) * sin(detTheta) * (2 * verticalstrip + 1);
113 std::cout <<
"***Error, unrecognized detector and position combo!***" << std::endl;
116 y = (50. / 32.) * (2 * horizontalstrip + 1) - (50 / 16.) * 8;
124void TCSM::BuildVH(std::vector<std::vector<std::pair<TFragment, TGRSIMnemonic>>>& strips, std::vector<TDetectorHit*>& hitVector)
127 if(strips[0].empty() && strips[1].empty()) {
130 if(strips[0].size() == 1 && strips[1].empty()) {
132 }
else if(strips[0].empty() && strips[1].size() == 1) {
134 }
else if(strips[0].size() == 1 && strips[1].size() == 1) {
135 hitVector.push_back(
MakeHit(strips[0][0], strips[1][0]));
136 }
else if(strips[1].size() == 1 && strips[0].size() == 2) {
137 auto he1 =
static_cast<int>(strips[0][0].first.GetEnergy());
138 auto he2 =
static_cast<int>(strips[0][1].first.GetEnergy());
139 auto ve1 =
static_cast<int>(strips[1][0].first.GetEnergy());
141 hitVector.push_back(
MakeHit(strips[0], strips[1]));
143 hitVector.push_back(
MakeHit(strips[0][0], strips[1][0]));
146 hitVector.push_back(
MakeHit(strips[0][1], strips[1][0]));
149 }
else if(strips[1].size() == 2 && strips[0].size() == 1) {
150 auto he1 =
static_cast<int>(strips[0][0].first.GetEnergy());
151 auto ve1 =
static_cast<int>(strips[1][0].first.GetEnergy());
152 auto ve2 =
static_cast<int>(strips[1][1].first.GetEnergy());
154 hitVector.push_back(
MakeHit(strips[0], strips[1]));
156 hitVector.push_back(
MakeHit(strips[0][0], strips[1][0]));
159 hitVector.push_back(
MakeHit(strips[0][0], strips[1][1]));
162 }
else if(strips[1].size() == 2 && strips[0].size() == 2) {
163 auto he1 =
static_cast<int>(strips[0][0].first.GetEnergy());
164 auto he2 =
static_cast<int>(strips[0][1].first.GetEnergy());
165 auto ve1 =
static_cast<int>(strips[1][0].first.GetEnergy());
166 auto ve2 =
static_cast<int>(strips[1][1].first.GetEnergy());
169 if(std::abs(ve1 - he1) + std::abs(ve2 - he2) <= std::abs(ve1 - he2) + std::abs(ve2 - he1)) {
171 hitVector.push_back(
MakeHit(strips[0][0], strips[1][0]));
172 hitVector.push_back(
MakeHit(strips[0][1], strips[1][1]));
173 }
else if(std::abs(ve1 - he1) + std::abs(ve2 - he2) > std::abs(ve1 - he2) + std::abs(ve2 - he1)) {
175 hitVector.push_back(
MakeHit(strips[0][0], strips[1][1]));
176 hitVector.push_back(
MakeHit(strips[0][1], strips[1][0]));
179 hitVector.push_back(
MakeHit(strips[0][0], strips[1][0]));
181 hitVector.push_back(
MakeHit(strips[0][1], strips[1][0]));
183 hitVector.push_back(
MakeHit(strips[0][0], strips[1][1]));
185 hitVector.push_back(
MakeHit(strips[0][1], strips[1][1]));
194 if(h.second.ArrayPosition() != v.second.ArrayPosition()) {
195 std::cerr <<
"\tSomething is wrong, Horizontal and Vertical detector numbers don't match." << std::endl;
197 if(h.second.ArraySubPositionString().c_str()[0] != v.second.ArraySubPositionString().c_str()[0]) {
198 std::cerr <<
"\tSomething is wrong, Horizontal and Vertical positions don't match." << std::endl;
201 if(h.second.ArraySubPositionString()[0] ==
'D') {
202 csmHit->SetDetectorNumber(h.second.ArrayPosition());
203 csmHit->SetDHorizontalCharge(h.first.GetCharge());
204 csmHit->SetDVerticalCharge(v.first.GetCharge());
205 csmHit->SetDHorizontalStrip(h.second.Segment());
206 csmHit->SetDVerticalStrip(v.second.Segment());
207 csmHit->SetDHorizontalCFD(
static_cast<int>(h.first.GetCfd()));
208 csmHit->SetDVerticalCFD(
static_cast<int>(v.first.GetCfd()));
209 csmHit->SetDHorizontalTime(h.first.GetTimeStamp());
210 csmHit->SetDVerticalTime(v.first.GetTimeStamp());
211 csmHit->SetDHorizontalEnergy(h.first.GetEnergy());
212 csmHit->SetDVerticalEnergy(v.first.GetEnergy());
213 csmHit->SetDPosition(
TCSM::GetPosition(h.second.ArrayPosition(), h.second.ArraySubPositionString()[0],
214 h.second.Segment(), v.second.Segment()));
215 }
else if(h.second.ArraySubPositionString().c_str()[0] ==
'E') {
216 csmHit->SetDetectorNumber(h.second.ArrayPosition());
217 csmHit->SetEHorizontalCharge(h.first.GetCharge());
218 csmHit->SetEVerticalCharge(v.first.GetCharge());
219 csmHit->SetEHorizontalStrip(h.second.Segment());
220 csmHit->SetEVerticalStrip(v.second.Segment());
221 csmHit->SetEHorizontalCFD(
static_cast<int>(h.first.GetCfd()));
222 csmHit->SetEVerticalCFD(
static_cast<int>(v.first.GetCfd()));
223 csmHit->SetEHorizontalTime(h.first.GetTimeStamp());
224 csmHit->SetEVerticalTime(v.first.GetTimeStamp());
225 csmHit->SetEHorizontalEnergy(h.first.GetEnergy());
226 csmHit->SetEVerticalEnergy(v.first.GetEnergy());
227 csmHit->SetEPosition(
TCSM::GetPosition(h.second.ArrayPosition(), h.second.ArraySubPositionString()[0],
228 h.second.Segment(), v.second.Segment()));
235 std::vector<std::pair<TFragment, TGRSIMnemonic>>& vvV)
239 if(hhV.empty() || vvV.empty()) {
240 std::cerr <<
"\tSomething is wrong, empty vector in MakeHit" << std::endl;
244 int DetNumH = hhV[0].second.ArrayPosition();
245 char DetPosH = hhV[0].second.ArraySubPositionString()[0];
246 int ChargeH =
static_cast<int>(hhV[0].first.GetCharge());
247 double EnergyH = hhV[0].first.
GetEnergy();
251 for(
size_t i = 1; i < hhV.size(); ++i) {
252 if(hhV[i].first.GetCharge() > hhV[biggestH].first.GetCharge()) {
256 if(hhV[i].second.ArrayPosition() != DetNumH) {
257 std::cerr <<
"\tSomething is wrong, Horizontal detector numbers don't match in vector loop." << std::endl;
259 if(hhV[i].second.ArraySubPositionString()[0] != DetPosH) {
260 std::cerr <<
"\tSomething is wrong, Horizontal detector positions don't match in vector loop." << std::endl;
262 ChargeH +=
static_cast<int>(hhV[i].first.GetCharge());
263 EnergyH += hhV[i].first.GetEnergy();
266 int StripH = hhV[biggestH].second.Segment();
267 auto ConFraH =
static_cast<int>(hhV[biggestH].first.GetCfd());
268 auto TimeH =
static_cast<double>(hhV[biggestH].first.GetTimeStamp());
271 int DetNumV = vvV[0].second.ArrayPosition();
272 char DetPosV = vvV[0].second.ArraySubPositionString()[0];
273 auto ChargeV =
static_cast<int>(vvV[0].first.GetCharge());
274 double EnergyV = vvV[0].first.GetEnergy();
278 for(
size_t i = 1; i < vvV.size(); ++i) {
279 if(vvV[i].first.GetCharge() > vvV[biggestV].first.GetCharge()) {
283 if(vvV[i].second.ArrayPosition() != DetNumV) {
284 std::cerr <<
"\tSomething is wrong, Vertical detector numbers don't match in vector loop." << std::endl;
286 if(vvV[i].second.ArraySubPositionString()[0] != DetPosV) {
287 std::cerr <<
"\tSomething is wrong, Vertical detector positions don't match in vector loop." << std::endl;
289 ChargeV +=
static_cast<int>(vvV[i].first.GetCharge());
290 EnergyV += vvV[i].first.GetEnergy();
293 int StripV = vvV[biggestV].second.Segment();
294 auto ConFraV =
static_cast<int>(vvV[biggestV].first.GetCfd());
295 auto TimeV =
static_cast<double>(vvV[biggestV].first.GetTimeStamp());
297 if(DetNumH != DetNumV) {
298 std::cerr <<
"\tSomething is wrong, Horizontal and Vertical detector numbers don't match in vector." << std::endl;
300 if(DetPosH != DetPosV) {
301 std::cerr <<
"\tSomething is wrong, Horizontal and Vertical positions don't match in vector." << std::endl;
305 csmHit->SetDetectorNumber(DetNumH);
306 csmHit->SetDHorizontalCharge(
static_cast<float>(ChargeH));
307 csmHit->SetDVerticalCharge(
static_cast<float>(ChargeV));
308 csmHit->SetDHorizontalStrip(StripH);
309 csmHit->SetDVerticalStrip(StripV);
310 csmHit->SetDHorizontalCFD(ConFraH);
311 csmHit->SetDVerticalCFD(ConFraV);
312 csmHit->SetDHorizontalTime(
static_cast<int>(TimeH));
313 csmHit->SetDVerticalTime(
static_cast<int>(TimeV));
314 csmHit->SetDHorizontalEnergy(EnergyH);
315 csmHit->SetDVerticalEnergy(EnergyV);
317 }
else if(DetPosH ==
'E') {
318 csmHit->SetDetectorNumber(DetNumH);
319 csmHit->SetEHorizontalCharge(
static_cast<float>(ChargeH));
320 csmHit->SetEVerticalCharge(
static_cast<float>(ChargeV));
321 csmHit->SetEHorizontalStrip(StripH);
322 csmHit->SetEVerticalStrip(StripV);
323 csmHit->SetEHorizontalCFD(ConFraH);
324 csmHit->SetEVerticalCFD(ConFraV);
325 csmHit->SetEHorizontalTime(
static_cast<int>(TimeH));
326 csmHit->SetEVerticalTime(
static_cast<int>(TimeV));
327 csmHit->SetEHorizontalEnergy(EnergyH);
328 csmHit->SetEVerticalEnergy(EnergyV);
335void TCSM::BuilddEE(std::vector<std::vector<TDetectorHit*>>& hitVec, std::vector<TDetectorHit*>& builtHits)
337 std::vector<TDetectorHit*> d1;
338 std::vector<TDetectorHit*> d2;
339 std::vector<TDetectorHit*> e1;
340 std::vector<TDetectorHit*> e2;
342 for(
auto& i : hitVec[0]) {
343 auto* hit =
static_cast<TCSMHit*
>(i);
344 if(hit->GetDetectorNumber() == 3 || hit->GetDetectorNumber() == 4) {
346 builtHits.push_back(i);
347 }
else if(hit->GetDetectorNumber() == 1) {
349 }
else if(hit->GetDetectorNumber() == 2) {
352 std::cerr <<
" Caution, in BuilddEE detector number in D vector is out of bounds." << std::endl;
356 for(
auto& i : hitVec[1]) {
357 auto* hit =
static_cast<TCSMHit*
>(i);
358 if(hit->GetDetectorNumber() == 1) {
360 }
else if(hit->GetDetectorNumber() == 2) {
363 std::cerr <<
" Caution, in BuilddEE detector number in E vector is out of bounds." << std::endl;
371void TCSM::MakedEE(std::vector<TDetectorHit*>& DHitVec, std::vector<TDetectorHit*>& EHitVec, std::vector<TDetectorHit*>& BuiltHits)
373 if(DHitVec.empty() && EHitVec.empty()) {
376 if(DHitVec.size() == 1 && EHitVec.empty()) {
377 BuiltHits.push_back(DHitVec.at(0));
378 }
else if(DHitVec.empty() && EHitVec.size() == 1) {
379 BuiltHits.push_back(EHitVec.at(0));
380 }
else if(DHitVec.size() == 1 && EHitVec.size() == 1) {
381 BuiltHits.push_back(
CombineHits(DHitVec.at(0), EHitVec.at(0)));
382 }
else if(DHitVec.size() == 2 && EHitVec.empty()) {
383 BuiltHits.push_back(DHitVec.at(0));
384 BuiltHits.push_back(DHitVec.at(1));
385 }
else if(DHitVec.empty() && EHitVec.size() == 2) {
386 BuiltHits.push_back(EHitVec.at(0));
387 BuiltHits.push_back(EHitVec.at(1));
388 }
else if(DHitVec.size() == 2 && EHitVec.size() == 1) {
393 if(std::abs(dt1 - et) <= std::abs(dt2 - et)) {
394 BuiltHits.push_back(
CombineHits(DHitVec.at(0), EHitVec.at(0)));
396 BuiltHits.push_back(DHitVec.at(1));
399 BuiltHits.push_back(
CombineHits(DHitVec.at(1), EHitVec.at(0)));
401 BuiltHits.push_back(DHitVec.at(0));
404 }
else if(DHitVec.size() == 1 && EHitVec.size() == 2) {
409 if(std::abs(dt - et1) <= std::abs(dt - et2)) {
410 BuiltHits.push_back(
CombineHits(DHitVec.at(0), EHitVec.at(0)));
412 BuiltHits.push_back(EHitVec.at(1));
415 BuiltHits.push_back(
CombineHits(DHitVec.at(0), EHitVec.at(1)));
417 BuiltHits.push_back(EHitVec.at(0));
420 }
else if(DHitVec.size() == 2 && EHitVec.size() == 2) {
426 if(std::abs(dt1 - et1) + std::abs(dt2 - et2) <= std::abs(dt1 - et2) + std::abs(dt2 - et1)) {
427 BuiltHits.push_back(
CombineHits(DHitVec.at(0), EHitVec.at(0)));
429 BuiltHits.push_back(
CombineHits(DHitVec.at(1), EHitVec.at(1)));
432 BuiltHits.push_back(
CombineHits(DHitVec.at(0), EHitVec.at(1)));
434 BuiltHits.push_back(
CombineHits(DHitVec.at(1), EHitVec.at(0)));
438 std::cout <<
"D Size: " << DHitVec.size() <<
" E Size: " << EHitVec.size() << std::endl;
442void TCSM::OldBuilddEE(std::vector<TDetectorHit*>& DHitVec, std::vector<TDetectorHit*>& EHitVec, std::vector<TDetectorHit*>& BuiltHits)
444 bool printbit =
false;
445 if(DHitVec.empty() && EHitVec.empty()) {
449 std::vector<bool> EUsed(EHitVec.size(),
false);
450 std::vector<bool> DUsed(DHitVec.size(),
false);
452 for(
size_t diter = 0; diter < DHitVec.size(); diter++) {
453 if(DUsed.at(diter)) {
457 for(
size_t eiter = 0; eiter < EHitVec.size(); eiter++) {
458 if(EUsed.at(eiter)) {
468 BuiltHits.push_back(
CombineHits(DHitVec.at(diter), EHitVec.at(eiter)));
469 DUsed.at(diter) =
true;
470 EUsed.at(eiter) =
true;
478 for(
size_t i = 0; i < DHitVec.size(); i++) {
480 for(
size_t j = 0; j < EHitVec.size(); j++) {
483 BuiltHits.push_back(
CombineHits(DHitVec.at(i), EHitVec.at(j)));
494 for(
size_t i = 0; i < DHitVec.size(); i++) {
496 BuiltHits.push_back(DHitVec.at(i));
499 for(
size_t j = 0; j < EHitVec.size(); j++) {
501 BuiltHits.push_back(EHitVec.at(j));
506 for(
auto& BuiltHit : BuiltHits) {
514void TCSM::RecoverHit(
char orientation, std::pair<TFragment, TGRSIMnemonic>& hit, std::vector<TDetectorHit*>& hits)
522 int detno = hit.second.ArrayPosition();
523 char pos = hit.second.ArraySubPositionString()[0];
528 if(pos ==
'D' && orientation ==
'V') {
529 csmHit->SetDetectorNumber(detno);
530 csmHit->SetDHorizontalCharge(hit.first.GetCharge());
531 csmHit->SetDVerticalCharge(hit.first.GetCharge());
532 csmHit->SetDHorizontalStrip(9);
533 csmHit->SetDVerticalStrip(hit.second.Segment());
534 csmHit->SetDHorizontalCFD(
static_cast<int>(hit.first.GetCfd()));
535 csmHit->SetDVerticalCFD(
static_cast<int>(hit.first.GetCfd()));
536 csmHit->SetDHorizontalTime(hit.first.GetTimeStamp());
537 csmHit->SetDVerticalTime(hit.first.GetTimeStamp());
538 csmHit->SetDHorizontalEnergy(hit.first.GetEnergy());
539 csmHit->SetDVerticalEnergy(hit.first.GetEnergy());
545 std::cerr <<
"3E in RecoverHit" << std::endl;
548 }
else if(orientation ==
'H') {
549 csmHit->SetDetectorNumber(detno);
550 csmHit->SetDHorizontalCharge(hit.first.GetCharge());
551 csmHit->SetDVerticalCharge(hit.first.GetCharge());
552 csmHit->SetDHorizontalStrip(hit.second.Segment());
553 csmHit->SetDVerticalStrip(11);
554 csmHit->SetDHorizontalCFD(
static_cast<int>(hit.first.GetCfd()));
555 csmHit->SetDVerticalCFD(
static_cast<int>(hit.first.GetCfd()));
556 csmHit->SetDHorizontalTime(hit.first.GetTimeStamp());
557 csmHit->SetDVerticalTime(hit.first.GetTimeStamp());
558 csmHit->SetDHorizontalEnergy(hit.first.GetEnergy());
559 csmHit->SetDVerticalEnergy(hit.first.GetEnergy());
565 std::cerr <<
"4E in RecoverHit" << std::endl;
567 }
else if(orientation ==
'H') {
568 csmHit->SetDetectorNumber(detno);
569 csmHit->SetDHorizontalCharge(hit.first.GetCharge());
570 csmHit->SetDVerticalCharge(hit.first.GetCharge());
571 csmHit->SetDHorizontalStrip(hit.second.Segment());
572 csmHit->SetDVerticalStrip(15);
573 csmHit->SetDHorizontalCFD(
static_cast<int>(hit.first.GetCfd()));
574 csmHit->SetDVerticalCFD(
static_cast<int>(hit.first.GetCfd()));
575 csmHit->SetDHorizontalTime(hit.first.GetTimeStamp());
576 csmHit->SetDVerticalTime(hit.first.GetTimeStamp());
577 csmHit->SetDHorizontalEnergy(hit.first.GetEnergy());
578 csmHit->SetDVerticalEnergy(hit.first.GetEnergy());
583 std::cerr <<
"Something is wrong. The detector number in recover hit is out of bounds." << std::endl;
587 if(!csmHit->IsEmpty()) {
588 hits.push_back(csmHit);
594 auto* dHit =
static_cast<TCSMHit*
>(d_hit);
595 auto* eHit =
static_cast<TCSMHit*
>(e_hit);
596 if(dHit->GetDetectorNumber() != eHit->GetDetectorNumber()) {
597 std::cerr <<
"Something is wrong. In combine hits, the detector numbers don't match" << std::endl;
601 dHit->SetEVerticalStrip(eHit->GetEVerticalStrip());
603 dHit->SetEHorizontalCharge(eHit->GetEHorizontalCharge());
604 dHit->SetEVerticalCharge(eHit->GetEVerticalCharge());
606 dHit->SetEHorizontalEnergy(eHit->GetEHorizontalEnergy());
607 dHit->SetEVerticalEnergy(eHit->GetEVerticalEnergy());
609 dHit->SetEHorizontalCFD(eHit->GetEHorizontalCFD());
610 dHit->SetEVerticalCFD(eHit->GetEVerticalCFD());
612 dHit->SetEHorizontalTime(
static_cast<int>(eHit->GetEHorizontalTime()));
613 dHit->SetEVerticalTime(
static_cast<int>(eHit->GetEVerticalTime()));
615 dHit->SetEPosition(eHit->GetEPosition());