ROOT logo
void MakeTOFFullMisAlignment() {
  // 
  // Create TClonesArray of full misalignment objects for TOF
  // Expects to read objects for FRAME
  // 

  const char* macroname = "MakeTOFFullMisAlignment.C";

  TClonesArray *array = new TClonesArray("AliAlignObjParams",2000);
  
  // 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;
  TString Storage;

  if ( TString(gSystem->Getenv("TOCDB")) == TString("kTRUE") ) {
    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

  // load FRAME full misalignment objects (if needed, the macro
  // for FRAME has to be run in advance) and apply them to geometry
  AliCDBPath fpath("GRP","Align","Data");
  if ( TString(gSystem->Getenv("TOCDB")) == TString("kTRUE") ) {
    Info(macroname,"Loading FRAME alignment objects from CDB storage %s",
	 Storage.Data());
    AliCDBEntry *eFrame = storage->Get(fpath.GetPath(),cdb->GetRun());
  } else
    AliCDBEntry *eFrame = cdb->Get(fpath.GetPath());

  if (!eFrame)
    Fatal(macroname,"Could not get the specified CDB entry!");

  TClonesArray* arFrame = (TClonesArray*) eFrame->GetObject();
  arFrame->Sort();
  Int_t nvols = arFrame->GetEntriesFast();
  Bool_t flag = kTRUE;
  for(Int_t j=0; j<nvols; j++)
  {
    AliAlignObj* alobj = (AliAlignObj*) arFrame->UncheckedAt(j);
    if (alobj->ApplyToGeometry() == kFALSE) flag = kFALSE;
  }
  if (!flag)
    Fatal(macroname,"Error in the application of FRAME alignment objects");

  //Produce objects for TOF supermodules
  Int_t iIndex=0; //let all modules have index=0 in a layer with no LUT
  AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
  UShort_t dvoluid = AliGeomManager::LayerToVolUID(iLayer,iIndex); //dummy vol id 

  Int_t nSMTOF = 18;
  Int_t j=0;
  Double_t smdx, smdy, smdz=0., dpsi=0., dtheta, dphi=0.;
  TRandom *rnd   = new TRandom(2345);
  Double_t sigmatr = 0.4; // max shift in cm w.r.t. local ideal RS
  Double_t sigmarot = 0.06; // max rot in deg w.r.t. local ideal RS (~ 1 mrad)
  
  for (Int_t isect=0; isect<nSMTOF; isect++) {
    TString symname(Form("TOF/sm%02d",isect));
    smdx = rnd->Gaus(0.,sigmatr);
    smdy = rnd->Gaus(0.,sigmatr);
    dtheta = rnd->Gaus(0.,sigmarot);
    new((*array)[j++]) AliAlignObjParams(symname.Data(),
					 dvoluid,
					 smdx, smdy, smdz, dpsi, dtheta, dphi, kFALSE);
  }
  // Apply objects for TOF supermodules 
  Int_t smCounter=0;
  for (Int_t isect=0; isect<nSMTOF; isect++) {
    AliAlignObjParams* smobj = (AliAlignObjParams*)array->UncheckedAt(smCounter++);
    //Info(macroname,Form("Applying object for sector %d ",isect));
    if ( !smobj->ApplyToGeometry() )
      Fatal(macroname,Form("application of full misalignment object for sector %d failed!",isect));

  }

  //Produce objects for TOF strips (same sigmas as for residual misalignment)
  AliGeomManager::ELayerID idTOF = AliGeomManager::kTOF;
  Int_t strId=-1;

  Double_t sdx=0., sdy=0., sdz=0., sdpsi=0., sdtheta=0., sdphi=0.;
  //TRandom *rnds   = new TRandom(4357);
  sigmatr = 0.1; // max shift in cm w.r.t. local ideal RS

  Int_t nstrA=15;
  Int_t nstrB=19;
  Int_t nstrC=19;
  Int_t nSectors=18;
  Int_t nStrips=nstrA+2*nstrB+2*nstrC;
  Double_t cuty=0., cutz=0., cut=3*sigmatr;

  for (Int_t isect = 0; isect < nSectors; isect++) {
    for (Int_t istr = 1; istr <= nStrips; istr++) {
    switch (istr) {
    case 25:
    case 29:
    case 63:
    case 67:
      cuty = sigmatr*0.6;
      sdy  = AliMathBase::TruncatedGaus(0., sigmatr, cut, cuty);
      sdz  = AliMathBase::TruncatedGaus(0., sigmatr, cut);
      strId++;
      break;
      /*
    case 38:
      cuty = sigmatr*2.5;
      cutz = sigmatr*2.5;
      sdy  = AliMathBase::TruncatedGaus(0., sigmatr, cut, cuty);
      sdz  = AliMathBase::TruncatedGaus(0., sigmatr, cut, cutz);
      strId++;
      break;
    case 54:
      cuty = sigmatr*2.5;
      cutz = sigmatr*2.5;
      sdy  = AliMathBase::TruncatedGaus(0., sigmatr, cut, cuty);
      sdz  = AliMathBase::TruncatedGaus(0., sigmatr, cutz, cut);
      strId++;
      break;
      */
    default:
      sdy = AliMathBase::TruncatedGaus(0., sigmatr, cut);
      sdz = AliMathBase::TruncatedGaus(0., sigmatr, cut);
      strId++;
      break;
    }

    if ((isect==13 || isect==14 || isect==15) && (istr >= 39 && istr <= 53)) continue;
    new((*array)[j++]) AliAlignObjParams(AliGeomManager::SymName(idTOF,strId),
					 AliGeomManager::LayerToVolUID(idTOF,strId),
					 sdx, sdy, sdz, sdpsi, sdtheta, sdphi, kFALSE);
    }
  }

  if ( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ) {
    // save in file
    const char* filename = "TOFfullMisalignment.root";
    TFile f(filename,"RECREATE");
    if(!f){
      Error(macroname,"cannot open file for output\n");
      return;
    }
    Info(macroname,"Saving alignment objects in file %s", filename);
    f.cd();
    f.WriteObject(array,"TOFAlignObjs","kSingleKey");
    f.Close();
  } else {
    // save in CDB storage
    Info(macroname,"Saving alignment objects in CDB storage %s",
	 Storage.Data());
    AliCDBMetaData* md = new AliCDBMetaData();
    md->SetResponsible("Silvia Arcelli");
    md->SetComment("Full misalignment for TOF");
    md->SetAliRootVersion(gSystem->Getenv("ARVERSION"));
    AliCDBId id("TOF/Align/Data",0,AliCDBRunRange::Infinity());
    storage->Put(array,id,md);
  }

  array->Delete();

}

/*
Double_t LocalTruncatedGaus(Double_t mean, Double_t sigma, Double_t cutatL, Double_t cutatR)
{
  // return number generated according to a gaussian distribution N(mean,sigma) truncated at cutat
  //
  Double_t value;
  do{
    value=gRandom->Gaus(mean,sigma);
  }while(value-mean<-cutatL || value-mean>cutatR);
  return value;
}
*/
 MakeTOFFullMisAlignment.C:1
 MakeTOFFullMisAlignment.C:2
 MakeTOFFullMisAlignment.C:3
 MakeTOFFullMisAlignment.C:4
 MakeTOFFullMisAlignment.C:5
 MakeTOFFullMisAlignment.C:6
 MakeTOFFullMisAlignment.C:7
 MakeTOFFullMisAlignment.C:8
 MakeTOFFullMisAlignment.C:9
 MakeTOFFullMisAlignment.C:10
 MakeTOFFullMisAlignment.C:11
 MakeTOFFullMisAlignment.C:12
 MakeTOFFullMisAlignment.C:13
 MakeTOFFullMisAlignment.C:14
 MakeTOFFullMisAlignment.C:15
 MakeTOFFullMisAlignment.C:16
 MakeTOFFullMisAlignment.C:17
 MakeTOFFullMisAlignment.C:18
 MakeTOFFullMisAlignment.C:19
 MakeTOFFullMisAlignment.C:20
 MakeTOFFullMisAlignment.C:21
 MakeTOFFullMisAlignment.C:22
 MakeTOFFullMisAlignment.C:23
 MakeTOFFullMisAlignment.C:24
 MakeTOFFullMisAlignment.C:25
 MakeTOFFullMisAlignment.C:26
 MakeTOFFullMisAlignment.C:27
 MakeTOFFullMisAlignment.C:28
 MakeTOFFullMisAlignment.C:29
 MakeTOFFullMisAlignment.C:30
 MakeTOFFullMisAlignment.C:31
 MakeTOFFullMisAlignment.C:32
 MakeTOFFullMisAlignment.C:33
 MakeTOFFullMisAlignment.C:34
 MakeTOFFullMisAlignment.C:35
 MakeTOFFullMisAlignment.C:36
 MakeTOFFullMisAlignment.C:37
 MakeTOFFullMisAlignment.C:38
 MakeTOFFullMisAlignment.C:39
 MakeTOFFullMisAlignment.C:40
 MakeTOFFullMisAlignment.C:41
 MakeTOFFullMisAlignment.C:42
 MakeTOFFullMisAlignment.C:43
 MakeTOFFullMisAlignment.C:44
 MakeTOFFullMisAlignment.C:45
 MakeTOFFullMisAlignment.C:46
 MakeTOFFullMisAlignment.C:47
 MakeTOFFullMisAlignment.C:48
 MakeTOFFullMisAlignment.C:49
 MakeTOFFullMisAlignment.C:50
 MakeTOFFullMisAlignment.C:51
 MakeTOFFullMisAlignment.C:52
 MakeTOFFullMisAlignment.C:53
 MakeTOFFullMisAlignment.C:54
 MakeTOFFullMisAlignment.C:55
 MakeTOFFullMisAlignment.C:56
 MakeTOFFullMisAlignment.C:57
 MakeTOFFullMisAlignment.C:58
 MakeTOFFullMisAlignment.C:59
 MakeTOFFullMisAlignment.C:60
 MakeTOFFullMisAlignment.C:61
 MakeTOFFullMisAlignment.C:62
 MakeTOFFullMisAlignment.C:63
 MakeTOFFullMisAlignment.C:64
 MakeTOFFullMisAlignment.C:65
 MakeTOFFullMisAlignment.C:66
 MakeTOFFullMisAlignment.C:67
 MakeTOFFullMisAlignment.C:68
 MakeTOFFullMisAlignment.C:69
 MakeTOFFullMisAlignment.C:70
 MakeTOFFullMisAlignment.C:71
 MakeTOFFullMisAlignment.C:72
 MakeTOFFullMisAlignment.C:73
 MakeTOFFullMisAlignment.C:74
 MakeTOFFullMisAlignment.C:75
 MakeTOFFullMisAlignment.C:76
 MakeTOFFullMisAlignment.C:77
 MakeTOFFullMisAlignment.C:78
 MakeTOFFullMisAlignment.C:79
 MakeTOFFullMisAlignment.C:80
 MakeTOFFullMisAlignment.C:81
 MakeTOFFullMisAlignment.C:82
 MakeTOFFullMisAlignment.C:83
 MakeTOFFullMisAlignment.C:84
 MakeTOFFullMisAlignment.C:85
 MakeTOFFullMisAlignment.C:86
 MakeTOFFullMisAlignment.C:87
 MakeTOFFullMisAlignment.C:88
 MakeTOFFullMisAlignment.C:89
 MakeTOFFullMisAlignment.C:90
 MakeTOFFullMisAlignment.C:91
 MakeTOFFullMisAlignment.C:92
 MakeTOFFullMisAlignment.C:93
 MakeTOFFullMisAlignment.C:94
 MakeTOFFullMisAlignment.C:95
 MakeTOFFullMisAlignment.C:96
 MakeTOFFullMisAlignment.C:97
 MakeTOFFullMisAlignment.C:98
 MakeTOFFullMisAlignment.C:99
 MakeTOFFullMisAlignment.C:100
 MakeTOFFullMisAlignment.C:101
 MakeTOFFullMisAlignment.C:102
 MakeTOFFullMisAlignment.C:103
 MakeTOFFullMisAlignment.C:104
 MakeTOFFullMisAlignment.C:105
 MakeTOFFullMisAlignment.C:106
 MakeTOFFullMisAlignment.C:107
 MakeTOFFullMisAlignment.C:108
 MakeTOFFullMisAlignment.C:109
 MakeTOFFullMisAlignment.C:110
 MakeTOFFullMisAlignment.C:111
 MakeTOFFullMisAlignment.C:112
 MakeTOFFullMisAlignment.C:113
 MakeTOFFullMisAlignment.C:114
 MakeTOFFullMisAlignment.C:115
 MakeTOFFullMisAlignment.C:116
 MakeTOFFullMisAlignment.C:117
 MakeTOFFullMisAlignment.C:118
 MakeTOFFullMisAlignment.C:119
 MakeTOFFullMisAlignment.C:120
 MakeTOFFullMisAlignment.C:121
 MakeTOFFullMisAlignment.C:122
 MakeTOFFullMisAlignment.C:123
 MakeTOFFullMisAlignment.C:124
 MakeTOFFullMisAlignment.C:125
 MakeTOFFullMisAlignment.C:126
 MakeTOFFullMisAlignment.C:127
 MakeTOFFullMisAlignment.C:128
 MakeTOFFullMisAlignment.C:129
 MakeTOFFullMisAlignment.C:130
 MakeTOFFullMisAlignment.C:131
 MakeTOFFullMisAlignment.C:132
 MakeTOFFullMisAlignment.C:133
 MakeTOFFullMisAlignment.C:134
 MakeTOFFullMisAlignment.C:135
 MakeTOFFullMisAlignment.C:136
 MakeTOFFullMisAlignment.C:137
 MakeTOFFullMisAlignment.C:138
 MakeTOFFullMisAlignment.C:139
 MakeTOFFullMisAlignment.C:140
 MakeTOFFullMisAlignment.C:141
 MakeTOFFullMisAlignment.C:142
 MakeTOFFullMisAlignment.C:143
 MakeTOFFullMisAlignment.C:144
 MakeTOFFullMisAlignment.C:145
 MakeTOFFullMisAlignment.C:146
 MakeTOFFullMisAlignment.C:147
 MakeTOFFullMisAlignment.C:148
 MakeTOFFullMisAlignment.C:149
 MakeTOFFullMisAlignment.C:150
 MakeTOFFullMisAlignment.C:151
 MakeTOFFullMisAlignment.C:152
 MakeTOFFullMisAlignment.C:153
 MakeTOFFullMisAlignment.C:154
 MakeTOFFullMisAlignment.C:155
 MakeTOFFullMisAlignment.C:156
 MakeTOFFullMisAlignment.C:157
 MakeTOFFullMisAlignment.C:158
 MakeTOFFullMisAlignment.C:159
 MakeTOFFullMisAlignment.C:160
 MakeTOFFullMisAlignment.C:161
 MakeTOFFullMisAlignment.C:162
 MakeTOFFullMisAlignment.C:163
 MakeTOFFullMisAlignment.C:164
 MakeTOFFullMisAlignment.C:165
 MakeTOFFullMisAlignment.C:166
 MakeTOFFullMisAlignment.C:167
 MakeTOFFullMisAlignment.C:168
 MakeTOFFullMisAlignment.C:169
 MakeTOFFullMisAlignment.C:170
 MakeTOFFullMisAlignment.C:171
 MakeTOFFullMisAlignment.C:172
 MakeTOFFullMisAlignment.C:173
 MakeTOFFullMisAlignment.C:174
 MakeTOFFullMisAlignment.C:175
 MakeTOFFullMisAlignment.C:176
 MakeTOFFullMisAlignment.C:177
 MakeTOFFullMisAlignment.C:178
 MakeTOFFullMisAlignment.C:179
 MakeTOFFullMisAlignment.C:180
 MakeTOFFullMisAlignment.C:181
 MakeTOFFullMisAlignment.C:182
 MakeTOFFullMisAlignment.C:183
 MakeTOFFullMisAlignment.C:184
 MakeTOFFullMisAlignment.C:185
 MakeTOFFullMisAlignment.C:186
 MakeTOFFullMisAlignment.C:187
 MakeTOFFullMisAlignment.C:188
 MakeTOFFullMisAlignment.C:189
 MakeTOFFullMisAlignment.C:190
 MakeTOFFullMisAlignment.C:191
 MakeTOFFullMisAlignment.C:192
 MakeTOFFullMisAlignment.C:193
 MakeTOFFullMisAlignment.C:194