Aligment from survey
authormrodrigu <mrodrigu@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 30 May 2011 18:46:34 +0000 (18:46 +0000)
committermrodrigu <mrodrigu@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 30 May 2011 18:46:34 +0000 (18:46 +0000)
ACORDE/ACORDEbaseLinkDef.h
ACORDE/AliACORDEAlign.cxx [new file with mode: 0644]
ACORDE/AliACORDEAlign.h [new file with mode: 0644]
ACORDE/AliACORDEConstants.cxx
ACORDE/AliACORDEv1.cxx
ACORDE/CMakelibACORDEbase.pkg
ACORDE/Survey_1014872_ACORDE.txt [new file with mode: 0644]

index 7d249f2..f89f558 100644 (file)
@@ -18,4 +18,5 @@
 #pragma link C++ class  AliACORDERawStream+;
 #pragma link C++ class  AliACORDERawReader+;
 #pragma link C++ class  AliACORDEQAChecker+;
+#pragma link C++ class  AliACORDEAlign+;
 #endif
diff --git a/ACORDE/AliACORDEAlign.cxx b/ACORDE/AliACORDEAlign.cxx
new file mode 100644 (file)
index 0000000..20ed8cc
--- /dev/null
@@ -0,0 +1,509 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+#include "AliACORDEAlign.h"
+#include "TROOT.h"
+#include "Riostream.h"
+#include "TFile.h"
+#include "TMath.h"
+#include "TSystem.h"
+#include "AliSurveyObj.h"
+#include "AliAlignObjParams.h"
+#include "AliCDBStorage.h"
+#include <TClonesArray.h>
+#include <TFile.h>
+#include "AliLog.h"
+#include "AliCDBManager.h"
+#include "AliSurveyPoint.h" 
+#include "AliACORDEConstants.h" 
+
+// Class creating the ACORDE aligmnent objects 
+// from the surveys done by surveyers at Point2.
+// Survey results are fetched from 
+// Survey Depot, based on survey results 
+// position of ACORDE alignment objects is computed.
+
+
+ClassImp(AliACORDEAlign)
+
+
+//________________________________________________________________________
+AliACORDEAlign::AliACORDEAlign() :
+  TObject(),
+  fFileGlob(0x0),
+  fRepLoc(0),
+  fRepGlob(0),
+  fUser(0x0),  
+  fX(),
+  fAlignACORDEObjArray(0x0),
+  fDebug(0)
+{
+  //
+  //  default constructor
+  //
+}
+
+AliACORDEAlign::AliACORDEAlign(Int_t reportloc,Int_t reportglob):
+  TObject(),
+  fFileGlob(0x0),
+  fRepLoc(reportloc),
+  fRepGlob(reportglob),
+  fUser(0x0),
+  fX(120,4),
+  fAlignACORDEObjArray(0x0),
+  fDebug(0)
+{
+  
+//
+  // constructor
+  //fRepLoc = new reportloc[80];
+  //fRepGlob = new reportglob[80];
+  Char_t path[50];
+  fFileGlob = new Char_t[80];
+  fUser = new Char_t[10];
+  snprintf(path,50,gSystem->Getenv("ALICE_ROOT")); 
+  // 
+  snprintf(fFileGlob,80,"%s/ACORDE/Survey_%d_ACORDE.txt",path,reportglob);
+  //
+ snprintf(fUser,80,gSystem->Getenv("alien_API_USER"));
+
+}
+
+
+
+
+AliACORDEAlign::AliACORDEAlign(const AliACORDEAlign &align):
+  TObject(),
+  fFileGlob(0x0),
+  fRepLoc(0),
+  fRepGlob(0),
+  fUser(0x0),
+  fX(),
+  fAlignACORDEObjArray(0x0),
+  fDebug(0)
+{
+  //
+  //  default copy constructor
+fDebug = align.fDebug;
+}
+
+//__________________________________________________________________________
+AliACORDEAlign & AliACORDEAlign::operator =(const AliACORDEAlign &align)
+
+{
+  //
+  // assignment operator - dummy
+
+ //
+fDebug = align.fDebug;
+  return (*this);
+}
+
+//__________________________________________________________________________
+AliACORDEAlign::~AliACORDEAlign(){
+  //
+  // destructor
+  //
+if(fAlignACORDEObjArray) delete fAlignACORDEObjArray;
+  if(fFileGlob) delete[] fFileGlob;
+  if(fUser) delete[] fUser;
+}
+
+
+void AliACORDEAlign::LoadSurveyData()
+{
+
+//
+// Create a new survey object and fill it.
+AliSurveyObj * s1 = new AliSurveyObj(); 
+
+if(fRepLoc != 0) 
+ { 
+ // Filling from DCDB (via GRID)
+ s1->SetGridUser(fUser);
+ s1->Fill("ACORDE",1014872,1,fUser); 
+ }
+ else
+ {
+   s1->FillFromLocalFile(fFileGlob);
+ }
+
+
+ //s1->GetEntries();
+ //s1->GetUnits();
+ TObjArray* arr = s1->GetData();
+ //cout<< "number of entries " << arr->GetEntries() <<endl;
+ //arr->UncheckedAt(0)->ClassName();
+ //AliSurveyPoint *sp0 = (AliSurveyPoint*) arr->UncheckedAt(0);   
+ //cout << "point name " << sp0->GetPointName() << endl  ;
+  
+
+//
+TString ML= "M" ;
+//TString PL= "P";
+TString underscore =  "_";
+TString  endInner =  "_I";
+TString  endOuter =  "_O";
+TString  endCenter = "_P";
+//
+TString surveyname;
+TString surveynameInner;
+TString surveynameOuter;
+TString surveynameCenter;
+
+//TString surveynameAngles;
+// 
+TString pointNamesInner[60];
+TString pointNamesOuter[60];
+TString pointNamesCenter[60];
+
+//
+Int_t  nid=0;
+//
+ //for regular modules 
+ for (Int_t ncolum=0; ncolum<6; ncolum++)
+   {
+     for (Int_t nrow=0; nrow<10; nrow++)
+       {       
+         
+         surveyname=ML;
+         surveyname+=ncolum;
+         surveyname+=underscore;
+         surveyname+=nrow;
+  
+         surveynameInner=surveyname; 
+         surveynameInner+=endInner;
+
+         surveynameOuter=surveyname;
+         surveynameOuter+=endOuter; 
+                          
+         surveynameCenter=surveyname;
+         surveynameCenter+=endCenter;
+  
+        pointNamesInner[nid] =  surveynameInner;
+        pointNamesOuter[nid] = surveynameOuter; 
+        pointNamesCenter[nid] = surveynameCenter;
+        ++nid; 
+       }
+   }
+
+
+//Read  two points 
+AliSurveyPoint  *InnerPoint;
+AliSurveyPoint *OuterPoint; 
+AliSurveyPoint  *CenterPoint;
+
+
+ for(Int_t i=0;i<60;i++)
+ {
+
+   InnerPoint=0;
+   OuterPoint=0; 
+   CenterPoint=0;
+   InnerPoint = (AliSurveyPoint *) s1->GetData()->FindObject(pointNamesInner[i]);
+   OuterPoint = (AliSurveyPoint *) s1->GetData()->FindObject(pointNamesOuter[i]);
+   CenterPoint = (AliSurveyPoint *) s1->GetData()->FindObject(pointNamesCenter[i]);
+
+
+
+  if(InnerPoint && OuterPoint)
+   {     
+     //Use center if it is available
+     if(CenterPoint)
+       { 
+         fX(i+60,0) =  CenterPoint->GetX()*100;  
+         fX(i+60,1) =  CenterPoint->GetY()*100; 
+         fX(i+60,2) =  CenterPoint->GetZ()*100;
+        }
+      else
+        {
+      //calculate center point 
+         fX(i+60,0) = 100*(InnerPoint->GetX() + OuterPoint->GetX())/2.0;  
+         fX(i+60,1) = 100*(InnerPoint->GetY() + OuterPoint->GetY())/2.0; 
+         fX(i+60,2) = 100*(InnerPoint->GetZ() + OuterPoint->GetZ())/2.0;
+        } 
+   
+      fX(i,0) =  OuterPoint->GetX()*100;  
+      fX(i,1) =  OuterPoint->GetY()*100;
+      fX(i,2) =  OuterPoint->GetZ()*100;
+   }
+   else 
+   {
+       if(InnerPoint && CenterPoint) 
+         {
+
+          fX(i+60,0) =  CenterPoint->GetX()*100;  
+          fX(i+60,1) =  CenterPoint->GetY()*100; 
+          fX(i+60,2) =  CenterPoint->GetZ()*100;
+
+          fX(i,0) =  InnerPoint->GetX()*100;  
+          fX(i,1) =  InnerPoint->GetY()*100;
+          fX(i,2) =  InnerPoint->GetZ()*100;   
+         } 
+        else
+        {
+          if(OuterPoint && CenterPoint)
+            { 
+        
+             fX(i+60,0) =  CenterPoint->GetX()*100;  
+             fX(i+60,1) =  CenterPoint->GetY()*100; 
+             fX(i+60,2) =  CenterPoint->GetZ()*100;
+
+             fX(i,0) =  OuterPoint->GetX()*100;  
+             fX(i,1) =  OuterPoint->GetY()*100;
+             fX(i,2) =  OuterPoint->GetZ()*100;   
+            }
+          else
+            { 
+
+             fX(i+60,0) = -99.0;  
+             fX(i+60,1) = -99.0; 
+             fX(i+60,2) = -99.0;
+
+             fX(i,0) =  -99.0;  
+             fX(i,1) =  -99.0;
+             fX(i,2) =  -99.0;   
+            
+            }
+        }  
+   } 
+
+
+ }//ends  for
+
+ delete s1;
+
+}
+
+void  AliACORDEAlign::ComputePosition()
+{
+
+
+//Residuals for rotations
+
+Double_t theta;
+Double_t resphi[60]; 
+Double_t resiphi;
+
+for (Int_t imod=0; imod<60; imod++)
+  {
+   if(TMath::Abs(fX(imod+60,0)-fX(imod,0))>=0.000001)
+   {
+   theta = (fX(imod+60,1)-fX(imod,1))/(fX(imod+60,0)-fX(imod,0));
+   resiphi = TMath::ATan(theta)*(180.0/TMath::Pi());
+   // calculate the residuals  special  modules 
+   if(imod==0 || imod==9 || imod==50 || imod==59 )
+    {    
+    resphi[imod] = 0.0-resiphi;
+    continue; 
+    }
+   // for module with no measurements 
+   if(imod == 42 )
+    {
+     resphi[imod]= 0.0;
+    continue;
+    } 
+   //face A
+   if(imod>0 && imod <20)
+    {
+    resphi[imod] = resiphi + 45.0;  
+    }
+   //face B
+   if(imod>=20 && imod <40)
+    {
+    resphi[imod] = -resiphi;  
+    }
+   //face C
+   if(imod>=40 && imod <60)
+    {
+    resphi[imod] = resiphi - 45.0;  
+    }
+   }
+
+}
+
+
+//Get the  residuals for translations 
+
+AliCDBManager* cdb = AliCDBManager::Instance();
+if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+cdb->SetRun(0);
+
+//AliCDBStorage* storage;
+AliGeomManager::LoadGeometry(); 
+
+
+TString symname;
+TString basename = "ACORDE/Array";
+
+
+// Get the ideal directly from the geometry 
+ Double_t *tr;
+ TGeoHMatrix *matrix;  
+  for (Int_t imod=0; imod<60; imod++)
+  {
+    symname = basename;
+    symname += imod; 
+    cout<< symname << endl;
+    matrix = AliGeomManager::GetMatrix(symname);
+    tr=matrix->GetTranslation();  
+
+    if(imod == 42)
+      {
+    fX(imod+60,0) = 0.0;  
+    fX(imod+60,1) = 0.0;  
+    fX(imod+60,2) = 0.0; 
+    fX(imod,0) = 0.0;  
+    fX(imod,1) = 0.0;  
+    fX(imod,2) = 0.0; 
+    continue;
+      }
+
+    fX(imod+60,0)=fX(imod+60,0)- tr[0];
+    fX(imod+60,1)=fX(imod+60,1)- tr[1]- 4.0;
+    fX(imod+60,2)=fX(imod+60,2)- tr[2];  
+  
+    fX(imod,0) = resphi[imod];  
+    fX(imod,1) = 0.0;  
+    fX(imod,2) = 0.0; 
+
+   }
+  
+
+
+
+}
+
+//______________________________________________________________________
+void AliACORDEAlign::Run(){
+  //
+  // runs the full chain
+  //
+  
+  //if(!LoadSurveyFromAlienFile("ACORDE",999999,1))
+  //{
+   // cout<<"Missing points"<<endl;
+    //return;
+  //}
+  //else 
+  //{
+    //LoadSurveyfromLocalFile("ACORDE",99999,1);
+  //} 
+
+
+  LoadSurveyData();
+  ComputePosition();
+  //CreateACORDEAlignObjs();
+  StoreAlignObj();
+
+}
+
+//_________________________________________________________________________
+
+void AliACORDEAlign::StoreAlignObj()
+{
+  //
+  // Storing ACORDE alignment objects 
+  //
+
+  AliCDBManager* cdb = AliCDBManager::Instance();
+  if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT");
+
+  TClonesArray *array = new TClonesArray("AliAlignObjParams",60);
+  //
+  // storing either in the OCDB or local file
+  //
+
+  TString symname;
+  TString basename = "ACORDE/Array";
+  Int_t iIndex=0; 
+
+  AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
+  UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);
+
+  Double_t dx=0., dy=0., dz=0., dpsi=0., dtheta=0., dphi=0.0;
+  
+   for (Int_t imod=0; imod<60; imod++)
+     {
+       
+       dphi = fX(imod,0);
+       dtheta = fX(imod,1);
+       dpsi = fX(imod,2);
+       dx = fX(imod+60,0);
+       dy = fX(imod+60,1);
+       dz = fX(imod+60,2);  
+       symname = basename;
+       symname +=  imod;         
+       new((*array)[imod]) AliAlignObjParams(symname,volid,dx,dy,dz,dpsi,dtheta,dphi,kFALSE);     
+     }
+
+
+  if( TString(gSystem->Getenv("TOCDB"))!= TString("kTRUE") )
+   {
+   
+    
+
+ // save on file
+    const char* filename = "ACORDESurveyMisalignment.root";
+    Char_t fullname[80];
+
+    
+
+    sprintf(fullname,filename);
+       
+   
+    TFile *f = new TFile(fullname,"RECREATE");
+
+    
+    if(!f)
+      {
+       AliError("cannot open file for output\n");
+       return;
+      }
+    AliInfo(Form("Saving alignment objects to the file %s", filename));
+    f->cd();
+    f->WriteObject(array,"ACORDEAlignObjs","kSingleKey");
+    f->Close();
+  }
+  else
+    {
+      // save in CDB storage
+      AliCDBStorage* storage;
+      //
+       TString Storage = gSystem->Getenv("STORAGE");
+       if(!Storage.BeginsWith("local://") && !Storage.BeginsWith("alien://"))
+        {
+          AliError(Form("STORAGE variable set to %s is not valid. Exiting\n",Storage.Data()));
+          return;
+        }
+       storage = cdb->GetStorage(Storage.Data());
+       if(!storage)
+        {
+          AliError(Form("Unable to open storage %s\n",Storage.Data()));
+          return;
+        }
+       //
+       AliCDBMetaData* md = new AliCDBMetaData();
+       md->SetResponsible("Pedro Podesta");
+       md->SetComment("Full misalignment of ACORDE from surveyors");
+       AliCDBId id("ACORDE/Align/Data",0,AliCDBRunRange::Infinity());
+       storage->Put(fAlignACORDEObjArray,id,md);
+    }
+
+}
diff --git a/ACORDE/AliACORDEAlign.h b/ACORDE/AliACORDEAlign.h
new file mode 100644 (file)
index 0000000..44e2114
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef ALIACORDEALIGN_H
+#define ALIACORDEALIGN_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/////////////////////////////////////////////////////////////////////////
+//     This class creates the alignment object from the surveyer data  //      
+//     for the ACORDE                                                 //
+/////////////////////////////////////////////////////////////////////////
+
+#include "AliAlignObjParams.h"
+#include <TMatrixDfwd.h>
+#include <TMatrixT.h>
+#include "AliSurveyToAlignObjs.h"
+
+// Class creating the ACORDE aligmnent objects
+// from the surveys done by surveyers at Point2.
+
+class AliACORDEAlign : public  TObject{
+
+ public:
+  AliACORDEAlign();
+  AliACORDEAlign(Int_t reportloc,Int_t reportglob);
+  AliACORDEAlign(const AliACORDEAlign &align); // copy constructor
+  AliACORDEAlign &operator = (const AliACORDEAlign &align); //assignment operator
+  void  ComputePosition();
+  void Run();
+  void LoadSurveyData();
+//  void CreateACORDEAlignObjs();
+  void StoreAlignObj();
+  void SetDebug(Int_t debug){fDebug=debug;}
+  virtual ~AliACORDEAlign();
+  //
+ private:
+
+  Char_t *fFileGlob;
+  Int_t fRepLoc;
+  Int_t fRepGlob;
+  Char_t *fUser;
+  TMatrixD fX;
+//  AliAlignObjParams *fACORDEAlignObj;
+  TObjArray  *fAlignACORDEObjArray;
+  Int_t fDebug;                     // debug flag
+                  //measurements
+  ClassDef(AliACORDEAlign,0);
+  
+};
+#endif
index 490009e..2287109 100644 (file)
@@ -70,7 +70,7 @@ const Float_t AliACORDEConstants::fgkCenterModulePositionX[60] = {
 -1.733 , 637.6  , 638.1095, 637.888, 637.8125, 639.579 , 638.63  , 639.332, 639.28  , -0.869,
 423.5795, 423.693, 423.795 , 423.452, 423.274,  422.9885, 422.8995, 423.166, 422.7265, 422.1595,
 153.119 , 152.362, 152.065 , 151.976, 151.518,  155.316,  151.427,  151.642, 152.465 , 151.93,
--151.171, -152.082,-155.098, -155.141,-159.922, -155.124, -155.629, -154.709,-155.223, -154.841,
+-156.171, -152.082,-155.098, -155.141,-154.922, -155.124, -155.629, -154.709,-155.223, -154.841,
 -423.037,  -422.772, -426,-422.229,-421.756, -422.053, -422.1545, -422.0375,-422.135,-422.311,
 1.637, -643.0205,-643.1815,-642.6285, -642.5675, -610.356, -614.177, -637.256, -636.576, -2.157};
 const Float_t AliACORDEConstants::fgkCenterModulePositionY[60] = {
index de1add3..38a4d0b 100644 (file)
@@ -271,7 +271,7 @@ void AliACORDEv1::CreateAcorde()
        boxLongSupport[2]=500.0;
 
        boxThinSupport[0]=1.0;
-       boxThinSupport[1]=7.0;
+       boxThinSupport[1]=5.0;
        boxThinSupport[2]=500.0;
 
        TGeoBBox *acordeLongSupport = new TGeoBBox("ACORDELONGSUPPORT",boxLongSupport[0],boxLongSupport[1],boxLongSupport[2]);
@@ -280,7 +280,7 @@ void AliACORDEv1::CreateAcorde()
        TGeoVolume *acordeLSupport = new TGeoVolume("ACORDELS",acordeLongSupport,aluminium);
        TGeoVolume *acordeTSupport = new TGeoVolume("ACORDETS",acordeThinSupport,aluminium);
        TGeoVolume *acordeMainSupport = new TGeoVolumeAssembly("ACORDE_SUPPORT"); 
-       acordeMainSupport->AddNode(acordeLSupport,1,new TGeoTranslation("ACOLSA",0,7.5,0));
+       acordeMainSupport->AddNode(acordeLSupport,1,new TGeoTranslation("ACOLSA",0,5.5,0));
        acordeMainSupport->AddNode(acordeLSupport,2,new TGeoTranslation("ACOLSB",0,-7.5,0));
        acordeMainSupport->AddNode(acordeTSupport,3);
 
index 9cb0b2a..9121e8c 100644 (file)
@@ -1,5 +1,5 @@
 set(SRCS AliACORDEConstants.cxx AliACORDECalibData.cxx AliACORDERawReader.cxx 
-    AliGenACORDE.cxx AliACORDEQAChecker.cxx  AliACORDELoader.cxx AliACORDEPreprocessor.cxx AliACORDEdigit.cxx AliACORDEDataDCS.cxx AliACORDERawStream.cxx )
+    AliGenACORDE.cxx AliACORDEQAChecker.cxx  AliACORDELoader.cxx AliACORDEPreprocessor.cxx AliACORDEdigit.cxx AliACORDEDataDCS.cxx AliACORDERawStream.cxx AliACORDEAlign.cxx)
 
 string(REPLACE ".cxx" ".h" HDRS "${SRCS}")
 
