Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 0 additions & 25 deletions Detectors/ITSMFT/common/data/AlpideResponseData/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,33 +9,8 @@
# granted to it by virtue of its status as an Intergovernmental Organization
# or submit itself to any jurisdiction.


o2_add_executable(alpide-response-generator
SOURCES AlpideResponse.cxx
PUBLIC_LINK_LIBRARIES O2::ITSMFTSimulation
ROOT::Core
TARGETVARNAME targetName)

set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/Detectors/ITSMFT/common/data/AlpideResponseData/AlpideResponse.cxx)

if(ITSRESPONSE)
message(STATUS "ITSRESPONSE option provided, setting ITSRESPONSE_DIR from it: " ${ITSRESPONSE})
set(ITSRESPONSE_DIR ${ITSRESPONSE} CACHE PATH "ITSResponse directory")
else()
message(STATUS "ITSRESPONSE option not provided, setting ITSRESPONSE_DIR from environment ITSRESPONSE_ROOT: " $ENV{ITSRESPONSE_ROOT})
set(ITSRESPONSE_DIR $ENV{ITSRESPONSE_ROOT} CACHE PATH "ITSResponse directory")
endif()

add_custom_command(TARGET O2exe-alpide-response-generator POST_BUILD
COMMAND ${CMAKE_BINARY_DIR}/stage/bin/o2-alpide-response-generator -i ${ITSRESPONSE_DIR}/response/AlpideResponseData/ -o ${CMAKE_CURRENT_BINARY_DIR}/
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/AlpideResponseData.root
COMMENT "Generating AlpideResponseData.root"
)

# # Add a target that depends on the custom command output
add_custom_target(
GenerateAlpideResponse ALL
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/AlpideResponseData.root
)

install(FILES "${CMAKE_CURRENT_BINARY_DIR}/AlpideResponseData.root" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/Detectors/ITSMFT/data/AlpideResponseData/")
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class Digitizer : public TObject
void setDeadChannelsMap(const o2::itsmft::NoiseMap* mp) { mDeadChanMap = mp; }

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

auto getChipResponse(int chipID);

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

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

std::vector<o2::itsmft::ChipDigitsContainer> mChips; ///< Array of chips digits containers
Expand Down
30 changes: 6 additions & 24 deletions Detectors/ITSMFT/common/simulation/src/Digitizer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -48,54 +48,36 @@ void Digitizer::init()
mChips[i].setDeadChanMap(mDeadChanMap);
}
}
// initializing for both collection tables
/*for (int i = 0; i < 2; i++) {
mAlpSimResp[i].initData(i);
}*/

// importing the charge collection tables
// (initialized while building O2)
auto file = TFile::Open(mResponseFile.data());
if (!file) {
LOG(fatal) << "Cannot open response file " << mResponseFile;
}
/*std::string response = "response";
for (int i=0; i<2; i++) {
response.append(std::to_string(i));
mAlpSimResp[i] = *(o2::itsmft::AlpideSimResponse*)file->Get(response.data());
}*/
mAlpSimResp[0] = *(o2::itsmft::AlpideSimResponse*)file->Get("response0");
mAlpSimResp[1] = *(o2::itsmft::AlpideSimResponse*)file->Get("response1");

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

// initializing response according to detector and back-bias value
if (doptMFT.Vbb == 0.0) { // for MFT
mAlpSimRespMFT = mAlpSimResp;
mAlpSimRespMFT = mAlpSimResp[0];
LOG(info) << "Choosing Vbb=0V for MFT";
} else if (doptMFT.Vbb == 3.0) {
mAlpSimRespMFT = mAlpSimResp + 1;
mAlpSimRespMFT = mAlpSimResp[1];
LOG(info) << "Choosing Vbb=-3V for MFT";
} else {
LOG(fatal) << "Invalid MFT back-bias value";
}

