- adding members to the CALO cluster data struct to facilitate for use of
[u/mrichter/AliRoot.git] / HLT / EMCAL / AliHLTEMCALGeometry.cxx
1 /**************************************************************************
2  * This file is property of and copyright by the Experimental Nuclear     *
3  * Physics Group, Dep. of Physics                                         *
4  * University of Oslo, Norway, 2007                                       *
5  *                                                                        *
6  * Author: federico ronchetti         for the ALICE HLT Project.*
7  *                                                                        *
8  * Permission to use, copy, modify and distribute this software and its   *
9  * documentation strictly for non-commercial purposes is hereby granted   *
10  * without fee, provided that the above copyright notice appears in all   *
11  * copies and that both the copyright notice and this permission notice   *
12  * appear in the supporting documentation. The authors make no claims     *
13  * about the suitability of this software for any purpose. It is          *
14  * provided "as is" without express or implied warranty.                  *
15  **************************************************************************/
16
17 #include "AliHLTEMCALGeometry.h"
18 #include "AliHLTEMCALConstants.h"
19 #include "AliHLTEMCALConstant.h"
20 #include "assert.h"
21 #include "AliHLTCaloConstantsHandler.h"
22 #include "AliHLTEMCALSharedMemoryInterface.h" 
23 #include "TVector3.h"
24
25 using namespace EmcalHLTConst;
26
27 ClassImp(AliHLTEMCALGeometry);
28 TGeoManager *gGeoManager = 0;
29
30 AliHLTEMCALGeometry::AliHLTEMCALGeometry() :
31         AliHLTCaloGeometry ("EMCAL"),
32         fShmPtr(0),
33         fGeo(0),
34         fEMCALGeometry(0)
35 {
36         //fGeo = new AliEMCALGeoUtils("EMCAL_COMPLETE","EMCAL");
37         //fGeo = new AliEMCALGeometry("EMCAL_COMPLETE","EMCAL");
38         //fGeo =  AliEMCALGeometry::GetInstance(AliEMCALGeometry::GetDefaultGeometryName());
39         //TGeoManager::Import("/home/fedro/work/AliRoot/test/QA/geometry.root");
40         //fGeo = new AliEMCALGeoUtils("EMCAL_COMPLETE","EMCAL");
41         fShmPtr = new AliHLTEMCALSharedMemoryInterface();
42         GetGeometryFromCDB();
43 }
44
45 Int_t AliHLTEMCALGeometry::InitialiseGeometry()
46 {
47    
48    return GetGeometryFromCDB();
49 }
50
51
52 AliHLTEMCALGeometry::~AliHLTEMCALGeometry()
53 {
54
55 }
56   
57 void 
58 AliHLTEMCALGeometry::GetGlobalCoordinates(AliHLTCaloRecPointDataStruct &recPoint, AliHLTCaloGlobalCoordinate &globalCoord)
59 {
60
61          Int_t istrip = 0;
62          Float_t z0 = 0;
63          Float_t zb = 0;
64          Float_t z_is = 0;
65          Float_t d = 0;
66
67          Float_t x,y,z; // return variables in terry's RF
68
69          Float_t dz = fCaloConstants->GetMINCELLSTEPETA(); // base cell width in eta
70          Float_t dx = fCaloConstants->GetCELLSTEPPHI(); // base cell width in phi
71
72           // parameters for shower depth calculation
73          Float_t X0 = fCaloConstants->GetRADLENGTH();
74          Float_t Ecr = fCaloConstants->GetCRITICENERGY();
75          Float_t Cj;
76
77          Float_t teta0 = fCaloConstants->GetCELLANGLE(); //tapering angle (deg)
78          Float_t teta1; //working angle
79
80          Float_t L = fCaloConstants->GetCELLHEIGHT();
81
82          // converting to MEV
83          Float_t E = recPoint.fAmp * 1000;
84
85          //TVector3 v1;
86                 Double_t glob[3];
87                 Double_t loc[3];
88
89          if (recPoint.fZ >= 47.5 || recPoint.fZ<-0.5) {
90                  Logging(kHLTLogError, "HLT", "EMCAL", "AliHLTEMCALGeometry::GetGlobalCoordinates: invalid Z recpoint ");
91                  return;
92           }
93
94           if (recPoint.fX >= 23.5 || recPoint.fX<-0.5) {
95                   Logging(kHLTLogError, "HLT", "EMCAL", "AliHLTEMCALGeometry::GetGlobalCoordinates: invalid X recpoint ");
96                   return;
97           }
98
99
100           switch ( recPoint.fParticle )
101           {
102           case 0:
103                   Cj = - fCaloConstants->GetCJ(); // photon
104                   d = X0 * TMath::Log( E / Ecr + Cj);
105                   break;
106
107           case 1:
108                   Cj = + fCaloConstants->GetCJ(); // electron
109                   d = X0 * TMath::Log( E / Ecr + Cj);
110                   break;
111
112           case 2:
113                   // hadron
114                   d = 0.5 * L;
115                   break;
116
117           default:
118                   Cj = - fCaloConstants->GetCJ(); // defaulting to photon
119                   d = X0 * TMath::Log( E / Ecr + Cj);
120           }
121
122            istrip = int ((recPoint.fZ + 0.5 ) / 2);
123
124            // module angle
125            teta1 = TMath::DegToRad() * istrip * teta0;
126
127            // calculation of module corner along z
128            // as a function of strip
129
130            for (Int_t is=0; is<= istrip; is++) {
131
132              teta1 = TMath::DegToRad() * is * teta0;
133
134              z_is = z_is + 2*dz*(TMath::Sin(teta1)*TMath::Tan(teta1) + TMath::Cos(teta1));
135
136            }
137
138            z0 = dz * (recPoint.fZ - 2*istrip + 0.5);
139            zb = (2*dz-z0-d*TMath::Tan(teta1))*TMath::Cos(teta1);
140
141            z = z_is - zb*TMath::Cos(teta1);
142
143 //         cout << "----> istrip: " << istrip << endl;
144 //         cout << "----> z0: "<< z0 << endl;
145 //         cout << "----> zb: "<< zb << endl;
146 //         cout << "----> corner z: "<< z_is << endl;
147
148 //         cout << "----> teta1: "<< TMath::RadToDeg()*teta1 << endl;
149
150            y = d/TMath::Cos(teta1) + zb*TMath::Sin(teta1);
151
152            x = (recPoint.fX + 0.5)*dx;
153
154            // cout << "x: " << x << " y: "<< y << " z " << z << endl;
155
156         // check coordinate origin
157         loc[0] = x;
158         loc[1] = y;
159         loc[2] = z;
160
161          if(!fGeo)
162    {
163       Logging(kHLTLogError, "HLT", "EMCAL", "AliHLTEMCALGeometry::GetGlobalCoordinates: no geometry initialised");
164       return;
165    }
166
167          ConvertRecPointCoordinates(loc[1], loc[2], loc[3]);
168
169          fGeo->GetGlobal(loc, glob, recPoint.fModule);
170
171          globalCoord.fX = glob[0];
172          globalCoord.fY = glob[1];
173          globalCoord.fZ = glob[2];
174 }
175  
176 void 
177 AliHLTEMCALGeometry::GetCellAbsId(UInt_t module, UInt_t y, UInt_t z, Int_t& AbsId)
178 {
179
180         if(!fGeo)
181         {
182                  Logging(kHLTLogError, "HLT", "EMCAL", "AliHLTEMCALGeometry::GetCellAbsId: no geometry initialised");
183                  return;
184
185         }
186         
187         AbsId = fGeo->GetAbsCellIdFromCellIndexes(module, y, z);
188         
189 }
190
191 void AliHLTEMCALGeometry::ConvertRecPointCoordinates(Double_t &x, Double_t &y, Double_t &z) const
192 {
193         Double_t DX = 13.869008;
194         Double_t DY = 72.559998;
195         Double_t DZ = 175.00000;
196
197          x = y - DX;  //fixme
198          y = -x + DY; //fixme
199          z = z - DZ;  //fixme
200
201 }
202
203
204 int
205 AliHLTEMCALGeometry::GetGeometryFromCDB()
206 {
207   cout << "Getting geometry..." << endl;
208
209  // AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
210
211   AliCDBPath path("GRP","Geometry","Data");
212   if(path.GetPath())
213     {
214       //      HLTInfo("configure from entry %s", path.GetPath());
215       AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path/*,GetRunNo()*/);
216       if (pEntry)
217         {
218           if(!fEMCALGeometry)
219             {
220               delete fEMCALGeometry;
221               fEMCALGeometry = 0;
222             }
223
224           gGeoManager = (TGeoManager*) pEntry->GetObject();
225           cout<< "gGeoManager = 0x%x" << gGeoManager << endl;
226
227           if(gGeoManager)
228             {
229               fGeo = new AliEMCALGeoUtils("EMCAL_COMPLETE","EMCAL");
230               //fClusterAnalyserPtr->SetGeometry(fEMCALGeometry);
231             }
232
233         }
234       else
235         {
236                   //HLTError("can not fetch object \"%s\" from OCDB", path);
237         }
238     }
239   return 0;
240 }