14
14
* along with MAUS. If not, see <http://www.gnu.org/licenses/>.
17
18
#include "src/common_cpp/DataStructure/MCEvent.hh"
18
19
#include "src/common_cpp/DataStructure/ReconEvent.hh"
19
20
#include "src/common_cpp/JsonCppProcessors/SpillProcessor.hh"
20
21
#include "src/map/MapCppTrackerMCDigitization/MapCppTrackerMCDigitization.hh"
21
22
#include "src/common_cpp/Recon/SciFi/SciFiLookup.hh"
23
#include "src/common_cpp/API/PyWrapMapBase.hh"
26
PyMODINIT_FUNC init_MapCppTrackerMCDigitization(void) {
27
PyWrapMapBase<MAUS::MapCppTrackerMCDigitization>::PyWrapMapBaseModInit
28
("MapCppTrackerMCDigitization", "", "", "", "");
25
31
MapCppTrackerMCDigitization::MapCppTrackerMCDigitization()
26
: _spill_json(NULL), _spill_cpp(NULL) {
32
: MapBase<Data>("MapCppTrackerMCDigitization") {
29
35
MapCppTrackerMCDigitization::~MapCppTrackerMCDigitization() {
30
if (_spill_json != NULL) {
33
if (_spill_cpp != NULL) {
38
bool MapCppTrackerMCDigitization::birth(std::string argJsonConfigDocument) {
39
_classname = "MapCppTrackerMCDigitization";
42
if (!Globals::HasInstance()) {
43
GlobalsManager::InitialiseGlobals(argJsonConfigDocument);
45
static MiceModule* mice_modules = Globals::GetMonteCarloMiceModules();
46
modules = mice_modules->findModulesByPropertyString("SensitiveDetector", "SciFi");
47
Json::Value *json = Globals::GetConfigurationCards();
49
_SciFiNPECut = (*json)["SciFiNoiseNPECut"].asDouble();
50
_SciFivlpcEnergyRes = (*json)["SciFivlpcEnergyRes"].asDouble();
51
_SciFiadcFactor = (*json)["SciFiadcFactor"].asDouble();
52
_SciFitdcBits = (*json)["SciFitdcBits"].asDouble();
53
_SciFivlpcTimeRes = (*json)["SciFivlpcTimeRes"].asDouble();
54
_SciFitdcFactor = (*json)["SciFitdcFactor"].asDouble();
55
_SciFiFiberConvFactor = (*json)["SciFiFiberConvFactor"].asDouble();
56
_SciFiFiberTrappingEff = (*json)["SciFiFiberTrappingEff"].asDouble();
57
_SciFiFiberMirrorEff = (*json)["SciFiFiberMirrorEff"].asDouble();
58
_SciFivlpcQE = (*json)["SciFivlpcQE"].asDouble();
59
_SciFiFiberTransmissionEff = (*json)["SciFiFiberTransmissionEff"].asDouble();
60
_SciFiMUXTransmissionEff = (*json)["SciFiMUXTransmissionEff"].asDouble();
61
_eV_to_phe = _SciFiFiberConvFactor *
62
_SciFiFiberTrappingEff *
63
( 1.0 + _SciFiFiberMirrorEff ) *
64
_SciFiFiberTransmissionEff *
65
_SciFiMUXTransmissionEff *
67
// ______________________________________________
69
} catch (Exception& exception) {
70
MAUS::CppErrorHandler::getInstance()->HandleExceptionNoJson(exception, _classname);
71
} catch (std::exception& exc) {
72
MAUS::CppErrorHandler::getInstance()->HandleStdExcNoJson(exc, _classname);
77
bool MapCppTrackerMCDigitization::death() {
81
std::string MapCppTrackerMCDigitization::process(std::string document) {
82
Json::FastWriter writer;
84
// Set up a spill object, then continue only if MC event array is initialised
85
read_in_json(document);
86
Spill& spill = *_spill_cpp;
88
if ( spill.GetMCEvents() ) {
90
std::cerr << "MC event array not initialised, aborting digitisation for this spill\n";
91
MAUS::ErrorsMap errors = _spill_cpp->GetErrors();
93
ss << _classname << " says:" << "MC event array not initialised, aborting digitisation";
94
errors["missing_branch"] = ss.str();
96
return writer.write(*_spill_json);
38
void MapCppTrackerMCDigitization::_birth(const std::string& argJsonConfigDocument) {
39
if (!Globals::HasInstance()) {
40
GlobalsManager::InitialiseGlobals(argJsonConfigDocument);
42
static MiceModule* mice_modules = Globals::GetMonteCarloMiceModules();
43
modules = mice_modules->findModulesByPropertyString("SensitiveDetector", "SciFi");
44
Json::Value *json = Globals::GetConfigurationCards();
46
_SciFiNPECut = (*json)["SciFiNoiseNPECut"].asDouble();
47
_SciFivlpcEnergyRes = (*json)["SciFivlpcEnergyRes"].asDouble();
48
_SciFiadcFactor = (*json)["SciFiadcFactor"].asDouble();
49
_SciFitdcBits = (*json)["SciFitdcBits"].asDouble();
50
_SciFivlpcTimeRes = (*json)["SciFivlpcTimeRes"].asDouble();
51
_SciFitdcFactor = (*json)["SciFitdcFactor"].asDouble();
52
_SciFiFiberConvFactor = (*json)["SciFiFiberConvFactor"].asDouble();
53
_SciFiFiberTrappingEff = (*json)["SciFiFiberTrappingEff"].asDouble();
54
_SciFiFiberMirrorEff = (*json)["SciFiFiberMirrorEff"].asDouble();
55
_SciFivlpcQE = (*json)["SciFivlpcQE"].asDouble();
56
_SciFiFiberTransmissionEff = (*json)["SciFiFiberTransmissionEff"].asDouble();
57
_SciFiMUXTransmissionEff = (*json)["SciFiMUXTransmissionEff"].asDouble();
58
_eV_to_phe = _SciFiFiberConvFactor *
59
_SciFiFiberTrappingEff *
60
( 1.0 + _SciFiFiberMirrorEff ) *
61
_SciFiFiberTransmissionEff *
62
_SciFiMUXTransmissionEff *
66
void MapCppTrackerMCDigitization::_death() {
69
void MapCppTrackerMCDigitization::_process(MAUS::Data* data) const {
70
Spill& spill = *(data->GetSpill());
72
if (!spill.GetMCEvents()) {
73
throw MAUS::Exception(Exception::recoverable,
74
"MC event array not initialised.",
75
"MapCppTrackerMCDigitization::process");
99
78
// ================= Reconstruction =========================
129
112
spill.GetReconEvents()->push_back(revt);
132
// ==========================================================
134
return writer.write(*_spill_json);
137
void MapCppTrackerMCDigitization::read_in_json(std::string json_data) {
138
Json::FastWriter writer;
139
Json::Value json_root;
140
if (_spill_cpp != NULL) {
146
json_root = JsonWrapper::StringToJson(json_data);
147
SpillProcessor spill_proc;
148
_spill_cpp = spill_proc.JsonToCpp(json_root);
150
Squeak::mout(Squeak::error) << "Bad json document" << std::endl;
151
_spill_cpp = new Spill();
152
MAUS::ErrorsMap errors = _spill_cpp->GetErrors();
153
std::stringstream ss;
154
ss << _classname << " says:" << reader.getFormatedErrorMessages();
155
errors["bad_json_document"] = ss.str();
156
_spill_cpp->GetErrors();
160
117
void MapCppTrackerMCDigitization::construct_digits(SciFiHitArray *hits, int spill_num,
161
int event_num, SciFiDigitPArray &digits) {
118
int event_num, SciFiDigitPArray &digits) const {
162
119
SciFiLookup lookup;
163
120
for ( unsigned int hit_i = 0; hit_i < hits->size(); hit_i++ ) {
164
121
if ( !hits->at(hit_i).GetChannelId()->GetUsed() ) {
199
156
} // ends loop over all the array
201
158
a_digit->set_npe(nPE);
203
// .start. TO BE REMOVED .start.//
204
ThreeVector position = a_hit->GetPosition();
205
ThreeVector momentum = a_hit->GetMomentum();
206
a_digit->set_true_position(position);
207
a_digit->set_true_momentum(momentum);
208
// .end. TO BE REMOVED .end.//
210
159
digits.push_back(a_digit);
212
161
} // ends 'for' loop over hits
215
164
void MapCppTrackerMCDigitization::add_noise(SciFiNoiseHitArray *noises,
216
SciFiDigitPArray &digits) {
165
SciFiDigitPArray &digits) const {
218
167
/**************************************************************************
219
168
* Function checks which channel has noise against which channel has a
220
169
* digit. If noise is in the same channel as a digit then the noise is
221
* added to the digit. If the noise is removed from the digit by one
222
* channel, then a new digit is created.
223
* Regardless, if noise is over the NPE cut off, 2 NPE, then a new digit
170
* added to the digit, else noise is added as a new digit.
225
171
**************************************************************************/
229
for (unsigned int j = 0; j < noises->size(); j++) {
230
for (unsigned int i = 0; i < digits.size(); i++) {
232
// Checks if noise is in the same channel as a digit
233
if (digits[i]->get_tracker() == noises->at(j).GetTracker() &&
234
digits[i]->get_station() == noises->at(j).GetStation() &&
235
digits[i]->get_plane() == noises->at(j).GetPlane() &&
236
digits[i]->get_channel() == noises->at(j).GetChannel() &&
237
noises->at(j).GetUsed() == false) {
238
double digit_npe = digits[i]->get_npe();
239
double noise_npe = noises->at(j).GetNPE();
240
digits[i]->set_npe(digit_npe + noise_npe);
241
noises->at(j).SetUsed(true);
242
noises->at(j).SetID(static_cast<double>(lookup.get_digit_id(digits[i])));
245
// Checks if noise is one channel removed from a digit
246
} else if (digits[i]->get_tracker() == noises->at(j).GetTracker() &&
247
digits[i]->get_station() == noises->at(j).GetStation() &&
248
digits[i]->get_plane() == noises->at(j).GetPlane() &&
249
abs(digits[i]->get_channel() - noises->at(j).GetChannel()) <= 1.0 &&
250
noises->at(j).GetUsed() == false) {
251
SciFiNoiseHit a_noise = noises->at(j);
252
SciFiDigit* a_digit = new SciFiDigit(a_noise.GetSpill(), a_noise.GetEvent(),
253
a_noise.GetTracker(), a_noise.GetStation(), a_noise.GetPlane(),
254
a_noise.GetChannel(), a_noise.GetNPE(), a_noise.GetTime());
255
digits.push_back(a_digit);
256
noises->at(j).SetUsed(true);
257
noises->at(j).SetID(static_cast<double>(lookup.get_digit_id(a_digit)));
262
// Checks if noise is above NPE cutoff
263
if (noises->at(j).GetNPE() >= _SciFiNPECut &&
264
noises->at(j).GetUsed() == false) {
265
SciFiNoiseHit a_noise = noises->at(j);
266
SciFiDigit* a_digit = new SciFiDigit(a_noise.GetSpill(), a_noise.GetEvent(),
267
a_noise.GetTracker(), a_noise.GetStation(),
268
a_noise.GetPlane(), a_noise.GetChannel(),
269
a_noise.GetNPE(), a_noise.GetTime());
173
std::map<int, int> digit_map;
174
for (size_t digit_i = 0; digit_i < digits.size(); digit_i++) {
175
int track_id = digits.at(digit_i)->get_tracker();
176
int stat_id = digits.at(digit_i)->get_station();
177
int plane_id = digits.at(digit_i)->get_plane();
178
int chan_id = digits.at(digit_i)->get_channel();
179
int key = chan_id + 1000*plane_id + 10000*stat_id + 100000*track_id;
180
digit_map[key] = digit_i;
182
for (size_t noise_j = 0; noise_j < noises->size(); noise_j++) {
183
int track_id = noises->at(noise_j).GetTracker();
184
int stat_id = noises->at(noise_j).GetStation();
185
int plane_id = noises->at(noise_j).GetPlane();
186
int chan_id = noises->at(noise_j).GetChannel();
187
int key = chan_id + 1000*plane_id + 10000*stat_id + 100000*track_id;
189
if (digit_map.find(key) != digit_map.end()) {
190
double digit_npe = digits.at(digit_map[key])->get_npe();
191
double noise_npe = noises->at(noise_j).GetNPE();
192
digits.at(digit_map[key])->set_npe(digit_npe + noise_npe);
194
SciFiDigit* a_digit = new SciFiDigit(noises->at(noise_j).GetSpill(),
195
noises->at(noise_j).GetEvent(),
196
noises->at(noise_j).GetTracker(),
197
noises->at(noise_j).GetStation(),
198
noises->at(noise_j).GetPlane(),
199
noises->at(noise_j).GetChannel(),
200
noises->at(noise_j).GetNPE(),
201
noises->at(noise_j).GetTime());
270
202
digits.push_back(a_digit);
271
noises->at(j).SetUsed(true);
272
noises->at(j).SetID(static_cast<double>(lookup.get_digit_id(a_digit)));
277
int MapCppTrackerMCDigitization::compute_tdc_counts(double time1) {
207
int MapCppTrackerMCDigitization::compute_tdc_counts(double time1) const {
278
208
double tmpcounts;
280
210
tmpcounts = CLHEP::RandGauss::shoot(time1, _SciFivlpcTimeRes)*_SciFitdcFactor;