ROOT logo
void MakePMDFullMisAlignment(){
  // Create TClonesArray of full misalignment objects for PMD
  //

  // Macro to randomly displace the 4 sectors of the PMD
  // in each plane. Each sector (to be misaligned) 
  // of PMD houses the following :
  // (a) 6 modules of preshower plane
  // (b) 6 modules of veto plane
  // (c) The FEE boards on back plane of each module
  // (d) 6 modules of convertor plates
  // The clustering is done module-wise
  // The actual amount displacement will be provided
  // by the survey data and has to be converted into
  // displacement in x,y,z,theta, phi and psi 
  
  
  // Now specify the path of the module to be misaligned
  // as followed in the PMD geant
  
  /*
     _____________
    |    |        |
    | 1  |   3    |
    |    |________|
    |____|___|    |
    |        | 2  |
    |   4    |    |
    |________|____|
    
    // Misalignment Matrix is expected to be
    // same for sectors 1 and 4 
    // and for the sectors 2 and 3
    // As these will be mounted on the same
    // Steel plate 
 */
  
  const char* macroname = "MakePMDFullMisAlignment.C";

  // Activate CDB storage and load geometry from CDB
  AliCDBManager* cdb = AliCDBManager::Instance();
  if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
  cdb->SetRun(0);
  
  AliCDBStorage* storage;
  
  if( TString(gSystem->Getenv("TOCDB")) == TString("kTRUE") ){
    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(); //load geom from default CDB storage
  }

  Float_t max_trans=0.1;
  Float_t max_rot=0.1;

  const char *Sector1="PMD/Sector1"; 
  const char *Sector2="PMD/Sector2"; 
  const char *Sector3="PMD/Sector3"; 
  const char *Sector4="PMD/Sector4"; 
  
  
  //Sectors 1 and 4
  Double_t dx14, dy14, dz14;          // Misalignment in X,Y and Z
  Double_t dpsi14, dtheta14, dphi14; //  Angular displacements
  //Sectors 2 and 3
  Double_t dx23, dy23, dz23;          // Misalignment in X,Y and Z
  Double_t dpsi23, dtheta23, dphi23; //  Angular displacements
  
  
  
  // At present give some random shifts
  // generated by random numbers
  // max_trans : Maximun shifts in X,Y,Z  in centimeters
  // max_rot   : Maximum shifts in angles in degrees
  // Double_t max_trans, max_rot;
  
  
  TRandom *rnd   = new TRandom(4357);
  
  // For sectors 1 and 4
  // Translation displacement
  dx14     = (rnd->Uniform()-0.5)*max_trans;
  dy14     = (rnd->Uniform()-0.5)*max_trans;
  dz14     = (rnd->Uniform()-0.5)*max_trans;
  //Rotation angles
  dpsi14   = (rnd->Uniform()-0.5)*max_rot;
  dtheta14 = (rnd->Uniform()-0.5)*max_rot;
  dphi14   = (rnd->Uniform()-0.5)*max_rot;
  
  // For sectors 2 and 3
  // Translation displacement
  dx23     = (rnd->Uniform()-0.5)*max_trans;
  dy23     = (rnd->Uniform()-0.5)*max_trans;
  dz23     = (rnd->Uniform()-0.5)*max_trans;
  //Rotation angles
  dpsi23   = (rnd->Uniform()-0.5)*max_rot;
  dtheta23 = (rnd->Uniform()-0.5)*max_rot;
  dphi23   = (rnd->Uniform()-0.5)*max_rot;
  
  
  //Create a TClonesArray of Align Object to store displacement Angles
  TClonesArray *array = new TClonesArray("AliAlignObjParams",10);
  TClonesArray &alobj = *array;
  
  Int_t iIndex=0; //let all modules have index=0 in a layer with no LUT
  AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
  UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);

  new(alobj[0]) AliAlignObjParams(Sector1, volid, dx14, dy14, dz14, dpsi14, dtheta14, dphi14, kFALSE);
  new(alobj[1]) AliAlignObjParams(Sector2, volid, dx14, dy14, dz14, dpsi14, dtheta14, dphi14, kFALSE);
  new(alobj[2]) AliAlignObjParams(Sector3, volid, dx23, dy23, dz23, dpsi23, dtheta23, dphi23, kFALSE);
  new(alobj[3]) AliAlignObjParams(Sector4, volid, dx23, dy23, dz23, dpsi23, dtheta23, dphi23, kFALSE);
  
  if( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ){
    // Create a File to store the alignment data
    const char* filename = "PMDfullMisalignment.root";
    TFile f(filename,"RECREATE");
    if(!f){
      Error(macroname,"cannot open file for output\n");
      return;
    }
    Info(macroname,"Saving alignment objects to the file %s", filename);
    f.cd();
    f.WriteObject(array,"PMDAlignObjs","kSingleKey");
    f.Close();
  }else{
  // save in CDB storage
    AliCDBMetaData* md = new AliCDBMetaData();
    md->SetResponsible("");
    md->SetComment("Full misalignment for PMD, produced with sigmatr=0.1 and sigmarot=0.1 in the local RS");
    md->SetAliRootVersion(gSystem->Getenv("ARVERSION"));
    AliCDBId id("PMD/Align/Data",0,AliCDBRunRange::Infinity());
    storage->Put(array,id,md);
  }
  array->Delete();

}
 MakePMDFullMisAlignment.C:1
 MakePMDFullMisAlignment.C:2
 MakePMDFullMisAlignment.C:3
 MakePMDFullMisAlignment.C:4
 MakePMDFullMisAlignment.C:5
 MakePMDFullMisAlignment.C:6
 MakePMDFullMisAlignment.C:7
 MakePMDFullMisAlignment.C:8
 MakePMDFullMisAlignment.C:9
 MakePMDFullMisAlignment.C:10
 MakePMDFullMisAlignment.C:11
 MakePMDFullMisAlignment.C:12
 MakePMDFullMisAlignment.C:13
 MakePMDFullMisAlignment.C:14
 MakePMDFullMisAlignment.C:15
 MakePMDFullMisAlignment.C:16
 MakePMDFullMisAlignment.C:17
 MakePMDFullMisAlignment.C:18
 MakePMDFullMisAlignment.C:19
 MakePMDFullMisAlignment.C:20
 MakePMDFullMisAlignment.C:21
 MakePMDFullMisAlignment.C:22
 MakePMDFullMisAlignment.C:23
 MakePMDFullMisAlignment.C:24
 MakePMDFullMisAlignment.C:25
 MakePMDFullMisAlignment.C:26
 MakePMDFullMisAlignment.C:27
 MakePMDFullMisAlignment.C:28
 MakePMDFullMisAlignment.C:29
 MakePMDFullMisAlignment.C:30
 MakePMDFullMisAlignment.C:31
 MakePMDFullMisAlignment.C:32
 MakePMDFullMisAlignment.C:33
 MakePMDFullMisAlignment.C:34
 MakePMDFullMisAlignment.C:35
 MakePMDFullMisAlignment.C:36
 MakePMDFullMisAlignment.C:37
 MakePMDFullMisAlignment.C:38
 MakePMDFullMisAlignment.C:39
 MakePMDFullMisAlignment.C:40
 MakePMDFullMisAlignment.C:41
 MakePMDFullMisAlignment.C:42
 MakePMDFullMisAlignment.C:43
 MakePMDFullMisAlignment.C:44
 MakePMDFullMisAlignment.C:45
 MakePMDFullMisAlignment.C:46
 MakePMDFullMisAlignment.C:47
 MakePMDFullMisAlignment.C:48
 MakePMDFullMisAlignment.C:49
 MakePMDFullMisAlignment.C:50
 MakePMDFullMisAlignment.C:51
 MakePMDFullMisAlignment.C:52
 MakePMDFullMisAlignment.C:53
 MakePMDFullMisAlignment.C:54
 MakePMDFullMisAlignment.C:55
 MakePMDFullMisAlignment.C:56
 MakePMDFullMisAlignment.C:57
 MakePMDFullMisAlignment.C:58
 MakePMDFullMisAlignment.C:59
 MakePMDFullMisAlignment.C:60
 MakePMDFullMisAlignment.C:61
 MakePMDFullMisAlignment.C:62
 MakePMDFullMisAlignment.C:63
 MakePMDFullMisAlignment.C:64
 MakePMDFullMisAlignment.C:65
 MakePMDFullMisAlignment.C:66
 MakePMDFullMisAlignment.C:67
 MakePMDFullMisAlignment.C:68
 MakePMDFullMisAlignment.C:69
 MakePMDFullMisAlignment.C:70
 MakePMDFullMisAlignment.C:71
 MakePMDFullMisAlignment.C:72
 MakePMDFullMisAlignment.C:73
 MakePMDFullMisAlignment.C:74
 MakePMDFullMisAlignment.C:75
 MakePMDFullMisAlignment.C:76
 MakePMDFullMisAlignment.C:77
 MakePMDFullMisAlignment.C:78
 MakePMDFullMisAlignment.C:79
 MakePMDFullMisAlignment.C:80
 MakePMDFullMisAlignment.C:81
 MakePMDFullMisAlignment.C:82
 MakePMDFullMisAlignment.C:83
 MakePMDFullMisAlignment.C:84
 MakePMDFullMisAlignment.C:85
 MakePMDFullMisAlignment.C:86
 MakePMDFullMisAlignment.C:87
 MakePMDFullMisAlignment.C:88
 MakePMDFullMisAlignment.C:89
 MakePMDFullMisAlignment.C:90
 MakePMDFullMisAlignment.C:91
 MakePMDFullMisAlignment.C:92
 MakePMDFullMisAlignment.C:93
 MakePMDFullMisAlignment.C:94
 MakePMDFullMisAlignment.C:95
 MakePMDFullMisAlignment.C:96
 MakePMDFullMisAlignment.C:97
 MakePMDFullMisAlignment.C:98
 MakePMDFullMisAlignment.C:99
 MakePMDFullMisAlignment.C:100
 MakePMDFullMisAlignment.C:101
 MakePMDFullMisAlignment.C:102
 MakePMDFullMisAlignment.C:103
 MakePMDFullMisAlignment.C:104
 MakePMDFullMisAlignment.C:105
 MakePMDFullMisAlignment.C:106
 MakePMDFullMisAlignment.C:107
 MakePMDFullMisAlignment.C:108
 MakePMDFullMisAlignment.C:109
 MakePMDFullMisAlignment.C:110
 MakePMDFullMisAlignment.C:111
 MakePMDFullMisAlignment.C:112
 MakePMDFullMisAlignment.C:113
 MakePMDFullMisAlignment.C:114
 MakePMDFullMisAlignment.C:115
 MakePMDFullMisAlignment.C:116
 MakePMDFullMisAlignment.C:117
 MakePMDFullMisAlignment.C:118
 MakePMDFullMisAlignment.C:119
 MakePMDFullMisAlignment.C:120
 MakePMDFullMisAlignment.C:121
 MakePMDFullMisAlignment.C:122
 MakePMDFullMisAlignment.C:123
 MakePMDFullMisAlignment.C:124
 MakePMDFullMisAlignment.C:125
 MakePMDFullMisAlignment.C:126
 MakePMDFullMisAlignment.C:127
 MakePMDFullMisAlignment.C:128
 MakePMDFullMisAlignment.C:129
 MakePMDFullMisAlignment.C:130
 MakePMDFullMisAlignment.C:131
 MakePMDFullMisAlignment.C:132
 MakePMDFullMisAlignment.C:133
 MakePMDFullMisAlignment.C:134
 MakePMDFullMisAlignment.C:135
 MakePMDFullMisAlignment.C:136
 MakePMDFullMisAlignment.C:137
 MakePMDFullMisAlignment.C:138
 MakePMDFullMisAlignment.C:139
 MakePMDFullMisAlignment.C:140
 MakePMDFullMisAlignment.C:141
 MakePMDFullMisAlignment.C:142
 MakePMDFullMisAlignment.C:143
 MakePMDFullMisAlignment.C:144
 MakePMDFullMisAlignment.C:145
 MakePMDFullMisAlignment.C:146
 MakePMDFullMisAlignment.C:147
 MakePMDFullMisAlignment.C:148
 MakePMDFullMisAlignment.C:149
 MakePMDFullMisAlignment.C:150
 MakePMDFullMisAlignment.C:151
 MakePMDFullMisAlignment.C:152
 MakePMDFullMisAlignment.C:153