CMS 3D CMS Logo

GctFormatTranslateV38.cc

Go to the documentation of this file.
00001 #include "EventFilter/GctRawToDigi/src/GctFormatTranslateV38.h"
00002 
00003 // C++ headers
00004 #include <iostream>
00005 #include <cassert>
00006 
00007 // Framework headers
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009 
00010 // Namespace resolution
00011 using std::cout;
00012 using std::endl;
00013 using std::pair;
00014 using std::make_pair;
00015 
00016 // INITIALISE STATIC VARIABLES
00017 GctFormatTranslateV38::BlockLengthMap GctFormatTranslateV38::m_blockLength = GctFormatTranslateV38::BlockLengthMap();
00018 GctFormatTranslateV38::BlockNameMap GctFormatTranslateV38::m_blockName = GctFormatTranslateV38::BlockNameMap();
00019 GctFormatTranslateV38::BlockIdToUnpackFnMap GctFormatTranslateV38::m_blockUnpackFn = GctFormatTranslateV38::BlockIdToUnpackFnMap();
00020 GctFormatTranslateV38::BlkToRctCrateMap GctFormatTranslateV38::m_rctEmCrate = GctFormatTranslateV38::BlkToRctCrateMap();
00021 GctFormatTranslateV38::BlkToRctCrateMap GctFormatTranslateV38::m_rctJetCrate = GctFormatTranslateV38::BlkToRctCrateMap();
00022 GctFormatTranslateV38::BlockIdToEmCandIsoBoundMap GctFormatTranslateV38::m_internEmIsoBounds = GctFormatTranslateV38::BlockIdToEmCandIsoBoundMap();
00023 
00024 
00025 // PUBLIC METHODS
00026 
00027 GctFormatTranslateV38::GctFormatTranslateV38(bool hltMode, bool unpackSharedRegions):
00028   GctFormatTranslateBase(hltMode, unpackSharedRegions)
00029 {
00030   static bool initClass = true;
00031 
00032   if(initClass)
00033   {
00034     initClass = false;
00035 
00036     /*** Setup BlockID to BlockLength Map ***/
00037     // Miscellaneous Blocks
00038     m_blockLength.insert(make_pair(0x000,0));      // NULL
00039     // ConcJet FPGA
00040     m_blockLength.insert(make_pair(0x580,12));     // ConcJet: Input TrigPathA (Jet Cands)
00041     m_blockLength.insert(make_pair(0x581,2));      // ConcJet: Input TrigPathB (HF Rings)
00042     m_blockLength.insert(make_pair(0x582,4));      // ConcJet: Input TrigPathC (MissHt)
00043     m_blockLength.insert(make_pair(0x583,8));      // ConcJet: Jet Cands and Counts Output to GT
00044     m_blockLength.insert(make_pair(0x587,4));      // ConcJet: BX & Orbit Info
00045     // ConcElec FPGA
00046     m_blockLength.insert(make_pair(0x680,16));     // ConcElec: Input TrigPathA (EM Cands)
00047     m_blockLength.insert(make_pair(0x681,6));      // ConcElec: Input TrigPathB (Et Sums)
00048     m_blockLength.insert(make_pair(0x682,2));      // ConcElec: Input TrigPathC (Ht Sums)
00049     m_blockLength.insert(make_pair(0x683,6));      // ConcElec: EM Cands and Energy Sums Output to GT
00050     m_blockLength.insert(make_pair(0x686,2));      // ConcElec: Test (GT Serdes Loopback)
00051     m_blockLength.insert(make_pair(0x687,4));      // ConcElec: BX & Orbit Info
00052     // Electron Leaf FPGAs
00053     m_blockLength.insert(make_pair(0x800,20));     // Leaf0ElecPosEtaU1: Sort Input
00054     m_blockLength.insert(make_pair(0x803,4));      // Leaf0ElecPosEtaU1: Sort Output
00055     m_blockLength.insert(make_pair(0x804,15));     // Leaf0ElecPosEtaU1: Raw Input
00056     m_blockLength.insert(make_pair(0x880,16));     // Leaf0ElecPosEtaU2: Sort Input
00057     m_blockLength.insert(make_pair(0x883,4));      // Leaf0ElecPosEtaU2: Sort Output
00058     m_blockLength.insert(make_pair(0x884,12));     // Leaf0ElecPosEtaU2: Raw Input
00059     m_blockLength.insert(make_pair(0xc00,20));     // Leaf0ElecNegEtaU1: Sort Input
00060     m_blockLength.insert(make_pair(0xc03,4));      // Leaf0ElecNegEtaU1: Sort Output
00061     m_blockLength.insert(make_pair(0xc04,15));     // Leaf0ElecNegEtaU1: Raw Input
00062     m_blockLength.insert(make_pair(0xc80,16));     // Leaf0ElecNegEtaU2: Sort Input
00063     m_blockLength.insert(make_pair(0xc83,4));      // Leaf0ElecNegEtaU2: Sort Output
00064     m_blockLength.insert(make_pair(0xc84,12));     // Leaf0ElecNegEtaU2: Raw Input
00065     // Wheel Pos-eta Jet FPGA
00066     m_blockLength.insert(make_pair(0x300,27));     // WheelPosEtaJet: Input TrigPathA (Jet Sort)
00067     m_blockLength.insert(make_pair(0x301,3));      // WheelPosEtaJet: Input TrigPathB (MissHt)
00068     m_blockLength.insert(make_pair(0x303,6));      // WheelPosEtaJet: Output TrigPathA (Jet Sort)
00069     m_blockLength.insert(make_pair(0x305,2));      // WheelPosEtaJet: Output TrigPathB (MissHt)
00070     m_blockLength.insert(make_pair(0x306,32));     // WheelPosEtaJet: Test (deprecated)  (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00071     m_blockLength.insert(make_pair(0x307,4));      // WheelPosEtaJet: Info (deprecated)  (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00072     // Wheel Pos-eta Energy FPGA
00073     m_blockLength.insert(make_pair(0x380,21));     // WheelPosEtaEnergy: Input TrigPathA (Et)
00074     m_blockLength.insert(make_pair(0x381,6));      // WheelPosEtaEnergy: Input TrigPathB (Ht)
00075     m_blockLength.insert(make_pair(0x383,7));      // WheelPosEtaEnergy: Output TrigPathA (Et)
00076     m_blockLength.insert(make_pair(0x385,2));      // WheelPosEtaEnergy: Output TrigPathB (Ht)
00077     m_blockLength.insert(make_pair(0x386,32));     // WheelPosEtaEnergy: Test
00078     m_blockLength.insert(make_pair(0x387,6));      // WheelPosEtaEnergy: BX & Orbit Info   (Potential data incompatibility between V24/V25 where block length=4, and V27.1 where block length=6)
00079     // Wheel Neg-eta Jet FPGA
00080     m_blockLength.insert(make_pair(0x700,27));     // WheelNegEtaJet: Input TrigPathA (Jet Sort)
00081     m_blockLength.insert(make_pair(0x701,3));      // WheelNegEtaJet: Input TrigPathB (MissHt)
00082     m_blockLength.insert(make_pair(0x703,6));      // WheelNegEtaJet: Output TrigPathA (Jet Sort)
00083     m_blockLength.insert(make_pair(0x705,2));      // WheelNegEtaJet: Output TrigPathB (MissHt)
00084     m_blockLength.insert(make_pair(0x706,32));     // WheelNegEtaJet: Test (deprecated)  (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00085     m_blockLength.insert(make_pair(0x707,4));      // WheelNegEtaJet: Info (deprecated)  (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00086     // Wheel Neg-eta Energy FPGA
00087     m_blockLength.insert(make_pair(0x780,21));     // WheelNegEtaEnergy: Input TrigPathA (Et)
00088     m_blockLength.insert(make_pair(0x781,6));      // WheelNegEtaEnergy: Input TrigPathB (Ht)
00089     m_blockLength.insert(make_pair(0x783,7));      // WheelNegEtaEnergy: Output TrigPathA (Et)
00090     m_blockLength.insert(make_pair(0x785,2));      // WheelNegEtaEnergy: Output TrigPathB (Ht)
00091     m_blockLength.insert(make_pair(0x786,32));     // WheelNegEtaEnergy: Test
00092     m_blockLength.insert(make_pair(0x787,6));      // WheelNegEtaEnergy: BX & Orbit Info   (Potential data incompatibility between V24/V25 where block length=4, and V27.1 where block length=6)
00093     // Jet Leaf FPGAs - Positive Eta 
00094     m_blockLength.insert(make_pair(0x900,13));     // Leaf1JetPosEtaU1: JF2 Input
00095     m_blockLength.insert(make_pair(0x901,3));      // Leaf1JetPosEtaU1: JF2 Shared Received
00096     m_blockLength.insert(make_pair(0x902,3));      // Leaf1JetPosEtaU1: JF2 Shared Sent
00097     m_blockLength.insert(make_pair(0x903,10));     // Leaf1JetPosEtaU1: JF2 Output
00098     m_blockLength.insert(make_pair(0x904,8));      // Leaf1JetPosEtaU1: JF2 Raw Input
00099     m_blockLength.insert(make_pair(0x908,13));     // Leaf1JetPosEtaU1: JF3 Input
00100     m_blockLength.insert(make_pair(0x909,3));      // Leaf1JetPosEtaU1: JF3 Shared Received
00101     m_blockLength.insert(make_pair(0x90a,3));      // Leaf1JetPosEtaU1: JF3 Shared Sent
00102     m_blockLength.insert(make_pair(0x90b,10));     // Leaf1JetPosEtaU1: JF3 Output
00103     m_blockLength.insert(make_pair(0x90c,8));      // Leaf1JetPosEtaU1: JF3 Raw Input
00104     m_blockLength.insert(make_pair(0x980,6));      // Leaf1JetPosEtaU2: Eta0 Input
00105     m_blockLength.insert(make_pair(0x984,6));      // Leaf1JetPosEtaU2: Eta0 Raw Input
00106     m_blockLength.insert(make_pair(0x988,13));     // Leaf1JetPosEtaU2: JF1 Input
00107     m_blockLength.insert(make_pair(0x989,3));      // Leaf1JetPosEtaU2: JF1 Shared Received
00108     m_blockLength.insert(make_pair(0x98a,3));      // Leaf1JetPosEtaU2: JF1 Shared Sent
00109     m_blockLength.insert(make_pair(0x98b,10));     // Leaf1JetPosEtaU2: JF1 Output
00110     m_blockLength.insert(make_pair(0x98c,8));      // Leaf1JetPosEtaU2: JF1 Raw Input
00111     m_blockLength.insert(make_pair(0xa00,13));     // Leaf2JetPosEtaU1: JF2 Input
00112     m_blockLength.insert(make_pair(0xa01,3));      // Leaf2JetPosEtaU1: JF2 Shared Received
00113     m_blockLength.insert(make_pair(0xa02,3));      // Leaf2JetPosEtaU1: JF2 Shared Sent
00114     m_blockLength.insert(make_pair(0xa03,10));     // Leaf2JetPosEtaU1: JF2 Output
00115     m_blockLength.insert(make_pair(0xa04,8));      // Leaf2JetPosEtaU1: JF2 Raw Input
00116     m_blockLength.insert(make_pair(0xa08,13));     // Leaf2JetPosEtaU1: JF3 Input
00117     m_blockLength.insert(make_pair(0xa09,3));      // Leaf2JetPosEtaU1: JF3 Shared Received
00118     m_blockLength.insert(make_pair(0xa0a,3));      // Leaf2JetPosEtaU1: JF3 Shared Sent
00119     m_blockLength.insert(make_pair(0xa0b,10));     // Leaf2JetPosEtaU1: JF3 Output
00120     m_blockLength.insert(make_pair(0xa0c,8));      // Leaf2JetPosEtaU1: JF3 Raw Input
00121     m_blockLength.insert(make_pair(0xa80,6));      // Leaf2JetPosEtaU2: Eta0 Input
00122     m_blockLength.insert(make_pair(0xa84,6));      // Leaf2JetPosEtaU2: Eta0 Raw Input
00123     m_blockLength.insert(make_pair(0xa88,13));     // Leaf2JetPosEtaU2: JF1 Input
00124     m_blockLength.insert(make_pair(0xa89,3));      // Leaf2JetPosEtaU2: JF1 Shared Received
00125     m_blockLength.insert(make_pair(0xa8a,3));      // Leaf2JetPosEtaU2: JF1 Shared Sent
00126     m_blockLength.insert(make_pair(0xa8b,10));     // Leaf2JetPosEtaU2: JF1 Output
00127     m_blockLength.insert(make_pair(0xa8c,8));      // Leaf2JetPosEtaU2: JF1 Raw Input
00128     m_blockLength.insert(make_pair(0xb00,13));     // Leaf3JetPosEtaU1: JF2 Input
00129     m_blockLength.insert(make_pair(0xb01,3));      // Leaf3JetPosEtaU1: JF2 Shared Received
00130     m_blockLength.insert(make_pair(0xb02,3));      // Leaf3JetPosEtaU1: JF2 Shared Sent
00131     m_blockLength.insert(make_pair(0xb03,10));     // Leaf3JetPosEtaU1: JF2 Output
00132     m_blockLength.insert(make_pair(0xb04,8));      // Leaf3JetPosEtaU1: JF2 Raw Input
00133     m_blockLength.insert(make_pair(0xb08,13));     // Leaf3JetPosEtaU1: JF3 Input
00134     m_blockLength.insert(make_pair(0xb09,3));      // Leaf3JetPosEtaU1: JF3 Shared Received
00135     m_blockLength.insert(make_pair(0xb0a,3));      // Leaf3JetPosEtaU1: JF3 Shared Sent
00136     m_blockLength.insert(make_pair(0xb0b,10));     // Leaf3JetPosEtaU1: JF3 Output
00137     m_blockLength.insert(make_pair(0xb0c,8));      // Leaf3JetPosEtaU1: JF3 Raw Input
00138     m_blockLength.insert(make_pair(0xb80,6));      // Leaf3JetPosEtaU2: Eta0 Input
00139     m_blockLength.insert(make_pair(0xb84,6));      // Leaf3JetPosEtaU2: Eta0 Raw Input
00140     m_blockLength.insert(make_pair(0xb88,13));     // Leaf3JetPosEtaU2: JF1 Input
00141     m_blockLength.insert(make_pair(0xb89,3));      // Leaf3JetPosEtaU2: JF1 Shared Received
00142     m_blockLength.insert(make_pair(0xb8a,3));      // Leaf3JetPosEtaU2: JF1 Shared Sent
00143     m_blockLength.insert(make_pair(0xb8b,10));     // Leaf3JetPosEtaU2: JF1 Output
00144     m_blockLength.insert(make_pair(0xb8c,8));      // Leaf3JetPosEtaU2: JF1 Raw Input
00145     // Jet Leaf FPGAs - Negative Eta 
00146     m_blockLength.insert(make_pair(0xd00,13));     // Leaf1JetNegEtaU1: JF2 Input
00147     m_blockLength.insert(make_pair(0xd01,3));      // Leaf1JetNegEtaU1: JF2 Shared Received
00148     m_blockLength.insert(make_pair(0xd02,3));      // Leaf1JetNegEtaU1: JF2 Shared Sent
00149     m_blockLength.insert(make_pair(0xd03,10));     // Leaf1JetNegEtaU1: JF2 Output
00150     m_blockLength.insert(make_pair(0xd04,8));      // Leaf1JetNegEtaU1: JF2 Raw Input
00151     m_blockLength.insert(make_pair(0xd08,13));     // Leaf1JetNegEtaU1: JF3 Input
00152     m_blockLength.insert(make_pair(0xd09,3));      // Leaf1JetNegEtaU1: JF3 Shared Received
00153     m_blockLength.insert(make_pair(0xd0a,3));      // Leaf1JetNegEtaU1: JF3 Shared Sent
00154     m_blockLength.insert(make_pair(0xd0b,10));     // Leaf1JetNegEtaU1: JF3 Output
00155     m_blockLength.insert(make_pair(0xd0c,8));      // Leaf1JetNegEtaU1: JF3 Raw Input
00156     m_blockLength.insert(make_pair(0xd80,6));      // Leaf1JetNegEtaU2: Eta0 Input
00157     m_blockLength.insert(make_pair(0xd84,6));      // Leaf1JetNegEtaU2: Eta0 Raw Input
00158     m_blockLength.insert(make_pair(0xd88,13));     // Leaf1JetNegEtaU2: JF1 Input
00159     m_blockLength.insert(make_pair(0xd89,3));      // Leaf1JetNegEtaU2: JF1 Shared Received
00160     m_blockLength.insert(make_pair(0xd8a,3));      // Leaf1JetNegEtaU2: JF1 Shared Sent
00161     m_blockLength.insert(make_pair(0xd8b,10));     // Leaf1JetNegEtaU2: JF1 Output
00162     m_blockLength.insert(make_pair(0xd8c,8));      // Leaf1JetNegEtaU2: JF1 Raw Input
00163     m_blockLength.insert(make_pair(0xe00,13));     // Leaf2JetNegEtaU1: JF2 Input
00164     m_blockLength.insert(make_pair(0xe01,3));      // Leaf2JetNegEtaU1: JF2 Shared Received
00165     m_blockLength.insert(make_pair(0xe02,3));      // Leaf2JetNegEtaU1: JF2 Shared Sent
00166     m_blockLength.insert(make_pair(0xe03,10));     // Leaf2JetNegEtaU1: JF2 Output
00167     m_blockLength.insert(make_pair(0xe04,8));      // Leaf2JetNegEtaU1: JF2 Raw Input
00168     m_blockLength.insert(make_pair(0xe08,13));     // Leaf2JetNegEtaU1: JF3 Input
00169     m_blockLength.insert(make_pair(0xe09,3));      // Leaf2JetNegEtaU1: JF3 Shared Received
00170     m_blockLength.insert(make_pair(0xe0a,3));      // Leaf2JetNegEtaU1: JF3 Shared Sent
00171     m_blockLength.insert(make_pair(0xe0b,10));     // Leaf2JetNegEtaU1: JF3 Output
00172     m_blockLength.insert(make_pair(0xe0c,8));      // Leaf2JetNegEtaU1: JF3 Raw Input
00173     m_blockLength.insert(make_pair(0xe80,6));      // Leaf2JetNegEtaU2: Eta0 Input
00174     m_blockLength.insert(make_pair(0xe84,6));      // Leaf2JetNegEtaU2: Eta0 Raw Input
00175     m_blockLength.insert(make_pair(0xe88,13));     // Leaf2JetNegEtaU2: JF1 Input
00176     m_blockLength.insert(make_pair(0xe89,3));      // Leaf2JetNegEtaU2: JF1 Shared Received
00177     m_blockLength.insert(make_pair(0xe8a,3));      // Leaf2JetNegEtaU2: JF1 Shared Sent
00178     m_blockLength.insert(make_pair(0xe8b,10));     // Leaf2JetNegEtaU2: JF1 Output
00179     m_blockLength.insert(make_pair(0xe8c,8));      // Leaf2JetNegEtaU2: JF1 Raw Input
00180     m_blockLength.insert(make_pair(0xf00,13));     // Leaf3JetNegEtaU1: JF2 Input
00181     m_blockLength.insert(make_pair(0xf01,3));      // Leaf3JetNegEtaU1: JF2 Shared Received
00182     m_blockLength.insert(make_pair(0xf02,3));      // Leaf3JetNegEtaU1: JF2 Shared Sent
00183     m_blockLength.insert(make_pair(0xf03,10));     // Leaf3JetNegEtaU1: JF2 Output
00184     m_blockLength.insert(make_pair(0xf04,8));      // Leaf3JetNegEtaU1: JF2 Raw Input
00185     m_blockLength.insert(make_pair(0xf08,13));     // Leaf3JetNegEtaU1: JF3 Input
00186     m_blockLength.insert(make_pair(0xf09,3));      // Leaf3JetNegEtaU1: JF3 Shared Received
00187     m_blockLength.insert(make_pair(0xf0a,3));      // Leaf3JetNegEtaU1: JF3 Shared Sent
00188     m_blockLength.insert(make_pair(0xf0b,10));     // Leaf3JetNegEtaU1: JF3 Output
00189     m_blockLength.insert(make_pair(0xf0c,8));      // Leaf3JetNegEtaU1: JF3 Raw Input
00190     m_blockLength.insert(make_pair(0xf80,6));      // Leaf3JetNegEtaU2: Eta0 Input
00191     m_blockLength.insert(make_pair(0xf84,6));      // Leaf3JetNegEtaU2: Eta0 Raw Input
00192     m_blockLength.insert(make_pair(0xf88,13));     // Leaf3JetNegEtaU2: JF1 Input    
00193     m_blockLength.insert(make_pair(0xf89,3));      // Leaf3JetNegEtaU2: JF1 Shared Received
00194     m_blockLength.insert(make_pair(0xf8a,3));      // Leaf3JetNegEtaU2: JF1 Shared Sent
00195     m_blockLength.insert(make_pair(0xf8b,10));     // Leaf3JetNegEtaU2: JF1 Output
00196     m_blockLength.insert(make_pair(0xf8c,8));      // Leaf3JetNegEtaU2: JF1 Raw Input
00197 
00198 
00199     /*** Setup BlockID to BlockName Map ***/
00200     // Miscellaneous Blocks
00201     m_blockName.insert(make_pair(0x000,"NULL"));
00202     // ConcJet FPGA
00203     m_blockName.insert(make_pair(0x580,"ConcJet: Input TrigPathA (Jet Cands)"));
00204     m_blockName.insert(make_pair(0x581,"ConcJet: Input TrigPathB (HF Rings)"));
00205     m_blockName.insert(make_pair(0x582,"ConcJet: Input TrigPathC (MissHt)"));
00206     m_blockName.insert(make_pair(0x583,"ConcJet: Jet Cands and Counts Output to GT"));
00207     m_blockName.insert(make_pair(0x587,"ConcJet: BX & Orbit Info"));
00208     // ConcElec FPGA
00209     m_blockName.insert(make_pair(0x680,"ConcElec: Input TrigPathA (EM Cands)"));
00210     m_blockName.insert(make_pair(0x681,"ConcElec: Input TrigPathB (Et Sums)"));
00211     m_blockName.insert(make_pair(0x682,"ConcElec: Input TrigPathC (Ht Sums)"));
00212     m_blockName.insert(make_pair(0x683,"ConcElec: EM Cands and Energy Sums Output to GT"));
00213     m_blockName.insert(make_pair(0x686,"ConcElec: Test (GT Serdes Loopback)"));
00214     m_blockName.insert(make_pair(0x687,"ConcElec: BX & Orbit Info"));
00215     // Electron Leaf FPGAs
00216     m_blockName.insert(make_pair(0x800,"Leaf0ElecPosEtaU1: Sort Input"));
00217     m_blockName.insert(make_pair(0x803,"Leaf0ElecPosEtaU1: Sort Output"));
00218     m_blockName.insert(make_pair(0x804,"Leaf0ElecPosEtaU1: Raw Input"));
00219     m_blockName.insert(make_pair(0x880,"Leaf0ElecPosEtaU2: Sort Input"));
00220     m_blockName.insert(make_pair(0x883,"Leaf0ElecPosEtaU2: Sort Output"));
00221     m_blockName.insert(make_pair(0x884,"Leaf0ElecPosEtaU2: Raw Input"));
00222     m_blockName.insert(make_pair(0xc00,"Leaf0ElecNegEtaU1: Sort Input"));
00223     m_blockName.insert(make_pair(0xc03,"Leaf0ElecNegEtaU1: Sort Output"));
00224     m_blockName.insert(make_pair(0xc04,"Leaf0ElecNegEtaU1: Raw Input"));
00225     m_blockName.insert(make_pair(0xc80,"Leaf0ElecNegEtaU2: Sort Input"));
00226     m_blockName.insert(make_pair(0xc83,"Leaf0ElecNegEtaU2: Sort Output"));
00227     m_blockName.insert(make_pair(0xc84,"Leaf0ElecNegEtaU2: Raw Input"));
00228     // Wheel Pos-eta Jet FPGA
00229     m_blockName.insert(make_pair(0x300,"WheelPosEtaJet: Input TrigPathA (Jet Sort)"));
00230     m_blockName.insert(make_pair(0x301,"WheelPosEtaJet: Input TrigPathB (MissHt)"));  
00231     m_blockName.insert(make_pair(0x303,"WheelPosEtaJet: Output TrigPathA (Jet Sort)"));
00232     m_blockName.insert(make_pair(0x305,"WheelPosEtaJet: Output TrigPathB (MissHt)"));
00233     m_blockName.insert(make_pair(0x306,"WheelPosEtaJet: Test (deprecated)"));  // (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00234     m_blockName.insert(make_pair(0x307,"WheelPosEtaJet: Info (deprecated)"));  // (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00235     // Wheel Pos-eta Energy FPGA
00236     m_blockName.insert(make_pair(0x380,"WheelPosEtaEnergy: Input TrigPathA (Et)"));
00237     m_blockName.insert(make_pair(0x381,"WheelPosEtaEnergy: Input TrigPathB (Ht)"));
00238     m_blockName.insert(make_pair(0x383,"WheelPosEtaEnergy: Output TrigPathA (Et)"));
00239     m_blockName.insert(make_pair(0x385,"WheelPosEtaEnergy: Output TrigPathB (Ht)"));
00240     m_blockName.insert(make_pair(0x386,"WheelPosEtaEnergy: Test"));
00241     m_blockName.insert(make_pair(0x387,"WheelPosEtaEnergy: BX & Orbit Info"));
00242     // Wheel Neg-eta Jet FPGA
00243     m_blockName.insert(make_pair(0x700,"WheelNegEtaJet: Input TrigPathA (Jet Sort)"));
00244     m_blockName.insert(make_pair(0x701,"WheelNegEtaJet: Input TrigPathB (MissHt)"));
00245     m_blockName.insert(make_pair(0x703,"WheelNegEtaJet: Output TrigPathA (Jet Sort)"));
00246     m_blockName.insert(make_pair(0x705,"WheelNegEtaJet: Output TrigPathB (MissHt)"));
00247     m_blockName.insert(make_pair(0x706,"WheelNegEtaJet: Test (deprecated)"));  // (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00248     m_blockName.insert(make_pair(0x707,"WheelNegEtaJet: Info (deprecated)"));  // (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00249     // Wheel Neg-eta Energy FPGA
00250     m_blockName.insert(make_pair(0x780,"WheelNegEtaEnergy: Input TrigPathA (Et)"));
00251     m_blockName.insert(make_pair(0x781,"WheelNegEtaEnergy: Input TrigPathB (Ht)"));
00252     m_blockName.insert(make_pair(0x783,"WheelNegEtaEnergy: Output TrigPathA (Et)"));
00253     m_blockName.insert(make_pair(0x785,"WheelNegEtaEnergy: Output TrigPathB (Ht)"));
00254     m_blockName.insert(make_pair(0x786,"WheelNegEtaEnergy: Test"));
00255     m_blockName.insert(make_pair(0x787,"WheelNegEtaEnergy: BX & Orbit Info"));
00256     // Jet Leaf FPGAs - Positive Eta
00257     m_blockName.insert(make_pair(0x900,"Leaf1JetPosEtaU1: JF2 Input"));
00258     m_blockName.insert(make_pair(0x901,"Leaf1JetPosEtaU1: JF2 Shared Received"));
00259     m_blockName.insert(make_pair(0x902,"Leaf1JetPosEtaU1: JF2 Shared Sent"));
00260     m_blockName.insert(make_pair(0x903,"Leaf1JetPosEtaU1: JF2 Output"));
00261     m_blockName.insert(make_pair(0x904,"Leaf1JetPosEtaU1: JF2 Raw Input"));
00262     m_blockName.insert(make_pair(0x908,"Leaf1JetPosEtaU1: JF3 Input"));
00263     m_blockName.insert(make_pair(0x909,"Leaf1JetPosEtaU1: JF3 Shared Received"));
00264     m_blockName.insert(make_pair(0x90a,"Leaf1JetPosEtaU1: JF3 Shared Sent"));
00265     m_blockName.insert(make_pair(0x90b,"Leaf1JetPosEtaU1: JF3 Output"));
00266     m_blockName.insert(make_pair(0x90c,"Leaf1JetPosEtaU1: JF3 Raw Input"));
00267     m_blockName.insert(make_pair(0x980,"Leaf1JetPosEtaU2: Eta0 Input"));  // Next Leaf Start
00268     m_blockName.insert(make_pair(0x984,"Leaf1JetPosEtaU2: Eta0 Raw Input"));
00269     m_blockName.insert(make_pair(0x988,"Leaf1JetPosEtaU2: JF1 Input"));
00270     m_blockName.insert(make_pair(0x989,"Leaf1JetPosEtaU2: JF1 Shared Received"));
00271     m_blockName.insert(make_pair(0x98a,"Leaf1JetPosEtaU2: JF1 Shared Sent"));
00272     m_blockName.insert(make_pair(0x98b,"Leaf1JetPosEtaU2: JF1 Output"));
00273     m_blockName.insert(make_pair(0x98c,"Leaf1JetPosEtaU2: JF1 Raw Input"));
00274     m_blockName.insert(make_pair(0xa00,"Leaf2JetPosEtaU1: JF2 Input"));  // Next Leaf Start
00275     m_blockName.insert(make_pair(0xa01,"Leaf2JetPosEtaU1: JF2 Shared Received"));
00276     m_blockName.insert(make_pair(0xa02,"Leaf2JetPosEtaU1: JF2 Shared Sent"));
00277     m_blockName.insert(make_pair(0xa03,"Leaf2JetPosEtaU1: JF2 Output"));
00278     m_blockName.insert(make_pair(0xa04,"Leaf2JetPosEtaU1: JF2 Raw Input"));
00279     m_blockName.insert(make_pair(0xa08,"Leaf2JetPosEtaU1: JF3 Input"));
00280     m_blockName.insert(make_pair(0xa09,"Leaf2JetPosEtaU1: JF3 Shared Received"));
00281     m_blockName.insert(make_pair(0xa0a,"Leaf2JetPosEtaU1: JF3 Shared Sent"));
00282     m_blockName.insert(make_pair(0xa0b,"Leaf2JetPosEtaU1: JF3 Output"));
00283     m_blockName.insert(make_pair(0xa0c,"Leaf2JetPosEtaU1: JF3 Raw Input"));
00284     m_blockName.insert(make_pair(0xa80,"Leaf2JetPosEtaU2: Eta0 Input"));  // Next Leaf Start
00285     m_blockName.insert(make_pair(0xa84,"Leaf2JetPosEtaU2: Eta0 Raw Input"));
00286     m_blockName.insert(make_pair(0xa88,"Leaf2JetPosEtaU2: JF1 Input"));
00287     m_blockName.insert(make_pair(0xa89,"Leaf2JetPosEtaU2: JF1 Shared Received"));
00288     m_blockName.insert(make_pair(0xa8a,"Leaf2JetPosEtaU2: JF1 Shared Sent"));
00289     m_blockName.insert(make_pair(0xa8b,"Leaf2JetPosEtaU2: JF1 Output"));
00290     m_blockName.insert(make_pair(0xa8c,"Leaf2JetPosEtaU2: JF1 Raw Input"));
00291     m_blockName.insert(make_pair(0xb00,"Leaf3JetPosEtaU1: JF2 Input"));  // Next Leaf Start
00292     m_blockName.insert(make_pair(0xb01,"Leaf3JetPosEtaU1: JF2 Shared Received"));
00293     m_blockName.insert(make_pair(0xb02,"Leaf3JetPosEtaU1: JF2 Shared Sent"));
00294     m_blockName.insert(make_pair(0xb03,"Leaf3JetPosEtaU1: JF2 Output"));
00295     m_blockName.insert(make_pair(0xb04,"Leaf3JetPosEtaU1: JF2 Raw Input"));
00296     m_blockName.insert(make_pair(0xb08,"Leaf3JetPosEtaU1: JF3 Input"));
00297     m_blockName.insert(make_pair(0xb09,"Leaf3JetPosEtaU1: JF3 Shared Received"));
00298     m_blockName.insert(make_pair(0xb0a,"Leaf3JetPosEtaU1: JF3 Shared Sent"));
00299     m_blockName.insert(make_pair(0xb0b,"Leaf3JetPosEtaU1: JF3 Output"));
00300     m_blockName.insert(make_pair(0xb0c,"Leaf3JetPosEtaU1: JF3 Raw Input"));
00301     m_blockName.insert(make_pair(0xb80,"Leaf3JetPosEtaU2: Eta0 Input"));  // Next Leaf Start
00302     m_blockName.insert(make_pair(0xb84,"Leaf3JetPosEtaU2: Eta0 Raw Input"));
00303     m_blockName.insert(make_pair(0xb88,"Leaf3JetPosEtaU2: JF1 Input"));
00304     m_blockName.insert(make_pair(0xb89,"Leaf3JetPosEtaU2: JF1 Shared Received"));
00305     m_blockName.insert(make_pair(0xb8a,"Leaf3JetPosEtaU2: JF1 Shared Sent"));
00306     m_blockName.insert(make_pair(0xb8b,"Leaf3JetPosEtaU2: JF1 Output"));
00307     m_blockName.insert(make_pair(0xb8c,"Leaf3JetPosEtaU2: JF1 Raw Input"));
00308     // Jet Leaf FPGAs - Negative Eta
00309     m_blockName.insert(make_pair(0xd00,"Leaf1JetNegEtaU1: JF2 Input"));       // START OF NEG ETA JET LEAVES
00310     m_blockName.insert(make_pair(0xd01,"Leaf1JetNegEtaU1: JF2 Shared Received"));
00311     m_blockName.insert(make_pair(0xd02,"Leaf1JetNegEtaU1: JF2 Shared Sent"));
00312     m_blockName.insert(make_pair(0xd03,"Leaf1JetNegEtaU1: JF2 Output"));
00313     m_blockName.insert(make_pair(0xd04,"Leaf1JetNegEtaU1: JF2 Raw Input"));
00314     m_blockName.insert(make_pair(0xd08,"Leaf1JetNegEtaU1: JF3 Input"));
00315     m_blockName.insert(make_pair(0xd09,"Leaf1JetNegEtaU1: JF3 Shared Received"));
00316     m_blockName.insert(make_pair(0xd0a,"Leaf1JetNegEtaU1: JF3 Shared Sent"));
00317     m_blockName.insert(make_pair(0xd0b,"Leaf1JetNegEtaU1: JF3 Output"));
00318     m_blockName.insert(make_pair(0xd0c,"Leaf1JetNegEtaU1: JF3 Raw Input"));
00319     m_blockName.insert(make_pair(0xd80,"Leaf1JetNegEtaU2: Eta0 Input"));  // Next Leaf Start
00320     m_blockName.insert(make_pair(0xd84,"Leaf1JetNegEtaU2: Eta0 Raw Input"));
00321     m_blockName.insert(make_pair(0xd88,"Leaf1JetNegEtaU2: JF1 Input"));
00322     m_blockName.insert(make_pair(0xd89,"Leaf1JetNegEtaU2: JF1 Shared Received"));
00323     m_blockName.insert(make_pair(0xd8a,"Leaf1JetNegEtaU2: JF1 Shared Sent"));
00324     m_blockName.insert(make_pair(0xd8b,"Leaf1JetNegEtaU2: JF1 Output"));
00325     m_blockName.insert(make_pair(0xd8c,"Leaf1JetNegEtaU2: JF1 Raw Input"));
00326     m_blockName.insert(make_pair(0xe00,"Leaf2JetNegEtaU1: JF2 Input"));  // Next Leaf Start
00327     m_blockName.insert(make_pair(0xe01,"Leaf2JetNegEtaU1: JF2 Shared Received"));
00328     m_blockName.insert(make_pair(0xe02,"Leaf2JetNegEtaU1: JF2 Shared Sent"));
00329     m_blockName.insert(make_pair(0xe03,"Leaf2JetNegEtaU1: JF2 Output"));
00330     m_blockName.insert(make_pair(0xe04,"Leaf2JetNegEtaU1: JF2 Raw Input"));
00331     m_blockName.insert(make_pair(0xe08,"Leaf2JetNegEtaU1: JF3 Input"));
00332     m_blockName.insert(make_pair(0xe09,"Leaf2JetNegEtaU1: JF3 Shared Received"));
00333     m_blockName.insert(make_pair(0xe0a,"Leaf2JetNegEtaU1: JF3 Shared Sent"));
00334     m_blockName.insert(make_pair(0xe0b,"Leaf2JetNegEtaU1: JF3 Output"));
00335     m_blockName.insert(make_pair(0xe0c,"Leaf2JetNegEtaU1: JF3 Raw Input"));
00336     m_blockName.insert(make_pair(0xe80,"Leaf2JetNegEtaU2: Eta0 Input"));  // Next Leaf Start
00337     m_blockName.insert(make_pair(0xe84,"Leaf2JetNegEtaU2: Eta0 Raw Input"));
00338     m_blockName.insert(make_pair(0xe88,"Leaf2JetNegEtaU2: JF1 Input"));
00339     m_blockName.insert(make_pair(0xe89,"Leaf2JetNegEtaU2: JF1 Shared Received"));
00340     m_blockName.insert(make_pair(0xe8a,"Leaf2JetNegEtaU2: JF1 Shared Sent"));
00341     m_blockName.insert(make_pair(0xe8b,"Leaf2JetNegEtaU2: JF1 Output"));
00342     m_blockName.insert(make_pair(0xe8c,"Leaf2JetNegEtaU2: JF1 Raw Input"));
00343     m_blockName.insert(make_pair(0xf00,"Leaf3JetNegEtaU1: JF2 Input"));  // Next Leaf Start
00344     m_blockName.insert(make_pair(0xf01,"Leaf3JetNegEtaU1: JF2 Shared Received"));
00345     m_blockName.insert(make_pair(0xf02,"Leaf3JetNegEtaU1: JF2 Shared Sent"));
00346     m_blockName.insert(make_pair(0xf03,"Leaf3JetNegEtaU1: JF2 Output"));
00347     m_blockName.insert(make_pair(0xf04,"Leaf3JetNegEtaU1: JF2 Raw Input"));
00348     m_blockName.insert(make_pair(0xf08,"Leaf3JetNegEtaU1: JF3 Input"));
00349     m_blockName.insert(make_pair(0xf09,"Leaf3JetNegEtaU1: JF3 Shared Received"));
00350     m_blockName.insert(make_pair(0xf0a,"Leaf3JetNegEtaU1: JF3 Shared Sent"));
00351     m_blockName.insert(make_pair(0xf0b,"Leaf3JetNegEtaU1: JF3 Output"));
00352     m_blockName.insert(make_pair(0xf0c,"Leaf3JetNegEtaU1: JF3 Raw Input"));
00353     m_blockName.insert(make_pair(0xf80,"Leaf3JetNegEtaU2: Eta0 Input"));  // Next Leaf Start
00354     m_blockName.insert(make_pair(0xf84,"Leaf3JetNegEtaU2: Eta0 Raw Input"));
00355     m_blockName.insert(make_pair(0xf88,"Leaf3JetNegEtaU2: JF1 Input"));
00356     m_blockName.insert(make_pair(0xf89,"Leaf3JetNegEtaU2: JF1 Shared Received"));
00357     m_blockName.insert(make_pair(0xf8a,"Leaf3JetNegEtaU2: JF1 Shared Sent"));
00358     m_blockName.insert(make_pair(0xf8b,"Leaf3JetNegEtaU2: JF1 Output"));
00359     m_blockName.insert(make_pair(0xf8c,"Leaf3JetNegEtaU2: JF1 Raw Input"));
00360 
00361 
00362     /*** Setup BlockID to Unpack-Function Map ***/
00363     // Miscellaneous Blocks
00364     m_blockUnpackFn[0x000] = &GctFormatTranslateV38::blockDoNothing;                    // NULL
00365     // ConcJet FPGA                                                             
00366     m_blockUnpackFn[0x580] = &GctFormatTranslateV38::blockToGctTrigObjects;             // ConcJet: Input TrigPathA (Jet Cands)
00367     m_blockUnpackFn[0x581] = &GctFormatTranslateV38::blockDoNothing;                    // ConcJet: Input TrigPathB (HF Rings)
00368     m_blockUnpackFn[0x582] = &GctFormatTranslateV38::blockDoNothing;                    // ConcJet: Input TrigPathC (MissHt)
00369     m_blockUnpackFn[0x583] = &GctFormatTranslateV38::blockToGctJetCandsAndCounts;       // ConcJet: Jet Cands and Counts Output to GT
00370     m_blockUnpackFn[0x587] = &GctFormatTranslateV38::blockDoNothing;                    // ConcJet: BX & Orbit Info
00371     // ConcElec FPGA                                                            
00372     m_blockUnpackFn[0x680] = &GctFormatTranslateV38::blockToGctInternEmCand;            // ConcElec: Input TrigPathA (EM Cands)
00373     m_blockUnpackFn[0x681] = &GctFormatTranslateV38::blockDoNothing;                    // ConcElec: Input TrigPathB (Et Sums)
00374     m_blockUnpackFn[0x682] = &GctFormatTranslateV38::blockDoNothing;                    // ConcElec: Input TrigPathC (Ht Sums)
00375     m_blockUnpackFn[0x683] = &GctFormatTranslateV38::blockToGctEmCandsAndEnergySums;    // ConcElec: EM Cands and Energy Sums Output to GT
00376     m_blockUnpackFn[0x686] = &GctFormatTranslateV38::blockDoNothing;                    // ConcElec: Test (GT Serdes Loopback)
00377     m_blockUnpackFn[0x687] = &GctFormatTranslateV38::blockDoNothing;                    // ConcElec: BX & Orbit Info
00378     // Electron Leaf FPGAs                                                      
00379     m_blockUnpackFn[0x800] = &GctFormatTranslateV38::blockToGctInternEmCand;            // Leaf0ElecPosEtaU1: Sort Input
00380     m_blockUnpackFn[0x803] = &GctFormatTranslateV38::blockToGctInternEmCand;            // Leaf0ElecPosEtaU1: Sort Output
00381     m_blockUnpackFn[0x804] = &GctFormatTranslateV38::blockToFibresAndToRctEmCand;       // Leaf0ElecPosEtaU1: Raw Input
00382     m_blockUnpackFn[0x880] = &GctFormatTranslateV38::blockToGctInternEmCand;            // Leaf0ElecPosEtaU2: Sort Input
00383     m_blockUnpackFn[0x883] = &GctFormatTranslateV38::blockToGctInternEmCand;            // Leaf0ElecPosEtaU2: Sort Output
00384     m_blockUnpackFn[0x884] = &GctFormatTranslateV38::blockToFibresAndToRctEmCand;       // Leaf0ElecPosEtaU2: Raw Input
00385     m_blockUnpackFn[0xc00] = &GctFormatTranslateV38::blockToGctInternEmCand;            // Leaf0ElecNegEtaU1: Sort Input
00386     m_blockUnpackFn[0xc03] = &GctFormatTranslateV38::blockToGctInternEmCand;            // Leaf0ElecNegEtaU1: Sort Output
00387     m_blockUnpackFn[0xc04] = &GctFormatTranslateV38::blockToFibresAndToRctEmCand;       // Leaf0ElecNegEtaU1: Raw Input
00388     m_blockUnpackFn[0xc80] = &GctFormatTranslateV38::blockToGctInternEmCand;            // Leaf0ElecNegEtaU2: Sort Input
00389     m_blockUnpackFn[0xc83] = &GctFormatTranslateV38::blockToGctInternEmCand;            // Leaf0ElecNegEtaU2: Sort Output
00390     m_blockUnpackFn[0xc84] = &GctFormatTranslateV38::blockToFibresAndToRctEmCand;       // Leaf0ElecNegEtaU2: Raw Input
00391     // Wheel Pos-eta Jet FPGA                                                   
00392     m_blockUnpackFn[0x300] = &GctFormatTranslateV38::blockToGctJetClusterMinimal;       // WheelPosEtaJet: Input TrigPathA (Jet Sort)
00393     m_blockUnpackFn[0x301] = &GctFormatTranslateV38::blockDoNothing;                    // WheelPosEtaJet: Input TrigPathB (MissHt)
00394     m_blockUnpackFn[0x303] = &GctFormatTranslateV38::blockToGctTrigObjects;             // WheelPosEtaJet: Output TrigPathA (Jet Sort)
00395     m_blockUnpackFn[0x305] = &GctFormatTranslateV38::blockDoNothing;                    // WheelPosEtaJet: Output TrigPathB (MissHt)
00396     m_blockUnpackFn[0x306] = &GctFormatTranslateV38::blockDoNothing;                    // WheelPosEtaJet: Test (deprecated)  (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00397     m_blockUnpackFn[0x307] = &GctFormatTranslateV38::blockDoNothing;                    // WheelPosEtaJet: Info (deprecated)  (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00398     // Wheel Pos-eta Energy FPGA                                                
00399     m_blockUnpackFn[0x380] = &GctFormatTranslateV38::blockDoNothing;                    // WheelPosEtaEnergy: Input TrigPathA (Et)
00400     m_blockUnpackFn[0x381] = &GctFormatTranslateV38::blockDoNothing;                    // WheelPosEtaEnergy: Input TrigPathB (Ht)
00401     m_blockUnpackFn[0x383] = &GctFormatTranslateV38::blockDoNothing;                    // WheelPosEtaEnergy: Output TrigPathA (Et)
00402     m_blockUnpackFn[0x385] = &GctFormatTranslateV38::blockDoNothing;                    // WheelPosEtaEnergy: Output TrigPathB (Ht)
00403     m_blockUnpackFn[0x386] = &GctFormatTranslateV38::blockDoNothing;                    // WheelPosEtaEnergy: Test
00404     m_blockUnpackFn[0x387] = &GctFormatTranslateV38::blockDoNothing;                    // WheelPosEtaEnergy: BX & Orbit Info   (Potential data incompatibility between V24/V25 where block length=4, and V27.1 where block length=6)
00405     // Wheel Neg-eta Jet FPGA                                                   
00406     m_blockUnpackFn[0x700] = &GctFormatTranslateV38::blockToGctJetClusterMinimal;       // WheelNegEtaJet: Input TrigPathA (Jet Sort)
00407     m_blockUnpackFn[0x701] = &GctFormatTranslateV38::blockDoNothing;                    // WheelNegEtaJet: Input TrigPathB (MissHt)
00408     m_blockUnpackFn[0x703] = &GctFormatTranslateV38::blockToGctTrigObjects;             // WheelNegEtaJet: Output TrigPathA (Jet Sort)
00409     m_blockUnpackFn[0x705] = &GctFormatTranslateV38::blockDoNothing;                    // WheelNegEtaJet: Output TrigPathB (MissHt)    
00410     m_blockUnpackFn[0x706] = &GctFormatTranslateV38::blockDoNothing;                    // WheelNegEtaJet: Test (deprecated)  (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00411     m_blockUnpackFn[0x707] = &GctFormatTranslateV38::blockDoNothing;                    // WheelNegEtaJet: Info (deprecated)  (Doesn't exist in V27.1 format, but does in V24 & V25, so keep for CRUZET2 data compatibility reasons)
00412     // Wheel Neg-eta Energy FPGA                                                
00413     m_blockUnpackFn[0x780] = &GctFormatTranslateV38::blockDoNothing;                    // WheelNegEtaEnergy: Input TrigPathA (Et)
00414     m_blockUnpackFn[0x781] = &GctFormatTranslateV38::blockDoNothing;                    // WheelNegEtaEnergy: Input TrigPathB (Ht)
00415     m_blockUnpackFn[0x783] = &GctFormatTranslateV38::blockDoNothing;                    // WheelNegEtaEnergy: Output TrigPathA (Et)
00416     m_blockUnpackFn[0x785] = &GctFormatTranslateV38::blockDoNothing;                    // WheelNegEtaEnergy: Output TrigPathB (Ht)
00417     m_blockUnpackFn[0x786] = &GctFormatTranslateV38::blockDoNothing;                    // WheelNegEtaEnergy: Test
00418     m_blockUnpackFn[0x787] = &GctFormatTranslateV38::blockDoNothing;                    // WheelNegEtaEnergy: BX & Orbit Info   (Potential data incompatibility between V24/V25 where block length=4, and V27.1 where block length=6)
00419     // Jet Leaf FPGAs - Positive Eta
00420     m_blockUnpackFn[0x900] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf1JetPosEtaU1: JF2 Input
00421     m_blockUnpackFn[0x901] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetPosEtaU1: JF2 Shared Received
00422     m_blockUnpackFn[0x902] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetPosEtaU1: JF2 Shared Sent
00423     m_blockUnpackFn[0x903] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf1JetPosEtaU1: JF2 Output
00424     m_blockUnpackFn[0x904] = &GctFormatTranslateV38::blockToFibres;                     // Leaf1JetPosEtaU1: JF2 Raw Input
00425     m_blockUnpackFn[0x908] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf1JetPosEtaU1: JF3 Input
00426     m_blockUnpackFn[0x909] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetPosEtaU1: JF3 Shared Received
00427     m_blockUnpackFn[0x90a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetPosEtaU1: JF3 Shared Sent
00428     m_blockUnpackFn[0x90b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf1JetPosEtaU1: JF3 Output
00429     m_blockUnpackFn[0x90c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf1JetPosEtaU1: JF3 Raw Input
00430     m_blockUnpackFn[0x980] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf1JetPosEtaU2: Eta0 Input
00431     m_blockUnpackFn[0x984] = &GctFormatTranslateV38::blockToFibres;                     // Leaf1JetPosEtaU2: Eta0 Raw Input
00432     m_blockUnpackFn[0x988] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf1JetPosEtaU2: JF1 Input
00433     m_blockUnpackFn[0x989] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetPosEtaU2: JF1 Shared Received
00434     m_blockUnpackFn[0x98a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetPosEtaU2: JF1 Shared Sent
00435     m_blockUnpackFn[0x98b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf1JetPosEtaU2: JF1 Output
00436     m_blockUnpackFn[0x98c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf1JetPosEtaU2: JF1 Raw Input
00437     m_blockUnpackFn[0xa00] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf2JetPosEtaU1: JF2 Input
00438     m_blockUnpackFn[0xa01] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetPosEtaU1: JF2 Shared Received
00439     m_blockUnpackFn[0xa02] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetPosEtaU1: JF2 Shared Sent
00440     m_blockUnpackFn[0xa03] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf2JetPosEtaU1: JF2 Output
00441     m_blockUnpackFn[0xa04] = &GctFormatTranslateV38::blockToFibres;                     // Leaf2JetPosEtaU1: JF2 Raw Input
00442     m_blockUnpackFn[0xa08] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf2JetPosEtaU1: JF3 Input
00443     m_blockUnpackFn[0xa09] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetPosEtaU1: JF3 Shared Received
00444     m_blockUnpackFn[0xa0a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetPosEtaU1: JF3 Shared Sent
00445     m_blockUnpackFn[0xa0b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf2JetPosEtaU1: JF3 Output
00446     m_blockUnpackFn[0xa0c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf2JetPosEtaU1: JF3 Raw Input
00447     m_blockUnpackFn[0xa80] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf2JetPosEtaU2: Eta0 Input
00448     m_blockUnpackFn[0xa84] = &GctFormatTranslateV38::blockToFibres;                     // Leaf2JetPosEtaU2: Eta0 Raw Input
00449     m_blockUnpackFn[0xa88] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf2JetPosEtaU2: JF1 Input
00450     m_blockUnpackFn[0xa89] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetPosEtaU2: JF1 Shared Received
00451     m_blockUnpackFn[0xa8a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetPosEtaU2: JF1 Shared Sent
00452     m_blockUnpackFn[0xa8b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf2JetPosEtaU2: JF1 Output
00453     m_blockUnpackFn[0xa8c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf2JetPosEtaU2: JF1 Raw Input
00454     m_blockUnpackFn[0xb00] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf3JetPosEtaU1: JF2 Input
00455     m_blockUnpackFn[0xb01] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetPosEtaU1: JF2 Shared Received
00456     m_blockUnpackFn[0xb02] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetPosEtaU1: JF2 Shared Sent
00457     m_blockUnpackFn[0xb03] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf3JetPosEtaU1: JF2 Output
00458     m_blockUnpackFn[0xb04] = &GctFormatTranslateV38::blockToFibres;                     // Leaf3JetPosEtaU1: JF2 Raw Input
00459     m_blockUnpackFn[0xb08] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf3JetPosEtaU1: JF3 Input
00460     m_blockUnpackFn[0xb09] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetPosEtaU1: JF3 Shared Received
00461     m_blockUnpackFn[0xb0a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetPosEtaU1: JF3 Shared Sent
00462     m_blockUnpackFn[0xb0b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf3JetPosEtaU1: JF3 Output
00463     m_blockUnpackFn[0xb0c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf3JetPosEtaU1: JF3 Raw Input
00464     m_blockUnpackFn[0xb80] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf3JetPosEtaU2: Eta0 Input
00465     m_blockUnpackFn[0xb84] = &GctFormatTranslateV38::blockToFibres;                     // Leaf3JetPosEtaU2: Eta0 Raw Input
00466     m_blockUnpackFn[0xb88] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf3JetPosEtaU2: JF1 Input
00467     m_blockUnpackFn[0xb89] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetPosEtaU2: JF1 Shared Received
00468     m_blockUnpackFn[0xb8a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetPosEtaU2: JF1 Shared Sent
00469     m_blockUnpackFn[0xb8b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf3JetPosEtaU2: JF1 Output
00470     m_blockUnpackFn[0xb8c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf3JetPosEtaU2: JF1 Raw Input
00471     // Jet Leaf FPGAs - Negative Eta
00472     m_blockUnpackFn[0xd00] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf1JetNegEtaU1: JF2 Input
00473     m_blockUnpackFn[0xd01] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetNegEtaU1: JF2 Shared Received
00474     m_blockUnpackFn[0xd02] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetNegEtaU1: JF2 Shared Sent
00475     m_blockUnpackFn[0xd03] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf1JetNegEtaU1: JF2 Output
00476     m_blockUnpackFn[0xd04] = &GctFormatTranslateV38::blockToFibres;                     // Leaf1JetNegEtaU1: JF2 Raw Input
00477     m_blockUnpackFn[0xd08] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf1JetNegEtaU1: JF3 Input
00478     m_blockUnpackFn[0xd09] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetNegEtaU1: JF3 Shared Received
00479     m_blockUnpackFn[0xd0a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetNegEtaU1: JF3 Shared Sent
00480     m_blockUnpackFn[0xd0b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf1JetNegEtaU1: JF3 Output
00481     m_blockUnpackFn[0xd0c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf1JetNegEtaU1: JF3 Raw Input
00482     m_blockUnpackFn[0xd80] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf1JetNegEtaU2: Eta0 Input
00483     m_blockUnpackFn[0xd84] = &GctFormatTranslateV38::blockToFibres;                     // Leaf1JetNegEtaU2: Eta0 Raw Input
00484     m_blockUnpackFn[0xd88] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf1JetNegEtaU2: JF1 Input
00485     m_blockUnpackFn[0xd89] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetNegEtaU2: JF1 Shared Received
00486     m_blockUnpackFn[0xd8a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf1JetNegEtaU2: JF1 Shared Sent
00487     m_blockUnpackFn[0xd8b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf1JetNegEtaU2: JF1 Output
00488     m_blockUnpackFn[0xd8c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf1JetNegEtaU2: JF1 Raw Input
00489     m_blockUnpackFn[0xe00] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf2JetNegEtaU1: JF2 Input
00490     m_blockUnpackFn[0xe01] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetNegEtaU1: JF2 Shared Received
00491     m_blockUnpackFn[0xe02] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetNegEtaU1: JF2 Shared Sent
00492     m_blockUnpackFn[0xe03] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf2JetNegEtaU1: JF2 Output
00493     m_blockUnpackFn[0xe04] = &GctFormatTranslateV38::blockToFibres;                     // Leaf2JetNegEtaU1: JF2 Raw Input
00494     m_blockUnpackFn[0xe08] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf2JetNegEtaU1: JF3 Input
00495     m_blockUnpackFn[0xe09] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetNegEtaU1: JF3 Shared Received
00496     m_blockUnpackFn[0xe0a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetNegEtaU1: JF3 Shared Sent
00497     m_blockUnpackFn[0xe0b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf2JetNegEtaU1: JF3 Output
00498     m_blockUnpackFn[0xe0c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf2JetNegEtaU1: JF3 Raw Input
00499     m_blockUnpackFn[0xe80] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf2JetNegEtaU2: Eta0 Input
00500     m_blockUnpackFn[0xe84] = &GctFormatTranslateV38::blockToFibres;                     // Leaf2JetNegEtaU2: Eta0 Raw Input
00501     m_blockUnpackFn[0xe88] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf2JetNegEtaU2: JF1 Input
00502     m_blockUnpackFn[0xe89] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetNegEtaU2: JF1 Shared Received
00503     m_blockUnpackFn[0xe8a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf2JetNegEtaU2: JF1 Shared Sent
00504     m_blockUnpackFn[0xe8b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf2JetNegEtaU2: JF1 Output
00505     m_blockUnpackFn[0xe8c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf2JetNegEtaU2: JF1 Raw Input
00506     m_blockUnpackFn[0xf00] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf3JetNegEtaU1: JF2 Input
00507     m_blockUnpackFn[0xf01] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetNegEtaU1: JF2 Shared Received
00508     m_blockUnpackFn[0xf02] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetNegEtaU1: JF2 Shared Sent
00509     m_blockUnpackFn[0xf03] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf3JetNegEtaU1: JF2 Output
00510     m_blockUnpackFn[0xf04] = &GctFormatTranslateV38::blockToFibres;                     // Leaf3JetNegEtaU1: JF2 Raw Input
00511     m_blockUnpackFn[0xf08] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf3JetNegEtaU1: JF3 Input
00512     m_blockUnpackFn[0xf09] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetNegEtaU1: JF3 Shared Received
00513     m_blockUnpackFn[0xf0a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetNegEtaU1: JF3 Shared Sent
00514     m_blockUnpackFn[0xf0b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf3JetNegEtaU1: JF3 Output
00515     m_blockUnpackFn[0xf0c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf3JetNegEtaU1: JF3 Raw Input
00516     m_blockUnpackFn[0xf80] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf3JetNegEtaU2: Eta0 Input
00517     m_blockUnpackFn[0xf84] = &GctFormatTranslateV38::blockToFibres;                     // Leaf3JetNegEtaU2: Eta0 Raw Input
00518     m_blockUnpackFn[0xf88] = &GctFormatTranslateV38::blockToRctCaloRegions;             // Leaf3JetNegEtaU2: JF1 Input
00519     m_blockUnpackFn[0xf89] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetNegEtaU2: JF1 Shared Received
00520     m_blockUnpackFn[0xf8a] = &GctFormatTranslateV38::blockToGctJetPreCluster;           // Leaf3JetNegEtaU2: JF1 Shared Sent
00521     m_blockUnpackFn[0xf8b] = &GctFormatTranslateV38::blockDoNothing;                    // Leaf3JetNegEtaU2: JF1 Output
00522     m_blockUnpackFn[0xf8c] = &GctFormatTranslateV38::blockToFibres;                     // Leaf3JetNegEtaU2: JF1 Raw Input
00523 
00524 
00525     /*** Setup RCT Em Crate Map ***/
00526     m_rctEmCrate[0x804] = 13;
00527     m_rctEmCrate[0x884] = 9;
00528     m_rctEmCrate[0xc04] = 4;
00529     m_rctEmCrate[0xc84] = 0;
00530 
00531 
00532     /*** Setup RCT jet crate map. ***/
00533     m_rctJetCrate[0x900] = 9;  // PosEta Leaf 1 JF2
00534     m_rctJetCrate[0x908] = 10; // PosEta Leaf 1 JF3
00535     m_rctJetCrate[0x988] = 17; // PosEta Leaf 1 JF1 
00536     m_rctJetCrate[0xa00] = 12; // PosEta Leaf 2 JF2
00537     m_rctJetCrate[0xa08] = 13; // PosEta Leaf 2 JF3
00538     m_rctJetCrate[0xa88] = 11; // PosEta Leaf 2 JF1 
00539     m_rctJetCrate[0xb00] = 15; // PosEta Leaf 3 JF2
00540     m_rctJetCrate[0xb08] = 16; // PosEta Leaf 3 JF3
00541     m_rctJetCrate[0xb88] = 14; // PosEta Leaf 3 JF1 
00542     m_rctJetCrate[0xd00] = 0;  // NegEta Leaf 1 JF2
00543     m_rctJetCrate[0xd08] = 1;  // NegEta Leaf 1 JF3
00544     m_rctJetCrate[0xd88] = 8;  // NegEta Leaf 1 JF1 
00545     m_rctJetCrate[0xe00] = 3;  // NegEta Leaf 2 JF2
00546     m_rctJetCrate[0xe08] = 4;  // NegEta Leaf 2 JF3
00547     m_rctJetCrate[0xe88] = 2;  // NegEta Leaf 2 JF1 
00548     m_rctJetCrate[0xf00] = 6;  // NegEta Leaf 3 JF2
00549     m_rctJetCrate[0xf08] = 7;  // NegEta Leaf 3 JF3
00550     m_rctJetCrate[0xf88] = 5;  // NegEta Leaf 3 JF1 
00551 
00552 
00553     /*** Setup Block ID map for pipeline payload positions of isolated Internal EM Cands. ***/
00554     m_internEmIsoBounds[0x680] = IsoBoundaryPair(8,15);
00555     m_internEmIsoBounds[0x800] = IsoBoundaryPair(0, 9);
00556     m_internEmIsoBounds[0x803] = IsoBoundaryPair(0, 1);
00557     m_internEmIsoBounds[0x880] = IsoBoundaryPair(0, 7);
00558     m_internEmIsoBounds[0x883] = IsoBoundaryPair(0, 1);
00559     m_internEmIsoBounds[0xc00] = IsoBoundaryPair(0, 9);
00560     m_internEmIsoBounds[0xc03] = IsoBoundaryPair(0, 1);
00561     m_internEmIsoBounds[0xc80] = IsoBoundaryPair(0, 7);
00562     m_internEmIsoBounds[0xc83] = IsoBoundaryPair(0, 1);
00563   }
00564 }
00565 
00566 GctFormatTranslateV38::~GctFormatTranslateV38()
00567 {
00568 }
00569 
00570 GctBlockHeader GctFormatTranslateV38::generateBlockHeader(const unsigned char * data) const
00571 {
00572   // Turn the four 8-bit header words into the full 32-bit header.
00573   uint32_t hdr = data[0] + (data[1]<<8) + (data[2]<<16) + (data[3]<<24);
00574 
00575 //  Bit mapping of V35 header:
00576 //  --------------------------
00577 //  11:0   => block_id  Unique pipeline identifier.
00578 //   - 3:0    =>> pipe_id There can be up to 16 different pipelines per FPGA.
00579 //   - 6:4    =>> reserved  Do not use yet. Set to zero.
00580 //   - 11:7   =>> fpga geograpical add  The VME geographical address of the FPGA.
00581 //  15:12  => event_id  Determined locally.  Not reset by Resync.
00582 //  19:16  => number_of_time_samples  If time samples 15 or more then value = 15.
00583 //  31:20  => event_bcid  The bunch crossing the data was recorded.
00584 
00585   unsigned blockId = hdr & 0xfff;
00586   unsigned blockLength = 0;  // Set to zero until we know it's a valid block
00587   unsigned nSamples = (hdr>>16) & 0xf;
00588   unsigned bxId = (hdr>>20) & 0xfff;
00589   unsigned eventId = (hdr>>12) & 0xf;
00590   bool valid = (blockLengthMap().find(blockId) != blockLengthMap().end());
00591 
00592   if(valid) { blockLength = blockLengthMap().find(blockId)->second; }
00593   
00594   return GctBlockHeader(blockId, blockLength, nSamples, bxId, eventId, valid);  
00595 }
00596 
00597 // conversion
00598 bool GctFormatTranslateV38::convertBlock(const unsigned char * data, const GctBlockHeader& hdr)
00599 {
00600   // if the block has no time samples, don't bother with it.
00601   if ( hdr.nSamples() < 1 ) { return true; }
00602 
00603   if(!checkBlock(hdr)) { return false; }  // Check the block to see if it's possible to unpack.
00604 
00605   // The header validity check above will protect against
00606   // the map::find() method returning the end of the map,
00607   // assuming the block header definitions are up-to-date.
00608   (this->*m_blockUnpackFn.find(hdr.blockId())->second)(data, hdr);  // Calls the correct unpack function, based on block ID.
00609   
00610   return true;
00611 }
00612 
00613 
00614 // PROTECTED METHODS
00615 
00616 uint32_t GctFormatTranslateV38::generateRawHeader(const uint32_t blockId,
00617                                                   const uint32_t nSamples,
00618                                                   const uint32_t bxId,
00619                                                   const uint32_t eventId) const
00620 {
00621   //  Bit mapping of V35 header:
00622   //  --------------------------
00623   //  11:0   => block_id  Unique pipeline identifier.
00624   //   - 3:0    =>> pipe_id There can be up to 16 different pipelines per FPGA.
00625   //   - 6:4    =>> reserved  Do not use yet. Set to zero.
00626   //   - 11:7   =>> fpga geograpical add  The VME geographical address of the FPGA.
00627   //  15:12  => event_id  Determined locally.  Not reset by Resync.
00628   //  19:16  => number_of_time_samples  If time samples 15 or more then value = 15.
00629   //  31:20  => event_bxId  The bunch crossing the data was recorded.
00630 
00631   return ((bxId & 0xfff) << 20) | ((nSamples & 0xf) << 16) | ((eventId & 0xf) << 12) | (blockId & 0xfff);
00632 }
00633 
00634 
00635 // PRIVATE METHODS
00636 
00637 // Output EM Candidates unpacking
00638 void GctFormatTranslateV38::blockToGctEmCandsAndEnergySums(const unsigned char * d, const GctBlockHeader& hdr)
00639 {
00640   const unsigned int id = hdr.blockId();
00641   const unsigned int nSamples = hdr.nSamples();
00642 
00643   // Re-interpret pointer.  p16 will be pointing at the 16 bit word that
00644   // contains the rank0 non-isolated electron of the zeroth time-sample.
00645   const uint16_t * p16 = reinterpret_cast<const uint16_t *>(d);
00646 
00647   // UNPACK EM CANDS
00648 
00649   const unsigned int emCandCategoryOffset = nSamples * 4;  // Offset to jump from the non-iso electrons to the isolated ones.
00650   const unsigned int timeSampleOffset = nSamples * 2;  // Offset to jump to next candidate pair in the same time-sample.
00651 
00652   unsigned int samplesToUnpack = 1;
00653   if(!hltMode()) { samplesToUnpack = nSamples; }  // Only if not running in HLT mode do we want more than 1 timesample. 
00654 
00655   for (unsigned int iso=0; iso<2; ++iso)  // loop over non-iso/iso candidate pairs
00656   {
00657     bool isoFlag = (iso==1);
00658 
00659     // Get the correct collection to put them in.
00660     L1GctEmCandCollection* em;
00661     if (isoFlag) { em = colls()->gctIsoEm(); }
00662     else { em = colls()->gctNonIsoEm(); }
00663 
00664     for (unsigned int bx=0; bx<samplesToUnpack; ++bx) // loop over time samples
00665     {
00666       // cand0Offset will give the offset on p16 to get the rank 0 candidate
00667       // of the correct category and timesample.
00668       const unsigned int cand0Offset = iso*emCandCategoryOffset + bx*2;
00669 
00670       em->push_back(L1GctEmCand(p16[cand0Offset], isoFlag, id, 0, bx));  // rank0 electron
00671       em->push_back(L1GctEmCand(p16[cand0Offset + timeSampleOffset], isoFlag, id, 1, bx));  // rank1 electron
00672       em->push_back(L1GctEmCand(p16[cand0Offset + 1], isoFlag, id, 2, bx));  // rank2 electron
00673       em->push_back(L1GctEmCand(p16[cand0Offset + timeSampleOffset + 1], isoFlag, id, 3, bx));  // rank3 electron
00674     }
00675   }
00676 
00677   p16 += emCandCategoryOffset * 2;  // Move the pointer over the data we've already unpacked.
00678 
00679   // UNPACK ENERGY SUMS
00680   // NOTE: we are only unpacking one timesample of these currently!
00681 
00682   colls()->gctEtTot()->push_back(L1GctEtTotal(p16[0]));  // Et total (timesample 0).
00683   colls()->gctEtHad()->push_back(L1GctEtHad(p16[1]));  // Et hadronic (timesample 0).
00684 
00685   // 32-bit pointer for getting Missing Et.
00686   const uint32_t * p32 = reinterpret_cast<const uint32_t *>(p16);
00687 
00688   colls()->gctEtMiss()->push_back(L1GctEtMiss(p32[nSamples])); // Et Miss (timesample 0).
00689 }
00690 
00691 void GctFormatTranslateV38::blockToGctJetCandsAndCounts(const unsigned char * d, const GctBlockHeader& hdr)
00692 {
00693   const unsigned int id = hdr.blockId();  // Capture block ID.
00694   const unsigned int nSamples = hdr.nSamples();  // Number of time-samples.
00695 
00696   // Re-interpret block payload pointer to 16 bits so it sees one candidate at a time.
00697   // p16 points to the start of the block payload, at the rank0 tau jet candidate.
00698   const uint16_t * p16 = reinterpret_cast<const uint16_t *>(d);
00699 
00700   // UNPACK JET CANDS
00701 
00702   const unsigned int jetCandCategoryOffset = nSamples * 4;  // Offset to jump from one jet category to the next.
00703   const unsigned int timeSampleOffset = nSamples * 2;  // Offset to jump to next candidate pair in the same time-sample.
00704 
00705   unsigned int samplesToUnpack = 1;
00706   if(!hltMode()) { samplesToUnpack = nSamples; }  // Only if not running in HLT mode do we want more than 1 timesample. 
00707 
00708   // Loop over the different catagories of jets
00709   for(unsigned int iCat = 0 ; iCat < NUM_JET_CATEGORIES ; ++iCat)
00710   {
00711     L1GctJetCandCollection * const jets = gctJets(iCat);
00712     assert(jets->empty()); // The supplied vector should be empty.
00713 
00714     bool tauflag = (iCat == TAU_JETS);
00715     bool forwardFlag = (iCat == FORWARD_JETS);
00716 
00717     // Loop over the different timesamples (bunch crossings).
00718     for(unsigned int bx = 0 ; bx < samplesToUnpack ; ++bx)
00719     {
00720       // cand0Offset will give the offset on p16 to get the rank 0 Jet Cand of the correct category and timesample.
00721       const unsigned int cand0Offset = iCat*jetCandCategoryOffset + bx*2;
00722 
00723       // Rank 0 Jet.
00724       jets->push_back(L1GctJetCand(p16[cand0Offset], tauflag, forwardFlag, id, 0, bx));
00725       // Rank 1 Jet.
00726       jets->push_back(L1GctJetCand(p16[cand0Offset + timeSampleOffset], tauflag, forwardFlag, id, 1, bx));
00727       // Rank 2 Jet.
00728       jets->push_back(L1GctJetCand(p16[cand0Offset + 1],  tauflag, forwardFlag, id, 2, bx));
00729       // Rank 3 Jet.
00730       jets->push_back(L1GctJetCand(p16[cand0Offset + timeSampleOffset + 1], tauflag, forwardFlag, id, 3, bx));
00731     }
00732   }
00733 
00734   p16 += NUM_JET_CATEGORIES * jetCandCategoryOffset; // Move the pointer over the data we've already unpacked.
00735 
00736   // NOW UNPACK: HFBitCounts, HFRingEtSums and Missing Ht
00737   // NOTE: we are only unpacking one timesample of these currently!
00738 
00739   // Re-interpret block payload pointer to 32 bits so it sees six jet counts at a time.
00740   const uint32_t * p32 = reinterpret_cast<const uint32_t *>(p16);
00741 
00742   // Channel 0 carries both HF counts and sums
00743   colls()->gctHfBitCounts()->push_back(L1GctHFBitCounts::fromConcHFBitCounts(id,6,0,p32[0])); 
00744   colls()->gctHfRingEtSums()->push_back(L1GctHFRingEtSums::fromConcRingSums(id,6,0,p32[0]));
00745 
00746   // Channel 1 carries Missing HT.  Would be found at p32[nSamples].  Excluded from 22X backport for now.
00747 }
00748 
00749 // Internal EM Candidates unpacking
00750 void GctFormatTranslateV38::blockToGctInternEmCand(const unsigned char * d, const GctBlockHeader& hdr)
00751 {
00752   // Don't want to do this in HLT optimisation mode!
00753   if(hltMode()) { LogDebug("GCT") << "HLT mode - skipping unpack of internal EM Cands"; return; }
00754 
00755   unsigned int id = hdr.blockId();
00756   unsigned int nSamples = hdr.nSamples();
00757   unsigned int numCandPairs = hdr.blockLength();
00758 
00759   // Debug assertion to prevent problems if definitions not up to date.
00760   assert(internEmIsoBounds().find(id) != internEmIsoBounds().end());  
00761 
00762   unsigned int lowerIsoPairBound = internEmIsoBounds()[id].first;
00763   unsigned int upperIsoPairBound = internEmIsoBounds()[id].second;
00764 
00765   // Re-interpret pointer to 16 bits so it sees one candidate at a time.
00766   uint16_t * p = reinterpret_cast<uint16_t *>(const_cast<unsigned char *>(d));
00767 
00768   // Loop over timesamples (i.e. bunch crossings)
00769   for(unsigned int bx=0; bx < nSamples; ++bx)
00770   {
00771     // Loop over candidate pairs (i.e. each iteration unpacks a pair of candidates)
00772     for(unsigned int candPair = 0 ; candPair < numCandPairs ; ++candPair)
00773     {
00774       // Is the candidate electron pair an isolated pair or not?
00775       bool iso = ((candPair>=lowerIsoPairBound) && (candPair<=upperIsoPairBound));
00776       
00777       // Loop over the two electron candidates in each pair
00778       for(unsigned int i = 0 ; i < 2 ; ++i)
00779       { 
00780         unsigned offset = 2*(bx + candPair*nSamples) + i;
00781         uint16_t candRaw = p[offset]; 
00782         colls()->gctInternEm()->push_back( L1GctInternEmCand(candRaw, iso, id, candPair*2 + i, bx) );
00783       }
00784     }
00785   }
00786 }
00787 
00788 
00789 // Input EM Candidates unpacking
00790 // this is the last time I deal the RCT bit assignment travesty!!!
00791 void GctFormatTranslateV38::blockToRctEmCand(const unsigned char * d, const GctBlockHeader& hdr)
00792 {
00793   // Don't want to do this in HLT optimisation mode!
00794   if(hltMode()) { LogDebug("GCT") << "HLT mode - skipping unpack of RCT EM Cands"; return; }
00795 
00796   unsigned int id = hdr.blockId();
00797   unsigned int nSamples = hdr.nSamples();
00798   unsigned int length = hdr.blockLength();
00799 
00800   // re-interpret pointer
00801   uint16_t * p = reinterpret_cast<uint16_t *>(const_cast<unsigned char *>(d));
00802 
00803   // arrays of source card data
00804   uint16_t sfp[2][4]; // [ cycle ] [ SFP ]
00805   uint16_t eIsoRank[4];
00806   uint16_t eIsoCard[4];
00807   uint16_t eIsoRgn[4];
00808   uint16_t eNonIsoRank[4];
00809   uint16_t eNonIsoCard[4];
00810   uint16_t eNonIsoRgn[4];
00811   uint16_t MIPbits[7][2];
00812   uint16_t QBits[7][2];
00813 
00814   unsigned int bx = 0;
00815 
00816   // loop over crates
00817   for (unsigned int crate=rctEmCrateMap()[id]; crate<rctEmCrateMap()[id]+length/3; ++crate) {
00818 
00819     // read SC SFP words
00820     for (unsigned short iSfp=0 ; iSfp<4 ; ++iSfp) {
00821       for (unsigned short cyc=0 ; cyc<2 ; ++cyc) {
00822         if (iSfp==0) { sfp[cyc][iSfp] = 0; } // muon bits
00823         else {                               // EM candidate
00824           sfp[cyc][iSfp] = *p;
00825           ++p;
00826         }
00827       }
00828       p = p + 2*(nSamples-1);
00829     }
00830 
00831     // fill SC arrays
00832     srcCardRouting().SFPtoEMU(eIsoRank, eIsoCard, eIsoRgn, eNonIsoRank, eNonIsoCard, eNonIsoRgn, MIPbits, QBits, sfp);
00833     
00834     // create EM cands
00835     for (unsigned short int i=0; i<4; ++i) {
00836       colls()->rctEm()->push_back( L1CaloEmCand( eIsoRank[i], eIsoRgn[i], eIsoCard[i], crate, true, i, bx) );
00837     }
00838     for (unsigned short int i=0; i<4; ++i) {
00839       colls()->rctEm()->push_back( L1CaloEmCand( eNonIsoRank[i], eNonIsoRgn[i], eNonIsoCard[i], crate, false, i, bx) );
00840     }
00841   }
00842 }
00843 
00844 // Input RCT region unpacking
00845 void GctFormatTranslateV38::blockToRctCaloRegions(const unsigned char * d, const GctBlockHeader& hdr)
00846 {
00847   // Don't want to do this in HLT optimisation mode!
00848   if(hltMode()) { LogDebug("GCT") << "HLT mode - skipping unpack of RCT Regions"; return; }
00849 
00850   unsigned int id = hdr.blockId();
00851   unsigned int nSamples = hdr.nSamples();
00852   unsigned int length = hdr.blockLength();
00853 
00854   // Debug assertion to prevent problems if definitions not up to date.
00855   assert(rctJetCrateMap().find(id) != rctJetCrateMap().end());  
00856   
00857   // get crate (need this to get ieta and iphi)
00858   unsigned int crate=rctJetCrateMap()[id];
00859 
00860   // re-interpret pointer
00861   uint16_t * p = reinterpret_cast<uint16_t *>(const_cast<unsigned char *>(d));
00862   
00863   // eta and phi
00864   unsigned int ieta; 
00865   unsigned int iphi; 
00866   
00867   for (unsigned int i=0; i<length; ++i)
00868   { 
00869     for (uint16_t bx=0; bx<nSamples; ++bx)
00870     {
00871       // First figure out eta and phi
00872       if (crate<9) { // negative eta
00873           ieta = 12-i; 
00874           iphi = 2*((11-crate)%9);
00875       }
00876       else { // positive eta
00877         ieta = 9+i;
00878         iphi = 2*((20-crate)%9);
00879       }
00880       
00881       // Skip the first four regions (i.e. where i<2) which are duplicates (shared data).
00882       if (i>1) { 
00883         // First region is phi=0
00884         colls()->rctCalo()->push_back( makeL1CaloRegionBackPortHack(*p, ieta, iphi, bx) );
00885         ++p;
00886         // Second region is phi=1
00887         if (iphi>0) { iphi-=1; }
00888         else { iphi = 17; }
00889         colls()->rctCalo()->push_back( makeL1CaloRegionBackPortHack(*p, ieta, iphi, bx) );
00890         ++p;
00891       }
00892       // Unpack the shared data if asked for debugging
00893       else if (unpackSharedRegions()){
00894         // First region is phi=0
00895         colls()->rctCalo()->push_back( makeL1CaloRegionBackPortHack(*p, ieta, iphi, bx) );
00896         ++p;
00897         // Second region is phi=1
00898         if (iphi>0) { iphi-=1; }
00899         else { iphi = 17; }
00900         colls()->rctCalo()->push_back( makeL1CaloRegionBackPortHack(*p, ieta, iphi, bx) );
00901         ++p;
00902         
00903       } else { // Skip the shared data  
00904         ++p;
00905         ++p;
00906       }
00907     }
00908   } 
00909 }  
00910 
00911 // Fibre unpacking
00912 void GctFormatTranslateV38::blockToFibres(const unsigned char * d, const GctBlockHeader& hdr)
00913 {
00914   // Don't want to do this in HLT optimisation mode!
00915   if(hltMode()) { LogDebug("GCT") << "HLT mode - skipping unpack of GCT Fibres"; return; }
00916   
00917   unsigned int id = hdr.blockId();
00918   unsigned int nSamples = hdr.nSamples();
00919   unsigned int length = hdr.blockLength();
00920 
00921   // re-interpret pointer
00922   uint32_t * p = reinterpret_cast<uint32_t *>(const_cast<unsigned char *>(d));
00923 
00924   for (unsigned int i=0; i<length; ++i) {
00925     for (unsigned int bx=0; bx<nSamples; ++bx) {
00926       colls()->gctFibres()->push_back( L1GctFibreWord(*p, id, i, bx) );
00927       ++p;
00928     }
00929   } 
00930 }
00931 
00932 void GctFormatTranslateV38::blockToFibresAndToRctEmCand(const unsigned char * d, const GctBlockHeader& hdr)
00933 {
00934   this->blockToRctEmCand(d, hdr);
00935   this->blockToFibres(d, hdr);
00936 }
00937 
00938 void GctFormatTranslateV38::blockToGctTrigObjects(const unsigned char * d, const GctBlockHeader& hdr)
00939 {
00940   // Don't want to do this in HLT optimisation mode!
00941   if(hltMode()) { LogDebug("GCT") << "HLT mode - skipping unpack of internal Jet Cands"; return; }
00942 
00943   unsigned int id = hdr.blockId();
00944   unsigned int nSamples = hdr.nSamples();
00945   unsigned int length = hdr.blockLength();
00946 
00947   // Re-interpret pointer to 16 bits so it sees one candidate at a time.
00948   uint16_t * p = reinterpret_cast<uint16_t *>(const_cast<unsigned char *>(d));
00949 
00950   for (unsigned int i=0; i<length; ++i) {
00951     // Loop over timesamples (i.e. bunch crossings)
00952     for (unsigned int bx=0; bx<nSamples; ++bx) {
00953       colls()->gctInternJets()->push_back( L1GctInternJetData::fromGctTrigObject(L1CaloRegionDetId(0,0),id,i,bx,*p));
00954       ++p;
00955       colls()->gctInternJets()->push_back( L1GctInternJetData::fromGctTrigObject(L1CaloRegionDetId(0,0),id,i,bx,*p));
00956       ++p;
00957     }
00958   } 
00959 }
00960 
00961 void GctFormatTranslateV38::blockToGctJetClusterMinimal(const unsigned char * d, const GctBlockHeader& hdr)
00962 {
00963   // Don't want to do this in HLT optimisation mode!
00964   if(hltMode()) { LogDebug("GCT") << "HLT mode - skipping unpack of internal Jet Cands"; return; }
00965 
00966   unsigned int id = hdr.blockId();
00967   unsigned int nSamples = hdr.nSamples();
00968   unsigned int length = hdr.blockLength();
00969 
00970   // Re-interpret pointer to 16 bits so it sees one candidate at a time.
00971   uint16_t * p = reinterpret_cast<uint16_t *>(const_cast<unsigned char *>(d));
00972 
00973   for (unsigned int i=0; i<length; ++i) {
00974     // Loop over timesamples (i.e. bunch crossings)
00975     for (unsigned int bx=0; bx<nSamples; ++bx) {
00976       colls()->gctInternJets()->push_back( L1GctInternJetData::fromJetClusterMinimal(L1CaloRegionDetId(0,0),id,i,bx,*p));
00977       ++p;
00978       colls()->gctInternJets()->push_back( L1GctInternJetData::fromJetClusterMinimal(L1CaloRegionDetId(0,0),id,i,bx,*p));
00979       ++p;
00980     }
00981   } 
00982 }
00983 
00984 void GctFormatTranslateV38::blockToGctJetPreCluster(const unsigned char * d, const GctBlockHeader& hdr)
00985 {
00986   // Don't want to do this in HLT optimisation mode!
00987   if(hltMode()) { LogDebug("GCT") << "HLT mode - skipping unpack of internal Jet Cands"; return; }
00988 
00989   unsigned int id = hdr.blockId();
00990   unsigned int nSamples = hdr.nSamples();
00991   unsigned int length = hdr.blockLength();
00992 
00993   // Re-interpret pointer to 16 bits so it sees one candidate at a time.
00994   uint16_t * p = reinterpret_cast<uint16_t *>(const_cast<unsigned char *>(d));
00995 
00996   for (unsigned int i=0; i<length; ++i) {
00997     // Loop over timesamples (i.e. bunch crossings)
00998     for (unsigned int bx=0; bx<nSamples; ++bx) {
00999       colls()->gctInternJets()->push_back( L1GctInternJetData::fromJetPreCluster(L1CaloRegionDetId(0,0),id,i,bx,*p));
01000       ++p;
01001       colls()->gctInternJets()->push_back( L1GctInternJetData::fromJetPreCluster(L1CaloRegionDetId(0,0),id,i,bx,*p));
01002       ++p;
01003     }
01004   } 
01005 }

Generated on Tue Jun 9 17:34:41 2009 for CMSSW by  doxygen 1.5.4