if (doptITS.IBVbb == 0.0) { // for ITS Inner Barrel
mAlpSimRespIB = mAlpSimResp;
mAlpSimRespIB = mAlpSimResp[0];
LOG(info) << "Choosing Vbb=0V for ITS IB";
} else if (doptITS.IBVbb == 3.0) {
mAlpSimRespIB = mAlpSimResp + 1;
mAlpSimRespIB = mAlpSimResp[1];
LOG(info) << "Choosing Vbb=-3V for ITS IB";
} else {
LOG(fatal) << "Invalid ITS Inner Barrel back-bias value";
}
if (doptITS.OBVbb == 0.0) { // for ITS Outter Barrel
mAlpSimRespOB = mAlpSimResp;
mAlpSimRespOB = mAlpSimResp[0];
LOG(info) << "Choosing Vbb=0V for ITS OB";
} else if (doptITS.OBVbb == 3.0) {
mAlpSimRespOB = mAlpSimResp + 1;
mAlpSimRespOB = mAlpSimResp[1];
LOG(info) << "Choosing Vbb=-3V for ITS OB";
} else {
LOG(fatal) << "Invalid ITS Outter Barrel back-bias value";
Expand Down
1 change: 0 additions & 1 deletion Detectors/Upgrades/ITS3/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#add_compile_options(-O0 -g -fPIC -fsanitize=address)
#add_link_options(-fsanitize=address)

add_subdirectory(data)
add_subdirectory(simulation)
add_subdirectory(alignment)
add_subdirectory(base)
Expand Down
34 changes: 0 additions & 34 deletions Detectors/Upgrades/ITS3/data/CMakeLists.txt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,17 @@ class DigiParams final : public o2::itsmft::DigiParams
const o2::itsmft::AlpideSimResponse* getOBSimResponse() const { return mOBSimResponse; }
void setOBSimResponse(const o2::itsmft::AlpideSimResponse* response) { mOBSimResponse = response; }

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

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

void print() const final;

private:
const o2::itsmft::AlpideSimResponse* mOBSimResponse = nullptr; //!< pointer to external response
o2::its3::ChipSimResponse* mIBSimResponse = nullptr; //!< pointer to external response
const o2::itsmft::AlpideSimResponse* mOBSimResponse = nullptr; //!< pointer to external response
const o2::itsmft::AlpideSimResponse* mIBSimResponseExt = nullptr; //!< pointer to external response
std::unique_ptr<o2::its3::ChipSimResponse> mIBSimResponse = nullptr; //!< pointer to external response

ClassDef(DigiParams, 1);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class Digitizer : public TObject
using ExtraDig = std::vector<itsmft::PreDigitLabelRef>; ///< container for extra contributions to PreDigits

public:
~Digitizer();
~Digitizer() = default;

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

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

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

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

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

std::vector<o2::itsmft::Digit>* mDigits = nullptr; //! output digits
std::vector<o2::itsmft::ROFRecord>* mROFRecords = nullptr; //! output ROF records
Expand Down
10 changes: 6 additions & 4 deletions Detectors/Upgrades/ITS3/simulation/src/DigiParams.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,14 @@ void DigiParams::print() const
getSignalShape().print();
}

void DigiParams::setIBSimResponse(o2::its3::ChipSimResponse* response)
void DigiParams::setIBSimResponse(const o2::itsmft::AlpideSimResponse* resp)
{
mIBSimResponse = response;
if (mIBSimResponse) {
mIBSimResponse->computeCentreFromData();
if (!resp) {
LOGP(fatal, "cannot set response from nullptr");
}
mIBSimResponseExt = resp;
mIBSimResponse = std::make_unique<o2::its3::ChipSimResponse>(mIBSimResponseExt);
mIBSimResponse->computeCentreFromData();
}

} // namespace o2::its3
59 changes: 15 additions & 44 deletions Detectors/Upgrades/ITS3/simulation/src/Digitizer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ using o2::itsmft::PreDigit;

using namespace o2::its3;

Digitizer::~Digitizer()
{
delete mSimRespIB;
}

void Digitizer::init()
{
const int numOfChips = mGeometry->getNumberOfChips();
Expand All @@ -53,46 +48,22 @@ void Digitizer::init()
}

