]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
New macros DrawITSAlignObj.C and MakeITSRealisticMisAlignment.C with associated class...
authormasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 11 Sep 2007 17:33:21 +0000 (17:33 +0000)
committermasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 11 Sep 2007 17:33:21 +0000 (17:33 +0000)
ITS/AliITSMisalignMaker.cxx [new file with mode: 0644]
ITS/AliITSMisalignMaker.h [new file with mode: 0644]
ITS/DrawITSAlignObj.C [new file with mode: 0644]
ITS/ITSbaseLinkDef.h
ITS/MakeITSRealisticMisAlignment.C [new file with mode: 0644]
ITS/libITSbase.pkg

diff --git a/ITS/AliITSMisalignMaker.cxx b/ITS/AliITSMisalignMaker.cxx
new file mode 100644 (file)
index 0000000..d268312
--- /dev/null
@@ -0,0 +1,360 @@
+/**************************************************************************
+ * Copyright(c) 1998-2007, 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.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+//========================================================================
+//
+// This class is a helper, producing ITS aligmnent objects.
+// It provides also some useful functions
+// See the parameters of the misalignment at the end of this script.
+//
+// Main author: L. Gaudichet
+// Contact: andrea.dainese@lnl.infn.it
+//
+//========================================================================
+
+#include <TRandom3.h>
+#include <TClonesArray.h>
+#include <TMath.h>
+
+
+#include "AliLog.h"
+#include "AliAlignObjParams.h"
+#include "AliITSMisalignMaker.h"
+
+
+ClassImp(AliITSMisalignMaker)
+  
+const Int_t AliITSMisalignMaker::fgkNLadders[AliITSMisalignMaker::kNLayers] = {20,40,14,22,34,38};
+const Int_t AliITSMisalignMaker::fgkNDetectors[AliITSMisalignMaker::kNLayers] = {4,4,6,8,22,25};
+
+
+//________________________________________________________________________
+AliITSMisalignMaker::AliITSMisalignMaker():
+  fRnd(),
+  fInd(0),
+  fAlobj(TClonesArray("AliAlignObjParams",4000)),
+  fStrSPD("ITS/SPD"),
+  fStrSDD("ITS/SDD"),
+  fStrSSD("ITS/SSD"),
+  fStrStave("/Stave"),
+  fStrHalfStave("/HalfStave"),
+  fStrLadder("/Ladder"),
+  fStrSector("/Sector"),
+  fStrSensor("/Sensor")
+{
+  fRnd.SetSeed(23472341);
+}
+//________________________________________________________________________
+Int_t AliITSMisalignMaker::AddAlignObj(char* name,Double_t dx,Double_t dy,Double_t dz,
+                               Double_t dpsi,Double_t dtheta,Double_t dphi,Bool_t unif) {
+
+  Double_t vx,vy,vz,vpsi,vtheta,vphi;
+
+  if(!unif) {
+    vx = GaussCut(0,dx/3.,dx); // mean, sigma, max absolute value 
+    vy = GaussCut(0,dy/3.,dy);
+    vz = GaussCut(0,dz/3.,dz);
+    vpsi   = GaussCut(0,dpsi/3.,  dpsi );
+    vtheta = GaussCut(0,dtheta/3.,dtheta);
+    vphi   = GaussCut(0,dphi/3.,  dphi);
+  } else {
+    vx = fRnd.Uniform(-dx,dx);
+    vy = fRnd.Uniform(-dy,dy);
+    vz = fRnd.Uniform(-dz,dz);
+    vpsi = fRnd.Uniform(-dpsi,dpsi);
+    vtheta = fRnd.Uniform(-dtheta,dtheta);
+    vphi = fRnd.Uniform(-dphi,dphi);
+  }
+
+  new(fAlobj[fInd]) AliAlignObjParams(name,0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE);
+
+  AliAlignObjParams* its_alobj = (AliAlignObjParams*) fAlobj.UncheckedAt(fInd);
+  its_alobj->ApplyToGeometry();
+
+  fInd++;
+
+  return kTRUE;
+}
+
+
+//________________________________________________________________________
+Int_t AliITSMisalignMaker::AddAlignObj(Int_t lay,Double_t dx,Double_t dy,Double_t dz,
+                                Double_t dpsi,Double_t dtheta,Double_t dphi,Bool_t unif) {
+  
+  // misalignment at the level of ladders/modules
+
+  Int_t nLadd = fgkNLadders[lay];
+  Int_t nMod = fgkNDetectors[lay];
+
+  for (Int_t iLadd=0; iLadd<nLadd; iLadd++) {
+    for (Int_t iMod=0; iMod<nMod; iMod++) {
+
+      Double_t vx,vy,vz,vpsi,vtheta,vphi;
+
+      if(!unif) {
+       vx = GaussCut(0,dx/3.,dx); // mean, sigma, max absolute value 
+       vy = GaussCut(0,dy/3.,dy);
+       vz = GaussCut(0,dz/3.,dz);
+       vpsi   = GaussCut(0,dpsi/3.,  dpsi );
+       vtheta = GaussCut(0,dtheta/3.,dtheta);
+       vphi   = GaussCut(0,dphi/3.,  dphi);
+      } else {
+       vx = fRnd.Uniform(-dx,dx);
+       vy = fRnd.Uniform(-dy,dy);
+       vz = fRnd.Uniform(-dz,dz);
+       vpsi = fRnd.Uniform(-dpsi,dpsi);
+       vtheta = fRnd.Uniform(-dtheta,dtheta);
+       vphi = fRnd.Uniform(-dphi,dphi);
+      }
+
+      TString name = GetSymbName(lay,iLadd,iMod);
+      new(fAlobj[fInd]) AliAlignObjParams(name.Data(),0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE);
+      AliAlignObjParams* its_alobj = (AliAlignObjParams*) fAlobj.UncheckedAt(fInd);
+      its_alobj->ApplyToGeometry();
+      fInd++; 
+    }
+  }
+
+  return kTRUE;
+}
+
+
+//________________________________________________________________________
+Int_t AliITSMisalignMaker::AddAlignObj(Int_t lay,Int_t ladd,Double_t dx,Double_t dy,Double_t dz,
+                                Double_t dpsi,Double_t dtheta,Double_t dphi,Bool_t unif) {
+
+  // misalignment at the level of half-staves/ladders (ladd=-1 means that all ladders are scanned)
+
+  Double_t vx,vy,vz,vpsi,vtheta,vphi;
+  
+  Int_t laddMin = ladd;
+  Int_t laddMax = laddMin+1;
+  if (ladd<0) {
+    laddMin = 0;
+    laddMax = fgkNLadders[lay];
+  }
+
+  for (Int_t iLadd=laddMin; iLadd<laddMax; iLadd++) {
+
+    Int_t nHS = 1; 
+    if (lay<2) nHS = 2;
+    for (Int_t iHalfStave=0; iHalfStave<nHS; iHalfStave++) {
+      
+      if(!unif) {
+       vx = GaussCut(0,dx/3.,dx); // mean, sigma, max absolute value 
+       vy = GaussCut(0,dy/3.,dy);
+       vz = GaussCut(0,dz/3.,dz);
+       vpsi   = GaussCut(0,dpsi/3.,  dpsi );
+       vtheta = GaussCut(0,dtheta/3.,dtheta);
+       vphi   = GaussCut(0,dphi/3.,  dphi);
+      } else {
+       vx = fRnd.Uniform(-dx,dx);
+       vy = fRnd.Uniform(-dy,dy);
+       vz = fRnd.Uniform(-dz,dz);
+       vpsi = fRnd.Uniform(-dpsi,dpsi);
+       vtheta = fRnd.Uniform(-dtheta,dtheta);
+       vphi = fRnd.Uniform(-dphi,dphi);
+      }
+
+      TString name = GetHalfStaveLadderSymbName(lay,iLadd,iHalfStave);
+      new(fAlobj[fInd]) AliAlignObjParams(name.Data(),0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE);
+      AliAlignObjParams* its_alobj = (AliAlignObjParams*) fAlobj.UncheckedAt(fInd);
+      its_alobj->ApplyToGeometry();
+      fInd++;
+    }
+  }
+  
+  return kTRUE;
+}
+
+
+//________________________________________________________________________
+Int_t AliITSMisalignMaker::AddSectorAlignObj(Int_t sectMin,Int_t sectMax,
+                                      Double_t dx,Double_t dy,Double_t dz,
+                                      Double_t dpsi,Double_t dtheta,Double_t dphi,
+                                      Double_t xShift,Double_t yShift,Double_t zShift,
+                                      Double_t psiShift,Double_t thetaShift,Double_t phiShift,Bool_t unif) {
+
+  // misalignment at the level of SPD sectors and half-barrels
+  if ((sectMin<1) || (sectMax>10)) return kFALSE;
+  Double_t vx,vy,vz,vpsi,vtheta,vphi;
+  Double_t tr[3],rot[3];  
+
+  for (Int_t iSect = sectMin-1; iSect<sectMax; iSect++) {
+
+    // first, apply sector level misalignment    
+    if(!unif) {
+      vx = GaussCut(0,dx/3.,dx); // mean, sigma, max absolute value 
+      vy = GaussCut(0,dy/3.,dy);
+      vz = GaussCut(0,dz/3.,dz);
+      vpsi   = GaussCut(0,dpsi/3.,  dpsi );
+      vtheta = GaussCut(0,dtheta/3.,dtheta);
+      vphi   = GaussCut(0,dphi/3.,  dphi);
+    } else {
+      vx = fRnd.Uniform(-dx,dx);
+      vy = fRnd.Uniform(-dy,dy);
+      vz = fRnd.Uniform(-dz,dz);
+      vpsi = fRnd.Uniform(-dpsi,dpsi);
+      vtheta = fRnd.Uniform(-dtheta,dtheta);
+      vphi = fRnd.Uniform(-dphi,dphi);
+    }
+
+    TString name = GetSymbName(0);
+    name += fStrSector;
+    name += iSect;
+
+
+    AliAlignObjParams aaop(name.Data(),0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE); // set them as local
+    aaop.GetPars(tr,rot); // global
+
+    // then, apply half-barrel level misalignment
+    tr[0] += xShift;
+    tr[1] += yShift;
+    tr[2] += zShift;
+    rot[0] += psiShift;
+    rot[1] += thetaShift;
+    rot[2] += phiShift;
+
+    new(fAlobj[fInd]) AliAlignObjParams(name.Data(),0,tr[0],tr[1],tr[2],rot[0],rot[1],rot[2],kTRUE); // set them as global
+
+    AliAlignObjParams* its_alobj = (AliAlignObjParams*) fAlobj.UncheckedAt(fInd);
+    its_alobj->ApplyToGeometry();
+    fInd++;
+  }
+  return kTRUE;
+}
+
+//________________________________________________________________________
+Double_t AliITSMisalignMaker::GaussCut(Double_t mean,Double_t sigma,Double_t absMax) {
+
+  Double_t val = fRnd.Gaus(mean,sigma);
+  while (TMath::Abs(val)>absMax)
+    val = fRnd.Gaus(mean,sigma);
+  return val;
+}
+
+//________________________________________________________________________
+TString AliITSMisalignMaker::GetSymbName(Int_t layer) const {
+
+  // be careful : SPD0 and SPD1 are not physically separated 
+  TString name;
+  switch (layer) {
+  case 0:
+  case 1: name = fStrSPD; name += layer; break;
+  case 2:
+  case 3: name = fStrSDD; name += layer; break;
+  case 4:
+  case 5: name = fStrSSD; name += layer; break;
+  default: AliFatal("Wrong layer index");
+  }
+  return name;
+}
+
+//________________________________________________________________________
+TString AliITSMisalignMaker::GetHalfStaveLadderSymbName(Int_t layer,Int_t ladd,Int_t halfStave) const {
+
+  // Get logical names at the level of half-staves (SPD) or ladders (SDD and SSD)
+
+  TString name = GetSymbName(layer);
+  if (layer==0) { // SPD1
+
+    int sector = ladd/2;
+    name += fStrSector;
+    name += sector;
+    int stave = ladd-sector*2;
+    name += fStrStave;
+    name += stave;
+    name += fStrHalfStave;
+    name += halfStave;
+  }
+  else if (layer==1) { // SPD2
+
+    int sector = ladd/4;
+    name += fStrSector;
+    name += sector;
+    int stave = ladd-sector*4;
+    name += fStrStave;
+    name += stave;
+    name += fStrHalfStave;
+    name += halfStave;
+  }
+  else if (layer>=2 && layer<=5) { // SDD and SSD
+    name += fStrLadder;
+    name += ladd;
+  } 
+  else {
+    AliFatal("Wrong layer index");
+  }
+  return name;
+}
+
+//________________________________________________________________________
+TString AliITSMisalignMaker::GetSymbName(Int_t layer,Int_t ladd) const {
+
+  // Get logical names at the level of staves / ladders
+
+  TString name = GetSymbName(layer);
+  if (layer==0) { // SPD1
+
+    int sector = ladd/2;
+    name += fStrSector;
+    name += sector;
+    int stave = ladd-sector*2;
+    name += fStrStave;
+    name += stave;
+  }
+  else if (layer==1) { // SPD2
+
+    int sector = ladd/4;
+    name += fStrSector;
+    name += sector;
+    int stave = ladd-sector*4;
+    name += fStrStave;
+    name += stave;
+  }
+  else if (layer>=2 && layer<=5) { // SDD and SSD
+    name += fStrLadder;
+    name += ladd;
+  }
+  else {
+    AliFatal("Wrong layer index");
+  }
+  return name;
+}
+
+//________________________________________________________________________
+TString AliITSMisalignMaker::GetSymbName(Int_t layer,Int_t ladd,Int_t mod) const {
+
+  // Get logical names at the level of SPD ladders / SDD and SSD modules
+
+  Int_t halfStave = mod/2;
+  TString name = GetHalfStaveLadderSymbName(layer,ladd,halfStave);
+
+  if (layer<2) { // SPD
+    name += fStrLadder;
+    name += mod;
+  } 
+  else if (layer>=2 && layer<=5) { // SDD and SSD
+    name += fStrSensor;
+    name += mod;
+  }
+  else {
+    AliFatal("Wrong layer index");
+  }
+  return name;
+}
diff --git a/ITS/AliITSMisalignMaker.h b/ITS/AliITSMisalignMaker.h
new file mode 100644 (file)
index 0000000..6bfc611
--- /dev/null
@@ -0,0 +1,88 @@
+#ifndef ALIITSMISALIGNMAKER_H
+#define ALIITSMISALIGNMAKER_H
+/* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+//------------------------------------------------------------------------
+//
+// This class is a helper, producing ITS aligmnent objects.
+// It provides also some useful functions
+// See the parameters of the misalignment at the end of this script.
+//
+// Main author: L. Gaudichet
+// Contact: andrea.dainese@lnl.infn.it
+//
+//------------------------------------------------------------------------
+
+#include <TRandom3.h>
+#include <TString.h>
+#include <TClonesArray.h>
+
+
+//-------------------------------------------------------------------------
+class AliITSMisalignMaker : public TObject {
+  
+public:
+  AliITSMisalignMaker();
+  
+  ~AliITSMisalignMaker() {};
+  
+  TClonesArray* GetArray() {return &fAlobj;}
+
+  void  SetSeed(Int_t seed) {fRnd.SetSeed(seed); return;}
+  
+  Int_t AddAlignObj(char* name,Double_t dx,Double_t dy,Double_t dz,
+                   Double_t dpsi,Double_t dtheta,Double_t dphi,
+                   Bool_t unif);
+
+  Int_t AddAlignObj(Int_t lay,Double_t dx,Double_t dy,Double_t dz,
+                   Double_t dpsi,Double_t dtheta,Double_t dphi,
+                   Bool_t unif);
+
+  Int_t AddAlignObj(Int_t lay,Int_t ladd,Double_t dx,Double_t dy,Double_t dz,
+                   Double_t dpsi,Double_t dtheta,Double_t dphi,
+                   Bool_t unif);
+
+  Int_t AddSectorAlignObj(Int_t sectMin,Int_t sectMax,
+                         Double_t dx,Double_t dy,Double_t dz,
+                         Double_t dpsi,Double_t dtheta,Double_t dphi,
+                         Double_t xShift,Double_t yShift,Double_t zShift,
+                         Double_t psiShift,Double_t thetaShift,Double_t phiShift,
+                         Bool_t unif);
+
+  TString  GetSymbName(Int_t layer) const;
+  TString  GetSymbName(Int_t layer,Int_t ladd) const;
+  TString  GetHalfStaveLadderSymbName(Int_t layer,Int_t ladd,Int_t halfStave) const;
+  TString  GetSymbName(Int_t layer,Int_t ladd,Int_t mod) const;
+  Double_t GaussCut(Double_t mean,Double_t sigma,Double_t cutn);
+  
+  static Int_t GetNLayers()             {return kNLayers;}
+  static Int_t GetNLadders(Int_t lay)   {return fgkNLadders[lay];}
+  static Int_t GetNDetectors(Int_t lay) {return fgkNDetectors[lay];}
+
+protected:
+  TRandom3     fRnd; // TRandom object
+  Int_t        fInd; // index of current AliAlignObjParams in fAlobj
+  TClonesArray fAlobj; // array of AliAlignObjParams
+  TString      fStrSPD; // name of SPD
+  TString      fStrSDD; // name of SDD
+  TString      fStrSSD; // name of SSD
+  TString      fStrStave; // name of SPD stave
+  TString      fStrHalfStave; // name of SPD half-stave
+  TString      fStrLadder; // name of SPD ladder
+  TString      fStrSector; // name of SPD sector
+  TString      fStrSensor; // name of sensitive volume
+
+private:
+  enum {kNLayers = 6}; // The number of layers.
+  static const Int_t  fgkNLadders[kNLayers];  // Array of the number of ladders/layer(layer)
+  static const Int_t  fgkNDetectors[kNLayers];// Array of the number of detector/ladder(layer)
+
+  ClassDef(AliITSMisalignMaker,1)   //ITS Misalign Maker
+};
+
+
+#endif
+
diff --git a/ITS/DrawITSAlignObj.C b/ITS/DrawITSAlignObj.C
new file mode 100644 (file)
index 0000000..f2e0a12
--- /dev/null
@@ -0,0 +1,308 @@
+#if !defined(__CINT__) || defined(__MAKECINT__)
+#include <TCanvas.h>
+#include <TClonesArray.h>
+#include <TFile.h>
+#include <TGeoManager.h>
+#include <TH1F.h>
+#include <TString.h>
+#include <Riostream.h>
+#include "AliAlignObj.h"
+#endif
+void DrawITSAlignObj(const char* filename="ITSrealisticMisalignment.root",
+                    Bool_t local=kTRUE) {
+  //
+  // Draw distribution of alignment constants
+  // (original version: A.Jacholkowski; modified by: A.Dainese)
+  //
+
+/* $Id$ */
+
+  TGeoManager::Import("geometry.root");
+
+  TFile* f = TFile::Open(filename);
+  if(!f) {cerr<<"cannot open input file\n"; return;}
+
+  TCanvas  *cSPDsector = new TCanvas("cSPDsector","SPD sectors alignobjs",0,0,800,600);
+  cSPDsector->Divide(3,2);                 
+  TH1F* hxSPDsector = new TH1F("hxSPDsector","x in SPD sectors",100,-0.1,0.1);
+  hxSPDsector->SetXTitle("[cm]");
+  TH1F* hySPDsector = new TH1F("hySPDsector","y in SPD sectors",100,-0.1,0.1);
+  hySPDsector->SetXTitle("[cm]");
+  TH1F* hzSPDsector = new TH1F("hzSPDsector","z in SPD sectors",100,-0.1,0.1);
+  hzSPDsector->SetXTitle("[cm]");
+  TH1F* hrxSPDsector = new TH1F("hrxSPDsector","rx in SPD sectors",100,-0.5,0.5);
+  hrxSPDsector->SetXTitle("[deg]");
+  TH1F* hrySPDsector = new TH1F("hrySPDsector","ry in SPD sectors",100,-0.5,0.5);
+  hrySPDsector->SetXTitle("[deg]");
+  TH1F* hrzSPDsector = new TH1F("hrzSPDsector","rz in SPD sectors",100,-0.5,0.5);
+  hrzSPDsector->SetXTitle("[deg]");
+
+  TCanvas  *cSPDhalfstave = new TCanvas("cSPDhalfstave","SPD halfstaves alignobjs",0,0,800,600);
+  cSPDhalfstave->Divide(3,2);              
+  TH1F* hxSPDhalfstave = new TH1F("hxSPDhalfstave","x in SPD halfstaves",100,-0.01,0.01);
+  hxSPDhalfstave->SetXTitle("[cm]");
+  TH1F* hySPDhalfstave = new TH1F("hySPDhalfstave","y in SPD halfstaves",100,-0.01,0.01);
+  hySPDhalfstave->SetXTitle("[cm]");
+  TH1F* hzSPDhalfstave = new TH1F("hzSPDhalfstave","z in SPD halfstaves",100,-0.01,0.01);
+  hzSPDhalfstave->SetXTitle("[cm]");
+  TH1F* hrxSPDhalfstave = new TH1F("hrxSPDhalfstave","rx in SPD halfstaves",100,-0.1,0.1);
+  hrxSPDhalfstave->SetXTitle("[deg]");
+  TH1F* hrySPDhalfstave = new TH1F("hrySPDhalfstave","ry in SPD halfstaves",100,-0.1,0.1);
+  hrySPDhalfstave->SetXTitle("[deg]");
+  TH1F* hrzSPDhalfstave = new TH1F("hrzSPDhalfstave","rz in SPD halfstaves",100,-0.5,0.5);
+  hrzSPDhalfstave->SetXTitle("[deg]");
+
+  TCanvas  *cSPDladder = new TCanvas("cSPDladder","SPD ladders alignobjs",0,0,800,600);
+  cSPDladder->Divide(3,2);                 
+  TH1F* hxSPDladder = new TH1F("hxSPDladder","x in SPD ladders",100,-0.01,0.01);
+  hxSPDladder->SetXTitle("[cm]");
+  TH1F* hySPDladder = new TH1F("hySPDladder","y in SPD ladders",100,-0.01,0.01);
+  hySPDladder->SetXTitle("[cm]");
+  TH1F* hzSPDladder = new TH1F("hzSPDladder","z in SPD ladders",100,-0.01,0.01);
+  hzSPDladder->SetXTitle("[cm]");
+  TH1F* hrxSPDladder = new TH1F("hrxSPDladder","rx in SPD ladders",100,-0.01,0.01);
+  hrxSPDladder->SetXTitle("[deg]");
+  TH1F* hrySPDladder = new TH1F("hrySPDladder","ry in SPD ladders",100,-0.01,0.01);
+  hrySPDladder->SetXTitle("[deg]");
+  TH1F* hrzSPDladder = new TH1F("hrzSPDladder","rz in SPD ladders",100,-0.01,0.01);
+  hrzSPDladder->SetXTitle("[deg]");
+
+  TCanvas  *cSDDladder = new TCanvas("cSDDladder","SDD ladders alignobjs",0,0,800,600);
+  cSDDladder->Divide(3,2);                 
+  TH1F* hxSDDladder = new TH1F("hxSDDladder","x in SDD ladders",100,-0.01,0.01);
+  hxSDDladder->SetXTitle("[cm]");
+  TH1F* hySDDladder = new TH1F("hySDDladder","y in SDD ladders",100,-0.01,0.01);
+  hySDDladder->SetXTitle("[cm]");
+  TH1F* hzSDDladder = new TH1F("hzSDDladder","z in SDD ladders",100,-0.01,0.01);
+  hzSDDladder->SetXTitle("[cm]");
+  TH1F* hrxSDDladder = new TH1F("hrxSDDladder","rx in SDD ladders",100,-0.01,0.01);
+  hrxSDDladder->SetXTitle("[deg]");
+  TH1F* hrySDDladder = new TH1F("hrySDDladder","ry in SDD ladders",100,-0.01,0.01);
+  hrySDDladder->SetXTitle("[deg]");
+  TH1F* hrzSDDladder = new TH1F("hrzSDDladder","rz in SDD ladders",100,-0.01,0.01);
+  hrzSDDladder->SetXTitle("[deg]");
+
+  TCanvas  *cSDDsensor = new TCanvas("cSDDsensor","SDD sensors alignobjs",0,0,800,600);
+  cSDDsensor->Divide(3,2);                 
+  TH1F* hxSDDsensor = new TH1F("hxSDDsensor","x in SDD sensors",100,-0.01,0.01);
+  hxSDDsensor->SetXTitle("[cm]");
+  TH1F* hySDDsensor = new TH1F("hySDDsensor","y in SDD sensors",100,-0.01,0.01);
+  hySDDsensor->SetXTitle("[cm]");
+  TH1F* hzSDDsensor = new TH1F("hzSDDsensor","z in SDD sensors",100,-0.01,0.01);
+  hzSDDsensor->SetXTitle("[cm]");
+  TH1F* hrxSDDsensor = new TH1F("hrxSDDsensor","rx in SDD sensors",100,-0.01,0.01);
+  hrxSDDsensor->SetXTitle("[deg]");
+  TH1F* hrySDDsensor = new TH1F("hrySDDsensor","ry in SDD sensors",100,-0.01,0.01);
+  hrySDDsensor->SetXTitle("[deg]");
+  TH1F* hrzSDDsensor = new TH1F("hrzSDDsensor","rz in SDD sensors",100,-0.01,0.01);
+  hrzSDDsensor->SetXTitle("[deg]");
+
+
+  TCanvas  *cSSDladder = new TCanvas("cSSDladder","SSD ladders alignobjs",0,0,800,600);
+  cSSDladder->Divide(3,2);                 
+  TH1F* hxSSDladder = new TH1F("hxSSDladder","x in SSD ladders",100,-0.01,0.01);
+  hxSSDladder->SetXTitle("[cm]");
+  TH1F* hySSDladder = new TH1F("hySSDladder","y in SSD ladders",100,-0.01,0.01);
+  hySSDladder->SetXTitle("[cm]");
+  TH1F* hzSSDladder = new TH1F("hzSSDladder","z in SSD ladders",100,-0.01,0.01);
+  hzSSDladder->SetXTitle("[cm]");
+  TH1F* hrxSSDladder = new TH1F("hrxSSDladder","rx in SSD ladders",100,-0.01,0.01);
+  hrxSSDladder->SetXTitle("[deg]");
+  TH1F* hrySSDladder = new TH1F("hrySSDladder","ry in SSD ladders",100,-0.01,0.01);
+  hrySSDladder->SetXTitle("[deg]");
+  TH1F* hrzSSDladder = new TH1F("hrzSSDladder","rz in SSD ladders",100,-0.01,0.01);
+  hrzSSDladder->SetXTitle("[deg]");
+
+  TCanvas  *cSSDsensor = new TCanvas("cSSDsensor","SSD sensors alignobjs",0,0,800,600);
+  cSSDsensor->Divide(3,2);                 
+  TH1F* hxSSDsensor = new TH1F("hxSSDsensor","x in SSD sensors",100,-0.01,0.01);
+  hxSSDsensor->SetXTitle("[cm]");
+  TH1F* hySSDsensor = new TH1F("hySSDsensor","y in SSD sensors",100,-0.01,0.01);
+  hySSDsensor->SetXTitle("[cm]");
+  TH1F* hzSSDsensor = new TH1F("hzSSDsensor","z in SSD sensors",100,-0.01,0.01);
+  hzSSDsensor->SetXTitle("[cm]");
+  TH1F* hrxSSDsensor = new TH1F("hrxSSDsensor","rx in SSD sensors",100,-0.01,0.01);
+  hrxSSDsensor->SetXTitle("[deg]");
+  TH1F* hrySSDsensor = new TH1F("hrySSDsensor","ry in SSD sensors",100,-0.01,0.01);
+  hrySSDsensor->SetXTitle("[deg]");
+  TH1F* hrzSSDsensor = new TH1F("hrzSSDsensor","rz in SSD sensors",100,-0.01,0.01);
+  hrzSSDsensor->SetXTitle("[deg]");
+
+
+
+  TClonesArray* ar = (TClonesArray*)f->Get("ITSAlignObjs");
+  Int_t entries = ar->GetEntriesFast();
+  cout<<"number of alignment objects: "<<entries<<endl;
+
+  AliAlignObj* a;
+  Option_t *opt = NULL;
+  Double_t tr[3];
+  Double_t rot[3];
+
+  for(Int_t i=0; i<entries; i++){
+    a=(AliAlignObj*)ar->UncheckedAt(i);
+    if(local) {
+      a->GetLocalPars(tr,rot);
+    } else {
+      a->GetPars(tr,rot);
+    }
+    TString symName = a->GetSymName();
+    printf("  %s\n",symName.Data());
+    if(!symName.Contains("SPD") && !symName.Contains("SDD") && !symName.Contains("SSD")) {
+      a->Print(opt);
+    }
+    if(symName.Contains("SPD") && symName.Contains("Sector") && !symName.Contains("HalfStave")) {
+      hxSPDsector->Fill(tr[0]);
+      hySPDsector->Fill(tr[1]);
+      hzSPDsector->Fill(tr[2]);
+      hrxSPDsector->Fill(rot[0]);
+      hrySPDsector->Fill(rot[1]);
+      hrzSPDsector->Fill(rot[2]); printf("%f\n",rot[2]);
+    }
+    if(symName.Contains("SPD") && symName.Contains("Sector") && symName.Contains("HalfStave") && !symName.Contains("Ladder")) {
+      hxSPDhalfstave->Fill(tr[0]);
+      hySPDhalfstave->Fill(tr[1]);
+      hzSPDhalfstave->Fill(tr[2]);
+      hrxSPDhalfstave->Fill(rot[0]);
+      hrySPDhalfstave->Fill(rot[1]);
+      hrzSPDhalfstave->Fill(rot[2]);
+    }
+    if(symName.Contains("SPD") && symName.Contains("Sector") && symName.Contains("HalfStave") && symName.Contains("Ladder")) {
+      hxSPDladder->Fill(tr[0]);
+      hySPDladder->Fill(tr[1]);
+      hzSPDladder->Fill(tr[2]);
+      hrxSPDladder->Fill(rot[0]);
+      hrySPDladder->Fill(rot[1]);
+      hrzSPDladder->Fill(rot[2]);
+    }
+    if(symName.Contains("SDD") && symName.Contains("Ladder") && !symName.Contains("Sensor")) {
+      hxSDDladder->Fill(tr[0]);
+      hySDDladder->Fill(tr[1]);
+      hzSDDladder->Fill(tr[2]);
+      hrxSDDladder->Fill(rot[0]);
+      hrySDDladder->Fill(rot[1]);
+      hrzSDDladder->Fill(rot[2]);
+    }
+    if(symName.Contains("SDD") && symName.Contains("Ladder") && symName.Contains("Sensor")) {
+      hxSDDsensor->Fill(tr[0]);
+      hySDDsensor->Fill(tr[1]);
+      hzSDDsensor->Fill(tr[2]);
+      hrxSDDsensor->Fill(rot[0]);
+      hrySDDsensor->Fill(rot[1]);
+      hrzSDDsensor->Fill(rot[2]);
+    }
+    if(symName.Contains("SSD") && symName.Contains("Ladder") && !symName.Contains("Sensor")) {
+      hxSSDladder->Fill(tr[0]);
+      hySSDladder->Fill(tr[1]);
+      hzSSDladder->Fill(tr[2]);
+      hrxSSDladder->Fill(rot[0]);
+      hrySSDladder->Fill(rot[1]);
+      hrzSSDladder->Fill(rot[2]);
+    }
+    if(symName.Contains("SSD") && symName.Contains("Ladder") && symName.Contains("Sensor")) {
+      hxSSDsensor->Fill(tr[0]);
+      hySSDsensor->Fill(tr[1]);
+      hzSSDsensor->Fill(tr[2]);
+      hrxSSDsensor->Fill(rot[0]);
+      hrySSDsensor->Fill(rot[1]);
+      hrzSSDsensor->Fill(rot[2]);
+    }
+
+
+  }
+
+
+  cSPDsector->cd(1);
+  hxSPDsector->Draw();
+  cSPDsector->cd(2);
+  hySPDsector->Draw();
+  cSPDsector->cd(3);
+  hzSPDsector->Draw();
+  cSPDsector->cd(4);
+  hrxSPDsector->Draw();
+  cSPDsector->cd(5);
+  hrySPDsector->Draw();
+  cSPDsector->cd(6);
+  hrzSPDsector->Draw();
+
+  cSPDhalfstave->cd(1);
+  hxSPDhalfstave->Draw();
+  cSPDhalfstave->cd(2);
+  hySPDhalfstave->Draw();
+  cSPDhalfstave->cd(3);
+  hzSPDhalfstave->Draw();
+  cSPDhalfstave->cd(4);
+  hrxSPDhalfstave->Draw();
+  cSPDhalfstave->cd(5);
+  hrySPDhalfstave->Draw();
+  cSPDhalfstave->cd(6);
+  hrzSPDhalfstave->Draw();
+
+  cSPDladder->cd(1);
+  hxSPDladder->Draw();
+  cSPDladder->cd(2);
+  hySPDladder->Draw();
+  cSPDladder->cd(3);
+  hzSPDladder->Draw();
+  cSPDladder->cd(4);
+  hrxSPDladder->Draw();
+  cSPDladder->cd(5);
+  hrySPDladder->Draw();
+  cSPDladder->cd(6);
+  hrzSPDladder->Draw();
+
+
+  cSDDladder->cd(1);
+  hxSDDladder->Draw();
+  cSDDladder->cd(2);
+  hySDDladder->Draw();
+  cSDDladder->cd(3);
+  hzSDDladder->Draw();
+  cSDDladder->cd(4);
+  hrxSDDladder->Draw();
+  cSDDladder->cd(5);
+  hrySDDladder->Draw();
+  cSDDladder->cd(6);
+  hrzSDDladder->Draw();
+  cSDDsensor->cd(1);
+  hxSDDsensor->Draw();
+  cSDDsensor->cd(2);
+  hySDDsensor->Draw();
+  cSDDsensor->cd(3);
+  hzSDDsensor->Draw();
+  cSDDsensor->cd(4);
+  hrxSDDsensor->Draw();
+  cSDDsensor->cd(5);
+  hrySDDsensor->Draw();
+  cSDDsensor->cd(6);
+  hrzSDDsensor->Draw();
+
+  cSSDladder->cd(1);
+  hxSSDladder->Draw();
+  cSSDladder->cd(2);
+  hySSDladder->Draw();
+  cSSDladder->cd(3);
+  hzSSDladder->Draw();
+  cSSDladder->cd(4);
+  hrxSSDladder->Draw();
+  cSSDladder->cd(5);
+  hrySSDladder->Draw();
+  cSSDladder->cd(6);
+  hrzSSDladder->Draw();
+  cSSDsensor->cd(1);
+  hxSSDsensor->Draw();
+  cSSDsensor->cd(2);
+  hySSDsensor->Draw();
+  cSSDsensor->cd(3);
+  hzSSDsensor->Draw();
+  cSSDsensor->cd(4);
+  hrxSSDsensor->Draw();
+  cSSDsensor->cd(5);
+  hrySSDsensor->Draw();
+  cSSDsensor->cd(6);
+  hrzSSDsensor->Draw();
+
+  return;
+}
index d437ee7b1ef2e7b56f0689106f6440fe1eb72668..0f23e30d432d4c7121237b545879d4c11809a09d 100644 (file)
@@ -40,6 +40,7 @@
 #pragma link C++ class  AliITSMap+;
 #pragma link C++ class  AliITSMapA1+;
 #pragma link C++ class  AliITSMapA2+;
