CMS 3D CMS Logo

Public Types | Public Member Functions | Static Public Attributes | Private Attributes

CSCRecHit2D Class Reference

#include <CSCRecHit2D.h>

Inheritance diagram for CSCRecHit2D:
RecHit2DLocalPos TrackingRecHit

List of all members.

Public Types

typedef edm::RangeMap< int,
std::vector< float > > 
ADCContainer
typedef std::vector< int > ChannelContainer
enum  SharedInputType {
  all = TrackingRecHit::all, some = TrackingRecHit::some, allWires, someWires,
  allStrips, someStrips
}
 

definition of equality via shared input

More...

Public Member Functions

float adcs (unsigned int strip, unsigned int timebin) const
 Map of strip ADCs for strips comprising the rechit.
short int badStrip () const
 flags for involvement of 'bad' channels
short int badWireGroup () const
int channels (unsigned int i) const
 Extracting strip channel numbers comprising the rechit - low.
int channelsl1a (unsigned int i) const
 Extract the L1A phase bits from the StripChannelContainer - high.
CSCRecHit2Dclone () const
 RecHit2DLocalPos base class interface.
CSCDetId cscDetId () const
 CSCRecHit2D ()
 CSCRecHit2D (const CSCDetId &id, const LocalPoint &pos, const LocalError &err, const ChannelContainer &channels, const ADCContainer &adcs, const ChannelContainer &wgroups, float tpeak, float posInStrip, float errInStrip, int quality, short int badStrip=0, short int badWireGroup=0, int scaledWireTime=0, float energyDeposit=-995.)
float energyDepositedInLayer () const
float errorWithinStrip () const
 The uncertainty of the estimated position within the strip.
short int hitWire () const
 L1A.
LocalPoint localPosition () const
LocalError localPositionError () const
unsigned int nStrips () const
unsigned int nTimeBins () const
unsigned int nWireGroups () const
float positionWithinStrip () const
 The estimated position within the strip.
void print () const
 Print the content of the RecHit2D including L1A (for debugging)
int quality () const
 quality flag of the reconstruction
bool sharesInput (const CSCRecHit2D *otherRecHit, CSCRecHit2D::SharedInputType what) const
 Returns true if the two CSCRecHits are using the same input information, false otherwise. In this case, looks at the geographical ID and channel numbers for strips and wires.
bool sharesInput (const TrackingRecHit *other, CSCRecHit2D::SharedInputType what) const
 Returns true if the two TrackingRecHits are using the same input information, false otherwise. In this case, looks at the geographical ID and channel numbers for strips and wires.
virtual bool sharesInput (const TrackingRecHit *other, TrackingRecHit::SharedInputType what) const
 Returns true if the two TrackingRecHits are using the same input information, false otherwise. In this case, looks at the geographical ID and channel numbers for strips and wires.
float tpeak () const
 Fitted peaking time.
short int wgroupsBX () const
float wireTime () const
 ~CSCRecHit2D ()

Static Public Attributes

static const unsigned int MAXSTRIPS = 3
static const unsigned int MAXTIMEBINS = 4
static const unsigned int N_ADC = MAXSTRIPS*MAXTIMEBINS

Private Attributes

short int hitWire_
unsigned char nStrips_
unsigned char nTimeBins_
unsigned char nWireGroups_
float theADCs_ [N_ADC]
short int theBadStrip
short int theBadWireGroup
float theEnergyDeposit
float theErrorWithinStrip
unsigned char theL1APhaseBits_ [MAXSTRIPS]
LocalError theLocalError
LocalPoint theLocalPosition
float thePositionWithinStrip
int theQuality
int theScaledWireTime
unsigned char theStrips_ [MAXSTRIPS]
float theTpeak
short int theWGroupsBX_

Detailed Description

Describes a 2-dim reconstructed hit in one layer of an Endcap Muon CSC.

Author:
Tim Cox et al.

Definition at line 18 of file CSCRecHit2D.h.


Member Typedef Documentation

typedef edm::RangeMap<int, std::vector<float> > CSCRecHit2D::ADCContainer

Definition at line 23 of file CSCRecHit2D.h.

typedef std::vector<int> CSCRecHit2D::ChannelContainer

Definition at line 22 of file CSCRecHit2D.h.


Member Enumeration Documentation