if (!mParams.hasResponseFunctions()) {
auto loadSetResponseFunc = [&](const char* fileIB, const char* nameIB, const char* fileOB, const char* nameOB) {
LOGP(info, "Loading response function IB={}:{} ; OB={}:{}", nameIB, fileIB, nameOB, fileOB);
auto fIB = TFile::Open(fileIB, "READ");
if (!fIB || fIB->IsZombie() || !fIB->IsOpen()) {
LOGP(fatal, "Cannot open file {}", fileIB);
}
auto fOB = TFile::Open(fileOB, "READ");
if (!fOB || fOB->IsZombie() || !fOB->IsOpen()) {
LOGP(fatal, "Cannot open file {}", fileOB);
}
if ((mSimRespIB = new o2::its3::ChipSimResponse(fIB->Get<o2::itsmft::AlpideSimResponse>(nameIB))) == nullptr) {
LOGP(fatal, "Cannot create response function for IB");
}
if ((mSimRespOB = fOB->Get<o2::itsmft::AlpideSimResponse>(nameOB)) == nullptr) {
LOGP(fatal, "Cannot create response function for OB");
}
mParams.setIBSimResponse(mSimRespIB);
mParams.setOBSimResponse(mSimRespOB);
fIB->Close();
fOB->Close();
};

if (const auto& func = ITS3Params::Instance().chipResponseFunction; func == "Alpide") {
constexpr const char* responseFile = "$(O2_ROOT)/share/Detectors/ITSMFT/data/AlpideResponseData/AlpideResponseData.root";
loadSetResponseFunc(responseFile, "response0", responseFile, "response0");
mSimRespIBScaleX = o2::itsmft::SegmentationAlpide::PitchRow / SegmentationIB::PitchRow;
mSimRespIBScaleZ = o2::itsmft::SegmentationAlpide::PitchCol / SegmentationIB::PitchCol;
} else if (func == "APTS") {
constexpr const char* responseFileIB = "$(O2_ROOT)/share/Detectors/Upgrades/ITS3/data/ITS3ChipResponseData/APTSResponseData.root";
constexpr const char* responseFileOB = "$(O2_ROOT)/share/Detectors/ITSMFT/data/AlpideResponseData/AlpideResponseData.root";
loadSetResponseFunc(responseFileIB, "response1", responseFileOB, "response0");
mSimRespIBScaleX = constants::pixelarray::pixels::apts::pitchX / SegmentationIB::PitchRow;
mSimRespIBScaleZ = constants::pixelarray::pixels::apts::pitchZ / SegmentationIB::PitchCol;
mSimRespIBOrientation = true;
} else {
LOGP(fatal, "ResponseFunction '{}' not implemented!", func);
}
mSimRespIBShift = mSimRespIB->getDepthMax() - constants::silicon::thickness / 2.f;
mSimRespOBShift = mSimRespOB->getDepthMax() - SegmentationOB::SensorLayerThickness / 2.f;
LOGP(fatal, "No response functions set!");
}
if (const auto& func = ITS3Params::Instance().chipResponseFunction; func == "Alpide") {
mSimRespIBScaleX = o2::itsmft::SegmentationAlpide::PitchRow / SegmentationIB::PitchRow;
mSimRespIBScaleZ = o2::itsmft::SegmentationAlpide::PitchCol / SegmentationIB::PitchCol;
} else if (func == "APTS") {
mSimRespIBScaleX = constants::pixelarray::pixels::apts::pitchX / SegmentationIB::PitchRow;
mSimRespIBScaleZ = constants::pixelarray::pixels::apts::pitchZ / SegmentationIB::PitchCol;
mSimRespIBOrientation = true;
} else {
LOGP(fatal, "ResponseFunction '{}' not implemented!", func);
}
mSimRespIB = mParams.getIBSimResponse();
mSimRespOB = mParams.getOBSimResponse();
mSimRespIBShift = mSimRespIB->getDepthMax() - constants::silicon::thickness / 2.f;
mSimRespOBShift = mSimRespOB->getDepthMax() - SegmentationOB::SensorLayerThickness / 2.f;

mParams.print();
LOGP(info, "IB shift = {} ; OB shift = {}", mSimRespIBShift, mSimRespOBShift);
Expand Down
15 changes: 15 additions & 0 deletions Steer/DigitizerWorkflow/src/ITS3DigitizerSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,11 @@ class ITS3DPLDigitizerTask : BaseDPLDigitizer
pc.inputs().get<o2::itsmft::NoiseMap*>("IT3_dead"); // trigger final ccdb update
}

pc.inputs().get<o2::itsmft::AlpideSimResponse*>("IT3_alpiderespvbb0");
if (o2::its3::ITS3Params::Instance().chipResponseFunction != "Alpide") {
pc.inputs().get<o2::itsmft::AlpideSimResponse*>("IT3_aptsresp");
}

// init digitizer
mDigitizer.init();
}
Expand All @@ -273,6 +278,14 @@ class ITS3DPLDigitizerTask : BaseDPLDigitizer
mDigitizer.setDeadChannelsMap((o2::itsmft::NoiseMap*)obj);
return;
}
if (matcher == ConcreteDataMatcher(mOrigin, "ALPIDERESPVbb0", 0)) {
LOG(info) << mID.getName() << " loaded AlpideResponseData for Vbb=0V";
mDigitizer.getParams().setOBSimResponse((o2::itsmft::AlpideSimResponse*)obj);
}
if (matcher == ConcreteDataMatcher(mOrigin, "APTSRESP", 0)) {
LOG(info) << mID.getName() << " loaded APTSResponseData";
mDigitizer.getParams().setIBSimResponse((o2::itsmft::AlpideSimResponse*)obj);
}
}

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

