GRSISort "v4.0.0.5"
An extension of the ROOT analysis Framework
Loading...
Searching...
No Matches
TEmma.cxx
Go to the documentation of this file.
1#include <iostream>
2#include "TEmma.h"
3
4#include "TMnemonic.h"
5
6////////////////////////////////////////////////////////////
7//
8// TEmma
9//
10// The TEmma class defines the observables and algorithms used
11// when analyzing EMMA data.
12//
13////////////////////////////////////////////////////////////
14
15double TEmma::fAnodeTrigger = 0;
16double TEmma::fICEnergy = 0;
17double TEmma::fXdiff = 0;
18double TEmma::fXsum = 0;
19double TEmma::fYdiff = 0;
20double TEmma::fYsum = 0;
21double TEmma::fXlength = 80.; //Size of X focal plane in mm
22double TEmma::fYlength = 30.; //Size of Y focal plane in mm
23int16_t TEmma::fFail = 0;
24
26{
27 Clear();
28}
29
30TEmma::TEmma(const TEmma& rhs) : TDetector(rhs)
31{
32 rhs.Copy(*this);
33}
34
35void TEmma::Copy(TObject& rhs) const
36{
37 TDetector::Copy(rhs);
38 static_cast<TEmma&>(rhs).fEmmaICHits = fEmmaICHits;
39 static_cast<TEmma&>(rhs).fEmmaSiHits = fEmmaSiHits;
40 static_cast<TEmma&>(rhs).fEmmaSSBHits = fEmmaSSBHits;
41 static_cast<TEmma&>(rhs).fEmmaTdcHits = fEmmaTdcHits;
42 static_cast<TEmma&>(rhs).fEmmaAnodeHits = fEmmaAnodeHits;
43 static_cast<TEmma&>(rhs).fEmmaTriggerHits = fEmmaTriggerHits;
44}
45
46void TEmma::Print(Option_t*) const
47{
48 /// Prints out TEmma members, currently only prints multiplicity.
49 Print(std::cout);
50}
51
52void TEmma::Print(std::ostream& out) const
53{
54 std::ostringstream str;
55 str << GetMultiplicity() << " hits" << std::endl;
56 out << str.str();
57}
58
60{
61 rhs.Copy(*this);
62 return *this;
63}
64
65void TEmma::AddFragment(const std::shared_ptr<const TFragment>& frag, TChannel* chan)
66{
67 if(frag == nullptr || chan == nullptr) {
68 return;
69 }
70 TEmmaHit dethit(*frag);
71 if(chan->GetMnemonic()->SubSystem() == TMnemonic::EMnemonic::kI) { // IC ADC Data
72 fEmmaICHits.push_back(std::move(dethit));
73 } else if(chan->GetMnemonic()->SubSystem() == TMnemonic::EMnemonic::kS) { // Si at focal plane
74 fEmmaSiHits.push_back(std::move(dethit));
75 } else if(chan->GetMnemonic()->SubSystem() == TMnemonic::EMnemonic::kT) { // EMMA focal plane Trigger
76 fEmmaTriggerHits.push_back(std::move(dethit));
77 } else if(chan->GetMnemonic()->SubSystem() == TMnemonic::EMnemonic::kP) { // PGAC
78 if(chan->GetMnemonic()->CollectedCharge() == TMnemonic::EMnemonic::kN) { // Anode data
79 switch(chan->GetMnemonic()->OutputSensor()) {
81 fEmmaAnodeHits.push_back(std::move(dethit)); // Anode ADC data
82 break;
83
85 dethit.SetTdcNumber(frag->GetSegment());
86 fEmmaTdcHits.push_back(std::move(dethit)); // PGAC Anode TDC data
87 break;
88
89 default:
90 break;
91 }
92 } else if(chan->GetMnemonic()->CollectedCharge() == TMnemonic::EMnemonic::kP) { // PGAC Cathode TDC data
93 switch(chan->GetMnemonic()->OutputSensor()) {
95 dethit.SetTdcNumber(10);
96 break;
97
99 dethit.SetTdcNumber(11);
100 break;
101
103 dethit.SetTdcNumber(12);
104 break;
105
107 dethit.SetTdcNumber(13);
108 break;
109
110 default:
111 break;
112 };
113 fEmmaTdcHits.push_back(std::move(dethit));
114 }
115 } else if(chan->GetMnemonic()->SubSystem() == TMnemonic::EMnemonic::kO) { // ORTEC SSBs at target position
116 fEmmaSSBHits.push_back(std::move(dethit));
117 } else {
118 return;
119 }
120}
121
122TVector3 TEmma::GetPosition(double left, double right, double top, double bottom, double delayL, double delayR, double delayT, double delayB)
123{
124 // Calculates recoil position from PGAC TDC data including delays
125 double Xdiff = (left + delayL) - (right + delayR);
126 double Xsum = (left) + (right);
127 double Ydiff = (bottom + delayB) - (top + delayT);
128 double Ysum = (bottom) + (top);
129
130 double Xpos = (Xdiff / Xsum) * fXlength;
131 double Ypos = (Ydiff / Ysum) * fYlength;
132
133 return {Xpos, Ypos, 1};
134}
135
137{
138 if(i < GetICMultiplicity()) {
139 return &fEmmaICHits.at(i);
140 }
141 std::cerr << "EMMA IC hits are out of range" << std::endl;
142 throw grsi::exit_exception(1);
143 return nullptr;
144}
145
147{
148 if(i < GetAnodeMultiplicity()) {
149 return &fEmmaAnodeHits.at(i);
150 }
151 std::cerr << "EMMA PGAC Anode hits are out of range" << std::endl;
152 throw grsi::exit_exception(1);
153 return nullptr;
154}
155
157{
158 if(i < GetTdcMultiplicity()) {
159 return &fEmmaTdcHits.at(i);
160 }
161 std::cerr << "EMMA TDC hits are out of range" << std::endl;
162 throw grsi::exit_exception(1);
163 return nullptr;
164}
165
167{
168 if(i < GetSiMultiplicity()) {
169 return &fEmmaSiHits.at(i);
170 }
171 std::cerr << "EMMA Si hits are out of range" << std::endl;
172 throw grsi::exit_exception(1);
173 return nullptr;
174}
175
177{
178 if(i < GetTriggerMultiplicity()) {
179 return &fEmmaTriggerHits.at(i);
180 }
181 std::cerr << "EMMA Trigger hits are out of range" << std::endl;
182 throw grsi::exit_exception(1);
183 return nullptr;
184}
185
187{
188 if(i < GetSSBMultiplicity()) {
189 return &fEmmaSSBHits.at(i);
190 }
191 std::cerr << "EMMA SSB hits are out of range" << std::endl;
192 throw grsi::exit_exception(1);
193 return nullptr;
194}
195
197{
198 // Everything below is reproduced from the EMMA sort code given to me by Nick Esker
199 // The EMMA PGAC has all cathode signals chained together in the X and Y direction with readouts at each end fed into a TDC.
200 // Build hits subtracts the trigger time (from an anode wire) and returns a left/right/up/down value which is used in GetPosition()
201
202 std::vector<double> tdcArray;
203 std::vector<double> icArray;
204 if(fEmmaTdcHits.size() > 4) { // Require a Good hit to contain only the PGAC TDC signals
205 auto* hit = new TEmmaHit();
206 for(auto& emmaTdcHit : fEmmaTdcHits) {
207 hit->SetTimeStamp(emmaTdcHit.GetTimeStamp());
208 hit->SetAddress(emmaTdcHit.GetAddress());
209 if(emmaTdcHit.GetTdcNumber() < 10) { tdcArray.push_back(emmaTdcHit.GetEnergy()); }
210 if(emmaTdcHit.GetTdcNumber() == 10) { hit->SetLeft(emmaTdcHit.GetEnergy()); }
211 if(emmaTdcHit.GetTdcNumber() == 11) { hit->SetRight(emmaTdcHit.GetEnergy()); }
212 if(emmaTdcHit.GetTdcNumber() == 12) { hit->SetTop(emmaTdcHit.GetEnergy()); }
213 if(emmaTdcHit.GetTdcNumber() == 13) { hit->SetBottom(emmaTdcHit.GetEnergy()); }
214 }
215
216 if(!tdcArray.empty()) {
217 fAnodeTrigger = *std::min_element(tdcArray.begin(), tdcArray.end());
218 if(hit->GetLeft() != 0 && hit->GetRight() != 0 && hit->GetTop() != 0 && hit->GetBottom() != 0 && fAnodeTrigger != 0) {
219 hit->SetLeft((hit->GetLeft() - fAnodeTrigger));
220 hit->SetRight((hit->GetRight() - fAnodeTrigger));
221 hit->SetTop((hit->GetTop() - fAnodeTrigger));
222 hit->SetBottom((hit->GetBottom() - fAnodeTrigger));
223 hit->SetAnodeTrigger(fAnodeTrigger);
224 AddHit(hit);
225 } else {
226 //std::cout<<"TDC Array Failed"<<std::endl;
227 fFail = 0;
228 if(hit->GetLeft() == 0) { fFail++; }
229 if(hit->GetRight() == 0) { fFail++; }
230 if(hit->GetTop() == 0) { fFail++; }
231 if(hit->GetBottom() == 0) { fFail++; }
232 hit->SetFailedFill(fFail);
233 AddHit(hit);
234 }
235 } else {
236 return;
237 }
238 }
239}
240void TEmma::Clear(Option_t* opt)
241{
242 TDetector::Clear(opt);
243 fEmmaICHits.clear();
244 fEmmaAnodeHits.clear();
245 fEmmaTdcHits.clear();
246 fEmmaSiHits.clear();
247 fEmmaTriggerHits.clear();
248 fEmmaSSBHits.clear();
249}
const TMnemonic * GetMnemonic() const
void Copy(TObject &) const override
!
Definition TDetector.cxx:24
virtual Short_t GetMultiplicity() const
Definition TDetector.h:70
void Clear(Option_t *="") override
!
Definition TDetector.cxx:67
virtual void AddHit(TDetectorHit *hit)
Definition TDetector.h:60
void SetTdcNumber(int n)
Definition TEmmaHit.h:36
Definition TEmma.h:19
std::vector< TEmmaHit > fEmmaAnodeHits
Definition TEmma.h:53
void Print(Option_t *opt="") const override
!
Definition TEmma.cxx:46
Short_t GetICMultiplicity() const
Definition TEmma.h:41
std::vector< TEmmaHit > fEmmaSSBHits
Definition TEmma.h:56
void AddFragment(const std::shared_ptr< const TFragment > &, TChannel *) override
!
Definition TEmma.cxx:65
static double fXlength
Definition TEmma.h:65
std::vector< TEmmaHit > fEmmaTriggerHits
Definition TEmma.h:57
TEmma & operator=(const TEmma &)
!
Definition TEmma.cxx:59
Short_t GetTriggerMultiplicity() const
Definition TEmma.h:46
static int16_t fFail
Definition TEmma.h:67
TEmmaHit * GetTdcHit(const int &i)
Definition TEmma.cxx:156
TEmmaHit * GetSiHit(const int &i)
Definition TEmma.cxx:166
static double fXdiff
Definition TEmma.h:61
Short_t GetAnodeMultiplicity() const
Definition TEmma.h:42
void BuildHits() override
!
Definition TEmma.cxx:196
Short_t GetTdcMultiplicity() const
Definition TEmma.h:43
static double fYsum
Definition TEmma.h:64
void Clear(Option_t *opt="all") override
!
Definition TEmma.cxx:240
Short_t GetSSBMultiplicity() const
Definition TEmma.h:45
TEmmaHit * GetSSBHit(const int &i)
Definition TEmma.cxx:186
static double fYdiff
Definition TEmma.h:63
static double fXsum
Definition TEmma.h:62
void Copy(TObject &) const override
!
Definition TEmma.cxx:35
Short_t GetSiMultiplicity() const
Definition TEmma.h:44
static double fICEnergy
!
Definition TEmma.h:60
TEmmaHit * GetAnodeHit(const int &i)
Definition TEmma.cxx:146
TEmmaHit * GetTriggerHit(const int &i)
Definition TEmma.cxx:176
static double fAnodeTrigger
!
Definition TEmma.h:59
TEmma()
Definition TEmma.cxx:25
std::vector< TEmmaHit > fEmmaTdcHits
Definition TEmma.h:54
std::vector< TEmmaHit > fEmmaICHits
Definition TEmma.h:52
static TVector3 GetPosition(double left, double right, double top, double bottom, double delayL, double delayR, double delayT, double delayB)
Definition TEmma.cxx:122
static double fYlength
Definition TEmma.h:66
TEmmaHit * GetICHit(const int &i)
Definition TEmma.cxx:136
std::vector< TEmmaHit > fEmmaSiHits
Definition TEmma.h:55
virtual EMnemonic OutputSensor() const
Definition TMnemonic.h:66
virtual EMnemonic SubSystem() const
Definition TMnemonic.h:62
virtual EMnemonic CollectedCharge() const
Definition TMnemonic.h:65