Updated macros for PHOS alignment calculation
[u/mrichter/AliRoot.git] / HLT / EMCAL / AliHLTEMCALMapper.cxx
1 // $Id$
2
3 /**************************************************************************
4  * This file is property of and copyright by the Experimental Nuclear     *
5  * Physics Group, Dep. of Physics                                         *
6  * University of Oslo, Norway, 2007                                       *
7  *                                                                        *
8  * Author: Per Thomas Hille <perthi@fys.uio.no> for the ALICE HLT Project.*
9  * Contributors are mentioned in the code where appropriate.              *
10  * Please report bugs to perthi@fys.uio.no                                *
11  *                                                                        *
12  * Permission to use, copy, modify and distribute this software and its   *
13  * documentation strictly for non-commercial purposes is hereby granted   *
14  * without fee, provided that the above copyright notice appears in all   *
15  * copies and that both the copyright notice and this permission notice   *
16  * appear in the supporting documentation. The authors make no claims     *
17  * about the suitability of this software for any purpose. It is          *
18  * provided "as is" without express or implied warranty.                  *
19  **************************************************************************/
20
21 #include "AliHLTEMCALMapper.h"
22 #include "assert.h"
23 #include "AliHLTCaloConstants.h"
24 #include "TString.h"
25 #include <memory>
26
27 using EMCAL::NXCOLUMNSMOD;
28 using EMCAL::NZROWSMOD;
29 using EMCAL::NMODULES;
30 using EMCAL::NRCUSPERMODULE;
31 using EMCAL::NRCUSPERSECTOR;
32 using EMCAL::MAXHWADDR;
33 using EMCAL::MAXCHANNELS; 
34
35 AliHLTEMCALMapper::AliHLTEMCALMapper(const unsigned long specification ) : AliHLTCaloMapper(specification, "EMCAL")
36 {
37   fCellSize = 6;
38   InitAltroMapping(specification);
39   InitDDLSpecificationMapping();
40   fIsInitializedMapping = true; //CRAP PTH, must check if the initilization actually went ok
41 }
42
43
44 AliHLTEMCALMapper::~AliHLTEMCALMapper()
45 {
46
47 }
48
49
50 void 
51 AliHLTEMCALMapper::GetLocalCoord(const int channelId, Float_t* localCoord) const
52 {
53   localCoord[0] = ( ( Float_t )(channelId&0x3f) - NXCOLUMNSMOD/2)  * fCellSize;
54   localCoord[1] = ( (Float_t)((channelId >> 6)&0x3f) - NZROWSMOD/2) * fCellSize;
55 }
56
57
58 Bool_t 
59 AliHLTEMCALMapper::InitAltroMapping(const unsigned long specification )
60 {
61   TString base(getenv("ALICE_ROOT"));
62   int  nChannels = 0;
63   int  maxaddr = 0; // keep as dummy for now
64   int  tmpHwaddr = 0;
65   int tmpZRow = 0;
66   int tmpXCol = 0;
67   int tmpGain = 0;
68   int res = 0; 
69   fIsInitializedMapping = false;
70   
71   if(!base.IsNull())
72     {
73       snprintf(fFilepath,FILEPATHMAXLENGTH,"%s/EMCAL/mapping/%s", base.Data(),   DDL2RcuMapFileName( GetDDLFromSpec( specification ) ) ); 
74       snprintf(fFilepath, FILEPATHMAXLENGTH,"%s/EMCAL/mapping/%s", base.Data(),   DDL2RcuMapFileName( GetDDLFromSpec( specification ) ) ); 
75
76       std::auto_ptr<FILE> fp(fopen(fFilepath, "r"));
77       if(fp.get() != 0)
78         {
79           res = fscanf(fp.get(), "%d\n", &nChannels);
80           if (res!=1) return false;
81           res = fscanf(fp.get(), "%d\n", &maxaddr);
82           if (res!=1) return false;
83           //      fHw2geomapPtr = new fAltromap[maxaddr +1]; 
84           fHw2geomapPtr = new fAltromap[MAXHWADDR +1];
85         
86           for(int i=0; i< MAXHWADDR + 1 ; i ++) 
87             //for(int i=0; i< maxaddr + 1 ; i ++)
88             {
89               fHw2geomapPtr[i].fXCol = 0;
90               fHw2geomapPtr[i].fZRow = 0;
91               fHw2geomapPtr[i].fGain = 0;
92             }
93           // MAXCHANNELS
94           if( nChannels > 0 && nChannels <= MAXCHANNELS )
95             {
96               for(int i=0; i<nChannels; i ++)
97                 {
98                   res = fscanf(fp.get(), "%d %d %d %d\n", &tmpHwaddr, &tmpXCol, &tmpZRow,  &tmpGain);
99                   if (res!=4) return false;
100                   
101                   if(tmpGain < 2)
102                     {
103                       if( tmpHwaddr <= MAXHWADDR  &&  tmpHwaddr >= 0  )
104                         {
105                           fHw2geomapPtr[tmpHwaddr].fXCol   = (char)tmpXCol;
106                           fHw2geomapPtr[tmpHwaddr].fZRow   = (char)tmpZRow;
107                           fHw2geomapPtr[tmpHwaddr].fGain  =  (char)tmpGain;
108                         }
109                     } 
110                 }
111               fIsInitializedMapping = true;       
112             }
113           else
114             {
115               fIsInitializedMapping = false;       
116             }
117           fclose(fp.get());
118         }
119       else
120         {
121           fIsInitializedMapping = false;          
122         }
123     }
124   else
125     {
126       fIsInitializedMapping = false;
127     }
128     
129     return fIsInitializedMapping;
130 }
131
132
133 void 
134 AliHLTEMCALMapper::InitDDLSpecificationMapping()
135 {
136   if (fSpecificationMapPtr) delete [] fSpecificationMapPtr;
137   fSpecificationMapPtr = new fDDLSpecificationMap[NMODULES*NRCUSPERMODULE];
138   
139   for(Int_t ddl = 0; ddl < NMODULES*NRCUSPERMODULE; ddl++)
140     {
141       fSpecificationMapPtr[ddl].fModId = ddl/( NRCUSPERMODULE );
142     }
143 }
144
145 const char* 
146 AliHLTEMCALMapper::DDL2RcuMapFileName(const int ddlIndex) const //0=4608, 1=4607 etc...
147 {
148   const int rnamelen=256;
149   static char rname[rnamelen];
150   char tmpSide;
151   
152   if ( ddlIndex%NRCUSPERSECTOR <2)
153     {
154       tmpSide  = 'A';
155     }
156   else
157     {
158       tmpSide  = 'C';
159     }
160   int tmprcuindex = ddlIndex%2;
161   snprintf(rname, rnamelen, "RCU%d%c.data",  tmprcuindex,  tmpSide );
162   //sprintf(rname,"RCU%d%c.data", ddlIndex/NRCUSPERSECTOR, tmpSide );
163   return rname;
164 }
165