ARTEMIS-CRIB
 
Loading...
Searching...
No Matches
TF1PPACProcessor.cc
Go to the documentation of this file.
1/**
2 * @file TF1PPACProcessor.cc
3 * @brief Created from TPPACPrcessor
4 * @author Kodai Okawa <okawa@cns.s.u-tokyo.ac.jp>
5 * @date 2022-08-08 17:25:02
6 * @note last modified: 2024-08-23 20:50:50
7 * @details
8 */
9
10#include "TF1PPACProcessor.h"
11
12#include "TConverterBase.h"
13#include "TConverterUtil.h"
14#include "TPPACData.h"
15#include "TPPACParameter.h"
16
17#include <TCategorizedData.h>
18#include <TRawDataObject.h>
19
21
23
24// Default constructor
26 : fPPACOut(nullptr),
27 fTimingConverterArray(nullptr), fChargeConverterArray(nullptr),
28 fXConverterArray(nullptr), fYConverterArray(nullptr) {
29 StringVec_t defInput(1, "catdata");
30 RegisterInputCollection("InputCollection", "rawdata object returned by TRIDFEventStore",
31 fInputColName, defInput);
32 RegisterOutputCollection("OutputCollection", "output collection name",
33 fOutputColName, TString("ppac"));
34 RegisterProcessorParameter("CatID", "Category ID of PPAC", fCatID, 1);
35 RegisterProcessorParameter("TimingConverterArray",
36 "name of time converter array (ch2ns)",
37 fTimingConverterArrayName, TString("ppac_ch2ns"));
38 RegisterProcessorParameter("ChargeConverterArray", "name of charge converter array (qped)",
39 fChargeConverterArrayName, TString("ppac_qped"));
40 RegisterProcessorParameter("XConverterArray", "name of x position converter array (ns2mm)",
41 fXConverterArrayName, TString("ppac_xconv"));
42 RegisterProcessorParameter("YConverterArray", "name of y position converter array (ns2mm)",
43 fYConverterArrayName, TString("ppac_yconv"));
44 RegisterOptionalInputInfo("PPACParameter", "name of ppac parameter", fParameterName,
45 TString("prm:ppac"), &fParameterSet, "TClonesArray", "art::TPPACParameter");
46 defInput.clear();
47 RegisterOptionalParameter("ListOfParameterNames", "list of names of parameter",
48 fListOfParameterNames, defInput);
49 RegisterOptionalParameter("ListOfPPACNames",
50 "list of names of ppac: the size should be same as the maximum detector id.\n"
51 "Index corresponds to the id of PPAC.\n"
52 "If name at certain index is empty the output of correnponding ppac will be ommitted.",
53 fListOfPPACNames, defInput);
54 RegisterOptionalParameter("DoSeparatePPACs", "separate output for each ppacs",
55 fDoSeparatePPACs, kFALSE);
56 RegisterOptionalParameter("HasEachChConverter", "converter should be prepared for each channel",
57 fHasEachChConverter, kFALSE);
58 RegisterOptionalParameter("doInsideOffset", "calibrate delayline offset if non 0", fDoInsideOffset, kTRUE);
59 RegisterOptionalParameter("doOutsideOffset", "calibrate line offset if non 0", fDoOutsideOffset, kTRUE);
60 RegisterOptionalParameter("doGeometryOffset", "calibrate geometry offset if non 0", fDoGeometryOffset, kTRUE);
61}
62
70
71void TF1PPACProcessor::Init(TEventCollection *col) {
72
73 fCategorizedData = reinterpret_cast<TCategorizedData **>(col->GetObjectRef(fInputColName[0].Data()));
75 return;
76
77 fPPACOut = new TClonesArray(TPPACData::Class());
78 fPPACOut->SetName(fOutputColName);
79 col->Add(fOutputColName, fPPACOut, fOutputIsTransparent);
80
81 Info("Init", "CatID: %d => %s\n", fCatID, fOutputColName.Data());
82
83 TConverterUtil::SetConverterArray(&fTimingConverterArray, fTimingConverterArrayName, col);
84 TConverterUtil::SetConverterArray(&fChargeConverterArray, fChargeConverterArrayName, col);
85 TConverterUtil::SetConverterArray(&fXConverterArray, fXConverterArrayName, col);
86 TConverterUtil::SetConverterArray(&fYConverterArray, fYConverterArrayName, col);
87
88 if (fDoSeparatePPACs) {
89 const Int_t &nPPACs = fListOfPPACNames.size();
90 const Int_t &nParams = fListOfParameterNames.size();
91 if (!nPPACs) {
92 Warning("Init", "Cannot separate PPACs since no name is set while DoSeparatePPACs is true");
93 return;
94 }
95 if (!nParams) {
96 std::copy(fListOfPPACNames.begin(), fListOfPPACNames.end(), std::back_inserter(fListOfParameterNames));
97 } else if (nParams != nPPACs) {
98 SetStateError("The numbers of parameters and PPACs are different, while trying to separate PPAC output");
99 return;
100 }
101 fPPACArray.resize(nPPACs, nullptr);
102 fPPACParameter.resize(nPPACs, nullptr);
103 for (Int_t i = 0; i != nPPACs; i++) {
104 if (fListOfPPACNames[i].IsNull())
105 continue;
106 fPPACArray[i] = new TClonesArray(TPPACData::Class());
107 col->Add(fListOfPPACNames[i], fPPACArray[i], fOutputIsTransparent);
108 TPPACParameter *prm = dynamic_cast<TPPACParameter *>((*fParameterSet)->FindObject(fListOfParameterNames[i]));
109 if (!prm) {
110 SetStateError(TString::Format("No such parameter '%s' is found,while trying to separate PPAC output",
111 fListOfParameterNames[i].Data()));
112 return;
113 }
114 fPPACParameter[i] = prm;
115 }
116 }
117}
118
120 if (!fCategorizedData)
121 return;
122
123 fPPACOut->Clear("C");
124 if (fDoSeparatePPACs) {
125 for (std::vector<TClonesArray *>::iterator it = fPPACArray.begin(); it != fPPACArray.end(); it++) {
126 (*it)->Clear("C");
127 }
128 }
129
130 const TObjArray *const cat = (*fCategorizedData)->FindCategory(fCatID);
131 if (!cat)
132 return;
133 Int_t t[TPPACData::kNRAW], q[TPPACData::kNRAW];
134
135 const Int_t n = cat->GetEntriesFast();
136 for (Int_t i = 0; i != n; ++i) {
137 const TObjArray *const det = static_cast<TObjArray *>(cat->At(i));
138 Bool_t idFlag = kFALSE;
139 Int_t detID = kInvalidI;
140
141 for (Int_t j = 0; j != TPPACData::kNRAW; ++j) {
142
143 t[j] = q[j] = kInvalidI;
144
145 const TObjArray *const tArray = static_cast<TObjArray *>(det->At(j));
146 const TObjArray *const qArray = static_cast<TObjArray *>(det->At(j + TPPACData::kNRAW));
147
148 if (tArray && tArray->GetEntriesFast()) {
149 TRawDataObject *const tHit = static_cast<TRawDataObject *>(tArray->At(0));
150 if (!tHit)
151 continue;
152 t[j] = tHit->GetValue();
153 if (!idFlag) {
154 detID = tHit->GetDetID();
155 idFlag = IsValid(detID);
156 }
157 }
158
159 if (qArray && qArray->GetEntriesFast()) {
160 TRawDataObject *const qHit = static_cast<TRawDataObject *>(qArray->At(0));
161 if (qHit)
162 q[j] = qHit->GetValue();
163 }
164 }
165
166 if (!idFlag)
167 continue;
168
169 TPPACData *const ppac = static_cast<TPPACData *>(fPPACOut->ConstructedAt(fPPACOut->GetEntriesFast()));
170 ppac->SetDetID(detID);
171 for (Int_t j = 0; j != TPPACData::kNRAW; ++j) {
172 if (IsValid(t[j])) {
174 TConverterBase *conv = nullptr;
176 conv = fTimingConverterArray->at(detID * TPPACData::kNRAW + j);
177 } else {
178 conv = fTimingConverterArray->at(detID);
179 }
180 if (conv) {
181 ppac->SetT(conv->Convert(t[j]), j);
182 } else {
183 ppac->SetT(t[j], j);
184 }
185 } else {
186 ppac->SetT(t[j], j);
187 }
188 }
189
190 if (IsValid(q[j])) {
192 TConverterBase *conv = nullptr;
194 conv = fChargeConverterArray->at(detID * TPPACData::kNRAW + j);
195 } else {
196 conv = fChargeConverterArray->at(detID);
197 }
198 ppac->SetQ(conv->Convert(q[j]), j);
199 } else {
200 ppac->SetQ(q[j], j);
201 }
202 }
203 }
204 if (fXConverterArray) {
205 ppac->SetXConverter(fXConverterArray->at(detID - DETID_ORIGIN));
206 }
207 if (fYConverterArray) {
208 ppac->SetYConverter(fYConverterArray->at(detID - DETID_ORIGIN));
209 }
210 ppac->Update();
211
212 if (fDoSeparatePPACs && detID < (Int_t)fPPACArray.size()) {
213 Double_t X, Y;
214 TClonesArray *arr = fPPACArray[detID];
215 TPPACData *ppacdata = (TPPACData *)arr->ConstructedAt(arr->GetEntriesFast());
216 TPPACParameter *prm = (TPPACParameter *)fPPACParameter[detID];
217 ppac->Copy(*ppacdata);
218 Double_t dTX = (ppac->GetTX1() - ppac->GetTX2()) / (ppac->GetTX1() + ppac->GetTX2());
219 Double_t dTY = (ppac->GetTY1() - ppac->GetTY2()) / (ppac->GetTY1() + ppac->GetTY2());
220
221 // if (delaylinecalibrated)
222 if (fDoInsideOffset) {
223 dTX += prm->GetInsideOffset(0);
224 dTY += prm->GetInsideOffset(1);
225 }
226
227 // if (line calib ofset)
228 if (fDoOutsideOffset) {
229 dTX -= prm->GetOutsideOffset(0);
230 dTY -= prm->GetOutsideOffset(1);
231 }
232
233 ppacdata->SetTXDiff(dTX);
234 ppacdata->SetTYDiff(dTY);
235 // exchange and calibration
236 X = dTX * prm->GetNs2mm(0) * 0.5;
237 Y = dTY * prm->GetNs2mm(1) * 0.5;
238 if (prm->GetExchangeXY()) {
239 Double_t tmp = X;
240 X = Y;
241 Y = tmp;
242 }
243 if (prm->GetReflection()) {
244 X *= -1;
245 }
246
247 // geometry offset
248 if (fDoGeometryOffset) {
249 X -= prm->GetGeometryOffset(0);
250 Y -= prm->GetGeometryOffset(1);
251 }
252 ppacdata->ResetQualityBit(TDataObject::kInvalid);
253 if (!prm->IsInsideTXSum(ppacdata->GetTXSum())) {
254 ppacdata->SetQualityBit(TPPACData::kBadTXSum | TDataObject::kInvalid);
255 }
256 if (!prm->IsInsideTYSum(ppacdata->GetTYSum())) {
257 ppacdata->SetQualityBit(TPPACData::kBadTYSum | TDataObject::kInvalid);
258 }
259 ppacdata->SetX(X);
260 ppacdata->SetY(Y);
261 ppacdata->SetZ(prm->GetGeometryOffset(2));
262 ppacdata->Copy(*ppac);
263 }
264 }
265}
ClassImp(TF1PPACProcessor)
Created from TPPACProcessor.
std::vector< TClonesArray * > fPPACArray
std::vector< TConverterBase * > * fChargeConverterArray
TCategorizedData ** fCategorizedData
Bool_t fDoSeparatePPACs
list of ppacs
static const Int_t DETID_ORIGIN
std::vector< TConverterBase * > * fXConverterArray
StringVec_t fListOfParameterNames
parameter set
std::vector< TPPACParameter * > fPPACParameter
std::vector< TConverterBase * > * fYConverterArray
StringVec_t fListOfPPACNames
list of parmaeter for each ppac
void Init(TEventCollection *col) override
std::vector< TConverterBase * > * fTimingConverterArray
return to the guide