+/** This class holds a spinor index that can be dotted or undotted and that
+ * also has a variance. This is used in the Weyl-van-der-Waerden formalism
+ * where the dot indicates complex conjugation. There is an associated
+ * (asymmetric) metric tensor that can be used to raise/lower spinor
+ * indices. */
+class spinidx : public varidx
+{
+ GINAC_DECLARE_REGISTERED_CLASS(spinidx, varidx)
+
+ // other constructors
+public:
+ /** Construct index with given value, dimension, variance and dot.
+ *
+ * @param v Value of index (numeric or symbolic)
+ * @param dim Dimension of index space (numeric or symbolic)
+ * @param covariant Make covariant index (default is contravariant)
+ * @param dotted Make covariant dotted (default is undotted)
+ * @return newly constructed index */
+ spinidx(const ex & v, const ex & dim = 2, bool covariant = false, bool dotted = false);
+
+ // functions overriding virtual functions from base classes
+public:
+ bool is_dummy_pair_same_type(const basic & other) const override;
+ // complex conjugation
+ ex conjugate() const override { return toggle_dot(); }
+ void archive(archive_node& n) const override;
+ void read_archive(const archive_node& n, lst& syms) override;
+protected:
+ bool match_same_type(const basic & other) const override;
+
+ // non-virtual functions in this class
+public:
+ /** Check whether the index is dotted. */
+ bool is_dotted() const {return dotted;}
+
+ /** Check whether the index is not dotted. */
+ bool is_undotted() const {return !dotted;}
+
+ /** Make a new index with the same value and variance but the opposite
+ * dottedness. */
+ ex toggle_dot() const;
+
+ /** Make a new index with the same value but opposite variance and
+ * dottedness. */
+ ex toggle_variance_dot() const;
+
+protected:
+ void do_print(const print_context & c, unsigned level) const;
+ void do_print_latex(const print_latex & c, unsigned level) const;
+ void do_print_tree(const print_tree & c, unsigned level) const;
+
+ // member variables
+protected:
+ bool dotted;
+};
+GINAC_DECLARE_UNARCHIVER(spinidx);
+