definition of equality via shared input

Enumerator:
all 
some 
allWires 
someWires 
allStrips 
someStrips 

Reimplemented from TrackingRecHit.

Definition at line 25 of file CSCRecHit2D.h.


Constructor & Destructor Documentation

CSCRecHit2D::CSCRecHit2D ( )

Definition at line 4 of file CSCRecHit2D.cc.

References i, j, MAXSTRIPS, MAXTIMEBINS, theADCs_, and theStrips_.

Referenced by clone().

                         :
  theTpeak( -999. ),  
  thePositionWithinStrip(-999.),
  theErrorWithinStrip(-999.),
  theEnergyDeposit( -994. ),
  theQuality( 0 ), 
  theScaledWireTime( 0 ),
  theBadStrip( 0 ), 
  theBadWireGroup( 0 ),
  nStrips_(0),
  nWireGroups_(0),
  nTimeBins_(0),
  theLocalPosition(0.,0.), 
  theLocalError(0.,0.,0.)
{
  for ( unsigned int i=0; i< MAXSTRIPS; i++) theStrips_[i]=0;
  for ( unsigned int i=0; i< MAXSTRIPS; i++) 
    for ( unsigned int j=0; j< MAXTIMEBINS; j++) 
      theADCs_[i*MAXTIMEBINS+j]=0;
}
CSCRecHit2D::CSCRecHit2D ( const CSCDetId id,
const LocalPoint pos,
const LocalError err,
const ChannelContainer channels,
const ADCContainer adcs,
const ChannelContainer wgroups,
float  tpeak,
float  posInStrip,
float  errInStrip,
int  quality,
short int  badStrip = 0,
short int  badWireGroup = 0,
int  scaledWireTime = 0,
float  energyDeposit = -995. 
)

Definition at line 25 of file CSCRecHit2D.cc.

References gather_cfg::cout, hitWire_, i, j, gen::k, MAXSTRIPS, MAXTIMEBINS, nStrips_, nTimeBins_, nWireGroups_, edm::RangeMap< ID, C, P >::size(), theADCs_, theL1APhaseBits_, theStrips_, theWGroupsBX_, and tmp.

                                              :
  RecHit2DLocalPos( id ), 
  theTpeak( tpeak ),
  thePositionWithinStrip( posInStrip ),
  theErrorWithinStrip( errInStrip ),
  theEnergyDeposit( energyDeposit ),
  theQuality( quality ), 
  theScaledWireTime ( scaledWireTime ),
  theBadStrip( badStrip ), theBadWireGroup( badWireGroup ),
  theLocalPosition( pos ), 
  theLocalError( err )
{
  nStrips_=channels.size();
  nWireGroups_=wgroups.size();

  if ( nStrips_ > MAXSTRIPS ) {
    std::cout << "CSCRecHit2D: not enough strips in DataFormat! " << unsigned(nStrips_) <<  std::endl;
    nStrips_=MAXSTRIPS;
  }

  for ( unsigned int i=0; i< MAXSTRIPS; i++) theStrips_[i]=0;
  for ( unsigned int i=0; i< MAXSTRIPS; i++) theL1APhaseBits_[i]=0;
  for ( unsigned int i=0; i< MAXSTRIPS; i++) 
    for ( unsigned int j=0; j< MAXTIMEBINS; j++) 
      theADCs_[i*MAXTIMEBINS+j]=0;


  for ( unsigned int i=0; i<nStrips_; i++) {
    theStrips_[i]=channels[i] & 0x000000FF;
    theL1APhaseBits_[i]=channels[i] & 0x0000FF00;
  }
  if (nWireGroups_>0) {
    //take only the low bits
    hitWire_=wgroups[nWireGroups_/2] & 0x0000FFFF;
    theWGroupsBX_= (wgroups[nWireGroups_/2] >> 16)& 0x0000FFFF;
  }
  else {
    hitWire_=0;
    theWGroupsBX_=0;
  }
  ADCContainer tmp(adcs); //must be a bug in RangeMap!!!???
  nTimeBins_=tmp.size()/nStrips_;
  unsigned int k=0;
  for ( unsigned int i=0; i<nStrips_; i++)
    for ( unsigned int j=0; j<nTimeBins_; j++) {
      theADCs_[i*MAXTIMEBINS+j]=tmp[k];
      k++;
    }
}
CSCRecHit2D::~CSCRecHit2D ( )

