00001
00002
00003
00004
00005
00006
00007
00008 #include "event/ChannelHit.hh"
00009 #include "event/Event.hh"
00010 #include "event/Run.hh"
00011 #include "geometry/Chip.hh"
00012 #include "geometry/Dif.hh"
00013 #include "geometry/Board.hh"
00014 #include "geometry/Chamber.hh"
00015 #include "geometry/Detector.hh"
00016 #include "geometry/Channel.hh"
00017
00018 #include "tools/MicroException.hh"
00019 #include "tools/Log.hh"
00020 #include "slowControl/SlowControlEntry.hh"
00021 #include "slowControl/ChamberSlowControl.hh"
00022
00023
00024 #include <string>
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 using namespace std;
00072
00073
00074 std::ostream& operator <<(std::ostream &out, const Event &x) {
00075 return(x.operator <<(out));
00076 }
00077
00078
00079 Event::Event(Run& aRun):run(aRun), slowControlEntry(NULL)
00080 {
00081
00082
00083 timestamp = 0;
00084 difSynchro = 0;
00085 id = 0;
00086 slowControlEntry = NULL;
00087 crcIsCorrect = true;
00088 valid = VALID;
00089 }
00090
00091 Event::Event(Run& aRun, i64 aTimestamp, i32 aId):run(aRun), timestamp(aTimestamp), id(aId), slowControlEntry(NULL)
00092 {
00093 timestamp = 0;
00094 difSynchro = 0;
00095 id = 0;
00096 slowControlEntry = NULL;
00097 crcIsCorrect = true;
00098 valid = VALID;
00099
00100 }
00101
00102 Event::~Event()
00103 {
00104
00105
00106 map<ui16, multiset<ChannelHit*,sorter>* >::iterator iter;
00107
00108 for (iter=channelHits.begin(); iter!=channelHits.end(); iter++)
00109 {
00110 multiset<ChannelHit*,sorter>* list = (*iter).second;
00111 for (multiset<ChannelHit*,sorter>::iterator iterList = list->begin(); iterList!=list->end(); iterList++ )
00112 {
00113 delete (*iterList);
00114 }
00115 delete list;
00116 }
00117
00118 }
00119
00120
00121 ostream& Event::operator <<(ostream &out) const {
00122 return(out << "-Event id["<< id << "]" << endl
00123 << "-Event timestamp[" << timestamp << "]" << endl);
00124 }
00125
00126
00127 void Event::initChannelHitVector()
00128 {
00129 ChamberMap_t chambers = this->run.getDetector().getChambers();
00130
00131 for (ChamberMap_t::iterator iter = chambers.begin() ; iter != chambers.end() ; iter++)
00132 {
00133 i32 chamberId = (*iter).first;
00134 multiset<ChannelHit*, sorter> *list = new multiset<ChannelHit*, sorter>();
00135 FILE_LOG(logINFO) << "INIT map size BEFORE INSERT:[" << channelHits.size() << "]" << endl;
00136 channelHits[chamberId] = list;
00137 FILE_LOG(logINFO) << "INIT map size AFTER INSERT:[" << channelHits.size() << "]" << endl;
00138 }
00139 }
00140
00141 const multiset<ChannelHit*,sorter>& Event::getChannelHitVector(const Chamber& aChamber) const
00142 {
00143
00144 map<ui16, multiset<ChannelHit*,sorter>* >::const_iterator iter = channelHits.find(aChamber.getId());
00145 if( iter != channelHits.end() ) {
00146 return (*iter->second);
00147 }
00148
00149 throw ( MicroException("No channelHit vector for this chamber"));
00150
00151 }
00152
00153 void Event::insertHit(Chamber& aChamber, ChannelHit *aChannelHit)
00154 {
00155 ui16 chamberId = aChamber.getId();
00156
00157 multiset<ChannelHit*,sorter>* hits = NULL;
00158
00159 map<ui16, multiset<ChannelHit*,sorter> *>::iterator iter = channelHits.find(chamberId);
00160
00161 if( iter == channelHits.end() ) {
00162 hits = new multiset<ChannelHit*, sorter>();
00163 channelHits.insert(pair<i32, multiset<ChannelHit*,sorter>* > (chamberId,hits));
00164 }
00165
00166 else
00167 {
00168 hits = iter->second;
00169 }
00170
00171 hits->insert(aChannelHit);
00172
00173
00174 }
00175
00176
00177 const ChannelHit& Event::getChannelHitByOrder( ui64 order ,const Chamber& aChamber, i16 aThreshold)
00178 {
00179 if ( getChannelHitByOrder(order+1,aChamber).getAnalogValue() <= aThreshold )
00180 {
00181 return getChannelHitByOrder(order,aChamber);
00182 }
00183 else
00184 {
00185 throw MicroException("No Channel respond for this event, this order, this threshold and this chamber ");
00186 }
00187 }
00188
00189
00190 const ChannelHit& Event::getChannelHitByOrder(ui64 order ,const Chamber& aChamber)
00191 {
00192 multiset<ChannelHit*,sorter>* chamberChannelHit = this->channelHits.find(aChamber.getId())->second;
00193 ui64 items=0;
00194
00195 for (multiset<ChannelHit*,sorter>::const_iterator iter=chamberChannelHit->begin(); iter!=chamberChannelHit->end(); iter++)
00196 {
00197 if ( (*iter)->getChannel().getChamber().getId() == aChamber.getId() )
00198 {
00199 if ( order == items)
00200 {
00201 return *(*iter);
00202 }
00203
00204 items++;
00205 }
00206
00207 }
00208 throw MicroException("No Channel respond or this event, this order and this chamber ");
00209
00210 }
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237 void Event::setSlowControlParam(const SlowControlEntry* params)
00238 {
00239 slowControlEntry = params;
00240 FILE_LOG(logDEBUG1) << "Event temperature["<< slowControlEntry->getTemperature() << "]" << endl;
00241 FILE_LOG(logDEBUG1) << "Event overPressure["<< slowControlEntry->getOverPressure() << "]" << endl;
00242 FILE_LOG(logDEBUG1) << "Event Pressure["<< slowControlEntry->getPressure() << "]" << endl;
00243 }
00244
00245
00246
00247 void Event::print(void) const
00248 {
00249 FILE_LOG(logINFO) << "-Event id["<< id << "]" << endl;
00250 FILE_LOG(logINFO) << "-Event timestamp[" << timestamp << "]" << endl ;
00251 }
00252
00253
00254 const float Event::getPressure() const
00255 {
00256 if ( slowControlEntry != NULL)
00257 {
00258 return slowControlEntry->getPressure();
00259 }
00260 else
00261 {
00262 return 0;
00263 }
00264
00265 }
00266
00267 const float Event::getTemperature() const
00268 {
00269 if ( slowControlEntry != NULL)
00270 {
00271 return slowControlEntry->getTemperature();
00272 }
00273 else
00274 {
00275 return 0;
00276 }
00277
00278 }
00279
00280 const BoardSlowControl& Event::getBoardSlowControl(const ui32 chamberId,const ui32 difId, const ui32 boardId) const
00281 {
00282 if ( slowControlEntry != NULL)
00283 {
00284 try
00285 {
00286 return slowControlEntry->getBoard(chamberId,difId,boardId);
00287 }
00288 catch ( MicroException e) {}
00289 }
00290
00291 throw MicroException("Event::getBoardSlowControl: board not found");
00292 }
00293
00294 const float Event::getBoardDriftVolt(const ui32 chamberId,const ui32 difId, const ui32 boardId) const
00295 {
00296 if ( slowControlEntry != NULL)
00297 {
00298 try
00299 {
00300 return slowControlEntry->getBoard(chamberId,difId,boardId).getDrift().voltage;
00301 }
00302 catch ( MicroException e) {}
00303 }
00304 throw MicroException("Event::getBoardSlowControl: board not found");
00305
00306 }
00307
00308 const float Event::getBoardMeshVolt(const ui32 chamberId,const ui32 difId, const ui32 boardId) const
00309 {
00310 if ( slowControlEntry != NULL)
00311 {
00312 try
00313 {
00314 return slowControlEntry->getBoard(chamberId,difId,boardId).getMesh().voltage;
00315 }
00316 catch ( MicroException e) {}
00317 }
00318
00319 return -1;
00320
00321 }
00322
00323 ui64 Event::getChannelHitSize() const
00324 {
00325 ui64 size = 0;
00326 for ( std::map<ui16, std::multiset<ChannelHit*,sorter>* >::const_iterator it=channelHits.begin(); it != channelHits.end() ; it++)
00327 {
00328 size +=it->second->size();
00329 }
00330 return size;
00331 }
00332
00333
00334 void Event::setTemperature(ui16 difId, float asu1, float asu2, float dif)
00335 {
00336
00337 if ( temperatureAsu1.find(difId) != temperatureAsu1.end())
00338 {
00339 temperatureAsu1[difId] = asu1;
00340 }
00341 else
00342 {
00343 temperatureAsu1.insert(make_pair(difId,asu1));
00344 }
00345
00346 if ( temperatureAsu2.find(difId) != temperatureAsu2.end())
00347 {
00348 temperatureAsu2[difId] = asu2;
00349 }
00350 else
00351 {
00352 temperatureAsu2.insert(make_pair(difId,asu2));
00353 }
00354
00355 if ( temperatureDif.find(difId) != temperatureDif.end())
00356 {
00357 temperatureDif[difId] = dif;
00358 }
00359 else
00360 {
00361 temperatureDif.insert(make_pair(difId,dif));
00362 }
00363
00364 }
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492 bool Event::isValid(void)
00493 {
00494 if (( valid & VALID ) == VALID) return true;
00495 return false;
00496 }
00497
00498
00499 void Event::setValidFlag(ui16 value,bool isValid)
00500 {
00501 valid = valid | value;
00502 if ( ! isValid ) { valid = valid & 0xFFFE ; }
00503 }
00504
00505 string Event::getValidFlagString(void ) const
00506 {
00507 string result;
00508 if ( (valid & VALID ) == VALID ) { result = result + " " + "VALID" ;}
00509 if ( (valid & UNKNOW_NOT_VALID ) == UNKNOW_NOT_VALID ) { result = result + " " + "UNKNOW_NOT_VALID" ;}
00510 if ( (valid & BAD_CHIP_ID ) == BAD_CHIP_ID ) { result = result + " " + "BAD_CHIP_ID" ;}
00511 if ( (valid & BAD_BOARD_ID ) == BAD_BOARD_ID ) { result = result + " " + "BAD_BOARD_ID" ;}
00512 if ( (valid & BAD_DIF_ID ) == BAD_DIF_ID ) { result = result + " " + "BAD_DIF_ID" ;}
00513 if ( (valid & CRC_ERROR ) == CRC_ERROR ) { result = result + " " + "CRC_ERROR" ;}
00514 if ( (valid & ONLY_FFFF) == ONLY_FFFF ) { result = result + " " + "ONLY_FFFF" ;}
00515 if ( (valid & ONLY_AAAA) == ONLY_AAAA ) { result = result + " " + "ONLY_AAAA" ;}
00516 if ( (valid & ONLY_5555) == ONLY_5555 ) { result = result + " " + "ONLY_5555" ;}
00517 if ( (valid & GLOBAL_HEADER_ERROR) == GLOBAL_HEADER_ERROR ) { result = result + " " + "GLOBAL_HEADER_ERROR" ;}
00518 if ( (valid & FRAME_HEADER_ERROR) == FRAME_HEADER_ERROR ) { result = result + " " + "FRAME_HEADER_ERROR" ;}
00519 if ( (valid & TRAILER_C3_FOUND) == TRAILER_C3_FOUND ) { result = result + " " + "TRAILER_C3_FOUND" ;}
00520 if ( (valid & END_OF_FILE_ERROR) == END_OF_FILE_ERROR ) { result = result + " " + "END_OF_FILE_ERROR" ;}
00521
00522
00523 return result;
00524 }
00525