ROOT logo
#include "AliMFTCluster.h"
#include "TFile.h"
#include "AliMFTCluster.h"
#include "TObjArray.h"
#include "TClonesArray.h"
#include "TTree.h"
#include "AliMFTConstants.h"
#include "TBranch.h"
#include "TRandom.h"

TFile *fileIn=0, *fileOut=0;

const Int_t labelMCOffset = 1000000;
Double_t misalignmentX[AliMFTConstants::fNMaxPlanes] = {0};
Double_t misalignmentY[AliMFTConstants::fNMaxPlanes] = {0};

//====================================================================================================================================================

void AddMisalignmentToClusters(Char_t *nameDir=".",
			       Int_t seed = 12345,
			       Double_t misalignment = 0.0015) {

  gRandom -> SetSeed(seed);

  TClonesArray *fRecPointsPerPlaneIn[AliMFTConstants::fNMaxPlanes] = {0};
  TClonesArray *fRecPointsPerPlaneOut[AliMFTConstants::fNMaxPlanes] = {0};

  fileIn = new TFile(Form("%s/MFT.RecPoints.root",nameDir));
  fileOut = new TFile(Form("%s/MFT.RecPoints.Misaligned.root",nameDir), "recreate");
  
  Int_t iEv=0;
  while (fileIn->cd(Form("Event%d",iEv))) {

    for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) {
      fRecPointsPerPlaneIn[iPlane] = new TClonesArray("AliMFTCluster");
      fRecPointsPerPlaneOut[iPlane] = new TClonesArray("AliMFTCluster");
    }

    printf("Event %d\n",iEv);
    TTree *treeIn = (TTree*) gDirectory->Get("TreeR");
    treeIn -> SetName("TreeR_In");
    fileOut-> cd();
    TTree *treeOut = new TTree("TreeR", "Reconstructed Points Container");

    Int_t iPlane=0;
    while (treeIn->GetBranch(Form("Plane_%02d",iPlane))) {
      //      printf("Plane %02d\n",iPlane);
      Double_t misalignmentPhi = 2.*TMath::Pi()*gRandom->Rndm();
      misalignmentX[iPlane] = misalignment*TMath::Cos(misalignmentPhi);
      misalignmentY[iPlane] = misalignment*TMath::Sin(misalignmentPhi);
      treeIn ->SetBranchAddress(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneIn[iPlane]));
      treeOut->Branch(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneOut[iPlane])); 
      //      treeOut->SetBranchAddress(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneOut[iPlane]));
      iPlane++;
    }

    iPlane=0;
    treeIn -> GetEntry(0);
    while (treeIn->GetBranch(Form("Plane_%02d",iPlane))) {
      Int_t nClusters = fRecPointsPerPlaneIn[iPlane]->GetEntries();
      for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
	//	printf("Cluster %4d\n",iCluster);
	AliMFTCluster *newCluster = (AliMFTCluster*) fRecPointsPerPlaneIn[iPlane]->At(iCluster);
	newCluster->SetClusterEditable(kTRUE);
	newCluster->SetX(newCluster->GetX()+misalignmentX[iPlane]);
	newCluster->SetY(newCluster->GetY()+misalignmentY[iPlane]);
	new ((*fRecPointsPerPlaneOut[iPlane])[fRecPointsPerPlaneOut[iPlane]->GetEntries()]) AliMFTCluster(*newCluster);
      }
      iPlane++;
    }

    treeOut -> Fill();
    fileOut -> mkdir(Form("Event%d",iEv));
    fileOut -> cd(Form("Event%d",iEv));
    treeOut -> Write();
    for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) {
      delete fRecPointsPerPlaneIn[jPlane];
      delete fRecPointsPerPlaneOut[jPlane];
    }

    iEv++;

  }

  fileOut -> Close();

}