Definition at line 86 of file CSCRecHit2D.cc.

{}

Member Function Documentation

float CSCRecHit2D::adcs ( unsigned int  strip,
unsigned int  timebin 
) const [inline]

Map of strip ADCs for strips comprising the rechit.

Definition at line 68 of file CSCRecHit2D.h.

References MAXTIMEBINS, and theADCs_.

Referenced by MuonTruth::analyze().

{ return theADCs_[strip*MAXTIMEBINS+timebin]; }
short int CSCRecHit2D::badStrip ( ) const [inline]

flags for involvement of 'bad' channels

Definition at line 85 of file CSCRecHit2D.h.

References theBadStrip.

{ return theBadStrip; }
short int CSCRecHit2D::badWireGroup ( ) const [inline]

Definition at line 86 of file CSCRecHit2D.h.

References theBadWireGroup.

{ return theBadWireGroup; }
int CSCRecHit2D::channels ( unsigned int  i) const [inline]

Extracting strip channel numbers comprising the rechit - low.

Definition at line 55 of file CSCRecHit2D.h.

References i, and theStrips_.

Referenced by MuonTruth::analyze(), MuonTruth::associateCSCHitId(), MuonTruth::associateHitId(), operator<<(), print(), and sharesInput().

{ return theStrips_[i]; }
int CSCRecHit2D::channelsl1a ( unsigned int  i) const [inline]

Extract the L1A phase bits from the StripChannelContainer - high.

Definition at line 59 of file CSCRecHit2D.h.

References i, and theL1APhaseBits_.

{ return theL1APhaseBits_[i]; } 
CSCRecHit2D* CSCRecHit2D::clone ( void  ) const [inline, virtual]

RecHit2DLocalPos base class interface.

Implements RecHit2DLocalPos.

Definition at line 49 of file CSCRecHit2D.h.

References CSCRecHit2D().

{ return new CSCRecHit2D( *this ); }
CSCDetId CSCRecHit2D::cscDetId ( ) const [inline]
float CSCRecHit2D::energyDepositedInLayer ( ) const [inline]

Energy deposited in the layer. Note: this value is dE. In order to get the dE/dX, you will need to divide by the path length. Specific failure values... If the user has chosen not to use the gas gain correction ---> -998. If the gas gain correction from the database is a bad value -> -997. If it is an edge strip --------------------------------------> -996. If gas-gain is OK, but the ADC vector is the wrong size ----> -999. If the user has created the Rechit without the energy deposit> -995. If the user has created the Rechit with no arguments --------> -994.

Definition at line 100 of file CSCRecHit2D.h.

References theEnergyDeposit.

{ return theEnergyDeposit; }
float CSCRecHit2D::errorWithinStrip ( ) const [inline]

The uncertainty of the estimated position within the strip.

Definition at line 79 of file CSCRecHit2D.h.

References theErrorWithinStrip.

Referenced by operator<<().

{ return theErrorWithinStrip;} ;
short int CSCRecHit2D::hitWire ( ) const [inline]

L1A.

Container of wire groups comprising the rechit

Definition at line 62 of file CSCRecHit2D.h.

References hitWire_.

Referenced by operator<<(), and sharesInput().

{ return hitWire_;}
LocalPoint CSCRecHit2D::localPosition ( ) const [inline, virtual]

Implements RecHit2DLocalPos.

Definition at line 50 of file CSCRecHit2D.h.

References theLocalPosition.

