updates from trying things out at WSU
authordsilverm <dsilverm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 8 Dec 2008 20:11:05 +0000 (20:11 +0000)
committerdsilverm <dsilverm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 8 Dec 2008 20:11:05 +0000 (20:11 +0000)
EMCAL/SMcalib/AliEMCALCalibAPD.cxx
EMCAL/SMcalib/AliEMCALMapAPD.cxx
EMCAL/SMcalib/AliEMCALMapAPD.h
EMCAL/SMcalib/GenerateAPDMap.C [new file with mode: 0644]
EMCAL/SMcalib/README
EMCAL/SMcalib/WriteBiasV30.C

index 33c19e1..19fdbe2 100644 (file)
@@ -25,8 +25,8 @@
 
 const int kMaxLen = 1000; // maximum length of single line (# of characters)
 // an OK line with complete info should have a certain number of characters
-const int kMinLenAPDLine = 145;
-const int kMaxLenAPDLine = 170;
+const int kMinLenAPDLine = 135;
+const int kMaxLenAPDLine = 1000;
 
 ClassImp(AliEMCALCalibAPD)
 
@@ -55,11 +55,18 @@ void AliEMCALCalibAPD::ReadCalibAPDInfo(Int_t nAPD, const TString &txtFileName)
 
   char line[kMaxLen];
 
+  /* DS: header lines skipped when switched to white-spaced separeted dat files instead of csv:
+     conversion from spreadsheet can be done a la
+     sed 's/,/ /g' APD-database-Houston.csv | egrep ^2 | awk '{if (NF==19) {print $0}}' > APD-database-Houston.dat
+     - meaning "replace , with whitespace, only get the columns that start with the number 2 (Houston APDs),
+     and only get rows with the full 19 fields
+
   // get header lines:
   inputFile.getline(line, kMaxLen);
   //  printf(" 1st header line character count %d\n", inputFile.gcount());
   inputFile.getline(line, kMaxLen);
   //  printf(" 2nd header line character count %d\n", inputFile.gcount());
+  */
 
   // variables for reading
   int i1,i2,i3,i4,i5;
@@ -80,14 +87,14 @@ void AliEMCALCalibAPD::ReadCalibAPDInfo(Int_t nAPD, const TString &txtFileName)
     // trying to read all the many fields in a line..
     inputFile.getline(line, kMaxLen);
     int nchar = inputFile.gcount();
