CMS 3D CMS Logo

Public Member Functions

CSCIndexerPostls1 Class Reference

#include <CSCIndexerPostls1.h>

Inheritance diagram for CSCIndexerPostls1:
CSCIndexerBase

List of all members.

Public Member Functions

int dbIndex (const CSCDetId &id, int &channel) const
std::pair< CSCDetId, IndexTypedetIdFromChipIndex (IndexType ichi) const
CSCIndexerBase::GasGainIndexType detIdFromGasGainIndex (IndexType igg) const
std::pair< CSCDetId, IndexTypedetIdFromStripChannelIndex (LongIndexType ichi) const
std::string name () const
 ~CSCIndexerPostls1 ()
maxIndexMethods
LongIndexType maxStripChannelIndex () const
IndexType maxChipIndex () const
IndexType maxGasGainIndex () const
nonIndexCountingMethods
IndexType onlineRingsInStation (IndexType is) const
IndexType stripChannelsPerOfflineLayer (IndexType is, IndexType ir) const
IndexType stripChannelsPerOnlineLayer (IndexType is, IndexType ir) const
IndexType chipsPerOnlineLayer (IndexType is, IndexType ir) const
stripIndexMethods
IndexType stripChannelsPerLayer (IndexType is, IndexType ir) const
LongIndexType stripChannelStart (IndexType ie, IndexType is, IndexType ir) const
chipIndexMethods
IndexType chipsPerLayer (IndexType is, IndexType ir) const
IndexType chipStart (IndexType ie, IndexType is, IndexType ir) const
gasGainIndexMethods
IndexType sectorStart (IndexType ie, IndexType is, IndexType ir) const

Detailed Description

Concrete CSCIndexer class appropriate for CSC Conditions Data access after CMS long shutdown 1 (2013-2014) in which most ME4/2 rings are complete and the 48 strips in ME1/1A are unganged and so have 48 channels.
The conditions data are stored in an order based on the hadrware channel order so this class has to jump through hoops in order to map between that order and a CSCDetID order offline.

See documentation in base class CSCIndexerBase for more information.

Warning:
This class is hard-wired for the CSC system expected after long shutdown 2013-2014 (LS1) of CMS.
The basic order is as for startup (pre-LS1) with rings ME11, ME12, ME13, ME21, ME22, ME31, ME32, ME41 totalling 234 chambers per endcap. Then ME42 is appended, so the chamber order is
+z ME11, ME12, ME13, ME21, ME22, ME31, ME32, ME41,
-z ME11, ME12, ME13, ME21, ME22, ME31, ME32, ME41,
+z ME42, -z ME42

It is further extended for unganged ME1a strip channels by appending +z ME1a, -z ME1a.

CSCIndexerBase::stripChannelIndex returns
1-217728 (CSCs 2008), 217729-252288 (ME42), 252289-273024 (unganged ME1a)

CSCIndexerBase::chipIndex returns
1-13608 (CSCs 2008), 13609-15768 (ME42), 15769-17064 (unganged ME1a).

CSCIndexerBase::gasGainIndex returns
1-45144 (CSCs 2008), 45145-55944 (ME42), 55945-57240 (unganged ME1a)

Warning:
This has "magic numbers galore".
EVERY LABEL COUNTS FROM ONE NOT ZERO.

Definition at line 38 of file CSCIndexerPostls1.h.


Constructor & Destructor Documentation

CSCIndexerPostls1::~CSCIndexerPostls1 ( )

Definition at line 4 of file CSCIndexerPostls1.cc.

{}

Member Function Documentation

IndexType CSCIndexerPostls1::chipsPerLayer ( IndexType  is,
IndexType  ir 
) const [inline, virtual]

Number of Buckeye chips indices per layer in a chamber in offline ring 'ir' of station 'is'.

Station label range 1-4, Ring label range 1-4 (4=ME1a)

Works for ME1a input as is=1, ir=4 Considers ME42 as standard 5 chip per layer chambers.

WARNING:

  • ME1a channels are considered to be unganged and have their own 3 chips (ME1b has 4 chips).
  • ME1b keeps 5 chips for the indexing purposes, however indices for the chip #5 are ignored in the unganged case.

Implements CSCIndexerBase.

Definition at line 170 of file CSCIndexerPostls1.h.