Referenced by CSCSegAlgoTC::areHitsCloseInGlobalPhi(), CSCSegAlgoSK::areHitsCloseInGlobalPhi(), CSCSegAlgoTC::areHitsCloseInLocalX(), CSCSegAlgoSK::areHitsCloseInLocalX(), FWCSCRecHitProxyBuilder::build(), CSCSegAlgoTC::buildSegments(), CSCSegAlgoSK::buildSegments(), CSCSegAlgoDF::buildSegments(), CSCSegAlgoST::correctTheCovX(), CSCSegAlgoDF::derivativeMatrix(), CSCSegAlgoHitPruning::derivativeMatrix(), CSCSegAlgoShowering::derivativeMatrix(), CSCSegAlgoSK::derivativeMatrix(), CSCSegAlgoTC::derivativeMatrix(), CSCSegAlgoST::derivativeMatrix(), CSCSegAlgoHitPruning::fillChiSquared(), CSCSegAlgoSK::fillChiSquared(), CSCSegAlgoTC::fillChiSquared(), CSCSegAlgoST::fillChiSquared(), CSCSegAlgoHitPruning::fitSlopes(), CSCSegAlgoST::fitSlopes(), CSCSegAlgoTC::fitSlopes(), CSCSegAlgoSK::fitSlopes(), CSCMake2DRecHit::isHitInFiducial(), CSCSegAlgoTC::isHitNearSegment(), CSCSegAlgoShowering::isHitNearSegment(), CSCSegAlgoSK::isHitNearSegment(), CSCSegAlgoDF::isHitNearSegment(), CSCValidation::ltrh::operator()(), operator<<(), CSCRecHit2DValidation::plotResolution(), GlobalRecHitsAnalyzer::plotResolution(), GlobalRecHitsProducer::plotResolution(), print(), CSCSegAlgoDF::pruneFromResidual(), CSCSegAlgoShowering::pruneFromResidual(), CSCSegAlgoShowering::showerSeg(), CSCSegAlgoTC::tryAddingHitsToSegment(), CSCSegAlgoSK::tryAddingHitsToSegment(), CSCSegAlgoDF::updateParameters(), CSCSegAlgoShowering::updateParameters(), CSCSegAlgoSK::updateParameters(), and CSCSegAlgoTC::updateParameters().

{ return theLocalPosition; }
LocalError CSCRecHit2D::localPositionError ( ) const [inline, virtual]
unsigned int CSCRecHit2D::nStrips ( ) const [inline]
unsigned int CSCRecHit2D::nTimeBins ( ) const [inline]

Definition at line 70 of file CSCRecHit2D.h.

References nTimeBins_.

{return nTimeBins_;}
unsigned int CSCRecHit2D::nWireGroups ( ) const [inline]

Definition at line 65 of file CSCRecHit2D.h.

References nWireGroups_.

Referenced by operator<<(), print(), and sharesInput().

{return nWireGroups_;}
float CSCRecHit2D::positionWithinStrip ( ) const [inline]

The estimated position within the strip.

Definition at line 76 of file CSCRecHit2D.h.

References thePositionWithinStrip.

Referenced by operator<<().

void CSCRecHit2D::print ( void  ) const

Print the content of the RecHit2D including L1A (for debugging)

L1A

Definition at line 165 of file CSCRecHit2D.cc.

References channels(), gather_cfg::cout, cscDetId(), hitWire_, i, gen::k, localPosition(), localPositionError(), nStrips(), nWireGroups(), mathSSE::sqrt(), theBadStrip, theBadWireGroup, theErrorWithinStrip, thePositionWithinStrip, theQuality, theScaledWireTime, theTpeak, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

                              {
  std::cout << "CSCRecHit in CSC Detector: " << cscDetId() << std::endl;
  std::cout << "  local x = " << localPosition().x() << " +/- " << sqrt( localPositionError().xx() ) <<  " y = " << localPosition().y() << " +/- " << sqrt( localPositionError().yy() ) << std::endl;

  std::cout << " tpeak " << theTpeak << " psoInStrip " << thePositionWithinStrip << " errorinstrip " << theErrorWithinStrip << " " << " qual " << theQuality << " wiretime " << theScaledWireTime << " tbs " << theBadStrip << " bwg " << theBadWireGroup << std::endl; 

  std::cout << "  Channels: ";
  for (unsigned int i=0; i<nStrips(); i++) {std::cout << std::dec << channels(i) << " "
                                                      << " (" << "HEX: " << std::hex << channels(i) << ")" << " ";
  }
  std::cout << std::endl;
  
  
  std::cout << "  L1APhase: ";
  for (int i=0; i<(int)nStrips(); i++) {
    std::cout << "|";
    for (int k=0; k<8 ; k++){ 
      std::cout << ((channelsl1a(i) >> (15-k)) & 0x1) << " ";}
    std::cout << "| ";       
  }           
  std::cout << std::endl;

  std::cout << "nWireGroups " << (int)nWireGroups() << " central wire " << hitWire_ <<std::endl;
}
int CSCRecHit2D::quality ( ) const [inline]

