diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXAlgos/src/jFexEmulatedTowers.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXAlgos/src/jFexEmulatedTowers.cxx index bfe0b386dc72d5a812e9b5cfd5e26aef27a22394..88046adf29ceeef86b48bff4d6185f757df01ab3 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXAlgos/src/jFexEmulatedTowers.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXAlgos/src/jFexEmulatedTowers.cxx @@ -135,6 +135,7 @@ StatusCode jFexEmulatedTowers::execute(const EventContext& ctx) const { } float Total_Et = 0; + unsigned int countMasked = 0; for (auto const& SCellID : it_TTower2SCells->second ) { //check that the SCell Identifier exists in the map @@ -150,6 +151,7 @@ StatusCode jFexEmulatedTowers::execute(const EventContext& ctx) const { if( (myCell->provenance() >> 7 & 0x1) and m_apply_masking ) { //if masked then Et = 0 et = 0.0; + countMasked++; } if(myCell->quality() == 1){ @@ -160,7 +162,7 @@ StatusCode jFexEmulatedTowers::execute(const EventContext& ctx) const { } - Total_Et_encoded = jFEXCompression::Compress( Total_Et ); + Total_Et_encoded = jFEXCompression::Compress( Total_Et, countMasked == (it_TTower2SCells->second).size() ? true : false ); } else{ diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXAlgos/src/jFexTower2SCellDecorator.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXAlgos/src/jFexTower2SCellDecorator.cxx index 65bb16bf99e44e684158df9e0e798fef51735fcd..a841ca7d910beb817f6ada85143e5f4b6d9d6fd9 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXAlgos/src/jFexTower2SCellDecorator.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXAlgos/src/jFexTower2SCellDecorator.cxx @@ -194,8 +194,15 @@ StatusCode jFexTower2SCellDecorator::execute(const EventContext& ctx) const { for(const auto& tmpet : scEt){ tmpSCellEt += tmpet; } + + //How many SCell are masked? if all then send invalid code + unsigned int count_scMask =0; + for(const auto& masked : scMask){ + if(masked) count_scMask++; + } + SCellEt = tmpSCellEt; - jFexEtencoded = jFEXCompression::Compress( tmpSCellEt ); + jFexEtencoded = jFEXCompression::Compress( tmpSCellEt, count_scMask == scMask.size() ? true : false ); jFexEt = jFEXCompression::Expand( jTower->jTowerEt() ); } else if(source == 1){ diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXCompression.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXCompression.h index 9dd8655f462d2f894a71fe751144c4b6a5779d68..bddb2c219ff1bdf20d5bf9ee57cf3bb644205da2 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXCompression.h +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/jFEXCompression.h @@ -31,7 +31,7 @@ class jFEXCompression { public: /** Compress data */ - static unsigned int Compress(float floatEt); + static unsigned int Compress(float floatEt, bool empty = false); /** Uncompress data */ static int Expand(unsigned int code); /** Apply threshold to compressed data */ diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXCompression.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXCompression.cxx index a322e5021b1523500726961a8ac7f4556f0ed9c3..db8365057c1a70abe6c516037c5387bcc71880aa 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXCompression.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXCompression.cxx @@ -17,7 +17,10 @@ const int jFEXCompression::s_steps[] = {25, 50, 100, 200, 400}; const int jFEXCompression::s_minET[] = {-3150, 6400, 25600, 102400, 409600}; const int jFEXCompression::s_minCode[] = {2, 384, 768, 1536, 3072}; -unsigned int jFEXCompression::Compress(float floatEt) { +unsigned int jFEXCompression::Compress(float floatEt, bool empty) { + + //If all Scells are masked, then send empty/data not available + if(empty) return s_NoData; int Et = std::round(floatEt); diff --git a/Trigger/TrigT1/TrigT1CaloMonitoring/python/JfexInputMonitorAlgorithm.py b/Trigger/TrigT1/TrigT1CaloMonitoring/python/JfexInputMonitorAlgorithm.py index 38d94d2785a814c89c8201480957adf4a817ed8c..df4dc76ea06878883f88345092ec8c0b7eb5e9b8 100644 --- a/Trigger/TrigT1/TrigT1CaloMonitoring/python/JfexInputMonitorAlgorithm.py +++ b/Trigger/TrigT1/TrigT1CaloMonitoring/python/JfexInputMonitorAlgorithm.py @@ -20,7 +20,7 @@ def JfexInputMonitoringConfig(inputFlags): #Decorator for the DataTowers from L1CaloFEXAlgos.L1CaloFEXAlgosConfig import L1CaloFEXDecoratorCfg - result.merge(L1CaloFEXDecoratorCfg(inputFlags,"jFexTower2SCellDecorator")) + result.merge(L1CaloFEXDecoratorCfg(inputFlags,"jFexTower2SCellDecorator",ExtraInfo = False)) #jfex emulated input: EmulatedTowers from L1CaloFEXAlgos.FexEmulatedTowersConfig import jFexEmulatedTowersCfg @@ -76,11 +76,11 @@ def JfexInputMonitoringConfig(inputFlags): DetailsGroup.append( helper.addGroup(JfexInputMonAlg, groupName+"_details_"+str(i) , mainDir)) if(i == 1): - DetailsGroup[i].defineHistogram('DataEt,EmuSum;SumSCell_vs_Data_'+Calosource_names[i], title='Data Et vs Tile Et ('+ Calosource_names[i]+'); Data Et [GeV]; Tile Et [GeV]', + DetailsGroup[i].defineHistogram('DataEt_Tile,EmulatedEt_Tile;SumSCell_vs_Data_'+Calosource_names[i], title='Data Et vs Tile Et ('+ Calosource_names[i]+'); Data Et [GeV]; Tile Et [GeV]', type='TH2F',path=trigPath+"expert/", xbins=200,xmin=0,xmax=100,ybins=200,ymin=0,ymax=100) else: - DetailsGroup[i].defineHistogram('DataEt,EmuSum;SumSCell_vs_Data_'+Calosource_names[i], title='Data vs SCell Sum Et ('+ Calosource_names[i]+'); Data Et [MeV]; SCell Sum Et [MeV]', + DetailsGroup[i].defineHistogram('DataEt,EmulatedEt;SumSCell_vs_Data_'+Calosource_names[i], title='Data vs SCell Sum Et ('+ Calosource_names[i]+'); Data Et [MeV]; SCell Sum Et [MeV]', type='TH2F',path=trigPath+"expert/", xbins=160,xmin=-2000,xmax=2000,ybins=160,ymin=-2000,ymax=2000) @@ -88,7 +88,10 @@ def JfexInputMonitoringConfig(inputFlags): myGroup.defineHistogram('region,type;DataErrors', title='jFEX Data mismatches per region; Region; Type', type='TH2F',path=trigPath, xbins=7,xmin=0,xmax=7,ybins=2,ymin=0,ymax=2,xlabels=Calosource_names,ylabels=["Invalid codes","Data mismatch"]) - myGroup.defineHistogram('TowerEtaInvalid,TowerPhiInvalid;2Dmap_InvalidCodes', title='jFex DataTower Invalid Et codes; #eta; #phi', + myGroup.defineHistogram('TowerEtaInvalid,TowerPhiInvalid;2Dmap_InvalidCodes', title='jFex DataTower Invalid Et codes (4095); #eta; #phi', + type='TH2F',path=trigPath, **eta_phi_bins) + + myGroup.defineHistogram('TowerEtaEmpty,TowerPhiEmpty;2Dmap_EmptyCodes', title='jFex DataTower Empty Et codes (0); #eta; #phi', type='TH2F',path=trigPath, **eta_phi_bins) DecorGroup.defineHistogram('TowerEta,TowerPhi;2Dmap_MismatchedEts', title='jFex DataTower mismatches (no invalid codes); #eta; #phi', diff --git a/Trigger/TrigT1/TrigT1CaloMonitoring/src/JfexInputMonitorAlgorithm.cxx b/Trigger/TrigT1/TrigT1CaloMonitoring/src/JfexInputMonitorAlgorithm.cxx index f5f8ca93f7350160f7a07081402ee1778a75e2a1..17e4b7937aca662f7e516af51041d606eea02ef5 100644 --- a/Trigger/TrigT1/TrigT1CaloMonitoring/src/JfexInputMonitorAlgorithm.cxx +++ b/Trigger/TrigT1/TrigT1CaloMonitoring/src/JfexInputMonitorAlgorithm.cxx @@ -86,20 +86,23 @@ StatusCode JfexInputMonitorAlgorithm::fillHistograms( const EventContext& ctx ) - // monitored variables for histogramscd + // monitored variables for histograms auto nJfexTowers = Monitored::Scalar<int>("NJfexTowers",0.0); auto Towereta = Monitored::Scalar<float>("TowerEta",0.0); auto Towerphi = Monitored::Scalar<float>("TowerPhi",0.0); auto ToweretaDeco = Monitored::Scalar<float>("TowerEtaDeco",0.0); auto TowerphiDeco = Monitored::Scalar<float>("TowerPhiDeco",0.0); auto DataEt = Monitored::Scalar<float>("DataEt",0.0); - auto SCellSum = Monitored::Scalar<float>("SCellSum",0.0); - auto EmuSum = Monitored::Scalar<float>("EmuSum",0.0); + auto EmulatedEt = Monitored::Scalar<float>("EmulatedEt",0.0); + auto DataEt_Tile = Monitored::Scalar<float>("DataEt_Tile",0.0); + auto EmulatedEt_Tile = Monitored::Scalar<float>("EmulatedEt_Tile",0.0); auto region = Monitored::Scalar<int>("region",0.0); auto type = Monitored::Scalar<int>("type",0.0); auto frac_SCellSum = Monitored::Scalar<float>("frac_SCellSum",0.0); auto ToweretaInvalid = Monitored::Scalar<float>("TowerEtaInvalid",-99.0); auto TowerPhiInvalid = Monitored::Scalar<float>("TowerPhiInvalid",-99.0); + auto ToweretaEmpty = Monitored::Scalar<float>("TowerEtaEmpty",-99.0); + auto TowerPhiEmpty = Monitored::Scalar<float>("TowerPhiEmpty",-99.0); auto Towerglobaleta = Monitored::Scalar<int>("TowerGlobalEta",0); auto Towerglobalphi = Monitored::Scalar<uint32_t>("TowerGlobalPhi",0); auto Towermodule = Monitored::Scalar<uint8_t>("TowerModule",0); @@ -145,25 +148,63 @@ StatusCode JfexInputMonitorAlgorithm::fillHistograms( const EventContext& ctx ) ATH_MSG_WARNING("DataTower: "<<TTID<< " with Calosource: "<<source<< "is repeated. It shouldn't! "); } + DataEt = jTowerEtMeV(*dataTower); + EmulatedEt = SCellEtMeV(*dataTower); + + // If Tile (Calosource == 1) then use Tile information + if(source == 1){ + EmulatedEt = TileEtMeV(*dataTower); + + DataEt_Tile = DataEt/Gaudi::Units::GeV; + EmulatedEt_Tile = EmulatedEt/Gaudi::Units::GeV; + fill(m_Grouphist+"_details_"+std::to_string(source),DataEt_Tile,EmulatedEt_Tile); + } + else{ + fill(m_Grouphist+"_details_"+std::to_string(source),DataEt,EmulatedEt); + } + + fill(m_Grouphist+"_decorated_all" ,DataEt,EmulatedEt); - DataEt = jTowerEtMeV(*dataTower); - SCellSum = SCellEtMeV(*dataTower); - - fill(m_Grouphist+"_decorated_all",DataEt,SCellSum); + - //Looking at decorated variables + //Looking at decorated variables. Is real time path data Et the same as the simulated one (encoded Et)? if( (dataTower->et_count()).at(0) != emulated_jtowerEt(*dataTower)) { std::string location = "EM layer"; - // if source is Tile, HEC, FCAL2 and FCAL3 then location is HAD - if(dataTower->Calosource()== 1 || dataTower->Calosource()== 3 || dataTower->Calosource() == 5 || dataTower->Calosource() == 6 ){ + if(dataTower->Calosource()== 1 || dataTower->Calosource()== 3 || dataTower->Calosource() == 5 || dataTower->Calosource() == 6 ){ // if source is Tile, HEC, FCAL2 and FCAL3 then location is HAD location="HAD layer"; } if( (dataTower->et_count()).at(0) != m_InvalidCode ){ - frac_SCellSum = DataEt != 0 ? (SCellSum - DataEt)/DataEt : 0; - fill(m_Grouphist+"_decorated",Towereta,Towerphi,DataEt,SCellSum,frac_SCellSum); + ATH_MSG_WARNING("Tower:"<< TTID << " source:"<< +dataTower->Calosource() << " for eventNumber:"<< GetEventInfo(ctx)->eventNumber()<< " and LB:"<<GetEventInfo(ctx)->lumiBlock() << ". DataTower Et:"<< (dataTower->et_count()).at(0) <<"/"<< DataEt<<" vs EmulatedTower Et:" << emulated_jtowerEt(*dataTower)<<"/"<< EmulatedEt); + + + /*Commented block, needed for further debugging + for(uint i=0;i<(dataTower->SCellEt()).size();i++){ + printf("%11.1f ",(dataTower->SCellEt()).at(i) ); + } + printf("\n"); + + for(uint i=0;i<(dataTower->SCellEta()).size();i++){ + printf("%5.2f/%5.2f ",(dataTower->SCellEta()).at(i),(dataTower->SCellPhi()).at(i) ); + } + printf("\n"); + + for(uint i=0;i<(dataTower->SCellEta()).size();i++){ + printf(" 0x%08x ",(dataTower->SCellID()).at(i) ); + } + printf("\n"); + + + for(uint i=0;i<(dataTower->SCellEta()).size();i++){ + printf("%11d ",(dataTower->SCellMask()).at(i) ); + } + printf("\n"); + */ + + frac_SCellSum = DataEt != 0 ? (EmulatedEt - DataEt)/DataEt : 0; + fill(m_Grouphist+"_decorated",Towereta,Towerphi,DataEt,EmulatedEt,frac_SCellSum); genError("Input_Mismatch", location); } else{ @@ -176,14 +217,6 @@ StatusCode JfexInputMonitorAlgorithm::fillHistograms( const EventContext& ctx ) fill(m_Grouphist,region,type); } - - EmuSum = SCellEtMeV(*dataTower); - if(source == 1){ - DataEt /= 1e3; - EmuSum = TileEtMeV(*dataTower)/1e3; - } - fill(m_Grouphist+"_details_"+std::to_string(source),DataEt,EmuSum); - } fill(m_Grouphist,Towereta,Towerphi); @@ -219,12 +252,21 @@ StatusCode JfexInputMonitorAlgorithm::fillHistograms( const EventContext& ctx ) Toweretcount_fcal2=Toweret_count.at(0); Toweretcount_fcal3=Toweret_count.at(0); - if(Toweret_count.at(0) == m_InvalidCode){ - ToweretaInvalid=dataTower->eta(); - TowerPhiInvalid=dataTower->phi(); - fill(m_Grouphist,ToweretaInvalid,TowerPhiInvalid); + if(dataTower->Calosource() != 1){ // Only for LATOME, not Tile + if(Toweret_count.at(0) == m_InvalidCode){ + ToweretaInvalid=dataTower->eta(); + TowerPhiInvalid=dataTower->phi(); + fill(m_Grouphist,ToweretaInvalid,TowerPhiInvalid); + } + + if(Toweret_count.at(0) == m_EmptyCode){ + ToweretaEmpty=dataTower->eta(); + TowerPhiEmpty=dataTower->phi(); + fill(m_Grouphist,ToweretaEmpty,TowerPhiEmpty); + } } + if(Towercalosource==0) { fill(m_Grouphist,Toweretcount_barrel); } diff --git a/Trigger/TrigT1/TrigT1CaloMonitoring/src/JfexInputMonitorAlgorithm.h b/Trigger/TrigT1/TrigT1CaloMonitoring/src/JfexInputMonitorAlgorithm.h index 2b33753d968e58dd7d3dfd0cd4b25fc4c83d3c9e..1a42f2e16f5d10404f7e934744d4459583cfce90 100644 --- a/Trigger/TrigT1/TrigT1CaloMonitoring/src/JfexInputMonitorAlgorithm.h +++ b/Trigger/TrigT1/TrigT1CaloMonitoring/src/JfexInputMonitorAlgorithm.h @@ -39,6 +39,7 @@ class JfexInputMonitorAlgorithm : public AthMonitorAlgorithm { unsigned int m_InvalidCode = 4095; + unsigned int m_EmptyCode = 0; int codedVal(int, int) const;