ROOT logo
#include "ARVersion.h"

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "TSystem.h"
#include "TROOT.h"
#include "TGeoManager.h"
#include "TObjString.h"
#include "TClonesArray.h"
#include "TError.h"
#include "AliGeomManager.h"
#include "AliCDBManager.h"
#include "AliCDBStorage.h"
#include "AliCDBPath.h"
#include "AliCDBEntry.h"
#include "AliCDBId.h"
#include "AliCDBMetaData.h"
#include "AliMisAligner.h"
#include "AliHMPIDMisAligner.h"
#include "AliITSMisAligner.h"
#include "AliPMDMisAligner.h"
#include "AliT0MisAligner.h"
#include "AliVZEROMisAligner.h"
#include "AliZDCMisAligner.h"
#include <TString.h>
#endif

void MakeAlignmentObjs(const char* detList="ALL", const char* ocdbOrDir = "local://$HOME/ResidualMisAlignment", const char* misalType="residual", Bool_t partialGeom=kFALSE){
	// Make alignment objects for all detectors listed in "detList"
	// for the misalignment scenario passed as argument "misalType".
	// "ocdbUriDirPath" argument is used as URI for an OCDB if it contains
	// either the string "local;//" or the string "alien://folder=",
	// otherwise it is used as the path of the directory where to
	// put the files containing the alignment objects.
	// The geometry used is the one produced with $ALICE_ROOT/macros/Config.C
	// unless "partialGeom" is set to true (=> $ALICE_ROOT/test/fpprod/Config.C).
	//

	const char* macroName = "MakeAlignmentObjs";
	Bool_t toOCDB = kFALSE;
	TString fileName("");
	TString ocdbUriDirPath(ocdbOrDir);
	if(ocdbUriDirPath.IsNull() || ocdbUriDirPath.IsWhitespace())
	{
		Error(macroName, "Output undefined! Set it either to a valid OCDB storage or to the output directory!");
		return;
	}else if(ocdbUriDirPath.Contains("local://") || ocdbUriDirPath.Contains("alien://folder=")){
		// else ocdbUriDirPath is to be interpreted as an OCDB URI
		toOCDB=kTRUE;
		Printf("Objects will be saved in the OCDB %s",ocdbUriDirPath.Data());  
	}else{ // else ocdbUriDirPath is to be interpreted as a directory path
		gSystem->ExpandPathName(ocdbUriDirPath);
		if(gSystem->AccessPathName(ocdbUriDirPath.Data()))
		{
			Printf("Directory \"%s\" where to save files does not yet exist! ... exiting!",ocdbUriDirPath.Data());
			return;
		}else{
			Printf("Files with alignment objects will be saved in the directory %s",ocdbUriDirPath.Data());  
		}
	}

	TMap misAligners;
	TString modList(detList);
	if(modList=="ALL") modList="HMPID ITS PMD T0 VZERO ZDC";
	Info(macroName, "Processing detectors: %s \n", modList.Data());
	Printf("Creating %s misalignment for detectors: %s \n", misalType, modList.Data());
	if(modList.Contains("HMPID")){
		AliHMPIDMisAligner* misAlignerHMPID = new AliHMPIDMisAligner();
		misAligners.Add(new TObjString("HMPID"), misAlignerHMPID);
	}
	if(modList.Contains("ITS")){
		AliITSMisAligner* misAlignerITS = new AliITSMisAligner();
		misAligners.Add(new TObjString("ITS"), misAlignerITS);
	}
	if(modList.Contains("PMD")){
		AliPMDMisAligner* misAlignerPMD = new AliPMDMisAligner();
		misAligners.Add(new TObjString("PMD"), misAlignerPMD);
	}
	if(modList.Contains("T0")){
		AliT0MisAligner* misAlignerT0 = new AliT0MisAligner();
		misAligners.Add(new TObjString("T0"), misAlignerT0);
	}
	// AliTPCMisAligner is in libTPCcalib, not loaded by default, so let it out for the moment
	//if(modList.Contains("TPC")){
	//	AliTPCMisAligner* misAlignerTPC = new AliTPCMisAligner();
	//	misAligners.Add(new TObjString("TPC"), misAlignerTPC);
	//}
	if(modList.Contains("VZERO")){
		AliVZEROMisAligner* misAlignerVZERO = new AliVZEROMisAligner();
		misAligners.Add(new TObjString("VZERO"), misAlignerVZERO);
	}
	if(modList.Contains("ZDC")){
		AliZDCMisAligner* misAlignerZDC = new AliZDCMisAligner();
		misAligners.Add(new TObjString("ZDC"), misAlignerZDC);
	}

	// Load geometry from OCDB; update geometry before loading it if we are going to load
	// the alignment objects to the OCDB
	AliCDBManager* cdb = AliCDBManager::Instance();
	if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
	cdb->SetRun(0);
	AliCDBStorage* storage = 0;

	if(!toOCDB || TString(detList)!="ALL"){ //if we produce the objects into a file or just for some detectors
		AliGeomManager::LoadGeometry(); //load geom from default OCDB storage without remaking it
	}else{ // if we produce the objects in a OCDB storage
		// update geometry in it
		Info(macroName, "Updating geometry in OCDB storage %s",ocdbUriDirPath.Data());
		gROOT->ProcessLine(".L $ALICE_ROOT/GRP/UpdateCDBIdealGeom.C");
		if(partialGeom){
			UpdateCDBIdealGeom(ocdbUriDirPath.Data(),"$ALICE_ROOT/test/fpprod/Config.C");
		}else{
			UpdateCDBIdealGeom(ocdbUriDirPath.Data(),"$ALICE_ROOT/macros/Config.C");
		}

		AliGeomManager::SetGeometry(gGeoManager);
	}

	// run macro for non-sensitive modules
	// (presently generates only FRAME alignment objects)
	// gSystem->Exec("aliroot -b -q $ALICE_ROOT/GRP/MakeSTRUCTResMisAlignment.C"); !!!!!!!!!!!!!!!!!!!!!!!!!

	// run macros for sensitive modules
	TObjString *ostr;
	TString strId;
	TClonesArray* objsArray = 0;

	TObjArray *detArray = modList.Tokenize(' ');
	TIter iter(detArray);

	while((ostr = (TObjString*) iter.Next())){
		TString str(ostr->String()); // DET
		Printf("\n   ----  Making alignment objects for \"%s\"  ----",str.Data());
		TString arName(str.Data());  // name of the array in case saved into the file
		arName += "AlignObjs";
		if(gGeoManager->IsLocked()) gGeoManager->UnlockGeometry();

		AliMisAligner* misAligner = dynamic_cast<AliMisAligner*> (misAligners.GetValue(str));
		if(!misAligner){
			Printf("Misaligner for %s was not instantiated",str.Data());
			continue;
		}
		misAligner->SetMisalType(misalType);
		objsArray = misAligner->MakeAlObjsArray();

		if(toOCDB)
		{
			storage = cdb->GetStorage(ocdbUriDirPath.Data());
			strId=str;
			strId+="/Align/Data";
			AliCDBId id(strId.Data(),0,AliCDBRunRange::Infinity());
			AliCDBMetaData *md = misAligner->GetCDBMetaData();
			md->SetAliRootVersion(ALIROOT_BRANCH);
			md->AddDateToComment();
			storage->Put(objsArray, id, md);
		}else{
			// save on file
			fileName = ocdbUriDirPath;
			fileName += "/";
			fileName += str.Data();
			fileName += misalType;
			fileName += "MisAlignment.root";
			TFile file(fileName.Data(),"RECREATE");
			if(!file){
				Error(macroName,"cannot open file for output\n");
				return;
			}
			Info(macroName,"Saving alignment objects to the file %s", fileName.Data());
			file.cd();
			file.WriteObject(objsArray,arName.Data(),"kSingleKey");
			file.Close();
		}
	}

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