ROOT logo
WriteMapping()
{
  // Create the RCU mapping files for PHOS
  // The geometrical mapping within one FEE card is read
  // from the file CSP2ALTRO.dat prepared manually beforehand.
  //
  // The hardware address of the FEE channels is a 12-bit word formed 
  // from the branch number, FEE number, ALTRO chip number and ALTRO channel
  // as follows:
  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  // |0|0|0|0| |       |     |       |
  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  //          ^   FEE    chip  channel
  //       branch
  //
  // Max address: 1 1110 100 1111 = 3919
  // 
  // Author: Yuri Kharlov
  // Date  : 29 October 2009
  // $Id$


  char string[128];
  UInt_t xcell,zcell,csp,altro,chanHG,chanLG;
  UInt_t hwAddress, maxHWAddress[4], nHWaddress[4];
  const char *FEEmapping[2] = {"CSP2ALTRO_new.dat", "CSP2ALTRO_old.dat"};
  Int_t map=0;

  for (Int_t module=0; module<5; module++) {
    printf("\n\n====> Mapping file is created for the module %d\n",module);
    if      (module <4) map=0;
    else if (module==4) map=1;
    FILE *fd = fopen(FEEmapping[map],"r");
    if (fd != 0) 
      printf("Input file %s is opened successfully\n",FEEmapping[map]);
    else {
      printf("Cannot open the input file %s\n",FEEmapping[map]);
      return -1;
    }
    
    FILE *fRCU[4];

    for (Int_t iRCU=0; iRCU<4; iRCU++) {
      TString rcuFileName = Form("Mod%dRCU%d.data.unsorted",module,iRCU);
      fRCU[iRCU] = fopen(rcuFileName.Data(),"w");
      maxHWAddress[iRCU]=0;
      nHWaddress[iRCU]=0;
    }
    
    while (fgets(string,128,fd)) {
      if (string[0]=='*') {
	continue;
      }
      sscanf(string,"%d %d %d %d %d %d",
	     &xcell,&zcell,&csp,&altro,&chanHG,&chanLG);
      for (Int_t iRCU=0; iRCU<4; iRCU++) {
	for (Int_t iBranch=0; iBranch<2; iBranch++) {
	  for (Int_t iFEE=1; iFEE<=14; iFEE++) {
	    // High gain
	    hwAddress = chanHG | (altro<<4) | (iFEE<<7) | (iBranch<<11);
	    if (hwAddress > maxHWAddress[iRCU]) maxHWAddress[iRCU]=hwAddress;
	    nHWaddress[iRCU]++;
	    fprintf(fRCU[iRCU],"%4d %4d %4d %4d\n",
		    hwAddress,
		    xcell+iRCU*16,
		    zcell+27+(1-2*iBranch)+(iFEE-1)*2*(1-2*iBranch),1);
	    // Low gain
	    hwAddress = chanLG | (altro<<4) | (iFEE<<7) | (iBranch<<11);
	    if (hwAddress > maxHWAddress[iRCU]) maxHWAddress[iRCU]=hwAddress;
	    nHWaddress[iRCU]++;
	    fprintf(fRCU[iRCU],"%4d %4d %4d %4d\n",
		    hwAddress,
		    xcell+iRCU*16,
		    zcell+27+(1-2*iBranch)+(iFEE-1)*2*(1-2*iBranch),0);
	  }
	}
      }
    }
    printf("End of input file\n");
    fclose(fd);

    for (Int_t iRCU=0; iRCU<4; iRCU++) {
      fclose(fRCU[iRCU]);
    }
    
    // Post-process the RCU mapping files
    
    for (Int_t iRCU=0; iRCU<4; iRCU++) {
      
      // Add the number of channels and maximum HW address
      
      TString rcuFileName = Form("Mod%dRCU%d.data",module,iRCU);
      fRCU[iRCU] = fopen(rcuFileName.Data(),"w");
      fprintf(fRCU[iRCU],"%d\n%d\n",nHWaddress[iRCU]+256,maxHWAddress[iRCU]);
      
      // TRU mapping
      
      for (int i=0; i<128; i++) {
	fprintf(fRCU[iRCU],"%4d %4d %4d %4d\n",i,iRCU,i,2);
      }
      for (int i=0; i<128; i++) {
	fprintf(fRCU[iRCU],"%4d %4d %4d %4d\n",i+2048,iRCU,i+2048,2);
      }
      fclose(fRCU[iRCU]);
      
      // Sort HW addresses
      
      TString cmd = Form("sort -n Mod%dRCU%d.data.unsorted >> %s", 
			 module,iRCU,rcuFileName.Data());
      gSystem->Exec(cmd);
      
      cmd = Form("rm -f Mod%dRCU%d.data.unsorted", module,iRCU);
      gSystem->Exec(cmd);
      
      printf("RCU mapping file %s is created\n",rcuFileName.Data());
    }
  }
}
 WriteMapping.C:1
 WriteMapping.C:2
 WriteMapping.C:3
 WriteMapping.C:4
 WriteMapping.C:5
 WriteMapping.C:6
 WriteMapping.C:7
 WriteMapping.C:8
 WriteMapping.C:9
 WriteMapping.C:10
 WriteMapping.C:11
 WriteMapping.C:12
 WriteMapping.C:13
 WriteMapping.C:14
 WriteMapping.C:15
 WriteMapping.C:16
 WriteMapping.C:17
 WriteMapping.C:18
 WriteMapping.C:19
 WriteMapping.C:20
 WriteMapping.C:21
 WriteMapping.C:22
 WriteMapping.C:23
 WriteMapping.C:24
 WriteMapping.C:25
 WriteMapping.C:26
 WriteMapping.C:27
 WriteMapping.C:28
 WriteMapping.C:29
 WriteMapping.C:30
 WriteMapping.C:31
 WriteMapping.C:32
 WriteMapping.C:33
 WriteMapping.C:34
 WriteMapping.C:35
 WriteMapping.C:36
 WriteMapping.C:37
 WriteMapping.C:38
 WriteMapping.C:39
 WriteMapping.C:40
 WriteMapping.C:41
 WriteMapping.C:42
 WriteMapping.C:43
 WriteMapping.C:44
 WriteMapping.C:45
 WriteMapping.C:46
 WriteMapping.C:47
 WriteMapping.C:48
 WriteMapping.C:49
 WriteMapping.C:50
 WriteMapping.C:51
 WriteMapping.C:52
 WriteMapping.C:53
 WriteMapping.C:54
 WriteMapping.C:55
 WriteMapping.C:56
 WriteMapping.C:57
 WriteMapping.C:58
 WriteMapping.C:59
 WriteMapping.C:60
 WriteMapping.C:61
 WriteMapping.C:62
 WriteMapping.C:63
 WriteMapping.C:64
 WriteMapping.C:65
 WriteMapping.C:66
 WriteMapping.C:67
 WriteMapping.C:68
 WriteMapping.C:69
 WriteMapping.C:70
 WriteMapping.C:71
 WriteMapping.C:72
 WriteMapping.C:73
 WriteMapping.C:74
 WriteMapping.C:75
 WriteMapping.C:76
 WriteMapping.C:77
 WriteMapping.C:78
 WriteMapping.C:79
 WriteMapping.C:80
 WriteMapping.C:81
 WriteMapping.C:82
 WriteMapping.C:83
 WriteMapping.C:84
 WriteMapping.C:85
 WriteMapping.C:86
 WriteMapping.C:87
 WriteMapping.C:88
 WriteMapping.C:89
 WriteMapping.C:90
 WriteMapping.C:91
 WriteMapping.C:92
 WriteMapping.C:93
 WriteMapping.C:94
 WriteMapping.C:95
 WriteMapping.C:96
 WriteMapping.C:97
 WriteMapping.C:98
 WriteMapping.C:99
 WriteMapping.C:100
 WriteMapping.C:101
 WriteMapping.C:102
 WriteMapping.C:103
 WriteMapping.C:104
 WriteMapping.C:105
 WriteMapping.C:106
 WriteMapping.C:107
 WriteMapping.C:108
 WriteMapping.C:109
 WriteMapping.C:110
 WriteMapping.C:111
 WriteMapping.C:112
 WriteMapping.C:113
 WriteMapping.C:114
 WriteMapping.C:115
 WriteMapping.C:116
 WriteMapping.C:117
 WriteMapping.C:118
 WriteMapping.C:119