quality flag of the reconstruction

Definition at line 82 of file CSCRecHit2D.h.

References theQuality.

Referenced by operator<<().

{ return theQuality;}
bool CSCRecHit2D::sharesInput ( const TrackingRecHit other,
CSCRecHit2D::SharedInputType  what 
) const

Returns true if the two TrackingRecHits are using the same input information, false otherwise. In this case, looks at the geographical ID and channel numbers for strips and wires.

Definition at line 97 of file CSCRecHit2D.cc.

References CSC(), TrackingRecHit::geographicalId(), sharesInput(), and DetId::subdetId().

                                                                                                {
  
  // Check to see if the TrackingRecHit is actually a CSCRecHit2D.
  if (other->geographicalId().subdetId() != MuonSubdetId::CSC) return false;
  
  // Now I can static cast, because the previous guarantees that this is a CSCRecHit2D
  const CSCRecHit2D *otherRecHit = static_cast<const CSCRecHit2D *>(other);
  
  return sharesInput(otherRecHit, what);
}
bool CSCRecHit2D::sharesInput ( const TrackingRecHit other,
TrackingRecHit::SharedInputType  what 
) const [virtual]

Returns true if the two TrackingRecHits are using the same input information, false otherwise. In this case, looks at the geographical ID and channel numbers for strips and wires.

Reimplemented from TrackingRecHit.

Definition at line 88 of file CSCRecHit2D.cc.

Referenced by sharesInput().

                                                                                                   {
  
  // This is to satisfy the base class virtual function
  
  // @@ Cast the enum (!) But what if the TRH::SIT changes?!
  CSCRecHit2D::SharedInputType cscWhat = static_cast<CSCRecHit2D::SharedInputType>(what);
  return sharesInput(other, cscWhat);
}
bool CSCRecHit2D::sharesInput ( const CSCRecHit2D otherRecHit,
CSCRecHit2D::SharedInputType  what 
) const

Returns true if the two CSCRecHits are using the same input information, false otherwise. In this case, looks at the geographical ID and channel numbers for strips and wires.

Definition at line 109 of file CSCRecHit2D.cc.

References all, allStrips, allWires, CSCDetId::channel(), channels(), cscDetId(), newFWLiteAna::found, TrackingRecHit::geographicalId(), hitWire(), i, j, nStrips(), nWireGroups(), some, someStrips, and someWires.

                                                                                                    {
  
  // Check to see if the geographical ID of the two are the same
  if (geographicalId() != otherRecHit->geographicalId()) return false;
  
  // Trivial cases
  if (nStrips() == 0 && otherRecHit->nStrips() == 0 && nWireGroups() == 0 && otherRecHit->nWireGroups() == 0) return true;
  if ((what == allWires || what == someWires) && nWireGroups() == 0 && otherRecHit->nWireGroups() == 0) return true;
  if ((what == allStrips || what == someStrips) && nStrips() == 0 && otherRecHit->nStrips() == 0) return true;
  
  // Check to see if the wire containers are the same length
  if ((what == all || what == allWires) && nWireGroups() != otherRecHit->nWireGroups()) return false;
  
  // Check to see if the strip containers are the same length
  if ((what == all || what == allStrips) && nStrips() != otherRecHit->nStrips()) return false;
  
  bool foundWire = false;
  // Check to see if the wires are the same
  if (what != allStrips && what != someStrips) {
    //can we do better here?
    if ( hitWire() != otherRecHit->hitWire() )  return false;
  }
  
  // Check to see if the wires are the same
  bool foundStrip = false;
  if (what != allWires && what != someWires) {
    for (unsigned int i=0; i< nStrips(); i++) {
      bool found = false;
      for (unsigned int j=0; j< nStrips(); j++) {
        //a strip is a channel for all but ME1/1a chambers (where 3 ganged strips are a channel)
        if(cscDetId().channel(channels(i))==otherRecHit->cscDetId().channel(otherRecHit->channels(j))){
          if (what == some || what == someStrips) return true;
          else {
            found = true;
            foundStrip = true;
            break;
          }
        }
      }
      if ((what == all || what == allStrips) && !found) return false;
    }
    if (what == someStrips && !foundStrip) return false;
  }
  
  // In case we were looking for "some" and found absolutely nothing.
  if (!foundWire && !foundStrip) return false;
  
  // If we made it this far, then:
  //  1) the detector IDs are the same
  //  2) the channel containers have the same number of entries
  //  3) for each entry in my channel container, I can find the same value in the other RecHit's corresponding channel container
  // I think that means we are the same.
  return true;
}
float CSCRecHit2D::tpeak ( ) const [inline]

