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