ATLAS Offline Software
Loading...
Searching...
No Matches
NSWAGDDTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "NSWAGDDTool.h"
6
14
15#include <fstream>
16
17using namespace MuonGM;
18
19NSWAGDDTool::NSWAGDDTool(const std::string& type, const std::string& name, const IInterface* parent) :
20 AGDDToolBase(type,name,parent),
22 m_outPREsqlName("") {
23}
24
25StatusCode NSWAGDDTool::initialize ATLAS_NOT_THREAD_SAFE ()
26{
27 ATH_CHECK(AGDDToolBase::initialize());
28 ATH_MSG_INFO("NSWAGDDTool::initialize");
29
30 if( m_xmlFiles.size() == 1 && m_writeDBfile )
31 {
32 std::size_t found = m_xmlFiles[0].find_last_of('/');
33 m_outFileInName = m_xmlFiles[0].substr(found+1);
34 }
35 else if ( m_writeDBfile ) ATH_MSG_ERROR("writing data base files currently only supported if just a single input XML is given!");
36
37 m_outFileName = "Out.AmdcOracle.AM." + m_outFileType + "temp.data";
38 m_outPREsqlName = "Out.AmdcOracle.AM." + m_outFileType + ".PREsql";
39
40 if (m_DBFileName.empty()) {
41 m_DBFileName = "Generated_" + m_outFileType + "_pool.txt";
42 }
43
44 static std::once_flag init;
45 std::call_once (init, [&]()
46 {
47 MuonAGDDToolHelper theHelper;
48 theHelper.setAGDDtoGeoSvcName(m_agdd2GeoSvcName);
49 theHelper.SetNSWComponents();
50 });
51
52 ATH_CHECK(construct());
53 return StatusCode::SUCCESS;
54}
55
56// Base class method is also marked not thread-safe.
57// Uses unsafe function UseGeoModelDetector
58StatusCode NSWAGDDTool::construct ATLAS_NOT_THREAD_SAFE ()
59{
60 ATH_MSG_INFO(name()<<"::construct()");
61
62 IAGDDtoGeoSvc::LockedController controller = m_svc->getController();
63 MuonAGDDToolHelper theHelper;
64 theHelper.setAGDDtoGeoSvcName(m_agdd2GeoSvcName);
65 if (!m_readAGDD)
66 {
67 ATH_MSG_INFO(" trying to parse files ");
68 controller->ParseFiles();
69 }
70 else
71 {
72 ATH_MSG_INFO(" trying to parse data base content ");
73 std::string AGDDfile = theHelper.GetAGDD(m_dumpAGDD, m_outFileType, m_DBFileName);
74 controller->ParseString(AGDDfile);
75 }
76
77 if (m_printSections)
78 {
79 ATH_MSG_INFO("\t Printing all sections ");
80 controller->PrintSections();
81 }
82
83 controller->UseGeoModelDetector("Muon");
84 controller->BuildAll();
85
86 // part needed to build the NSW RO geometry
87
88 ATH_MSG_INFO("\t Building NSW Readout Geometry ");
90 if (!testRet)
91 {
92 ATH_MSG_ERROR("something went wrong building the RO geometry!!! ");
93 return StatusCode::FAILURE;
94 }
95
96 if(m_writeDBfile)
97 {
98 // build model before writing blob - if Athena crashes the XML is not good and should not become a blob
99 ATH_MSG_INFO("\t-- attempting to write output to "<< m_outFileName );
100 if( !m_outFileName.empty() )
101 {
102 if(!controller->WriteAGDDtoDBFile( m_outFileName ))
103 {
104 ATH_MSG_ERROR("\t-- something went wrong during writing AGDD file - crashing" );
105 return StatusCode::FAILURE;
106 }
107 else {
108 ATH_MSG_INFO("\t-- AGDD successfully dumped to "<< m_outFileName);
109 }
110 if( !WritePREsqlFile() )
111 {
112 ATH_MSG_ERROR("\t-- something went wrong during writing PREsql file - crashing" );
113 return StatusCode::FAILURE;
114 }
115 else {
116 ATH_MSG_INFO("\t-- AGDD successfully wrote PREsql file "<< m_outPREsqlName);
117 }
118 }
119 else {
120 ATH_MSG_ERROR("\t-- no output file name provided - crashing " );
121 return StatusCode::FAILURE;
122 }
123 }
124
125 controller->Clean();
126
127 return StatusCode::SUCCESS;
128}
129
131{
132
133 std::ifstream outfile(m_outFileName.value().c_str(), std::ifstream::in | std::ifstream::binary);
134
135 std::vector<std::string> newoutfilelines;
136 std::string outfileline;
137 while( getline(outfile, outfileline) )
138 if( outfileline != "\n" && outfileline != "\r" && !outfileline.empty() )
139 {
140 const auto strBegin = outfileline.find_first_not_of(" \t");
141 const auto strEnd = outfileline.find_last_not_of(" \t");
142 const auto strRange = strEnd - strBegin + 1;
143 if (strBegin != std::string::npos) outfileline = outfileline.substr(strBegin, strRange);
144 newoutfilelines.push_back(outfileline);
145 }
146 outfile.close();
147
148 std::ofstream newoutfile(m_outFileName.value().c_str(), std::ofstream::out | std::ofstream::trunc);
149 for(auto it = newoutfilelines.begin(); it != newoutfilelines.end(); ++it)
150 {
151 if(it != newoutfilelines.begin()) newoutfile << "\n";
152 newoutfile << *it;
153 }
154 newoutfile.close();
155 outfile.open(m_outFileName.value().c_str(), std::ifstream::in | std::ifstream::binary);
156
157 int fileSize = 0;
158 if(outfile.is_open())
159 {
160 outfile.seekg(0, std::ios::end);
161 fileSize = outfile.tellg();
162 outfile.close();
163 }
164 else {
165 ATH_MSG_ERROR("\t-- cannot get size of file " << m_outFileName );
166 return false;
167 }
168
169 std::ofstream prefile;
170 prefile.open (m_outPREsqlName.c_str());
171 prefile << "insert into NSWD_data (\n";
172 prefile << "NSWD_data_id,\n";
173 prefile << "ACTVERS,\n";
174 prefile << "ACTVNAME,\n";
175 prefile << "ALGVERS,\n";
176 prefile << "ALGVNAME,\n";
177 prefile << "PASVERS,\n";
178 prefile << "PASVNAME,\n";
179 prefile << "FORMAT,\n";
180 prefile << "FNAME,\n";
181 prefile << "LENNSW,\n";
182 prefile << "NLINE,\n";
183 prefile << "data\n";
184 prefile << ") values (XXX_DATA_ID_KOUNTER,\n";
185 prefile << m_outFileActV << ",'" << m_outFileActN << "',";
186 prefile << m_outFileAlgV << ",'" << m_outFileAlgN << "',";
187 prefile << m_outFilePasV << ",'" << m_outFilePasN << "',\n";
188 prefile << "'" << m_outFileForm <<"','" << m_outFileInName << "',"<< fileSize-1 << ","<< int( (fileSize + 2) / 4 )<<",\n";
189 prefile << "empty_clob()\n";
190 prefile << ");\n";
191 prefile << "insert into NSWD_data2tag values (XXX_DATA2TAG_KOUNTER,XXX_DATA_ID_KOUNTER);\n";
192 prefile << "DECLARE\n";
193 prefile << " lobloc CLOB;\n";
194 prefile << " req utl_http.req;\n";
195 prefile << " resp utl_http.resp;\n";
196 prefile << " text VARCHAR2(32767);\n";
197 prefile << " amount INTEGER(10) := 0;\n";
198 prefile << " offset INTEGER(10) := 0;\n";
199 prefile << " TRUE BOOLEAN;\n";
200 prefile << "BEGIN\n";
201 prefile << " SELECT data INTO lobloc\n";
202 prefile << " FROM NSWD_data\n";
203 prefile << " WHERE NSWD_data_id = XXX_DATA_ID_KOUNTER FOR UPDATE;\n";
204 prefile << " offset := DBMS_LOB.GETLENGTH(lobloc)+2;\n";
205 prefile << " req := utl_http.begin_request(\n";
206 prefile << " 'WEB_ADDRESS_FOR_TEMP_DATA_FILENSWDtemp.data');\n";
207 prefile << " resp := utl_http.get_response(req);\n";
208 prefile << " LOOP\n";
209 prefile << " text := ' ';\n";
210 prefile << " UTL_HTTP.READ_TEXT(resp, text, NULL);\n";
211 prefile << " /* DBMS_OUTPUT.PUT_LINE(text); */\n";
212 prefile << " amount := length(text);\n";
213 prefile << " DBMS_LOB.WRITEAPPEND(lobloc,amount,text);\n";
214 prefile << " END LOOP;\n";
215 prefile << " utl_http.end_response(resp);\n";
216 prefile << " EXCEPTION\n";
217 prefile << " WHEN utl_http.end_of_body\n";
218 prefile << " THEN utl_http.end_response(resp);\n";
219 prefile << "END;\n";
220 prefile << "/\n";
221 prefile.close();
222
223 return true;
224
225}
226
227
228
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
StatusCode NSWAGDDTool::initialize ATLAS_NOT_THREAD_SAFE()
Install fatal handler with default options.
bool WriteAGDDtoDBFile(const std::string &)
void PrintSections() const
void ParseString(const std::string &)
Gaudi::Property< std::string > m_outFileName
AGDDToolBase(const std::string &type, const std::string &name, const IInterface *parent)
CxxUtils::LockedPointer< AGDDController > LockedController
std::string GetAGDD(const bool dumpIt, const std::string &tableName, const std::string &outFileName)
static bool BuildMScomponents()
void setAGDDtoGeoSvcName(const std::string &name)
Gaudi::Property< int > m_outFileActV
Definition NSWAGDDTool.h:19
Gaudi::Property< std::string > m_outFileActN
Definition NSWAGDDTool.h:23
NSWAGDDTool(const std::string &type, const std::string &name, const IInterface *parent)
std::string m_outPREsqlName
Definition NSWAGDDTool.h:30
Gaudi::Property< int > m_outFileAlgV
Definition NSWAGDDTool.h:20
std::string m_outFileInName
Definition NSWAGDDTool.h:29
Gaudi::Property< std::string > m_outFileAlgN
Definition NSWAGDDTool.h:24
bool WritePREsqlFile() const
Gaudi::Property< int > m_outFilePasV
Definition NSWAGDDTool.h:21
Gaudi::Property< std::string > m_outFileForm
Definition NSWAGDDTool.h:26
Gaudi::Property< std::string > m_outFilePasN
Definition NSWAGDDTool.h:25
Ensure that the Athena extensions are properly loaded.
Definition GeoMuonHits.h:27