1616
1717#include " TPCWorkflow/TPCPressureTemperatureSpec.h"
1818#include " Framework/Task.h"
19- #include " Framework/Logger.h"
2019#include " Framework/DataProcessorSpec.h"
21- #include " Framework/CCDBParamSpec.h"
22- #include " TPCBase/CDBInterface.h"
2320#include " Framework/ConfigParamRegistry.h"
2421#include " DetectorsBase/GRPGeomHelper.h"
25- #include " CommonDataFormat/Pair.h"
26- #include " DataFormatsTPC/DCS.h"
2722#include " CommonUtils/TreeStreamRedirector.h"
23+ #include " TPCCalibration/PressureTemperatureHelper.h"
2824
2925using namespace o2 ::framework;
3026
@@ -41,7 +37,7 @@ class PressureTemperatureDevice : public o2::framework::Task
4137 {
4238 o2::base::GRPGeomHelper::instance ().setRequest (mCCDBRequest );
4339 const int intInterval = ic.options ().get <int >(" fit-interval" );
44- mFitIntervalMS = intInterval * 1000 ;
40+ mPTHelper . setFitIntervalTemp ( intInterval * 1000 ) ;
4541 const bool enableDebugTree = ic.options ().get <bool >(" enable-root-output" );
4642 if (enableDebugTree) {
4743 mStreamer = std::make_unique<o2::utils::TreeStreamRedirector>(" pt.root" , " recreate" );
@@ -55,111 +51,37 @@ class PressureTemperatureDevice : public o2::framework::Task
5551 }
5652 }
5753
58- // / \brief interpolate input values for given timestamp
59- // / \param timestamps time stamps of the data
60- // / \param values data points
61- // / \param timestamp time where to interpolate the values
62- float interpolate (const std::vector<uint64_t >& timestamps, const std::vector<float >& values, uint64_t timestamp)
63- {
64- if (auto idxClosest = o2::math_utils::findClosestIndices (timestamps, timestamp)) {
65- auto [idxLeft, idxRight] = *idxClosest;
66- if (idxRight > idxLeft) {
67- const uint64_t x0 = timestamps[idxLeft];
68- const uint64_t x1 = timestamps[idxRight];
69- const float y0 = values[idxLeft];
70- const float y1 = values[idxRight];
71- const float y = (y0 * (x1 - timestamp) + y1 * (timestamp - x0)) / (x1 - x0);
72- return y;
73- } else {
74- return values[idxLeft];
75- }
76- }
77- return 0 ; // this should never happen
78- }
79-
8054 void run (o2::framework::ProcessingContext& pc) final
8155 {
8256 o2::base::GRPGeomHelper::instance ().checkUpdates (pc);
83- pc.inputs ().get <dcs::Pressure*>(" pressure" );
84- pc.inputs ().get <dcs::Temperature*>(" temperature" );
57+ mPTHelper .extractCCDBInputs (pc);
8558 const auto orbitResetTimeMS = o2::base::GRPGeomHelper::instance ().getOrbitResetTimeMS ();
8659 const auto firstTFOrbit = pc.services ().get <o2::framework::TimingInfo>().firstTForbit ;
8760 const uint64_t timestamp = orbitResetTimeMS + firstTFOrbit * o2::constants::lhc::LHCOrbitMUS * 0.001 ;
88-
89- // find closest temperature and pressure
90- const float pressure = interpolate (mPressure .second , mPressure .first , timestamp);
91- const float tempA = interpolate (mTemperatureA .second , mTemperatureA .first , timestamp);
92- const float tempC = interpolate (mTemperatureC .second , mTemperatureC .first , timestamp);
61+ mPTHelper .sendPTForTS (pc, timestamp);
9362
9463 if (mStreamer ) {
64+ const float pressure = mPTHelper .getPressure (timestamp);
65+ const auto temp = mPTHelper .getTemperature (timestamp);
9566 (*mStreamer ) << " pt"
9667 << " pressure=" << pressure
97- << " temperatureA=" << tempA
98- << " temperatureC=" << tempC
68+ << " temperatureA=" << temp. first
69+ << " temperatureC=" << temp. second
9970 << " time=" << timestamp
10071 << " \n " ;
10172 }
102-
103- LOGP (info, " Sending pressure {}, temperature A {} and temperature C {} for timestamp {}" , pressure, tempA, tempC, timestamp);
104- pc.outputs ().snapshot (Output{o2::header::gDataOriginTPC , o2::tpc::getDataDescriptionTemperature ()}, dataformats::Pair<float , float >{tempA, tempC});
105- pc.outputs ().snapshot (Output{o2::header::gDataOriginTPC , o2::tpc::getDataDescriptionPressure ()}, pressure);
10673 }
10774
10875 void finaliseCCDB (o2::framework::ConcreteDataMatcher& matcher, void * obj) final
10976 {
11077 o2::base::GRPGeomHelper::instance ().finaliseCCDB (matcher, obj);
111- if (matcher == ConcreteDataMatcher (o2::header::gDataOriginTPC , " PRESSURECCDB" , 0 )) {
112- LOGP (info, " Updating pressure" );
113- const auto & pressure = ((dcs::Pressure*)obj);
114- mPressure .second = pressure->robustPressure .time ;
115- mPressure .first = pressure->robustPressure .robustPressure ;
116-
117- if (mStreamer ) {
118- (*mStreamer ) << " p"
119- << " pressureCCDB=" << pressure
120- << " pressure=" << mPressure
121- << " \n " ;
122- }
123- }
124-
125- if (matcher == ConcreteDataMatcher (o2::header::gDataOriginTPC , " TEMPERATURECCDB" , 0 )) {
126- LOGP (info, " Updating temperature" );
127- auto temp = *(dcs::Temperature*)obj;
128- temp.fitTemperature (o2::tpc::Side::A, mFitIntervalMS , false );
129- temp.fitTemperature (o2::tpc::Side::C, mFitIntervalMS , false );
130-
131- mTemperatureA .first .clear ();
132- mTemperatureC .first .clear ();
133- mTemperatureA .second .clear ();
134- mTemperatureC .second .clear ();
135-
136- for (const auto & dp : temp.statsA .data ) {
137- mTemperatureA .first .emplace_back (dp.value .mean );
138- mTemperatureA .second .emplace_back (dp.time );
139- }
140-
141- for (const auto & dp : temp.statsC .data ) {
142- mTemperatureC .first .emplace_back (dp.value .mean );
143- mTemperatureC .second .emplace_back (dp.time );
144- }
145-
146- if (mStreamer ) {
147- (*mStreamer ) << " t"
148- << " temperatureCCDB=" << temp
149- << " temperatureA=" << mTemperatureA
150- << " temperatureC=" << mTemperatureC
151- << " \n " ;
152- }
153- }
78+ mPTHelper .accountCCDBInputs (matcher, obj);
15479 }
15580
15681 private:
157- std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest ; // /< info for CCDB request
158- std::pair<std::vector<float >, std::vector<uint64_t >> mPressure ; // /< pressure values for both measurements
159- std::pair<std::vector<float >, std::vector<uint64_t >> mTemperatureA ; // /< temperature values A-side
160- std::pair<std::vector<float >, std::vector<uint64_t >> mTemperatureC ; // /< temperature values C-side
161- std::unique_ptr<o2::utils::TreeStreamRedirector> mStreamer ; // /< debug streamer
162- int mFitIntervalMS {5 * 60 * 1000 }; // /< fit interval for the temperature
82+ PressureTemperatureHelper mPTHelper ;
83+ std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest ; // /< info for CCDB request
84+ std::unique_ptr<o2::utils::TreeStreamRedirector> mStreamer ; // /< debug streamer
16385};
16486
16587o2::framework::DataProcessorSpec getTPCPressureTemperatureSpec ()
@@ -168,11 +90,8 @@ o2::framework::DataProcessorSpec getTPCPressureTemperatureSpec()
16890 std::vector<OutputSpec> outputs;
16991 o2::header::DataDescription dataDescription;
17092
171- inputs.emplace_back (" pressure" , o2::header::gDataOriginTPC , " PRESSURECCDB" , 0 , Lifetime::Condition, ccdbParamSpec (o2::tpc::CDBTypeMap.at (o2::tpc::CDBType::CalPressure), {}, 1 )); // time-dependent
172- inputs.emplace_back (" temperature" , o2::header::gDataOriginTPC , " TEMPERATURECCDB" , 0 , Lifetime::Condition, ccdbParamSpec (o2::tpc::CDBTypeMap.at (o2::tpc::CDBType::CalTemperature), {}, 1 )); // time-dependent
173-
174- outputs.emplace_back (o2::header::gDataOriginTPC , o2::tpc::getDataDescriptionPressure (), 0 , Lifetime::Timeframe);
175- outputs.emplace_back (o2::header::gDataOriginTPC , o2::tpc::getDataDescriptionTemperature (), 0 , Lifetime::Timeframe);
93+ PressureTemperatureHelper::requestCCDBInputs (inputs);
94+ PressureTemperatureHelper::setOutputs (outputs);
17695
17796 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true , // orbitResetTime
17897 false , // GRPECS=true for nHBF per TF
0 commit comments