BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
DedxCurSvc.cxx
Go to the documentation of this file.
1//********************************************************************
2// DedxCurSvc package
3// This Service is used for TOF measured pulse height correction.
4// For BESIII, from run 7991 to run 10881,
5// TOF electronics QTC correction are done online.
6// This service is used for convert the corrected Q back to RAW Q
7// Sun Shengsen 2009-9-17
8//********************************************************************
9#include "DedxCurSvc.h"
10#include "EventModel/Event.h"
11#include "EventModel/EventHeader.h"
12#include "EventModel/EventModel.h"
13#include "GaudiKernel/IDataProviderSvc.h"
14#include "GaudiKernel/IIncidentListener.h"
15#include "GaudiKernel/IIncidentSvc.h"
16#include "GaudiKernel/IInterface.h"
17#include "GaudiKernel/Incident.h"
18#include "GaudiKernel/Kernel.h"
19#include "GaudiKernel/MsgStream.h"
20#include "GaudiKernel/Service.h"
21#include "GaudiKernel/SmartDataPtr.h"
22#include "GaudiKernel/StatusCode.h"
23#include "TBuffer.h"
24#include "TBufferFile.h"
25#include "TTree.h"
26
27#include <math.h>
28
29using namespace std;
30
32
33DedxCurSvc::DedxCurSvc( const std::string& name, ISvcLocator* svcloc )
34 : base_class( name, svcloc ) {
35 declareProperty( "BossRelease", m_bossRelease = "default" );
36 declareProperty( "BossVer", m_sftver = "default" );
37 declareProperty( "ParVer", m_calParVer = "default" );
38 declareProperty( "DbStatus", m_dbStatus = "OK" );
39 declareProperty( "Type", m_type = "default" );
40}
41
42/*StatusCode DedxCurSvc::queryInterface (const InterfaceID& riid, void** ppvInterface ){
43
44 if ( IID_IDedxCurSvc.versionMatch(riid) ) {
45 *ppvInterface = static_cast<IDedxCurSvc*> (this);
46 }
47 else return Service::queryInterface(riid, ppvInterface) ;
48 return StatusCode::SUCCESS;
49}
50
51*/
53
54 MsgStream log( msgSvc(), name() );
55 log << MSG::INFO << name() << ": Start of run initialisation" << endmsg;
56
57 StatusCode sc = Service::initialize();
58 if ( sc.isFailure() ) return sc;
59
60 IIncidentSvc* incsvc;
61 sc = service( "IncidentSvc", incsvc );
62 int priority = 100;
63 if ( sc.isSuccess() ) { incsvc->addListener( this, "NewRun", priority ); }
64
65 sc = serviceLocator()->service( "DatabaseSvc", m_dbsvc, true );
66 if ( sc.isFailure() )
67 {
68 log << MSG::ERROR << "Unable to find DatabaseSvc " << endmsg;
69 return sc;
70 }
71
72 sc = serviceLocator()->service( "EventDataSvc", m_eventSvc, true );
73 if ( sc.isFailure() )
74 {
75 log << MSG::ERROR << "Unable to find EventDataSvc " << endmsg;
76 return sc;
77 }
78
79 StatusCode scc;
80 log << MSG::INFO << "setProperties()" << endmsg;
81 // scc = setProperties();
82
83 m_runFromMax = 0;
84 m_runToMin = 0;
85
86 return sc;
87}
88
90 MsgStream log( msgSvc(), name() );
91 log << MSG::INFO << name() << ": End of Run" << endmsg;
92 return StatusCode::SUCCESS;
93}
94
96
97void DedxCurSvc::handle( const Incident& inc ) {
98 MsgStream log( msgSvc(), name() );
99 log << MSG::DEBUG << "handle: " << inc.type() << endmsg;
100
101 SmartDataPtr<Event::EventHeader> eventHeader( m_eventSvc, "/Event/EventHeader" );
102 int run = eventHeader->runNumber();
103
104 if ( inc.type() == "NewRun" )
105 {
106 log << MSG::DEBUG << "New Run:" << run << endmsg;
108 }
109}
110
112 MsgStream log( msgSvc(), name() );
113 SmartDataPtr<Event::EventHeader> eventHeader( m_eventSvc, "/Event/EventHeader" );
114 int run = eventHeader->runNumber();
115 if ( run < 0 )
116 {
117 log << MSG::INFO << "This data is the MC sample with the Run Number: " << run << endmsg;
118 if ( m_type == "Sim" )
119 {
120 run = -run;
121 log << MSG::INFO << "Reverse the sign of Run Number" << endmsg;
122 }
123 }
124 // unsigned long *lengths;
125 MYSQL_RES* res_set;
126 MYSQL_ROW row;
127 char stmt1[400];
128
129 std::string sftver;
130
131 if ( m_sftver == "default" && m_bossRelease == "default" )
132 {
133 log << MSG::FATAL << " BossRelease and BossVer for DedxCurve not set!" << endmsg;
134 exit( 1 );
135 }
136
137 if ( ( run < m_runFromMax || run > m_runToMin ) )
138 {
139 if ( m_sftver == "default" )
140 {
141 sprintf( stmt1,
142 "select RunFrom, RunTo, SftVer, ParVer from CalVtxLumVer where BossRelease = "
143 "'%s' and RunFrom <= %d and RunTo >= %d and DataType = 'DedxCurve'",
144 m_bossRelease.c_str(), run, run );
145 std::cout << stmt1 << std::endl;
147 int row_no = m_dbsvc->query( "offlinedb", stmt1, rest );
148 if ( row_no == 0 )
149 {
150 log << MSG::FATAL << "can not find result for DedxCur with: " << stmt1 << endmsg;
151 exit( 1 );
152 }
153 if ( row_no > 1 )
154 {
155 log << MSG::FATAL << "find more than 1 results for DedxCur with: " << stmt1 << endmsg;
156 exit( 1 );
157 }
158 DatabaseRecord* recordst = rest[0];
159 sftver = recordst->GetString( "SftVer" );
160 m_calParVer = recordst->GetString( "ParVer" );
161 m_runFromMax = atoi( ( recordst->GetString( "RunFrom" ) ).c_str() );
162 m_runToMin = atoi( ( recordst->GetString( "RunTo" ) ).c_str() );
163 log << MSG::INFO << "get from CalVtxLumVer, m_runFromMax: " << m_runFromMax
164 << " m_runToMin: " << m_runToMin << endmsg;
165 }
166 else sftver = m_sftver;
167
168 if ( m_calParVer != "default" )
169 sprintf( stmt1,
170 "select RunFrom, RunTo, DedxCurvePar,DedxSigmaPar, SftVer, CurveFileName from "
171 "DedxCurvePar where SftVer = '%s' and RunFrom <= %d and RunTo >= %d and "
172 "DedxCurveParVer = %s and Status='%s'",
173 sftver.c_str(), run, run, m_calParVer.c_str(), m_dbStatus.c_str() );
174 else
175 sprintf( stmt1,
176 "select RunFrom, RunTo, DedxCurvePar,DedxSigmaPar, SftVer, CurveFileName from "
177 "DedxCurvePar where SftVer = '%s' and RunFrom <= %d and RunTo >= %d and "
178 "Status='%s' order by DedxCurveParVer desc",
179 sftver.c_str(), run, run, m_dbStatus.c_str() );
180 std::cout << stmt1 << std::endl;
181
183 int row_no = m_dbsvc->query( "offlinedb", stmt1, res );
184 if ( row_no == 0 )
185 {
186 log << MSG::FATAL << "can not find result for DedxCur with: " << stmt1 << endmsg;
187 exit( 1 );
188 }
189 if ( row_no > 1 )
190 {
191 log << MSG::FATAL << "find more than 1 results for DedxCur with: " << stmt1 << endmsg;
192 exit( 1 );
193 }
194
195 DatabaseRecord* records = res[0];
196 int runFrom = atoi( ( records->GetString( "RunFrom" ) ).c_str() );
197 int runTo = atoi( ( records->GetString( "RunTo" ) ).c_str() );
198 std::cout << "before output DedxCurveService version" << endl;
199 std::cout << " SftVer is "
200 << records->GetString( "SftVer" )
201 // << " CalVerSft is "<<records->GetString("CalParVer")
202 << " File name is " << records->GetString( "CurveFileName" ) << std::endl;
203 std::cout << "after output DedxCurveService version" << endl;
204
205 if ( m_sftver == "default" )
206 {
207 m_runFromMax = runFrom > m_runFromMax ? runFrom : m_runFromMax;
208 m_runToMin = runTo < m_runToMin ? runTo : m_runToMin;
209 }
210 else
211 {
212 m_runFromMax = runFrom;
213 m_runToMin = runTo;
214 }
215 log << MSG::INFO << "get from DedxCurvePar runFrom: " << runFrom << " runTo: " << runTo
216 << endmsg;
217 log << MSG::INFO << "m_runFromMax: " << m_runFromMax << " m_runToMin: " << m_runToMin
218 << endmsg;
219
220 TBuffer* buf1 = new TBufferFile( TBuffer::kRead );
221 buf1->SetBuffer( ( *records )["DedxCurvePar"], 327680, kFALSE );
222 TBuffer* buf2 = new TBufferFile( TBuffer::kRead );
223 buf2->SetBuffer( ( *records )["DedxSigmaPar"], 327680, kFALSE );
224
225 TTree* curvetree = new TTree();
226 curvetree->Streamer( *buf1 );
227
228 TTree* sigmatree = new TTree();
229 sigmatree->Streamer( *buf2 );
230
231 double curve[50];
232 double sigma[50];
233 int SigmaSize;
234 int CurveSize;
235 curvetree->SetBranchAddress( "curve", curve );
236 curvetree->SetBranchAddress( "CurveSize", &CurveSize );
237 sigmatree->SetBranchAddress( "sigma", sigma );
238 sigmatree->SetBranchAddress( "SigmaSize", &SigmaSize );
239
240 Int_t nentries_curve = (Int_t)curvetree->GetEntries();
241 Int_t nentries_sigma = (Int_t)sigmatree->GetEntries();
242 curvetree->GetEntry( 0 );
243 if ( CurveSize > 50 )
244 {
245 log << MSG::ERROR << "CurveSize larger than designed number" << endmsg;
246 exit( 1 );
247 }
248 for ( int i = 0; i < CurveSize; i++ ) { m_curve[i] = curve[i]; }
249
250 sigmatree->GetEntry( 0 );
251 if ( SigmaSize > 50 )
252 {
253 log << MSG::ERROR << "SigmaSize larger than designed number" << endmsg;
254 exit( 1 );
255 }
256 for ( int i = 0; i < SigmaSize; i++ ) { m_sigma[i] = sigma[i]; }
257 m_curve_size = CurveSize;
258 m_sigma_size = SigmaSize;
259 delete curvetree;
260 delete sigmatree;
261 }
262 return;
263}
DECLARE_COMPONENT(BesBdkRc)
sprintf(cut, "kal_costheta0_em>-0.93&&kal_costheta0_em<0.93&&kal_pxy0_em>=0.05+%d*0.1&&kal_" "pxy0_em<0.15+%d*0.1&&NGch>=2", j, j)
IMessageSvc * msgSvc()
virtual StatusCode finalize()
virtual StatusCode initialize()
void handle(const Incident &)
void getDedxCurveInfo()
DedxCurSvc(const std::string &name, ISvcLocator *svcloc)