+
+}
+
+//____________________________________________________________________________
+void AliTOFAlignment::WriteCombData(const Char_t *nomefile, Int_t option)
+{
+ // 1 for simulated data; 0 for data from survey file
+ // write combined data on a file
+ //
+
+ FILE *data;
+ /* Open file in text mode: */
+ if( (data = fopen( nomefile, "w+t" )) != NULL ){
+ if (option==1){
+ fprintf( data, "simulated data\n" );} else {
+ fprintf( data, "survey data\n" );}
+ if (option==1){
+ fprintf( data, "data from InsertMisAlignmentBTOF method\n");}
+ else {fprintf( data, "real survey data from text file (coordinate in global RS)\n");}
+ fprintf( data, "Point Name,XPH,YPH,ZPH,PrecisionX(mm),PrecisionY(mm),PrecisionZ(mm)\n");
+ fprintf( data, "> Data:\n");
+ for(Int_t i=0;i<72;i++){
+ if (fCombFMData[i][0]!=0){
+ fprintf( data, "SM%02iFM%i %f %f %f M Y %f %f %f\n", (i-i%4)/4, i%4, fCombFMData[i][0],fCombFMData[i][2],fCombFMData[i][4],fCombFMData[i][1]*10,fCombFMData[i][3]*10,fCombFMData[i][5]*10);
+ }
+ }
+ fclose( data );
+ }
+ else{
+ printf( "Problem opening the file\n" );
+ }
+
+ return;
+}
+
+//____________________________________________________________________________
+void AliTOFAlignment::WriteSimSurveyData(const Char_t *nomefile)
+{
+ // write sim data in standard format
+ //
+ //
+
+ FILE *data;
+ /* Open file in text mode: */
+ if( (data = fopen( nomefile, "w+t" )) != NULL )
+ {
+ fprintf( data, "> Title:\n" );
+ fprintf( data, "simulated data\n" );
+ fprintf( data, "> Date:\n" );
+ fprintf( data, "24.09.2007\n" );
+ fprintf( data, "> Subdetector:\n" );
+ fprintf( data, "TOF\n" );
+ fprintf( data, "> Report URL:\n" );
+ fprintf( data, "https://edms.cern.ch/document/835615\n" );
+ fprintf( data, "> Version:\n" );
+ fprintf( data, "1\n");
+ fprintf( data, "> General Observations:\n");
+ fprintf( data, "data from InsertMisAlignmentBTOF method\n");
+ fprintf( data, "> Coordinate System:\n");
+ fprintf( data, "\\ALICEPH\n");
+ fprintf( data, "> Units:\n");
+ fprintf( data, "cm\n");
+ fprintf( data, "> Nr Columns:\n");
+ fprintf( data, "9\n");
+ fprintf( data, "> Column Names:\n");
+ fprintf( data, "Point Name,XPH,YPH,ZPH,Point Type,Target Used,PrecisionX(mm),PrecisionY(mm),PrecisionZ(mm)\n");
+ fprintf( data, "> Data:\n");
+ for(Int_t i=0;i<72;i++)
+ if (fCombFMData[i][0]!=0)
+ fprintf( data, "SM%02iFM%i %f %f %f M Y %f %f %f\n", (i-i%4)/4, i%4, fCombFMData[i][0],fCombFMData[i][2],fCombFMData[i][4],fCombFMData[i][1],fCombFMData[i][3],fCombFMData[i][5]);
+
+ fclose( data );
+ }
+ else
+ printf( "Problem opening the file\n" );
+}
+
+//____________________________________________________________________________
+void AliTOFAlignment::MakeDefData(const Int_t nf,TString namefiles[])
+{
+ //this method combines survey data from different files (namefiles[])
+ //
+ //
+
+ Float_t data[72][6][100];
+ for (Int_t i=0;i<72;i++)
+ for (Int_t j=0; j<6; j++)
+ for(Int_t k=0; k<100; k++)
+ data[i][j][k]=0;
+ Int_t nfm=0;
+ Int_t nsm=0;
+ Long64_t totdata[72]={0};
+
+ for (Int_t ii=0;ii<nf; ii++)
+ {
+ AliSurveyObj *so = new AliSurveyObj();
+ const Char_t *nome=namefiles[ii];
+ so->FillFromLocalFile(nome);
+ TObjArray *points = so->GetData();
+ Int_t nSurveyPoint=points->GetEntries();
+ for(Int_t jj=0;jj<nSurveyPoint;jj++){
+ const char* pointName= ((AliSurveyPoint *) points->At(jj))->GetPointName().Data();
+ nfm=atoi(&pointName[6]);
+ nsm=atoi(&pointName[2]);
+ data[nsm*4+nfm][0][totdata[nsm*4+nfm]]=((AliSurveyPoint *) points->At(jj))->GetX();
+ data[nsm*4+nfm][2][totdata[nsm*4+nfm]]=((AliSurveyPoint *) points->At(jj))->GetY();
+ data[nsm*4+nfm][4][totdata[nsm*4+nfm]]=((AliSurveyPoint *) points->At(jj))->GetZ();
+ data[nsm*4+nfm][1][totdata[nsm*4+nfm]]=((AliSurveyPoint *) points->At(jj))->GetPrecisionX();
+ data[nsm*4+nfm][3][totdata[nsm*4+nfm]]=((AliSurveyPoint *) points->At(jj))->GetPrecisionY();
+ data[nsm*4+nfm][5][totdata[nsm*4+nfm]]=((AliSurveyPoint *) points->At(jj))->GetPrecisionZ();
+ totdata[nsm*4+nfm]=totdata[nsm*4+nfm]+1;
+ }
+ delete so;
+ }
+
+
+ for(Int_t i=0; i<72 ;i++){
+ Float_t numx=0, numy=0,numz=0, comodox=0, comodoy=0, comodoz=0,denx=0, deny=0, denz=0;
+ if(totdata[i]!=0){
+ for(Int_t j=0; j<totdata[i]; j++){
+ comodox=1/(data[i][1][j]/10*data[i][1][j]/10);//precision in mm, position in cm
+ numx=numx+data[i][0][j]*comodox;
+ denx=denx+comodox;
+ comodoy=1/(data[i][3][j]/10*data[i][3][j]/10);
+ numy=numy+data[i][2][j]*comodoy;
+ deny=deny+comodoy;
+ comodoz=1/(data[i][5][j]/10*data[i][5][j]/10);
+ numz=numz+data[i][4][j]*comodoz;
+ denz=denz+comodoz;
+ }
+ fCombFMData[i][1]=TMath::Sqrt(1/denx); //error for x position
+ fCombFMData[i][3]=TMath::Sqrt(1/deny); //error for y position
+ fCombFMData[i][5]=TMath::Sqrt(1/denz); //error for z position
+ fCombFMData[i][0]=numx/denx; //combined survey data for x position of FM
+ fCombFMData[i][2]=numy/deny; //combined survey data for y position of FM
+ fCombFMData[i][4]=numz/denz; //combined survey data for z position of FM
+ } else continue;
+ }
+
+ for(Int_t i=0;i<72;i++)
+ if (fCombFMData[i][0]!=0){
+ fNFMforSM[(i-i%4)/4][i%4]=1;
+ fNFMforSM[(i-i%4)/4][4]=fNFMforSM[(i-i%4)/4][4]+1;
+ }
+}
+
+//_____________________________________________________________________________
+void AliTOFAlignment::ReadSurveyDataAndAlign(){
+ //
+ // read the survey data and, if we know the positions of at least 3 FM
+ //for a SM, call the right Alignement procedure
+
+ fTOFAlignObjArray = new TObjArray(kMaxAlignObj);
+
+ Float_t deltaFM0=0, deltaFM1=0, deltaFM2=0, deltaFM3=0;
+
+ for(Int_t i=0; i<18; i++){
+ switch(fNFMforSM[i][4]){
+ case 0:
+ printf("we don't know the position of any FM of SM %i\n",i);
+ break;
+ case 1:
+ printf("we know the position of only one FM for SM %i\n",i);
+
+ break;
+ case 2:
+ printf("we know the position of only 2 FM for SM %i\n",i);
+
+ break;
+ case 3:
+ if (fNFMforSM[i][0]==1 && fNFMforSM[i][1]==1 && fNFMforSM[i][2]==1){
+ printf("we know the position of FM A B C for SM %i\n",i);
+ AliTOFAlignment::AlignFromSurveyABC(i);};
+
+
+ if (fNFMforSM[i][0]==1 && fNFMforSM[i][1]==1 && fNFMforSM[i][3]==1){
+ printf("we know the position of FM A B D for SM %i\n",i);
+ AliTOFAlignment::AlignFromSurveyABD(i);};
+
+
+ if (fNFMforSM[i][0]==1 && fNFMforSM[i][2]==1 && fNFMforSM[i][3]==1){
+ printf("we know the position of FM A C D for SM %i\n",i);
+ AliTOFAlignment::AlignFromSurveyACD(i);};
+
+
+ if (fNFMforSM[i][1]==1 && fNFMforSM[i][2]==1 && fNFMforSM[i][3]==1){
+ printf("we know the position of FM B C D for SM %i\n",i);
+ AliTOFAlignment::AlignFromSurveyBCD(i);};
+
+
+ break;
+ case 4:
+ printf("we know the position of all the 4 FM for SM %i\n",i);
+ //check the precision of the measurement
+
+ deltaFM0=fCombFMData[i*4][1]/TMath::Abs(fCombFMData[i*4][0])+fCombFMData[i*4][3]/TMath::Abs(fCombFMData[i*4][2])+fCombFMData[i*4][5]/TMath::Abs(fCombFMData[i*4][4]);
+ deltaFM1=fCombFMData[i*4+1][1]/TMath::Abs(fCombFMData[i*4+1][0])+fCombFMData[i*4+1][3]/TMath::Abs(fCombFMData[i*4+1][2])+fCombFMData[i*4+1][5]/TMath::Abs(fCombFMData[i*4+1][4]);
+ deltaFM2=fCombFMData[i*4+2][1]/TMath::Abs(fCombFMData[i*4+2][0])+fCombFMData[i*4+2][3]/TMath::Abs(fCombFMData[i*4+2][2])+fCombFMData[i*4+2][5]/TMath::Abs(fCombFMData[i*4+2][4]);
+ deltaFM3=fCombFMData[i*4+3][1]/TMath::Abs(fCombFMData[i*4+3][0])+fCombFMData[i*4+3][3]/TMath::Abs(fCombFMData[i*4+3][2])+fCombFMData[i*4+3][5]/TMath::Abs(fCombFMData[i*4+3][4]);
+
+ //to AlignFromSurvey we use the 3 FM whose positions are known with greatest precision
+ if(deltaFM0>=deltaFM1 && deltaFM0>=deltaFM2 && deltaFM0>=deltaFM3){
+ printf("to Align we use FM B,C,D");
+ AliTOFAlignment::AlignFromSurveyBCD(i);} else
+ if(deltaFM1>=deltaFM0 && deltaFM1>=deltaFM2 && deltaFM1>=deltaFM3){
+ printf("to Align we use FM A,C,D");
+ AliTOFAlignment::AlignFromSurveyACD(i);} else
+ if(deltaFM2>=deltaFM0 && deltaFM2>=deltaFM1 && deltaFM2>=deltaFM3){
+ printf("to Align we use FM A,B,D");
+ AliTOFAlignment::AlignFromSurveyABD(i);} else{
+ printf("to Align we use FM A,B,C");
+ AliTOFAlignment::AlignFromSurveyABC(i);}
+
+ break;
+ }
+