TPC mapping (M.Ivanov + Jens Wiechula)
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 23 Oct 2006 14:22:08 +0000 (14:22 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 23 Oct 2006 14:22:08 +0000 (14:22 +0000)
TPC/AliTPCmapper.cxx [new file with mode: 0644]
TPC/AliTPCmapper.h [new file with mode: 0644]

diff --git a/TPC/AliTPCmapper.cxx b/TPC/AliTPCmapper.cxx
new file mode 100644 (file)
index 0000000..2312ce8
--- /dev/null
@@ -0,0 +1,296 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+//-------------------------------------------------------------------------
+//           AliTPCmapper
+//  Origin: Jens Wiechula    (j.wiechula@gsi.de)
+//
+//  class to map (row,pad,sector) to (RCU, Branch, FEC, Altro, Altro channel)
+//  create Altro address 
+
+
+#include <stdio.h>
+#include <TMath.h>
+#include <TSystem.h>
+
+#include "AliTPCmapper.h"
+
+
+ClassImp(AliTPCmapper)
+
+
+//______________________________________________________________
+AliTPCmapper::AliTPCmapper()
+{
+    Init();
+    ReadMapping();
+}
+
+//______________________________________________________________
+void AliTPCmapper::Init()
+{
+
+    //Initialize arrays
+    for (Int_t i=0; i<kNrcu; i++){
+       for (Int_t j=0; j<kNbranch; j++){
+           for (Int_t k=0; k<kNfecMax; k++){
+               for (Int_t l=0; l<kNaltro; l++){
+                   for (Int_t m=0; m<kNchannel; m++){
+                       fAddressToRow[i][j][k][l][m] = -1;
+                       fAddressToPad[i][j][k][l][m] = -1;
+                   }
+               }
+           }
+       }
+    }
+
+    for (Int_t i=0; i<kNpadrow; i++){
+       for (Int_t j=0; j<kNpadMax; j++){
+           fRowPadToRCU[i][j] = -1;
+           fRowPadToBranch[i][j] = -1;
+           fRowPadToFEC[i][j] = -1;
+           fRowPadToAltro[i][j] = -1;
+           fRowPadToChannel[i][j] = -1;
+            fRowPadToPadsec[i][j] = -1;
+       }
+    }
+
+    for (Int_t i=0; i<kNpadSector; i++){
+       fPadsecToRow[i]=-1;
+       fPadsecToPad[i]=-1;
+    }
+
+//    for (Int_t i=0; i<kNaddrSize; i++)
+//        fAddressArray[i] = 0;
+
+    strcpy(fMapfileName,gSystem->ExpandPathName("$ALICE_ROOT/TPC/final_mapping.txt"));
+}
+
+//______________________________________________________________
+Int_t AliTPCmapper::ReadMapping()
+{
+    FILE *f_in;
+    char line[255];
+
+    int pad = -1, row = -1;
+    int rcu = -1, bra = -1, fec = -1, alt = -1, chn = -1;
+    int padsec = 0;
+
+
+    f_in = fopen(fMapfileName,"r");
+    if (!f_in){
+       fprintf(stderr, "cannot open file '%s'!\n",fMapfileName);
+       return 1;
+    }
+
+    fgets(line,256,f_in);
+    while (sscanf(line,"%d %d %d %d %d %d %d %d",
+                 &padsec, &row, &pad,
+                 &rcu, &bra, &fec, &alt, &chn
+                )!=8){
+        fgets(line, 256, f_in);
+       fprintf(stderr,"%s",line);
+    }
+
+    while (!feof(f_in)){
+        sscanf(line,"%d %d %d %d %d %d %d %d",
+              &padsec, &row, &pad,
+              &rcu, &bra, &fec, &alt, &chn
+             );
+       fAddressToRow[rcu][bra][fec][alt][chn] = row;
+       fAddressToPad[rcu][bra][fec][alt][chn] = pad;
+
+       fRowPadToRCU[row][pad]     = rcu;
+       fRowPadToBranch[row][pad]  = bra;
+       fRowPadToFEC[row][pad]     = fec;
+       fRowPadToAltro[row][pad]   = alt;
+       fRowPadToChannel[row][pad] = chn;
+       fRowPadToPadsec[row][pad]  = padsec;
+
+       fPadsecToRow[padsec]        = row;
+        fPadsecToPad[padsec]        = pad;
+
+
+
+       fgets(line, 256, f_in);
+    }
+
+    fclose(f_in);
+
+    return 0;
+}
+
+//______________________________________________________________
+void AliTPCmapper::PrintRBFACinfo(Int_t row, Int_t pad)
+{
+    fprintf(stderr,"RCU: %d, Branch: %d, FEC: %2d, Altro: %d, Channel: %2d\n",
+           GetRCUs(row,pad), GetBranchS(row,pad),
+           GetFECs(row,pad), GetAltroS(row,pad),
+           GetChannelS(row,pad));
+
+}
+
+//______________________________________________________________
+Int_t AliTPCmapper::GetPadsInRowS(Int_t row){
+    if ( row == 0 )
+       return 68;
+
+    if ( row < 63 )
+       return 2*(Int_t)(row/3.+33.67);
+
+    row -= 63;
+    Double_t k1=10./6.*tan(TMath::Pi()/18.);
+
+    if ( row < 64 )
+       return 2*(Int_t)(k1 * row + 37.75);
+
+    Double_t k2=15./6.*tan(TMath::Pi()/18.);
+    return 2*(Int_t)(k2 * (row-64) + 56.66);
+}
+
+//______________________________________________________________
+Double_t AliTPCmapper::GetPadXlocalS(Int_t row, Int_t pad){
+    if ( row < 63 ) //IROC
+       return (852.25 + 7.5 * (Double_t)row)*1.e-1; //divide by 10 to get cm
+
+    row -= 63;
+
+    if ( row < 64 ) //OROC inner part
+       return (10.* row + 1351.)*1.e-1;  //divide by 10 to get cm
+
+
+    //OROC outer part
+    return (15.*(row - 64) + 1993.5)*1.e-1;  //divide by 10 to get cm
+}
+
+//______________________________________________________________
+Double_t AliTPCmapper::GetPadXlocalS(Int_t padsector){
+    Int_t row=GetRowFromPadSector(padsector);
+    Int_t pad=GetPadFromPadSector(padsector);
+    return GetPadXlocalS(row,pad);
+}
+
+//______________________________________________________________
+Double_t AliTPCmapper::GetPadYlocalS(Int_t row, Int_t pad){
+    Int_t padsInRow = GetPadsInRowS(row);
+
+    if ( row < 63 ) //IROC
+       return (2.* padsInRow - 4.*pad - 2.)*1.e-1;  //divide by 10 to get cm
+
+    //OROC
+        return (3.* padsInRow -6.*pad - 3.)*1.e-1;  //divide by 10 to get cm
+}
+
+//______________________________________________________________
+Double_t AliTPCmapper::GetPadYlocalS(Int_t padsector){
+    Int_t row = GetRowFromPadSector(padsector);
+    Int_t pad = GetPadFromPadSector(padsector);
+    return GetPadYlocalS(row,pad);
+}
+
+//______________________________________________________________
+Double_t AliTPCmapper::GetPadXglobalS(Int_t row, Int_t pad,Int_t sector){
+    Double_t angle = (Double_t)(( sector * 20. ) +10. ) * TMath::DegToRad();
+    return GetPadXlocalS(row,pad)*TMath::Cos(angle) -
+       GetPadYlocalS(row,pad)*TMath::Sin(angle);
+}
+
+//______________________________________________________________
+Double_t AliTPCmapper::GetPadYglobalS(Int_t row, Int_t pad,Int_t sector){
+    Double_t angle = (Double_t)(( sector * 20. ) + 10. ) * TMath::DegToRad();
+    return GetPadXlocalS(row,pad)*TMath::Sin(angle) +
+       GetPadYlocalS(row,pad)*TMath::Cos(angle);
+}
+
+//______________________________________________________________
+Double_t AliTPCmapper::GetPadWidthS(Int_t row)
+{
+    if (row < 63 ) return .4;
+    return .6;
+}
+
+//______________________________________________________________
+Double_t AliTPCmapper::GetPadLengthS(Int_t row)
+{
+    if ( row < 63  ) return  .75;
+    if ( row < 127 ) return 1.;
+    return 1.5;
+}
+
+//______________________________________________________________
+Int_t AliTPCmapper::GetAltroAddrwPatch(const Int_t row,const Int_t pad)
+{
+    return GetChannelS(row,pad)+
+       (GetAltroS (row,pad) <<4)+
+       (GetFECs   (row,pad) <<7)+
+       (GetBranchS(row,pad) <<11)+
+        (GetRCUs   (row,pad) <<12);
+}
+
+//______________________________________________________________
+Int_t AliTPCmapper::GetAltroAddrwPatch(const Int_t padsector)
+{
+    return GetAltroAddrwPatch(GetRowFromPadSector(padsector),GetPadFromPadSector(padsector));
+}
+
+//______________________________________________________________
+Int_t AliTPCmapper::GetRow(Int_t altroaddr)
+{
+    Int_t rcu = (altroaddr>>12)&0x07;
+    Int_t bra = (altroaddr>>11)&0x01;
+    Int_t fec = (altroaddr>>7)&0x0F;
+    Int_t alt = (altroaddr>>4)&0x07;
+    Int_t chn = (altroaddr)&0x0F;
+    return GetRow(rcu,bra,fec,alt,chn);
+}
+
+//______________________________________________________________
+Int_t AliTPCmapper::GetPad(Int_t altroaddr)
+{
+    Int_t rcu = (altroaddr>>12)&0x07;
+    Int_t bra = (altroaddr>>11)&0x01;
+    Int_t fec = (altroaddr>>7)&0x0F;
+    Int_t alt = (altroaddr>>4)&0x07;
+    Int_t chn = (altroaddr)&0x0F;
+    return GetPad(rcu,bra,fec,alt,chn);
+}
+
+//______________________________________________________________
+void AliTPCmapper::PrintAddressArray(Int_t row, Int_t pad)
+{
+    Bool_t a[kNaddrSize];
+
+    Int_t addr = GetAltroAddrwPatch(row,pad);
+    for (Int_t i=0; i<kNaddrSize; i++)
+       a[i] = addr&(Int_t)TMath::Power(2,i);
+
+    fprintf(stderr,"Par|Bro|BC/|Bra|   FEC HW   |  Altro  |Altro Chann.|  Instruction  \n");
+    fprintf(stderr,"ity|adc|AL |nch|  Address   |Chip Addr|   Address  |      Code     \n");
+    fprintf(stderr,"-------------------------------------------------------------------\n");
+    fprintf(stderr," %d | %d | %d | %d | %d  %d  %d  %d | %d  %d  %d | %d  %d  %d  %d | %d  %d  %d  %d  %d\n",
+           a[19],a[18],a[17],a[16],a[15],a[14],a[13],a[12],a[11],
+           a[10],a[9],a[8],a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]);
+
+    fprintf(stderr,"-------------------------------------------------------------------\n");
+    fprintf(stderr,"19 |18 |17 |16 |15 14 13 12 |11 10  9 | 8  7  6  5 | 4  3  2  1  0\n\n");
+
+}
+
+//______________________________________________________________
+AliTPCmapper::~AliTPCmapper()
+{
+//    delete fAddressArray;
+
+}
diff --git a/TPC/AliTPCmapper.h b/TPC/AliTPCmapper.h
new file mode 100644 (file)
index 0000000..1f5bfff
--- /dev/null
@@ -0,0 +1,140 @@
+#ifndef AliTPCmapper_H
+#define AliTPCmapper_H
+/* Copyright(c) 1998-2006, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+#include <TCint.h>
+
+class AliTPCmapper{
+
+private:
+    enum {
+       kNrcu       = 6,
+       kNbranch    = 2,
+       kNfecMax    = 13,
+       kNaltro     = 8,
+       kNchannel   = 16,
+       kNpadrow    = 159,
+       kNpadMax    = 140,
+       kNaddrSize  = 20,
+       kNpadSector = 15488
+    };
+
+    Int_t fAddressToRow[kNrcu][kNbranch][kNfecMax][kNaltro][kNchannel];
+    Int_t fAddressToPad[kNrcu][kNbranch][kNfecMax][kNaltro][kNchannel];
+
+    Int_t fRowPadToRCU[kNpadrow][kNpadMax];
+    Int_t fRowPadToBranch[kNpadrow][kNpadMax];
+    Int_t fRowPadToFEC[kNpadrow][kNpadMax];
+    Int_t fRowPadToAltro[kNpadrow][kNpadMax];
+    Int_t fRowPadToChannel[kNpadrow][kNpadMax];
+
+    Int_t fPadsecToRow[kNpadSector];
+    Int_t fPadsecToPad[kNpadSector];
+
+    Int_t fRowPadToPadsec[kNpadrow][kNpadMax];
+
+    Char_t fMapfileName[255];
+
+
+public:
+
+    AliTPCmapper();
+    virtual ~AliTPCmapper();
+
+    void Init();
+
+    Int_t ReadMapping();
+
+
+    Int_t GetRow(Int_t rcu, Int_t branch, Int_t fec, Int_t altro, Int_t channel){
+       return fAddressToRow[rcu][branch][fec][altro][channel];}
+
+    Int_t GetPad(Int_t rcu, Int_t branch, Int_t fec, Int_t altro, Int_t channel){
+       return fAddressToPad[rcu][branch][fec][altro][channel];}
+
+    Int_t GetPadSector(Int_t rcu, Int_t branch, Int_t fec, Int_t altro, Int_t channel){
+       return fRowPadToPadsec[fAddressToPad[rcu][branch][fec][altro][channel]]
+           [fAddressToPad[rcu][branch][fec][altro][channel]];}
+
+
+    Int_t GetRow(Int_t altroaddr);
+
+    Int_t GetPad(Int_t altroaddr);
+
+    Int_t GetPadFromPadSector(Int_t padsector){
+       return fPadsecToPad[padsector];}
+
+    Int_t GetRowFromPadSector(Int_t padsector){
+       return fPadsecToRow[padsector];}
+
+    Int_t GetPadSector(Int_t row,Int_t pad){
+       return fRowPadToPadsec[row][pad];}
+
+    Int_t GetPadsInRowS(Int_t row);
+
+    Double_t GetPadXlocalS (Int_t row, Int_t pad);
+    Double_t GetPadXlocalS (Int_t padsector);
+    Double_t GetPadYlocalS (Int_t row, Int_t pad);
+    Double_t GetPadYlocalS (Int_t padsector);
+    Double_t GetPadXglobalS(Int_t row, Int_t pad, Int_t sector);
+    Double_t GetPadYglobalS(Int_t row, Int_t pad, Int_t sector);
+    Double_t GetPadWidthS  (Int_t row);
+    Double_t GetPadLengthS (Int_t row);
+
+
+    Int_t GetRCUs(Int_t row, Int_t pad){
+       return fRowPadToRCU[row][pad];}
+
+    Int_t GetBranchS(Int_t row, Int_t pad){
+       return fRowPadToBranch[row][pad];}
+
+    Int_t GetFECs(Int_t row, Int_t pad){
+       return fRowPadToFEC[row][pad];}
+
+    Int_t GetAltroS(Int_t row, Int_t pad){
+       return fRowPadToAltro[row][pad];}
+
+    Int_t GetChannelS(Int_t row, Int_t pad){
+       return fRowPadToChannel[row][pad];}
+
+    void PrintRBFACinfo(Int_t row, Int_t pad);
+
+    void PrintAddressArray(Int_t row, Int_t pad);
+
+
+    Int_t GetAltroAddrwPatch(const Int_t row, const Int_t pad);
+
+    Int_t GetAltroAddrwPatch(const Int_t padsector);
+
+    //for aliroot compatibility (sector == roc)
+    Int_t GetPadsInRowS(Int_t row, Int_t sector){
+       return GetPadsInRowS(row+(sector/36)*63);}
+    Double_t GetPadXlocal  (Int_t row, Int_t pad, Int_t sector){
+       return GetPadXlocalS(row+(sector/36)*63,pad);}
+    Double_t GetPadYlocal  (Int_t row, Int_t pad, Int_t sector){
+       return GetPadYlocalS(row+(sector/36)*63,pad);}
+    Double_t GetPadXglobal (Int_t row, Int_t pad, Int_t sector){
+       return GetPadXlocalS(row+(sector/36)*63,pad);}
+    Double_t GetPadYglobal (Int_t row, Int_t pad, Int_t sector){
+       return GetPadYlocalS(row+(sector/36)*63,pad);}
+    Int_t GetRCU(Int_t row, Int_t pad, Int_t sector){
+       return GetRCUs(row+(sector/36)*63,pad);}
+    Int_t GetBranch(Int_t row, Int_t pad, Int_t sector){
+       return GetBranchS(row+(sector/36)*63,pad);}
+    Int_t GetFEC(Int_t row, Int_t pad, Int_t sector){
+       return GetFECs(row+(sector/36)*63,pad);}
+    Int_t GetAltro(Int_t row, Int_t pad, Int_t sector){
+       return GetAltroS(row+(sector/36)*63,pad);}
+    Int_t GetChannel(Int_t row, Int_t pad, Int_t sector){
+       return GetChannelS(row+(sector/36)*63,pad);}
+    Double_t GetPadWidth   (Int_t row, Int_t sector){
+       return GetPadWidthS(row+(sector/36)*63);}
+    Double_t GetPadLength  (Int_t row, Int_t sector){
+       return GetPadLengthS(row+(sector/36)*63);}
+
+
+       ClassDef(AliTPCmapper,0)
+};
+
+#endif