The THiRA class inherits from TObject. This Class provides the structure for the HiRA device. Raw event data is filled into the class members.
While using the ASIC electronics for digitization of signals generated in the HiRA Si detectors it has become apparent that corrections based on readout order must be applied. The following data members and function methods are important in dealing with these, as we have observed so far, constant shifts of channels.
(THiRASiDet) fCbSequence: (THiRASiDet) fChSequence: (THiRASiDet) fHitSequence: (THiRASiDet) fHitSequence: fHits[]:
A few notes should be made regarding the radomization of integer type data to floating point types.
THiRA() | |
THiRA(const THiRA&) | |
virtual | ~THiRA() |
void | TObject::AbstractMethod(const char* method) const |
virtual void | TObject::AppendPad(Option_t* option = "") |
virtual void | TObject::Browse(TBrowser* b) |
void | Calculate() |
Int_t | Calibrate(Option_t* prefix = "", Option_t* path = "", Option_t* treeName = "", Option_t* option = "RECREATE") |
static TClass* | Class() |
virtual const char* | TObject::ClassName() const |
virtual void | Clear(Option_t* option = "") |
void | ClearErr() |
virtual TObject* | TObject::Clone(const char* newname = "") const |
virtual Int_t | TObject::Compare(const TObject* obj) const |
virtual void | Copy(TObject& hira) const |
void | CreateFolders() |
virtual void | TObject::Delete(Option_t* option = "")MENU |
virtual Int_t | TObject::DistancetoPrimitive(Int_t px, Int_t py) |
virtual void | Draw(Option_t* option = "") |
virtual Long64_t | Draw(const Char_t* varexp, const Char_t* selection, Option_t* option = "", Option_t* drawType = "all") |
virtual void | TObject::DrawClass() constMENU |
virtual TObject* | TObject::DrawClone(Option_t* option = "") constMENU |
virtual void | TObject::Dump() constMENU |
virtual void | TObject::Error(const char* method, const char* msgfmt) const |
virtual void | TObject::Execute(const char* method, const char* params, Int_t* error = 0) |
virtual void | TObject::Execute(TMethod* method, TObjArray* params, Int_t* error = 0) |
virtual void | TObject::ExecuteEvent(Int_t event, Int_t px, Int_t py) |
virtual void | TObject::Fatal(const char* method, const char* msgfmt) const |
Bool_t | Fill(Short_t energy, Short_t time, Short_t teleNum, Short_t faceNum, Short_t stripNum, Short_t cbSeq, Short_t chSeq, UInt_t hitSeq) |
Bool_t | FillCsI(Short_t energy, Short_t teleNum, Short_t csiNum) |
virtual TObject* | TObject::FindObject(const char* name) const |
virtual TObject* | TObject::FindObject(const TObject* obj) const |
Int_t | GenPrime(Option_t* prefix = "", Option_t* path = "", Option_t* treeName = "", Option_t* option = "RECREATE") |
const Char_t* | GetChipMapFile() const |
const Char_t* | GetCsIMapFile() const |
const Char_t* | GetCsIMapPath() const |
Int_t | GetCsIQuadIndex(Int_t xStrip, Int_t yStrip) |
virtual Option_t* | TObject::GetDrawOption() const |
static Long_t | TObject::GetDtorOnly() |
virtual const char* | TObject::GetIconName() const |
virtual const Char_t* | GetName() const |
virtual char* | TObject::GetObjectInfo(Int_t px, Int_t py) const |
static Bool_t | TObject::GetObjectStat() |
virtual Option_t* | TObject::GetOption() const |
Int_t | GetPadIndex(Int_t index) |
TVector3 | GetPixVec(THiRA* hira) |
const Char_t* | GetReadoutFile() const |
TTarget* | GetTarget() |
Int_t | GetTeleIndex(Int_t id) |
virtual const Char_t* | GetTitle() const |
virtual UInt_t | TObject::GetUniqueID() const |
virtual Bool_t | TObject::HandleTimer(TTimer* timer) |
virtual ULong_t | TObject::Hash() const |
virtual void | TObject::Info(const char* method, const char* msgfmt) const |
virtual Bool_t | TObject::InheritsFrom(const char* classname) const |
virtual Bool_t | TObject::InheritsFrom(const TClass* cl) const |
void | InitBranch(TTree* tree, Option_t* stage) |
Bool_t | InitClass() |
void | InitTree(TTree* tree) |
virtual void | TObject::Inspect() constMENU |
void | TObject::InvertBit(UInt_t f) |
virtual TClass* | IsA() const |
virtual Bool_t | TObject::IsEqual(const TObject* obj) const |
virtual Bool_t | TObject::IsFolder() const |
Bool_t | TObject::IsOnHeap() const |
virtual Bool_t | TObject::IsSortable() const |
Bool_t | TObject::IsZombie() const |
Bool_t | LoadAdcMap() |
Bool_t | LoadBadElements(Char_t* filePath) |
Bool_t | LoadCsICalibration(Char_t* filePath, Int_t nCal = 0) |
Bool_t | LoadCsISegVec(Char_t* filePath) |
Bool_t | LoadCsIVCalibration(Char_t* filePath) |
Bool_t | LoadPixelMatrix(Char_t* filePath) |
Bool_t | LoadReadoutShifts(Char_t* filePath) |
Bool_t | LoadSiCalibration(Char_t* filePath) |
virtual void | TObject::ls(Option_t* option = "") const |
void | TObject::MayNotUse(const char* method) const |
virtual Bool_t | TObject::Notify() |
static void | TObject::operator delete(void* ptr) |
static void | TObject::operator delete(void* ptr, void* vp) |
static void | TObject::operator delete[](void* ptr) |
static void | TObject::operator delete[](void* ptr, void* vp) |
void* | TObject::operator new(size_t sz) |
void* | TObject::operator new(size_t sz, void* vp) |
void* | TObject::operator new[](size_t sz) |
void* | TObject::operator new[](size_t sz, void* vp) |
TObject& | TObject::operator=(const TObject& rhs) |
virtual void | TObject::Paint(Option_t* option = "") |
virtual void | TObject::Pop() |
virtual void | TObject::Print(Option_t* option = "") const |
void | PrintBad(Option_t*) |
virtual Int_t | TObject::Read(const char* name) |
virtual void | TObject::RecursiveRemove(TObject* obj) |
void | TObject::ResetBit(UInt_t f) |
void | ResetCalibBranches() |
virtual void | TObject::SaveAs(const char* filename = "", Option_t* option = "") constMENU |
virtual void | TObject::SavePrimitive(basic_ostream<char,char_traits<char> >& out, Option_t* option = "") |
void | SetAddRndm(Bool_t* AddRndm) |
void | TObject::SetBit(UInt_t f) |
void | TObject::SetBit(UInt_t f, Bool_t set) |
Bool_t | SetChipMapFile(Char_t* filePath) |
Bool_t | SetCsIMapFile(Char_t* filePath) |
virtual void | TObject::SetDrawOption(Option_t* option = "")MENU |
static void | TObject::SetDtorOnly(void* obj) |
void | SetEuler(Double_t phi, Double_t theta, Double_t psi) |
void | SetName(const Char_t* name) |
void | SetNameTitle(const Char_t* name, const Char_t* title) |
static void | TObject::SetObjectStat(Bool_t stat) |
Bool_t | SetReadoutShiftPath(Char_t* filePath) |
void | SetTarget(TTarget* target) |
void | SetTitle(const Char_t* title = "") |
virtual void | TObject::SetUniqueID(UInt_t uid) |
virtual void | ShowMembers(TMemberInspector& insp, char* parent) |
virtual void | Streamer(TBuffer& b) |
void | StreamerNVirtual(TBuffer& b) |
virtual void | TObject::SysError(const char* method, const char* msgfmt) const |
Bool_t | TObject::TestBit(UInt_t f) const |
Int_t | TObject::TestBits(UInt_t f) const |
virtual Bool_t | Unpack(UShort_t* p) |
Bool_t | UnpackCsI(UShort_t* p) |
UShort_t* | UnpackCsIEnergy(UShort_t* p) |
virtual void | TObject::UseCurrentStyle() |
virtual void | TObject::Warning(const char* method, const char* msgfmt) const |
virtual Int_t | TObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0) |
virtual Int_t | TObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0) const |
virtual void | TObject::DoError(int level, const char* location, const char* fmt, va_list va) const |
void | TObject::MakeZombie() |
enum TObject::EStatusBits { | kCanDelete | |
kMustCleanup | ||
kObjInCanvas | ||
kIsReferenced | ||
kHasUUID | ||
kCannotPick | ||
kNoContextMenu | ||
kInvalidObject | ||
}; | ||
enum TObject::[unnamed] { | kIsOnHeap | |
kNotDeleted | ||
kZombie | ||
kBitMask | ||
kSingleKey | ||
kOverwrite | ||
kWriteDelete | ||
}; |
Double_t | CsIRawThresh | ! CsI multiplicity threshold. |
Double_t | SiRawThresh | ! Si multiplicity threshold. |
THiRAAsic | asic | ! ASIC class to hold unpacking data. |
TBranch* | b_fHits | ! |
TBranch* | b_fNwords | ! Words count branch. |
TBranch* | b_fPixel | ! |
TBranch* | b_fRawMult | ! Raw multiplicity branch. |
TBranch* | b_tele[16] | ! Telescope branch. |
Bool_t | fAddRndm | ! Add random number to convert from short data types to double. |
TCrange* | fCRange | ! Range-Energy range calculator. |
TTree* | fChain | ! pointer to the analyzed TTree or TChain |
TTree* | fClone | ! pointer to a cloned TTree or TChain |
Bool_t | fCorrectReadout | ! Apply readout order correction. |
Int_t | fCurrent | ! current Tree number in a TChain |
Double_t | fEulerPhi | ! Phi Euler angle. |
Double_t | fEulerPsi | ! Psi Euler angle. |
Double_t | fEulerTheta | ! Theata Euler angle. |
Short_t | fHits[4] | Number of hits in each tower. |
UShort_t | fNwords | Number of HiRA words in an event. |
TClonesArray* | fPixel | Collection of hit telescope pixels. |
TPolyMarker3D* | fPixelView | ! Marker graph of loaded pixels. (OpenGL) |
Short_t | fRawMult | Total HiRA multiplicity |
TTele* | fTele[16] | ! |
TFolder* | f_HiRA | ! HiRA folder. |
TFolder* | f_input | ! Input-files folder. |
TFolder* | f_parameters | ! Parameters folder. |
TFolder* | f_pixelMatrix | ! Pixel position folder. |
static TClonesArray* | fgPixel | Collection of hit telescope pixels. |
TTele | tele[16] | ! A HiRA Telescope array. |
TList | teleTList | A HiRA Telescope collection. |
Int_t | fAnalysisState | ! Current analysis state of fChain. |
TString | fName | ! Object identifier |
TTarget* | fTarget | ! Current target. |
TString | fTitle | ! Object title |
Short_t | CsIMap[21][32] | ! ADC VME slot and channel mapping. |
vector<Short_t> | adcList | ! |
Short_t | adcTeleMap[21][32] | ! ADC VME slot and channel mapping. |
Char_t* | chipMapFile | ! ASIC chip mapping filename. |
Char_t* | csiMapFile | ! CsI mapping filename. |
Char_t* | csiMapPath | ! CsI mapping file path. |
Int_t | fChanErr[4][15][32] | ! Errors related to channel addressing. |
Int_t | fChipErr[4][30] | ! Errors related to chip addressing. |
TCanvas* | fHiRACanvas | ! |
TVector3 | fPixVec | |
Char_t* | fReadoutShiftPath | ! Readout shift file path. |
Int_t | fTeleIndexMap[16] | ! |
Inheritance Chart: | ||||||||
|
-- Draw an expression for multiple telescope. Many times when we wish to draw a histogram for HiRA we want to create it for all telescopes. This method allows one to easily accomplish this task. 1. varexp is the normal expression one would use EXCEPT without the tele#. prefix. 2. selection is any condition put on the output. 3. option is the typical Draw option such "colz","surf", etc. 4. drawType must be set to "all" as this is the only option implemented. This option produces a canvas with all telescopes drawn.
-- Fill the telescope branches with data. The following operations occur, 1. The CB and Hit sequences are set. 2.
-- Fill the telescope CsI branches with data.
-- Get the index for the quadrant of silicon located behind a pixel.
-- Get the TPad index corresponding to the physical position of a telescope. When drawing histograms for HiRA it is sometimes desireable to create a canvas containing pads corresponding to each detector. It is also convenient to draw these histograms in the actual order of the setup. This method returns the index of a TPad defined by the towerMatrix[][] in the rootDefine.h file. This pad number should be the physical position of the detector in the setup.
-- Generate HiRA primary data tree.
-- Gets the telescope index of a telescope with id. There are two main integer numbers that describe a telescope. The first is what we call the telescope id. This is the number that is typically located on the back of the detector box. It is the label for the telescope. The second is the telescope index. This is the postion in the tele[] array. The purpose of this array is that it allows us to easily loop over all telescopes using a for() loop. For example, if we have 16 telescopes then the tele[] array will have 16 elements. The telescope index then runs from 0-15. However, we may be using telescopes 7,0,1,2,3,4,5,6,8,9,10,11,12,16,17,19. These are not consecutive numbers that are difficult to loop over. NOTE: While this is one way to loop over telescopes there is a more object oriented method. This method involves using the TIter class and iterating over the elements in the THiRA TList or an additional TObjArray.
-- Loads and parses the .vdef file containing the HiRA CsI slopes and offset values. The filepath argument is the location of the calibration file.
-- Loads and parses the .vdef file containing the HiRA CsI voltage calibration values. The filepath argument is the location of the calibration file.
-- Load a HiRA pixel file. This file should contain the DESIGN VECTORS of each pixel in the array. A script should be used later for calculations using the MEASURED VECTORS.
-- Load the HiRA readout order shift parameters. This file contains the readout shifts for each channel in HiRA. The telescopes are ordered starting at the bottom left, increasing as we move up a tower. The number continues at the bottom of the next tower proceeding until the upper right of the array. This file and the LoadReadoutShift() method should be modified if a more complicated shift id needed. This file format should satisfy most basic needs. The shift can be set per channel, per face, or per chip. It is assumed that the highest order if O(5). *** SIMPLE PER CHANNEL SHIFT *** The format is IF Complexity==2, teleIndex teleID face Complexity O(0) O(1) O(2) O(3) O(4) O(5) //CH0 O(0) O(1) O(2) O(3) O(4) O(5) //CH1 O(0) O(1) O(2) O(3) O(4) O(5) //CH2 O(0) O(1) O(2) O(3) O(4) O(5) //CH3 . . . . . . . . . . . . . . . . . . and so on . . . *** SIMPLE PER CHIP SHIFT *** The format is IF Complexity==1, (EVEN->Chip 0,ODD->Chip 1) teleIndex teleID face Complexity O(0) O(1) O(2) O(3) O(4) O(5) //CHIP0 O(0) O(1) O(2) O(3) O(4) O(5) //CHIP1 and so on . . . *** SIMPLE PER FACE SHIFT *** The format is IF Complexity==0, teleIndex teleID face Complexity O(0) O(1) O(2) O(3) O(4) O(5) //FACE and so on . . .
-- Load a HiRA Si calibration file. Loads and parses the .vdef file containing the HiRA Si slopes and offset values. The filepath argument is the location of the calibration file.
-- Change (i.e. set) all the THiRA parameters (name and title).
-- Unpack a HiRA event. This functions unpacks the raw data contained in a HiRA packet within an event data buffer. The argument is a pointer which is the location of beginning of the packet. When unpacking data from an event file this function will typically be called whenever a HiRA packet tag is found. (Packet id's are defined in the file packetID.h). There has been some confusion regarding the mapping of the strips to their respective chip and channel that is written to the event file. Typically, 1. The dE and EF strips are vertical. The EB strips are horizontal. 2. Chip 0 is the first chip readout. 3. The chipboards are readout from the bottom slot on a MB to the top. 4. The convention is to have the upper left pixel of the detector to be (0,0) so that the detector pixels are elements of a matrix. 5. The dE detector is connected in the same way as the EF. HOWEVER, when going through external preamps and the pinout is changed!!! Therefore dE strips may map differently than below. Chip 0 is PIN #0 on chipboard (even PINS). Chip 1 is PIN #1 on chipboard (odd PINS). Ch 15 15 14 14 13 13 12 12 11 11 10 10 09 09 08 08 07 07 06 06 05 05 04 04 03 03 02 02 01 01 00 00 PIN 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 strip 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 00 00 00 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 00 01 01 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 01 02 02 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 01 03 03 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 02 04 04 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 02 05 05 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 03 06 06 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 03 07 07 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 04 08 08 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 04 09 09 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 05 10 10 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 05 11 11 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 06 12 12 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| ^ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 06 13 13 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 07 14 14 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| EB | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 07 15 15 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 08 16 16 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| V | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 08 17 17 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 09 18 18 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 09 19 19 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 10 20 20 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 10 21 21 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 11 22 22 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 11 23 23 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 12 24 24 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 12 25 25 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 13 26 26 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 13 27 27 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 14 28 28 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 14 29 29 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 15 30 30 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 15 31 31 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| <--- EF --->