-    //    printf(" line %d ok %d - character count %d\n", i, j, nchar);
+    //printf(" line %d ok %d - character count %d\n", i, j, nchar);
 
     if (nchar>kMinLenAPDLine && nchar<kMaxLenAPDLine) {
       // looks like the line has about the right number of characters, let's
       // try to decode it now..
 
       //      printf("input: %s\n",line);
-      sscanf(line, "%d,%u,%8s,%9s,%d,%d,%f,%f,%f,%f,%f,%f,%f,%f,%f,%d,%f,%f,%f",
+      sscanf(line, "%d %u %s %s %d %d %f %f %f %f %f %f %f %f %f %d %f %f %f",
             &i1, &i2, c1, c2, &i3, &i4, // header-type info
             &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, // measurements
             &i5, &f10, &f11, &f12); // Hamamatsu
index 9fa5300..247791d 100644 (file)
@@ -316,3 +316,40 @@ void AliEMCALMapAPD::GenerateDummyAPDInfo(Int_t nSM, Int_t * iSM)
   return;
 }
 
+//____________________________________________________________________________
+int AliEMCALMapAPD::CheckForDuplicates()
+{ 
+  // keep it simple: have one big array with place
+  // for all APDs from Catania (10000-19999 max) Houston (20000-29999 max)
+  // - and see how many times each APD occurs
+
+  const int kMaxAPDNum = 30000;
+  int counter[kMaxAPDNum] = {0};
+  for (int k=0; k<kMaxAPDNum; k++) { 
+    counter[k] = 0; 
+  }
+
+  Int_t nAPDPerSM = fgkEmCalCols * fgkEmCalRows;
+
+  // go through all APDs
+  int iCol, iRow;
+  for (Int_t i = 0; i < fNSuperModule; i++) {
+    AliEMCALSuperModuleMapAPD &t = fSuperModuleData[i];
+    
+    for (Int_t j=0; j<nAPDPerSM; j++) {
+      iCol = j / fgkEmCalRows;
+      iRow = j % fgkEmCalRows;
+      counter[t.fAPDNum[iCol][iRow]]++;
+    }
+  } // i, SuperModule
+
+  int nProblems = 0;
+  for (int k=0; k<kMaxAPDNum; k++) { 
+    if (counter[k] > 1) {
+      printf("AliEMCALMapAPD::CheckForDuplicates - APD %d occurs more than once!\n",k);
+      nProblems++;
+    } 
+  }
+
+  return nProblems;
+}
index 9e6a62e..5430f71 100644 (file)
@@ -30,6 +30,8 @@ public:
 
   void GenerateDummyAPDInfo(Int_t nSM, Int_t * iSM); // for debug purposes 
 
+  int CheckForDuplicates(); // see if the same APD numbers occur more than once
+
   virtual ~AliEMCALMapAPD();
 
   struct AliEMCALSuperModuleMapAPD {
diff --git a/EMCAL/SMcalib/GenerateAPDMap.C b/EMCAL/SMcalib/GenerateAPDMap.C
new file mode 100644 (file)
index 0000000..d98d191
--- /dev/null
@@ -0,0 +1,35 @@
+void GenerateAPDMap()
+{
+  gSystem->Load("AliEMCALMapAPD_cxx");
+  AliEMCALMapAPD *mapAPD = new AliEMCALMapAPD();
+
+  Int_t iSM[2] = {0,1}; // allow for two SuperModules
+  mapAPD->GenerateDummyAPDInfo(1, iSM); // space for one SuperModule, with number iSM[0] = 0
+
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 0, "APD/APDStripModW15.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 1, "APD/APDStripModW21.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 2, "APD/APDStripModW3.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 3, "APD/APDStripModW5.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 4, "APD/APDStripModW18.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 5, "APD/APDStripModW8.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 6, "APD/APDStripModW16.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 7, "APD/APDStripModW17.txt");
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 8, "APD/APDStripModW14.txt");  
+
+  // not yet installed: use dummy values for now..
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 9, "APD/APDStripModW0.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0,10, "APD/APDStripModW7.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0,11, "APD/APDStripModW10.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0,12, "APD/APDStripModW11.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0,13, "APD/APDStripModW12.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0,14, "APD/APDStripModW13.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0,15, "APD/APDStripModW19.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0,16, "APD/APDStripModW1.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0,17, "APD/APDStripModW2.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0,18, "APD/APDStripModW4.txt"); 
+  mapAPD->ReadMapAPDInfoSingleStripBasis(0,19, "APD/APDStripModW6.txt"); 
+
+  mapAPD->WriteMapAPDInfo("APD/APDSuperModW1.txt");
+
+  int nProblems = mapAPD->CheckForDuplicates();
+}
index 14b8039..4419776 100644 (file)
@@ -19,35 +19,23 @@ how the gains should be modified, for each tower.
 root [0] .L AliEMCALMapAPD.cxx+
 root [1] .L AliEMCALCalibAPD.cxx+
 
-1) Generating an APD map: normal use case in a root macro for your SuperModule
+1) Generating an APD map: example use case in a root macro
 -------------------------
