X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDAlignFaker.cxx;h=d15cc8b8a241ae410011905fd4612bfeab93a549;hb=1f4d1e460d257c2e9c765ad8f508616f8e6ff9a1;hp=7cfa1930cfc539b8f17eb1ceb6a3eb886405ee4c;hpb=c2fc12580f7bb903a1f061ae3d60882098e8a988;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDAlignFaker.cxx b/FMD/AliFMDAlignFaker.cxx index 7cfa1930cfc..d15cc8b8a24 100644 --- a/FMD/AliFMDAlignFaker.cxx +++ b/FMD/AliFMDAlignFaker.cxx @@ -19,6 +19,15 @@ @brief Implementation of AliFMDAlignFaker */ //____________________________________________________________________ +// +// Class +// to +// make +// fake +// alignment +// parameters +// +//____________________________________________________________________ // // Forward Multiplicity Detector based on Silicon wafers. // @@ -29,23 +38,25 @@ // storage `local://cdb' which is a directory in the current // directory. // -#include "AliLog.h" // ALILOG_H +#include "AliFMDDebug.h" // ALIFMDDEBUG_H ALILOG_H #include "AliFMDAlignFaker.h" // ALIFMDALIGNFAKER_H #include // ALICDBMANAGER_H +#include // ALICDBSTORAGE_H #include // ALICDBMANAGER_H -#include -#include -#include +// #include +#include +// #include #include -#include +// #include #include #include #include #include #include #include -#include +// #include #include +#include //==================================================================== ClassImp(AliFMDAlignFaker) @@ -58,15 +69,31 @@ AliFMDAlignFaker::AliFMDAlignFaker(Int_t mask, const char* geo, const char* loc) : TTask(geo, loc), fMask(mask), + fSensorTransMin(0,0,0), + fSensorTransMax(0,0,0), + fSensorRotMin(0,0,0), + fSensorRotMax(0,0,0), + fHalfTransMin(0,0,0), + fHalfTransMax(0,0,0), + fHalfRotMin(0,0,0), + fHalfRotMax(0,0,0), fRunMin(0), - fRunMax(10), - fArray(0) + fRunMax(AliCDBRunRange::Infinity()), + fArray(0), + fComment("") { // Default constructor + if (!loc) { + AliCDBStorage* storage = AliCDBManager::Instance()->GetDefaultStorage(); + if (!storage) AliFatal("Default Storage not set"); + const TString& uri = storage->GetURI(); + fTitle = uri; + } SetSensorDisplacement(); SetSensorRotation(); SetHalfDisplacement(); SetHalfRotation(); + SetComment(); } //__________________________________________________________________ @@ -115,6 +142,42 @@ AliFMDAlignFaker::SetHalfRotation(Double_t x1, Double_t y1, Double_t z1, #define IS_NODE_SENSOR(name) \ (name[0] == 'F' && name[2] == 'S' && name[3] == 'E') +//__________________________________________________________________ +Bool_t +AliFMDAlignFaker::GetGeometry(Bool_t toCdb, const TString& storage) +{ + if (!toCdb) { + //load geom from default CDB storage + AliGeomManager::LoadGeometry(); + return kTRUE; + } + if(!storage.BeginsWith("local://") && + !storage.BeginsWith("alien://")) { + AliErrorClass(Form("STORAGE=\"%s\" invalid. Exiting\n", storage.Data())); + return kFALSE; + } + + AliCDBManager* cdb = AliCDBManager::Instance(); + AliCDBStorage* store = cdb->GetStorage(storage.Data()); + if(!store){ + AliErrorClass(Form("Unable to open storage %s\n", storage.Data())); + return kFALSE; + } + + AliCDBPath path("GRP","Geometry","Data"); + AliCDBEntry* entry = store->Get(path.GetPath(),cdb->GetRun()); + if(!entry) { + AliErrorClass("Could not get the specified CDB entry!"); + return kFALSE; + } + + + entry->SetOwner(0); + TGeoManager* geom = static_cast(entry->GetObject()); + AliGeomManager::SetGeometry(geom); + return kTRUE; +} + //__________________________________________________________________ void AliFMDAlignFaker::Exec(Option_t*) @@ -135,20 +198,54 @@ AliFMDAlignFaker::Exec(Option_t*) return; } // Make container of transforms - if (!fArray) fArray = new TClonesArray("AliAlignObjAngles"); + if (!fArray) fArray = new TClonesArray("AliAlignObjParams"); fArray->Clear(); // Make an iterator TGeoIterator next(topVolume); + next.SetTopName(Form("/%s_1", topVolume->GetName())); TGeoNode* node = 0; - + + Char_t currentDet = '\0'; + Char_t currentHalf = '\0'; // Loop over all entries in geometry to find our nodes. while ((node = static_cast(next()))) { const char* name = node->GetName(); if (!(IS_NODE_HALF(name) && TESTBIT(fMask, kHalves)) && !(IS_NODE_SENSOR(name) && TESTBIT(fMask, kSensors))) continue; - + + TString path, alignName; + next.GetPath(path); + Int_t id = node->GetVolume()->GetNumber(); + if (IS_NODE_HALF(name)) { + currentDet = name[1]; + currentHalf = name[3]; + alignName = Form("FMD/FMD%c_%c", currentDet, currentHalf); + } + if (IS_NODE_SENSOR(name)) { + Char_t ring = name[1]; + Int_t lvl = next.GetLevel(); + TGeoNode* parent = next.GetNode(lvl-1); + Int_t copy = parent->GetNumber(); + alignName = Form("FMD/FMD%c_%c/FMD%c_%02d", + currentDet, currentHalf, ring, copy); + } + if (alignName.IsNull()) continue; + if (!gGeoManager->GetAlignableEntry(alignName.Data())) { + AliWarning(Form("No alignable entry for %s, using path %s", + alignName.Data(), path.Data())); + alignName = path; + } + AliFMDDebug(1, ("Making alignment for %s -> %s (%d)", + alignName.Data(), path.Data(), id)); + if (IS_NODE_HALF(name)) MakeAlignHalf(alignName, id); + if (IS_NODE_SENSOR(name)) MakeAlignSensor(alignName, id); +#if 0 + if (!(IS_NODE_HALF(name) && TESTBIT(fMask, kHalves)) && + !(IS_NODE_SENSOR(name) && TESTBIT(fMask, kSensors))) + continue; + // Get the path TString path(Form("/%s", gGeoManager->GetNode(0)->GetName())); Int_t nLevel = next.GetLevel(); @@ -165,6 +262,7 @@ AliFMDAlignFaker::Exec(Option_t*) Int_t id = node->GetVolume()->GetNumber(); if (IS_NODE_HALF(name)) MakeAlignHalf(path, id); if (IS_NODE_SENSOR(name)) MakeAlignSensor(path, id); +#endif } TString t(GetTitle()); @@ -180,11 +278,23 @@ AliFMDAlignFaker::MakeAlign(const TString& path, Int_t id, Double_t transX, Double_t transY, Double_t transZ, Double_t rotX, Double_t rotY, Double_t rotZ) { - AliDebug(1, Form("Make alignment for %s (volume %d): (%f,%f,%f) (%f,%f,%f)", + // make alignment for a path + // Params: + // path Path to node + // id Volume number + // transX Translation in X + // transZ Translation in Y + // transZ Translation in Z + // rotX Rotation about X-axis + // rotY Rotation about Y-axis + // rotZ Rotation about Z-axis + AliFMDDebug(3, ("Make alignment for %s (volume %d): (%f,%f,%f) (%f,%f,%f)", path.Data(), id, transX, transY, transZ, rotX, rotY, rotZ)); Int_t nAlign = fArray->GetEntries(); - AliAlignObjAngles* obj = - new ((*fArray)[nAlign]) AliAlignObjAngles(path.Data(), id,0,0,0,0,0,0); + id = 0; + AliAlignObjParams* obj = + new ((*fArray)[nAlign]) AliAlignObjParams(path.Data(), + id,0,0,0,0,0,0,kTRUE); if (!obj) { AliError(Form("Failed to create alignment object for %s", path.Data())); return kFALSE; @@ -200,7 +310,8 @@ AliFMDAlignFaker::MakeAlign(const TString& path, Int_t id, Bool_t AliFMDAlignFaker::MakeAlignHalf(const TString& path, Int_t id) { - AliDebug(15, Form("Make alignment for half-ring/cone %s", path.Data())); + // Make alignment of a half ring/cone + AliFMDDebug(15, ("Make alignment for half-ring/cone %s", path.Data())); Double_t transX = gRandom->Uniform(fHalfTransMin.X(), fHalfTransMax.X()); Double_t transY = gRandom->Uniform(fHalfTransMin.Y(), fHalfTransMax.Y()); Double_t transZ = gRandom->Uniform(fHalfTransMin.Z(), fHalfTransMax.Z()); @@ -215,7 +326,8 @@ AliFMDAlignFaker::MakeAlignHalf(const TString& path, Int_t id) Bool_t AliFMDAlignFaker::MakeAlignSensor(const TString& path, Int_t id) { - AliDebug(15, Form("Make alignment for sensor %s", path.Data())); + // Make alignment of a sensor + AliFMDDebug(15, ("Make alignment for sensor %s", path.Data())); Double_t transX = gRandom->Uniform(fSensorTransMin.X(), fSensorTransMax.X()); Double_t transY = gRandom->Uniform(fSensorTransMin.Y(), fSensorTransMax.Y()); Double_t transZ = gRandom->Uniform(fSensorTransMin.Z(), fSensorTransMax.Z()); @@ -230,34 +342,33 @@ void AliFMDAlignFaker::WriteToCDB() { // Make the objects. - AliCDBManager* cdb = AliCDBManager::Instance(); - if (GetTitle() && GetTitle()[0] != '\0') - cdb->SetDefaultStorage(GetTitle()); - - AliCDBMetaData* meta = new AliCDBMetaData; + const char* loc = GetTitle(); + AliCDBManager* cdb = AliCDBManager::Instance(); + AliCDBStorage* storage = cdb->GetStorage(!loc ? "" : loc); + AliCDBMetaData* meta = new AliCDBMetaData; meta->SetResponsible(gSystem->GetUserInfo()->fRealName.Data()); meta->SetAliRootVersion(gROOT->GetVersion()); meta->SetBeamPeriod(1); - meta->SetComment("Dummy data for testing"); + meta->SetComment(fComment.Data()); AliCDBId id("FMD/Align/Data", fRunMin, fRunMax); - cdb->Put(fArray, id, meta); - cdb->Destroy(); + storage->Put(fArray, id, meta); } //__________________________________________________________________ void AliFMDAlignFaker::WriteToFile() { + // Write to a local file TFile* file = TFile::Open(GetTitle(), "RECREATE"); if (!file) { AliFatal(Form("Failed to open file '%s' for output", GetTitle())); return; } file->cd(); - fArray->Write("FMDAlignment"); - file->Close(); + fArray->Write("FMDAlignment",TObject::kSingleKey); file->Write(); + file->Close(); }