--- /dev/null
+/**************************************************************************
+ * Copyright(c) 2007-2010, 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. *
+ **************************************************************************/
+
+//========================================================================
+//
+// This class generates misalignment for HMPID. In particular it defines
+// the misalignment in the three canonical scenarios: "ideal", "residual"
+// and "full".
+// It is meant to be run standalone or from the steering macro
+// $ALICE_ROOT/macros/MakeAlignmentObjs.C
+// looping on the detectors.
+//
+//========================================================================
+
+#include "AliHMPIDMisAligner.h"
+#include "AliGeomManager.h"
+#include "TClonesArray.h"
+#include "TRandom.h"
+#include "TMath.h"
+#include "AliAlignObjMatrix.h"
+#include "AliLog.h"
+
+ClassImp(AliHMPIDMisAligner)
+
+//_______________________________________________________________________________________
+AliHMPIDMisAligner::AliHMPIDMisAligner() : AliMisAligner()
+{
+ //
+ // dummy constructor
+ //
+}
+
+//_______________________________________________________________________________________
+TClonesArray* AliHMPIDMisAligner::MakeAlObjsArray() {
+ // builds and returns the array of alignment objects
+ // according to the spcified misalignment scenario
+ // ("ideal", "residual" or "full").
+ //
+ if(!AliGeomManager::GetGeometry())
+ {
+ AliError("No geometry loaded into AliGeomManager! Returning null pointer!");
+ return 0;
+ }
+
+ TClonesArray *array = new TClonesArray("AliAlignObjMatrix",7);
+
+ AliGeomManager::ELayerID idHMPID = AliGeomManager::kHMPID;
+ Double_t sigmaTrans, sigmaRotPsi, sigmaRotTheta, sigmaRotPhi;
+ Double_t dX=0., dY=0., dZ=0., dPsi=0., dTheta=0., dPhi=0.; //displacements
+
+ // TRandom *pRnd = new TRandom(4357);
+ gRandom->SetSeed(4357);
+
+ if(TString(GetMisalType())=="ideal")
+ {
+
+ for (Int_t iCh = 0; iCh < 7; iCh++) {
+ new((*array)[iCh]) AliAlignObjMatrix(AliGeomManager::SymName(idHMPID,iCh),
+ AliGeomManager::LayerToVolUID(idHMPID,iCh),dX,dY,dZ,dPsi,dTheta,dPhi,kTRUE);
+ }
+
+ }else if( TString(GetMisalType())=="residual" || TString(GetMisalType())=="full"){
+
+ sigmaTrans=4.; // 4 cm
+ sigmaRotPsi = 0.2; // degrees
+ sigmaRotTheta = 1.0; // degrees
+ sigmaRotPhi = 0.5; // degrees
+
+ for (Int_t iCh = 0; iCh < 7; iCh++) {
+
+ /*dX = 2 - 2.1*gRandom->Uniform();
+ dY = 2 - 2.1*gRandom->Uniform();
+ dZ = 2.0 - 4*gRandom->Uniform();
+ dPsi = 0.1 - 0.2*gRandom->Uniform();
+ dTheta = 1 - 1.1*gRandom->Uniform();
+ dPhi = 0.25 - 0.5*gRandom->Uniform();*/
+
+ dX = sigmaTrans/2 - (sigmaTrans/2+0.1)*gRandom->Uniform(); // -0.1 <---> 2 cm
+ dY = sigmaTrans/2 - (sigmaTrans/2+0.1)*gRandom->Uniform(); // -0.1 <---> 2 cm
+ dZ = (gRandom->Uniform() - 0.5)*sigmaTrans; // -2.0 <---> 2 cm
+ dPsi = (gRandom->Uniform() - 0.5)*sigmaRotPsi; // -0.1 <---> 0.1 degree
+ dTheta = sigmaRotTheta - (sigmaRotTheta+0.1)*gRandom->Uniform(); // -0.1 <---> 1.0 degree
+ dPhi = (gRandom->Uniform() - 0.5)*sigmaRotPhi; // -0.25 <---> 0.25 degree
+
+
+ // dX = (pRnd->Uniform()-0.5)*sigmaTrans; dY = (pRnd->Uniform()-0.5)*sigmaTrans; dZ = (pRnd->Uniform()-0.5)*sigmaTrans;
+ // dPsi = (pRnd->Uniform()-0.5)*sigmaRot; dTheta = (pRnd->Uniform()-0.5)*sigmaRot; dPhi = (pRnd->Uniform()-0.5)*sigmaRot;
+ new((*array)[iCh]) AliAlignObjMatrix(AliGeomManager::SymName(idHMPID,iCh),
+ AliGeomManager::LayerToVolUID(idHMPID,iCh),dX,dY,dZ,dPsi,dTheta,dPhi,kTRUE);
+ }
+ }else{
+ AliError(Form("\"%s\" is not a valid identifier for misalignment types. Exiting ...",GetMisalType()));
+ return 0;
+ }
+
+ return array;
+}
+
+//_______________________________________________________________________________________
+AliCDBMetaData* AliHMPIDMisAligner::GetCDBMetaData() const {
+ // Returns the comment and responsible for the
+ // AliCDBMetaData to be associated with the OCDB entry
+ // containing the HMPID array of misalignment objects
+ //
+ AliCDBMetaData* md = new AliCDBMetaData();
+ md->SetResponsible("HMPID expert means nothing");
+
+ if(TString(GetMisalType())=="ideal")
+ md->SetComment("Alignment objects for HMPID ideal misalignment");
+ if(TString(GetMisalType())=="residual")
+ md->SetComment("Alignment objects for HMPID residual misalignment");
+ if(TString(GetMisalType())=="full")
+ md->SetComment("Full misalignment objects for HMPID produced with sigmaTrans=1mm and sigmaRot=1mrad");
+
+ return md;
+}