1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //-----------------------------------------------------------------------------
19 // Class AliMUONGMSSubprocessor
20 // -----------------------------
21 // The shuttle subprocessor for GMS data
22 // Author: Ivana Hrivnacova, IPN Orsay
24 //-----------------------------------------------------------------------------
26 #include "AliMUONGMSSubprocessor.h"
27 #include "AliMUONPreprocessor.h"
28 #include "AliMpConstants.h"
30 #include "AliAlignObjMatrix.h"
31 #include "AliCDBMetaData.h"
32 #include "AliCDBEntry.h"
34 #include <TTimeStamp.h>
37 #include <TClonesArray.h>
38 #include <TObjString.h>
39 #include <Riostream.h>
42 ClassImp(AliMUONGMSSubprocessor)
45 const Int_t AliMUONGMSSubprocessor::fgkSystem = AliPreprocessor::kDCS;
46 const TString AliMUONGMSSubprocessor::fgkDataId = "GMS";
47 const TString AliMUONGMSSubprocessor::fgkMatrixArrayName = "GMSarray";
49 //______________________________________________________________________________
50 AliMUONGMSSubprocessor::AliMUONGMSSubprocessor(AliMUONPreprocessor* master)
51 : AliMUONVSubprocessor(master, "GMS", "Upload GMS matrices to OCDB"),
57 //______________________________________________________________________________
58 AliMUONGMSSubprocessor::~AliMUONGMSSubprocessor()
71 //______________________________________________________________________________
72 void AliMUONGMSSubprocessor::Initialize(Int_t /*run*/,
73 UInt_t /*startTime*/, UInt_t /*endTime*/)
75 /// Instantiate geometry transformer
77 if ( ! fTransformer ) {
78 fTransformer = new AliMUONGeometryTransformer();
79 fTransformer->CreateModules();
83 //______________________________________________________________________________
84 UInt_t AliMUONGMSSubprocessor::ProcessFile(const TString& fileName)
86 /// Convert TGeoHMatrix to AliAlignObjMatrix and fill them into AliTestDataDCS object
88 Master()->Log(Form("Processing GMS file %s", fileName.Data()));
91 TFile f(fileName.Data());
93 Master()->Log(Form("Cannot open file %s",fileName.Data()));
97 // Get array with matrices
98 TClonesArray* array = (TClonesArray*)f.Get(fgkMatrixArrayName);
100 Master()->Log(Form("TClonesArray not found in file %s",fileName.Data()));
104 // Array to store correspondance between the moduleId
105 // and its corresponding entry in the GMS array.
106 TArrayI moduleIdToGMSIndex;
107 moduleIdToGMSIndex.Set(AliMpConstants::NofGeomModules());
108 for (Int_t i=0; i<AliMpConstants::NofGeomModules(); i++){
109 moduleIdToGMSIndex[i]=-1;
112 // Convert matrices into Alice alignment objects
113 for (Int_t i=0; i<array->GetEntriesFast(); i++ ) {
114 TGeoHMatrix* matrix = (TGeoHMatrix*)array->At(i);
115 fTransformer->AddMisAlignModule(matrix->GetUniqueID(), *matrix);
116 moduleIdToGMSIndex[matrix->GetUniqueID()]=i;
118 TObject* data = const_cast< TClonesArray*>(fTransformer->GetMisAlignmentData());
120 //Now we have to store the final CDB file
121 Master()->Log("Storing GMS");
122 AliCDBMetaData metaData;
123 metaData.SetBeamPeriod(0);
124 metaData.SetResponsible("");
125 metaData.SetComment("This preprocessor fills GMS alignment objects.");
127 Bool_t result = Master()->Store("Align", "GMS", data, &metaData, 0, 0);
129 // This section apply the GMS misalignments on top of the misalignments
130 // of the GMS reference run and stores the new misalignment array in the OCDB
132 // Get mis alignment from reference run for GMS
133 AliCDBEntry* cdbEntry = Master()->GetFromOCDB("Align", "Baseline");
135 TClonesArray* refArray = (TClonesArray*)cdbEntry->GetObject();
137 // Create new misalignment array
138 TClonesArray* newArray = new TClonesArray("AliAlignObjMatrix", 200);
139 for (Int_t i=0; i<refArray->GetEntriesFast(); i++) {
140 AliAlignObjMatrix* refAOMat = (AliAlignObjMatrix*)refArray->At(i);
142 refAOMat->GetMatrix(refMat);
143 // Need the module containing this module or detection element
144 TString sName = refAOMat->GetSymName(); //Format "/MUON/GMx" or "/MUON/GMx/DEy"
145 Int_t iGM = sName.Index("GM");
146 Int_t iLS = sName.Last('/');
147 if (iLS>iGM) { // This is a detection element
148 sName.Remove(iLS,sName.Sizeof());
150 sName.Remove(0,iGM+2);
151 Int_t iMod = sName.Atoi();
152 if (moduleIdToGMSIndex[iMod]>=0) {
153 TGeoHMatrix* gmsMat = (TGeoHMatrix*)array->At(moduleIdToGMSIndex[iMod]);
154 refMat.MultiplyLeft(gmsMat);
157 Master()->Log(Form("Missing GMS entry for module %d",iMod));
159 AliAlignObjMatrix* newAOMat = new((*newArray)[i]) AliAlignObjMatrix(*refAOMat); // Copy the reference misalignment object to the new array ...
160 newAOMat->SetMatrix(refMat); // ... and set its matrix
163 //Now we have also to store this CDB file
164 TString sMDComment(cdbEntry->GetMetaData()->GetComment());
165 sMDComment += " GMS";
166 Master()->Log("Storing MisAlignment");
167 metaData.SetComment(sMDComment);
169 result = result && Master()->Store("Align", "Data", newArray, &metaData, 0, 1);
172 Master()->Log("Empty entry?");
176 Master()->Log("Could not get GMS reference misalignment from OCDB! Will not add a new MUON/Align/Data entry!");
178 // Done with applying GMS misalignments on top of misalignment of reference run
180 // Clear MisAlignArray in transformer
181 fTransformer->ClearMisAlignmentData();
183 return (result!=kTRUE);
191 //______________________________________________________________________________
192 UInt_t AliMUONGMSSubprocessor::Process(TMap* /*dcsAliasMap*/)
194 /// Process GMS alignment files.
195 /// Return failure (0) in case procession of some file has failed
198 TList* sources = Master()->GetFileSources(fgkSystem, fgkDataId);
201 while ( ( o = static_cast<TObjString*>(next()) ) ) {
202 TString fileName(Master()->GetFile(fgkSystem, fgkDataId, o->GetName()));
203 result *= ProcessFile(fileName);