ATLAS Offline Software
Loading...
Searching...
No Matches
TubeDataFromFile.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include <TString.h> // for Form
8#include <math.h>
9#include <stdio.h>
10
11#include <sstream>
12#include <string>
13
14
15namespace MuonCalib {
16
17 std::ostream& TubeDataFromFile::write(std::ostream& os) const {
18 if (m_regions != m_tubeData.size()) {
19 MsgStream log(Athena::getMessageSvc(), "MdtTubeFitContainer");
20 log << MSG::WARNING << "TubeDataFromFile::write: <inconsistent count>" << endmsg;
21 }
22
23 os << "v0.0 " << m_regions << " ";
24 unsigned int counter{0};
26 if (!container) continue;
27 const unsigned int nml = container->numMultilayers();
28 const unsigned int nl = container->numLayers();
29 const unsigned int nt = container->numTubes();
30 const std::string datatype = container->name();
31 const std::string implementation = container->implementation();
32 const int stnEta = container->idHelperSvc()->stationEta(container->identify());
33 const int stnPhi = container->idHelperSvc()->stationPhi(container->identify());
34 const std::string stnName = container->idHelperSvc()->stationNameString(container->identify());
35 os << datatype << " " << implementation << " " << counter << " " << container->size() << std::endl;
36 ++counter;
37 const MdtIdHelper& id_helper{container->idHelperSvc()->mdtIdHelper()};
38 for (unsigned int km = 1; km <= nml; ++km) {
39 for (unsigned int kl = 1; kl <= nl; ++kl) {
40 for (unsigned int kt = 1; kt <= nt; ++kt) {
41 const Identifier chId{id_helper.channelID(container->identify(),km ,kl ,kt)};
42 const MdtTubeFitContainer::SingleTubeCalib* stc = container->getCalib(chId);
43 const MdtTubeFitContainer::SingleTubeFit* stf = container->getFit(chId);
44 double t0 = 999.;
45 if (stc) {
46 t0 = stc->t0;
47 if (std::isnan(t0) != 0) t0 = -99999.;
48 }
49 constexpr int technology = 0;
50 os << " " << stnName << " " << stnPhi << " " << stnEta
51 << " " << technology << " " << km << " " << kl << " " << kt;
52 if (stc) {
53 os << " " << t0 << " " << stc->adcCal << " " << stc->statusCode;
54 } else{
55 os << " " << 0 << " " << 0 << " " << 0;
56
57 }
58 if (stf)
59 os << " " << stf->statistics << " " << stf->chi2Tdc << " " << stf->cov[4] // stf->t0Err
60 << " " << stf->par[5] // stf->tMax
61 << " " << stf->cov[5] // stf->tMaxErr
62 << " " << stf->par[0] // stf->noise
63 << " " << stf->cov[0] // stf->noiseErr
64 << " " << stf->par[6] // stf->slope
65 << " " << stf->cov[6]; // stf->slopeErr;
66 else {
67 os << " " << -1 << " " << 0 << " " << 0 << " " << 0 << " "
68 << 0 << " " << 0 << " " << 0 << " " << 0 << " "
69 << 0;
70 }
71 os << std::endl;
72 }
73 }
74 }
75 }
76 return os;
77 }
78
79
80 std::ostream& TubeDataFromFile::write_forDB(std::ostream& ftube, int mdt_head, int lowrun, int uprun) const {
82 // write out ascii files for Calibration DB //
84 if (m_regions != m_tubeData.size()) {
85 MsgStream log(Athena::getMessageSvc(), "MdtTubeFitContainer");
86 log << MSG::WARNING << "TubeDataFromFile::write_forDB: <inconsistent count>" << endmsg;
87 }
88
90 if (!container) continue;
91 const unsigned int nml = container->numMultilayers();
92 const unsigned int nl = container->numLayers();
93 const unsigned int nt = container->numTubes();
94 const std::string datatype = container->name();
95 const std::string implementation = container->implementation();
96 const int stnEta = container->idHelperSvc()->stationEta(container->identify());
97 const int stnPhi = container->idHelperSvc()->stationPhi(container->identify());
98 const std::string stnName = container->idHelperSvc()->stationNameString(container->identify());
99
100 const MdtIdHelper& id_helper{container->idHelperSvc()->mdtIdHelper()};
101 for (unsigned int km = 1; km <= nml; ++km) {
102 for (unsigned int kl = 1; kl <= nl; ++kl) {
103 for (unsigned int kt = 1; kt <= nt; ++kt) {
104 const Identifier chId{id_helper.channelID(container->identify(),km ,kl ,kt)};
105 const MdtTubeFitContainer::SingleTubeCalib* stc = container->getCalib(chId);
106 const MdtTubeFitContainer::SingleTubeFit* stf = container->getFit(chId);
107 constexpr int technology = 0;
108
109 MuonFixedId fixId{};
110 int sc{0}, stat{-1};
111 double t0{0.}, adcm{0.}, chi2tdc{0.}, t0err{0.},
112 tmax{0.}, tmaxerr{0.}, noise{0.}, noiseerr{0.},
113 slope{0.}, sloperr{0.};
114 int tube_id{0}, runflag{0}, validflag{0};
115
116 if (!fixId.setTechnology(technology) ||
117 !fixId.setStationName(fixId.stationStringToFixedStationNumber(stnName)) ||
118 !fixId.setStationEta(stnEta) ||
119 !fixId.setStationPhi(stnPhi) ||
120 !fixId.setMdtTube(kt) ||
121 !fixId.setMdtTubeLayer(kl) ||
122 !fixId.setMdtMultilayer(km)) {
123 std::stringstream except{};
124 except<<__FILE__<<":"<<__LINE__<<"nTubeDataFromFile::write_forDB() - Setting identifier failed!";
125 throw std::runtime_error(except.str());
126 }
127 tube_id = fixId.getIdInt();
128
129 if (stc) {
130 t0 = stc->t0;
131 adcm = stc->adcCal;
132 sc = stc->statusCode;
133 }
134 if (stf) {
135 stat = stf->statistics;
136 chi2tdc = stf->chi2Tdc;
137 t0err = stf->cov[4];
138 tmax = stf->par[5];
139 tmaxerr = stf->cov[5];
140 noise = stf->par[0];
141 noiseerr = stf->cov[0];
142 slope = stf->par[6];
143 sloperr = stf->cov[6];
144 }
145
146 if (std::isnan(t0) != 0) t0 = -99999.;
147
148 ftube<<mdt_head<<","<<tube_id<<","<<fixId.mdtChamberId().getIdInt()<<","
149 <<","<<lowrun<<","<<uprun<<","<<runflag<<","<<sc
150 <<validflag<<","<<stat<<",";
151
152 for (int ii = -2; ii < 35; ii++) {
153 if (ii == -2) {
154 ftube<<chi2tdc<<",";
155 } else if (ii == 0) {
156 ftube<<noise<<",";
157 } else if (ii == 4) {
158 ftube<<t0<<",";
159 } else if (ii == 5) {
160 ftube<<tmax<<",";
161 } else if (ii == 6) {
162 ftube<<slope<<",";
163 } else if (ii == 10) {
164 ftube<<t0err<<",";
165 } else if (ii == 11) {
166 ftube<<tmaxerr<<",";
167 } else if (ii == 12) {
168 ftube<<noiseerr<<",";
169 } else if (ii == 13) {
170 ftube<<sloperr<<",";
171 } else if (ii == 14) {
172 ftube<<adcm<<",";
173 } else {
174 ftube<<0.0<<",";
175 }
176 }
177 ftube<<"0,0,algoflag,tubegrpgr"<<std::endl;
178 }
179 }
180 }
181 }
182 return ftube;
183 }
184
185} // namespace MuonCalib
186
187std::ostream& operator<<(std::ostream& os, const MuonCalib::TubeDataFromFile& data) { return data.write(os); }
#define endmsg
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static Double_t sc
static Double_t t0
std::ostream & operator<<(std::ostream &os, const MuonCalib::TubeDataFromFile &data)
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
Holds single-tube full calibration information of one chamber.
Implements fixed identifiers not dependent upon Athena Identifier for internal use in the calibration...
Definition MuonFixedId.h:50
bool setTechnology(int num)
set technology to num in the fixed identifier
bool setStationEta(int num)
set station eta to num in the fixed identifier
bool setMdtTubeLayer(int num)
Mdt specific: set layer to num.
bool setStationPhi(int num)
set station phi to num in the fixed identifier
bool setMdtTube(int num)
Mdt specific: set tube to num.
unsigned int getIdInt() const
MuonFixedId mdtChamberId() const
Mdt specific: convert channel ID into MDT Chamber ID.
bool setMdtMultilayer(int num)
Mdt specific: set multilayer to num.
bool setStationName(int num)
set station name to num in the fixed identifier
static int stationStringToFixedStationNumber(const std::string &station)
Manage the I/O of MdtTubeFitContainer objects.
std::ostream & write(std::ostream &os) const
unsigned int m_regions
total number of regions
std::ostream & write_forDB(std::ostream &ftube, int mdt_head, int lowrun, int uprun) const
IMessageSvc * getMessageSvc(bool quiet=false)
CscCalcPed - algorithm that finds the Cathode Strip Chamber pedestals from an RDO.
float adcCal
quality flag for the SingleTubeCalib constants: 0 all ok, 1 no hits found, 2 too few hits,...
int statistics
< number of hits used for the fit