00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "DQM/DTMonitorModule/src/DTLocalTriggerBaseTask.h"
00011
00012
00013 #include "FWCore/Framework/interface/EventSetup.h"
00014
00015
00016 #include "DQM/DTMonitorModule/interface/DTTimeEvolutionHisto.h"
00017
00018
00019 #include "DataFormats/L1DTTrackFinder/interface/L1MuDTChambPhContainer.h"
00020 #include "DataFormats/L1DTTrackFinder/interface/L1MuDTChambThContainer.h"
00021 #include "DQM/DTMonitorModule/interface/DTTrigGeomUtils.h"
00022
00023
00024 #include "DataFormats/GeometryVector/interface/Pi.h"
00025 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00026 #include "Geometry/DTGeometry/interface/DTGeometry.h"
00027 #include "Geometry/DTGeometry/interface/DTLayer.h"
00028 #include "Geometry/DTGeometry/interface/DTTopology.h"
00029
00030
00031 #include"TH1.h"
00032 #include"TAxis.h"
00033
00034 #include <sstream>
00035 #include <iostream>
00036 #include <fstream>
00037
00038 using namespace edm;
00039 using namespace std;
00040
00041 class DTTPGCompareUnit {
00042
00043 public:
00044
00045 DTTPGCompareUnit() { theQual[0]=-1 ; theQual[1]=-1; }
00046 ~DTTPGCompareUnit() { };
00047
00048 void setDDU(int qual, int bx) { theQual[0] = qual; theBX[0] = bx; }
00049 void setDCC(int qual, int bx) { theQual[1] = qual; theBX[1] = bx; }
00050
00051 bool hasOne() const { return theQual[0]!=-1 || theQual[1]!=-1; };
00052 bool hasBoth() const { return theQual[0]!=-1 && theQual[1]!=-1; };
00053 bool hasSameQual() const { return hasBoth() && theQual[0]==theQual[1]; };
00054 int deltaBX() const { return theBX[0] - theBX[1]; }
00055 int qualDDU() const { return theQual[0]; }
00056 int qualDCC() const { return theQual[1]; }
00057
00058 private:
00059
00060 int theQual[2];
00061 int theBX[2];
00062
00063 };
00064
00065
00066
00067 DTLocalTriggerBaseTask::DTLocalTriggerBaseTask(const edm::ParameterSet& ps) :
00068 nEvents(0), nLumis(0), theTrigGeomUtils(0) {
00069
00070 LogTrace("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00071 << "[DTLocalTriggerBaseTask]: Constructor"<<endl;
00072
00073 tpMode = ps.getUntrackedParameter<bool>("testPulseMode");
00074 detailedAnalysis = ps.getUntrackedParameter<bool>("detailedAnalysis");
00075
00076 targetBXDCC = ps.getUntrackedParameter<int>("targetBXDCC");
00077 targetBXDDU = ps.getUntrackedParameter<int>("targetBXDDU");
00078 bestAccRange = ps.getUntrackedParameter<int>("bestTrigAccRange");
00079
00080 processDCC = ps.getUntrackedParameter<bool>("processDCC");
00081 processDDU = ps.getUntrackedParameter<bool>("processDDU");
00082
00083 if (processDCC) theTypes.push_back("DCC");
00084 if (processDDU) theTypes.push_back("DDU");
00085
00086 if (tpMode) {
00087 topFolder("DCC") = "DT/11-LocalTriggerTP-DCC/";
00088 topFolder("DDU") = "DT/12-LocalTriggerTP-DDU/";
00089 } else {
00090 topFolder("DCC") = "DT/03-LocalTrigger-DCC/";
00091 topFolder("DDU") = "DT/04-LocalTrigger-DDU/";
00092 }
00093
00094 theParams = ps;
00095 theDQMStore = edm::Service<DQMStore>().operator->();
00096
00097 }
00098
00099
00100 DTLocalTriggerBaseTask::~DTLocalTriggerBaseTask() {
00101
00102 LogTrace("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00103 << "[DTLocalTriggerBaseTask]: analyzed " << nEvents << " events" << endl;
00104 if (theTrigGeomUtils) { delete theTrigGeomUtils; }
00105
00106 }
00107
00108
00109 void DTLocalTriggerBaseTask::beginJob() {
00110
00111 LogTrace("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00112 << "[DTLocalTriggerBaseTask]: BeginJob" << endl;
00113
00114 }
00115
00116
00117 void DTLocalTriggerBaseTask::beginRun(const edm::Run& run, const edm::EventSetup& context) {
00118
00119 LogTrace("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00120 << "[DTLocalTriggerBaseTask]: BeginRun" << endl;
00121
00122 ESHandle<DTGeometry> theGeom;
00123 context.get<MuonGeometryRecord>().get(theGeom);
00124 theTrigGeomUtils = new DTTrigGeomUtils(theGeom);
00125
00126 theDQMStore->setCurrentFolder("DT/EventInfo/Counters");
00127 nEventMonitor = theDQMStore->bookFloat("nProcessedEventsTrigger");
00128 for (int wh=-2;wh<3;++wh){
00129 for (int stat=1;stat<5;++stat){
00130 for (int sect=1;sect<13;++sect){
00131 bookHistos(DTChamberId(wh,stat,sect));
00132 }
00133 }
00134 bookHistos(wh);
00135 }
00136
00137 }
00138
00139
00140 void DTLocalTriggerBaseTask::beginLuminosityBlock(const LuminosityBlock& lumiSeg, const EventSetup& context) {
00141
00142 nEventsInLS=0;
00143 nLumis++;
00144 int resetCycle = theParams.getUntrackedParameter<int>("ResetCycle");
00145
00146 LogTrace("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00147 << "[DTLocalTriggerBaseTask]: Begin of LS transition" << endl;
00148
00149 if( nLumis%resetCycle == 0 ) {
00150 map<uint32_t,map<string,MonitorElement*> >::const_iterator chambIt = chamberHistos.begin();
00151 map<uint32_t,map<string,MonitorElement*> >::const_iterator chambEnd = chamberHistos.end();
00152 for(;chambIt!=chambEnd;++chambIt) {
00153 map<string,MonitorElement*>::const_iterator histoIt = chambIt->second.begin();
00154 map<string,MonitorElement*>::const_iterator histoEnd = chambIt->second.end();
00155 for(;histoIt!=histoEnd;++histoIt) {
00156 histoIt->second->Reset();
00157 }
00158 }
00159 }
00160
00161 }
00162
00163 void DTLocalTriggerBaseTask::endLuminosityBlock(const LuminosityBlock& lumiSeg, const EventSetup& context) {
00164
00165 LogTrace("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00166 << "[DTLocalTriggerBaseTask]: End of LS transition" << endl;
00167
00168 map<uint32_t,DTTimeEvolutionHisto* >::const_iterator chambIt = trendHistos.begin();
00169 map<uint32_t,DTTimeEvolutionHisto* >::const_iterator chambEnd = trendHistos.end();
00170 for(;chambIt!=chambEnd;++chambIt) {
00171 chambIt->second->updateTimeSlot(lumiSeg.luminosityBlock(), nEventsInLS);
00172 }
00173
00174 }
00175
00176
00177 void DTLocalTriggerBaseTask::endJob() {
00178
00179 LogVerbatim("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00180 << "[DTLocalTriggerBaseTask]: analyzed " << nEvents << " events" << endl;
00181
00182 if (processDCC) theDQMStore->rmdir(topFolder("DCC"));
00183 if (processDDU) theDQMStore->rmdir(topFolder("DDU"));
00184
00185 }
00186
00187
00188 void DTLocalTriggerBaseTask::analyze(const edm::Event& e, const edm::EventSetup& c){
00189
00190 nEvents++;
00191 nEventsInLS++;
00192 nEventMonitor->Fill(nEvents);
00193
00194 theCompMap.clear();
00195
00196 Handle<L1MuDTChambPhContainer> phiTrigsDCC;
00197 Handle<L1MuDTChambThContainer> thetaTrigsDCC;
00198 Handle<DTLocalTriggerCollection> trigsDDU;
00199
00200 if (processDCC) {
00201 InputTag inputTagDCC = theParams.getUntrackedParameter<InputTag>("inputTagDCC");
00202
00203 e.getByLabel(inputTagDCC,phiTrigsDCC);
00204 e.getByLabel(inputTagDCC,thetaTrigsDCC);
00205
00206 if (phiTrigsDCC.isValid() && thetaTrigsDCC.isValid()) {
00207 runDCCAnalysis(phiTrigsDCC->getContainer(),thetaTrigsDCC->getContainer());
00208 } else {
00209 LogVerbatim("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00210 << "[DTLocalTriggerBaseTask]: one or more DCC handles for Input Tag "
00211 << inputTagDCC <<" not found!" << endl;
00212 return;
00213 }
00214 }
00215
00216 if (processDDU) {
00217 InputTag inputTagDDU = theParams.getUntrackedParameter<InputTag>("inputTagDDU");
00218 e.getByLabel(inputTagDDU,trigsDDU);
00219
00220 if (trigsDDU.isValid()) {
00221 runDDUAnalysis(trigsDDU);
00222 } else {
00223 LogVerbatim("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00224 << "[DTLocalTriggerBaseTask]: one or more DDU handles for Input Tag "
00225 << inputTagDDU <<" not found!" << endl;
00226 return;
00227 }
00228 }
00229
00230 if (processDCC && processDDU)
00231 runDDUvsDCCAnalysis();
00232
00233 }
00234
00235
00236 void DTLocalTriggerBaseTask::bookHistos(const DTChamberId& dtCh) {
00237
00238 uint32_t rawId = dtCh.rawId();
00239
00240 stringstream wheel; wheel << dtCh.wheel();
00241 stringstream station; station << dtCh.station();
00242 stringstream sector; sector << dtCh.sector();
00243
00244 map<string,int> minBX;
00245 map<string,int> maxBX;
00246
00247 minBX["DCC"] = theParams.getUntrackedParameter<int>("minBXDCC");
00248 maxBX["DCC"] = theParams.getUntrackedParameter<int>("maxBXDCC");
00249 minBX["DDU"] = theParams.getUntrackedParameter<int>("minBXDDU");
00250 maxBX["DDU"] = theParams.getUntrackedParameter<int>("maxBXDDU");
00251
00252 int nTimeBins = theParams.getUntrackedParameter<int>("nTimeBins");
00253 int nLSTimeBin = theParams.getUntrackedParameter<int>("nLSTimeBin");
00254
00255 string chTag = "_W" + wheel.str() + "_Sec" + sector.str() + "_St" + station.str();
00256
00257 vector<string>::const_iterator typeIt = theTypes.begin();
00258 vector<string>::const_iterator typeEnd = theTypes.end();
00259
00260 for (; typeIt!=typeEnd; ++typeIt) {
00261
00262 LogTrace("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00263 << "[DTLocalTriggerBaseTask]: booking histos for " << topFolder((*typeIt)) << "Wheel"
00264 << wheel.str() << "/Sector" << sector.str() << "/Station"<< station.str() << endl;
00265
00266
00267 theDQMStore->setCurrentFolder(topFolder(*typeIt) + "Wheel" + wheel.str() + "/Sector"
00268 + sector.str() + "/Station" + station.str() + "/LocalTriggerPhi");
00269
00270 string histoTag = (*typeIt) + "_BXvsQual";
00271 chamberHistos[rawId][histoTag] = theDQMStore->book2D(histoTag+chTag,"BX vs trigger quality",
00272 7,-0.5,6.5,(int)(maxBX[(*typeIt)]-minBX[*typeIt]+1),minBX[*typeIt]-.5,maxBX[*typeIt]+.5);
00273 setQLabels((chamberHistos[rawId])[histoTag],1);
00274
00275 if (!tpMode) {
00276 histoTag = (*typeIt) + "_BestQual";
00277 chamberHistos[rawId][histoTag] = theDQMStore->book1D(histoTag+chTag,
00278 "Trigger quality of best primitives",7,-0.5,6.5);
00279 setQLabels(chamberHistos[rawId][histoTag],1);
00280
00281 histoTag = (*typeIt) + "_Flag1stvsQual";
00282 chamberHistos[dtCh.rawId()][histoTag] = theDQMStore->book2D(histoTag+chTag,
00283 "1st/2nd trig flag vs quality",7,-0.5,6.5,2,-0.5,1.5);
00284 setQLabels(chamberHistos[rawId][histoTag],1);
00285 }
00286
00287 if (*typeIt=="DCC") {
00288 float minPh, maxPh; int nBinsPh;
00289 theTrigGeomUtils->phiRange(dtCh,minPh,maxPh,nBinsPh);
00290
00291 histoTag = (*typeIt) + "_QualvsPhirad";
00292 chamberHistos[rawId][histoTag] = theDQMStore->book2D(histoTag+chTag,
00293 "Trigger quality vs local position",nBinsPh,minPh,maxPh,7,-0.5,6.5);
00294 setQLabels(chamberHistos[rawId][histoTag],2);
00295
00296 if (detailedAnalysis && !tpMode) {
00297 histoTag == (*typeIt) + "_QualvsPhibend";
00298 chamberHistos[rawId][histoTag] = theDQMStore->book2D(histoTag+chTag,
00299 "Trigger quality vs local direction",200,-40.,40.,7,-0.5,6.5);
00300 setQLabels((chamberHistos[dtCh.rawId()])[histoTag],2);
00301 }
00302 }
00303
00304
00305 theDQMStore->setCurrentFolder(topFolder(*typeIt) + "Wheel" + wheel.str() + "/Sector"
00306 + sector.str() + "/Station" + station.str() + "/LocalTriggerTheta");
00307
00308 if((*typeIt)=="DCC") {
00309 histoTag = (*typeIt) + "_PositionvsBX";
00310 chamberHistos[rawId][histoTag] = theDQMStore->book2D(histoTag+chTag,"Theta trigger position vs BX",
00311 (int)(maxBX[(*typeIt)]-minBX[*typeIt]+1),minBX[*typeIt]-.5,maxBX[*typeIt]+.5,7,-0.5,6.5);
00312 } else {
00313 histoTag = (*typeIt) + "_ThetaBXvsQual";
00314 chamberHistos[rawId][histoTag] = theDQMStore->book2D(histoTag+chTag,"BX vs trigger quality",7,-0.5,6.5,
00315 (int)(maxBX[(*typeIt)]-minBX[*typeIt]+1),minBX[*typeIt]-.5,maxBX[*typeIt]+.5);
00316 setQLabels((chamberHistos[dtCh.rawId()])[histoTag],1);
00317
00318 histoTag = (*typeIt) + "_ThetaBestQual";
00319 chamberHistos[rawId][histoTag] = theDQMStore->book1D(histoTag+chTag,
00320 "Trigger quality of best primitives (theta)",7,-0.5,6.5);
00321 setQLabels((chamberHistos[dtCh.rawId()])[histoTag],1);
00322 }
00323
00324 }
00325
00326 if (processDCC && processDDU) {
00327
00328 theDQMStore->setCurrentFolder(topFolder("DDU") + "Wheel" + wheel.str() + "/Sector"
00329 + sector.str() + "/Station" + station.str() + "/LocalTriggerPhi");
00330
00331 string histoTag = "COM_QualDDUvsQualDCC";
00332 chamberHistos[rawId][histoTag] = theDQMStore->book2D(histoTag+chTag,
00333 "DDU quality vs DCC quality",8,-1.5,6.5,8,-1.5,6.5);
00334 setQLabels((chamberHistos[rawId])[histoTag],1);
00335 setQLabels((chamberHistos[rawId])[histoTag],2);
00336
00337 histoTag = "COM_MatchingTrend";
00338 trendHistos[rawId] = new DTTimeEvolutionHisto(&(*theDQMStore),histoTag+chTag,
00339 "Fraction of DDU-DCC matches w.r.t. proc evts",
00340 nTimeBins,nLSTimeBin,true,0);
00341 }
00342
00343 }
00344
00345 void DTLocalTriggerBaseTask::bookHistos(int wh) {
00346
00347 stringstream wheel; wheel << wh;
00348 theDQMStore->setCurrentFolder(topFolder("DDU") + "Wheel" + wheel.str() + "/");
00349 string whTag = "_W" + wheel.str();
00350
00351 LogTrace("DTDQM|DTMonitorModule|DTLocalTriggerBaseTask")
00352 << "[DTLocalTriggerBaseTask]: booking wheel histos for "
00353 << topFolder("DDU") << "Wheel" << wh << endl;
00354
00355 string histoTag = "COM_BXDiff";
00356 MonitorElement *me = theDQMStore->bookProfile2D(histoTag+whTag,
00357 "DDU-DCC BX Difference",12,1,13,4,1,5,0.,20.);
00358 me->setAxisTitle("Sector",1);
00359 me->setAxisTitle("station",2);
00360 wheelHistos[wh][histoTag] = me;
00361
00362 }
00363
00364
00365 void DTLocalTriggerBaseTask::runDCCAnalysis( std::vector<L1MuDTChambPhDigi>* phTrigs,
00366 std::vector<L1MuDTChambThDigi>* thTrigs ){
00367
00368 vector<L1MuDTChambPhDigi>::const_iterator iph = phTrigs->begin();
00369 vector<L1MuDTChambPhDigi>::const_iterator iphe = phTrigs->end();
00370
00371 for(; iph !=iphe ; ++iph) {
00372
00373 int wh = iph->whNum();
00374 int sec = iph->scNum() + 1;
00375 int st = iph->stNum();
00376 int qual = iph->code();
00377 int is1st = iph->Ts2Tag() ? 1 : 0;
00378 int bx = iph->bxNum() - is1st;
00379
00380 if (qual <0 || qual>6) continue;
00381
00382 DTChamberId dtChId(wh,st,sec);
00383 uint32_t rawId = dtChId.rawId();
00384
00385 float pos = theTrigGeomUtils->trigPos(&(*iph));
00386 float dir = theTrigGeomUtils->trigDir(&(*iph));
00387
00388 if (abs(bx-targetBXDCC)<= bestAccRange &&
00389 theCompMap[rawId].qualDCC() <= qual)
00390 theCompMap[rawId].setDCC(qual,bx);
00391
00392 map<string, MonitorElement*> &innerME = chamberHistos[rawId];
00393 if (tpMode) {
00394 innerME["DCC_BXvsQual"]->Fill(qual,bx);
00395 innerME["DCC_QualvsPhirad"]->Fill(pos,qual);
00396 } else {
00397 innerME["DCC_BXvsQual"]->Fill(qual,bx);
00398 innerME["DCC_Flag1stvsQual"]->Fill(qual,is1st);
00399 if (!is1st) innerME["DCC_QualvsPhirad"]->Fill(pos,qual);
00400 if (detailedAnalysis) {
00401 innerME["DCC_QualvsPhibend"]->Fill(dir,qual);
00402 }
00403 }
00404
00405 }
00406
00407 vector<L1MuDTChambThDigi>::const_iterator ith = thTrigs->begin();
00408 vector<L1MuDTChambThDigi>::const_iterator ithe = thTrigs->end();
00409
00410 for(; ith != ithe; ++ith) {
00411 int wh = ith->whNum();
00412 int sec = ith->scNum() + 1;
00413 int st = ith->stNum();
00414 int bx = ith->bxNum();
00415
00416 int thcode[7];
00417
00418 for (int pos=0; pos<7; pos++)
00419 thcode[pos] = ith->code(pos);
00420
00421 DTChamberId dtChId(wh,st,sec);
00422 uint32_t rawId = dtChId.rawId();
00423
00424 map<string, MonitorElement*> &innerME = chamberHistos[rawId];
00425
00426 for (int pos=0; pos<7; pos++)
00427 if (thcode[pos])
00428 innerME["DCC_PositionvsBX"]->Fill(bx,pos);
00429
00430 }
00431
00432
00433 if (!tpMode) {
00434 map<uint32_t,DTTPGCompareUnit>::const_iterator compIt = theCompMap.begin();
00435 map<uint32_t,DTTPGCompareUnit>::const_iterator compEnd = theCompMap.end();
00436 for (; compIt!=compEnd; ++compIt) {
00437 int bestQual = compIt->second.qualDCC();
00438 if (bestQual > -1)
00439 chamberHistos[compIt->first]["DCC_BestQual"]->Fill(bestQual);
00440 }
00441 }
00442
00443 }
00444
00445
00446 void DTLocalTriggerBaseTask::runDDUAnalysis(Handle<DTLocalTriggerCollection>& trigsDDU){
00447
00448 DTLocalTriggerCollection::DigiRangeIterator detUnitIt = trigsDDU->begin();
00449 DTLocalTriggerCollection::DigiRangeIterator detUnitEnd = trigsDDU->end();
00450
00451 for (; detUnitIt!=detUnitEnd; ++detUnitIt){
00452
00453 const DTChamberId& chId = (*detUnitIt).first;
00454 uint32_t rawId = chId.rawId();
00455
00456 const DTLocalTriggerCollection::Range& range = (*detUnitIt).second;
00457 DTLocalTriggerCollection::const_iterator trigIt = range.first;
00458 map<string, MonitorElement*> &innerME = chamberHistos[rawId];
00459
00460 int bestQualTheta = -1;
00461
00462 for (; trigIt!=range.second; ++trigIt){
00463
00464 int qualPhi = trigIt->quality();
00465 int qualTheta = trigIt->trTheta();
00466 int flag1st = trigIt->secondTrack() ? 1 : 0;
00467 int bx = trigIt->bx();
00468 int bxPhi = bx - flag1st;
00469
00470 if( qualPhi>-1 && qualPhi<7 ) {
00471 if (abs(bx-targetBXDDU) <= bestAccRange &&
00472 theCompMap[rawId].qualDDU()<= qualPhi)
00473 theCompMap[rawId].setDDU(qualPhi,bxPhi);
00474 if(tpMode) {
00475 innerME["DDU_BXvsQual"]->Fill(qualPhi,bxPhi);
00476 } else {
00477 innerME["DDU_BXvsQual"]->Fill(qualPhi,bxPhi);
00478 innerME["DDU_Flag1stvsQual"]->Fill(qualPhi,flag1st);
00479 }
00480 }
00481
00482 if( qualTheta>0 && !tpMode ){
00483 if (qualTheta > bestQualTheta){
00484 bestQualTheta = qualTheta;
00485 }
00486 innerME["DDU_ThetaBXvsQual"]->Fill(qualTheta,bx);
00487 }
00488 }
00489
00490
00491 if (!tpMode && theCompMap.find(rawId)!= theCompMap.end()) {
00492 int bestQualPhi = theCompMap[rawId].qualDDU();
00493 if (bestQualPhi>-1)
00494 innerME["DDU_BestQual"]->Fill(bestQualPhi);
00495 if(bestQualTheta>0) {
00496 innerME["DDU_ThetaBestQual"]->Fill(bestQualTheta);
00497 }
00498 }
00499 }
00500
00501 }
00502
00503
00504 void DTLocalTriggerBaseTask::runDDUvsDCCAnalysis(){
00505
00506 map<uint32_t,DTTPGCompareUnit>::const_iterator compIt = theCompMap.begin();
00507 map<uint32_t,DTTPGCompareUnit>::const_iterator compEnd = theCompMap.end();
00508
00509 for (; compIt!=compEnd; ++compIt) {
00510
00511 uint32_t rawId = compIt->first;
00512 DTChamberId chId(rawId);
00513 map<string, MonitorElement*> &innerME = chamberHistos[rawId];
00514
00515 const DTTPGCompareUnit & compUnit = compIt->second;
00516 if ( compUnit.hasOne() ){
00517 innerME["COM_QualDDUvsQualDCC"]->Fill(compUnit.qualDCC(),compUnit.qualDDU());
00518 }
00519 if ( compUnit.hasBoth() ){
00520 wheelHistos[chId.wheel()]["COM_BXDiff"]->Fill(chId.sector(),chId.station(),compUnit.deltaBX());
00521 if ( compUnit.hasSameQual() ) {
00522 trendHistos[rawId]->accumulateValueTimeSlot(1);
00523 }
00524 }
00525 }
00526
00527 }
00528
00529
00530 void DTLocalTriggerBaseTask::setQLabels(MonitorElement* me, short int iaxis){
00531
00532 TH1* histo = me->getTH1();
00533 if (!histo) return;
00534
00535 TAxis* axis=0;
00536 if (iaxis==1) {
00537 axis=histo->GetXaxis();
00538 }
00539 else if(iaxis==2) {
00540 axis=histo->GetYaxis();
00541 }
00542 if (!axis) return;
00543
00544 string labels[7] = {"LI","LO","HI","HO","LL","HL","HH"};
00545 int istart = axis->GetXmin()<-1 ? 2 : 1;
00546 for (int i=0;i<7;i++) {
00547 axis->SetBinLabel(i+istart,labels[i].c_str());
00548 }
00549
00550 }