//====================================================================================================================================================
 AddMisalignmentToClusters.C:1
 AddMisalignmentToClusters.C:2
 AddMisalignmentToClusters.C:3
 AddMisalignmentToClusters.C:4
 AddMisalignmentToClusters.C:5
 AddMisalignmentToClusters.C:6
 AddMisalignmentToClusters.C:7
 AddMisalignmentToClusters.C:8
 AddMisalignmentToClusters.C:9
 AddMisalignmentToClusters.C:10
 AddMisalignmentToClusters.C:11
 AddMisalignmentToClusters.C:12
 AddMisalignmentToClusters.C:13
 AddMisalignmentToClusters.C:14
 AddMisalignmentToClusters.C:15
 AddMisalignmentToClusters.C:16
 AddMisalignmentToClusters.C:17
 AddMisalignmentToClusters.C:18
 AddMisalignmentToClusters.C:19
 AddMisalignmentToClusters.C:20
 AddMisalignmentToClusters.C:21
 AddMisalignmentToClusters.C:22
 AddMisalignmentToClusters.C:23
 AddMisalignmentToClusters.C:24
 AddMisalignmentToClusters.C:25
 AddMisalignmentToClusters.C:26
 AddMisalignmentToClusters.C:27
 AddMisalignmentToClusters.C:28
 AddMisalignmentToClusters.C:29
 AddMisalignmentToClusters.C:30
 AddMisalignmentToClusters.C:31
 AddMisalignmentToClusters.C:32
 AddMisalignmentToClusters.C:33
 AddMisalignmentToClusters.C:34
 AddMisalignmentToClusters.C:35
 AddMisalignmentToClusters.C:36
 AddMisalignmentToClusters.C:37
 AddMisalignmentToClusters.C:38
 AddMisalignmentToClusters.C:39
 AddMisalignmentToClusters.C:40
 AddMisalignmentToClusters.C:41
 AddMisalignmentToClusters.C:42
 AddMisalignmentToClusters.C:43
 AddMisalignmentToClusters.C:44
 AddMisalignmentToClusters.C:45
 AddMisalignmentToClusters.C:46
 AddMisalignmentToClusters.C:47
 AddMisalignmentToClusters.C:48
 AddMisalignmentToClusters.C:49
 AddMisalignmentToClusters.C:50
 AddMisalignmentToClusters.C:51
 AddMisalignmentToClusters.C:52
 AddMisalignmentToClusters.C:53
 AddMisalignmentToClusters.C:54
 AddMisalignmentToClusters.C:55
 AddMisalignmentToClusters.C:56
 AddMisalignmentToClusters.C:57
 AddMisalignmentToClusters.C:58
 AddMisalignmentToClusters.C:59
 AddMisalignmentToClusters.C:60
 AddMisalignmentToClusters.C:61
 AddMisalignmentToClusters.C:62
 AddMisalignmentToClusters.C:63
 AddMisalignmentToClusters.C:64
 AddMisalignmentToClusters.C:65
 AddMisalignmentToClusters.C:66
 AddMisalignmentToClusters.C:67
 AddMisalignmentToClusters.C:68
 AddMisalignmentToClusters.C:69
 AddMisalignmentToClusters.C:70
 AddMisalignmentToClusters.C:71
 AddMisalignmentToClusters.C:72
 AddMisalignmentToClusters.C:73
 AddMisalignmentToClusters.C:74
 AddMisalignmentToClusters.C:75
 AddMisalignmentToClusters.C:76
 AddMisalignmentToClusters.C:77
 AddMisalignmentToClusters.C:78
 AddMisalignmentToClusters.C:79
 AddMisalignmentToClusters.C:80
 AddMisalignmentToClusters.C:81
 AddMisalignmentToClusters.C:82
 AddMisalignmentToClusters.C:83
 AddMisalignmentToClusters.C:84
 AddMisalignmentToClusters.C:85
 AddMisalignmentToClusters.C:86
 AddMisalignmentToClusters.C:87
 AddMisalignmentToClusters.C:88
 AddMisalignmentToClusters.C:89
 AddMisalignmentToClusters.C:90