DQM shifter histos based only on physics data
[u/mrichter/AliRoot.git] / T0 / AliT0Align.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /*
17 $Log: AliT0Align.cxx,v $
18  Revision   2008/01/30
19 Removing code violations 
20
21  Version 1.1  2006/10
22 Preliminary test version (T.Malkiewicz)
23 */
24
25 #include "AliT0Align.h"
26 #include "TROOT.h"
27 #include "Riostream.h"
28 #include "TFile.h"
29 #include "TMath.h"
30 #include "TSystem.h"
31 #include "TString.h"
32 #include "AliSurveyObj.h"
33 #include "AliAlignObjParams.h"
34 #include "AliCDBStorage.h"
35 #include <TClonesArray.h>
36 #include <TFile.h>
37 #include "AliLog.h"
38 #include "AliCDBManager.h"
39 #include "AliSurveyPoint.h" 
40
41 // Class creating the T0 aligmnent objects 
42 // from the surveys done by surveyers at Point2.
43 // Survey results are fetched from 
44 // Survey Depot, based on survey results 
45 // position of T0 alignment objects is computed.
46
47 using std::endl;
48 using std::cout;
49 ClassImp(AliT0Align)
50
51 AliT0Align::AliT0Align() :
52   TObject(),
53   fFileGlob(0x0),
54   fT0AAlignObj(0x0),
55   fT0CAlignObj(0x0),
56   fDebug(0),
57   fXPosC(0.),
58   fYPosC(0.),
59   fXPosA(0.),
60   fYPosA(0.),
61   fRepLoc(0),
62   fRepGlob(0),
63   fSide(0x0),
64   fUser(0x0)
65 {
66   //
67   //  default constructor
68   //
69 }   
70 //________________________________________________________________________
71 AliT0Align::AliT0Align(Int_t reportloc, Int_t side, Int_t reportglob) :
72   TObject(),
73   fFileGlob(0x0),
74   fT0AAlignObj(0x0),
75   fT0CAlignObj(0x0),
76   fDebug(0),
77   fXPosC(0.),
78   fYPosC(0.),
79   fXPosA(0.),
80   fYPosA(0.),
81   fRepLoc(0),
82   fRepGlob(0),
83   fSide(0x0),
84   fUser(0x0)
85 {
86   //
87   // constructor - defines data files
88   //
89   fRepLoc = reportloc;
90   fRepGlob = reportglob;
91   fSide = side;
92   // Char_t path[50];
93   TString path = Form("%s",gSystem->Getenv("ALICE_ROOT")) ;
94   // fFileGlob = new Char_t[80];
95   //  fUser = new Char_t[10];
96   fFileGlob = Form("%s/T0/Survey_%d_V0.txt",path.Data(),reportglob);
97   fUser = Form("%s/T0/Survey_%d_V0.txt",path.Data(),reportglob);
98   // sprintf(path,gSystem->Getenv("ALICE_ROOT")); 
99   //
100   // sprintf(fFileLoc,"%s/T0/Survey_%d_T0.txt",path,reportloc);
101   // sprintf(fFileGlob,"%s/T0/Survey_%d_V0.txt",path,reportglob);
102   //
103   // sprintf(fUser,gSystem->Getenv("alien_API_USER"));
104 }
105 //_________________________________________________________________________
106 AliT0Align::AliT0Align(const AliT0Align &align) :
107   TObject(),
108   fFileGlob(0x0),
109   fT0AAlignObj(0x0),
110   fT0CAlignObj(0x0),
111   fDebug(0),
112   fXPosC(0.),
113   fYPosC(0.),
114   fXPosA(0.),
115   fYPosA(0.),
116   fRepLoc(0),
117   fRepGlob(0),
118   fSide(0x0),
119   fUser(0x0)  
120 {
121   //
122   //  copy constructor - dummy
123   //
124   ((AliT0Align &) align).Copy(*this);
125
126 }
127 //__________________________________________________________________________
128 AliT0Align & AliT0Align::operator =(const AliT0Align & align)
129 {
130   //
131   // assignment operator - dummy
132   //
133   if (this != &align) ((AliT0Align &) align).Copy(*this);
134
135    return (*this);
136 }
137
138 //__________________________________________________________________________
139 AliT0Align::~AliT0Align()
140 {
141   //
142   // destructor
143   //
144   if(fT0AAlignObj) delete fT0AAlignObj;
145   if(fT0CAlignObj) delete fT0CAlignObj;
146   if(fFileGlob) delete[] fFileGlob;
147   if(fUser) delete[] fUser;
148 }
149 //__________________________________________________________________________
150 Bool_t AliT0Align::LoadSurveyData()
151 {
152   //
153   // Create a new survey object and fill it.
154  
155  AliSurveyObj * s1 = new AliSurveyObj();
156  const int numberPoints = 2;
157  TString pointNames[numberPoints]={"Flange_0","C67_6_Beamcircle"}; 
158  
159  if(fRepLoc == 0) 
160  { 
161    //
162    // Filling from DCDB (via GRID)
163    //
164    s1->SetGridUser(fUser);
165    if(fSide == 0) 
166    {
167      s1->Fill("T0", fRepGlob, fUser);
168    }
169    else if(fSide == 1)
170    {
171      s1->Fill("VZERO", fRepGlob, fUser);
172    }
173    else
174    {
175      cout<<"Enter the side properly: '0'- A side, '1'- C side'" <<endl;
176      return 0;
177    }
178  }
179  else
180  //
181  // Filling from local file
182  //
183  {
184    s1->FillFromLocalFile(fFileGlob);
185  }
186  //
187  Float_t surveyedPoints [numberPoints][2];
188  AliSurveyPoint *currPoint;
189
190  //
191  for(Int_t i=0;i<numberPoints;i++)
192  {
193    currPoint=0;
194    currPoint = (AliSurveyPoint *) s1->GetData()->FindObject(pointNames[i]);
195    //
196    if(currPoint)
197    {
198      surveyedPoints[i][0]=currPoint->GetX();
199      surveyedPoints[i][1]=currPoint->GetY();
200    //  surveyedPoints[i]=currPoint->GetZ();
201      if(fDebug)
202      Printf("INFO: Point %s coordinates read.\n", pointNames[i].Data() ) ;
203    }
204    else 
205    {
206      if(fDebug)
207      {
208        Printf("ERROR: Essential point missing: %s\n", pointNames[i].Data() ) ;
209        return 1;
210      }
211    }  
212  }
213  if(fSide == 0)
214  {
215    fXPosA = surveyedPoints[0][0];
216    fYPosA = surveyedPoints[0][1];
217  }
218  else if(fSide == 1)
219  {
220    fXPosC = surveyedPoints[1][0]; 
221    fYPosC = surveyedPoints[1][1];
222  }
223  //
224  delete s1;
225  //
226  return 0;
227 }
228 //_________________________________________________________________
229
230 Double_t AliT0Align::ComputePosition()
231 {
232  //  Float_t fZPos, shift;
233  //  fZPos = surveyedPoints[3] - shift;
234   return 0;
235 }
236 //_______________________________________________________________________
237 void AliT0Align::CreateAlignObj()
238 {
239   //
240   //  TClonesArray *array = new TClonesArray("AliAlignObjParams",2);
241   // TClonesArray &alobj = *array;
242   
243   Double_t dx=0., dy=0., dz=0., dpsi=0., dtheta=0., dphi=0.;
244   dx=fXPosA;
245   dy=fYPosA;
246   fT0AAlignObj = new AliAlignObjParams("ALIC_1/0STL_1",0,dx,dy,dz,dpsi,dtheta,dphi,kTRUE);
247   
248   dx=fXPosC;
249   dy=fYPosC;
250   // dz=surveyedPoints[2];
251   dz=0.;
252   fT0CAlignObj = new AliAlignObjParams("ALIC_1/0STR_1",0,dx,dy,dz,dpsi,dtheta,dphi,kTRUE);
253   
254 }
255
256 //______________________________________________________________________
257 void AliT0Align::Run()
258 {
259   //
260   // runs the full chain
261   //
262   // SetDebug(0);
263   Bool_t flag = LoadSurveyData();
264     if(flag) 
265   {
266     cout<<"Missing points"<<endl;
267     return;
268   }
269   // ComputePosition();
270   CreateAlignObj();
271   StoreAlignObj();
272 }
273 //_________________________________________________________________________
274
275 void AliT0Align::StoreAlignObj()
276 {
277  //
278  // Storing T0 alignment objects 
279  //
280  AliCDBManager* cdb = AliCDBManager::Instance();
281  if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
282  //
283  TClonesArray *array = new TClonesArray("AliAlignObjParams",2);
284 //
285  Double_t shifts[3];
286  Double_t rots[3];
287  //
288  fT0AAlignObj->GetPars(shifts,rots);
289  new((*array)[0]) AliAlignObjParams(fT0AAlignObj->GetSymName(),0,shifts[0],
290                    shifts[1],shifts[2],rots[0],rots[1],rots[2],kTRUE);
291  fT0CAlignObj->GetPars(shifts,rots);
292  new((*array)[1]) AliAlignObjParams(fT0CAlignObj->GetSymName(),0,shifts[0],
293                    shifts[1],shifts[2],rots[0],rots[1],rots[2],kTRUE);
294
295
296 //
297 // storing either in the OCDB or local file
298 //
299   if( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ){
300     // save on file
301     const char* filename = "T0SurveyMisalignment.root";
302     //  Char_t fullname[80];
303     //  sprintf(fullname,"%s/T0/Align/Data/%s",gSystem->Getenv("ALICE_ROOT"),filename);
304     TString fullname = Form("%s/T0/Align/Data/%s",gSystem->Getenv("ALICE_ROOT"), filename);
305     TFile *f = new TFile(fullname.Data(),"RECREATE");
306     if(!f){
307       AliError("cannot open file for output\n");
308       return;
309     }
310     AliInfo(Form("Saving alignment objects to the file %s", filename));
311     f->cd();
312     f->WriteObject(array,"T0AlignObjs","kSingleKey");
313     f->Close();
314   }else{
315     // save in CDB storage
316     AliCDBStorage* storage;
317     //
318    TString Storage = gSystem->Getenv("STORAGE");
319     if(!Storage.BeginsWith("local://") && !Storage.BeginsWith("alien://")) {
320       AliError(Form(
321       "STORAGE variable set to %s is not valid. Exiting\n",Storage.Data()));
322       return;
323     }
324     storage = cdb->GetStorage(Storage.Data());
325     if(!storage){
326       AliError(Form("Unable to open storage %s\n",Storage.Data()));
327       return;
328     }
329     //
330     AliCDBMetaData* md = new AliCDBMetaData();
331     md->SetResponsible("Tomasz Malkiewicz");
332     md->SetComment("Position of T0-A and T0-C from survey");
333     AliCDBId id("T0/Align/Data",0,AliCDBRunRange::Infinity());
334     storage->Put(array,id,md);
335   }
336 }
337