diff --git a/ACORDE/Survey_1014872_ACORDE.txt b/ACORDE/Survey_1014872_ACORDE.txt
new file mode 100644 (file)
index 0000000..c686f94
--- /dev/null
@@ -0,0 +1,165 @@
+> Title:\r
+Measurement of the module array\r
+> Date:\r
+24/06/2009\r
+> Subdetector:\r
+ACORDE\r
+> Report URL:\r
+https://edms.cern.ch/document/1014872\r
+> Version:\r
+1\r
+> General Observations:\r
+Point Types: M(easured),T(ransformed), R(eference)\r
+Mean planes for modules on both sides and on top of the L3 magnet are given in the report \r
+> Coordinate System:\r
+ALICEPH\r
+> Units:\r
+m\r
+> Nr Columns:\r
+7\r
+> Column Names:\r
+Point Name,XPH,YPH,ZPH,Point Type,Target Used,Precision(mm)\r
+> Data:\r
+M0_0_I 1.4983 8.6429 0.8837 M Y 1\r
+M0_0_O -1.4987 8.6461 0.8554 M Y 1\r
+M0_0_P -0.0173 8.6372 0.8719 M Y 1\r
+M0_1_I 7.4369 4.9077 3.4868 M Y 1\r
+M0_1_O 5.3151 7.0277 3.4768 M Y 1\r
+M0_2_I 7.4437 4.9076 2.4652 M Y 1\r
+M0_2_O 5.3185 7.0209 2.4818 M Y 1\r
+M0_3_I 7.4440 4.9126 1.4704 M Y 1\r
+M0_3_O 5.3138 7.0251 1.4708 M Y 1\r
+M0_4_I 7.4454 4.9102 0.4875 M Y 1\r
+M0_4_O 5.3109 7.0234 0.4807 M Y 1\r
+M0_5_I 7.4599 4.8964 -0.5164 M Y 1\r
+M0_5_O 5.3317 7.0100 -0.4827 M Y 1\r
+M0_6_I 7.4541 4.9039 -1.2034 M Y 1\r
+M0_6_O 5.3185 7.0164 -1.2166 M Y 1\r
+M0_7_O 5.3159 7.0185 -2.8183 M Y 1\r
+M0_7_P 6.3933 5.9405 -2.8109 M Y 1\r
+M0_8_O 5.3188 7.0197 -3.4706 M Y 1\r
+M0_8_P 6.3928 5.9408 -3.4901 M Y 1\r
+M0_9_I 1.5120 8.6387 0.1553 M Y 1\r
+M0_9_O -1.4890 8.6449 0.1681 M Y 1\r
+M0_9_P -0.0087 8.6352 0.1616 M Y 1\r
+M1_0_I 5.2945 7.0420 4.4703 M Y 1\r
+M1_0_O 3.1771 9.1684 4.4805 M Y 1\r
+M1_1_I 5.2976 7.0411 3.4819 M Y 1\r
+M1_1_O 3.1763 9.1652 3.4916 M Y 1\r
+M1_2_I 5.2991 7.0435 2.4910 M Y 1\r
+M1_2_O 3.1768 9.1628 2.5235 M Y 1\r
+M1_3_I 5.2991 7.0475 1.4758 M Y 1\r
+M1_3_O 3.1699 9.1623 1.4632 M Y 1\r
+M1_4_I 5.3017 7.0548 0.4741 M Y 1\r
+M1_4_O 3.1638 9.1586 0.4719 M Y 1\r
+M1_5_I 5.2971 7.0566 -0.5056 M Y 1\r
+M1_5_O 3.1627 9.1643 -0.5051 M Y 1\r
+M1_6_I 5.2969 7.0593 -1.5033 M Y 1\r
+M1_6_O 3.1611 9.1675 -1.5102 M Y 1\r
+M1_7_I 5.2960 7.0551 -2.5199 M Y 1\r
+M1_7_O 3.1674 9.1686 -2.4726 M Y 1\r
+M1_8_I 5.2886 7.0564 -3.4811 M Y 1\r
+M1_8_O 3.1659 9.1759 -3.4836 M Y 1\r
+M1_9_I 5.2813 7.0610 -4.4995 M Y 1\r
+M1_9_O 3.1619 9.1818 -4.4973 M Y 1\r
+M2_0_I 3.0495 8.6394 4.4873 M Y 1\r
+M2_0_O 0.0509 8.6442 4.4924 M Y 1\r
+M2_0_P 1.5312 8.6349 4.4902 M Y 1\r
+M2_1_I 3.0447 8.6371 3.4856 M Y 1\r
+M2_1_O 0.0427 8.6407 3.4944 M Y 1\r
+M2_1_P 1.5236 8.6304 3.4916 M Y 1\r
+M2_2_I 3.0409 8.6374 2.4854 M Y 1\r
+M2_2_O 0.0423 8.6428 2.4961 M Y 1\r
+M2_2_P 1.5207 8.6329 2.4941 M Y 1\r
+M2_3_I 3.0373 8.6379 1.4855 M Y 1\r
+M2_3_O 0.0388 8.6452 1.4988 M Y 1\r
+M2_3_P 1.5198 8.6342 1.4905 M Y 1\r
+M2_4_I 3.0317 8.6393 0.4872 M Y 1\r
+M2_4_O 0.0338 8.6429 0.4941 M Y 1\r
+M2_4_P 1.5152 8.6340 0.4920 M Y 1\r
+M2_5_I 3.0330 8.6428 -0.5163 M Y 1\r
+M2_5_O 0.0343 8.6428 -0.4985 M Y 1\r
+M2_5_P 1.5532 8.6360 -0.5094 M Y 1\r
+M2_6_I 3.0320 8.6416 -1.5125 M Y 1\r
+M2_6_O 0.0340 8.6447 -1.4993 M Y 1\r
+M2_6_P 1.5143 8.6362 -1.5074 M Y 1\r
+M2_7_I 3.0342 8.6413 -2.5163 M Y 1\r
+M2_7_O 0.0353 8.6436 -2.5046 M Y 1\r
+M2_7_P 1.5164 8.6368 -2.5066 M Y 1\r
+M2_8_I 3.0393 8.6414 -3.5122 M Y 1\r
+M2_8_O 0.0424 8.6432 -3.5031 M Y 1\r
+M2_8_P 1.5247 8.6348 -3.5099 M Y 1\r
+M2_9_I 3.0409 8.6373 -4.5143 M Y 1\r
+M2_9_O 0.0420 8.6432 -4.5019 M Y 1\r
+M2_9_P 1.5191 8.6342 -4.5083 M Y 1\r
+M3_0_I -0.0397 8.6420 4.5320 M Y 1\r
+M3_0_O -3.0389 8.6461 4.5187 M Y 1\r
+M3_0_P -1.5617 8.6367 4.5243 M Y 1\r
+M3_1_I -0.0381 8.6404 3.4990 M Y 1\r
+M3_1_O -3.0387 8.6425 3.4866 M Y 1\r
+M3_1_P -1.5208 8.6349 3.4919 M Y 1\r
+M3_2_I -0.0298 8.6442 2.4996 M Y 1\r
+M3_2_O -3.0316 8.6399 2.4845 M Y 1\r
+M3_2_P -1.5510 8.6353 2.4940 M Y 1\r
+M3_3_I -0.0286 8.6445 1.5016 M Y 1\r
+M3_3_O -3.0297 8.6440 1.4869 M Y 1\r
+M3_3_P -1.5514 8.6377 1.4929 M Y 1\r
+M3_4_I -0.0304 8.6466 0.5060 M Y 1\r
+M3_4_O -3.0299 8.6406 0.4884 M Y 1\r
+M3_4_P -1.5492 8.6349 0.4949 M Y 1\r
+M3_5_I -0.0312 8.6445 -0.4956 M Y 1\r
+M3_5_O -3.0326 8.6406 -0.5262 M Y 1\r
+M3_5_P -1.5512 8.6350 -0.5139 M Y 1\r
+M3_6_I -0.0340 8.6460 -1.4978 M Y 1\r
+M3_6_O -3.0336 8.6379 -1.5219 M Y 1\r
+M3_6_P -1.5563 8.6349 -1.5096 M Y 1\r
+M3_7_I -0.0277 8.6428 -2.5007 M Y 1\r
+M3_7_O -3.0287 8.6407 -2.5188 M Y 1\r
+M3_7_P -1.5471 8.6351 -2.5148 M Y 1\r
+M3_8_I -0.0307 8.6462 -3.4975 M Y 1\r
+M3_8_O -3.0325 8.6446 -3.5254 M Y 1\r
+M3_8_P -1.5522 8.6382 -3.5102 M Y 1\r
+M3_9_I -0.0290 8.6467 -4.5031 M Y 1\r
+M3_9_O -3.0284 8.6434 -4.4444 M Y 1\r
+M3_9_P -1.5484 8.6375 -4.5149 M Y 1\r
+M4_0_I -3.1938 9.2020 4.4987 M Y 1\r
+M4_0_O -5.2669 7.0334 4.4407 M Y 1\r
+M4_1_I -3.1893 9.2001 3.5146 M Y 1\r
+M4_1_O -5.2662 7.0334 3.4897 M Y 1\r
+M4_2_O -5.2657 7.0283 2.4781 M Y 1\r
+M4_3_I -3.1813 9.1973 1.4442 M Y 1\r
+M4_3_O -5.2633 7.0342 1.4857 M Y 1\r
+M4_4_I -3.1740 9.1977 0.4817 M Y 1\r
+M4_4_O -5.2611 7.0413 0.4015 M Y 1\r
+M4_5_I -3.1737 9.1893 -0.5238 M Y 1\r
+M4_5_O -5.2674 7.0365 -0.4926 M Y 1\r
+M4_6_I -3.1697 9.1871 -1.5335 M Y 1\r
+M4_6_O -5.2734 7.0493 -1.4163 M Y 1\r
+M4_7_I -3.1722 9.1879 -2.5239 M Y 1\r
+M4_7_O -5.2685 7.0410 -2.5759 M Y 1\r
+M4_8_I -3.1756 9.1902 -3.5317 M Y 1\r
+M4_8_O -5.2671 7.0371 -3.5188 M Y 1\r
+M4_9_I -3.1791 9.1908 -4.5427 M Y 1\r
+M4_9_O -5.2671 7.0358 -4.4294 M Y 1\r
+M5_0_I 1.4989 8.6429 -0.1383 M Y 1\r
+M5_0_O -1.5025 8.6426 -0.1414 M Y 1\r
+M5_0_P 0.0164 8.6353 -0.1415 M Y 1\r
+M5_1_I -5.3746 6.9638 3.5044 M Y 1\r
+M5_1_O -7.4858 4.8354 3.4907 M Y 1\r
+M5_2_I -5.3775 6.9639 2.4814 M Y 1\r
+M5_2_O -7.4861 4.8294 2.4999 M Y 1\r
+M5_3_I -5.3733 6.9707 1.0776 M Y 1\r
+M5_3_O -7.4793 4.8319 1.0324 M Y 1\r
+M5_4_I -5.3688 6.9686 0.4609 M Y 1\r
+M5_4_O -7.4826 4.8358 0.4306 M Y 1\r
+M5_5_I -5.0283 7.2995 -0.8510 M Y 1\r
+M5_5_P -6.1036 6.2211 -0.8168 M Y 1\r
+M5_6_I -5.0698 7.2608 -1.8491 M Y 1\r
+M5_6_P -6.1418 6.1802 -1.8126 M Y 1\r
+M5_7_I -5.3140 7.0229 -2.5830 M Y 1\r
+M5_7_O -7.4311 4.8954 -2.5870 M Y 1\r
+M5_8_I -5.3059 7.0288 -3.4932 M Y 1\r
+M5_8_O -7.4257 4.9029 -3.4954 M Y 1\r
+M5_9_I 1.4954 8.6442 -1.1394 M Y 1\r
+M5_9_O -1.5026 8.6442 -1.1416 M Y 1\r
+M5_9_P -0.0216 8.6374 -1.1395 M Y 1
\ No newline at end of file