Skip to content

Commit ea9a497

Browse files
committed
ITSMFT&ITS3: load response functions from ccdb
Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent 6db969d commit ea9a497

File tree

11 files changed

+77
-152
lines changed

11 files changed

+77
-152
lines changed

Detectors/ITSMFT/common/data/AlpideResponseData/CMakeLists.txt

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,8 @@
99
# granted to it by virtue of its status as an Intergovernmental Organization
1010
# or submit itself to any jurisdiction.
1111

12-
1312
o2_add_executable(alpide-response-generator
1413
SOURCES AlpideResponse.cxx
1514
PUBLIC_LINK_LIBRARIES O2::ITSMFTSimulation
1615
ROOT::Core
1716
TARGETVARNAME targetName)
18-
19-
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/Detectors/ITSMFT/common/data/AlpideResponseData/AlpideResponse.cxx)
20-
21-
if(ITSRESPONSE)
22-
message(STATUS "ITSRESPONSE option provided, setting ITSRESPONSE_DIR from it: " ${ITSRESPONSE})
23-
set(ITSRESPONSE_DIR ${ITSRESPONSE} CACHE PATH "ITSResponse directory")
24-
else()
25-
message(STATUS "ITSRESPONSE option not provided, setting ITSRESPONSE_DIR from environment ITSRESPONSE_ROOT: " $ENV{ITSRESPONSE_ROOT})
26-
set(ITSRESPONSE_DIR $ENV{ITSRESPONSE_ROOT} CACHE PATH "ITSResponse directory")
27-
endif()
28-
29-
add_custom_command(TARGET O2exe-alpide-response-generator POST_BUILD
30-
COMMAND ${CMAKE_BINARY_DIR}/stage/bin/o2-alpide-response-generator -i ${ITSRESPONSE_DIR}/response/AlpideResponseData/ -o ${CMAKE_CURRENT_BINARY_DIR}/
31-
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/AlpideResponseData.root
32-
COMMENT "Generating AlpideResponseData.root"
33-
)
34-
35-
# # Add a target that depends on the custom command output
36-
add_custom_target(
37-
GenerateAlpideResponse ALL
38-
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/AlpideResponseData.root
39-
)
40-
41-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/AlpideResponseData.root" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/Detectors/ITSMFT/data/AlpideResponseData/")

Detectors/ITSMFT/common/simulation/include/ITSMFTSimulation/Digitizer.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#include <deque>
1919
#include <memory>
2020

21-
#include "Rtypes.h" // for Digitizer::Class
21+
#include "Rtypes.h" // for Digitizer::Class
2222
#include "TObject.h" // for TObject
2323

2424
#include "ITSMFTSimulation/ChipDigitsContainer.h"
@@ -62,6 +62,7 @@ class Digitizer : public TObject
6262
void setDeadChannelsMap(const o2::itsmft::NoiseMap* mp) { mDeadChanMap = mp; }
6363

6464
void init();
65+
void setAlpideResponse(const o2::itsmft::AlpideSimResponse* resp, int i) { mAlpSimResp[i] = resp; }
6566

6667
auto getChipResponse(int chipID);
6768

@@ -124,11 +125,10 @@ class Digitizer : public TObject
124125
uint32_t mEventROFrameMax = 0; ///< highest RO frame forfor processed events (w/o automatic noise ROFs)
125126

126127
int mNumberOfChips = 0;
127-
o2::itsmft::AlpideSimResponse* mAlpSimRespMFT = nullptr;
128-
o2::itsmft::AlpideSimResponse* mAlpSimRespIB = nullptr;
129-
o2::itsmft::AlpideSimResponse* mAlpSimRespOB = nullptr;
130-
o2::itsmft::AlpideSimResponse mAlpSimResp[2]; // simulated response
131-
std::string mResponseFile = "$(O2_ROOT)/share/Detectors/ITSMFT/data/AlpideResponseData/AlpideResponseData.root";
128+
const o2::itsmft::AlpideSimResponse* mAlpSimRespMFT = nullptr;
129+
const o2::itsmft::AlpideSimResponse* mAlpSimRespIB = nullptr;
130+
const o2::itsmft::AlpideSimResponse* mAlpSimRespOB = nullptr;
131+
const o2::itsmft::AlpideSimResponse* mAlpSimResp[2]; // simulated response
132132
const o2::itsmft::GeometryTGeo* mGeometry = nullptr; ///< ITS OR MFT upgrade geometry
133133