Referenced by detIdFromGasGainIndex().

  {
    const IndexType nCinL[16] = { 5,5,4,3,  5,5,0,0,  5,5,0,0,  5,5,0,0 };
    return nCinL[(is - 1)*4 + ir - 1];
  }
IndexType CSCIndexerPostls1::chipsPerOnlineLayer ( IndexType  is,
IndexType  ir 
) const [inline, virtual]

Number of Buckeye chips per layer in an online chamber in ring 'ir' of station 'is'. Works for ME1a (ring 4 of ME1) too.

'Online' ME11 for the upgrade is considered as split into 1a and 1b chambers with 3 and 4 CFEBs respectively

Implements CSCIndexerBase.

Definition at line 102 of file CSCIndexerPostls1.h.

  {
    const IndexType nCinL[16] = { 4,5,4,3,  5,5,0,0,  5,5,0,0,  5,5,0,0 };
    return nCinL[(is - 1)*4 + ir - 1];
  }
IndexType CSCIndexerPostls1::chipStart ( IndexType  ie,
IndexType  is,
IndexType  ir 
) const [inline, virtual]

Linear index for 1st Buckeye chip in offline ring 'ir' of station 'is' in endcap 'ie'.

Endcap label range 1-2, Station label range 1-4, Ring label range 1-4 (4=ME1a) Works for ME1a input as is=1, ir=4

Warning:
: ME1a chips are the last 3 of the 7 chips total in each layer of an ME11 chamber,

Implements CSCIndexerBase.

Definition at line 184 of file CSCIndexerPostls1.h.

  {
    // These are in the ranges 1-13608 (CSCs 2008) and 13609-15768 (ME42) and 15769-17064 (ME1a).
    // There are 1-6804 chips per endcap (CSCs 2008) and 1080 chips per endcap (ME42) and 648 chips per endcap (ME1a).
    // Start of -z channels (CSCs 2008) is 6804 + 1 = 6805
    // Start of +z (ME42) is 13608 + 1 = 13609
    // Start of -z (ME42) is 13608 + 1 + 1080 = 14689
    // Start of +z (ME1a) is 15768 + 1 = 15769
    // Start of -z (ME1a) is 15768 + 1 + 648 = 16417
    const IndexType nStart[32] =
      {1,   1081, 2161, 15769,   3025, 3565, 0,0,  4645, 5185, 0,0,  6265, 13609,0,0,
       6805,7885, 8965, 16417,   9829, 10369,0,0,  11449,11989,0,0,  13069,14689,0,0 };
    return  nStart[(ie - 1)*16 + (is - 1)*4 + ir - 1];
  }
int CSCIndexerPostls1::dbIndex ( const CSCDetId id,
int &  channel 
) const [virtual]

Build index used internally in online CSC conditions databases (the 'Igor Index')

This is the decimal integer ie*100000 + is*10000 + ir*1000 + ic*10 + il
(ie=1-2, is=1-4, ir=1-4, ic=1-36, il=1-6)
Channels 1-16 in ME1A (is=1, ir=4) are NOT reset to channels 65-80 of ME11. WARNING: This is now ADAPTED for unganged ME1a channels (we expect that the online conditions DB will adopt it too).

Implements CSCIndexerBase.

Definition at line 159 of file CSCIndexerPostls1.cc.

{
  int ec = id.endcap();
  int st = id.station();
  int rg = id.ring();
  int ch = id.chamber();
  int la = id.layer();

  return ec*100000 + st*10000 + rg*1000 + ch*10 + la;
}
std::pair< CSCDetId, CSCIndexerBase::IndexType > CSCIndexerPostls1::detIdFromChipIndex ( IndexType  ichi) const [virtual]

CSCDetId + chip within chamber from conditions data chip index.

Warning:
This function changes meaning with ganged and unganged ME1/1a. If ME1/1a is ganged then an ME1/1a chip index returns ME1/1b CSCDetId + chip=5.
If ME1/1a is unganged then an ME1/1a chip index returns ME1/1a CSCDetId + chip# in range 1-3.

Implements CSCIndexerBase.

Definition at line 84 of file CSCIndexerPostls1.cc.

References CSCDetId, CSCIndexerBase::detIdFromLayerIndex(), and Reference_intrackfit_cff::endcap.

