From 8b5991b420e24853e2a51a0eda0e2a86032af6f8 Mon Sep 17 00:00:00 2001 From: KAWASE Shoichiro Date: Mon, 14 Oct 2013 11:38:53 +0900 Subject: [PATCH] implement polynomial conversion this conversion can be used as ch2nsec etc. --- processors/TPlasticMappingProcessor.cc | 102 ++++++++++++++++-- processors/TPlasticMappingProcessor.h | 8 +- ...TPolynomialConversionParameterGenerator.cc | 44 ++++---- .../TPolynomialConversionParameterGenerator.h | 4 +- processors/TPolynomialConverter.cc | 9 +- processors/TPolynomialConverter.h | 4 +- processors/TTimingChargeData.cc | 2 +- processors/TTimingChargeData.h | 2 +- .../TTwoSidedPlasticCalibrationProcessor.cc | 12 ++- .../TTwoSidedPlasticCalibrationProcessor.h | 2 +- 10 files changed, 142 insertions(+), 47 deletions(-) diff --git a/processors/TPlasticMappingProcessor.cc b/processors/TPlasticMappingProcessor.cc index e625d14..2152816 100644 --- a/processors/TPlasticMappingProcessor.cc +++ b/processors/TPlasticMappingProcessor.cc @@ -3,7 +3,7 @@ * @brief * * @date Created: 2013-08-12 12:45:58 - * Last Modified: 2013-10-11 14:49:57 + * Last Modified: 2013-10-14 11:35:53 * @author KAWASE Shoichiro * * Copyright (C) 2013 KAWASE Shoichiro All rights reserved. @@ -11,16 +11,20 @@ #include "TPlasticMappingProcessor.h" #include "TTimingChargeData.h" +#include "TPolynomialConverter.h" #include #include using art::TPlasticMappingProcessor; using art::TTimingChargeData; +using art::TPolynomialConverter; // Default constructor TPlasticMappingProcessor::TPlasticMappingProcessor() - : fPlastic(NULL) { + : fPlastic(NULL), + fDoTimeConversion(kTRUE), fDoChargeConversion(kTRUE), + fTimeConversionPrm(NULL), fChargeConversionPrm(NULL) { StringVec_t defInput; defInput.push_back("catdata"); RegisterInputCollection("InputCollection","rawdata object returned by TRIDFEventStore", fInputColName,defInput); @@ -35,12 +39,18 @@ TPlasticMappingProcessor::TPlasticMappingProcessor() fTimingTypeID,1); RegisterProcessorParameter("TrailingComesFirst","0: Leading->Trailing (default), 1: Trailing->Leading (for QTC etc.)", fTrailingComesFirst,kFALSE); + RegisterProcessorParameter("TimeConversionParameter","name of time conversion parameter", + fTimeConversionPrmName,TString("no_conversion")); + RegisterProcessorParameter("ChargeConversionParameter","name of charge conversion parameter", + fChargeConversionPrmName,TString("no_conversion")); } // Default destructor TPlasticMappingProcessor::~TPlasticMappingProcessor() { if(fPlastic) delete fPlastic; fPlastic = NULL; + if (fTimeConversionPrm) delete fTimeConversionPrm; + if (fChargeConversionPrm) delete fChargeConversionPrm; } void TPlasticMappingProcessor::Init(TEventCollection *col) { @@ -49,8 +59,37 @@ void TPlasticMappingProcessor::Init(TEventCollection *col) { fPlastic->SetName(fOutputColName); col->Add(fOutputColName,fPlastic,fOutputIsTransparent); - printf("[PlaMapProc] CatID : %d\n",fCatID); - printf("[PlaMapProc] output: %s\n",fOutputColName.Data()); + printf("[PlaMapProc] CatID = %d => %s\n",fCatID,fOutputColName.Data()); + + if(!strcmp(fTimeConversionPrmName.Data(),"no_conversion")) { + fDoTimeConversion = kFALSE; + } else { + fTimeConversionPrm = new std::vector; + SetConversionPrm(fTimeConversionPrm,fTimeConversionPrmName,col); + } + + if(!strcmp(fChargeConversionPrmName.Data(),"no_conversion")) { + fDoChargeConversion = kFALSE; + } else { + fChargeConversionPrm = new std::vector; + SetConversionPrm(fChargeConversionPrm,fChargeConversionPrmName,col); + } + + printf("[PlaMapProc] TimeConversionParameter : %s\n",fTimeConversionPrmName.Data()); + printf("[PlaMapProc] ChargeConversionParameter : %s\n",fChargeConversionPrmName.Data()); +} + +void TPlasticMappingProcessor::SetConversionPrm(std::vector *p, + TString &name, TEventCollection *col) { + TEventObject *convPrm = col->Get(name); + TClonesArray **fConversionArray = + reinterpret_cast(convPrm->GetObjectRef()); + + Int_t nDet = (*fConversionArray)->GetEntriesFast(); + p->reserve(nDet); + for(Int_t iDet=0;iDet!=nDet;++iDet) { + p->push_back(static_cast((*fConversionArray)->At(iDet))); + } } void TPlasticMappingProcessor::Process() { @@ -100,6 +139,9 @@ void TPlasticMappingProcessor::MapEdgedTime(TRefArray *tArray) Bool_t isLeading = kFALSE; Int_t nHit = tArray->GetLast() + 1; + Int_t tLeadingRaw, tTrailingRaw, chargeRaw, detID; + Double_t tLeading, tTrailing, charge; + for(Int_t iHit = 0; iHit != nHit; ++iHit) { hit = static_cast(tArray->At(iHit)); @@ -107,6 +149,8 @@ void TPlasticMappingProcessor::MapEdgedTime(TRefArray *tArray) isLeading = (hit->IsLeading() != fTrailingComesFirst); +// TODO: imprement conversion + if(isLeading) { // "Leading" edge data = static_cast(fPlastic->ConstructedAt(fPlastic->GetEntriesFast())); @@ -114,11 +158,30 @@ void TPlasticMappingProcessor::MapEdgedTime(TRefArray *tArray) printf("something strange happened in TPlasticMappingProc::MapEdgedTime\n"); continue; } - data->SetTiming(hit->GetTiming()); - data->SetDetID(hit->GetDetID()); + + tLeadingRaw = hit->GetTiming(); + detID = hit->GetDetID(); + + if(fDoTimeConversion){ + tLeading = fTimeConversionPrm->at(detID-1)->Convert(tLeadingRaw); + } else { + tLeading = tLeadingRaw; + } + + data->SetTiming(tLeading); + data->SetDetID(detID); } else if (data) { // "Trailing" edge after "Leading" one - data->SetCharge(hit->GetTiming() - data->GetTiming()); + tTrailingRaw = hit->GetTiming(); + chargeRaw = tTrailingRaw - tLeadingRaw; + + if(fDoChargeConversion){ + charge = fChargeConversionPrm->at(detID)->Convert(chargeRaw); + } else { + charge = chargeRaw; + } + + data->SetCharge(charge); data = NULL; } else { // consecutive "Trailing" edge @@ -138,18 +201,37 @@ void TPlasticMappingProcessor::MapTimeCharge(TRefArray *tArray, TRefArray *qArra TRawTiming *tHit = NULL; TRawTiming *qHit = NULL; + Int_t detID; + Double_t time, charge; + tHit = static_cast(tArray->At(0)); if (!tHit) { return; } data = static_cast(fPlastic->ConstructedAt(fPlastic->GetEntriesFast())); - data->SetTiming(tHit->GetTiming()); - data->SetDetID(tHit->GetDetID()); + + detID = tHit->GetDetID(); + + if (fDoTimeConversion){ + time = fTimeConversionPrm->at(detID-1)->Convert(tHit->GetTiming()); + } else { + time = tHit->GetTiming(); + } + + data->SetTiming(time); + + data->SetDetID(detID); if(!qArray || qArray->GetLast()) return; qHit = static_cast(qArray->At(0)); - data->SetCharge(qHit->GetTiming()); + if (fDoChargeConversion){ + charge = fChargeConversionPrm->at(detID-1)->Convert(qHit->GetTiming()); + } else { + charge = tHit->GetTiming(); + } + + data->SetCharge(charge); } diff --git a/processors/TPlasticMappingProcessor.h b/processors/TPlasticMappingProcessor.h index 6907436..7e8f7e1 100644 --- a/processors/TPlasticMappingProcessor.h +++ b/processors/TPlasticMappingProcessor.h @@ -3,7 +3,7 @@ * @brief * * @date Created: 2013-08-12 12:36:40 - * Last Modified: 2013-10-10 15:37:18 + * Last Modified: 2013-10-14 10:27:01 * @author KAWASE Shoichiro * * Copyright (C) 2013 KAWASE Shoichiro All rights reserved @@ -17,6 +17,7 @@ namespace art{ class TPlasticMappingProcessor; class TCategorizedData; + class TPolynomialConverter; } class TClonesArray; @@ -45,6 +46,10 @@ protected: Int_t fTimingTypeID; // Typeid for timing (& width when fChargeType is V1190width) Bool_t fTrailingComesFirst; // F: TL->TT (default), T: TT->TL (for QTC etc.) + Bool_t fDoTimeConversion, fDoChargeConversion; + TString fTimeConversionPrmName, fChargeConversionPrmName; + std::vector *fTimeConversionPrm, *fChargeConversionPrm; + private: // Copy constructor (prohibited) TPlasticMappingProcessor(const TPlasticMappingProcessor& rhs); @@ -53,6 +58,7 @@ private: void MapEdgedTime(TRefArray *tArray); void MapTimeCharge(TRefArray *tArray, TRefArray *qArray); + void SetConversionPrm(std::vector *p,TString &name, TEventCollection *col); enum EChargeTypeID { kWIDTH, kQDC, }; diff --git a/processors/TPolynomialConversionParameterGenerator.cc b/processors/TPolynomialConversionParameterGenerator.cc index e064455..876d6d7 100644 --- a/processors/TPolynomialConversionParameterGenerator.cc +++ b/processors/TPolynomialConversionParameterGenerator.cc @@ -3,7 +3,7 @@ * @brief * * @date Created: 2013-10-13 16:20:19 - * Last Modified: 2013-10-13 19:35:48 + * Last Modified: 2013-10-14 11:36:18 * @author KAWASE Shoichiro * * Copyright (C) 2013 KAWASE Shoichiro All rights reserved. @@ -27,7 +27,7 @@ TPolynomialConversionParameterGenerator::TPolynomialConversionParameterGenerator defParameterList.push_back("1"); defParameterList.push_back("2"); - RegisterProcessorParameter("ParameterList","format: [outputcolname,infile,nDet,rank] (number of column must be rank+1)", + RegisterProcessorParameter("ParameterList","format: [outputcolname,infile,nDet,degree] (number of column must be degree+1)", fParameterList,defParameterList); } @@ -37,10 +37,6 @@ TPolynomialConversionParameterGenerator::~TPolynomialConversionParameterGenerato } void TPolynomialConversionParameterGenerator::Init(TEventCollection *col) { - fConversionPrm = new TClonesArray("art::TPolynomialConverter"); - fConversionPrm->SetName(fOutputColName); - fOutputIsTransparent = kTRUE; - col->Add(fOutputColName,fConversionPrm,fOutputIsTransparent); Int_t parSize = fParameterList.size(); if (parSize % 4) { @@ -50,25 +46,31 @@ void TPolynomialConversionParameterGenerator::Init(TEventCollection *col) { parSize /= 4; for(Int_t i = 0;i != parSize ; ++i) { - TString out = fParameterList.at(i*4+0); - TString in = fParameterList.at(i*4+1); - Int_t nDet = fParameterList.at(i*4+2).Atoi(); - Int_t rank = fParameterList.at(i*4+3).Atoi(); + TString out = fParameterList.at(i*4+0); + TString in = fParameterList.at(i*4+1); + Int_t nDet = fParameterList.at(i*4+2).Atoi(); + Int_t degree = fParameterList.at(i*4+3).Atoi(); - if( !nDet || !rank ) { + if( !nDet || !degree ) { printf("[PolyConvParGen] invalid parameter! Please check your yaml file carefully.\n"); return; } - printf("[PolConvParGen] %s -> \"%s\"\n",in.Data(),out.Data()); - printf("[PolConvParGen] nDet: %d, rank: %d\n", nDet,rank); - ReadInputFile(in, nDet, rank); + fConversionPrm = new TClonesArray("art::TPolynomialConverter"); + fConversionPrm->SetName(out); + fOutputIsTransparent = kTRUE; + col->Add(out,fConversionPrm,fOutputIsTransparent); + + printf("[PolConvParGen] %s => %s\n", + in.Data(),out.Data()); + printf("[PolConvParGen] nDet = %d, degree = %d\n", nDet, degree); + ReadInputFile(in, nDet, degree); } } void TPolynomialConversionParameterGenerator::ReadInputFile(TString &file, Int_t nDet, - Int_t rank) { + Int_t degree) { ifstream fin; fin.open(file.Data()); @@ -79,21 +81,23 @@ void TPolynomialConversionParameterGenerator::ReadInputFile(TString &file, { std::vector tempVec; - tempVec.reserve(rank+1); + tempVec.reserve(degree+1); Double_t temp; for(Int_t iDet=0; iDet!=nDet;++iDet){ - printf("[PolConvParGen] iDet = %d -> ( ",iDet); +// printf("[PolConvParGen] iDet = %d -> ( ",iDet); TPolynomialConverter *conv = static_cast(fConversionPrm->ConstructedAt(iDet)); - for(Int_t i=0;i != rank+1;++i){ + tempVec.clear(); + + for(Int_t i=0;i != degree+1;++i){ fin >> temp; - printf("%f ",temp); +// printf("%f ",temp); tempVec.push_back(temp); } - printf(")\n"); +// printf(")\n"); conv->Set(tempVec); if(fin.eof()) { diff --git a/processors/TPolynomialConversionParameterGenerator.h b/processors/TPolynomialConversionParameterGenerator.h index d657225..72c5832 100644 --- a/processors/TPolynomialConversionParameterGenerator.h +++ b/processors/TPolynomialConversionParameterGenerator.h @@ -3,7 +3,7 @@ * @brief * * @date Created: 2013-10-13 16:19:47 - * Last Modified: 2013-10-13 17:19:40 + * Last Modified: 2013-10-14 11:13:23 * @author KAWASE Shoichiro * * Copyright (C) 2013 KAWASE Shoichiro All rights reserved @@ -35,7 +35,7 @@ private: StringVec_t fParameterList; TString fOutputColName; - void ReadInputFile(TString &file, Int_t nDet, Int_t rank); + void ReadInputFile(TString &file, Int_t nDet, Int_t degree); // Copy constructor (prohibited) TPolynomialConversionParameterGenerator(const TPolynomialConversionParameterGenerator& rhs); diff --git a/processors/TPolynomialConverter.cc b/processors/TPolynomialConverter.cc index 9def415..0a0e55c 100644 --- a/processors/TPolynomialConverter.cc +++ b/processors/TPolynomialConverter.cc @@ -3,7 +3,7 @@ * @brief * * @date Created: 2013-10-13 15:33:46 - * Last Modified: 2013-10-13 16:11:53 + * Last Modified: 2013-10-14 11:13:07 * @author KAWASE Shoichiro * * Copyright (C) 2013 KAWASE Shoichiro All rights reserved. @@ -29,10 +29,10 @@ TPolynomialConverter::~TPolynomialConverter() { } void TPolynomialConverter::Set(const std::vector &val){ - fRank = val.size(); + fDegree = val.size() - 1; if (fCoefficient) { fCoefficient->clear(); - fCoefficient->resize(fRank); + fCoefficient->resize(fDegree + 1); std::copy(val.begin(),val.end(),fCoefficient->begin());// failed to use back_insterter(). why? } else { fCoefficient = new std::vector(val); @@ -42,9 +42,8 @@ void TPolynomialConverter::Set(const std::vector &val){ Double_t TPolynomialConverter::Convert(const Double_t val) const{ Double_t sum = fCoefficient->at(0); - for(Int_t i = 1; i!=fRank+1; ++i){ + for(Int_t i = 1; i!=fDegree+1; ++i){ sum += fCoefficient->at(i) * TMath::Power(val,i); } - return sum; } diff --git a/processors/TPolynomialConverter.h b/processors/TPolynomialConverter.h index a78fb63..41e37fb 100644 --- a/processors/TPolynomialConverter.h +++ b/processors/TPolynomialConverter.h @@ -3,7 +3,7 @@ * @brief * * @date Created: 2013-10-13 15:26:58 - * Last Modified: 2013-10-13 16:01:53 + * Last Modified: 2013-10-14 11:12:24 * @author KAWASE Shoichiro * * Copyright (C) 2013 KAWASE Shoichiro All rights reserved @@ -30,7 +30,7 @@ public: virtual Double_t Convert(const Double_t val) const; private: - Int_t fRank; + Int_t fDegree; std::vector *fCoefficient; //-> ClassDef(TPolynomialConverter,1) diff --git a/processors/TTimingChargeData.cc b/processors/TTimingChargeData.cc index 683cf2a..b0d9f25 100644 --- a/processors/TTimingChargeData.cc +++ b/processors/TTimingChargeData.cc @@ -3,7 +3,7 @@ * @brief * * @date Created: 2013-08-14 10:34:09 - * Last Modified: 2013-10-10 14:28:06 + * Last Modified: 2013-10-14 09:55:03 * @author KAWASE Shoichiro * * Copyright (C) 2013 KAWASE Shoichiro All rights reserved. diff --git a/processors/TTimingChargeData.h b/processors/TTimingChargeData.h index 1db8441..d52c653 100644 --- a/processors/TTimingChargeData.h +++ b/processors/TTimingChargeData.h @@ -3,7 +3,7 @@ * @brief * * @date Created: 2013-08-14 10:19:28 - * Last Modified: 2013-10-10 14:28:46 + * Last Modified: 2013-10-14 09:56:26 * @author KAWASE Shoichiro * * Copyright (C) 2013 KAWASE Shoichiro All rights reserved diff --git a/processors/TTwoSidedPlasticCalibrationProcessor.cc b/processors/TTwoSidedPlasticCalibrationProcessor.cc index f332bda..5718735 100644 --- a/processors/TTwoSidedPlasticCalibrationProcessor.cc +++ b/processors/TTwoSidedPlasticCalibrationProcessor.cc @@ -3,7 +3,7 @@ * @brief * * @date Created: 2013-10-10 15:58:58 - * Last Modified: 2013-10-13 18:16:04 + * Last Modified: 2013-10-14 11:37:16 * @author KAWASE Shoichiro * * Copyright (C) 2013 KAWASE Shoichiro All rights reserved. @@ -12,12 +12,14 @@ #include "TTwoSidedPlasticCalibrationProcessor.h" #include "TTimingChargeData.h" #include "TTwoSidedPlasticData.h" +#include "TPolynomialConverter.h" #include using art::TTwoSidedPlasticCalibrationProcessor; using art::TTimingChargeData; using art::TTwoSidedPlasticData; +using art::TPolynomialConverter; using std::vector; // Default constructor @@ -51,7 +53,7 @@ void TTwoSidedPlasticCalibrationProcessor::Init(TEventCollection *col) { printf("[2SidedPlaCalProc] branch \"%s\" not found!\n",fInputColName[0].Data()); return; } else { - printf("[2SidedPlaCalProc] input1: %s\n",fInputColName[0].Data()); + } TEventObject *in2 = col->Get(fInputColName[1]); @@ -60,14 +62,16 @@ void TTwoSidedPlasticCalibrationProcessor::Init(TEventCollection *col) { printf("[2SidedPlaCalProc] branch \"%s\" not found!\n",fInputColName[1].Data()); return; } else { - printf("[2SidedPlaCalProc] input2: %s\n",fInputColName[1].Data()); + } fPlasticOut = new TClonesArray("art::TTwoSidedPlasticData"); fPlasticOut->SetName(fOutputColName); col->Add(fOutputColName,fPlasticOut,fOutputIsTransparent); - printf("[2SidedPlaCalProc] output %s\n",fOutputColName.Data()); + + printf("[2SidedPlaCalProc] (%s, %s) => %s\n", + fInputColName[0].Data(),fInputColName[1].Data(),fOutputColName.Data()); fNDet = fDetIDRange[1] - fDetIDRange[0] + 1; if (fNDet>0) { diff --git a/processors/TTwoSidedPlasticCalibrationProcessor.h b/processors/TTwoSidedPlasticCalibrationProcessor.h index e2b2c96..c274a27 100644 --- a/processors/TTwoSidedPlasticCalibrationProcessor.h +++ b/processors/TTwoSidedPlasticCalibrationProcessor.h @@ -3,7 +3,7 @@ * @brief * * @date Created: 2013-10-10 15:34:10 - * Last Modified: 2013-10-13 14:57:07 + * Last Modified: 2013-10-13 23:52:57 * @author KAWASE Shoichiro * * Copyright (C) 2013 KAWASE Shoichiro All rights reserved -- GitLab