134134
std::vector<o2::itsmft::ChipDigitsContainer> mChips; ///< Array of chips digits containers

Detectors/ITSMFT/common/simulation/src/Digitizer.cxx

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,54 +48,36 @@ void Digitizer::init()
4848
mChips[i].setDeadChanMap(mDeadChanMap);
4949
}
5050
}
51-
// initializing for both collection tables
52-
/*for (int i = 0; i < 2; i++) {
53-
mAlpSimResp[i].initData(i);
54-
}*/
55-
56-
// importing the charge collection tables
57-
// (initialized while building O2)
58-
auto file = TFile::Open(mResponseFile.data());
59-
if (!file) {
60-
LOG(fatal) << "Cannot open response file " << mResponseFile;
61-
}
62-
/*std::string response = "response";
63-
for (int i=0; i<2; i++) {
64-
response.append(std::to_string(i));
65-
mAlpSimResp[i] = *(o2::itsmft::AlpideSimResponse*)file->Get(response.data());
66-
}*/
67-
mAlpSimResp[0] = *(o2::itsmft::AlpideSimResponse*)file->Get("response0");
68-
mAlpSimResp[1] = *(o2::itsmft::AlpideSimResponse*)file->Get("response1");
6951

7052
// importing the parameters from DPLDigitizerParam.h
7153
auto& doptMFT = DPLDigitizerParam<o2::detectors::DetID::MFT>::Instance();
7254
auto& doptITS = DPLDigitizerParam<o2::detectors::DetID::ITS>::Instance();
7355

7456
// initializing response according to detector and back-bias value
7557
if (doptMFT.Vbb == 0.0) { // for MFT
76-
mAlpSimRespMFT = mAlpSimResp;
58+
mAlpSimRespMFT = mAlpSimResp[0];
7759
LOG(info) << "Choosing Vbb=0V for MFT";
7860
} else if (doptMFT.Vbb == 3.0) {
79-
mAlpSimRespMFT = mAlpSimResp + 1;
61+
mAlpSimRespMFT = mAlpSimResp[1];
8062
LOG(info) << "Choosing Vbb=-3V for MFT";
8163
} else {
8264
LOG(fatal) << "Invalid MFT back-bias value";
8365
}
8466

8567
if (doptITS.IBVbb == 0.0) { // for ITS Inner Barrel
86-
mAlpSimRespIB = mAlpSimResp;
68+
mAlpSimRespIB = mAlpSimResp[0];
8769
LOG(info) << "Choosing Vbb=0V for ITS IB";
8870
} else if (doptITS.IBVbb == 3.0) {
89-
mAlpSimRespIB = mAlpSimResp + 1;
71+
mAlpSimRespIB = mAlpSimResp[1];
9072
LOG(info) << "Choosing Vbb=-3V for ITS IB";
9173
} else {
9274
LOG(fatal) << "Invalid ITS Inner Barrel back-bias value";
9375
}
9476
if (doptITS.OBVbb == 0.0) { // for ITS Outter Barrel
95-
mAlpSimRespOB = mAlpSimResp;
77+
mAlpSimRespOB = mAlpSimResp[0];
9678
LOG(info) << "Choosing Vbb=0V for ITS OB";
9779
} else if (doptITS.OBVbb == 3.0) {
98-
mAlpSimRespOB = mAlpSimResp + 1;
80+
mAlpSimRespOB = mAlpSimResp[1];
9981
LOG(info) << "Choosing Vbb=-3V for ITS OB";
10082
} else {
10183
LOG(fatal) << "Invalid ITS Outter Barrel back-bias value";

Detectors/Upgrades/ITS3/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#add_compile_options(-O0 -g -fPIC -fsanitize=address)
1313
#add_link_options(-fsanitize=address)
1414

15-
add_subdirectory(data)
1615
add_subdirectory(simulation)
1716
add_subdirectory(alignment)
1817
add_subdirectory(base)

Detectors/Upgrades/ITS3/data/CMakeLists.txt

Lines changed: 0 additions & 34 deletions
This file was deleted.

Detectors/Upgrades/ITS3/simulation/include/ITS3Simulation/DigiParams.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,17 @@ class DigiParams final : public o2::itsmft::DigiParams
4848
const o2::itsmft::AlpideSimResponse* getOBSimResponse() const { return mOBSimResponse; }
4949
void setOBSimResponse(const o2::itsmft::AlpideSimResponse* response) { mOBSimResponse = response; }
5050

51-
o2::its3::ChipSimResponse* getIBSimResponse() const { return mIBSimResponse; }
52-
void setIBSimResponse(o2::its3::ChipSimResponse* response);
51+
o2::its3::ChipSimResponse* getIBSimResponse() const { return mIBSimResponse.get(); }
52+
void setIBSimResponse(const o2::itsmft::AlpideSimResponse* resp);
5353

5454
bool hasResponseFunctions() const { return mIBSimResponse != nullptr && mOBSimResponse != nullptr; }
5555

5656
void print() const final;
5757

5858
private:
59-
const o2::itsmft::AlpideSimResponse* mOBSimResponse = nullptr; //!< pointer to external response
60-
o2::its3::ChipSimResponse* mIBSimResponse = nullptr; //!< pointer to external response
59+
const o2::itsmft::AlpideSimResponse* mOBSimResponse = nullptr; //!< pointer to external response
60+
const o2::itsmft::AlpideSimResponse* mIBSimResponseExt = nullptr; //!< pointer to external response
61+
std::unique_ptr<o2::its3::ChipSimResponse> mIBSimResponse = nullptr; //!< pointer to external response
6162

6263
ClassDef(DigiParams, 1);
6364
};

