BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
ConnectionDB.cxx
Go to the documentation of this file.
1#ifndef BEAN
2# include "GaudiKernel/Bootstrap.h"
3# include "GaudiKernel/ISvcLocator.h"
4# include "GaudiKernel/MsgStream.h"
5# include "GaudiKernel/SmartDataPtr.h"
6
7# include "facilities/Util.h"
8#else
9# include "DatabaseSvc/DatabaseSvc.h"
10#endif
11
12#include <cstdio>
13#include <cstdlib>
14#include <iostream>
15
16#include "ConnectionDB.h"
17
18using namespace std;
19
20namespace FieldDBUtil {
21
22#ifndef BEAN
24 StatusCode sc = Gaudi::svcLocator()->service( "DatabaseSvc", m_dbsvc, true );
25 if ( sc.isFailure() )
26 { std::cout << "ERROR: In ConnectionDB()--> Unable to find DatabaseSvc " << std::endl; }
27 }
28#endif
29
31 int runNo ) {
32
33#ifdef BEAN
34 static DatabaseSvc* m_dbsvc = 0;
35
36 if ( !m_dbsvc ) { m_dbsvc = DatabaseSvc::instance(); }
37#endif
38
39 // Read magnetic field map
40 char stmt1[200];
41 int run_No = std::abs( runNo );
42
43 sprintf( stmt1, "select Magnet_Current,SCQL,SCQR from SC_magnet where run_number = %d ",
44 run_No );
45 // cout<<stmt1<<endl;
47 results.clear();
48 int status = m_dbsvc->query( "run", stmt1, results );
49
50 if ( status < 0 )
51 {
52 std::cout << "ERROR Read the SSM and SCQ current from the Database" << endl;
53 exit( 1 );
54 }
55
56 int RowNumber = results.size();
57 if ( RowNumber != 1 )
58 {
59 std::cout << "ERROR:error searching SC_Magnet Data in the database, check your "
60 "selection criterions"
61 << std::endl;
62 return RETMySQLError;
63 }
64
65 DatabaseRecord& rec = *results[0];
66 double ssm_curr = rec.GetDouble( "Magnet_Current" );
67 double scql_curr = rec.GetDouble( "SCQL" );
68 double scqr_curr = rec.GetDouble( "SCQR" );
69
70 // save results in vector
71 current.resize( 3 );
72 current[0] = ssm_curr;
73 current[1] = scql_curr;
74 current[2] = scqr_curr;
75 // cout<<"run:"<<run_No<<"Magnet_Current:"<<current[0]<<"SCQL:"<<current[1]<<"SCQR:"<<current[2]<<endl;
76 return RETOk;
77 }
78
79 bool ConnectionDB::getBeamEnergy( std::map<int, std::vector<double>>& m_mapBeamEnergy,
80 int runFrom, int runTo ) {
81 char stmt1[200];
82 int run_From = std::abs( runFrom );
83 int run_To = std::abs( runTo );
85 results.clear();
86
87 IDatabaseSvc* m_dbsvc;
88 StatusCode sc = Gaudi::svcLocator()->service( "DatabaseSvc", m_dbsvc, true );
89 if ( sc.isFailure() )
90 {
91 std::cout << "MSG::ERROR "
92 << "Unable to find DatabaseSvc " << std::endl;
93 exit( 1 );
94 }
95
96 sprintf( stmt1,
97 "select run_number,BPR_PRB,BER_PRB from RunParams where run_number >= %d and "
98 "run_number <= %d ",
99 run_From, run_To );
100 // cout<<stmt1<<endl;
101 int row_no = m_dbsvc->query( "run", stmt1, results );
102 if ( row_no <= 0 )
103 {
104 std::cout << "ERROR:"
105 << "Run:" << run_From << " Can not read the beam energy from the Database"
106 << endl;
107 exit( 1 );
108 }
109
110 /*int RowNumber = results.size();
111 if(RowNumber == 0) {
112 beamE.push_back(1.843); // for positron
113 beamE.push_back(1.843); // for electron
114 std::cout << "No beam energy, so set BPR_PRB=1.843, BER_PRB=1.843"<<std::endl;
115 exit(1);
116 }*/
117 if ( row_no > 0 )
118 {
119 for ( int i = 0; i < row_no; i++ )
120 {
121 DatabaseRecord& dbrec = *results[i];
122 int run_No = dbrec.GetInt( "run_number" );
123 std::vector<double> beamEnergy;
124 beamEnergy.push_back( dbrec.GetDouble( "BPR_PRB" ) );
125 beamEnergy.push_back( dbrec.GetDouble( "BER_PRB" ) );
126 m_mapBeamEnergy[run_No] = beamEnergy;
127 float beam1, beam2;
128 beam1 = beamEnergy[0];
129 beam2 = beamEnergy[1];
130 // cout<<"map of run:"<<run_No<<"BPR_PRB:"<<beam1<<"BER_PRB:"<<beam2<<endl;
131 }
132 return true;
133 }
134
135 std::cerr << __FILE__ << ":" << __LINE__ << ": should not reach here" << std::endl;
136 exit( 1 );
137 }
138
139 bool ConnectionDB::getReadSC_MagnetInfo( std::map<int, std::vector<double>>& m_mapMagnetInfo,
140 int runFrom, int runTo ) {
141 char stmt1[200];
142 int run_From = std::abs( runFrom );
143 int run_To = std::abs( runTo );
144 DatabaseRecordVector results;
145 results.clear();
146
147 IDatabaseSvc* m_dbsvc;
148 StatusCode sc = Gaudi::svcLocator()->service( "DatabaseSvc", m_dbsvc, true );
149 if ( sc.isFailure() )
150 {
151 std::cout << "MSG::ERROR "
152 << "Unable to find DatabaseSvc " << std::endl;
153 exit( 1 );
154 }
155 sprintf( stmt1,
156 "select run_number,Magnet_Current,SCQL,SCQR from SC_magnet where run_number >= "
157 "%d and run_number<=%d ",
158 run_From, run_To );
159 // cout<<stmt1<<endl;
160 int row_no = m_dbsvc->query( "run", stmt1, results );
161 if ( row_no <= 0 )
162 {
163 std::cout << "ERROR Read the SSM and SCQ current from the Database"
164 << " Run:" << run_From << endl;
165 exit( 1 );
166 }
167 if ( row_no > 0 )
168 {
169 for ( int i = 0; i < row_no; i++ )
170 {
171 DatabaseRecord& dbrec = *results[i];
172 int run_No = dbrec.GetInt( "run_number" );
173 std::vector<double> SCMagnet;
174 SCMagnet.push_back( dbrec.GetDouble( "Magnet_Current" ) );
175 SCMagnet.push_back( dbrec.GetDouble( "SCQL" ) );
176 SCMagnet.push_back( dbrec.GetDouble( "SCQR" ) );
177 m_mapMagnetInfo[run_No] = SCMagnet;
178 // cout<<"map of
179 // run:"<<run_No<<"Magnet_Current:"<<(m_mapMagnetInfo[run_No])[0]<<"SCQL:"<<(m_mapMagnetInfo[run_No])[1]<<"SCQR:"<<(m_mapMagnetInfo[run_No])[2]<<endl;
180 }
181 }
182 return true;
183 }
184 ConnectionDB::eRet ConnectionDB::getBeamEnergy( std::vector<double>& beamE, int runNo ) {
185 // Read magnetic field map
186 char stmt1[200];
187 int run_No = std::abs( runNo );
188
189 sprintf( stmt1, "select BPR_PRB,BER_PRB from RunParams where run_number = %d ", run_No );
190 // cout<<stmt1<<endl;
191 DatabaseRecordVector results;
192 results.clear();
193 int status = m_dbsvc->query( "run", stmt1, results );
194 if ( status < 0 )
195 {
196 std::cout << "ERROR Read the beam energy from the Database" << endmsg;
197 exit( 1 );
198 }
199
200 int RowNumber = results.size();
201
202 if ( RowNumber == 0 )
203 {
204 beamE.push_back( 1.843 ); // for positron
205 beamE.push_back( 1.843 ); // for electron
206
207 return RETOk;
208 }
209
210 if ( RowNumber != 1 )
211 {
212 std::cout << "ERROR:error searching beam energy in the database, check your selection "
213 "criterions"
214 << std::endl;
215 return RETMySQLError;
216 }
217
218 beamE.push_back( atof( ( *results[0] )["BPR_PRB"] ) ); // for positron
219 beamE.push_back( atof( ( *results[0] )["BER_PRB"] ) ); // for electron
220 float beam1, beam2;
221 beam1 = atof( ( *results[0] )["BPR_PRB"] );
222 beam2 = atof( ( *results[0] )["BER_PRB"] );
223 // cout<<"map of run:"<<run_No<<"BPR_PRB:"<<beam1<<"BER_PRB:"<<beam2<<endl;
224 return RETOk;
225 }
226
227} // namespace FieldDBUtil
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)
int runNo
Definition DQA_TO_DB.cxx:13
ConnectionDB()
Constructor keeps track of table of interest.
ConnectionDB::eRet getReadSC_MagnetInfo(std::vector< double > &current, int runNo)
ConnectionDB::eRet getBeamEnergy(std::vector< double > &beamE, int runNo)