{
  const LongIndexType lastnonme1a       = 15768; // chips in chambers with ME42 installed
  const LongIndexType lastpluszme1a     = 16416; // last unganged ME1a +z chip = 15768 + 648 = 16416
  const LongIndexType lastnonme42 = 13608; // chips in 2008 installed chambers
  const LongIndexType lastplusznonme42 = 6804; // = 13608/2
  const LongIndexType firstme13  = 2161; // First channel of ME13
  const LongIndexType lastme13   = 3024; // Last channel of ME13

  const IndexType lastnonme42layer = 2808;
  const IndexType lastplusznonme42layer = 1404; // = 2808/2
  const IndexType firstme13layer  = 433; // = 72*6 + 1 (ME13 chambers are 72-108 in range 1-234)
  const IndexType lastme13layer   = 648; // = 108*6

  bool me1a = false;

  // Most chambers (except ME13, ME1a) have 5 chips/layer
  IndexType nchipPerLayer = 5;

  // Set endcap to +z. This should work for ME42 channels too, since we don't need to calculate its endcap explicitly.
  IndexType ie = 1;

  LongIndexType istart = 0;
  IndexType layerOffset = 0;

  if ( ici <= lastnonme42 )
  {
    // Chambers as of 2008 Installation (ME11 keeps the same #of chips 5 allocated for it in the index)
    if ( ici > lastplusznonme42 )
    {
      ie = 2;
      ici -= lastplusznonme42;
    }
    if ( ici > lastme13 ) // after ME13
    {
      istart = lastme13;
      layerOffset = lastme13layer;
    }
    else if ( ici >= firstme13 ) // ME13
    {
      istart = firstme13 - 1;
      layerOffset = firstme13layer - 1;
      nchipPerLayer = 4;
    }
  }
  else if ( ici <= lastnonme1a ) // ME42 chambers
  {
    istart = lastnonme42;
    layerOffset = lastnonme42layer;
    // don't care about ie, as ME42 stratch of indices is uniform
  }
  else  // Unganged ME1a channels
  {
    me1a = true;
    if (ici > lastpluszme1a) ie = 2;
    istart = lastnonme1a;
    nchipPerLayer = 3;
    // layerOffset stays 0, as we want to map them onto ME1b's layer indices
  }

  ici -= istart; // remove earlier group(s)
  IndexType ichip = (ici - 1)%nchipPerLayer + 1;
  IndexType ili = (ici - 1)/nchipPerLayer + 1;
  ili += layerOffset; // add appropriate offset for earlier group(s)
  if ( ie != 1 ) ili += lastplusznonme42layer; // add offset to -z endcap; ME42 doesn't need this.

  CSCDetId id = detIdFromLayerIndex(ili);

  // For unganged ME1a we need to turn this ME11 detid into an ME1a one
  if ( me1a ) id = CSCDetId( id.endcap(), 1, 4, id.chamber(), id.layer() );

  return std::make_pair(id, ichip);
}
CSCIndexerBase::GasGainIndexType CSCIndexerPostls1::detIdFromGasGainIndex ( IndexType  igg) const [virtual]

CSCDetId + HV segment + chip within chamber from conditions data gas gain index.

Warning:
This function changes meaning with ganged and unganged ME1/1a. If ME1/1a is ganged then an ME1/1a gas gain index returns ME1/1b CSCDetId + HVsegment=1 + chip=5.
If ME1/1a is unganged then an ME1/1a gas gain index returns ME1/1a CSCDetId + HVsegment=1 + chip# in range 1-3.

Implements CSCIndexerBase.

Definition at line 171 of file CSCIndexerPostls1.cc.

References chipsPerLayer(), RingESSource_cfi::rings, CSCIndexerBase::sectorsPerLayer(), and mergeVDriftHistosByStation::stations.

