X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONGMSSubprocessor.cxx;h=8eca844f2451ae48ee525e3b8b061ed9c65f31f9;hb=987271235d4cc4eacf93317c53b82300db39927d;hp=027d1275bd7194de572ba392c03c9011764a3655;hpb=d489129dcbc457e850cc5301f31a183b382efd50;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONGMSSubprocessor.cxx b/MUON/AliMUONGMSSubprocessor.cxx index 027d1275bd7..8eca844f245 100644 --- a/MUON/AliMUONGMSSubprocessor.cxx +++ b/MUON/AliMUONGMSSubprocessor.cxx @@ -14,21 +14,29 @@ **************************************************************************/ // $Id$ -// + +//----------------------------------------------------------------------------- // Class AliMUONGMSSubprocessor // ----------------------------- // The shuttle subprocessor for GMS data // Author: Ivana Hrivnacova, IPN Orsay // 16/09/2006 +//----------------------------------------------------------------------------- #include "AliMUONGMSSubprocessor.h" #include "AliMUONPreprocessor.h" +#include "AliMpConstants.h" +#include "AliAlignObjMatrix.h" +#include "AliGeomManager.h" #include "AliCDBMetaData.h" +#include "AliCDBEntry.h" #include #include +#include #include +#include #include #include @@ -36,23 +44,46 @@ ClassImp(AliMUONGMSSubprocessor) /// \endcond -const Int_t AliMUONGMSSubprocessor::fgkSystem = AliPreprocessor::kDAQ; -const TString AliMUONGMSSubprocessor::fgkDataId = "GMS"; -const TString AliMUONGMSSubprocessor::fgkMatrixArrayName = "GMSarray"; +const Int_t AliMUONGMSSubprocessor::fgkSystem = AliPreprocessor::kDCS; + +// +// static methods +// + +//______________________________________________________________________________ +const TString& AliMUONGMSSubprocessor::GetDataId() +{ + /// The data Id + static const TString kDataId = "GMS"; + return kDataId; +} + +//______________________________________________________________________________ +const TString& AliMUONGMSSubprocessor::GetMatrixArrayName() +{ + /// The fixed matrix array name + static const TString kMatrixArrayName = "GMSarray"; + return kMatrixArrayName; +} + +// +// ctor, dtor +// //______________________________________________________________________________ AliMUONGMSSubprocessor::AliMUONGMSSubprocessor(AliMUONPreprocessor* master) : AliMUONVSubprocessor(master, "GMS", "Upload GMS matrices to OCDB"), - fTransformer(true) + fTransformer(0) { /// Constructor - fTransformer.ReadGeometryData("volpath.dat", "transform.dat"); } //______________________________________________________________________________ AliMUONGMSSubprocessor::~AliMUONGMSSubprocessor() { /// Destructor + + delete fTransformer; } @@ -60,6 +91,18 @@ AliMUONGMSSubprocessor::~AliMUONGMSSubprocessor() // private methods // +//______________________________________________________________________________ +Bool_t AliMUONGMSSubprocessor::Initialize(Int_t /*run*/, + UInt_t /*startTime*/, UInt_t /*endTime*/) +{ +/// Instantiate geometry transformer + + if ( ! fTransformer ) { + fTransformer = new AliMUONGeometryTransformer(); + fTransformer->CreateModules(); + } + return kTRUE; +} //______________________________________________________________________________ UInt_t AliMUONGMSSubprocessor::ProcessFile(const TString& fileName) @@ -67,7 +110,7 @@ UInt_t AliMUONGMSSubprocessor::ProcessFile(const TString& fileName) /// Convert TGeoHMatrix to AliAlignObjMatrix and fill them into AliTestDataDCS object Master()->Log(Form("Processing GMS file %s", fileName.Data())); - + // Open root file TFile f(fileName.Data()); if ( ! f.IsOpen() ) { @@ -76,18 +119,59 @@ UInt_t AliMUONGMSSubprocessor::ProcessFile(const TString& fileName) } // Get array with matrices - TClonesArray* array = (TClonesArray*)f.Get(fgkMatrixArrayName); + TClonesArray* array = (TClonesArray*)f.Get(GetMatrixArrayName()); if ( ! array ) { Master()->Log(Form("TClonesArray not found in file %s",fileName.Data())); return 2; - } + } + + // Array to store correspondance between the moduleId + // and its corresponding entry in the GMS array. + TArrayI moduleIdToGMSIndex; + moduleIdToGMSIndex.Set(AliMpConstants::NofGeomModules()); + for (Int_t i=0; iGetGeometryFromOCDB(); + TGeoManager *lGeometry = 0x0; + if (geoEntry) { + lGeometry = (TGeoManager*) geoEntry->GetObject(); + if (lGeometry) { + // Set Geometry + AliGeomManager::SetGeometry(lGeometry); + useGlobalDelta = kFALSE; + } + } + + // Second transformer to convert GMS matrices local delta-transformation into + // ALICE alignment objects in the global delta convention + AliMUONGeometryTransformer *lTransformer = new AliMUONGeometryTransformer(); + + // Get mis alignment from reference run for GMS + AliCDBEntry* cdbEntry = Master()->GetFromOCDB("Align", "Baseline"); + TClonesArray* refArray = 0x0; + if (cdbEntry) { + refArray = (TClonesArray*)cdbEntry->GetObject(); + if (lGeometry && refArray) { + AliGeomManager::ApplyAlignObjsToGeom(*refArray); + lTransformer->LoadGeometryData(); + } + } // Convert matrices into Alice alignment objects for (Int_t i=0; iGetEntriesFast(); i++ ) { TGeoHMatrix* matrix = (TGeoHMatrix*)array->At(i); - fTransformer.AddMisAlignModule(matrix->GetUniqueID(), *matrix); - } - TObject* data = const_cast< TClonesArray*>(fTransformer.GetMisAlignmentData()); + printf("GMS local %i at %i \n",matrix->GetUniqueID(),i); + matrix->Print(); + fTransformer->AddMisAlignModule(matrix->GetUniqueID(), *matrix, kTRUE); + lTransformer->AddMisAlignModule(matrix->GetUniqueID(), *matrix, useGlobalDelta); + moduleIdToGMSIndex[matrix->GetUniqueID()]=i; + } + // Store the GMS local delta-transformation + TClonesArray* data = const_cast< TClonesArray*>(fTransformer->GetMisAlignmentData()); //Now we have to store the final CDB file Master()->Log("Storing GMS"); @@ -95,12 +179,107 @@ UInt_t AliMUONGMSSubprocessor::ProcessFile(const TString& fileName) metaData.SetBeamPeriod(0); metaData.SetResponsible(""); metaData.SetComment("This preprocessor fills GMS alignment objects."); + + Bool_t result = Master()->Store("Align", "GMS", (TObject*)data, &metaData, 0, 0); + + // This section apply the GMS misalignments on top of the misalignments + // of the GMS reference run and stores the new misalignment array in the OCDB - Bool_t result = Master()->Store("SHUTTLE", "GMS", data, &metaData, 0, 0); + // Reset the geoemtry. + if (geoEntry) { + lGeometry = (TGeoManager*) geoEntry->GetObject(); + } - // Clear MisAlignArray in transformer - fTransformer.ClearMisAlignmentData(); + if (lGeometry) { + TGeoManager::UnlockGeometry(); + // Set Geometry + AliGeomManager::SetGeometry(lGeometry); + useGlobalDelta = kFALSE; + } + AliAlignObjMatrix* refAOMat = 0x0; + // First we need to get a copy of the local delta-transformations + TClonesArray* matLocalArray = new TClonesArray("TGeoHMatrix",200); + if (lGeometry && refArray) { + refArray->Sort(); // All Modules will be first then the DE + // Create new misalignment array + for (Int_t i=0; iGetEntriesFast(); i++) { + refAOMat = (AliAlignObjMatrix*)refArray->At(i); + refAOMat->Print(""); + TGeoHMatrix* reflMat = new((*matLocalArray)[i]) TGeoHMatrix(); + refAOMat->GetLocalMatrix(*reflMat); + printf("ref misalignment local \n"); + reflMat->Print(); + } + } + + AliAlignObjMatrix* newAOMat = 0x0; + // Get the GMS global delta-transformation + data = const_cast< TClonesArray*>(lTransformer->GetMisAlignmentData()); + if (geoEntry && cdbEntry) { + if (lGeometry && refArray) { + // Create new misalignment array + TClonesArray* newArray = new TClonesArray("AliAlignObjMatrix", 200); + for (Int_t i=0; iGetEntriesFast(); i++) { + refAOMat = (AliAlignObjMatrix*)refArray->At(i); + TGeoHMatrix refMat; + refAOMat->GetMatrix(refMat); + newAOMat = new((*newArray)[i]) AliAlignObjMatrix(*refAOMat); // Copy the reference misalignment object to the new array ... + // Need the module containing this module or detection element + TString sName = refAOMat->GetSymName(); //Format "/MUON/GMx" or "/MUON/GMx/DEy" + Int_t iGM = sName.Index("GM"); + Int_t iLS = sName.Last('/'); + if (iLS=0) { + AliAlignObjMatrix* gmsAOMat = (AliAlignObjMatrix*)data->At(moduleIdToGMSIndex[iMod]); + TGeoHMatrix gmsMat; + gmsAOMat->GetMatrix(gmsMat); + printf("GMS global delta %i %i\n",iMod,moduleIdToGMSIndex[iMod]); + gmsMat.Print(); + printf("ref misalignment \n"); + refMat.Print(); + refMat.MultiplyLeft(&gmsMat); + printf("new misalignment gms*ref\n"); + refMat.Print(); + } + else { + Master()->Log(Form("Missing GMS entry for module %d",iMod)); + } + newAOMat->SetMatrix(refMat); // ... and set its matrix + } + else { // This is a module + newAOMat->SetLocalMatrix(*(TGeoHMatrix*)matLocalArray->At(i)); // ... and set its matrix + } + } + + //Now we have also to store this CDB file + TString sMDComment(cdbEntry->GetMetaData()->GetComment()); + sMDComment += " GMS"; + Master()->Log("Storing MisAlignment"); + metaData.SetComment(sMDComment); + + result = result && Master()->Store("Align", "Data", newArray, &metaData, 0, 1); + } + else { + if (!refArray) + Master()->Log("Empty entry?"); + if (!lGeometry) + Master()->Log("Couldn't find TGeoManager in the specified CDB entry?"); + } + } + else { + if (!geoEntry) + Master()->Log("Could not get Geometry from OCDB! Will not add a new MUON/Align/Data entry!"); + if (!cdbEntry) + Master()->Log("Could not get GMS reference misalignment from OCDB! Will not add a new MUON/Align/Data entry!"); + } + // Done with applying GMS misalignments on top of misalignment of reference run + + // Clear MisAlignArray in transformer + fTransformer->ClearMisAlignmentData(); + return (result!=kTRUE); } @@ -116,11 +295,11 @@ UInt_t AliMUONGMSSubprocessor::Process(TMap* /*dcsAliasMap*/) /// Return failure (0) in case procession of some file has failed UInt_t result = 1; - TList* sources = Master()->GetFileSources(fgkSystem, fgkDataId); + TList* sources = Master()->GetFileSources(fgkSystem, GetDataId()); TIter next(sources); TObjString* o(0x0); while ( ( o = static_cast(next()) ) ) { - TString fileName(Master()->GetFile(fgkSystem, fgkDataId, o->GetName())); + TString fileName(Master()->GetFile(fgkSystem, GetDataId(), o->GetName())); result *= ProcessFile(fileName); } delete sources;