ROOT logo

void MakePipeMisalignment(Int_t inputRun=0,
			  const char* ocdbPath="local://$ALICE_ROOT/OCDB",
			  Bool_t verbose=true, 
			  const char* outFileName=0)
{
  // Creates misalignment of the beam pipe, frame and FMD2&3.
  // 
  // The misalignment is based on the ITS global alignment object with
  // the exception of the beam pipe where only the translations are
  // used ignoring the rotation matrix.
  AliCDBManager* cdb = AliCDBManager::Instance();
  cdb->SetDefaultStorage("alien://Folder=/alice/data/2010/OCDB");
  cdb->SetRun(inputRun);


  // Get the geometry 
  AliGeomManager::LoadGeometry();

  // Get ITS alignment 
  AliCDBEntry* itsEntry = cdb->Get("ITS/Align/Data");
  if (!itsEntry) { 
    Error("MakePipeMisalignment", "Couldn't get ITS alignment data");
    return;
  } 
  TClonesArray* itsArray = static_cast<TClonesArray*>(itsEntry->GetObject());
  if (!itsArray) { 
    Error("MakePipeMisalignment", "No array in CDB entry");
    return;
  }
  AliAlignObjParams* itsAlign = 
    static_cast<AliAlignObjParams*>(itsArray->At(0));
  if (!itsAlign) { 
    Error("MakePipeMisalignment", "No alignment object in CDB entry");
    return;
  }
  
  if (verbose) {
    Info("MakePipeMisalignment", "ITS alignment:");
    itsAlign->Print();
  }

  Double_t itsTrans[3];
  Double_t itsRot[3];
  itsAlign->GetTranslation(itsTrans);
  itsAlign->GetAngles(itsRot);

  Double_t local[] = { 0, 0, 0 };

  if (!gGeoManager->cd("/ALIC_1/CP_1/Cp1_1/CpSupC_1")) return;
  Double_t pCpSupCA[3];
  gGeoManager->LocalToMaster(local, pCpSupCA);

  if (!gGeoManager->cd("/ALIC_1/CP_1/Cp3_1/CpSupC_3")) return;
  Double_t pCpSupCC[3];
  gGeoManager->LocalToMaster(local, pCpSupCC);

  if (!gGeoManager->cd("/ALIC_1/CP_1/Cp1_1")) return;
  Double_t pCp1[3];
  gGeoManager->LocalToMaster(local, pCp1);

  if (!gGeoManager->cd("/ALIC_1/CP_1/Cp1_1/CP1MO_1/CP1AT_1")) return;
  do { 
    TGeoNode* node = gGeoManager->GetCurrentNode();
    if (!node) break;
    TGeoVolume* volume = node->GetVolume();
    if (!volume) break;
    TGeoBBox* bbox = static_cast<TGeoBBox*>(volume->GetShape());
    if (!bbox) break;
    local[2] = -bbox->GetDZ();
  } while (false);
  if (local[2] == 0) { 
    Error("MakePipeMisalignement", "Failed to find end of CP1 section");
    return;
  }
  Double_t pCP1AT[3];
  gGeoManager->LocalToMaster(local, pCP1AT);


  
  // Now, we need to misalign the C-side collar according to the ITS
  // misalignment. 
  TGeoHMatrix* itsMat = new TGeoHMatrix();
  itsAlign->GetMatrix(*itsMat);
  // itsTrans[2] = 0;
  // itsMat->SetTranslation(itsTrans);
  Double_t tCpSupCA[3];
  itsMat->LocalToMaster(pCpSupCA, tCpSupCA);
  Double_t tCpSupCC[3];
  itsMat->LocalToMaster(pCpSupCC, tCpSupCC);

  Info("MakePipeMisalignment", "\n"
       "\tCollar A-side       (%f,%f,%f)\n" 
       "\tCollar C-side       (%f,%f,%f)\n"
       "\tBeam pipe center    (%f,%f,%f)\n"
       "\tEnd of CP1 A-side   (%f,%f,%f)\n"
       "\tCollar A-side after (%f,%f,%f)\n" 
       "\tCollar C-side after (%f,%f,%f)", 
       pCpSupCA[0], pCpSupCA[1], pCpSupCA[2],
       pCpSupCC[0], pCpSupCC[1], pCpSupCC[2],
       pCp1[0],     pCp1[1],     pCp1[2],
       pCP1AT[0],   pCP1AT[1],   pCP1AT[2],
       tCpSupCA[0], tCpSupCA[1], tCpSupCA[2],
       tCpSupCC[0], tCpSupCC[1], tCpSupCC[2]);
  
  // Distance from A-side end to mis-aligned C-side Collar
  Double_t dX = - tCpSupCC[0] + pCP1AT[0] ;
  Double_t dY = - tCpSupCC[1] + pCP1AT[1] ;
  Double_t dZ = - tCpSupCC[2] + pCP1AT[2] ;
  
  // Rotation angle around X and Y
  Double_t rotX = TMath::ATan2(dY, dZ);
  Double_t rotY = TMath::ATan2(dX, dZ);

  
  Double_t dZc = pCp1[2] - pCP1AT[2];
  Double_t dXc = TMath::Tan(rotY) * dZc;
  Double_t dYc = TMath::Tan(rotX) * dZc;


  Double_t dZt = pCpSupCC[2] - pCP1AT[2] + itsTrans[2];

  Info("MakePipeMisalignment", "\n"       
       "\tDistances (%f,%f,%f)\n" 
       "\trotX=%f rotY=%f\n" 
       "\tCP1     displacement (x,y)=(%f,%f) dZ=%f\n"
       "\tCpSubCA displacement (x,y)=(%f,%f) dZ=%f",
       dX, dY, dZ,
       rotX * TMath::RadToDeg(), rotY * TMath::RadToDeg(),
       dXc, dYc, dZc,
       TMath::Tan(rotY)*dZt, TMath::Tan(rotX)*dZt, dZt);


  TGeoRotation* rot = new TGeoRotation();
  rot->RotateX(rotX*TMath::RadToDeg());
  rot->RotateY(rotY*TMath::RadToDeg());
  TGeoCombiTrans* trans = new TGeoCombiTrans(dXc, dYc, 0, rot);
  trans->Print();

  // Output array 
  TClonesArray* structArray = new TClonesArray("AliAlignObjParams", 20);

  //dummy vol id
  UShort_t dvoluid = 
    AliGeomManager::LayerToVolUID(AliGeomManager::kInvalidLayer,0); 

  //base of symbolic name corresponding to base of path "ALIC_1/B077_1/BSEGMO";
  const char* baseSymName = "FRAME/Sector"; 
  for(Int_t sm=0; sm<18; sm++){
    TString symname =  baseSymName;
    symname         += sm;
    new((*structArray)[sm]) AliAlignObjParams(symname.Data(),dvoluid,
					     0.,0.,0.,0.,0.,0.,kTRUE);
  }
   
  // --- Beam pipe ---------------------------------------------------
  AliAlignObjParams* c1Align = 
    new((*structArray)[18]) AliAlignObjParams("CP1",dvoluid,
					      dXc, dYc, 0, rotX, rotY, 0,kTRUE);
  c1Align->Print();

  // --- C side Collar -----------------------------------------------
  AliAlignObjParams* cSupCAlign = 
    new((*structArray)[19]) AliAlignObjParams("CPSUPC",
					      dvoluid, 
					      tCpSupCC[0]-pCpSupCC[0], 
					      tCpSupCC[1]-pCpSupCC[1], 
					      tCpSupCC[2]-pCpSupCC[2], 
					      0, 0, 0, kTRUE);
  cSupCAlign->Print();
  
  // --- save in CDB storage -----------------------------------------
  Info("MakeForwardMisAlignment",
       "Saving alignment objects in CDB storage %s", ocdbPath);
  AliCDBStorage* storage = cdb->GetStorage(ocdbPath);
  if (!storage){
    Error("MakeForwardMisAlignment","Unable to open storage %s\n",ocdbPath);
    return;
  }


  // --- Make objects and store --------------------------------------
  AliCDBMetaData* md = new AliCDBMetaData();
  md->SetResponsible("Grosso Raffaele");
  md->SetComment("Misalignment for FRAME and beam pipe");
  md->SetAliRootVersion(gSystem->Getenv("ARVERSION"));
  AliCDBId id("GRP/Align/Data",0,AliCDBRunRange::Infinity());
  storage->Put(structArray,id,md);

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