+#pragma link C++ class  AliITSMisalignMaker+;
 #pragma link C++ class  AliITSsegmentation+;
 #pragma link C++ class  AliITSsegmentationSPD+;
 #pragma link C++ class  AliITSsegmentationSDD+;
diff --git a/ITS/MakeITSRealisticMisAlignment.C b/ITS/MakeITSRealisticMisAlignment.C
new file mode 100644 (file)
index 0000000..abb52ca
--- /dev/null
@@ -0,0 +1,314 @@
+#if !defined(__CINT__) || defined(__MAKECINT__)
+#include <TError.h>
+#include <TFile.h>
+#include <TGeoManager.h>
+#include <TMath.h>
+#include <TString.h>
+#include <TSystem.h>
+#include "AliCDBPath.h"
+#include "AliCDBEntry.h"
+#include "AliCDBManager.h"
+#include "AliCDBStorage.h"
+#include "AliGeomManager.h"
+#include "AliITSMisalignMaker.h"
+#endif
+void MakeITSRealisticMisAlignment() {
+//========================================================================
+//
+// Steering macro for ITS realistic misalignment
+//
+// Main author: L. Gaudichet
+// Contact: andrea.dainese@lnl.infn.it
+//
+//========================================================================
+
+/* $Id$ */
+
+  const char* macroname = "MakeITSRealisticMisAlignment.C";
+
+  // Activate CDB storage and load geometry from CDB
+  AliCDBManager* cdb = AliCDBManager::Instance();
+  if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT");
+  cdb->SetRun(0);
+  
+  AliCDBStorage* storage = NULL;
+
+
+  if(gSystem->Getenv("TOCDB")){
+    TString Storage = gSystem->Getenv("STORAGE");
+    if(!Storage.BeginsWith("local://") && !Storage.BeginsWith("alien://")) {
+      Error(macroname,"STORAGE variable set to %s is not valid. Exiting\n",Storage.Data());
+      return;
+    }
+    storage = cdb->GetStorage(Storage.Data());
+    if(!storage){
+      Error(macroname,"Unable to open storage %s\n",Storage.Data());
+      return;
+    }
+    AliCDBPath path("GRP","Geometry","Data");
+    AliCDBEntry *entry = storage->Get(path.GetPath(),cdb->GetRun());
+    if(!entry) Fatal(macroname,"Could not get the specified CDB entry!");
+    entry->SetOwner(0);
+    TGeoManager* geom = (TGeoManager*) entry->GetObject();
+    AliGeomManager::SetGeometry(geom);
+  }else{
+    AliGeomManager::LoadGeometry("geometry.root"); //load geom from default CDB storage
+  }    
+
+  //   SETTINGS:
+  //   - tranformations are defined by the "maximum transformation" 
+  //     dx,dy,dz,dpsi,dtheta,dphi: then we take a Gaussian with sigma=dx/3
+  //     and we cut it at +- 3*sigma = dx 
+  //     (the option "unif" allows to sample from a uniform distr.)
+  //   - units are cm and deg
+  //   - transformations are defined in the local frame of the volume
+  //     being misaligned
+  //
+  const Float_t kRadToDeg = 180./TMath::Pi();
+
+
+  //=****************************************
+  // overall ITS misalignment :              source - 
+  //=****************************************
+  Float_t its_dx     = 0.0000;   // ?
+  Float_t its_dy     = 0.0000;    // ?
+  Float_t its_dz     = 0.0000;    // ?
+  Float_t its_dpsi   = 0.0000;   // ?
+  Float_t its_dtheta = 0.0000;  // ?
+  Float_t its_dphi   = 0.0000;   // ?
+
+  //=****************************************
+  // misalignment at the level of SPD sectors : source - A.Pepato
+  //=****************************************
+  Float_t spdsector_dx     = 0.0050; //  50 micron (~tangetial, i.e. rphi) 
+  Float_t spdsector_dy     = 0.0100; // 100 micron (~radial)
+  Float_t spdsector_dz     = 0.0100; // 100 micron
+  Float_t spdsector_dpsi   = 0.0100/30.*kRadToDeg;; // so as to have 100 micron difference at the two extremes
+  Float_t spdsector_dtheta = 0.0100/30.*kRadToDeg;; // so as to have 100 micron difference at the two extremes
+  Float_t spdsector_dphi   = 0.0050/1.5*kRadToDeg;; // so as to have 50 micron difference at the two extremes
+  Bool_t unifspdsector=kTRUE;
+
+  //=****************************************
+  // misalignment at the level of SPD half-barrels : source - A.Pepato
+  //=****************************************
+  Float_t spdhalfbarrel_dx     = 0.0200; // 200 micron  
+  Float_t spdhalfbarrel_dy     = 0.0200; // 200 micron 
+  Float_t spdhalfbarrel_dz     = 0.0200; // 200 micron
+  Float_t spdhalfbarrel_dpsi   = 0.0100/30.*kRadToDeg; // so as to have 100 micron difference at the two extremes
+  Float_t spdhalfbarrel_dtheta = 0.0100/30.*kRadToDeg; // so as to have 100 micron difference at the two extremes
+  Float_t spdhalfbarrel_dphi   = 0.0100/7.*kRadToDeg; // so as to have 100 micron difference at the two extremes
+
+  //=****************************************
+  // misalignment at the level of SPD barrel : source - A.Pepato
+  //=****************************************
+  Float_t spdbarrel_dx     = 0.1000; // 1 mm (very pessimistic)  
+  Float_t spdbarrel_dy     = 0.1000; // 1 mm (very pessimistic)
+  Float_t spdbarrel_dz     = 0.1000; // 1 mm (very pessimistic)
+  Float_t spdbarrel_dpsi   = 0.0500/30.*kRadToDeg; // so as to have 500 micron difference at the two extremes
+  Float_t spdbarrel_dtheta = 0.0500/30.*kRadToDeg; // so as to have 500 micron difference at the two extremes
+  Float_t spdbarrel_dphi   = 0.0500/7.*kRadToDeg; // so as to have 500 micron difference at the two extremes
+  
+
+  //=****************************************
+  // misalignment at the level of SDD and SSD layers: source
+  //=****************************************
+  /*
+  Float_t sddlayer_dx     = 0.0000; // ?
+  Float_t sddlayer_dy     = 0.0000; // ?
+  Float_t sddlayer_dz     = 0.0000; // ?
+  Float_t sddlayer_dpsi   = 0.0000; // ?
+  Float_t sddlayer_dtheta = 0.0000; // ?
+  Float_t sddlayer_dphi   = 0.0000;  // ?
+
+  Float_t ssdlayer_dx     = 0.0000; // ?
+  Float_t ssdlayer_dy     = 0.0000; // ?
+  Float_t ssdlayer_dz     = 0.0000; // ?
+  Float_t ssdlayer_dpsi   = 0.0000; // ?
+  Float_t ssdlayer_dtheta = 0.0000; // ?
+  Float_t ssdlayer_dphi   = 0.0000;  // ?
+  */
+
+  //=****************************************
+  // misalignment at the level of half-staves (SPD) : source - S.Moretto
+  //                              ladders (SDD,SSD) : source -
+  //=****************************************
+  Float_t spdhalfstave_dx     = 0.0020; // 20 micron  
+  Float_t spdhalfstave_dy     = 0.0100; // 100 micron 
+  Float_t spdhalfstave_dz     = 0.0020; // 20 micron
+  Float_t spdhalfstave_dpsi   = 0.0050/7.*kRadToDeg; // so as to have 50 micron difference at the two extremes
+  Float_t spdhalfstave_dtheta = 0.0020/7.*kRadToDeg; // so as to have 20 micron difference at the two extremes
+  Float_t spdhalfstave_dphi   = 0.0050/0.7*kRadToDeg; // so as to have 50 micron difference at the two extremes
+  Bool_t unifspdhalfstave=kTRUE;
+
+  Float_t sddladder_dx     = 0.0005; // 5 micron  
+  Float_t sddladder_dy     = 0.0005; // 5 micron 
+  Float_t sddladder_dz     = 0.0005; // 5 micron
+  Float_t sddladder_dpsi   = 0.00; //  ?
+  Float_t sddladder_dtheta = 0.00; //  ?
+  Float_t sddladder_dphi   = 0.00; //  ?
+
+  Float_t ssdladder_dx     = 0.0005; // 5 micron  
+  Float_t ssdladder_dy     = 0.0005; // 5 micron 
+  Float_t ssdladder_dz     = 0.0005; // 5 micron
+  Float_t ssdladder_dpsi   = 0.00; //  ?
+  Float_t ssdladder_dtheta = 0.00; //  ?
+  Float_t ssdladder_dphi   = 0.00; //  ?
+
+
+  //=****************************************
+  // misalignment at the level of ladders (SPD) : source - R.Santoro
+  //                              modules (SDD) : source - L.Gaudichet
+  //                              modules (SSD) : source - 
+  //=****************************************
+  Float_t spdladder_dx     = 0.0010; // 10 micron  
+  Float_t spdladder_dy     = 0.0050; // 50 micron 
+  Float_t spdladder_dz     = 0.0010; // 10 micron
+  Float_t spdladder_dpsi   = 0.0001*kRadToDeg; // 0.1 mrad
+  Float_t spdladder_dtheta = 0.0001*kRadToDeg; // 0.1 mrad
+  Float_t spdladder_dphi   = 0.0001*kRadToDeg; // 0.1 mrad
+
+  Float_t sddmodule_dx     = 0.0045; // 45 micron  
+  Float_t sddmodule_dy     = 0.0045; // 45 micron 
+  Float_t sddmodule_dz     = 0.0105; // 105 micron
+  Float_t sddmodule_dpsi   = 0.00; // ?
+  Float_t sddmodule_dtheta = 0.00; //  ?
+  Float_t sddmodule_dphi   = 0.00; //  ?
+
+  Float_t ssdmodule_dx     = 0.0050; // 50 micron  
+  Float_t ssdmodule_dy     = 0.0050; // 50 micron 
+  Float_t ssdmodule_dz     = 0.0050; // 50 micron
+  Float_t ssdmodule_dpsi   = 0.00; // ?
+  Float_t ssdmodule_dtheta = 0.00; //  ?
+  Float_t ssdmodule_dphi   = 0.00; //  ?
+  //
+  // END SETTINGS
+
+
+  AliITSMisalignMaker alignMaker;
+
+  //=****************************************
+  // overall ITS misalignment :
+  //=****************************************
+
+  alignMaker.AddAlignObj("ITS",its_dx,its_dy,its_dz,its_dpsi,its_dtheta,its_dphi,kFALSE);
+
+
+  //=****************************************
+  // misalignment at the level of SPD barrel, half-barrels, and at the level
+  // of SPD sectors
+  //=****************************************
+
+  Double_t vx,vy,vz,vpsi,vtheta,vphi;
+  Double_t vxbarrel,vybarrel,vzbarrel,vpsibarrel,vthetabarrel,vphibarrel;
+
+  //   barrel
+  vxbarrel = alignMaker.GaussCut(0, spdbarrel_dx/3, spdbarrel_dx);
+  vybarrel = alignMaker.GaussCut(0, spdbarrel_dy/3, spdbarrel_dy);
+  vzbarrel = alignMaker.GaussCut(0, spdbarrel_dz/3, spdbarrel_dz);
+  vpsibarrel = alignMaker.GaussCut(0, spdbarrel_dpsi/3, spdbarrel_dpsi);
+  vthetabarrel = alignMaker.GaussCut(0, spdbarrel_dtheta/3, spdbarrel_dtheta);
+  vphibarrel = alignMaker.GaussCut(0, spdbarrel_dphi/3, spdbarrel_dphi);
+
+  //  top half-barrel
+  vx = alignMaker.GaussCut(0, spdhalfbarrel_dx/3, spdhalfbarrel_dx);
+  vy = alignMaker.GaussCut(0, spdhalfbarrel_dy/3, spdhalfbarrel_dy);
+  vz = alignMaker.GaussCut(0, spdhalfbarrel_dz/3, spdhalfbarrel_dz);
+  vpsi = alignMaker.GaussCut(0, spdhalfbarrel_dpsi/3, spdhalfbarrel_dpsi);
+  vtheta = alignMaker.GaussCut(0, spdhalfbarrel_dtheta/3, spdhalfbarrel_dtheta);
+  vphi = alignMaker.GaussCut(0, spdhalfbarrel_dphi/3, spdhalfbarrel_dphi);
+
+  vx += vxbarrel;
+  vy += vybarrel;
+  vz += vzbarrel;
+  vpsi += vpsibarrel;
+  vtheta += vthetabarrel;
+  vphi += vphibarrel;
+
+  alignMaker.AddSectorAlignObj(1, 5, spdsector_dx,spdsector_dy,spdsector_dz,
+                              spdsector_dpsi,spdsector_dtheta,spdsector_dphi,
+                              vx,vy,vz,vpsi,vtheta,vphi,unifspdsector);
+
+  //  bottom half-barrel
+  vx = alignMaker.GaussCut(0, spdhalfbarrel_dx/3, spdhalfbarrel_dx);
+  vy = alignMaker.GaussCut(0, spdhalfbarrel_dy/3, spdhalfbarrel_dy);
+  vz = alignMaker.GaussCut(0, spdhalfbarrel_dz/3, spdhalfbarrel_dz);
+  vpsi = alignMaker.GaussCut(0, spdhalfbarrel_dpsi/3, spdhalfbarrel_dpsi);
+  vtheta = alignMaker.GaussCut(0, spdhalfbarrel_dtheta/3, spdhalfbarrel_dtheta);
+  vphi = alignMaker.GaussCut(0, spdhalfbarrel_dphi/3, spdhalfbarrel_dphi);
+
+  vx += vxbarrel;
+  vy += vybarrel;
+  vz += vzbarrel;
+  vpsi += vpsibarrel;
+  vtheta += vthetabarrel;
+  vphi += vphibarrel;
+
+  alignMaker.AddSectorAlignObj(6, 10, spdsector_dx,spdsector_dy,spdsector_dz,
+                              spdsector_dpsi,spdsector_dtheta,spdsector_dphi,
+                              vx,vy,vz,vpsi,vtheta,vphi,unifspdsector);
+
+
+  //=****************************************
+  // misalignment at the level of SDD and SSD layers
+  //=****************************************
+  /*   alignMaker.AddAlignObj("ITS/SDD2", sddlayer_dx,sddlayer_dy,sddlayer_dz, sddlayer_dpsi,sddlayer_dtheta,sddlayer_dphi);
+     alignMaker.AddAlignObj("ITS/SDD3", sddlayer_dx,sddlayer_dy,sddlayer_dz, sddlayer_dpsi,sddlayer_dtheta,sddlayer_dphi);
+     alignMaker.AddAlignObj("ITS/SSD4", ssdlayer_dx,ssdlayer_dy,ssdlayer_dz, ssdlayer_dpsi,ssdlayer_dtheta,ssdlayer_dphi);
+     alignMaker.AddAlignObj("ITS/SSD5", ssdlayer_dx,ssdlayer_dy,ssdlayer_dz, ssdlayer_dpsi,ssdlayer_dtheta,ssdlayer_dphi);  */
+  // still waiting for some changes in aliroot
+
+
+
+  //=****************************************
+  // misalignment at the level of half-staves (SPD)/ladders (SDD,SSD) :
+  //=****************************************
+
+  alignMaker.AddAlignObj(0, -1,  spdhalfstave_dx,spdhalfstave_dy,spdhalfstave_dz, spdhalfstave_dpsi,spdhalfstave_dtheta,spdhalfstave_dphi,unifspdhalfstave); // all SPD1 half-staves
+  alignMaker.AddAlignObj(1, -1,  spdhalfstave_dx,spdhalfstave_dy,spdhalfstave_dz, spdhalfstave_dpsi,spdhalfstave_dtheta,spdhalfstave_dphi,unifspdhalfstave); // all SPD2 half-staves
+
+  alignMaker.AddAlignObj(2, -1,  sddladder_dx,sddladder_dy,sddladder_dz, sddladder_dpsi,sddladder_dtheta,sddladder_dphi,kFALSE); // all SDD1 ladders
+  alignMaker.AddAlignObj(3, -1,  sddladder_dx,sddladder_dy,sddladder_dz, sddladder_dpsi,sddladder_dtheta,sddladder_dphi,kFALSE); // all SDD2 ladders
+
+  alignMaker.AddAlignObj(4, -1,  ssdladder_dx,ssdladder_dy,ssdladder_dz, ssdladder_dpsi,ssdladder_dtheta,ssdladder_dphi,kFALSE); // all SSD1 ladders
+  alignMaker.AddAlignObj(5, -1,  ssdladder_dx,ssdladder_dy,ssdladder_dz, ssdladder_dpsi,ssdladder_dtheta,ssdladder_dphi,kFALSE); // all SSD2 ladders
+
+  //=****************************************
+  // misalignment at the level of ladders (SPD)/modules (SDD, SSD) :
+  //=****************************************
+
+  alignMaker.AddAlignObj(0,  spdladder_dx,spdladder_dy,spdladder_dz, spdladder_dpsi,spdladder_dtheta,spdladder_dphi,kFALSE); // all SPD1 ladders
+  alignMaker.AddAlignObj(1,  spdladder_dx,spdladder_dy,spdladder_dz, spdladder_dpsi,spdladder_dtheta,spdladder_dphi,kFALSE); // all SPD2 ladders
+
+  alignMaker.AddAlignObj(2,  sddmodule_dx,sddmodule_dy,sddmodule_dz, sddmodule_dpsi,sddmodule_dtheta,sddmodule_dphi,kFALSE); // all SDD1 modules
+  alignMaker.AddAlignObj(3,  sddmodule_dx,sddmodule_dy,sddmodule_dz, sddmodule_dpsi,sddmodule_dtheta,sddmodule_dphi,kFALSE); // all SDD2 modules
+
+  alignMaker.AddAlignObj(4,  ssdmodule_dx,ssdmodule_dy,ssdmodule_dz, ssdmodule_dpsi,ssdmodule_dtheta,ssdmodule_dphi,kFALSE); // all SSD1 modules
+  alignMaker.AddAlignObj(5,  ssdmodule_dx,ssdmodule_dy,ssdmodule_dz, ssdmodule_dpsi,ssdmodule_dtheta,ssdmodule_dphi,kFALSE); // all SSD2 modules
+
+
+
+  if( !gSystem->Getenv("TOCDB") ){
+    // save on file
+    const char* filename = "ITSrealisticMisalignment.root";
+    TFile f(filename,"RECREATE");
+    if(!f.IsOpen()){
+      Error(macroname,"cannot open file for output\n");
+      return;
+    }
+    Info(macroname,"Saving alignment objects to the file %s", filename);
+    f.cd();
+    f.WriteObject(alignMaker.GetArray(),"ITSAlignObjs","kSingleKey");
+    f.Close();
+  }else{
+    // save in CDB storage
+    AliCDBMetaData *md= new AliCDBMetaData();
+    md->SetResponsible("Andrea Dainese");
+    md->SetComment("Alignment objects with actual ITS misalignment");
+    md->SetAliRootVersion(gSystem->Getenv("ARVERSION"));
+    AliCDBId id("ITS/Align/Data",0,AliCDBRunRange::Infinity());
+    storage->Put(alignMaker.GetArray(),id,md);
+  }
+
+
+  return;
+}
index 0b29eab44c103ed73a14f81251c8e09d5dc00f91..49c993c3c2894ac452875a2c5825fcb709a7bfdc 100644 (file)
@@ -15,6 +15,7 @@ SRCS =        AliITSgeom.cxx \
                AliITSMap.cxx \
                AliITSMapA1.cxx \
                AliITSMapA2.cxx \
+               AliITSMisalignMaker.cxx \
                AliITSpList.cxx \
                AliITSpListItem.cxx \
                AliITSsegmentation.cxx \