Detectors/Upgrades/ITS3/simulation/include/ITS3Simulation/Digitizer.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class Digitizer : public TObject
4242
using ExtraDig = std::vector<itsmft::PreDigitLabelRef>; ///< container for extra contributions to PreDigits
4343

4444
public:
45-
~Digitizer();
45+
~Digitizer() = default;
4646

4747
void setDigits(std::vector<o2::itsmft::Digit>* dig) { mDigits = dig; }
4848
void setMCLabels(o2::dataformats::MCTruthContainer<o2::MCCompLabel>* mclb) { mMCLabels = mclb; }
@@ -111,18 +111,18 @@ class Digitizer : public TObject
111111

112112
static constexpr std::array<o2::its3::SegmentationMosaix, 3> mIBSegmentations{0, 1, 2};
113113

114-
o2::its3::ChipSimResponse* mSimRespIB = nullptr; // simulated response for IB
115-
o2::itsmft::AlpideSimResponse* mSimRespOB = nullptr; // simulated response for OB
116-
bool mSimRespIBOrientation{false}; // wether the orientation in the IB response function is flipped
117-
float mSimRespIBShift{0.f}; // adjusting the Y-shift in the IB response function to match sensor local coord.
118-
float mSimRespIBScaleX{1.f}; // scale x-local coordinate to response function x-coordinate
119-
float mSimRespIBScaleZ{1.f}; // scale z-local coordinate to response function z-coordinate
120-
float mSimRespOBShift{0.f}; // adjusting the Y-shift in the OB response function to match sensor local coord.
114+
const o2::its3::ChipSimResponse* mSimRespIB = nullptr; // simulated response for IB
115+
const o2::itsmft::AlpideSimResponse* mSimRespOB = nullptr; // simulated response for OB
116+
bool mSimRespIBOrientation{false}; // wether the orientation in the IB response function is flipped
117+
float mSimRespIBShift{0.f}; // adjusting the Y-shift in the IB response function to match sensor local coord.
118+
float mSimRespIBScaleX{1.f}; // scale x-local coordinate to response function x-coordinate
119+
float mSimRespIBScaleZ{1.f}; // scale z-local coordinate to response function z-coordinate
120+
float mSimRespOBShift{0.f}; // adjusting the Y-shift in the OB response function to match sensor local coord.
121121

122122
const o2::its::GeometryTGeo* mGeometry = nullptr; ///< ITS3 geometry
123123

124-
std::vector<o2::its3::ChipDigitsContainer> mChips; ///< Array of chips digits containers
125-
std::deque<std::unique_ptr<ExtraDig>> mExtraBuff; ///< burrer (per roFrame) for extra digits
124+
std::vector<o2::its3::ChipDigitsContainer> mChips; ///< Array of chips digits containers
125+
std::deque<std::unique_ptr<ExtraDig>> mExtraBuff; ///< burrer (per roFrame) for extra digits
126126

127127
std::vector<o2::itsmft::Digit>* mDigits = nullptr; //! output digits
128128
std::vector<o2::itsmft::ROFRecord>* mROFRecords = nullptr; //! output ROF records