{
  const int n_types = 20;
  const IndexType type_starts[n_types] =
    {1,  1081, 4321, 6913, 8533, 13933, 15553, 20953, 22573, 23653, 26893, 29485, 31105, 36505, 38125, 43525, 45145, 50545, 55945, 56593};
  //+1/1 +1/2  +1/3  +2/1  +2/2  +3/1   +3/2   +4/1   -1/1   -1/2   -1/3   -2/1   -2/2   -3/1   -3/2   -4/1   +4/2   -4/2   +1/4   -1/4

  const int endcaps[n_types] =
    {1,  1,    1,    1,    1,    1,     1,     1,     2,     2,     2,     2,     2,     2,     2,     2,     1,     2,     1,     2};
  const int stations[n_types] =
    {1,  1,    1,    2,    2,    3,     3,     4,     1,     1,     1,     2,     2,     3,     3,     4,     4,     4,     1,     1};
  const int rings[n_types] =
    {1,  2,    3,    1,    2,    1,     2,     1,     1,     2,     3,     1,     2,     1,     2,     1,     2,     2,     4,     4};

  // determine chamber type
  std::vector<IndexType> v_type_starts(type_starts, type_starts + n_types);
  int type = int(std::upper_bound(v_type_starts.begin(), v_type_starts.end(), igg) -  v_type_starts.begin()) - 1;

  // determine factors for #HVsectors and #chips
  int sectors_per_layer = sectorsPerLayer(stations[type], rings[type]);
  int chips_per_layer = chipsPerLayer(stations[type], rings[type]);

  IndexType igg_chamber_etc = igg - type_starts[type] + 1;

  IndexType igg_chamber_and_layer = (igg_chamber_etc - 1) / sectors_per_layer + 1;

  // extract chamber & layer
  int chamber = (igg_chamber_and_layer - 1) / 6 + 1;
  int layer   = (igg_chamber_and_layer - 1) % 6 + 1;

  IndexType igg_hvseg_etc         = (igg_chamber_etc - 1) % sectors_per_layer + 1;

  // extract HVsegment and chip numbers
  IndexType hvsegment = (igg_hvseg_etc - 1) / chips_per_layer + 1;
  IndexType chip      = (igg_hvseg_etc - 1) % chips_per_layer + 1;

  CSCDetId id(endcaps[type], stations[type], rings[type], chamber, layer);
  return boost::make_tuple(id, hvsegment, chip);
}
std::pair< CSCDetId, CSCIndexerBase::IndexType > CSCIndexerPostls1::detIdFromStripChannelIndex ( LongIndexType  ichi) const [virtual]

Decode CSCDetId from various indexes and labels

Implements CSCIndexerBase.

Definition at line 7 of file CSCIndexerPostls1.cc.

References CSCDetId, CSCIndexerBase::detIdFromLayerIndex(), Reference_intrackfit_cff::endcap, and nchan.

{
  const LongIndexType lastnonme1a       = 252288; // channels with ME42 installed
  const LongIndexType lastpluszme1a     = 262656; // last unganged ME1a +z channel = 252288 + 10368
  const LongIndexType lastnonme42 = 217728; // channels in 2008 installed chambers
  const LongIndexType lastplusznonme42 = 108864; // = 217728/2
  const LongIndexType firstme13  = 34561; // First channel of ME13
  const LongIndexType lastme13   = 48384; // Last channel of ME13

  const IndexType lastnonme42layer = 2808;
  const IndexType lastplusznonme42layer = 1404; // = 2808/2
  const IndexType firstme13layer  = 433; // = 72*6 + 1 (ME13 chambers are 72-108 in range 1-234)
  const IndexType lastme13layer   = 648; // = 108*6

  bool me1a = false;

  // Most chambers (except ME13 & ME1a) have 80 channels index width allocated
  //   unganged ME1a have 48 channels
  //   ME13 have 64 channels
  IndexType nchan = 80;

  // Set endcap to +z initially
  IndexType ie = 1;

  LongIndexType istart = 0;
  IndexType layerOffset = 0;

  if ( isi <= lastnonme42 )
  {
    // Chambers as of 2008 Installation (ME11 keeps the same #of channels 80 allocated for it in the index)
    if ( isi > lastplusznonme42 )
    {
      ie = 2;
      isi -= lastplusznonme42;
    }
    if ( isi > lastme13 ) // after ME13
    {
      istart = lastme13;
      layerOffset = lastme13layer;
    }
    else if ( isi >= firstme13 ) // ME13
    {
      istart = firstme13 - 1;
      layerOffset = firstme13layer - 1;
      nchan = 64;
    }
  }
  else if ( isi <= lastnonme1a ) // ME42 chambers
  {
    istart = lastnonme42;
    layerOffset = lastnonme42layer;
    // don't care about ie, as ME42 stretch of indices is uniform
  }
  else // Unganged ME1a channels
  {
    me1a = true;
    if (isi > lastpluszme1a) ie = 2;
    istart = lastnonme1a;
    nchan = 48;
    // layerOffset stays 0, as we want to map them onto ME1b's layer indices
  }

  isi -= istart; // remove earlier group(s)
  IndexType ichan = (isi - 1)%nchan + 1;
  IndexType ili = (isi - 1)/nchan + 1;
  ili += layerOffset; // add appropriate offset for earlier group(s)
  if ( ie != 1 ) ili += lastplusznonme42layer; // add offset to -z endcap; ME42 doesn't need this.

  CSCDetId id = detIdFromLayerIndex(ili);

  // For unganged ME1a we need to turn this ME11 detid into an ME1a one
  if ( me1a ) id = CSCDetId( id.endcap(), 1, 4, id.chamber(), id.layer() );

  return std::make_pair(id, ichan);
}
IndexType CSCIndexerPostls1::maxChipIndex ( ) const [inline, virtual]