-//a) create a dummy space in memory:
-  gSystem->Load("AliEMCALMapAPD_cxx");
-  AliEMCALMapAPD *mapAPD = new AliEMCALMapAPD();
-
-  Int_t iSM[2] = {0,1}; // allow for two SuperModules
-  mapAPD->GenerateDummyAPDInfo(1, iSM); // space for one SuperModule, with number iSM[0] = 0
-
-//b) overwrite this memory with the actual values for the StripModules; one line for each of the 24 stripmodules (0-23)
-  mapAPD->ReadMapAPDInfoSingleStripBasis(0, 21, "APDStripModXY.txt"); 
-// "XY" should perhaps be F5 for 5th stripmodule from Frascati or something like that. F=Frascati, W=WSU, N=Nantes, C=Catania
-
-//For a "APDStripModXY.txt" file, 48 lines with 3 fields:
-//StripColumn StripRow APDNum
-//is expected..
-
-//c) write out the map for column, row, APD for the whole SM:
-  mapAPD->WriteMapAPDInfo("APDSuperModY1.txt"); // Y=Yale, G=Grenoble
+Note: the contents of this macro has to be strongly modified to adapt to 
+your SuperModule setup..
+root -b GenerateAPDMap.C -q
 
 2) Generating a file of V30 bias values for each tower:
 ------------------------------------------------------- 
 # arguments are:
-1: input APD database csv file
+1: input APD database dat file 
+[ this can be produced from the csv file with a cmd like: 
+sed 's/,/ /g' APD-database-Houston.csv | awk '{if (NF==19) {print $0}}' > APD-database-Houston.dat ]
 2: APD map file - which tower is where in the SuperModule; from step 1) above. 
 3: defaultVoltage - use 390 if no settings can be found for some APDs
 4: outputfile
 
-root -b 'WriteBiasV30.C("APD-database.csv", "DummySuperModAPDMap.txt", 390, "BiasV30.txt")' -q 
+root -b 'WriteBiasV30.C("APD-database-Houston.dat", "APD/APDSuperModW1.txt", 390, "BiasV30.txt")' -q 
 # aliroot also works instead of root; as you prefer
 
 3) Optional - e.g. in case you don't have the whole SuperModule APD map or what not 
@@ -62,7 +50,7 @@ root -b 'WriteBiasFixVoltage.C(390, "Bias390.txt")' -q # aliroot also works..
 by 10% and factor 1.1 would mean an increase by 10% relative to the file used previously,
 in this case BiasV30.txt.
 
-root -b 'WriteNewBias.C("APD-database.csv", "DummySuperModAPDMap.txt", "BiasV30.txt", "GainChange.txt", "NewBias.txt")' -q # aliroot also works..
+root -b 'WriteNewBias.C("APD-database-Houston.dat", "APD/APDSuperModW1.txt", "BiasV30.txt", "GainChange.txt", "NewBias.txt")' -q # aliroot also works..
 
 5) Converting a bias value file to a set of files that can be used by DCS/RCU: 
 -----------------------------------------------------------------------------
index 2053eb0..e14e6b4 100644 (file)
@@ -43,6 +43,7 @@ void SetBiasVoltage(const char * inputDBName, const char * inputMapName,
   AliEMCALMapAPD::AliEMCALSuperModuleMapAPD * fMap = mapAPD->GetSuperModuleData();
 
   int nFound = 0;
+  int nNotFound = 0;
   for (int icol=0; icol<fgkEmCalCols; icol++) {
     for (int irow=0; irow<fgkEmCalRows; irow++) {
 
@@ -55,18 +56,22 @@ void SetBiasVoltage(const char * inputDBName, const char * inputMapName,
       }
 
       if (apdCalib == apdMap) { // found!
-       i--; // go back to what we dound
+       i--; // go back to what we found
        biasVoltage[icol][irow] = fCalib[i].fV30;
        nFound++;
       }
       else {
        biasVoltage[icol][irow] = defaultVoltage;
+       cout << " APD " << apdMap << " could not be found! " << endl;
+       nNotFound++;
       }
 
     }
   }
 
   cout << " found " << nFound << " matches " << endl;
+  cout << " did not find " << nNotFound << " APDs " << endl;
+
   return;
 }