/* ======================================================================== *\ ! $Name: not supported by cvs2svn $:$Id: MMcTriggerLvl2.cc,v 1.14 2006-10-17 17:15:58 tbretz Exp $ ! -------------------------------------------------------------------------- ! ! * ! * This file is part of MARS, the MAGIC Analysis and Reconstruction ! * Software. It is distributed to you in the hope that it can be a useful ! * and timesaving tool in analysing Data of imaging Cerenkov telescopes. ! * It is distributed WITHOUT ANY WARRANTY. ! * ! * Permission to use, copy, modify and distribute this software and its ! * documentation for any purpose is hereby granted without fee, ! * provided that the above copyright notice appear in all copies and ! * that both that copyright notice and this permission notice appear ! * in supporting documentation. It is provided "as is" without express ! * or implied warranty. ! * ! ! ! Author(s): Antonio Stamerra 1/2003 ! Author(s): Marcos Lopez 1/2003 ! Author(s): Nicola Galante 7/2003 ! ! Copyright: MAGIC Software Development, 2000-2003 ! ! \* ======================================================================== */ ///////////////////////////////////////////////////////////////////////////// // // // MMcTriggerLvl2 // // Storage container for the 2nd level trigger selection parameters // // as part of the 2nd level trigger simulation // // // // input parameter: // // fCompactNN number of next neighboors that define a compact pixel // // // // // // Basic L2T Selection Parameters: // // // // fLutPseudoSize number of compact pixels in one LUT // // fPseudoSize Multiplicity of the bigger cluster // // fSizeBiggerCell higher number of fired pixel in cell // // // ///////////////////////////////////////////////////////////////////////////// #include "MMcTriggerLvl2.h" #include "MGeomCam.h" #include "MGeomPix.h" #include "MGeomCamMagic.h" #include "MMcTrig.hxx" #include "MMcEvt.hxx" #include "MLog.h" #include ClassImp(MMcTriggerLvl2); using namespace std; // --------------------------- // Initialization of static const data members pixel_in_cell and pixel_in_lut // // Correspondence TABLE between pixel numbering in the trigger cells and // the standard spiral counting // (*Note*: Pixels start to count ** from 1 ** instead of 0) // // This correspondence is valid only for MAGIC-like geometries! // // FIXME! These definitions should be included in a GeomTrig class // const Int_t MMcTriggerLvl2::gsPixelsInCell[gsNPixInCell][gsNCells] = { {26, 91, 66, 71, 76, 81, 86, 269, 224, 233, 242, 251, 260, 391, 336, 347, 358, 369, 380}, {25, 61, 41, 45, 49, 53, 57, 215, 175, 183, 191, 199, 207, 325, 275, 285, 295, 305, 315}, {24, 37, 22, 25, 28, 31, 34, 167, 132, 139, 146, 153, 160, 265, 220, 229, 238, 247, 256}, {23, 19, 9, 11, 13, 15, 17, 125, 95, 101, 107, 113, 119, 211, 171, 179, 187, 195, 203}, {27, 62, 67, 72, 77, 82, 87, 270, 225, 234, 243, 252, 261, 392, 337, 348, 359, 370, 381}, {12, 38, 42, 46, 50, 54, 58, 216, 176, 184, 192, 200, 208, 326, 276, 286, 296, 306, 316}, {11, 20, 23, 26, 29, 32, 35, 168, 133, 140, 147, 154, 161, 266, 221, 230, 239, 248, 257}, {10, 8, 10, 12, 14, 16, 18, 126, 96, 102, 108, 114, 120, 212, 172, 180, 188, 196, 204}, {22, 2, 3, 4, 5, 6, 7, 90, 65, 70, 75, 80, 85, 164, 129, 136, 143, 150, 157}, {28, 93, 99, 105, 111, 117, 123, 271, 226, 235, 244, 253, 262, 393, 338, 349, 360, 371, 382}, {13, 63, 68, 73, 78, 83, 88, 217, 177, 185, 193, 201, 209, 327, 277, 287, 297, 307, 317}, { 4, 39, 43, 47, 51, 55, 59, 169, 134, 141, 148, 155, 162, 267, 222, 231, 240, 249, 258}, { 3, 21, 24, 27, 30, 33, 36, 127, 97, 103, 109, 115, 121, 213, 173, 181, 189, 197, 205}, { 9, 9, 11, 13, 15, 17, 19, 91, 66, 71, 76, 81, 86, 165, 130, 137, 144, 151, 158}, {21, 3, 4, 5, 6, 7, 2, 61, 41, 45, 49, 53, 57, 123, 93, 99, 105, 111, 117}, {29, 130, 137, 144, 151, 158, 165, 218, 227, 236, 245, 254, 263, 394, 339, 350, 361, 372, 383}, {14, 94, 100, 106, 112, 118, 124, 170, 178, 186, 194, 202, 210, 328, 278, 288, 298, 308, 318}, { 5, 64, 69, 74, 79, 84, 89, 128, 135, 142, 149, 156, 163, 268, 223, 232, 241, 250, 259}, { 1, 40, 44, 48, 52, 56, 60, 92, 98, 104, 110, 116, 122, 214, 174, 182, 190, 198, 206}, { 2, 22, 25, 28, 31, 34, 37, 62, 67, 72, 77, 82, 87, 166, 131, 138, 145, 152, 159}, { 8, 10, 12, 14, 16, 18, 8, 38, 42, 46, 50, 54, 58, 124, 94, 100, 106, 112, 118}, {20, 11, 13, 15, 17, 19, 9, 20, 23, 26, 29, 32, 35, 88, 63, 68, 73, 78, 83}, {30, 131, 138, 145, 152, 159, 166, 219, 228, 237, 246, 255, 264, 329, 279, 289, 299, 309, 319}, {15, 95, 101, 107, 113, 119, 125, 171, 179, 187, 195, 203, 211, 269, 224, 233, 242, 251, 260}, { 6, 65, 70, 75, 80, 85, 90, 129, 136, 143, 150, 157, 164, 215, 175, 183, 191, 199, 207}, { 7, 41, 45, 49, 53, 57, 61, 93, 99, 105, 111, 117, 123, 167, 132, 139, 146, 153, 160}, {19, 23, 26, 29, 32, 35, 20, 63, 68, 73, 78, 83, 88, 125, 95, 101, 107, 113, 119}, {37, 24, 27, 30, 33, 36, 21, 39, 43, 47, 51, 55, 59, 89, 64, 69, 74, 79, 84}, {31, 132, 139, 146, 153, 160, 167, 220, 229, 238, 247, 256, 265, 270, 225, 234, 243, 252, 261}, {16, 96, 102, 108, 114, 120, 126, 172, 180, 188, 196, 204, 212, 216, 176, 184, 192, 200, 208}, {17, 66, 71, 76, 81, 86, 91, 130, 137, 144, 151, 158, 165, 168, 133, 140, 147, 154, 161}, {18, 42, 46, 50, 54, 58, 38, 94, 100, 106, 112, 118, 124, 126, 96, 102, 108, 114, 120}, {36, 43, 47, 51, 55, 59, 39, 64, 69, 74, 79, 84, 89, 90, 65, 70, 75, 80, 85}, {32, 133, 140, 147, 154, 161, 168, 221, 230, 239, 248, 257, 266, 217, 177, 185, 193, 201, 209}, {33, 97, 103, 109, 115, 121, 127, 173, 181, 189, 197, 205, 213, 169, 134, 141, 148, 155, 162}, {35, 68, 73, 78, 83, 88, 63, 95, 101, 107, 113, 119, 125, 91, 66, 71, 76, 81, 86} }; // // corrispondence between pixels in cell and lut (pix numbering starts from 1) // const Int_t MMcTriggerLvl2::gsPixelsInLut[gsNLutInCell][gsNPixInLut] = { { 1, 2, 3, 4, 6, 7, 8, 9, 12, 13, 14, 15}, {34, 29, 23, 16, 30, 24, 17, 10, 25, 18, 11, 5}, {35, 31, 26, 20, 19, 32, 27, 21, 36, 33, 28, 22}, }; // -------------------------------------------------------------------------- // // Default constructor // MMcTriggerLvl2::MMcTriggerLvl2(const char *name, const char *title):fCompactNN(2),fTriggerPattern(0) { fName = name ? name : ClassName(); fTitle = title; *fLog << "created MMcTriggerLvl2" << endl; // // Initialization of the fPixels array to zero // memset (fPixels,0,gsNPixInCell*gsNCells*sizeof(Int_t)); memset (fFiredPixel,0,gsNTrigPixels*sizeof(Int_t)); // create a new camera SetNewCamera(new MGeomCamMagic); } // -------------------------------------------------------------------------- // // Destructor // MMcTriggerLvl2::~MMcTriggerLvl2() { delete fGeomCam; } // -------------------------------------------------------------------------- // // Print functions for debugging and testing // // Options available: // // "cell": // Print out the pixel number of a given trigger cell // // "status": // Print a table with the status (pixel is fired or not after Lvl1) for // all the pixels in all the trigger cells // // "check" // Print a warning message when no starting pixel is found in the // CalcPseudoSize method. // // no option: // Print the value of the selection parameters // // void MMcTriggerLvl2::Print(Option_t *opt) const { TString str(opt); if (str.Contains("status", TString::kIgnoreCase)) { *fLog << " Status of cells 1-9" <= size) { size = GetLutCompactPixel(j,i); cell = j; lut = i; } } } //*fLog <<"Max cell: " << cell+1 << " Max Lut: " << lut+1 << " PseudoSize: " << size < // // Returns: // -1 wrong neighpix // -2 wrong cell (<1 or >19) // -3 wrong lut (<1 or >3) // else: // the number of compact pixels in one LUT. // Int_t MMcTriggerLvl2::GetLutCompactPixel(int cell, int lut) { int size=0; int lutpix, a[gsNPixInLut]; int neighpix= (*this).fCompactNN; // check on input variables if (neighpix >3 || neighpix < 2) return(-1); if (cell<0 || cell> gsNCells-1) return(-2); if (lut<0 || lut> gsNLutInCell-1) return(-3); // // Warning!!! Following configurations are valid only for the standard MAGIC // trigger geometry; FIXME! these should be coded somewhere else.... // // LUT 1 and 2 are similar; LUT 3 differs for(int j=0; j< gsNPixInLut; j++) { lutpix = gsPixelsInLut[lut][j]-1; // *fLog << "j=" < sizetemp) { maxlut=i; sizetemp = GetLutCompactPixel(fMaxCell,i); } int startpix; // // seek a starting pixel for the iteration inside the lut // int check=1; for (int pixlut=0;pixlutj;--jk) { UInt_t tmp = NeighPixOrdered[j+1]; const MGeomPix &pixneigh = (*geom)[NeighPixOrdered[j]]; for (int k=0; k"<< pix.GetNeighbor(i+j) << endl; while ((i+j < 2*pix.GetNumNeighbors()) && (fFiredPixel[NeighPixOrdered[i+j]]==1) && (j < fCompactNN)) j++; if (j>=fCompactNN) // configuration satisfies the compact condition { fCompactPixel[pixid]=1; // pixel is compact // *fLog << ","< fTriggerPattern) fTriggerPattern=j; if (fTriggerPattern==7) break; // the 7-NN (max) pattern was found: exit } // next pixel } // -------------------------------------------------------------------------- // Look for the cell with higher number of Compact pixels // Return the cell number (starting from 0) // Int_t MMcTriggerLvl2::CalcBiggerCellPseudoSize() { Int_t maxcell=-1; fCellPseudoSize=0; for (Int_t i=0;i fCellPseudoSize) { fCellPseudoSize = size; maxcell = i; } } //*fLog << "fCellPseudoSize = " << fCellPseudoSize << " in cell N. " << fMaxCell+1 << endl; return maxcell; } // -------------------------------------------------------------------------- // Compute the number of compact pixels in one cell // Int_t MMcTriggerLvl2::GetCellCompactPixel(int cell, MGeomCam *geom) { int size=0; // check on input variables if (cell<0 || cell>gsNCells-1) return(-2); //*fLog << " CNN:" << fCompactNN; //*fLog << "Cell: " << cell+1 << " Compat Pixels:"; for(Int_t id=0; idj;--jk) { UInt_t tmp = NeighPixOrdered[j+1]; const MGeomPix &pixneigh = (*geom)[NeighPixOrdered[j]]; for (int k=0; k"<< pix.GetNumNeighbors() << " CNN="<< fCompactNN <=fCompactNN) //configuration satisfies the compact condition { size++; // pixel is compact //*fLog << "->" << pixid+1; break; // (new pixel) } } } //*fLog <<" - size:" << size << endl<IsPixelInTrigger(idx) ? fFiredPixel[idx]+fCompactPixel[idx] : 0; return kTRUE; } void MMcTriggerLvl2::DrawPixelContent(Int_t num) const { *fLog << "MMcTriggerLvl2::DrawPixelContent - not available." << endl; }