Implements CSCIndexerBase.

Definition at line 50 of file CSCIndexerPostls1.h.

{ return 17064; }
IndexType CSCIndexerPostls1::maxGasGainIndex ( ) const [inline, virtual]

Implements CSCIndexerBase.

Definition at line 51 of file CSCIndexerPostls1.h.

{ return 57240; }
LongIndexType CSCIndexerPostls1::maxStripChannelIndex ( ) const [inline, virtual]

Implements CSCIndexerBase.

Definition at line 49 of file CSCIndexerPostls1.h.

{ return 273024; }
std::string CSCIndexerPostls1::name ( ) const [inline, virtual]

Reimplemented from CSCIndexerBase.

Definition at line 44 of file CSCIndexerPostls1.h.

{ return "CSCIndexerPostls1"; }
IndexType CSCIndexerPostls1::onlineRingsInStation ( IndexType  is) const [inline, virtual]

How many online rings are there in station 'is'=1, 2, 3, 4 ?

Warning:
: ME1a and ME1b are considered as two separate 'online' rings for the upgrade

Implements CSCIndexerBase.

Definition at line 63 of file CSCIndexerPostls1.h.

  {
    const IndexType nrings[5] = { 0, 4, 2, 2, 2 };
    return nrings[is];
  }
IndexType CSCIndexerPostls1::sectorStart ( IndexType  ie,
IndexType  is,
IndexType  ir 
) const [inline, virtual]

Linear index for 1st Gas gain sector in ring 'ir' of station 'is' in endcap 'ie'.

Endcap label range 1-2, Station label range 1-4, Ring label range 1-4 (4=ME1a)

Warning:
: unganged ME1a has 3 own chips, which are currently appended to the end of the index range, ME1b still keeps 5 chips with the chip #5 index being unused.

Implements CSCIndexerBase.

Definition at line 211 of file CSCIndexerPostls1.h.

  {
    // There are 36 chambers * 6 layers * 5 CFEB's * 1 HV segment = 1080 gas-gain sectors in ME1/1 (non-upgraded)
    // There are 36 chambers * 6 layers * 3 CFEB's * 1 HV segment = 648 gas-gain sectors in ME1/1a (upgraded)
    // There are 36*6*5*3 = 3240 gas-gain sectors in ME1/2
    // There are 36*6*4*3 = 2592 gas-gain sectors in ME1/3
    // There are 18*6*5*3 = 1620 gas-gain sectors in ME[2-4]/1
    // There are 36*6*5*5 = 5400 gas-gain sectors in ME[2-4]/2
    // Start of -z channels (CSCs 2008) is 22572 + 1 = 22573
    // Start of +z (ME42) is 45144 + 1 = 45145
    // Start of -z (ME42) is 45144 + 1 + 5400 = 50545
    // Start of +z (ME1a) is 45144 + 1 + 2*5400 = 55945
    // Start of -z (ME42) is 45144 + 1 + 2*5400 + 648 = 56593
    const IndexType nStart[32] =
      {1    , 1081 ,  4321, 55945,  //ME+1/1,ME+1/2,ME+1/3,ME+1/a
       6913 , 8533 ,     0,     0,  //ME+2/1,ME+2/2
       13933, 15553,     0,     0,  //ME+3/1,ME+3/2
       20953, 45145,     0,     0,  //ME+4/1,ME+4/2 (note, ME+4/2 index follows ME-4/1...)
       22573, 23653, 26893, 56593,  //ME-1/1,ME-1/2,ME-1/3,ME+1/a
       29485, 31105,     0,     0,  //ME-2/1,ME-2/2
       36505, 38125,     0,     0,  //ME-3/1,ME-3/2
       43525, 50545,     0,     0 };//ME-4/1,ME-4/2 (note, ME-4/2 index follows ME+4/2...)
    return  nStart[(ie-1)*16 + (is-1)*4 + ir - 1];
  }