Detectors/Upgrades/ITS3/simulation/src/DigiParams.cxx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,14 @@ void DigiParams::print() const
6969
getSignalShape().print();
7070
}
7171

72-
void DigiParams::setIBSimResponse(o2::its3::ChipSimResponse* response)
72+
void DigiParams::setIBSimResponse(const o2::itsmft::AlpideSimResponse* resp)
7373
{
74-
mIBSimResponse = response;
75-
if (mIBSimResponse) {
76-
mIBSimResponse->computeCentreFromData();
74+
if (!resp) {
75+
LOGP(fatal, "cannot set response from nullptr");
7776
}
77+
mIBSimResponseExt = resp;
78+
mIBSimResponse = std::make_unique<o2::its3::ChipSimResponse>(mIBSimResponseExt);
79+
mIBSimResponse->computeCentreFromData();
7880
}
7981

8082
} // namespace o2::its3

Detectors/Upgrades/ITS3/simulation/src/Digitizer.cxx

Lines changed: 15 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,6 @@ using o2::itsmft::PreDigit;
3535

3636
using namespace o2::its3;
3737

38-
Digitizer::~Digitizer()
39-
{
40-
delete mSimRespIB;
41-
}
42-
4338
void Digitizer::init()
4439
{
4540
const int numOfChips = mGeometry->getNumberOfChips();
@@ -53,46 +48,22 @@ void Digitizer::init()
5348
}
5449

5550
if (!mParams.hasResponseFunctions()) {
56-
auto loadSetResponseFunc = [&](const char* fileIB, const char* nameIB, const char* fileOB, const char* nameOB) {
57-
LOGP(info, "Loading response function IB={}:{} ; OB={}:{}", nameIB, fileIB, nameOB, fileOB);
58-
auto fIB = TFile::Open(fileIB, "READ");
59-
if (!fIB || fIB->IsZombie() || !fIB->IsOpen()) {
60-
LOGP(fatal, "Cannot open file {}", fileIB);
61-
}
62-
auto fOB = TFile::Open(fileOB, "READ");
63-
if (!fOB || fOB->IsZombie() || !fOB->IsOpen()) {
64-
LOGP(fatal, "Cannot open file {}", fileOB);
65-
}
66-
if ((mSimRespIB = new o2::its3::ChipSimResponse(fIB->Get<o2::itsmft::AlpideSimResponse>(nameIB))) == nullptr) {
67-
LOGP(fatal, "Cannot create response function for IB");
68-
}
69-
if ((mSimRespOB = fOB->Get<o2::itsmft::AlpideSimResponse>(nameOB)) == nullptr) {
70-
LOGP(fatal, "Cannot create response function for OB");
71-
}
72-
mParams.setIBSimResponse(mSimRespIB);
73-
mParams.setOBSimResponse(mSimRespOB);
74-
fIB->Close();
75-
fOB->Close();
76-
};
77-
78-
if (const auto& func = ITS3Params::Instance().chipResponseFunction; func == "Alpide") {
79-
constexpr const char* responseFile = "$(O2_ROOT)/share/Detectors/ITSMFT/data/AlpideResponseData/AlpideResponseData.root";
80-
loadSetResponseFunc(responseFile, "response0", responseFile, "response0");
81-
mSimRespIBScaleX = o2::itsmft::SegmentationAlpide::PitchRow / SegmentationIB::PitchRow;
82-
mSimRespIBScaleZ = o2::itsmft::SegmentationAlpide::PitchCol / SegmentationIB::PitchCol;
83-
} else if (func == "APTS") {
84-
constexpr const char* responseFileIB = "$(O2_ROOT)/share/Detectors/Upgrades/ITS3/data/ITS3ChipResponseData/APTSResponseData.root";
85-
constexpr const char* responseFileOB = "$(O2_ROOT)/share/Detectors/ITSMFT/data/AlpideResponseData/AlpideResponseData.root";
86-
loadSetResponseFunc(responseFileIB, "response1", responseFileOB, "response0");
87-
mSimRespIBScaleX = constants::pixelarray::pixels::apts::pitchX / SegmentationIB::PitchRow;
88-
mSimRespIBScaleZ = constants::pixelarray::pixels::apts::pitchZ / SegmentationIB::PitchCol;
89-
mSimRespIBOrientation = true;
90-
} else {
91-
LOGP(fatal, "ResponseFunction '{}' not implemented!", func);
92-
}
93-
mSimRespIBShift = mSimRespIB->getDepthMax() - constants::silicon::thickness / 2.f;
94-
mSimRespOBShift = mSimRespOB->getDepthMax() - SegmentationOB::SensorLayerThickness / 2.f;
51+
LOGP(fatal, "No response functions set!");
52+
}
53+
if (const auto& func = ITS3Params::Instance().chipResponseFunction; func == "Alpide") {
54+
mSimRespIBScaleX = o2::itsmft::SegmentationAlpide::PitchRow / SegmentationIB::PitchRow;
55+
mSimRespIBScaleZ = o2::itsmft::SegmentationAlpide::PitchCol / SegmentationIB::PitchCol;
56+
} else if (func == "APTS") {
57+
mSimRespIBScaleX = constants::pixelarray::pixels::apts::pitchX / SegmentationIB::PitchRow;
58+
mSimRespIBScaleZ = constants::pixelarray::pixels::apts::pitchZ / SegmentationIB::PitchCol;
59+
mSimRespIBOrientation = true;
60+
} else {
61+
LOGP(fatal, "ResponseFunction '{}' not implemented!", func);
9562
}
63+
mSimRespIB = mParams.getIBSimResponse();
64+
mSimRespOB = mParams.getOBSimResponse();
65+
mSimRespIBShift = mSimRespIB->getDepthMax() - constants::silicon::thickness / 2.f;
66+
mSimRespOBShift = mSimRespOB->getDepthMax() - SegmentationOB::SensorLayerThickness / 2.f;
9667