return DataProcessorSpec{detStr + "Digitizer",
inputs, makeOutChannels(detOrig, mctruth),
Expand Down
14 changes: 14 additions & 0 deletions Steer/DigitizerWorkflow/src/ITSMFTDigitizerSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,14 @@ class ITSMFTDPLDigitizerTask : BaseDPLDigitizer
}
return;
}
if (matcher == ConcreteDataMatcher(mOrigin, "ALPIDERESPVbb0", 0)) {
LOG(info) << mID.getName() << " loaded AlpideResponseData for Vbb=0V";
mDigitizer.setAlpideResponse((o2::itsmft::AlpideSimResponse*)obj, 0);
}
if (matcher == ConcreteDataMatcher(mOrigin, "ALPIDERESPVbbM3", 0)) {
LOG(info) << mID.getName() << " loaded AlpideResponseData for Vbb=-3V";
mDigitizer.setAlpideResponse((o2::itsmft::AlpideSimResponse*)obj, 1);
}
}

protected:
Expand All @@ -236,6 +244,8 @@ class ITSMFTDPLDigitizerTask : BaseDPLDigitizer
// TODO: the code should run even if this object does not exist. Or: create default object
pc.inputs().get<o2::itsmft::TimeDeadMap*>(detstr + "_time_dead");
pc.inputs().get<o2::itsmft::DPLAlpideParam<DETID>*>(detstr + "_alppar");
pc.inputs().get<o2::itsmft::AlpideSimResponse*>(detstr + "_alpiderespvbb0");
pc.inputs().get<o2::itsmft::AlpideSimResponse*>(detstr + "_alpiderespvbbm3");

auto& dopt = o2::itsmft::DPLDigitizerParam<DETID>::Instance();
auto& aopt = o2::itsmft::DPLAlpideParam<DETID>::Instance();
Expand Down Expand Up @@ -365,6 +375,8 @@ DataProcessorSpec getITSDigitizerSpec(int channel, bool mctruth)
inputs.emplace_back("ITS_dead", "ITS", "DEADMAP", 0, Lifetime::Condition, ccdbParamSpec("ITS/Calib/DeadMap"));
inputs.emplace_back("ITS_time_dead", "ITS", "TimeDeadMap", 0, Lifetime::Condition, ccdbParamSpec("ITS/Calib/TimeDeadMap"));
inputs.emplace_back("ITS_alppar", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam"));
inputs.emplace_back("ITS_alpiderespvbb0", "ITS", "ALPIDERESPVbb0", 0, Lifetime::Condition, ccdbParamSpec("ITSMFT/Calib/ALPIDEResponseVbb0"));
inputs.emplace_back("ITS_alpiderespvbbm3", "ITS", "ALPIDERESPVbbM3", 0, Lifetime::Condition, ccdbParamSpec("ITSMFT/Calib/ALPIDEResponseVbbM3"));

return DataProcessorSpec{(detStr + "Digitizer").c_str(),
inputs, makeOutChannels(detOrig, mctruth),
Expand All @@ -384,6 +396,8 @@ DataProcessorSpec getMFTDigitizerSpec(int channel, bool mctruth)
inputs.emplace_back("MFT_dead", "MFT", "DEADMAP", 0, Lifetime::Condition, ccdbParamSpec("MFT/Calib/DeadMap"));
inputs.emplace_back("MFT_time_dead", "MFT", "TimeDeadMap", 0, Lifetime::Condition, ccdbParamSpec("MFT/Calib/TimeDeadMap"));
inputs.emplace_back("MFT_alppar", "MFT", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("MFT/Config/AlpideParam"));
inputs.emplace_back("MFT_alpiderespvbb0", "MFT", "ALPIDERESPVbb0", 0, Lifetime::Condition, ccdbParamSpec("ITSMFT/Calib/ALPIDEResponseVbb0"));
inputs.emplace_back("MFT_alpiderespvbbm3", "MFT", "ALPIDERESPVbbM3", 0, Lifetime::Condition, ccdbParamSpec("ITSMFT/Calib/ALPIDEResponseVbbM3"));
parHelper << "Params as " << o2::itsmft::DPLDigitizerParam<ITSDPLDigitizerTask::DETID>::getParamName().data() << ".<param>=value;... with"
<< o2::itsmft::DPLDigitizerParam<ITSDPLDigitizerTask::DETID>::Instance()
<< " or " << o2::itsmft::DPLAlpideParam<ITSDPLDigitizerTask::DETID>::getParamName().data() << ".<param>=value;... with"
Expand Down