IndexType CSCIndexerPostls1::stripChannelsPerLayer ( IndexType  is,
IndexType  ir 
) const [inline, virtual]

Number of strip channel indices for a layer in a chamber defined by station number 'is' and ring number 'ir'.

Station label range 1-4, Ring label range 1-4 (4=ME1a)

This depends on the ordering of the channels in the database. In the currently implemented upgrade scenario, the ME1b still keeps the 80 indices wide ranges inherited from Startup (with the last 65-80 indices remaining unused), while the ME1/1A unganged channels get their own 48 indices wide ranges.

Implements CSCIndexerBase.

Definition at line 124 of file CSCIndexerPostls1.h.

  {
    const IndexType nSCinC[16] = { 80,80,64,48,  80,80,0,0,  80,80,0,0,  80,80,0,0 };
    return nSCinC[(is - 1)*4 + ir - 1];
  }
IndexType CSCIndexerPostls1::stripChannelsPerOfflineLayer ( IndexType  is,
IndexType  ir 
) const [inline, virtual]

Number of strip readout channels per layer in an offline chamber with ring 'ir' and station 'is'.

Assume ME1a has 48 unganged readout channels.

Implements CSCIndexerBase.

Definition at line 75 of file CSCIndexerPostls1.h.

  {
    const IndexType nSC[16] = { 64,80,64,48,  80,80,0,0,  80,80,0,0,  80,80,0,0 };
    return nSC[(is-1)*4 + ir - 1];
  }
IndexType CSCIndexerPostls1::stripChannelsPerOnlineLayer ( IndexType  is,
IndexType  ir 
) const [inline, virtual]

Number of strip readout channels per layer in an online chamber with ring 'ir' and station 'is'.

Assume ME1a has 48 unganged readout channels. Online chambers ME1a and ME1b are separate.

Implements CSCIndexerBase.

Definition at line 88 of file CSCIndexerPostls1.h.

  {
    const IndexType nSC[16] = { 64,80,64,48,  80,80,0,0,  80,80,0,0,  80,80,0,0 };
    return nSC[(is-1)*4 + ir - 1];
  }
LongIndexType CSCIndexerPostls1::stripChannelStart ( IndexType  ie,
IndexType  is,
IndexType  ir 
) const [inline, virtual]

Linear index for 1st strip channel in ring 'ir' of station 'is' in endcap 'ie'.

Endcap label range 1-2, Station label range 1-4, Ring label range 1-4 (4=ME1a)

WARNING: ME1a channels are NOT considered the last 16 of the 80 total in each layer of an ME11 chamber!

Implements CSCIndexerBase.

Definition at line 137 of file CSCIndexerPostls1.h.

  {
    // These are in the ranges 1-217728 (CSCs 2008), 217729-252288 (ME42), and 252289-273024 (unganged ME1a)
    // There are 1-108884 channels per endcap (CSCs 2008), 17280 channels per endcap (ME42),
    // and 10368 channels per endcap (unganged ME1a)
    // Start of -z channels (CSCs 2008) is 108864 + 1    = 108865
    // Start of +z (ME42) is 217728 + 1                  = 217729
    // Start of -z (ME42) is 217728 + 1 + 17280          = 235009
    // Start of +z (unganged ME1a) is 252288 + 1         = 252289
    // Start of -z (unganged ME1a) is 252288 + 1 + 10368 = 262657
    const LongIndexType nStart[32] =
      {      1, 17281, 34561,252289,   48385, 57025,0,0,   74305, 82945,0,0,  100225,217729,0,0,
        108865,126145,143425,262657,  157249,165889,0,0,  183169,191809,0,0,  209089,235009,0,0 };
    return  nStart[(ie - 1)*16 + (is - 1)*4 + ir - 1];
  }