9768
mParams.print();
9869
LOGP(info, "IB shift = {} ; OB shift = {}", mSimRespIBShift, mSimRespOBShift);

Steer/DigitizerWorkflow/src/ITS3DigitizerSpec.cxx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,11 @@ class ITS3DPLDigitizerTask : BaseDPLDigitizer
254254
pc.inputs().get<o2::itsmft::NoiseMap*>("IT3_dead"); // trigger final ccdb update
255255
}
256256

257+
pc.inputs().get<o2::itsmft::AlpideSimResponse*>("IT3_alpiderespvbb0");
258+
if (o2::its3::ITS3Params::Instance().chipResponseFunction != "Alpide") {
259+
pc.inputs().get<o2::itsmft::AlpideSimResponse*>("IT3_aptsresp");
260+
}
261+
257262
// init digitizer
258263
mDigitizer.init();
259264
}
@@ -273,6 +278,14 @@ class ITS3DPLDigitizerTask : BaseDPLDigitizer
273278
mDigitizer.setDeadChannelsMap((o2::itsmft::NoiseMap*)obj);
274279
return;
275280
}
281+
if (matcher == ConcreteDataMatcher(mOrigin, "ALPIDERESPVbb0", 0)) {
282+
LOG(info) << mID.getName() << " loaded AlpideResponseData for Vbb=0V";
283+
mDigitizer.getParams().setOBSimResponse((o2::itsmft::AlpideSimResponse*)obj);
284+
}
285+
if (matcher == ConcreteDataMatcher(mOrigin, "APTSRESP", 0)) {
286+
LOG(info) << mID.getName() << " loaded APTSResponseData";
287+
mDigitizer.getParams().setIBSimResponse((o2::itsmft::AlpideSimResponse*)obj);
288+
}
276289
}
277290

278291
private:
@@ -306,6 +319,8 @@ DataProcessorSpec getITS3DigitizerSpec(int channel, bool mctruth)
306319
if (o2::its3::ITS3Params::Instance().useDeadChannelMap) {
307320
inputs.emplace_back("IT3_dead", "IT3", "DEADMAP", 0, Lifetime::Condition, ccdbParamSpec("IT3/Calib/DeadMap"));
308321
}
322+
inputs.emplace_back("IT3_alpiderespvbb0", "IT3", "ALPIDERESPVbb0", 0, Lifetime::Condition, ccdbParamSpec("ITSMFT/Calib/ALPIDEResponseVbb0"));
323+
inputs.emplace_back("IT3_aptsresp", "IT3", "APTSRESP", 0, Lifetime::Condition, ccdbParamSpec("IT3/Calib/APTSResponse"));
309324

310325
return DataProcessorSpec{detStr + "Digitizer",
311326
inputs, makeOutChannels(detOrig, mctruth),

0 commit comments

Comments
 (0)