Fitted peaking time.

Definition at line 73 of file CSCRecHit2D.h.

References theTpeak.

Referenced by CSCSegment::time().

{ return theTpeak; }
short int CSCRecHit2D::wgroupsBX ( ) const [inline]

Definition at line 63 of file CSCRecHit2D.h.

References theWGroupsBX_.

{return theWGroupsBX_;}
float CSCRecHit2D::wireTime ( ) const [inline]

Definition at line 89 of file CSCRecHit2D.h.

References theScaledWireTime.

Referenced by CSCSegment::time().

{ return (float)theScaledWireTime/100.; }

Member Data Documentation

short int CSCRecHit2D::hitWire_ [private]

Definition at line 122 of file CSCRecHit2D.h.

Referenced by CSCRecHit2D(), hitWire(), and print().

const unsigned int CSCRecHit2D::MAXSTRIPS = 3 [static]

Definition at line 27 of file CSCRecHit2D.h.

Referenced by CSCRecHit2D().

const unsigned int CSCRecHit2D::MAXTIMEBINS = 4 [static]

Definition at line 28 of file CSCRecHit2D.h.

Referenced by adcs(), and CSCRecHit2D().

const unsigned int CSCRecHit2D::N_ADC = MAXSTRIPS*MAXTIMEBINS [static]

Definition at line 29 of file CSCRecHit2D.h.

unsigned char CSCRecHit2D::nStrips_ [private]

Definition at line 127 of file CSCRecHit2D.h.

Referenced by CSCRecHit2D(), and nStrips().

unsigned char CSCRecHit2D::nTimeBins_ [private]

Definition at line 127 of file CSCRecHit2D.h.

Referenced by CSCRecHit2D(), and nTimeBins().

unsigned char CSCRecHit2D::nWireGroups_ [private]

Definition at line 127 of file CSCRecHit2D.h.

Referenced by CSCRecHit2D(), and nWireGroups().

float CSCRecHit2D::theADCs_[N_ADC] [private]

Definition at line 131 of file CSCRecHit2D.h.

Referenced by adcs(), and CSCRecHit2D().

short int CSCRecHit2D::theBadStrip [private]

Definition at line 124 of file CSCRecHit2D.h.

Referenced by badStrip(), and print().

short int CSCRecHit2D::theBadWireGroup [private]

Definition at line 125 of file CSCRecHit2D.h.

Referenced by badWireGroup(), and print().

Definition at line 119 of file CSCRecHit2D.h.

Referenced by energyDepositedInLayer().

Definition at line 118 of file CSCRecHit2D.h.

Referenced by errorWithinStrip(), and print().

unsigned char CSCRecHit2D::theL1APhaseBits_[MAXSTRIPS] [private]

Definition at line 129 of file CSCRecHit2D.h.

Referenced by channelsl1a(), and CSCRecHit2D().

Definition at line 134 of file CSCRecHit2D.h.

Referenced by localPositionError().

Definition at line 133 of file CSCRecHit2D.h.

Referenced by localPosition().

Definition at line 117 of file CSCRecHit2D.h.

Referenced by positionWithinStrip(), and print().

int CSCRecHit2D::theQuality [private]

Definition at line 120 of file CSCRecHit2D.h.

Referenced by print(), and quality().

Definition at line 121 of file CSCRecHit2D.h.

Referenced by print(), and wireTime().

unsigned char CSCRecHit2D::theStrips_[MAXSTRIPS] [private]

Definition at line 130 of file CSCRecHit2D.h.

Referenced by channels(), and CSCRecHit2D().

float CSCRecHit2D::theTpeak [private]

Definition at line 116 of file CSCRecHit2D.h.

Referenced by print(), and tpeak().

short int CSCRecHit2D::theWGroupsBX_ [private]

Definition at line 123 of file CSCRecHit2D.h.

Referenced by CSCRecHit2D(), and wgroupsBX().