ROOT logo
/**************************************************************************
 * 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 PMD. 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.
//
// 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 
//========================================================================

#include "AliPMDMisAligner.h"
#include "AliGeomManager.h"
#include "TClonesArray.h"
#include "TRandom.h"
#include "AliAlignObjParams.h"
#include "AliLog.h"

ClassImp(AliPMDMisAligner)

    //_______________________________________________________________________________________
AliPMDMisAligner::AliPMDMisAligner() : AliMisAligner()
{
    //
    // dummy constructor
    //
}

//_______________________________________________________________________________________
TClonesArray* AliPMDMisAligner::MakeAlObjsArray() {
    // builds and returns the array of alignment objects
    // according to the spcified misalignment scenario
    // ("ideal", "residual" or "full").
    //
    TClonesArray *array = new TClonesArray("AliAlignObjParams",4);
    TClonesArray &alobj = *array;

    Double_t max_trans=0.1; // maximun shifts in X,Y,Z  in centimeters
    Double_t max_rot=0.1;   // maximum shifts in angles in degrees

    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=0., dy14=0., dz14=0.;          // Misalignment in X,Y and Z
    Double_t dpsi14=0., dtheta14=0., dphi14=0.; //  Angular displacements
    //Sectors 2 and 3
    Double_t dx23=0., dy23=0., dz23=0.;          // Misalignment in X,Y and Z
    Double_t dpsi23=0., dtheta23=0., dphi23=0.; //  Angular displacements

    UShort_t iIndex=0; // PMD is not indexed
    AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
    UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);
  
    gRandom->SetSeed(4357);
  
    if(TString(GetMisalType())=="ideal")
    {

	Double_t dx=0., dy=0., dz=0., dpsi=0., dtheta=0., dphi=0.;

	for(Int_t i=0; i<4; i++){
	    TString snSector(Form("PMD/Sector%d",i+1));
	    new(alobj[i]) AliAlignObjParams(snSector.Data(), volid, dx, dy, dz, dpsi, dtheta, dphi, kTRUE);
	}

    }else if(TString(GetMisalType())=="residual" || TString(GetMisalType())=="full"){
	if(!AliGeomManager::GetGeometry())
	{
	    AliError("No geometry loaded into AliGeomManager! Returning null pointer!");
	    return 0;
	}

	// For sectors 1 and 4
	// Translation displacement
	dx14     = (gRandom->Uniform()-0.5)*max_trans;
	dy14     = (gRandom->Uniform()-0.5)*max_trans;
	dz14     = (gRandom->Uniform()-0.5)*max_trans;
	//Rotation angles
	dpsi14   = (gRandom->Uniform()-0.5)*max_rot;
	dtheta14 = (gRandom->Uniform()-0.5)*max_rot;
	dphi14   = (gRandom->Uniform()-0.5)*max_rot;

	// For sectors 2 and 3
	// Translation displacement
	dx23     = (gRandom->Uniform()-0.5)*max_trans;
	dy23     = (gRandom->Uniform()-0.5)*max_trans;
	dz23     = (gRandom->Uniform()-0.5)*max_trans;
	//Rotation angles
	dpsi23   = (gRandom->Uniform()-0.5)*max_rot;
	dtheta23 = (gRandom->Uniform()-0.5)*max_rot;
	dphi23   = (gRandom->Uniform()-0.5)*max_rot;

	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);

    }else{
	AliError(Form("\"%s\" is not a valid identifier for misalignment types. Exiting ...",GetMisalType()));
	return 0;
    }

    return array;
}

//_______________________________________________________________________________________
AliCDBMetaData* AliPMDMisAligner::GetCDBMetaData() const {
    // Returns the comment and responsible for the
    // AliCDBMetaData to be associated with the OCDB entry
    // containing the PMD array of misalignment objects
    //
    AliCDBMetaData* md = new AliCDBMetaData();
    md->SetResponsible("");

    if(TString(GetMisalType())=="ideal")
	md->SetComment("Alignment objects for PMD ideal misalignment");
    if(TString(GetMisalType())=="residual")
	md->SetComment("Alignment objects for PMD residual misalignment");
    if(TString(GetMisalType())=="full")
	md->SetComment("Alignment objects for PMD full misalignment");

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