27 fTimingConverterArray(nullptr), fChargeConverterArray(nullptr),
28 fXConverterArray(nullptr), fYConverterArray(nullptr) {
29 StringVec_t defInput(1,
"catdata");
30 RegisterInputCollection(
"InputCollection",
"rawdata object returned by TRIDFEventStore",
32 RegisterOutputCollection(
"OutputCollection",
"output collection name",
34 RegisterProcessorParameter(
"CatID",
"Category ID of PPAC",
fCatID, 1);
35 RegisterProcessorParameter(
"TimingConverterArray",
36 "name of time converter array (ch2ns)",
38 RegisterProcessorParameter(
"ChargeConverterArray",
"name of charge converter array (qped)",
40 RegisterProcessorParameter(
"XConverterArray",
"name of x position converter array (ns2mm)",
42 RegisterProcessorParameter(
"YConverterArray",
"name of y position converter array (ns2mm)",
44 RegisterOptionalInputInfo(
"PPACParameter",
"name of ppac parameter",
fParameterName,
45 TString(
"prm:ppac"), &
fParameterSet,
"TClonesArray",
"art::TPPACParameter");
47 RegisterOptionalParameter(
"ListOfParameterNames",
"list of names of parameter",
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.",
54 RegisterOptionalParameter(
"DoSeparatePPACs",
"separate output for each ppacs",
56 RegisterOptionalParameter(
"HasEachChConverter",
"converter should be prepared for each channel",
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);
77 fPPACOut =
new TClonesArray(TPPACData::Class());
92 Warning(
"Init",
"Cannot separate PPACs since no name is set while DoSeparatePPACs is true");
97 }
else if (nParams != nPPACs) {
98 SetStateError(
"The numbers of parameters and PPACs are different, while trying to separate PPAC output");
103 for (Int_t i = 0; i != nPPACs; i++) {
106 fPPACArray[i] =
new TClonesArray(TPPACData::Class());
108 TPPACParameter *prm =
dynamic_cast<TPPACParameter *
>((*fParameterSet)->FindObject(
fListOfParameterNames[i]));
110 SetStateError(TString::Format(
"No such parameter '%s' is found,while trying to separate PPAC output",
125 for (std::vector<TClonesArray *>::iterator it =
fPPACArray.begin(); it !=
fPPACArray.end(); it++) {
130 const TObjArray *
const cat = (*fCategorizedData)->FindCategory(
fCatID);
133 Int_t t[TPPACData::kNRAW], q[TPPACData::kNRAW];
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;
141 for (Int_t j = 0; j != TPPACData::kNRAW; ++j) {
143 t[j] = q[j] = kInvalidI;
145 const TObjArray *
const tArray =
static_cast<TObjArray *
>(det->At(j));
146 const TObjArray *
const qArray =
static_cast<TObjArray *
>(det->At(j + TPPACData::kNRAW));
148 if (tArray && tArray->GetEntriesFast()) {
149 TRawDataObject *
const tHit =
static_cast<TRawDataObject *
>(tArray->At(0));
152 t[j] = tHit->GetValue();
154 detID = tHit->GetDetID();
155 idFlag = IsValid(detID);
159 if (qArray && qArray->GetEntriesFast()) {
160 TRawDataObject *
const qHit =
static_cast<TRawDataObject *
>(qArray->At(0));
162 q[j] = qHit->GetValue();
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) {
181 ppac->SetT(conv->Convert(t[j]), j);
198 ppac->SetQ(conv->Convert(q[j]), j);
215 TPPACData *ppacdata = (TPPACData *)arr->ConstructedAt(arr->GetEntriesFast());
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());
223 dTX += prm->GetInsideOffset(0);
224 dTY += prm->GetInsideOffset(1);
229 dTX -= prm->GetOutsideOffset(0);
230 dTY -= prm->GetOutsideOffset(1);
233 ppacdata->SetTXDiff(dTX);
234 ppacdata->SetTYDiff(dTY);
236 X = dTX * prm->GetNs2mm(0) * 0.5;
237 Y = dTY * prm->GetNs2mm(1) * 0.5;
238 if (prm->GetExchangeXY()) {
243 if (prm->GetReflection()) {
249 X -= prm->GetGeometryOffset(0);
250 Y -= prm->GetGeometryOffset(1);
252 ppacdata->ResetQualityBit(TDataObject::kInvalid);
253 if (!prm->IsInsideTXSum(ppacdata->GetTXSum())) {
254 ppacdata->SetQualityBit(TPPACData::kBadTXSum | TDataObject::kInvalid);
256 if (!prm->IsInsideTYSum(ppacdata->GetTYSum())) {
257 ppacdata->SetQualityBit(TPPACData::kBadTYSum | TDataObject::kInvalid);
261 ppacdata->SetZ(prm->GetGeometryOffset(2));
262 ppacdata->Copy(*ppac);